{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "NLPDayWorkshopBert1.ipynb", "provenance": [], "collapsed_sections": [ "E4anfUzlcLdp", "w26lWw5IcR1e", "jBAsvM8LcU07", "NzN1GkN3fqAd", "nsCUOqq3APO9" ], "machine_shape": "hm" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "accelerator": "GPU", "widgets": { "application/vnd.jupyter.widget-state+json": { "3b707fa7cdbe427fa7b1b91e04bc4d93": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_1d91fd6eb9844f02bf772f0641fd3884", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_f1144e00ac7348a28677e50602496d52", "IPY_MODEL_befde3ab120d4aedb7f9ed1f697aae9f" ] } }, "1d91fd6eb9844f02bf772f0641fd3884": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "f1144e00ac7348a28677e50602496d52": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_060a1c45bbfe43aea84162b8d26a420d", "_dom_classes": [], "description": "Downloading: 100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 459, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 459, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_a299219fadb1477ba0f68d22bbdf8386" } }, "befde3ab120d4aedb7f9ed1f697aae9f": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_41e11aa09f2d4504bdba0ae77ef251cf", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 459/459 [00:00<00:00, 21.5kB/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_0e25d56f4a3141699171b59ba0e3c47d" } }, "060a1c45bbfe43aea84162b8d26a420d": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "a299219fadb1477ba0f68d22bbdf8386": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "41e11aa09f2d4504bdba0ae77ef251cf": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "0e25d56f4a3141699171b59ba0e3c47d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "e49a94889ef546d08e552ff54df29588": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_9c349123dd3a4d89b58983c0bc7cab2b", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_224ad3c6125143959142a35144965fd6", "IPY_MODEL_62d0ad787c724c1d986451291e5c7070" ] } }, "9c349123dd3a4d89b58983c0bc7cab2b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "224ad3c6125143959142a35144965fd6": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_4729cb6e07404a8692dbe6a1fe9eafe4", "_dom_classes": [], "description": "Downloading: 100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 531146902, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 531146902, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_6ff02f76b6904f2395f2a5088e7e4adc" } }, "62d0ad787c724c1d986451291e5c7070": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_d0fce87f97b945a4ba7a03e420daffd4", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 531M/531M [00:07<00:00, 66.8MB/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_50a7c5a2d24e47faa9072fe21d0ae396" } }, "4729cb6e07404a8692dbe6a1fe9eafe4": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "6ff02f76b6904f2395f2a5088e7e4adc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "d0fce87f97b945a4ba7a03e420daffd4": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "50a7c5a2d24e47faa9072fe21d0ae396": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "a44971002aea4b1d8522d8a8b80fea53": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_6f0c82be1c7a4ce4a07728e4dc977b6f", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_83e9d626e89441248dae96107c0cd4fd", "IPY_MODEL_78e2abbc309b4e969cc817a31df62816" ] } }, "6f0c82be1c7a4ce4a07728e4dc977b6f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "83e9d626e89441248dae96107c0cd4fd": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_b89fea15996a48199a619ad33c59f7eb", "_dom_classes": [], "description": "Downloading: 100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 494801, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 494801, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_2e5d93f934684f2f80e13e46bb656b5d" } }, "78e2abbc309b4e969cc817a31df62816": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_73432aa5e68d494fa462fd7cee2d3e52", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 495k/495k [00:01<00:00, 453kB/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_7bc5cf59488e4c378e565f7a9fe39a24" } }, "b89fea15996a48199a619ad33c59f7eb": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "2e5d93f934684f2f80e13e46bb656b5d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "73432aa5e68d494fa462fd7cee2d3e52": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "7bc5cf59488e4c378e565f7a9fe39a24": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "62f38bd0655c4245b07fe599410eb710": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_b11f8c86af064ab892594d8f995ce055", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_899847b165d7410eab46fbe2b429b8f9", "IPY_MODEL_0d8f91e9052842939a374af67b833d07" ] } }, "b11f8c86af064ab892594d8f995ce055": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "899847b165d7410eab46fbe2b429b8f9": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_749936a7630d4e8a95cca5f067dfff7b", "_dom_classes": [], "description": "Downloading: 100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 112, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 112, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_4f5ede7c4ed744239e23ac1a5b4e5640" } }, "0d8f91e9052842939a374af67b833d07": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_b23492319c044c738cdb3ae92d253b37", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 112/112 [00:00<00:00, 359B/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_5787971cfb424a33a941f8b417c5ad43" } }, "749936a7630d4e8a95cca5f067dfff7b": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "4f5ede7c4ed744239e23ac1a5b4e5640": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "b23492319c044c738cdb3ae92d253b37": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "5787971cfb424a33a941f8b417c5ad43": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "a8557510cebe431a9ba99962d4e513fe": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_18efcae012d44802ad3d39cee7a48101", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_be90e73566c146d79afb42899bfc5caf", "IPY_MODEL_8da22b40eb2147469604c8c03fc79a29" ] } }, "18efcae012d44802ad3d39cee7a48101": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "be90e73566c146d79afb42899bfc5caf": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_0c4e8b6f44934856a716bbc06a8bc628", "_dom_classes": [], "description": "Downloading: 100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 2, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 2, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_7f44a86d5d144f8e8350760b6071e0d4" } }, "8da22b40eb2147469604c8c03fc79a29": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_e0204efda0cb4af5b788d3f7568be9c2", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 2.00/2.00 [00:00<00:00, 28.6B/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_55b7d60cf88d47e2bf88d11efd3cacc1" } }, "0c4e8b6f44934856a716bbc06a8bc628": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "7f44a86d5d144f8e8350760b6071e0d4": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "e0204efda0cb4af5b788d3f7568be9c2": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "55b7d60cf88d47e2bf88d11efd3cacc1": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "50acdd7b70d9481b9be636b2322b2cfb": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_78070d0410a44081a1da48250ee4f51c", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_fa3b5430520b49879f920b63d2000717", "IPY_MODEL_a648effd76094b45a830d12c600ebd97" ] } }, "78070d0410a44081a1da48250ee4f51c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "fa3b5430520b49879f920b63d2000717": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_e8539425181b448e9b24bcc29375408e", "_dom_classes": [], "description": "Downloading: ", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 927, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 927, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_3a2d533ca85a4b7ba2df2c0ffd07603f" } }, "a648effd76094b45a830d12c600ebd97": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_dda001949a5042cc9f5e8440d7f3f812", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 3.08k/? [00:00<00:00, 4.59kB/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_0b600c9bf631436a9b22231f4aae18b3" } }, "e8539425181b448e9b24bcc29375408e": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "3a2d533ca85a4b7ba2df2c0ffd07603f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "dda001949a5042cc9f5e8440d7f3f812": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "0b600c9bf631436a9b22231f4aae18b3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "040a1e96d09d40f7b9d74a6e1601d1bd": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_a99293552d4d4a328d7158e19b3c8a6f", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_93d82eae199e4f85bcc5ff296413d11a", "IPY_MODEL_170b35007ee74a81a1a2cf6eec47db3b" ] } }, "a99293552d4d4a328d7158e19b3c8a6f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "93d82eae199e4f85bcc5ff296413d11a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_316e78f7695646ef901264d4e37f8e93", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "info", "max": 1, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 1, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_03253f9a96524c86bfa7703d04f9dd6a" } }, "170b35007ee74a81a1a2cf6eec47db3b": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_7ba6458b655f4c82b3af66bf9f9dcfaf", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 1/? [00:00<00:00, 30.96 tables/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_059efec274ba40f29470d1a2dd02a33f" } }, "316e78f7695646ef901264d4e37f8e93": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "03253f9a96524c86bfa7703d04f9dd6a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "7ba6458b655f4c82b3af66bf9f9dcfaf": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "059efec274ba40f29470d1a2dd02a33f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "31c2adcad6154b05adda222d88f39e67": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_4bac2eaf402d40f9b8e81786278eddb0", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_ca5943a12af54c498a67505dd4bce7f1", "IPY_MODEL_cdafe06d43284e10961ba6f8d4c05eaf" ] } }, "4bac2eaf402d40f9b8e81786278eddb0": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "ca5943a12af54c498a67505dd4bce7f1": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_6a19bd3eae2a43e5a3b0816999cb57ab", "_dom_classes": [], "description": "100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 1, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 1, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_55da41e1604f4e1a81a2c84a9ab98623" } }, "cdafe06d43284e10961ba6f8d4c05eaf": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_5c9011bd9207477cb22b58095ee5e2c4", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 1/1 [02:37<00:00, 157.23s/ba]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_d39668516e3f4f8cb36b4af3f349bf2f" } }, "6a19bd3eae2a43e5a3b0816999cb57ab": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "55da41e1604f4e1a81a2c84a9ab98623": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "5c9011bd9207477cb22b58095ee5e2c4": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "d39668516e3f4f8cb36b4af3f349bf2f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "7ead312be00c423fab6b00f24563c350": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_7487cc3bc4384e63b3877b43f29def80", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_8729216f7c3145cd8f17b9ef648ab998", "IPY_MODEL_c179bb72f9414503bfe6c0ca8812d75a" ] } }, "7487cc3bc4384e63b3877b43f29def80": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "8729216f7c3145cd8f17b9ef648ab998": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_ecb218a3c4644fb293b64f2f8e75996b", "_dom_classes": [], "description": "100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 1, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 1, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_e91005c51c12401ca1861403412ffa77" } }, "c179bb72f9414503bfe6c0ca8812d75a": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_547bb74ff9d4442dbedf16f3d744fc63", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 1/1 [02:36<00:00, 156.51s/ba]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_f9bd5f9433de4b6fa6ac4f1c4a8ed193" } }, "ecb218a3c4644fb293b64f2f8e75996b": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "e91005c51c12401ca1861403412ffa77": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "547bb74ff9d4442dbedf16f3d744fc63": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "f9bd5f9433de4b6fa6ac4f1c4a8ed193": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "7c8ac18e29d749949352e9f994c2d54c": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_view_name": "HBoxView", "_dom_classes": [], "_model_name": "HBoxModel", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", "layout": "IPY_MODEL_2c103c3e73da47d8b3fbf43f3ac5b05a", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_7eeb1989fab84e1ca2a1c0f169400530", "IPY_MODEL_6db794d4f1ec4ff8992c715ca1776147" ] } }, "2c103c3e73da47d8b3fbf43f3ac5b05a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "7eeb1989fab84e1ca2a1c0f169400530": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_85b20f8f885f45eeadcbd02b3748c34c", "_dom_classes": [], "description": "100%", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 1, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 1, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_2a050a4e56074143a69af25360caa05c" } }, "6db794d4f1ec4ff8992c715ca1776147": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_8b5eb4fb4dc64dc69cdb2b14c4c9b4e2", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 1/1 [00:00<00:00, 12.47ba/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_9f80d961ebb04d90916a0c320634fbfb" } }, "85b20f8f885f45eeadcbd02b3748c34c": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_view_name": "StyleView", "_model_name": "ProgressStyleModel", "description_width": "initial", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "bar_color": null, "_model_module": "@jupyter-widgets/controls" } }, "2a050a4e56074143a69af25360caa05c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } }, "8b5eb4fb4dc64dc69cdb2b14c4c9b4e2": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_view_name": "StyleView", "_model_name": "DescriptionStyleModel", "description_width": "", "_view_module": "@jupyter-widgets/base", "_model_module_version": "1.5.0", "_view_count": null, "_view_module_version": "1.2.0", "_model_module": "@jupyter-widgets/controls" } }, "9f80d961ebb04d90916a0c320634fbfb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_view_name": "LayoutView", "grid_template_rows": null, "right": null, "justify_content": null, "_view_module": "@jupyter-widgets/base", "overflow": null, "_model_module_version": "1.2.0", "_view_count": null, "flex_flow": null, "width": null, "min_width": null, "border": null, "align_items": null, "bottom": null, "_model_module": "@jupyter-widgets/base", "top": null, "grid_column": null, "overflow_y": null, "overflow_x": null, "grid_auto_flow": null, "grid_area": null, "grid_template_columns": null, "flex": null, "_model_name": "LayoutModel", "justify_items": null, "grid_row": null, "max_height": null, "align_content": null, "visibility": null, "align_self": null, "height": null, "min_height": null, "padding": null, "grid_auto_rows": null, "grid_gap": null, "max_width": null, "order": null, "_view_module_version": "1.2.0", "grid_template_areas": null, "object_position": null, "object_fit": null, "grid_auto_columns": null, "margin": null, "display": null, "left": null } } } } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "l6-IBxzEWJsi" }, "source": [ "# Training BERT for Cyberbullying Detection - HF Trainer Baseline" ] }, { "cell_type": "markdown", "metadata": { "id": "7r9W-oWEWZE9" }, "source": [ "Our goal is to train a binary classification model that should detect cyberbullying in Polish Tweets. The dataset comes from a Polish NLP competition - PolEval 2019 (http://2019.poleval.pl/index.php/tasks/task6). It is also included in Polish NLP Benchmark KLEJ (https://klejbenchmark.com/)." ] }, { "cell_type": "markdown", "metadata": { "id": "E4anfUzlcLdp" }, "source": [ "## Setup" ] }, { "cell_type": "markdown", "metadata": { "id": "yZDsPC-gYU24" }, "source": [ "Let's start by installing two libraries from HuggingFace that will make our job easier: transformers and datasets. We will also import the relevant libraries. " ] }, { "cell_type": "code", "metadata": { "id": "zOP87Wguvu6d", "outputId": "c40b7d62-4269-4970-8164-cda4d6f29202", "colab": { "base_uri": "https://localhost:8080/", "height": 158 } }, "source": [ "!pip install transformers -qq\n", "!pip install datasets -qq" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "\u001b[K |████████████████████████████████| 1.3MB 3.4MB/s \n", "\u001b[K |████████████████████████████████| 890kB 19.2MB/s \n", "\u001b[K |████████████████████████████████| 1.1MB 29.8MB/s \n", "\u001b[K |████████████████████████████████| 2.9MB 43.7MB/s \n", "\u001b[?25h Building wheel for sacremoses (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "\u001b[K |████████████████████████████████| 153kB 3.3MB/s \n", "\u001b[K |████████████████████████████████| 17.7MB 204kB/s \n", "\u001b[K |████████████████████████████████| 245kB 64.2MB/s \n", "\u001b[?25h" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "__EIOpLVvdCx" }, "source": [ "import numpy as np\n", "import pandas as pd\n", "import torch\n", "from transformers import BertForSequenceClassification, BertTokenizerFast, Trainer, TrainingArguments\n", "from datasets import load_dataset, Dataset\n", "from sklearn.metrics import accuracy_score, precision_recall_fscore_support" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "5jQnJZAyY0xy" }, "source": [ "In this demo, we will use the Polish pretrained BERT model - Polbert (https://github.com/kldarek/polbert). It can be downloaded from the HuggingFace model hub, and we will use BertForSequenceClassification class to load it. We will also need the Polbert tokenizer. " ] }, { "cell_type": "code", "metadata": { "id": "6l01woyxvqbj", "outputId": "8886a145-bc7d-4853-b607-11f7913e3a57", "colab": { "base_uri": "https://localhost:8080/", "height": 374, "referenced_widgets": [ "3b707fa7cdbe427fa7b1b91e04bc4d93", "1d91fd6eb9844f02bf772f0641fd3884", "f1144e00ac7348a28677e50602496d52", "befde3ab120d4aedb7f9ed1f697aae9f", "060a1c45bbfe43aea84162b8d26a420d", "a299219fadb1477ba0f68d22bbdf8386", "41e11aa09f2d4504bdba0ae77ef251cf", "0e25d56f4a3141699171b59ba0e3c47d", "e49a94889ef546d08e552ff54df29588", "9c349123dd3a4d89b58983c0bc7cab2b", "224ad3c6125143959142a35144965fd6", "62d0ad787c724c1d986451291e5c7070", "4729cb6e07404a8692dbe6a1fe9eafe4", "6ff02f76b6904f2395f2a5088e7e4adc", "d0fce87f97b945a4ba7a03e420daffd4", "50a7c5a2d24e47faa9072fe21d0ae396", "a44971002aea4b1d8522d8a8b80fea53", "6f0c82be1c7a4ce4a07728e4dc977b6f", "83e9d626e89441248dae96107c0cd4fd", "78e2abbc309b4e969cc817a31df62816", "b89fea15996a48199a619ad33c59f7eb", "2e5d93f934684f2f80e13e46bb656b5d", "73432aa5e68d494fa462fd7cee2d3e52", "7bc5cf59488e4c378e565f7a9fe39a24", "62f38bd0655c4245b07fe599410eb710", "b11f8c86af064ab892594d8f995ce055", "899847b165d7410eab46fbe2b429b8f9", "0d8f91e9052842939a374af67b833d07", "749936a7630d4e8a95cca5f067dfff7b", "4f5ede7c4ed744239e23ac1a5b4e5640", "b23492319c044c738cdb3ae92d253b37", "5787971cfb424a33a941f8b417c5ad43", "a8557510cebe431a9ba99962d4e513fe", "18efcae012d44802ad3d39cee7a48101", "be90e73566c146d79afb42899bfc5caf", "8da22b40eb2147469604c8c03fc79a29", "0c4e8b6f44934856a716bbc06a8bc628", "7f44a86d5d144f8e8350760b6071e0d4", "e0204efda0cb4af5b788d3f7568be9c2", "55b7d60cf88d47e2bf88d11efd3cacc1" ] } }, "source": [ "model = BertForSequenceClassification.from_pretrained('dkleczek/bert-base-polish-uncased-v1')\n", "tokenizer = BertTokenizerFast.from_pretrained('dkleczek/bert-base-polish-uncased-v1')" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3b707fa7cdbe427fa7b1b91e04bc4d93", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, description='Downloading', max=459.0, style=ProgressStyle(description_…" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e49a94889ef546d08e552ff54df29588", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, description='Downloading', max=531146902.0, style=ProgressStyle(descri…" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" }, { "output_type": "stream", "text": [ "Some weights of the model checkpoint at dkleczek/bert-base-polish-uncased-v1 were not used when initializing BertForSequenceClassification: ['cls.predictions.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.decoder.weight', 'cls.predictions.decoder.bias', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias']\n", "- This IS expected if you are initializing BertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPretraining model).\n", "- This IS NOT expected if you are initializing BertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at dkleczek/bert-base-polish-uncased-v1 and are newly initialized: ['classifier.weight', 'classifier.bias']\n", "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" ], "name": "stderr" }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a44971002aea4b1d8522d8a8b80fea53", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, description='Downloading', max=494801.0, style=ProgressStyle(descripti…" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "62f38bd0655c4245b07fe599410eb710", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, description='Downloading', max=112.0, style=ProgressStyle(description_…" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a8557510cebe431a9ba99962d4e513fe", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, description='Downloading', max=2.0, style=ProgressStyle(description_wi…" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Jea3L4QEaP6M" }, "source": [ "Now we will load the training data from the KLEJ benchmark website, clean it up, and convert to a csv format that can be used to create a dataset. " ] }, { "cell_type": "markdown", "metadata": { "id": "w26lWw5IcR1e" }, "source": [ "## Data" ] }, { "cell_type": "code", "metadata": { "id": "ePP7gSQty0q1", "outputId": "2c2bac3d-0abb-450a-b28d-7b0ef9aa1ca8", "colab": { "base_uri": "https://localhost:8080/", "height": 265 } }, "source": [ "!wget -q https://klejbenchmark.com/static/data/klej_cbd.zip\n", "!unzip -q klej_cbd.zip" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "--2020-10-26 08:29:07-- https://klejbenchmark.com/static/data/klej_cbd.zip\n", "Resolving klejbenchmark.com (klejbenchmark.com)... 35.234.99.58\n", "Connecting to klejbenchmark.com (klejbenchmark.com)|35.234.99.58|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 375476 (367K) [application/zip]\n", "Saving to: ‘klej_cbd.zip’\n", "\n", "klej_cbd.zip 100%[===================>] 366.68K 866KB/s in 0.4s \n", "\n", "2020-10-26 08:29:08 (866 KB/s) - ‘klej_cbd.zip’ saved [375476/375476]\n", "\n", "Archive: klej_cbd.zip\n", " inflating: test_features.tsv \n", " inflating: train.tsv \n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "JYWTj6s80BKu", "outputId": "f606bc8c-2372-4fce-d6b6-3ae44cae018b", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "df = pd.read_csv('train.tsv', delimiter='\\t')\n", "df = df.dropna().reset_index(drop=True)\n", "df.columns = ['text', 'label']\n", "df.label = df.label.astype(int)\n", "df = df.sample(frac=1, random_state=42)\n", "df.to_csv('train.csv', index=False)\n", "len(df), len(df[df.label == 1])" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(10041, 851)" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "markdown", "metadata": { "id": "ujOgMyzGbi8T" }, "source": [ "Our training set consists of 10 thousand tweets, but only 851 of those tweets are tagged as cyberbullying. We can take a look at a sample of data in the dataframe. " ] }, { "cell_type": "code", "metadata": { "id": "ur9mfDc11DL_", "outputId": "a59183ba-09c7-4641-9e81-0332b234745f", "colab": { "base_uri": "https://localhost:8080/", "height": 197 } }, "source": [ "df.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
textlabel
5809LUDZIE Z BYDGOSZCZY: NAJLEPSZA RESTAURACJA? Rt...0
5938@anonymized_account Stałam na zewnątrz, ale ma...0
2260RT @anonymized_account Halicki: proszę nie mów...0
8833@anonymized_account @anonymized_account Czyli ...1
4513@anonymized_account Już nic nie będzie takie s...0
\n", "
" ], "text/plain": [ " text label\n", "5809 LUDZIE Z BYDGOSZCZY: NAJLEPSZA RESTAURACJA? Rt... 0\n", "5938 @anonymized_account Stałam na zewnątrz, ale ma... 0\n", "2260 RT @anonymized_account Halicki: proszę nie mów... 0\n", "8833 @anonymized_account @anonymized_account Czyli ... 1\n", "4513 @anonymized_account Już nic nie będzie takie s... 0" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "jBAsvM8LcU07" }, "source": [ "## Dataset" ] }, { "cell_type": "markdown", "metadata": { "id": "spUUAF3RcZOa" }, "source": [ "We need to convert our data into a format that can be fed to our model. Thanks to HuggingFace datesets library magic, we con do this with just a few lines of code. We will load the dataset from csv file, split it into train (80%) and validation set (20%). We will then map the tokenizer to convert the text strings into a format that can be fed into BERT model (input_ids and attention mask). Finally, we'll convert that into torch tensors. " ] }, { "cell_type": "code", "metadata": { "id": "RlpKdZQ7wA6_", "outputId": "3d907a79-0496-4353-d0be-852de98df946", "colab": { "base_uri": "https://localhost:8080/", "referenced_widgets": [ "50acdd7b70d9481b9be636b2322b2cfb", "78070d0410a44081a1da48250ee4f51c", "fa3b5430520b49879f920b63d2000717", "a648effd76094b45a830d12c600ebd97", "e8539425181b448e9b24bcc29375408e", "3a2d533ca85a4b7ba2df2c0ffd07603f", "dda001949a5042cc9f5e8440d7f3f812", "0b600c9bf631436a9b22231f4aae18b3", "040a1e96d09d40f7b9d74a6e1601d1bd", "a99293552d4d4a328d7158e19b3c8a6f", "93d82eae199e4f85bcc5ff296413d11a", "170b35007ee74a81a1a2cf6eec47db3b", "316e78f7695646ef901264d4e37f8e93", "03253f9a96524c86bfa7703d04f9dd6a", "7ba6458b655f4c82b3af66bf9f9dcfaf", "059efec274ba40f29470d1a2dd02a33f" ] } }, "source": [ "train_dataset, test_dataset = load_dataset('csv', data_files='train.csv', split=['train[:80%]', 'train[80%:]'])" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "50acdd7b70d9481b9be636b2322b2cfb", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, description='Downloading', max=927.0, style=ProgressStyle(description_…" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Using custom data configuration default\n" ], "name": "stderr" }, { "output_type": "stream", "text": [ "\n", "Downloading and preparing dataset csv/default-013faa159f500b12 (download: Unknown size, generated: Unknown size, post-processed: Unknown size, total: Unknown size) to /root/.cache/huggingface/datasets/csv/default-013faa159f500b12/0.0.0/49187751790fa4d820300fd4d0707896e5b941f1a9c644652645b866716a4ac4...\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "040a1e96d09d40f7b9d74a6e1601d1bd", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\rDataset csv downloaded and prepared to /root/.cache/huggingface/datasets/csv/default-013faa159f500b12/0.0.0/49187751790fa4d820300fd4d0707896e5b941f1a9c644652645b866716a4ac4. Subsequent calls will reuse this data.\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "Kz90Wt_2eucg" }, "source": [ "# train_dataset[0]" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "M0x6mQ6L23_p", "outputId": "b4b66bb1-b98b-47d3-b1b0-0abb528ff428", "colab": { "base_uri": "https://localhost:8080/", "referenced_widgets": [ "31c2adcad6154b05adda222d88f39e67", "4bac2eaf402d40f9b8e81786278eddb0", "ca5943a12af54c498a67505dd4bce7f1", "cdafe06d43284e10961ba6f8d4c05eaf", "6a19bd3eae2a43e5a3b0816999cb57ab", "55da41e1604f4e1a81a2c84a9ab98623", "5c9011bd9207477cb22b58095ee5e2c4", "d39668516e3f4f8cb36b4af3f349bf2f", "7ead312be00c423fab6b00f24563c350", "7487cc3bc4384e63b3877b43f29def80", "8729216f7c3145cd8f17b9ef648ab998", "c179bb72f9414503bfe6c0ca8812d75a", "ecb218a3c4644fb293b64f2f8e75996b", "e91005c51c12401ca1861403412ffa77", "547bb74ff9d4442dbedf16f3d744fc63", "f9bd5f9433de4b6fa6ac4f1c4a8ed193" ] } }, "source": [ "def tokenize(batch):\n", " return tokenizer(batch['text'], padding=True, truncation=False)\n", "\n", "train_dataset = train_dataset.map(tokenize, batched=True, batch_size=len(train_dataset))\n", "test_dataset = test_dataset.map(tokenize, batched=True, batch_size=len(train_dataset))" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "31c2adcad6154b05adda222d88f39e67", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='')))" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7ead312be00c423fab6b00f24563c350", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='')))" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "7YALYVLne2Im" }, "source": [ "# train_dataset[0]" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Jz5t7MlYeo1S" }, "source": [ "train_dataset.set_format('torch', columns=['input_ids', 'attention_mask', 'label'])\n", "test_dataset.set_format('torch', columns=['input_ids', 'attention_mask', 'label'])" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "MR6x81fIF1ge" }, "source": [ "# train_dataset[0]" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "NzN1GkN3fqAd" }, "source": [ "## Training and Evaluation" ] }, { "cell_type": "markdown", "metadata": { "id": "bnnRY7W2fp0e" }, "source": [ "We are almost ready to start the training. Let's define a function that will help us monitor the training progress and evaluate results on the validation dataset. We will primarily focus on F1, recall and precision metrics, especially that F1 is the official evaluation metric for this dataset. " ] }, { "cell_type": "code", "metadata": { "id": "5FKvvjz2lJqA" }, "source": [ "def compute_metrics(pred):\n", " labels = pred.label_ids\n", " preds = pred.predictions.argmax(-1)\n", " precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='binary')\n", " acc = accuracy_score(labels, preds)\n", " return {\n", " 'accuracy': acc,\n", " 'f1': f1,\n", " 'precision': precision,\n", " 'recall': recall\n", " }" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "jC_1BLR0lLBp" }, "source": [ "HuggingFace wraps up the default transformer fine-tuning approach in the Trainer object, and we can customize it by passing training arguments such as learning rate, number of epochs, batch size etc. We will set logging_steps to 20, so that we can frequently evaluate how the model performs on the validation set throughout the training. " ] }, { "cell_type": "code", "metadata": { "id": "9KzLKAeq42ii", "outputId": "303b8f03-8883-4c30-9d30-9fb3fd76d748", "colab": { "base_uri": "https://localhost:8080/", "height": 72 } }, "source": [ "training_args = TrainingArguments(\n", " output_dir='./results',\n", " learning_rate=2e-5,\n", " num_train_epochs=3,\n", " per_device_train_batch_size=64,\n", " per_device_eval_batch_size=64,\n", " fp16=True,\n", " warmup_steps=30,\n", " logging_steps=20,\n", " weight_decay=0.01,\n", " evaluate_during_training=True,\n", " logging_dir='./logs',\n", ")\n", "\n", "trainer = Trainer(\n", " model=model,\n", " args=training_args,\n", " compute_metrics=compute_metrics,\n", " train_dataset=train_dataset,\n", " eval_dataset=test_dataset\n", ")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/transformers/training_args.py:339: FutureWarning: The `evaluate_during_training` argument is deprecated in favor of `evaluation_strategy` (which has more options)\n", " FutureWarning,\n" ], "name": "stderr" } ] }, { "cell_type": "code", "metadata": { "id": "r33bTVp15ZAa", "outputId": "d358cba9-564d-456c-bce5-085f3a76a470", "colab": { "base_uri": "https://localhost:8080/", "height": 723 } }, "source": [ "trainer.train()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/datasets/arrow_dataset.py:847: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:141.)\n", " return torch.tensor(x, **format_kwargs)\n" ], "name": "stderr" }, { "output_type": "display_data", "data": { "text/html": [ "\n", "
\n", " \n", " \n", " \n", " [378/378 05:31, Epoch 3/3]\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StepTraining LossValidation LossAccuracyF1PrecisionRecall
200.5813890.3203180.9078690.0000000.0000000.000000
400.2686290.2454890.9083670.0107531.0000000.005405
600.2163680.2298700.9148410.1492540.9375000.081081
800.2077100.2554160.9138450.1218271.0000000.064865
1000.1876190.1784970.9267930.3744680.8800000.237838
1200.2073150.1691600.9312750.5892860.6556290.535135
1400.1558660.1706570.9292830.5644170.6524820.497297
1600.1738420.1731690.9302790.5541400.6744190.470270
1800.1288280.1744430.9272910.5228760.6611570.432432
2000.1446210.1697350.9307770.5351170.7017540.432432
2200.1228840.1677350.9297810.5688070.6549300.502703
2400.1341780.1684370.9272910.5350320.6511630.454054
2600.0941260.1697390.9327690.5714290.6923080.486486
2800.0798760.1838350.9312750.5740740.6690650.502703
3000.0914620.2035780.9302790.5454550.6829270.454054
3200.0743350.1953060.9307770.5825830.6554050.524324
3400.0792840.2021310.9327690.5631070.7016130.470270
3600.0823950.1939770.9312750.5843370.6598640.524324

" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n" ], "name": "stderr" }, { "output_type": "execute_result", "data": { "text/plain": [ "TrainOutput(global_step=378, training_loss=0.16361538316837695)" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "markdown", "metadata": { "id": "JkEKx7Xb_Z5i" }, "source": [ "We are reaching around 0.58 - 0.62 F1 score on the validation set (the actual result will vary since we're not fixing the seeds here). We can also see the training progress in the tensorboard charts that read our training log. " ] }, { "cell_type": "code", "metadata": { "id": "10sgUKXq5cBY", "outputId": "973c67b7-c86c-4858-f86e-368fc7056232", "colab": { "base_uri": "https://localhost:8080/", "height": 161 } }, "source": [ "trainer.evaluate()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", "

\n", " \n", " \n", " \n", " [32/32 00:04]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/plain": [ "{'epoch': 3.0,\n", " 'eval_accuracy': 0.9327689243027888,\n", " 'eval_f1': 0.5970149253731343,\n", " 'eval_loss': 0.19227837026119232,\n", " 'eval_precision': 0.6666666666666666,\n", " 'eval_recall': 0.5405405405405406,\n", " 'total_flos': 1738480015991628}" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "cell_type": "code", "metadata": { "id": "8PM-TSQo5fDZ", "outputId": "f347d68e-098a-4129-9e85-455bac11db2b", "colab": { "resources": { "https://localhost:6006/": { "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CjxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQVlBQUFEQXBvNXJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQmFiZ0FBV200QnhXc2pPQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUJsMFNVUkJWSGljN1oxNWVGVFYzY2MvdjVzRkNWUnhxVnRwdFZXMlZseGY2MXF0aXEwTDlHbDlOWFVCRkVwRlJUSWhoQkFEQ1RkQU1BRWtDWXNLN3FCOStrRDcycWZCV2l2cVc3VmE2NzRpcmU5cmF4WDFiWlZXWlRITC9ONC81ZzRHU0dEdXpMMXo3NTA1bjM4NHpNdzU1OHZNL1hLMjN6a0hESUdqaXpoUEYzRmUwRG9NSUVFTHlHZDBQb093YUFBdWNWNWFoMFc1VlBCNmtMcnlHV09JQUZDYi92U2pFcWdHK3V6d0t3Z2R3QzEwVUNmVi9Ec1loZm1MTVVRV1VSdUxFa1lEOHhFTzJ2N0dqb1p3UHN4SFdNeGhJRXVsbEs1czZzeG5qQ0d5aEM3Z0pKUlc0Q1NnWnhQMG5INEppNWlVODdqZkdnM0dFTDZqVFF3RTVnR2prVzdmZCtxR1NMS1dJc3BrTW0vN0lOUGdZQXpoRTJwVFFoK3FzS2dDK2dMdVRiQnJlaXV3bUhZYVpEcWZlaXJZQUJoRGVJNHFRaU1YQXdzUUR2UEFCRDJsTnlMVXM0bmJ4U2FldVdwREVtTUlEOUViT1FGb1JUaHQrNHYrR0NMNTU3TkF1Y1I0S2kzQmhsMHdodkFBYmVBUUxHeGdBbUQ1YW9MdTZjU2ZpdkFMbEVxSjhZNUw2WWFkTUliSUFMVXBwb2hyRVdZajdMMzlqZXdhSXBuZWpMS1F2V21VY1d4TDZSOWcyQVZqaURUUnVZekNvZ1g0QnBBOUUzUlA5L3orMzRHWlVzYktYcVFiZG9NeGhFdTBnYU1SbWxITzl2QUIvNk9UT3RrRFF5VFN5aU1vNVJManRaNytIWWFlc1lJV0VCWFVaaitkU3l2d1BNclpIaFc3RVdFaW4zRWFVemtWb1JUNG15Y2xDK2RnOGJJdVphWGV3b0dlbEprSG1CWmlENmhOSVVXTVIya0FEdkNvVmRpS3NKajRydXNKdXB3U1BxTUtxRUtjOVl2ZXlrbTl6azFBRXdmU0xLVzBZK2dWWTRqZG9QV2NnMFVMd2xIYlg4emNFR3NSeW1UYTdsZWN0WW1CRkRrcjNPeXd4cDJPSVpMcERRaFQ1VG9lMkYzZCtZd3hSQS9vSEFaQnQ3QnNiMXFGRnltZ1hDcmR4U1RwSXM0RVdoQ08zYVhNOUxXc280Q1lYTU1iYnJUa0E4WVEzVkNiL2dpVnlFNWgyWmtaNGlPRU9SeWVmdFNxMmxnTVlEVEtmT0FnajNSMW9OeENJWFV5MFlTWkp6R0d3SG5nTE9lQjZ5a3NPNzBITC9IQWlYZjdHblFaL1dudndiRHBhd1NjTVBQOVRKZzVHRU9nczFNSXkzYi9zSzBqVGt4cS9PbVNhQ3VEVUJxUTdUdnR2T2pXdlloUUx0ZmtkNWg1M2hwQ2JSZGgyYWsvVkJ0UUtxU0czM2dxdGhlMGxYT0FGdUFvRDlkRTFsSkFtZncwUDhQTTg4NFFhbE1DenJSbXFtSFplMzZRTmlFMDhUbk5ZbWQzV2xOdEN0bVg4WWd6TGR5N1JqZnBSSmg1RVEzeWsvd0tNODhiUXlnSWRWeU14UUxVWlZoMjcrOTNvdHlKTUZOcStJZlhtdDJnaTlpUFFtWUIxeUVVYm44ak0zTzhoMUxEUkZhSm9KNEtEaWw1WVFpdDVRUWtnN0Rzbmw5N0ZJdHlxZVpWVDhWbWlDNWhLRW96NGh4cjQwMVg2bG1VbUZ6RDB4NUtEU1U1YlFpdDRSQ0tzTkVNdzdKM2ZPMHRsQnFaeVJxUDVYcUtMbVlVUWd2aUJCOUNwdVpRNEY0NnFKSkpmT0NwMkJDUms0WlFtMkk2UFF6TFR2eVpDSy9laHh1bGpNODlsdXdMYWxQTS9zNzNBSHQ3MUZwc1JsaElZVzZHbWVlY0lYU0c1MkhaY1lUN0VLYkpERDcwVm0xMjBPVWNRZ2MyNHJTVTRNWDM4aFpDalV3SWQwdnBscHd4aE43QVVBcG9Cczd6Y0FyeUdaU1kxUEdNaDFJRFEyOTJ0cmdxcDNuMkhWazhTcHdwOGxOZThWQnFZRVRlRUdxekh4M01RcmdPbk5tVnpIL3NkNEVaMU9iZTdJb3F3aTNPSVFod0dPREY5OVdKT0xOdDQ0T2RiY3VVeUJwQ2JRcnBZRHg0R3BhOUJWakFsMmlTQ3JaNktEZDA2SEpLNktRS1NTSE1QTlcweFNiaU5MRjNkTVBNSTJrSXJYRldhTDBMeTFiZ0Z4UXdUV1o2dEVFbkl1amlGTUxNM2FZVFllWVZNaTQ3Sy9aZUVpbEQ2RXdHRWZjOExQczVMTXFsamo5NHB6UjY2TTJjNlV4RzdCcG03amI5eFd2cktLUk14ckxlTzZYK0VnbERxTzFFZVNyVkNIMjJ2NUdaSVRZQzlXQU8rMHFpTmhZSE80Y3hkdzh6aDB6V2JSSlJ2eDNSQ0RNUHRTSFV4bUlybzdHY0h3aThhQlhhZ1ZzcFlhWTVEckpuZEJuOXNhakVjc0xNSVJOREpFbUVtZmNOZDVoNWFBMmhOM1FMeS9adUduVXRRa3hzL3RkRHFUbUwzc29neE9taVptNklaUG9GbEhJWnh4TmVhdldLMEJsQ3F4aUkxVzJRQjE2MENpK2hsTXNjZnUrcDJEeEJWekRDaVk5S1RHSmtab2hrZWkxeEpzczQvdXFsMWt3SmpTSFVwb1F0empRZzlQV29WVWhzMzF6UFVsa1QzbVk2Q3FoTklWOXhUaDhSSjh3Y01qRUVKS2E1bDlDWHVWTEtaOTRxVG8vQURhRWdUT05peEZrb2N2K2w5cFJPWEV2VlRwMDBoWDhnRnlYMGR2WkRtUVZNQWdveU5FUXkvUjVDRGFPRFh3Z04xQkE2bFJPd2VnbkxUdDhRNnhES1pZNjV1TkJQOURhR0FZdVFicmVuWnY3Yi9RbUxtSXplZnBKaDFnbkVFRnJ1aEdYdjdyUnM5MS9xQnVKTWxYbm16S0Zzb3JjekNweGdTbTlhZDBXY01QTngyUTh6ejZvaG5PN1JOSlJhaFA0OXFuRC9wWDRNMUZQRXpXTFQ2YTFpUXlyb1hleEZuQXJnQnFDL1IrTy9UN0NZUXhHTHN4a0drdlVXUWlzNHpqa043NHdlVmFSdWlFUllkaEdWWXZOL2ZtZzF1RU9YY3dpRlBvV1pYNUdkTVBQQXhoQmF5U2lFVnVEcnJnMmhQSW93UmVibFJzaHhycUYzY3dKZHp0alF1eldrUjFIS1piUy9XM2FESFZUYkZMT1pheEhtQUYvYVFWSFBYOHhiV05SSVEyNXRTc2xGVkJIdTlpSE1ITzZraUpsUzZrK1llZURUcmdCYXhhSEFMR0FDMG1OVG05aTJXRXlqMkxtM2JUR1gwZVdVVUp6aWFlYXBwemVoMUhNb3krUXNiOGVOb1RCRUVxM2lQNXh1MUttT3NzVEc5aTZxWkVIdWJtelBCL1EyQmxMTVBOVERNSE40RTRzS3VaUUh2ZElaS2tPQU14TTFuVEVJRjJOaHl6eGVDRnFUd1R2MExyN3JoSmtmcy8zRnpNMXhQM0VxNVlyTVk5UkNad2hEN3FNMkZvYzdZZWFTUVpqNWp1a09MRzZoZzFvWnpTZnBhak9HTUFTR3JxWS9XN3VkWmc2WnR4YkMreWcyRm5la0UyWnVER0VJSEwyUFFYU2xFV2ErdXpROGowVzVsUEtrR3kzR0VJYlFvUGR3UHNJaWhLRkFwb2FBeEtYMkUrVEgzSm1xQnRlM2tHbzVFN1NjSDdyTlp6RHNDYm1TQjluSzBjQkU0SjllRkFrYzZpYUQrMnQ1bFNOUjd0Y1k2L1I2eDhrR2cwZklSRHBrREN2b3d4QmdNV1IzSDBzNmhpaHlVdWRRd0NzYW8xV3Y2eGFvWnpCNGdKVHlzWXdtUnB6aHdHK3pWYTk3UTFqYkRRRlFCSlJSeEhxTk1kWXpWUWFEZzR4bHZZem1mSVFmZ1A5NzRUTnBJYm96RUxoSHkzallkS01NZmlDWDAwWVJ3NEJ5U0grZFlVKzROd1E5R2lLQk1JSUNYdFlwTktyTlh1bkxNaGgyUlVwcGx5dG9SUmdHL3B5bDVhMGhFaFNqVE9kZnZLNHhScVlqeW1EWUhYSVpHOEdmdmRkK0dDTEpOeERhZEFwdFdzblgwNmpIWU1nNlhvMGhkc2RJdW5oZEs3Qk5OOG9RZGpLZFpVcVZ2aWl6K0lUWHRKSUwwOGh2TUdTRmJMUVEzVG1DT0d1MWdqWXQ1L0FNeWpFWWZNSFBNY1R1R0VrQmIyaWw2VVlad2tWUWhvQmtOK3BUWHRWcFhPQlJtUVpEUmdScGlDUkhvanlnVTJuVGF0T05NZ1JMdHNjUXZTT01wSlBYdFFwYkozZTdGTVZneUNMdURTRStHU0pCQ2Nvcyt2Q2FUdXQyWnFqQmtDWEMwR1hhRmVGSTRFR3RvazJuT21mNkdBeFpJSnlHK0lMRWJKVHBSaG15Uk5nTkFWQUN6S0tFVjNVNjM4OXkzWVk4SXdxR1NESUkrSzFXMDZiVCtWcEFHZ3c1VHBRTWtVQVppYkJlcTdIVnBqaFFMWWFjSTNxR1NKRG9SbTNqVmEzbWUwR0xNZVFPVVRWRWtzRUlEK2tOdE9rTXZocTBHRVAwaWJvaGtvd2t6bnF0TWQwb1EyYmtpaUVBK2dHemFPY1ZyZUhjb01VWW9va3JRMmppNEtkQ243UjR4UkRnZHpyRGRLTU03bkhYUWx3ZGVqTjBaeVN3WG1lYWJsUmVFM2QzR0lIYkxsTll1MHU5MFE5bEZsMjhyRE1aRWJRWVExYlpqRkxQTmhhNXllVE9FUHRHemhBSmxLSEE3M1FtSzdXR2c0S1dZL0FWQlZiUndTQzVERnZHdWJ1Q3paMGhPaU5xaUFRQ2pLR0FEVHFUbU5xUjZ2NFpVa0g1RXhhbnlhV01sVEc4bjA0UjdnelJGV2xESk5rSG9ZVXVudE5hVGd0YWpNRVQza1c0a2tzNVdVcDVPcE9DM0JuQ3I4MUJ3WEFNd2hOYVo3cFJrVVhaQXRSVHdHQzVsSlVpbVI5ZTVzNFE4Wnd5QkNTN1VZVzhxWFhFOUJJS2doWmtTQkZoRlVVTWxzdXdwWlN0M2hYckFyMmVvUlN3M2xXcDBVcS9oREJKYko3Q2tKZTRheUdLY3E2RjJKbGpnU2ZWWnFYYUhCaTBHRVAyeWVjeFJNK28wNDJDRFZwUFRGZWJibFErWVF6Uk93TlFXbGpQc3pxYlU0SVdZOGdPdWI1UzdRWEhvZnhCNjFtcDgvaHkwR0lNL21KYWlOUklkS002MmFCelREY3FsM0ZuQ01uN0lMbDlVVnJZd0o5MExpY0hMY2JnUGFiTGxBN0s4U2hQNlJ6VGpjbzFUSmNwZlJMZHFDN1RqY29sVEF1Uk9mc2l0UEFYbnRIWm5CUzBHRU5tdURORWVyY0g1UWZLQ1ZnOHBYTlpxVFlIQkMzSGtCNm1oZkFXQzJFTVJXelFCbUpxcDdWblBWUm9Nd09DMXBBSnVwcUQzWHplN1ErMjV6MEVycUtqY3BiOWdCYUtlVkliT1Nab01lbWdTemhVbDdLY1l1WUVyU1VkZEJWRDlHYzhRQWRUM2VSek82aDJOKzFxekhFS1NsblFJdHlnTnNXNmhCZ1dieUpjVFhvbnN3U0czc2UrZWgrTldMd0M3bSttY3JkclRDbEsreUhmTWQ5bTRER2dqUzZlb0lqSDBCemRreENuUFdnSnFhTExHSVhTQ3RHN1YxeHRMSTVnTkxBQTBnL01kTHVOTXBNeHhOc29Ed05yMlllSHhQN2lRZEZLS29EN01pZzd2QWdkUVV2WUU3cU1ZNG5UZ25KbTBGclNRZS9qTE9LMElCeWRhVm51REdGUjVHSlBVaGVKL1FWckVkcmtKcDd2N1lPeWtKOXBKWmRERHQ1aExlRnRJWFFwK3dOMXhKa0UwVnRIMFpWOERZdTVLR084NnA2Nzd6THRuczJJMHhVcTVOZXlnQTljS0xtZUxyNUw0Z1MrM0VIRDEwTG9jb3BvNXpyaTFDUHNFN1FldCtoSytpRk1BNmFqN09YbFdOV0xMdFBiQ0E4anUzYUYzQ0NOL0ZXcmFFQ1psM2doblZKQ1NNZ01vWXNad2VlMEFOOEtXb3RiVkJIdVpReEtFN2liVGsyVmRBenhSVmNvVHBzczdyMHI1Sm9TRnJDWlVoSTcxM0lES3h5RzBLVU1wb3RGS0JkRzhUOGJ2WXNUV1VVcitMczN4WjBodXJpYkl1WkxNeC83SVVac09yV1M2eENlcFB0MFgyLzdvS05Cb0dNSWJXWUFRalZkVElIb1JTdnJQWHdGdUJFWVRSWitmVmVHa0tXODZaZVE3WFVzNUdtZHhuTGdXci9yeWdvQmRablV4bUpBNXRPUVFhR3I2Y3RXeW9BWndKZXlWVzg0RjEyMlVZM3czaDQvRjRYV0lvQlpKcjJKczlpSEY0QjdpS0laN21JVVczZ0RwWkVzbWdGQ2FnaFp3aWRBaGJ0TS9takptQ3kyRUhvVFg5Vm1WbUx4S0VRdlpFVHY1SGk5aThjUmZnMGNIb1NHMEo1dktrMnMxbW1NUmhqbFByTVBndElsQzRiUUJmVERZaHJDZEdBdnYrdnpHcjJIL2VtaURnbCtQU1MwaGdEQTRucVVzNEQrYVpjUnZEbDg2ektwSWl6aVlvU0ZFTDJyaW5VNVJSUnpIVjNoV1E4SlpaY3BpVFR4RGtLOWR3VjZWbExxK0RUdHFnczVrVVU4Q2F3bWltYTRreEVVOFJKS0M0VERESkJsUTZoTm9icDlMUHZTQXJ6b3VaanNtR01UeXF0ZUZxaE5IS29MV1k3d1IrQlVMOHZPQm5vSFEvUjJIbkRpMnI0WnRKNmQ4ZDBRT3BrK09vVVJXa0Vybi9BdVU3aktUWDZ4NlVTNW1zU0NvRC80WVE3bEF5ek9raHJlOEt6SWhWeEVBWCtHNklWbEEranRqQWRlUTl5SFpXY0xYNzVVblVKZm5jSW9uY0pLQ3ZrUWVCZ29BdzVDYU5ZcUJyb3BUK2J6SEhDekgxcDNyY3lUVXQ2bWdPOUlOUzk3VXRvWEhFTzBZNzJHRWZKeHEyZml0SndCS09jaWpFTDVFZEMvbDRkckg3cTRCVnpPSGlrekVINEU3c3lVRWVtWjR6VUsrYjVNWjZQSGFneFpJS01XUWlleHY4WVlxekhhVUQ0a01jQWJ3NTVuaFVacUJUOTJVNWZNNTFNazlMdlBIcWVBMDQwWm9vdHJRK2hrQm1vWlYydU1OZ3A1bjhScTZFamN4c2tJUzdYUzNTcXFOSEkveXE5YzFlTVZlMjR0MWxMQ2VWTE52N09neHVBVDdpNXVMK2NpTE41QldFN0NCSm5zb0R1QU9NMnVjeW1USU9DSGJtZHpLUGZ5WlM2U0N1OXVzakVFZzlzcnRmcmg1WnlNY0xsTzVZZXVzc3huSThvc3p6Umtpc1VTdXJoU0pvWWp6TnVRR2NGUDNRazNhelg3dXNyVGx5WEFILzBSbERJSzFNc015c1FtSHJBV2cwY0Vid2c0aEU2YTNHUVFtemdXRXlHdy81VzdVSzZSV3V5QTZqZjRSQmdNQVRCQnAvRTlOeGxrSHE4QVMzelNzenZhRVM2VE9sWUVVTGZCWjhKaUNDSE9jclZkQnZIMW9SWjQyeDlKUGJJWllaVE1aRTBXNnpSa2tiQVlBb1REMmN4Y1YxbHN0amdodzluZ1l5eEdTQzIveTFKOWhnQUlqeUVTVE5icG5PNG1nOHpqUWVBWFB1bEo4ZzdDcVRJejhJRzh3V2ZDWmdpTE9MZXI3WEtUU3llVGdYLzVJNG4xRkhDNjFMTEJwL0lOSVNKc2hnQVl3bVpxM1dSd0RrU2I2WU9XNXlqaVRKbkozOU10UUJzNHlrdEJCbjhKb3lFQXFyU2FFMXpsS09ZVzRDa1BOVHpHWHB3dE5md2ozUUwwUnFZalZIcW95ZUF6WVRWRUlYSHUwS3RURHcwUm16Z0ZYSU0zYXhPL0FpNlE2WHlhYmdIYXdHem4xQWhEaEFpcklRQ09ZUUJWYmpMSUhGNUYwb2lQMnBHN2dVdkVabHM2bVZVUmJhQUZjZGZ0TTRTRE1Cc0NvRmFudXp5RGRBczI4RDlwMVNZMGljMDRzZWxNSjd1dXBvQjUzQTdFMHFyZkVEaGhOMFFmNEE2OUpQV2pTYVNaclU1RWJPb0lpbElwTnRWdUJTYlIxUlR3Wis0Q3hxZGJoaUY0d200SVVFN2k2MHgyazBYbThSREN6MVA4ZUJjd1FXWnprM3R4Q2RTbW1EK3pCbUZNdW1VWXdrSDREUUVnTkdnMVI3cktFNmNjMkxTSFQzMU9Zcnh3WjdyUzFLYUVRdHFBSDZWYmhpRThSTU1RVUlKeW01c2piR1FlSDhKdXUwRC93bUtFek9iK2RFWHBBdm81Wm5BVm1HZ0lMMUV4Qk1CM3FlYW5ybkkwY0J2d1pBL3ZKSTZJc1h0OEx5WFVaZ0RiV0FlY25XNFpodkFSSlVPQXNrQm44TlZVUHk2SlRUd1RTSFNOa2lTT2lMRjVLVzBaTmdkU3dIOERKNmRiaGlHY1JNc1FzRGRkM09vbWc4eGxBN0RRK2V2cnhQbU8yTHlWcmdDMU9aZ0NIaUdDcDJzYjlrelVEQUZ3Z1Zaemhhc2NoY3hGdVpzQ1RwZUdGTzZkNkFXZHkyRllQQUVtUGlsWENmVXBhcnVoVld0WTV3eWM5NGl6Nmp3dWt3clZaakJ4MWtIcVhUWkQ5SWhpQ3dHd1A4cmliRldtY3hpR3hXTVlNK1E4VVRVRUtLVjZBeGY1WG8zTjhjUjVIRGpVNzdvTXdSTmRReVJZcGpiNytWVzR6dVpFaEllQkEveXF3eEF1b202SWc5bVdmc2pGN3REWm5JbnlDUGhuT0VQNGlMb2hRTGhLcXpuUHl5SzFudk9KOHlCWnZnSFRFRHpSTndTQXNGeXJ2SGw0MWVZSEtQY0RmYjBvenhBdGNzTVE4RFVLdVRIVFFyU095NEJma2dnN04rUWh1V0lJZ0d0MUJtZWttMWx0cmthNGwraXV6Umc4SUpjTVlhSGNwbFBjZDNXMGprbkFyZVRXOTJGSWcxeDdBQVpUNHU0QVlxMWpPc0pTTkFRM1doc0NKOWNNQWNwVXJlWEVsRDQ2aTNvd0oyUGtNRytnL05KTkJuZUc2T0p4SlBSbm14WVE1dzYxZTcvaVMwRjBGcTBvZGRrVVpzZ2FtNEJxQ2psT1JyczdmdFRWQUZLVzhUZmcrenFGRWNScEFaY25ZbVNQNGJSekExQy84eHRxWTlISkNwU2ZCS0RMNEM5eDRENkttQ3FsNlIwd2wxYVhTWnBaeDFhT1F5a242UHZlZWtPbzBWcUdkMzlKTDZHQVR1NUVqQmx5RHVGUkxJNlRLeGlicmhrZ2d6R0VyS0JERnROS0owY0FpMG1jWGhFbWlvbHpqOXFKVmxCdGlobkthb1FyZ3habThKUzNFRXJsQ3M2Unkza2wwOEl5SGxUTE1qNlNWbUlJdzRHSE1pM1BZNDZqZzNLZFRCODZXUVArUjhjYXNzWm1vSjVPaHNzVjNsMWc0OWtpbExTd0hqaFBZMXlDTUI4NDNLdXlNMEtZelQ1Y0JKd1N0QlNESnlod0w1MVV5VGcrOExwd3o2ZGRwWlUxREdBSVFqbndpZGZscDBGZmpCbHloV2RSVHBPeGpQWERET0RUT29UWXRFc3pyUlF4REZnQjV0cGFRMGE4aDNJbFl6aEpydVJwUHl2eWRXRk81ck5SbXBrSW5BVDh3Yys2RERuSlZxQ0p2Z3lWcTFncGd2cGRZVllDMmFTWjV4UytRd1VYQXd1QXc3SlJyeUhTckVXWkxGZngxMnhXbXJYUURRR1ZSYXpoTTc2SlVFL0MvUWJEenJ5QWNvWmN4U2dabDEwelFBQ3hUTEtDTGJJUW13SUdBNnZBLzJiUUVBaytBc3JweDdkbEhFOEVKU0t3NEQ2Wno3dHlFMk9CVXhCejNXMGUwd0VzcHAwalpCeXRVaHJzQW0vZzBhNnlrR2ZveDJuT0NuSktCNDhaY29aMXdMRXlucGhNREVjSVVPQ0dnTVNGaWJLQWxTaEhPT09Mei9lWXlSQmxObUJ4b1l6blhCblBHMEdMNlU0b0RKRkVGckpaNW1OVHdGR0lkOHZ4aHREd01jcGsvczVSTW83ZkJDMm1KMEs1ZjFnYWVRc28xV3JPZHNMTWgrOHBqeUg4eUlUTUQ0THdtMUMxRURzampUeEtDY2NqVElUMFEzb05obFFKdFNFQXhLWlRHbG1CTUFTbENXZ1BXcE1oZHdtOUlaSklJNXRrUHRYRU9SckMyZjgwUkovSUdDS0p6R2VETkhJaGNDNkVhNGJDRUgwaVo0Z2swc2c2UHVKWUo4dzhGSFBZaHVnVFdVT0FzNDExSHEzQUVjNEZLbUhieG1xSUdKRTJSQks1a1kva1JtTEVPUkY0UEdnOWh1aVNFNFpJSW8yOEtQTTRFL2dCOEhiUWVnelJJNmNNa1VRYWFHTUwzMEtwQmo0TldvOGhPdVNrSVFDa21hMHlqeVlLR1lxYWJheUcxTWhaUXlRUm00M1N3RVNVa3hDZUNscFB4UGd2NHRzdnZjOExjdDRRU2FTQjU1ak42UWlsd0R0QjZ3azVid0xueXlUK1V5Ym4xMWdzYnd3QnpqYlcyYXloZ0dFa3puM2RGclNta1BFeFNqbi9aTGhNNHJkQml3bUN2REpFRXJIWklyT3hzUmdFckNJTHB6bUVuRTVnQlVVTWtjbTBpazFuMElLQ0lpOE5rVVJzM3BYWmpLV0xzNENYZ3RZVENNb2p4RGxPSmpOUkp2TFBvT1VFVFY0Yklvbk00ZmNJSitUWk50YS9JSlJLR1NNa3htdEJpd2tMeGhBT1loTVhtNVhBa1pEVDIxZy9RNmtIaHN0a3N5dHhaNHdoZGtKc1BoTWJtd0tHUTA0OU1IRmdGY3FSRXNPV3NwdzFmRWFFY2d0cEdKQmEvZ0tVYWozbkFNMUVleHZyTXlneEtlZVpvSVdFSGROQzdBR1p4U01veDBNa3Q3RytDMXhKakZPTUdWTERHQ0lGeEtaVDZsaEJuS0VrYmtzSys3VGtGcUNlT0lPbFBEdUhCT2NLeGhBdUVKdVBwWTRZQlF4SGVUQm9QVDJnd0JxNitLWk13WllLYzM2dVc4d1lJZzJraGplQkMzUU9JMGkwR01NQ2xnVEM4MEJNcHBockJ6TEJ0QkFaSUxXczQ4c2NFL0J0ck84alRPVGZmTnVZSVhPTUlUSkVKdElodGJSaWNRU1MxVzJzN2NCaWloZ3FVMWdodGdsdjl3SmpDSStRR2o2U0dtTEF0OEgzNDl6WFlqRk1waEtUc2xEYzQ1Y3ptREdFeDhnTVhnRE8wTG1Nd3FMVjQrTGZSRGhicHZLWXgrVWFEUDZqTmlYYXlCbEI2ekNrenY4RFFkN1FyTWJMUjFBQUFBQUFTVVZPUks1Q1lJST0iPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICBjb2xvcjogdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKTsKCiAgICAvKiBMZWdhY3kgbWVjaGFuaXNtIHRvIGF2b2lkIGlzc3VlcyB3aXRoIHN1YnBpeGVsIGFudGktYWxpYXNpbmcgb24gbWFjT1MuCiAgICAgKgogICAgICogSW4gdGhlIHBhc3QgWzFdLCBtYWNPUyBzdWJwaXhlbCBBQSBjYXVzZWQgZXhjZXNzaXZlIGJvbGRpbmcgZm9yIGxpZ2h0LW9uLWRhcmsgdGV4dDsgdGhpcyBydWxlCiAgICAgKiBhdm9pZHMgdGhhdCBieSByZXF1ZXN0aW5nIG5vbi1zdWJwaXhlbCBBQSBhbHdheXMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCB3aGljaCBpcwogICAgICogdG8gdXNlIHN1YnBpeGVsIEFBIHdoZW4gYXZhaWxhYmxlLiBUaGUgb3JpZ2luYWwgaXNzdWUgd2FzICJmaXhlZCIgYnkgcmVtb3Zpbmcgc3VicGl4ZWwgQUEgaW4KICAgICAqIG1hY09TIDE0IChNb2phdmUpLCBidXQgZm9yIGxlZ2FjeSByZWFzb25zIHRoZXkgcHJlc2VydmVkIHRoZSBib2xkaW5nIGVmZmVjdCBhcyBhbiBvcHRpb24uCiAgICAgKiBDaHJvbWUgdGhlbiBpbiB0dXJuIHVwZGF0ZWQgaXRzIGZvbnQgcmVuZGVyaW5nIHRvIGFwcGx5IHRoYXQgYm9sZGluZyBlZmZlY3QgWzJdLCB3aGljaCBtZWFucwogICAgICogdGhhdCBldmVuIHRob3VnaCB0aGUgYC13ZWJraXQtZm9udC1zbW9vdGhpbmdgIGRvY3MgWzNdIHN1Z2dlc3QgdGhhdCBzZXR0aW5nIGBhbnRpYWxpYXNlZGAKICAgICAqIHdvdWxkIGhhdmUgbm8gZWZmZWN0IGZvciByZWNlbnQgdmVyc2lvbnMgb2YgbWFjT1MsIGl0IHN0aWxsIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgYm9sZGluZy4KICAgICAqCiAgICAgKiBbMV06IGh0dHA6Ly93d3cubGlnaHRlcnJhLmNvbS9hcnRpY2xlcy9tYWNvc3h0ZXh0YWFidWcvCiAgICAgKiBbMl06IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTg1ODg2MQogICAgICogWzNdOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udC1zbW9vdGgKICAgICAqCiAgICAgKi8KICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIH0KPC9zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICA6cm9vdCB7CiAgICAtLXRiLW9yYW5nZS13ZWFrOiAjZmZhNzI2OwogICAgLS10Yi1vcmFuZ2Utc3Ryb25nOiAjZjU3YzAwOwogICAgLS10Yi1vcmFuZ2UtZGFyazogI2RjNzMyMDsKICAgIC0tdGItZ3JleS1kYXJrZXI6ICNlMmUyZTI7CiAgICAtLXRiLWdyZXktbGlnaHRlcjogI2YzZjNmMzsKICAgIC0tdGItdWktZGFyay1hY2NlbnQ6ICM3NTc1NzU7CiAgICAtLXRiLXVpLWxpZ2h0LWFjY2VudDogI2UwZTBlMDsKICAgIC0tdGItZ3JhcGgtZmFkZWQ6ICNlMGQ0YjM7CiAgfQo8L3N0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxzdHlsZT4ubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nLC5tYXQtYm9keS0ye2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktMywubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTN7Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXQgLm1hdC1jaGVja2JveC1sYWJlbHtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyLC5tYXQtdG9vbGJhciBoMSwubWF0LXRvb2xiYXIgaDIsLm1hdC10b29sYmFyIGgzLC5tYXQtdG9vbGJhciBoNCwubWF0LXRvb2xiYXIgaDUsLm1hdC10b29sYmFyIGg2e2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyLC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5le3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9we2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3h7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja3twb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7LyohKi99QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7LyohKi99LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb257Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLC5tYXQtb3B0aW9uOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZCAubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveHtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoze2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZ7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1iYWRnZS1jb250ZW50e291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudHtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudCwubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZle3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW0gLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50e3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjJweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTExcHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93IC5tYXQtYmFkZ2UtY29udGVudHtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbntjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5e2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudCwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm4sLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtaWNvbi1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1mYWIubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLC5tYXQtZmFiLm1hdC13YXJuLC5tYXQtbWluaS1mYWIubWF0LXdhcm57Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1mYWIubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwubWF0LWZhYi5tYXQtd2FybiwubWF0LW1pbmktZmFiLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxle2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXB7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgLm1hdC1jaGlwLXJlbW92ZTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWR7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxle2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCxtYXQtaGVhZGVyLXJvdyxtYXQtcm93LG1hdC1mb290ZXItcm93LFttYXQtaGVhZGVyLXJvd10sW21hdC1yb3ddLFttYXQtZm9vdGVyLXJvd10sLm1hdC10YWJsZS1zdGlja3l7YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3csbWF0LWhlYWRlci1yb3csbWF0LWZvb3Rlci1yb3csdGgubWF0LWhlYWRlci1jZWxsLHRkLm1hdC1jZWxsLHRkLm1hdC1mb290ZXItY2VsbHtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxse2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsLC5tYXQtZm9vdGVyLWNlbGx7Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbiwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnR7Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcntib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWx7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd3tib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50e2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnR7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudCwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCwubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50IC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2FybiAubWF0LWlucHV0LWVsZW1lbnQsLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbjpob3ZlciwubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cywubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb24sLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246aG92ZXIsLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVse2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSwubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yLC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSwubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnk6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXI6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWQ6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWUgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkLC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtbGFiZWwsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtb3B0aW9uYWx7Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29ue2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcntjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsLC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5le2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWhlYWRlcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLW5hdi1iYXIsLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3MsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3MsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5e2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50e2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2FybntiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXB7YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWV7YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY5ODAwfS8qIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlcy5jc3MubWFwICovCjwvc3R5bGU+Cgo8L2hlYWQ+PGJvZHk+PGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBbaGlkZGVuXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLS1sYXlvdXQ6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWlubGluZTogewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbDogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH07CgogICAgICAtLWxheW91dC1ob3Jpem9udGFsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtdmVydGljYWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtdmVydGljYWwtcmV2ZXJzZTogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC13cmFwOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcDsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH07CgogICAgICAtLWxheW91dC13cmFwLXJldmVyc2U6IHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtYXV0bzogewogICAgICAgIC1tcy1mbGV4OiAxIDEgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC1ub25lOiB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4OiB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0yOiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTM6IHsKICAgICAgICAtbXMtZmxleDogMzsKICAgICAgICAtd2Via2l0LWZsZXg6IDM7CiAgICAgICAgZmxleDogMzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNDogewogICAgICAgIC1tcy1mbGV4OiA0OwogICAgICAgIC13ZWJraXQtZmxleDogNDsKICAgICAgICBmbGV4OiA0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC01OiB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTY6IHsKICAgICAgICAtbXMtZmxleDogNjsKICAgICAgICAtd2Via2l0LWZsZXg6IDY7CiAgICAgICAgZmxleDogNjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNzogewogICAgICAgIC1tcy1mbGV4OiA3OwogICAgICAgIC13ZWJraXQtZmxleDogNzsKICAgICAgICBmbGV4OiA3OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC04OiB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTk6IHsKICAgICAgICAtbXMtZmxleDogOTsKICAgICAgICAtd2Via2l0LWZsZXg6IDk7CiAgICAgICAgZmxleDogOTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMTA6IHsKICAgICAgICAtbXMtZmxleDogMTA7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMDsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMTE6IHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMTI6IHsKICAgICAgICAtbXMtZmxleDogMTI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMjsKICAgICAgICBmbGV4OiAxMjsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBjcm9zcyBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydDogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZDogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmFzZWxpbmU6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogYWxpZ25tZW50IGluIG1haW4gYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZW5kLWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1jZW50ZXI6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICB9OwoKICAgICAgLyogc2VsZiBhbGlnbm1lbnQgKi8KCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RhcnQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtY2VudGVyOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWVuZDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1zdHJldGNoOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgIH07CgogICAgICAvKiBtdWx0aS1saW5lIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1iZXR3ZWVuLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfTsKCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBPdGhlciBMYXlvdXQKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgIC0tbGF5b3V0LWJsb2NrOiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbnZpc2libGU6IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXJlbGF0aXZlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml0OiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNjcm9sbDogewogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZ1bGxibGVlZDogewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICB9OwoKICAgICAgLyogZml4ZWQgcG9zaXRpb24gKi8KCiAgICAgIC0tbGF5b3V0LWZpeGVkLXRvcDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpeGVkLXJpZ2h0OiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1ib3R0b206IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1sZWZ0OiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfTsKCiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJpcHBsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwoKICAgICAgICAvKiBTZWUgUG9seW1lckVsZW1lbnRzL3BhcGVyLWJlaGF2aW9ycy9pc3N1ZXMvMzQuIE9uIG5vbi1DaHJvbWUgYnJvd3NlcnMsCiAgICAgICAgICogY3JlYXRpbmcgYSBub2RlICh3aXRoIGEgcG9zaXRpb246YWJzb2x1dGUpIGluIHRoZSBtaWRkbGUgb2YgYW4gZXZlbnQKICAgICAgICAgKiBoYW5kbGVyICJpbnRlcnJ1cHRzIiB0aGF0IGV2ZW50IGhhbmRsZXIgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUKICAgICAgICAgKiByaXBwbGUgaXMgY3JlYXRlZCBvbiBkZW1hbmQpICovCiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFthbmltYXRpbmddKSB7CiAgICAgICAgLyogVGhpcyByZXNvbHZlcyBhIHJlbmRlcmluZyBpc3N1ZSBpbiBDaHJvbWUgKGFzIG9mIDQwKSB3aGVyZSB0aGUKICAgICAgICAgICByaXBwbGUgaXMgbm90IHByb3Blcmx5IGNsaXBwZWQgYnkgaXRzIHBhcmVudCAod2hpY2ggbWF5IGhhdmUKICAgICAgICAgICByb3VuZGVkIGNvcm5lcnMpLiBTZWU6IGh0dHA6Ly9qc2Jpbi5jb20vdGVtZXhhLzQKCiAgICAgICAgICAgTm90ZTogV2Ugb25seSBhcHBseSB0aGlzIHN0eWxlIGNvbmRpdGlvbmFsbHkuIE90aGVyd2lzZSwgdGhlIGJyb3dzZXIKICAgICAgICAgICB3aWxsIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGluZyBsYXllciBmb3IgZXZlcnkgcmlwcGxlIGVsZW1lbnQgb24gdGhlCiAgICAgICAgICAgcGFnZSwgYW5kIHRoYXQgd291bGQgYmUgYmFkLiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgICN3YXZlcywKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgIC53YXZlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpICNiYWNrZ3JvdW5kLAogICAgICA6aG9zdCguY2lyY2xlKSAjd2F2ZXMgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgLndhdmUtY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImJhY2tncm91bmQiPjwvZGl2PgogICAgPGRpdiBpZD0id2F2ZXMiPjwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLS1zaGFkb3ctdHJhbnNpdGlvbjogewogICAgICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4yOHMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LW5vbmU6IHsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICB9OwoKICAgICAgLyogZnJvbSBodHRwOi8vY29kZXBlbi5pby9zaHluZG1hbi9wZW4vYzUzOTRkZGYyZThiMmE1YzkxODU5MDRiNTc0MjFjZGIgKi8KCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0yZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTNkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA2cHggMTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggMThweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLThkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgNHB4IDIycHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwICA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwICA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0yNGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItbWF0ZXJpYWwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0LCBodG1sIHsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsOiB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi00ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsKSwgLnBhcGVyLW1hdGVyaWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjIiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjIiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMyJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMyJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjUiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjUiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewogICAgICAvKgogICAgICAgKiBZb3UgY2FuIHVzZSB0aGVzZSBnZW5lcmljIHZhcmlhYmxlcyBpbiB5b3VyIGVsZW1lbnRzIGZvciBlYXN5IHRoZW1pbmcuCiAgICAgICAqIEZvciBleGFtcGxlLCBpZiBhbGwgeW91ciBlbGVtZW50cyB1c2UgYC0tcHJpbWFyeS10ZXh0LWNvbG9yYCBhcyBpdHMgbWFpbgogICAgICAgKiBjb2xvciwgdGhlbiBzd2l0Y2hpbmcgZnJvbSBhIGxpZ2h0IHRvIGEgZGFyayB0aGVtZSBpcyBqdXN0IGEgbWF0dGVyIG9mCiAgICAgICAqIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGluIHlvdXIgYXBwbGljYXRpb24uCiAgICAgICAqLwogICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgLS1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtc2Vjb25kYXJ5LWNvbG9yKTsKICAgICAgLS1kaXNhYmxlZC10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcik7CiAgICAgIC0tZGl2aWRlci1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtZGl2aWRlci1jb2xvcik7CiAgICAgIC0tZXJyb3ItY29sb3I6IHZhcigtLXBhcGVyLWRlZXAtb3JhbmdlLWE3MDApOwoKICAgICAgLyoKICAgICAgICogUHJpbWFyeSBhbmQgYWNjZW50IGNvbG9ycy4gQWxzbyBzZWUgY29sb3IuaHRtbCBmb3IgbW9yZSBjb2xvcnMuCiAgICAgICAqLwogICAgICAtLXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby01MDApOwogICAgICAtLWxpZ2h0LXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby0xMDApOwogICAgICAtLWRhcmstcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTcwMCk7CgogICAgICAtLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMjAwKTsKICAgICAgLS1saWdodC1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTEwMCk7CiAgICAgIC0tZGFyay1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTQwMCk7CgoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIExpZ2h0IGJhY2tncm91bmQgdGhlbWUKICAgICAgICovCiAgICAgIC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1saWdodC10aGVtZS1iYXNlLWNvbG9yOiAjMDAwMDAwOwogICAgICAtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3I6ICM3MzczNzM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM5YjliOWI7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yOiAjZGJkYmRiOwoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIERhcmsgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1kYXJrLXRoZW1lLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1kYXJrLXRoZW1lLWJhc2UtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS10ZXh0LWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWRhcmstdGhlbWUtc2Vjb25kYXJ5LWNvbG9yOiAjYmNiY2JjOyAgLyogZm9yIHNlY29uZGFyeSB0ZXh0IGFuZCBpY29ucyAqLwogICAgICAtLWRhcmstdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM2NDY0NjQ7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1kYXJrLXRoZW1lLWRpdmlkZXItY29sb3I6ICMzYzNjM2M7CgogICAgICAvKgogICAgICAgKiBEZXByZWNhdGVkIHZhbHVlcyBiZWNhdXNlIG9mIHRoZWlyIGNvbmZ1c2luZyBuYW1lcy4KICAgICAgICovCiAgICAgIC0tdGV4dC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLWRlZmF1bHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWNoZWNrYm94Ij4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtc2l6ZSwgMThweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZWQgaW4gYGF0dGFjaGVkYC4gKi8KICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemU6IHZhcigtLXBhcGVyLWNoZWNrYm94LWluay1zaXplLCAtMXB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAjY2hlY2tib3hDb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBtYXJnaW46IHZhcigtLXBhcGVyLWNoZWNrYm94LW1hcmdpbiwgaW5pdGlhbCk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHZhcigtLXBhcGVyLWNoZWNrYm94LXZlcnRpY2FsLWFsaWduLCBtaWRkbGUpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1iYWNrZ3JvdW5kLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgIH0KCiAgICAgICNpbmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKCiAgICAgICAgLyogQ2VudGVyIHRoZSByaXBwbGUgaW4gdGhlIGNoZWNrYm94IGJ5IG5lZ2F0aXZlIG9mZnNldHRpbmcgaXQgYnkKICAgICAgICAgKiAoaW5rV2lkdGggLSByaXBwbGVXaWR0aCkgLyAyICovCiAgICAgICAgdG9wOiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgbGVmdDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNpbms6ZGlyKHJ0bCkgewogICAgICAgIHJpZ2h0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgbGVmdDogYXV0bzsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja2JveCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlcjogc29saWQgMnB4OwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAxNDBtcywgYm9yZGVyLWNvbG9yIDE0MG1zOwogICAgICB9CgogICAgICAvKiBjaGVja2JveCBjaGVja2VkIGFuaW1hdGlvbnMgKi8KICAgICAgI2NoZWNrYm94LmNoZWNrZWQgI2NoZWNrbWFyayB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgICAgYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAsIDApIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGNoZWNrbWFyay1leHBhbmQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjY2hlY2tib3guY2hlY2tlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjY2hlY2ttYXJrIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDM2JTsKICAgICAgICBoZWlnaHQ6IDcwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgICAgICBib3JkZXItYm90dG9tLXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrbWFyay1jb2xvciwgd2hpdGUpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiBwcm90ZWN0IGFnYWluc3QgcGFnZS1sZXZlbCBib3gtc2l6aW5nICovCiAgICAgIH0KCiAgICAgICNjaGVja21hcms6ZGlyKHJ0bCkgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlIDE0JTsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICB9CgogICAgICAvKiBsYWJlbCAqLwogICAgICAjY2hlY2tib3hMYWJlbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjY2hlY2tib3hMYWJlbCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNoZWNrZWQtY29sb3IsIHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZDsKICAgICAgfQoKICAgICAgI2NoZWNrYm94TGFiZWw6ZGlyKHJ0bCkgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAwOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI2NoZWNrYm94IHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3hMYWJlbCAgewogICAgICAgIG9wYWNpdHk6IDAuNjU7CiAgICAgIH0KCiAgICAgIC8qIGludmFsaWQgc3RhdGUgKi8KICAgICAgI2NoZWNrYm94LmludmFsaWQ6bm90KC5jaGVja2VkKSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1lcnJvci1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJjaGVja2JveENvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImNoZWNrYm94IiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja2JveENsYXNzKGNoZWNrZWQsIGludmFsaWQpXV0iPgogICAgICAgIDxkaXYgaWQ9ImNoZWNrbWFyayIgY2xhc3MkPSJbW19jb21wdXRlQ2hlY2ttYXJrQ2xhc3MoY2hlY2tlZCldXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iY2hlY2tib3hMYWJlbCI+PHNsb3Q+PC9zbG90PjwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tYTExeS1hbm5vdW5jZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgY2xpcDogcmVjdCgwcHgsMHB4LDBweCwwcHgpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBhcmlhLWxpdmUkPSJbW21vZGVdXSI+W1tfdGV4dF1dPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3QgaWQ9ImNvbnRlbnQiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC8qIFNoYXJlZCBTdHlsZXMgKi8KICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCAnTm90bycsIHNhbnMtc2VyaWY7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgJ0NvbnNvbGFzJywgJ01lbmxvJywgbW9ub3NwYWNlOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1leHBlbnNpdmUta2VybmluZzogewogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDogewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfTsKCiAgICAgIC8qIE1hdGVyaWFsIEZvbnQgU3R5bGVzICovCgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTQ6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxMTJweDsKICAgICAgICBmb250LXdlaWdodDogMzAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjA0NGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MzogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDU2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMjZlbTsKICAgICAgICBsaW5lLWhlaWdodDogNjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogNDVweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAzNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDFlbTsKICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1oZWFkbGluZTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxMmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LXRpdGxlOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LXN1YmhlYWQ6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1ib2R5MjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY2FwdGlvbjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMTFlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1tZW51OiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJ1dHRvbjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMThlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvZGUyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tY29kZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICB9CgogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3Bhbj5bW19jaGFyQ291bnRlclN0cl1dPC9zcGFuPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewogICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU6IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHRvIG1ha2UgYSBzdGFja2luZyBjb250ZXh0ICovCiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1lcnJvciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtZXJyb3I7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6MDsKICAgICAgICByaWdodDowOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9OwogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9InBhcGVyLWRyb3Bkb3duLW1lbnUiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiPjwvcGF0aD48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRyb3Bkb3duLW1lbnUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CgogICAgCiAgICA8c3BhbiByb2xlPSJidXR0b24iPjwvc3Bhbj4KICAgIDxwYXBlci1tZW51LWJ1dHRvbiBpZD0ibWVudUJ1dHRvbiIgdmVydGljYWwtYWxpZ249IltbdmVydGljYWxBbGlnbl1dIiBob3Jpem9udGFsLWFsaWduPSJbW2hvcml6b250YWxBbGlnbl1dIiBkeW5hbWljLWFsaWduPSJbW2R5bmFtaWNBbGlnbl1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbX2NvbXB1dGVNZW51VmVydGljYWxPZmZzZXQobm9MYWJlbEZsb2F0LCB2ZXJ0aWNhbE9mZnNldCldXSIgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgbm8tYW5pbWF0aW9ucz0iW1tub0FuaW1hdGlvbnNdXSIgb24taXJvbi1zZWxlY3Q9Il9vbklyb25TZWxlY3QiIG9uLWlyb24tZGVzZWxlY3Q9Il9vbklyb25EZXNlbGVjdCIgb3BlbmVkPSJ7e29wZW5lZH19IiBjbG9zZS1vbi1hY3RpdmF0ZSBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iPgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciI+CiAgICAgICAgPHBhcGVyLXJpcHBsZT48L3BhcGVyLXJpcHBsZT4KICAgICAgICAKICAgICAgICA8cGFwZXItaW5wdXQgdHlwZT0idGV4dCIgaW52YWxpZD0iW1tpbnZhbGlkXV0iIHJlYWRvbmx5IGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW3ZhbHVlXV0iIHBsYWNlaG9sZGVyPSJbW3BsYWNlaG9sZGVyXV0iIGVycm9yLW1lc3NhZ2U9IltbZXJyb3JNZXNzYWdlXV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1thbHdheXNGbG9hdExhYmVsXV0iIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBsYWJlbD0iW1tsYWJlbF1dIj4KICAgICAgICAgIAogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJwYXBlci1kcm9wZG93bi1tZW51OmFycm93LWRyb3AtZG93biIgc3VmZml4IHNsb3Q9InN1ZmZpeCI+PC9pcm9uLWljb24+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICAgIDxzbG90IGlkPSJjb250ZW50IiBuYW1lPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij48L3Nsb3Q+CiAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWxpc3Rib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1saXN0Ym94LWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1saXN0Ym94LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbGlzdGJveDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0LCAucGFwZXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tbWluLWhlaWdodCwgNDhweCk7CiAgICAgICAgcGFkZGluZzogMHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5wYXBlci1pdGVtIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgYm9yZGVyOm5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSksIC5wYXBlci1pdGVtW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tc2VsZWN0ZWQpLCAucGFwZXItaXRlbS5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBmb250LXdlaWdodDogdmFyKC0tcGFwZXItaXRlbS1zZWxlY3RlZC13ZWlnaHQsIGJvbGQpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLXNlbGVjdGVkOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSwgLnBhcGVyLWl0ZW1bZGlzYWJsZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1kaXNhYmxlZC1jb2xvciwgdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpLCAucGFwZXItaXRlbTpmb2N1cyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG91dGxpbmU6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZm9jdXNlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKTpiZWZvcmUsIC5wYXBlci1pdGVtOmZvY3VzOmJlZm9yZSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKCiAgICAgICAgYmFja2dyb3VuZDogY3VycmVudENvbG9yOwogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIG9wYWNpdHk6IHZhcigtLWRhcmstZGl2aWRlci1vcGFjaXR5KTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkLWJlZm9yZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYmFja2VuZCI+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtc3RvcmFnZSI+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwsCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0LmlubGluZSB7CiAgICAgICAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbCB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAubGF5b3V0Lm5vLXdyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5mbGV4IHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH0KCiAgICAgIC5mbGV4LWF1dG8gewogICAgICAgIC1tcy1mbGV4OiAxIDEgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICAuZmxleC1ub25lIHsKICAgICAgICAtbXMtZmxleDogbm9uZTsKICAgICAgICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1yZXZlcnNlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbC1yZXZlcnNlLAogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQud3JhcC1yZXZlcnNlIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1hbGlnbm1lbnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLyoqCiAgICAgICAqIEFsaWdubWVudCBpbiBjcm9zcyBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5iYXNlbGluZSB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFsaWdubWVudCBpbiBtYWluIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZW5kOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmFyb3VuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGRpc3RyaWJ1dGU7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZiBhbGlnbm1lbnQuCiAgICAgICAqLwogICAgICAuc2VsZi1zdGFydCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5zZWxmLWNlbnRlciB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5zZWxmLWVuZCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5zZWxmLXN0cmV0Y2ggewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9CgogICAgICAuc2VsZi1iYXNlbGluZSB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBtdWx0aS1saW5lIGFsaWdubWVudCBpbiBtYWluIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0LWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogc3RhcnQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZW5kOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGNlbnRlcjsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5iZXR3ZWVuLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazoganVzdGlmeTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBkaXN0cmlidXRlOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iZGFzaGJvYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0iaXJvbi1mbGV4Ij48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7CiAgICAgICAgLS1zaWRlYmFyLWxlZnQtcGFkZGluZzogMzBweDsKICAgICAgfQoKICAgICAgW3Nsb3Q9J3NpZGViYXInXSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogNXB4IDA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC5zZXR0aW5ncyB7CiAgICAgICAgbWluLWhlaWdodDogNTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgIH0KCiAgICAgIHRmLXJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBsZWZ0OiB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSAqIDIpOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuc2VhcmNoLWlucHV0IHsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiB7CiAgICAgICAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1kYXNoYm9hcmQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgPHNsb3QgbmFtZT0ic2lkZWJhciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iY2VudGVyIj4KICAgICAgPHNsb3QgbmFtZT0iY2VudGVyIiBjbGFzcz0ic2NvbGxiYXIiPjwvc2xvdD4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzaWRlYmFyIHsKICAgICAgICBmbGV4OiAwIDAgdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzLCAyNSUpOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1tYXgtd2lkdGgsIDM1MHB4KTsKICAgICAgICBtaW4td2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGgsIDI3MHB4KTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAjY2VudGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbc2xvdD0nY2VudGVyJ10pIHsKICAgICAgICBjb250YWluOiBzdHJpY3Q7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIC50Zi1ncmFwaC1kYXNoYm9hcmQgI2NlbnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLW9wdGlvbi1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0id3JhcCI+CiAgICAgIDxoMz5bW25hbWVdXTwvaDM+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlciI+PHNsb3Q+PC9zbG90PjwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKC5zZWxlY3RlZCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgaDMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1jb2xsYXBzZSI+CgogIDx0ZW1wbGF0ZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICAvKiBTYWZhcmkgMTAgbmVlZHMgdGhpcyBwcm9wZXJ0eSBwcmVmaXhlZCB0byBjb3JyZWN0bHkgYXBwbHkgdGhlIGN1c3RvbSBwcm9wZXJ0eSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0taXJvbi1jb2xsYXBzZS10cmFuc2l0aW9uLWR1cmF0aW9uLCAzMDBtcyk7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLWNvbGxhcHNlLWNsb3NlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tY29sbGFwc2Utb3BlbmVkKSkgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wYW5lUmVuZGVyZWRdXSIgaWQ9ImlmUmVuZGVyZWQiPgogICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIiBvbi10YXA9Il90b2dnbGVQYW5lIiBvcGVuLWJ1dHRvbiQ9Iltbb3BlbmVkXV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3Bhbj5UYWdzIG1hdGNoaW5nIG11bHRpcGxlIGV4cGVyaW1lbnRzPC9zcGFuPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiZuYnNwOzxzdHJvbmc+KG1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24pPC9zdHJvbmc+PC9zcGFuPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPlRhZ3MgbWF0Y2hpbmcgLzwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktbmFtZSIgdGl0bGUkPSJbW2NhdGVnb3J5Lm5hbWVdXSI+W1tjYXRlZ29yeS5uYW1lXV08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij4vPC9zcGFuPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNVbml2ZXJzYWxTZWFyY2hRdWVyeV1dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiAoYWxsIHRhZ3MpPC9zcGFuPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IDxzdHJvbmc+KG1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24pPC9zdHJvbmc+PC9zcGFuPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktbmFtZSIgdGl0bGUkPSJbW2NhdGVnb3J5Lm5hbWVdXSI+W1tjYXRlZ29yeS5uYW1lXV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY291bnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZV1dIj4KICAgICAgICAgICAgPHNwYW4+W1tfY291bnRdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImV4cGFuZC1tb3JlIiBjbGFzcz0iZXhwYW5kLWFycm93Ij48L2lyb24taWNvbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvYnV0dG9uPgogICAgICAKICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW29wZW5lZF1dIiBuby1hbmltYXRpb24+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICA8c3BhbiBpZD0idG9wLW9mLWNvbnRhaW5lciI+PC9zcGFuPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDxkaXYgaWQ9Iml0ZW1zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbnRyb2xzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAwIDVweCI+CiAgICAgICAgICAgICAgICBQYWdlCiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgaWQ9InBhZ2UtaW5wdXQiIHR5cGU9Im51bWJlciIgbm8tbGFiZWwtZmxvYXQgbWluPSIxIiBtYXg9IltbX3BhZ2VDb3VudF1dIiB2YWx1ZT0iW1tfcGFnZUlucHV0VmFsdWVdXSIgb24taW5wdXQ9Il9oYW5kbGVQYWdlSW5wdXRFdmVudCIgb24tY2hhbmdlPSJfaGFuZGxlUGFnZUNoYW5nZUV2ZW50IiBvbi1mb2N1cz0iX2hhbmRsZVBhZ2VGb2N1c0V2ZW50IiBvbi1ibHVyPSJfaGFuZGxlUGFnZUJsdXJFdmVudCI+PC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgIG9mIFtbX3BhZ2VDb3VudF1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1QcmV2aW91c1BhZ2UiIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIj5QcmV2aW91cyBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDAgNXB4IDFweCAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6Zmlyc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpsYXN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICB9CgogICAgICAuaGVhZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmhlYWRpbmc6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gLmV4cGFuZC1hcnJvdyB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVaKDE4MGRlZyk7CiAgICAgIH0KCiAgICAgIC5uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgIC5jYXRlZ29yeS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgcGFkZGluZzogMnB4IDA7CiAgICAgIH0KCiAgICAgIC5jb3VudCB7CiAgICAgICAgbWFyZ2luOiAwIDVweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWRpbmc6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZWRlZGU7CiAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAjY29udHJvbHMtY29udGFpbmVyIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjY29udHJvbHMtY29udGFpbmVyIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgcGFwZXItYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsZXgtYmFzaXM6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgcGFwZXItYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgfQoKICAgICAgc2xvdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdpdGVtcyddKSB7CiAgICAgICAgLyogVG9vbHRpcCBmb3IgZGVzY3JpcHRpb25zIGFuZCBvdGhlcnMgYnJlYWsgd2l0aCBtb3JlIHN0cmljdCBvbmVzLiAqLwogICAgICAgIGNvbnRhaW46IHN0eWxlOwogICAgICB9CgogICAgICAjcGFnZS1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoLCAxMDAlKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDI0cHggNDBweDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItZGlhbG9nLWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLm5vLXBhZGRpbmcpIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3MKICAgICAgdG8gc2VsZWN0IGRpcmVjdCBjaGlsZHJlbiBvbmx5LCB3aGljaCBpbmNyZWFzZXMgdGhlIHdlaWdodCBvZiB0aGlzCiAgICAgIHNlbGVjdG9yLCBzbyB3ZSBoYXZlIHRvIHJlLWRlZmluZSBmaXJzdC1jaGlsZC9sYXN0LWNoaWxkIG1hcmdpbnMgYmVsb3cuICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC10aXRsZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIC8qIEFwcGx5IG1peGluIGFnYWluLCBpbiBjYXNlIGl0IHNldHMgbWFyZ2luLXRvcC4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tYm90dG9tLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5wYXBlci1kaWFsb2ctYnV0dG9ucyksCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweCA4cHggOHB4IDI0cHg7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZGlhbG9nLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZW5kLWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+PGlyb24taWNvbnNldC1zdmcgbmFtZT0iaWNvbnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9IjNkLXJvdGF0aW9uIj48cGF0aCBkPSJNNy41MiAyMS40OEM0LjI1IDE5Ljk0IDEuOTEgMTYuNzYgMS41NSAxM0guMDVDLjU2IDE5LjE2IDUuNzEgMjQgMTIgMjRsLjY2LS4wMy0zLjgxLTMuODEtMS4zMyAxLjMyem0uODktNi41MmMtLjE5IDAtLjM3LS4wMy0uNTItLjA4LS4xNi0uMDYtLjI5LS4xMy0uNC0uMjQtLjExLS4xLS4yLS4yMi0uMjYtLjM3LS4wNi0uMTQtLjA5LS4zLS4wOS0uNDdoLTEuM2MwIC4zNi4wNy42OC4yMS45NS4xNC4yNy4zMy41LjU2LjY5LjI0LjE4LjUxLjMyLjgyLjQxLjMuMS42Mi4xNS45Ni4xNS4zNyAwIC43Mi0uMDUgMS4wMy0uMTUuMzItLjEuNi0uMjUuODMtLjQ0cy40Mi0uNDMuNTUtLjcyYy4xMy0uMjkuMi0uNjEuMi0uOTcgMC0uMTktLjAyLS4zOC0uMDctLjU2LS4wNS0uMTgtLjEyLS4zNS0uMjMtLjUxLS4xLS4xNi0uMjQtLjMtLjQtLjQzLS4xNy0uMTMtLjM3LS4yMy0uNjEtLjMxLjItLjA5LjM3LS4yLjUyLS4zMy4xNS0uMTMuMjctLjI3LjM3LS40Mi4xLS4xNS4xNy0uMy4yMi0uNDYuMDUtLjE2LjA3LS4zMi4wNy0uNDggMC0uMzYtLjA2LS42OC0uMTgtLjk2LS4xMi0uMjgtLjI5LS41MS0uNTEtLjY5LS4yLS4xOS0uNDctLjMzLS43Ny0uNDNDOS4xIDguMDUgOC43NiA4IDguMzkgOGMtLjM2IDAtLjY5LjA1LTEgLjE2LS4zLjExLS41Ny4yNi0uNzkuNDUtLjIxLjE5LS4zOC40MS0uNTEuNjctLjEyLjI2LS4xOC41NC0uMTguODVoMS4zYzAtLjE3LjAzLS4zMi4wOS0uNDVzLjE0LS4yNS4yNS0uMzRjLjExLS4wOS4yMy0uMTcuMzgtLjIyLjE1LS4wNS4zLS4wOC40OC0uMDguNCAwIC43LjEuODkuMzEuMTkuMi4yOS40OS4yOS44NiAwIC4xOC0uMDMuMzQtLjA4LjQ5LS4wNS4xNS0uMTQuMjctLjI1LjM3LS4xMS4xLS4yNS4xOC0uNDEuMjQtLjE2LjA2LS4zNi4wOS0uNTguMDlINy41djEuMDNoLjc3Yy4yMiAwIC40Mi4wMi42LjA3cy4zMy4xMy40NS4yM2MuMTIuMTEuMjIuMjQuMjkuNC4wNy4xNi4xLjM1LjEuNTcgMCAuNDEtLjEyLjcyLS4zNS45My0uMjMuMjMtLjU1LjMzLS45NS4zM3ptOC41NS01LjkyYy0uMzItLjMzLS43LS41OS0xLjE0LS43Ny0uNDMtLjE4LS45Mi0uMjctMS40Ni0uMjdIMTJ2OGgyLjNjLjU1IDAgMS4wNi0uMDkgMS41MS0uMjcuNDUtLjE4Ljg0LS40MyAxLjE2LS43Ni4zMi0uMzMuNTctLjczLjc0LTEuMTkuMTctLjQ3LjI2LS45OS4yNi0xLjU3di0uNGMwLS41OC0uMDktMS4xLS4yNi0xLjU3LS4xOC0uNDctLjQzLS44Ny0uNzUtMS4yem0tLjM5IDMuMTZjMCAuNDItLjA1Ljc5LS4xNCAxLjEzLS4xLjMzLS4yNC42Mi0uNDMuODUtLjE5LjIzLS40My40MS0uNzEuNTMtLjI5LjEyLS42Mi4xOC0uOTkuMThoLS45MVY5LjEyaC45N2MuNzIgMCAxLjI3LjIzIDEuNjQuNjkuMzguNDYuNTcgMS4xMi41NyAxLjk5di40ek0xMiAwbC0uNjYuMDMgMy44MSAzLjgxIDEuMzMtMS4zM2MzLjI3IDEuNTUgNS42MSA0LjcyIDUuOTYgOC40OGgxLjVDMjMuNDQgNC44NCAxOC4yOSAwIDEyIDB6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiAyYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptOSA3aC02djEzaC0ydi02aC0ydjZIOVY5SDNWN2gxOHYyeiIgLz48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiIC8+PHBhdGggZD0iTTE5IDEzdi0yYy0xLjU0LjAyLTMuMDktLjc1LTQuMDctMS44M2wtMS4yOS0xLjQzYy0uMTctLjE5LS4zOC0uMzQtLjYxLS40NS0uMDEgMC0uMDEtLjAxLS4wMi0uMDFIMTNjLS4zNS0uMi0uNzUtLjMtMS4xOS0uMjZDMTAuNzYgNy4xMSAxMCA4LjA0IDEwIDkuMDlWMTVjMCAxLjEuOSAyIDIgMmg1djVoMnYtNS41YzAtMS4xLS45LTItMi0yaC0zdi0zLjQ1YzEuMjkgMS4wNyAzLjI1IDEuOTQgNSAxLjk1em0tNi4xNyA1Yy0uNDEgMS4xNi0xLjUyIDItMi44MyAyLTEuNjYgMC0zLTEuMzQtMy0zIDAtMS4zMS44NC0yLjQxIDItMi44M1YxMi4xYy0yLjI4LjQ2LTQgMi40OC00IDQuOSAwIDIuNzYgMi4yNCA1IDUgNSAyLjQyIDAgNC40NC0xLjcyIDQuOS00aC0yLjA3eiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZS13YWxsZXQiPjxwYXRoIGQ9Ik0yMSAxOHYxYzAgMS4xLS45IDItMiAySDVjLTEuMTEgMC0yLS45LTItMlY1YzAtMS4xLjg5LTIgMi0yaDE0YzEuMSAwIDIgLjkgMiAydjFoLTljLTEuMTEgMC0yIC45LTIgMnY4YzAgMS4xLjg5IDIgMiAyaDl6bS05LTJoMTBWOEgxMnY4em00LTIuNWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYm94Ij48cGF0aCBkPSJNMyA1djE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJINWMtMS4xMSAwLTIgLjktMiAyem0xMiA0YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3ptLTkgOGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MUg2di0xeiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiIC8+PC9nPgo8ZyBpZD0iYWRkIj48cGF0aCBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiIgLz48L2c+CjxnIGlkPSJhZGQtYWxlcnQiPjxwYXRoIGQ9Ik0xMC4wMSAyMS4wMWMwIDEuMS44OSAxLjk5IDEuOTkgMS45OXMxLjk5LS44OSAxLjk5LTEuOTloLTMuOTh6bTguODctNC4xOVYxMWMwLTMuMjUtMi4yNS01Ljk3LTUuMjktNi42OXYtLjcyQzEzLjU5IDIuNzEgMTIuODggMiAxMiAycy0xLjU5LjcxLTEuNTkgMS41OXYuNzJDNy4zNyA1LjAzIDUuMTIgNy43NSA1LjEyIDExdjUuODJMMyAxOC45NFYyMGgxOHYtMS4wNmwtMi4xMi0yLjEyek0xNiAxMy4wMWgtM3YzaC0ydi0zSDhWMTFoM1Y4aDJ2M2gzdjIuMDF6IiAvPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNMTMgN2gtMnY0SDd2Mmg0djRoMnYtNGg0di0yaC00Vjd6bS0xLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiIgLz48L2c+CjxnIGlkPSJhbGFybSI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyLjUgOEgxMXY2bDQuNzUgMi44NS43NS0xLjIzLTQtMi4zN1Y4ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tYWRkIj48cGF0aCBkPSJNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bTEtMTFoLTJ2M0g4djJoM3YzaDJ2LTNoM3YtMmgtM1Y5eiIgLz48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tb24iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTEuNDYtNS40N0w4LjQxIDEyLjRsLTEuMDYgMS4wNiAzLjE4IDMuMTggNi02LTEuMDYtMS4wNi00LjkzIDQuOTV6IiAvPjwvZz4KPGcgaWQ9ImFsbC1vdXQiPjxwYXRoIGQ9Ik0xNi4yMSA0LjE2bDQgNHYtNHptNCAxMmwtNCA0aDR6bS0xMiA0bC00LTR2NHptLTQtMTJsNC00aC00em0xMi45NS0uOTVjLTIuNzMtMi43My03LjE3LTIuNzMtOS45IDBzLTIuNzMgNy4xNyAwIDkuOSA3LjE3IDIuNzMgOS45IDAgMi43My03LjE2IDAtOS45em0tMS4xIDguOGMtMi4xMyAyLjEzLTUuNTcgMi4xMy03LjcgMHMtMi4xMy01LjU3IDAtNy43IDUuNTctMi4xMyA3LjcgMCAyLjEzIDUuNTcgMCA3Ljd6IiAvPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6IiAvPjwvZz4KPGcgaWQ9ImFubm91bmNlbWVudCI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyA5aC0yVjVoMnY2em0wIDRoLTJ2LTJoMnYyeiIgLz48L2c+CjxnIGlkPSJhcHBzIj48cGF0aCBkPSJNNCA4aDRWNEg0djR6bTYgMTJoNHYtNGgtNHY0em0tNiAwaDR2LTRINHY0em0wLTZoNHYtNEg0djR6bTYgMGg0di00aC00djR6bTYtMTB2NGg0VjRoLTR6bS02IDRoNFY0aC00djR6bTYgNmg0di00aC00djR6bTAgNmg0di00aC00djR6IiAvPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctYmFjayI+PHBhdGggZD0iTTIwIDExSDcuODNsNS41OS01LjU5TDEyIDRsLTggOCA4IDggMS40MS0xLjQxTDcuODMgMTNIMjB2LTJ6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRvd253YXJkIj48cGF0aCBkPSJNMjAgMTJsLTEuNDEtMS40MUwxMyAxNi4xN1Y0aC0ydjEyLjE3bC01LjU4LTUuNTlMNCAxMmw4IDggOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93bi1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDEybC00LTRoOGwtNCA0eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLXVwIj48cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctdXB3YXJkIj48cGF0aCBkPSJNNCAxMmwxLjQxIDEuNDFMMTEgNy44M1YyMGgyVjcuODNsNS41OCA1LjU5TDIwIDEybC04LTgtOCA4eiIgLz48L2c+CjxnIGlkPSJhc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xOSAxMmgtMnYzaC0zdjJoNXYtNXpNNyA5aDNWN0g1djVoMlY5em0xNC02SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yIDE0SDd2LTJoN3Yyem0zLTRIN3YtMmgxMHYyem0wLTRIN1Y3aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtaW5kIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgNGMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMS40YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMVYxOXoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem00IDEyaC00djNsLTUtNSA1LTV2M2g0djR6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuZWQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCAxNWwtNS01aDNWOWg0djRoM2wtNSA1eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJhdHRhY2htZW50Ij48cGF0aCBkPSJNMiAxMi41QzIgOS40NiA0LjQ2IDcgNy41IDdIMThjMi4yMSAwIDQgMS43OSA0IDRzLTEuNzkgNC00IDRIOS41QzguMTIgMTUgNyAxMy44OCA3IDEyLjVTOC4xMiAxMCA5LjUgMTBIMTd2Mkg5LjQxYy0uNTUgMC0uNTUgMSAwIDFIMThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0ySDcuNUM1LjU3IDkgNCAxMC41NyA0IDEyLjVTNS41NyAxNiA3LjUgMTZIMTd2Mkg3LjVDNC40NiAxOCAyIDE1LjU0IDIgMTIuNXoiIC8+PC9nPgo8ZyBpZD0iYXV0b3JlbmV3Ij48cGF0aCBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiIgLz48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJiYWNrdXAiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiIgLz48L2c+CjxnIGlkPSJibG9jayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTQgMTJjMC00LjQyIDMuNTgtOCA4LTggMS44NSAwIDMuNTUuNjMgNC45IDEuNjlMNS42OSAxNi45QzQuNjMgMTUuNTUgNCAxMy44NSA0IDEyem04IDhjLTEuODUgMC0zLjU1LS42My00LjktMS42OUwxOC4zMSA3LjFDMTkuMzcgOC40NSAyMCAxMC4xNSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmsiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImJvb2ttYXJrLWJvcmRlciI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiIC8+PC9nPgo8ZyBpZD0iYnVpbGQiPjxwYXRoIGQ9Ik0yMi43IDE5bC05LjEtOS4xYy45LTIuMy40LTUtMS41LTYuOS0yLTItNS0yLjQtNy40LTEuM0w5IDYgNiA5IDEuNiA0LjdDLjQgNy4xLjkgMTAuMSAyLjkgMTIuMWMxLjkgMS45IDQuNiAyLjQgNi45IDEuNWw5LjEgOS4xYy40LjQgMSAuNCAxLjQgMGwyLjMtMi4zYy41LS40LjUtMS4xLjEtMS40eiIgLz48L2c+CjxnIGlkPSJjYWNoZWQiPjxwYXRoIGQ9Ik0xOSA4bC00IDRoM2MwIDMuMzEtMi42OSA2LTYgNi0xLjAxIDAtMS45Ny0uMjUtMi44LS43bC0xLjQ2IDEuNDZDOC45NyAxOS41NCAxMC40MyAyMCAxMiAyMGM0LjQyIDAgOC0zLjU4IDgtOGgzbC00LTR6TTYgMTJjMC0zLjMxIDIuNjktNiA2LTYgMS4wMSAwIDEuOTcuMjUgMi44LjdsMS40Ni0xLjQ2QzE1LjAzIDQuNDYgMTMuNTcgNCAxMiA0Yy00LjQyIDAtOCAzLjU4LTggOEgxbDQgNCA0LTRINnoiIC8+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiIgLz48L2c+CjxnIGlkPSJjYW5jZWwiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem01IDEzLjU5TDE1LjU5IDE3IDEyIDEzLjQxIDguNDEgMTcgNyAxNS41OSAxMC41OSAxMiA3IDguNDEgOC40MSA3IDEyIDEwLjU5IDE1LjU5IDcgMTcgOC40MSAxMy40MSAxMiAxNyAxNS41OXoiIC8+PC9nPgo8ZyBpZD0iY2FyZC1naWZ0Y2FyZCI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtdHJhdmVsIj48cGF0aCBkPSJNMjAgNmgtM1Y0YzAtMS4xMS0uODktMi0yLTJIOWMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yek05IDRoNnYySDlWNHptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDN2MmgyVjhoNnYyaDJWOGgzdjZ6IiAvPjwvZz4KPGcgaWQ9ImNoYW5nZS1oaXN0b3J5Ij48cGF0aCBkPSJNMTIgNy43N0wxOC4zOSAxOEg1LjYxTDEyIDcuNzdNMTIgNEwyIDIwaDIwTDEyIDR6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTkgMTRsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94LW91dGxpbmUtYmxhbmsiPjxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiIgLz48L2c+CjxnIGlkPSJjbGFzcyI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iY2xlYXIiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIgLz48L2c+CjxnIGlkPSJjbG91ZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNC41IDE0SDhjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTNsLjE0LjAxQzguNTggOC4yOCAxMC4xMyA3IDEyIDdjMi4yMSAwIDQgMS43OSA0IDRoLjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjVTMTcuODggMTYgMTYuNSAxNnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb3dubG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTcgMTNsLTUgNS01LTVoM1Y5aDR2NGgzeiIgLz48L2c+CjxnIGlkPSJjbG91ZC1vZmYiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNGMtMS40OCAwLTIuODUuNDMtNC4wMSAxLjE3bDEuNDYgMS40NkMxMC4yMSA2LjIzIDExLjA4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgMyAwIDEuMTMtLjY0IDIuMTEtMS41NiAyLjYybDEuNDUgMS40NUMyMy4xNiAxOC4xNiAyNCAxNi42OCAyNCAxNWMwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMyA1LjI3bDIuNzUgMi43NEMyLjU2IDguMTUgMCAxMC43NyAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDExLjczbDIgMkwyMSAyMC43MyA0LjI3IDQgMyA1LjI3ek03LjczIDEwbDggOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aDEuNzN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXVwbG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImNvZGUiPjxwYXRoIGQ9Ik05LjQgMTYuNkw0LjggMTJsNC42LTQuNkw4IDZsLTYgNiA2IDYgMS40LTEuNHptNS4yIDBsNC42LTQuNi00LjYtNC42TDE2IDZsNiA2LTYgNi0xLjQtMS40eiIgLz48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY29weSI+PHBhdGggZD0iTTE2IDFINGMtMS4xIDAtMiAuOS0yIDJ2MTRoMlYzaDEyVjF6bTMgNEg4Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDExYzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTZIOFY3aDExdjE0eiIgLz48L2c+CjxnIGlkPSJjb250ZW50LWN1dCI+PHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiIC8+PC9nPgo8ZyBpZD0iY29weXJpZ2h0Ij48cGF0aCBkPSJNMTAuMDggMTAuODZjLjA1LS4zMy4xNi0uNjIuMy0uODdzLjM0LS40Ni41OS0uNjJjLjI0LS4xNS41NC0uMjIuOTEtLjIzLjIzLjAxLjQ0LjA1LjYzLjEzLjIuMDkuMzguMjEuNTIuMzZzLjI1LjMzLjM0LjUzLjEzLjQyLjE0LjY0aDEuNzljLS4wMi0uNDctLjExLS45LS4yOC0xLjI5cy0uNC0uNzMtLjctMS4wMS0uNjYtLjUtMS4wOC0uNjYtLjg4LS4yMy0xLjM5LS4yM2MtLjY1IDAtMS4yMi4xMS0xLjcuMzRzLS44OC41My0xLjIuOTItLjU2Ljg0LS43MSAxLjM2UzggMTEuMjkgOCAxMS44N3YuMjdjMCAuNTguMDggMS4xMi4yMyAxLjY0cy4zOS45Ny43MSAxLjM1LjcyLjY5IDEuMi45MSAxLjA1LjM0IDEuNy4zNGMuNDcgMCAuOTEtLjA4IDEuMzItLjIzcy43Ny0uMzYgMS4wOC0uNjMuNTYtLjU4Ljc0LS45NC4yOS0uNzQuMy0xLjE1aC0xLjc5Yy0uMDEuMjEtLjA2LjQtLjE1LjU4cy0uMjEuMzMtLjM2LjQ2LS4zMi4yMy0uNTIuM2MtLjE5LjA3LS4zOS4wOS0uNi4xLS4zNi0uMDEtLjY2LS4wOC0uODktLjIzLS4yNS0uMTYtLjQ1LS4zNy0uNTktLjYycy0uMjUtLjU1LS4zLS44OC0uMDgtLjY3LS4wOC0xdi0uMjdjMC0uMzUuMDMtLjY4LjA4LTEuMDF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJjcmVhdGUiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiIgLz48L2c+CjxnIGlkPSJjcmVkaXQtY2FyZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0iZGFzaGJvYXJkIj48cGF0aCBkPSJNMyAxM2g4VjNIM3YxMHptMCA4aDh2LTZIM3Y2em0xMCAwaDhWMTFoLTh2MTB6bTAtMTh2Nmg4VjNoLTh6IiAvPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtZm9yZXZlciI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6IiAvPjwvZz4KPGcgaWQ9ImRlc2NyaXB0aW9uIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iZG5zIj48cGF0aCBkPSJNMjAgMTNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXpNNyAxOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTIwIDNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xek03IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz48L2c+CjxnIGlkPSJkb25lLWFsbCI+PHBhdGggZD0iTTE4IDdsLTEuNDEtMS40MS02LjM0IDYuMzQgMS40MSAxLjQxTDE4IDd6bTQuMjQtMS40MUwxMS42NiAxNi4xNyA3LjQ4IDEybC0xLjQxIDEuNDFMMTEuNjYgMTlsMTItMTItMS40Mi0xLjQxek0uNDEgMTMuNDFMNiAxOWwxLjQxLTEuNDFMMS44MyAxMiAuNDEgMTMuNDF6IiAvPjwvZz4KPGcgaWQ9ImRvbnV0LWxhcmdlIj48cGF0aCBkPSJNMTEgNS4wOFYyYy01IC41LTkgNC44MS05IDEwczQgOS41IDkgMTB2LTMuMDhjLTMtLjQ4LTYtMy40LTYtNi45MnMzLTYuNDQgNi02Ljkyek0xOC45NyAxMUgyMmMtLjQ3LTUtNC04LjUzLTktOXYzLjA4QzE2IDUuNTEgMTguNTQgOCAxOC45NyAxMXpNMTMgMTguOTJWMjJjNS0uNDcgOC41My00IDktOWgtMy4wM2MtLjQzIDMtMi45NyA1LjQ5LTUuOTcgNS45MnoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6IiAvPjwvZz4KPGcgaWQ9ImRyYWZ0cyI+PHBhdGggZD0iTTIxLjk5IDhjMC0uNzItLjM3LTEuMzUtLjk0LTEuN0wxMiAxIDIuOTUgNi4zQzIuMzggNi42NSAyIDcuMjggMiA4djEwYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJsLS4wMS0xMHpNMTIgMTNMMy43NCA3Ljg0IDEyIDNsOC4yNiA0Ljg0TDEyIDEzeiIgLz48L2c+CjxnIGlkPSJlamVjdCI+PHBhdGggZD0iTTUgMTdoMTR2Mkg1em03LTEyTDUuMzMgMTVoMTMuMzR6IiAvPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiIC8+PC9nPgo8ZyBpZD0iZXJyb3Itb3V0bGluZSI+PHBhdGggZD0iTTExIDE1aDJ2MmgtMnptMC04aDJ2NmgtMnptLjk5LTVDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iZXVyby1zeW1ib2wiPjxwYXRoIGQ9Ik0xNSAxOC41Yy0yLjUxIDAtNC42OC0xLjQyLTUuNzYtMy41SDE1di0ySDguNThjLS4wNS0uMzMtLjA4LS42Ni0uMDgtMXMuMDMtLjY3LjA4LTFIMTVWOUg5LjI0QzEwLjMyIDYuOTIgMTIuNSA1LjUgMTUgNS41YzEuNjEgMCAzLjA5LjU5IDQuMjMgMS41N0wyMSA1LjNDMTkuNDEgMy44NyAxNy4zIDMgMTUgM2MtMy45MiAwLTcuMjQgMi41MS04LjQ4IDZIM3YyaDMuMDZjLS4wNC4zMy0uMDYuNjYtLjA2IDEgMCAuMzQuMDIuNjcuMDYgMUgzdjJoMy41MmMxLjI0IDMuNDkgNC41NiA2IDguNDggNiAyLjMxIDAgNC40MS0uODcgNi0yLjNsLTEuNzgtMS43N2MtMS4xMy45OC0yLjYgMS41Ny00LjIyIDEuNTd6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50LXNlYXQiPjxwYXRoIGQ9Ik00IDE4djNoM3YtM2gxMHYzaDN2LTZINHptMTUtOGgzdjNoLTN6TTIgMTBoM3YzSDJ6bTE1IDNIN1Y1YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnY4eiIgLz48L2c+CjxnIGlkPSJleGl0LXRvLWFwcCI+PHBhdGggZD0iTTEwLjA5IDE1LjU5TDExLjUgMTdsNS01LTUtNS0xLjQxIDEuNDFMMTIuNjcgMTFIM3YyaDkuNjdsLTIuNTggMi41OXpNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2NGgyVjVoMTR2MTRINXYtNEgzdjRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLW1vcmUiPjxwYXRoIGQ9Ik0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9ImV4cGxvcmUiPjxwYXRoIGQ9Ik0xMiAxMC45Yy0uNjEgMC0xLjEuNDktMS4xIDEuMXMuNDkgMS4xIDEuMSAxLjFjLjYxIDAgMS4xLS40OSAxLjEtMS4xcy0uNDktMS4xLTEuMS0xLjF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTIuMTkgMTIuMTlMNiAxOGwzLjgxLTguMTlMMTggNmwtMy44MSA4LjE5eiIgLz48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiIC8+PC9nPgo8ZyBpZD0iZmFjZSI+PHBhdGggZD0iTTkgMTEuNzVjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1em02IDBjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOCAwLS4yOS4wMi0uNTguMDUtLjg2IDIuMzYtMS4wNSA0LjIzLTIuOTggNS4yMS01LjM3QzExLjA3IDguMzMgMTQuMDUgMTAgMTcuNDIgMTBjLjc4IDAgMS41My0uMDkgMi4yNS0uMjYuMjEuNzEuMzMgMS40Ny4zMyAyLjI2IDAgNC40MS0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJmYXZvcml0ZSI+PHBhdGggZD0iTTEyIDIxLjM1bC0xLjQ1LTEuMzJDNS40IDE1LjM2IDIgMTIuMjggMiA4LjUgMiA1LjQyIDQuNDIgMyA3LjUgM2MxLjc0IDAgMy40MS44MSA0LjUgMi4wOUMxMy4wOSAzLjgxIDE0Ljc2IDMgMTYuNSAzIDE5LjU4IDMgMjIgNS40MiAyMiA4LjVjMCAzLjc4LTMuNCA2Ljg2LTguNTUgMTEuNTRMMTIgMjEuMzV6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiIgLz48L2c+CjxnIGlkPSJmZWVkYmFjayI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAxMmgtMnYtMmgydjJ6bTAtNGgtMlY2aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iZmlsZS1kb3dubG9hZCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsdGVyLWxpc3QiPjxwYXRoIGQ9Ik0xMCAxOGg0di0yaC00djJ6TTMgNnYyaDE4VjZIM3ptMyA3aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0iZmluZC1pbi1wYWdlIj48cGF0aCBkPSJNMjAgMTkuNTlWOGwtNi02SDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMuNDUgMCAuODUtLjE1IDEuMTktLjRsLTQuNDMtNC40M2MtLjguNTItMS43NC44My0yLjc2LjgzLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNWMwIDEuMDItLjMxIDEuOTYtLjgzIDIuNzVMMjAgMTkuNTl6TTkgMTNjMCAxLjY2IDEuMzQgMyAzIDNzMy0xLjM0IDMtMy0xLjM0LTMtMy0zLTMgMS4zNC0zIDN6IiAvPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiIgLz48L2c+CjxnIGlkPSJmaW5nZXJwcmludCI+PHBhdGggZD0iTTE3LjgxIDQuNDdjLS4wOCAwLS4xNi0uMDItLjIzLS4wNkMxNS42NiAzLjQyIDE0IDMgMTIuMDEgM2MtMS45OCAwLTMuODYuNDctNS41NyAxLjQxLS4yNC4xMy0uNTQuMDQtLjY4LS4yLS4xMy0uMjQtLjA0LS41NS4yLS42OEM3LjgyIDIuNTIgOS44NiAyIDEyLjAxIDJjMi4xMyAwIDMuOTkuNDcgNi4wMyAxLjUyLjI1LjEzLjM0LjQzLjIxLjY3LS4wOS4xOC0uMjYuMjgtLjQ0LjI4ek0zLjUgOS43MmMtLjEgMC0uMi0uMDMtLjI5LS4wOS0uMjMtLjE2LS4yOC0uNDctLjEyLS43Ljk5LTEuNCAyLjI1LTIuNSAzLjc1LTMuMjdDOS45OCA0LjA0IDE0IDQuMDMgMTcuMTUgNS42NWMxLjUuNzcgMi43NiAxLjg2IDMuNzUgMy4yNS4xNi4yMi4xMS41NC0uMTIuNy0uMjMuMTYtLjU0LjExLS43LS4xMi0uOS0xLjI2LTIuMDQtMi4yNS0zLjM5LTIuOTQtMi44Ny0xLjQ3LTYuNTQtMS40Ny05LjQuMDEtMS4zNi43LTIuNSAxLjctMy40IDIuOTYtLjA4LjE0LS4yMy4yMS0uMzkuMjF6bTYuMjUgMTIuMDdjLS4xMyAwLS4yNi0uMDUtLjM1LS4xNS0uODctLjg3LTEuMzQtMS40My0yLjAxLTIuNjQtLjY5LTEuMjMtMS4wNS0yLjczLTEuMDUtNC4zNCAwLTIuOTcgMi41NC01LjM5IDUuNjYtNS4zOXM1LjY2IDIuNDIgNS42NiA1LjM5YzAgLjI4LS4yMi41LS41LjVzLS41LS4yMi0uNS0uNWMwLTIuNDItMi4wOS00LjM5LTQuNjYtNC4zOS0yLjU3IDAtNC42NiAxLjk3LTQuNjYgNC4zOSAwIDEuNDQuMzIgMi43Ny45MyAzLjg1LjY0IDEuMTUgMS4wOCAxLjY0IDEuODUgMi40Mi4xOS4yLjE5LjUxIDAgLjcxLS4xMS4xLS4yNC4xNS0uMzcuMTV6bTcuMTctMS44NWMtMS4xOSAwLTIuMjQtLjMtMy4xLS44OS0xLjQ5LTEuMDEtMi4zOC0yLjY1LTIuMzgtNC4zOSAwLS4yOC4yMi0uNS41LS41cy41LjIyLjUuNWMwIDEuNDEuNzIgMi43NCAxLjk0IDMuNTYuNzEuNDggMS41NC43MSAyLjU0LjcxLjI0IDAgLjY0LS4wMyAxLjA0LS4xLjI3LS4wNS41My4xMy41OC40MS4wNS4yNy0uMTMuNTMtLjQxLjU4LS41Ny4xMS0xLjA3LjEyLTEuMjEuMTJ6TTE0LjkxIDIyYy0uMDQgMC0uMDktLjAxLS4xMy0uMDItMS41OS0uNDQtMi42My0xLjAzLTMuNzItMi4xLTEuNC0xLjM5LTIuMTctMy4yNC0yLjE3LTUuMjIgMC0xLjYyIDEuMzgtMi45NCAzLjA4LTIuOTQgMS43IDAgMy4wOCAxLjMyIDMuMDggMi45NCAwIDEuMDcuOTMgMS45NCAyLjA4IDEuOTRzMi4wOC0uODcgMi4wOC0xLjk0YzAtMy43Ny0zLjI1LTYuODMtNy4yNS02LjgzLTIuODQgMC01LjQ0IDEuNTgtNi42MSA0LjAzLS4zOS44MS0uNTkgMS43Ni0uNTkgMi44IDAgLjc4LjA3IDIuMDEuNjcgMy42MS4xLjI2LS4wMy41NS0uMjkuNjQtLjI2LjEtLjU1LS4wNC0uNjQtLjI5LS40OS0xLjMxLS43My0yLjYxLS43My0zLjk2IDAtMS4yLjIzLTIuMjkuNjgtMy4yNCAxLjMzLTIuNzkgNC4yOC00LjYgNy41MS00LjYgNC41NSAwIDguMjUgMy41MSA4LjI1IDcuODMgMCAxLjYyLTEuMzggMi45NC0zLjA4IDIuOTRzLTMuMDgtMS4zMi0zLjA4LTIuOTRjMC0xLjA3LS45My0xLjk0LTIuMDgtMS45NHMtMi4wOC44Ny0yLjA4IDEuOTRjMCAxLjcxLjY2IDMuMzEgMS44NyA0LjUxLjk1Ljk0IDEuODYgMS40NiAzLjI3IDEuODUuMjcuMDcuNDIuMzUuMzUuNjEtLjA1LjIzLS4yNi4zOC0uNDcuMzh6IiAvPjwvZz4KPGcgaWQ9ImZpcnN0LXBhZ2UiPjxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiIC8+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6IiAvPjwvZz4KPGcgaWQ9ImZsaWdodC1sYW5kIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em03LjE4LTUuNzNsNC4zNSAxLjE2IDUuMzEgMS40MmMuOC4yMSAxLjYyLS4yNiAxLjg0LTEuMDYuMjEtLjgtLjI2LTEuNjItMS4wNi0xLjg0bC01LjMxLTEuNDItMi43Ni05LjAyTDEwLjEyIDJ2OC4yOEw1LjE1IDguOTVsLS45My0yLjMyLTEuNDUtLjM5djUuMTdsMS42LjQzIDUuMzEgMS40M3oiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LXRha2VvZmYiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTE5LjU3LTkuMzZjLS4yMS0uOC0xLjA0LTEuMjgtMS44NC0xLjA2TDE0LjkyIDEwbC02LjktNi40My0xLjkzLjUxIDQuMTQgNy4xNy00Ljk3IDEuMzMtMS45Ny0xLjU0LTEuNDUuMzkgMS44MiAzLjE2Ljc3IDEuMzMgMS42LS40MyA1LjMxLTEuNDIgNC4zNS0xLjE2TDIxIDExLjQ5Yy44MS0uMjMgMS4yOC0xLjA1IDEuMDctMS44NXoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9ImZsaXAtdG8tZnJvbnQiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTIgNHYtMkgzYzAgMS4xLjg5IDIgMiAyek0zIDloMlY3SDN2MnptMTIgMTJoMnYtMmgtMnYyem00LTE4SDljLTEuMTEgMC0yIC45LTIgMnYxMGMwIDEuMS44OSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEySDlWNWgxMHYxMHptLTggNmgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlciI+PHBhdGggZD0iTTEwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMmgtOGwtMi0yeiIgLz48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyLXNoYXJlZCI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0tNSAzYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptNCA4aC04di0xYzAtMS4zMyAyLjY3LTIgNC0yczQgLjY3IDQgMnYxeiIgLz48L2c+CjxnIGlkPSJmb250LWRvd25sb2FkIj48cGF0aCBkPSJNOS45MyAxMy41aDQuMTRMMTIgNy45OHpNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS00LjA1IDE2LjVsLTEuMTQtM0g5LjE3bC0xLjEyIDNINS45Nmw1LjExLTEzaDEuODZsNS4xMSAxM2gtMi4wOXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbiI+PHBhdGggZD0iTTcgMTRINXY1aDV2LTJIN3YtM3ptLTItNGgyVjdoM1Y1SDV2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTQgNXYyaDN2M2gyVjVoLTV6IiAvPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4tZXhpdCI+PHBhdGggZD0iTTUgMTZoM3YzaDJ2LTVINXYyem0zLThINXYyaDVWNUg4djN6bTYgMTFoMnYtM2gzdi0yaC01djV6bTItMTFWNWgtMnY1aDVWOGgtM3oiIC8+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6IiAvPjwvZz4KPGcgaWQ9ImdhdmVsIj48cGF0aCBkPSJNMSAyMWgxMnYySDF6TTUuMjQ1IDguMDdsMi44My0yLjgyNyAxNC4xNCAxNC4xNDItMi44MjggMi44Mjh6TTEyLjMxNyAxbDUuNjU3IDUuNjU2LTIuODMgMi44My01LjY1NC01LjY2ek0zLjgyNSA5LjQ4NWw1LjY1NyA1LjY1Ny0yLjgyOCAyLjgyOC01LjY1Ny01LjY1N3oiIC8+PC9nPgo8ZyBpZD0iZ2VzdHVyZSI+PHBhdGggZD0iTTQuNTkgNi44OWMuNy0uNzEgMS40LTEuMzUgMS43MS0xLjIyLjUuMiAwIDEuMDMtLjMgMS41Mi0uMjUuNDItMi44NiAzLjg5LTIuODYgNi4zMSAwIDEuMjguNDggMi4zNCAxLjM0IDIuOTguNzUuNTYgMS43NC43MyAyLjY0LjQ2IDEuMDctLjMxIDEuOTUtMS40IDMuMDYtMi43NyAxLjIxLTEuNDkgMi44My0zLjQ0IDQuMDgtMy40NCAxLjYzIDAgMS42NSAxLjAxIDEuNzYgMS43OS0zLjc4LjY0LTUuMzggMy42Ny01LjM4IDUuMzcgMCAxLjcgMS40NCAzLjA5IDMuMjEgMy4wOSAxLjYzIDAgNC4yOS0xLjMzIDQuNjktNi4xSDIxdi0yLjVoLTIuNDdjLS4xNS0xLjY1LTEuMDktNC4yLTQuMDMtNC4yLTIuMjUgMC00LjE4IDEuOTEtNC45NCAyLjg0LS41OC43My0yLjA2IDIuNDgtMi4yOSAyLjcyLS4yNS4zLS42OC44NC0xLjExLjg0LS40NSAwLS43Mi0uODMtLjM2LTEuOTIuMzUtMS4wOSAxLjQtMi44NiAxLjg1LTMuNTIuNzgtMS4xNCAxLjMtMS45MiAxLjMtMy4yOEM4Ljk1IDMuNjkgNy4zMSAzIDYuNDQgMyA1LjEyIDMgMy45NyA0IDMuNzIgNC4yNWMtLjM2LjM2LS42Ni42Ni0uODguOTNsMS43NSAxLjcxem05LjI5IDExLjY2Yy0uMzEgMC0uNzQtLjI2LS43NC0uNzIgMC0uNi43My0yLjIgMi44Ny0yLjc2LS4zIDIuNjktMS40MyAzLjQ4LTIuMTMgMy40OHoiIC8+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZ2lmIj48cGF0aCBkPSJNMTEuNSA5SDEzdjZoLTEuNXpNOSA5SDZjLS42IDAtMSAuNS0xIDF2NGMwIC41LjQgMSAxIDFoM2MuNiAwIDEtLjUgMS0xdi0ySDguNXYxLjVoLTJ2LTNIMTBWMTBjMC0uNS0uNC0xLTEtMXptMTAgMS41VjloLTQuNXY2SDE2di0yaDJ2LTEuNWgtMnYtMXoiIC8+PC9nPgo8ZyBpZD0iZ3JhZGUiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9ImhlbHAiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOS45MkMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xLjQ1LTIuMSAxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxIDEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+PC9nPgo8ZyBpZD0iaGVscC1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiIC8+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iaGlzdG9yeSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0iaG9tZSI+PHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1mdWxsIj48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6IiAvPjwvZz4KPGcgaWQ9Imh0dHAiPjxwYXRoIGQ9Ik00LjUgMTFoLTJWOUgxdjZoMS41di0yLjVoMlYxNUg2VjlINC41djJ6bTIuNS0uNWgxLjVWMTVIMTB2LTQuNWgxLjVWOUg3djEuNXptNS41IDBIMTRWMTVoMS41di00LjVIMTdWOWgtNC41djEuNXptOS0xLjVIMTh2NmgxLjV2LTJoMmMuOCAwIDEuNS0uNyAxLjUtMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgMi41aC0ydi0xaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiIgLz48L2c+CjxnIGlkPSJpbXBvcnRhbnQtZGV2aWNlcyI+PHBhdGggZD0iTTIzIDExLjAxTDE4IDExYy0uNTUgMC0xIC40NS0xIDF2OWMwIC41NS40NSAxIDEgMWg1Yy41NSAwIDEtLjQ1IDEtMXYtOWMwLS41NS0uNDUtLjk5LTEtLjk5ek0yMyAyMGgtNXYtN2g1djd6TTIwIDJIMkMuODkgMiAwIDIuODkgMCA0djEyYzAgMS4xLjg5IDIgMiAyaDd2Mkg3djJoOHYtMmgtMnYtMmgydi0ySDJWNGgxOHY1aDJWNGMwLTEuMTEtLjktMi0yLTJ6bS04LjAzIDdMMTEgNmwtLjk3IDNIN2wyLjQ3IDEuNzYtLjk0IDIuOTEgMi40Ny0xLjggMi40NyAxLjgtLjk0LTIuOTFMMTUgOWgtMy4wM3oiIC8+PC9nPgo8ZyBpZD0iaW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4Ljg5LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjExLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHoiIC8+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJpbmZvIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5mby1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiIC8+PC9nPgo8ZyBpZD0iaW52ZXJ0LWNvbG9ycyI+PHBhdGggZD0iTTE3LjY2IDcuOTNMMTIgMi4yNyA2LjM0IDcuOTNjLTMuMTIgMy4xMi0zLjEyIDguMTkgMCAxMS4zMUM3LjkgMjAuOCA5Ljk1IDIxLjU4IDEyIDIxLjU4YzIuMDUgMCA0LjEtLjc4IDUuNjYtMi4zNCAzLjEyLTMuMTIgMy4xMi04LjE5IDAtMTEuMzF6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTlzLjYyLTMuMTEgMS43Ni00LjI0TDEyIDUuMXYxNC40OXoiIC8+PC9nPgo8ZyBpZD0ibGFiZWwiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2eiIgLz48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiIC8+PC9nPgo8ZyBpZD0ibGFuZ3VhZ2UiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem02LjkzIDZoLTIuOTVjLS4zMi0xLjI1LS43OC0yLjQ1LTEuMzgtMy41NiAxLjg0LjYzIDMuMzcgMS45MSA0LjMzIDMuNTZ6TTEyIDQuMDRjLjgzIDEuMiAxLjQ4IDIuNTMgMS45MSAzLjk2aC0zLjgyYy40My0xLjQzIDEuMDgtMi43NiAxLjkxLTMuOTZ6TTQuMjYgMTRDNC4xIDEzLjM2IDQgMTIuNjkgNCAxMnMuMS0xLjM2LjI2LTJoMy4zOGMtLjA4LjY2LS4xNCAxLjMyLS4xNCAyIDAgLjY4LjA2IDEuMzQuMTQgMkg0LjI2em0uODIgMmgyLjk1Yy4zMiAxLjI1Ljc4IDIuNDUgMS4zOCAzLjU2LTEuODQtLjYzLTMuMzctMS45LTQuMzMtMy41NnptMi45NS04SDUuMDhjLjk2LTEuNjYgMi40OS0yLjkzIDQuMzMtMy41NkM4LjgxIDUuNTUgOC4zNSA2Ljc1IDguMDMgOHpNMTIgMTkuOTZjLS44My0xLjItMS40OC0yLjUzLTEuOTEtMy45NmgzLjgyYy0uNDMgMS40My0xLjA4IDIuNzYtMS45MSAzLjk2ek0xNC4zNCAxNEg5LjY2Yy0uMDktLjY2LS4xNi0xLjMyLS4xNi0yIDAtLjY4LjA3LTEuMzUuMTYtMmg0LjY4Yy4wOS42NS4xNiAxLjMyLjE2IDIgMCAuNjgtLjA3IDEuMzQtLjE2IDJ6bS4yNSA1LjU2Yy42LTEuMTEgMS4wNi0yLjMxIDEuMzgtMy41NmgyLjk1Yy0uOTYgMS42NS0yLjQ5IDIuOTMtNC4zMyAzLjU2ek0xNi4zNiAxNGMuMDgtLjY2LjE0LTEuMzIuMTQtMiAwLS42OC0uMDYtMS4zNC0uMTQtMmgzLjM4Yy4xNi42NC4yNiAxLjMxLjI2IDJzLS4xIDEuMzYtLjI2IDJoLTMuMzh6IiAvPjwvZz4KPGcgaWQ9Imxhc3QtcGFnZSI+PHBhdGggZD0iTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiIgLz48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ibGlnaHRidWxiLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDIxYzAgLjU1LjQ1IDEgMSAxaDRjLjU1IDAgMS0uNDUgMS0xdi0xSDl2MXptMy0xOUM4LjE0IDIgNSA1LjE0IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2MwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMi4yNmMxLjgxLTEuMjcgMy0zLjM2IDMtNS43NCAwLTMuODYtMy4xNC03LTctN3ptMi44NSAxMS4xbC0uODUuNlYxNmgtNHYtMi4zbC0uODUtLjZDNy44IDEyLjE2IDcgMTAuNjMgNyA5YzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVjMCAxLjYzLS44IDMuMTYtMi4xNSA0LjF6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtc3R5bGUiPjxwYXRoIGQ9Ik0zIDE2aDV2LTJIM3Yyem02LjUgMGg1di0yaC01djJ6bTYuNSAwaDV2LTJoLTV2MnpNMyAyMGgydi0ySDN2MnptNCAwaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0zIDEyaDh2LTJIM3Yyem0xMCAwaDh2LTJoLTh2MnpNMyA0djRoMThWNEgzeiIgLz48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmsiPjxwYXRoIGQ9Ik0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiIC8+PC9nPgo8ZyBpZD0ibGlzdCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTQgNGgxNHYtMkg3djJ6bTAgNGgxNHYtMkg3djJ6TTcgN3YyaDE0VjdIN3oiIC8+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3BlbiI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNmgxLjljMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0wIDEySDZWMTBoMTJ2MTB6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3V0bGluZSI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6TTguOSA2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xczMuMSAxLjM5IDMuMSAzLjF2Mkg4LjlWNnpNMTggMjBINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiIC8+PC9nPgo8ZyBpZD0ibG95YWx0eSI+PHBhdGggZD0iTTIxLjQxIDExLjU4bC05LTlDMTIuMDUgMi4yMiAxMS41NSAyIDExIDJINGMtMS4xIDAtMiAuOS0yIDJ2N2MwIC41NS4yMiAxLjA1LjU5IDEuNDJsOSA5Yy4zNi4zNi44Ni41OCAxLjQxLjU4LjU1IDAgMS4wNS0uMjIgMS40MS0uNTlsNy03Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0uNTUtLjIzLTEuMDYtLjU5LTEuNDJ6TTUuNSA3QzQuNjcgNyA0IDYuMzMgNCA1LjVTNC42NyA0IDUuNSA0IDcgNC42NyA3IDUuNSA2LjMzIDcgNS41IDd6bTExLjc3IDguMjdMMTMgMTkuNTRsLTQuMjctNC4yN0M4LjI4IDE0LjgxIDggMTQuMTkgOCAxMy41YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41LjY5IDAgMS4zMi4yOCAxLjc3Ljc0bC43My43Mi43My0uNzNjLjQ1LS40NSAxLjA4LS43MyAxLjc3LS43MyAxLjM4IDAgMi41IDEuMTIgMi41IDIuNSAwIC42OS0uMjggMS4zMi0uNzMgMS43N3oiIC8+PC9nPgo8ZyBpZD0ibWFpbCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiIgLz48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQtbWFpbGJveCI+PHBhdGggZD0iTTIwIDZIMTB2Nkg4VjRoNlYwSDZ2Nkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1lbnUiPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiIgLz48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW9yZS12ZXJ0Ij48cGF0aCBkPSJNMTIgOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1vdG9yY3ljbGUiPjxwYXRoIGQ9Ik0xOS40NCA5LjAzTDE1LjQxIDVIMTF2MmgzLjU5bDIgMkg1Yy0yLjggMC01IDIuMi01IDVzMi4yIDUgNSA1YzIuNDYgMCA0LjQ1LTEuNjkgNC45LTRoMS42NWwyLjc3LTIuNzdjLS4yMS41NC0uMzIgMS4xNC0uMzIgMS43NyAwIDIuOCAyLjIgNSA1IDVzNS0yLjIgNS01YzAtMi42NS0xLjk3LTQuNzctNC41Ni00Ljk3ek03LjgyIDE1QzcuNCAxNi4xNSA2LjI4IDE3IDUgMTdjLTEuNjMgMC0zLTEuMzctMy0zczEuMzctMyAzLTNjMS4yOCAwIDIuNC44NSAyLjgyIDJINXYyaDIuODJ6TTE5IDE3Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiIgLz48L2c+CjxnIGlkPSJuZXh0LXdlZWsiPjxwYXRoIGQ9Ik0yMCA3aC00VjVjMC0uNTUtLjIyLTEuMDUtLjU5LTEuNDFDMTUuMDUgMy4yMiAxNC41NSAzIDE0IDNoLTRjLTEuMSAwLTIgLjktMiAydjJINGMtMS4xIDAtMiAuOS0yIDJ2MTFjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yek0xMCA1aDR2MmgtNFY1em0xIDEzLjVsLTEtMSAzLTMtMy0zIDEtMSA0IDQtNCA0eiIgLz48L2c+CjxnIGlkPSJub3RlLWFkZCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNGgtM3YzaC0ydi0zSDh2LTJoM3YtM2gydjNoM3Yyem0tMy03VjMuNUwxOC41IDlIMTN6IiAvPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiIgLz48L2c+CjxnIGlkPSJvcGFjaXR5Ij48cGF0aCBkPSJNMTcuNjYgOEwxMiAyLjM1IDYuMzQgOEM0Ljc4IDkuNTYgNCAxMS42NCA0IDEzLjY0cy43OCA0LjExIDIuMzQgNS42NyAzLjYxIDIuMzUgNS42NiAyLjM1IDQuMS0uNzkgNS42Ni0yLjM1UzIwIDE1LjY0IDIwIDEzLjY0IDE5LjIyIDkuNTYgMTcuNjYgOHpNNiAxNGMuMDEtMiAuNjItMy4yNyAxLjc2LTQuNEwxMiA1LjI3bDQuMjQgNC4zOEMxNy4zOCAxMC43NyAxNy45OSAxMiAxOCAxNEg2eiIgLz48L2c+CjxnIGlkPSJvcGVuLWluLWJyb3dzZXIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg0di0ySDVWOGgxNHYxMGgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uODktMi0yLTJ6bS03IDZsLTQgNGgzdjZoMnYtNmgzbC00LTR6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6IiAvPjwvZz4KPGcgaWQ9Im9wZW4td2l0aCI+PHBhdGggZD0iTTEwIDloNFY2aDNsLTUtNS01IDVoM3Yzem0tMSAxSDZWN2wtNSA1IDUgNXYtM2gzdi00em0xNCAybC01LTV2M2gtM3Y0aDN2M2w1LTV6bS05IDNoLTR2M0g3bDUgNSA1LTVoLTN2LTN6IiAvPjwvZz4KPGcgaWQ9InBhZ2V2aWV3Ij48cGF0aCBkPSJNMTEuNSA5QzEwLjEyIDkgOSAxMC4xMiA5IDExLjVzMS4xMiAyLjUgMi41IDIuNSAyLjUtMS4xMiAyLjUtMi41UzEyLjg4IDkgMTEuNSA5ek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTMuMjEgMTQuMjFsLTIuOTEtMi45MWMtLjY5LjQ0LTEuNTEuNy0yLjM5LjdDOS4wMSAxNiA3IDEzLjk5IDcgMTEuNVM5LjAxIDcgMTEuNSA3IDE2IDkuMDEgMTYgMTEuNWMwIC44OC0uMjYgMS42OS0uNyAyLjM5bDIuOTEgMi45LTEuNDIgMS40MnoiIC8+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGF5bWVudCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0icGVybS1jYW1lcmEtbWljIj48cGF0aCBkPSJNMjAgNWgtMy4xN0wxNSAzSDlMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YtMi4wOWMtMi44My0uNDgtNS0yLjk0LTUtNS45MWgyYzAgMi4yMSAxLjc5IDQgNCA0czQtMS43OSA0LTRoMmMwIDIuOTctMi4xNyA1LjQzLTUgNS45MVYyMWg3YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bS02IDhjMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yVjljMC0xLjEuOS0yIDItMnMyIC45IDIgMnY0eiIgLz48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiIgLz48L2c+CjxnIGlkPSJwZXJtLWRhdGEtc2V0dGluZyI+PHBhdGggZD0iTTE4Ljk5IDExLjVjLjM0IDAgLjY3LjAzIDEgLjA3TDIwIDAgMCAyMGgxMS41NmMtLjA0LS4zMy0uMDctLjY2LS4wNy0xIDAtNC4xNCAzLjM2LTcuNSA3LjUtNy41em0zLjcxIDcuOTljLjAyLS4xNi4wNC0uMzIuMDQtLjQ5IDAtLjE3LS4wMS0uMzMtLjA0LS40OWwxLjA2LS44M2MuMDktLjA4LjEyLS4yMS4wNi0uMzJsLTEtMS43M2MtLjA2LS4xMS0uMTktLjE1LS4zMS0uMTFsLTEuMjQuNWMtLjI2LS4yLS41NC0uMzctLjg1LS40OWwtLjE5LTEuMzJjLS4wMS0uMTItLjEyLS4yMS0uMjQtLjIxaC0yYy0uMTIgMC0uMjMuMDktLjI1LjIxbC0uMTkgMS4zMmMtLjMuMTMtLjU5LjI5LS44NS40OWwtMS4yNC0uNWMtLjExLS4wNC0uMjQgMC0uMzEuMTFsLTEgMS43M2MtLjA2LjExLS4wNC4yNC4wNi4zMmwxLjA2LjgzYy0uMDIuMTYtLjAzLjMyLS4wMy40OSAwIC4xNy4wMS4zMy4wMy40OWwtMS4wNi44M2MtLjA5LjA4LS4xMi4yMS0uMDYuMzJsMSAxLjczYy4wNi4xMS4xOS4xNS4zMS4xMWwxLjI0LS41Yy4yNi4yLjU0LjM3Ljg1LjQ5bC4xOSAxLjMyYy4wMi4xMi4xMi4yMS4yNS4yMWgyYy4xMiAwIC4yMy0uMDkuMjUtLjIxbC4xOS0xLjMyYy4zLS4xMy41OS0uMjkuODQtLjQ5bDEuMjUuNWMuMTEuMDQuMjQgMCAuMzEtLjExbDEtMS43M2MuMDYtLjExLjAzLS4yNC0uMDYtLjMybC0xLjA3LS44M3ptLTMuNzEgMS4wMWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGV2aWNlLWluZm9ybWF0aW9uIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjZoMnYtNnptNC05Ljk5TDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiIgLz48L2c+CjxnIGlkPSJwZXJtLW1lZGlhIj48cGF0aCBkPSJNMiA2SDB2NWguMDFMMCAyMGMwIDEuMS45IDIgMiAyaDE4di0ySDJWNnptMjAtMmgtOGwtMi0ySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcgMTVsNC41LTYgMy41IDQuNTEgMi41LTMuMDFMMjEgMTVIN3oiIC8+PC9nPgo8ZyBpZD0icGVybS1waG9uZS1tc2ciPjxwYXRoIGQ9Ik0yMCAxNS41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTIgM3YxMGwzLTNoNlYzaC05eiIgLz48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6IiAvPjwvZz4KPGcgaWQ9InBldHMiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSIgLz48Y2lyY2xlIGN4PSIxNSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE5LjUiIGN5PSI5LjUiIHI9IjIuNSIgLz48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6IiAvPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZSI+PHBhdGggZD0iTTE5IDdoLTh2Nmg4Vjd6bTItNEgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OFY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OGgxOHYxNC4wM3oiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlLWFsdCI+PHBhdGggZD0iTTE5IDExaC04djZoOHYtNnptNCA4VjQuOThDMjMgMy44OCAyMi4xIDMgMjEgM0gzYy0xLjEgMC0yIC44OC0yIDEuOThWMTljMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnptLTIgLjAySDNWNC45N2gxOHYxNC4wNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiIgLz48L2c+CjxnIGlkPSJwb2x5bWVyIj48cGF0aCBkPSJNMTkgNGgtNEw3LjExIDE2LjYzIDQuNSAxMiA5IDRINUwuNSAxMiA1IDIwaDRsNy44OS0xMi42M0wxOS41IDEyIDE1IDIwaDRsNC41LTh6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLXNldHRpbmdzLW5ldyI+PHBhdGggZD0iTTEzIDNoLTJ2MTBoMlYzem00LjgzIDIuMTdsLTEuNDIgMS40MkMxNy45OSA3Ljg2IDE5IDkuODEgMTkgMTJjMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0yLjE5IDEuMDEtNC4xNCAyLjU4LTUuNDJMNi4xNyA1LjE3QzQuMjMgNi44MiAzIDkuMjYgMyAxMmMwIDQuOTcgNC4wMyA5IDkgOXM5LTQuMDMgOS05YzAtMi43NC0xLjIzLTUuMTgtMy4xNy02LjgzeiIgLz48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiIC8+PC9nPgo8ZyBpZD0icHJpbnQiPjxwYXRoIGQ9Ik0xOSA4SDVjLTEuNjYgMC0zIDEuMzQtMyAzdjZoNHY0aDEydi00aDR2LTZjMC0xLjY2LTEuMzQtMy0zLTN6bS0zIDExSDh2LTVoOHY1em0zLTdjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTEtOUg2djRoMTJWM3oiIC8+PC9nPgo8ZyBpZD0icXVlcnktYnVpbGRlciI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi1jaGVja2VkIj48cGF0aCBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiIC8+PC9nPgo8ZyBpZD0icmVjb3JkLXZvaWNlLW92ZXIiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI0IiAvPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6IiAvPjwvZz4KPGcgaWQ9InJlZGVlbSI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJyZWRvIj48cGF0aCBkPSJNMTguNCAxMC42QzE2LjU1IDguOTkgMTQuMTUgOCAxMS41IDhjLTQuNjUgMC04LjU4IDMuMDMtOS45NiA3LjIyTDMuOSAxNmMxLjA1LTMuMTkgNC4wNS01LjUgNy42LTUuNSAxLjk1IDAgMy43My43MiA1LjEyIDEuODhMMTMgMTZoOVY3bC0zLjYgMy42eiIgLz48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZSI+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0yMi43MyAyMi43M0wyLjc3IDIuNzcgMiAybC0uNzMtLjczTDAgMi41NGw0LjM5IDQuMzkgMi4yMSA0LjY2LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmg3LjQ2bDEuMzggMS4zOGMtLjUuMzYtLjgzLjk1LS44MyAxLjYyIDAgMS4xLjg5IDIgMS45OSAyIC42NyAwIDEuMjYtLjMzIDEuNjItLjg0TDIxLjQ2IDI0bDEuMjctMS4yN3pNNy40MiAxNWMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDIuMzZsMiAySDcuNDJ6bTguMTMtMmMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINi41NGw5LjAxIDl6TTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InJlb3JkZXIiPjxwYXRoIGQ9Ik0zIDE1aDE4di0ySDN2MnptMCA0aDE4di0ySDN2MnptMC04aDE4VjlIM3Yyem0wLTZ2MmgxOFY1SDN6IiAvPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiIgLz48L2c+CjxnIGlkPSJyZXBseS1hbGwiPjxwYXRoIGQ9Ik03IDhWNWwtNyA3IDcgN3YtM2wtNC00IDQtNHptNiAxVjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydCI+PHBhdGggZD0iTTE1LjczIDNIOC4yN0wzIDguMjd2Ny40Nkw4LjI3IDIxaDcuNDZMMjEgMTUuNzNWOC4yN0wxNS43MyAzek0xMiAxNy4zYy0uNzIgMC0xLjMtLjU4LTEuMy0xLjMgMC0uNzIuNTgtMS4zIDEuMy0xLjMuNzIgMCAxLjMuNTggMS4zIDEuMyAwIC43Mi0uNTggMS4zLTEuMyAxLjN6bTEtNC4zaC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZS1wYWdlIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0tMiAxNmMtMi4wNSAwLTMuODEtMS4yNC00LjU4LTNoMS43MWMuNjMuOSAxLjY4IDEuNSAyLjg3IDEuNSAxLjkzIDAgMy41LTEuNTcgMy41LTMuNVMxMy45MyA5LjUgMTIgOS41Yy0xLjM1IDAtMi41Mi43OC0zLjEgMS45bDEuNiAxLjZoLTRWOWwxLjMgMS4zQzguNjkgOC45MiAxMC4yMyA4IDEyIDhjMi43NiAwIDUgMi4yNCA1IDVzLTIuMjQgNS01IDV6IiAvPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0icm91bmRlZC1jb3JuZXIiPjxwYXRoIGQ9Ik0xOSAxOWgydjJoLTJ2LTJ6bTAtMmgydi0yaC0ydjJ6TTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTAtNGgyVjNIM3Yyem00IDBoMlYzSDd2MnptOCAxNmgydi0yaC0ydjJ6bS00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem0tOCAwaDJ2LTJIN3Yyem0tNCAwaDJ2LTJIM3Yyek0yMSA4YzAtMi43Ni0yLjI0LTUtNS01aC01djJoNWMxLjY1IDAgMyAxLjM1IDMgM3Y1aDJWOHoiIC8+PC9nPgo8ZyBpZD0icm93aW5nIj48cGF0aCBkPSJNOC41IDE0LjVMNCAxOWwxLjUgMS41TDkgMTdoMmwtMi41LTIuNXpNMTUgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgMjAuMDFMMTggMjRsLTIuOTktMy4wMVYxOS41bC03LjEtNy4wOWMtLjMxLjA1LS42MS4wNy0uOTEuMDd2LTIuMTZjMS42Ni4wMyAzLjYxLS44NyA0LjY3LTIuMDRsMS40LTEuNTVjLjE5LS4yMS40My0uMzguNjktLjUuMjktLjE0LjYyLS4yMy45Ni0uMjNoLjAzQzE1Ljk5IDYuMDEgMTcgNy4wMiAxNyA4LjI2djUuNzVjMCAuODQtLjM1IDEuNjEtLjkyIDIuMTZsLTMuNTgtMy41OHYtMi4yN2MtLjYzLjUyLTEuNDMgMS4wMi0yLjI5IDEuMzlMMTYuNSAxOEgxOGwzIDMuMDF6IiAvPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiIC8+PC9nPgo8ZyBpZD0ic2NoZWR1bGUiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6IiAvPjwvZz4KPGcgaWQ9InNlYXJjaCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6IiAvPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiIC8+PC9nPgo8ZyBpZD0ic2VuZCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncyI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJhY2t1cC1yZXN0b3JlIj48cGF0aCBkPSJNMTQgMTJjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyIC45IDIgMiAyIDItLjkgMi0yem0tMi05Yy00Ljk3IDAtOSA0LjAzLTkgOUgwbDQgNCA0LTRINWMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuNTEgMC0yLjkxLS40OS00LjA2LTEuM2wtMS40MiAxLjQ0QzguMDQgMjAuMyA5Ljk0IDIxIDEyIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ibHVldG9vdGgiPjxwYXRoIGQ9Ik0xMSAyNGgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6bTggMGgydi0yaC0ydjJ6bTIuNzEtMTguMjlMMTIgMGgtMXY3LjU5TDYuNDEgMyA1IDQuNDEgMTAuNTkgMTAgNSAxNS41OSA2LjQxIDE3IDExIDEyLjQxVjIwaDFsNS43MS01LjcxLTQuMy00LjI5IDQuMy00LjI5ek0xMyAzLjgzbDEuODggMS44OEwxMyA3LjU5VjMuODN6bTEuODggMTAuNDZMMTMgMTYuMTd2LTMuNzZsMS44OCAxLjg4eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWNlbGwiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0xNiAuMDFMOCAwQzYuOSAwIDYgLjkgNiAydjE2YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNiAxNkg4VjRoOHYxMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtZXRoZXJuZXQiPjxwYXRoIGQ9Ik03Ljc3IDYuNzZMNi4yMyA1LjQ4LjgyIDEybDUuNDEgNi41MiAxLjU0LTEuMjhMMy40MiAxMmw0LjM1LTUuMjR6TTcgMTNoMnYtMkg3djJ6bTEwLTJoLTJ2Mmgydi0yem0tNiAyaDJ2LTJoLTJ2MnptNi43Ny03LjUybC0xLjU0IDEuMjhMMjAuNTggMTJsLTQuMzUgNS4yNCAxLjU0IDEuMjhMMjMuMTggMTJsLTUuNDEtNi41MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb25lbnQiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvc2l0ZSI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1zdmlkZW8iPjxwYXRoIGQ9Ik04IDExLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41UzUgMTAuNjcgNSAxMS41IDUuNjcgMTMgNi41IDEzIDggMTIuMzMgOCAxMS41em03LTVjMC0uODMtLjY3LTEuNS0xLjUtMS41aC0zQzkuNjcgNSA5IDUuNjcgOSA2LjVTOS42NyA4IDEwLjUgOGgzYy44MyAwIDEuNS0uNjcgMS41LTEuNXpNOC41IDE1Yy0uODMgMC0xLjUuNjctMS41IDEuNVM3LjY3IDE4IDguNSAxOHMxLjUtLjY3IDEuNS0xLjVTOS4zMyAxNSA4LjUgMTV6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyczQuOTMgMTEgMTEgMTEgMTEtNC45MyAxMS0xMVMxOC4wNyAxIDEyIDF6bTAgMjBjLTQuOTYgMC05LTQuMDQtOS05czQuMDQtOSA5LTkgOSA0LjA0IDkgOS00LjA0IDktOSA5em01LjUtMTFjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0tMiA1Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtb3ZlcnNjYW4iPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBvd2VyIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMi0yMmgtMnYxMGgyVjJ6bTMuNTYgMi40NGwtMS40NSAxLjQ1QzE2Ljg0IDYuOTQgMTggOC44MyAxOCAxMWMwIDMuMzEtMi42OSA2LTYgNnMtNi0yLjY5LTYtNmMwLTIuMTcgMS4xNi00LjA2IDIuODgtNS4xMkw3LjQ0IDQuNDRDNS4zNiA1Ljg4IDQgOC4yOCA0IDExYzAgNC40MiAzLjU4IDggOCA4czgtMy41OCA4LThjMC0yLjcyLTEuMzYtNS4xMi0zLjQ0LTYuNTZ6TTE1IDI0aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcmVtb3RlIj48cGF0aCBkPSJNMTUgOUg5Yy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTFWMTBjMC0uNTUtLjQ1LTEtMS0xem0tMyA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNNy4wNSA2LjA1bDEuNDEgMS40MUM5LjM3IDYuNTYgMTAuNjIgNiAxMiA2czIuNjMuNTYgMy41NCAxLjQ2bDEuNDEtMS40MUMxNS42OCA0Ljc4IDEzLjkzIDQgMTIgNHMtMy42OC43OC00Ljk1IDIuMDV6TTEyIDBDOC45NiAwIDYuMjEgMS4yMyA0LjIyIDMuMjJsMS40MSAxLjQxQzcuMjYgMy4wMSA5LjUxIDIgMTIgMnM0Ljc0IDEuMDEgNi4zNiAyLjY0bDEuNDEtMS40MUMxNy43OSAxLjIzIDE1LjA0IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiIgLz48L2c+CjxnIGlkPSJzaG9wIj48cGF0aCBkPSJNMTYgNlY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2MkgydjEzYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZoLTZ6bS02LTJoNHYyaC00VjR6TTkgMThWOWw3LjUgNEw5IDE4eiIgLz48L2c+CjxnIGlkPSJzaG9wLXR3byI+PHBhdGggZD0iTTMgOUgxdjExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0ySDNWOXptMTUtNFYzYzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg1djExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0yVjVoLTV6bS02LTJoNHYyaC00VjN6bTAgMTJWOGw1LjUgMy01LjUgNHoiIC8+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnpNMSAydjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDUuMjFsLS45NC0ySDF6bTE2IDE2Yy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic29ydCI+PHBhdGggZD0iTTMgMThoNnYtMkgzdjJ6TTMgNnYyaDE4VjZIM3ptMCA3aDEydi0ySDN2MnoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzLW9mZiI+PHBhdGggZD0iTTEwLjU0IDExbC0uNTQtLjU0TDcuNTQgOCA2IDYuNDYgMi4zOCAyLjg0IDEuMjcgMS43MyAwIDNsMi4wMSAyLjAxTDIgMjJsNC00aDlsNS43MyA1LjczTDIyIDIyLjQ2IDE3LjU0IDE4bC03LTd6TTggMTRINnYtMmgydjJ6bS0yLTNWOWwyIDJINnptMTQtOUg0LjA4TDEwIDcuOTJWNmg4djJoLTcuOTJsMSAxSDE4djJoLTQuOTJsNi45OSA2Ljk5QzIxLjE0IDE3Ljk1IDIyIDE3LjA4IDIyIDE2VjRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InNwZWxsY2hlY2siPjxwYXRoIGQ9Ik0xMi40NSAxNmgyLjA5TDkuNDMgM0g3LjU3TDIuNDYgMTZoMi4wOWwxLjEyLTNoNS42NGwxLjE0IDN6bS02LjAyLTVMOC41IDUuNDggMTAuNTcgMTFINi40M3ptMTUuMTYuNTlsLTguMDkgOC4wOUw5LjgzIDE2bC0xLjQxIDEuNDEgNS4wOSA1LjA5TDIzIDEzbC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0ic3Rhci1ib3JkZXIiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40bC0zLjc2IDIuMjcgMS00LjI4LTMuMzItMi44OCA0LjM4LS4zOEwxMiA2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiIgLz48L2c+CjxnIGlkPSJzdGFyLWhhbGYiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40VjYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6IiAvPjwvZz4KPGcgaWQ9InN0b3JlIj48cGF0aCBkPSJNMjAgNEg0djJoMTZWNHptMSAxMHYtMmwtMS01SDRsLTEgNXYyaDF2NmgxMHYtNmg0djZoMnYtNmgxem0tOSA0SDZ2LTRoNnY0eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctbGVmdCI+PHBhdGggZD0iTTExIDlsMS40MiAxLjQyTDguODMgMTRIMThWNGgydjEySDguODNsMy41OSAzLjU4TDExIDIxbC02LTYgNi02eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6IiAvPjwvZz4KPGcgaWQ9InN1YmplY3QiPjxwYXRoIGQ9Ik0xNCAxN0g0djJoMTB2LTJ6bTYtOEg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6TTQgNXYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0ic3VwZXJ2aXNvci1hY2NvdW50Ij48cGF0aCBkPSJNMTYuNSAxMmMxLjM4IDAgMi40OS0xLjEyIDIuNDktMi41UzE3Ljg4IDcgMTYuNSA3QzE1LjEyIDcgMTQgOC4xMiAxNCA5LjVzMS4xMiAyLjUgMi41IDIuNXpNOSAxMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM1MxMC42NiA1IDkgNUM3LjM0IDUgNiA2LjM0IDYgOHMxLjM0IDMgMyAzem03LjUgM2MtMS44MyAwLTUuNS45Mi01LjUgMi43NVYxOWgxMXYtMi4yNWMwLTEuODMtMy42Ny0yLjc1LTUuNS0yLjc1ek05IDEzYy0yLjMzIDAtNyAxLjE3LTcgMy41VjE5aDd2LTIuMjVjMC0uODUuMzMtMi4zNCAyLjM3LTMuNDdDMTAuNSAxMy4xIDkuNjYgMTMgOSAxM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0Ij48cGF0aCBkPSJNMTYgMTcuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6TTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6IiAvPjwvZz4KPGcgaWQ9InN3YXAtdmVydGljYWwtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNi41IDlMMTAgNS41IDEzLjUgOUgxMXY0SDlWOUg2LjV6bTExIDZMMTQgMTguNSAxMC41IDE1SDEzdi00aDJ2NGgyLjV6IiAvPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0YWIiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTB2NGg4djEweiIgLz48L2c+CjxnIGlkPSJ0YWItdW5zZWxlY3RlZCI+PHBhdGggZD0iTTEgOWgyVjdIMXYyem0wIDRoMnYtMkgxdjJ6bTAtOGgyVjNjLTEuMSAwLTIgLjktMiAyem04IDE2aDJ2LTJIOXYyem0tOC00aDJ2LTJIMXYyem0yIDR2LTJIMWMwIDEuMS45IDIgMiAyek0yMSAzaC04djZoMTBWNWMwLTEuMS0uOS0yLTItMnptMCAxNGgydi0yaC0ydjJ6TTkgNWgyVjNIOXYyek01IDIxaDJ2LTJINXYyek01IDVoMlYzSDV2MnptMTYgMTZjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC04aDJ2LTJoLTJ2MnptLTggOGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiIgLz48L2c+CjxnIGlkPSJ0aGVhdGVycyI+PHBhdGggZD0iTTE4IDN2MmgtMlYzSDh2Mkg2VjNINHYxOGgydi0yaDJ2Mmg4di0yaDJ2MmgyVjNoLTJ6TTggMTdINnYtMmgydjJ6bTAtNEg2di0yaDJ2MnptMC00SDZWN2gydjJ6bTEwIDhoLTJ2LTJoMnYyem0wLTRoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjJ6IiAvPjwvZz4KPGcgaWQ9InRodW1iLWRvd24iPjxwYXRoIGQ9Ik0xNSAzSDZjLS44MyAwLTEuNTQuNS0xLjg0IDEuMjJsLTMuMDIgNy4wNWMtLjA5LjIzLS4xNC40Ny0uMTQuNzN2MS45MWwuMDEuMDFMMSAxNGMwIDEuMS45IDIgMiAyaDYuMzFsLS45NSA0LjU3LS4wMy4zMmMwIC40MS4xNy43OS40NCAxLjA2TDkuODMgMjNsNi41OS02LjU5Yy4zNi0uMzYuNTgtLjg2LjU4LTEuNDFWNWMwLTEuMS0uOS0yLTItMnptNCAwdjEyaDRWM2gtNHoiIC8+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiIC8+PC9nPgo8ZyBpZD0idGh1bWJzLXVwLWRvd24iPjxwYXRoIGQ9Ik0xMiA2YzAtLjU1LS40NS0xLTEtMUg1LjgybC42Ni0zLjE4LjAyLS4yM2MwLS4zMS0uMTMtLjU5LS4zMy0uOEw1LjM4IDAgLjQ0IDQuOTRDLjE3IDUuMjEgMCA1LjU5IDAgNnY2LjVjMCAuODMuNjcgMS41IDEuNSAxLjVoNi43NWMuNjIgMCAxLjE1LS4zOCAxLjM4LS45MWwyLjI2LTUuMjljLjA3LS4xNy4xMS0uMzYuMTEtLjU1VjZ6bTEwLjUgNGgtNi43NWMtLjYyIDAtMS4xNS4zOC0xLjM4LjkxbC0yLjI2IDUuMjljLS4wNy4xNy0uMTEuMzYtLjExLjU1VjE4YzAgLjU1LjQ1IDEgMSAxaDUuMThsLS42NiAzLjE4LS4wMi4yNGMwIC4zMS4xMy41OS4zMy44bC43OS43OCA0Ljk0LTQuOTRjLjI3LS4yNy40NC0uNjUuNDQtMS4wNnYtNi41YzAtLjgzLS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0idGltZWxpbmUiPjxwYXRoIGQ9Ik0yMyA4YzAgMS4xLS45IDItMiAyLS4xOCAwLS4zNS0uMDItLjUxLS4wN2wtMy41NiAzLjU1Yy4wNS4xNi4wNy4zNC4wNy41MiAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJjMC0uMTguMDItLjM2LjA3LS41MmwtMi41NS0yLjU1Yy0uMTYuMDUtLjM0LjA3LS41Mi4wN3MtLjM2LS4wMi0uNTItLjA3bC00LjU1IDQuNTZjLjA1LjE2LjA3LjMzLjA3LjUxIDAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMmMuMTggMCAuMzUuMDIuNTEuMDdsNC41Ni00LjU1QzguMDIgOS4zNiA4IDkuMTggOCA5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAuMTgtLjAyLjM2LS4wNy41MmwyLjU1IDIuNTVjLjE2LS4wNS4zNC0uMDcuNTItLjA3cy4zNi4wMi41Mi4wN2wzLjU1LTMuNTZDMTkuMDIgOC4zNSAxOSA4LjE4IDE5IDhjMC0xLjEuOS0yIDItMnMyIC45IDIgMnoiIC8+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idG9kYXkiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6IiAvPjwvZz4KPGcgaWQ9InRvbGwiPjxwYXRoIGQ9Ik0xNSA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4IDgtMy41OCA4LTgtMy41OC04LTgtOHptMCAxNGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6TTMgMTJjMC0yLjYxIDEuNjctNC44MyA0LTUuNjVWNC4yNkMzLjU1IDUuMTUgMSA4LjI3IDEgMTJzMi41NSA2Ljg1IDYgNy43NHYtMi4wOWMtMi4zMy0uODItNC0zLjA0LTQtNS42NXoiIC8+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6IiAvPjwvZz4KPGcgaWQ9InRyYWNrLWNoYW5nZXMiPjxwYXRoIGQ9Ik0xOS4wNyA0LjkzbC0xLjQxIDEuNDFDMTkuMSA3Ljc5IDIwIDkuNzkgMjAgMTJjMCA0LjQyLTMuNTggOC04IDhzLTgtMy41OC04LThjMC00LjA4IDMuMDUtNy40NCA3LTcuOTN2Mi4wMkM4LjE2IDYuNTcgNiA5LjAzIDYgMTJjMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmMwLTEuNjYtLjY3LTMuMTYtMS43Ni00LjI0bC0xLjQxIDEuNDFDMTUuNTUgOS45IDE2IDEwLjkgMTYgMTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRjMC0xLjg2IDEuMjgtMy40MSAzLTMuODZ2Mi4xNGMtLjYuMzUtMSAuOTgtMSAxLjcyIDAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0uNzQtLjQtMS4zOC0xLTEuNzJWMmgtMUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwYzAtMi43Ni0xLjEyLTUuMjYtMi45My03LjA3eiIgLz48L2c+CjxnIGlkPSJ0cmFuc2xhdGUiPjxwYXRoIGQ9Ik0xMi44NyAxNS4wN2wtMi41NC0yLjUxLjAzLS4wM2MxLjc0LTEuOTQgMi45OC00LjE3IDMuNzEtNi41M0gxN1Y0aC03VjJIOHYySDF2MS45OWgxMS4xN0MxMS41IDcuOTIgMTAuNDQgOS43NSA5IDExLjM1IDguMDcgMTAuMzIgNy4zIDkuMTkgNi42OSA4aC0yYy43MyAxLjYzIDEuNzMgMy4xNyAyLjk4IDQuNTZsLTUuMDkgNS4wMkw0IDE5bDUtNSAzLjExIDMuMTEuNzYtMi4wNHpNMTguNSAxMGgtMkwxMiAyMmgybDEuMTItM2g0Ljc1TDIxIDIyaDJsLTQuNS0xMnptLTIuNjIgN2wxLjYyLTQuMzNMMTkuMTIgMTdoLTMuMjR6IiAvPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZmxhdCI+PHBhdGggZD0iTTIyIDEybC00LTR2M0gzdjJoMTV2M3oiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctdXAiPjxwYXRoIGQ9Ik0xNiA2bDIuMjkgMi4yOS00Ljg4IDQuODgtNC00TDIgMTYuNTkgMy40MSAxOGw2LTYgNCA0IDYuMy02LjI5TDIyIDEyVjZ6IiAvPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluLW5vdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0idW5hcmNoaXZlIj48cGF0aCBkPSJNMjAuNTUgNS4yMmwtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE1LjU1TDMuNDYgNS4yMkMzLjE3IDUuNTcgMyA2LjAxIDMgNi41VjE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OS0uMTctLjkzLS40NS0xLjI4ek0xMiA5LjVsNS41IDUuNUgxNHYyaC00di0ySDYuNUwxMiA5LjV6TTUuMTIgNWwuODItMWgxMmwuOTMgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6IiAvPjwvZz4KPGcgaWQ9InVuZm9sZC1sZXNzIj48cGF0aCBkPSJNNy40MSAxOC41OUw4LjgzIDIwIDEyIDE2LjgzIDE1LjE3IDIwbDEuNDEtMS40MUwxMiAxNGwtNC41OSA0LjU5em05LjE4LTEzLjE4TDE1LjE3IDQgMTIgNy4xNyA4LjgzIDQgNy40MSA1LjQxIDEyIDEwbDQuNTktNC41OXoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLW1vcmUiPjxwYXRoIGQ9Ik0xMiA1LjgzTDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6IiAvPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiIC8+PC9nPgo8ZyBpZD0idmVyaWZpZWQtdXNlciI+PHBhdGggZD0iTTEyIDFMMyA1djZjMCA1LjU1IDMuODQgMTAuNzQgOSAxMiA1LjE2LTEuMjYgOS02LjQ1IDktMTJWNWwtOS00em0tMiAxNmwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFnZW5kYSI+PHBhdGggZD0iTTIwIDEzSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6bTAtMTBIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6IiAvPjwvZz4KPGcgaWQ9InZpZXctY2Fyb3VzZWwiPjxwYXRoIGQ9Ik03IDE5aDEwVjRIN3YxNXptLTUtMmg0VjZIMnYxMXpNMTggNnYxMWg0VjZoLTR6IiAvPjwvZz4KPGcgaWQ9InZpZXctY29sdW1uIj48cGF0aCBkPSJNMTAgMThoNVY1aC01djEzem0tNiAwaDVWNUg0djEzek0xNiA1djEzaDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiIC8+PC9nPgo8ZyBpZD0idmlldy1oZWFkbGluZSI+PHBhdGggZD0iTTQgMTVoMTZ2LTJINHYyem0wIDRoMTZ2LTJINHYyem0wLThoMTZWOUg0djJ6bTAtNnYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0idmlldy1saXN0Ij48cGF0aCBkPSJNNCAxNGg0di00SDR2NHptMCA1aDR2LTRINHY0ek00IDloNFY1SDR2NHptNSA1aDEydi00SDl2NHptMCA1aDEydi00SDl2NHpNOSA1djRoMTJWNUg5eiIgLz48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6IiAvPjwvZz4KPGcgaWQ9InZpZXctcXVpbHQiPjxwYXRoIGQ9Ik0xMCAxOGg1di02aC01djZ6bS02IDBoNVY1SDR2MTN6bTEyIDBoNXYtNmgtNXY2ek0xMCA1djZoMTFWNUgxMHoiIC8+PC9nPgo8ZyBpZD0idmlldy1zdHJlYW0iPjxwYXRoIGQ9Ik00IDE4aDE3di02SDR2NnpNNCA1djZoMTdWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eS1vZmYiPjxwYXRoIGQ9Ik0xMiA3YzIuNzYgMCA1IDIuMjQgNSA1IDAgLjY1LS4xMyAxLjI2LS4zNiAxLjgzbDIuOTIgMi45MmMxLjUxLTEuMjYgMi43LTIuODkgMy40My00Ljc1LTEuNzMtNC4zOS02LTcuNS0xMS03LjUtMS40IDAtMi43NC4yNS0zLjk4LjdsMi4xNiAyLjE2QzEwLjc0IDcuMTMgMTEuMzUgNyAxMiA3ek0yIDQuMjdsMi4yOCAyLjI4LjQ2LjQ2QzMuMDggOC4zIDEuNzggMTAuMDIgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41IDEuNTUgMCAzLjAzLS4zIDQuMzgtLjg0bC40Mi40MkwxOS43MyAyMiAyMSAyMC43MyAzLjI3IDMgMiA0LjI3ek03LjUzIDkuOGwxLjU1IDEuNTVjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42NiAxLjM0IDMgMyAzIC4yMiAwIC40NC0uMDMuNjUtLjA4bDEuNTUgMS41NWMtLjY3LjMzLTEuNDEuNTMtMi4yLjUzLTIuNzYgMC01LTIuMjQtNS01IDAtLjc5LjItMS41My41My0yLjJ6bTQuMzEtLjc4bDMuMTUgMy4xNS4wMi0uMTZjMC0xLjY2LTEuMzQtMy0zLTNsLS4xNy4wMXoiIC8+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0id2F0Y2gtbGF0ZXIiPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNC4yIDE0LjJMMTEgMTNWN2gxLjV2NS4ybDQuNSAyLjctLjggMS4zeiIgLz48L2c+CjxnIGlkPSJ3ZWVrZW5kIj48cGF0aCBkPSJNMjEgMTBjLTEuMSAwLTIgLjktMiAydjNINXYtM2MwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJ2NWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi01YzAtMS4xLS45LTItMi0yem0tMy01SDZjLTEuMSAwLTIgLjktMiAydjIuMTVjMS4xNi40MSAyIDEuNTEgMiAyLjgyVjE0aDEydi0yLjAzYzAtMS4zLjg0LTIuNCAyLTIuODJWN2MwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiIgLz48L2c+CjxnIGlkPSJ5b3V0dWJlLXNlYXJjaGVkLWZvciI+PHBhdGggZD0iTTE3LjAxIDE0aC0uOGwtLjI3LS4yN2MuOTgtMS4xNCAxLjU3LTIuNjEgMS41Ny00LjIzIDAtMy41OS0yLjkxLTYuNS02LjUtNi41cy02LjUgMy02LjUgNi41SDJsMy44NCA0IDQuMTYtNEg2LjUxQzYuNTEgNyA4LjUzIDUgMTEuMDEgNXM0LjUgMi4wMSA0LjUgNC41YzAgMi40OC0yLjAyIDQuNS00LjUgNC41LS42NSAwLTEuMjYtLjE0LTEuODItLjM4TDcuNzEgMTUuMWMuOTcuNTcgMi4wOS45IDMuMy45IDEuNjEgMCAzLjA4LS41OSA0LjIyLTEuNTdsLjI3LjI3di43OWw1LjAxIDQuOTlMMjIgMTlsLTQuOTktNXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1pbiI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6bTIuNS00aC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6IiAvPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLW11bHRpLWNoZWNrYm94Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InJ1bi1jb2xvci1zdHlsZSI+PC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQgaWQ9Im5hbWVzLXJlZ2V4IiBuby1sYWJlbC1mbG9hdCBsYWJlbD0iV3JpdGUgYSByZWdleCB0byBmaWx0ZXIgcnVucyIgdmFsdWU9IltbcmVnZXhdXSIgb24tYmluZC12YWx1ZS1jaGFuZ2VkPSJfZGVib3VuY2VkUmVnZXhDaGFuZ2UiPjwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGlkPSJvdXRlci1jb250YWluZXIiIGNsYXNzPSJzY3JvbGxiYXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW25hbWVzTWF0Y2hpbmdSZWdleF1dIiBvbi1kb20tY2hhbmdlPSJzeW5jaHJvbml6ZUNvbG9ycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmFtZS1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgY2hlY2tib3gtY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIiBpZCQ9ImNoZWNrYm94LVtbaXRlbV1dIiBuYW1lPSJbW2l0ZW1dXSIgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIiBvbi1jaGFuZ2U9Il9jaGVja2JveENoYW5nZSI+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJyYWRpby1idXR0b24tdW5jaGVja2VkIiBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIiBvbi10YXA9Il9pc29sYXRlTmFtZSIgbmFtZT0iW1tpdGVtXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbGFiZWwtY29udGFpbmVyIj4KICAgICAgICAgICAgPHNwYW4+W1tpdGVtXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgI291dGVyLWNvbnRhaW5lciB7CiAgICAgICAgY29udGFpbjogY29udGVudDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLm5hbWUtcm93IHsKICAgICAgICBjb250YWluOiBjb250ZW50OwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgLyogbWFrZXMgd3JhcHBpbmcgb2YgaHlwZXJwYXJhbSBzdHJpbmdzIGJldHRlciAqLwogICAgICB9CiAgICAgIC5pY29uLWNvbnRhaW5lciB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC5jaGVja2JveCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvciB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQogICAgICAuaXNvbGF0b3ItY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDZweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94LWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLml0ZW0tbGFiZWwtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDBweDsgLyogaGFjayB0byBnZXQgdGhlIGZsZXgtZ3JvdyB0byB3b3JrIHByb3Blcmx5ICovCiAgICAgIH0KICAgICAgLnRvb2x0aXAtdmFsdWUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAudmVydGljYWwtYWxpZ24tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLWNlbnRlciB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLXRvcCB7CiAgICAgICAgYWxpZ24tc2VsZjogc3RhcnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi13YnItc3RyaW5nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3BhcnRzXV0iIGFzPSJwYXJ0Ij5bW3BhcnRdXTx3YnI+PC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXJ1bnMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iZGF0YS1sb2NhdGlvbi1kaWFsb2ciPgogICAgICA8aDI+RGF0YSBMb2NhdGlvbjwvaDI+CiAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW2RhdGFMb2NhdGlvbl1dIiBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIiAvPgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8ZGl2IGlkPSJ0b3AtdGV4dCI+CiAgICAgIDxoMyBpZD0idG9vbHRpcC1oZWxwIiBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPlJ1bnM8L2gzPgogICAgPC9kaXY+CiAgICA8dGYtbXVsdGktY2hlY2tib3ggaWQ9Im11bHRpQ2hlY2tib3giIG5hbWVzPSJbW3J1bnNdXSIgc2VsZWN0aW9uLXN0YXRlPSJ7e3J1blNlbGVjdGlvblN0YXRlfX0iIG91dC1zZWxlY3RlZD0ie3tzZWxlY3RlZFJ1bnN9fSIgcmVnZXg9Int7cmVnZXhJbnB1dH19IiBjb2xvcmluZz0iW1tjb2xvcmluZ11dIj48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX2NsaXBwZWREYXRhTG9jYXRpb25dXSIgZGVsaW1pdGVyLXBhdHRlcm49IltbX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm5dXSI+PC90Zi13YnItc3RyaW5nPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLWxpdGUiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNwaW5uZXJDb250YWluZXIiIGNsYXNzLW5hbWU9IltbX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlcyhhY3RpdmUsIF9fY29vbGluZ0Rvd24pXV0iIG9uLWFuaW1hdGlvbmVuZD0iX19yZXNldCIgb24td2Via2l0LWFuaW1hdGlvbi1lbmQ9Il9fcmVzZXQiPgogICAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGxvdHRhYmxlLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2ei1jaGFydC10b29sdGlwIj4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2ei1wYW4tem9vbS1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuaGVscCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IDFzOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMXM7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhZGUtb3V0OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDMwLCAzMCwgMC42KTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CgogICAgICAuaGVscCA+IHNwYW4gewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZS1vdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQoKICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydDIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICAgIDx2ei1jaGFydC10b29sdGlwIGlkPSJ0b29sdGlwIiBwb3NpdGlvbj0iW1t0b29sdGlwUG9zaXRpb25dXSIgY29udGVudC1jb21wb25lbnQtbmFtZT0idnotbGluZS1jaGFydC10b29sdGlwIj48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIC5tYWluIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgIDx0YWJsZT4KICAgICAgICA8dGhlYWQ+PC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CgogICAgICB0aGVhZCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICB0Ym9keSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIHRkIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgfQoKICAgICAgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgfQoKICAgICAgLmNsb3Nlc3QgLnN3YXRjaCB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICNmZmY7CiAgICAgIH0KCiAgICAgIHRoIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuZGlzdGFudCB0ZDpub3QoLnN3YXRjaCkgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLmdob3N0IHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNjcm9sbGFibGUiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCguaXMtc2Nyb2xsZWQ6bm90KDpmaXJzdC1jaGlsZCkpOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhbi1zY3JvbGw6bm90KC5zY3JvbGxlZC10by1ib3R0b20pOm5vdCg6bGFzdC1jaGlsZCkpOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICAuc2Nyb2xsYWJsZSB7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtc2Nyb2xsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlOwogICAgICB9CgogICAgICAuZml0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNjcm9sbGFibGUiIGNsYXNzPSJzY3JvbGxhYmxlIiBvbi1zY3JvbGw9InVwZGF0ZVNjcm9sbFN0YXRlIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtbWFya2Rvd24tdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0ibWFya2Rvd24iIGlubmVyLWgtdC1tLWw9IltbaHRtbF1dIj48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLyoKICAgICAgICogUmVkdWNlIHRvcG1vc3QgYW5kIGJvdHRvbW1vc3QgbWFyZ2lucyBmcm9tIDE2cHggdG8gMC4zZW0gKHJlbmRlcnMKICAgICAgICogYXQgYWJvdXQgNC44cHgpIHRvIGtlZXAgdGhlIGxheW91dCBjb21wYWN0LiBUaGlzIGltcHJvdmVzIHRoZQogICAgICAgKiBhcHBlYXJhbmNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgbGluZSBvZiB0ZXh0OyBzdGFuZGFyZCBNYXJrZG93bgogICAgICAgKiByZW5kZXJlcnMgd2lsbCBzdGlsbCBpbmNsdWRlIGEgYDxwPmAgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQnkgdGFyZ2V0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCwgZXh0cmVtYWwgZWxlbWVudHMsIHdlIHByZXNlcnZlIGFueQogICAgICAgKiBhY3R1YWwgcGFyYWdyYXBoIGJyZWFrcyBhbmQgb25seSBjaGFuZ2UgdGhlIHBhZGRpbmcgYWdhaW5zdCB0aGUKICAgICAgICogY29tcG9uZW50IGVkZ2VzLgogICAgICAgKi8KICAgICAgI21hcmtkb3duID4gcDpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMC4zZW07CiAgICAgIH0KICAgICAgI21hcmtkb3duID4gcDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjNlbTsKICAgICAgfQoKICAgICAgLyogUGxlYXNhbnQgc3R5bGVzIGZvciBNYXJrZG93biB0YWJsZXMuICovCiAgICAgICNtYXJrZG93biB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGggewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoLAogICAgICAjbWFya2Rvd24gdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDZweCAxM3B4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmUyZTU7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYzZjYmQxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRvd25sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0icnVuIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19ydW59fSI+CiAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcnVuc11dIj4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1bl1dIj4KICAgICAgPGEgZG93bmxvYWQ9IltbX2Nzdk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19jc3ZVcmwodGFnLCBfcnVuLCB1cmxGbildXSI+Q1NWPC9hPjxhIGRvd25sb2FkPSJbW19qc29uTmFtZSh0YWcsIF9ydW4pXV0iIGhyZWY9IltbX2pzb25VcmwodGFnLCBfcnVuLCB1cmxGbildXSI+SlNPTjwvYT4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICBhIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtOwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBjb2xvci1zY2FsZT0iW1tfZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKV1dIiBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iIGRhdGEtdG8tbG9hZD0iW1tkYXRhVG9Mb2FkXV0iIGdldC1kYXRhLWxvYWQtbmFtZT0iW1tfZ2V0RGF0YUxvYWROYW1lXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iIHJlcXVlc3QtZGF0YT0iW1tyZXF1ZXN0RGF0YV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iIGxvYWQta2V5PSJbW3RhZ11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXBvc2l0aW9uPSJhdXRvIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPHBhcGVyLW1lbnUtYnV0dG9uIG9uLXBhcGVyLWRyb3Bkb3duLW9wZW49Il91cGRhdGVEb3dubG9hZExpbmsiPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIiBpY29uPSJmaWxlLWRvd25sb2FkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICA8YSBpZD0ic3ZnTGluayIgZG93bmxvYWQ9IltbdGFnXV0uc3ZnIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIEN1cnJlbnQgQ2hhcnQgYXMgU1ZHCiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHRmLWRvd25sb2FkZXIgcnVucz0iW1tfcnVuc0Zyb21EYXRhKGRhdGFUb0xvYWQpXV0iIHRhZz0iW1t0YWddXSIgdXJsLWZuPSJbW19kb3dubG9hZFVybEZuXV0iPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXByb2dyZXNzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC8qIHRoZSBzdHJpcGUgZm9yIHRoZSBpbmRldGVybWluYXRlIGFuaW1hdGlvbiovCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQsIDRweCk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcywKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwoKICAgICAgICAvKiBEdXJhdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKCiAgICAgICAgLyogVGltaW5nIGZ1bmN0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CgogICAgICAgIC8qIERlbGF5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTEwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTUwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CgogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InByb2dyZXNzQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic2Vjb25kYXJ5UHJvZ3Jlc3MiIGhpZGRlbiQ9IltbX2hpZGVTZWNvbmRhcnlQcm9ncmVzcyhzZWNvbmRhcnlSYXRpbyldXSI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9InByaW1hcnlQcm9ncmVzcyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNsaWRlciI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS0zMDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodDogdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwgMnB4KTsKICAgICAgfQoKICAgICAgLyogZm9jdXMgc2hvd3MgdGhlIHJpcHBsZSAqLwogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IFRob3VnaCA6aG9zdC1jb250ZXh0IGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsIHNvbWUgcGFnZXMKICAgICAgICogc3RpbGwgcmVseSBvbiBwYXBlci1zbGlkZXIgYmVpbmcgZmxpcHBlZCB3aGVuIGRpcj0icnRsIiBpcyBzZXQgb24gYm9keS4gRm9yIGZ1bGwKICAgICAgICogY29tcGF0YWJpbGl0eSwgZGlyPSJydGwiIG11c3QgYmUgZXhwbGljaXRseSBzZXQgb24gcGFwZXItc2xpZGVyLgogICAgICAgKi8KICAgICAgOmRpcihydGwpICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlIHJ1bGUgYWJvdmUgYmVjYXVzZSA6aG9zdC1jb250ZXh0IG1heQogICAgICAgKiBub3QgYmUgcmVjb2duaXplZC4KICAgICAgICovCiAgICAgIDpob3N0KFtkaXI9InJ0bCJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogTmVlZGVkIHRvIG92ZXJyaWRlIHRoZSA6aG9zdC1jb250ZXh0IHJ1bGUgKHdoZXJlIHN1cHBvcnRlZCkKICAgICAgICogdG8gc3VwcG9ydCBMVFIgc2xpZGVycyBpbiBSVEwgcGFnZXMuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJsdHIiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiAwOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyLmVkaXRhYmxlIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC5iYXItY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5yaW5nID4gLmJhci1jb250YWluZXIgewogICAgICAgIGxlZnQ6IGNhbGMoNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMThzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5yaW5nLmV4cGFuZC5kcmFnZ2luZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQ6bm90KC5waW4pID4gLmJhci1jb250YWluZXIgewogICAgICAgIGxlZnQ6IGNhbGMoOHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckJhciB7CiAgICAgICAgcGFkZGluZzogMTVweCAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1iYXItY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgfQoKICAgICAgLnNsaWRlci1tYXJrZXJzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiBjYWxjKDE0cHggKyB2YXIoLS1wYXBlci1zbGlkZXItaGVpZ2h0LDJweCkvMik7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IC0xcHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgLnNsaWRlci1tYXJrZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CiAgICAgIC5zbGlkZXItbWFya2Vyczo6YWZ0ZXIsCiAgICAgIC5zbGlkZXItbWFya2VyOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7CiAgICAgICAgd2lkdGg6IDJweDsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoLTE1cHggLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIHdpZHRoOiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICB9CgogICAgICAudHJhbnNpdGluZyA+IC5zbGlkZXIta25vYiB7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjA4cyBlYXNlOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2I6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnNuYXBzID4gLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKCiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xOHM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgIH0KCiAgICAgIC5leHBhbmQ6bm90KC5waW4pID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgIH0KCiAgICAgIC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTNweDsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlIDUwJSA1MCUgMDsKCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUsCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5waW4ucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgIH0KCiAgICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiBhdHRyKHZhbHVlKTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE2cHg7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWZvbnQtY29sb3IsICNmZmYpOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgIH0KCiAgICAgIC8qIHBhcGVyLWlucHV0ICovCiAgICAgIC5zbGlkZXItaW5wdXQgewogICAgICAgIHdpZHRoOiA1MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dC1jb250YWluZXItaW5wdXQ7CiAgICAgICAgfTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQ7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCiAgICAgICNzbGlkZXJDb250YWluZXIuZGlzYWJsZWQgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuZGlzYWJsZWQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2xpZGVyQ29udGFpbmVyIiBjbGFzcyQ9IltbX2dldENsYXNzTmFtZXMoZGlzYWJsZWQsIHBpbiwgc25hcHMsIGltbWVkaWF0ZVZhbHVlLCBtaW4sIGV4cGFuZCwgZHJhZ2dpbmcsIHRyYW5zaXRpbmcsIGVkaXRhYmxlKV1dIj4KICAgICAgPGRpdiBjbGFzcz0iYmFyLWNvbnRhaW5lciI+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBpZD0ic2xpZGVyQmFyIiBhcmlhLWhpZGRlbj0idHJ1ZSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIHN0ZXA9Iltbc3RlcF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBzZWNvbmRhcnktcHJvZ3Jlc3M9Iltbc2Vjb25kYXJ5UHJvZ3Jlc3NdXSIgb24tZG93bj0iX2JhcmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX2JhcnRyYWNrIiBvbi10YXA9Il9iYXJjbGljayI+CiAgICAgICAgPC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc25hcHNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlcnMiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttYXJrZXJzXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VyIj48L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8ZGl2IGlkPSJzbGlkZXJLbm9iIiBjbGFzcz0ic2xpZGVyLWtub2IiIG9uLWRvd249Il9rbm9iZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfb25UcmFjayIgb24tdHJhbnNpdGlvbmVuZD0iX2tub2JUcmFuc2l0aW9uRW5kIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1rbm9iLWlubmVyIiB2YWx1ZSQ9IltbaW1tZWRpYXRlVmFsdWVdXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VkaXRhYmxlXV0iPgogICAgICA8cGFwZXItaW5wdXQgaWQ9ImlucHV0IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgY2xhc3M9InNsaWRlci1pbnB1dCIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIG9uLWNoYW5nZT0iX2NoYW5nZVZhbHVlIiBvbi1rZXlkb3duPSJfaW5wdXRLZXlEb3duIiBuby1sYWJlbC1mbG9hdD4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtc21vb3RoaW5nLWlucHV0Ij4KICA8dGVtcGxhdGU+CiAgICA8aDMgY2xhc3M9InRpdGxlIj5TbW9vdGhpbmc8L2gzPgogICAgPGRpdiBjbGFzcz0ic21vb3RoaW5nLWJsb2NrIj4KICAgICAgPHBhcGVyLXNsaWRlciBpZD0ic2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7X2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyfX0iIG1heD0iW1ttYXhdXSIgbWluPSJbW21pbl1dIiBwaW4gc3RlcD0iW1tzdGVwXV0iIHR5cGU9Im51bWJlciIgdmFsdWU9Int7d2VpZ2h0fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICA8cGFwZXItaW5wdXQgaWQ9ImlucHV0IiBsYWJlbD0id2VpZ2h0IiBuby1sYWJlbC1mbG9hdCB2YWx1ZT0ie3tfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0fX0iIHR5cGU9Im51bWJlciIgc3RlcD0iW1tzdGVwXV0iIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIj48L3BhcGVyLWlucHV0PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAuc21vb3RoaW5nLWJsb2NrIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBmbGV4LWdyb3c6IDI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9InNob3ctZG93bmxvYWQtbGlua3MiIGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iPlNob3cgZGF0YSBkb3dubG9hZCBsaW5rczwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBpZD0iaWdub3JlLXktb3V0bGllciIgY2hlY2tlZD0ie3tfaWdub3JlWU91dGxpZXJzfX0iPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgICAgPGRpdj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVmYXVsdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5uZWFyZXN0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1zbW9vdGhpbmctaW5wdXQgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIgc3RlcD0iMC4wMDEiIG1pbj0iMCIgbWF4PSIwLjk5OSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBzY2FsYXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgZGF0YS10by1sb2FkPSJbW2l0ZW0uc2VyaWVzXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgbXVsdGktZXhwZXJpbWVudHM9IltbX2dldE11bHRpRXhwZXJpbWVudHMoZGF0YVNlbGVjdGlvbildXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShjYXRlZ29yeSwgX3J1blRvVGFnSW5mbywgaXRlbSldXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbX3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSI+PC90Zi1zY2FsYXItY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgLmNlbnRlciB7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgfQoKICAgICAgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMTlweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNidXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBpZD0ibG9hZGVyIiBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tfZGF0YVVybF1dIiBmaWxsLWFyZWE9IltbX2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihtYXJnaW5DaGFydFNlcmllcyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0iZGF0YVNlcmllc05hbWUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uY3N2IiBocmVmPSJbW19jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkNTVjwvYT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5qc29uIiBocmVmPSJbW19qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5KU09OPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21pc3NpbmdUYWdzLmxlbmd0aF1dIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNaXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbiIgY2xhc3M9InRvZ2dsZS1jb2xsYXBzaWJsZS1idXR0b24iPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+IE1pc3NpbmcgVGFncwogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21pc3NpbmdUYWdzXV0iIGFzPSJtaXNzaW5nRW50cnkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIiPgogICAgICAgICAgICAgIFJ1biAiW1ttaXNzaW5nRW50cnkucnVuXV0iIGxhY2tzIGRhdGEgZm9yIHRhZ3MKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21pc3NpbmdFbnRyeS50YWdzXV0iIGFzPSJ0YWciPgogICAgICAgICAgICAgICAgICA8bGk+W1t0YWddXTwvbGk+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0ZpbHRlckludmFsaWRdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGlzIHJlZ3VsYXIgZXhwcmVzaW9uIGlzIGludmFsaWQ6PGJyPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbnZhbGlkLXJlZ2V4Ij5bW190YWdGaWx0ZXJdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RlcHNNaXNtYXRjaF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoZSBzdGVwcyBmb3IgdmFsdWUsIGxvd2VyLCBhbmQgdXBwZXIgdGFncyBkbyBub3QgbWF0Y2g6CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnZhbHVlXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudmFsdWVTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC5sb3dlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLmxvd2VyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudXBwZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC51cHBlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9InNlcmllc05hbWUiIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuZXJyb3ItY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogI2YwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIG1hcmdpbjogMCBhdXRvIDVweCBhdXRvOwogICAgICB9CgogICAgICAuaW52YWxpZC1yZWdleCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5lcnJvci1jb250ZW50IHVsIHsKICAgICAgICBtYXJnaW46IDFweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxOXB4OwogICAgICB9CgogICAgICAudGFnLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS10aXRsZS10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAjbWF0Y2hlcy1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubWF0Y2gtbGlzdC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5tYXRjaC1lbnRyeS1zeW1ib2wgewogICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5taXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogOHB4IDAgMCAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e190b29sdGlwU29ydGluZ01ldGhvZH19Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2F0ZWdvcmllcy1jb250YWluZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPlRoZSBjdXN0b20gc2NhbGFycyBkYXNoYm9hcmQgaXMgaW5hY3RpdmUuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZCBpbXBvcnQgc3VtbWFyeQpmcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuY3VzdG9tX3NjYWxhciBpbXBvcnQgbGF5b3V0X3BiMgouLi4KIyBUaGlzIGFjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCBldmVyeSBzdGVwLCBzbyB0aGUgYWN0aW9uIGlzIG5vdAojIHRha2VuIGNhcmUgb2YgYnkgYW4gb3AgaW4gdGhlIGdyYXBoLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UKIyAoaW5zdGVhZCBvZiBwZXIgc3RlcCkuCmxheW91dF9zdW1tYXJ5ID0gc3VtbWFyeV9saWIuY3VzdG9tX3NjYWxhcl9wYihsYXlvdXRfcGIyLkxheW91dCgKICBjYXRlZ29yeT1bCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3InbG9zcy4qJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdiYXonLAogICAgICAgICAgICAgIG1hcmdpbj1sYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHNlcmllcz1bCiAgICAgICAgICAgICAgICAgIGxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50LlNlcmllcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nbG9zcy9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIGxvd2VyPSdiYXpfbG93ZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICB1cHBlcj0nYmF6X3VwcGVyL2Jhei9zY2FsYXJfc3VtbWFyeScpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSksCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0ndHJpZyBmdW5jdGlvbnMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd3YXZlIHRyaWcgZnVuY3Rpb25zJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy9jb3NpbmUnLCByJ3RyaWdGdW5jdGlvbnMvc2luZSddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdGFuZ2VudCBpcyBkaWZmZXJlbnQuIExldCdzIGdpdmUgaXQgaXRzIG93biBjaGFydC4KICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3RhbicsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvdGFuZ2VudCddLAogICAgICAgICAgICAgICkpLAogICAgICBdLAogICAgICAjIFRoaXMgY2F0ZWdvcnkgd2UgY2FyZSBsZXNzIGFib3V0LiBMZXQncyBtYWtlIGl0IGluaXRpYWxseSBjbG9zZWQuCiAgICAgIGNsb3NlZD1UcnVlKSwKICBdKSkKd3JpdGVyLmFkZF9zdW1tYXJ5KGxheW91dF9zdW1tYXJ5KQo8L3ByZT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgYXM9ImNoYXJ0IiBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBkaXNhYmxlLXBhZ2luYXRpb24gaW5pdGlhbC1vcGVuZWQ9IltbY2F0ZWdvcnkubWV0YWRhdGEub3BlbmVkXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tdWx0aWxpbmVdXSI+CiAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm1hcmdpbl1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaW1hZ2UtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2PnNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbX3RvTG9jYWxlU3RyaW5nKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBkYXRldGltZSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzSW1hZ2VMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHNdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KCiAgICAKICAgIDxhIGlkPSJtYWluLWltYWdlLWNvbnRhaW5lciIgcm9sZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJUb2dnbGUgYWN0dWFsIHNpemUiIGFyaWEtZXhwYW5kZWQkPSJbW19nZXRBcmlhRXhwYW5kZWQoYWN0dWFsU2l6ZSldXSIgb24tdGFwPSJfaGFuZGxlVGFwIj48L2E+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIC8qKiBNYWtlIGJ1dHRvbiBhIGRpdi4gKi8KICAgICAgYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogR2V0IHJpZCBvZiBkb3R0ZWQgbGluZSBpbnNpZGUgYnV0dG9uLiAqLwogICAgICBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogU2ltdWxhdGUgQ2hyb21lJ3Mgb3V0ZXIgZ2xvdyBvbiBidXR0b24gd2hlbiBmb2N1c2VkLiAqLwogICAgICBidXR0b246LW1vei1mb2N1c3JpbmcgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggMnB4IEhpZ2hsaWdodDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzNTBweDsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMCAxNXB4IDQwcHggMDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAvKiogV2hlbiBhY3R1YWwgc2l6ZSBzaG93biBpcyBvbiwgdXNlIHRoZSBhY3R1YWwgaW1hZ2Ugd2lkdGguICovCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogbm9uZTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLXNwaW5uZXItbGl0ZSB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIC8qCiAgICAgICAgICogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZQogICAgICAgICAqIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcgMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMKICAgICAgICAgKiB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLCBhbmQKICAgICAgICAgKiBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mCiAgICAgICAgICogdGhlIGltYWdlLiAzMCAtIDEgKyAyLgogICAgICAgICAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogMTAyNHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiAtbW96LWNyaXNwLWVkZ2VzOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1pbWFnZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19hY3R1YWxTaXplfX0iPlNob3cgYWN0dWFsIGltYWdlIHNpemU8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGgzIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+QnJpZ2h0bmVzcyBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSIyIiBzbmFwcyBwaW4gc3RlcD0iMC4wMSIgdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iIGltbWVkaWF0ZS12YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0QnJpZ2h0bmVzcyIgZGlzYWJsZWQ9IltbX2JyaWdodG5lc3NJc0RlZmF1bHRdXSI+UmVzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIiPgogICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIwIiBtYXg9IjUwMCIgc25hcHMgcGluIHN0ZXA9IjEiIHZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSIgaW1tZWRpYXRlLXZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYXVkaW8tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IgaWQ9InJ1bnMtc2VsZWN0b3IiIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij48L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gYXVkaW8gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGF1ZGlvIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtYXVkaW8tbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgdG90YWwtc2FtcGxlcz0iW1tpdGVtLnRvdGFsU2FtcGxlc11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWF1ZGlvLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIC1tb3otYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0YXJlYTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubWlycm9yLXRleHQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQoKICAgICAgdGV4dGFyZWEgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICByZXNpemU6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAvKiBzZWUgY29tbWVudHMgaW4gdGVtcGxhdGUgKi8KICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0OwogICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYTsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgCiAgICAKICAgIDxkaXYgaWQ9Im1pcnJvciIgY2xhc3M9Im1pcnJvci10ZXh0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+CgogICAgCiAgICA8ZGl2IGNsYXNzPSJ0ZXh0YXJlYS1jb250YWluZXIgZml0Ij4KICAgICAgPHRleHRhcmVhIGlkPSJ0ZXh0YXJlYSIgbmFtZSQ9IltbbmFtZV1dIiBhcmlhLWxhYmVsJD0iW1tsYWJlbF1dIiBhdXRvY29tcGxldGUkPSJbW2F1dG9jb21wbGV0ZV1dIiBhdXRvZm9jdXMkPSJbW2F1dG9mb2N1c11dIiBpbnB1dG1vZGUkPSJbW2lucHV0bW9kZV1dIiBwbGFjZWhvbGRlciQ9IltbcGxhY2Vob2xkZXJdXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgcm93cyQ9Iltbcm93c11dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIj48L3RleHRhcmVhPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci10ZXh0YXJlYSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBsYWJlbCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWlucHV0LWNvbnRhaW5lciBuby1sYWJlbC1mbG9hdCQ9Iltbbm9MYWJlbEZsb2F0XV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1tfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWwoYWx3YXlzRmxvYXRMYWJlbCxwbGFjZWhvbGRlcildXSIgYXV0by12YWxpZGF0ZSQ9IltbYXV0b1ZhbGlkYXRlXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBpbnZhbGlkPSJbW2ludmFsaWRdXSI+CgogICAgICA8bGFiZWwgaGlkZGVuJD0iW1shbGFiZWxdXSIgYXJpYS1oaWRkZW49InRydWUiIGZvciQ9IltbX2lucHV0SWRdXSIgc2xvdD0ibGFiZWwiPltbbGFiZWxdXTwvbGFiZWw+CgogICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcz0icGFwZXItaW5wdXQtaW5wdXQiIHNsb3Q9ImlucHV0IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBiaW5kLXZhbHVlPSJ7e3ZhbHVlfX0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3IkPSJbW3ZhbGlkYXRvcl1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbmFtZSQ9IltbbmFtZV1dIiBwbGFjZWhvbGRlciQ9IltbcGxhY2Vob2xkZXJdXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBhdXRvY2FwaXRhbGl6ZSQ9IltbYXV0b2NhcGl0YWxpemVdXSIgcm93cyQ9Iltbcm93c11dIiBtYXgtcm93cyQ9IltbbWF4Um93c11dIiBvbi1jaGFuZ2U9Il9vbkNoYW5nZSI+PC9pcm9uLWF1dG9ncm93LXRleHRhcmVhPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtbWluaW1hcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGxpbmVhcjsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoLmhpZGRlbikgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIGNhbnZhcyB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKICAgICAgfQoKICAgICAgcmVjdCB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjMTExMTExOwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWx0ZXI6IHVybCgjbWluaW1hcERyb3BTaGFkb3cpOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3ZnPgogICAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJtaW5pbWFwRHJvcFNoYWRvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE1MCUiIGhlaWdodD0iMTUwJSI+CiAgICAgICAgICA8ZmVvZmZzZXQgcmVzdWx0PSJvZmZPdXQiIGluPSJTb3VyY2VHcmFwaGljIiBkeD0iMSIgZHk9IjEiPjwvZmVvZmZzZXQ+CiAgICAgICAgICA8ZmVjb2xvcm1hdHJpeCByZXN1bHQ9Im1hdHJpeE91dCIgaW49Im9mZk91dCIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuNSAwIj48L2ZlY29sb3JtYXRyaXg+CiAgICAgICAgICA8ZmVnYXVzc2lhbmJsdXIgcmVzdWx0PSJibHVyT3V0IiBpbj0ibWF0cml4T3V0IiBzdGRkZXZpYXRpb249IjIiPjwvZmVnYXVzc2lhbmJsdXI+CiAgICAgICAgICA8ZmVibGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJibHVyT3V0IiBtb2RlPSJub3JtYWwiPjwvZmVibGVuZD4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICA8cmVjdD48L3JlY3Q+CiAgICA8L3N2Zz4KICAgIDxjYW52YXMgY2xhc3M9ImZpcnN0Ij48L2NhbnZhcz4KICAgIAogICAgPGNhbnZhcyBjbGFzcz0ic2Vjb25kIj48L2NhbnZhcz4KICAgIDxjYW52YXMgY2xhc3M9ImRvd25sb2FkIj48L2NhbnZhcz4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBuby1jYW5jZWwtb24tb3V0c2lkZS1jbGljayBuby1jYW5jZWwtb24tZXNjLWtleSBvcGVuZWQ9Int7X29wZW59fSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1tZXNzYWdlIj5bW19jdXN0b21NZXNzYWdlXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzQ3VzdG9tTWVzc2FnZV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbi10aXRsZSI+CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL1Nlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPnRmLlNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKc2VzcyA9IHRmLlNlc3Npb24oKQpzZXNzID0gdGZfZGVidWcuVGVuc29yQm9hcmREZWJ1Z1dyYXBwZXJTZXNzaW9uKHNlc3MsICJbW19ob3N0XV06W1tfcG9ydF1dIikKc2Vzcy5ydW4obXlfZmV0Y2hlcykKICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9wcm9ncmFtbWVyc19ndWlkZS9lc3RpbWF0b3JzIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj5Fc3RpbWF0b3I8L2E+CiAgICAgICAgICAgICAgfAogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi90cmFpbi9Nb25pdG9yZWRTZXNzaW9uIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj5Nb25pdG9yZWRTZXNzaW9uPC9hPjoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtc25pcHBldCI+aW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKZnJvbSB0ZW5zb3JmbG93LnB5dGhvbiBpbXBvcnQgZGVidWcgYXMgdGZfZGVidWcKCmhvb2sgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnSG9vaygiW1tfaG9zdF1dOltbX3BvcnRdXSIpCm15X2VzdGltYXRvci5maXQoeD14X2RhdGEsIHk9eV9kYXRhLCBzdGVwcz0xMDAwLCBtb25pdG9ycz1baG9va10pCiAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2tlcmFzLmlvL21vZGVscy9tb2RlbC8iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPktlcmFzIE1vZGVsPC9hPjoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtc25pcHBldCI+aW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKZnJvbSB0ZW5zb3JmbG93LnB5dGhvbiBpbXBvcnQgZGVidWcgYXMgdGZfZGVidWcKaW1wb3J0IGtlcmFzCgprZXJhcy5iYWNrZW5kLnNldF9zZXNzaW9uKAogICAgdGZfZGVidWcuVGVuc29yQm9hcmREZWJ1Z1dyYXBwZXJTZXNzaW9uKHRmLlNlc3Npb24oKSwgIltbX2hvc3RdXTpbW19wb3J0XV0iKSkKIyBEZWZpbmUgeW91ciBrZXJhcyBtb2RlbCwgY2FsbGVkICJtb2RlbCIuCm1vZGVsLmZpdCguLi4pCiAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZT4KICAgICAgLyoqIFdlIHJlbHkgb24gYSBzZXBhcmF0ZSBgX2hpZGRlbmAgcHJvcGVydHkgaW5zdGVhZCBvZiBkaXJlY3RseSBtYWtpbmcgdXNlCiAgICAgICAgICBvZiB0aGUgYF9vcGVuYCBhdHRyaWJ1dGUgYmVjYXVzZSB0aGlzIENTUyBzcGVjaWZpY2F0aW9uIG1heSBzdHJhbmdlbHkKICAgICAgICAgIGFmZmVjdCBvdGhlciBlbGVtZW50cyB0aHJvdWdob3V0IFRlbnNvckJvYXJkLiBTZWUgIzg5OS4gKi8KICAgICAgOmhvc3QoW19oaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICA6aG9zdCwKICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICB9CgogICAgICAuY29kZS1leGFtcGxlIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgfQogICAgICAuY29kZS1leGFtcGxlLXNlY3Rpb24gewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmNvZGUtc25pcHBldCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLXJlc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImJhcnMiPgogICAgICA8ZGl2IGNsYXNzPSJiYXJzLXJvdGF0b3IiPgogICAgICAgIDxzcGFuIGNsYXNzPSJiYXJzLXRleHQiPnwgfDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW19yZXNpemVyLWlkZW50aWZpZXJdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpcy1ob3Jpem9udGFsXSkgewogICAgICAgIGN1cnNvcjogcm93LXJlc2l6ZTsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW19pcy12ZXJ0aWNhbF0pIHsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgcmlnaHQ6IC0xNXB4OwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5iYXJzIHsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICB9CgogICAgICAvKiogVGhpcyBibG9jayBwcmV2ZW50cyB0aGUgYmFycyByb3RhdG9yIGZyb20gaGF2aW5nIGEgaGVpZ2h0IHRoYXQgaXMKICAgICAgICAgIHRoZSBlbnRpcmUgdmlld3BvcnQsIHRodXMgb2NjbHVkaW5nIGl0IGFuZCBnaXZpbmcgaXQgYW4gdW5kZXNpcmVkIGN1cnNvcgogICAgICAgICAgdmFsdWUuICovCiAgICAgIC5iYXJzLXJvdGF0b3IgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSAuYmFycy1yb3RhdG9yIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICAgIH0KCiAgICAgIC5iYXJzLXRleHQgewogICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKDE1KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0Ym9keT48dHIgYWxpZ249ImxlZnQiPgogICAgICAgICAgPHRoPkZlZWRzPC90aD4KICAgICAgICAgIDx0aD5GZXRjaGVzPC90aD4KICAgICAgICAgIDx0aD5UYXJnZXRzPC90aD4KICAgICAgICAgIDx0aD4jKERldmljZXMpPC90aD4KICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgPC90cj4KICAgICAgPC90Ym9keT48L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRlbnNvci13aWRnZXQtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8dnotbGluZS1jaGFydDIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfbGluZUNoYXJ0WENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW19saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX2xpbmVDaGFydFRvb2x0aXBDb2x1bW5zXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19saW5lQ2hhcnRTbW9vdGhpbmdFbmFibGVkXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICA8c3R5bGU+CiAgICAgIHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dGJvZHk+PHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIGlkPSJ0ZW5zb3ItbmFtZSIgb24tdGFwPSJ0ZW5zb3JOYW1lQ2FsbGJhY2siPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZW5zb3ItbmFtZS10ZXh0Ij5bW3RlbnNvck5hbWVdXTwvc3Bhbj4KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iY2xvc2UiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNsb3NlIiBvbi10YXA9ImNsb3NlQnV0dG9uQ2FsbGJhY2siPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJmb3J3YXJkIiBjbGFzcz0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgaWQ9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIHRpdGxlPSJDb250aW51ZSB0byIgb24tdGFwPSJjb250aW51ZVRvQnV0dG9uQ2FsbGJhY2siPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InRlbnNvci12YWx1ZS12YWx1ZS10ciI+CiAgICAgICAgPHRkPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW191c2VUZW5zb3JXaWRnZXRdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRlbnNvci13aWRnZXQiPjwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV91c2VUZW5zb3JXaWRnZXRdXSI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIGlkPSJkZWJ1Zy1vcCI+PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBjbGFzcz0iaW5saW5lIHZhbHVlLWNhcmQtaW5wdXQiIGxhYmVsPSJTbGljaW5nIiBpZD0ic2xpY2luZyIgdmFsdWU9Int7c2xpY2luZ319IiBvbi1jaGFuZ2U9InJlZnJlc2giPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBjbGFzcz0iaW5saW5lIHZhbHVlLWNhcmQtaW5wdXQiIGxhYmVsPSJUaW1lIEluZGljZXMiIGlkPSJ0aW1lLWluZGljZXMiIHZhbHVlPSJ7e3RpbWVJbmRpY2VzfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgaWQ9InRpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIiBjbGFzcz0idGVuc29yLXZhbHVlLWJ1dHRvbnMiIG9uLWNsaWNrPSJfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjayI+RnVsbCBIaXN0b3J5PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgIDwvZGl2PjwvdGVtcGxhdGU+PC90ZD48dGQgY2xhc3M9InRlbnNvci12YWx1ZS12aWV3LXRkIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNWYWx1ZVNjYWxhcl1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUiIGxhYmVsPSJTY2FsYXIgVmFsdWUiIGlkPSJ2YWx1ZS1zY2FsYXIiIHZhbHVlPSJbW19kYXRhU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNWYWx1ZUxpbmVDaGFydF1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQgZGF0YT0iW1tfbGluZUNoYXJ0RGF0YV1dIj48L3RmLWRlYnVnZ2VyLWxpbmUtY2hhcnQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlSW1hZ2VdXSI+CiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9InZhbHVlLWltYWdlIiBoZWlnaHQ9IjI1MHB4IiB3aWR0aD0iMjUwcHgiIHNyYyQ9IltbX2RhdGFJbWFnZVNyY11dIj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgCiAgICAgICAgICAKICAgICAgICAKICAgICAgPC90cj4KICAgIDwvdGJvZHk+PC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KFthbmltYXRlZF0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctdHJhbnNpdGlvbjsKICAgICAgfQogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1sZWdlbmQgaDIgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDEwcHggMTBweCAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLmNvbG9yLXByZXZpZXcgewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1hcmdpbjogMCAxMHB4IDAgMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1sYWJlbCwKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC50ZW5zb3ItY291bnQgewogICAgICAgIGNvbG9yOiAjNzc3OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNnB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKiAzMSBjb21lcyBmcm9tIGFkZGluZyBhIHBhZGRpbmcgb2YgMTVweCBmcm9tIGJvdGggc2lkZXMgb2YgdGhlIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcKICAgKiAxcHggc28gdGhhdCB0aGUgc2xpZGVyIHdpZHRoIGFsaWducyB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLAogICAqIGFuZCBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgKiBBcHBhcmVudGx5LCB0aGUgcGFwZXItc2xpZGVyIGxhY2tzIGEgbWl4aW4gZm9yIHRob3NlIHBhZGRpbmcgdmFsdWVzLiAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxscy1sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgdGQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSAuZmlyc3Qtb2ZmZW5zZS10ZCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAuZmlyc3Qtb2ZmZW5zZS10ZCB7CiAgICAgICAgd2lkdGg6IDgwcHg7CiAgICAgIH0KCiAgICAgIC50ZW5zb3ItZGV2aWNlLXRkIHsKICAgICAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLnRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLnRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5taW5pLWhlYWx0aC1waWxsIHsKICAgICAgICB3aWR0aDogMTMwcHg7CiAgICAgIH0KCiAgICAgIC5taW5pLWhlYWx0aC1waWxsID4gZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAjZXZlbnQtY291bnRzLXRoIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMTQxLCAwKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigwLCA2MiwgMjEyKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyMDQsIDQ3LCA0NCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uZWdhdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uLAogICAgICAucG9zaXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAxMHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQgaGVhbHRoLXBpbGwtbGVnZW5kIj4KICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgIEVuYWJsZSBhbGwgKG5vdCBqdXN0IHNhbXBsZWQpIHN0ZXBzLiBSZXF1aXJlcyBzbG93IGRpc2sgcmVhZC4KICAgICAgPC9kaXY+CiAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGlkPSJlbmFibGVBbGxTdGVwc01vZGVUb2dnbGUiIGNoZWNrZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19Ij4KICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8aDI+CiAgICAgICAgU3RlcCBvZiBIZWFsdGggUGlsbHM6CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQiIG1pbj0iMCIgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXA6OmlucHV0fX0iPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgW1tfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWVdXQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iIGlkPSJoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIj48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iPjwvcGFwZXItc2xpZGVyPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tYXhTdGVwSW5kZXhdXSI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8aDI+CiAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIENvdW50cyBmb3IgU2VsZWN0ZWQgTm9kZQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlXV0iPgogICAgICAgICAgTGVnZW5kCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1toZWFsdGhQaWxsRW50cmllc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1lbnRyeSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1wcmV2aWV3IiBzdHlsZT0iYmFja2dyb3VuZDpbW2l0ZW0uYmFja2dyb3VuZF9jb2xvcl1dIj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxhYmVsIj5bW2l0ZW0ubGFiZWxdXTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0idGVuc29yLWNvdW50Ij4KICAgICAgICAgICAgW1tfY29tcHV0ZVRlbnNvckNvdW50U3RyaW5nKGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUsCiAgICAgICAgICAgIGluZGV4KV1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBoaWRkZW4kPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPGgyIGlkPSJudW1lcmljLWFsZXJ0cy1oZWFkZXIiPk51bWVyaWMgQWxlcnRzPC9oMj4KICAgICAgICA8cD4KICAgICAgICAgIEFsZXJ0cyBhcmUgc29ydGVkIGZyb20gdG9wIHRvIGJvdHRvbSBieSBpbmNyZWFzaW5nIHRpbWVzdGFtcC4KICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIDwvcD4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJpcm9uLWxpc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1heC1kZXZpY2UtcGl4ZWwtcmF0aW86IDEpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWxpc3QtaXRlbXMtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZ3JpZF0pKSAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8YXJyYXktc2VsZWN0b3IgaWQ9InNlbGVjdG9yIiBpdGVtcz0ie3tpdGVtc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEl0ZW1zfX0iIHNlbGVjdGVkLWl0ZW09Int7c2VsZWN0ZWRJdGVtfX0iPjwvYXJyYXktc2VsZWN0b3I+CgogICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLWJvZHkiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47IC8qIG5lZWRlZCBmb3IgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgdG8gd29yayBvbiBmZiAqLwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R3by1saW5lXSkgewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS10d28tbGluZS1taW4taGVpZ2h0LCA3MnB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoW3RocmVlLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXRocmVlLWxpbmUtbWluLWhlaWdodCwgODhweCk7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKFtzZWNvbmRhcnldKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnktY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtc2l6ZTogMDsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QgewogICAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLWVsbGlwc2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QsCiAgICAgIC5mYWRlZC1lbGxpcHNlLAogICAgICAuZmFkZWQtc2VyaWVzIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLWdyYXBoLWZhZGVkKSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgICNyZWN0SGF0Y2ggbGluZSwKICAgICAgI2VsbGlwc2VIYXRjaCBsaW5lIHsKICAgICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8c3ZnIGhlaWdodD0iMCIgd2lkdGg9IjAiIGlkPSJzdmdEZWZzIj4KICAgICAgPGRlZnM+CiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KICAgICAgICAKICAgICAgICA8ZWxsaXBzZSBpZD0ib3Atbm9kZS1zdGFtcCIgcng9IjcuNSIgcnk9IjMiIHN0cm9rZT0iaW5oZXJpdCIgZmlsbD0iaW5oZXJpdCIgLz4KICAgICAgICAKICAgICAgICA8ZWxsaXBzZSBpZD0ib3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiByeD0iNSIgcnk9IjIiIHN0cm9rZT0iaW5oZXJpdCIgZmlsbD0iaW5oZXJpdCIgLz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjkiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iMyIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjE2IiB5PSI0IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTIiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ic3VtbWFyeS1pY29uIiBmaWxsPSIjODQ4NDg0IiBoZWlnaHQ9IjEyIiB2aWV3Ym94PSIwIDAgMjQgMjQiIHdpZHRoPSIxMiI+CiAgICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9kZWZzPgogICAgPC9zdmc+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnQ09OU1QnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTAgMTAiPgogICAgICAgIDxjaXJjbGUgY3g9IjUiIGN5PSI1IiByPSIzIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NVTU1BUlknKV1dIj4KICAgICAgPHN2ZyB3aWR0aCQ9IltbaGVpZ2h0XV0iIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHZpZXdib3g9IjAgMCAyNCAyNCIgZmlsbD0iIzg0ODQ4NCI+CiAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ09QJyldXSI+CiAgICAgIDxzdmcgaGVpZ2h0JD0iW1toZWlnaHRdXSIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE2IDgiPgogICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnZWxsaXBzZScpfX0iIHg9IjgiIHk9IjQiIC8+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdNRVRBJyldXSI+CiAgICAgIDxzdmcgaGVpZ2h0JD0iW1toZWlnaHRdXSIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDM3IDE2Ij4KICAgICAgICA8cmVjdCB4PSIxIiB5PSIxIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAncmVjdCcpfX0iIHN0cm9rZS13aWR0aD0iMnB4IiBoZWlnaHQ9IjE0IiB3aWR0aD0iMzUiIHJ4PSI1IiByeT0iNSIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NFUklFUycpXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgMTUiPgogICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCIgZmlsbCQ9IltbX2ZpbGxdXSIgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iIHg9IjAiIHk9IjIiIC8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMjQgMTAiPgogICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMSIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1pY29uIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIC0tdGItZ3JhcGgtZmFkZWQ6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0Zi1ncmFwaC1pY29uIGlkPSJpY29uIiB0eXBlPSJbW19nZXRUeXBlKG5vZGUsIHN1bW1hcnksIGNvbnN0LCB0eXBlKV1dIiBoZWlnaHQ9IltbaGVpZ2h0XV0iIGZpbGwtb3ZlcnJpZGU9IltbX2ZpbGxPdmVycmlkZV1dIiBzdHJva2Utb3ZlcnJpZGU9IltbX2dldFN0cm9rZU92ZXJyaWRlKF9maWxsT3ZlcnJpZGUpXV0iIGZhZGVkPSJbW19nZXRGYWRlZChyZW5kZXJJbmZvKV1dIiB2ZXJ0aWNhbD0iW1tfaXNWZXJ0aWNhbChub2RlLCB2ZXJ0aWNhbCldXSI+PC90Zi1ncmFwaC1pY29uPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9Imxpc3QtaXRlbSIgb24tbW91c2VvdmVyPSJfbm9kZUxpc3RlbmVyIiBvbi1tb3VzZW91dD0iX25vZGVMaXN0ZW5lciIgb24tY2xpY2s9Il9ub2RlTGlzdGVuZXIiPgogICAgICA8ZGl2IGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbyl9fSI+CiAgICAgICAgPHRmLW5vZGUtaWNvbiBjbGFzcz0ibm9kZS1pY29uIiBoZWlnaHQ9IjEyIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIG5vZGU9IltbaXRlbU5vZGVdXSIgcmVuZGVyLWluZm89IltbaXRlbVJlbmRlckluZm9dXSIgdGVtcGxhdGUtaW5kZXg9IltbdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICA8L3RmLW5vZGUtaWNvbj4KICAgICAgICA8c3BhbiB0aXRsZSQ9IltbbmFtZV1dIj5bW25hbWVdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIC5pbmNvbXBhdGlibGUtb3BzLWxpc3QgewogICAgICAgIGhlaWdodDogMzUwcHg7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgaXJvbi1saXN0IHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5ub2RlLW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIGRpdi5vcC1jb21wYXQtZGlzcGxheSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2Zy5vcC1jb21wYXQgewogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgIGRpdi5vcC1jb21wYXQtdmFsdWUgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj5bW25vZGVUaXRsZV1dPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBzZWNvbmRhcnk+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC1kaXNwbGF5Ij4KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJvcC1jb21wYXQiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNTAgMjUiPgogICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ib3AtY29tcGF0LWZpbGwiPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvciQ9IltbX29wQ29tcGF0Q29sb3JdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIgc3RvcC1jb2xvciQ9IltbX29wQ29tcGF0Q29sb3JdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIgc3RvcC1jb2xvciQ9IltbX29wSW5jb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yIF1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgIDwvbGluZWFyZ3JhZGllbnQ+CiAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICA8cmVjdCBoZWlnaHQ9IjI1IiB3aWR0aD0iMjUwIiByeD0iNSIgcnk9IjUiIHN0eWxlPSJmaWxsOiB1cmwoJyNvcC1jb21wYXQtZmlsbCcpOyIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcC1jb21wYXQtdmFsdWUiPltbX29wQ29tcGF0U2NvcmVMYWJlbF1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgoKICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIEluY29tcGF0aWJsZSBPcGVyYXRpb25zOiAoPHNwYW4+W1tfdG90YWxJbmNvbXBhdE9wc11dPC9zcGFuPikKICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9ImluY29tcGF0aWJsZS1vcHMtbGlzdCIgaWQ9ImluY29tcGF0aWJsZU9wc0xpc3QiIGl0ZW1zPSJbW19pbmNvbXBhdGlibGVPcE5vZGVzXV0iPgogICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgaXRlbS1ub2RlPSJbW2l0ZW1dXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhpdGVtLm5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBpdGVtLXR5cGU9ImluY29tcGF0aWJsZS1vcHMiPgogICAgICAgICAgICAgIDwvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9pcm9uLWNvbGxhcHNlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtbGlzdC1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICNsaXN0LWl0ZW0gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLmNsaWNrYWJsZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiA0MHB4OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtLmV4Y2x1ZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4uZWRnZS1sYWJlbCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxcHg7CiAgICAgICAgbGVmdDogMnB4OwogICAgICB9CgogICAgICAuZmFkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9Imxpc3QtaXRlbSIgb24tbW91c2VvdmVyPSJfbm9kZUxpc3RlbmVyIiBvbi1tb3VzZW91dD0iX25vZGVMaXN0ZW5lciIgb24tY2xpY2s9Il9ub2RlTGlzdGVuZXIiPgogICAgICA8ZGl2IGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbyl9fSI+CiAgICAgICAgPHRmLW5vZGUtaWNvbiBjbGFzcz0ibm9kZS1pY29uIiBoZWlnaHQ9IjEyIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIG5vZGU9IltbaXRlbU5vZGVdXSIgcmVuZGVyLWluZm89IltbaXRlbVJlbmRlckluZm9dXSIgdGVtcGxhdGUtaW5kZXg9IltbdGVtcGxhdGVJbmRleF1dIj48L3RmLW5vZGUtaWNvbj4KICAgICAgICA8c3BhbiB0aXRsZSQ9IltbbmFtZV1dIj5bW25hbWVdXTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZWRnZS1sYWJlbCI+W1tlZGdlTGFiZWxdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWluZm8iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnN1Yi1saXN0LWdyb3VwIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogOHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgfQoKICAgICAgLmF0dHItbGVmdCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5hdHRyLXJpZ2h0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgLnN1Yi1saXN0LXRhYmxlLWNlbGw6bGFzdC1jaGlsZCB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1jZWxsIHsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbS1ib2R5W3R3by1saW5lXSB7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweCA0cHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmRlZEluZm8gewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICB9CgogICAgICAuY29udHJvbERlcHMgewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDhweDsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQoKICAgICAgLnN1YnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgY29sb3I6ICM1ZTVlNWU7CiAgICAgIH0KCiAgICAgIC5jb250cm9sTGluZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlLWdyb3VwIHsKICAgICAgICBwYWRkaW5nLXRvcDogNHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUgewogICAgICAgIG1hcmdpbjogNXB4IDZweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIgY2xhc3M9InRvZ2dsZS1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vZGUtbmFtZSI+CiAgICAgICAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW19ub2RlLm5hbWVdXSIgZGVsaW1pdGVyLXBhdHRlcm49Ii8iIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOjpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jbG9zZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBsZWZ0OiAxNXB4OwogICAgICAgIGJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZyB7CiAgICAgICAgY3Vyc29yOiBwcm9ncmVzczsKICAgICAgICBvcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZy5lcnJvciB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICB9CgogICAgICAjaW5mbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA1cHg7CiAgICAgICAgdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIG1heC13aWR0aDogMzgwcHg7CiAgICAgICAgbWluLXdpZHRoOiAzMjBweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgIH0KCiAgICAgICNtYWluIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDQwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1tc2cgewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICB9CgogICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiA2cHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6ICNmMzkxM2U7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjM5MTNlOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNOb3RDb21wbGV0ZShwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzLWJhciI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtbXNnIj5bW3Byb2dyZXNzLm1zZ11dPC9kaXY+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIHZhbHVlPSJbW3Byb2dyZXNzLnZhbHVlXV0iPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3MkPSJbW19nZXRDb250YWluZXJDbGFzcyhwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9Im1haW4iPgogICAgICAgIDx0Zi1ncmFwaCBpZD0iZ3JhcGgiIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IiBiYXNpYy1ncmFwaD0iW1tncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IiBkZXZpY2VzLWZvci1zdGF0cz0iW1tkZXZpY2VzRm9yU3RhdHNdXSIgc3RhdHM9Iltbc3RhdHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcHJvZ3Jlc3M9Int7cHJvZ3Jlc3N9fSIgZWRnZS1sYWJlbC1mdW5jdGlvbj0iW1tlZGdlTGFiZWxGdW5jdGlvbl1dIiBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1toZWFsdGhQaWxsU3RlcEluZGV4XV0iIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIiBoYW5kbGUtZWRnZS1zZWxlY3RlZD0iW1toYW5kbGVFZGdlU2VsZWN0ZWRdXSIgdHJhY2UtaW5wdXRzPSJbW3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGg+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8dGYtZ3JhcGgtaW5mbyBpZD0iZ3JhcGgtaW5mbyIgdGl0bGU9InNlbGVjdGVkIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZ3JhcGg9IltbZ3JhcGhdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgc2VsZWN0ZWQtbm9kZS1pbmNsdWRlPSJ7e19zZWxlY3RlZE5vZGVJbmNsdWRlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tkZWJ1Z2dlckRhdGFFbmFibGVkXV0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iIG9uLW5vZGUtdG9nZ2xlLWluY2x1c2lvbj0iX29uTm9kZUluY2x1c2lvblRvZ2dsZWQiIG9uLW5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwPSJfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkIj48L3RmLWdyYXBoLWluZm8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZSBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgICNyYWRpb0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgICNpbmtbY2hlY2tlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgICAgIH0KCiAgICAgICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbCB7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im9mZlJhZGlvIj48L2Rpdj4KICAgICAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJyYWRpb0xhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItcmFkaW8tZ3JvdXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCopIHsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1wYXBlci1yYWRpby1ncm91cC1pdGVtLXBhZGRpbmcsIDEycHgpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2x0aXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHotaW5kZXg6IDEwMDI7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtYmFja2dyb3VuZCwgIzYxNjE2MSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtdGV4dC1jb2xvciwgd2hpdGUpOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlVXAgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVEb3duIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVJbk9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25JbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duT3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mYWRlLWluLWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlSW5PcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmZhZGUtb3V0LWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZU91dE9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLXVwLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVVcDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlRG93bjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25JbjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbi1vdXQgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bk91dDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuY2FuY2VsLWFuaW1hdGlvbiB7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMzBzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoYW5rcyBJRSAxMC4gKi8KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b29sdGlwIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtbm9kZS1zZWFyY2giPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNlYXJjaC1jb250YWluZXIiPgogICAgICA8cGFwZXItaW5wdXQgaWQ9InJ1bnMtcmVnZXgiIGxhYmVsPSJTZWFyY2ggbm9kZXMuIFJlZ2V4ZXMgc3VwcG9ydGVkLiIgdmFsdWU9Int7X3Jhd1JlZ2V4SW5wdXR9fSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzLWFuY2hvciI+CiAgICAgICAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcmVnZXhNYXRjaGVzXV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJzZWFyY2gtbWF0Y2giIG9uLWNsaWNrPSJfbWF0Y2hDbGlja2VkIj5bW2l0ZW1dXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgI3NlYXJjaC1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjcnVucy1yZWdleCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cy1hbmNob3IgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI3NlYXJjaC1yZXN1bHRzIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2ggewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXJlY3Rpb246IHJ0bDsKICAgICAgfQoKICAgICAgI3NlYXJjaC1tYXRjaDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItb3JhbmdlLXdlYWspOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWNvbnRyb2xzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaW5wdXQ6IHsKICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgICB9CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDE1cHg7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxNXB4OwogICAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiBncmF5OwogICAgICAgIC0tcGFwZXItaXRlbS1taW4taGVpZ2h0OiAzMHB4OwogICAgICB9CgogICAgICBwYXBlci1idXR0b25bcmFpc2VkXS5rZXlib2FyZC1mb2N1cyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQoKICAgICAgLnJ1bi1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDhweCAwIDhweCAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmNvbG9yLWRyb3Bkb3duIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjogewogICAgICAgICAgcGFkZGluZzogOXB4IDAgMCAxM3B4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIHsKICAgICAgICBwYWRkaW5nOiAwIDIwcHggMjBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1ob2xkZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLWJ1dHRvbiB7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sZWdlbmQtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgc3ZnLmljb24sCiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgfQogICAgICAuZG9tYWluVmFsdWVzIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgfQogICAgICAuZG9tYWluU3RhcnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIC5kb21haW5FbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29sb3JCb3ggewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAuaW1hZ2UtaWNvbiB7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAuaGVscC1pY29uIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ncmF5IHsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgbWFyZ2luOiA4cHggNXB4IDhweCAwOwogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgfQogICAgICAudGl0bGUgc21hbGwgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgLmRldmljZUxpc3QsCiAgICAgIC54bGFDbHVzdGVyTGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgI2ZpbGUgewogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IC5sYWJlbCwKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgc3ZnLAogICAgICAuY29sb3ItbGVnZW5kLXJvdyB0Zi1ncmFwaC1pY29uIHsKICAgICAgICBmbGV4OiAwIDAgNDBweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5kZXZpY2VzLWNoZWNrYm94IGlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWhvbGRlciAuaWNvbi1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW46IDAgLTVweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24tdGV4dCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CgogICAgICAudXBsb2FkLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDE2NXB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24taWNvbiB7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1vcmFuZ2UtNTAwKTsKICAgICAgfQoKICAgICAgLmhpZGRlbi1pbnB1dCB7CiAgICAgICAgaGVpZ2h0OiAwcHg7CiAgICAgICAgd2lkdGg6IDBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciBwYXBlci1yYWRpby1ncm91cCB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICBzcGFuLmNvdW50ZXIgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgfQoKICAgICAgLnJ1bnMgcGFwZXItaXRlbSB7CiAgICAgICAgLS1wYXBlci1pdGVtOiB7CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUuY29udHJvbC1ob2xkZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CgogICAgICB0YWJsZS50Zi1ncmFwaC1jb250cm9scyB0ZC5pbnB1dC1lbGVtZW50LXRhYmxlLWRhdGEgewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDIwcHg7CiAgICAgIH0KCiAgICAgIC5zcGFjZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmNvbG9yLXRleHQgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIHRoYXQgc3VwcHJlc3MgcG9pbnRlciBldmVudHMgZm9yIGRpc2FibGVkIGJ1dHRvbnMuIE90aGVyd2lzZSwgdGhlICovCiAgICAgIC8qICB0b29sdGlwcyBkbyBub3QgYXBwZWFyLiAqLwogICAgICBwYXBlci1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHsKICAgICAgICBjb2xvcjogIzI2NjIzNjsKICAgICAgICBjdXJzb3I6IGhlbHA7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciBwYXBlci10b29sdGlwIHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KCiAgICAgIC8qKiBPdGhlcndpc2UsIHBvbHltZXIgVUkgY29udHJvbHMgYXBwZWFyIGF0b3Agbm9kZSBzZWFyY2guICovCiAgICAgIHRmLWdyYXBoLW5vZGUtc2VhcmNoIHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iYWxsY29udHJvbHMiPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHRmLWdyYXBoLW5vZGUtc2VhcmNoIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iPjwvdGYtZ3JhcGgtbm9kZS1zZWFyY2g+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iaWNvbi1idXR0b24iIG9uLXRhcD0iX2ZpdCIgYWx0PSJGaXQgdG8gc2NyZWVuIj4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXNwZWN0LXJhdGlvIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5GaXQgdG8gU2NyZWVuPC9zcGFuPgogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi1jbGljaz0iZG93bmxvYWQiIGFsdD0iRG93bmxvYWQgUE5HIj4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZmlsZS1kb3dubG9hZCIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+RG93bmxvYWQgUE5HPC9zcGFuPgogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxhIGhyZWY9IiMiIGlkPSJncmFwaGRvd25sb2FkIiBjbGFzcz0idGl0bGUiIGRvd25sb2FkPSJncmFwaC5wbmciPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIHJ1bnMiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgIFJ1biA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbZGF0YXNldHMubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgbm9pbmsgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIgY2xhc3M9InJ1bi1kcm9wZG93biI+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkUnVuSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZGF0YXNldHNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLm5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1Nlc3Npb25SdW5zRHJvcGRvd25dXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUYWcKICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19udW1UYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCldXSk8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIgbm9pbmsgY2xhc3M9InJ1bi1kcm9wZG93biI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWdJbmRleH19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19nZXRUYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCldXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0uZGlzcGxheU5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93VXBsb2FkQnV0dG9uXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5VcGxvYWQ8L2Rpdj4KICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ1cGxvYWQtYnV0dG9uIiBvbi1jbGljaz0iX2dldEZpbGUiIHRpdGxlPSJVcGxvYWQgYSBncmFwaCBwYnR4dCBmaWxlIHRvIHZpZXcgdGhlIGdyYXBoIj4KICAgICAgICAgICAgQ2hvb3NlIEZpbGUKICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGlkZGVuLWlucHV0Ij4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIGlkPSJmaWxlIiBuYW1lPSJmaWxlIiBvbi1jaGFuZ2U9Il91cGRhdGVGaWxlSW5wdXQiIGFjY2VwdD0iLnBidHh0Ij4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e19zZWxlY3RlZEdyYXBoVHlwZX19Ij4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJvcF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbk9wR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5HcmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJjb25jZXB0dWFsX2dyYXBoIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+Q29uY2VwdHVhbCBHcmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJwcm9maWxlIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uUHJvZmlsZURpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPlByb2ZpbGU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e3RyYWNlSW5wdXRzfX0iIGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICAgIFRyYWNlIGlucHV0cwogICAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxzRmVhdHVyZUVuYWJsZWRdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBjbGFzcz0idGl0bGUiPlNob3cgaGVhbHRoIHBpbGxzPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPkNvbG9yPC9kaXY+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e2NvbG9yQnl9fSI+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InN0cnVjdHVyZSI+U3RydWN0dXJlPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJkZXZpY2UiPkRldmljZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgbmFtZT0ieGxhX2NsdXN0ZXIiIGRpc2FibGVkPSJbWyFfeGxhQ2x1c3RlcnNQcm92aWRlZChyZW5kZXJIaWVyYXJjaHkpXV0iPgogICAgICAgICAgICBYTEEgQ2x1c3RlcgogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IFhMQSBjbHVzdGVyIGlzIG9ubHkgZW5hYmxlZCBpZiBhdCBsZWFzdCAxIG9wIHNwZWNpZmllcwogICAgICAgICAgICBhbiBYTEEgY2x1c3Rlci4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJjb21wdXRlLXRpbWUtcmFkaW8tYnV0dG9uIiBuYW1lPSJjb21wdXRlX3RpbWUiIGRpc2FibGVkPSJbWyFzdGF0c11dIj4KICAgICAgICAgICAgQ29tcHV0ZSB0aW1lCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJjb21wdXRlLXRpbWUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IGNvbXB1dGUgdGltZSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIgbmFtZT0ibWVtb3J5IiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIE1lbW9yeQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBtZW1vcnkgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIgbmFtZT0ib3BfY29tcGF0aWJpbGl0eSI+CiAgICAgICAgICAgIFRQVSBDb21wYXRpYmlsaXR5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgd2hldGhlciBhbiBvcGVyYXRpb24gaXMgY29tcGF0aWJsZSBmb3IgdGhlIFRQVSBkZXZpY2UuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICA8c3BhbiBjbGFzcz0ic3BhY2VyIj48L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNHcmFkaWVudENvbG9yaW5nKHN0YXRzLCBjb2xvckJ5KV1dIj4KICAgICAgICAgIDxzdmcgd2lkdGg9IjE0MCIgaGVpZ2h0PSIyMCIgc3R5bGU9Im1hcmdpbjogMCA1cHgiIGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgICAgICAgICAgICAgPHN0b3AgY2xhc3M9InN0YXJ0IiBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLnN0YXJ0Q29sb3JdXSIgLz4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJlbmQiIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5lbmRDb2xvcl1dIiAvPgogICAgICAgICAgICAgIDwvbGluZWFyZ3JhZGllbnQ+CiAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEzNSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudCkiIHN0cm9rZT0iYmxhY2siIC8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblZhbHVlcyBjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluU3RhcnQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5taW5WYWx1ZV1dPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpbkVuZCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1heFZhbHVlXV08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGJyIHN0eWxlPSJjbGVhcjogYm90aCI+CiAgICAgICAgICA8ZGl2PkRldmljZXMgaW5jbHVkZWQgaW4gc3RhdHM6PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXZpY2VMaXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyBkZXZpY2VzLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxzcGFuPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWUkPSJbW2l0ZW0uZGV2aWNlXV0iIGNoZWNrZWQkPSJbW2l0ZW0udXNlZF1dIiBvbi1jbGljaz0iX2RldmljZUNoZWNrYm94Q2xpY2tlZCI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+W1tpdGVtLnN1ZmZpeF1dPC9zcGFuPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2l0ZW0uaWdub3JlZE1zZ11dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImhlbHAiIGNsYXNzPSJoZWxwLWljb24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIiBhbmltYXRpb24tZGVsYXk9IjAiPltbaXRlbS5pZ25vcmVkTXNnXV08L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnc3RydWN0dXJlJyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj4KICAgICAgICAgICAgICAgIGNvbG9ycwogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5zYW1lIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNlZWUiIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVuaXF1ZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnZGV2aWNlJyldXSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iW1tpdGVtLmNvbG9yXV0iIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLmRldmljZV1dPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIGRldmljZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICd4bGFfY2x1c3RlcicpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjdW5maWxsZWQtcmVjdCIgeD0iMCIgeT0iMCIgc3R5bGU9ImZpbGw6W1tpdGVtLmNvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS54bGFfY2x1c3Rlcl1dPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI2dyZXktcmVjdCIgeD0iMCIgeT0iMCIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIFhMQSBjbHVzdGVyPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iIzBmOWQ1OCIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+VmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2RiNDQzNyIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+SW52YWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RhdHNOb3ROdWxsKHN0YXRzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmYWRlZD48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVudXNlZCBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0ibGVnZW5kLWhvbGRlciI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJbW19nZXRUb2dnbGVMZWdlbmRJY29uKF9sZWdlbmRPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTGVnZW5kT3BlbiIgY2xhc3M9InRvZ2dsZS1sZWdlbmQtYnV0dG9uIj4KICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9InRvZ2dsZS1sZWdlbmQtdGV4dCI+CiAgICAgICAgW1tfZ2V0VG9nZ2xlVGV4dChfbGVnZW5kT3BlbmVkKV1dCiAgICAgIDwvc3Bhbj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19sZWdlbmRPcGVuZWRdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgPHRib2R5Pjx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90Ym9keT48L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZXJyb3ItZGlhbG9nIiB3aXRoLWJhY2tkcm9wPjwvcGFwZXItZGlhbG9nPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ0VNUFRZJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBncmFwaCBkZWZpbml0aW9uIGZpbGVzIHdlcmUgZm91bmQuPC9oMz4KICAgICAgICA8cD4KICAgICAgICAgIFRvIHN0b3JlIGEgZ3JhcGgsIGNyZWF0ZSBhCiAgICAgICAgICA8Y29kZT50Zi5zdW1tYXJ5LkZpbGVXcml0ZXI8L2NvZGU+CiAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICA8Y29kZT5hZGRfZ3JhcGgoKTwvY29kZT4gbWV0aG9kLiBZb3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvZ3JhcGhfdml6Ij5ncmFwaCB2aXN1YWxpemVyIHR1dG9yaWFsPC9hPi4KICAgICAgICA8L3A+CgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8gYWRkCiAgICAgICAgICBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICA8L3A+CgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICA8L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YXNldHNTdGF0ZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsICdQUkVTRU5UJyldXSI+CiAgICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICAgIDx0Zi1ncmFwaC1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBkZXZpY2VzLWZvci1zdGF0cz0ie3tfZGV2aWNlc0ZvclN0YXRzfX0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tfY29sb3JCeVBhcmFtc11dIiBzdGF0cz0iW1tfc3RhdHNdXSIgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHJlbmRlci1oaWVyYXJjaHk9IltbX3JlbmRlckhpZXJhcmNoeV1dIiBzZWxlY3Rpb249Int7X3NlbGVjdGlvbn19IiBzZWxlY3RlZC1maWxlPSJ7e19zZWxlY3RlZEZpbGV9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIGhlYWx0aC1waWxscy1mZWF0dXJlLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgaGVhbHRoLXBpbGxzLXRvZ2dsZWQtb249Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgb24tZml0LXRhcD0iX2ZpdCIgdHJhY2UtaW5wdXRzPSJ7e190cmFjZUlucHV0c319Ij48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICAgIDx0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIGlkPSJsb2FkZXIiIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIiBzZWxlY3Rpb249IltbX3NlbGVjdGlvbl1dIiBzZWxlY3RlZC1maWxlPSJbW19zZWxlY3RlZEZpbGVdXSIgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e19ncmFwaH19IiBvdXQtc3RhdHM9Int7X3N0YXRzfX0iIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgY29tcGF0aWJpbGl0eS1wcm92aWRlcj0iW1tfY29tcGF0aWJpbGl0eVByb3ZpZGVyXV0iPjwvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlcj4KICAgICAgICAgIDx0Zi1ncmFwaC1ib2FyZCBpZD0iZ3JhcGhib2FyZCIgZGV2aWNlcy1mb3Itc3RhdHM9IltbX2RldmljZXNGb3JTdGF0c11dIiBjb2xvci1ieT0iW1tfY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7X2NvbG9yQnlQYXJhbXN9fSIgZ3JhcGgtaGllcmFyY2h5PSJbW19ncmFwaEhpZXJhcmNoeV1dIiBncmFwaD0iW1tfZ3JhcGhdXSIgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iIHByb2dyZXNzPSJbW19wcm9ncmVzc11dIiBkZWJ1Z2dlci1kYXRhLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW19hcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tfbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9IltbX2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIHNlbGVjdGVkLW5vZGU9Int7X3NlbGVjdGVkTm9kZX19IiBzdGF0cz0iW1tfc3RhdHNdXSIgdHJhY2UtaW5wdXRzPSJbW190cmFjZUlucHV0c11dIj48L3RmLWdyYXBoLWJvYXJkPgogICAgICAgIDwvZGl2PgogICAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCAvZGVlcC8gewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kaWFsb2cgewogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZGlzdHJpYnV0aW9uLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIAogICAgPHZ6LWRpc3RyaWJ1dGlvbi1jaGFydCBpZD0iY2hhcnQiIHgtdHlwZT0iW1t4VHlwZV1dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIj48L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydD4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgaGVpZ2h0OiAyMzVweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiA3MDBweDsKICAgICAgICBoZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICB2ei1oaXN0b2dyYW0tdGltZXNlcmllcyB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgICAgKEhpc3RvZ3JhbXMgYW5kIGRpc3RyaWJ1dGlvbnMgYm90aCB1c2UgdGhlIGhpc3RvZ3JhbSBzdW1tYXJ5CiAgICAgICAgICAgICAgICBvcGVyYXRpb24uKQogICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPjxzcGFuPjwvc3Bhbj48L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxnPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHgiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSBzbGljZSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJzdGFnZSI+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iYmFja2dyb3VuZCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8ZyBjbGFzcz0ieC1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InktYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LXNsaWNlLWF4aXMtaG92ZXIiPjwvZz4KICAgICAgPC9nPgogICAgPC9zdmc+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgZmlsbDogcmVkOwogICAgICB9CgogICAgICAuaGlzdG9ncmFtIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmhvdmVyIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBkb21pbmFudC1iYXNlbGluZTogbWlkZGxlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3ZlciBjaXJjbGUgewogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLmhvdmVyIHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3Zlci5ob3Zlci1jbG9zZXN0IGNpcmNsZSB7CiAgICAgICAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmJhc2VsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5vdXRsaW5lIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLm91dGxpbmUub3V0bGluZS1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiBibGFjayAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyLAogICAgICAueS1heGlzLWhvdmVyLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LWF4aXMtaG92ZXIgLmxhYmVsLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIC5sYWJlbCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgdGV4dC1hbmNob3I6IGVuZDsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAueS1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgdGV4dCB7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIGxpbmUsCiAgICAgIC55LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciBsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmF4aXMgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmF4aXMgcGF0aC5kb21haW4gewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5heGlzIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDI7CiAgICAgIH0KCiAgICAgIC5zbWFsbCAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpmaXJzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpsYXN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhpc3RvZ3JhbS1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBpZD0iY2hhcnQiIHRpbWUtcHJvcGVydHk9IltbdGltZVByb3BlcnR5XV0iIG1vZGU9IltbaGlzdG9ncmFtTW9kZV1dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iPjwvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXM+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogOTAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaGlzdG9ncmFtLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib3ZlcmxheSI+b3ZlcmxheTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im9mZnNldCI+b2Zmc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXRiLXRleHQtbG9hZGVyLW91dGxpbmUpOwogICAgICB9CiAgICAgIC50ZXh0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggM3B4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7IC8qIHRvIGNvcnJlY3QgZm9yIGJvcmRlciAqLwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXI6bm90KDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2RdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1tfeVZhbHVlQWNjZXNzb3JdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tfZGVmYXVsdFhSYW5nZV1dIiBkZWZhdWx0LXktcmFuZ2U9IltbX2RlZmF1bHRZUmFuZ2VdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGRhdGEtc2VyaWVzPSJbW3J1bnNdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSI+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJSZXNldCBheGVzIHRvIFswLCAxXS4iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGVwLWxlZ2VuZCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU3RlcEF2YWlsYWJsZV1dIiBhcz0icnVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6IFtbX2NvbXB1dGVSdW5Db2xvcihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIFtbcnVuXV0gaXMgYXQKICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWxhYmVsLXRleHQiPgogICAgICAgICAgICBzdGVwIFtbX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSA8L3NwYW4+PGJyPgogICAgICAgICAgPHNwYW4gY2xhc3M9IndhbGwtdGltZS1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgKFtbX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0pCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgewogICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICAjc3RlcC1sZWdlbmQgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zaXplOiAwLjhlbTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmNvbG9yLWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtbGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLndhbGwtdGltZS1sYWJlbC10ZXh0IHsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU2xpZGVyc11dIiBhcz0icnVuIj4KICAgICAgPGRpdiBjbGFzcz0icnVuLXdpZGdldCI+CiAgICAgICAgPGRpdiBjbGFzcz0icnVuLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi1jb2xvci1ib3giIHN0eWxlPSJiYWNrZ3JvdW5kOltbX2NvbXB1dGVDb2xvckZvclJ1bihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi10ZXh0Ij4KICAgICAgICAgICAgW1tydW5dXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1kaXNwbGF5LWNvbnRhaW5lciI+CiAgICAgICAgICBbW19jb21wdXRlVGltZVRleHRGb3JSdW4ocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4LAogICAgICAgICAgcnVuLCB0aW1lRGlzcGxheVR5cGUpXV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItc2xpZGVyIGRhdGEtcnVuJD0iW1tydW5dXSIgc3RlcD0iMSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iIHZhbHVlPSJbW19nZXRTdGVwKF9ydW5Ub1N0ZXBJbmRleCwgcnVuKV1dIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0iX3NsaWRlclZhbHVlQ2hhbmdlZCI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnJ1bi13aWRnZXQgewogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIG1hcmdpbjogLThweCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnN0ZXAtZGlzcGxheS1jb250YWluZXIgewogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgICAgbWFyZ2luOiAwIDE1cHggMCAwOwogICAgICB9CiAgICAgIC5ydW4tdGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC5ydW4tY29sb3ItYm94IHsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InRpbWUtdHlwZS1zZWxlY3RvciIgbmFtZT0iVGltZSBEaXNwbGF5IFR5cGUiIHNlbGVjdGVkLWlkPSJ7e190aW1lRGlzcGxheVR5cGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICAgIDx0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciBydW5zPSJbW19yZWxldmFudFNlbGVjdGVkUnVuc11dIiBydW4tdG8tc3RlcD0ie3tfcnVuVG9TdGVwfX0iIHJ1bi10by1hdmFpbGFibGUtdGltZS1lbnRyaWVzPSJbW19ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzXV0iIHRpbWUtZGlzcGxheS10eXBlPSJbW190aW1lRGlzcGxheVR5cGVdXSI+CiAgICAgICAgICAgICAgPC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvcj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwcmVjaXNpb27igJNyZWNhbGwgY3VydmUgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iIGdldC1jYXRlZ29yeS1pdGVtLWtleT0iW1tfZ2V0Q2F0ZWdvcnlJdGVtS2V5XV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1wci1jdXJ2ZS1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgcnVucz0iW1tpdGVtLnJ1bnNdXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW5zLCBpdGVtLnRhZyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBydW4tdG8tc3RlcC1jYXA9IltbX3J1blRvU3RlcF1dIiBvbi1kYXRhLWNoYW5nZT0iW1tfY3JlYXRlRGF0YUNoYW5nZUNhbGxiYWNrKGl0ZW0udGFnKV1dIj48L3RmLXByLWN1cnZlLWNhcmQ+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDYwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIDwvcD4KICAgICAgPHRleHRhcmVhIGlkPSJjb21tYW5kVGV4dGFyZWEiIHJlYWRvbmx5IHJvd3M9IjEiIG9uLWJsdXI9Il9yZW1vdmVDb3BpZWRNZXNzYWdlIj4KW1tfaW5zdGFsbENvbW1hbmRdXTwvdGV4dGFyZWE+CiAgICAgIDxkaXYgaWQ9ImNvcHlDb250YWluZXIiPgogICAgICAgIDxzcGFuIGlkPSJjb3BpZWRNZXNzYWdlIj48L3NwYW4+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgb24tdGFwPSJfY29weUluc3RhbGxDb21tYW5kIj5Db3B5IHRvIGNsaXBib2FyZDwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLm1lc3NhZ2UgewogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICB9CiAgICAgICNjb21tYW5kVGV4dGFyZWEgewogICAgICAgIG1hcmdpbi10b3A6IDFleDsKICAgICAgICBwYWRkaW5nOiAxZXggMWVtOwogICAgICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgI2NvcHlDb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgI2NvcGllZE1lc3NhZ2UgewogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1wbHVnaW4tZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG1vZGFsIG9wZW5lZD0ie3tfb3Blbn19IiB3aXRoLWJhY2tkcm9wPSJbW191c2VOYXRpdmVCYWNrZHJvcF1dIj4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tbWVzc2FnZSI+W1tfY3VzdG9tTWVzc2FnZV1dPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZT4KICAgICAgLyoqIFdlIHJlbHkgb24gYSBzZXBhcmF0ZSBgX2hpZGRlbmAgcHJvcGVydHkgaW5zdGVhZCBvZiBkaXJlY3RseSBtYWtpbmcgdXNlCiAgICAgICAgICBvZiB0aGUgYF9vcGVuYCBhdHRyaWJ1dGUgYmVjYXVzZSB0aGlzIENTUyBzcGVjaWZpY2F0aW9uIG1heSBzdHJhbmdlbHkKICAgICAgICAgIGFmZmVjdCBvdGhlciBlbGVtZW50cyB0aHJvdWdob3V0IFRlbnNvckJvYXJkLiBTZWUgIzg5OS4gKi8KICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItdmlkZW8iPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxpbWcgaWQ9InZpZGVvIiBzcmMkPSJbW19pbWFnZVVSTF1dIj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgaW1nIHsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8ZGl2IGNsYXNzPSJkZXByZWNhdGlvbi13YXJuaW5nIj4KICAgICAgQmVob2xkZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIFRlbnNvckJvYXJkCiAgICAgIHJlbGVhc2UuIFBsZWFzZSBzZWUKICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzM4NDMiPiMzODQzPC9hPgogICAgICBmb3IgZGV0YWlscy4KICAgIDwvZGl2PgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8cCBjbGFzcz0iY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSI+CiAgICAgICAgICAgICAgQ29udHJvbHMgZGlzYWJsZWQ6IGRpcmVjdG9yeSBpcyBub3Qgd3JpdGVhYmxlLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBCZWhvbGRlciByZXF1aXJlcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGxvZyBkaXJlY3RvcnkgaW4gb3JkZXIgdG8KICAgICAgICAgICAgICBjb21tdW5pY2F0ZSB2aXN1YWxpemF0aW9uIGNoYW5nZXMgdG8gdGhlIDxjb2RlPkJlaG9sZGVyPC9jb2RlPgogICAgICAgICAgICAgIGluc3RhbmNlIGluIHlvdXIgbW9kZWwuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNfYWN0aXZlXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIEJlaG9sZGVyIGRhdGEgd2FzIGZvdW5kLjwvaDM+CgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdXIgc2NyaXB0IGlzbid0IHJ1bm5pbmcuPC9saT4KICAgICAgICAgICAgICA8bGk+WW91IGFyZW4ndCBjYWxsaW5nIDxjb2RlPmJlaG9sZGVyLnVwZGF0ZSgpPC9jb2RlPi48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gdXNlIEJlaG9sZGVyLCBpbXBvcnQgYW5kIGluc3RhbnRpYXRlIHRoZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVyPC9jb2RlPiBjbGFzcywgYW5kIGNhbGwgaXRzCiAgICAgICAgICAgICAgPGNvZGU+dXBkYXRlPC9jb2RlPiBtZXRob2Qgd2l0aCBhIDxjb2RlPlNlc3Npb248L2NvZGU+IGFyZ3VtZW50CiAgICAgICAgICAgICAgYWZ0ZXIgZXZlcnkgdHJhaW4gc3RlcDoKICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmJlaG9sZGVyIGltcG9ydCBCZWhvbGRlckhvb2sKYmVob2xkZXJfaG9vayA9IEJlaG9sZGVySG9vayhMT0dfRElSRUNUT1JZKQp3aXRoIE1vbml0b3JlZFNlc3Npb24oLi4uLCBob29rcz1bYmVob2xkZXJfaG9va10pIGFzIHNlc3M6CiAgc2Vzcy5ydW4odHJhaW5fb3ApPC9wcmU+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgZXZlcnl0aGluZyBpcyBzZXQgdXAgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci90ZW5zb3Jib2FyZC9wbHVnaW5zL2JlaG9sZGVyL1JFQURNRS5tZCI+dGhlIFJFQURNRTwvYT4KICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHAgY2xhc3M9ImRpc2NsYWltZXIiPgogICAgICAgICAgICAgIE5vdGU6IEJlaG9sZGVyIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdlbGwgb24gbG9jYWwgZmlsZSBzeXN0ZW1zLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmRlcHJlY2F0aW9uLXdhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjNmNhZDE7IC8qICR0Zi1zbGF0ZSAzMDAgKi8KICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgdGYtZGFzaGJvYXJkLWxheW91dCB7CiAgICAgICAgLyogTGVhdmUgc3BhY2UgZm9yIC5kZXByZWNhdGlvbi13YXJuaW5nIHRvcCBiYXIuICovCiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA2MHB4KTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcXVlcnktcGFuZSI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcy1zdGF0dXNlcyI+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0iaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3MiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIGh5cGVycGFyYW1ldGVycyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SHlwZXJwYXJhbWV0ZXJzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfaHBhcmFtc319IiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhwYXJhbSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e2hwYXJhbS5kaXNwbGF5ZWR9fSIgY2xhc3M9ImhwYXJhbS1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaHBhcmFtLmZpbHRlci5kb21haW5EaXNjcmV0ZV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e2l0ZW0uY2hlY2tlZH19IiBjbGFzcz0iZGlzY3JldGUtdmFsdWUtY2hlY2tib3giIG9uLWNoYW5nZT0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tfcHJldHR5UHJpbnQoaXRlbS52YWx1ZSldXQogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWxdXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNaW4iIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4uaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iLWluZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWF4IiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLmludGVydmFsLm1heC52YWx1ZX19IiBhbGxvd2VkX3BhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWRdXSIgcGxhY2Vob2xkZXI9IitpbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLnJlZ2V4cF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlJlZ3VsYXIgZXhwcmVzc2lvbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5yZWdleHB9fSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gbWV0cmljcyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+TWV0cmljczwvZGl2PgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X21ldHJpY3N9fSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWMiPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7bWV0cmljLmRpc3BsYXllZH19IiBjbGFzcz0ibWV0cmljLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpYy5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXC1dIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC52YWx1ZX19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZH19IiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzdGF0dXMiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdGF0dXM8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc3RhdHVzZXNdXSIgYXM9InN0YXR1cyI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7c3RhdHVzLmFsbG93ZWR9fSIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgW1tzdGF0dXMuZGlzcGxheU5hbWVdXQogICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InNvcnRpbmctcGFnaW5nIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNvcnRpbmc8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IlNvcnQgYnkiIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NvcnRCeUluZGV4fX0iIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2hwYXJhbXNdXSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21ldHJpY3NdXSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkRpcmVjdGlvbiIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydERpcmVjdGlvbn19Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPkFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPkRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJwYWdpbmctZG93bmxvYWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHBhZ2luZyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UGFnaW5nPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIE51bWJlciBvZiBtYXRjaGluZyBzZXNzaW9uIGdyb3VwczoKICAgICAgICAgICAgICAgIFtbX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLW51bWJlci1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlBhZ2UgIyIgdmFsdWU9Int7X3BhZ2VOdW1iZXJJbnB1dC52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTldIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW19wYWdlTnVtYmVySW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9InN1ZmZpeCIgY2xhc3M9InBhZ2Utc3VmZml4Ij4KICAgICAgICAgICAgICAgICAgICAvIFtbX3BhZ2VDb3VudFN0cl1dCiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXggIyBvZiBzZXNzaW9uIGdyb3VwcyBwZXIgcGFnZToiIHZhbHVlPSJ7e19wYWdlU2l6ZUlucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VTaXplSW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gZG93bmxvYWQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2Vzc2lvbkdyb3Vwc1JlcXVlc3RdXSI+CiAgICAgICAgICAgICAgICBEb3dubG9hZCBkYXRhIGFzCiAgICAgICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgICAgPGEgaWQ9ImNzdkxpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9zZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29uZmlndXJhdGlvbildXSI+Q1NWPC9hPgogICAgICAgICAgICAgICAgICA8YSBpZD0ianNvbkxpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5KU09OPC9hPgogICAgICAgICAgICAgICAgICA8YSBpZD0ibGF0ZXhMaW5rIiBkb3dubG9hZD0iaHBhcmFtc190YWJsZS50ZXgiIGhyZWY9IltbX2xhdGV4VXJsKF9zZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29uZmlndXJhdGlvbildXSI+TGFUZVg8L2E+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogNXB4IDEwcHggNXB4IDEwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogN3B4OwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcy1zdGF0dXNlcyB7CiAgICAgICAgZmxleC1iYXNpczogNzAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAjaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3MgewogICAgICAgIGZsZXgtYmFzaXM6IDkwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLmh5cGVycGFyYW1ldGVycyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm1ldHJpY3MgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5zdGF0dXNlcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3NvcnRpbmctcGFnaW5nIHsKICAgICAgICBmbGV4LWJhc2lzOiAzMCU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgICNwYWdpbmctZG93bmxvYWQgewogICAgICAgIGZsZXgtYmFzaXM6IDkwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnNvcnRpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1wYWdlcyI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCg6bm90KHNsb3QpOm5vdCguaXJvbi1zZWxlY3RlZCkpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItdGFiIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYjsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xpbmtdKSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1zZWxlY3RlZCkpID4gLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAwLjg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LXVuc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRhYi1pbmssIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCA+IDo6c2xvdHRlZChhKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJwYXBlci10YWJzIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBgdHJhbnNwYXJlbnRgLiAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOwogICAgICB9CgogICAgICAjdGFic0NvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLW1vei1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIC1tcy1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250ZW50OwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudDpub3QoLnNjcm9sbGFibGUpLAogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyID4gOjpzbG90dGVkKCopIHsKICAgICAgICAvKiBJRSAtIHByZXZlbnQgdGFicyBmcm9tIGNvbXByZXNzaW5nIHdoZW4gdGhleSBzaG91bGQgc2Nyb2xsLiAqLwogICAgICAgIC1tcy1mbGV4OiAxIDAgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMCBhdXRvOwogICAgICAgIGZsZXg6IDEgMCBhdXRvOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAubm90LXZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXI7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuYWxpZ24tYm90dG9tIHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmV4cGFuZCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuY29udHJhY3QgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCA+IDo6c2xvdHRlZCg6bm90KCNzZWxlY3Rpb25CYXIpKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tbGVmdCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX2xlZnRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vbkxlZnRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgPGRpdiBpZD0idGFic0NvbnRhaW5lciIgb24tdHJhY2s9Il9zY3JvbGwiIG9uLWRvd249Il9kb3duIj4KICAgICAgPGRpdiBpZD0idGFic0NvbnRlbnQiIGNsYXNzJD0iW1tfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3Moc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb25CYXIiIGNsYXNzJD0iW1tfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzKG5vQmFyLCBhbGlnbkJvdHRvbSldXSIgb24tdHJhbnNpdGlvbmVuZD0iX29uQmFyVHJhbnNpdGlvbkVuZCI+PC9kaXY+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tcmlnaHQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9yaWdodEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2xiYXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodDogdmFyKC0tcGFwZXItdG9vbGJhci1oZWlnaHQsIDY0cHgpOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodDogdmFyKC0tcGFwZXItdG9vbGJhci1zbS1oZWlnaHQsIDU2cHgpOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXRvb2xiYXItYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b29sYmFyLWNvbG9yLCB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyOwogICAgICB9CgogICAgICA6aG9zdCguYW5pbWF0ZSkgewogICAgICAgIHRyYW5zaXRpb246IHZhcigtLXBhcGVyLXRvb2xiYXItdHJhbnNpdGlvbiwgaGVpZ2h0IDAuMThzIGVhc2UtaW4pOwogICAgICB9CgogICAgICA6aG9zdCgubWVkaXVtLXRhbGwpIHsKICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCkgKiAyKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLW1lZGl1bTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRhbGwpIHsKICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCkgKiAzKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRhbGw7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIFRPRE86IFdoZXJlIHNob3VsZCBtZWRpYSBxdWVyeSBicmVha3BvaW50cyBsaXZlIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGVsZW1lbnRzPwogICAgICAgKi8KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCgubWVkaXVtLXRhbGwpIHsKICAgICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KSAqIDIpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLnRhbGwpIHsKICAgICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KSAqIDMpOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItdG9vbHMgewogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICN0b3BCYXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLyogbWlkZGxlIGJhciAqLwogICAgICAjbWlkZGxlQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSAjbWlkZGxlQmFyLAogICAgICA6aG9zdCgubWVkaXVtLXRhbGwpICNtaWRkbGVCYXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgfQoKICAgICAgLyogYm90dG9tIGJhciAqLwogICAgICAjYm90dG9tQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1ha2UgZWxlbWVudHMgKGUuZy4gYnV0dG9ucykgcmVzcG9uZCB0byBtb3VzZS90b3VjaCBldmVudHMKICAgICAgICoKICAgICAgICogYC50b29sYmFyLXRvb2xzYCBkaXNhYmxlcyB0b3VjaCBldmVudHMgc28gbXVsdGlwbGUgdG9vbGJhcnMgY2FuIHN0YWNrIGFuZCBub3QKICAgICAgICogYWJzb3JiIGV2ZW50cy4gQWxsIGNoaWxkcmVuIG11c3QgaGF2ZSBwb2ludGVyIGV2ZW50cyByZS1lbmFibGVkIHRvIHdvcmsgYXMKICAgICAgICogZXhwZWN0ZWQuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgqOm5vdChbZGlzYWJsZWRdKSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDU2cHg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKHBhcGVyLWljb24tYnV0dG9uICsgLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgLS1wYXBlci10b29sYmFyLXRpdGxlIG1peGluIGlzIGFwcGxpZWQgaGVyZSBpbnN0ZWFkIG9mIGFib3ZlIHRvCiAgICAgICAqIGZpeCB0aGUgaXNzdWUgd2l0aCBtYXJnaW4tbGVmdCBiZWluZyBpZ25vcmVkIGR1ZSB0byBjc3Mgb3JkZXJpbmcuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRpdGxlOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbltpY29uPW1lbnVdKSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCguZml0KSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogYXV0bzsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC8qIFRPRE8obm9tcyk6IFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gZm9yIGNsYXNzZXMgdGhhdCBkb24ndCB1c2UKICAgICAgICogL2RlZXAvIGNyZWF0ZSBvdXIgb3duLgogICAgICAgKi8KICAgICAgLnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmNlbnRlci1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICB9CgogICAgICAuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtYXJvdW5kLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b3BCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKGp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJ0b3AiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9Im1pZGRsZUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMobWlkZGxlSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9Im1pZGRsZSI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iYm90dG9tQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3Nlcyhib3R0b21KdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0iYm90dG9tIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udHJvbC1wYW5lbCI+CiAgICAgIAogICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iQ29sb3IgYnkiIGlkPSJjb2xvckJ5RHJvcERvd25NZW51IiBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7b3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXh9fSIgaWQ9ImNvbG9yQnlMaXN0Qm94Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbb3B0aW9ucy5jb2x1bW5zXV0iIGFzPSJjb2x1bW4iIGlkPSJjb2xvckJ5Q29sdW1uVGVtcGxhdGUiPgogICAgICAgICAgICA8cGFwZXItaXRlbSBkaXNhYmxlZD0iW1shX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbnMtY29udGFpbmVyIj4KICAgICAgICAKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e29wdGlvbnMuY29sdW1uc319IiBhcz0iY29sdW1uIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNOdW1lcmljQ29sdW1uKGNvbHVtbi5pbmRleCldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sdW1uLXRpdGxlIj4KICAgICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgY2xhc3M9InNjYWxlLXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tjb2x1bW4uc2NhbGV9fSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iTElORUFSIj4KICAgICAgICAgICAgICAgICAgICBMaW5lYXIKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJsb2dTY2FsZUJ1dHRvbl9bW2NvbHVtbi5uYW1lXV0iIG5hbWU9IkxPRyIgZGlzYWJsZWQ9IltbIV9hbGxvd0xvZ1NjYWxlKGNvbHVtbiwgc2Vzc2lvbkdyb3Vwcy4qKV1dIj4KICAgICAgICAgICAgICAgICAgICBMb2dhcml0aG1pYwogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJRVUFOVElMRSI+CiAgICAgICAgICAgICAgICAgICAgUXVhbnRpbGUKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuY29udHJvbC1wYW5lbCB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLmNvbHVtbiB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICAgIGJvcmRlcjogc29saWQgMXB4IGRhcmtncmF5OwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuY29sdW1uLXRpdGxlIHsKICAgICAgICAvKiBGaXQgZXZlcnkgdGl0bGUgaW4gb25lIGxpbmUgc28gdGhlIHJhZGlvIGJveGVzIGFsaWduIHZlcnRpY2FsbHkuICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAuY29sdW1ucy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAuc2NhbGUtcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiAycHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1hY3RpdmUtaXRlbS10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvd1thY3RpdmVdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctYWN0aXZlLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjdGFibGUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgei1pbmRleDogLTI7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2lvc10gI3RhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2ZpeGVkLXNlY3Rpb25zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgewogICAgICAgIHotaW5kZXg6IC0xOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gewogICAgICAgIC8qIEFueSB2YWx1ZSBvdGhlciB0aGFuIOKAmG5vbmXigJkgZm9yIHRoZSB0cmFuc2Zvcm0gcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYm90aCBhIHN0YWNraW5nIGNvbnRleHQgYW5kCiAgICAgICAgYSBjb250YWluaW5nIGJsb2NrLiBUaGUgb2JqZWN0IGFjdHMgYXMgYSBjb250YWluaW5nIGJsb2NrIGZvciBmaXhlZCBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzLiAqLwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2ZpeGVkLXNlY3Rpb25zXSB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5I2l0ZW1zIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiPjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiPjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXItY2VsbCI+PC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5jZWxsIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBsaW5lLWhlaWdodDogMDsKICAgICAgICBmb250LXNpemU6IDFweDsKICAgICAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgICB9CgogICAgICAuY2VsbFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NvbHVtbnNdXSIgYXM9ImNvbHVtbiI+CiAgICAgIDx2YWFkaW4tZ3JpZC1zaXplci1jZWxsIGNsYXNzPSJjZWxsIiBjb2x1bW49IltbY29sdW1uXV0iPiZuYnNwOzwvdmFhZGluLWdyaWQtc2l6ZXItY2VsbD4KICAgIDwvdGVtcGxhdGU+CgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFtwYXNzdGhyb3VnaF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc10pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYWxsOwogICAgICAgIHotaW5kZXg6IC0zOwogICAgICB9CgogICAgICA6aG9zdChbaW9zXVtzY3JvbGxpbmddKSB7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgIDpob3N0IHsKICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgIHotaW5kZXg6IC0zOwogICAgICAgaGVpZ2h0OiAwOwogICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICB9CgogICAgIDpob3N0KDpmb2N1cyksCiAgICAgLnByaW1hcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5wcmltYXJ5OmZvY3VzKSwKICAgICAuc2Vjb25kYXJ5OmZvY3VzLAogICAgIDo6c2xvdHRlZCguc2Vjb25kYXJ5OmZvY3VzKSB7CiAgICAgICBvdXRsaW5lOiBub25lOwogICAgIH0KICAgIDwvc3R5bGU+CgogICAgCiAgICA8ZGl2IGNsYXNzPSJwcmltYXJ5IiB0YWJpbmRleD0iMCIgcm9sZT0iZ3JpZGNlbGwiIG9uLWZvY3VzPSJfb25CYWl0Rm9jdXMiIG9uLWJsdXI9Il9vbkJhaXRCbHVyIj48ZGl2IGFyaWEtaGlkZGVuPSJ0cnVlIj4mbmJzcDs8L2Rpdj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InNlY29uZGFyeSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij48L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBbZGV0YWlsc2NlbGxdIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnZhYWRpbi1ncmlkLWNlbGxbZGV0YWlsc2NlbGxdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LWRldGFpbHMtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogQW5pbSAqLwogICAgICBAa2V5ZnJhbWVzIHZhYWRpbi1ncmlkLXNwaW4tMzYwIHsKICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3NwaW5uZXIgewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3IsICMwM0E5RjQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC04cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLThweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1sb2FkaW5nLXNwaW5uZXIpOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNzcGlubmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiB2YWFkaW4tZ3JpZC1zcGluLTM2MCA0MDBtcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiB2YWFkaW4tZ3JpZC1zcGluLTM2MCA0MDBtcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtsb2FkaW5nXSkgI2l0ZW1zIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2VsZWN0aW9uLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W3NlbGVjdGVkXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktMTAwLCByZ2IoMjQzLCAyNDMsIDI0MykpOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LXNlbGVjdGVkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAgI3RhYmxlOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbmF2aWdhdGluZ106bm90KFtpbnRlcmFjdGluZ10pKSBbZm9jdXNlZF0gPiAudmFhZGluLWdyaWQtcm93W2ZvY3VzZWRdID4gW2ZvY3VzZWRdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAzcHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWZvY3VzZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGVbcmVvcmRlcmluZ10gLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImRyYWdnaW5nIl0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktY29sb3IsICMwMDApOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMzAwbXM7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJhbGxvd2VkIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNzY3JvbGxlciAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgICNzY3JvbGxlciAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMC45NTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KFtpb3NdW2NvbHVtbi1yZXNpemluZ10pICNvdXRlcnNjcm9sbGVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAjZml4ZWRzaXplciwKICAgICAgI291dGVyc2l6ZXIgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI3RhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgI3RhYmxlW292ZXJmbG93LWhpZGRlbl0sCiAgICAgICNvdXRlcnNjcm9sbGVyW292ZXJmbG93LWhpZGRlbl0gewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXNpemVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzaXplcndyYXBwZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAtMTAwOwogICAgICB9CgogICAgICAjcmVvcmRlcmdob3N0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNvbHVtbiksCiAgICAgIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICAvKiBEZWZhdWx0IGJvcmRlcnMgKi8KICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLXJvdzpmaXJzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IC52YWFkaW4tZ3JpZC1yb3c6bm90KFtsYXN0cm93XSkgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIC8qIENvbHVtbiByZXNpemUgaGFuZGxlICovCgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlKTsKICAgICAgfQoKICAgICAgLyogQ2VsbHMgKi8KICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWhlYWRlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWZvb3Rlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSBbb2RkXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LW9kZC1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSlbbGFzdC1mcm96ZW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jZWxsLWxhc3QtZnJvemVuKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGU6bm90KFtzY3JvbGxpbmddKSB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IC52YWFkaW4tZ3JpZC1yb3c6aG92ZXIgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LWhvdmVyLWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsLnZhYWRpbi1ncmlkLWNlbGxbbGFzdGNvbHVtbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtc3R5bGVzIj48L3N0eWxlPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC10YWJsZS10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtc2VsZWN0aW9uLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1uYXZpZ2F0aW9uLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1hY3RpdmUtaXRlbS10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8dmFhZGluLWdyaWQtdGFibGUgaWQ9InNjcm9sbGVyIiBsb2FkaW5nJD0iW1tfbG9hZGluZ11dIiBiaW5kLWRhdGE9IltbX2JpbmREYXRhXV0iIHNpemU9Iltbc2l6ZV1dIiBjb2x1bW4tdHJlZT0iW1tfY29sdW1uVHJlZV1dIiByb3ctZGV0YWlscy10ZW1wbGF0ZT0iW1tfcm93RGV0YWlsc1RlbXBsYXRlXV0iIGNvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWQ9IltbY29sdW1uUmVvcmRlcmluZ0FsbG93ZWRdXSI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIgaWQ9ImhlYWRlciIgc2xvdD0iaGVhZGVyIiB0YXJnZXQ9IltbX2dldENvbnRlbnRUYXJnZXQoKV1dIiBjb2x1bW4tdHJlZT0iW1tfY29sdW1uVHJlZV1dIj48L3ZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlcj4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgaWQ9Iml0ZW1zIiBzbG90PSJpdGVtcyI+PC92YWFkaW4tZ3JpZC10YWJsZS1ib2R5PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIGlkPSJmb290ZXIiIHNsb3Q9ImZvb3RlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1mb290ZXI+CgogICAgICAKICAgICAgPHNsb3QgbmFtZT0iZm9vdGVyRm9jdXNUcmFwIj48L3Nsb3Q+CgogICAgICAKICAgICAgCiAgICAgIDxzbG90Pjwvc2xvdD4KCiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIGlkPSJmb290ZXJGb2N1c1RyYXAiIHNsb3Q9ImZvb3RlckZvY3VzVHJhcCIgb24tZm9jdXMtZ2FpbmVkPSJfb25Gb290ZXJGb2N1cyIgb24tZm9jdXMtbG9zdD0iX29uRm9jdXNvdXQiPgogICAgICA8L3ZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXA+CiAgICA8L3ZhYWRpbi1ncmlkLXRhYmxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shc2Vzc2lvbkdyb3VwXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBzZXNzaW9uIGdyb3VwIHNlbGVjdGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2Ugc2VsZWN0IGEgc2Vzc2lvbiBncm91cCB0byBzZWUgaXRzIG1ldHJpYy1ncmFwaHMgaGVyZS48L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhdmVNZXRyaWNzKHZpc2libGVTY2hlbWEuKildXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIG1ldHJpY3MgYXJlIGVuYWJsZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBlbmFibGUgc29tZSBtZXRyaWNzIHRvIHNlZSBjb250ZW50IGhlcmUuPC9wPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtdGFibGUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHZhYWRpbi1ncmlkIGNsYXNzPSJzZXNzaW9uLWdyb3VwLXRhYmxlIiBpZD0ic2Vzc2lvbkdyb3Vwc1RhYmxlIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkIGl0ZW1zPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPgogICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5UcmlhbCBJRDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+W1tpdGVtLm5hbWVdXTwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZW5hYmxlU2hvd01ldHJpY3NdXSI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIHdpZHRoPSI1ZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlNob3cgTWV0cmljczwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJ0YWJsZS1jZWxsIiBjaGVja2VkPSJ7e2V4cGFuZGVkfX0iPgogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zXV0iIGFzPSJocGFyYW1JbmZvIiBpbmRleC1hcz0iaHBhcmFtSW5kZXgiPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW1JbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwSFBhcmFtKGl0ZW0sIGhwYXJhbUluZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7dmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc319IiBhcz0ibWV0cmljSW5mbyIgaW5kZXgtYXM9Im1ldHJpY0luZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cE1ldHJpYyhpdGVtLCBtZXRyaWNJbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgY2xhc3M9InJvdy1kZXRhaWxzIj4KICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW2l0ZW1dXSIgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIiBjbGFzcz0ic2Vzc2lvbi1ncm91cC1kZXRhaWxzIj4KICAgICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzPgogICAgICA8L3RlbXBsYXRlPgogICAgPC92YWFkaW4tZ3JpZD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC50YWJsZS1oZWFkZXIgewogICAgICAgIC8qIGxpbmUtYnJlYWsgb3ZlcmZsb3dpbmcgY29sdW1uIGhlYWRlcnMgKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2Vzc2lvbi1ncm91cC1kZXRhaWxzIHsKICAgICAgICBoZWlnaHQ6IDM2MHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQodmlzaWJsZVNjaGVtYSwgc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgCiAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApXV0iPgogICAgICA8L3RmLWhwYXJhbXMtdGFibGUtdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIDxkaXY+CiAgICAgICAgQ2xpY2sgb3IgaG92ZXIgb3ZlciBhIHNlc3Npb24gZ3JvdXAgdG8gZGlzcGxheSBpdHMgdmFsdWVzIGhlcmUuCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgc2xvdD0iaGVhZGVyIiBjbGFzcz0idGFiLWJhciI+CiAgICAgICAgPHBhcGVyLXRhYnMgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFifX0iIHNsb3Q9InRvcCI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci10YWIgdmlldy1pZD0idGFibGUtdmlldyI+CiAgICAgICAgICAgIFRBQkxFIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJwYXJhbGxlbC1jb29yZHMtdmlldyI+CiAgICAgICAgICAgIFBBUkFMTEVMIENPT1JESU5BVEVTIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJzY2F0dGVyLXBsb3QtbWF0cml4LXZpZXciPgogICAgICAgICAgICBTQ0FUVEVSIFBMT1QgTUFUUklYIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC1hbmQtZmVlZGJhY2siPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYnVnUmVwb3J0VXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2J1Z1JlcG9ydFVybF1dIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9ImJ1Zy1yZXBvcnQiIHJhaXNlZCB0aXRsZT0iU2VuZCBhIGJ1ZyByZXBvcnQgb3IgZmVhdHVyZSByZXF1ZXN0Ij4KICAgICAgICAgICAgICAgICAgQnVnIFJlcG9ydCAvIEZlYXR1cmUgUmVxdWVzdAogICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVscFVybF1dIj4KICAgICAgICAgICAgICA8YSBocmVmJD0iW1toZWxwVXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImhlbHAtb3V0bGluZSIgdGl0bGU9IlZpZXcgZG9jdW1lbnRhdGlvbiI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgPC9wYXBlci10b29sYmFyPgogICAgICA8aXJvbi1wYWdlcyBzZWxlY3RlZD0iW1tfc2VsZWN0ZWRUYWJdXSIgY2xhc3M9ImZpdCB0YWItdmlldyI+CiAgICAgICAgPGRpdiBpZD0iMCIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgZW5hYmxlLXNob3ctbWV0cmljcz4KICAgICAgICAgIDwvdGYtaHBhcmFtcy10YWJsZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjEiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIj4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSIyIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLXBhZ2VzPgogICAgPC9wYXBlci1oZWFkZXItcGFuZWw+CgogICAgPHN0eWxlPgogICAgICAudGFiLXZpZXcgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAudGFiLWJhciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgIH0KICAgICAgLnRhYiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGYtaHBhcmFtcy10YWJsZS12aWV3IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgICAjYnVnLXJlcG9ydCB7CiAgICAgICAgYm9yZGVyOiBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkczsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC5oZWxwLWFuZC1mZWVkYmFjayBhIHsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtbWFpbiI+CiAgPHRlbXBsYXRlPgogICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUgaWQ9InF1ZXJ5LXBhbmUiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0ie3tfY29uZmlndXJhdGlvbn19IiBzZXNzaW9uLWdyb3Vwcz0ie3tfc2Vzc2lvbkdyb3Vwc319IiBkYXRhLWxvYWRlZC13aXRoLW5vbi1lbXB0eS1ocGFyYW1zPSJ7e19kYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtc319IiBkYXRhLWxvYWRlZC13aXRoLWVtcHR5LWhwYXJhbXM9Int7X2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1xdWVyeS1wYW5lPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaHBhcmFtcyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBocGFyYW1zIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIEV2ZW50IGZpbGVzIGFyZSBzdGlsbCBiZWluZyBsb2FkZWQgKHRyeSByZWxvYWRpbmcgdGhpcyBwYWdlKS4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtc11dIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUgaWQ9InNlc3Npb25zLXBhbmUiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBoZWxwLXVybD0iW1toZWxwVXJsXV0iIGJ1Zy1yZXBvcnQtdXJsPSJbW2J1Z1JlcG9ydFVybF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tfY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tfc2Vzc2lvbkdyb3Vwc11dIj4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgoKICAgIDxzdHlsZT4KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbWluLXdpZHRoOiAxMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogODAlOwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtbWVzaC1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzTWVzaExvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBtYXgtbWFya2Vycz0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgICAgPGgzIGNsYXNzPSJ0aXRsZSI+UG9pbnQgb2YgdmlldzwvaDM+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iYWxsLXJhZGlvLWJ1dHRvbiIgbmFtZT0iYWxsIj4KICAgICAgICAgICAgICAgICAgRGlzcGxheSBhbGwgcG9pbnRzCiAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJhbGwtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgIFpvb20gYW5kIGNlbnRlciBjYW1lcmEgdG8gZGlzcGxheSBhbGwgcG9pbnRzIGF0IG9uY2UuIE5vdGUsCiAgICAgICAgICAgICAgICAgIHRoYXQgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlCiAgICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgbmFtZT0idXNlciI+CiAgICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idXNlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InNoYXJlLXJhZGlvLWJ1dHRvbiIgbmFtZT0ic2hhcmUiPgogICAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InNoYXJlLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcG9pbnQgY2xvdWQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1tZXNoLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHNlbGVjdGVkLXZpZXc9IltbX3NlbGVjdGVkVmlld11dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWNvbnRhaW5lciIgb24tY2FtZXJhLXBvc2l0aW9uLWNoYW5nZT0iX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkIj4KICAgICAgICAgICAgICAgIDwvdGYtbWVzaC1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgLnNpZGViYXItc2VjdGlvbiBoMy50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIGgzLnRpdGxlIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC52aWV3LWNvbnRyb2wgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgICAvKiBMYXlvdXQgbXVzdCBiZSBob3Jpem9udGFsLCBpLmUuIGl0ZW1zIGFycmFuZ2VkIGluIGEgcm93LiBJZiBpdGVtcyBjYW5ub3QgZml0IGluIGEgcm93LAogICAgICAgKiB0aGV5IHNob3VsZCBiZSBtb3ZlZCB0byBuZXh0IGxpbmUuIEFsbCBpdGVtcyBtdXN0IGJlIHNxdWFyZSBhdCBhbGwgdGltZXMuIE1pbmltdW0gc2l6ZSBvZgogICAgICAgKiB0aGUgaXRlbSBpcyA0ODBweC4gVGhpcyBtZWFucyB0aGF0IG1heGltdW0gc2l6ZSBvZiB0aGUgaXRlbSBtdXN0IGJlIDQ4MHB4ICsgNDc5cHggPSA5NTlweC4KICAgICAgICogKi8KICAgICAgLmhvcml6b250YWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgdGYtbWVzaC1sb2FkZXIgewogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBmbGV4LWJhc2lzOiA0ODBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0ic2V0dGluZ3MiPgogICAgICA8aDI+U2V0dGluZ3M8L2gyPgogICAgICA8cGFwZXItY2hlY2tib3ggaWQ9ImF1dG8tcmVsb2FkLWNoZWNrYm94IiBjaGVja2VkPSJ7e2F1dG9SZWxvYWRFbmFibGVkfX0iPgogICAgICAgIFJlbG9hZCBkYXRhIGV2ZXJ5IDxzcGFuPltbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dPC9zcGFuPnMuCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnaW5hdGlvbkxpbWl0SW5wdXQiIGxhYmVsPSJQYWdpbmF0aW9uIGxpbWl0IiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHN0ZXA9IjEiIG9uLWNoYW5nZT0iX3BhZ2luYXRpb25MaW1pdENoYW5nZWQiIG9uLXZhbHVlLWNoYW5nZWQ9Il9wYWdpbmF0aW9uTGltaXRWYWxpZGF0ZSI+PC9wYXBlci1pbnB1dD4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgaWQ9InRvb2xiYXIiIHNsb3Q9ImhlYWRlciIgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGRpdiBpZD0idG9vbGJhci1jb250ZW50IiBzbG90PSJ0b3AiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxhIGhyZWY9IltbX2hvbWVQYXRoXV0iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvYT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWRdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLW1lc3NhZ2UiPgogICAgICAgICAgICAgIExvYWRpbmcgYWN0aXZlIGRhc2hib2FyZHPigKYKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgPHBhcGVyLXRhYnMgbm9pbmsgc2Nyb2xsYWJsZSBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkQWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRhYiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIHRpdGxlPSJbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXSI+CiAgICAgICAgICAgICAgICAgICAgW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChfZGFzaGJvYXJkRGF0YSwgZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcyldXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IklOQUNUSVZFIiBuby1sYWJlbC1mbG9hdCBub2luayBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHgiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9ImluYWN0aXZlLWRhc2hib2FyZHMtbWVudSIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkSW5hY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iPltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdsb2JhbC1hY3Rpb25zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaW5qZWN0ZWQtaGVhZGVyLWl0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1vdmVydmlldyI+PC9zbG90PgogICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5GYWlsZWQgdG8gbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBkYXNoYm9hcmRzLjwvaDM+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgVGVuc29yQm9hcmQgYmFja2VuZCBpcyBubyBsb25nZXIgcnVubmluZy4KICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhpcyBwYWdlIGlzIGNhY2hlZD8KICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIHRoYXQgeW914oCZdmUgZml4ZWQgdGhlIHByb2JsZW0sIGNsaWNrIHRoZSByZWxvYWQKICAgICAgICAgICAgICAgIGJ1dHRvbiBpbiB0aGUgdG9wLXJpZ2h0LgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2F1dG9SZWxvYWRFbmFibGVkXV0iPgogICAgICAgICAgICAgICAgICBXZeKAmWxsIHRyeSB0byByZWxvYWQgZXZlcnkKICAgICAgICAgICAgICAgICAgW1thdXRvUmVsb2FkSW50ZXJ2YWxTZWNzXV0mbmJzcDtzZWNvbmRzIGFzIHdlbGwuCiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjwvcD48cD4KICAgICAgICAgICAgICAgICAgICA8aT5Mb2cgZGlyZWN0b3J5OgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+PC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5ObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LjwvaDM+CiAgICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48L3A+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPjwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICBUaGVyZeKAmXMgbm8gZGFzaGJvYXJkIGJ5IHRoZSBuYW1lIG9mCiAgICAgICAgICAgICAgICDigJw8dHQ+W1tfc2VsZWN0ZWREYXNoYm9hcmRdXTwvdHQ+LuKAnQogICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTG9hZGVkXV0iPgogICAgICAgICAgICAgICAgPHA+WW91IGNhbiBzZWxlY3QgYSBkYXNoYm9hcmQgZnJvbSB0aGUgbGlzdCBhYm92ZS48L3A+PC90ZW1wbGF0ZT4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjwvcD48cD4KICAgICAgICAgICAgICAgICAgICA8aT5EYXRhIGxvY2F0aW9uOgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+PC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGlkPSJkYXNoYm9hcmRzLXRlbXBsYXRlIiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iIG9uLWRvbS1jaGFuZ2U9Il9vblRlbXBsYXRlQ2hhbmdlZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1jb250YWluZXIiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgZGF0YS1zZWxlY3RlZCQ9IltbX3NlbGVjdGVkU3RhdHVzKF9zZWxlY3RlZERhc2hib2FyZCwgZGFzaGJvYXJkRGF0dW0ucGx1Z2luKV1dIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTEwMCk7CiAgICAgIH0KCiAgICAgICN0b29sYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgICAgIC8qIEluY3JlYXNlIGNsaWNrYWJsZSBhcmVhIGZvciBjYXNlIHdoZXJlIHRpdGxlIGlzIGFuIGFuY2hvci4gKi8KICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBkaXNwbGF5OiB2YXIoLS10Yi10b29sYmFyLXRpdGxlLWRpc3BsYXksIGJsb2NrKTsKICAgICAgfQoKICAgICAgYS50b29sYmFyLXRpdGxlIHsKICAgICAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGFuY2hvciBjb2xvci4gKi8KICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGFuY2hvciB0ZXh0LWRlY29yYXRpb24uICovCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAudG9vbGJhci1tZXNzYWdlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb246IHsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHBhcGVyLWl0ZW0gewogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgICNpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUgewogICAgICAgIC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgYSB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjdG9vbGJhci1jb250ZW50IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAjY29udGVudC1wYW5lIHsKICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRlbnQgewogICAgICAgIGZsZXg6IDEgMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAvKiBIaWRlIHVuc2VsZWN0ZWQgZGFzaGJvYXJkcy4gV2Ugc3RpbGwgZGlzcGxheSB0aGVtIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgICAgICBvZiBoZWlnaHQgMCBzaW5jZSBQbG90dGFibGUgcHJvZHVjZXMgZGVnZW5lcmF0ZSBjaGFydHMgd2hlbiBjaGFydHMgYXJlCiAgICAgICAgIHJlbG9hZGVkIHdoaWxlIG5vdCBkaXNwbGF5ZWQuICovCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyOm5vdChbZGF0YS1zZWxlY3RlZF0pIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC8qKiBXZSBmdXJ0aGVyIG1ha2UgY29udGFpbmVycyBpbnZpc2libGUuIFNvbWUgZWxlbWVudHMgbWF5IGFuY2hvciB0bwogICAgICAgICAgICB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIHNldHRpbmcgdGhlIG1heAogICAgICAgICAgICBoZWlnaHQgaGVyZSB0byAwIHdpbGwgbm90IGhpZGUgdGhlbS4gKi8KICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyIGlmcmFtZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndhcm5pbmctbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIFtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgICNyZWxvYWQtYnV0dG9uLnJlZnJlc2hpbmcgewogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyByb3RhdGUgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+PHRiLXdlYmFwcD48L3RiLXdlYmFwcD48c2NyaXB0IHNyYz0iaW5kZXguanMiPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+", "ok": true, "headers": [ [ "content-type", "text/html; charset=utf-8" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/index.js": { "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7Ci8vIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgovKioKICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSBiYXNlLmpzIHdpbGwgYXR0ZW1wdCB0byBsb2FkIENsb3N1cmUncyBkZXBzIGZpbGUsIHVubGVzcwogKiB0aGUgZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cwogKiB0byBpbmNsdWRlIHRoZWlyIG93biBkZXBzIGZpbGUocykgZnJvbSBkaWZmZXJlbnQgbG9jYXRpb25zLgogKgogKiBBdm9pZCBpbmNsdWRpbmcgYmFzZS5qcyBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBzdHJpY3RseSBkaXNjb3VyYWdlZCBhbmQgbm90CiAqIHN1cHBvcnRlZC4gZ29vZy5yZXF1aXJlKC4uLikgd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBwcm92aWRlR29vZwogKi8KCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gT3ZlcnJpZGRlbiB0byB0cnVlIGJ5IHRoZSBjb21waWxlci4KICovCnZhciBDT01QSUxFRCA9IGZhbHNlOwoKCi8qKgogKiBCYXNlIG5hbWVzcGFjZSBmb3IgdGhlIENsb3N1cmUgbGlicmFyeS4gIENoZWNrcyB0byBzZWUgZ29vZyBpcyBhbHJlYWR5CiAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYmVmb3JlIGFzc2lnbmluZyB0byBwcmV2ZW50IGNsb2JiZXJpbmcgaWYKICogYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuCiAqCiAqIEBjb25zdAogKi8KdmFyIGdvb2cgPSBnb29nIHx8IHt9OwoKLyoqCiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4KICogaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsLW9iamVjdAogKgogKiBNb3JlIGluZm8gb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBoZXJlOgogKiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFOQWVXNFdrN0k3RlYwWTJ0Y1VGdlFkR01jODlrMnZkZ1NYSW53OF9udkNJL2VkaXQKICoKICogQGNvbnN0CiAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gc2VsZiB3b24ndCBiZSByZWZlcmVuY2VkIHVubGVzcyBgdGhpc2AgaXMgZmFsc3kuCiAqIEB0eXBlIHshR2xvYmFsfQogKi8KZ29vZy5nbG9iYWwgPQogICAgLy8gQ2hlY2sgYHRoaXNgIGZpcnN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIC8vIFZhbGlkIHVubGVzcyBydW5uaW5nIGFzIGFuIEVTIG1vZHVsZSBvciBpbiBhIGZ1bmN0aW9uIHdyYXBwZXIgY2FsbGVkCiAgICAvLyAgIHdpdGhvdXQgc2V0dGluZyBgdGhpc2AgcHJvcGVybHkuCiAgICAvLyBOb3RlIHRoYXQgYmFzZS5qcyBjYW4ndCB1c2VmdWxseSBiZSBpbXBvcnRlZCBhcyBhbiBFUyBtb2R1bGUsIGJ1dCBpdCBtYXkKICAgIC8vIGJlIGNvbXBpbGVkIGludG8gYnVuZGxlcyB0aGF0IGFyZSBsb2FkYWJsZSBhcyBFUyBtb2R1bGVzLgogICAgdGhpcyB8fAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9zZWxmCiAgICAvLyBGb3IgaW4tcGFnZSBicm93c2VyIGVudmlyb25tZW50cyBhbmQgd29ya2Vycy4KICAgIHNlbGY7CgoKLyoqCiAqIEEgaG9vayBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmaW5lIHZhbHVlcyBpbiB1bmNvbXBpbGVkIG1vZGUuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSwgYENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTYCBtYXkgYmUgZGVmaW5lZCBiZWZvcmUKICogbG9hZGluZyBiYXNlLmpzLiAgSWYgYSBrZXkgaXMgZGVmaW5lZCBpbiBgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVNgLAogKiBgZ29vZy5kZWZpbmVgIHdpbGwgdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcwogKiBhbGxvd3MgZmxhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBjb21waWxhdGlvbiAodGhpcyBpcyBub3JtYWxseQogKiBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgY29tcGlsZXIncyAiZGVmaW5lIiBmbGFnKS4KICoKICogRXhhbXBsZToKICogPHByZT4KICogICB2YXIgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVMgPSB7J2dvb2cuREVCVUcnOiBmYWxzZX07CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmluZSB2YWx1ZXMgaW4gdW5jb21waWxlZCBvciBjb21waWxlZCBtb2RlLAogKiBsaWtlIENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTIGJ1dCBlZmZlY3RpdmUgaW4gY29tcGlsZWQgY29kZS4gIEluCiAqIHVuY29tcGlsZWQgY29kZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0YWtlcyBwcmVjZWRlbmNlLgogKgogKiBBbHNvIHVubGlrZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0aGUgdmFsdWVzIG11c3QgYmUgbnVtYmVyLCBib29sZWFuIG9yCiAqIHN0cmluZyBsaXRlcmFscyBvciB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGFuIGVycm9yLgogKgogKiBXaGlsZSBhbnkgQGRlZmluZSB2YWx1ZSBtYXkgYmUgc2V0LCBvbmx5IHRob3NlIHNldCB3aXRoIGdvb2cuZGVmaW5lIHdpbGwgYmUKICogZWZmZWN0aXZlIGZvciB1bmNvbXBpbGVkIGNvZGUuCiAqCiAqIEV4YW1wbGU6CiAqIDxwcmU+CiAqICAgdmFyIENMT1NVUkVfREVGSU5FUyA9IHsnZ29vZy5ERUJVRyc6IGZhbHNlfSA7CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90IHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkLgogKiBAZGVwcmVjYXRlZCBVc2UgYHZhbCAhPT0gdW5kZWZpbmVkYCBpbnN0ZWFkLgogKi8KZ29vZy5pc0RlZiA9IGZ1bmN0aW9uKHZhbCkgewogIC8vIHZvaWQgMCBhbHdheXMgZXZhbHVhdGVzIHRvIHVuZGVmaW5lZCBhbmQgaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gZGVwZW5kIG9uCiAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAndW5kZWZpbmVkJy4KICByZXR1cm4gdmFsICE9PSB2b2lkIDA7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBzdHJpbmcuCiAqIEBkZXByZWNhdGVkIFVzZSBgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydgIGluc3RlYWQuCiAqLwpnb29nLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ3N0cmluZyc7Cn07CgoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGEgYm9vbGVhbi4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBib29sZWFuLgogKiBAZGVwcmVjYXRlZCBVc2UgYHR5cGVvZiB2YWwgPT09ICdib29sZWFuJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ2Jvb2xlYW4nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG51bWJlci4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhIG51bWJlci4KICogQGRlcHJlY2F0ZWQgVXNlIGB0eXBlb2YgdmFsID09PSAnbnVtYmVyJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNOdW1iZXIgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAnbnVtYmVyJzsKfTsKCgovKioKICogQnVpbGRzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcGF0aCwgZW5zdXJpbmcgdGhhdAogKiBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIG5vdCBvdmVyd3JpdHRlbi4gRm9yIGV4YW1wbGU6CiAqICJhLmIuYyIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTsKICogVXNlZCBieSBnb29nLnByb3ZpZGUgYW5kIGdvb2cuZXhwb3J0U3ltYm9sLgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCB0aGlzIGZpbGUgZGVmaW5lcy4KICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBgZ29vZy5nbG9iYWxgLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5leHBvcnRQYXRoXyA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmplY3QsIG9wdF9vYmplY3RUb0V4cG9ydFRvKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpOwogIHZhciBjdXIgPSBvcHRfb2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKCiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tCiAgLy8gbWV0aG9kcyBleHRlcm5lZCBpbiB0aGlzIG1hbm5lci4gIFNlZSB0aGUgdGVzdEV4cG9ydFN5bWJvbEV4Y2VwdGlvbnMgaW4KICAvLyBiYXNlX3Rlc3QuaHRtbCBmb3IgYW4gZXhhbXBsZS4KICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIHR5cGVvZiBjdXIuZXhlY1NjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pOwogIH0KCiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCAmJiBvcHRfb2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0CiAgICAgIGN1cltwYXJ0XSA9IG9wdF9vYmplY3Q7CiAgICB9IGVsc2UgaWYgKGN1cltwYXJ0XSAmJiBjdXJbcGFydF0gIT09IE9iamVjdC5wcm90b3R5cGVbcGFydF0pIHsKICAgICAgY3VyID0gY3VyW3BhcnRdOwogICAgfSBlbHNlIHsKICAgICAgY3VyID0gY3VyW3BhcnRdID0ge307CiAgICB9CiAgfQp9OwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZWQgdmFsdWUuIEluIHVuY29tcGlsZWQgbW9kZSwgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCBmcm9tCiAqIENMT1NVUkVfREVGSU5FUyBvciBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyBpZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgYW5kCiAqIGhhcyB0aGUgcHJvcGVydHkgc3BlY2lmaWVkLCBhbmQgb3RoZXJ3aXNlIHVzZWQgdGhlIGRlZmluZWQgZGVmYXVsdFZhbHVlLgogKiBXaGVuIGNvbXBpbGVkIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIG9yIHRoZQogKiB2YWx1ZSBzZXQgaW4gdGhlIENMT1NVUkVfREVGSU5FUyBvYmplY3QuIFJldHVybnMgdGhlIGRlZmluZWQgdmFsdWUgc28gdGhhdCBpdAogKiBjYW4gYmUgdXNlZCBzYWZlbHkgaW4gbW9kdWxlcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB0eXBlIE1VU1QgYmUgZWl0aGVyCiAqIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIHRvIHByb3ZpZGUuCiAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlCiAqIEByZXR1cm4ge1R9IFRoZSBkZWZpbmVkIHZhbHVlLgogKiBAdGVtcGxhdGUgVAogKi8KZ29vZy5kZWZpbmUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgdmFyIHVuY29tcGlsZWREZWZpbmVzID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVM7CiAgICB2YXIgZGVmaW5lcyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKICAgIGlmICh1bmNvbXBpbGVkRGVmaW5lcyAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLyAodW5jb21waWxlZERlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodW5jb21waWxlZERlZmluZXMsIG5hbWUpKSB7CiAgICAgIHZhbHVlID0gdW5jb21waWxlZERlZmluZXNbbmFtZV07CiAgICB9IGVsc2UgaWYgKAogICAgICAgIGRlZmluZXMgJiYKICAgICAgICAvLyBBbnRpIERPTS1jbG9iYmVyaW5nIHJ1bnRpbWUgY2hlY2sgKGIvMzc3MzY1NzYpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8gKGRlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmaW5lcywgbmFtZSkpIHsKICAgICAgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgfQogIH0KICByZXR1cm4gdmFsdWU7Cn07CgoKLyoqCiAqIEBkZWZpbmUge251bWJlcn0gSW50ZWdlciB5ZWFyIGluZGljYXRpbmcgdGhlIHNldCBvZiBicm93c2VyIGZlYXR1cmVzIHRoYXQgYXJlCiAqIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudC4gIFRoaXMgaXMgZGVmaW5lZCB0byBpbmNsdWRlIGV4YWN0bHkgZmVhdHVyZXMgdGhhdAogKiB3b3JrIGNvcnJlY3RseSBvbiBhbGwgIm1vZGVybiIgYnJvd3NlcnMgdGhhdCBhcmUgc3RhYmxlIG9uIEphbnVhcnkgMSBvZiB0aGUKICogc3BlY2lmaWVkIHllYXIuICBGb3IgZXhhbXBsZSwKICogYGBganMKICogaWYgKGdvb2cuRkVBVFVSRVNFVF9ZRUFSID49IDIwMTkpIHsKICogICAvLyB1c2UgQVBJcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gYWxsIG1ham9yIHN0YWJsZSBicm93c2VycyBKYW4gMSwgMjAxOQogKiB9IGVsc2UgewogKiAgIC8vIHBvbHlmaWxsIGZvciBvbGRlciBicm93c2VycwogKiB9CiAqIGBgYAogKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRoZSBwcmltYXJ5IGRlZmluZSBmb3IgcmVtb3ZpbmcKICogdW5uZWNlc3NhcnkgYnJvd3NlciBjb21wYXRpYmlsaXR5IGNvZGUgKHN1Y2ggYXMgcG9ueWZpbGxzIGFuZCB3b3JrYXJvdW5kcyksCiAqIGFuZCBzaG91bGQgaW5mb3JtIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBtb3N0IG90aGVyIGRlZmluZXM6CiAqIGBgYGpzCiAqIGNvbnN0IEFTU1VNRV9OQVRJVkVfUFJPTUlTRSA9CiAqICAgICBnb29nLmRlZmluZSgnQVNTVU1FX05BVElWRV9QUk9NSVNFJywgZ29vZy5GRUFUVVJFU0VUX1lFQVIgPj0gMjAxNik7CiAqIGBgYAogKgogKiBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgSUU5IGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIGJyb3dzZXIsIHdoaWNoIHdhcwogKiBmaXJzdCBhdmFpbGFibGUgSmFuIDEsIDIwMTIuCiAqCiAqIFRPRE8odXNlcik6IFJlZmVyZW5jZSBtb3JlIHRob3JvdWdoIGRvY3VtZW50YXRpb24gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICovCmdvb2cuRkVBVFVSRVNFVF9ZRUFSID0gZ29vZy5kZWZpbmUoJ2dvb2cuRkVBVFVSRVNFVF9ZRUFSJywgMjAxMik7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IERFQlVHIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBkZWJ1Z2dpbmcgY29kZQogKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uLiBJdCBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkCiAqIGJ5IHNwZWNpZnlpbmcgLS1kZWZpbmUgZ29vZy5ERUJVRz1mYWxzZSB0byB0aGUgQ2xvc3VyZSBDb21waWxlciBha2EKICogSlNDb21waWxlci4gRm9yIGV4YW1wbGUsIG1vc3QgdG9TdHJpbmcoKSBtZXRob2RzIHNob3VsZCBiZSBkZWNsYXJlZCBpbnNpZGUgYW4KICogImlmIChnb29nLkRFQlVHKSIgY29uZGl0aW9uYWwgYmVjYXVzZSB0aGV5IGFyZSBnZW5lcmFsbHkgdXNlZCBmb3IgZGVidWdnaW5nCiAqIHB1cnBvc2VzIGFuZCBpdCBpcyBkaWZmaWN1bHQgZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lCiAqIHdoZXRoZXIgdGhleSBhcmUgdXNlZC4KICovCmdvb2cuREVCVUcgPSBnb29nLmRlZmluZSgnZ29vZy5ERUJVRycsIHRydWUpOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzCiAqIHVzZWQgdG8gc2VsZWN0IGxvY2FsZSBzcGVjaWZpYyBkYXRhIHRvIGJlIGNvbXBpbGVkIGluIGpzIGJpbmFyeS4gQlVJTEQgcnVsZQogKiBjYW4gc3BlY2lmeSB0aGlzIHZhbHVlIGJ5ICItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+IiBhcyBhIGNvbXBpbGVyCiAqIG9wdGlvbi4KICoKICogVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbG9jYWxlIGNvZGUgZm9ybWF0IGlzIGltcG9ydGFudC4gWW91IHNob3VsZCB1c2UKICogdGhlIGNhbm9uaWNhbCBVbmljb2RlIGZvcm1hdCB3aXRoIGh5cGhlbiBhcyBhIGRlbGltaXRlci4gTGFuZ3VhZ2UgbXVzdCBiZQogKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuCiAqIFRoZXJlIGFyZSBmZXcgZXhhbXBsZXM6IHB0LUJSLCBlbiwgZW4tVVMsIHNyLUxhdGluLUJPLCB6aC1IYW5zLUNOLgogKgogKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOgogKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jVW5pY29kZV9MYW5ndWFnZV9hbmRfTG9jYWxlX0lkZW50aWZpZXJzCiAqCiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlCiAqIGh0dHA6Ly93d3cudzMub3JnL1dBSS9FUi9JRy9lcnQvaXNvNjM5Lmh0bS4gVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uIGZyb20KICogdGhpcyBydWxlOiB0aGUgSGVicmV3IGxhbmd1YWdlLiBGb3IgbGVnYWN5IHJlYXNvbnMgdGhlIG9sZCBjb2RlIChpdykgc2hvdWxkCiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKS4KICoKICovCmdvb2cuTE9DQUxFID0gZ29vZy5kZWZpbmUoJ2dvb2cuTE9DQUxFJywgJ2VuJyk7ICAvLyBkZWZhdWx0IHRvIGVuCgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gdHJ1c3RlZCBzaXRlcy4KICoKICogT24gdW50cnVzdGVkIHNpdGVzLCBzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMgY2FuIGJlIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiBieQogKiBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUsIERhdGVqcywgYW5kIEpRdWVyeSBhbmQgc2V0dGluZyB0aGlzIGZsYWcKICogdG8gZmFsc2UgZm9yY2VzIGNsb3N1cmUgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIHdoZW4gcG9zc2libGUuCiAqCiAqIElmIHlvdXIgSmF2YVNjcmlwdCBjYW4gYmUgbG9hZGVkIGJ5IGEgdGhpcmQgcGFydHkgc2l0ZSBhbmQgeW91IGFyZSB3YXJ5IGFib3V0CiAqIHJlbHlpbmcgb24gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgc3BlY2lmeQogKiAiLS1kZWZpbmUgZ29vZy5UUlVTVEVEX1NJVEU9ZmFsc2UiIHRvIHRoZSBjb21waWxlci4KICovCmdvb2cuVFJVU1RFRF9TSVRFID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJVU1RFRF9TSVRFJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm9qZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUuCiAqCiAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjb21wYXRpYmxlIHdpdGgKICogcnVubmluZyBpbiBFY21hU2NyaXB0IFN0cmljdCBtb2RlIG9yIHdhcm4gYWJvdXQgdW5hdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4KICogQHNlZSBodHRwczovL2dvby5nbC9QdWRRNHkKICoKICovCmdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSA9IGdvb2cuZGVmaW5lKCdnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEUnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgY29kZSB0aGF0IGNhbGxzIHtAbGluayBnb29nLnNldFRlc3RPbmx5fSBzaG91bGQKICogICAgIGJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAqLwpnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFJywgQ09NUElMRUQgJiYgIWdvb2cuREVCVUcpOwoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSBhIENocm9tZSBhcHAgQ1NQLWNvbXBsaWFudCBtZXRob2QgZm9yCiAqICAgICBsb2FkaW5nIHNjcmlwdHMgdmlhIGdvb2cucmVxdWlyZS4gQHNlZSBhcHBlbmRTY3JpcHRTcmNOb2RlXy4KICovCmdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HJywgZmFsc2UpOwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZXNwYWNlIGluIENsb3N1cmUuCiAqCiAqIEEgbmFtZXNwYWNlIG1heSBvbmx5IGJlIGRlZmluZWQgb25jZSBpbiBhIGNvZGViYXNlLiBJdCBtYXkgYmUgZGVmaW5lZCB1c2luZwogKiBnb29nLnByb3ZpZGUoKSBvciBnb29nLm1vZHVsZSgpLgogKgogKiBUaGUgcHJlc2VuY2Ugb2Ygb25lIG9yIG1vcmUgZ29vZy5wcm92aWRlKCkgY2FsbHMgaW4gYSBmaWxlIGluZGljYXRlcwogKiB0aGF0IHRoZSBmaWxlIGRlZmluZXMgdGhlIGdpdmVuIG9iamVjdHMvbmFtZXNwYWNlcy4KICogUHJvdmlkZWQgc3ltYm9scyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4KICoKICogSW4gYWRkaXRpb24sIGdvb2cucHJvdmlkZSgpIGNyZWF0ZXMgdGhlIG9iamVjdCBzdHVicyBmb3IgYSBuYW1lc3BhY2UKICogKGZvciBleGFtcGxlLCBnb29nLnByb3ZpZGUoImdvb2cuZm9vLmJhciIpIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QKICogZ29vZy5mb28uYmFyIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QpLgogKgogKiBCdWlsZCB0b29scyBhbHNvIHNjYW4gZm9yIHByb3ZpZGUvcmVxdWlyZS9tb2R1bGUgc3RhdGVtZW50cwogKiB0byBkaXNjZXJuIGRlcGVuZGVuY2llcywgYnVpbGQgZGVwZW5kZW5jeSBmaWxlcyAoc2VlIGRlcHMuanMpLCBldGMuCiAqCiAqIEBzZWUgZ29vZy5yZXF1aXJlCiAqIEBzZWUgZ29vZy5tb2R1bGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZXNwYWNlIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICovCmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBpZiAoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuJyk7CiAgfQogIGlmICghQ09NUElMRUQpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4KICAgIC8vIEEgZ29vZy5tb2R1bGUvZ29vZy5wcm92aWRlIG1hcHMgYSBnb29nLnJlcXVpcmUgdG8gYSBzcGVjaWZpYyBmaWxlCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBhbHJlYWR5IGRlY2xhcmVkLicpOwogICAgfQogIH0KCiAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmogVGhlIG9iamVjdCB0byBlbWJlZCBpbiB0aGUgbmFtZXNwYWNlLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iaikgewogIGlmICghQ09NUElMRUQpIHsKICAgIGRlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV07CgogICAgdmFyIG5hbWVzcGFjZSA9IG5hbWU7CiAgICB3aGlsZSAoKG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHJpbmcoMCwgbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcuJykpKSkgewogICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTsKICAgIH0KICB9CgogIGdvb2cuZXhwb3J0UGF0aF8obmFtZSwgb3B0X29iaik7Cn07CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0gez9XaW5kb3c9fSBvcHRfd2luZG93IFRoZSB3aW5kb3cgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBub25jZS4KICogICAgIERlZmF1bHRzIHRvIGdsb2JhbCBjb250ZXh0LgogKiBAcmV0dXJuIHtzdHJpbmd9IENTUCBub25jZSBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uY2UgaXMgcHJlc2VudC4KICovCmdvb2cuZ2V0U2NyaXB0Tm9uY2UgPSBmdW5jdGlvbihvcHRfd2luZG93KSB7CiAgaWYgKG9wdF93aW5kb3cgJiYgb3B0X3dpbmRvdyAhPSBnb29nLmdsb2JhbCkgewogICAgcmV0dXJuIGdvb2cuZ2V0U2NyaXB0Tm9uY2VfKG9wdF93aW5kb3cuZG9jdW1lbnQpOwogIH0KICBpZiAoZ29vZy5jc3BOb25jZV8gPT09IG51bGwpIHsKICAgIGdvb2cuY3NwTm9uY2VfID0gZ29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpOwogIH0KICByZXR1cm4gZ29vZy5jc3BOb25jZV87Cn07CgoKLyoqCiAqIEFjY29yZGluZyB0byB0aGUgQ1NQMyBzcGVjIGEgbm9uY2UgbXVzdCBiZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuCiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvI2dyYW1tYXJkZWYtYmFzZTY0LXZhbHVlCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5OT05DRV9QQVRURVJOXyA9IC9eW1x3Ky9fLV0rWz1dezAsMn0kLzsKCgovKioKICogQHByaXZhdGUgez9zdHJpbmd9CiAqLwpnb29nLmNzcE5vbmNlXyA9IG51bGw7CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jCiAqIEByZXR1cm4ge3N0cmluZ30gQ1NQIG5vbmNlIG9yIGVtcHR5IHN0cmluZyBpZiBubyBub25jZSBpcyBwcmVzZW50LgogKiBAcHJpdmF0ZQogKi8KZ29vZy5nZXRTY3JpcHROb25jZV8gPSBmdW5jdGlvbihkb2MpIHsKICB2YXIgc2NyaXB0ID0gZG9jLnF1ZXJ5U2VsZWN0b3IgJiYgZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTsKICBpZiAoc2NyaXB0KSB7CiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBub25jZSBmcm9tIHRoZSBJREwgcHJvcGVydHkgZmlyc3QsIGJlY2F1c2UgYnJvd3NlcnMgdGhhdAogICAgLy8gaW1wbGVtZW50IGFkZGl0aW9uYWwgbm9uY2UgcHJvdGVjdGlvbiBmZWF0dXJlcyAoY3VycmVudGx5IG9ubHkgQ2hyb21lKSB0bwogICAgLy8gcHJldmVudCBub25jZSBzdGVhbGluZyB2aWEgQ1NTIGRvIG5vdCBleHBvc2UgdGhlIG5vbmNlIHZpYSBhdHRyaWJ1dGVzLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OQogICAgdmFyIG5vbmNlID0gc2NyaXB0Wydub25jZSddIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7CiAgICBpZiAobm9uY2UgJiYgZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KG5vbmNlKSkgewogICAgICByZXR1cm4gbm9uY2U7CiAgICB9CiAgfQogIHJldHVybiAnJzsKfTsKCgovKioKICogTW9kdWxlIGlkZW50aWZpZXIgdmFsaWRhdGlvbiByZWdleHAuCiAqIE5vdGU6IFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hlY2ssIGl0IGlzIHZlcnkgcG9zc2libGUgdG8gYmUgbW9yZSBsZW5pZW50LAogKiAgIHRoZSBwcmltYXJ5IGV4Y2x1c2lvbiBoZXJlIGlzICIvIiBhbmQgIlwiIGFuZCBhIGxlYWRpbmcgIi4iLCB0aGVzZQogKiAgIHJlc3RyaWN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gbGVhdmUgdGhlIGRvb3Igb3BlbiBmb3IgdXNpbmcgZ29vZy5yZXF1aXJlCiAqICAgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIHJhdGhlciB0aGFuIG1vZHVsZSBpZGVudGlmaWVycy4KICogQHByaXZhdGUKICovCmdvb2cuVkFMSURfTU9EVUxFX1JFXyA9IC9eW2EtekEtWl8kXVthLXpBLVowLTkuXyRdKiQvOwoKCi8qKgogKiBEZWZpbmVzIGEgbW9kdWxlIGluIENsb3N1cmUuCiAqCiAqIE1hcmtzIHRoYXQgdGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlIGFuZCBjbGFpbXMgdGhlIG5hbWVzcGFjZS4KICoKICogQSBuYW1lc3BhY2UgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIGEgY29kZWJhc2UuIEl0IG1heSBiZSBkZWZpbmVkIHVzaW5nCiAqIGdvb2cucHJvdmlkZSgpIG9yIGdvb2cubW9kdWxlKCkuCiAqCiAqIGdvb2cubW9kdWxlKCkgaGFzIHRocmVlIHJlcXVpcmVtZW50czoKICogLSBnb29nLm1vZHVsZSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyBnb29nLnByb3ZpZGUuCiAqIC0gZ29vZy5tb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmaWxlLgogKiAtIG9ubHkgb25lIGdvb2cubW9kdWxlIGlzIGFsbG93ZWQgcGVyIGZpbGUuCiAqCiAqIFdoZW4gYSBnb29nLm1vZHVsZSBhbm5vdGF0ZWQgZmlsZSBpcyBsb2FkZWQsIGl0IGlzIGVuY2xvc2VkIGluCiAqIGEgc3RyaWN0IGZ1bmN0aW9uIGNsb3N1cmUuIFRoaXMgbWVhbnMgdGhhdDoKICogLSBhbnkgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEgZ29vZy5tb2R1bGUgZmlsZSBhcmUgcHJpdmF0ZSB0byB0aGUgZmlsZQogKiAobm90IGdsb2JhbCksIHRob3VnaCB0aGUgY29tcGlsZXIgaXMgZXhwZWN0ZWQgdG8gaW5saW5lIHRoZSBtb2R1bGUuCiAqIC0gVGhlIGNvZGUgbXVzdCBvYmV5IGFsbCB0aGUgcnVsZXMgb2YgInN0cmljdCIgSmF2YVNjcmlwdC4KICogLSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyAidXNlIHN0cmljdCIKICoKICogTk9URTogdW5saWtlIGdvb2cucHJvdmlkZSwgZ29vZy5tb2R1bGUgZG9lcyBub3QgZGVjbGFyZSBhbnkgc3ltYm9scyBieQogKiBpdHNlbGYuIElmIGRlY2xhcmVkIHN5bWJvbHMgYXJlIGRlc2lyZWQsIHVzZQogKiBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKCkuCiAqCiAqCiAqIFNlZSB0aGUgcHVibGljIGdvb2cubW9kdWxlIHByb3Bvc2FsOiBodHRwOi8vZ29vLmdsL1ZhMWhpbgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLCBpcyBleHBlY3RlZCBidXQgbm90IHJlcXVpcmVkLgogKiBAcmV0dXJuIHt2b2lkfQogKi8KZ29vZy5tb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSB8fAogICAgICBuYW1lLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pID09IC0xKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGlkZW50aWZpZXInKTsKICB9CiAgaWYgKCFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ01vZHVsZSAnICsgbmFtZSArICcgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LiBOb3RlLCAnICsKICAgICAgICAnbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mICcgKwogICAgICAgICdwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3VcJ3JlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBhIG1vZHVsZSB2aWEgYSAnICsKICAgICAgICAnc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSAnICsKICAgICAgICAnbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogJyArCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L3dpa2kvZ29vZy5tb2R1bGU6LWFuLUVTNi1tb2R1bGUtbGlrZS1hbHRlcm5hdGl2ZS10by1nb29nLnByb3ZpZGUuJyk7CiAgfQogIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cubW9kdWxlIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuJyk7CiAgfQoKICAvLyBTdG9yZSB0aGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2FkZXIuCiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSA9IG5hbWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNhbWUgbmFtZXNwYWNlIGlzbid0IHByb3ZpZGVkIHR3aWNlLgogICAgLy8gQSBnb29nLm1vZHVsZS9nb29nLnByb3ZpZGUgbWFwcyBhIGdvb2cucmVxdWlyZSB0byBhIHNwZWNpZmljIGZpbGUKICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZXNwYWNlICInICsgbmFtZSArICciIGFscmVhZHkgZGVjbGFyZWQuJyk7CiAgICB9CiAgICBkZWxldGUgZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdOwogIH0KfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1vZHVsZSBpZGVudGlmaWVyLgogKiBAcmV0dXJuIHs/fSBUaGUgbW9kdWxlIGV4cG9ydHMgZm9yIGFuIGFscmVhZHkgbG9hZGVkIG1vZHVsZSBvciBudWxsLgogKgogKiBOb3RlOiBUaGlzIGlzIG5vdCBhbiBhbHRlcm5hdGl2ZSB0byBnb29nLnJlcXVpcmUsIGl0IGRvZXMgbm90CiAqIGluZGljYXRlIGEgaGFyZCBkZXBlbmRlbmN5LCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUKICogYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvciB0byBhY2Nlc3MgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUKICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbW9kdWxlIGlkZW50aWZpZXIuCiAqIEByZXR1cm4gez99IFRoZSBtb2R1bGUgZXhwb3J0cyBmb3IgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIG9yIG51bGwuCiAqIEBwcml2YXRlCiAqLwpnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8gPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFDT01QSUxFRCkgewogICAgaWYgKG5hbWUgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXykgewogICAgICByZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lXS5leHBvcnRzOwogICAgfSBlbHNlIGlmICghZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdKSB7CiAgICAgIHZhciBucyA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpOwogICAgICByZXR1cm4gbnMgIT0gbnVsbCA/IG5zIDogbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn07CgoKLyoqCiAqIFR5cGVzIG9mIG1vZHVsZXMgdGhlIGRlYnVnIGxvYWRlciBjYW4gbG9hZC4KICogQGVudW0ge3N0cmluZ30KICovCmdvb2cuTW9kdWxlVHlwZSA9IHsKICBFUzY6ICdlczYnLAogIEdPT0c6ICdnb29nJwp9OwoKCi8qKgogKiBAcHJpdmF0ZSB7P3sKICogICBtb2R1bGVOYW1lOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAqICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTpib29sZWFuLAogKiAgIHR5cGU6ID9nb29nLk1vZHVsZVR5cGUKICogfX0KICovCmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gbnVsbDsKCgovKioKICogQHByaXZhdGUKICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGdvb2cubW9kdWxlIG9yIGFuIGVzNiBtb2R1bGUgaXMgY3VycmVudGx5IGJlaW5nCiAqICAgICBpbml0aWFsaXplZC4KICovCmdvb2cuaXNJbk1vZHVsZUxvYWRlcl8gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSB8fCBnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCk7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBnb29nLm1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfICYmCiAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGUgPT0gZ29vZy5Nb2R1bGVUeXBlLkdPT0c7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gZXM2IG1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfID0gZnVuY3Rpb24oKSB7CiAgdmFyIGluTG9hZGVyID0gISFnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJgogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlID09IGdvb2cuTW9kdWxlVHlwZS5FUzY7CgogIGlmIChpbkxvYWRlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKCiAgaWYgKGpzY29tcCkgewogICAgLy8ganNjb21wIG1heSBub3QgaGF2ZSBnZXRDdXJyZW50TW9kdWxlUGF0aCBpZiB0aGlzIGlzIGEgY29tcGlsZWQgYnVuZGxlCiAgICAvLyB0aGF0IGhhcyBzb21lIG9mIHRoZSBydW50aW1lLCBidXQgbm90IGFsbCBvZiBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAvLyBvcHRpbWl6YXRpb25zIGFyZSB0dXJuZWQgb24gc28gdGhlIHVudXNlZCBydW50aW1lIGlzIHJlbW92ZWQgYnV0IHJlbmFtaW5nCiAgICAvLyBhbmQgQ2xvc3VyZSBwYXNzIGFyZSBvZmYgKHNvICRqc2NvbXAgaXMgc3RpbGwgbmFtZWQgJGpzY29tcCBhbmQgdGhlCiAgICAvLyBnb29nLnByb3ZpZGUvcmVxdWlyZSBjYWxscyBzdGlsbCBleGlzdCkuCiAgICBpZiAodHlwZW9mIGpzY29tcC5nZXRDdXJyZW50TW9kdWxlUGF0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCdW5kbGVkIEVTNiBtb2R1bGUuCiAgICByZXR1cm4gISFqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTsKICB9CgogIHJldHVybiBmYWxzZTsKfTsKCgovKioKICogUHJvdmlkZSB0aGUgbW9kdWxlJ3MgZXhwb3J0cyBhcyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgb2JqZWN0IHVuZGVyIHRoZQogKiBtb2R1bGUncyBkZWNsYXJlZCBuYW1lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBnb29nLm1vZHVsZQogKiBmb3IgZmlsZXMgdGhhdCBoYXZlIGV4aXN0aW5nIHVzYWdlcy4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgPSBmdW5jdGlvbigpIHsKICBpZiAoIUNPTVBJTEVEICYmICFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ2dvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSAnICsKICAgICAgICAnd2l0aGluIGEgZ29vZy5tb2R1bGUnKTsKICB9CiAgaWYgKCFDT01QSUxFRCAmJiAhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byAnICsKICAgICAgICAnZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZS4nKTsKICB9CiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8uZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSA9IHRydWU7Cn07CgoKLyoqCiAqIEFzc29jaWF0ZXMgYW4gRVM2IG1vZHVsZSB3aXRoIGEgQ2xvc3VyZSBtb2R1bGUgSUQgc28gdGhhdCBpcyBhdmFpbGFibGUgdmlhCiAqIGdvb2cucmVxdWlyZS4gVGhlIGFzc29jaWF0ZWQgSUQgIGFjdHMgbGlrZSBhIGdvb2cubW9kdWxlIElEIC0gaXQgZG9lcyBub3QKICogY3JlYXRlIGFueSBnbG9iYWwgbmFtZXMsIGl0IGlzIG1lcmVseSBhdmFpbGFibGUgdmlhIGdvb2cucmVxdWlyZSAvCiAqIGdvb2cubW9kdWxlLmdldCAvIGdvb2cuZm9yd2FyZERlY2xhcmUgLyBnb29nLnJlcXVpcmVUeXBlLiBnb29nLnJlcXVpcmUgYW5kCiAqIGdvb2cubW9kdWxlLmdldCB3aWxsIHJldHVybiB0aGUgZW50aXJlIG1vZHVsZSBhcyBpZiBpdCB3YXMgaW1wb3J0IConZC4gVGhpcwogKiBhbGxvd3MgQ2xvc3VyZSBmaWxlcyB0byByZWZlcmVuY2UgRVM2IG1vZHVsZXMgZm9yIHRoZSBzYWtlIG9mIG1pZ3JhdGlvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm92aWRlfQogKi8KZ29vZy5kZWNsYXJlTW9kdWxlSWQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICBpZiAoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gJyArCiAgICAgICAgICAnd2l0aGluIGFuIEVTNiBtb2R1bGUnKTsKICAgIH0KICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJiBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdnb29nLmRlY2xhcmVNb2R1bGVJZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLicpOwogICAgfQogICAgaWYgKG5hbWVzcGFjZSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicgKyBuYW1lc3BhY2UgKyAnIiBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIH0KICB9CiAgaWYgKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfKSB7CiAgICAvLyBOb3QgYnVuZGxlZCAtIGRlYnVnIGxvYWRpbmcuCiAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lID0gbmFtZXNwYWNlOwogIH0gZWxzZSB7CiAgICAvLyBCdW5kbGVkIC0gbm90IGRlYnVnIGxvYWRpbmcsIG5vIG1vZHVsZSBsb2FkZXIgc3RhdGUuCiAgICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICAgIGlmICghanNjb21wIHx8IHR5cGVvZiBqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGggIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnTW9kdWxlIHdpdGggbmFtZXNwYWNlICInICsgbmFtZXNwYWNlICsKICAgICAgICAgICciIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4nKTsKICAgIH0KICAgIHZhciBleHBvcnRzID0ganNjb21wLnJlcXVpcmUoanNjb21wLmdldEN1cnJlbnRNb2R1bGVQYXRoKCkpOwogICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lc3BhY2VdID0gewogICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuRVM2LAogICAgICBtb2R1bGVJZDogbmFtZXNwYWNlCiAgICB9OwogIH0KfTsKCgovKioKICogTWFya3MgdGhhdCB0aGUgY3VycmVudCBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcsIGFuZCBuZXZlciBmb3IKICogbGl2ZSBjb2RlIGluIHByb2R1Y3Rpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIHVuaXQgdGVzdHMsIHRoZSBtZXNzYWdlIG1heSBvcHRpb25hbGx5IGJlIGFuIGV4YWN0IG5hbWVzcGFjZQogKiBmb3IgdGhlIHRlc3QgKGUuZy4gJ2dvb2cuc3RyaW5nVGVzdCcpLiBUaGUgbGludGVyIHdpbGwgdGhlbiBpZ25vcmUgdGhlIGV4dHJhCiAqIHByb3ZpZGUgKGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGNvZGUpLgogKgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBlcnJvciB0aGF0J3MKICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogKi8KZ29vZy5zZXRUZXN0T25seSA9IGZ1bmN0aW9uKG9wdF9tZXNzYWdlKSB7CiAgaWYgKGdvb2cuRElTQUxMT1dfVEVTVF9PTkxZX0NPREUpIHsKICAgIG9wdF9tZXNzYWdlID0gb3B0X21lc3NhZ2UgfHwgJyc7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ0ltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCcgKwogICAgICAgIChvcHRfbWVzc2FnZSA/ICc6ICcgKyBvcHRfbWVzc2FnZSA6ICcuJykpOwogIH0KfTsKCgovKioKICogRm9yd2FyZCBkZWNsYXJlcyBhIHN5bWJvbC4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IHRoZQogKiBzeW1ib2wgbWF5IGJlIHVzZWQgaW4gdGhlIHNvdXJjZSB5ZXQgaXMgbm90IHJlcXVpcmVkIGFuZCBtYXkgbm90IGJlIHByb3ZpZGVkCiAqIGluIGNvbXBpbGF0aW9uLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbiBpcyBjb2RlIHRoYXQgdGFrZXMgYSB0eXBlIGFzIGEKICogZnVuY3Rpb24gcGFyYW1ldGVyIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJlcXVpcmUgaXQuIEJ5IGZvcndhcmQgZGVjbGFyaW5nCiAqIGluc3RlYWQgb2YgcmVxdWlyaW5nLCBubyBoYXJkIGRlcGVuZGVuY3kgaXMgbWFkZSwgYW5kIChpZiBub3QgcmVxdWlyZWQKICogZWxzZXdoZXJlKSB0aGUgbmFtZXNwYWNlIG1heSBuZXZlciBiZSByZXF1aXJlZCBhbmQgdGh1cywgbm90IGJlIHB1bGxlZAogKiBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmFyeS4gSWYgaXQgaXMgcmVxdWlyZWQgZWxzZXdoZXJlLCBpdCB3aWxsIGJlIHR5cGUKICogY2hlY2tlZCBhcyBub3JtYWwuCiAqCiAqIEJlZm9yZSB1c2luZyBnb29nLmZvcndhcmREZWNsYXJlLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAogKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvd2lraS9CYWQtVHlwZS1Bbm5vdGF0aW9uIHRvCiAqIHVuZGVyc3RhbmQgdGhlIG9wdGlvbnMgYW5kIHRyYWRlb2ZmcyB3aGVuIHdvcmtpbmcgd2l0aCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWVzcGFjZSB0byBmb3J3YXJkIGRlY2xhcmUgaW4gdGhlIGZvcm0gb2YKICogICAgICJnb29nLnBhY2thZ2UucGFydCIuCiAqLwpnb29nLmZvcndhcmREZWNsYXJlID0gZnVuY3Rpb24obmFtZSkge307CgoKLyoqCiAqIEZvcndhcmQgZGVjbGFyZSB0eXBlIGluZm9ybWF0aW9uLiBVc2VkIHRvIGFzc2lnbiB0eXBlcyB0byBnb29nLmdsb2JhbAogKiByZWZlcmVuY2VkIG9iamVjdCB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdW5rbm93biB0eXBlIHJlZmVyZW5jZXMKICogYW5kIHRodXMgYmxvY2sgcHJvcGVydHkgZGlzYW1iaWd1YXRpb24uCiAqLwpnb29nLmZvcndhcmREZWNsYXJlKCdEb2N1bWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdIVE1MU2NyaXB0RWxlbWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdYTUxIdHRwUmVxdWVzdCcpOwoKCmlmICghQ09NUElMRUQpIHsKICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBnb29nLnByb3ZpZGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGZvcgogICAqIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIGltcGxpY2l0IG5hbWVzcGFjZXMuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQuCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmlzUHJvdmlkZWRfID0gZnVuY3Rpb24obmFtZSkgewogICAgcmV0dXJuIChuYW1lIGluIGdvb2cubG9hZGVkTW9kdWxlc18pIHx8CiAgICAgICAgKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV0gJiYgZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZSkgIT0gbnVsbCk7CiAgfTsKCiAgLyoqCiAgICogTmFtZXNwYWNlcyBpbXBsaWNpdGx5IGRlZmluZWQgYnkgZ29vZy5wcm92aWRlLiBGb3IgZXhhbXBsZSwKICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlcyB0aGF0ICdnb29nJyBhbmQKICAgKiAnZ29vZy5ldmVudHMnIG11c3QgYmUgbmFtZXNwYWNlcy4KICAgKgogICAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgKGJvb2xlYW58dW5kZWZpbmVkKT59CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7J2dvb2cubW9kdWxlJzogdHJ1ZX07CgogIC8vIE5PVEU6IFdlIGFkZCBnb29nLm1vZHVsZSBhcyBhbiBpbXBsaWNpdCBuYW1lc3BhY2UgYXMgZ29vZy5tb2R1bGUgaXMgZGVmaW5lZAogIC8vIGhlcmUgYW5kIGJlY2F1c2UgdGhlIGV4aXN0aW5nIG1vZHVsZSBwYWNrYWdlIGhhcyBub3QgYmVlbiBtb3ZlZCB5ZXQgb3V0IG9mCiAgLy8gdGhlIGdvb2cubW9kdWxlIG5hbWVzcGFjZS4gVGhpcyBzYXRpc2lmaWVzIGJvdGggdGhlIGRlYnVnIGxvYWRlciBhbmQKICAvLyBhaGVhZC1vZi10aW1lIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KfQoKCi8qKgogKiBSZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBpdHMgZnVsbHkgcXVhbGlmaWVkIGV4dGVybmFsIG5hbWUuICBUaGUgb2JqZWN0CiAqIGlzIG5vdCBmb3VuZCBpZiBudWxsIG9yIHVuZGVmaW5lZC4gIElmIHlvdSBhcmUgdXNpbmcgYSBjb21waWxhdGlvbiBwYXNzIHRoYXQKICogcmVuYW1lcyBwcm9wZXJ0eSBuYW1lcyBiZXdhcmUgdGhhdCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGZpbmQgcmVuYW1lZAogKiBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X29iaiBUaGUgb2JqZWN0IHdpdGhpbiB3aGljaCB0byBsb29rOyBkZWZhdWx0IGlzCiAqICAgICB8Z29vZy5nbG9iYWx8LgogKiBAcmV0dXJuIHs/fSBUaGUgdmFsdWUgKG9iamVjdCBvciBwcmltaXRpdmUpIG9yLCBpZiBub3QgZm91bmQsIG51bGwuCiAqLwpnb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHsKICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CiAgdmFyIGN1ciA9IG9wdF9vYmogfHwgZ29vZy5nbG9iYWw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgY3VyID0gY3VyW3BhcnRzW2ldXTsKICAgIGlmIChjdXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIGN1cjsKfTsKCgovKioKICogR2xvYmFsaXplcyBhIHdob2xlIG5hbWVzcGFjZSwgc3VjaCBhcyBnb29nIG9yIGdvb2cubGFuZy4KICoKICogQHBhcmFtIHshT2JqZWN0fSBvYmogVGhlIG5hbWVzcGFjZSB0byBnbG9iYWxpemUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by4KICogQGRlcHJlY2F0ZWQgUHJvcGVydGllcyBtYXkgYmUgZXhwbGljaXRseSBleHBvcnRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLCBidXQKICogICAgIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBkb25lIGluIGJ1bGsuCiAqLwpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uKG9iaiwgb3B0X2dsb2JhbCkgewogIHZhciBnbG9iYWwgPSBvcHRfZ2xvYmFsIHx8IGdvb2cuZ2xvYmFsOwogIGZvciAodmFyIHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF07CiAgfQp9OwoKCi8qKgogKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIGEgZmlsZSB0byB0aGUgZmlsZXMgaXQgcmVxdWlyZXMuCiAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoIFRoZSBwYXRoIHRvIHRoZSBqcyBmaWxlLgogKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGgKICogICAgIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyB0aGlzIGZpbGUgcHJvdmlkZXMuCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aAogKiAgICAgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIHRoaXMgZmlsZSByZXF1aXJlcy4KICogQHBhcmFtIHtib29sZWFufCFPYmplY3Q8c3RyaW5nPj19IG9wdF9sb2FkRmxhZ3MgUGFyYW1ldGVycyBpbmRpY2F0aW5nCiAqICAgICBob3cgdGhlIGZpbGUgbXVzdCBiZSBsb2FkZWQuICBUaGUgYm9vbGVhbiAndHJ1ZScgaXMgZXF1aXZhbGVudAogKiAgICAgdG8geydtb2R1bGUnOiAnZ29vZyd9IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFZhbGlkIHByb3BlcnRpZXMKICogICAgIGFuZCB2YWx1ZXMgaW5jbHVkZSB7J21vZHVsZSc6ICdnb29nJ30gYW5kIHsnbGFuZyc6ICdlczYnfS4KICovCmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncykgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShyZWxQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIG9wdF9sb2FkRmxhZ3MpOwogIH0KfTsKCgoKCi8vIE5PVEUobm5hemUpOiBUaGUgZGVidWcgRE9NIGxvYWRlciB3YXMgaW5jbHVkZWQgaW4gYmFzZS5qcyBhcyBhbiBvcmlnaW5hbCB3YXkKLy8gdG8gZG8gImRlYnVnLW1vZGUiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXMgYmUKLy8gY29uZnVzaW5nLCBhcyBjYW4gdGhlIGRlYnVnIERPTSBsb2FkZXIncyBhc3luY2hyb25vdXMgbmF0dXJlLgovLwovLyBXaXRoIHRoZSBET00gbG9hZGVyLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgaXMgbm90IGJsb2NraW5nIC0tIHRoZSBzY3JpcHQKLy8gd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGEgbmFtZXNwYWNlIGlzCi8vIG5lZWRlZCBhdCBydW50aW1lLCBpdCBuZWVkcyB0byBiZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgc2NyaXB0LCBvciBsb2FkZWQgdmlhCi8vIHJlcXVpcmUoKSB3aXRoIGl0cyByZWdpc3RlcmVkIGRlcGVuZGVuY2llcy4KLy8KLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gRm9yIGEgcmVmZXJlbmNlIG9uCi8vIGNyZWF0aW5nIGEgZGVwcyBmaWxlLCBzZWU6Ci8vIEV4dGVybmFsbHk6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvbGlicmFyeS9kb2NzL2RlcHN3cml0ZXIKLy8KLy8gQmVjYXVzZSBvZiBsZWdhY3kgY2xpZW50cywgdGhlIERPTSBsb2FkZXIgY2FuJ3QgYmUgZWFzaWx5IHJlbW92ZWQgZnJvbQovLyBiYXNlLmpzLiAgV29yayB3YXMgZG9uZSB0byBtYWtlIGl0IGRpc2FibGVhYmxlIG9yIHJlcGxhY2VhYmxlIGZvcgovLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LAovLyBmb3IgZXhhbXBsZSkuIFNlZSBib290c3RyYXAvIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZGVidWcgbG9hZGVyLgogKgogKiBJZiBlbmFibGVkLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIG5hbWVzcGFjZSBieQogKiBhcHBlbmRpbmcgYSBzY3JpcHQgdGFnIHRvIHRoZSBET00gKGlmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCkuCiAqCiAqIElmIGRpc2FibGVkLCBnb29nLnJlcXVpcmUoKSB3aWxsIHNpbXBseSBhc3NlcnQgdGhhdCB0aGUgbmFtZXNwYWNlIGhhcyBiZWVuCiAqIHByb3ZpZGVkIChhbmQgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgc29tZSBvdXRzaWRlIHRvb2wgY29ycmVjdGx5IG9yZGVyZWQKICogdGhlIHNjcmlwdCkuCiAqLwpnb29nLkVOQUJMRV9ERUJVR19MT0FERVIgPSBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSJywgdHJ1ZSk7CgoKLyoqCiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cKICogQHByaXZhdGUKICovCmdvb2cubG9nVG9Db25zb2xlXyA9IGZ1bmN0aW9uKG1zZykgewogIGlmIChnb29nLmdsb2JhbC5jb25zb2xlKSB7CiAgICBnb29nLmdsb2JhbC5jb25zb2xlWydlcnJvciddKG1zZyk7CiAgfQp9OwoKCi8qKgogKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdvcmtzIGluCiAqIHBhcmFsbGVsIHdpdGggdGhlIEJVSUxEIHN5c3RlbS4KICoKICogTm90ZSB0aGF0IGFsbCBjYWxscyB0byBnb29nLnJlcXVpcmUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBzZWUgZ29vZy5wcm92aWRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30gSWYgY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIGFzc29jaWF0ZWQKICogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgb3RoZXJ3aXNlIG51bGwuCiAqLwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICAvLyBNaWdodCBuZWVkIHRvIGxhenkgbG9hZCBvbiBvbGQgSUUuCiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIGdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChuYW1lc3BhY2UpOwogICAgfQoKICAgIC8vIElmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lc3BhY2UpKSB7CiAgICAgIGlmIChnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpIHsKICAgICAgICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWVzcGFjZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIHZhciBtb2R1bGVMb2FkZXJTdGF0ZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfOwogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8obmFtZXNwYWNlKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG1vZHVsZUxvYWRlclN0YXRlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKCi8qKgogKiBSZXF1aXJlcyBhIHN5bWJvbCBmb3IgaXRzIHR5cGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUKICogY29tcGlsZXIgdGhhdCB0aGUgc3ltYm9sIG1heSBhcHBlYXIgaW4gdHlwZSBhbm5vdGF0aW9ucywgeWV0IGl0IGlzIG5vdAogKiByZWZlcmVuY2VkIGF0IHJ1bnRpbWUuCiAqCiAqIFdoZW4gY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUKICogYXNzaWduZWQgdG8gb3IgZGVzdHJ1Y3R1cmVkIGludG8gYSB2YXJpYWJsZSwgYnV0IGl0IG1heSBub3QgYmUgb3RoZXJ3aXNlIHVzZWQKICogaW4gY29kZSBvdXRzaWRlIG9mIGEgdHlwZSBhbm5vdGF0aW9uLgogKgogKiBOb3RlIHRoYXQgYWxsIGNhbGxzIHRvIGdvb2cucmVxdWlyZVR5cGUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30KICovCmdvb2cucmVxdWlyZVR5cGUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHNvIHRoYXQgc2luZ2xlLWxldmVsIGRlc3RydWN0dXJpbmcgb2YgdGhlIHJldHVybgogIC8vIHZhbHVlIGRvZXNuJ3QgY3Jhc2ggYXQgcnVudGltZSB3aGVuIHVzaW5nIHRoZSBkZWJ1ZyBsb2FkZXIuIE11bHRpLWxldmVsCiAgLy8gZGVzdHJ1Y3R1cmluZyBpc24ndCBzdXBwb3J0ZWQuCiAgcmV0dXJuIHt9Owp9OwoKCi8qKgogKiBQYXRoIGZvciBpbmNsdWRlZCBzY3JpcHRzLgogKiBAdHlwZSB7c3RyaW5nfQogKi8KZ29vZy5iYXNlUGF0aCA9ICcnOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGJhc2UgcGF0aC4KICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDsKCgovKioKICogV2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgQ2xvc3VyZSdzIGRlcHMgZmlsZS4gQnkgZGVmYXVsdCwgd2hlbiB1bmNvbXBpbGVkLAogKiBkZXBzIGZpbGVzIHdpbGwgYXR0ZW1wdCB0byBiZSBsb2FkZWQuCiAqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUzsKCgovKioKICogQSBmdW5jdGlvbiB0byBpbXBvcnQgYSBzaW5nbGUgc2NyaXB0LiBUaGlzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gd2hlbgogKiBDbG9zdXJlIGlzIGJlaW5nIHJ1biBpbiBub24tSFRNTCBjb250ZXh0cywgc3VjaCBhcyB3ZWIgd29ya2Vycy4gSXQncyBkZWZpbmVkCiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2gKICogYWxsb3dzIGRlcHMuanMgdG8gYmUgaW1wb3J0ZWQgcHJvcGVybHkuCiAqCiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBUaGUgc2Vjb25kLAogKiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIHNjcmlwdCBjb250ZW50cywgaW4gdGhlIGV2ZW50IHRoZSBzY3JpcHQgbmVlZGVkCiAqIHRyYW5zZm9ybWF0aW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHNjcmlwdCB3YXMgaW1wb3J0ZWQsIGZhbHNlCiAqIG90aGVyd2lzZS4KICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcsIHN0cmluZz0pOiBib29sZWFuKXx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQ7CgoKLyoqCiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuCiAqIEByZXR1cm4ge3ZvaWR9IE5vdGhpbmcuCiAqLwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307CgoKLyoqCiAqIFdoZW4gZGVmaW5pbmcgYSBjbGFzcyBGb28gd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QgYmFyKCksIHlvdSBjYW4gZG86CiAqIEZvby5wcm90b3R5cGUuYmFyID0gZ29vZy5hYnN0cmFjdE1ldGhvZAogKgogKiBOb3cgaWYgYSBzdWJjbGFzcyBvZiBGb28gZmFpbHMgdG8gb3ZlcnJpZGUgYmFyKCksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duCiAqIHdoZW4gYmFyKCkgaXMgaW52b2tlZC4KICoKICogQHR5cGUgeyFGdW5jdGlvbn0KICogQHRocm93cyB7RXJyb3J9IHdoZW4gaW52b2tlZCB0byBpbmRpY2F0ZSB0aGUgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgogKiBAZGVwcmVjYXRlZCBVc2UgIkBhYnN0cmFjdCIgYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGdvb2cuYWJzdHJhY3RNZXRob2QgaW4gbmV3CiAqICAgICBjb2RlLiBTZWUKICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci93aWtpL0BhYnN0cmFjdC1jbGFzc2VzLWFuZC1tZXRob2RzCiAqLwpnb29nLmFic3RyYWN0TWV0aG9kID0gZnVuY3Rpb24oKSB7CiAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZCcpOwp9OwoKCi8qKgogKiBBZGRzIGEgYGdldEluc3RhbmNlYCBzdGF0aWMgbWV0aG9kIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKICogaW5zdGFuY2Ugb2JqZWN0LgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RvciBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB0byBhZGQgdGhlIHN0YXRpYwogKiAgICAgbWV0aG9kIHRvLgogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSAnaW5zdGFuY2VfJyBpc24ndCBhIHByb3BlcnR5IG9uICdGdW5jdGlvbicKICogICAgIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHR5cGUgdG8gdXNlIGhlcmUuCiAqLwpnb29nLmFkZFNpbmdsZXRvbkdldHRlciA9IGZ1bmN0aW9uKGN0b3IpIHsKICAvLyBpbnN0YW5jZV8gaXMgaW1tZWRpYXRlbHkgc2V0IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggc2VhbGVkIGNvbnN0cnVjdG9ycwogIC8vIHN1Y2ggYXMgYXJlIGVuY291bnRlcmVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyByZXR1cm5lZCBhcyB0aGUgZXhwb3J0IG9iamVjdAogIC8vIG9mIGEgZ29vZy5tb2R1bGUgaW4gdW5vcHRpbWl6ZWQgY29kZS4KICAvLyBEZWxjYXJlIHR5cGUgdG8gYXZvaWQgY29uZm9ybWFuY2UgdmlvbGF0aW9ucyB0aGF0IGN0b3IuaW5zdGFuY2VfIGlzIHVua25vd24KICAvKiogQHR5cGUge3VuZGVmaW5lZHwhT2JqZWN0fSBAc3VwcHJlc3Mge3VuZGVyc2NvcmV9ICovCiAgY3Rvci5pbnN0YW5jZV8gPSB1bmRlZmluZWQ7CiAgY3Rvci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN0b3IuaW5zdGFuY2VfKSB7CiAgICAgIHJldHVybiBjdG9yLmluc3RhbmNlXzsKICAgIH0KICAgIGlmIChnb29nLkRFQlVHKSB7CiAgICAgIC8vIE5PVEU6IEpTQ29tcGlsZXIgY2FuJ3Qgb3B0aW1pemUgYXdheSBBcnJheSNwdXNoLgogICAgICBnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXSA9IGN0b3I7CiAgICB9CiAgICAvLyBDYXN0IHRvIGF2b2lkIGNvbmZvcm1hbmNlIHZpb2xhdGlvbnMgdGhhdCBjdG9yLmluc3RhbmNlXyBpcyB1bmtub3duCiAgICByZXR1cm4gLyoqIEB0eXBlIHshT2JqZWN0fHVuZGVmaW5lZH0gKi8gKGN0b3IuaW5zdGFuY2VfKSA9IG5ldyBjdG9yOwogIH07Cn07CgoKLyoqCiAqIEFsbCBzaW5nbGV0b24gY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIGZvciB0ZXN0aW5nLiBEb24ndCByZWFkCiAqIGl0IGRpcmVjdGx5LCB1c2UgdGhlIGBnb29nLnRlc3Rpbmcuc2luZ2xldG9uYCBtb2R1bGUuIFRoZSBjb21waWxlcgogKiByZW1vdmVzIHRoaXMgdmFyaWFibGUgaWYgdW51c2VkLgogKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59CiAqIEBwcml2YXRlCiAqLwpnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfID0gW107CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gbG9hZCBnb29nLm1vZHVsZXMgdXNpbmcgYGV2YWxgIHdoZW4gdXNpbmcKICogdGhlIGRlYnVnIGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgYSBiZXR0ZXIgZGVidWdnaW5nIGV4cGVyaWVuY2UgYXMgdGhlCiAqIHNvdXJjZSBpcyB1bm1vZGlmaWVkIGFuZCBjYW4gYmUgZWRpdGVkIHVzaW5nIENocm9tZSBXb3Jrc3BhY2VzIG9yIHNpbWlsYXIuCiAqIEhvd2V2ZXIgaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIHVzZSBvZiBgZXZhbGAgaXMgYmFubmVkCiAqIHNvIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUuCiAqLwpnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgPSBnb29nLmRlZmluZSgnZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGV4cG9ydHMgb2YgZ29vZy5tb2R1bGVzIHNob3VsZCBiZSBzZWFsZWQgd2hlbgogKiBwb3NzaWJsZS4KICovCmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyA9IGdvb2cuZGVmaW5lKCdnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFMnLCBnb29nLkRFQlVHKTsKCgovKioKICogVGhlIHJlZ2lzdHJ5IG9mIGluaXRpYWxpemVkIG1vZHVsZXM6CiAqIFRoZSBtb2R1bGUgaWRlbnRpZmllciBvciBwYXRoIHRvIG1vZHVsZSBleHBvcnRzIG1hcC4KICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywge2V4cG9ydHM6Pyx0eXBlOnN0cmluZyxtb2R1bGVJZDpzdHJpbmd9Pn0KICovCmdvb2cubG9hZGVkTW9kdWxlc18gPSB7fTsKCgovKioKICogVHJ1ZSBpZiB0aGUgZGVidWcgbG9hZGVyIGVuYWJsZWQgYW5kIHVzZWQuCiAqIEBjb25zdCB7Ym9vbGVhbn0KICovCmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQgPSAhQ09NUElMRUQgJiYgZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IEhvdyB0byBkZWNpZGUgd2hldGhlciB0byB0cmFuc3BpbGUuICBWYWxpZCB2YWx1ZXMKICogYXJlICdhbHdheXMnLCAnbmV2ZXInLCBhbmQgJ2RldGVjdCcuICBUaGUgZGVmYXVsdCAoJ2RldGVjdCcpIGlzIHRvCiAqIHVzZSBmZWF0dXJlIGRldGVjdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2UgbGV2ZWxzIG5lZWQKICogdHJhbnNwaWxhdGlvbi4KICovCi8vIE5PVEUoc2RoKTogd2UgY291bGQgZXhwYW5kIHRoaXMgdG8gYWNjZXB0IGEgbGFuZ3VhZ2UgbGV2ZWwgdG8gYnlwYXNzCi8vIGRldGVjdGlvbjogZS5nLiBnb29nLlRSQU5TUElMRSA9PSAnZXM1JyB3b3VsZCB0cmFuc3BpbGUgRVM2IGZpbGVzIGJ1dAovLyB3b3VsZCBsZWF2ZSBFUzMgYW5kIEVTNSBmaWxlcyBhbG9uZS4KZ29vZy5UUkFOU1BJTEUgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEUnLCAnZGV0ZWN0Jyk7CgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gSWYgdHJ1ZSBhc3N1bWUgdGhhdCBFUyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBiZWVuCiAqIHRyYW5zcGlsZWQgYnkgdGhlIGpzY29tcGlsZXIgKGluIHRoZSBzYW1lIHdheSB0aGF0IHRyYW5zcGlsZS5qcyB3b3VsZAogKiB0cmFuc3BpbGUgdGhlbSAtIHRvIGpzY29tcCBtb2R1bGVzKS4gVXNlZnVsIG9ubHkgZm9yIHNlcnZlcnMgdGhhdCB3aXNoIHRvIHVzZQogKiB0aGUgZGVidWcgbG9hZGVyIGFuZCB0cmFuc3BpbGUgc2VydmVyIHNpZGUuIFRodXMgdGhpcyBpcyBvbmx5IHJlc3BlY3RlZCBpZgogKiBnb29nLlRSQU5TUElMRSBpcyAibmV2ZXIiLgogKi8KZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gSWYgYSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zcGlsZWQgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlCiAqIHNob3VsZCBiZS4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBoaWdoZXN0IGxhbmd1YWdlIGxldmVsIHRoaXMgZmlsZSBkZXRlY3RzCiAqIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzLiBHZW5lcmFsbHkgdGhpcyBmbGFnIHNob3VsZCBub3QgYmUgc2V0LCBidXQKICogaXQgY291bGQgYmUgdXNlZnVsIHRvIG92ZXJyaWRlLiBFeGFtcGxlOiBJZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cwogKiBFUzYgdGhlbiBieSBkZWZhdWx0IEVTNysgZmlsZXMgd2lsbCBiZSB0cmFuc3BpbGVkIHRvIEVTNiwgdW5sZXNzIHRoaXMgaXMKICogb3ZlcnJpZGRlbi4KICoKICogVmFsaWQgdmFsdWVzIGluY2x1ZGU6IGVzMywgZXM1LCBlczYsIGVzNywgYW5kIGVzOC4gQW55dGhpbmcgbm90IHJlY29nbml6ZWQKICogaXMgdHJlYXRlZCBhcyBlczMuCiAqCiAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgZm9yY2UgdHJhbnNwaWxhdGlvbi4gSnVzdCBpZgogKiB0cmFuc3BpbGF0aW9uIG9jY3VycyB0aGlzIHdpbGwgYmUgdGhlIG91dHB1dC4gU28gdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuCiAqIGdvb2cuVFJBTlNQSUxFIGlzIHNldCB0byAnYWx3YXlzJyBhbmQgdGhlbiBmb3JjaW5nIHRoZSBsYW5ndWFnZSBsZXZlbCB0byBiZQogKiBzb21ldGhpbmcgbG93ZXIgdGhhbiB3aGF0IHRoZSBlbnZpcm9ubWVudCBkZXRlY3RzLgogKi8KZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UnLCAnJyk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gUGF0aCB0byB0aGUgdHJhbnNwaWxlci4gIEV4ZWN1dGluZyB0aGUgc2NyaXB0IGF0IHRoaXMKICogcGF0aCAocmVsYXRpdmUgdG8gYmFzZS5qcykgc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uICRqc2NvbXAudHJhbnNwaWxlLgogKi8KZ29vZy5UUkFOU1BJTEVSID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJBTlNQSUxFUicsICd0cmFuc3BpbGUuanMnKTsKCgovKioKICogQHBhY2thZ2Ugez9ib29sZWFufQogKiBWaXNpYmxlIGZvciB0ZXN0aW5nLgogKi8KZ29vZy5oYXNCYWRMZXRTY29waW5nID0gbnVsbDsKCgovKioKICogQHJldHVybiB7Ym9vbGVhbn0KICogQHBhY2thZ2UgVmlzaWJsZSBmb3IgdGVzdGluZy4KICovCmdvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kID0gZnVuY3Rpb24oKSB7CiAgaWYgKGdvb2cuaGFzQmFkTGV0U2NvcGluZyA9PSBudWxsKSB7CiAgICB2YXIgaGFzQmFkTGV0U2NvcGluZzsKICAgIHRyeSB7CiAgICAgIGhhc0JhZExldFNjb3BpbmcgPSAhZXZhbCgKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArCiAgICAgICAgICAnbGV0IHggPSAxOyBmdW5jdGlvbiBmKCkgeyByZXR1cm4gdHlwZW9mIHg7IH07JyArCiAgICAgICAgICAnZigpID09ICJudW1iZXIiOycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBBc3N1bWUgdGhhdCBFUzYgc3ludGF4IGlzbid0IHN1cHBvcnRlZC4KICAgICAgaGFzQmFkTGV0U2NvcGluZyA9IGZhbHNlOwogICAgfQogICAgZ29vZy5oYXNCYWRMZXRTY29waW5nID0gaGFzQmFkTGV0U2NvcGluZzsKICB9CiAgcmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZzsKfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZURlZgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqIEBwYWNrYWdlIFZpc2libGUgZm9yIHRlc3RpbmcuCiAqLwpnb29nLndvcmthcm91bmRTYWZhcmkxMEV2YWxCdWcgPSBmdW5jdGlvbihtb2R1bGVEZWYpIHsKICByZXR1cm4gJyhmdW5jdGlvbigpeycgKyBtb2R1bGVEZWYgKwogICAgICAnXG4nICsgIC8vIFRlcm1pbmF0ZSBhbnkgdHJhaWxpbmcgc2luZ2xlIGxpbmUgY29tbWVudC4KICAgICAgJzsnICsgICAvLyBUZXJtaW5hdGUgYW55IHRyYWlsaW5nIGV4cHJlc3Npb24uCiAgICAgICd9KSgpO1xuJzsKfTsKCgovKioKICogQHBhcmFtIHtmdW5jdGlvbig/KTo/fHN0cmluZ30gbW9kdWxlRGVmIFRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICovCmdvb2cubG9hZE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZURlZikgewogIC8vIE5PVEU6IHdlIGFsbG93IGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlIGVpdGhlciBpbiB0aGUgZnJvbQogIC8vIG9mIGEgc3RyaW5nIHRvIGV2YWwgKHdoaWNoIGtlZXBzIHRoZSBvcmlnaW5hbCBzb3VyY2UgaW50YWN0KSBvcgogIC8vIGluIGEgZXZhbCBmb3JiaWRkZW4gZW52aXJvbm1lbnQgKENTUCkgd2UgYWxsb3cgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgLy8gd2hpY2ggaW4gaXRzIGJvZHkgbXVzdCBjYWxsIGBnb29nLm1vZHVsZWAsIGFuZCByZXR1cm4gdGhlIGV4cG9ydHMKICAvLyBvZiB0aGUgbW9kdWxlLgogIHZhciBwcmV2aW91c1N0YXRlID0gZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87CiAgdHJ5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICBtb2R1bGVOYW1lOiAnJywKICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UsCiAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HCiAgICB9OwogICAgdmFyIGV4cG9ydHM7CiAgICBpZiAoZ29vZy5pc0Z1bmN0aW9uKG1vZHVsZURlZikpIHsKICAgICAgZXhwb3J0cyA9IG1vZHVsZURlZi5jYWxsKHVuZGVmaW5lZCwge30pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlRGVmID09PSAnc3RyaW5nJykgewogICAgICBpZiAoZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSkgewogICAgICAgIG1vZHVsZURlZiA9IGdvb2cud29ya2Fyb3VuZFNhZmFyaTEwRXZhbEJ1Zyhtb2R1bGVEZWYpOwogICAgICB9CgogICAgICBleHBvcnRzID0gZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8uY2FsbCh1bmRlZmluZWQsIG1vZHVsZURlZik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGRlZmluaXRpb24nKTsKICAgIH0KCiAgICB2YXIgbW9kdWxlTmFtZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7CiAgICBpZiAodHlwZW9mIG1vZHVsZU5hbWUgPT09ICdzdHJpbmcnICYmIG1vZHVsZU5hbWUpIHsKICAgICAgLy8gRG9uJ3Qgc2VhbCBsZWdhY3kgbmFtZXNwYWNlcyBhcyB0aGV5IG1heSBiZSB1c2VkIGFzIGEgcGFyZW50IG9mCiAgICAgIC8vIGFub3RoZXIgbmFtZXNwYWNlCiAgICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKSB7CiAgICAgICAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG1vZHVsZU5hbWUsIGV4cG9ydHMpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgZ29vZy5TRUFMX01PRFVMRV9FWFBPUlRTICYmIE9iamVjdC5zZWFsICYmCiAgICAgICAgICB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICE9IG51bGwpIHsKICAgICAgICBPYmplY3Quc2VhbChleHBvcnRzKTsKICAgICAgfQoKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgZXhwb3J0czogZXhwb3J0cywKICAgICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuR09PRywKICAgICAgICBtb2R1bGVJZDogZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZQogICAgICB9OwogICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZU5hbWVdID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2R1bGUgbmFtZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiJyk7CiAgICB9CiAgfSBmaW5hbGx5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gcHJldmlvdXNTdGF0ZTsKICB9Cn07CgoKLyoqCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8gPSAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6P30gKi8gKGZ1bmN0aW9uKCkgewogIC8vIE5PVEU6IHdlIGF2b2lkIGRlY2xhcmluZyBwYXJhbWV0ZXJzIG9yIGxvY2FsIHZhcmlhYmxlcyBoZXJlIHRvIGF2b2lkCiAgLy8gbWFza2luZyBnbG9iYWxzIG9yIGxlYWtpbmcgdmFsdWVzIGludG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgogICd1c2Ugc3RyaWN0JzsKICB2YXIgZXhwb3J0cyA9IHt9OwogIGV2YWwoYXJndW1lbnRzWzBdKTsKICByZXR1cm4gZXhwb3J0czsKfSk7CgoKLyoqCiAqIE5vcm1hbGl6ZSBhIGZpbGUgcGF0aCBieSByZW1vdmluZyByZWR1bmRhbnQgIi4uIiBhbmQgZXh0cmFuZW91cyAiLiIgZmlsZQogKiBwYXRoIGNvbXBvbmVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cubm9ybWFsaXplUGF0aF8gPSBmdW5jdGlvbihwYXRoKSB7CiAgdmFyIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGgpIHsKICAgIGlmIChjb21wb25lbnRzW2ldID09ICcuJykgewogICAgICBjb21wb25lbnRzLnNwbGljZShpLCAxKTsKICAgIH0gZWxzZSBpZiAoCiAgICAgICAgaSAmJiBjb21wb25lbnRzW2ldID09ICcuLicgJiYgY29tcG9uZW50c1tpIC0gMV0gJiYKICAgICAgICBjb21wb25lbnRzW2kgLSAxXSAhPSAnLi4nKSB7CiAgICAgIGNvbXBvbmVudHMuc3BsaWNlKC0taSwgMik7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnRzLmpvaW4oJy8nKTsKfTsKCgovKioKICogUHJvdmlkZXMgYSBob29rIGZvciBsb2FkaW5nIGEgZmlsZSB3aGVuIHVzaW5nIENsb3N1cmUncyBnb29nLnJlcXVpcmUoKSBBUEkKICogd2l0aCBnb29nLm1vZHVsZXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgaG9vayBpcyBwcm92aWRlZCB0byBzdXBwb3J0IE5vZGUuanMuCiAqCiAqIEB0eXBlIHsoZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmcpfHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkM7CgoKLyoqCiAqIExvYWRzIGZpbGUgYnkgc3luY2hyb25vdXMgWEhSLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgU291cmNlIFVSTC4KICogQHJldHVybiB7P3N0cmluZ30gRmlsZSBjb250ZW50cywgb3IgbnVsbCBpZiBsb2FkIGZhaWxlZC4KICogQHByaXZhdGUKICovCmdvb2cubG9hZEZpbGVTeW5jXyA9IGZ1bmN0aW9uKHNyYykgewogIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9MT0FEX0ZJTEVfU1lOQyhzcmMpOwogIH0gZWxzZSB7CiAgICB0cnkgewogICAgICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqLwogICAgICB2YXIgeGhyID0gbmV3IGdvb2cuZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddKCk7CiAgICAgIHhoci5vcGVuKCdnZXQnLCBzcmMsIGZhbHNlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgICAgLy8gTk9URTogU3VjY2Vzc2Z1bCBodHRwOiByZXF1ZXN0cyBoYXZlIGEgc3RhdHVzIG9mIDIwMCwgYnV0IHN1Y2Nlc3NmdWwKICAgICAgLy8gZmlsZTogcmVxdWVzdHMgbWF5IGhhdmUgYSBzdGF0dXMgb2YgemVyby4gIEFueSBvdGhlciBzdGF0dXMsIG9yIGEKICAgICAgLy8gdGhyb3duIGV4Y2VwdGlvbiAocGFydGljdWxhcmx5IGluIGNhc2Ugb2YgZmlsZTogcmVxdWVzdHMpIGluZGljYXRlcwogICAgICAvLyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIHdlIHRyZWF0IGFzIGEgbWlzc2luZyBvciB1bmF2YWlsYWJsZSBmaWxlLgogICAgICByZXR1cm4geGhyLnN0YXR1cyA9PSAwIHx8IHhoci5zdGF0dXMgPT0gMjAwID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgLy8gTm8gbmVlZCB0byByZXRocm93IG9yIGxvZywgc2luY2UgZXJyb3JzIHNob3VsZCBzaG93IHVwIG9uIHRoZWlyIG93bi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKCi8qKgogKiBMYXppbHkgcmV0cmlldmVzIHRoZSB0cmFuc3BpbGVyIGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgTGFuZ3VhZ2UgbGV2ZWwgb3V0cHV0LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAqIEBwcml2YXRlCiAqLwpnb29nLnRyYW5zcGlsZV8gPSBmdW5jdGlvbihjb2RlLCBwYXRoLCB0YXJnZXQpIHsKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICBpZiAoIWpzY29tcCkgewogICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXSA9IGpzY29tcCA9IHt9OwogIH0KICB2YXIgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZTsKICBpZiAoIXRyYW5zcGlsZSkgewogICAgdmFyIHRyYW5zcGlsZXJQYXRoID0gZ29vZy5iYXNlUGF0aCArIGdvb2cuVFJBTlNQSUxFUjsKICAgIHZhciB0cmFuc3BpbGVyQ29kZSA9IGdvb2cubG9hZEZpbGVTeW5jXyh0cmFuc3BpbGVyUGF0aCk7CiAgICBpZiAodHJhbnNwaWxlckNvZGUpIHsKICAgICAgLy8gVGhpcyBtdXN0IGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHksIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIGtub3cgd2UKICAgICAgLy8gbmVlZCBpdCwgd2UncmUgYWJvdXQgdG8gbG9hZCBhbmQgd3JpdGUgdGhlIEVTNiBjb2RlIHN5bmNocm9ub3VzbHksCiAgICAgIC8vIHNvIGEgbm9ybWFsIHNjcmlwdC10YWcgbG9hZCB3aWxsIGJlIHRvbyBzbG93LiBXcmFwcGVkIGluIGEgZnVuY3Rpb24KICAgICAgLy8gc28gdGhhdCBjb2RlIGlzIGV2YWwnZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgKDAsIGV2YWwpKHRyYW5zcGlsZXJDb2RlICsgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdHJhbnNwaWxlclBhdGgpOwogICAgICB9KS5jYWxsKGdvb2cuZ2xvYmFsKTsKICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHRyYW5zcGlsZXIgaXMgb3B0aW9uYWwsIGlmICRnd3RFeHBvcnQgaXMgZm91bmQsIGl0J3MKICAgICAgLy8gYSBzaWduIHRoZSB0cmFuc3BpbGVyIHdhcyBsb2FkZWQgYW5kIHRoZSAkanNjb21wLnRyYW5zcGlsZSAqc2hvdWxkKgogICAgICAvLyBiZSB0aGVyZS4KICAgICAgaWYgKGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10gJiYgZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddICYmCiAgICAgICAgICAhZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddWyd0cmFuc3BpbGUnXSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ1RoZSB0cmFuc3BpbGVyIGRpZCBub3QgcHJvcGVybHkgZXhwb3J0IHRoZSAidHJhbnNwaWxlIiAnICsKICAgICAgICAgICAgJ21ldGhvZC4gJGd3dEV4cG9ydDogJyArIEpTT04uc3RyaW5naWZ5KGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10pKTsKICAgICAgfQogICAgICAvLyB0cmFuc3BpbGUuanMgb25seSBleHBvcnRzIGEgc2luZ2xlICRqc2NvbXAgZnVuY3Rpb24sIHRyYW5zcGlsZS4gV2UKICAgICAgLy8gZ3JhYiBqdXN0IHRoYXQgYW5kIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkanNjb21wIHdoaWNoCiAgICAgIC8vIGNvbnRhaW5zIHRoZSBwb2x5ZmlsbHMuCiAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ10udHJhbnNwaWxlID0KICAgICAgICAgIGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J11bJyRqc2NvbXAnXVsndHJhbnNwaWxlJ107CiAgICAgIGpzY29tcCA9IGdvb2cuZ2xvYmFsWyckanNjb21wJ107CiAgICAgIHRyYW5zcGlsZSA9IGpzY29tcC50cmFuc3BpbGU7CiAgICB9CiAgfQogIGlmICghdHJhbnNwaWxlKSB7CiAgICAvLyBUaGUgdHJhbnNwaWxlciBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQuICBJZiBpdCdzIG5vdCBhdmFpbGFibGUgdGhlbgogICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgcGFzcy10aHJvdWdoIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGxvZ3MuCiAgICB2YXIgc3VmZml4ID0gJyByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC4nOwogICAgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZSA9IGZ1bmN0aW9uKGNvZGUsIHBhdGgpIHsKICAgICAgLy8gVE9ETyhzZGgpOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGdldCB0aGlzIGVycm9yIHRvIHNob3cgdXAKICAgICAgLy8gaW4gdGVzdCByZXN1bHRzLCBub3RpbmcgdGhhdCB0aGUgZmFpbHVyZSBtYXkgb2NjdXIgaW4gbWFueQogICAgICAvLyBkaWZmZXJlbnQgd2F5cywgaW5jbHVkaW5nIGluIGxvYWRNb2R1bGUoKSBiZWZvcmUgdGhlIHRlc3QKICAgICAgLy8gcnVubmVyIGV2ZW4gY29tZXMgdXAuCiAgICAgIGdvb2cubG9nVG9Db25zb2xlXyhwYXRoICsgc3VmZml4KTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogIH0KICAvLyBOb3RlOiBhbnkgdHJhbnNwaWxhdGlvbiBlcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCiAgcmV0dXJuIHRyYW5zcGlsZShjb2RlLCBwYXRoLCB0YXJnZXQpOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTGFuZ3VhZ2UgRW5oYW5jZW1lbnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIFRoaXMgaXMgYSAiZml4ZWQiIHZlcnNpb24gb2YgdGhlIHR5cGVvZiBvcGVyYXRvci4gIEl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZW9mCiAqIG9wZXJhdG9yIGluIHN1Y2ggYSB3YXkgdGhhdCBudWxsIHJldHVybnMgJ251bGwnIGFuZCBhcnJheXMgcmV0dXJuICdhcnJheScuCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZSBvZi4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KICovCmdvb2cudHlwZU9mID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgcyA9IHR5cGVvZiB2YWx1ZTsKICBpZiAocyA9PSAnb2JqZWN0JykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIC8vIENoZWNrIHRoZXNlIGZpcnN0LCBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIGlmCiAgICAgIC8vIHBvc3NpYmxlLgogICAgICAvLwogICAgICAvLyBJRSBpbXByb3Blcmx5IG1hcnNoYWxzIHR5cGVvZiBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLCBidXQgYQogICAgICAvLyBjcm9zcy1jb250ZXh0IG9iamVjdCB3aWxsIHN0aWxsIHJldHVybiBmYWxzZSBmb3IgImluc3RhbmNlb2YgT2JqZWN0Ii4KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICByZXR1cm4gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzOwogICAgICB9CgogICAgICAvLyBIQUNLOiBJbiBvcmRlciB0byB1c2UgYW4gT2JqZWN0IHByb3RvdHlwZSBtZXRob2Qgb24gdGhlIGFyYml0cmFyeQogICAgICAvLyAgIHZhbHVlLCB0aGUgY29tcGlsZXIgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGNhc3QgdG8gdHlwZSBPYmplY3QsCiAgICAgIC8vICAgZXZlbiB0aG91Z2ggdGhlIEVDTUEgc3BlYyBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHZhbHVlKSk7CiAgICAgIC8vIEluIEZpcmVmb3ggMy42LCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgd2luZG93IG9iamVjdHMnIGxlbmd0aAogICAgICAvLyBwcm9wZXJ0eSB0aHJvd3MgYW4gTlNfRVJST1JfRkFJTFVSRSwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgICAgLy8gaGVyZS4KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnW29iamVjdCBXaW5kb3ddJykgewogICAgICAgIHJldHVybiAnb2JqZWN0JzsKICAgICAgfQoKICAgICAgLy8gV2UgY2Fubm90IGFsd2F5cyB1c2UgY29uc3RydWN0b3IgPT0gQXJyYXkgb3IgaW5zdGFuY2VvZiBBcnJheSBiZWNhdXNlCiAgICAgIC8vIGRpZmZlcmVudCBmcmFtZXMgaGF2ZSBkaWZmZXJlbnQgQXJyYXkgb2JqZWN0cy4gSW4gSUU2LCBpZiB0aGUgaWZyYW1lCiAgICAgIC8vIHdoZXJlIHRoZSBhcnJheSB3YXMgY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHRoZSBhcnJheSBsb3NlcyBpdHMKICAgICAgLy8gcHJvdG90eXBlLiBUaGVuIGRlcmVmZXJlbmNpbmcgdmFsLnNwbGljZSBoZXJlIHRocm93cyBhbiBleGNlcHRpb24sIHNvCiAgICAgIC8vIHdlIGNhbid0IHVzZSBnb29nLmlzRnVuY3Rpb24uIENhbGxpbmcgdHlwZW9mIGRpcmVjdGx5IHJldHVybnMgJ3Vua25vd24nCiAgICAgIC8vIHNvIHRoYXQgd2lsbCB3b3JrLiBJbiB0aGlzIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgYW5kCiAgICAgIC8vIG1vc3QgYXJyYXkgZnVuY3Rpb25zIHdpbGwgc3RpbGwgd29yayBiZWNhdXNlIHRoZSBhcnJheSBpcyBzdGlsbAogICAgICAvLyBhcnJheS1saWtlIChzdXBwb3J0cyBsZW5ndGggYW5kIFtdKSBldmVuIHRob3VnaCBpdCBoYXMgbG9zdCBpdHMKICAgICAgLy8gcHJvdG90eXBlLgogICAgICAvLyBNYXJrIE1pbGxlciBub3RpY2VkIHRoYXQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZwogICAgICAvLyBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmZvcmdlYWJsZSBbW0NsYXNzXV0gcHJvcGVydHkuCiAgICAgIC8vICAxNS4yLjQuMiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICggKQogICAgICAvLyAgV2hlbiB0aGUgdG9TdHJpbmcgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgIC8vICAgICAgMS4gR2V0IHRoZSBbW0NsYXNzXV0gcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuCiAgICAgIC8vICAgICAgMi4gQ29tcHV0ZSBhIHN0cmluZyB2YWx1ZSBieSBjb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBzdHJpbmdzCiAgICAgIC8vICAgICAgICAgIltvYmplY3QgIiwgUmVzdWx0KDEpLCBhbmQgIl0iLgogICAgICAvLyAgICAgIDMuIFJldHVybiBSZXN1bHQoMikuCiAgICAgIC8vIGFuZCB0aGlzIGJlaGF2aW9yIHN1cnZpdmVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScgfHwKICAgICAgICAgICAvLyBJbiBJRSBhbGwgbm9uIHZhbHVlIHR5cGVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMgYWNyb3NzIHdpbmRvdwogICAgICAgICAgIC8vIGJvdW5kYXJpZXMgKG5vdCBpZnJhbWUgdGhvdWdoKSBzbyB3ZSBoYXZlIHRvIGRvIG9iamVjdCBkZXRlY3Rpb24KICAgICAgICAgICAvLyBmb3IgdGhpcyBlZGdlIGNhc2UuCiAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUuc3BsaWNlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoJ3NwbGljZScpCgogICAgICAgICAgICAgICApKSB7CiAgICAgICAgcmV0dXJuICdhcnJheSc7CiAgICAgIH0KICAgICAgLy8gSEFDSzogVGhlcmUgaXMgc3RpbGwgYW4gYXJyYXkgY2FzZSB0aGF0IGZhaWxzLgogICAgICAvLyAgICAgZnVuY3Rpb24gQXJyYXlJbXBvc3RvcigpIHt9CiAgICAgIC8vICAgICBBcnJheUltcG9zdG9yLnByb3RvdHlwZSA9IFtdOwogICAgICAvLyAgICAgdmFyIGltcG9zdG9yID0gbmV3IEFycmF5SW1wb3N0b3I7CiAgICAgIC8vIHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSBmYXN0IHBhdGgKICAgICAgLy8gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIGFuZCBzb2xlbHkgcmVseWluZyBvbgogICAgICAvLyAodmFsdWUgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy52YWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykKICAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYW55IG1vcmUgZnVuY3Rpb24gY2FsbHMgYW5kIGlzIG5vdCB3YXJyYW50ZWQKICAgICAgLy8gdW5sZXNzIGNsb3N1cmUgY29kZSBpcyByZWNlaXZpbmcgb2JqZWN0cyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgoKICAgICAgLy8gSUUgaW4gY3Jvc3Mtd2luZG93IGNhbGxzIGRvZXMgbm90IGNvcnJlY3RseSBtYXJzaGFsIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAgIC8vIChpdCBhcHBlYXJzIGp1c3QgYXMgYW4gb2JqZWN0KSBzbyB3ZSBjYW5ub3QgdXNlIGp1c3QgdHlwZW9mIHZhbCA9PQogICAgICAvLyAnZnVuY3Rpb24nLiBIb3dldmVyLCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNhbGwgcHJvcGVydHksIGl0IGlzIGEKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwKICAgICAgICAgICB0eXBlb2YgdmFsdWUuY2FsbCAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgIXZhbHVlLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdjYWxsJykpKSB7CiAgICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJ251bGwnOwogICAgfQoKICB9IGVsc2UgaWYgKHMgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuY2FsbCA9PSAndW5kZWZpbmVkJykgewogICAgLy8gSW4gU2FmYXJpIHR5cGVvZiBub2RlTGlzdCByZXR1cm5zICdmdW5jdGlvbicsIGFuZCBvbiBGaXJlZm94IHR5cGVvZgogICAgLy8gYmVoYXZlcyBzaW1pbGFybHkgZm9yIEhUTUx7QXBwbGV0LEVtYmVkLE9iamVjdH0sIEVsZW1lbnRzIGFuZCBSZWdFeHBzLiBXZQogICAgLy8gd291bGQgbGlrZSB0byByZXR1cm4gb2JqZWN0IGZvciB0aG9zZSBhbmQgd2UgY2FuIGRldGVjdCBhbiBpbnZhbGlkCiAgICAvLyBmdW5jdGlvbiBieSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgaGFzIGEgY2FsbCBtZXRob2QuCiAgICByZXR1cm4gJ29iamVjdCc7CiAgfQogIHJldHVybiBzOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIG51bGwuCiAqIEBkZXByZWNhdGVkIFVzZSBgdmFsID09PSBudWxsYCBpbnN0ZWFkLgogKi8KZ29vZy5pc051bGwgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdmFsID09PSBudWxsOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQGRlcHJlY2F0ZWQgVXNlIGB2YWwgIT0gbnVsbGAgaW5zdGVhZC4KICovCmdvb2cuaXNEZWZBbmROb3ROdWxsID0gZnVuY3Rpb24odmFsKSB7CiAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCA9PSBudWxsLgogIHJldHVybiB2YWwgIT0gbnVsbDsKfTsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gYXJyYXkuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYW4gYXJyYXkuCiAqLwpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnYXJyYXknOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGFuIGFycmF5LiBUbyBxdWFsaWZ5IGFzIGFycmF5IGxpa2UKICogdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGVpdGhlciBhIE5vZGVMaXN0IG9yIGFuIG9iamVjdCB3aXRoIGEgTnVtYmVyIGxlbmd0aAogKiBwcm9wZXJ0eS4gTm90ZSB0aGF0IGZvciB0aGlzIGZ1bmN0aW9uIG5laXRoZXIgc3RyaW5ncyBub3IgZnVuY3Rpb25zIGFyZQogKiBjb25zaWRlcmVkICJhcnJheS1saWtlIi4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBhcnJheS4KICovCmdvb2cuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgLy8gV2UgZG8gbm90IHVzZSBnb29nLmlzT2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8gZXhjbHVkZSBmdW5jdGlvbiB2YWx1ZXMuCiAgcmV0dXJuIHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwubGVuZ3RoID09ICdudW1iZXInOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGEgRGF0ZS4gVG8gcXVhbGlmeSBhcyBEYXRlLWxpa2UgdGhlCiAqIHZhbHVlIG5lZWRzIHRvIGJlIGFuIG9iamVjdCBhbmQgaGF2ZSBhIGdldEZ1bGxZZWFyKCkgZnVuY3Rpb24uCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBsaWtlIGEgRGF0ZS4KICovCmdvb2cuaXNEYXRlTGlrZSA9IGZ1bmN0aW9uKHZhbCkgewogIHJldHVybiBnb29nLmlzT2JqZWN0KHZhbCkgJiYgdHlwZW9mIHZhbC5nZXRGdWxsWWVhciA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24uCiAqLwpnb29nLmlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGlzIGluY2x1ZGVzIGFycmF5cyBhbmQKICogZnVuY3Rpb25zLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGFuIG9iamVjdC4KICovCmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nOwogIC8vIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsIGFsc28gd29ya3MsIGJ1dCBpcyBzbG93ZXIsIGVzcGVjaWFsbHkgaWYgdmFsIGlzCiAgLy8gbm90IGFuIG9iamVjdC4KfTsKCgovKioKICogR2V0cyBhIHVuaXF1ZSBJRCBmb3IgYW4gb2JqZWN0LiBUaGlzIG11dGF0ZXMgdGhlIG9iamVjdCBzbyB0aGF0IGZ1cnRoZXIgY2FsbHMKICogd2l0aCB0aGUgc2FtZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuaXF1ZSBJRCBpcwogKiBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbW9uZ3N0IG9iamVjdHMgdGhhdCBhcmUKICogcGFzc2VkIGludG8gYGdldFVpZGAuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJRCBpcyB1bmlxdWUgb3IKICogY29uc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuIEl0IGlzIHVuc2FmZSB0byBnZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIGZ1bmN0aW9uCiAqIHByb3RvdHlwZXMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHVuaXF1ZSBJRCBmb3IuCiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIG9iamVjdC4KICovCmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24ob2JqKSB7CiAgLy8gVE9ETyhhcnYpOiBNYWtlIHRoZSB0eXBlIHN0cmljdGVyLCBkbyBub3QgYWNjZXB0IG51bGwuCgogIC8vIEluIE9wZXJhIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSBleGlzdHMgYnV0IGFsd2F5cyByZXR1cm5zIGZhbHNlIHNvIHdlIGF2b2lkCiAgLy8gdXNpbmcgaXQuIEFzIGEgY29uc2VxdWVuY2UgdGhlIHVuaXF1ZSBJRCBnZW5lcmF0ZWQgZm9yIEJhc2VDbGFzcy5wcm90b3R5cGUKICAvLyBhbmQgU3ViQ2xhc3MucHJvdG90eXBlIHdpbGwgYmUgdGhlIHNhbWUuCiAgLy8gVE9ETyhiLzE0MTUxMjMyMyk6IFVVSURzIGFyZSBicm9rZW4gZm9yIGN0b3JzIHdpdGggY2xhc3Mtc2lkZSBpbmhlcml0YW5jZS4KICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwKICAgICAgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKTsKfTsKCgovKioKICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgYXNzaWduZWQgYSB1bmlxdWUgSUQuCiAqCiAqIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBvYmplY3QuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlcmUgaXMgYW4gYXNzaWduZWQgdW5pcXVlIGlkIGZvciB0aGUgb2JqZWN0LgogKi8KZ29vZy5oYXNVaWQgPSBmdW5jdGlvbihvYmopIHsKICByZXR1cm4gISFvYmpbZ29vZy5VSURfUFJPUEVSVFlfXTsKfTsKCgovKioKICogUmVtb3ZlcyB0aGUgdW5pcXVlIElEIGZyb20gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgb2JqZWN0IHdhcwogKiBwcmV2aW91c2x5IG11dGF0ZWQgdXNpbmcgYGdvb2cuZ2V0VWlkYCBpbiB3aGljaCBjYXNlIHRoZSBtdXRhdGlvbiBpcwogKiB1bmRvbmUuCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZW1vdmUgdGhlIHVuaXF1ZSBJRCBmaWVsZCBmcm9tLgogKi8KZ29vZy5yZW1vdmVVaWQgPSBmdW5jdGlvbihvYmopIHsKICAvLyBUT0RPKGFydik6IE1ha2UgdGhlIHR5cGUgc3RyaWN0ZXIsIGRvIG5vdCBhY2NlcHQgbnVsbC4KCiAgLy8gSW4gSUUsIERPTSBub2RlcyBhcmUgbm90IGluc3RhbmNlcyBvZiBPYmplY3QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZQogIC8vIHRyeSB0byBkZWxldGUuICBJbnN0ZWFkIHdlIHRyeSB0byB1c2UgcmVtb3ZlQXR0cmlidXRlLgogIGlmIChvYmogIT09IG51bGwgJiYgJ3JlbW92ZUF0dHJpYnV0ZScgaW4gb2JqKSB7CiAgICBvYmoucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7CiAgfQoKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dOwogIH0gY2F0Y2ggKGV4KSB7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bmlxdWUgSUQgcHJvcGVydHkuIEluaXRpYWxpemVkIGluIGEgd2F5IHRvIGhlbHAgYXZvaWQgY29sbGlzaW9ucwogKiB3aXRoIG90aGVyIGNsb3N1cmUgSmF2YVNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KZ29vZy5VSURfUFJPUEVSVFlfID0gJ2Nsb3N1cmVfdWlkXycgKyAoKE1hdGgucmFuZG9tKCkgKiAxZTkpID4+PiAwKTsKCgovKioKICogQ291bnRlciBmb3IgVUlELgogKiBAdHlwZSB7bnVtYmVyfQogKiBAcHJpdmF0ZQogKi8KZ29vZy51aWRDb3VudGVyXyA9IDA7CgoKLyoqCiAqIEFkZHMgYSBoYXNoIGNvZGUgZmllbGQgdG8gYW4gb2JqZWN0LiBUaGUgaGFzaCBjb2RlIGlzIHVuaXF1ZSBmb3IgdGhlCiAqIGdpdmVuIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaGFzaCBjb2RlIGZvci4KICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0LgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5nZXRVaWQgaW5zdGVhZC4KICovCmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKCgovKioKICogUmVtb3ZlcyB0aGUgaGFzaCBjb2RlIGZpZWxkIGZyb20gYW4gb2JqZWN0LgogKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVtb3ZlIHRoZSBmaWVsZCBmcm9tLgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5yZW1vdmVVaWQgaW5zdGVhZC4KICovCmdvb2cucmVtb3ZlSGFzaENvZGUgPSBnb29nLnJlbW92ZVVpZDsKCgovKioKICogQ2xvbmVzIGEgdmFsdWUuIFRoZSBpbnB1dCBtYXkgYmUgYW4gT2JqZWN0LCBBcnJheSwgb3IgYmFzaWMgdHlwZS4gT2JqZWN0cyBhbmQKICogYXJyYXlzIHdpbGwgYmUgY2xvbmVkIHJlY3Vyc2l2ZWx5LgogKgogKiBXQVJOSU5HUzoKICogPGNvZGU+Z29vZy5jbG9uZU9iamVjdDwvY29kZT4gZG9lcyBub3QgZGV0ZWN0IHJlZmVyZW5jZSBsb29wcy4gT2JqZWN0cyB0aGF0CiAqIHJlZmVyIHRvIHRoZW1zZWx2ZXMgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCiAqCiAqIDxjb2RlPmdvb2cuY2xvbmVPYmplY3Q8L2NvZGU+IGlzIHVuYXdhcmUgb2YgdW5pcXVlIGlkZW50aWZpZXJzLCBhbmQgY29waWVzCiAqIFVJRHMgY3JlYXRlZCBieSA8Y29kZT5nZXRVaWQ8L2NvZGU+IGludG8gY2xvbmVkIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSB2YWx1ZSB0byBjbG9uZS4KICogQHJldHVybiB7Kn0gQSBjbG9uZSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIEBkZXByZWNhdGVkIGdvb2cuY2xvbmVPYmplY3QgaXMgdW5zYWZlLiBQcmVmZXIgdGhlIGdvb2cub2JqZWN0IG1ldGhvZHMuCiAqLwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2FycmF5JykgewogICAgaWYgKHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpOwogICAgfQogICAgdmFyIGNsb25lID0gdHlwZSA9PSAnYXJyYXknID8gW10gOiB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pOwogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgcmV0dXJuIG9iajsKfTsKCgovKioKICogQSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ29vZy5iaW5kLgogKiBAcGFyYW0gez9mdW5jdGlvbih0aGlzOlQsIC4uLil9IGZuIEEgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5LgogKiBAcGFyYW0ge1R9IHNlbGZPYmogU3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBzaG91bGQgcG9pbnQgdG8gd2hlbiB0aGUKICogICAgIGZ1bmN0aW9uIGlzIHJ1bi4KICogQHBhcmFtIHsuLi4qfSB2YXJfYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0aWFsbHkgYXBwbGllZCB0byB0aGUKICogICAgIGZ1bmN0aW9uLgogKiBAcmV0dXJuIHshRnVuY3Rpb259IEEgcGFydGlhbGx5LWFwcGxpZWQgZm9ybSBvZiB0aGUgZnVuY3Rpb24gZ29vZy5iaW5kKCkgd2FzCiAqICAgICBpbnZva2VkIGFzIGEgbWV0aG9kIG9mLgogKiBAdGVtcGxhdGUgVAogKiBAcHJpdmF0ZQogKi8KZ29vZy5iaW5kTmF0aXZlXyA9IGZ1bmN0aW9uKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8gKGZuLmNhbGwuYXBwbHkoZm4uYmluZCwgYXJndW1lbnRzKSk7Cn07CgoKLyoqCiAqIEEgcHVyZS1KUyBpbXBsZW1lbnRhdGlvbiBvZiBnb29nLmJpbmQuCiAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6VCwgLi4uKX0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7VH0gc2VsZk9iaiBTcGVjaWZpZXMgdGhlIG9iamVjdCB3aGljaCB0aGlzIHNob3VsZCBwb2ludCB0byB3aGVuIHRoZQogKiAgICAgZnVuY3Rpb24gaXMgcnVuLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHBhcnRpYWxseSBhcHBsaWVkIHRvIHRoZQogKiAgICAgZnVuY3Rpb24uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLmJpbmQoKSB3YXMKICogICAgIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwcml2YXRlCiAqLwpnb29nLmJpbmRKc18gPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBpZiAoIWZuKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIC8vIFByZXBlbmQgdGhlIGJvdW5kIGFyZ3VtZW50cyB0byB0aGUgY3VycmVudCBhcmd1bWVudHMuCiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpOwogICAgfTsKCiAgfSBlbHNlIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KfTsKCgovKioKICogUGFydGlhbGx5IGFwcGxpZXMgdGhpcyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgJ3RoaXMgb2JqZWN0JyBhbmQgemVybyBvcgogKiBtb3JlIGFyZ3VtZW50cy4gVGhlIHJlc3VsdCBpcyBhIG5ldyBmdW5jdGlvbiB3aXRoIHNvbWUgYXJndW1lbnRzIG9mIHRoZSBmaXJzdAogKiBmdW5jdGlvbiBwcmUtZmlsbGVkIGFuZCB0aGUgdmFsdWUgb2YgdGhpcyAncHJlLXNwZWNpZmllZCcuCiAqCiAqIFJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmaWVkIGF0IGNhbGwtdGltZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZS1zcGVjaWZpZWQKICogb25lcy4KICoKICogQWxzbyBzZWU6IHtAbGluayAjcGFydGlhbH0uCiAqCiAqIFVzYWdlOgogKiA8cHJlPnZhciBiYXJNZXRoQm91bmQgPSBnb29nLmJpbmQobXlGdW5jdGlvbiwgbXlPYmosICdhcmcxJywgJ2FyZzInKTsKICogYmFyTWV0aEJvdW5kKCdhcmczJywgJ2FyZzQnKTs8L3ByZT4KICoKICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpULCAuLi4pfSBmbiBBIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseS4KICogQHBhcmFtIHtUfSBzZWxmT2JqIFNwZWNpZmllcyB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgc2hvdWxkIHBvaW50IHRvIHdoZW4gdGhlCiAqICAgICBmdW5jdGlvbiBpcyBydW4uCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gdGhlCiAqICAgICBmdW5jdGlvbi4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBBIHBhcnRpYWxseS1hcHBsaWVkIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIGdvb2cuYmluZCgpIHdhcwogKiAgICAgaW52b2tlZCBhcyBhIG1ldGhvZCBvZi4KICogQHRlbXBsYXRlIFQKICogQHN1cHByZXNzIHtkZXByZWNhdGVkfSBTZWUgYWJvdmUuCiAqLwpnb29nLmJpbmQgPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICAvLyBUT0RPKG5pY2tzYW50b3MpOiBuYXJyb3cgdGhlIHR5cGUgc2lnbmF0dXJlLgogIGlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJgogICAgICAvLyBOT1RFKG5pY2tzYW50b3MpOiBTb21lYm9keSBwdWxsZWQgYmFzZS5qcyBpbnRvIHRoZSBkZWZhdWx0IENocm9tZQogICAgICAvLyBleHRlbnNpb24gZW52aXJvbm1lbnQuIFRoaXMgbWVhbnMgdGhhdCBmb3IgQ2hyb21lIGV4dGVuc2lvbnMsIHRoZXkgZ2V0CiAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB0aGF0IGNhbGxzIGdvb2cuYmluZAogICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgb25lLiBFdmVuIHdvcnNlLCB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhCiAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBnb29nLmJpbmQgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBzbwogICAgICAvLyB3ZSBoYXZlIHRvIGhhY2sgdGhpcyB0byBtYWtlIHN1cmUgaXQgd29ya3MgY29ycmVjdGx5LgogICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoJ25hdGl2ZSBjb2RlJykgIT0gLTEpIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZE5hdGl2ZV87CiAgfSBlbHNlIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZEpzXzsKICB9CiAgcmV0dXJuIGdvb2cuYmluZC5hcHBseShudWxsLCBhcmd1bWVudHMpOwp9OwoKCi8qKgogKiBMaWtlIGdvb2cuYmluZCgpLCBleGNlcHQgdGhhdCBhICd0aGlzIG9iamVjdCcgaXMgbm90IHJlcXVpcmVkLiBVc2VmdWwgd2hlbgogKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAqCiAqIFVzYWdlOgogKiB2YXIgZyA9IGdvb2cucGFydGlhbChmLCBhcmcxLCBhcmcyKTsKICogZyhhcmczLCBhcmc0KTsKICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gZm4uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLnBhcnRpYWwoKQogKiAgICAgd2FzIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqLwpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbihmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gQ2xvbmUgdGhlIGFycmF5ICh3aXRoIHNsaWNlKCkpIGFuZCBhcHBlbmQgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgIC8vIHRvIHRoZSBleGlzdGluZyBhcmd1bWVudHMuCiAgICB2YXIgbmV3QXJncyA9IGFyZ3Muc2xpY2UoKTsKICAgIG5ld0FyZ3MucHVzaC5hcHBseShuZXdBcmdzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGZuLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpLCBuZXdBcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDb3BpZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuIFRoaXMgbWV0aG9kCiAqIGRvZXMgbm90IHdvcmsgb24gYWxsIGJyb3dzZXJzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNvbnRhaW4ga2V5cyBzdWNoIGFzCiAqIHRvU3RyaW5nIG9yIGhhc093blByb3BlcnR5LiBVc2UgZ29vZy5vYmplY3QuZXh0ZW5kIGZvciB0aGlzIHB1cnBvc2UuCiAqCiAqIE5PVEU6IFNvbWUgaGF2ZSBhZHZvY2F0ZWQgZm9yIHRoZSB1c2Ugb2YgZ29vZy5taXhpbiB0byBzZXR1cCBjbGFzc2VzCiAqIHdpdGggbXVsdGlwbGUgaW5oZXJpdGVuY2UgKHRyYWl0cywgbWl4aW5zLCBldGMpLiAgSG93ZXZlciwgYXMgaXQgc2ltcGx5CiAqIHVzZXMgImZvciBpbiIsIHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZQogKiBub24tZW51bWVyYWJsZS4gIENoYW5naW5nIHRoaXMsIHdvdWxkIGJyZWFrIGNhc2VzIHdoZXJlIG5vbi1lbnVtZXJhYmxlCiAqIHByb3BlcnRpZXMgYXJlIG5vdCBleHBlY3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQuCiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlLgogKiBAZGVwcmVjYXRlZCBQcmVmZXIgT2JqZWN0LmFzc2lnbgogKi8KZ29vZy5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgZm9yICh2YXIgeCBpbiBzb3VyY2UpIHsKICAgIHRhcmdldFt4XSA9IHNvdXJjZVt4XTsKICB9CgogIC8vIEZvciBJRTcgb3IgbG93ZXIsIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgLy8gbm90IGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlLCBpc1Byb3RvdHlwZU9mIGZyb20KICAvLyBPYmplY3QucHJvdG90eXBlKSBidXQgYWxzbyBpdCB3aWxsIG5vdCBpbmNsdWRlICdyZXBsYWNlJyBvbiBvYmplY3RzIHRoYXQKICAvLyBleHRlbmQgU3RyaW5nIGFuZCBjaGFuZ2UgJ3JlcGxhY2UnIChub3QgdGhhdCBpdCBpcyBjb21tb24gZm9yIGFueW9uZSB0bwogIC8vIGV4dGVuZCBhbnl0aGluZyBleGNlcHQgT2JqZWN0KS4KfTsKCgovKioKICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwogKiAgICAgYmV0d2VlbiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIGFuZCB0aGUgY3VycmVudCB0aW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgRGF0ZS5ub3cKICovCmdvb2cubm93ID0gKGdvb2cuVFJVU1RFRF9TSVRFICYmIERhdGUubm93KSB8fCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAvLyBVbmFyeSBwbHVzIG9wZXJhdG9yIGNvbnZlcnRzIGl0cyBvcGVyYW5kIHRvIGEgbnVtYmVyIHdoaWNoIGluCiAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZgogICAgICAgICAgICAgLy8gYSBkYXRlIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRUaW1lKCkuCiAgICAgICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7CiAgICAgICAgICAgfSk7CgoKLyoqCiAqIEV2YWxzIEphdmFTY3JpcHQgaW4gdGhlIGdsb2JhbCBzY29wZS4gIEluIElFIHRoaXMgdXNlcyBleGVjU2NyaXB0LCBvdGhlcgogKiBicm93c2VycyB1c2UgZ29vZy5nbG9iYWwuZXZhbC4gSWYgZ29vZy5nbG9iYWwuZXZhbCBkb2VzIG5vdCBldmFsdWF0ZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlIChmb3IgZXhhbXBsZSwgaW4gU2FmYXJpKSwgYXBwZW5kcyBhIHNjcmlwdCB0YWcgaW5zdGVhZC4KICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIGV4ZWNTY3JpcHQgb3IgZXZhbCBpcyBkZWZpbmVkLgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IEphdmFTY3JpcHQgc3RyaW5nLgogKi8KZ29vZy5nbG9iYWxFdmFsID0gZnVuY3Rpb24oc2NyaXB0KSB7CiAgaWYgKGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQpIHsKICAgIGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQoc2NyaXB0LCAnSmF2YVNjcmlwdCcpOwogIH0gZWxzZSBpZiAoZ29vZy5nbG9iYWwuZXZhbCkgewogICAgLy8gVGVzdCB0byBzZWUgaWYgZXZhbCB3b3JrcwogICAgaWYgKGdvb2cuZXZhbFdvcmtzRm9yR2xvYmFsc18gPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoJ3ZhciBfZXZhbFRlc3RfID0gMTsnKTsKICAgICAgfSBjYXRjaCAoaWdub3JlKSB7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRlbGV0ZSBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgewogICAgICAgICAgLy8gTWljcm9zb2Z0IGVkZ2UgZmFpbHMgdGhlIGRlbGV0aW9uIGFib3ZlIGluIHN0cmljdCBtb2RlLgogICAgICAgIH0KICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICBnb29nLmdsb2JhbC5ldmFsKHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICAvKiogQHR5cGUgeyFEb2N1bWVudH0gKi8KICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgICB2YXIgc2NyaXB0RWx0ID0KICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxTY3JpcHRFbGVtZW50fSAqLyAoZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKTsKICAgICAgc2NyaXB0RWx0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgc2NyaXB0RWx0LmRlZmVyID0gZmFsc2U7CiAgICAgIC8vIE5vdGUodXNlcik6IGNhbid0IHVzZSAuaW5uZXJIVE1MIHNpbmNlICJ0KCc8dGVzdD4nKSIgd2lsbCBmYWlsIGFuZAogICAgICAvLyAudGV4dCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpIDIuICBUaGVyZWZvcmUgd2UgYXBwZW5kIGEgdGV4dCBub2RlLgogICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbHQpOwogICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRFbHQpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cuZ2xvYmFsRXZhbCBub3QgYXZhaWxhYmxlJyk7CiAgfQp9OwoKCi8qKgogKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgJ2V2YWwnIGRpcmVjdGx5IHRvIGV2YWwgY29kZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlLiBTZXQgdG8gYSBCb29sZWFuIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdvb2cuZ2xvYmFsRXZhbCAod2hpY2gKICogZW1waXJpY2FsbHkgdGVzdHMgd2hldGhlciBldmFsIHdvcmtzIGZvciBnbG9iYWxzKS4gQHNlZSBnb29nLmdsb2JhbEV2YWwKICogQHR5cGUgez9ib29sZWFufQogKiBAcHJpdmF0ZQogKi8KZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7CgoKLyoqCiAqIE9wdGlvbmFsIG1hcCBvZiBDU1MgY2xhc3MgbmFtZXMgdG8gb2JmdXNjYXRlZCBuYW1lcyB1c2VkIHdpdGgKICogZ29vZy5nZXRDc3NOYW1lKCkuCiAqIEBwcml2YXRlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqIEBzZWUgZ29vZy5zZXRDc3NOYW1lTWFwcGluZwogKi8KZ29vZy5jc3NOYW1lTWFwcGluZ187CgoKLyoqCiAqIE9wdGlvbmFsIG9iZnVzY2F0aW9uIHN0eWxlIGZvciBDU1MgY2xhc3MgbmFtZXMuIFNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCiAqICdCWV9XSE9MRScgb3IgJ0JZX1BBUlQnIGlmIGRlZmluZWQuCiAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfQogKiBAcHJpdmF0ZQogKiBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcKICovCmdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV87CgoKCi8qKgogKiBBIGhvb2sgZm9yIG1vZGlmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBnb29nLmdldENzc05hbWUuIFRoZSBmdW5jdGlvbgogKiBpZiBwcmVzZW50LCB3aWxsIHJlY2VpdmUgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgZ29vZy5nZXRDc3NOYW1lIGFzCiAqIGl0cyBpbnB1dC4KICoKICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcpOnN0cmluZyl8dW5kZWZpbmVkfQogKi8KZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk47CgoKLyoqCiAqIEhhbmRsZXMgc3RyaW5ncyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIENTUyBjbGFzcyBuYW1lcy4KICoKICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0YW5kZW0gd2l0aCBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcuCiAqCiAqIFdpdGhvdXQgYW55IG1hcHBpbmcgc2V0LCB0aGUgYXJndW1lbnRzIGFyZSBzaW1wbGUgam9pbmVkIHdpdGggYSBoeXBoZW4gYW5kCiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC4KICoKICogV2hlbiB0aGVyZSBpcyBhIG1hcHBpbmcsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3R5bGVzIGluIHdoaWNoIHRoZXNlCiAqIG1hcHBpbmdzIGFyZSB1c2VkLiBJbiB0aGUgQllfUEFSVCBzdHlsZSwgZWFjaCBwYXJ0IChpLmUuIGluIGJldHdlZW4gaHlwaGVucykKICogb2YgdGhlIHBhc3NlZCBpbiBjc3MgbmFtZSBpcyByZXdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBtYXAuIEluIHRoZSBCWV9XSE9MRQogKiBzdHlsZSwgdGhlIGZ1bGwgY3NzIG5hbWUgaXMgbG9va2VkIHVwIGluIHRoZSBtYXAgZGlyZWN0bHkuIElmIGEgcmV3cml0ZSBpcwogKiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBtYXAsIHRoZSBjb21waWxlciB3aWxsIG91dHB1dCBhIHdhcm5pbmcuCiAqCiAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgaXQgd2lsbCByZXBsYWNlIGNhbGxzIHRvCiAqIGdvb2cuZ2V0Q3NzTmFtZSB3aXRoIHRoZSBzdHJpbmdzIGZyb20gdGhlIG1hcHBpbmcsIGUuZy4KICogICAgIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdmb28nKTsKICogICAgIHZhciB5ID0gZ29vZy5nZXRDc3NOYW1lKHRoaXMuYmFzZUNsYXNzLCAnYWN0aXZlJyk7CiAqICBiZWNvbWVzOgogKiAgICAgdmFyIHggPSAnZm9vJzsKICogICAgIHZhciB5ID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWFjdGl2ZSc7CiAqCiAqIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwcm9jZXNzZWQsIGlmIHR3byBhcmUgcGFzc2VkIG9ubHkgdGhlCiAqIG1vZGlmaWVyIHdpbGwgYmUgcHJvY2Vzc2VkLCBhcyBpdCBpcyBhc3N1bWVkIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZ2VuZXJhdGVkCiAqIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgZ29vZy5nZXRDc3NOYW1lLgogKgogKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tb2RpZmllciBBIG1vZGlmaWVyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjbGFzcyBuYW1lLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGFzcyBuYW1lIG9yIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIGFuZAogKiAgICAgdGhlIG1vZGlmaWVyLgogKi8KZ29vZy5nZXRDc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBvcHRfbW9kaWZpZXIpIHsKICAvLyBTdHJpbmcoKSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29tcGlsZWQgc295IHdoZXJlIHRoZSBwYXNzZWQKICAvLyBjbGFzc05hbWUgY2FuIGJlIG5vbi1zdHJpbmcgb2JqZWN0cy4KICBpZiAoU3RyaW5nKGNsYXNzTmFtZSkuY2hhckF0KDApID09ICcuJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4nICsKICAgICAgICAnIFlvdSBwYXNzZWQ6ICcgKyBjbGFzc05hbWUpOwogIH0KCiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbihjc3NOYW1lKSB7CiAgICByZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bY3NzTmFtZV0gfHwgY3NzTmFtZTsKICB9OwoKICB2YXIgcmVuYW1lQnlQYXJ0cyA9IGZ1bmN0aW9uKGNzc05hbWUpIHsKICAgIC8vIFJlbWFwIGFsbCB0aGUgcGFydHMgaW5kaXZpZHVhbGx5LgogICAgdmFyIHBhcnRzID0gY3NzTmFtZS5zcGxpdCgnLScpOwogICAgdmFyIG1hcHBlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gbWFwcGVkLmpvaW4oJy0nKTsKICB9OwoKICB2YXIgcmVuYW1lOwogIGlmIChnb29nLmNzc05hbWVNYXBwaW5nXykgewogICAgcmVuYW1lID0KICAgICAgICBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID09ICdCWV9XSE9MRScgPyBnZXRNYXBwaW5nIDogcmVuYW1lQnlQYXJ0czsKICB9IGVsc2UgewogICAgcmVuYW1lID0gZnVuY3Rpb24oYSkgewogICAgICByZXR1cm4gYTsKICAgIH07CiAgfQoKICB2YXIgcmVzdWx0ID0KICAgICAgb3B0X21vZGlmaWVyID8gY2xhc3NOYW1lICsgJy0nICsgcmVuYW1lKG9wdF9tb2RpZmllcikgOiByZW5hbWUoY2xhc3NOYW1lKTsKCiAgLy8gVGhlIHNwZWNpYWwgQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgZnVydGhlcgogIC8vIHByb2Nlc3Npbmcgb2YgdGhlIGNsYXNzIG5hbWUuCiAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqCiAqIFNldHMgdGhlIG1hcCB0byBjaGVjayB3aGVuIHJldHVybmluZyBhIHZhbHVlIGZyb20gZ29vZy5nZXRDc3NOYW1lKCkuIEV4YW1wbGU6CiAqIDxwcmU+CiAqIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoewogKiAgICJnb29nIjogImEiLAogKiAgICJkaXNhYmxlZCI6ICJiIiwKICogfSk7CiAqCiAqIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdnb29nJyk7CiAqIC8vIFRoZSBmb2xsb3dpbmcgZXZhbHVhdGVzIHRvOiAiYSBhLWIiLgogKiBnb29nLmdldENzc05hbWUoJ2dvb2cnKSArICcgJyArIGdvb2cuZ2V0Q3NzTmFtZSh4LCAnZGlzYWJsZWQnKQogKiA8L3ByZT4KICogV2hlbiBkZWNsYXJlZCBhcyBhIG1hcCBvZiBzdHJpbmcgbGl0ZXJhbHMgdG8gc3RyaW5nIGxpdGVyYWxzLCB0aGUgSlNDb21waWxlcgogKiB3aWxsIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpIHVzaW5nIHRoZSBzdXBwbGllZCBtYXAgaWYgdGhlCiAqIC0tcHJvY2Vzc19jbG9zdXJlX3ByaW1pdGl2ZXMgZmxhZyBpcyBzZXQuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWFwcGluZyBBIG1hcCBvZiBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgcG9zc2libGUKICogICAgIGFyZ3VtZW50cyB0byBnb29nLmdldENzc05hbWUoKSBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKICogICAgIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHlsZSBUaGUgc3R5bGUgb2YgY3NzIG5hbWUgbWFwcGluZy4gVGhlcmUgYXJlIHR3byB2YWxpZAogKiAgICAgb3B0aW9uczogJ0JZX1BBUlQnLCBhbmQgJ0JZX1dIT0xFJy4KICogQHNlZSBnb29nLmdldENzc05hbWUgZm9yIGEgZGVzY3JpcHRpb24uCiAqLwpnb29nLnNldENzc05hbWVNYXBwaW5nID0gZnVuY3Rpb24obWFwcGluZywgb3B0X3N0eWxlKSB7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ18gPSBtYXBwaW5nOwogIGdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8gPSBvcHRfc3R5bGU7Cn07CgoKLyoqCiAqIFRvIHVzZSBDU1MgcmVuYW1pbmcgaW4gY29tcGlsZWQgbW9kZSwgb25lIG9mIHRoZSBpbnB1dCBmaWxlcyBzaG91bGQgaGF2ZSBhCiAqIGNhbGwgdG8gZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwgdGhhdCB0aGUgSlNDb21waWxlcgogKiBjYW4gZXh0cmFjdCBhbmQgdXNlIHRvIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpLiBJbiB1bmNvbXBpbGVkCiAqIG1vZGUsIEphdmFTY3JpcHQgY29kZSBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZSB0aGlzIGJhc2UuanMgZmlsZSB0aGF0IGRlY2xhcmVzCiAqIGEgZ2xvYmFsIHZhcmlhYmxlLCBDTE9TVVJFX0NTU19OQU1FX01BUFBJTkcsIHdoaWNoIGlzIHVzZWQgYmVsb3cuIFRoaXMgaXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgbG9hZGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gZ29vZy5nZXRDc3NOYW1lKCkKICogYXJlIG1hZGUgaW4gdW5jb21waWxlZCBtb2RlLgogKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIENTUyBuYW1lIG1hcHBpbmcuCiAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkc7CgoKaWYgKCFDT01QSUxFRCAmJiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkcpIHsKICAvLyBUaGlzIGRvZXMgbm90IGNhbGwgZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIGJlY2F1c2UgdGhlIEpTQ29tcGlsZXIKICAvLyByZXF1aXJlcyB0aGF0IGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoKSBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4KICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORzsKfQoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21waWxlciBwcmltaXRpdmUuIElmIHlvdSBnaXZlIHRoZSBjb21waWxlciBhIGxvY2FsaXplZAogKiBtZXNzYWdlIGJ1bmRsZSwgaXQgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgY29tcGlsZS10aW1lIHdpdGggYSBsb2NhbGl6ZWQKICogdmVyc2lvbiwgYW5kIGV4cGFuZCBnb29nLmdldE1zZyBjYWxsIHRvIGEgY29uY2F0ZW5hdGVkIHN0cmluZy4KICoKICogTWVzc2FnZXMgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgZm9ybToKICogPGNvZGU+CiAqIHZhciBNU0dfTkFNRSA9IGdvb2cuZ2V0TXNnKCdIZWxsbyB7JHBsYWNlaG9sZGVyfScsIHsncGxhY2Vob2xkZXInOiAnd29ybGQnfSk7CiAqIDwvY29kZT4KICoKICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBVc2UKICoge0BsaW5rIGdvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlcn0gaW4gY29uanVuY3Rpb24gd2l0aCBnb29nLmdldE1zZyB0bwogKiBwcm9kdWNlIFNhZmVIdG1sLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRyYW5zbGF0YWJsZSBzdHJpbmcsIHBsYWNlcyBob2xkZXJzIGluIHRoZSBmb3JtIHskZm9vfS4KICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+PX0gb3B0X3ZhbHVlcyBNYXBzIHBsYWNlIGhvbGRlciBuYW1lIHRvIHZhbHVlLgogKiBAcGFyYW0ge3todG1sOiBib29sZWFufT19IG9wdF9vcHRpb25zIE9wdGlvbnM6CiAqICAgICBodG1sOiBFc2NhcGUgJzwnIGluIHN0ciB0byAnJmx0OycuIFVzZWQgYnkgQ2xvc3VyZSBUZW1wbGF0ZXMgd2hlcmUgdGhlCiAqICAgICBnZW5lcmF0ZWQgY29kZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCB3aGljaCBpcyB3aHkge0BsaW5rCiAqICAgICBnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXJ9IGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgbXVzdCBiZSBsaXRlcmFsIHRydWUKICogICAgIG9yIGZhbHNlLgogKiBAcmV0dXJuIHtzdHJpbmd9IG1lc3NhZ2Ugd2l0aCBwbGFjZWhvbGRlcnMgZmlsbGVkLgogKi8KZ29vZy5nZXRNc2cgPSBmdW5jdGlvbihzdHIsIG9wdF92YWx1ZXMsIG9wdF9vcHRpb25zKSB7CiAgaWYgKG9wdF9vcHRpb25zICYmIG9wdF9vcHRpb25zLmh0bWwpIHsKICAgIC8vIE5vdGUgdGhhdCAnJicgaXMgbm90IHJlcGxhY2VkIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGNhbiBjb250YWluIEhUTUwKICAgIC8vIGVudGl0aWVzLgogICAgc3RyID0gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKTsKICB9CiAgaWYgKG9wdF92YWx1ZXMpIHsKICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ce1wkKFtefV0rKX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKICAgIH0pOwogIH0KICByZXR1cm4gc3RyOwp9OwoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc2xhdGlvbiwgZ2l2ZXMgYQogKiBmYWxsYmFjayBtZXNzYWdlLgogKgogKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGludHJvZHVjaW5nIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgbm90IHlldCBiZWVuCiAqIHRyYW5zbGF0ZWQgaW50byBhbGwgbGFuZ3VhZ2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBNdXN0IGJlIHVzZWQgaW4gdGhlIGZvcm06CiAqIDxjb2RlPnZhciB4ID0gZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2soTVNHX0EsIE1TR19CKTs8L2NvZGU+CiAqIHdoZXJlIE1TR19BIGFuZCBNU0dfQiB3ZXJlIGluaXRpYWxpemVkIHdpdGggZ29vZy5nZXRNc2cuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhIFRoZSBwcmVmZXJyZWQgbWVzc2FnZS4KICogQHBhcmFtIHtzdHJpbmd9IGIgVGhlIGZhbGxiYWNrIG1lc3NhZ2UuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJlc3QgdHJhbnNsYXRlZCBtZXNzYWdlLgogKi8KZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGE7Cn07CgoKLyoqCiAqIEV4cG9zZXMgYW4gdW5vYmZ1c2NhdGVkIGdsb2JhbCBuYW1lc3BhY2UgcGF0aCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KICogTm90ZSB0aGF0IGZpZWxkcyBvZiB0aGUgZXhwb3J0ZWQgb2JqZWN0ICp3aWxsKiBiZSBvYmZ1c2NhdGVkLCB1bmxlc3MgdGhleSBhcmUKICogZXhwb3J0ZWQgaW4gdHVybiB2aWEgdGhpcyBmdW5jdGlvbiBvciBnb29nLmV4cG9ydFByb3BlcnR5LgogKgogKiBBbHNvIGhhbmR5IGZvciBtYWtpbmcgcHVibGljIGl0ZW1zIHRoYXQgYXJlIGRlZmluZWQgaW4gYW5vbnltb3VzIGNsb3N1cmVzLgogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvbycsIEZvbyk7CiAqCiAqIGV4LiBnb29nLmV4cG9ydFN5bWJvbCgncHVibGljLnBhdGguRm9vLnN0YXRpY0Z1bmN0aW9uJywgRm9vLnN0YXRpY0Z1bmN0aW9uKTsKICogICAgIHB1YmxpYy5wYXRoLkZvby5zdGF0aWNGdW5jdGlvbigpOwogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvby5wcm90b3R5cGUubXlNZXRob2QnLAogKiAgICAgICAgICAgICAgICAgICAgICAgRm9vLnByb3RvdHlwZS5teU1ldGhvZCk7CiAqICAgICBuZXcgcHVibGljLnBhdGguRm9vKCkubXlNZXRob2QoKTsKICoKICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY1BhdGggVW5vYmZ1c2NhdGVkIG5hbWUgdG8gZXhwb3J0LgogKiBAcGFyYW0geyp9IG9iamVjdCBPYmplY3QgdGhlIG5hbWUgc2hvdWxkIHBvaW50IHRvLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBnb29nLmdsb2JhbC4KICovCmdvb2cuZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbykgewogIGdvb2cuZXhwb3J0UGF0aF8ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbyk7Cn07CgoKLyoqCiAqIEV4cG9ydHMgYSBwcm9wZXJ0eSB1bm9iZnVzY2F0ZWQgaW50byB0aGUgb2JqZWN0J3MgbmFtZXNwYWNlLgogKiBleC4gZ29vZy5leHBvcnRQcm9wZXJ0eShGb28sICdzdGF0aWNGdW5jdGlvbicsIEZvby5zdGF0aWNGdW5jdGlvbik7CiAqIGV4LiBnb29nLmV4cG9ydFByb3BlcnR5KEZvby5wcm90b3R5cGUsICdteU1ldGhvZCcsIEZvby5wcm90b3R5cGUubXlNZXRob2QpOwogKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IE9iamVjdCB3aG9zZSBzdGF0aWMgcHJvcGVydHkgaXMgYmVpbmcgZXhwb3J0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNOYW1lIFVub2JmdXNjYXRlZCBuYW1lIHRvIGV4cG9ydC4KICogQHBhcmFtIHsqfSBzeW1ib2wgT2JqZWN0IHRoZSBuYW1lIHNob3VsZCBwb2ludCB0by4KICovCmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvYmplY3QsIHB1YmxpY05hbWUsIHN5bWJvbCkgewogIG9iamVjdFtwdWJsaWNOYW1lXSA9IHN5bWJvbDsKfTsKCgovKioKICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLgogKgogKiBVc2FnZToKICogPHByZT4KICogZnVuY3Rpb24gUGFyZW50Q2xhc3MoYSwgYikgeyB9CiAqIFBhcmVudENsYXNzLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbihhKSB7IH07CiAqCiAqIGZ1bmN0aW9uIENoaWxkQ2xhc3MoYSwgYiwgYykgewogKiAgIENoaWxkQ2xhc3MuYmFzZSh0aGlzLCAnY29uc3RydWN0b3InLCBhLCBiKTsKICogfQogKiBnb29nLmluaGVyaXRzKENoaWxkQ2xhc3MsIFBhcmVudENsYXNzKTsKICoKICogdmFyIGNoaWxkID0gbmV3IENoaWxkQ2xhc3MoJ2EnLCAnYicsICdzZWUnKTsKICogY2hpbGQuZm9vKCk7IC8vIFRoaXMgd29ya3MuCiAqIDwvcHJlPgogKgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY2hpbGRDdG9yIENoaWxkIGNsYXNzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gcGFyZW50Q3RvciBQYXJlbnQgY2xhc3MuCiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IHN1cGVyQ2xhc3NfIGFuZCBiYXNlIGlzIG5vdCBkZWZpbmVkIG9uCiAqICAgIEZ1bmN0aW9uLgogKi8KZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNoaWxkQ3RvciwgcGFyZW50Q3RvcikgewogIC8qKiBAY29uc3RydWN0b3IgKi8KICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHt9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogIC8qKiBAb3ZlcnJpZGUgKi8KICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yOwoKICAvKioKICAgKiBDYWxscyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yL21ldGhvZC4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHVzZSBnb29nLmluaGVyaXRzIHRvCiAgICogZXhwcmVzcyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xhc3Nlcy4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgZ29vZy5iYXNlIGFuZCBmb3Igc3VwZXJDbGFzc18KICAgKiBwcm9wZXJ0eSBkZWZpbmVkIGluIGNoaWxkQ3Rvci4KICAgKgogICAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwuIENhbGxpbmcKICAgKiAgICAgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzcGVjaWFsIHN0cmluZwogICAqICAgICAnY29uc3RydWN0b3InLgogICAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHN1cGVyY2xhc3MKICAgKiAgICAgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqLwogIGNoaWxkQ3Rvci5iYXNlID0gZnVuY3Rpb24obWUsIG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHBhcmVudEN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdLmFwcGx5KG1lLCBhcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDYWxsIHVwIHRvIHRoZSBzdXBlcmNsYXNzLgogKgogKiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3IsIHRoZW4gdGhpcyBjYWxscyB0aGUgc3VwZXJjbGFzcwogKiBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAxLU4uCiAqCiAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBwcm90b3R5cGUgbWV0aG9kLCB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIG5hbWUgb2YgdGhlCiAqIG1ldGhvZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkbyBub3QsIHlvdSB3aWxsIGdldCBhCiAqIHJ1bnRpbWUgZXJyb3IuIFRoaXMgY2FsbHMgdGhlIHN1cGVyY2xhc3MnIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAyLU4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBpZiB5b3UgdXNlIGdvb2cuaW5oZXJpdHMgdG8gZXhwcmVzcyBpbmhlcml0YW5jZQogKiByZWxhdGlvbnNoaXBzIGJldHdlZW4geW91ciBjbGFzc2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBBdCBjb21waWxlLXRpbWUsIHRoZSBjb21waWxlciB3aWxsIGRvCiAqIG1hY3JvIGV4cGFuc2lvbiB0byByZW1vdmUgYSBsb3Qgb2YgdGhlIGV4dHJhIG92ZXJoZWFkIHRoYXQgdGhpcyBmdW5jdGlvbgogKiBpbnRyb2R1Y2VzLiBUaGUgY29tcGlsZXIgd2lsbCBhbHNvIGVuZm9yY2UgYSBsb3Qgb2YgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhpcwogKiBmdW5jdGlvbiBtYWtlcywgYW5kIHRyZWF0IGl0IGFzIGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IGJyZWFrIHRoZW0uCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAqIEBwYXJhbSB7Kj19IG9wdF9tZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSBpZiBjYWxsaW5nIGEgc3VwZXIgbWV0aG9kLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kLgogKiBAc3VwcHJlc3Mge2VzNVN0cmljdH0gVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGluIHN0cmljdCBtb2RlLCBidXQKICogICAgIGFsbCBDbG9zdXJlIExpYnJhcnkgY29uc3VtZXJzIG11c3QgZGVwZW5kIG9uIHRoaXMgZmlsZS4KICogQGRlcHJlY2F0ZWQgZ29vZy5iYXNlIGlzIG5vdCBzdHJpY3QgbW9kZSBjb21wYXRpYmxlLiAgUHJlZmVyIHRoZSBzdGF0aWMKICogICAgICJiYXNlIiBtZXRob2QgYWRkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGJ5IGdvb2cuaW5oZXJpdHMKICogICAgIG9yIEVTNiBjbGFzc2VzIGFuZCB0aGUgInN1cGVyIiBrZXl3b3JkLgogKi8KZ29vZy5iYXNlID0gZnVuY3Rpb24obWUsIG9wdF9tZXRob2ROYW1lLCB2YXJfYXJncykgewogIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKCiAgaWYgKGdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSB8fCAoZ29vZy5ERUJVRyAmJiAhY2FsbGVyKSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdhcmd1bWVudHMuY2FsbGVyIG5vdCBkZWZpbmVkLiAgZ29vZy5iYXNlKCkgY2Fubm90IGJlIHVzZWQgJyArCiAgICAgICAgJ3dpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlICcgKwogICAgICAgICdodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtQycpOwogIH0KCiAgaWYgKHR5cGVvZiBjYWxsZXIuc3VwZXJDbGFzc18gIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBjdG9yQXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBjdG9yQXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IuIENhbGwgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICByZXR1cm4gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovIChjYWxsZXIuc3VwZXJDbGFzc18pCiAgICAgICAgLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBjdG9yQXJncyk7CiAgfQoKICBpZiAodHlwZW9mIG9wdF9tZXRob2ROYW1lICE9ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfbWV0aG9kTmFtZSAhPSAnc3ltYm9sJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdtZXRob2QgbmFtZXMgcHJvdmlkZWQgdG8gZ29vZy5iYXNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wnKTsKICB9CgogIC8vIENvcHlpbmcgdXNpbmcgbG9vcCB0byBhdm9pZCBkZW9wIGR1ZSB0byBwYXNzaW5nIGFyZ3VtZW50cyBvYmplY3QgdG8KICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7CiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogIH0KICB2YXIgZm91bmRDYWxsZXIgPSBmYWxzZTsKICBmb3IgKHZhciBwcm90byA9IG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsgcHJvdG87CiAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpIHsKICAgIGlmIChwcm90b1tvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGZvdW5kQ2FsbGVyKSB7CiAgICAgIHJldHVybiBwcm90b1tvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpOwogICAgfQogIH0KCiAgLy8gSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBjYWxsZXIgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgdGhlbiBvbmUgb2YgdHdvCiAgLy8gdGhpbmdzIGhhcHBlbmVkOgogIC8vIDEpIFRoZSBjYWxsZXIgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgogIC8vIDIpIFRoaXMgbWV0aG9kIHdhcyBub3QgY2FsbGVkIGJ5IHRoZSByaWdodCBjYWxsZXIuCiAgaWYgKG1lW29wdF9tZXRob2ROYW1lXSA9PT0gY2FsbGVyKSB7CiAgICByZXR1cm4gbWUuY29uc3RydWN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncyk7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnZ29vZy5iYXNlIGNhbGxlZCBmcm9tIGEgbWV0aG9kIG9mIG9uZSBuYW1lICcgKwogICAgICAgICd0byBhIG1ldGhvZCBvZiBhIGRpZmZlcmVudCBuYW1lJyk7CiAgfQp9OwoKCi8qKgogKiBBbGxvdyBmb3IgYWxpYXNpbmcgd2l0aGluIHNjb3BlIGZ1bmN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcgogKiB1bmNvbXBpbGVkIGNvZGUgLSBpbiBjb21waWxlZCBjb2RlIHRoZSBjYWxscyB3aWxsIGJlIGlubGluZWQgYW5kIHRoZSBhbGlhc2VzCiAqIGFwcGxpZWQuICBJbiB1bmNvbXBpbGVkIGNvZGUgdGhlIGZ1bmN0aW9uIGlzIHNpbXBseSBydW4gc2luY2UgdGhlIGFsaWFzZXMgYXMKICogd3JpdHRlbiBhcmUgdmFsaWQgSmF2YVNjcmlwdC4KICoKICoKICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBmdW5jdGlvbiBjYW4gY29udGFpbiBhbGlhc2VzCiAqICAgICB0byBuYW1lc3BhY2VzIChlLmcuICJ2YXIgZG9tID0gZ29vZy5kb20iKSBvciBjbGFzc2VzCiAqICAgICAoZS5nLiAidmFyIFRpbWVyID0gZ29vZy5UaW1lciIpLgogKi8KZ29vZy5zY29wZSA9IGZ1bmN0aW9uKGZuKSB7CiAgaWYgKGdvb2cuaXNJbk1vZHVsZUxvYWRlcl8oKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLicpOwogIH0KICBmbi5jYWxsKGdvb2cuZ2xvYmFsKTsKfTsKCgovKgogKiBUbyBzdXBwb3J0IHVuY29tcGlsZWQsIHN0cmljdCBtb2RlIGJ1bmRsZXMgdGhhdCB1c2UgZXZhbCB0byBkaXZpZGUgc291cmNlCiAqIGxpa2Ugc286CiAqICAgIGV2YWwoJ3NvbWVTb3VyY2U7Ly8jIHNvdXJjZVVybCBzb3VyY2VmaWxlLmpzJyk7CiAqIFdlIG5lZWQgdG8gZXhwb3J0IHRoZSBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHMgImdvb2ciIGFuZCAiQ09NUElMRUQiLgogKiBFeHBvcnRpbmcgImdvb2ciIGJyZWFrcyB0aGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucywgc28gd2UgcmVxdWlyZWQgdGhhdAogKiBiZSBkZWZpbmVkIGV4dGVybmFsbHkuCiAqIE5PVEU6IFdlIGRvbid0IHVzZSBnb29nLmV4cG9ydFN5bWJvbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCiAqIGV4dGVybiBnZW5lcmF0aW9uIHdoZW4gdGhhdCBjb21waWxlciBvcHRpb24gaXMgZW5hYmxlZC4KICovCmlmICghQ09NUElMRUQpIHsKICBnb29nLmdsb2JhbFsnQ09NUElMRUQnXSA9IENPTVBJTEVEOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZ29vZy5kZWZpbmVDbGFzcyBpbXBsZW1lbnRhdGlvbgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBDcmVhdGVzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIGEgQ2xvc3VyZSAiY2xhc3MiOgogKiAgIC0gZnJvbSB0aGUgY29tcGlsZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlCiAqICAgICBjb25zdHJ1Y3RvciBpcyBzZWFsZWQgKG5vIG5ldyBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCkuICBUaGlzIGVuYWJsZXMKICogICAgIGJldHRlciBjaGVja3MuCiAqICAgLSB0aGUgY29tcGlsZXIgd2lsbCByZXdyaXRlIHRoaXMgZGVmaW5pdGlvbiB0byBhIGZvcm0gdGhhdCBpcyBvcHRpbWFsCiAqICAgICBmb3IgdHlwZSBjaGVja2luZyBhbmQgb3B0aW1pemF0aW9uIChpbml0aWFsbHkgdGhpcyB3aWxsIGJlIGEgbW9yZQogKiAgICAgdHJhZGl0aW9uYWwgZm9ybSkuCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MsIE9iamVjdCBvciBudWxsLgogKiBAcGFyYW0ge2dvb2cuZGVmaW5lQ2xhc3MuQ2xhc3NEZXNjcmlwdG9yfSBkZWYKICogICAgIEFuIG9iamVjdCBsaXRlcmFsIGRlc2NyaWJpbmcKICogICAgIHRoZSBjbGFzcy4gIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogICAgICJjb25zdHJ1Y3RvciI6IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiAgICAgInN0YXRpY3MiOiBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgYXMgInN0YXRpYyIgbWV0aG9kcyBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgZnVuY3Rpb24gYXMgaXRzIG9ubHkgcGFyYW1ldGVyIHRvIHdoaWNoIHN0YXRpYyBwcm9wZXJ0aWVzIGNhbgogKiAgICAgICAgYmUgYWRkZWQuCiAqICAgICBhbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIHByb3RvdHlwZS4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBUaGUgY2xhc3MgY29uc3RydWN0b3IuCiAqIEBkZXByZWNhdGVkIFVzZSBFUzYgY2xhc3Mgc3ludGF4IGluc3RlYWQuCiAqLwpnb29nLmRlZmluZUNsYXNzID0gZnVuY3Rpb24oc3VwZXJDbGFzcywgZGVmKSB7CiAgLy8gVE9ETyhqb2hubGVueik6IGNvbnNpZGVyIG1ha2luZyB0aGUgc3VwZXJDbGFzcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgdmFyIGNvbnN0cnVjdG9yID0gZGVmLmNvbnN0cnVjdG9yOwogIHZhciBzdGF0aWNzID0gZGVmLnN0YXRpY3M7CiAgLy8gV3JhcCB0aGUgY29uc3RydWN0b3IgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcy4KICBpZiAoIWNvbnN0cnVjdG9yIHx8IGNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHsKICAgIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4nKTsKICAgIH07CiAgfQoKICB2YXIgY2xzID0gZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGNvbnN0cnVjdG9yLCBzdXBlckNsYXNzKTsKICBpZiAoc3VwZXJDbGFzcykgewogICAgZ29vZy5pbmhlcml0cyhjbHMsIHN1cGVyQ2xhc3MpOwogIH0KCiAgLy8gUmVtb3ZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkIHRvIHRoZSBwcm90b3R5cGUuCiAgZGVsZXRlIGRlZi5jb25zdHJ1Y3RvcjsKICBkZWxldGUgZGVmLnN0YXRpY3M7CgogIGdvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjbHMucHJvdG90eXBlLCBkZWYpOwogIGlmIChzdGF0aWNzICE9IG51bGwpIHsKICAgIGlmIChzdGF0aWNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgc3RhdGljcyhjbHMpOwogICAgfSBlbHNlIHsKICAgICAgZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGNscywgc3RhdGljcyk7CiAgICB9CiAgfQoKICByZXR1cm4gY2xzOwp9OwoKCi8qKgogKiBAdHlwZWRlZiB7ewogKiAgIGNvbnN0cnVjdG9yOiAoIUZ1bmN0aW9ufHVuZGVmaW5lZCksCiAqICAgc3RhdGljczogKE9iamVjdHx1bmRlZmluZWR8ZnVuY3Rpb24oRnVuY3Rpb24pOnZvaWQpCiAqIH19CiAqLwpnb29nLmRlZmluZUNsYXNzLkNsYXNzRGVzY3JpcHRvcjsKCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IGdvb2cuZGVmaW5lQ2xhc3Mgc2hvdWxkCiAqICAgICBiZSBzZWFsZWQgd2hlbiBwb3NzaWJsZS4KICoKICogV2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIG5vdCBiZSB3cmFwcGVkIGJ5CiAqIGdvb2cuZGVmaW5lQ2xhc3MsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3MgbWV0aG9kcy4KICovCmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMgPQogICAgZ29vZy5kZWZpbmUoJ2dvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMnLCBnb29nLkRFQlVHKTsKCgovKioKICogSWYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUyBpcyBlbmFibGVkIGFuZCBPYmplY3Quc2VhbCBpcwogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCB0aGUgY29uc3RydWN0b3IgaW4gYSBmdW5jdGlvbiB0aGF0IHNlYWxzIHRoZQogKiByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHshRnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3Igd2hvc2UgcmVzdWx0cyBtYXliZSBiZSBzZWFsZWQuCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gVGhlIHJlcGxhY2VtZW50IGNvbnN0cnVjdG9yLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfID0gZnVuY3Rpb24oY3RyLCBzdXBlckNsYXNzKSB7CiAgaWYgKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKSB7CiAgICAvLyBEbyBub3cgd3JhcCB0aGUgY29uc3RydWN0b3Igd2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkLiBBbmd1bGFyIGNvZGUKICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmb3IgaW5qZWN0aW9uIHRvIHdvcmsgcHJvcGVybHkuCiAgICByZXR1cm4gY3RyOwogIH0KCiAgLy8gQ29tcHV0ZSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBzZWFsYWJsZSBhdCBkZWZpbml0aW9uIHRpbWUsIHJhdGhlcgogIC8vIHRoYW4gd2hlbiB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAgdmFyIHN1cGVyY2xhc3NTZWFsYWJsZSA9ICFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oc3VwZXJDbGFzcyk7CgogIC8qKgogICAqIEB0aGlzIHtPYmplY3R9CiAgICogQHJldHVybiB7P30KICAgKi8KICB2YXIgd3JhcHBlZEN0ciA9IGZ1bmN0aW9uKCkgewogICAgLy8gRG9uJ3Qgc2VhbCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHdoZW4gaXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIG9mCiAgICAvLyBpdHMgc3VwZXIgY2xhc3MgYXMgdGhlcmUgaXMgbW9zdCBsaWtlbHkgc3RpbGwgc2V0dXAgdG8gZG8uCiAgICB2YXIgaW5zdGFuY2UgPSBjdHIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgaW5zdGFuY2VbZ29vZy5VSURfUFJPUEVSVFlfXSA9IGluc3RhbmNlW2dvb2cuVUlEX1BST1BFUlRZX107CgogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IHdyYXBwZWRDdHIgJiYgc3VwZXJjbGFzc1NlYWxhYmxlICYmCiAgICAgICAgT2JqZWN0LnNlYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICBPYmplY3Quc2VhbChpbnN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgcmV0dXJuIHdyYXBwZWRDdHI7Cn07CgoKLyoqCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3IgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gdGFnZ2VkIGFzIHVuc2VhbGFibGUKICogICAgIHVzaW5nIGdvb2cudGFnVW5zZWFsYWJsZUNsYXNzLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfID0gZnVuY3Rpb24oY3RyKSB7CiAgcmV0dXJuIGN0ciAmJiBjdHIucHJvdG90eXBlICYmCiAgICAgIGN0ci5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX107Cn07CgoKLy8gVE9ETyhqb2hubGVueik6IHNoYXJlIHRoZXNlIHZhbHVlcyB3aXRoIHRoZSBnb29nLm9iamVjdAovKioKICogVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLgogKiBAdHlwZSB7IUFycmF5PHN0cmluZz59CiAqIEBwcml2YXRlCiAqIEBjb25zdAogKi8KZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18gPSBbCiAgJ2NvbnN0cnVjdG9yJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsICd0b1N0cmluZycsICd2YWx1ZU9mJwpdOwoKCi8vIFRPRE8oam9obmxlbnopOiBzaGFyZSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGdvb2cub2JqZWN0Ci8qKgogKiBAcGFyYW0geyFPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGFkZCBwcm9wZXJ0aWVzIHRvLgogKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAvLyBUT0RPKGpvaG5sZW56KTogdXBkYXRlIHRoaXMgdG8gc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzCgogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gc291cmNlKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgfQogIH0KCiAgLy8gRm9yIElFIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdAogIC8vIGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlIGlzUHJvdG90eXBlT2YgZnJvbQogIC8vIE9iamVjdC5wcm90b3R5cGUpIGFuZCBpdCB3aWxsIGFsc28gbm90IGluY2x1ZGUgJ3JlcGxhY2UnIG9uIG9iamVjdHMgdGhhdAogIC8vIGV4dGVuZCBTdHJpbmcgYW5kIGNoYW5nZSAncmVwbGFjZScgKG5vdCB0aGF0IGl0IGlzIGNvbW1vbiBmb3IgYW55b25lIHRvCiAgLy8gZXh0ZW5kIGFueXRoaW5nIGV4Y2VwdCBPYmplY3QpLgogIGZvciAodmFyIGkgPSAwOyBpIDwgZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoOyBpKyspIHsKICAgIGtleSA9IGdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2ldOwogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgIH0KICB9Cn07CgoKLyoqCiAqIFNlYWxpbmcgY2xhc3NlcyBicmVha3MgdGhlIG9sZGVyIGlkaW9tIG9mIGFzc2lnbmluZyBwcm9wZXJ0aWVzIG9uIHRoZQogKiBwcm90b3R5cGUgcmF0aGVyIHRoYW4gaW4gdGhlIGNvbnN0cnVjdG9yLiBBcyBzdWNoLCBnb29nLmRlZmluZUNsYXNzCiAqIG11c3Qgbm90IHNlYWwgc3ViY2xhc3NlcyBvZiB0aGVzZSBvbGQtc3R5bGUgY2xhc3NlcyB1bnRpbCB0aGV5IGFyZSBmaXhlZC4KICogVW50aWwgdGhlbiwgdGhpcyBtYXJrcyBhIGNsYXNzIGFzICJicm9rZW4iLCBpbnN0cnVjdGluZyBkZWZpbmVDbGFzcwogKiBub3QgdG8gc2VhbCBzdWJjbGFzc2VzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RyIFRoZSBsZWdhY3kgY29uc3RydWN0b3IgdG8gdGFnIGFzIHVuc2VhbGFibGUuCiAqLwpnb29nLnRhZ1Vuc2VhbGFibGVDbGFzcyA9IGZ1bmN0aW9uKGN0cikgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUykgewogICAgY3RyLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXSA9IHRydWU7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bnNlYWxhYmxlIHRhZyBwcm9wZXJ0eS4KICogQGNvbnN0IEBwcml2YXRlIHtzdHJpbmd9CiAqLwpnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfID0gJ2dvb2dfZGVmaW5lQ2xhc3NfbGVnYWN5X3Vuc2VhbGFibGUnOwoKCi8vIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGNvbXBpbGVyIHdoZXJlIHdpdGhvdXQgY29sbGFwc2UgcHJvcGVydGllcyB0aGUKLy8gQ2xvc3VyZSBuYW1lc3BhY2UgZGVmaW5lcyBkbyBub3QgZ3VhcmQgY29kZSBjb3JyZWN0bHkuIFRvIGhlbHAgcmVkdWNlIGNvZGUKLy8gc2l6ZSBhbHNvIGNoZWNrIGZvciAhQ09NUElMRUQgZXZlbiB0aG91Z2ggaXQgcmVkdW5kYW50IHVudGlsIHRoaXMgaXMgZml4ZWQuCmlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBpcyBpbiB0aGUgY29udGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgbG9va3MgbGlrZSBIVE1MIGRvY3VtZW50LgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5pbkh0bWxEb2N1bWVudF8gPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7IURvY3VtZW50fSAqLwogICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgcmV0dXJuIGRvYyAhPSBudWxsICYmICd3cml0ZScgaW4gZG9jOyAgLy8gWFVMRG9jdW1lbnQgbWlzc2VzIHdyaXRlLgogIH07CgoKICAvKioKICAgKiBXZSdkIGxpa2UgdG8gY2hlY2sgZm9yIGlmIHRoZSBkb2N1bWVudCByZWFkeVN0YXRlIGlzICdsb2FkaW5nJzsgaG93ZXZlcgogICAqIHRoZXJlIGFyZSBidWdzIG9uIElFIDEwIGFuZCBiZWxvdyB3aGVyZSB0aGUgcmVhZHlTdGF0ZSBiZWluZyBhbnl0aGluZyBvdGhlcgogICAqIHRoYW4gJ2NvbXBsZXRlJyBpcyBub3QgcmVsaWFibGUuCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfID0gZnVuY3Rpb24oKSB7CiAgICAvLyBhdHRhY2hFdmVudCBpcyBhdmFpbGFibGUgb24gSUUgNiB0aHJ1IDEwIG9ubHksIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvCiAgICAvLyBkZXRlY3QgdGhvc2UgYnJvd3NlcnMuCiAgICAvKiogQHR5cGUgeyFIVE1MRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICByZXR1cm4gZG9jLmF0dGFjaEV2ZW50ID8gZG9jLnJlYWR5U3RhdGUgIT0gJ2NvbXBsZXRlJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnOwogIH07CgoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3QgdGhlIGJhc2UgcGF0aCBvZiBiYXNlLmpzIHNjcmlwdCB0aGF0IGJvb3RzdHJhcHMgQ2xvc3VyZS4KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuZmluZEJhc2VQYXRoXyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIICE9IHVuZGVmaW5lZCAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgdHlwZW9mIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIID09PSAnc3RyaW5nJykgewogICAgICBnb29nLmJhc2VQYXRoID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoIWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHshRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudFNjcmlwdCBhdmFpbGFibGUsIHVzZSBpdCBleGNsdXNpdmVseS4KICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jLmN1cnJlbnRTY3JpcHQ7CiAgICBpZiAoY3VycmVudFNjcmlwdCkgewogICAgICB2YXIgc2NyaXB0cyA9IFtjdXJyZW50U2NyaXB0XTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzY3JpcHRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdTQ1JJUFQnKTsKICAgIH0KICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgc2luY2UgdGhlIGN1cnJlbnQgc2NyaXB0IGlzIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIG9uZQogICAgLy8gdGhhdCBoYXMgYmFzZS5qcy4KICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBzY3JpcHQgPSAvKiogQHR5cGUgeyFIVE1MU2NyaXB0RWxlbWVudH0gKi8gKHNjcmlwdHNbaV0pOwogICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAgICAgdmFyIHFtYXJrID0gc3JjLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgIHZhciBsID0gcW1hcmsgPT0gLTEgPyBzcmMubGVuZ3RoIDogcW1hcms7CiAgICAgIGlmIChzcmMuc3Vic3RyKGwgLSA3LCA3KSA9PSAnYmFzZS5qcycpIHsKICAgICAgICBnb29nLmJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gNyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfTsKCiAgZ29vZy5maW5kQmFzZVBhdGhfKCk7CgogIC8qKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgKi8KICBnb29nLlRyYW5zcGlsZXIgPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAcHJpdmF0ZSB7P09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSAqLwogICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gbnVsbDsKICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IGdvb2cuVFJBTlNQSUxFX1RPX0xBTkdVQUdFOwogIH07CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBtYXAgZnJvbSBsYW5ndWFnZSBtb2RlIHN0cmluZyB0byBhIGJvb2xlYW4KICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJhbnNwaWxhdGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgdGhhdCBtb2RlIGFzIHdlbGwgYXMKICAgKiB0aGUgaGlnaGVzdCBsZXZlbCBsYW5ndWFnZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMuCiAgICoKICAgKiBHdWFyYW50ZWVkIGludmFyaWFudDoKICAgKiBGb3IgYW55IHR3byBtb2RlcywgbDEgYW5kIGwyIHdoZXJlIGwyIGlzIGEgbmV3ZXIgbW9kZSB0aGFuIGwxLAogICAqIGBtYXBbbDFdID09IHRydWVgIGltcGxpZXMgdGhhdCBgbWFwW2wyXSA9PSB0cnVlYC4KICAgKgogICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZXh0cmFjdGVkIGFuZCB1c2VkIGVsc2V3aGVyZSwgc28gaXQgY2Fubm90IHJlbHkgb24KICAgKiBhbnl0aGluZyBleHRlcm5hbCAoaXQgc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAqIHN0YW5kYWxvbmUsIHRvcCBsZXZlbCBmdW5jdGlvbikuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEByZXR1cm4ge3sKICAgKiAgIHRhcmdldDogc3RyaW5nLAogICAqICAgbWFwOiAhT2JqZWN0PHN0cmluZywgYm9vbGVhbj4KICAgKiB9fQogICAqLwogIGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHRyYW5zcGlsYXRpb25UYXJnZXQgPSAnZXMzJzsKICAgIHZhciAvKiogIU9iamVjdDxzdHJpbmcsIGJvb2xlYW4+ICovIHJlcXVpcmVzVHJhbnNwaWxhdGlvbiA9IHsnZXMzJzogZmFsc2V9OwogICAgdmFyIHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEFkZHMgYW4gZW50cnkgdG8gcmVxdWlyZXNUcmFuc3BsaWF0aW9uIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbW9kZS4KICAgICAqCiAgICAgKiBJTVBPUlRBTlQ6IENhbGxzIG11c3QgYmUgbWFkZSBpbiBvcmRlciBmcm9tIG9sZGVzdCB0byBuZXdlc3QgbGFuZ3VhZ2UKICAgICAqIG1vZGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZU5hbWUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gaXNTdXBwb3J0ZWQgUmV0dXJucyB0cnVlIGlmIHRoZSBKUyBlbmdpbmUKICAgICAqICAgICBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjayhtb2RlTmFtZSwgaXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMpIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgdHJhbnNwaWxhdGlvblRhcmdldCA9IG1vZGVOYW1lOwogICAgICAgIHJlcXVpcmVzVHJhbnNwaWxhdGlvblttb2RlTmFtZV0gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgICB0cmFuc3BpbGF0aW9uUmVxdWlyZWRGb3JBbGxMYXRlck1vZGVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGUgZ2l2ZW4gY29kZSBldmFsdWF0ZSB3aXRob3V0IHN5bnRheCBlcnJvcnMgYW5kIHJldHVybiBhIHRydXRoeQogICAgICogcmVzdWx0PwogICAgICovCiAgICBmdW5jdGlvbiAvKiogYm9vbGVhbiAqLyBldmFsQ2hlY2soLyoqIHN0cmluZyAqLyBjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhZXZhbChjb2RlKTsKICAgICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciB1c2VyQWdlbnQgPSBnb29nLmdsb2JhbC5uYXZpZ2F0b3IgJiYgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA/CiAgICAgICAgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA6CiAgICAgICAgJyc7CgogICAgLy8gSWRlbnRpZnkgRVMzLW9ubHkgYnJvd3NlcnMgYnkgdGhlaXIgaW5jb3JyZWN0IHRyZWF0bWVudCBvZiBjb21tYXMuCiAgICBhZGROZXdlckxhbmd1YWdlVHJhbnNwaWxhdGlvbkNoZWNrKCdlczUnLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2YWxDaGVjaygnWzEsXS5sZW5ndGg9PTEnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM2JywgZnVuY3Rpb24oKSB7CiAgICAgIC8vIEVkZ2UgaGFzIGEgbm9uLWRldGVybWluaXN0aWMgKGkuZS4sIG5vdCByZXByb2R1Y2libGUpIGJ1ZyB3aXRoIEVTNjoKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8xNDk2LgogICAgICB2YXIgcmUgPSAvRWRnZVwvKFxkKykoXC5cZCkqL2k7CiAgICAgIHZhciBlZGdlVXNlckFnZW50ID0gdXNlckFnZW50Lm1hdGNoKHJlKTsKICAgICAgaWYgKGVkZ2VVc2VyQWdlbnQpIHsKICAgICAgICAvLyBUaGUgUmVmbGVjdC5jb25zdHJ1Y3QgdGVzdCBiZWxvdyBpcyBmbGFreSBvbiBFZGdlLiBJdCBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gcGFzcyBvciBmYWlsIG9uIDQwIDE1LjE1MDYzLCBzbyBqdXN0IGV4aXQgZWFybHkgZm9yIEVkZ2UgYW5kIHRyZWF0CiAgICAgICAgLy8gaXQgYXMgRVM1LiBVbnRpbCB3ZSdyZSBvbiBhIG1vcmUgdXAgdG8gZGF0ZSB2ZXJzaW9uIGp1c3QgYWx3YXlzIHVzZQogICAgICAgIC8vIEVTNS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzIxNy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGVzdCBlczY6IFtGRjUwICg/KSwgRWRnZSAxNCAoPyksIENocm9tZSA1MF0KICAgICAgLy8gICAoYSkgZGVmYXVsdCBwYXJhbXMgKHNwZWNpZmljYWxseSBzaGFkb3dpbmcgbG9jYWxzKSwKICAgICAgLy8gICAoYikgZGVzdHJ1Y3R1cmluZywgKGMpIGJsb2NrLXNjb3BlZCBmdW5jdGlvbnMsCiAgICAgIC8vICAgKGQpIGZvci1vZiAoY29uc3QpLCAoZSkgbmV3LnRhcmdldC9SZWZsZWN0LmNvbnN0cnVjdAogICAgICB2YXIgZXM2ZnVsbFRlc3QgPQogICAgICAgICAgJ2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fScgKwogICAgICAgICAgJ2xldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiAnICsKICAgICAgICAgICdTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiAnICsKICAgICAgICAgICdmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCknICsKICAgICAgICAgICc9PTN9JzsKCiAgICAgIHJldHVybiBldmFsQ2hlY2soJygoKT0+eyJ1c2Ugc3RyaWN0IjsnICsgZXM2ZnVsbFRlc3QgKyAnfSkoKScpOwogICAgfSk7CiAgICAvLyAqKiBhbmQgKio9IGFyZSB0aGUgb25seSBuZXcgZmVhdHVyZXMgaW4gJ2VzNycKICAgIGFkZE5ld2VyTGFuZ3VhZ2VUcmFuc3BpbGF0aW9uQ2hlY2soJ2VzNycsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZhbENoZWNrKCcyICoqIDIgPT0gNCcpOwogICAgfSk7CiAgICAvLyBhc3luYyBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiAnZXM4JwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM4JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJ2FzeW5jICgpID0+IDEsIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM5JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJyh7Li4ucmVzdH0gPSB7fSksIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXNfbmV4dCcsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmFsc2U7ICAvLyBhc3N1bWUgaXQgYWx3YXlzIG5lZWQgdG8gdHJhbnNwaWxlCiAgICB9KTsKICAgIHJldHVybiB7dGFyZ2V0OiB0cmFuc3BpbGF0aW9uVGFyZ2V0LCBtYXA6IHJlcXVpcmVzVHJhbnNwaWxhdGlvbn07CiAgfTsKCgogIC8qKgogICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZwogICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbW9kdWxlCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKi8KICBnb29nLlRyYW5zcGlsZXIucHJvdG90eXBlLm5lZWRzVHJhbnNwaWxlID0gZnVuY3Rpb24obGFuZywgbW9kdWxlKSB7CiAgICBpZiAoZ29vZy5UUkFOU1BJTEUgPT0gJ2Fsd2F5cycpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICghdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fKSB7CiAgICAgIHZhciBvYmogPSB0aGlzLmNyZWF0ZVJlcXVpcmVzVHJhbnNwaWxhdGlvbl8oKTsKICAgICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gb2JqLm1hcDsKICAgICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IHRoaXMudHJhbnNwaWxhdGlvblRhcmdldF8gfHwgb2JqLnRhcmdldDsKICAgIH0KICAgIGlmIChsYW5nIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXykgewogICAgICBpZiAodGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2xhbmddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmIG1vZHVsZSA9PSAnZXM2JyAmJgogICAgICAgICAgISgnbm9Nb2R1bGUnIGluIGdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlIG1vZGU6ICcgKyBsYW5nKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTGF6aWx5IHJldHJpZXZlcyB0aGUgdHJhbnNwaWxlciBhbmQgYXBwbGllcyBpdCB0byB0aGUgc291cmNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgY29kZS4KICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAgICovCiAgZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS50cmFuc3BpbGUgPSBmdW5jdGlvbihjb2RlLCBwYXRoKSB7CiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IFdlIHNob3VsZCBkZWxldGUgZ29vZy50cmFuc3BpbGVfIGFuZCBqdXN0IGhhdmUgdGhpcwogICAgLy8gZnVuY3Rpb24uIEJ1dCB0aGVyZSdzIHNvbWUgY29tcGlsZSBlcnJvciBhdG0gd2hlcmUgZ29vZy5nbG9iYWwgaXMgYmVpbmcKICAgIC8vIHN0cmlwcGVkIGluY29ycmVjdGx5IHdpdGhvdXQgdGhpcy4KICAgIHJldHVybiBnb29nLnRyYW5zcGlsZV8oY29kZSwgcGF0aCwgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyk7CiAgfTsKCgogIC8qKiBAcHJpdmF0ZSBAZmluYWwgeyFnb29nLlRyYW5zcGlsZXJ9ICovCiAgZ29vZy50cmFuc3BpbGVyXyA9IG5ldyBnb29nLlRyYW5zcGlsZXIoKTsKCiAgLyoqCiAgICogUmV3cml0ZXMgY2xvc2luZyBzY3JpcHQgdGFncyBpbiBpbnB1dCB0byBhdm9pZCBlbmRpbmcgYW4gZW5jbG9zaW5nIHNjcmlwdAogICAqIHRhZy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLnByb3RlY3RTY3JpcHRUYWdfID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcLyhTQ1JJUFQpL2lnLCAnXFx4M2MvJDEnKTsKICB9OwoKCiAgLyoqCiAgICogQSBkZWJ1ZyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIGFuZCBleGVjdXRpbmcgamF2YXNjcmlwdAogICAqIGZpbGVzIGluIGFuIHVuYnVuZGxlZCwgdW5jb21waWxlZCBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoaXMgY2FuIGJlIGN1c3RpbWl6ZWQgdmlhIHRoZSBzZXREZXBlbmRlbmN5RmFjdG9yeSBtZXRob2QsIG9yIGJ5CiAgICogQ0xPU1VSRV9JTVBPUlRfU0NSSVBUL0NMT1NVUkVfTE9BRF9GSUxFX1NZTkMuCiAgICoKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqIEBwcml2YXRlIEBjb25zdCB7IU9iamVjdDxzdHJpbmcsICFnb29nLkRlcGVuZGVuY3k+fSAqLwogICAgdGhpcy5kZXBlbmRlbmNpZXNfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi8KICAgIHRoaXMuaWRUb1BhdGhfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgYm9vbGVhbj59ICovCiAgICB0aGlzLndyaXR0ZW5fID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmxvYWRpbmdEZXBzXyA9IFtdOwogICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmRlcHNUb0xvYWRfID0gW107CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLnBhdXNlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IWdvb2cuRGVwZW5kZW5jeUZhY3Rvcnl9ICovCiAgICB0aGlzLmZhY3RvcnlfID0gbmV3IGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkoZ29vZy50cmFuc3BpbGVyXyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8c3RyaW5nPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8gPSBbXTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmRlZmluZWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhbGwgdGhlCiAgICogICAgIG5hbWVzcGFjZXMgaGF2ZSBsb2FkZWQuCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2IgPSBjYWxsYmFjazsKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICAgIGlmIChjYikgewogICAgICAgIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoY2IsIDApOwogICAgICAgIGNiID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmICghbmFtZXNwYWNlcy5sZW5ndGgpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGRlcHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2VzW2ldKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICcgKyBuYW1lc3BhY2VzW2ldKTsKICAgICAgfQogICAgICBkZXBzLnB1c2godGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdKTsKICAgIH0KCiAgICB2YXIgcmVxdWlyZSA9IGdvb2cucmVxdWlyZTsKICAgIHZhciBsb2FkZWQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcXVpcmUobmFtZXNwYWNlc1tpXSk7CiAgICAgIGRlcHNbaV0ub25Mb2FkKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgrK2xvYWRlZCA9PSBuYW1lc3BhY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIExvYWRzIHRoZSBDbG9zdXJlIERlcGVuZGVuY3kgZmlsZS4KICAgKgogICAqIEV4cG9zZWQgYSBwdWJsaWMgZnVuY3Rpb24gc28gQ0xPU1VSRV9OT19ERVBTIGNhbiBiZSBzZXQgdG8gZmFsc2UsIGJhc2UKICAgKiBsb2FkZWQsIHNldERlcGVuZGVuY3lGYWN0b3J5IGNhbGxlZCwgYW5kIHRoZW4gdGhpcyBjYWxsZWQuIGkuZS4gYWxsb3dzCiAgICogY3VzdG9tIGxvYWRpbmcgb2YgdGhlIGRlcHMgZmlsZS4KICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzID0gZnVuY3Rpb24oKSB7CiAgICAvLyBDaXJjdW12ZW50IGFkZERlcGVuZGVuY3ksIHdoaWNoIHdvdWxkIHRyeSB0byB0cmFuc3BpbGUgZGVwcy5qcyBpZgogICAgLy8gdHJhbnNwaWxlIGlzIHNldCB0byBhbHdheXMuCiAgICB2YXIgcmVsUGF0aCA9ICdkZXBzLmpzJzsKICAgIHRoaXMuZGVwc1RvTG9hZF8ucHVzaCh0aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koCiAgICAgICAgZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCksIHJlbFBhdGgsIFtdLCBbXSwge30sCiAgICAgICAgZmFsc2UpKTsKICAgIHRoaXMubG9hZERlcHNfKCk7CiAgfTsKCgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBkZWJ1ZyBsb2FkZXIgd2hlbiBhIGRlcGVuZGVuY3kgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGFic1BhdGhPcklkIFBhdGggb2YgdGhlIGRlcGVuZGVuY3kgb3IgZ29vZyBpZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfZm9yY2UKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUucmVxdWVzdGVkID0gZnVuY3Rpb24oYWJzUGF0aE9ySWQsIG9wdF9mb3JjZSkgewogICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGhGcm9tRGVwc18oYWJzUGF0aE9ySWQpOwogICAgaWYgKHBhdGggJiYKICAgICAgICAob3B0X2ZvcmNlIHx8IHRoaXMuYXJlRGVwc0xvYWRlZF8odGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdLnJlcXVpcmVzKSkpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bcGF0aF07CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGRlbGV0ZSB0aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1twYXRoXTsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgZmFjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbQogICAqIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gY29udHJvbCBob3cgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5ID0gZnVuY3Rpb24oZmFjdG9yeSkgewogICAgdGhpcy5mYWN0b3J5XyA9IGZhY3Rvcnk7CiAgfTsKCgogIC8qKgogICAqIFRyYXZzZXJzZXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggYW5kIHF1ZXVlcyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSwgYW5kIGFsbCBvZgogICAqIGl0cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgZm9yIGxvYWRpbmcgYW5kIHRoZW4gc3RhcnRzIGxvYWRpbmcgaWYgbm90CiAgICogcGF1c2VkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRfID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7CiAgICBpZiAoIXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2UpKSB7CiAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAnICsgbmFtZXNwYWNlOwoKICAgICAgZ29vZy5sb2dUb0NvbnNvbGVfKGVycm9yTWVzc2FnZSk7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbG9hZGVyID0gdGhpczsKCiAgICAgIHZhciBkZXBzID0gW107CgogICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAqLwogICAgICB2YXIgdmlzaXQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgICB2YXIgcGF0aCA9IGxvYWRlci5nZXRQYXRoRnJvbURlcHNfKG5hbWVzcGFjZSk7CgogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogJyArIG5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobG9hZGVyLndyaXR0ZW5fW3BhdGhdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2FkZXIud3JpdHRlbl9bcGF0aF0gPSB0cnVlOwoKICAgICAgICB2YXIgZGVwID0gbG9hZGVyLmRlcGVuZGVuY2llc19bcGF0aF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXAucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghZ29vZy5pc1Byb3ZpZGVkXyhkZXAucmVxdWlyZXNbaV0pKSB7CiAgICAgICAgICAgIHZpc2l0KGRlcC5yZXF1aXJlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgfTsKCiAgICAgIHZpc2l0KG5hbWVzcGFjZSk7CgogICAgICB2YXIgd2FzTG9hZGluZyA9ICEhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGg7CiAgICAgIHRoaXMuZGVwc1RvTG9hZF8gPSB0aGlzLmRlcHNUb0xvYWRfLmNvbmNhdChkZXBzKTsKCiAgICAgIGlmICghdGhpcy5wYXVzZWRfICYmICF3YXNMb2FkaW5nKSB7CiAgICAgICAgdGhpcy5sb2FkRGVwc18oKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBMb2FkcyBhbnkgcXVldWVkIGRlcGVuZGVuY2llcyB1bnRpbCB0aGV5IGFyZSBhbGwgbG9hZGVkIG9yIHBhdXNlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWREZXBzXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvYWRlciA9IHRoaXM7CiAgICB2YXIgcGF1c2VkID0gdGhpcy5wYXVzZWRfOwoKICAgIHdoaWxlICh0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCAmJiAhcGF1c2VkKSB7CiAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbG9hZENhbGxEb25lID0gZmFsc2U7CiAgICAgICAgdmFyIGRlcCA9IGxvYWRlci5kZXBzVG9Mb2FkXy5zaGlmdCgpOwoKICAgICAgICB2YXIgbG9hZGVkID0gZmFsc2U7CiAgICAgICAgbG9hZGVyLmxvYWRpbmdfKGRlcCk7CgogICAgICAgIHZhciBjb250cm9sbGVyID0gewogICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBwYXVzZSBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgbG9hZGVyLnJlc3VtZV8oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTb21lIGRlcCBjYWxsZWQgcGF1c2UgYW5kIHRoZW4gcmVzdW1lIGluIHRoZSBzYW1lIGxvYWQgY2FsbC4KICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgcnVubmluZyB0aGlzIHNhbWUgbG9vcC4KICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsb2FkZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBjYWxsIHRvIGxvYWRlZC4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgbG9hZGVyLmxvYWRlZF8oZGVwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvcHkuCiAgICAgICAgICAgIHZhciBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9hZGVyLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHBlbmRpbmcucHVzaChsb2FkZXIubG9hZGluZ0RlcHNfW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGVuZGluZzsKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldE1vZHVsZVN0YXRlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsCiAgICAgICAgICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCBzdHJpbmc9KX0gKi8KICAgICAgICAgIHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czogZnVuY3Rpb24oCiAgICAgICAgICAgICAgcGF0aCwgZXhwb3J0cywgb3B0X2Nsb3N1cmVOYW1lc3BhY2UpIHsKICAgICAgICAgICAgaWYgKG9wdF9jbG9zdXJlTmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tvcHRfY2xvc3VyZU5hbWVzcGFjZV0gPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgICAgdHlwZTogZ29vZy5Nb2R1bGVUeXBlLkVTNiwKICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBvcHRfY2xvc3VyZU5hbWVzcGFjZSB8fCAnJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgPyl9ICovCiAgICAgICAgICByZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOiBmdW5jdGlvbihtb2R1bGVJZCwgZXhwb3J0cykgewogICAgICAgICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HLAogICAgICAgICAgICAgIG1vZHVsZUlkOiBtb2R1bGVJZAogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyTW9kdWxlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChsb2FkQ2FsbERvbmUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgd2l0aCBkZWZlciBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvYWRlci5kZWZlcl8oZGVwLCBjYWxsYmFjayk7CiAgICAgICAgICB9LAogICAgICAgICAgYXJlRGVwc0xvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZXIuYXJlRGVwc0xvYWRlZF8oZGVwLnJlcXVpcmVzKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB0cnkgewogICAgICAgICAgZGVwLmxvYWQoY29udHJvbGxlcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGxvYWRDYWxsRG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdGhpcy5wYXVzZV8oKTsKICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wYXVzZWRfID0gdHJ1ZTsKICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV8gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhdXNlZF8pIHsKICAgICAgdGhpcy5wYXVzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZERlcHNfKCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGxvYWRpbmcgKGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCBpdCBoYXMgbm90CiAgICogeWV0IG1hcmtlZCBpdHNlbGYgYXMgZmluaXNoZWQpLiBVc2VmdWwgZm9yIGRlcGVuZGVuY2llcyB0aGF0IHdhbnQgdG8ga25vdwogICAqIHdoYXQgZWxzZSBpcyBsb2FkaW5nLiBFeGFtcGxlOiBnb29nLm1vZHVsZXMgY2Fubm90IGV2YWwgaWYgdGhlcmUgYXJlCiAgICogbG9hZGluZyBkZXBlbmRlbmNpZXMuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3l9IGRlcAogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRpbmdfID0gZnVuY3Rpb24oZGVwKSB7CiAgICB0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGRlcCk7CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGhhdmluZyBmaW5pc2hlZCBsb2FkaW5nIGFuZCBiZWluZyBhdmFpbGFibGUKICAgKiBmb3IgcmVxdWlyZS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuRGVwZW5kZW5jeX0gZGVwCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXyA9IGZ1bmN0aW9uKGRlcCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5sb2FkaW5nRGVwc19baV0gPT0gZGVwKSB7CiAgICAgICAgdGhpcy5sb2FkaW5nRGVwc18uc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmRlZmVycmVkUXVldWVfW2ldID09IGRlcC5wYXRoKSB7CiAgICAgICAgdGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5sb2FkaW5nRGVwc18ubGVuZ3RoID09IHRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoICYmCiAgICAgICAgIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoKSB7CiAgICAgIC8vIFNvbWV0aGluZyBoYXMgYXNrZWQgdG8gbG9hZCB0aGVzZSwgYnV0IHRoZXkgbWF5IG5vdCBiZSBkaXJlY3RseQogICAgICAvLyByZXF1aXJlZCBhZ2FpbiBsYXRlciwgc28gbG9hZCB0aGVtIG5vdyB0aGF0IHdlIGtub3cgd2UncmUgZG9uZSBsb2FkaW5nCiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZS4gZS5nLiBhIGdvb2cgbW9kdWxlIGVudHJ5IHBvaW50LgogICAgICB3aGlsZSAodGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksIHRydWUpOwogICAgICB9CiAgICB9CgogICAgZGVwLmxvYWRlZCgpOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwYXRoc09ySWRzCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXyA9IGZ1bmN0aW9uKHBhdGhzT3JJZHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHNPcklkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhwYXRoc09ySWRzW2ldKTsKICAgICAgaWYgKCFwYXRoIHx8CiAgICAgICAgICAoIShwYXRoIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfKSAmJgogICAgICAgICAgICFnb29nLmlzUHJvdmlkZWRfKHBhdGhzT3JJZHNbaV0pKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gYWJzUGF0aE9ySWQKICAgKiBAcmV0dXJuIHs/c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc18gPSBmdW5jdGlvbihhYnNQYXRoT3JJZCkgewogICAgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuaWRUb1BhdGhfKSB7CiAgICAgIHJldHVybiB0aGlzLmlkVG9QYXRoX1thYnNQYXRoT3JJZF07CiAgICB9IGVsc2UgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuZGVwZW5kZW5jaWVzXykgewogICAgICByZXR1cm4gYWJzUGF0aE9ySWQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHshZ29vZy5EZXBlbmRlbmN5fSBkZXBlbmRlbmN5CiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZGVmZXJfID0gZnVuY3Rpb24oZGVwZW5kZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2RlcGVuZGVuY3kucGF0aF0gPSBjYWxsYmFjazsKICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8ucHVzaChkZXBlbmRlbmN5LnBhdGgpOwogIH07CgoKICAvKioKICAgKiBJbnRlcmZhY2UgZm9yIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlcgogICAqIGxvYWRpbmcgb2YgZGVwZW5kZW5jaWVzLgogICAqCiAgICogQHJlY29yZAogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gaGFsdCBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIFRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHJlc3VtZSBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzIGlmIHBhdXNlZC4KICAgKi8KICBnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICoKICAgKiBUaGlzIGNhdXNlcyB0aGlzIHRvIGJlIHJlbW92ZWQgZnJvbSBwZW5kaW5nKCkgYW5kIGFueSBsb2FkIGNhbGxiYWNrcyB0bwogICAqIGZpcmUuCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIG9uIHdoaWNoIGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCB3aGljaCBoYXZlIG5vdAogICAqIGNhbGxlZCBsb2FkZWQgb24gdGhlaXIgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcyB0aGUgY3VycmVudCBkZXBlbmRlbmN5LgogICAqCiAgICogQHJldHVybiB7IUFycmF5PCFnb29nLkRlcGVuZGVuY3k+fQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBlbmRpbmcgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBhcyBhbiBFUzYgbW9kdWxlJ3MgZXhwb3J0cyBzbyB0aGF0IGdvb2cubW9kdWxlcyBtYXkKICAgKiByZXF1aXJlIGl0IGJ5IHBhdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBGdWxsIHBhdGggb2YgdGhlIG1vZHVsZS4KICAgKiBAcGFyYW0gez99IGV4cG9ydHMKICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jbG9zdXJlTmFtZXNwYWNlIENsb3N1cmUgbmFtZXNwYWNlIHRvIGFzc29jaWF0ZSB3aXRoCiAgICogICAgIHRoaXMgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCBleHBvcnRzLCBvcHRfY2xvc3VyZU5hbWVzcGFjZSkge307CgoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZS4KICAgKgogICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlIFR5cGUgb2YgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vZHVsZVN0YXRlID0gZnVuY3Rpb24odHlwZSkge307CgoKICAvKioKICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gY2FsbCBvbmNlIHRoZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IHJlcXVlc3RlZAogICAqIHZpYSBnb29nLnJlcXVpcmUgKyBhbGwgb2YgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGxvYWRlZCBvcgogICAqIGFsbCBvdGhlciBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkLiBBbGxvd3MgZm9yIGxhenkgbG9hZGluZyB1bnRpbAogICAqIHJlcXVpcmUnZCB3aXRob3V0IHBhdXNpbmcgZGVwZW5kZW5jeSBsb2FkaW5nLCB3aGljaCBpcyBuZWVkZWQgb24gb2xkIElFLgogICAqCiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbihjYWxsYmFjaykge307CgoKICAvKioKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmFyZURlcHNMb2FkZWQgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogQmFzaWMgc3VwZXIgY2xhc3MgZm9yIGFsbCBkZXBlbmRlbmNpZXMgQ2xvc3VyZSBMaWJyYXJ5IGNhbiBsb2FkLgogICAqCiAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGxvYWQgdW50cmFuc3BpbGVkLCBub24tbW9kdWxlCiAgICogc2NyaXB0cyBpbiBhIHdlYiBicm9zd2VyLgogICAqCiAgICogRm9yIHRyYW5zcGlsZWQgbm9uLWdvb2cubW9kdWxlIGZpbGVzIHtAc2VlIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3l9LgogICAqIEZvciBnb29nLm1vZHVsZXMgc2VlIHtAc2VlIGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3l9LgogICAqIEZvciB1bnRyYW5zcGlsZWQgRVM2IG1vZHVsZXMge0BzZWUgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5fS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IKICAgKi8KICBnb29nLkRlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncykgewogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIC8qKiBAY29uc3QgKi8KICAgIHRoaXMucmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wcm92aWRlcyA9IHByb3ZpZGVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5yZXF1aXJlcyA9IHJlcXVpcmVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5sb2FkRmxhZ3MgPSBsb2FkRmxhZ3M7CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLmxvYWRlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqLwogICAgdGhpcy5sb2FkQ2FsbGJhY2tzXyA9IFtdOwogIH07CgoKICAvKioKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRobmFtZSBwYXJ0IG9mIHRoaXMgZGVwZW5kZW5jeSdzIHBhdGggaWYgaXQgaXMgYQogICAqICAgICBVUkkuCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhdGhOYW1lID0gdGhpcy5wYXRoOwogICAgdmFyIHByb3RvY29sSW5kZXggPSBwYXRoTmFtZS5pbmRleE9mKCc6Ly8nKTsKICAgIGlmIChwcm90b2NvbEluZGV4ID49IDApIHsKICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCArIDMpOwogICAgICB2YXIgc2xhc2hJbmRleCA9IHBhdGhOYW1lLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPj0gMCkgewogICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGhOYW1lOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIGZpcmUgYXMgc29vbiBhcyB0aGlzIGhhcyBsb2FkZWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHRoaXMubG9hZGVkXykgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTWFya3MgdGhpcyBkZXBlbmRlbmN5IGFzIGxvYWRlZCBhbmQgZmlyZXMgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGgKICAgKiBvbkxvYWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9hZGVkXyA9IHRydWU7CiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5sb2FkQ2FsbGJhY2tzXzsKICAgIHRoaXMubG9hZENhbGxiYWNrc18gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCBkb2N1bWVudC53cml0dGVuIC8gYXBwZW5kZWQgc2NyaXB0IHRhZ3Mgc2hvdWxkIGJlIGRlZmVycmVkLgogICAqCiAgICogQHByaXZhdGUge2Jvb2xlYW59CiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IGZhbHNlOwoKCiAgLyoqCiAgICogTWFwIG9mIHNjcmlwdCByZWFkeSAvIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIE9sZCBJRSBjYW5ub3QgaGFuZGxlIHB1dHRpbmcKICAgKiB0aGVzZSBwcm9wZXJ0aWVzIG9uIGdvb2cuZ2xvYmFsLgogICAqCiAgICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgZnVuY3Rpb24oPyk6dW5kZWZpbmVkPn0KICAgKi8KICBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfID0ge307CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLj8pOj99IGNhbGxiYWNrCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBrZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKTsKICAgIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9ba2V5XSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIGtleTsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtleQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18gPSBmdW5jdGlvbihrZXkpIHsKICAgIGRlbGV0ZSBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfW2tleV07CiAgfTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiBAcGFyYW0gey4uLj99IHZhcl9hcmdzCiAgICogQHByaXZhdGUKICAgKiBAc3VwcHJlc3Mge3VudXNlZFByaXZhdGVNZW1iZXJzfQogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18gPSBmdW5jdGlvbihrZXksIHZhcl9hcmdzKSB7CiAgICBpZiAoa2V5IGluIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF8pIHsKICAgICAgdmFyIGNhbGxiYWNrID0gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1trZXldOwogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0NhbGxiYWNrIGtleSAnICsga2V5ICsKICAgICAgICAgICcgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLic7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFN0YXJ0cyBsb2FkaW5nIHRoaXMgZGVwZW5kZW5jeS4gVGhpcyBkZXBlbmRlbmN5IGNhbiBwYXVzZSBsb2FkaW5nIGlmIGl0CiAgICogbmVlZHMgdG8gYW5kIHJlc3VtZSBpdCBsYXRlciB2aWEgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgogICAqCiAgICogV2hlbiB0aGlzIGlzIGxvYWRlZCBpdCBzaG91bGQgY2FsbCBjb250cm9sbGVyLmxvYWRlZCgpLiBOb3RlIHRoYXQgdGhpcyB3aWxsCiAgICogZW5kIHVwIGNhbGxpbmcgdGhlIGxvYWRlZCBtZXRob2Qgb2YgdGhpcyBkZXBlbmRlbmN5OyB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICogY2FsbCBpdCBleHBsaWNpdGx5LgogICAqCiAgICogQHBhcmFtIHshZ29vZy5Mb2FkQ29udHJvbGxlcn0gY29udHJvbGxlcgogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKICAgIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpIHsKICAgICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpKSB7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZ29vZy5pbkh0bWxEb2N1bWVudF8oKSkgewogICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAnQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLicpOwogICAgICBpZiAodGhpcy5yZWxhdGl2ZVBhdGggPT0gJ2RlcHMuanMnKSB7CiAgICAgICAgLy8gU29tZSBvbGQgY29kZSBpcyByZWx5aW5nIG9uIGJhc2UuanMgYXV0byBsb2FkaW5nIGRlcHMuanMgZmFpbGluZyB3aXRoCiAgICAgICAgLy8gbm8gZXJyb3IgYmVmb3JlIGxhdGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBULgogICAgICAgIC8vIENMT1NVUkVfSU1QT1JUX1NDUklQVCBzaG91bGQgYmUgc2V0ICpiZWZvcmUqIGJhc2UuanMgaXMgbG9hZGVkLCBvcgogICAgICAgIC8vIENMT1NVUkVfTk9fREVQUyBzZXQgdG8gdHJ1ZS4KICAgICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAgICdDb25zaWRlciBzZXR0aW5nIENMT1NVUkVfSU1QT1JUX1NDUklQVCBiZWZvcmUgbG9hZGluZyBiYXNlLmpzLCAnICsKICAgICAgICAgICAgJ29yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuJyk7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byByZXF1aXJlIGEgbmV3IHN5bWJvbCBhZnRlciBkb2N1bWVudCBsb2FkLAogICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLiBEb2luZyBhIGRvY3VtZW50LndyaXRlIHdvdWxkCiAgICAvLyB3aXBlIG91dCB0aGUgcGFnZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgQ1NQLWNvbXBsaWFudCBtZXRob2QKICAgIC8vIG9mIHdyaXRpbmcgc2NyaXB0IHRhZ3MuCiAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyAmJgogICAgICAgICFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcpIHsKICAgICAgLy8gQ2VydGFpbiB0ZXN0IGZyYW1ld29ya3MgbG9hZCBiYXNlLmpzIG11bHRpcGxlIHRpbWVzLCB3aGljaCB0cmllcwogICAgICAvLyB0byB3cml0ZSBkZXBzLmpzIGVhY2ggdGltZS4gSWYgdGhhdCBoYXBwZW5zLCBqdXN0IGZhaWwgc2lsZW50bHkuCiAgICAgIC8vIFRoZXNlIGZyYW1ld29ya3Mgd2lwZSB0aGUgcGFnZSBiZXR3ZWVuIGVhY2ggbG9hZCBvZiBiYXNlLmpzLCBzbyB0aGlzCiAgICAgIC8vIGlzIE9LLgogICAgICB2YXIgaXNEZXBzID0gL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKTsKICAgICAgaWYgKGlzRGVwcykgewogICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgd3JpdGUgIicgKyB0aGlzLnBhdGggKyAnIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyAmJgogICAgICAgIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpIHsKICAgICAgdmFyIGtleSA9IGdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgICBpZiAoIWdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oa2V5KTsKICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIG5vbmNlQXR0ciA9ICFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfICYmIGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSA/CiAgICAgICAgICAnIG5vbmNlPSInICsgZ29vZy5nZXRTY3JpcHROb25jZSgpICsgJyInIDoKICAgICAgICAgICcnOwogICAgICB2YXIgZXZlbnQgPQogICAgICAgICAgZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyA/ICdvbnJlYWR5c3RhdGVjaGFuZ2UnIDogJ29ubG9hZCc7CiAgICAgIHZhciBkZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPyAnZGVmZXInIDogJyc7CiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCBzcmM9IicgKyB0aGlzLnBhdGggKyAnIiAnICsgZXZlbnQgKwogICAgICAgICAgJz0iZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcJycgKyBrZXkgKwogICAgICAgICAgJ1wnLCB0aGlzKSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnICsgZGVmZXIgKyBub25jZUF0dHIgKyAnPjwnICsKICAgICAgICAgICcvc2NyaXB0Pic7CiAgICAgIGRvYy53cml0ZSgKICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgICBnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKHNjcmlwdCkgOgogICAgICAgICAgICAgIHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl87CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCiAgICAgIC8vIElmIENTUCBub25jZXMgYXJlIHVzZWQsIHByb3BhZ2F0ZSB0aGVtIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyaXB0cy4KICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbm9uY2UtYmFzZWQgQ1NQcyB3aXRob3V0ICdzdHJpY3QtZHluYW1pYycuCiAgICAgIHZhciBub25jZSA9IGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTsKICAgICAgaWYgKG5vbmNlKSB7CiAgICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTsKICAgICAgfQoKICAgICAgaWYgKGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8pIHsKICAgICAgICAvLyBFeGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgb24gb2xkIElFLCBoYWx0IGxvYWRpbmcgYW5kIHdyaXRlCiAgICAgICAgLy8gdGhlc2Ugc2NyaXB0cyBvbmUgYXQgYSB0aW1lLCBhZnRlciBlYWNoIGxvYWRzLgogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzY3JpcHRFbC5yZWFkeVN0YXRlID09ICdsb2FkZWQnIHx8CiAgICAgICAgICAgICAgc2NyaXB0RWwucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHRFbC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjcmlwdEVsLm9ubG9hZCA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpIDoKICAgICAgICAgIHRoaXMucGF0aDsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIFNob3VsZCBiZSBhbiBlbXB0eSBhcnJheS4KICAgKiAgICAgVE9ETyhqb2hucGxhaXN0ZWQpIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgY2xvc3VyZSBuYW1lc3BhY2VzIHRvIEVTNgogICAqICAgICBtb2R1bGVzIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLkRlcGVuZGVuY3l9CiAgICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLkVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCkgewogICAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCkpIHsKICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFnb29nLmluSHRtbERvY3VtZW50XygpKSB7CiAgICAgIGdvb2cubG9nVG9Db25zb2xlXygKICAgICAgICAgICdDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuJyk7CiAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgZGVwID0gdGhpczsKCiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IERvZXMgZG9jdW1lbnQud3JpdGluZyByZWFsbHkgc3BlZWQgdXAgYW55dGhpbmc/IEFueQogICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGp1c3Qgd2FpdGluZyBmb3IgaW50ZXJhY3RpdmUgbW9kZSBhbmQgdGhlbgogICAgLy8gYXBwZW5kaW5nPwogICAgZnVuY3Rpb24gd3JpdGUoc3JjLCBjb250ZW50cykgewogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICB2YXIgc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4nICsgY29udGVudHMgKyAnPC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInICsgc3JjICsgJyI+PC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBlbmQoc3JjLCBjb250ZW50cykgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IHRydWU7CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAnbW9kdWxlJzsKICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsIHRydWUpOwoKICAgICAgLy8gSWYgQ1NQIG5vbmNlcyBhcmUgdXNlZCwgcHJvcGFnYXRlIHRoZW0gdG8gZHluYW1pY2FsbHkgY3JlYXRlZCBzY3JpcHRzLgogICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBub25jZS1iYXNlZCBDU1BzIHdpdGhvdXQgJ3N0cmljdC1keW5hbWljJy4KICAgICAgdmFyIG5vbmNlID0gZ29vZy5nZXRTY3JpcHROb25jZSgpOwogICAgICBpZiAobm9uY2UpIHsKICAgICAgICBzY3JpcHRFbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpOwogICAgICB9CgogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICBzY3JpcHRFbC50ZXh0Q29udGVudCA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0KGNvbnRlbnRzKSA6CiAgICAgICAgICAgIGNvbnRlbnRzOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHNyYykgOgogICAgICAgICAgICBzcmM7CiAgICAgIH0KCiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsKTsKICAgIH0KCiAgICB2YXIgY3JlYXRlOwoKICAgIGlmIChnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSB7CiAgICAgIGNyZWF0ZSA9IHdyaXRlOwogICAgICAvLyBXZSBjYW4gT05MWSBjYWxsIGRvY3VtZW50LndyaXRlIGlmIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgYW55CiAgICAgIC8vIG5vbi1tb2R1bGUgc2NyaXB0IHRhZ3MgZG9jdW1lbnQud3JpdHRlbiBhZnRlciB0aGlzIGFyZSBkZWZlcnJlZC4KICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uLCBpbiB0aGVvcnkgZG9jdW1lbnQud3JpdGluZyBpcyBmYXN0ZXIuCiAgICAgIGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3JlYXRlID0gYXBwZW5kOwogICAgfQoKICAgIC8vIFdyaXRlIDQgc2VwYXJhdGUgdGFncyBoZXJlOgogICAgLy8gMSkgU2V0cyB0aGUgbW9kdWxlIHN0YXRlIGF0IHRoZSBjb3JyZWN0IHRpbWUgKGp1c3QgYmVmb3JlIGV4ZWN1dGlvbikuCiAgICAvLyAyKSBBIHNyYyBub2RlIGZvciB0aGlzLCB3aGljaCBqdXN0IGhvcGVmdWxseSBsZXRzIHRoZSBicm93c2VyIGxvYWQgaXQgYQogICAgLy8gICAgbGl0dGxlIGVhcmx5IChubyBuZWVkIHRvIHBhcnNlICMzKS4KICAgIC8vIDMpIEltcG9ydCB0aGUgbW9kdWxlIGFuZCByZWdpc3RlciBpdC4KICAgIC8vIDQpIENsZWFyIHRoZSBtb2R1bGUgc3RhdGUgYXQgdGhlIGNvcnJlY3QgdGltZS4gR3VhcmFudGVlZCB0byBydW4gZXZlbgogICAgLy8gICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIG1vZHVsZSAoIzMgd2lsbCBub3QgcnVuIGlmIHRoZXJlIGlzIGFuCiAgICAvLyAgICBlcnJvciBpbiB0aGUgbW9kdWxlKS4KICAgIHZhciBiZWZvcmVLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKSB7CiAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGJlZm9yZUtleSk7CiAgICAgIGNvbnRyb2xsZXIuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7CiAgICB9KTsKICAgIGNyZWF0ZSh1bmRlZmluZWQsICdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInICsgYmVmb3JlS2V5ICsgJyIpJyk7CgogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBEb2VzIHRoaXMgcmVhbGx5IHNwZWVkIHVwIGFueXRoaW5nPwogICAgY3JlYXRlKHRoaXMucGF0aCwgdW5kZWZpbmVkKTsKCiAgICB2YXIgcmVnaXN0ZXJLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oZXhwb3J0cykgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhyZWdpc3RlcktleSk7CiAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgZGVwLnBhdGgsIGV4cG9ydHMsIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpOwogICAgfSk7CiAgICBjcmVhdGUoCiAgICAgICAgdW5kZWZpbmVkLAogICAgICAgICdpbXBvcnQgKiBhcyBtIGZyb20gIicgKyB0aGlzLnBhdGggKyAnIjsgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArCiAgICAgICAgICAgIHJlZ2lzdGVyS2V5ICsgJyIsIG0pJyk7CgogICAgdmFyIGFmdGVyS2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhhZnRlcktleSk7CiAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgfSk7CiAgICBjcmVhdGUodW5kZWZpbmVkLCAnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGFmdGVyS2V5ICsgJyIpJyk7CiAgfTsKCgogIC8qKgogICAqIFN1cGVyY2xhc3Mgb2YgYW55IGRlcGVuZGVuY3kgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksCiAgICogdHJhbnNmb3JtZWQsIGFuZCB0aGVuIGV2YWwnZCAoZ29vZy5tb2R1bGVzIGFuZCB0cmFuc3BpbGVkIGZpbGVzKS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IgQGFic3RyYWN0CiAgICogQGV4dGVuZHMge2dvb2cuRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKSB7CiAgICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgLyoqIEBwcml2YXRlIHs/c3RyaW5nfSAqLwogICAgdGhpcy5jb250ZW50c18gPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBsYXppbHkgbWFrZSB0aGUgc3luY2hyb25vdXMgWEhSICh3aGVuIGdvb2cucmVxdWlyZSdkKSBvciBtYWtlCiAgICAgKiB0aGUgc3luY2hyb25vdXMgWEhSIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcuIE9uIEZpcmVGb3ggNjEgdGhlcmUgaXMgYSBidWcKICAgICAqIHdoZXJlIGFuIEVTNiBtb2R1bGUgY2Fubm90IG1ha2UgYSBzeW5jaHJvbm91cyBYSFIgKHJhdGhlciwgaXQgY2FuLCBidXQgaWYKICAgICAqIGl0IGRvZXMgdGhlbiBubyBvdGhlciBFUzYgbW9kdWxlcyB3aWxsIGxvYWQgYWZ0ZXIpLgogICAgICoKICAgICAqIHRsO2RyIHdlIGxhenkgbG9hZCBkdWUgdG8gYnVncyBvbiBvbGRlciBicm93c2VycyBhbmQgZWFnZXIgbG9hZCBkdWUgdG8KICAgICAqIGJ1Z3Mgb24gbmV3ZXIgb25lcy4KICAgICAqCiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc3MDkwCiAgICAgKgogICAgICogQHByaXZhdGUgQGNvbnN0IHtib29sZWFufQogICAgICovCiAgICB0aGlzLmxhenlGZXRjaF8gPSAhZ29vZy5pbkh0bWxEb2N1bWVudF8oKSB8fAogICAgICAgICEoJ25vTW9kdWxlJyBpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LCBnb29nLkRlcGVuZGVuY3kpOwoKCiAgLyoqIEBvdmVycmlkZSAqLwogIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgdmFyIGRlcCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmV0Y2goKSB7CiAgICAgIGRlcC5jb250ZW50c18gPSBnb29nLmxvYWRGaWxlU3luY18oZGVwLnBhdGgpOwoKICAgICAgaWYgKGRlcC5jb250ZW50c18pIHsKICAgICAgICBkZXAuY29udGVudHNfID0gZGVwLnRyYW5zZm9ybShkZXAuY29udGVudHNfKTsKICAgICAgICBpZiAoZGVwLmNvbnRlbnRzXykgewogICAgICAgICAgZGVwLmNvbnRlbnRzXyArPSAnXG4vLyMgc291cmNlVVJMPScgKyBkZXAucGF0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKSB7CiAgICAgIGZldGNoKCk7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRzXyAmJgogICAgICAgICAgZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCcnLCB0aGlzLmNvbnRlbnRzXykpIHsKICAgICAgICB0aGlzLmNvbnRlbnRzXyA9IG51bGw7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKCiAgICB2YXIgaXNFczYgPSB0aGlzLmxvYWRGbGFnc1snbW9kdWxlJ10gPT0gZ29vZy5Nb2R1bGVUeXBlLkVTNjsKCiAgICBpZiAoIXRoaXMubGF6eUZldGNoXykgewogICAgICBmZXRjaCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIGlmIChkZXAubGF6eUZldGNoXykgewogICAgICAgIGZldGNoKCk7CiAgICAgIH0KCiAgICAgIGlmICghZGVwLmNvbnRlbnRzXykgewogICAgICAgIC8vIGxvYWRGaWxlU3luY18gb3IgdHJhbnNmb3JtIGFyZSByZXNwb25zaWJsZS4gQXNzdW1lIHRoZXkgbG9nZ2VkIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaXNFczYpIHsKICAgICAgICBjb250cm9sbGVyLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpOwogICAgICB9CgogICAgICB2YXIgbmFtZXNwYWNlOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgY29udGVudHMgPSBkZXAuY29udGVudHNfOwogICAgICAgIGRlcC5jb250ZW50c18gPSBudWxsOwogICAgICAgIGdvb2cuZ2xvYmFsRXZhbChjb250ZW50cyk7CiAgICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lOwogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoaXNFczYpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgLy8gRHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciByZXF1aXJlCiAgICAgICAgLy8gcmlnaHQgbm93LgogICAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ11bJ3JlcXVpcmUnXVsnZW5zdXJlJ10oCiAgICAgICAgICAgIFtkZXAuZ2V0UGF0aE5hbWUoKV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgICAgICAgICBkZXAucGF0aCwKICAgICAgICAgICAgICAgICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXVsncmVxdWlyZSddKGRlcC5nZXRQYXRoTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICB9CgogICAgLy8gRG8gbm90IGZldGNoIG5vdzsgaW4gRmlyZUZveCA0NyB0aGUgc3luY2hyb25vdXMgWEhSIGRvZXNuJ3QgYmxvY2sgYWxsCiAgICAvLyBldmVudHMuIElmIHdlIGZldGNoZWQgbm93IGFuZCB0aGVuIGRvY3VtZW50LndyaXRlJ2QgdGhlIGNvbnRlbnRzIHRoZQogICAgLy8gZG9jdW1lbnQud3JpdGUgd291bGQgYmUgYW4gZXZhbCBhbmQgd291bGQgZXhlY3V0ZSB0b28gc29vbiEgSW5zdGVhZCB3cml0ZQogICAgLy8gYSBzY3JpcHQgdGFnIHRvIGZldGNoIGFuZCBldmFsIHN5bmNocm9ub3VzbHkgYXQgdGhlIGNvcnJlY3QgdGltZS4KICAgIGZ1bmN0aW9uIGZldGNoSW5Pd25TY3JpcHRUaGVuTG9hZCgpIHsKICAgICAgLyoqIEB0eXBlIHshSFRNTERvY3VtZW50fSAqLwogICAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CgogICAgICB2YXIga2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGtleSk7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKCiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicgKwogICAgICAgICAgZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGtleSArICciKTsnKSArCiAgICAgICAgICAnPC8nICsKICAgICAgICAgICdzY3JpcHQ+JzsKICAgICAgZG9jLndyaXRlKAogICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoc2NyaXB0KSA6CiAgICAgICAgICAgICAgc2NyaXB0KTsKICAgIH0KCiAgICAvLyBJZiBvbmUgdGhpbmcgaXMgcGVuZGluZyBpdCBpcyB0aGlzLgogICAgdmFyIGFueXRoaW5nRWxzZVBlbmRpbmcgPSBjb250cm9sbGVyLnBlbmRpbmcoKS5sZW5ndGggPiAxOwoKICAgIC8vIElmIGFueXRoaW5nIGVsc2UgaXMgbG9hZGluZyB3ZSBuZWVkIHRvIGxhenkgbG9hZCBkdWUgdG8gYnVncyBpbiBvbGQgSUUuCiAgICAvLyBTcGVjaWZpY2FsbHkgc2NyaXB0IHRhZ3Mgd2l0aCBzcmMgYW5kIHNjcmlwdCB0YWdzIHdpdGggY29udGVudHMgY291bGQKICAgIC8vIGV4ZWN1dGUgb3V0IG9mIG9yZGVyIGlmIGRvY3VtZW50LndyaXRlIGlzIHVzZWQsIHNvIHdlIGNhbm5vdCB1c2UKICAgIC8vIGRvY3VtZW50LndyaXRlLiBEbyBub3QgcGF1c2UgaGVyZTsgaXQgYnJlYWtzIG9sZCBJRSBhcyB3ZWxsLgogICAgdmFyIHVzZU9sZEllV29ya0Fyb3VuZCA9CiAgICAgICAgYW55dGhpbmdFbHNlUGVuZGluZyAmJiBnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfOwoKICAgIC8vIEFkZGl0aW9uYWxseSBpZiB3ZSBhcmUgbWVhbnQgdG8gZGVmZXIgc2NyaXB0cyBidXQgdGhlIHBhZ2UgaXMgc3RpbGwKICAgIC8vIGxvYWRpbmcgKGUuZy4gYW4gRVM2IG1vZHVsZSBpcyBsb2FkaW5nKSB0aGVuIGFsc28gZGVmZXIuIE9yIGlmIHdlIGFyZQogICAgLy8gbWVhbnQgdG8gZGVmZXIgYW5kIGFueXRoaW5nIGVsc2UgaXMgcGVuZGluZyB0aGVuIGRlZmVyICh0aG9zZSBtYXkgYmUKICAgIC8vIHNjcmlwdHMgdGhhdCBkaWQgbm90IG5lZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFyZSBqdXN0IHNjcmlwdCB0YWdzIHdpdGgKICAgIC8vIGRlZmVyIHNldCB0byB0cnVlLCBhbmQgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciB0aGF0IGRlZmVycmVkIHNjcmlwdCkuCiAgICB2YXIgbmVlZHNBc3luY0xvYWRpbmcgPSBnb29nLkRlcGVuZGVuY3kuZGVmZXJfICYmCiAgICAgICAgKGFueXRoaW5nRWxzZVBlbmRpbmcgfHwgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7CgogICAgaWYgKHVzZU9sZEllV29ya0Fyb3VuZCB8fCBuZWVkc0FzeW5jTG9hZGluZykgewogICAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSBkZWZlciB3aGVuIHdlIGhhdmUgdG8gcmF0aGVyIHRoYW4gMTAwJSBvZiB0aGUgdGltZS4KICAgICAgLy8gQWx3YXlzIGRlZmVyaW5nIHdvdWxkIHdvcmssIGJ1dCB0aGVuIGluIHRoZW9yeSB0aGUgb3JkZXIgb2YKICAgICAgLy8gZ29vZy5yZXF1aXJlIGNhbGxzIHdvdWxkIHRoZW4gbWF0dGVyLiBXZSB3YW50IHRvIGVuZm9yY2UgdGhhdCBtb3N0IG9mCiAgICAgIC8vIHRoZSB0aW1lIHRoZSBvcmRlciBvZiB0aGUgcmVxdWlyZSBjYWxscyBkb2VzIG5vdCBtYXR0ZXIuCiAgICAgIGNvbnRyb2xsZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBFeHRlcm5zIGFyZSBtaXNzaW5nIG9ucmVhZHlzdGF0ZWNoYW5nZSBmb3IKICAgIC8vIEhUTUxEb2N1bWVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgaXNJbnRlcm5ldEV4cGxvcmVyID0KICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnb29nLmdsb2JhbDsKCiAgICAvLyBEb24ndCBkZWxheSBpbiBhbnkgdmVyc2lvbiBvZiBJRS4gVGhlcmUncyBidWcgYXJvdW5kIHRoaXMgdGhhdCB3aWxsCiAgICAvLyBjYXVzZSBvdXQgb2Ygb3JkZXIgc2NyaXB0IGV4ZWN1dGlvbi4gVGhpcyBtZWFucyB0aGF0IG9uIG9sZGVyIElFIEVTNgogICAgLy8gbW9kdWxlcyB3aWxsIGxvYWQgdG9vIGVhcmx5ICh3aGlsZSB0aGUgZG9jdW1lbnQgaXMgc3RpbGwgbG9hZGluZyArIHRoZQogICAgLy8gZG9tIGlzIG5vdCBhdmFpbGFibGUpLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxvYWQgdG9vIGxhdGUgKHdoZW4gdGhlCiAgICAvLyBkb2N1bWVudCBpcyBjb21wbGV0ZSBhbmQgdGhlIG9ubG9hZCBldmVuIHdpbGwgbmV2ZXIgZmlyZSkuIFRoaXMgc2VlbXMKICAgIC8vIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzIGFzIHNjcmlwdHMgYWxyZWFkeSBhY3QgbGlrZSB0aGUgZm9ybWVyLgogICAgaWYgKGlzRXM2ICYmIGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkgJiYgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSAmJgogICAgICAgICFpc0ludGVybmV0RXhwbG9yZXIpIHsKICAgICAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IHRydWU7CiAgICAgIC8vIFRyYW5zcGlsZWQgRVM2IG1vZHVsZXMgc3RpbGwgbmVlZCB0byBsb2FkIGxpa2UgcmVndWxhciBFUzYgbW9kdWxlcywKICAgICAgLy8gYWthIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGludGVyYWN0aXZlLgogICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIHZhciBvbGRDYWxsYmFjayA9IGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgIGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgZG9jLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9sZENhbGxiYWNrOwogICAgICAgICAgbG9hZCgpOwogICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvb2cuaXNGdW5jdGlvbihvbGRDYWxsYmFjaykpIHsKICAgICAgICAgIG9sZENhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBBbHdheXMgZXZhbCBvbiBvbGQgSUUuCiAgICAgIGlmIChnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfIHx8ICFnb29nLmluSHRtbERvY3VtZW50XygpIHx8CiAgICAgICAgICAhZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSkgewogICAgICAgIGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZXRjaEluT3duU2NyaXB0VGhlbkxvYWQoKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHMKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQGFic3RyYWN0CiAgICovCiAgZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7fTsKCgogIC8qKgogICAqIEFueSBub24tZ29vZy5tb2R1bGUgZGVwZW5kZW5jeSB3aGljaCBuZWVkcyB0byBiZSB0cmFuc3BpbGVkIGJlZm9yZSBldmFsLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRyYW5zcGlsZXIpIHsKICAgIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCovCiAgICB0aGlzLnRyYW5zcGlsZXIgPSB0cmFuc3BpbGVyOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5LCBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oY29udGVudHMpIHsKICAgIC8vIFRyYW5zcGlsZSB3aXRoIHRoZSBwYXRobmFtZSBzbyB0aGF0IEVTNiBtb2R1bGVzIGFyZSBkb21haW4gYWdub3N0aWMuCiAgICByZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShjb250ZW50cywgdGhpcy5nZXRQYXRoTmFtZSgpKTsKICB9OwoKCiAgLyoqCiAgICogQW4gRVM2IG1vZHVsZSBkZXBlbmRlbmN5IHRoYXQgd2FzIHRyYW5zcGlsZWQgdG8gYSBqc2NvbXAgbW9kdWxlIG91dHNpZGUKICAgKiBvZiB0aGUgZGVidWcgbG9hZGVyLCBlLmcuIHNlcnZlciBzaWRlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICB9OwogIGdvb2cuaW5oZXJpdHMoCiAgICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbigKICAgICAgY29udGVudHMpIHsKICAgIHJldHVybiBjb250ZW50czsKICB9OwoKCiAgLyoqCiAgICogQSBnb29nLm1vZHVsZSwgdHJhbnNwaWxlZCBvciBub3QuIFdpbGwgYWx3YXlzIHBlcmZvcm0gc29tZSBtaW5pbWFsCiAgICogdHJhbnNmb3JtYXRpb24gZXZlbiB3aGVuIG5vdCB0cmFuc3BpbGVkIHRvIHdyYXAgaW4gYSBnb29nLmxvYWRNb2R1bGUKICAgKiBzdGF0ZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIGdvb2cucHJvdmlkZWQgb3IgZ29vZy5tb2R1bGUgc3ltYm9scwogICAqICAgICBpbiB0aGlzIGZpbGUuCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMgZ29vZyBzeW1ib2xzIG9yIHJlbGF0aXZlIHBhdGhzIHRvIENsb3N1cmUKICAgKiAgICAgdGhpcyBkZXBlbmRzIG9uLgogICAqIEBwYXJhbSB7IU9iamVjdDxzdHJpbmcsIHN0cmluZz59IGxvYWRGbGFncwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZHNUcmFuc3BpbGUKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIG5lZWRzVHJhbnNwaWxlLAogICAgICB0cmFuc3BpbGVyKSB7CiAgICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LmJhc2UoCiAgICAgICAgdGhpcywgJ2NvbnN0cnVjdG9yJywgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0ICovCiAgICB0aGlzLm5lZWRzVHJhbnNwaWxlXyA9IG5lZWRzVHJhbnNwaWxlOwogICAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyXyA9IHRyYW5zcGlsZXI7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb250ZW50cykgewogICAgaWYgKHRoaXMubmVlZHNUcmFuc3BpbGVfKSB7CiAgICAgIGNvbnRlbnRzID0gdGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoY29udGVudHMsIHRoaXMuZ2V0UGF0aE5hbWUoKSk7CiAgICB9CgogICAgaWYgKCFnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgfHwgZ29vZy5nbG9iYWwuSlNPTiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsnICsKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArIGNvbnRlbnRzICsKICAgICAgICAgICdcbicgKyAgLy8gdGVybWluYXRlIGFueSB0cmFpbGluZyBzaW5nbGUgbGluZSBjb21tZW50LgogICAgICAgICAgJztyZXR1cm4gZXhwb3J0cycgKwogICAgICAgICAgJ30pOycgKwogICAgICAgICAgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdGhpcy5wYXRoICsgJ1xuJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKCcgKwogICAgICAgICAgZ29vZy5nbG9iYWwuSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgY29udGVudHMgKyAnXG4vLyMgc291cmNlVVJMPScgKyB0aGlzLnBhdGggKyAnXG4nKSArCiAgICAgICAgICAnKTsnOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIGlzIElFOSBvciBlYXJsaWVyLCB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCiAgICogZm9yIGRlZmVycmVkIG1vZHVsZXMuCiAgICogQGNvbnN0IEBwcml2YXRlIHtib29sZWFufQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gPSAhISgKICAgICAgIWdvb2cuZ2xvYmFsLmF0b2IgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnQgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnRbJ2FsbCddKTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPnx1bmRlZmluZWR9IHByb3ZpZGVzCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW58IU9iamVjdDxzdHJpbmc+PX0gb3B0X2xvYWRGbGFncwogICAqIEBzZWUgZ29vZy5hZGREZXBlbmRlbmN5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcmVsUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBvcHRfbG9hZEZsYWdzKSB7CiAgICBwcm92aWRlcyA9IHByb3ZpZGVzIHx8IFtdOwogICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsKICAgIHZhciBwYXRoID0gZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCk7CiAgICBpZiAoIW9wdF9sb2FkRmxhZ3MgfHwgdHlwZW9mIG9wdF9sb2FkRmxhZ3MgPT09ICdib29sZWFuJykgewogICAgICBvcHRfbG9hZEZsYWdzID0gb3B0X2xvYWRGbGFncyA/IHsnbW9kdWxlJzogZ29vZy5Nb2R1bGVUeXBlLkdPT0d9IDoge307CiAgICB9CiAgICB2YXIgZGVwID0gdGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KAogICAgICAgIHBhdGgsIHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncywKICAgICAgICBnb29nLnRyYW5zcGlsZXJfLm5lZWRzVHJhbnNwaWxlKAogICAgICAgICAgICBvcHRfbG9hZEZsYWdzWydsYW5nJ10gfHwgJ2VzMycsIG9wdF9sb2FkRmxhZ3NbJ21vZHVsZSddKSk7CiAgICB0aGlzLmRlcGVuZGVuY2llc19bcGF0aF0gPSBkZXA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuaWRUb1BhdGhfW3Byb3ZpZGVzW2ldXSA9IHBhdGg7CiAgICB9CiAgICB0aGlzLmlkVG9QYXRoX1tyZWxQYXRoXSA9IHBhdGg7CiAgfTsKCgogIC8qKgogICAqIENyZWF0ZXMgZ29vZy5EZXBlbmRlbmN5IGluc3RhbmNlcyBmb3IgdGhlIGRlYnVnIGxvYWRlciB0byBsb2FkLgogICAqCiAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGF2ZSB0aGUgZGVidWcgbG9hZGVyIHVzZSBjdXN0b20gc3ViY2xhc3NlcyBvZgogICAqIGdvb2cuRGVwZW5kZW5jeS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuVHJhbnNwaWxlcn0gdHJhbnNwaWxlcgogICAqIEBzdHJ1Y3QgQGNvbnN0cnVjdG9yCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKHRyYW5zcGlsZXIpIHsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyID0gdHJhbnNwaWxlcjsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggcmVsYXRpdmUgdG8gY2xvc3VyZeKAmXMgYmFzZS5qcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBcnJheSBvZiBwcm92aWRlZCBnb29nLnByb3ZpZGUvbW9kdWxlIGlkcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBBcnJheSBvZiByZXF1aXJlZCBnb29nLnByb3ZpZGUvbW9kdWxlIC8KICAgKiAgICAgcmVsYXRpdmUgRVM2IG1vZHVsZSBwYXRocy4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRzVHJhbnNwaWxlIFRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZAogICAqICAgICBwZXIgdGhlIGdvb2cuVHJhbnNwaWxlci4KICAgKiBAcmV0dXJuIHshZ29vZy5EZXBlbmRlbmN5fQogICAqLwogIGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZURlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncywgbmVlZHNUcmFuc3BpbGUpIHsKCiAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuR09PRykgewogICAgICByZXR1cm4gbmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzLCBuZWVkc1RyYW5zcGlsZSwKICAgICAgICAgIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgaWYgKG5lZWRzVHJhbnNwaWxlKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeSgKICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuRVM2KSB7CiAgICAgICAgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicgJiYgZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KAogICAgICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IGdvb2cuRGVwZW5kZW5jeSgKICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogIGdvb2cuZGVidWdMb2FkZXJfID0gbmV3IGdvb2cuRGVidWdMb2FkZXJfKCk7CgoKICAvKioKICAgKiBMb2FkcyB0aGUgQ2xvc3VyZSBEZXBlbmRlbmN5IGZpbGUuCiAgICoKICAgKiBFeHBvc2VkIGEgcHVibGljIGZ1bmN0aW9uIHNvIENMT1NVUkVfTk9fREVQUyBjYW4gYmUgc2V0IHRvIGZhbHNlLCBiYXNlCiAgICogbG9hZGVkLCBzZXREZXBlbmRlbmN5RmFjdG9yeSBjYWxsZWQsIGFuZCB0aGVuIHRoaXMgY2FsbGVkLiBpLmUuIGFsbG93cwogICAqIGN1c3RvbSBsb2FkaW5nIG9mIHRoZSBkZXBzIGZpbGUuCiAgICovCiAgZ29vZy5sb2FkQ2xvc3VyZURlcHMgPSBmdW5jdGlvbigpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpOwogIH07CgoKICAvKioKICAgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGZhY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjdXN0b20KICAgKiBnb29nLkRlcGVuZGVuY3kgaW1wbGVtZW50YXRpb25zIHRvIGNvbnRyb2wgaG93IGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgogICAqCiAgICogTm90ZTogaWYgeW91IHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIHlvdXIgb3duIGltcGxlbW5ldGF0aW9uCiAgICogaXQgaXMgYSB3aXNlIGlkZWEgdG8gc2V0IENMT1NVUkVfTk9fREVQUyB0byB0cnVlLCBvdGhlcndpc2UgdGhlIGRlcGVuZGVuY3kKICAgKiBmaWxlIGFuZCBhbGwgb2YgaXRzIGdvb2cuYWRkRGVwZW5kZW5jeSBjYWxscyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmYWN0b3J5LgogICAqIFlvdSBjYW4gY2FsbCBnb29nLmxvYWRDbG9zdXJlRGVwcyB0byBsb2FkIHRoZSBDbG9zdXJlIGRlcGVuZGVuY3kgZmlsZQogICAqIGxhdGVyLCBhZnRlciB5b3VyIGZhY3RvcnkgaXMgaW5qZWN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLnNldERlcGVuZGVuY3lGYWN0b3J5KGZhY3RvcnkpOwogIH07CgoKICBpZiAoIWdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUykgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCk7CiAgfQoKCiAgLyoqCiAgICogQm9vdHN0cmFwcyB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uY2UgdGhleSBhcmUKICAgKiBhdmFpbGFibGUgZWl0aGVyIHZpYSBnb29nLnJlcXVpcmUuIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgdXNpbmcKICAgKiBgZ29vZy5yZXF1aXJlYCB0byBib290c3RyYXAgQ2xvc3VyZSBKYXZhU2NyaXB0LiBQcmV2aW91c2x5IGEgYGdvb2cucmVxdWlyZWAKICAgKiBpbiBhbiBIVE1MIGZpbGUgd291bGQgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVpcmUnZCBuYW1lc3BhY2Ugd2FzIGF2YWlsYWJsZQogICAqIGluIHRoZSBuZXh0IGltbWVkaWF0ZSBzY3JpcHQgdGFnLiBXaXRoIEVTNiBtb2R1bGVzIHRoaXMgbm8gbG9uZ2VyIGEKICAgKiBndWFyYW50ZWUuCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiA/fSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uY2UgYWxsIHRoZSBuYW1lc3BhY2VzCiAgICogICAgIGhhdmUgbG9hZGVkLiBBbHdheXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAqLwogIGdvb2cuYm9vdHN0cmFwID0gZnVuY3Rpb24obmFtZXNwYWNlcywgY2FsbGJhY2spIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChuYW1lc3BhY2VzLCBjYWxsYmFjayk7CiAgfTsKfQoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IFRydXN0ZWQgVHlwZXMgcG9saWN5IG5hbWUuIElmIG5vbi1lbXB0eSB0aGVuIENsb3N1cmUgd2lsbAogKiB1c2UgVHJ1c3RlZCBUeXBlcy4KICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FJywgJycpOwoKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBzCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cuaWRlbnRpdHlfID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzOwp9OwoKCi8qKgogKiBDcmVhdGVzIFRydXN0ZWQgVHlwZXMgcG9saWN5IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4KICogVGhlIHBvbGljeSBqdXN0IGJsZXNzZXMgYW55IHN0cmluZyBhcyBhIFRydXN0ZWQgVHlwZS4gSXQgaXMgbm90IHZpc2liaWxpdHkKICogcmVzdHJpY3RlZCBiZWNhdXNlIGFueW9uZSBjYW4gYWxzbyBjYWxsIFRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgZGlyZWN0bHkuCiAqIEhvd2V2ZXIsIHRoZSBhbGxvd2VkIG5hbWVzIHNob3VsZCBiZSByZXN0cmljdGVkIGJ5IGEgSFRUUCBoZWFkZXIgYW5kIHRoZQogKiByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgcG9saWN5IHNob3VsZCBiZSB2aXNpYmlsaXR5IHJlc3RyaWN0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0KICovCmdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBwb2xpY3kgPSBudWxsOwogIC8vIFRPRE8oa290byk6IFJlbW92ZSB3aW5kb3cuVHJ1c3RlZFR5cGVzIHZhcmlhbnQgd2hlbiB0aGUgbmV3ZXIgQVBJIHNoaXBzLgogIHZhciBwb2xpY3lGYWN0b3J5ID0gZ29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzIHx8IGdvb2cuZ2xvYmFsLlRydXN0ZWRUeXBlczsKICBpZiAoIXBvbGljeUZhY3RvcnkgfHwgIXBvbGljeUZhY3RvcnkuY3JlYXRlUG9saWN5KSB7CiAgICByZXR1cm4gcG9saWN5OwogIH0KICAvLyBUcnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5IHRocm93cyBpZiBjYWxsZWQgd2l0aCBhIG5hbWUgdGhhdCBpcyBhbHJlYWR5CiAgLy8gcmVnaXN0ZXJlZCwgZXZlbiBpbiByZXBvcnQtb25seSBtb2RlLiBVbnRpbCB0aGUgQVBJIGNoYW5nZXMsIGNhdGNoIHRoZQogIC8vIGVycm9yIG5vdCB0byBicmVhayB0aGUgYXBwbGljYXRpb25zIGZ1bmN0aW9uYWxseS4gSW4gc3VjaCBjYXNlLCB0aGUgY29kZQogIC8vIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZ3VsYXIgU2FmZSBUeXBlcy4KICAvLyBUT0RPKGtvdG8pOiBSZW1vdmUgY2F0Y2hpbmcgb25jZSBjcmVhdGVQb2xpY3kgQVBJIHN0b3BzIHRocm93aW5nLgogIHRyeSB7CiAgICBwb2xpY3kgPSBwb2xpY3lGYWN0b3J5LmNyZWF0ZVBvbGljeShuYW1lLCB7CiAgICAgIGNyZWF0ZUhUTUw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHQ6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHRVUkw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVVUkw6IGdvb2cuaWRlbnRpdHlfCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBnb29nLmxvZ1RvQ29uc29sZV8oZS5tZXNzYWdlKTsKICB9CiAgcmV0dXJuIHBvbGljeTsKfTsKCgovKiogQHByaXZhdGUgQGNvbnN0IHs/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9iYXNlLmpzCmZ1bmN0aW9uIHdhKGIpe3ZhciBkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQ8Yi5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YltkKytdfTp7ZG9uZTohMH19fWZ1bmN0aW9uIGdiKGIpe3JldHVybntuZXh0OndhKGIpfX1mdW5jdGlvbiBsYihiKXt2YXIgZD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGQ/ZC5jYWxsKGIpOmdiKGIpfXZhciB3Yj1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yj9iOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmJ9KHRoaXMpLEpiPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2IhPUFycmF5LnByb3RvdHlwZSYmYiE9T2JqZWN0LnByb3RvdHlwZSYmKGJbZF09Zi52YWx1ZSl9OwpmdW5jdGlvbiBTYihiLGQpe2lmKGQpe3ZhciBmPXdiO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGgtMTtoKyspe3ZhciBrPWJbaF07ayBpbiBmfHwoZltrXT17fSk7Zj1mW2tdfWI9YltiLmxlbmd0aC0xXTtoPWZbYl07ZD1kKGgpO2QhPWgmJm51bGwhPWQmJkpiKGYsYix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmR9KX19ClNiKCJQcm9taXNlIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHApe3RoaXMuc3RhdGVfPTA7dGhpcy5yZXN1bHRfPXZvaWQgMDt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189W107dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwKG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gobil7bS5yZWplY3Qobil9fWZ1bmN0aW9uIGYoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIGgocCl7c3dpdGNoKHR5cGVvZiBwKXtjYXNlICJvYmplY3QiOnJldHVybiBudWxsIT1wO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBrKHApe3JldHVybiBwIGluc3RhbmNlb2YgZD9wOm5ldyBkKGZ1bmN0aW9uKG0pe20ocCl9KX1pZihiKXJldHVybiBiO2YucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihwKXtpZihudWxsPT10aGlzLmJhdGNoXyl7dGhpcy5iYXRjaF89W107dmFyIG09dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7bS5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHApfTsKdmFyIHI9d2Iuc2V0VGltZW91dDtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihwKXtyKHAsMCl9O2YucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcD10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIG09MDttPHAubGVuZ3RoOysrbSl7dmFyIG49cFttXTtwW21dPW51bGw7dHJ5e24oKX1jYXRjaChxKXt0aGlzLmFzeW5jVGhyb3dfKHEpfX19dGhpcy5iYXRjaF89bnVsbH07Zi5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocCl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHA7fSl9O2QucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXtyZXR1cm4gZnVuY3Rpb24odSl7bnx8KG49ITAscS5jYWxsKG0sdSkpfX12YXIgbT10aGlzLG49ITE7cmV0dXJue3Jlc29sdmU6cCh0aGlzLnJlc29sdmVUb18pLApyZWplY3Q6cCh0aGlzLnJlamVjdF8pfX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihwKXtwPT09dGhpcz90aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTpwIGluc3RhbmNlb2YgZD90aGlzLnNldHRsZVNhbWVBc1Byb21pc2VfKHApOmgocCk/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihwKXt2YXIgbT12b2lkIDA7dHJ5e209cC50aGVufWNhdGNoKG4pe3RoaXMucmVqZWN0XyhuKTtyZXR1cm59ImZ1bmN0aW9uIj09dHlwZW9mIG0/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8obSxwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHApe3RoaXMuc2V0dGxlXygyLHApfTtkLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMSwKcCl9O2QucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocCxtKXtpZigwIT10aGlzLnN0YXRlXyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3ArIiwgIittKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXA7dGhpcy5yZXN1bHRfPW07dGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfTtkLnByb3RvdHlwZS5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXz1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyl7Zm9yKHZhciBwPTA7cDx0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ubGVuZ3RoOysrcClsLmFzeW5jRXhlY3V0ZSh0aGlzLm9uU2V0dGxlZENhbGxiYWNrc19bcF0pO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1udWxsfX07dmFyIGw9bmV3IGY7ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwpwLmNhbGxXaGVuU2V0dGxlZF8obS5yZXNvbHZlLG0ucmVqZWN0KX07ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwLmNhbGwobSxuLnJlc29sdmUsbi5yZWplY3QpfWNhdGNoKHEpe24ucmVqZWN0KHEpfX07ZC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oQSx5KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQT9mdW5jdGlvbih4KXt0cnl7cShBKHgpKX1jYXRjaChDKXt1KEMpfX06eX12YXIgcSx1LHc9bmV3IGQoZnVuY3Rpb24oQSx5KXtxPUE7dT15fSk7dGhpcy5jYWxsV2hlblNldHRsZWRfKG4ocCxxKSxuKG0sdSkpO3JldHVybiB3fTtkLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxwKX07ZC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXtzd2l0Y2gocS5zdGF0ZV8pe2Nhc2UgMTpwKHEucmVzdWx0Xyk7CmJyZWFrO2Nhc2UgMjptKHEucmVzdWx0Xyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIitxLnN0YXRlXyk7fX12YXIgcT10aGlzO251bGw9PXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz9sLmFzeW5jRXhlY3V0ZShuKTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaChuKX07ZC5yZXNvbHZlPWs7ZC5yZWplY3Q9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7bihwKX0pfTtkLnJhY2U9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7Zm9yKHZhciBxPWxiKHApLHU9cS5uZXh0KCk7IXUuZG9uZTt1PXEubmV4dCgpKWsodS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhtLG4pfSl9O2QuYWxsPWZ1bmN0aW9uKHApe3ZhciBtPWxiKHApLG49bS5uZXh0KCk7cmV0dXJuIG4uZG9uZT9rKFtdKTpuZXcgZChmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHcoeCl7cmV0dXJuIGZ1bmN0aW9uKEMpe0FbeF09Qzt5LS07MD09CnkmJnEoQSl9fXZhciBBPVtdLHk9MDtkbyBBLnB1c2godm9pZCAwKSx5KyssayhuLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHcoQS5sZW5ndGgtMSksdSksbj1tLm5leHQoKTt3aGlsZSghbi5kb25lKX0pfTtyZXR1cm4gZH0pO2Z1bmN0aW9uIFViKGIpe2Z1bmN0aW9uIGQoaCl7cmV0dXJuIGIubmV4dChoKX1mdW5jdGlvbiBmKGgpe3JldHVybiBiLnRocm93KGgpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihoLGspe2Z1bmN0aW9uIHIobCl7bC5kb25lP2gobC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4oZCxmKS50aGVuKHIsayl9cihiLm5leHQoKSl9KX1mdW5jdGlvbiBXYihiKXtyZXR1cm4gVWIoYigpKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHgsQyl7dmFyIEc9IiI7aWYoeClpZih4PXgudG9Mb3dlckNhc2UoKSwiICI9PT14fHxBLnRlc3QoeCkpRz0ic3BhY2UiO2Vsc2UgaWYoeS50ZXN0KHgpKUc9ImVzYyI7ZWxzZSBpZigxPT14Lmxlbmd0aCl7aWYoIUN8fHEudGVzdCh4KSlHPXh9ZWxzZSBHPXcudGVzdCh4KT94LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09eD8iKiI6eDtyZXR1cm4gR31mdW5jdGlvbiBkKHgpe3ZhciBDPSIiO3gmJih4IGluIHA/Qz1wW3hdOnUudGVzdCh4KT8oeD1wYXJzZUludCh4LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHgpLnRvTG93ZXJDYXNlKCkpOkM9eC50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHgpe3ZhciBDPSIiO051bWJlcih4KSYmKEM9NjU8PXgmJjkwPj14P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIreCk6MTEyPD14JiYxMjM+PXg/ImYiKyh4LTExMisxKTo0ODw9eCYmNTc+PXg/ClN0cmluZyh4LTQ4KTo5Njw9eCYmMTA1Pj14P1N0cmluZyh4LTk2KTptW3hdKTtyZXR1cm4gQ31mdW5jdGlvbiBoKHgsQyl7cmV0dXJuIHgua2V5P2IoeC5rZXksQyk6eC5kZXRhaWwmJnguZGV0YWlsLmtleT9iKHguZGV0YWlsLmtleSxDKTpkKHgua2V5SWRlbnRpZmllcil8fGYoeC5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gayh4LEMpe3JldHVybiBoKEMseC5oYXNNb2RpZmllcnMpPT09eC5rZXkmJigheC5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEheC5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXguY3RybEtleSYmISFDLmFsdEtleT09PSEheC5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF4Lm1ldGFLZXkpfWZ1bmN0aW9uIHIoeCl7cmV0dXJuIDE9PT14Lmxlbmd0aD97Y29tYm86eCxrZXk6eCxldmVudDoia2V5ZG93biJ9Onguc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxHKXt2YXIgRD1HLnNwbGl0KCI6Iik7Rz1EWzBdO0Q9RFsxXTtHIGluIG4/KENbbltHXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RyxDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp4LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGwoeCl7cmV0dXJuIHgudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiByKEMpfSl9dmFyIHA9eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LG09ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0sbj17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHE9L1thLXowLTkqXS8sdT0vVVwrLyx3PS9eYXJyb3cvLApBPS9ec3BhY2UoYmFyKT8vLHk9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbeF09Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHgsQyl7Qz1sKEMpO2Zvcih2YXIgRz0wO0c8Qy5sZW5ndGg7KytHKWlmKGsoQ1tHXSx4KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB4PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09eC5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ4LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHh9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtmb3IodmFyIEQgaW4gRyl0aGlzLl9hZGRLZXlCaW5kaW5nKEQsR1tEXSl9LHRoaXMpO2Zvcih2YXIgeCBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh4LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t4XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRyxEKXtHPUdbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBHPT09RFswXS5oYXNNb2RpZmllcnM/MDpHPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXtsKHgpLmZvckVhY2goZnVuY3Rpb24oRyl7dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0cuZXZlbnRdLnB1c2goW0csCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24oeCl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3hdKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQseCxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHgsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgeCxDLEc7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXg9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz14WzBdLEc9eFsxXSx4PXhbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEcseCl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih4LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRz0wO0c8eC5sZW5ndGg7RysrKXt2YXIgRD14W0ddWzBdLEI9eFtHXVsxXTtpZihrKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih4LEMsRyl7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh4KTtELmtleWJvYXJkRXZlbnQ9Rzt4PW5ldyBDdXN0b21FdmVudCh4LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMseCk7eC5kZWZhdWx0UHJldmVudGVkJiZHLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGIpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYoYi50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWIudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGIudHlwZSx7c291cmNlRXZlbnQ6Yn0se25vZGU6dGhpcyxidWJibGVzOmIuYnViYmxlcyxjYW5jZWxhYmxlOmIuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYj8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1iPyJub25lIjoiIjtiPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGIpO2J8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZiKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihiKXt0aGlzLmFjdGl2ZSE9PQpiJiYodGhpcy5hY3RpdmU9Yix0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8KGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYi5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZkIT1iJiZ0aGlzLmhhc0F0dHJpYnV0ZShkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZCl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYj8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1yaXBwbGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxfcmlwcGxlQ29udGFpbmVyOnt0eXBlOk9iamVjdH19LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZvY3VzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKCl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX2Rvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLnByZXNzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKGIpfSxlbnN1cmVSaXBwbGU6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGFzUmlwcGxlKCkpe3RoaXMuX3JpcHBsZT10aGlzLl9jcmVhdGVSaXBwbGUoKTt0aGlzLl9yaXBwbGUubm9pbms9dGhpcy5ub2luazt2YXIgZD10aGlzLl9yaXBwbGVDb250YWluZXJ8fHRoaXMucm9vdDtkJiZQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh0aGlzLl9yaXBwbGUpO2lmKGIpe2Q9ClBvbHltZXIuZG9tKHRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcyk7dmFyIGY9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtkLmRlZXBDb250YWlucyhmKSYmdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbihiKX19fSxnZXRSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLmVuc3VyZVJpcHBsZSgpO3JldHVybiB0aGlzLl9yaXBwbGV9LGhhc1JpcHBsZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcmlwcGxlfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLXJpcHBsZSIpfSxfbm9pbmtDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUubm9pbms9Yil9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItYnV0dG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfY2FsY3VsYXRlRWxldmF0aW9uKGZvY3VzZWQsIGRpc2FibGVkLCBhY3RpdmUsIHByZXNzZWQsIHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIiwiX2NvbXB1dGVLZXlib2FyZENsYXNzKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAiLGFuaW1hdGVkOiEwfSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9MTt0aGlzLmRpc2FibGVkP2I9MDp0aGlzLmFjdGl2ZXx8dGhpcy5wcmVzc2VkP2I9NDp0aGlzLnJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQmJihiPTMpO3RoaXMuX3NldEVsZXZhdGlvbihiKX0sX2NvbXB1dGVLZXlib2FyZENsYXNzOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlQ2xhc3MoImtleWJvYXJkLWZvY3VzIiwKYil9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlEb3duSGFuZGxlci5jYWxsKHRoaXMsYik7dGhpcy5oYXNSaXBwbGUoKSYmMT50aGlzLmdldFJpcHBsZSgpLnJpcHBsZXMubGVuZ3RoJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKCl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX3NwYWNlS2V5VXBIYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiZ0aGlzLl9yaXBwbGUudWlVcEFjdGlvbigpfX07UG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWV0YS9pcm9uLW1ldGEuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25NZXRhPWZ1bmN0aW9uKGQpe1BvbHltZXIuSXJvbk1ldGFbIiAiXShkKTt0aGlzLnR5cGU9ZCYmZC50eXBlfHwiZGVmYXVsdCI7dGhpcy5rZXk9ZCYmZC5rZXk7ZCYmInZhbHVlImluIGQmJih0aGlzLnZhbHVlPWQudmFsdWUpfTtQb2x5bWVyLklyb25NZXRhWyIgIl09ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbk1ldGEudHlwZXM9e307UG9seW1lci5Jcm9uTWV0YS5wcm90b3R5cGU9e2dldCB2YWx1ZSgpe3ZhciBkPXRoaXMudHlwZSxmPXRoaXMua2V5O2lmKGQmJmYpcmV0dXJuIFBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF0mJlBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF1bZl19LHNldCB2YWx1ZShkKXt2YXIgZj10aGlzLnR5cGUsaD10aGlzLmtleTtmJiZoJiYoZj1Qb2x5bWVyLklyb25NZXRhLnR5cGVzW2ZdPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl18fHt9LG51bGw9PWQ/ZGVsZXRlIGZbaF06ZltoXT1kKX0sZ2V0IGxpc3QoKXtpZih0aGlzLnR5cGUpe3ZhciBkPQpQb2x5bWVyLklyb25NZXRhLnR5cGVzW3RoaXMudHlwZV07cmV0dXJuIGQ/T2JqZWN0LmtleXMoZCkubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBiW3RoaXMudHlwZV1bZl19LHRoaXMpOltdfX0sYnlLZXk6ZnVuY3Rpb24oZCl7dGhpcy5rZXk9ZDtyZXR1cm4gdGhpcy52YWx1ZX19O3ZhciBiPVBvbHltZXIuSXJvbk1ldGEudHlwZXM7UG9seW1lcih7aXM6Imlyb24tbWV0YSIscHJvcGVydGllczp7dHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSxrZXk6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxmOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9zZWxmQ2hhbmdlZCJ9LF9fbWV0YTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfX2NvbXB1dGVNZXRhKHR5cGUsIGtleSwgdmFsdWUpIn19LGhvc3RBdHRyaWJ1dGVzOntoaWRkZW46ITB9LF9fY29tcHV0ZU1ldGE6ZnVuY3Rpb24oZCxmLGgpe2Q9bmV3IFBvbHltZXIuSXJvbk1ldGEoe3R5cGU6ZCwKa2V5OmZ9KTt2b2lkIDAhPT1oJiZoIT09ZC52YWx1ZT9kLnZhbHVlPWg6dGhpcy52YWx1ZSE9PWQudmFsdWUmJih0aGlzLnZhbHVlPWQudmFsdWUpO3JldHVybiBkfSxnZXQgbGlzdCgpe3JldHVybiB0aGlzLl9fbWV0YSYmdGhpcy5fX21ldGEubGlzdH0sX3NlbGZDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QmJih0aGlzLnZhbHVlPXRoaXMpfSxieUtleTpmdW5jdGlvbihkKXtyZXR1cm4obmV3IFBvbHltZXIuSXJvbk1ldGEoe3R5cGU6dGhpcy50eXBlLGtleTpkfSkpLnZhbHVlfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXZhbGlkYXRhYmxlLWJlaGF2aW9yL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1udWxsOwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnt2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxpbnZhbGlkOntub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIn19LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZToidmFsaWRhdG9yIn0pfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIil9LGdldCBfdmFsaWRhdG9yKCl7cmV0dXJuIFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhJiZQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YS5ieUtleSh0aGlzLnZhbGlkYXRvcil9LGhhc1ZhbGlkYXRvcjpmdW5jdGlvbigpe3JldHVybiBudWxsIT0KdGhpcy5fdmFsaWRhdG9yfSx2YWxpZGF0ZTpmdW5jdGlvbihiKXt0aGlzLmludmFsaWQ9dm9pZCAwPT09YiYmdm9pZCAwIT09dGhpcy52YWx1ZT8hdGhpcy5fZ2V0VmFsaWRpdHkodGhpcy52YWx1ZSk6IXRoaXMuX2dldFZhbGlkaXR5KGIpO3JldHVybiF0aGlzLmludmFsaWR9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5oYXNWYWxpZGF0b3IoKT90aGlzLl92YWxpZGF0b3IudmFsaWRhdGUoYik6ITB9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3I9e3Byb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcGFyZW50Rm9ybTp7dHlwZTpPYmplY3R9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuRWxlbWVudHx8dGhpcy5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC1yZWdpc3RlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpeyFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuX3BhcmVudEZvcm0mJnRoaXMuX3BhcmVudEZvcm0uZmlyZSgiaXJvbi1mb3JtLWVsZW1lbnQtdW5yZWdpc3RlciIse3RhcmdldDp0aGlzfSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci9pcm9uLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntjaGVja2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG5vdGlmeTohMCxvYnNlcnZlcjoiX2NoZWNrZWRDaGFuZ2VkIn0sdG9nZ2xlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiIsb2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3JlcXVpcmVkQ2hhbmdlZChyZXF1aXJlZCkiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faGFzSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9ITB9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5jaGVja2VkfSxfcmVxdWlyZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZXF1aXJlZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIsCiJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiKX0sX2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9dGhpcy5jaGVja2VkO3RoaXMuZmlyZSgiaXJvbi1jaGFuZ2UiKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMudmFsdWV8fG51bGw9PT10aGlzLnZhbHVlKXRoaXMudmFsdWU9Im9uIn19O1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWlua3ktZm9jdXMtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsPXtvYnNlcnZlcnM6WyJfZm9jdXNlZENoYW5nZWQocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxfZm9jdXNlZENoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmdGhpcy5lbnN1cmVSaXBwbGUoKTt0aGlzLmhhc1JpcHBsZSgpJiYodGhpcy5fcmlwcGxlLmhvbGREb3duPWIpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIGI9UG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTtiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJjZW50ZXIiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIpO3JldHVybiBifX07UG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1jaGVja2VkLWVsZW1lbnQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e19jaGVja2VkQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLmNoZWNrZWQ/dGhpcy5fcmlwcGxlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIiIpOnRoaXMuX3JpcHBsZS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKSl9LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2J1dHRvblN0YXRlQ2hhbmdlZC5jYWxsKHRoaXMpOyF0aGlzLmRpc2FibGVkJiZ0aGlzLmlzQXR0YWNoZWQmJih0aGlzLmNoZWNrZWQ9dGhpcy5hY3RpdmUpfX07ClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yPVtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3IsUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklucHV0SGVscGVyPXt9O1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRD0xO1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRD0xO1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0SW5wdXRJRD0xOwpQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2xhYmVsOnt0eXBlOlN0cmluZ30sdmFsdWU6e25vdGlmeTohMCx0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW52YWxpZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sYWxsb3dlZFBhdHRlcm46e3R5cGU6U3RyaW5nfSx0eXBlOnt0eXBlOlN0cmluZ30sbGlzdDp7dHlwZTpTdHJpbmd9LHBhdHRlcm46e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxlcnJvck1lc3NhZ2U6e3R5cGU6U3RyaW5nfSxjaGFyQ291bnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdmFsaWRhdG9yOnt0eXBlOlN0cmluZ30sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZywKdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfYXV0b2ZvY3VzQ2hhbmdlZCJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LG1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1pbjp7dHlwZTpTdHJpbmd9LG1heDp7dHlwZTpTdHJpbmd9LHN0ZXA6e3R5cGU6U3RyaW5nfSxuYW1lOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxyZWFkb25seTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzaXplOnt0eXBlOk51bWJlcn0sYXV0b2NhcGl0YWxpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiJub25lIn0sYXV0b2NvcnJlY3Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvc2F2ZTp7dHlwZTpTdHJpbmd9LHJlc3VsdHM6e3R5cGU6TnVtYmVyfSxhY2NlcHQ6e3R5cGU6U3RyaW5nfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxfYXJpYURlc2NyaWJlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sCl9hcmlhTGFiZWxsZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9pbnB1dElkOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCJ9LGtleUJpbmRpbmdzOnsic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxob3N0QXR0cmlidXRlczp7dGFiaW5kZXg6MH0sZ2V0IGlucHV0RWxlbWVudCgpe3RoaXMuJHx8KHRoaXMuJD17fSk7dGhpcy4kLmlucHV0fHwodGhpcy5fZ2VuZXJhdGVJbnB1dElkKCksdGhpcy4kLmlucHV0PXRoaXMuJCQoIiMiK3RoaXMuX2lucHV0SWQpKTtyZXR1cm4gdGhpcy4kLmlucHV0fSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnR9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl90eXBlc1RoYXRIYXZlVGV4dD0iZGF0ZSBkYXRldGltZSBkYXRldGltZS1sb2NhbCBtb250aCB0aW1lIHdlZWsgZmlsZSIuc3BsaXQoIiAiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpOwohUG9seW1lci5FbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuaW5wdXRFbGVtZW50LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKX0sX2FwcGVuZFN0cmluZ1dpdGhTcGFjZTpmdW5jdGlvbihiLGQpe3JldHVybiBiP2IrIiAiK2Q6ZH0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXtiPVBvbHltZXIuZG9tKGIpLnJvb3RUYXJnZXQ7aWYoYi5pZCl0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxiLmlkKTtlbHNle3ZhciBkPSJwYXBlci1pbnB1dC1hZGQtb24tIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dEFkZG9uSUQrKztiLmlkPWQ7dGhpcy5fYXJpYURlc2NyaWJlZEJ5PXRoaXMuX2FwcGVuZFN0cmluZ1dpdGhTcGFjZSh0aGlzLl9hcmlhRGVzY3JpYmVkQnksZCl9fSx2YWxpZGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC52YWxpZGF0ZSgpfSwKX2ZvY3VzQmx1ckhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9mb2N1c0JsdXJIYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmZvY3VzZWQmJiF0aGlzLl9zaGlmdFRhYlByZXNzZWQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKX0sX29uU2hpZnRUYWJEb3duOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSEwO3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsYik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSExfSwxKX0sX2hhbmRsZUF1dG9WYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCl9LHVwZGF0ZVZhbHVlQW5kUHJlc2VydmVDYXJldDpmdW5jdGlvbihiKXt0cnl7dmFyIGQ9CnRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0O3RoaXMudmFsdWU9Yjt0aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydD1kO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZD1kfWNhdGNoKGYpe3RoaXMudmFsdWU9Yn19LF9jb21wdXRlQWx3YXlzRmxvYXRMYWJlbDpmdW5jdGlvbihiLGQpe3JldHVybiBkfHxifSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7aWYoYil7aWYoYi5pZCl2YXIgZD1iLmlkO2Vsc2UgZD0icGFwZXItaW5wdXQtbGFiZWwtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dExhYmVsSUQrKyxiLmlkPWQ7dGhpcy5fYXJpYUxhYmVsbGVkQnk9ZH1lbHNlIHRoaXMuX2FyaWFMYWJlbGxlZEJ5PSIifSxfZ2VuZXJhdGVJbnB1dElkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRJZCYmIiIhPT10aGlzLl9pbnB1dElkfHwodGhpcy5faW5wdXRJZD0KImlucHV0LSIrUG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEKyspfSxfb25DaGFuZ2U6ZnVuY3Rpb24oYil7dGhpcy5zaGFkb3dSb290JiZ0aGlzLmZpcmUoYi50eXBlLHtzb3VyY2VFdmVudDpifSx7bm9kZTp0aGlzLGJ1YmJsZXM6Yi5idWJibGVzLGNhbmNlbGFibGU6Yi5jYW5jZWxhYmxlfSl9LF9hdXRvZm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodGhpcy5hdXRvZm9jdXMmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQpe3ZhciBiPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7YiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZiIT09ZG9jdW1lbnQuYm9keSYmYiE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX19O1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yPVtQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWFkZG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcj17YXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImFkZG9uLWF0dGFjaGVkIil9LHVwZGF0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZml0LWJlaGF2aW9yL2lyb24tZml0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRml0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e3NpemluZ1RhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LGZpdEludG86e3R5cGU6T2JqZWN0LHZhbHVlOndpbmRvd30sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LHBvc2l0aW9uVGFyZ2V0Ont0eXBlOkVsZW1lbnR9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmd9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sYXV0b0ZpdE9uQXR0YWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maXRJbmZvOnt0eXBlOk9iamVjdH19LGdldCBfZml0V2lkdGgoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lcldpZHRoOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH0sCmdldCBfZml0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJIZWlnaHQ6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodH0sZ2V0IF9maXRMZWZ0KCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz8wOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSxnZXQgX2ZpdFRvcCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfSxnZXQgX2RlZmF1bHRQb3NpdGlvblRhcmdldCgpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnBhcmVudE5vZGU7YiYmYi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmKGI9Yi5ob3N0KTtyZXR1cm4gYn0sZ2V0IF9sb2NhbGVIb3Jpem9udGFsQWxpZ24oKXtpZih0aGlzLl9pc1JUTCl7aWYoInJpZ2h0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJsZWZ0IjsKaWYoImxlZnQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuInJpZ2h0In1yZXR1cm4gdGhpcy5ob3Jpem9udGFsQWxpZ259LGdldCBfX3Nob3VsZFBvc2l0aW9uKCl7cmV0dXJuKHRoaXMuaG9yaXpvbnRhbEFsaWdufHx0aGlzLnZlcnRpY2FsQWxpZ24pJiZ0aGlzLnBvc2l0aW9uVGFyZ2V0fSxhdHRhY2hlZDpmdW5jdGlvbigpeyJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX2lzUlRMJiYodGhpcy5faXNSVEw9InJ0bCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7dGhpcy5wb3NpdGlvblRhcmdldD10aGlzLnBvc2l0aW9uVGFyZ2V0fHx0aGlzLl9kZWZhdWx0UG9zaXRpb25UYXJnZXQ7dGhpcy5hdXRvRml0T25BdHRhY2gmJigibm9uZSI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXNwbGF5P3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZpdCgpfS5iaW5kKHRoaXMpKTood2luZG93LlNoYWR5RE9NJiZTaGFkeURPTS5mbHVzaCgpLAp0aGlzLmZpdCgpKSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2RlZmVycmVkRml0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX19kZWZlcnJlZEZpdCksdGhpcy5fX2RlZmVycmVkRml0PW51bGwpfSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uKCk7dGhpcy5jb25zdHJhaW4oKTt0aGlzLmNlbnRlcigpfSxfZGlzY292ZXJJbmZvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZpdEluZm8pe3ZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zaXppbmdUYXJnZXQpO3RoaXMuX2ZpdEluZm89e2lubGluZVN0eWxlOnt0b3A6dGhpcy5zdHlsZS50b3B8fCIiLGxlZnQ6dGhpcy5zdHlsZS5sZWZ0fHwiIixwb3NpdGlvbjp0aGlzLnN0eWxlLnBvc2l0aW9ufHwiIn0sc2l6ZXJJbmxpbmVTdHlsZTp7bWF4V2lkdGg6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGh8fCIiLG1heEhlaWdodDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHR8fAoiIixib3hTaXppbmc6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nfHwiIn0scG9zaXRpb25lZEJ5Ont2ZXJ0aWNhbGx5OiJhdXRvIiE9PWIudG9wPyJ0b3AiOiJhdXRvIiE9PWIuYm90dG9tPyJib3R0b20iOm51bGwsaG9yaXpvbnRhbGx5OiJhdXRvIiE9PWIubGVmdD8ibGVmdCI6ImF1dG8iIT09Yi5yaWdodD8icmlnaHQiOm51bGx9LHNpemVkQnk6e2hlaWdodDoibm9uZSIhPT1kLm1heEhlaWdodCx3aWR0aDoibm9uZSIhPT1kLm1heFdpZHRoLG1pbldpZHRoOnBhcnNlSW50KGQubWluV2lkdGgsMTApfHwwLG1pbkhlaWdodDpwYXJzZUludChkLm1pbkhlaWdodCwxMCl8fDB9LG1hcmdpbjp7dG9wOnBhcnNlSW50KGIubWFyZ2luVG9wLDEwKXx8MCxyaWdodDpwYXJzZUludChiLm1hcmdpblJpZ2h0LDEwKXx8MCxib3R0b206cGFyc2VJbnQoYi5tYXJnaW5Cb3R0b20sMTApfHwwLGxlZnQ6cGFyc2VJbnQoYi5tYXJnaW5MZWZ0LDEwKXx8MH19fX0scmVzZXRGaXQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5fZml0SW5mb3x8e30sZDtmb3IoZCBpbiBiLnNpemVySW5saW5lU3R5bGUpdGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbZF09Yi5zaXplcklubGluZVN0eWxlW2RdO2ZvcihkIGluIGIuaW5saW5lU3R5bGUpdGhpcy5zdHlsZVtkXT1iLmlubGluZVN0eWxlW2RdO3RoaXMuX2ZpdEluZm89bnVsbH0scmVmaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0LGQ9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wO3RoaXMucmVzZXRGaXQoKTt0aGlzLmZpdCgpO3RoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbExlZnQ9Yjt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxUb3A9ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9fc2hvdWxkUG9zaXRpb24pe3RoaXMuX2Rpc2NvdmVySW5mbygpO3RoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIjt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giO3RoaXMuc3R5bGUubGVmdD0iMHB4IjsKdGhpcy5zdHlsZS50b3A9IjBweCI7dmFyIGI9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLnBvc2l0aW9uVGFyZ2V0KSxmPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pLGg9dGhpcy5fZml0SW5mby5tYXJnaW4saz10aGlzLl9fZ2V0UG9zaXRpb24odGhpcy5fbG9jYWxlSG9yaXpvbnRhbEFsaWduLHRoaXMudmVydGljYWxBbGlnbix7d2lkdGg6Yi53aWR0aCtoLmxlZnQraC5yaWdodCxoZWlnaHQ6Yi5oZWlnaHQraC50b3AraC5ib3R0b219LGIsZCxmKTtkPWsubGVmdCtoLmxlZnQ7az1rLnRvcCtoLnRvcDt2YXIgcj1NYXRoLm1pbihmLnJpZ2h0LWgucmlnaHQsZCtiLndpZHRoKSxsPU1hdGgubWluKGYuYm90dG9tLWguYm90dG9tLGsrYi5oZWlnaHQpO2Q9TWF0aC5tYXgoZi5sZWZ0K2gubGVmdCxNYXRoLm1pbihkLHItdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSk7az1NYXRoLm1heChmLnRvcCsKaC50b3AsTWF0aC5taW4oayxsLXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aD1NYXRoLm1heChyLWQsdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSsicHgiO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodD1NYXRoLm1heChsLWssdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbkhlaWdodCkrInB4Ijt0aGlzLnN0eWxlLmxlZnQ9ZC1iLmxlZnQrInB4Ijt0aGlzLnN0eWxlLnRvcD1rLWIudG9wKyJweCJ9fSxjb25zdHJhaW46ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt2YXIgYj10aGlzLl9maXRJbmZvO2IucG9zaXRpb25lZEJ5LnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zdHlsZS50b3A9IjBweCIpO2IucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseXx8KHRoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIiwKdGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giO3ZhciBkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Yi5zaXplZEJ5LmhlaWdodHx8dGhpcy5fX3NpemVEaW1lbnNpb24oZCxiLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5LCJ0b3AiLCJib3R0b20iLCJIZWlnaHQiKTtiLnNpemVkQnkud2lkdGh8fHRoaXMuX19zaXplRGltZW5zaW9uKGQsYi5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5LCJsZWZ0IiwicmlnaHQiLCJXaWR0aCIpfX0sX3NpemVEaW1lbnNpb246ZnVuY3Rpb24oYixkLGYsaCxrKXt0aGlzLl9fc2l6ZURpbWVuc2lvbihiLGQsZixoLGspfSxfX3NpemVEaW1lbnNpb246ZnVuY3Rpb24oYixkLGYsaCxrKXt2YXIgcj10aGlzLl9maXRJbmZvLGw9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7bD0iV2lkdGgiPT09az9sLndpZHRoOmwuaGVpZ2h0O2Q9ZD09PWg7dmFyIHA9CiJvZmZzZXQiK2s7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbIm1heCIra109bC1yLm1hcmdpbltkP2Y6aF0tKGQ/bC1iW2hdOmJbZl0pLSh0aGlzW3BdLXRoaXMuc2l6aW5nVGFyZ2V0W3BdKSsicHgifSxjZW50ZXI6ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt2YXIgYj10aGlzLl9maXRJbmZvLnBvc2l0aW9uZWRCeTtpZighYi52ZXJ0aWNhbGx5fHwhYi5ob3Jpem9udGFsbHkpe3RoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIjtiLnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnRvcD0iMHB4Iik7Yi5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLmxlZnQ9IjBweCIpO3ZhciBkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTtiLnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnRvcD1mLnRvcC1kLnRvcCsoZi5oZWlnaHQtZC5oZWlnaHQpLzIrInB4Iik7Yi5ob3Jpem9udGFsbHl8fAoodGhpcy5zdHlsZS5sZWZ0PWYubGVmdC1kLmxlZnQrKGYud2lkdGgtZC53aWR0aCkvMisicHgiKX19fSxfX2dldE5vcm1hbGl6ZWRSZWN0OmZ1bmN0aW9uKGIpe3JldHVybiBiPT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxiPT09d2luZG93P3t0b3A6MCxsZWZ0OjAsd2lkdGg6d2luZG93LmlubmVyV2lkdGgsaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCxyaWdodDp3aW5kb3cuaW5uZXJXaWR0aCxib3R0b206d2luZG93LmlubmVySGVpZ2h0fTpiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxfX2dldE9mZnNjcmVlbkFyZWE6ZnVuY3Rpb24oYixkLGYpe3JldHVybiBNYXRoLmFicyhNYXRoLm1pbigwLGIudG9wKStNYXRoLm1pbigwLGYuYm90dG9tLShiLnRvcCtkLmhlaWdodCkpKSpkLndpZHRoK01hdGguYWJzKE1hdGgubWluKDAsYi5sZWZ0KStNYXRoLm1pbigwLGYucmlnaHQtKGIubGVmdCtkLndpZHRoKSkpKmQuaGVpZ2h0fSxfX2dldFBvc2l0aW9uOmZ1bmN0aW9uKGIsZCwKZixoLGsscil7dmFyIGw9W3t2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ay50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOmsuYm90dG9tLWYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ay5ib3R0b20tZi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXR9XTsKaWYodGhpcy5ub092ZXJsYXApe2Zvcih2YXIgcD0wLG09bC5sZW5ndGg7cDxtO3ArKyl7dmFyIG49e30scTtmb3IocSBpbiBsW3BdKW5bcV09bFtwXVtxXTtsLnB1c2gobil9bFswXS50b3A9bFsxXS50b3ArPWsuaGVpZ2h0O2xbMl0udG9wPWxbM10udG9wLT1rLmhlaWdodDtsWzRdLmxlZnQ9bFs2XS5sZWZ0Kz1rLndpZHRoO2xbNV0ubGVmdD1sWzddLmxlZnQtPWsud2lkdGh9ZD0iYXV0byI9PT1kP251bGw6ZDtiPSJhdXRvIj09PWI/bnVsbDpiO2ImJiJjZW50ZXIiIT09Ynx8KGwucHVzaCh7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP2suaGVpZ2h0OjApLGxlZnQ6ay5sZWZ0LWgud2lkdGgvMitrLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSksbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ay5ib3R0b20tCmYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2suaGVpZ2h0OjApLGxlZnQ6ay5sZWZ0LWgud2lkdGgvMitrLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSkpO2QmJiJtaWRkbGUiIT09ZHx8KGwucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP2sud2lkdGg6MCl9KSxsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsudG9wLWguaGVpZ2h0LzIray5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5yaWdodC1mLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/ay53aWR0aDowKX0pKTsibWlkZGxlIj09PWQmJiJjZW50ZXIiPT09CmImJmwucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsudG9wLWguaGVpZ2h0LzIray5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0LWgud2lkdGgvMitrLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSk7Zm9yKHA9MDtwPGwubGVuZ3RoO3ArKyl7aD1sW3BdO2s9aC52ZXJ0aWNhbEFsaWduPT09ZDttPWguaG9yaXpvbnRhbEFsaWduPT09YjtpZighdGhpcy5keW5hbWljQWxpZ24mJiF0aGlzLm5vT3ZlcmxhcCYmayYmbSl7dmFyIHU9aDticmVha31uPSghZHx8aykmJighYnx8bSk7aWYodGhpcy5keW5hbWljQWxpZ258fG4pe2gub2Zmc2NyZWVuQXJlYT10aGlzLl9fZ2V0T2Zmc2NyZWVuQXJlYShoLGYscik7aWYoMD09PWgub2Zmc2NyZWVuQXJlYSYmbil7dT1oO2JyZWFrfXU9dXx8aDtuPWgub2Zmc2NyZWVuQXJlYS11Lm9mZnNjcmVlbkFyZWE7aWYoMD5ufHwwPT09biYmKGt8fG0pKXU9aH19cmV0dXJuIHV9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXJlc2l6YWJsZS1iZWhhdmlvci9pcm9uLXJlc2l6YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOntfcGFyZW50UmVzaXphYmxlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3BhcmVudFJlc2l6YWJsZUNoYW5nZWQifSxfbm90aWZ5aW5nRGVzY2VuZGFudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnsiaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zIjoiX29uSXJvblJlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzPVtdO3RoaXMuX2JvdW5kTm90aWZ5UmVzaXplPXRoaXMubm90aWZ5UmVzaXplLmJpbmQodGhpcyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnRSZXNpemFibGU/dGhpcy5fcGFyZW50UmVzaXphYmxlLnN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yKHRoaXMpOndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLAp0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSk7dGhpcy5fcGFyZW50UmVzaXphYmxlPW51bGx9LG5vdGlmeVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmZvckVhY2goZnVuY3Rpb24oYil7dGhpcy5yZXNpemVyU2hvdWxkTm90aWZ5KGIpJiZ0aGlzLl9ub3RpZnlEZXNjZW5kYW50KGIpfSx0aGlzKSx0aGlzLl9maXJlUmVzaXplKCkpfSxhc3NpZ25QYXJlbnRSZXNpemFibGU6ZnVuY3Rpb24oYil7dGhpcy5fcGFyZW50UmVzaXphYmxlPWJ9LHN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YoYik7LTE8ZCYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLnNwbGljZShkLDEpLHRoaXMudW5saXN0ZW4oYiwiaXJvbi1yZXNpemUiLCJfb25EZXNjZW5kYW50SXJvblJlc2l6ZSIpKX0scmVzaXplclNob3VsZE5vdGlmeTpmdW5jdGlvbigpe3JldHVybiEwfSwKX29uRGVzY2VuZGFudElyb25SZXNpemU6ZnVuY3Rpb24oYil7dGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD9iLnN0b3BQcm9wYWdhdGlvbigpOlBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93fHx0aGlzLl9maXJlUmVzaXplKCl9LF9maXJlUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLXJlc2l6ZSIsbnVsbCx7bm9kZTp0aGlzLGJ1YmJsZXM6ITF9KX0sX29uSXJvblJlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKGIpLnJvb3RUYXJnZXQ7ZCE9PXRoaXMmJigtMT09PXRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YoZCkmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5wdXNoKGQpLHRoaXMubGlzdGVuKGQsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSksZC5hc3NpZ25QYXJlbnRSZXNpemFibGUodGhpcyksdGhpcy5fbm90aWZ5RGVzY2VuZGFudChkKSxiLnN0b3BQcm9wYWdhdGlvbigpKX0sCl9wYXJlbnRSZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKX0sX25vdGlmeURlc2NlbmRhbnQ6ZnVuY3Rpb24oYil7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD0hMCxiLm5vdGlmeVJlc2l6ZSgpLHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITEpfSxfcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnM6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQpaWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGI9dGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbiBmKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZik7YigpfSl9ZWxzZSB0aGlzLmZpcmUoImlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyIsCm51bGwse25vZGU6dGhpcyxidWJibGVzOiEwLGNhbmNlbGFibGU6ITB9KSx0aGlzLl9wYXJlbnRSZXNpemFibGV8fCh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSksdGhpcy5ub3RpZnlSZXNpemUoKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1vdmVybGF5LW1hbmFnZXIuaHRtbC5qcwpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheXM9W107dGhpcy5fbWluaW11bVo9MTAxO3RoaXMuX2JhY2tkcm9wRWxlbWVudD1udWxsO1BvbHltZXIuR2VzdHVyZXMuYWRkKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwidGFwIixmdW5jdGlvbigpe30pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsdGhpcy5fb25DYXB0dXJlQ2xpY2suYmluZCh0aGlzKSwhMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX29uQ2FwdHVyZUZvY3VzLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuX29uQ2FwdHVyZUtleURvd24uYmluZCh0aGlzKSwhMCl9OwpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcyxnZXQgYmFja2Ryb3BFbGVtZW50KCl7dGhpcy5fYmFja2Ryb3BFbGVtZW50fHwodGhpcy5fYmFja2Ryb3BFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tb3ZlcmxheS1iYWNrZHJvcCIpKTtyZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50fSxnZXQgZGVlcEFjdGl2ZUVsZW1lbnQoKXt2YXIgYj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2ImJiExIT09YiBpbnN0YW5jZW9mIEVsZW1lbnR8fChiPWRvY3VtZW50LmJvZHkpO2Zvcig7Yi5yb290JiZQb2x5bWVyLmRvbShiLnJvb3QpLmFjdGl2ZUVsZW1lbnQ7KWI9UG9seW1lci5kb20oYi5yb290KS5hY3RpdmVFbGVtZW50O3JldHVybiBifSxfYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQ6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fb3ZlcmxheXNbYl07aWYoZCl7dmFyIGY9CnRoaXMuX292ZXJsYXlzLmxlbmd0aC0xLGg9dGhpcy5fb3ZlcmxheXNbZl07aCYmdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KGQsaCkmJmYtLTtpZighKGI+PWYpKXtoPU1hdGgubWF4KHRoaXMuY3VycmVudE92ZXJsYXlaKCksdGhpcy5fbWluaW11bVopO2Zvcih0aGlzLl9nZXRaKGQpPD1oJiZ0aGlzLl9hcHBseU92ZXJsYXlaKGQsaCk7YjxmOyl0aGlzLl9vdmVybGF5c1tiXT10aGlzLl9vdmVybGF5c1tiKzFdLGIrKzt0aGlzLl9vdmVybGF5c1tmXT1kfX19LGFkZE9yUmVtb3ZlT3ZlcmxheTpmdW5jdGlvbihiKXtiLm9wZW5lZD90aGlzLmFkZE92ZXJsYXkoYik6dGhpcy5yZW1vdmVPdmVybGF5KGIpfSxhZGRPdmVybGF5OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzLmluZGV4T2YoYik7aWYoMDw9ZCl0aGlzLl9icmluZ092ZXJsYXlBdEluZGV4VG9Gcm9udChkKTtlbHNle2Q9dGhpcy5fb3ZlcmxheXMubGVuZ3RoO3ZhciBmPXRoaXMuX292ZXJsYXlzW2QtMV0saD0KTWF0aC5tYXgodGhpcy5fZ2V0WihmKSx0aGlzLl9taW5pbXVtWiksaz10aGlzLl9nZXRaKGIpO2YmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShiLGYpJiYodGhpcy5fYXBwbHlPdmVybGF5WihmLGgpLGQtLSxoPU1hdGgubWF4KHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheXNbZC0xXSksdGhpcy5fbWluaW11bVopKTtrPD1oJiZ0aGlzLl9hcHBseU92ZXJsYXlaKGIsaCk7dGhpcy5fb3ZlcmxheXMuc3BsaWNlKGQsMCxiKX10aGlzLnRyYWNrQmFja2Ryb3AoKX0scmVtb3ZlT3ZlcmxheTpmdW5jdGlvbihiKXtiPXRoaXMuX292ZXJsYXlzLmluZGV4T2YoYik7LTEhPT1iJiYodGhpcy5fb3ZlcmxheXMuc3BsaWNlKGIsMSksdGhpcy50cmFja0JhY2tkcm9wKCkpfSxjdXJyZW50T3ZlcmxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vdmVybGF5c1t0aGlzLl9vdmVybGF5cy5sZW5ndGgtMV19LGN1cnJlbnRPdmVybGF5WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRaKHRoaXMuY3VycmVudE92ZXJsYXkoKSl9LAplbnN1cmVNaW5pbXVtWjpmdW5jdGlvbihiKXt0aGlzLl9taW5pbXVtWj1NYXRoLm1heCh0aGlzLl9taW5pbXVtWixiKX0sZm9jdXNPdmVybGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2ImJmIuX2FwcGx5Rm9jdXMoKX0sdHJhY2tCYWNrZHJvcDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX292ZXJsYXlXaXRoQmFja2Ryb3AoKTtpZihifHx0aGlzLl9iYWNrZHJvcEVsZW1lbnQpdGhpcy5iYWNrZHJvcEVsZW1lbnQuc3R5bGUuekluZGV4PXRoaXMuX2dldFooYiktMSx0aGlzLmJhY2tkcm9wRWxlbWVudC5vcGVuZWQ9ISFiLHRoaXMuYmFja2Ryb3BFbGVtZW50LnByZXBhcmUoKX0sZ2V0QmFja2Ryb3BzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGQ9MDtkPHRoaXMuX292ZXJsYXlzLmxlbmd0aDtkKyspdGhpcy5fb3ZlcmxheXNbZF0ud2l0aEJhY2tkcm9wJiZiLnB1c2godGhpcy5fb3ZlcmxheXNbZF0pO3JldHVybiBifSxiYWNrZHJvcFo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCkpLQoxfSxfb3ZlcmxheVdpdGhCYWNrZHJvcDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9vdmVybGF5cy5sZW5ndGgtMTswPD1iO2ItLSlpZih0aGlzLl9vdmVybGF5c1tiXS53aXRoQmFja2Ryb3ApcmV0dXJuIHRoaXMuX292ZXJsYXlzW2JdfSxfZ2V0WjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9taW5pbXVtWjtiJiYoYj1OdW1iZXIoYi5zdHlsZS56SW5kZXh8fHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGIpLnpJbmRleCksYj09PWImJihkPWIpKTtyZXR1cm4gZH0sX3NldFo6ZnVuY3Rpb24oYixkKXtiLnN0eWxlLnpJbmRleD1kfSxfYXBwbHlPdmVybGF5WjpmdW5jdGlvbihiLGQpe3RoaXMuX3NldFooYixkKzIpfSxfb3ZlcmxheUluUGF0aDpmdW5jdGlvbihiKXtiPWJ8fFtdO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWlmKGJbZF0uX21hbmFnZXI9PT10aGlzKXJldHVybiBiW2RdfSxfb25DYXB0dXJlQ2xpY2s6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLQoxO2lmKC0xIT09ZClmb3IodmFyIGY9UG9seW1lci5kb20oYikucGF0aCxoOyhoPXRoaXMuX292ZXJsYXlzW2RdKSYmdGhpcy5fb3ZlcmxheUluUGF0aChmKSE9PWg7KWlmKGguX29uQ2FwdHVyZUNsaWNrKGIpLGguYWxsb3dDbGlja1Rocm91Z2gpZC0tO2Vsc2UgYnJlYWt9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZCYmZC5fb25DYXB0dXJlRm9jdXMoYil9LF9vbkNhcHR1cmVLZXlEb3duOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuY3VycmVudE92ZXJsYXkoKTtkJiYoUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvci5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoYiwiZXNjIik/ZC5fb25DYXB0dXJlRXNjKGIpOlBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsInRhYiIpJiZkLl9vbkNhcHR1cmVUYWIoYikpfSxfc2hvdWxkQmVCZWhpbmRPdmVybGF5OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIWIuYWx3YXlzT25Ub3AmJgpkLmFsd2F5c09uVG9wfX07UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXI9bmV3IFBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3M7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tc2Nyb2xsLW1hbmFnZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj0wLGQ9MCxmPW51bGwsaD1bXSxrPVsid2hlZWwiLCJtb3VzZXdoZWVsIiwiRE9NTW91c2VTY3JvbGwiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIl07UG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlcj17Z2V0IGN1cnJlbnRMb2NraW5nRWxlbWVudCgpe3JldHVybiB0aGlzLl9sb2NraW5nRWxlbWVudHNbdGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aC0xXX0sZWxlbWVudElzU2Nyb2xsTG9ja2VkOmZ1bmN0aW9uKHIpe3ZhciBsPXRoaXMuY3VycmVudExvY2tpbmdFbGVtZW50O2lmKHZvaWQgMD09PWwpcmV0dXJuITE7aWYodGhpcy5faGFzQ2FjaGVkTG9ja2VkRWxlbWVudChyKSlyZXR1cm4hMDtpZih0aGlzLl9oYXNDYWNoZWRVbmxvY2tlZEVsZW1lbnQocikpcmV0dXJuITE7KGw9ISFsJiZsIT09ciYmIXRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKGwscikpP3RoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKHIpOnRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlLnB1c2gocik7CnJldHVybiBsfSxwdXNoU2Nyb2xsTG9jazpmdW5jdGlvbihyKXswPD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZihyKXx8KDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zKCksdGhpcy5fbG9ja2luZ0VsZW1lbnRzLnB1c2gociksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdKX0scmVtb3ZlU2Nyb2xsTG9jazpmdW5jdGlvbihyKXtyPXRoaXMuX2xvY2tpbmdFbGVtZW50cy5pbmRleE9mKHIpOy0xIT09ciYmKHRoaXMuX2xvY2tpbmdFbGVtZW50cy5zcGxpY2UociwxKSx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGU9W10sdGhpcy5fdW5sb2NrZWRFbGVtZW50Q2FjaGU9W10sMD09PXRoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgmJnRoaXMuX3VubG9ja1Njcm9sbEludGVyYWN0aW9ucygpKX0sX2xvY2tpbmdFbGVtZW50czpbXSxfbG9ja2VkRWxlbWVudENhY2hlOm51bGwsCl91bmxvY2tlZEVsZW1lbnRDYWNoZTpudWxsLF9oYXNDYWNoZWRMb2NrZWRFbGVtZW50OmZ1bmN0aW9uKHIpe3JldHVybi0xPHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKHIpfSxfaGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50OmZ1bmN0aW9uKHIpe3JldHVybi0xPHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlLmluZGV4T2Yocil9LF9jb21wb3NlZFRyZWVDb250YWluczpmdW5jdGlvbihyLGwpe3ZhciBwLG07aWYoci5jb250YWlucyhsKSlyZXR1cm4hMDtyPVBvbHltZXIuZG9tKHIpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQsc2xvdCIpO2ZvcihwPTA7cDxyLmxlbmd0aDsrK3Ape3ZhciBuPVBvbHltZXIuZG9tKHJbcF0pLmdldERpc3RyaWJ1dGVkTm9kZXMoKTtmb3IobT0wO208bi5sZW5ndGg7KyttKWlmKG5bbV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5fY29tcG9zZWRUcmVlQ29udGFpbnMoblttXSxsKSlyZXR1cm4hMH1yZXR1cm4hMX0sX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbihyKXtyLmNhbmNlbGFibGUmJgp0aGlzLl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nKHIpJiZyLnByZXZlbnREZWZhdWx0KCk7ci50YXJnZXRUb3VjaGVzJiYocj1yLnRhcmdldFRvdWNoZXNbMF0sYj1yLnBhZ2VYLGQ9ci5wYWdlWSl9LF9sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPXRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcnx8dGhpcy5fc2Nyb2xsSW50ZXJhY3Rpb25IYW5kbGVyLmJpbmQodGhpcyk7Zm9yKHZhciByPTAsbD1rLmxlbmd0aDtyPGw7cisrKWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoa1tyXSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSxfdW5sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKCl7Zm9yKHZhciByPTAsbD1rLmxlbmd0aDtyPGw7cisrKWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoa1tyXSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSwKX3Nob3VsZFByZXZlbnRTY3JvbGxpbmc6ZnVuY3Rpb24ocil7dmFyIGw9UG9seW1lci5kb20ocikucm9vdFRhcmdldDsidG91Y2htb3ZlIiE9PXIudHlwZSYmZiE9PWwmJihmPWwsaD10aGlzLl9nZXRTY3JvbGxhYmxlTm9kZXMoUG9seW1lci5kb20ocikucGF0aCkpO2lmKCFoLmxlbmd0aClyZXR1cm4hMDtpZigidG91Y2hzdGFydCI9PT1yLnR5cGUpcmV0dXJuITE7cj10aGlzLl9nZXRTY3JvbGxJbmZvKHIpO3JldHVybiF0aGlzLl9nZXRTY3JvbGxpbmdOb2RlKGgsci5kZWx0YVgsci5kZWx0YVkpfSxfZ2V0U2Nyb2xsYWJsZU5vZGVzOmZ1bmN0aW9uKHIpe2Zvcih2YXIgbD1bXSxwPXIuaW5kZXhPZih0aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudCksbT0wO208PXA7bSsrKWlmKHJbbV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIG49clttXSxxPW4uc3R5bGU7InNjcm9sbCIhPT1xLm92ZXJmbG93JiYiYXV0byIhPT1xLm92ZXJmbG93JiYocT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuKSk7CiJzY3JvbGwiIT09cS5vdmVyZmxvdyYmImF1dG8iIT09cS5vdmVyZmxvd3x8bC5wdXNoKG4pfXJldHVybiBsfSxfZ2V0U2Nyb2xsaW5nTm9kZTpmdW5jdGlvbihyLGwscCl7aWYobHx8cClmb3IodmFyIG09TWF0aC5hYnMocCk+PU1hdGguYWJzKGwpLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIHE9cltuXTtpZihtPzA+cD8wPHEuc2Nyb2xsVG9wOnEuc2Nyb2xsVG9wPHEuc2Nyb2xsSGVpZ2h0LXEuY2xpZW50SGVpZ2h0OjA+bD8wPHEuc2Nyb2xsTGVmdDpxLnNjcm9sbExlZnQ8cS5zY3JvbGxXaWR0aC1xLmNsaWVudFdpZHRoKXJldHVybiBxfX0sX2dldFNjcm9sbEluZm86ZnVuY3Rpb24ocil7dmFyIGw9e2RlbHRhWDpyLmRlbHRhWCxkZWx0YVk6ci5kZWx0YVl9OyJkZWx0YVgiaW4gcnx8KCJ3aGVlbERlbHRhWCJpbiByJiYid2hlZWxEZWx0YVkiaW4gcj8obC5kZWx0YVg9LXIud2hlZWxEZWx0YVgsbC5kZWx0YVk9LXIud2hlZWxEZWx0YVkpOiJ3aGVlbERlbHRhImluIHI/KGwuZGVsdGFYPQowLGwuZGVsdGFZPS1yLndoZWVsRGVsdGEpOiJheGlzImluIHI/KGwuZGVsdGFYPTE9PT1yLmF4aXM/ci5kZXRhaWw6MCxsLmRlbHRhWT0yPT09ci5heGlzP3IuZGV0YWlsOjApOnIudGFyZ2V0VG91Y2hlcyYmKHI9ci50YXJnZXRUb3VjaGVzWzBdLGwuZGVsdGFYPWItci5wYWdlWCxsLmRlbHRhWT1kLXIucGFnZVkpKTtyZXR1cm4gbH19fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1mb2N1c2FibGVzLWhlbHBlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPUVsZW1lbnQucHJvdG90eXBlLGQ9Yi5tYXRjaGVzfHxiLm1hdGNoZXNTZWxlY3Rvcnx8Yi5tb3pNYXRjaGVzU2VsZWN0b3J8fGIubXNNYXRjaGVzU2VsZWN0b3J8fGIub01hdGNoZXNTZWxlY3Rvcnx8Yi53ZWJraXRNYXRjaGVzU2VsZWN0b3I7UG9seW1lci5Jcm9uRm9jdXNhYmxlc0hlbHBlcj17Z2V0VGFiYmFibGVOb2RlczpmdW5jdGlvbihmKXt2YXIgaD1bXTtyZXR1cm4gdGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZixoKT90aGlzLl9zb3J0QnlUYWJJbmRleChoKTpofSxpc0ZvY3VzYWJsZTpmdW5jdGlvbihmKXtyZXR1cm4gZC5jYWxsKGYsImlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBidXR0b24sIG9iamVjdCIpP2QuY2FsbChmLCI6bm90KFtkaXNhYmxlZF0pIik6ZC5jYWxsKGYsImFbaHJlZl0sIGFyZWFbaHJlZl0sIGlmcmFtZSwgW3RhYmluZGV4XSwgW2NvbnRlbnRFZGl0YWJsZV0iKX0saXNUYWJiYWJsZTpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShmKSYmCmQuY2FsbChmLCc6bm90KFt0YWJpbmRleFx4M2QiLTEiXSknKSYmdGhpcy5faXNWaXNpYmxlKGYpfSxfbm9ybWFsaXplZFRhYkluZGV4OmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmlzRm9jdXNhYmxlKGYpPyhmPWYuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwwLE51bWJlcihmKSk6LTF9LF9jb2xsZWN0VGFiYmFibGVOb2RlczpmdW5jdGlvbihmLGgpe2lmKGYubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERXx8IXRoaXMuX2lzVmlzaWJsZShmKSlyZXR1cm4hMTt2YXIgaz10aGlzLl9ub3JtYWxpemVkVGFiSW5kZXgoZikscj0wPGs7MDw9ayYmaC5wdXNoKGYpO2Y9ImNvbnRlbnQiPT09Zi5sb2NhbE5hbWV8fCJzbG90Ij09PWYubG9jYWxOYW1lP1BvbHltZXIuZG9tKGYpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpQb2x5bWVyLmRvbShmLnJvb3R8fGYpLmNoaWxkcmVuO2ZvcihrPTA7azxmLmxlbmd0aDtrKyspcj10aGlzLl9jb2xsZWN0VGFiYmFibGVOb2RlcyhmW2tdLGgpfHxyOwpyZXR1cm4gcn0sX2lzVmlzaWJsZTpmdW5jdGlvbihmKXt2YXIgaD1mLnN0eWxlO3JldHVybiJoaWRkZW4iIT09aC52aXNpYmlsaXR5JiYibm9uZSIhPT1oLmRpc3BsYXk/KGg9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZiksImhpZGRlbiIhPT1oLnZpc2liaWxpdHkmJiJub25lIiE9PWguZGlzcGxheSk6ITF9LF9zb3J0QnlUYWJJbmRleDpmdW5jdGlvbihmKXt2YXIgaD1mLmxlbmd0aDtpZigyPmgpcmV0dXJuIGY7dmFyIGs9TWF0aC5jZWlsKGgvMik7aD10aGlzLl9zb3J0QnlUYWJJbmRleChmLnNsaWNlKDAsaykpO2Y9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZi5zbGljZShrKSk7cmV0dXJuIHRoaXMuX21lcmdlU29ydEJ5VGFiSW5kZXgoaCxmKX0sX21lcmdlU29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZixoKXtmb3IodmFyIGs9W107MDxmLmxlbmd0aCYmMDxoLmxlbmd0aDspdGhpcy5faGFzTG93ZXJUYWJPcmRlcihmWzBdLGhbMF0pP2sucHVzaChoLnNoaWZ0KCkpOmsucHVzaChmLnNoaWZ0KCkpOwpyZXR1cm4gay5jb25jYXQoZixoKX0sX2hhc0xvd2VyVGFiT3JkZXI6ZnVuY3Rpb24oZixoKXtmPU1hdGgubWF4KGYudGFiSW5kZXgsMCk7aD1NYXRoLm1heChoLnRhYkluZGV4LDApO3JldHVybiAwPT09Znx8MD09PWg/aD5mOmY+aH19fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1vdmVybGF5LWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7b3BlbmVkOntvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNhbmNlbGVkOntvYnNlcnZlcjoiX2NhbmNlbGVkQ2hhbmdlZCIscmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExfSx3aXRoQmFja2Ryb3A6e29ic2VydmVyOiJfd2l0aEJhY2tkcm9wQ2hhbmdlZCIsdHlwZTpCb29sZWFufSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uRXNjS2V5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2luZ1JlYXNvbjp7dHlwZTpPYmplY3R9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dDbGlja1Rocm91Z2g6e3R5cGU6Qm9vbGVhbn0sYWx3YXlzT25Ub3A6e3R5cGU6Qm9vbGVhbn0sCnNjcm9sbEFjdGlvbjp7dHlwZTpTdHJpbmd9LF9tYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlcn0sX2ZvY3VzZWRDaGlsZDp7dHlwZTpPYmplY3R9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vbklyb25SZXNpemUifSxvYnNlcnZlcnM6WyJfX3VwZGF0ZVNjcm9sbE9ic2VydmVycyhpc0F0dGFjaGVkLCBvcGVuZWQsIHNjcm9sbEFjdGlvbikiXSxnZXQgYmFja2Ryb3BFbGVtZW50KCl7cmV0dXJuIHRoaXMuX21hbmFnZXIuYmFja2Ryb3BFbGVtZW50fSxnZXQgX2ZvY3VzTm9kZSgpe3JldHVybiB0aGlzLl9mb2N1c2VkQ2hpbGR8fFBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoIlthdXRvZm9jdXNdIil8fHRoaXN9LGdldCBfZm9jdXNhYmxlTm9kZXMoKXtyZXR1cm4gUG9seW1lci5Jcm9uRm9jdXNhYmxlc0hlbHBlci5nZXRUYWJiYWJsZU5vZGVzKHRoaXMpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0KdGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGw7dGhpcy5fX3JhZnM9e307dGhpcy5fX3Njcm9sbFRvcD10aGlzLl9fc2Nyb2xsTGVmdD10aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsO3RoaXMuX19vbkNhcHR1cmVTY3JvbGw9dGhpcy5fX29uQ2FwdHVyZVNjcm9sbC5iaW5kKHRoaXMpO3RoaXMuX19yb290Tm9kZXM9bnVsbDt0aGlzLl9lbnN1cmVTZXR1cCgpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiZ0aGlzLl9vcGVuZWRDaGFuZ2VkKHRoaXMub3BlbmVkKTt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXModGhpcy5fb25Ob2Rlc0NoYW5nZSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpO3RoaXMuX29ic2VydmVyPW51bGw7Zm9yKHZhciBiIGluIHRoaXMuX19yYWZzKW51bGwhPT0KdGhpcy5fX3JhZnNbYl0mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX19yYWZzW2JdKTt0aGlzLl9fcmFmcz17fTt0aGlzLl9tYW5hZ2VyLnJlbW92ZU92ZXJsYXkodGhpcyk7dGhpcy5fX2lzQW5pbWF0aW5nJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6KHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSkpfSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSEwfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMX0sY2FuY2VsOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNhbmNlbGVkIixiLHtjYW5jZWxhYmxlOiEwfSkuZGVmYXVsdFByZXZlbnRlZHx8KHRoaXMuX3NldENhbmNlbGVkKCEwKSx0aGlzLm9wZW5lZD0KITEpfSxpbnZhbGlkYXRlVGFiYmFibGVzOmZ1bmN0aW9uKCl7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbH0sX2Vuc3VyZVNldHVwOmZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheVNldHVwfHwodGhpcy5fb3ZlcmxheVNldHVwPSEwLHRoaXMuc3R5bGUub3V0bGluZT0ibm9uZSIsdGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIil9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19pc0FuaW1hdGluZz0hMCx0aGlzLl9fZGVyYWYoIl9fb3BlbmVkQ2hhbmdlZCIsdGhpcy5fX29wZW5lZENoYW5nZWQpKX0sX2NhbmNlbGVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fHt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jYW5jZWxlZD0KdGhpcy5jYW5jZWxlZH0sX3dpdGhCYWNrZHJvcENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLndpdGhCYWNrZHJvcCYmIXRoaXMuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpPyh0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMCk6dGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4JiYodGhpcy5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4IiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSExKTt0aGlzLm9wZW5lZCYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9tYW5hZ2VyLnRyYWNrQmFja2Ryb3AoKX0sX3ByZXBhcmVSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50O3RoaXMuX3ByZXBhcmVQb3NpdGlvbmluZygpO3RoaXMucmVmaXQoKTt0aGlzLl9maW5pc2hQb3NpdGlvbmluZygpO3RoaXMubm9BdXRvRm9jdXMmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT0KdGhpcy5fZm9jdXNOb2RlJiYodGhpcy5fZm9jdXNOb2RlLmJsdXIoKSx0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZS5mb2N1cygpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF9maW5pc2hSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLm5vdGlmeVJlc2l6ZSgpO3RoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1vcGVuZWQiKX0sX2ZpbmlzaFJlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zdHlsZS56SW5kZXg9IiI7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktY2xvc2VkIix0aGlzLmNsb3NpbmdSZWFzb24pfSxfcHJlcGFyZVBvc2l0aW9uaW5nOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS50cmFuc2l0aW9uPQp0aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249Im5vbmUiO3RoaXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJub25lIjt0aGlzLnN0eWxlLmRpc3BsYXk9IiJ9LF9maW5pc2hQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3A7dGhpcy5zdHlsZS50cmFuc2l0aW9uPXRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbj0iIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLnN0eWxlLmRpc3BsYXk9IiI7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3B9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7aWYodGhpcy5vcGVuZWQpdGhpcy5ub0F1dG9Gb2N1c3x8dGhpcy5fZm9jdXNOb2RlLmZvY3VzKCk7ZWxzZXt0aGlzLl9mb2N1c05vZGUuYmx1cigpO3RoaXMuX2ZvY3VzZWRDaGlsZD1udWxsO2lmKHRoaXMucmVzdG9yZUZvY3VzT25DbG9zZSYmCnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlKXt2YXIgYj10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50OyhiPT09ZG9jdW1lbnQuYm9keXx8UG9seW1lci5kb20odGhpcykuZGVlcENvbnRhaW5zKGIpKSYmdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKX10aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsOyhiPXRoaXMuX21hbmFnZXIuY3VycmVudE92ZXJsYXkoKSkmJnRoaXMhPT1iJiZiLl9hcHBseUZvY3VzKCl9fSxfb25DYXB0dXJlQ2xpY2s6ZnVuY3Rpb24oYil7dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrfHx0aGlzLmNhbmNlbChiKX0sX29uQ2FwdHVyZUZvY3VzOmZ1bmN0aW9uKGIpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXRoOy0xPT09ZC5pbmRleE9mKHRoaXMpPyhiLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2FwcGx5Rm9jdXMoKSk6dGhpcy5fZm9jdXNlZENoaWxkPWRbMF19fSxfb25DYXB0dXJlRXNjOmZ1bmN0aW9uKGIpe3RoaXMubm9DYW5jZWxPbkVzY0tleXx8CnRoaXMuY2FuY2VsKGIpfSxfb25DYXB0dXJlVGFiOmZ1bmN0aW9uKGIpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt0aGlzLl9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlcygpO3ZhciBkPWIuc2hpZnRLZXksZj1kP3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlO2Q9ZD90aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZTtpZihmPT09ZClmPSEwO2Vsc2V7dmFyIGg9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDtmPWg9PT1mfHxoPT09dGhpc31mJiYoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzZWRDaGlsZD1kLHRoaXMuX2FwcGx5Rm9jdXMoKSl9fSxfb25Jcm9uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJnRoaXMuX19kZXJhZigicmVmaXQiLHRoaXMucmVmaXQpfSxfb25Ob2Rlc0NoYW5nZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiYKKHRoaXMuaW52YWxpZGF0ZVRhYmJhYmxlcygpLHRoaXMubm90aWZ5UmVzaXplKCkpfSxfX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXM6ZnVuY3Rpb24oKXtpZighdGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZXx8IXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZSl7dmFyIGI9dGhpcy5fZm9jdXNhYmxlTm9kZXM7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT1iWzBdO3RoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1iW2IubGVuZ3RoLTFdfX0sX19vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/KHRoaXMuX3ByZXBhcmVSZW5kZXJPcGVuZWQoKSx0aGlzLl9tYW5hZ2VyLmFkZE92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlck9wZW5lZCgpKToodGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJDbG9zZWQoKSl9LF9fZGVyYWY6ZnVuY3Rpb24oYixkKXt2YXIgZj10aGlzLl9fcmFmczsKbnVsbCE9PWZbYl0mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZbYl0pO2ZbYl09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZltiXT1udWxsO2QuY2FsbCh0aGlzKX0uYmluZCh0aGlzKSl9LF9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzOmZ1bmN0aW9uKGIsZCxmKXtiJiZkJiZ0aGlzLl9faXNWYWxpZFNjcm9sbEFjdGlvbihmKT8oImxvY2siPT09ZiYmKHRoaXMuX19zYXZlU2Nyb2xsUG9zaXRpb24oKSxQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyLnB1c2hTY3JvbGxMb2NrKHRoaXMpKSx0aGlzLl9fYWRkU2Nyb2xsTGlzdGVuZXJzKCkpOihQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyLnJlbW92ZVNjcm9sbExvY2sodGhpcyksdGhpcy5fX3JlbW92ZVNjcm9sbExpc3RlbmVycygpKX0sX19hZGRTY3JvbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Jvb3ROb2Rlcyl7dGhpcy5fX3Jvb3ROb2Rlcz1bXTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdylmb3IodmFyIGI9CnRoaXM7YjspYi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmYi5ob3N0JiZ0aGlzLl9fcm9vdE5vZGVzLnB1c2goYiksYj1iLmhvc3R8fGIuYXNzaWduZWRTbG90fHxiLnBhcmVudE5vZGU7dGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGRvY3VtZW50KX10aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSx0aGlzKX0sX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl9fcm9vdE5vZGVzJiZ0aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24oYil7Yi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSx0aGlzKTt0aGlzLmlzQXR0YWNoZWR8fCh0aGlzLl9fcm9vdE5vZGVzPW51bGwpfSxfX2lzVmFsaWRTY3JvbGxBY3Rpb246ZnVuY3Rpb24oYil7cmV0dXJuImxvY2siPT09CmJ8fCJyZWZpdCI9PT1ifHwiY2FuY2VsIj09PWJ9LF9fb25DYXB0dXJlU2Nyb2xsOmZ1bmN0aW9uKGIpe2lmKCEodGhpcy5fX2lzQW5pbWF0aW5nfHwwPD1Qb2x5bWVyLmRvbShiKS5wYXRoLmluZGV4T2YodGhpcykpKXN3aXRjaCh0aGlzLnNjcm9sbEFjdGlvbil7Y2FzZSAibG9jayI6dGhpcy5fX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbigpO2JyZWFrO2Nhc2UgInJlZml0Ijp0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KTticmVhaztjYXNlICJjYW5jZWwiOnRoaXMuY2FuY2VsKGIpfX0sX19zYXZlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyh0aGlzLl9fc2Nyb2xsVG9wPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuX19zY3JvbGxMZWZ0PWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCk6KHRoaXMuX19zY3JvbGxUb3A9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwKZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApLHRoaXMuX19zY3JvbGxMZWZ0PU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkpfSxfX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe2RvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ/KGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxUb3AsZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxMZWZ0PXRoaXMuX19zY3JvbGxMZWZ0KTooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0PWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCl9fTtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3I9W1BvbHltZXIuSXJvbkZpdEJlaGF2aW9yLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLApQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsXX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRhYmxlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxlbnRyeUFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9lbnRyeUFuaW1hdGlvbkNoYW5nZWQiLHR5cGU6U3RyaW5nfSxleGl0QW5pbWF0aW9uOntvYnNlcnZlcjoiX2V4aXRBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ319LF9lbnRyeUFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZW50cnk9W3tuYW1lOnRoaXMuZW50cnlBbmltYXRpb24sbm9kZTp0aGlzfV19LF9leGl0QW5pbWF0aW9uQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uQ29uZmlnPXRoaXMuYW5pbWF0aW9uQ29uZmlnfHx7fTt0aGlzLmFuaW1hdGlvbkNvbmZpZy5leGl0PVt7bmFtZTp0aGlzLmV4aXRBbmltYXRpb24sbm9kZTp0aGlzfV19LF9jb3B5UHJvcGVydGllczpmdW5jdGlvbihiLApkKXtmb3IodmFyIGYgaW4gZCliW2ZdPWRbZl19LF9jbG9uZUNvbmZpZzpmdW5jdGlvbihiKXt2YXIgZD17aXNDbG9uZTohMH07dGhpcy5fY29weVByb3BlcnRpZXMoZCxiKTtyZXR1cm4gZH0sX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZTpmdW5jdGlvbihiLGQsZil7aWYodGhpcy5hbmltYXRpb25Db25maWcpaWYodGhpcy5hbmltYXRpb25Db25maWcudmFsdWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWcudmFsdWUpdGhpcy5fd2Fybih0aGlzLl9sb2dmKCJwbGF5QW5pbWF0aW9uIiwiUGxlYXNlIHB1dCAnYW5pbWF0aW9uQ29uZmlnJyBpbnNpZGUgb2YgeW91ciBjb21wb25lbnRzICdwcm9wZXJ0aWVzJyBvYmplY3QgaW5zdGVhZCBvZiBvdXRzaWRlIG9mIGl0LiIpKTtlbHNle3ZhciBoPWI/dGhpcy5hbmltYXRpb25Db25maWdbYl06dGhpcy5hbmltYXRpb25Db25maWc7QXJyYXkuaXNBcnJheShoKXx8KGg9W2hdKTtpZihoKWZvcih2YXIgayxyPTA7az0KaFtyXTtyKyspaWYoay5hbmltYXRhYmxlKWsuYW5pbWF0YWJsZS5fZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlKGsudHlwZXx8YixkLGYpO2Vsc2UgaWYoay5pZCl7dmFyIGw9ZFtrLmlkXTtsPyhsLmlzQ2xvbmV8fChkW2suaWRdPXRoaXMuX2Nsb25lQ29uZmlnKGwpLGw9ZFtrLmlkXSksdGhpcy5fY29weVByb3BlcnRpZXMobCxrKSk6ZFtrLmlkXT1rfWVsc2UgZi5wdXNoKGspfX0sZ2V0QW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKGIpe3ZhciBkPXt9LGY9W107dGhpcy5fZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlKGIsZCxmKTtmb3IodmFyIGggaW4gZClmLnB1c2goZFtoXSk7cmV0dXJuIGZ9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1ydW5uZXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGw9e19jb25maWd1cmVBbmltYXRpb25zOmZ1bmN0aW9uKGIpe3ZhciBkPVtdLGY9W107aWYoMDxiLmxlbmd0aClmb3IodmFyIGgsaz0wO2g9YltrXTtrKyspe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaC5uYW1lKTtpZihyLmlzTmVvbkFuaW1hdGlvbil7dmFyIGw9bnVsbDtyLmNvbmZpZ3VyZXx8KHIuY29uZmlndXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9KTtsPXIuY29uZmlndXJlKGgpO2YucHVzaCh7cmVzdWx0OmwsY29uZmlnOmh9KX1lbHNlIGNvbnNvbGUud2Fybih0aGlzLmlzKyI6IixoLm5hbWUsIm5vdCBmb3VuZCEiKX1mb3IoYj0wO2I8Zi5sZW5ndGg7YisrKXtsPWZbYl0ucmVzdWx0O2g9ZltiXS5jb25maWc7dHJ5eyJmdW5jdGlvbiIhPXR5cGVvZiBsLmNhbmNlbCYmKGw9ZG9jdW1lbnQudGltZWxpbmUucGxheShsKSl9Y2F0Y2gocCl7bD1udWxsLGNvbnNvbGUud2FybigiQ291bGRudCBwbGF5IiwKIigiLGgubmFtZSwiKS4iLHApfWwmJmQucHVzaCh7bmVvbkFuaW1hdGlvbjpyLGNvbmZpZzpoLGFuaW1hdGlvbjpsfSl9cmV0dXJuIGR9LF9zaG91bGRDb21wbGV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGQ9ITAsZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKCJmaW5pc2hlZCIhPWJbZl0uYW5pbWF0aW9uLnBsYXlTdGF0ZSl7ZD0hMTticmVha31yZXR1cm4gZH0sX2NvbXBsZXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF0ubmVvbkFuaW1hdGlvbi5jb21wbGV0ZShiW2RdLmNvbmZpZyk7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdLmFuaW1hdGlvbi5jYW5jZWwoKX0scGxheUFuaW1hdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPXRoaXMuZ2V0QW5pbWF0aW9uQ29uZmlnKGIpO2lmKGYpe3RoaXMuX2FjdGl2ZT10aGlzLl9hY3RpdmV8fHt9O3RoaXMuX2FjdGl2ZVtiXSYmKHRoaXMuX2NvbXBsZXRlKHRoaXMuX2FjdGl2ZVtiXSksZGVsZXRlIHRoaXMuX2FjdGl2ZVtiXSk7CnZhciBoPXRoaXMuX2NvbmZpZ3VyZUFuaW1hdGlvbnMoZik7aWYoMD09aC5sZW5ndGgpdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGQse2J1YmJsZXM6ITF9KTtlbHNlIGZvcih0aGlzLl9hY3RpdmVbYl09aCxmPTA7ZjxoLmxlbmd0aDtmKyspaFtmXS5hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRDb21wbGV0ZShoKSYmKHRoaXMuX2NvbXBsZXRlKGgpLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYl0sdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGQse2J1YmJsZXM6ITF9KSl9LmJpbmQodGhpcyl9fSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGIgaW4gdGhpcy5fYWN0aXZlKXt2YXIgZD10aGlzLl9hY3RpdmVbYl0sZjtmb3IoZiBpbiBkKWRbZl0uYW5pbWF0aW9uLmNhbmNlbCgpfXRoaXMuX2FjdGl2ZT17fX19OwpQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcj1bUG9seW1lci5OZW9uQW5pbWF0YWJsZUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1kcm9wZG93bi9pcm9uLWRyb3Bkb3duLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uRHJvcGRvd25TY3JvbGxNYW5hZ2VyPVBvbHltZXIuSXJvblNjcm9sbE1hbmFnZXJ9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0aW9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FuaW1hdGlvblRpbWluZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246NTAwLGVhc2luZzoiY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSIsZmlsbDoiYm90aCJ9fX19LGlzTmVvbkFuaW1hdGlvbjohMCxjcmVhdGVkOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5hbmltYXRlfHxjb25zb2xlLndhcm4oIk5vIHdlYiBhbmltYXRpb25zIGRldGVjdGVkLiBUaGlzIGVsZW1lbnQgd2lsbCBub3QgZnVuY3Rpb24gd2l0aG91dCBhIHdlYiBhbmltYXRpb25zIHBvbHlmaWxsLiIpfSx0aW1pbmdGcm9tQ29uZmlnOmZ1bmN0aW9uKGIpe2lmKGIudGltaW5nKWZvcih2YXIgZCBpbiBiLnRpbWluZyl0aGlzLmFuaW1hdGlvblRpbWluZ1tkXT1iLnRpbWluZ1tkXTtyZXR1cm4gdGhpcy5hbmltYXRpb25UaW1pbmd9LHNldFByZWZpeGVkUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2Zvcih2YXIgaD0Ke3RyYW5zZm9ybTpbIndlYmtpdFRyYW5zZm9ybSJdLHRyYW5zZm9ybU9yaWdpbjpbIm1velRyYW5zZm9ybU9yaWdpbiIsIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdfVtkXSxrLHI9MDtrPWhbcl07cisrKWIuc3R5bGVba109ZjtiLnN0eWxlW2RdPWZ9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vYW5pbWF0aW9ucy9mYWRlLWluLWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLWluLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGIubm9kZSxbe29wYWNpdHk6IjAifSx7b3BhY2l0eToiMSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1vdXQtYW5pbWF0aW9uLmh0bWwuanMKUG9seW1lcih7aXM6ImZhZGUtb3V0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGIubm9kZSxbe29wYWNpdHk6IjEifSx7b3BhY2l0eToiMCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLW1lbnUtYnV0dG9uL3BhcGVyLW1lbnUtYnV0dG9uLWFuaW1hdGlvbnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7aGVpZ2h0OmYvMisicHgifSx7aGVpZ2h0OmYrInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7UG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy13aWR0aC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3t3aWR0aDpmLzIrInB4In0se3dpZHRoOmYrInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7ClBvbHltZXIoe2lzOiJwYXBlci1tZW51LXNocmluay13aWR0aC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3t3aWR0aDpmKyJweCJ9LHt3aWR0aDpmLWYvMjArInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7ClBvbHltZXIoe2lzOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7dGhpcy5zZXRQcmVmaXhlZFByb3BlcnR5KGQsInRyYW5zZm9ybU9yaWdpbiIsIjAgMCIpO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3toZWlnaHQ6ZisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgwKSJ9LHtoZWlnaHQ6Zi8yKyJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKC0yMHB4KSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5hbWUrIjoiK2J9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYixkKXt0aGlzLnJlbW92ZUljb24oYik7CmlmKGQ9dGhpcy5fY2xvbmVJY29uKGQsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGIpKSl7dmFyIGY9UG9seW1lci5kb20oYi5yb290fHxiKTtmLmluc2VydEJlZm9yZShkLGYuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGIuX3N2Z0ljb249ZH1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihiKXtiLl9zdmdJY29uJiYoUG9seW1lci5kb20oYi5yb290fHxiKS5yZW1vdmVDaGlsZChiLl9zdmdJY29uKSxiLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYil7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYiYmYi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGI9Yi5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YiYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYj1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZC5pZF09ZH0pO3JldHVybiBifSxfY2xvbmVJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2JdLAp0aGlzLnNpemUsZCl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYixkLGYpe2lmKGIpe2I9Yi5jbG9uZU5vZGUoITApO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtkPWIuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitkKyIgIitkO3ZhciBrPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtmJiZiLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoays9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtoLnNldEF0dHJpYnV0ZSgidmlld0JveCIsZCk7aC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7aC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7aC5zdHlsZS5jc3NUZXh0PQprO2guYXBwZW5kQ2hpbGQoYikucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBofXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1ifTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpeyghYnx8MD5iLmluZGV4T2YoZCkpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChkLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYil9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihiLGQpe2lmKG51bGwhPWImJmQhPT10aGlzLmlzU2VsZWN0ZWQoYikpe2lmKGQpdGhpcy5zZWxlY3Rpb24ucHVzaChiKTtlbHNle3ZhciBmPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYik7MDw9ZiYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGYsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhiLGQpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGIpOnRoaXMuZ2V0KCkhPT1iJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYil7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhdGhpcy5pc1NlbGVjdGVkKGIpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGIpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZD1ifSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXMubGVuZ3RoO2I9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYiklYjt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGIpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmxpc3Rlbih0aGlzLGIsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMudW5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGQpO3RoaXMuX2FkZExpc3RlbmVyKGIpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGIsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhiKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBiPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2I/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChiKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYi5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYildfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGIpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGYpPT1iKXJldHVybiBkfWVsc2UgcmV0dXJuIE51bWJlcihiKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYj10aGlzLml0ZW1zW2JdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYil9ZWxzZSByZXR1cm4gYn0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGI9dGhpcy5pbmRleE9mKGIpLC0xPT09Yj9udWxsOmI7dmFyIGQ9YltQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWQ/ZDpiLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihiLGQpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZCxiKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGQsYik7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGQ/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06Yn0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIFBvbHltZXIuZG9tKGIpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihkKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApkLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7Zm9yKHZhciBkPXRoaXMuaXRlbXM7YiYmYiE9dGhpczspe3ZhciBmPWQuaW5kZXhPZihiKTtpZigwPD1mKXtkPXRoaXMuX2luZGV4VG9WYWx1ZShmKTt0aGlzLl9pdGVtQWN0aXZhdGUoZCxiKTticmVha31iPWIucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYixkKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDpiLGl0ZW06ZH0se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChiKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYik6dGhpcy5zZWxlY3RlZD1ifSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWI7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihiKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gbnVsbCE9Yn0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYil7Yj0KYnx8W107Yj0odGhpcy5fdmFsdWVzVG9JdGVtcyhiKXx8W10pLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9PWYmJnZvaWQgMCE9PWZ9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYik7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChiW2RdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYiksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIubGVuZ3RoP2JbMF06bnVsbCkpOm51bGwhPT1iJiZ2b2lkIDAhPT1iPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtiXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShiKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYik7MD5kP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGIpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZCwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWI/bnVsbDpiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oZCl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtkJiZkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGQpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGQ9PT1iPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGIpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGIua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgZD10aGlzLl9zZWFyY2hUZXh0fHwiIjtkKz0oYi5rZXkmJjE9PWIua2V5Lmxlbmd0aD9iLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGIua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmI9ZC5sZW5ndGg7Zm9yKHZhciBmPTAsaDtoPXRoaXMuaXRlbXNbZl07ZisrKWlmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2s9KGhba118fGguZ2V0QXR0cmlidXRlKGspfHwiIikudHJpbSgpO2lmKCEoay5sZW5ndGg8YikmJmsuc2xpY2UoMCxiKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1kKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1kO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjwKYisxO2YrKyl7dmFyIGg9dGhpcy5pdGVtc1soZC1mK2IpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aCxkPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGY9MTtmPGIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQrZiklYl07aWYoIWguaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgaz1Qb2x5bWVyLmRvbShoKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7aWYoUG9seW1lci5kb20oaykuYWN0aXZlRWxlbWVudD09aClicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXtkP2Iuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTpiLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYnx8Yi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChiLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYi5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXtiLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihiKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0LGI9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBiLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGIpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgZD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2Q/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c2VkSXRlbTtiJiZiLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJvcHRpb24iLHRhYmluZGV4OiIwIn19O1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9ySW1wbF07CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIGFjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHIpe2xldCBsOyhmdW5jdGlvbihtKXttW20uTkFUVVJBTD0wXT0iTkFUVVJBTCI7bVttLlJFQUw9MV09IlJFQUwiO21bbS5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjttW20uRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGx8fChsPXt9KSk7bGV0IHA9bC5OQVRVUkFMO2Zvcig7cjxrLmxlbmd0aDtyKyspaWYocD09PWwuTkFUVVJBTClpZigiLiI9PT1rW3JdKXA9bC5SRUFMO2Vsc2UgaWYoImUiPT09a1tyXXx8IkUiPT09a1tyXSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbcl0pKWJyZWFrfWVsc2UgaWYocD09PWwuUkVBTClpZigiZSI9PT1rW3JdfHwiRSI9PT1rW3JdKXA9bC5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWYoa1tyXSkpYnJlYWt9ZWxzZSBpZihwPT09bC5FWFBPTkVOVF9TSUdOKWlmKGYoa1tyXSl8fCIrIj09PWtbcl18fCItIj09PWtbcl0pcD1sLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihwPT09bC5FWFBPTkVOVCYmCiFmKGtbcl0pKWJyZWFrO3JldHVybiByfWZ1bmN0aW9uIGYoayl7cmV0dXJuIjAiPD1rJiYiOSI+PWt9ZnVuY3Rpb24gaChrKXtyZXR1cm4iLyI9PT1rfHwiXyI9PT1rfHxmKGspfWIuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGsscil7bGV0IGw9MCxwPTA7Zm9yKDs7KXtpZihsPT09ay5sZW5ndGgpcmV0dXJuIHA9PT1yLmxlbmd0aD8wOi0xO2lmKHA9PT1yLmxlbmd0aClyZXR1cm4gMTtpZihmKGtbbF0pJiZmKHJbcF0pKXt2YXIgbT1sLG49cDtsPWQoayxsKzEpO3A9ZChyLHArMSk7bT1wYXJzZUZsb2F0KGsuc2xpY2UobSxsKSk7bj1wYXJzZUZsb2F0KHIuc2xpY2UobixwKSk7aWYobTxuKXJldHVybi0xO2lmKG0+bilyZXR1cm4gMX1lbHNle2lmKGgoa1tsXSkpe2lmKCFoKHJbcF0pKXJldHVybi0xfWVsc2V7aWYoaChyW3BdKSlyZXR1cm4gMTtpZihrW2xdPHJbcF0pcmV0dXJuLTE7aWYoa1tsXT5yW3BdKXJldHVybiAxfWwrKztwKyt9fX19KShhY3x8KGFjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgZGM7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHEsdSx3LEEpe2NvbnN0IHk9bmV3IFhNTEh0dHBSZXF1ZXN0O3kub3BlbihxLHUpO3cmJih5LndpdGhDcmVkZW50aWFscz13KTtBJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsQSk7cmV0dXJuIHl9ZnVuY3Rpb24gZihxKXtjb25zdCB1PW5ldyBtO2lmKCFxKXJldHVybiB1Lm1ldGhvZFR5cGU9cC5HRVQsdTt1Lm1ldGhvZFR5cGU9cC5QT1NUO3UuYm9keT1oKHEpO3JldHVybiB1fWZ1bmN0aW9uIGgocSl7Y29uc3QgdT1uZXcgRm9ybURhdGE7Zm9yKGxldCB3IGluIHEpdyYmdS5hcHBlbmQodyxxW3ddKTtyZXR1cm4gdX1jbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Yi5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9aztjbGFzcyByIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSl7c3VwZXIocSk7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHIucHJvdG90eXBlKX19Yi5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj1yO2NsYXNzIGwgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihxLHUpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Euc3RhdHVzfSBhdCAke3V9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXE7dGhpcy51cmw9dX19Yi5SZXF1ZXN0TmV0d29ya0Vycm9yPWw7bGV0IHA7KGZ1bmN0aW9uKHEpe3EuR0VUPSJHRVQiO3EuUE9TVD0iUE9TVCJ9KShwPWIuSHR0cE1ldGhvZFR5cGV8fChiLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgbXt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXAuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IHIoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319Yi5SZXF1ZXN0T3B0aW9ucz0KbTtjbGFzcyBue2NvbnN0cnVjdG9yKHE9MUUzLHU9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXE7dGhpcy5fbWF4UmV0cmllcz11fXJlcXVlc3QocSx1KXt1PWYodSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHEsdSl9cmVxdWVzdFdpdGhPcHRpb25zKHEsdSl7dS52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgodyxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6dyxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHRoaXMuX21heFJldHJpZXMsdSkpLnRoZW4odz0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4gd30sdz0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXcubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh3KX0pfWZldGNoKHEsdSl7cmV0dXJuKG5ldyBQcm9taXNlKCh3LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp3LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgdz0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHEsdSkudGhlbih4PT57IXgub2smJnRoaXMuX21heFJldHJpZXM+dz8odysrLHkoKSk6KEEoeCksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGsoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHEsdSx3KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21VcmwocSx3KS50aGVuKEE9PkEsQT0+MDx1P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHEsdS0xLHcpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21VcmwocSx1KXtyZXR1cm4gbmV3IFByb21pc2UoKHcsQSk9Pntjb25zdCB5PWQodS5tZXRob2RUeXBlLHEsdS53aXRoQ3JlZGVudGlhbHMsdS5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz93KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBsKHkscSkpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBsKHksCnEpKX07dS5ib2R5P3kuc2VuZCh1LmJvZHkpOnkuc2VuZCgpfSl9fWIuUmVxdWVzdE1hbmFnZXI9bn0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZikucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9Yi5hZGRQYXJhbXM9ZnVuY3Rpb24oZixoKXt2YXIgaz1PYmplY3Qua2V5cyhoKS5zb3J0KCkuZmlsdGVyKGw9PnZvaWQgMCE9PWhbbF0pO2lmKCFrLmxlbmd0aClyZXR1cm4gZjtjb25zdCByPS0xIT09Zi5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtrPVtdLmNvbmNhdCguLi5rLm1hcChsPT57Y29uc3QgcD1oW2xdO3JldHVybihBcnJheS5pc0FycmF5KHApP3A6W3BdKS5tYXAobT0+YCR7bH09JHtkKG0pfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZityK2t9fSkoZGN8fChkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHI9ImRhdGEiLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSl7Ii8iPT09cltyLmxlbmd0aC0xXSYmKHI9ci5zbGljZSgwLHIubGVuZ3RoLTEpKTtyZXR1cm57ZW52aXJvbm1lbnQ6KCk9PmYociwiL2Vudmlyb25tZW50IiksZXhwZXJpbWVudHM6KCk9PmYociwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KHAsbSxuKT0+ZihyKyIvcGx1Z2luIixgLyR7cH0ke219YCxuKSxwbHVnaW5zTGlzdGluZzooKT0+ZihyLCIvcGx1Z2luc19saXN0aW5nIixoKHtbImV4cGVyaW1lbnRhbFBsdWdpbiJdOmwuZ2V0QWxsKCJleHBlcmltZW50YWxQbHVnaW4iKX0pKSxydW5zOigpPT5mKHIsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6cD0+ZihyLCIvZXhwZXJpbWVudF9ydW5zIixoKHtleHBlcmltZW50OlN0cmluZyhwKX0pKX19ZnVuY3Rpb24gZihyLGwscD1uZXcgVVJMU2VhcmNoUGFyYW1zKXtyKz1sO1N0cmluZyhwKSYmCihsPWwuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLHIrPWwrU3RyaW5nKHApKTtyZXR1cm4gcn1mdW5jdGlvbiBoKHI9e30pe2NvbnN0IGw9T2JqZWN0LmtleXMocikuc29ydCgpLmZpbHRlcihtPT5yW21dKSxwPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5mb3JFYWNoKG09Pntjb25zdCBuPXJbbV07KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2gocT0+cC5hcHBlbmQobSxxKSl9KTtyZXR1cm4gcH1sZXQgaz1kKCk7Yi5jcmVhdGVSb3V0ZXI9ZDtiLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBrfTtiLnNldFJvdXRlcj1mdW5jdGlvbihyKXtpZihudWxsPT1yKXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrcik7az1yfTtiLmNyZWF0ZVNlYXJjaFBhcmFtPWh9KShkY3x8KGRjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoaCl7dGhpcy5saXN0ZW5lcj1ofX1iLkxpc3RlbktleT1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBiLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGgpe2g9bmV3IGQoaCk7dGhpcy5fbGlzdGVuZXJzLmFkZChoKTtyZXR1cm4gaH1yZW1vdmVMaXN0ZW5lckJ5S2V5KGgpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoaCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGg9Pnt0cnl7aC5saXN0ZW5lcigpfWNhdGNoKGspe319KX19Yi5CYXNlU3RvcmU9Zn0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBiLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9Pntjb25zdCBrPXtkYXRhTG9jYXRpb246aC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmgud2luZG93X3RpdGxlfTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfbmFtZSYmKGsuZXhwZXJpbWVudE5hbWU9aC5leHBlcmltZW50X25hbWUpO3ZvaWQgMCE9PWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGsuZXhwZXJpbWVudERlc2NyaXB0aW9uPWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbik7dm9pZCAwIT09aC5jcmVhdGlvbl90aW1lJiYoay5jcmVhdGlvblRpbWU9aC5jcmVhdGlvbl90aW1lKTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxrKXx8KHRoaXMuZW52aXJvbm1lbnQ9ayx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8KdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1iLkVudmlyb25tZW50U3RvcmU9ZDtiLmVudmlyb25tZW50U3RvcmU9bmV3IGR9KShkY3x8KGRjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9leHBlcmltZW50c1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2V4cGVyaW1lbnRzPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkuZXhwZXJpbWVudHMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4oaD0+e18uaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cyxoKXx8KHRoaXMuX2V4cGVyaW1lbnRzPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Yi5FeHBlcmltZW50c1N0b3JlPWQ7Yi5leHBlcmltZW50c1N0b3JlPW5ldyBkfSkoZGN8fChkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcnVuc1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fcnVucyxoKXx8KHRoaXMuX3J1bnM9aCx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19Yi5SdW5zU3RvcmU9ZDtiLnJ1bnNTdG9yZT1uZXcgZH0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGIpe2IuVFlQRVM9W107Yi5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oZCl7cmV0dXJuIF8ua2V5cyhkKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZ2V0VGFncz1mdW5jdGlvbihkKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGQpKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZmlsdGVyVGFncz1mdW5jdGlvbihkLGYpe2xldCBoPVtdO2YuZm9yRWFjaChrPT5oPWguY29uY2F0KGRba10pKTtyZXR1cm4gXy51bmlxKGgpLnNvcnQoYWMuY29tcGFyZVRhZ05hbWVzKX19KShkY3x8KGRjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZil7Y29uc3QgaD10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBrPT5mKHt2YWx1ZTprLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09aH0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319Yi5DYW5jZWxsZXI9ZH0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy9jYXRlZ29yaXphdGlvblV0aWxzLmpzCnZhciBrYzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSxuKXtjb25zdCBxPSgoKT0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChuKX1jYXRjaCh1KXtyZXR1cm4gbnVsbH19KSgpO3JldHVybntuYW1lOm4sbWV0YWRhdGE6e3R5cGU6cC5TRUFSQ0hfUkVTVUxUUyx2YWxpZFJlZ2V4OiEhcSx1bml2ZXJzYWxSZWdleDoiLioiPT09bn0saXRlbXM6cT9tLmZpbHRlcih1PT51Lm1hdGNoKHEpKTpbXX19ZnVuY3Rpb24gZihtLG49Ii8iKXtjb25zdCBxPVtdLHU9e307bS5mb3JFYWNoKHc9Pnt2YXIgQT13LmluZGV4T2Yobik7QT0wPD1BP3cuc2xpY2UoMCxBKTp3O2lmKCF1W0FdKXtjb25zdCB5PXtuYW1lOkEsbWV0YWRhdGE6e3R5cGU6cC5QUkVGSVhfR1JPVVB9LGl0ZW1zOltdfTt1W0FdPXk7cS5wdXNoKHkpfXVbQV0uaXRlbXMucHVzaCh3KX0pO3JldHVybiBxfWZ1bmN0aW9uIGgobSxuPSIiKXtuPVtkKG0sbildO209ZihtKTtyZXR1cm5bXS5jb25jYXQobixtKX1mdW5jdGlvbiBrKG0sbixxKXtjb25zdCB1PQpkYy5nZXRUYWdzKG0pO3E9aCh1LHEpO2NvbnN0IHc9cihfLnBpY2sobSxuKSk7cmV0dXJuIHEubWFwKCh7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6eH0pPT4oe25hbWU6QSxtZXRhZGF0YTp5LGl0ZW1zOngubWFwKEM9Pih7dGFnOkMscnVuczoody5nZXQoQyl8fFtdKS5zbGljZSgpfSkpfSkpfWZ1bmN0aW9uIHIobSl7Y29uc3Qgbj1uZXcgTWFwO09iamVjdC5rZXlzKG0pLmZvckVhY2gocT0+e21bcV0uZm9yRWFjaCh1PT57Y29uc3Qgdz1uLmdldCh1KXx8W107dy5wdXNoKHEpO24uc2V0KHUsdyl9KX0pO3JldHVybiBufWZ1bmN0aW9uIGwobSxuKXtjb25zdCBxPWFjLmNvbXBhcmVUYWdOYW1lcyhtLnRhZyxuLnRhZyk7cmV0dXJuIDAhPXE/cTphYy5jb21wYXJlVGFnTmFtZXMobS5ydW4sbi5ydW4pfWxldCBwOyhmdW5jdGlvbihtKXttW20uU0VBUkNIX1JFU1VMVFM9MF09IlNFQVJDSF9SRVNVTFRTIjttW20uUFJFRklYX0dST1VQPTFdPSJQUkVGSVhfR1JPVVAifSkocD1iLkNhdGVnb3J5VHlwZXx8CihiLkNhdGVnb3J5VHlwZT17fSkpO2IuY2F0ZWdvcml6ZUJ5U2VhcmNoUXVlcnk9ZDtiLmNhdGVnb3JpemVCeVByZWZpeD1mO2IuY2F0ZWdvcml6ZT1oO2IuY2F0ZWdvcml6ZVRhZ3M9aztiLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnM9ZnVuY3Rpb24obSxuLHEpe3JldHVybiBrKG0sbixxKS5tYXAoZnVuY3Rpb24odSl7Y29uc3Qgdz1fLmZsYXR0ZW4odS5pdGVtcy5tYXAoKHt0YWc6QSxydW5zOnl9KT0+eS5tYXAoeD0+KHt0YWc6QSxydW46eH0pKSkpO3cuc29ydChsKTtyZXR1cm57bmFtZTp1Lm5hbWUsbWV0YWRhdGE6dS5tZXRhZGF0YSxpdGVtczp3fX0pfX0pKGtjfHwoa2M9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMuanMKdmFyIHhjOyhmdW5jdGlvbihiKXtsZXQgZD0hMTtiLnNldFVzZUhhc2g9ZnVuY3Rpb24oaCl7ZD1ofTtiLnVzZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZH07bGV0IGY9IiI7Yi5zZXRGYWtlSGFzaD1mdW5jdGlvbihoKXtmPWh9O2IuZ2V0RmFrZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZn19KSh4Y3x8KHhjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ2xvYmFscy9nbG9iYWxzLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1nbG9iYWxzIixfdGVtcGxhdGU6bnVsbCx0Zl9nbG9iYWxzOmJ9KX0pKHhjfHwoeGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL2xpc3RlbmVycy5qcwp2YXIgYmQ7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGspe3RoaXMubGlzdGVuZXI9a319Yi5MaXN0ZW5LZXk9ZDtjb25zdCBmPW5ldyBTZXQsaD1uZXcgU2V0O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e2YuZm9yRWFjaChrPT5rLmxpc3RlbmVyKCkpfSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCgpPT57aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTtiLmFkZEhhc2hMaXN0ZW5lcj1mdW5jdGlvbihrKXtrPW5ldyBkKGspO2YuYWRkKGspO3JldHVybiBrfTtiLmFkZFN0b3JhZ2VMaXN0ZW5lcj1mdW5jdGlvbihrKXtrPW5ldyBkKGspO2guYWRkKGspO3JldHVybiBrfTtiLmZpcmVTdG9yYWdlQ2hhbmdlZD1mdW5jdGlvbigpe2guZm9yRWFjaChrPT5rLmxpc3RlbmVyKCkpfTtiLnJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5PWZ1bmN0aW9uKGspe2YuZGVsZXRlKGspfTtiLnJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5PWZ1bmN0aW9uKGspe2guZGVsZXRlKGspfX0pKGJkfHwKKGJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS9zdG9yYWdlLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKG4scSl7ZnVuY3Rpb24gdSh4LEM9e30pe2NvbnN0IHtkZWZhdWx0VmFsdWU6Ryx1c2VMb2NhbFN0b3JhZ2U6RD0hMX09Qzt4PUQ/d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHgpOmwoaCgpKVt4XTtyZXR1cm4gdm9pZCAwPT14P18uY2xvbmVEZWVwKEcpOm4oeCl9ZnVuY3Rpb24gdyh4LEMsRz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpELHVzZUxvY2FsU3RvcmFnZTpCPSExLHVzZUxvY2F0aW9uUmVwbGFjZTpIPSExfT1HO0c9cShDKTtCPyh3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oeCxHKSxiLmZpcmVTdG9yYWdlQ2hhbmdlZCgpKTpfLmlzRXF1YWwoQyx1KHgse3VzZUxvY2FsU3RvcmFnZTpCfSkpfHwoXy5pc0VxdWFsKEMsRCk/cCh4KTooQz1sKGgoKSksQ1t4XT1HLGsocihDKSxIKSkpfWNvbnN0IEE9W10seT1bXTtyZXR1cm57Z2V0OnUsc2V0OncsZ2V0SW5pdGlhbGl6ZXI6ZnVuY3Rpb24oeCxDKXtjb25zdCBHPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTpDLmRlZmF1bHRWYWx1ZSwKcG9seW1lclByb3BlcnR5OngsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx4KSxCPSgpPT57Y29uc3QgSz11KEQsRyk7Xy5pc0VxdWFsKEssdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV0pfHwodGhpc1tHLnBvbHltZXJQcm9wZXJ0eV09Syl9LEg9KEcudXNlTG9jYWxTdG9yYWdlP2IuYWRkU3RvcmFnZUxpc3RlbmVyOmIuYWRkSGFzaExpc3RlbmVyKSgoKT0+QigpKTtHLnVzZUxvY2FsU3RvcmFnZT95LnB1c2goSCk6QS5wdXNoKEgpO0IoKTtyZXR1cm4gdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV19fSxnZXRPYnNlcnZlcjpmdW5jdGlvbih4LEMpe2NvbnN0IEc9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLHBvbHltZXJQcm9wZXJ0eTp4LHVzZUxvY2FsU3RvcmFnZTohMX0sQyk7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgRD1mKHRoaXMseCk7dyhELHRoaXNbRy5wb2x5bWVyUHJvcGVydHldLEcpfX0sZGlzcG9zZUJpbmRpbmc6ZnVuY3Rpb24oKXtBLmZvckVhY2goeD0+CmIucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXkoeCkpO3kuZm9yRWFjaCh4PT5iLnJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5KHgpKX19fWZ1bmN0aW9uIGYobixxKXtuPW5bYi5ESVNBTUJJR1VBVE9SXTtyZXR1cm4obnVsbD09bj9bcV06W24scV0pLmpvaW4oIi4iKX1mdW5jdGlvbiBoKCl7cmV0dXJuIHhjLnVzZUhhc2goKT93aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKTp4Yy5nZXRGYWtlSGFzaCgpfWZ1bmN0aW9uIGsobixxPSExKXt4Yy51c2VIYXNoKCk/cT93aW5kb3cubG9jYXRpb24ucmVwbGFjZSgiIyIrbik6d2luZG93LmxvY2F0aW9uLmhhc2g9bjp4Yy5zZXRGYWtlSGFzaChuKX1mdW5jdGlvbiByKG4pe2xldCBxPSIiO3ZvaWQgMCE9PW5bYi5UQUJdJiYocSs9bltiLlRBQl0pO2NvbnN0IHU9T2JqZWN0LmtleXMobikubWFwKHc9Plt3LG5bd11dKS5maWx0ZXIodz0+d1swXSE9PWIuVEFCKS5tYXAodz0+ZW5jb2RlVVJJQ29tcG9uZW50KHdbMF0pKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQod1sxXSkpLmpvaW4oIlx4MjYiKTsKcmV0dXJuIDA8dS5sZW5ndGg/cSsiXHgyNiIrdTpxfWZ1bmN0aW9uIGwobil7Y29uc3QgcT17fTtuLnNwbGl0KCJceDI2IikuZm9yRWFjaCh1PT57dT11LnNwbGl0KCJceDNkIik7MT09PXUubGVuZ3RoP3FbYi5UQUJdPXVbMF06Mj09PXUubGVuZ3RoJiYocVtkZWNvZGVVUklDb21wb25lbnQodVswXSldPWRlY29kZVVSSUNvbXBvbmVudCh1WzFdKSl9KTtyZXR1cm4gcX1mdW5jdGlvbiBwKG4pe2NvbnN0IHE9bChoKCkpO2RlbGV0ZSBxW25dO2socihxKSl9Yi5UQUI9Il9fdGFiX18iO2IuRElTQU1CSUdVQVRPUj0iZGlzYW1iaWd1YXRvciI7Yi51cmxEaWN0PXt9O2IuYWRkSGFzaExpc3RlbmVyKCgpPT57Yi51cmxEaWN0PWwoaCgpKX0pO3ZhciBtPWQobj0+bixuPT5uKTtiLmdldFN0cmluZz1tLmdldDtiLnNldFN0cmluZz1tLnNldDtiLmdldFN0cmluZ0luaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRTdHJpbmdPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZVN0cmluZ0JpbmRpbmc9Cm0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PiJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6dm9pZCAwLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXRCb29sZWFuPW0uZ2V0O2Iuc2V0Qm9vbGVhbj1tLnNldDtiLmdldEJvb2xlYW5Jbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0Qm9vbGVhbk9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+K24sbj0+bi50b1N0cmluZygpKTtiLmdldE51bWJlcj1tLmdldDtiLnNldE51bWJlcj1tLnNldDtiLmdldE51bWJlckluaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXROdW1iZXJPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU51bWJlckJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+SlNPTi5wYXJzZShhdG9iKG4pKSxuPT5idG9hKEpTT04uc3RyaW5naWZ5KG4pKSk7Yi5nZXRPYmplY3Q9bS5nZXQ7Yi5zZXRPYmplY3Q9bS5zZXQ7Yi5nZXRPYmplY3RJbml0aWFsaXplcj0KbS5nZXRJbml0aWFsaXplcjtiLmdldE9iamVjdE9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlT2JqZWN0QmluZGluZz1tLmRpc3Bvc2VCaW5kaW5nO2IubWFrZUJpbmRpbmdzPWQ7Yi5taWdyYXRlTGVnYWN5VVJMU2NoZW1lPWZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgU2V0KCJleGFtcGxlc1BhdGggaGlkZU1vZGVsUGFuZTIgbW9kZWxOYW1lMSBtb2RlbE5hbWUyIGluZmVyZW5jZUFkZHJlc3MxIGluZmVyZW5jZUFkZHJlc3MyIG1vZGVsVHlwZSBtb2RlbFZlcnNpb24xIG1vZGVsVmVyc2lvbjIgbW9kZWxTaWduYXR1cmUxIG1vZGVsU2lnbmF0dXJlMiBtYXhFeGFtcGxlcyBsYWJlbFZvY2FiUGF0aCBtdWx0aUNsYXNzIHNlcXVlbmNlRXhhbXBsZXMgbWF4Q2xhc3Nlc1RvRGlzcGxheSBzYW1wbGluZ09kZHMgdXNlUHJlZGljdEFwaSBwcmVkaWN0SW5wdXRUZW5zb3IgcHJlZGljdE91dHB1dFRlbnNvciIuc3BsaXQoIiAiKSkscT1sKGgoKSk7aWYoIndoYXRpZiI9PT1xW2IuVEFCXSlmb3IobGV0IHUgb2Ygbil1IGluCnEmJihxW2BwLndoYXRpZi4ke3V9YF09cVt1XSk7ayhyKHEpKTt0aGlzLnVybERpY3Q9cX19KShiZHx8KGJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9hcnJheS11cGRhdGUtaGVscGVyLmpzCnZhciBjZDsoZnVuY3Rpb24oYil7Yi5BcnJheVVwZGF0ZUhlbHBlcj17dXBkYXRlQXJyYXlQcm9wKGQsZixoKXtsZXQgaz10aGlzLmdldChkKTtpZighQXJyYXkuaXNBcnJheShmKSl0aHJvdyBSYW5nZUVycm9yKGBFeHBlY3RlZCBuZXcgdmFsdWUgdG8gJyR7ZH0nIHRvIGJlIGFuIGFycmF5LmApO0FycmF5LmlzQXJyYXkoayl8fChrPVtdLHRoaXMuc2V0KGQsaykpO2NvbnN0IHI9bmV3IFNldChmLm1hcCgobSxuKT0+aChtLG4pKSk7bGV0IGw9MCxwPTA7Zm9yKDtsPGsubGVuZ3RoJiZwPGYubGVuZ3RoOylyLmhhcyhoKGtbbF0sbCkpPyhoKGtbbF0sbCk9PWgoZltwXSxwKT90aGlzLnNldChgJHtkfS4ke2x9YCxmW3BdKTp0aGlzLnNwbGljZShkLGwsMCxmW3BdKSxwKyssbCsrKTp0aGlzLnNwbGljZShkLGwsMSk7bDxrLmxlbmd0aCYmdGhpcy5zcGxpY2UoZCxsKTtwPGYubGVuZ3RoJiZ0aGlzLnB1c2goZCwuLi5mLnNsaWNlKHApKX19fSkoY2R8fChjZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLWRvbS1yZXBlYXQuaHRtbC5qcwp2YXIgcmQ7CihmdW5jdGlvbihiKXtiLlRmRG9tUmVwZWF0QmVoYXZpb3I9W2NkLkFycmF5VXBkYXRlSGVscGVyLHtwcm9wZXJ0aWVzOnthczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxfY29udGVudEFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfZG9tQm9vdHN0cmFwcGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jdG9yOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5udWxsfSxfcmVuZGVyZWRJdGVtczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9yZW5kZXJlZFRlbXBsYXRlSW5zdDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBNYXB9LF9scnVDYWNoZWRJdGVtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBNYXB9LF9jYWNoZVNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjEwfSxfZ2V0SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+ZD0+SlNPTi5zdHJpbmdpZnkoZCl9fSxvYnNlcnZlcnM6WyJfYm9vdHN0cmFwRG9tKF9pdGVtc1JlbmRlcmVkLCBpc0F0dGFjaGVkKSIsIl91cGRhdGVEb20oX3JlbmRlcmVkSXRlbXMuKiwgX2RvbUJvb3RzdHJhcHBlZCkiLAoiX3VwZGF0ZUFjdGl2ZShfY29udGVudEFjdGl2ZSkiLCJfdHJpbUNhY2hlKF9jYWNoZVNpemUpIl0sc2V0Q2FjaGVTaXplKGQpe3RoaXMuX2NhY2hlU2l6ZT1kfSxzZXRHZXRJdGVtS2V5KGQpe3RoaXMuX2dldEl0ZW1LZXk9ZH0sdXBkYXRlRG9tKGQpe3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfcmVuZGVyZWRJdGVtcyIsZCx0aGlzLl9nZXRJdGVtS2V5KX0sX2Vuc3VyZVRlbXBsYXRpemVkKCl7aWYoIXRoaXMuaXNBdHRhY2hlZClyZXR1cm4hMTt0aGlzLl9jdG9yfHwodGhpcy5fY3Rvcj1Qb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIiksdGhpcyx7cGFyZW50TW9kZWw6ITAsaW5zdGFuY2VQcm9wczp7W3RoaXMuYXNdOiEwLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSxmb3J3YXJkSG9zdFByb3A6ZnVuY3Rpb24oZCxmKXt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5mb3JFYWNoKGg9PntoLmZvcndhcmRIb3N0UHJvcChkLApmKX0pfX0pKTtyZXR1cm4hMH0sX2Jvb3RzdHJhcERvbSgpe3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkmJiF0aGlzLl9kb21Cb290c3RyYXBwZWQmJigobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZD0+e2Zvcihjb25zdCBmIG9mIGQpaWYoImNoaWxkTGlzdCI9PT1mLnR5cGUpZm9yKGNvbnN0IGggb2YgZi5hZGRlZE5vZGVzKWggaW5zdGFuY2VvZiBFbGVtZW50JiZoLnNldEF0dHJpYnV0ZSgic2xvdCIsIml0ZW1zIil9KSkub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KSxBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZvckVhY2goZD0+e1BvbHltZXIuZG9tKHRoaXMpLnJlbW92ZUNoaWxkKGQpfSksdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuY2xlYXIoKSx0aGlzLl9yZW5kZXJlZEl0ZW1zLmZvckVhY2goKGQsZik9PnRoaXMuX2luc2VydEl0ZW0oZCxmKSksdGhpcy5fZG9tQm9vdHN0cmFwcGVkPSEwKX0sX3VwZGF0ZUFjdGl2ZSgpe3RoaXMuX2RvbUJvb3RzdHJhcHBlZCYmCkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goZD0+e2Qubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGQpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9ZC5wYXRoJiYiX3JlbmRlcmVkSXRlbXMubGVuZ3RoIiE9ZC5wYXRoKWlmKCJfcmVuZGVyZWRJdGVtcy5zcGxpY2VzIj09PWQucGF0aClkLnZhbHVlLmluZGV4U3BsaWNlcy5mb3JFYWNoKGY9Pntjb25zdCBoPWYuaW5kZXgsaz1mLmFkZGVkQ291bnQscj1mLm9iamVjdDtmLnJlbW92ZWQuZm9yRWFjaChsPT57dGhpcy5fcmVtb3ZlSXRlbShsLHRoaXMuY2hpbGRyZW5baF0pfSk7ci5zbGljZShoLGgraykuZm9yRWFjaCgobCxwKT0+dGhpcy5faW5zZXJ0SXRlbShsLGgrcCkpO3RoaXMuX3RyaW1DYWNoZSgpfSk7ZWxzZXtjb25zdCBmPXRoaXMuX2dldEl0ZW1LZXkoZC52YWx1ZSk7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuaGFzKGYpPwp0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCh0aGlzLmFzLGQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7Zn0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGQsZil7aWYoIXRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkpdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHRlbXBsYXRpemVkIGJlZm9yZSBpbnNlcnRpbmcgYW4gaXRlbSIpO2NvbnN0IGg9dGhpcy5fZ2V0SXRlbUtleShkKTtpZih0aGlzLl9scnVDYWNoZWRJdGVtcy5oYXMoaCkpZD10aGlzLl9scnVDYWNoZWRJdGVtcy5nZXQoaCksdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGgpLHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChoKS5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpO2Vsc2V7Y29uc3Qgaz1uZXcgdGhpcy5fY3Rvcih7W3RoaXMuYXNdOmQsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9KTsKZD1rLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGgsayl9dGhpcy5jaGlsZHJlbltmXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoZCx0aGlzLmNoaWxkcmVuW2ZdKTooKGQubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9BcnJheS5mcm9tKGQuY2hpbGRyZW4pOltkXSkuZm9yRWFjaChrPT5rLnNldEF0dHJpYnV0ZSgic2xvdCIsIml0ZW1zIikpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGQpKX0sX3JlbW92ZUl0ZW0oZCxmKXtQb2x5bWVyLmRvbShmLnBhcmVudE5vZGUpLnJlbW92ZUNoaWxkKGYpO2Q9dGhpcy5fZ2V0SXRlbUtleShkKTt0aGlzLl9scnVDYWNoZWRJdGVtcy5zZXQoZCxmKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZCkubm90aWZ5UGF0aCgiYWN0aXZlIiwhMSl9LF90cmltQ2FjaGUoKXtmb3IoO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNpemU+dGhpcy5fY2FjaGVTaXplOyl7Y29uc3QgW2RdPQp0aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShkKX19fV19KShyZHx8KHJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBzZDsKKGZ1bmN0aW9uKGIpe2xldCBkPW51bGw7Y29uc3QgZj1uZXcgU2V0O2IuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmFkZChoKX07Yi5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGgpe2YuZGVsZXRlKGgpfTtiLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09ZCYmKGQ9YmQuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09ZHx8IWlzRmluaXRlKGQpfHwwPj1kKSYmKGQ9MTIpO3JldHVybiBkfTtiLnNldExpbWl0PWZ1bmN0aW9uKGgpe2lmKGghPT1NYXRoLmZsb29yKGgpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7aH1gKTtpZigwPj1oKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2h9YCk7aCE9PWQmJihkPWgsYmQuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixkLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZi5mb3JFYWNoKGs9PntrKCl9KSl9fSkoc2R8fChzZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLXBhZ2luYXRlZC12aWV3LXN0b3JlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIixfdGVtcGxhdGU6bnVsbCx0Zl9wYWdpbmF0ZWRfdmlldzpzZH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy1iZWhhdmlvci9wYXBlci1kaWFsb2ctYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiZGlhbG9nIix0YWJpbmRleDoiLTEifSxwcm9wZXJ0aWVzOnttb2RhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfX3JlYWRpZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl9tb2RhbENoYW5nZWQobW9kYWwsIF9fcmVhZGllZCkiXSxsaXN0ZW5lcnM6e3RhcDoiX29uRGlhbG9nQ2xpY2sifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljaz10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s7dGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleTt0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcDt0aGlzLl9fcmVhZGllZD0hMH0sX21vZGFsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihiPyh0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9CnRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5LHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wLHRoaXMud2l0aEJhY2tkcm9wPXRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9ITApOih0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrJiZ0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5ub0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5LHRoaXMud2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wJiZ0aGlzLl9fcHJldldpdGhCYWNrZHJvcCkpfSxfdXBkYXRlQ2xvc2luZ1JlYXNvbkNvbmZpcm1lZDpmdW5jdGlvbihiKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHwKe307dGhpcy5jbG9zaW5nUmVhc29uLmNvbmZpcm1lZD1ifSxfb25EaWFsb2dDbGljazpmdW5jdGlvbihiKXtmb3IodmFyIGQ9UG9seW1lci5kb20oYikucGF0aCxmPTAsaD1kLmluZGV4T2YodGhpcyk7ZjxoO2YrKyl7dmFyIGs9ZFtmXTtpZihrLmhhc0F0dHJpYnV0ZSYmKGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctZGlzbWlzcyIpfHxrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSkpe3RoaXMuX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQoay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpO3RoaXMuY2xvc2UoKTtiLnN0b3BQcm9wYWdhdGlvbigpO2JyZWFrfX19fTtQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3I9W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcixQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsXX0pKCk7CgovLyBodHRwczovL2QzanMub3JnIHY1LjcuMCBDb3B5cmlnaHQgMjAxOCBNaWtlIEJvc3RvY2sKIWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLG4pOm4odC5kMz10LmQzfHx7fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZSh0KXt2YXIgZTtyZXR1cm4gMT09PXQubGVuZ3RoJiYoZT10LHQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbihlKHQpLHIpfSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fXZhciByPWUobiksaT1yLnJpZ2h0LG89ci5sZWZ0O2Z1bmN0aW9uIGEodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gZih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPTAsYT0tMSxmPTAsYz0wO2lmKG51bGw9PW4pZm9yKDsrK2E8aTspaXNOYU4oZT11KHRbYV0pKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2Vsc2UgZm9yKDsrK2E8aTspaXNOYU4oZT11KG4odFthXSxhLHQpKSl8fChjKz0ocj1lLWYpKihlLShmKz1yLysrbykpKTtpZihvPjEpcmV0dXJuIGMvKG8tMSl9ZnVuY3Rpb24gYyh0LG4pe3ZhciBlPWYodCxuKTtyZXR1cm4gZT9NYXRoLnNxcnQoZSk6ZX1mdW5jdGlvbiBzKHQsbil7dmFyIGUscixpLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1uKXtmb3IoOysrYTxvOylpZihudWxsIT0oZT10W2FdKSYmZT49ZSlmb3Iocj1pPWU7KythPG87KW51bGwhPShlPXRbYV0pJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShlPW4odFthXSxhLHQpKSYmZT49ZSlmb3Iocj1pPWU7KythPG87KW51bGwhPShlPW4odFthXSxhLHQpKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSk7cmV0dXJuW3IsaV19dmFyIGw9QXJyYXkucHJvdG90eXBlLGg9bC5zbGljZSxkPWwubWFwO2Z1bmN0aW9uIHAodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHYodCl7cmV0dXJuIHR9ZnVuY3Rpb24gZyh0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb312YXIgeT1NYXRoLnNxcnQoNTApLF89TWF0aC5zcXJ0KDEwKSxiPU1hdGguc3FydCgyKTtmdW5jdGlvbiBtKHQsbixlKXt2YXIgcixpLG8sYSx1PS0xO2lmKGU9K2UsKHQ9K3QpPT09KG49K24pJiZlPjApcmV0dXJuW3RdO2lmKChyPW48dCkmJihpPXQsdD1uLG49aSksMD09PShhPXgodCxuLGUpKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxuPU1hdGguZmxvb3Iobi9hKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChuLXQrMSkpOysrdTxpOylvW3VdPSh0K3UpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksbj1NYXRoLmNlaWwobiphKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LW4rMSkpOysrdTxpOylvW3VdPSh0LXUpL2E7cmV0dXJuIHImJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24geCh0LG4sZSl7dmFyIHI9KG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSxvPXIvTWF0aC5wb3coMTAsaSk7cmV0dXJuIGk+PTA/KG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKSpNYXRoLnBvdygxMCxpKTotTWF0aC5wb3coMTAsLWkpLyhvPj15PzEwOm8+PV8/NTpvPj1iPzI6MSl9ZnVuY3Rpb24gdyh0LG4sZSl7dmFyIHI9TWF0aC5hYnMobi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApKSxvPXIvaTtyZXR1cm4gbz49eT9pKj0xMDpvPj1fP2kqPTU6bz49YiYmKGkqPTIpLG48dD8taTppfWZ1bmN0aW9uIE0odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gQSh0LG4sZSl7aWYobnVsbD09ZSYmKGU9dSkscj10Lmxlbmd0aCl7aWYoKG49K24pPD0wfHxyPDIpcmV0dXJuK2UodFswXSwwLHQpO2lmKG4+PTEpcmV0dXJuK2UodFtyLTFdLHItMSx0KTt2YXIgcixpPShyLTEpKm4sbz1NYXRoLmZsb29yKGkpLGE9K2UodFtvXSxvLHQpO3JldHVybiBhKygrZSh0W28rMV0sbysxLHQpLWEpKihpLW8pfX1mdW5jdGlvbiBUKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJmU+ciYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPnImJihyPWUpO3JldHVybiByfWZ1bmN0aW9uIE4odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsYT0wOysrbzxpOylhKz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSk7LS1pPj0wOylmb3Iobj0ocj10W2ldKS5sZW5ndGg7LS1uPj0wOyllWy0tYV09cltuXTtyZXR1cm4gZX1mdW5jdGlvbiBTKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJnI+ZSYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZyPmUmJihyPWUpO3JldHVybiByfWZ1bmN0aW9uIEUodCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT1TKHQsaykscj1uZXcgQXJyYXkoZSk7KytuPGU7KWZvcih2YXIgaSxvPS0xLGE9cltuXT1uZXcgQXJyYXkoaSk7KytvPGk7KWFbb109dFtvXVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBrKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgQz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gUCh0KXtyZXR1cm4gdH12YXIgej0xLFI9MixMPTMsRD00LFU9MWUtNjtmdW5jdGlvbiBxKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gTyh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIFkoKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gQih0LG4pe3ZhciBlPVtdLHI9bnVsbCxpPW51bGwsbz02LGE9Nix1PTMsZj10PT09enx8dD09PUQ/LTE6MSxjPXQ9PT1EfHx0PT09Uj8ieCI6InkiLHM9dD09PXp8fHQ9PT1MP3E6TztmdW5jdGlvbiBsKGwpe3ZhciBoPW51bGw9PXI/bi50aWNrcz9uLnRpY2tzLmFwcGx5KG4sZSk6bi5kb21haW4oKTpyLGQ9bnVsbD09aT9uLnRpY2tGb3JtYXQ/bi50aWNrRm9ybWF0LmFwcGx5KG4sZSk6UDppLHA9TWF0aC5tYXgobywwKSt1LHY9bi5yYW5nZSgpLGc9K3ZbMF0rLjUseT0rdlt2Lmxlbmd0aC0xXSsuNSxfPShuLmJhbmR3aWR0aD9mdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLHQuYmFuZHdpZHRoKCktMSkvMjtyZXR1cm4gdC5yb3VuZCgpJiYobj1NYXRoLnJvdW5kKG4pKSxmdW5jdGlvbihlKXtyZXR1cm4rdChlKStufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybit0KG4pfX0pKG4uY29weSgpKSxiPWwuc2VsZWN0aW9uP2wuc2VsZWN0aW9uKCk6bCxtPWIuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLHg9Yi5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLG4pLm9yZGVyKCksdz14LmV4aXQoKSxNPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxBPXguc2VsZWN0KCJsaW5lIiksVD14LnNlbGVjdCgidGV4dCIpO209bS5tZXJnZShtLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSx4PXgubWVyZ2UoTSksQT1BLm1lcmdlKE0uYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihjKyIyIixmKm8pKSxUPVQubWVyZ2UoTS5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihjLGYqcCkuYXR0cigiZHkiLHQ9PT16PyIwZW0iOnQ9PT1MPyIwLjcxZW0iOiIwLjMyZW0iKSksbCE9PWImJihtPW0udHJhbnNpdGlvbihsKSx4PXgudHJhbnNpdGlvbihsKSxBPUEudHJhbnNpdGlvbihsKSxUPVQudHJhbnNpdGlvbihsKSx3PXcudHJhbnNpdGlvbihsKS5hdHRyKCJvcGFjaXR5IixVKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PV8odCkpP3ModCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSksTS5hdHRyKCJvcGFjaXR5IixVKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHMobiYmaXNGaW5pdGUobj1uKHQpKT9uOl8odCkpfSkpLHcucmVtb3ZlKCksbS5hdHRyKCJkIix0PT09RHx8dD09Uj9hPyJNIitmKmErIiwiK2crIkgwLjVWIit5KyJIIitmKmE6Ik0wLjUsIitnKyJWIit5OmE/Ik0iK2crIiwiK2YqYSsiVjAuNUgiK3krIlYiK2YqYToiTSIrZysiLDAuNUgiK3kpLHguYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gcyhfKHQpKX0pLEEuYXR0cihjKyIyIixmKm8pLFQuYXR0cihjLGYqcCkudGV4dChkKSxiLmZpbHRlcihZKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09Uj8ic3RhcnQiOnQ9PT1EPyJlbmQiOiJtaWRkbGUiKSxiLmVhY2goZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ffSl9cmV0dXJuIGwuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxsKTpufSxsLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGU9Qy5jYWxsKGFyZ3VtZW50cyksbH0sbC50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/W106Qy5jYWxsKHQpLGwpOmUuc2xpY2UoKX0sbC50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDpDLmNhbGwodCksbCk6ciYmci5zbGljZSgpfSxsLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxsKTppfSxsLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsbCk6b30sbC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGwpOm99LGwudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxsKTphfSxsLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGwpOnV9LGx9dmFyIEY9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gSSgpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcil0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtyW3RdPVtdfXJldHVybiBuZXcgSChyKX1mdW5jdGlvbiBIKHQpe3RoaXMuXz10fWZ1bmN0aW9uIGoodCxuKXtmb3IodmFyIGUscj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZigoZT10W3JdKS5uYW1lPT09bilyZXR1cm4gZS52YWx1ZX1mdW5jdGlvbiBYKHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT1GLHQ9dC5zbGljZSgwLHIpLmNvbmNhdCh0LnNsaWNlKHIrMSkpO2JyZWFrfXJldHVybiBudWxsIT1lJiZ0LnB1c2goe25hbWU6bix2YWx1ZTplfSksdH1ILnByb3RvdHlwZT1JLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10aGlzLl8sbz0ocj1pLCh0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7aWYoZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx0JiYhci5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSksYT0tMSx1PW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO2Zvcig7KythPHU7KWlmKGU9KHQ9b1thXSkudHlwZSlpW2VdPVgoaVtlXSx0Lm5hbWUsbik7ZWxzZSBpZihudWxsPT1uKWZvcihlIGluIGkpaVtlXT1YKGlbZV0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KythPHU7KWlmKChlPSh0PW9bYV0pLnR5cGUpJiYoZT1qKGlbZV0sdC5uYW1lKSkpcmV0dXJuIGV9LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IEgodCl9LGNhbGw6ZnVuY3Rpb24odCxuKXtpZigoZT1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBlLHIsaT1uZXcgQXJyYXkoZSksbz0wO288ZTsrK28paVtvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsZT0ocj10aGlzLl9bdF0pLmxlbmd0aDtvPGU7KytvKXJbb10udmFsdWUuYXBwbHkobixpKX0sYXBwbHk6ZnVuY3Rpb24odCxuLGUpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkobixlKX19O3ZhciBHPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixWPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpHLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24gJCh0KXt2YXIgbj10Kz0iIixlPW4uaW5kZXhPZigiOiIpO3JldHVybiBlPj0wJiYieG1sbnMiIT09KG49dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxWLmhhc093blByb3BlcnR5KG4pP3tzcGFjZTpWW25dLGxvY2FsOnR9OnR9ZnVuY3Rpb24gVyh0KXt2YXIgbj0kKHQpO3JldHVybihuLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUcmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUc/bi5jcmVhdGVFbGVtZW50KHQpOm4uY3JlYXRlRWxlbWVudE5TKGUsdCl9fSkobil9ZnVuY3Rpb24gWigpe31mdW5jdGlvbiBRKHQpe3JldHVybiBudWxsPT10P1o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBKKCl7cmV0dXJuW119ZnVuY3Rpb24gSyh0KXtyZXR1cm4gbnVsbD09dD9KOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19dmFyIHR0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFudC5tYXRjaGVzKXt2YXIgZXQ9bnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxudC5tc01hdGNoZXNTZWxlY3Rvcnx8bnQubW96TWF0Y2hlc1NlbGVjdG9yfHxudC5vTWF0Y2hlc1NlbGVjdG9yO3R0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBldC5jYWxsKHRoaXMsdCl9fX19dmFyIHJ0PXR0O2Z1bmN0aW9uIGl0KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIG90KHQsbil7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1ufW90LnByb3RvdHlwZT17Y29uc3RydWN0b3I6b3QsYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxuKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX07dmFyIGF0PSIkIjtmdW5jdGlvbiB1dCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHU9MCxmPW4ubGVuZ3RoLGM9by5sZW5ndGg7dTxjOysrdSkoYT1uW3VdKT8oYS5fX2RhdGFfXz1vW3VdLHJbdV09YSk6ZVt1XT1uZXcgb3QodCxvW3VdKTtmb3IoO3U8ZjsrK3UpKGE9blt1XSkmJihpW3VdPWEpfWZ1bmN0aW9uIGZ0KHQsbixlLHIsaSxvLGEpe3ZhciB1LGYsYyxzPXt9LGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxkPW5ldyBBcnJheShsKTtmb3IodT0wO3U8bDsrK3UpKGY9blt1XSkmJihkW3VdPWM9YXQrYS5jYWxsKGYsZi5fX2RhdGFfXyx1LG4pLGMgaW4gcz9pW3VdPWY6c1tjXT1mKTtmb3IodT0wO3U8aDsrK3UpKGY9c1tjPWF0K2EuY2FsbCh0LG9bdV0sdSxvKV0pPyhyW3VdPWYsZi5fX2RhdGFfXz1vW3VdLHNbY109bnVsbCk6ZVt1XT1uZXcgb3QodCxvW3VdKTtmb3IodT0wO3U8bDsrK3UpKGY9blt1XSkmJnNbZFt1XV09PT1mJiYoaVt1XT1mKX1mdW5jdGlvbiBjdCh0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBzdCh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gbHQodCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxzdCh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gZHQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgcHQodCl9ZnVuY3Rpb24gcHQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPWh0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gdnQodCxuKXtmb3IodmFyIGU9ZHQodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLmFkZChuW3JdKX1mdW5jdGlvbiBndCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUucmVtb3ZlKG5bcl0pfWZ1bmN0aW9uIHl0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBfdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIGJ0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIG10KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24geHQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB3dCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIE10KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITEpLHRoaXMubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIEF0KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITApLHRoaXMubmV4dFNpYmxpbmcpfXB0LnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKHQpe3RoaXMuX25hbWVzLmluZGV4T2YodCk8MCYmKHRoaXMuX25hbWVzLnB1c2godCksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWVzLmluZGV4T2YodCk7bj49MCYmKHRoaXMuX25hbWVzLnNwbGljZShuLDEpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKHQpPj0wfX07dmFyIFR0PXt9Oyh0LmV2ZW50PW51bGwsInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCkmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KFR0PXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pKTtmdW5jdGlvbiBOdCh0LG4sZSl7cmV0dXJuIHQ9U3QodCxuLGUpLGZ1bmN0aW9uKG4pe3ZhciBlPW4ucmVsYXRlZFRhcmdldDtlJiYoZT09PXRoaXN8fDgmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLG4pfX1mdW5jdGlvbiBTdChuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPXQuZXZlbnQ7dC5ldmVudD1pO3RyeXtuLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUscil9ZmluYWxseXt0LmV2ZW50PW99fX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5jYXB0dXJlKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24ga3QodCxuLGUpe3ZhciByPVR0Lmhhc093blByb3BlcnR5KHQudHlwZSk/TnQ6U3Q7cmV0dXJuIGZ1bmN0aW9uKGksbyxhKXt2YXIgdSxmPXRoaXMuX19vbixjPXIobixvLGEpO2lmKGYpZm9yKHZhciBzPTAsbD1mLmxlbmd0aDtzPGw7KytzKWlmKCh1PWZbc10pLnR5cGU9PT10LnR5cGUmJnUubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHUudHlwZSx1Lmxpc3RlbmVyLHUuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHUudHlwZSx1Lmxpc3RlbmVyPWMsdS5jYXB0dXJlPWUpLHZvaWQodS52YWx1ZT1uKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsZSksdT17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6bixsaXN0ZW5lcjpjLGNhcHR1cmU6ZX0sZj9mLnB1c2godSk6dGhpcy5fX29uPVt1XX19ZnVuY3Rpb24gQ3QobixlLHIsaSl7dmFyIG89dC5ldmVudDtuLnNvdXJjZUV2ZW50PXQuZXZlbnQsdC5ldmVudD1uO3RyeXtyZXR1cm4gZS5hcHBseShyLGkpfWZpbmFsbHl7dC5ldmVudD1vfX1mdW5jdGlvbiBQdCh0LG4sZSl7dmFyIHI9c3QodCksaT1yLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9bmV3IGkobixlKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGU/KGkuaW5pdEV2ZW50KG4sZS5idWJibGVzLGUuY2FuY2VsYWJsZSksaS5kZXRhaWw9ZS5kZXRhaWwpOmkuaW5pdEV2ZW50KG4sITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9dmFyIHp0PVtudWxsXTtmdW5jdGlvbiBSdCh0LG4pe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bn1mdW5jdGlvbiBMdCgpe3JldHVybiBuZXcgUnQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSx6dCl9ZnVuY3Rpb24gRHQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSdChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtbdF1dLHp0KX1SdC5wcm90b3R5cGU9THQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSdCxzZWxlY3Q6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYSx1PW5baV0sZj11Lmxlbmd0aCxjPXJbaV09bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShvPXVbc10pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGNbc109YSk7cmV0dXJuIG5ldyBSdChyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciBhLHU9bltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiYoci5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyx1KSksaS5wdXNoKGEpKTtyZXR1cm4gbmV3IFJ0KHIsaSl9LGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cnQodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYT1uW2ldLHU9YS5sZW5ndGgsZj1yW2ldPVtdLGM9MDtjPHU7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmYucHVzaChvKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24odCxuKXtpZighdClyZXR1cm4gcD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHM9LTEsdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3BbKytzXT10fSkscDt2YXIgZSxyPW4/ZnQ6dXQsaT10aGlzLl9wYXJlbnRzLG89dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYoZT10LHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0pO2Zvcih2YXIgYT1vLmxlbmd0aCx1PW5ldyBBcnJheShhKSxmPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSxzPTA7czxhOysrcyl7dmFyIGw9aVtzXSxoPW9bc10sZD1oLmxlbmd0aCxwPXQuY2FsbChsLGwmJmwuX19kYXRhX18scyxpKSx2PXAubGVuZ3RoLGc9ZltzXT1uZXcgQXJyYXkodikseT11W3NdPW5ldyBBcnJheSh2KTtyKGwsaCxnLHksY1tzXT1uZXcgQXJyYXkoZCkscCxuKTtmb3IodmFyIF8sYixtPTAseD0wO208djsrK20paWYoXz1nW21dKXtmb3IobT49eCYmKHg9bSsxKTshKGI9eVt4XSkmJisreDx2Oyk7Xy5fbmV4dD1ifHxudWxsfX1yZXR1cm4odT1uZXcgUnQodSxpKSkuX2VudGVyPWYsdS5fZXhpdD1jLHV9LGVudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoaXQpLHRoaXMuX3BhcmVudHMpfSxtZXJnZTpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksYT1uZXcgQXJyYXkociksdT0wO3U8bzsrK3UpZm9yKHZhciBmLGM9blt1XSxzPWVbdV0sbD1jLmxlbmd0aCxoPWFbdV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShmPWNbZF18fHNbZF0pJiYoaFtkXT1mKTtmb3IoO3U8cjsrK3UpYVt1XT1uW3VdO3JldHVybiBuZXcgUnQoYSx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49LTEsZT10Lmxlbmd0aDsrK248ZTspZm9yKHZhciByLGk9dFtuXSxvPWkubGVuZ3RoLTEsYT1pW29dOy0tbz49MDspKHI9aVtvXSkmJihhJiZhIT09ci5uZXh0U2libGluZyYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGEpLGE9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1jdCk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIGEsdT1lW29dLGY9dS5sZW5ndGgsYz1pW29dPW5ldyBBcnJheShmKSxzPTA7czxmOysrcykoYT11W3NdKSYmKGNbc109YSk7Yy5zb3J0KG4pfXJldHVybiBuZXcgUnQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPXJbaV07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpKGk9b1thXSkmJnQuY2FsbChpLGkuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPSQodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZS5sb2NhbD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fTplLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsbil9fSkoZSxuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19OmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19KSh0LG4sbnVsbD09ZT8iIjplKSk6bHQodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1lfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fSkodCxuKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1odCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcj1kdCh0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT92dDpndCkodGhpcyx0KX19Om4/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dnQodGhpcyx0KX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2d0KHRoaXMsdCl9fSkoZSxuKSl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/eXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX0pKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9fdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goYnQpfSxsb3dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2gobXQpfSxhcHBlbmQ6ZnVuY3Rpb24odCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpXKHQpO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCkscj1udWxsPT1uP3h0OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246UShuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2god3QpfSxjbG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9BdDpNdCl9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9KHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IodT1uP2t0OkV0LG51bGw9PWUmJihlPSExKSxyPTA7cjxhOysrcil0aGlzLmVhY2godShvW3JdLG4sZSkpO3JldHVybiB0aGlzfXZhciB1PXRoaXMubm9kZSgpLl9fb247aWYodSlmb3IodmFyIGYsYz0wLHM9dS5sZW5ndGg7YzxzOysrYylmb3Iocj0wLGY9dVtjXTtyPGE7KytyKWlmKChpPW9bcl0pLnR5cGU9PT1mLnR5cGUmJmkubmFtZT09PWYubmFtZSlyZXR1cm4gZi52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LG4pfX0pKHQsbikpfX07dmFyIFV0PTA7ZnVuY3Rpb24gcXQoKXtyZXR1cm4gbmV3IE90fWZ1bmN0aW9uIE90KCl7dGhpcy5fPSJAIisoKytVdCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIFl0KCl7Zm9yKHZhciBuLGU9dC5ldmVudDtuPWUuc291cmNlRXZlbnQ7KWU9bjtyZXR1cm4gZX1mdW5jdGlvbiBCdCh0LG4pe3ZhciBlPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKGUuY3JlYXRlU1ZHUG9pbnQpe3ZhciByPWUuY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gci54PW4uY2xpZW50WCxyLnk9bi5jbGllbnRZLFsocj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSkpLngsci55XX12YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltuLmNsaWVudFgtaS5sZWZ0LXQuY2xpZW50TGVmdCxuLmNsaWVudFktaS50b3AtdC5jbGllbnRUb3BdfWZ1bmN0aW9uIEZ0KHQpe3ZhciBuPVl0KCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLEJ0KHQsbil9ZnVuY3Rpb24gSXQodCxuLGUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGU9bixuPVl0KCkuY2hhbmdlZFRvdWNoZXMpO2Zvcih2YXIgcixpPTAsbz1uP24ubGVuZ3RoOjA7aTxvOysraSlpZigocj1uW2ldKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gQnQodCxyKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBIdCgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24ganQoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBYdCh0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsanQsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIsanQsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfWZ1bmN0aW9uIEd0KHQsbil7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1EdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO24mJihyLm9uKCJjbGljay5kcmFnIixqdCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gZT9yLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKTooZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PWUuX19ub3NlbGVjdCxkZWxldGUgZS5fX25vc2VsZWN0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gJHQodCxuLGUscixpLG8sYSx1LGYsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9bix0aGlzLnN1YmplY3Q9ZSx0aGlzLmlkZW50aWZpZXI9cix0aGlzLmFjdGl2ZT1pLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9dSx0aGlzLmR5PWYsdGhpcy5fPWN9ZnVuY3Rpb24gV3QoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gWnQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlfWZ1bmN0aW9uIFF0KG4pe3JldHVybiBudWxsPT1uP3t4OnQuZXZlbnQueCx5OnQuZXZlbnQueX06bn1mdW5jdGlvbiBKdCgpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBLdCh0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gdG4odCxuKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9ZnVuY3Rpb24gbm4oKXt9T3QucHJvdG90eXBlPXF0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6T3QsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0sJHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIGVuPSJcXHMqKFsrLV0/XFxkKylcXHMqIixybj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixvbj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsYW49L14jKFswLTlhLWZdezN9KSQvLHVuPS9eIyhbMC05YS1mXXs2fSkkLyxmbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbZW4sZW4sZW5dKyJcXCkkIiksY249bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW29uLG9uLG9uXSsiXFwpJCIpLHNuPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZW4sZW4sZW4scm5dKyJcXCkkIiksbG49bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tvbixvbixvbixybl0rIlxcKSQiKSxobj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcm4sb24sb25dKyJcXCkkIiksZG49bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tybixvbixvbixybl0rIlxcKSQiKSxwbj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB2bih0KXt2YXIgbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKG49YW4uZXhlYyh0KSk/bmV3IG1uKChuPXBhcnNlSW50KG5bMV0sMTYpKT4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpOihuPXVuLmV4ZWModCkpP2duKHBhcnNlSW50KG5bMV0sMTYpKToobj1mbi5leGVjKHQpKT9uZXcgbW4oblsxXSxuWzJdLG5bM10sMSk6KG49Y24uZXhlYyh0KSk/bmV3IG1uKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLDEpOihuPXNuLmV4ZWModCkpP3luKG5bMV0sblsyXSxuWzNdLG5bNF0pOihuPWxuLmV4ZWModCkpP3luKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLG5bNF0pOihuPWhuLmV4ZWModCkpP3duKG5bMV0sblsyXS8xMDAsblszXS8xMDAsMSk6KG49ZG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCxuWzRdKTpwbi5oYXNPd25Qcm9wZXJ0eSh0KT9nbihwblt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IG1uKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIG5ldyBtbih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24geW4odCxuLGUscil7cmV0dXJuIHI8PTAmJih0PW49ZT1OYU4pLG5ldyBtbih0LG4sZSxyKX1mdW5jdGlvbiBfbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG5ufHwodD12bih0KSksdD9uZXcgbW4oKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IG1ufWZ1bmN0aW9uIGJuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9fbih0KTpuZXcgbW4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIG1uKHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiB4bih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHduKHQsbixlLHIpe3JldHVybiByPD0wP3Q9bj1lPU5hTjplPD0wfHxlPj0xP3Q9bj1OYU46bjw9MCYmKHQ9TmFOKSxuZXcgQW4odCxuLGUscil9ZnVuY3Rpb24gTW4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gbmV3IEFuKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIG5ufHwodD12bih0KSksIXQpcmV0dXJuIG5ldyBBbjtpZih0IGluc3RhbmNlb2YgQW4pcmV0dXJuIHQ7dmFyIG49KHQ9dC5yZ2IoKSkuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSxhPU5hTix1PW8taSxmPShvK2kpLzI7cmV0dXJuIHU/KGE9bj09PW8/KGUtcikvdSs2KihlPHIpOmU9PT1vPyhyLW4pL3UrMjoobi1lKS91KzQsdS89ZjwuNT9vK2k6Mi1vLWksYSo9NjApOnU9Zj4wJiZmPDE/MDphLG5ldyBBbihhLHUsZix0Lm9wYWNpdHkpfSh0KTpuZXcgQW4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEFuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBUbih0LG4sZSl7cmV0dXJuIDI1NSoodDw2MD9uKyhlLW4pKnQvNjA6dDwxODA/ZTp0PDI0MD9uKyhlLW4pKigyNDAtdCkvNjA6bil9S3Qobm4sdm4se2Rpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuaGV4KCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9fSksS3QobW4sYm4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgbW4odGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4iIyIreG4odGhpcy5yKSt4bih0aGlzLmcpK3huKHRoaXMuYil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8icmdiKCI6InJnYmEoIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuZyl8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5iKXx8MCkpKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpLEt0KEFuLE1uLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgQW4odGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgQW4odGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLG49aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwscj1lKyhlPC41P2U6MS1lKSpuLGk9MiplLXI7cmV0dXJuIG5ldyBtbihUbih0Pj0yNDA/dC0yNDA6dCsxMjAsaSxyKSxUbih0LGksciksVG4odDwxMjA/dCsyNDA6dC0xMjAsaSxyKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX19KSk7dmFyIE5uPU1hdGguUEkvMTgwLFNuPTE4MC9NYXRoLlBJLEVuPS45NjQyMixrbj0xLENuPS44MjUyMSxQbj00LzI5LHpuPTYvMjksUm49Myp6bip6bixMbj16bip6bip6bjtmdW5jdGlvbiBEbih0KXtpZih0IGluc3RhbmNlb2YgcW4pcmV0dXJuIG5ldyBxbih0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBqbil7aWYoaXNOYU4odC5oKSlyZXR1cm4gbmV3IHFuKHQubCwwLDAsdC5vcGFjaXR5KTt2YXIgbj10LmgqTm47cmV0dXJuIG5ldyBxbih0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBtbnx8KHQ9X24odCkpO3ZhciBlLHIsaT1Gbih0LnIpLG89Rm4odC5nKSxhPUZuKHQuYiksdT1PbigoLjIyMjUwNDUqaSsuNzE2ODc4NipvKy4wNjA2MTY5KmEpL2tuKTtyZXR1cm4gaT09PW8mJm89PT1hP2U9cj11OihlPU9uKCguNDM2MDc0NyppKy4zODUwNjQ5Km8rLjE0MzA4MDQqYSkvRW4pLHI9T24oKC4wMTM5MzIyKmkrLjA5NzEwNDUqbysuNzE0MTczMyphKS9DbikpLG5ldyBxbigxMTYqdS0xNiw1MDAqKGUtdSksMjAwKih1LXIpLHQub3BhY2l0eSl9ZnVuY3Rpb24gVW4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0RuKHQpOm5ldyBxbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gcW4odCxuLGUscil7dGhpcy5sPSt0LHRoaXMuYT0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0PkxuP01hdGgucG93KHQsMS8zKTp0L1JuK1BufWZ1bmN0aW9uIFluKHQpe3JldHVybiB0PnpuP3QqdCp0OlJuKih0LVBuKX1mdW5jdGlvbiBCbih0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIEZuKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIEluKHQpe2lmKHQgaW5zdGFuY2VvZiBqbilyZXR1cm4gbmV3IGpuKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHFufHwodD1Ebih0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IGpuKE5hTiwwLHQubCx0Lm9wYWNpdHkpO3ZhciBuPU1hdGguYXRhbjIodC5iLHQuYSkqU247cmV0dXJuIG5ldyBqbihuPDA/biszNjA6bixNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBIbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SW4odCk6bmV3IGpuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBqbih0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5jPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9S3QocW4sVW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcW4odGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixuPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsZT1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgbW4oQm4oMy4xMzM4NTYxKihuPUVuKlluKG4pKS0xLjYxNjg2NjcqKHQ9a24qWW4odCkpLS40OTA2MTQ2KihlPUNuKlluKGUpKSksQm4oLS45Nzg3Njg0Km4rMS45MTYxNDE1KnQrLjAzMzQ1NCplKSxCbiguMDcxOTQ1MypuLS4yMjg5OTE0KnQrMS40MDUyNDI3KmUpLHRoaXMub3BhY2l0eSl9fSkpLEt0KGpuLEhuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGpuKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gRG4odGhpcykucmdiKCl9fSkpO3ZhciBYbj0tLjE0ODYxLEduPTEuNzgyNzcsVm49LS4yOTIyNywkbj0tLjkwNjQ5LFduPTEuOTcyOTQsWm49V24qJG4sUW49V24qR24sSm49R24qVm4tJG4qWG47ZnVuY3Rpb24gS24odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiB0ZSlyZXR1cm4gbmV3IHRlKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KEpuKnIrWm4qbi1RbiplKS8oSm4rWm4tUW4pLG89ci1pLGE9KFduKihlLWkpLVZuKm8pLyRuLHU9TWF0aC5zcXJ0KGEqYStvKm8pLyhXbippKigxLWkpKSxmPXU/TWF0aC5hdGFuMihhLG8pKlNuLTEyMDpOYU47cmV0dXJuIG5ldyB0ZShmPDA/ZiszNjA6Zix1LGksdC5vcGFjaXR5KX0odCk6bmV3IHRlKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiB0ZSh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gbmUodCxuLGUscixpKXt2YXIgbz10KnQsYT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tYSkqbisoNC02Km8rMyphKSplKygxKzMqdCszKm8tMyphKSpyK2EqaSkvNn1mdW5jdGlvbiBlZSh0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdLGE9cj4wP3Rbci0xXToyKmktbyx1PXI8bi0xP3RbcisyXToyKm8taTtyZXR1cm4gbmUoKGUtci9uKSpuLGEsaSxvLHUpfX1mdW5jdGlvbiByZSh0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLGE9dFsocisxKSVuXSx1PXRbKHIrMiklbl07cmV0dXJuIG5lKChlLXIvbikqbixpLG8sYSx1KX19ZnVuY3Rpb24gaWUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIG9lKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0K2Uqbn19ZnVuY3Rpb24gYWUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlPjE4MHx8ZTwtMTgwP2UtMzYwKk1hdGgucm91bmQoZS8zNjApOmUpOmllKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIDE9PSh0PSt0KT9mZTpmdW5jdGlvbihuLGUpe3JldHVybiBlLW4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiB0PU1hdGgucG93KHQsZSksbj1NYXRoLnBvdyhuLGUpLXQsZT0xL2UsZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucG93KHQrcipuLGUpfX0obixlLHQpOmllKGlzTmFOKG4pP2U6bil9fWZ1bmN0aW9uIGZlKHQsbil7dmFyIGU9bi10O3JldHVybiBlP29lKHQsZSk6aWUoaXNOYU4odCk/bjp0KX1LdCh0ZSxLbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IHRlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IHRlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpObixuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgbW4oMjU1KihuK2UqKFhuKnIrR24qaSkpLDI1NSoobitlKihWbipyKyRuKmkpKSwyNTUqKG4rZSooV24qcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBjZT1mdW5jdGlvbiB0KG4pe3ZhciBlPXVlKG4pO2Z1bmN0aW9uIHIodCxuKXt2YXIgcj1lKCh0PWJuKHQpKS5yLChuPWJuKG4pKS5yKSxpPWUodC5nLG4uZyksbz1lKHQuYixuLmIpLGE9ZmUodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LnI9cihuKSx0Lmc9aShuKSx0LmI9byhuKSx0Lm9wYWNpdHk9YShuKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KDEpO2Z1bmN0aW9uIHNlKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk9bi5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSksdT1uZXcgQXJyYXkoaSk7Zm9yKGU9MDtlPGk7KytlKXI9Ym4obltlXSksb1tlXT1yLnJ8fDAsYVtlXT1yLmd8fDAsdVtlXT1yLmJ8fDA7cmV0dXJuIG89dChvKSxhPXQoYSksdT10KHUpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9YSh0KSxyLmI9dSh0KSxyKyIifX19dmFyIGxlPXNlKGVlKSxoZT1zZShyZSk7ZnVuY3Rpb24gZGUodCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1tZSh0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSlhW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSlhW2VdPW9bZV0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIHBlKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24ocil7cmV0dXJuIGUuc2V0VGltZSh0K24qciksZX19ZnVuY3Rpb24gdmUodCxuKXtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIGdlKHQsbil7dmFyIGUscj17fSxpPXt9O2ZvcihlIGluIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09biYmIm9iamVjdCI9PXR5cGVvZiBufHwobj17fSksbillIGluIHQ/cltlXT1tZSh0W2VdLG5bZV0pOmlbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGUgaW4gcilpW2VdPXJbZV0odCk7cmV0dXJuIGl9fXZhciB5ZT0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csX2U9bmV3IFJlZ0V4cCh5ZS5zb3VyY2UsImciKTtmdW5jdGlvbiBiZSh0LG4pe3ZhciBlLHIsaSxvPXllLmxhc3RJbmRleD1fZS5sYXN0SW5kZXg9MCxhPS0xLHU9W10sZj1bXTtmb3IodCs9IiIsbis9IiI7KGU9eWUuZXhlYyh0KSkmJihyPV9lLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksdVthXT91W2FdKz1pOnVbKythXT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP3VbYV0/dVthXSs9cjp1WysrYV09cjoodVsrK2FdPW51bGwsZi5wdXNoKHtpOmEseDp2ZShlLHIpfSkpLG89X2UubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLHVbYV0/dVthXSs9aTp1WysrYV09aSksdS5sZW5ndGg8Mj9mWzBdP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn19KGZbMF0ueCk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShuKToobj1mLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpdVsoZT1mW3JdKS5pXT1lLngodCk7cmV0dXJuIHUuam9pbigiIil9KX1mdW5jdGlvbiBtZSh0LG4pe3ZhciBlLHI9dHlwZW9mIG47cmV0dXJuIG51bGw9PW58fCJib29sZWFuIj09PXI/aWUobik6KCJudW1iZXIiPT09cj92ZToic3RyaW5nIj09PXI/KGU9dm4obikpPyhuPWUsY2UpOmJlOm4gaW5zdGFuY2VvZiB2bj9jZTpuIGluc3RhbmNlb2YgRGF0ZT9wZTpBcnJheS5pc0FycmF5KG4pP2RlOiJmdW5jdGlvbiIhPXR5cGVvZiBuLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBuLnRvU3RyaW5nfHxpc05hTihuKT9nZTp2ZSkodCxuKX1mdW5jdGlvbiB4ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHQrbiplKX19dmFyIHdlLE1lLEFlLFRlLE5lPTE4MC9NYXRoLlBJLFNlPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIEVlKHQsbixlLHIsaSxvKXt2YXIgYSx1LGY7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtuKm4pKSYmKHQvPWEsbi89YSksKGY9dCplK24qcikmJihlLT10KmYsci09bipmKSwodT1NYXRoLnNxcnQoZSplK3IqcikpJiYoZS89dSxyLz11LGYvPXUpLHQqcjxuKmUmJih0PS10LG49LW4sZj0tZixhPS1hKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihuLHQpKk5lLHNrZXdYOk1hdGguYXRhbihmKSpOZSxzY2FsZVg6YSxzY2FsZVk6dX19ZnVuY3Rpb24ga2UodCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHU9W10sZj1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSxmdW5jdGlvbih0LHIsaSxvLGEsdSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgZj1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO3UucHVzaCh7aTpmLTQseDp2ZSh0LGkpfSx7aTpmLTIseDp2ZShyLG8pfSl9ZWxzZShpfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX0oby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHUsZiksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6dmUodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX0oby5yb3RhdGUsYS5yb3RhdGUsdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6dmUodCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9KG8uc2tld1gsYS5za2V3WCx1LGYpLGZ1bmN0aW9uKHQsbixlLHIsbyxhKXtpZih0IT09ZXx8biE9PXIpe3ZhciB1PW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6dS00LHg6dmUodCxlKX0se2k6dS0yLHg6dmUobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9KG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHUsZiksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj1mLmxlbmd0aDsrK2U8cjspdVsobj1mW2VdKS5pXT1uLngodCk7cmV0dXJuIHUuam9pbigiIil9fX12YXIgQ2U9a2UoZnVuY3Rpb24odCl7cmV0dXJuIm5vbmUiPT09dD9TZTood2V8fCh3ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxNZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsQWU9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLHdlLnN0eWxlLnRyYW5zZm9ybT10LHQ9QWUuZ2V0Q29tcHV0ZWRTdHlsZShNZS5hcHBlbmRDaGlsZCh3ZSksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksTWUucmVtb3ZlQ2hpbGQod2UpLEVlKCsodD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIikpWzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9LCJweCwgIiwicHgpIiwiZGVnKSIpLFBlPWtlKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1NlOihUZXx8KFRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLFRlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1UZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9FZSgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTpTZSl9LCIsICIsIikiLCIpIiksemU9TWF0aC5TUVJUMixSZT0yLExlPTQsRGU9MWUtMTI7ZnVuY3Rpb24gVWUodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gcWUodCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sYT10WzJdLHU9blswXSxmPW5bMV0sYz1uWzJdLHM9dS1pLGw9Zi1vLGg9cypzK2wqbDtpZihoPERlKXI9TWF0aC5sb2coYy9hKS96ZSxlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqcyxvK3QqbCxhKk1hdGguZXhwKHplKnQqcildfTtlbHNle3ZhciBkPU1hdGguc3FydChoKSxwPShjKmMtYSphK0xlKmgpLygyKmEqUmUqZCksdj0oYypjLWEqYS1MZSpoKS8oMipjKlJlKmQpLGc9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSx5PU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oeS1nKS96ZSxlPWZ1bmN0aW9uKHQpe3ZhciBuLGU9dCpyLHU9VWUoZyksZj1hLyhSZSpkKSoodSoobj16ZSplK2csKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpKS1mdW5jdGlvbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn0oZykpO3JldHVybltpK2YqcyxvK2YqbCxhKnUvVWUoemUqZStnKV19fXJldHVybiBlLmR1cmF0aW9uPTFlMypyLGV9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1NbihuKSkuaCwoZT1NbihlKSkuaCksaT1mZShuLnMsZS5zKSxvPWZlKG4ubCxlLmwpLGE9ZmUobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLnM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9YSh0KSxuKyIifX19dmFyIFllPU9lKGFlKSxCZT1PZShmZSk7ZnVuY3Rpb24gRmUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1IbihuKSkuaCwoZT1IbihlKSkuaCksaT1mZShuLmMsZS5jKSxvPWZlKG4ubCxlLmwpLGE9ZmUobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLmM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9YSh0KSxuKyIifX19dmFyIEllPUZlKGFlKSxIZT1GZShmZSk7ZnVuY3Rpb24gamUodCl7cmV0dXJuIGZ1bmN0aW9uIG4oZSl7ZnVuY3Rpb24gcihuLHIpe3ZhciBpPXQoKG49S24obikpLmgsKHI9S24ocikpLmgpLG89ZmUobi5zLHIucyksYT1mZShuLmwsci5sKSx1PWZlKG4ub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPWkodCksbi5zPW8odCksbi5sPWEoTWF0aC5wb3codCxlKSksbi5vcGFjaXR5PXUodCksbisiIn19cmV0dXJuIGU9K2Usci5nYW1tYT1uLHJ9KDEpfXZhciBYZT1qZShhZSksR2U9amUoZmUpO3ZhciBWZSwkZSxXZT0wLFplPTAsUWU9MCxKZT0xZTMsS2U9MCx0cj0wLG5yPTAsZXI9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUscnI9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gaXIoKXtyZXR1cm4gdHJ8fChycihvciksdHI9ZXIubm93KCkrbnIpfWZ1bmN0aW9uIG9yKCl7dHI9MH1mdW5jdGlvbiBhcigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gdXIodCxuLGUpe3ZhciByPW5ldyBhcjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIGZyKCl7aXIoKSwrK1dlO2Zvcih2YXIgdCxuPVZlO247KSh0PXRyLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1XZX1mdW5jdGlvbiBjcigpe3RyPShLZT1lci5ub3coKSkrbnIsV2U9WmU9MDt0cnl7ZnIoKX1maW5hbGx5e1dlPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9VmUscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46VmU9bik7JGU9dCxscihyKX0oKSx0cj0wfX1mdW5jdGlvbiBzcigpe3ZhciB0PWVyLm5vdygpLG49dC1LZTtuPkplJiYobnItPW4sS2U9dCl9ZnVuY3Rpb24gbHIodCl7V2V8fChaZSYmKFplPWNsZWFyVGltZW91dChaZSkpLHQtdHI+MjQ/KHQ8MS8wJiYoWmU9c2V0VGltZW91dChjcix0LWVyLm5vdygpLW5yKSksUWUmJihRZT1jbGVhckludGVydmFsKFFlKSkpOihRZXx8KEtlPWVyLm5vdygpLFFlPXNldEludGVydmFsKHNyLEplKSksV2U9MSxycihjcikpKX1mdW5jdGlvbiBocih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9YXIucHJvdG90eXBlPXVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YXIscmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP2lyKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fCRlPT09dGhpc3x8KCRlPyRlLl9uZXh0PXRoaXM6VmU9dGhpcywkZT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLGxyKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLGxyKCkpfX07dmFyIGRyPUkoInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikscHI9W10sdnI9MCxncj0xLHlyPTIsX3I9Myxicj00LG1yPTUseHI9NjtmdW5jdGlvbiB3cih0LG4sZSxyLGksbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYoZSBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyFmdW5jdGlvbih0LG4sZSl7dmFyIHIsaT10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGYpe3ZhciBjLHMsbCxoO2lmKGUuc3RhdGUhPT1ncilyZXR1cm4gdSgpO2ZvcihjIGluIGkpaWYoKGg9aVtjXSkubmFtZT09PWUubmFtZSl7aWYoaC5zdGF0ZT09PV9yKXJldHVybiBocihvKTtoLnN0YXRlPT09YnI/KGguc3RhdGU9eHIsaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBpW2NdKTorYzxuJiYoaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxkZWxldGUgaVtjXSl9aWYoaHIoZnVuY3Rpb24oKXtlLnN0YXRlPT09X3ImJihlLnN0YXRlPWJyLGUudGltZXIucmVzdGFydChhLGUuZGVsYXksZS50aW1lKSxhKGYpKX0pLGUuc3RhdGU9eXIsZS5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZS5zdGF0ZT09PXlyKXtmb3IoZS5zdGF0ZT1fcixyPW5ldyBBcnJheShsPWUudHdlZW4ubGVuZ3RoKSxjPTAscz0tMTtjPGw7KytjKShoPWUudHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSkmJihyWysrc109aCk7ci5sZW5ndGg9cysxfX1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgaT1uPGUuZHVyYXRpb24/ZS5lYXNlLmNhbGwobnVsbCxuL2UuZHVyYXRpb24pOihlLnRpbWVyLnJlc3RhcnQodSksZS5zdGF0ZT1tciwxKSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KXJbb10uY2FsbChudWxsLGkpO2Uuc3RhdGU9PT1tciYmKGUub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSx1KCkpfWZ1bmN0aW9uIHUoKXtmb3IodmFyIHIgaW4gZS5zdGF0ZT14cixlLnRpbWVyLnN0b3AoKSxkZWxldGUgaVtuXSxpKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259aVtuXT1lLGUudGltZXI9dXIoZnVuY3Rpb24odCl7ZS5zdGF0ZT1ncixlLnRpbWVyLnJlc3RhcnQobyxlLmRlbGF5LGUudGltZSksZS5kZWxheTw9dCYmbyh0LWUuZGVsYXkpfSwwLGUudGltZSl9KHQsZSx7bmFtZTpuLGluZGV4OnIsZ3JvdXA6aSxvbjpkcix0d2Vlbjpwcix0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTp2cn0pfWZ1bmN0aW9uIE1yKHQsbil7dmFyIGU9VHIodCxuKTtpZihlLnN0YXRlPnZyKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gQXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+eXIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzdGFydGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gVHIodCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gZX1mdW5jdGlvbiBOcih0LG4pe3ZhciBlLHIsaSxvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKGkgaW4gbj1udWxsPT1uP251bGw6bisiIixvKShlPW9baV0pLm5hbWU9PT1uPyhyPWUuc3RhdGU+eXImJmUuc3RhdGU8bXIsZS5zdGF0ZT14cixlLnRpbWVyLnN0b3AoKSxyJiZlLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZGVsZXRlIG9baV0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBTcih0LG4sZSl7dmFyIHI9dC5faWQ7cmV0dXJuIHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PUFyKHRoaXMscik7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbbl09ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxmdW5jdGlvbih0KXtyZXR1cm4gVHIodCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gRXIodCxuKXt2YXIgZTtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBuP3ZlOm4gaW5zdGFuY2VvZiB2bj9jZTooZT12bihuKSk/KG49ZSxjZSk6YmUpKHQsbil9dmFyIGtyPUx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcjt2YXIgQ3I9MDtmdW5jdGlvbiBQcih0LG4sZSxyKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW4sdGhpcy5fbmFtZT1lLHRoaXMuX2lkPXJ9ZnVuY3Rpb24genIodCl7cmV0dXJuIEx0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBScigpe3JldHVybisrQ3J9dmFyIExyPUx0LnByb3RvdHlwZTtmdW5jdGlvbiBEcih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiBVcih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1Qci5wcm90b3R5cGU9enIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQcixzZWxlY3Q6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT0wO2E8aTsrK2EpZm9yKHZhciB1LGYsYz1yW2FdLHM9Yy5sZW5ndGgsbD1vW2FdPW5ldyBBcnJheShzKSxoPTA7aDxzOysraCkodT1jW2hdKSYmKGY9dC5jYWxsKHUsdS5fX2RhdGFfXyxoLGMpKSYmKCJfX2RhdGFfXyJpbiB1JiYoZi5fX2RhdGFfXz11Ll9fZGF0YV9fKSxsW2hdPWYsd3IobFtoXSxuLGUsaCxsLFRyKHUsZSkpKTtyZXR1cm4gbmV3IFByKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1LKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1bXSxhPVtdLHU9MDt1PGk7Kyt1KWZvcih2YXIgZixjPXJbdV0scz1jLmxlbmd0aCxsPTA7bDxzOysrbClpZihmPWNbbF0pe2Zvcih2YXIgaCxkPXQuY2FsbChmLGYuX19kYXRhX18sbCxjKSxwPVRyKGYsZSksdj0wLGc9ZC5sZW5ndGg7djxnOysrdikoaD1kW3ZdKSYmd3IoaCxuLGUsdixkLHApO28ucHVzaChkKSxhLnB1c2goZil9cmV0dXJuIG5ldyBQcihvLGEsbixlKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksYT1uZXcgQXJyYXkociksdT0wO3U8bzsrK3UpZm9yKHZhciBmLGM9blt1XSxzPWVbdV0sbD1jLmxlbmd0aCxoPWFbdV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShmPWNbZF18fHNbZF0pJiYoaFtkXT1mKTtmb3IoO3U8cjsrK3UpYVt1XT1uW3VdO3JldHVybiBuZXcgUHIoYSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxzZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGtyKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9uYW1lLG49dGhpcy5faWQsZT1ScigpLHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKWlmKGE9dVtjXSl7dmFyIHM9VHIoYSxuKTt3cihhLHQsZSxjLHUse3RpbWU6cy50aW1lK3MuZGVsYXkrcy5kdXJhdGlvbixkZWxheTowLGR1cmF0aW9uOnMuZHVyYXRpb24sZWFzZTpzLmVhc2V9KX1yZXR1cm4gbmV3IFByKHIsdGhpcy5fcGFyZW50cyx0LGUpfSxjYWxsOkxyLmNhbGwsbm9kZXM6THIubm9kZXMsbm9kZTpMci5ub2RlLHNpemU6THIuc2l6ZSxlbXB0eTpMci5lbXB0eSxlYWNoOkxyLmVhY2gsb246ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP1RyKHRoaXMubm9kZSgpLGUpLm9uLm9uKHQpOnRoaXMuZWFjaChmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJih0PXQuc2xpY2UoMCxuKSksIXR8fCJzdGFydCI9PT10fSl9KG4pP01yOkFyO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSx1PWEub247dSE9PXImJihpPShyPXUpLmNvcHkoKSkub24obixlKSxhLm9uPWl9fShlLHQsbikpfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KSxyPSJ0cmFuc2Zvcm0iPT09ZT9QZTpFcjtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj8oZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHU9ZSh0aGlzKTtpZihudWxsIT11KXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGUodCkpPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KTt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlLHIsU3IodGhpcywiYXR0ci4iK3QsbikpOm51bGw9PW4/KGUubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fSkoZSk6KGUubG9jYWw/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19KShlLHIsbisiIikpfSxhdHRyVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3ZhciByPSQodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlKHQscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9KShyLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP0NlOkVyO3JldHVybiBudWxsPT1uP3RoaXMuc3R5bGVUd2Vlbih0LGZ1bmN0aW9uKHQsbil7dmFyIGUscixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxsdCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09ZSYmYT09PXI/aTppPW4oZT1vLHI9YSl9fSh0LHIpKS5vbigiZW5kLnN0eWxlLiIrdCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX0odCkpOnRoaXMuc3R5bGVUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9bHQodGhpcyx0KSx1PWUodGhpcyk7cmV0dXJuIG51bGw9PXUmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHU9bHQodGhpcyx0KSksYT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSl9fSh0LHIsU3IodGhpcywic3R5bGUuIit0LG4pKTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1sdCh0aGlzLHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19KHQscixuKyIiKSxlKX0sc3R5bGVUd2VlbjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKHI9dGhpcy50d2VlbihyKSkmJnIuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4ocixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4ocixmdW5jdGlvbih0LG4sZSl7ZnVuY3Rpb24gcigpe3ZhciByPXRoaXMsaT1uLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gaSYmZnVuY3Rpb24obil7ci5zdHlsZS5zZXRQcm9wZXJ0eSh0LGkobiksZSl9fXJldHVybiByLl92YWx1ZT1uLHJ9KHQsbixudWxsPT1lPyIiOmUpKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19KFNyKHRoaXMsInRleHQiLHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fShudWxsPT10PyIiOnQrIiIpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLCh0PXRoaXMuX2lkLGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9KSk7dmFyIHR9LHR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7aWYodCs9IiIsYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHIsaT1Ucih0aGlzLm5vZGUoKSxlKS50d2VlbixvPTAsYT1pLmxlbmd0aDtvPGE7KytvKWlmKChyPWlbb10pLm5hbWU9PT10KXJldHVybiByLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/ZnVuY3Rpb24odCxuKXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPUFyKHRoaXMsdCksbz1pLnR3ZWVuO2lmKG8hPT1lKWZvcih2YXIgYT0wLHU9KHI9ZT1vKS5sZW5ndGg7YTx1OysrYSlpZihyW2FdLm5hbWU9PT1uKXsocj1yLnNsaWNlKCkpLnNwbGljZShhLDEpO2JyZWFrfWkudHdlZW49cn19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1Bcih0aGlzLHQpLGE9by50d2VlbjtpZihhIT09cil7aT0ocj1hKS5zbGljZSgpO2Zvcih2YXIgdT17bmFtZTpuLHZhbHVlOmV9LGY9MCxjPWkubGVuZ3RoO2Y8YzsrK2YpaWYoaVtmXS5uYW1lPT09bil7aVtmXT11O2JyZWFrfWY9PT1jJiZpLnB1c2godSl9by50d2Vlbj1pfX0pKGUsdCxuKSl9LGRlbGF5OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtNcih0aGlzLHQpLmRlbGF5PStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtNcih0aGlzLHQpLmRlbGF5PW59fSkobix0KSk6VHIodGhpcy5ub2RlKCksbikuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtBcih0aGlzLHQpLmR1cmF0aW9uPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtBcih0aGlzLHQpLmR1cmF0aW9uPW59fSkobix0KSk6VHIodGhpcy5ub2RlKCksbikuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZWFzZT1ufX0obix0KSk6VHIodGhpcy5ub2RlKCksbikuZWFzZX19O3ZhciBxcj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucG93KHQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLE9yPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLFlyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLEJyPU1hdGguUEksRnI9QnIvMjtmdW5jdGlvbiBJcih0KXtyZXR1cm4oMS1NYXRoLmNvcyhCcip0KSkvMn1mdW5jdGlvbiBIcih0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KDIsMTAqdC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKnQpKS8yfWZ1bmN0aW9uIGpyKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBYcj00LzExLEdyPTYvMTEsVnI9OC8xMSwkcj0uNzUsV3I9OS8xMSxacj0xMC8xMSxRcj0uOTM3NSxKcj0yMS8yMixLcj02My82NCx0aT0xL1hyL1hyO2Z1bmN0aW9uIG5pKHQpe3JldHVybih0PSt0KTxYcj90aSp0KnQ6dDxWcj90aSoodC09R3IpKnQrJHI6dDxacj90aSoodC09V3IpKnQrUXI6dGkqKHQtPUpyKSp0K0tyfXZhciBlaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLHJpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksaWk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8MT90KnQqKChuKzEpKnQtbik6KHQtPTIpKnQqKChuKzEpKnQrbikrMikvMn1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLG9pPTIqTWF0aC5QSSxhaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0tdCkqTWF0aC5zaW4oKHItdCkvZSl9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpvaSl9LGkucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LGl9KDEsLjMpLHVpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiAxLW4qTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtyKS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksZmk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoci10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKHIrdCkvZSkpLzJ9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpvaSl9LGkucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LGl9KDEsLjMpLGNpPXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpVcn07ZnVuY3Rpb24gc2kodCxuKXtmb3IodmFyIGU7IShlPXQuX190cmFuc2l0aW9uKXx8IShlPWVbbl0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gY2kudGltZT1pcigpLGNpO3JldHVybiBlfUx0LnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe05yKHRoaXMsdCl9KX0sTHQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZTt0IGluc3RhbmNlb2YgUHI/KG49dC5faWQsdD10Ll9uYW1lKToobj1ScigpLChlPWNpKS50aW1lPWlyKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgYSx1PXJbb10sZj11Lmxlbmd0aCxjPTA7YzxmOysrYykoYT11W2NdKSYmd3IoYSx0LG4sYyx1LGV8fHNpKGEsbikpO3JldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsbil9O3ZhciBsaT1bbnVsbF07ZnVuY3Rpb24gaGkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGRpKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9ZnVuY3Rpb24gcGkoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHZpKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9dmFyIGdpPXtuYW1lOiJkcmFnIn0seWk9e25hbWU6InNwYWNlIn0sX2k9e25hbWU6ImhhbmRsZSJ9LGJpPXtuYW1lOiJjZW50ZXIifSxtaT17bmFtZToieCIsaGFuZGxlczpbImUiLCJ3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW3RbMF0sblswXVsxXV0sW3RbMV0sblsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0seGk9e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcChFaSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1tuWzBdWzBdLHRbMF1dLFtuWzFdWzBdLHRbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LHdpPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLm1hcChFaSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LE1pPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxBaT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sVGk9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LE5pPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LFNpPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9O2Z1bmN0aW9uIEVpKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIGtpKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIENpKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFBpKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gemkodCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBSaShuKXt2YXIgZSxyPUNpLGk9a2ksbz1JKHUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxhPTY7ZnVuY3Rpb24gdSh0KXt2YXIgZT10LnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbRWkoIm92ZXJsYXkiKV0pO2UuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsTWkub3ZlcmxheSkubWVyZ2UoZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PVBpKHRoaXMpLmV4dGVudDtEdCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSx0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW0VpKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciByPXQuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YShuLmhhbmRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pO3IuZXhpdCgpLnJlbW92ZSgpLHIuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkuYXR0cigiY3Vyc29yIixmdW5jdGlvbih0KXtyZXR1cm4gTWlbdC50eXBlXX0pLHQuZWFjaChmKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIHRvdWNoc3RhcnQuYnJ1c2giLGwpfWZ1bmN0aW9uIGYoKXt2YXIgdD1EdCh0aGlzKSxuPVBpKHRoaXMpLnNlbGVjdGlvbjtuPyh0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixuWzBdWzBdKS5hdHRyKCJ5IixuWzBdWzFdKS5hdHRyKCJ3aWR0aCIsblsxXVswXS1uWzBdWzBdKS5hdHRyKCJoZWlnaHQiLG5bMV1bMV0tblswXVsxXSksdC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/blsxXVswXS1hLzI6blswXVswXS1hLzJ9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4icyI9PT10LnR5cGVbMF0/blsxXVsxXS1hLzI6blswXVsxXS1hLzJ9KS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK2E6YX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/blsxXVsxXS1uWzBdWzFdK2E6YX0pKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gYyh0LG4pe3JldHVybiB0Ll9fYnJ1c2guZW1pdHRlcnx8bmV3IHModCxuKX1mdW5jdGlvbiBzKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MH1mdW5jdGlvbiBsKCl7aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiB2aSgpfWVsc2UgaWYoZSlyZXR1cm47aWYoaS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciByLG8sYSx1LHMsbCxoLGQscCx2LGcseSxfLGI9dGhpcyxtPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUseD0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/bT0ib3ZlcmxheSI6bSk/Z2k6dC5ldmVudC5hbHRLZXk/Ymk6X2ksdz1uPT09eGk/bnVsbDpOaVttXSxNPW49PT1taT9udWxsOlNpW21dLEE9UGkoYiksVD1BLmV4dGVudCxOPUEuc2VsZWN0aW9uLFM9VFswXVswXSxFPVRbMF1bMV0saz1UWzFdWzBdLEM9VFsxXVsxXSxQPXcmJk0mJnQuZXZlbnQuc2hpZnRLZXksej1GdChiKSxSPXosTD1jKGIsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PW0/QS5zZWxlY3Rpb249Tj1bW3I9bj09PXhpP1M6elswXSxhPW49PT1taT9FOnpbMV1dLFtzPW49PT14aT9rOnIsaD1uPT09bWk/QzphXV06KHI9TlswXVswXSxhPU5bMF1bMV0scz1OWzFdWzBdLGg9TlsxXVsxXSksbz1yLHU9YSxsPXMsZD1oO3ZhciBEPUR0KGIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLFU9RC5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixNaVttXSk7aWYodC5ldmVudC50b3VjaGVzKUQub24oInRvdWNobW92ZS5icnVzaCIsTywhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixCLCEwKTtlbHNle3ZhciBxPUR0KHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGZ1bmN0aW9uKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpQPXcmJk07YnJlYWs7Y2FzZSAxODp4PT09X2kmJih3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpLFkoKSk7YnJlYWs7Y2FzZSAzMjp4IT09X2kmJnghPT1iaXx8KHc8MD9zPWwtcDp3PjAmJihyPW8tcCksTTwwP2g9ZC12Ok0+MCYmKGE9dS12KSx4PXlpLFUuYXR0cigiY3Vyc29yIixNaS5zZWxlY3Rpb24pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJrZXl1cC5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlAmJih5PV89UD0hMSxZKCkpO2JyZWFrO2Nhc2UgMTg6eD09PWJpJiYodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pLFkoKSk7YnJlYWs7Y2FzZSAzMjp4PT09eWkmJih0LmV2ZW50LmFsdEtleT8odyYmKHM9bC1wKncscj1vK3AqdyksTSYmKGg9ZC12Kk0sYT11K3YqTSkseD1iaSk6KHc8MD9zPWw6dz4wJiYocj1vKSxNPDA/aD1kOk0+MCYmKGE9dSkseD1faSksVS5hdHRyKCJjdXJzb3IiLE1pW21dKSxZKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZpKCl9LCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixPLCEwKS5vbigibW91c2V1cC5icnVzaCIsQiwhMCk7WHQodC5ldmVudC52aWV3KX1waSgpLE5yKGIpLGYuY2FsbChiKSxMLnN0YXJ0KCl9ZnVuY3Rpb24gTygpe3ZhciB0PUZ0KGIpOyFQfHx5fHxffHwoTWF0aC5hYnModFswXS1SWzBdKT5NYXRoLmFicyh0WzFdLVJbMV0pP189ITA6eT0hMCksUj10LGc9ITAsdmkoKSxZKCl9ZnVuY3Rpb24gWSgpe3ZhciB0O3N3aXRjaChwPVJbMF0telswXSx2PVJbMV0telsxXSx4KXtjYXNlIHlpOmNhc2UgZ2k6dyYmKHA9TWF0aC5tYXgoUy1yLE1hdGgubWluKGstcyxwKSksbz1yK3AsbD1zK3ApLE0mJih2PU1hdGgubWF4KEUtYSxNYXRoLm1pbihDLWgsdikpLHU9YSt2LGQ9aCt2KTticmVhaztjYXNlIF9pOnc8MD8ocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1yLHApKSxvPXIrcCxsPXMpOnc+MCYmKHA9TWF0aC5tYXgoUy1zLE1hdGgubWluKGstcyxwKSksbz1yLGw9cytwKSxNPDA/KHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtYSx2KSksdT1hK3YsZD1oKTpNPjAmJih2PU1hdGgubWF4KEUtaCxNYXRoLm1pbihDLWgsdikpLHU9YSxkPWgrdik7YnJlYWs7Y2FzZSBiaTp3JiYobz1NYXRoLm1heChTLE1hdGgubWluKGssci1wKncpKSxsPU1hdGgubWF4KFMsTWF0aC5taW4oayxzK3AqdykpKSxNJiYodT1NYXRoLm1heChFLE1hdGgubWluKEMsYS12Kk0pKSxkPU1hdGgubWF4KEUsTWF0aC5taW4oQyxoK3YqTSkpKX1sPG8mJih3Kj0tMSx0PXIscj1zLHM9dCx0PW8sbz1sLGw9dCxtIGluIEFpJiZVLmF0dHIoImN1cnNvciIsTWlbbT1BaVttXV0pKSxkPHUmJihNKj0tMSx0PWEsYT1oLGg9dCx0PXUsdT1kLGQ9dCxtIGluIFRpJiZVLmF0dHIoImN1cnNvciIsTWlbbT1UaVttXV0pKSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHkmJihvPU5bMF1bMF0sbD1OWzFdWzBdKSxfJiYodT1OWzBdWzFdLGQ9TlsxXVsxXSksTlswXVswXT09PW8mJk5bMF1bMV09PT11JiZOWzFdWzBdPT09bCYmTlsxXVsxXT09PWR8fChBLnNlbGVjdGlvbj1bW28sdV0sW2wsZF1dLGYuY2FsbChiKSxMLmJydXNoKCkpfWZ1bmN0aW9uIEIoKXtpZihwaSgpLHQuZXZlbnQudG91Y2hlcyl7aWYodC5ldmVudC50b3VjaGVzLmxlbmd0aClyZXR1cm47ZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dChmdW5jdGlvbigpe2U9bnVsbH0sNTAwKSxELm9uKCJ0b3VjaG1vdmUuYnJ1c2ggdG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLG51bGwpfWVsc2UgR3QodC5ldmVudC52aWV3LGcpLHEub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO0QuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxVLmF0dHIoImN1cnNvciIsTWkub3ZlcmxheSksQS5zZWxlY3Rpb24mJihOPUEuc2VsZWN0aW9uKSx6aShOKSYmKEEuc2VsZWN0aW9uPW51bGwsZi5jYWxsKGIpKSxMLmVuZCgpfX1mdW5jdGlvbiBoKCl7dmFyIHQ9dGhpcy5fX2JydXNofHx7c2VsZWN0aW9uOm51bGx9O3JldHVybiB0LmV4dGVudD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmRpbT1uLHR9cmV0dXJuIHUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2ModGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2ModGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj10Ll9fYnJ1c2gsaT1jKHQsYXJndW1lbnRzKSxvPXIuc2VsZWN0aW9uLGE9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHIuZXh0ZW50KSx1PW1lKG8sYSk7ZnVuY3Rpb24gcyhuKXtyLnNlbGVjdGlvbj0xPT09biYmemkoYSk/bnVsbDp1KG4pLGYuY2FsbCh0KSxpLmJydXNoKCl9cmV0dXJuIG8mJmE/czpzKDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dGhpcy5fX2JydXNoLGk9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsdCk6ZSxyLmV4dGVudCksbz1jKHRoaXMsdCkuYmVmb3Jlc3RhcnQoKTtOcih0aGlzKSxyLnNlbGVjdGlvbj1udWxsPT1pfHx6aShpKT9udWxsOmksZi5jYWxsKHRoaXMpLG8uc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LHMucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7Q3QobmV3IGRpKHUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLG8uYXBwbHksbyxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSx1LmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhpKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSx1KTpyfSx1LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhpKCEhdCksdSk6aX0sdS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LHUpOmF9LHUub249ZnVuY3Rpb24oKXt2YXIgdD1vLm9uLmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gdD09PW8/dTp0fSx1fXZhciBMaT1NYXRoLmNvcyxEaT1NYXRoLnNpbixVaT1NYXRoLlBJLHFpPVVpLzIsT2k9MipVaSxZaT1NYXRoLm1heDt2YXIgQmk9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEZpKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgSWk9TWF0aC5QSSxIaT0yKklpLGppPUhpLTFlLTY7ZnVuY3Rpb24gWGkoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBHaSgpe3JldHVybiBuZXcgWGl9ZnVuY3Rpb24gVmkodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uICRpKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gWmkodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBRaSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1YaS5wcm90b3R5cGU9R2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYaSxtb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rbil9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iUSIrICt0KyIsIisgK24rIiwiKyh0aGlzLl94MT0rZSkrIiwiKyh0aGlzLl95MT0rcil9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtuKyIsIisgK2UrIiwiKyArcisiLCIrKHRoaXMuX3gxPStpKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxuLGUscixpKXt0PSt0LG49K24sZT0rZSxyPStyLGk9K2k7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSx1PWUtdCxmPXItbixjPW8tdCxzPWEtbixsPWMqYytzKnM7aWYoaTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2kpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlIGlmKGw+MWUtNilpZihNYXRoLmFicyhzKnUtZipjKT4xZS02JiZpKXt2YXIgaD1lLW8sZD1yLWEscD11KnUrZipmLHY9aCpoK2QqZCxnPU1hdGguc3FydChwKSx5PU1hdGguc3FydChsKSxfPWkqTWF0aC50YW4oKElpLU1hdGguYWNvcygocCtsLXYpLygyKmcqeSkpKS8yKSxiPV8veSxtPV8vZztNYXRoLmFicyhiLTEpPjFlLTYmJih0aGlzLl8rPSJMIisodCtiKmMpKyIsIisobitiKnMpKSx0aGlzLl8rPSJBIitpKyIsIitpKyIsMCwwLCIrICsocypoPmMqZCkrIiwiKyh0aGlzLl94MT10K20qdSkrIiwiKyh0aGlzLl95MT1uK20qZil9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlO30sYXJjOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0PSt0LG49K247dmFyIGE9KGU9K2UpKk1hdGguY29zKHIpLHU9ZSpNYXRoLnNpbihyKSxmPXQrYSxjPW4rdSxzPTFebyxsPW8/ci1pOmktcjtpZihlPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrZSk7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2YrIiwiK2M6KE1hdGguYWJzKHRoaXMuX3gxLWYpPjFlLTZ8fE1hdGguYWJzKHRoaXMuX3kxLWMpPjFlLTYpJiYodGhpcy5fKz0iTCIrZisiLCIrYyksZSYmKGw8MCYmKGw9bCVIaStIaSksbD5qaT90aGlzLl8rPSJBIitlKyIsIitlKyIsMCwxLCIrcysiLCIrKHQtYSkrIiwiKyhuLXUpKyJBIitlKyIsIitlKyIsMCwxLCIrcysiLCIrKHRoaXMuX3gxPWYpKyIsIisodGhpcy5feTE9Yyk6bD4xZS02JiYodGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsIisgKyhsPj1JaSkrIiwiK3MrIiwiKyh0aGlzLl94MT10K2UqTWF0aC5jb3MoaSkpKyIsIisodGhpcy5feTE9bitlKk1hdGguc2luKGkpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbikrImgiKyArZSsidiIrICtyKyJoIistZSsiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O2Z1bmN0aW9uIEppKCl7fWZ1bmN0aW9uIEtpKHQsbil7dmFyIGU9bmV3IEppO2lmKHQgaW5zdGFuY2VvZiBKaSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciBhIGluIHQpZS5zZXQoYSx0W2FdKTtyZXR1cm4gZX1mdW5jdGlvbiB0bygpe3JldHVybnt9fWZ1bmN0aW9uIG5vKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24gZW8oKXtyZXR1cm4gS2koKX1mdW5jdGlvbiBybyh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBpbygpe31KaS5wcm90b3R5cGU9S2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKaSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIiQiK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIit0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbIiQiK3RdPW4sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPSIkIit0O3JldHVybiBuIGluIHRoaXMmJmRlbGV0ZSB0aGlzW25dfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKSIkIj09PXRbMF0mJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKG4uc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2godGhpc1tuXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKCIkIj09PXRbMF0pcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgb289S2kucHJvdG90eXBlO2Z1bmN0aW9uIGFvKHQsbil7dmFyIGU9bmV3IGlvO2lmKHQgaW5zdGFuY2VvZiBpbyl0LmVhY2goZnVuY3Rpb24odCl7ZS5hZGQodCl9KTtlbHNlIGlmKHQpe3ZhciByPS0xLGk9dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysrcjxpOyllLmFkZCh0W3JdKTtlbHNlIGZvcig7KytyPGk7KWUuYWRkKG4odFtyXSxyLHQpKX1yZXR1cm4gZX1pby5wcm90b3R5cGU9YW8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppbyxoYXM6b28uaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siJCIrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6b28ucmVtb3ZlLGNsZWFyOm9vLmNsZWFyLHZhbHVlczpvby5rZXlzLHNpemU6b28uc2l6ZSxlbXB0eTpvby5lbXB0eSxlYWNoOm9vLmVhY2h9O3ZhciB1bz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gZm8odCxuKXtyZXR1cm4gdC1ufWZ1bmN0aW9uIGNvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBzbyh0LG4pe2Zvcih2YXIgZSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWlmKGU9bG8odCxuW3JdKSlyZXR1cm4gZTtyZXR1cm4gMH1mdW5jdGlvbiBsbyh0LG4pe2Zvcih2YXIgZT1uWzBdLHI9blsxXSxpPS0xLG89MCxhPXQubGVuZ3RoLHU9YS0xO288YTt1PW8rKyl7dmFyIGY9dFtvXSxjPWZbMF0scz1mWzFdLGw9dFt1XSxoPWxbMF0sZD1sWzFdO2lmKGhvKGYsbCxuKSlyZXR1cm4gMDtzPnIhPWQ+ciYmZTwoaC1jKSooci1zKS8oZC1zKStjJiYoaT0taSl9cmV0dXJuIGl9ZnVuY3Rpb24gaG8odCxuLGUpe3ZhciByLGksbyxhO3JldHVybiBmdW5jdGlvbih0LG4sZSl7cmV0dXJuKG5bMF0tdFswXSkqKGVbMV0tdFsxXSk9PShlWzBdLXRbMF0pKihuWzFdLXRbMV0pfSh0LG4sZSkmJihpPXRbcj0rKHRbMF09PT1uWzBdKV0sbz1lW3JdLGE9bltyXSxpPD1vJiZvPD1hfHxhPD1vJiZvPD1pKX1mdW5jdGlvbiBwbygpe312YXIgdm89W1tdLFtbWzEsMS41XSxbLjUsMV1dXSxbW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbLjUsMV1dXSxbW1sxLC41XSxbMS41LDFdXV0sW1tbMSwxLjVdLFsuNSwxXV0sW1sxLC41XSxbMS41LDFdXV0sW1tbMSwuNV0sWzEsMS41XV1dLFtbWzEsLjVdLFsuNSwxXV1dLFtbWy41LDFdLFsxLC41XV1dLFtbWzEsMS41XSxbMSwuNV1dXSxbW1suNSwxXSxbMSwuNV1dLFtbMS41LDFdLFsxLDEuNV1dXSxbW1sxLjUsMV0sWzEsLjVdXV0sW1tbLjUsMV0sWzEuNSwxXV1dLFtbWzEsMS41XSxbMS41LDFdXV0sW1tbLjUsMV0sWzEsMS41XV1dLFtdXTtmdW5jdGlvbiBnbygpe3ZhciB0PTEsbj0xLGU9TSxyPXU7ZnVuY3Rpb24gaSh0KXt2YXIgbj1lKHQpO2lmKEFycmF5LmlzQXJyYXkobikpbj1uLnNsaWNlKCkuc29ydChmbyk7ZWxzZXt2YXIgcj1zKHQpLGk9clswXSxhPXJbMV07bj13KGksYSxuKSxuPWcoTWF0aC5mbG9vcihpL24pKm4sTWF0aC5mbG9vcihhL24pKm4sbil9cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHQsbil9KX1mdW5jdGlvbiBvKGUsaSl7dmFyIG89W10sdT1bXTtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3ZhciBvLHUsZixjLHMsbCxoPW5ldyBBcnJheSxkPW5ldyBBcnJheTtvPXU9LTEsYz1lWzBdPj1yLHZvW2M8PDFdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylmPWMsYz1lW28rMV0+PXIsdm9bZnxjPDwxXS5mb3JFYWNoKHApO3ZvW2M8PDBdLmZvckVhY2gocCk7Zm9yKDsrK3U8bi0xOyl7Zm9yKG89LTEsYz1lW3UqdCt0XT49cixzPWVbdSp0XT49cix2b1tjPDwxfHM8PDJdLmZvckVhY2gocCk7KytvPHQtMTspZj1jLGM9ZVt1KnQrdCtvKzFdPj1yLGw9cyxzPWVbdSp0K28rMV0+PXIsdm9bZnxjPDwxfHM8PDJ8bDw8M10uZm9yRWFjaChwKTt2b1tjfHM8PDNdLmZvckVhY2gocCl9bz0tMSxzPWVbdSp0XT49cix2b1tzPDwyXS5mb3JFYWNoKHApO2Zvcig7KytvPHQtMTspbD1zLHM9ZVt1KnQrbysxXT49cix2b1tzPDwyfGw8PDNdLmZvckVhY2gocCk7ZnVuY3Rpb24gcCh0KXt2YXIgbixlLHI9W3RbMF1bMF0rbyx0WzBdWzFdK3VdLGY9W3RbMV1bMF0rbyx0WzFdWzFdK3VdLGM9YShyKSxzPWEoZik7KG49ZFtjXSk/KGU9aFtzXSk/KGRlbGV0ZSBkW24uZW5kXSxkZWxldGUgaFtlLnN0YXJ0XSxuPT09ZT8obi5yaW5nLnB1c2goZiksaShuLnJpbmcpKTpoW24uc3RhcnRdPWRbZS5lbmRdPXtzdGFydDpuLnN0YXJ0LGVuZDplLmVuZCxyaW5nOm4ucmluZy5jb25jYXQoZS5yaW5nKX0pOihkZWxldGUgZFtuLmVuZF0sbi5yaW5nLnB1c2goZiksZFtuLmVuZD1zXT1uKToobj1oW3NdKT8oZT1kW2NdKT8oZGVsZXRlIGhbbi5zdGFydF0sZGVsZXRlIGRbZS5lbmRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbZS5zdGFydF09ZFtuLmVuZF09e3N0YXJ0OmUuc3RhcnQsZW5kOm4uZW5kLHJpbmc6ZS5yaW5nLmNvbmNhdChuLnJpbmcpfSk6KGRlbGV0ZSBoW24uc3RhcnRdLG4ucmluZy51bnNoaWZ0KHIpLGhbbi5zdGFydD1jXT1uKTpoW2NdPWRbc109e3N0YXJ0OmMsZW5kOnMscmluZzpbcixmXX19dm9bczw8M10uZm9yRWFjaChwKX0oZSxpLGZ1bmN0aW9uKHQpe3IodCxlLGkpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGgscj10W2UtMV1bMV0qdFswXVswXS10W2UtMV1bMF0qdFswXVsxXTsrK248ZTspcis9dFtuLTFdWzFdKnRbbl1bMF0tdFtuLTFdWzBdKnRbbl1bMV07cmV0dXJuIHJ9KHQpPjA/by5wdXNoKFt0XSk6dS5wdXNoKHQpfSksdS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPTAscj1vLmxlbmd0aDtlPHI7KytlKWlmKC0xIT09c28oKG49b1tlXSlbMF0sdCkpcmV0dXJuIHZvaWQgbi5wdXNoKHQpfSkse3R5cGU6Ik11bHRpUG9seWdvbiIsdmFsdWU6aSxjb29yZGluYXRlczpvfX1mdW5jdGlvbiBhKG4pe3JldHVybiAyKm5bMF0rblsxXSoodCsxKSo0fWZ1bmN0aW9uIHUoZSxyLGkpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbyxhPWVbMF0sdT1lWzFdLGY9MHxhLGM9MHx1LHM9cltjKnQrZl07YT4wJiZhPHQmJmY9PT1hJiYobz1yW2MqdCtmLTFdLGVbMF09YSsoaS1vKS8ocy1vKS0uNSksdT4wJiZ1PG4mJmM9PT11JiYobz1yWyhjLTEpKnQrZl0sZVsxXT11KyhpLW8pLyhzLW8pLS41KX0pfXJldHVybiBpLmNvbnRvdXI9byxpLnNpemU9ZnVuY3Rpb24oZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3Qsbl07dmFyIHI9TWF0aC5jZWlsKGVbMF0pLG89TWF0aC5jZWlsKGVbMV0pO2lmKCEocj4wJiZvPjApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHQ9cixuPW8saX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9jbyh1by5jYWxsKHQpKTpjbyh0KSxpKTplfSxpLnNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10P3U6cG8saSk6cj09PXV9LGl9ZnVuY3Rpb24geW8odCxuLGUpe2Zvcih2YXIgcj10LndpZHRoLGk9dC5oZWlnaHQsbz0xKyhlPDwxKSxhPTA7YTxpOysrYSlmb3IodmFyIHU9MCxmPTA7dTxyK2U7Kyt1KXU8ciYmKGYrPXQuZGF0YVt1K2Eqcl0pLHU+PWUmJih1Pj1vJiYoZi09dC5kYXRhW3UtbythKnJdKSxuLmRhdGFbdS1lK2Eqcl09Zi9NYXRoLm1pbih1KzEsci0xK28tdSxvKSl9ZnVuY3Rpb24gX28odCxuLGUpe2Zvcih2YXIgcj10LndpZHRoLGk9dC5oZWlnaHQsbz0xKyhlPDwxKSxhPTA7YTxyOysrYSlmb3IodmFyIHU9MCxmPTA7dTxpK2U7Kyt1KXU8aSYmKGYrPXQuZGF0YVthK3Uqcl0pLHU+PWUmJih1Pj1vJiYoZi09dC5kYXRhW2ErKHUtbykqcl0pLG4uZGF0YVthKyh1LWUpKnJdPWYvTWF0aC5taW4odSsxLGktMStvLXUsbykpfWZ1bmN0aW9uIGJvKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG1vKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHhvKCl7cmV0dXJuIDF9dmFyIHdvPXt9LE1vPXt9LEFvPTM0LFRvPTEwLE5vPTEzO2Z1bmN0aW9uIFNvKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK24rIl0ifSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gRW8odCl7dmFyIG49bmV3IFJlZ0V4cCgnWyInK3QrIlxuXHJdIiksZT10LmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gcih0LG4pe3ZhciByLGk9W10sbz10Lmxlbmd0aCxhPTAsdT0wLGY9bzw9MCxjPSExO2Z1bmN0aW9uIHMoKXtpZihmKXJldHVybiBNbztpZihjKXJldHVybiBjPSExLHdvO3ZhciBuLHIsaT1hO2lmKHQuY2hhckNvZGVBdChpKT09PUFvKXtmb3IoO2ErKzxvJiZ0LmNoYXJDb2RlQXQoYSkhPT1Bb3x8dC5jaGFyQ29kZUF0KCsrYSk9PT1BbzspO3JldHVybihuPWEpPj1vP2Y9ITA6KHI9dC5jaGFyQ29kZUF0KGErKykpPT09VG8/Yz0hMDpyPT09Tm8mJihjPSEwLHQuY2hhckNvZGVBdChhKT09PVRvJiYrK2EpLHQuc2xpY2UoaSsxLG4tMSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7YTxvOyl7aWYoKHI9dC5jaGFyQ29kZUF0KG49YSsrKSk9PT1UbyljPSEwO2Vsc2UgaWYocj09PU5vKWM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYTtlbHNlIGlmKHIhPT1lKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKGksbil9cmV0dXJuIGY9ITAsdC5zbGljZShpLG8pfWZvcih0LmNoYXJDb2RlQXQoby0xKT09PVRvJiYtLW8sdC5jaGFyQ29kZUF0KG8tMSk9PT1ObyYmLS1vOyhyPXMoKSkhPT1Nbzspe2Zvcih2YXIgbD1bXTtyIT09d28mJnIhPT1NbzspbC5wdXNoKHIpLHI9cygpO24mJm51bGw9PShsPW4obCx1KyspKXx8aS5wdXNoKGwpfXJldHVybiBpfWZ1bmN0aW9uIGkobil7cmV0dXJuIG4ubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbnVsbD09dD8iIjpuLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odCxuKXt2YXIgZSxpLG89cih0LGZ1bmN0aW9uKHQscil7aWYoZSlyZXR1cm4gZSh0LHItMSk7aT10LGU9bj9mdW5jdGlvbih0LG4pe3ZhciBlPVNvKHQpO3JldHVybiBmdW5jdGlvbihyLGkpe3JldHVybiBuKGUociksaSx0KX19KHQsbik6U28odCl9KTtyZXR1cm4gby5jb2x1bW5zPWl8fFtdLG99LHBhcnNlUm93czpyLGZvcm1hdDpmdW5jdGlvbihuLGUpe3JldHVybiBudWxsPT1lJiYoZT1mdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLGU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIHIgaW4gdClyIGluIG58fGUucHVzaChuW3JdPXIpfSksZX0obikpLFtlLm1hcChvKS5qb2luKHQpXS5jb25jYXQobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBvKG5bdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfSxmb3JtYXRSb3dzOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChpKS5qb2luKCJcbiIpfX19dmFyIGtvPUVvKCIsIiksQ289a28ucGFyc2UsUG89a28ucGFyc2VSb3dzLHpvPWtvLmZvcm1hdCxSbz1rby5mb3JtYXRSb3dzLExvPUVvKCJcdCIpLERvPUxvLnBhcnNlLFVvPUxvLnBhcnNlUm93cyxxbz1Mby5mb3JtYXQsT289TG8uZm9ybWF0Um93cztmdW5jdGlvbiBZbyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQuYmxvYigpfWZ1bmN0aW9uIEJvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfWZ1bmN0aW9uIEZvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC50ZXh0KCl9ZnVuY3Rpb24gSW8odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEZvKX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApLElvKG4sZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gdChuLHIpfSl9fXZhciBqbz1IbyhDbyksWG89SG8oRG8pO2Z1bmN0aW9uIEdvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5qc29uKCl9ZnVuY3Rpb24gVm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIElvKG4sZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKG4sdCl9KX19dmFyICRvPVZvKCJhcHBsaWNhdGlvbi94bWwiKSxXbz1WbygidGV4dC9odG1sIiksWm89Vm8oImltYWdlL3N2Zyt4bWwiKTtmdW5jdGlvbiBRbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gSm8oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24gS28odCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sYSx1LGYsYyxzLGwsaCxkPXQuX3Jvb3QscD17ZGF0YTpyfSx2PXQuX3gwLGc9dC5feTAseT10Ll94MSxfPXQuX3kxO2lmKCFkKXJldHVybiB0Ll9yb290PXAsdDtmb3IoO2QubGVuZ3RoOylpZigoYz1uPj0obz0odit5KS8yKSk/dj1vOnk9bywocz1lPj0oYT0oZytfKS8yKSk/Zz1hOl89YSxpPWQsIShkPWRbbD1zPDwxfGNdKSlyZXR1cm4gaVtsXT1wLHQ7aWYodT0rdC5feC5jYWxsKG51bGwsZC5kYXRhKSxmPSt0Ll95LmNhbGwobnVsbCxkLmRhdGEpLG49PT11JiZlPT09ZilyZXR1cm4gcC5uZXh0PWQsaT9pW2xdPXA6dC5fcm9vdD1wLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hfXdoaWxlKChsPXM8PDF8Yyk9PShoPShmPj1hKTw8MXx1Pj1vKSk7cmV0dXJuIGlbaF09ZCxpW2xdPXAsdH1mdW5jdGlvbiB0YSh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiBuYSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBlYSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiByYSh0LG4sZSl7dmFyIHI9bmV3IGlhKG51bGw9PW4/bmE6bixudWxsPT1lP2VhOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIGlhKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gb2EodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufXZhciBhYT1yYS5wcm90b3R5cGU9aWEucHJvdG90eXBlO2Z1bmN0aW9uIHVhKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBmYSh0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gY2EodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gc2EodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gbGEodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBoYSh0KXtyZXR1cm4gdC55fWFhLmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IGlhKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1vYShyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPW9hKG4pKTtyZXR1cm4gZX0sYWEuYWRkPWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gS28odGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sYWEuYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0xLzAsYz0xLzAscz0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KGFbZV09cix1W2VdPWkscjxmJiYoZj1yKSxyPnMmJihzPXIpLGk8YyYmKGM9aSksaT5sJiYobD1pKSk7Zm9yKHM8ZiYmKGY9dGhpcy5feDAscz10aGlzLl94MSksbDxjJiYoYz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGYsYykuY292ZXIocyxsKSxlPTA7ZTxvOysrZSlLbyh0aGlzLGFbZV0sdVtlXSx0W2VdKTtyZXR1cm4gdGhpc30sYWEuY292ZXI9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgYSx1LGY9aS1lLGM9dGhpcy5fcm9vdDtzd2l0Y2godT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKG89cisoZio9MiksdD4oaT1lK2YpfHxuPm8pO2JyZWFrO2Nhc2UgMTpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKG89cisoZio9MiksKGU9aS1mKT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKHI9by0oZio9MiksdD4oaT1lK2YpfHxyPm4pO2JyZWFrO2Nhc2UgMzpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKHI9by0oZio9MiksKGU9aS1mKT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1jKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxhYS5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRve3QucHVzaChuLmRhdGEpfXdoaWxlKG49bi5uZXh0KX0pLHR9LGFhLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sYWEuZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGEsdSxmLGMscz10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEsZD10aGlzLl95MSxwPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmcC5wdXNoKG5ldyB0YSh2LHMsbCxoLGQpKSxudWxsPT1lP2U9MS8wOihzPXQtZSxsPW4tZSxoPXQrZSxkPW4rZSxlKj1lKTtmPXAucG9wKCk7KWlmKCEoISh2PWYubm9kZSl8fChpPWYueDApPmh8fChvPWYueTApPmR8fChhPWYueDEpPHN8fCh1PWYueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgZz0oaSthKS8yLHk9KG8rdSkvMjtwLnB1c2gobmV3IHRhKHZbM10sZyx5LGEsdSksbmV3IHRhKHZbMl0saSx5LGcsdSksbmV3IHRhKHZbMV0sZyxvLGEseSksbmV3IHRhKHZbMF0saSxvLGcseSkpLChjPShuPj15KTw8MXx0Pj1nKSYmKGY9cFtwLmxlbmd0aC0xXSxwW3AubGVuZ3RoLTFdPXBbcC5sZW5ndGgtMS1jXSxwW3AubGVuZ3RoLTEtY109Zil9ZWxzZXt2YXIgXz10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLGI9bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSxtPV8qXytiKmI7aWYobTxlKXt2YXIgeD1NYXRoLnNxcnQoZT1tKTtzPXQteCxsPW4teCxoPXQreCxkPW4reCxyPXYuZGF0YX19cmV0dXJuIHJ9LGFhLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKGE9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsLGgsZD10aGlzLl9yb290LHA9dGhpcy5feDAsdj10aGlzLl95MCxnPXRoaXMuX3gxLHk9dGhpcy5feTE7aWYoIWQpcmV0dXJuIHRoaXM7aWYoZC5sZW5ndGgpZm9yKDs7KXtpZigoYz1vPj0odT0ocCtnKS8yKSk/cD11Omc9dSwocz1hPj0oZj0odit5KS8yKSk/dj1mOnk9ZixuPWQsIShkPWRbbD1zPDwxfGNdKSlyZXR1cm4gdGhpcztpZighZC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtkLmRhdGEhPT10OylpZihyPWQsIShkPWQubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9ZC5uZXh0KSYmZGVsZXRlIGQubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKGQ9blswXXx8blsxXXx8blsyXXx8blszXSkmJmQ9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFkLmxlbmd0aCYmKGU/ZVtoXT1kOnRoaXMuX3Jvb3Q9ZCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sYWEucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30sYWEucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxhYS5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97Kyt0fXdoaWxlKG49bi5uZXh0KX0pLHR9LGFhLnZpc2l0PWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYSx1PVtdLGY9dGhpcy5fcm9vdDtmb3IoZiYmdS5wdXNoKG5ldyB0YShmLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7bj11LnBvcCgpOylpZighdChmPW4ubm9kZSxyPW4ueDAsaT1uLnkwLG89bi54MSxhPW4ueTEpJiZmLmxlbmd0aCl7dmFyIGM9KHIrbykvMixzPShpK2EpLzI7KGU9ZlszXSkmJnUucHVzaChuZXcgdGEoZSxjLHMsbyxhKSksKGU9ZlsyXSkmJnUucHVzaChuZXcgdGEoZSxyLHMsYyxhKSksKGU9ZlsxXSkmJnUucHVzaChuZXcgdGEoZSxjLGksbyxzKSksKGU9ZlswXSkmJnUucHVzaChuZXcgdGEoZSxyLGksYyxzKSl9cmV0dXJuIHRoaXN9LGFhLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IHRhKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLGE9bi54MCx1PW4ueTAsZj1uLngxLGM9bi55MSxzPShhK2YpLzIsbD0odStjKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IHRhKG8sYSx1LHMsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IHRhKG8scyx1LGYsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IHRhKG8sYSxsLHMsYykpLChvPWlbM10pJiZlLnB1c2gobmV3IHRhKG8scyxsLGYsYykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGFhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxhYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIGRhPTEwLHBhPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiB2YSh0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX1mdW5jdGlvbiBnYSh0KXtyZXR1cm4odD12YShNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciB5YSxfYT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBiYSh0KXtyZXR1cm4gbmV3IG1hKHQpfWZ1bmN0aW9uIG1hKHQpe2lmKCEobj1fYS5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBuO3RoaXMuZmlsbD1uWzFdfHwiICIsdGhpcy5hbGlnbj1uWzJdfHwiPiIsdGhpcy5zaWduPW5bM118fCItIix0aGlzLnN5bWJvbD1uWzRdfHwiIix0aGlzLnplcm89ISFuWzVdLHRoaXMud2lkdGg9bls2XSYmK25bNl0sdGhpcy5jb21tYT0hIW5bN10sdGhpcy5wcmVjaXNpb249bls4XSYmK25bOF0uc2xpY2UoMSksdGhpcy50cmltPSEhbls5XSx0aGlzLnR5cGU9blsxMF18fCIifWZ1bmN0aW9uIHhhKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrcjpyLmxlbmd0aD5pKzE/ci5zbGljZSgwLGkrMSkrIi4iK3Iuc2xpY2UoaSsxKTpyK25ldyBBcnJheShpLXIubGVuZ3RoKzIpLmpvaW4oIjAiKX1iYS5wcm90b3R5cGU9bWEucHJvdG90eXBlLG1hLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciB3YT17IiUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKG4pfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRXhwb25lbnRpYWwobil9LGY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b0ZpeGVkKG4pfSxnOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9QcmVjaXNpb24obil9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxuKXtyZXR1cm4geGEoMTAwKnQsbil9LHI6eGEsczpmdW5jdGlvbih0LG4pe3ZhciBlPXZhKHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV0sbz1pLSh5YT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkpKzEsYT1yLmxlbmd0aDtyZXR1cm4gbz09PWE/cjpvPmE/cituZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/ci5zbGljZSgwLG8pKyIuIityLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK3ZhKHQsTWF0aC5tYXgoMCxuK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19O2Z1bmN0aW9uIE1hKHQpe3JldHVybiB0fXZhciBBYSxUYT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gTmEodCl7dmFyIG4sZSxyPXQuZ3JvdXBpbmcmJnQudGhvdXNhbmRzPyhuPXQuZ3JvdXBpbmcsZT10LnRob3VzYW5kcyxmdW5jdGlvbih0LHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPVtdLGE9MCx1PW5bMF0sZj0wO2k+MCYmdT4wJiYoZit1KzE+ciYmKHU9TWF0aC5tYXgoMSxyLWYpKSxvLnB1c2godC5zdWJzdHJpbmcoaS09dSxpK3UpKSwhKChmKz11KzEpPnIpKTspdT1uW2E9KGErMSklbi5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfSk6TWEsaT10LmN1cnJlbmN5LG89dC5kZWNpbWFsLGE9dC5udW1lcmFscz9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19KHQubnVtZXJhbHMpOk1hLHU9dC5wZXJjZW50fHwiJSI7ZnVuY3Rpb24gZih0KXt2YXIgbj0odD1iYSh0KSkuZmlsbCxlPXQuYWxpZ24sZj10LnNpZ24sYz10LnN5bWJvbCxzPXQuemVybyxsPXQud2lkdGgsaD10LmNvbW1hLGQ9dC5wcmVjaXNpb24scD10LnRyaW0sdj10LnR5cGU7Im4iPT09dj8oaD0hMCx2PSJnIik6d2Fbdl18fChudWxsPT1kJiYoZD0xMikscD0hMCx2PSJnIiksKHN8fCIwIj09PW4mJiI9Ij09PWUpJiYocz0hMCxuPSIwIixlPSI9Iik7dmFyIGc9IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3Qodik/IjAiK3YudG9Mb3dlckNhc2UoKToiIix5PSIkIj09PWM/aVsxXTovWyVwXS8udGVzdCh2KT91OiIiLF89d2Fbdl0sYj0vW2RlZmdwcnMlXS8udGVzdCh2KTtmdW5jdGlvbiBtKHQpe3ZhciBpLHUsYyxtPWcseD15O2lmKCJjIj09PXYpeD1fKHQpK3gsdD0iIjtlbHNle3ZhciB3PSh0PSt0KTwwO2lmKHQ9XyhNYXRoLmFicyh0KSxkKSxwJiYodD1mdW5jdGlvbih0KXt0OmZvcih2YXIgbixlPXQubGVuZ3RoLHI9MSxpPS0xO3I8ZTsrK3Ipc3dpdGNoKHRbcl0pe2Nhc2UiLiI6aT1uPXI7YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9ciksbj1yO2JyZWFrO2RlZmF1bHQ6aWYoaT4wKXtpZighK3Rbcl0pYnJlYWsgdDtpPTB9fXJldHVybiBpPjA/dC5zbGljZSgwLGkpK3Quc2xpY2UobisxKTp0fSh0KSksdyYmMD09K3QmJih3PSExKSxtPSh3PyIoIj09PWY/ZjoiLSI6Ii0iPT09Znx8IigiPT09Zj8iIjpmKSttLHg9KCJzIj09PXY/VGFbOCt5YS8zXToiIikreCsodyYmIigiPT09Zj8iKSI6IiIpLGIpZm9yKGk9LTEsdT10Lmxlbmd0aDsrK2k8dTspaWYoNDg+KGM9dC5jaGFyQ29kZUF0KGkpKXx8Yz41Nyl7eD0oNDY9PT1jP28rdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK3gsdD10LnNsaWNlKDAsaSk7YnJlYWt9fWgmJiFzJiYodD1yKHQsMS8wKSk7dmFyIE09bS5sZW5ndGgrdC5sZW5ndGgreC5sZW5ndGgsQT1NPGw/bmV3IEFycmF5KGwtTSsxKS5qb2luKG4pOiIiO3N3aXRjaChoJiZzJiYodD1yKEErdCxBLmxlbmd0aD9sLXgubGVuZ3RoOjEvMCksQT0iIiksZSl7Y2FzZSI8Ijp0PW0rdCt4K0E7YnJlYWs7Y2FzZSI9Ijp0PW0rQSt0K3g7YnJlYWs7Y2FzZSJeIjp0PUEuc2xpY2UoMCxNPUEubGVuZ3RoPj4xKSttK3QreCtBLnNsaWNlKE0pO2JyZWFrO2RlZmF1bHQ6dD1BK20rdCt4fXJldHVybiBhKHQpfXJldHVybiBkPW51bGw9PWQ/NjovW2dwcnNdLy50ZXN0KHYpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZCkpLG0udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbX1yZXR1cm57Zm9ybWF0OmYsZm9ybWF0UHJlZml4OmZ1bmN0aW9uKHQsbil7dmFyIGU9ZigoKHQ9YmEodCkpLnR5cGU9ImYiLHQpKSxyPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGdhKG4pLzMpKSksaT1NYXRoLnBvdygxMCwtciksbz1UYVs4K3IvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKGkqdCkrb319fX1mdW5jdGlvbiBTYShuKXtyZXR1cm4gQWE9TmEobiksdC5mb3JtYXQ9QWEuZm9ybWF0LHQuZm9ybWF0UHJlZml4PUFhLmZvcm1hdFByZWZpeCxBYX1mdW5jdGlvbiBFYSh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtZ2EoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBrYSh0LG4pe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGdhKG4pLzMpKSktZ2EoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBDYSh0LG4pe3JldHVybiB0PU1hdGguYWJzKHQpLG49TWF0aC5hYnMobiktdCxNYXRoLm1heCgwLGdhKG4pLWdhKHQpKSsxfWZ1bmN0aW9uIFBhKCl7cmV0dXJuIG5ldyB6YX1mdW5jdGlvbiB6YSgpe3RoaXMucmVzZXQoKX1TYSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KSx6YS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnphLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7TGEoUmEsdCx0aGlzLnQpLExhKHRoaXMsUmEucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPVJhLnQ6dGhpcy5zPVJhLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIFJhPW5ldyB6YTtmdW5jdGlvbiBMYSh0LG4sZSl7dmFyIHI9dC5zPW4rZSxpPXItbixvPXItaTt0LnQ9bi1vKyhlLWkpfXZhciBEYT0xZS02LFVhPTFlLTEyLHFhPU1hdGguUEksT2E9cWEvMixZYT1xYS80LEJhPTIqcWEsRmE9MTgwL3FhLElhPXFhLzE4MCxIYT1NYXRoLmFicyxqYT1NYXRoLmF0YW4sWGE9TWF0aC5hdGFuMixHYT1NYXRoLmNvcyxWYT1NYXRoLmNlaWwsJGE9TWF0aC5leHAsV2E9TWF0aC5sb2csWmE9TWF0aC5wb3csUWE9TWF0aC5zaW4sSmE9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LEthPU1hdGguc3FydCx0dT1NYXRoLnRhbjtmdW5jdGlvbiBudSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9xYTpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gZXUodCl7cmV0dXJuIHQ+MT9PYTp0PC0xPy1PYTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gcnUodCl7cmV0dXJuKHQ9UWEodC8yKSkqdH1mdW5jdGlvbiBpdSgpe31mdW5jdGlvbiBvdSh0LG4pe3QmJnV1Lmhhc093blByb3BlcnR5KHQudHlwZSkmJnV1W3QudHlwZV0odCxuKX12YXIgYXU9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtvdSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXS5nZW9tZXRyeSxuKX19LHV1PXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7ZnUodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWZ1KGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe2N1KHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspY3UoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KW91KGVbcl0sbil9fTtmdW5jdGlvbiBmdSh0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBjdSh0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KWZ1KHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBzdSh0LG4pe3QmJmF1Lmhhc093blByb3BlcnR5KHQudHlwZSk/YXVbdC50eXBlXSh0LG4pOm91KHQsbil9dmFyIGx1LGh1LGR1LHB1LHZ1LGd1PVBhKCkseXU9UGEoKSxfdT17cG9pbnQ6aXUsbGluZVN0YXJ0Oml1LGxpbmVFbmQ6aXUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Z3UucmVzZXQoKSxfdS5saW5lU3RhcnQ9YnUsX3UubGluZUVuZD1tdX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStndTt5dS5hZGQodDwwP0JhK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9aXV9LHNwaGVyZTpmdW5jdGlvbigpe3l1LmFkZChCYSl9fTtmdW5jdGlvbiBidSgpe191LnBvaW50PXh1fWZ1bmN0aW9uIG11KCl7d3UobHUsaHUpfWZ1bmN0aW9uIHh1KHQsbil7X3UucG9pbnQ9d3UsbHU9dCxodT1uLGR1PXQqPUlhLHB1PUdhKG49KG4qPUlhKS8yK1lhKSx2dT1RYShuKX1mdW5jdGlvbiB3dSh0LG4pe3ZhciBlPSh0Kj1JYSktZHUscj1lPj0wPzE6LTEsaT1yKmUsbz1HYShuPShuKj1JYSkvMitZYSksYT1RYShuKSx1PXZ1KmEsZj1wdSpvK3UqR2EoaSksYz11KnIqUWEoaSk7Z3UuYWRkKFhhKGMsZikpLGR1PXQscHU9byx2dT1hfWZ1bmN0aW9uIE11KHQpe3JldHVybltYYSh0WzFdLHRbMF0pLGV1KHRbMl0pXX1mdW5jdGlvbiBBdSh0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUdhKGUpO3JldHVybltyKkdhKG4pLHIqUWEobiksUWEoZSldfWZ1bmN0aW9uIFR1KHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIE51KHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBTdSh0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIEV1KHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBrdSh0KXt2YXIgbj1LYSh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59dmFyIEN1LFB1LHp1LFJ1LEx1LER1LFV1LHF1LE91LFl1LEJ1LEZ1LEl1LEh1LGp1LFh1LEd1LFZ1LCR1LFd1LFp1LFF1LEp1LEt1LHRmLG5mLGVmPVBhKCkscmY9e3BvaW50Om9mLGxpbmVTdGFydDp1ZixsaW5lRW5kOmZmLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3JmLnBvaW50PWNmLHJmLmxpbmVTdGFydD1zZixyZi5saW5lRW5kPWxmLGVmLnJlc2V0KCksX3UucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtfdS5wb2x5Z29uRW5kKCkscmYucG9pbnQ9b2YscmYubGluZVN0YXJ0PXVmLHJmLmxpbmVFbmQ9ZmYsZ3U8MD8oQ3U9LSh6dT0xODApLFB1PS0oUnU9OTApKTplZj5EYT9SdT05MDplZjwtRGEmJihQdT0tOTApLFl1WzBdPUN1LFl1WzFdPXp1fX07ZnVuY3Rpb24gb2YodCxuKXtPdS5wdXNoKFl1PVtDdT10LHp1PXRdKSxuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pfWZ1bmN0aW9uIGFmKHQsbil7dmFyIGU9QXUoW3QqSWEsbipJYV0pO2lmKHF1KXt2YXIgcj1OdShxdSxlKSxpPU51KFtyWzFdLC1yWzBdLDBdLHIpO2t1KGkpLGk9TXUoaSk7dmFyIG8sYT10LUx1LHU9YT4wPzE6LTEsZj1pWzBdKkZhKnUsYz1IYShhKT4xODA7Y14odSpMdTxmJiZmPHUqdCk/KG89aVsxXSpGYSk+UnUmJihSdT1vKTpjXih1Kkx1PChmPShmKzM2MCklMzYwLTE4MCkmJmY8dSp0KT8obz0taVsxXSpGYSk8UHUmJihQdT1vKToobjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSksYz90PEx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpOnp1Pj1DdT8odDxDdSYmKEN1PXQpLHQ+enUmJih6dT10KSk6dD5MdT9oZihDdSx0KT5oZihDdSx6dSkmJih6dT10KTpoZih0LHp1KT5oZihDdSx6dSkmJihDdT10KX1lbHNlIE91LnB1c2goWXU9W0N1PXQsenU9dF0pO248UHUmJihQdT1uKSxuPlJ1JiYoUnU9bikscXU9ZSxMdT10fWZ1bmN0aW9uIHVmKCl7cmYucG9pbnQ9YWZ9ZnVuY3Rpb24gZmYoKXtZdVswXT1DdSxZdVsxXT16dSxyZi5wb2ludD1vZixxdT1udWxsfWZ1bmN0aW9uIGNmKHQsbil7aWYocXUpe3ZhciBlPXQtTHU7ZWYuYWRkKEhhKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgRHU9dCxVdT1uO191LnBvaW50KHQsbiksYWYodCxuKX1mdW5jdGlvbiBzZigpe191LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGxmKCl7Y2YoRHUsVXUpLF91LmxpbmVFbmQoKSxIYShlZik+RGEmJihDdT0tKHp1PTE4MCkpLFl1WzBdPUN1LFl1WzFdPXp1LHF1PW51bGx9ZnVuY3Rpb24gaGYodCxuKXtyZXR1cm4obi09dCk8MD9uKzM2MDpufWZ1bmN0aW9uIGRmKHQsbil7cmV0dXJuIHRbMF0tblswXX1mdW5jdGlvbiBwZih0LG4pe3JldHVybiB0WzBdPD10WzFdP3RbMF08PW4mJm48PXRbMV06bjx0WzBdfHx0WzFdPG59dmFyIHZmPXtzcGhlcmU6aXUscG9pbnQ6Z2YsbGluZVN0YXJ0Ol9mLGxpbmVFbmQ6eGYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dmYubGluZVN0YXJ0PXdmLHZmLmxpbmVFbmQ9TWZ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9X2YsdmYubGluZUVuZD14Zn19O2Z1bmN0aW9uIGdmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO3lmKGUqR2EodCksZSpRYSh0KSxRYShuKSl9ZnVuY3Rpb24geWYodCxuLGUpe0l1Kz0odC1JdSkvKytCdSxIdSs9KG4tSHUpL0J1LGp1Kz0oZS1qdSkvQnV9ZnVuY3Rpb24gX2YoKXt2Zi5wb2ludD1iZn1mdW5jdGlvbiBiZih0LG4pe3QqPUlhO3ZhciBlPUdhKG4qPUlhKTtLdT1lKkdhKHQpLHRmPWUqUWEodCksbmY9UWEobiksdmYucG9pbnQ9bWYseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIG1mKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpLHI9ZSpHYSh0KSxpPWUqUWEodCksbz1RYShuKSxhPVhhKEthKChhPXRmKm8tbmYqaSkqYSsoYT1uZipyLUt1Km8pKmErKGE9S3UqaS10ZipyKSphKSxLdSpyK3RmKmkrbmYqbyk7RnUrPWEsWHUrPWEqKEt1KyhLdT1yKSksR3UrPWEqKHRmKyh0Zj1pKSksVnUrPWEqKG5mKyhuZj1vKSkseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIHhmKCl7dmYucG9pbnQ9Z2Z9ZnVuY3Rpb24gd2YoKXt2Zi5wb2ludD1BZn1mdW5jdGlvbiBNZigpe1RmKFF1LEp1KSx2Zi5wb2ludD1nZn1mdW5jdGlvbiBBZih0LG4pe1F1PXQsSnU9bix0Kj1JYSxuKj1JYSx2Zi5wb2ludD1UZjt2YXIgZT1HYShuKTtLdT1lKkdhKHQpLHRmPWUqUWEodCksbmY9UWEobikseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIFRmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpLHI9ZSpHYSh0KSxpPWUqUWEodCksbz1RYShuKSxhPXRmKm8tbmYqaSx1PW5mKnItS3UqbyxmPUt1KmktdGYqcixjPUthKGEqYSt1KnUrZipmKSxzPWV1KGMpLGw9YyYmLXMvYzskdSs9bCphLFd1Kz1sKnUsWnUrPWwqZixGdSs9cyxYdSs9cyooS3UrKEt1PXIpKSxHdSs9cyoodGYrKHRmPWkpKSxWdSs9cyoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gTmYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFNmKHQsbil7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPXQoZSxyKSxuKGVbMF0sZVsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZuLmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuKGU9bi5pbnZlcnQoZSxyKSkmJnQuaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIEVmKHQsbil7cmV0dXJuW3Q+cWE/dC1CYTp0PC1xYT90K0JhOnQsbl19ZnVuY3Rpb24ga2YodCxuLGUpe3JldHVybih0JT1CYSk/bnx8ZT9TZihQZih0KSx6ZihuLGUpKTpQZih0KTpufHxlP3pmKG4sZSk6RWZ9ZnVuY3Rpb24gQ2YodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuWyhuKz10KT5xYT9uLUJhOm48LXFhP24rQmE6bixlXX19ZnVuY3Rpb24gUGYodCl7dmFyIG49Q2YodCk7cmV0dXJuIG4uaW52ZXJ0PUNmKC10KSxufWZ1bmN0aW9uIHpmKHQsbil7dmFyIGU9R2EodCkscj1RYSh0KSxpPUdhKG4pLG89UWEobik7ZnVuY3Rpb24gYSh0LG4pe3ZhciBhPUdhKG4pLHU9R2EodCkqYSxmPVFhKHQpKmEsYz1RYShuKSxzPWMqZSt1KnI7cmV0dXJuW1hhKGYqaS1zKm8sdSplLWMqciksZXUocyppK2YqbyldfXJldHVybiBhLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBhPUdhKG4pLHU9R2EodCkqYSxmPVFhKHQpKmEsYz1RYShuKSxzPWMqaS1mKm87cmV0dXJuW1hhKGYqaStjKm8sdSplK3MqciksZXUocyplLXUqcildfSxhfWZ1bmN0aW9uIFJmKHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuKG49dChuWzBdKklhLG5bMV0qSWEpKVswXSo9RmEsblsxXSo9RmEsbn1yZXR1cm4gdD1rZih0WzBdKklhLHRbMV0qSWEsdC5sZW5ndGg+Mj90WzJdKklhOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybihuPXQuaW52ZXJ0KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufSxufWZ1bmN0aW9uIExmKHQsbixlLHIsaSxvKXtpZihlKXt2YXIgYT1HYShuKSx1PVFhKG4pLGY9ciplO251bGw9PWk/KGk9bityKkJhLG89bi1mLzIpOihpPURmKGEsaSksbz1EZihhLG8pLChyPjA/aTxvOmk+bykmJihpKz1yKkJhKSk7Zm9yKHZhciBjLHM9aTtyPjA/cz5vOnM8bztzLT1mKWM9TXUoW2EsLXUqR2EocyksLXUqUWEocyldKSx0LnBvaW50KGNbMF0sY1sxXSl9fWZ1bmN0aW9uIERmKHQsbil7KG49QXUobikpWzBdLT10LGt1KG4pO3ZhciBlPW51KC1uWzFdKTtyZXR1cm4oKC1uWzJdPDA/LWU6ZSkrQmEtRGEpJUJhfWZ1bmN0aW9uIFVmKCl7dmFyIHQsbj1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixlKXt0LnB1c2goW24sZV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6aXUscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gcWYodCxuKXtyZXR1cm4gSGEodFswXS1uWzBdKTxEYSYmSGEodFsxXS1uWzFdKTxEYX1mdW5jdGlvbiBPZih0LG4sZSxyKXt0aGlzLng9dCx0aGlzLno9bix0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFlmKHQsbixlLHIsaSl7dmFyIG8sYSx1PVtdLGY9W107aWYodC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCEoKG49dC5sZW5ndGgtMSk8PTApKXt2YXIgbixlLHI9dFswXSxhPXRbbl07aWYocWYocixhKSl7Zm9yKGkubGluZVN0YXJ0KCksbz0wO288bjsrK28paS5wb2ludCgocj10W29dKVswXSxyWzFdKTtpLmxpbmVFbmQoKX1lbHNlIHUucHVzaChlPW5ldyBPZihyLHQsbnVsbCwhMCkpLGYucHVzaChlLm89bmV3IE9mKHIsbnVsbCxlLCExKSksdS5wdXNoKGU9bmV3IE9mKGEsdCxudWxsLCExKSksZi5wdXNoKGUubz1uZXcgT2YoYSxudWxsLGUsITApKX19KSx1Lmxlbmd0aCl7Zm9yKGYuc29ydChuKSxCZih1KSxCZihmKSxvPTAsYT1mLmxlbmd0aDtvPGE7KytvKWZbb10uZT1lPSFlO2Zvcih2YXIgYyxzLGw9dVswXTs7KXtmb3IodmFyIGg9bCxkPSEwO2gudjspaWYoKGg9aC5uKT09PWwpcmV0dXJuO2M9aC56LGkubGluZVN0YXJ0KCk7ZG97aWYoaC52PWguby52PSEwLGguZSl7aWYoZClmb3Iobz0wLGE9Yy5sZW5ndGg7bzxhOysrbylpLnBvaW50KChzPWNbb10pWzBdLHNbMV0pO2Vsc2UgcihoLngsaC5uLngsMSxpKTtoPWgubn1lbHNle2lmKGQpZm9yKGM9aC5wLnosbz1jLmxlbmd0aC0xO28+PTA7LS1vKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLnAueCwtMSxpKTtoPWgucH1jPShoPWgubykueixkPSFkfXdoaWxlKCFoLnYpO2kubGluZUVuZCgpfX19ZnVuY3Rpb24gQmYodCl7aWYobj10Lmxlbmd0aCl7Zm9yKHZhciBuLGUscj0wLGk9dFswXTsrK3I8bjspaS5uPWU9dFtyXSxlLnA9aSxpPWU7aS5uPWU9dFswXSxlLnA9aX19RWYuaW52ZXJ0PUVmO3ZhciBGZj1QYSgpO2Z1bmN0aW9uIElmKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1RYShyKSxvPVtRYShlKSwtR2EoZSksMF0sYT0wLHU9MDtGZi5yZXNldCgpLDE9PT1pP3I9T2ErRGE6LTE9PT1pJiYocj0tT2EtRGEpO2Zvcih2YXIgZj0wLGM9dC5sZW5ndGg7ZjxjOysrZilpZihsPShzPXRbZl0pLmxlbmd0aClmb3IodmFyIHMsbCxoPXNbbC0xXSxkPWhbMF0scD1oWzFdLzIrWWEsdj1RYShwKSxnPUdhKHApLHk9MDt5PGw7Kyt5LGQ9Yix2PXgsZz13LGg9Xyl7dmFyIF89c1t5XSxiPV9bMF0sbT1fWzFdLzIrWWEseD1RYShtKSx3PUdhKG0pLE09Yi1kLEE9TT49MD8xOi0xLFQ9QSpNLE49VD5xYSxTPXYqeDtpZihGZi5hZGQoWGEoUypBKlFhKFQpLGcqdytTKkdhKFQpKSksYSs9Tj9NK0EqQmE6TSxOXmQ+PWVeYj49ZSl7dmFyIEU9TnUoQXUoaCksQXUoXykpO2t1KEUpO3ZhciBrPU51KG8sRSk7a3Uoayk7dmFyIEM9KE5eTT49MD8tMToxKSpldShrWzJdKTsocj5DfHxyPT09QyYmKEVbMF18fEVbMV0pKSYmKHUrPU5eTT49MD8xOi0xKX19cmV0dXJuKGE8LURhfHxhPERhJiZGZjwtRGEpXjEmdX1mdW5jdGlvbiBIZih0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG8sYSx1LGY9bihpKSxjPVVmKCkscz1uKGMpLGw9ITEsaD17cG9pbnQ6ZCxsaW5lU3RhcnQ6dixsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7aC5wb2ludD15LGgubGluZVN0YXJ0PV8saC5saW5lRW5kPWIsYT1bXSxvPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7aC5wb2ludD1kLGgubGluZVN0YXJ0PXYsaC5saW5lRW5kPWcsYT1OKGEpO3ZhciB0PUlmKG8scik7YS5sZW5ndGg/KGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLFlmKGEsWGYsdCxlLGkpKTp0JiYobHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxsJiYoaS5wb2x5Z29uRW5kKCksbD0hMSksYT1vPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gZChuLGUpe3QobixlKSYmaS5wb2ludChuLGUpfWZ1bmN0aW9uIHAodCxuKXtmLnBvaW50KHQsbil9ZnVuY3Rpb24gdigpe2gucG9pbnQ9cCxmLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtoLnBvaW50PWQsZi5saW5lRW5kKCl9ZnVuY3Rpb24geSh0LG4pe3UucHVzaChbdCxuXSkscy5wb2ludCh0LG4pfWZ1bmN0aW9uIF8oKXtzLmxpbmVTdGFydCgpLHU9W119ZnVuY3Rpb24gYigpe3kodVswXVswXSx1WzBdWzFdKSxzLmxpbmVFbmQoKTt2YXIgdCxuLGUscixmPXMuY2xlYW4oKSxoPWMucmVzdWx0KCksZD1oLmxlbmd0aDtpZih1LnBvcCgpLG8ucHVzaCh1KSx1PW51bGwsZClpZigxJmYpe2lmKChuPShlPWhbMF0pLmxlbmd0aC0xKT4wKXtmb3IobHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksaS5saW5lU3RhcnQoKSx0PTA7dDxuOysrdClpLnBvaW50KChyPWVbdF0pWzBdLHJbMV0pO2kubGluZUVuZCgpfX1lbHNlIGQ+MSYmMiZmJiZoLnB1c2goaC5wb3AoKS5jb25jYXQoaC5zaGlmdCgpKSksYS5wdXNoKGguZmlsdGVyKGpmKSl9cmV0dXJuIGh9fWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIFhmKHQsbil7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLU9hLURhOk9hLXRbMV0pLSgobj1uLngpWzBdPDA/blsxXS1PYS1EYTpPYS1uWzFdKX12YXIgR2Y9SGYoZnVuY3Rpb24oKXtyZXR1cm4hMH0sZnVuY3Rpb24odCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLGEpe3ZhciB1PW8+MD9xYTotcWEsZj1IYShvLWUpO0hhKGYtcWEpPERhPyh0LnBvaW50KGUscj0ocithKS8yPjA/T2E6LU9hKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksdC5wb2ludChvLHIpLG49MCk6aSE9PXUmJmY+PXFhJiYoSGEoZS1pKTxEYSYmKGUtPWkqRGEpLEhhKG8tdSk8RGEmJihvLT11KkRhKSxyPWZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sYT1RYSh0LWUpO3JldHVybiBIYShhKT5EYT9qYSgoUWEobikqKG89R2EocikpKlFhKGUpLVFhKHIpKihpPUdhKG4pKSpRYSh0KSkvKGkqbyphKSk6KG4rcikvMn0oZSxyLG8sYSksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh1LHIpLG49MCksdC5wb2ludChlPW8scj1hKSxpPXV9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLW59fX0sZnVuY3Rpb24odCxuLGUscil7dmFyIGk7aWYobnVsbD09dClpPWUqT2Esci5wb2ludCgtcWEsaSksci5wb2ludCgwLGkpLHIucG9pbnQocWEsaSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC1pKSxyLnBvaW50KDAsLWkpLHIucG9pbnQoLXFhLC1pKSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSxpKTtlbHNlIGlmKEhhKHRbMF0tblswXSk+RGEpe3ZhciBvPXRbMF08blswXT9xYTotcWE7aT1lKm8vMixyLnBvaW50KC1vLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KG8saSl9ZWxzZSByLnBvaW50KG5bMF0sblsxXSl9LFstcWEsLU9hXSk7ZnVuY3Rpb24gVmYodCl7dmFyIG49R2EodCksZT02KklhLHI9bj4wLGk9SGEobik+RGE7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBHYSh0KSpHYShlKT5ufWZ1bmN0aW9uIGEodCxlLHIpe3ZhciBpPVsxLDAsMF0sbz1OdShBdSh0KSxBdShlKSksYT1UdShvLG8pLHU9b1swXSxmPWEtdSp1O2lmKCFmKXJldHVybiFyJiZ0O3ZhciBjPW4qYS9mLHM9LW4qdS9mLGw9TnUoaSxvKSxoPUV1KGksYyk7U3UoaCxFdShvLHMpKTt2YXIgZD1sLHA9VHUoaCxkKSx2PVR1KGQsZCksZz1wKnAtdiooVHUoaCxoKS0xKTtpZighKGc8MCkpe3ZhciB5PUthKGcpLF89RXUoZCwoLXAteSkvdik7aWYoU3UoXyxoKSxfPU11KF8pLCFyKXJldHVybiBfO3ZhciBiLG09dFswXSx4PWVbMF0sdz10WzFdLE09ZVsxXTt4PG0mJihiPW0sbT14LHg9Yik7dmFyIEE9eC1tLFQ9SGEoQS1xYSk8RGE7aWYoIVQmJk08dyYmKGI9dyx3PU0sTT1iKSxUfHxBPERhP1Q/dytNPjBeX1sxXTwoSGEoX1swXS1tKTxEYT93Ok0pOnc8PV9bMV0mJl9bMV08PU06QT5xYV4obTw9X1swXSYmX1swXTw9eCkpe3ZhciBOPUV1KGQsKC1wK3kpL3YpO3JldHVybiBTdShOLGgpLFtfLE11KE4pXX19fWZ1bmN0aW9uIHUobixlKXt2YXIgaT1yP3Q6cWEtdCxvPTA7cmV0dXJuIG48LWk/b3w9MTpuPmkmJihvfD0yKSxlPC1pP298PTQ6ZT5pJiYob3w9OCksb31yZXR1cm4gSGYobyxmdW5jdGlvbih0KXt2YXIgbixlLGYsYyxzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPWY9ITEscz0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBkLHA9W2wsaF0sdj1vKGwsaCksZz1yP3Y/MDp1KGwsaCk6dj91KGwrKGw8MD9xYTotcWEpLGgpOjA7aWYoIW4mJihjPWY9dikmJnQubGluZVN0YXJ0KCksdiE9PWYmJighKGQ9YShuLHApKXx8cWYobixkKXx8cWYocCxkKSkmJihwWzBdKz1EYSxwWzFdKz1EYSx2PW8ocFswXSxwWzFdKSksdiE9PWYpcz0wLHY/KHQubGluZVN0YXJ0KCksZD1hKHAsbiksdC5wb2ludChkWzBdLGRbMV0pKTooZD1hKG4scCksdC5wb2ludChkWzBdLGRbMV0pLHQubGluZUVuZCgpKSxuPWQ7ZWxzZSBpZihpJiZuJiZyXnYpe3ZhciB5O2cmZXx8ISh5PWEocCxuLCEwKSl8fChzPTAscj8odC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSksdC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh5WzBdWzBdLHlbMF1bMV0pKSl9IXZ8fG4mJnFmKG4scCl8fHQucG9pbnQocFswXSxwWzFdKSxuPXAsZj12LGU9Z30sbGluZUVuZDpmdW5jdGlvbigpe2YmJnQubGluZUVuZCgpLG49bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3woYyYmZik8PDF9fX0sZnVuY3Rpb24obixyLGksbyl7TGYobyx0LGUsaSxuLHIpfSxyP1swLC10XTpbLXFhLHQtcWFdKX12YXIgJGY9MWU5LFdmPS0kZjtmdW5jdGlvbiBaZih0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sdSxjKXt2YXIgcz0wLGw9MDtpZihudWxsPT1pfHwocz1hKGksdSkpIT09KGw9YShvLHUpKXx8ZihpLG8pPDBedT4wKWRve2MucG9pbnQoMD09PXN8fDM9PT1zP3Q6ZSxzPjE/cjpuKX13aGlsZSgocz0ocyt1KzQpJTQpIT09bCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShyLGkpe3JldHVybiBIYShyWzBdLXQpPERhP2k+MD8wOjM6SGEoclswXS1lKTxEYT9pPjA/MjoxOkhhKHJbMV0tbik8RGE/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIHUodCxuKXtyZXR1cm4gZih0Lngsbi54KX1mdW5jdGlvbiBmKHQsbil7dmFyIGU9YSh0LDEpLHI9YShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgZixjLHMsbCxoLGQscCx2LGcseSxfLGI9YSxtPVVmKCkseD17cG9pbnQ6dyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt4LnBvaW50PU0sYyYmYy5wdXNoKHM9W10pO3k9ITAsZz0hMSxwPXY9TmFOfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmKE0obCxoKSxkJiZnJiZtLnJlam9pbigpLGYucHVzaChtLnJlc3VsdCgpKSk7eC5wb2ludD13LGcmJmIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtiPW0sZj1bXSxjPVtdLF89ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLGU9MCxpPWMubGVuZ3RoO2U8aTsrK2UpZm9yKHZhciBvLGEsdT1jW2VdLGY9MSxzPXUubGVuZ3RoLGw9dVswXSxoPWxbMF0sZD1sWzFdO2Y8czsrK2Ypbz1oLGE9ZCxsPXVbZl0saD1sWzBdLGQ9bFsxXSxhPD1yP2Q+ciYmKGgtbykqKHItYSk+KGQtYSkqKHQtbykmJisrbjpkPD1yJiYoaC1vKSooci1hKTwoZC1hKSoodC1vKSYmLS1uO3JldHVybiBufSgpLGU9XyYmbixpPShmPU4oZikpLmxlbmd0aDsoZXx8aSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLGkmJllmKGYsdSxuLG8sYSksYS5wb2x5Z29uRW5kKCkpO2I9YSxmPWM9cz1udWxsfX07ZnVuY3Rpb24gdyh0LG4pe2kodCxuKSYmYi5wb2ludCh0LG4pfWZ1bmN0aW9uIE0obyxhKXt2YXIgdT1pKG8sYSk7aWYoYyYmcy5wdXNoKFtvLGFdKSx5KWw9byxoPWEsZD11LHk9ITEsdSYmKGIubGluZVN0YXJ0KCksYi5wb2ludChvLGEpKTtlbHNlIGlmKHUmJmcpYi5wb2ludChvLGEpO2Vsc2V7dmFyIGY9W3A9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYscCkpLHY9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsdikpXSxtPVtvPU1hdGgubWF4KFdmLE1hdGgubWluKCRmLG8pKSxhPU1hdGgubWF4KFdmLE1hdGgubWluKCRmLGEpKV07IWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgYSx1PXRbMF0sZj10WzFdLGM9MCxzPTEsbD1uWzBdLXUsaD1uWzFdLWY7aWYoYT1lLXUsbHx8IShhPjApKXtpZihhLz1sLGw8MCl7aWYoYTxjKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYobD4wKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9aWYoYT1pLXUsbHx8IShhPDApKXtpZihhLz1sLGw8MCl7aWYoYT5zKXJldHVybjthPmMmJihjPWEpfWVsc2UgaWYobD4wKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9aWYoYT1yLWYsaHx8IShhPjApKXtpZihhLz1oLGg8MCl7aWYoYTxjKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYoaD4wKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9aWYoYT1vLWYsaHx8IShhPDApKXtpZihhLz1oLGg8MCl7aWYoYT5zKXJldHVybjthPmMmJihjPWEpfWVsc2UgaWYoaD4wKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9cmV0dXJuIGM+MCYmKHRbMF09dStjKmwsdFsxXT1mK2MqaCksczwxJiYoblswXT11K3MqbCxuWzFdPWYrcypoKSwhMH19fX19KGYsbSx0LG4sZSxyKT91JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSksXz0hMSk6KGd8fChiLmxpbmVTdGFydCgpLGIucG9pbnQoZlswXSxmWzFdKSksYi5wb2ludChtWzBdLG1bMV0pLHV8fGIubGluZUVuZCgpLF89ITEpfXA9byx2PWEsZz11fXJldHVybiB4fX12YXIgUWYsSmYsS2YsdGM9UGEoKSxuYz17c3BoZXJlOml1LHBvaW50Oml1LGxpbmVTdGFydDpmdW5jdGlvbigpe25jLnBvaW50PXJjLG5jLmxpbmVFbmQ9ZWN9LGxpbmVFbmQ6aXUscG9seWdvblN0YXJ0Oml1LHBvbHlnb25FbmQ6aXV9O2Z1bmN0aW9uIGVjKCl7bmMucG9pbnQ9bmMubGluZUVuZD1pdX1mdW5jdGlvbiByYyh0LG4pe1FmPXQqPUlhLEpmPVFhKG4qPUlhKSxLZj1HYShuKSxuYy5wb2ludD1pY31mdW5jdGlvbiBpYyh0LG4pe3QqPUlhO3ZhciBlPVFhKG4qPUlhKSxyPUdhKG4pLGk9SGEodC1RZiksbz1HYShpKSxhPXIqUWEoaSksdT1LZiplLUpmKnIqbyxmPUpmKmUrS2YqcipvO3RjLmFkZChYYShLYShhKmErdSp1KSxmKSksUWY9dCxKZj1lLEtmPXJ9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIHRjLnJlc2V0KCksc3UodCxuYyksK3RjfXZhciBhYz1bbnVsbCxudWxsXSx1Yz17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6YWN9O2Z1bmN0aW9uIGZjKHQsbil7cmV0dXJuIGFjWzBdPXQsYWNbMV09bixvYyh1Yyl9dmFyIGNjPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGxjKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihsYyhlW3JdLmdlb21ldHJ5LG4pKXJldHVybiEwO3JldHVybiExfX0sc2M9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LG4pe3JldHVybiBoYyh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihoYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGRjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoZGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe3JldHVybiBwYyh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKHBjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihsYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gbGModCxuKXtyZXR1cm4hKCF0fHwhc2MuaGFzT3duUHJvcGVydHkodC50eXBlKSkmJnNjW3QudHlwZV0odCxuKX1mdW5jdGlvbiBoYyh0LG4pe3JldHVybiAwPT09ZmModCxuKX1mdW5jdGlvbiBkYyh0LG4pe3ZhciBlPWZjKHRbMF0sdFsxXSk7cmV0dXJuIGZjKHRbMF0sbikrZmMobix0WzFdKTw9ZStEYX1mdW5jdGlvbiBwYyh0LG4pe3JldHVybiEhSWYodC5tYXAodmMpLGdjKG4pKX1mdW5jdGlvbiB2Yyh0KXtyZXR1cm4odD10Lm1hcChnYykpLnBvcCgpLHR9ZnVuY3Rpb24gZ2ModCl7cmV0dXJuW3RbMF0qSWEsdFsxXSpJYV19ZnVuY3Rpb24geWModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIF9jKHQsbixlKXt2YXIgcj1nKHQsbi1EYSxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBiYygpe3ZhciB0LG4sZSxyLGksbyxhLHUsZixjLHMsbCxoPTEwLGQ9aCxwPTkwLHY9MzYwLHk9Mi41O2Z1bmN0aW9uIF8oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpiKCl9fWZ1bmN0aW9uIGIoKXtyZXR1cm4gZyhWYShyL3ApKnAsZSxwKS5tYXAocykuY29uY2F0KGcoVmEodS92KSp2LGEsdikubWFwKGwpKS5jb25jYXQoZyhWYShuL2gpKmgsdCxoKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIEhhKHQlcCk+RGF9KS5tYXAoZikpLmNvbmNhdChnKFZhKG8vZCkqZCxpLGQpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCV2KT5EYX0pLm1hcChjKSl9cmV0dXJuIF8ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYigpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KX0sXy5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltzKHIpLmNvbmNhdChsKGEpLnNsaWNlKDEpLHMoZSkucmV2ZXJzZSgpLnNsaWNlKDEpLGwodSkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxfLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLmV4dGVudE1ham9yKHQpLmV4dGVudE1pbm9yKHQpOl8uZXh0ZW50TWlub3IoKX0sXy5leHRlbnRNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLHU9K3RbMF1bMV0sYT0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksdT5hJiYodD11LHU9YSxhPXQpLF8ucHJlY2lzaW9uKHkpKTpbW3IsdV0sW2UsYV1dfSxfLmV4dGVudE1pbm9yPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdWzBdLHQ9K2VbMV1bMF0sbz0rZVswXVsxXSxpPStlWzFdWzFdLG4+dCYmKGU9bixuPXQsdD1lKSxvPmkmJihlPW8sbz1pLGk9ZSksXy5wcmVjaXNpb24oeSkpOltbbixvXSxbdCxpXV19LF8uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLnN0ZXBNYWpvcih0KS5zdGVwTWlub3IodCk6Xy5zdGVwTWlub3IoKX0sXy5zdGVwTWFqb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxfKTpbcCx2XX0sXy5zdGVwTWlub3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3RbMF0sZD0rdFsxXSxfKTpbaCxkXX0sXy5wcmVjaXNpb249ZnVuY3Rpb24oaCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K2gsZj15YyhvLGksOTApLGM9X2Mobix0LHkpLHM9eWModSxhLDkwKSxsPV9jKHIsZSx5KSxfKTp5fSxfLmV4dGVudE1ham9yKFtbLTE4MCwtOTArRGFdLFsxODAsOTAtRGFdXSkuZXh0ZW50TWlub3IoW1stMTgwLC04MC1EYV0sWzE4MCw4MCtEYV1dKX1mdW5jdGlvbiBtYyh0KXtyZXR1cm4gdH12YXIgeGMsd2MsTWMsQWMsVGM9UGEoKSxOYz1QYSgpLFNjPXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtTYy5saW5lU3RhcnQ9RWMsU2MubGluZUVuZD1QY30scG9seWdvbkVuZDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1TYy5saW5lRW5kPVNjLnBvaW50PWl1LFRjLmFkZChIYShOYykpLE5jLnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVRjLzI7cmV0dXJuIFRjLnJlc2V0KCksdH19O2Z1bmN0aW9uIEVjKCl7U2MucG9pbnQ9a2N9ZnVuY3Rpb24ga2ModCxuKXtTYy5wb2ludD1DYyx4Yz1NYz10LHdjPUFjPW59ZnVuY3Rpb24gQ2ModCxuKXtOYy5hZGQoQWMqdC1NYypuKSxNYz10LEFjPW59ZnVuY3Rpb24gUGMoKXtDYyh4Yyx3Yyl9dmFyIHpjPTEvMCxSYz16YyxMYz0temMsRGM9TGMsVWM9e3BvaW50OmZ1bmN0aW9uKHQsbil7dDx6YyYmKHpjPXQpO3Q+TGMmJihMYz10KTtuPFJjJiYoUmM9bik7bj5EYyYmKERjPW4pfSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW3pjLFJjXSxbTGMsRGNdXTtyZXR1cm4gTGM9RGM9LShSYz16Yz0xLzApLHR9fTt2YXIgcWMsT2MsWWMsQmMsRmM9MCxJYz0wLEhjPTAsamM9MCxYYz0wLEdjPTAsVmM9MCwkYz0wLFdjPTAsWmM9e3BvaW50OlFjLGxpbmVTdGFydDpKYyxsaW5lRW5kOm5zLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1pjLmxpbmVTdGFydD1lcyxaYy5saW5lRW5kPXJzfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WmMucG9pbnQ9UWMsWmMubGluZVN0YXJ0PUpjLFpjLmxpbmVFbmQ9bnN9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVdjP1tWYy9XYywkYy9XY106R2M/W2pjL0djLFhjL0djXTpIYz9bRmMvSGMsSWMvSGNdOltOYU4sTmFOXTtyZXR1cm4gRmM9SWM9SGM9amM9WGM9R2M9VmM9JGM9V2M9MCx0fX07ZnVuY3Rpb24gUWModCxuKXtGYys9dCxJYys9biwrK0hjfWZ1bmN0aW9uIEpjKCl7WmMucG9pbnQ9S2N9ZnVuY3Rpb24gS2ModCxuKXtaYy5wb2ludD10cyxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIHRzKHQsbil7dmFyIGU9dC1ZYyxyPW4tQmMsaT1LYShlKmUrcipyKTtqYys9aSooWWMrdCkvMixYYys9aSooQmMrbikvMixHYys9aSxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIG5zKCl7WmMucG9pbnQ9UWN9ZnVuY3Rpb24gZXMoKXtaYy5wb2ludD1pc31mdW5jdGlvbiBycygpe29zKHFjLE9jKX1mdW5jdGlvbiBpcyh0LG4pe1pjLnBvaW50PW9zLFFjKHFjPVljPXQsT2M9QmM9bil9ZnVuY3Rpb24gb3ModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFZjKz0oaT1CYyp0LVljKm4pKihZYyt0KSwkYys9aSooQmMrbiksV2MrPTMqaSxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIGFzKHQpe3RoaXMuX2NvbnRleHQ9dH1hcy5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsQmEpfX0scmVzdWx0Oml1fTt2YXIgdXMsZnMsY3Msc3MsbHMsaHM9UGEoKSxkcz17cG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7ZHMucG9pbnQ9cHN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt1cyYmdnMoZnMsY3MpLGRzLnBvaW50PWl1fSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt1cz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3VzPW51bGx9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PStocztyZXR1cm4gaHMucmVzZXQoKSx0fX07ZnVuY3Rpb24gcHModCxuKXtkcy5wb2ludD12cyxmcz1zcz10LGNzPWxzPW59ZnVuY3Rpb24gdnModCxuKXtzcy09dCxscy09bixocy5hZGQoS2Eoc3Mqc3MrbHMqbHMpKSxzcz10LGxzPW59ZnVuY3Rpb24gZ3MoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24geXModCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gX3ModCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW5ldyBicztmb3IodmFyIHIgaW4gdCllW3JdPXRbcl07cmV0dXJuIGUuc3RyZWFtPW4sZX19ZnVuY3Rpb24gYnMoKXt9ZnVuY3Rpb24gbXModCxuLGUpe3ZhciByPXQuY2xpcEV4dGVudCYmdC5jbGlwRXh0ZW50KCk7cmV0dXJuIHQuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG51bGwhPXImJnQuY2xpcEV4dGVudChudWxsKSxzdShlLHQuc3RyZWFtKFVjKSksbihVYy5yZXN1bHQoKSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KHIpLHR9ZnVuY3Rpb24geHModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPW5bMV1bMF0tblswXVswXSxpPW5bMV1bMV0tblswXVsxXSxvPU1hdGgubWluKHIvKGVbMV1bMF0tZVswXVswXSksaS8oZVsxXVsxXS1lWzBdWzFdKSksYT0rblswXVswXSsoci1vKihlWzFdWzBdK2VbMF1bMF0pKS8yLHU9K25bMF1bMV0rKGktbyooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2EsdV0pfSxlKX1mdW5jdGlvbiB3cyh0LG4sZSl7cmV0dXJuIHhzKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIE1zKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMF0tZVswXVswXSksbz0oci1pKihlWzFdWzBdK2VbMF1bMF0pKS8yLGE9LWkqZVswXVsxXTt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1mdW5jdGlvbiBBcyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzFdLWVbMF1bMV0pLG89LWkqZVswXVswXSxhPShyLWkqKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0sZSl9Z3MucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxfY2lyY2xlOnlzKDQuNSkscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpIT09dGhpcy5fcmFkaXVzJiYodGhpcy5fcmFkaXVzPXQsdGhpcy5fY2lyY2xlPW51bGwpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDpudWxsPT10aGlzLl9jaXJjbGUmJih0aGlzLl9jaXJjbGU9eXModGhpcy5fcmFkaXVzKSksdGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4sdGhpcy5fY2lyY2xlKX19LHJlc3VsdDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0cmluZy5sZW5ndGgpe3ZhciB0PXRoaXMuX3N0cmluZy5qb2luKCIiKTtyZXR1cm4gdGhpcy5fc3RyaW5nPVtdLHR9cmV0dXJuIG51bGx9fSxicy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmJzLHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCxuKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBUcz0xNixOcz1HYSgzMCpJYSk7ZnVuY3Rpb24gU3ModCxuKXtyZXR1cm4rbj9mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUocixpLG8sYSx1LGYsYyxzLGwsaCxkLHAsdixnKXt2YXIgeT1jLXIsXz1zLWksYj15KnkrXypfO2lmKGI+NCpuJiZ2LS0pe3ZhciBtPWEraCx4PXUrZCx3PWYrcCxNPUthKG0qbSt4Kngrdyp3KSxBPWV1KHcvPU0pLFQ9SGEoSGEodyktMSk8RGF8fEhhKG8tbCk8RGE/KG8rbCkvMjpYYSh4LG0pLE49dChULEEpLFM9TlswXSxFPU5bMV0saz1TLXIsQz1FLWksUD1fKmsteSpDOyhQKlAvYj5ufHxIYSgoeSprK18qQykvYi0uNSk+LjN8fGEqaCt1KmQrZipwPE5zKSYmKGUocixpLG8sYSx1LGYsUyxFLFQsbS89TSx4Lz1NLHcsdixnKSxnLnBvaW50KFMsRSksZShTLEUsVCxtLHgsdyxjLHMsbCxoLGQscCx2LGcpKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByLGksbyxhLHUsZixjLHMsbCxoLGQscCx2PXtwb2ludDpnLGxpbmVTdGFydDp5LGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLHYubGluZVN0YXJ0PW19LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSx2LmxpbmVTdGFydD15fX07ZnVuY3Rpb24gZyhlLHIpe2U9dChlLHIpLG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiB5KCl7cz1OYU4sdi5wb2ludD1fLG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gXyhyLGkpe3ZhciBvPUF1KFtyLGldKSxhPXQocixpKTtlKHMsbCxjLGgsZCxwLHM9YVswXSxsPWFbMV0sYz1yLGg9b1swXSxkPW9bMV0scD1vWzJdLFRzLG4pLG4ucG9pbnQocyxsKX1mdW5jdGlvbiBiKCl7di5wb2ludD1nLG4ubGluZUVuZCgpfWZ1bmN0aW9uIG0oKXt5KCksdi5wb2ludD14LHYubGluZUVuZD13fWZ1bmN0aW9uIHgodCxuKXtfKHI9dCxuKSxpPXMsbz1sLGE9aCx1PWQsZj1wLHYucG9pbnQ9X31mdW5jdGlvbiB3KCl7ZShzLGwsYyxoLGQscCxpLG8scixhLHUsZixUcyxuKSx2LmxpbmVFbmQ9YixiKCl9cmV0dXJuIHZ9fSh0LG4pOmZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXtuPXQobixlKSx0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfSh0KX12YXIgRXM9X3Moe3BvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCpJYSxuKklhKX19KTtmdW5jdGlvbiBrcyh0LG4sZSxyKXt2YXIgaT1HYShyKSxvPVFhKHIpLGE9aSp0LHU9byp0LGY9aS90LGM9by90LHM9KG8qZS1pKm4pL3QsbD0obypuK2kqZSkvdDtmdW5jdGlvbiBoKHQscil7cmV0dXJuW2EqdC11KnIrbixlLXUqdC1hKnJdfXJldHVybiBoLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVybltmKnQtYypuK3MsbC1jKnQtZipuXX0saH1mdW5jdGlvbiBDcyh0KXtyZXR1cm4gUHMoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKCl9ZnVuY3Rpb24gUHModCl7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbD0xNTAsaD00ODAsZD0yNTAscD0wLHY9MCxnPTAseT0wLF89MCxiPTAsbT1udWxsLHg9R2Ysdz1udWxsLE09bWMsQT0uNTtmdW5jdGlvbiBUKHQpe3JldHVybiBmKHRbMF0qSWEsdFsxXSpJYSl9ZnVuY3Rpb24gTih0KXtyZXR1cm4odD1mLmludmVydCh0WzBdLHRbMV0pKSYmW3RbMF0qRmEsdFsxXSpGYV19ZnVuY3Rpb24gUygpe3ZhciB0PWtzKGwsMCwwLGIpLmFwcGx5KG51bGwsbihwLHYpKSxyPShiP2tzOmZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKHIsaSl7cmV0dXJuW24rdCpyLGUtdCppXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24ocixpKXtyZXR1cm5bKHItbikvdCwoZS1pKS90XX0scn0pKGwsaC10WzBdLGQtdFsxXSxiKTtyZXR1cm4gZT1rZihnLHksXyksdT1TZihuLHIpLGY9U2YoZSx1KSxhPVNzKHUsQSksRSgpfWZ1bmN0aW9uIEUoKXtyZXR1cm4gYz1zPW51bGwsVH1yZXR1cm4gVC5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJnM9PT10P2M6Yz1FcyhmdW5jdGlvbih0KXtyZXR1cm4gX3Moe3BvaW50OmZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuLGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLHJbMV0pfX0pfShlKSh4KGEoTShzPXQpKSkpKX0sVC5wcmVjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsbT12b2lkIDAsRSgpKTp4fSxULnBvc3RjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPXQsdz1yPWk9bz1udWxsLEUoKSk6TX0sVC5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9K3Q/VmYobT10KklhKToobT1udWxsLEdmKSxFKCkpOm0qRmF9LFQuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1udWxsPT10Pyh3PXI9aT1vPW51bGwsbWMpOlpmKHc9K3RbMF1bMF0scj0rdFswXVsxXSxpPSt0WzFdWzBdLG89K3RbMV1bMV0pLEUoKSk6bnVsbD09dz9udWxsOltbdyxyXSxbaSxvXV19LFQuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsUygpKTpsfSxULnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLFMoKSk6W2gsZF19LFQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPXRbMF0lMzYwKklhLHY9dFsxXSUzNjAqSWEsUygpKTpbcCpGYSx2KkZhXX0sVC5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqSWEseT10WzFdJTM2MCpJYSxfPXQubGVuZ3RoPjI/dFsyXSUzNjAqSWE6MCxTKCkpOltnKkZhLHkqRmEsXypGYV19LFQuYW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dCUzNjAqSWEsUygpKTpiKkZhfSxULnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Tcyh1LEE9dCp0KSxFKCkpOkthKEEpfSxULmZpdEV4dGVudD1mdW5jdGlvbih0LG4pe3JldHVybiB4cyhULHQsbil9LFQuZml0U2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiB3cyhULHQsbil9LFQuZml0V2lkdGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMoVCx0LG4pfSxULmZpdEhlaWdodD1mdW5jdGlvbih0LG4pe3JldHVybiBBcyhULHQsbil9LGZ1bmN0aW9uKCl7cmV0dXJuIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksVC5pbnZlcnQ9bi5pbnZlcnQmJk4sUygpfX1mdW5jdGlvbiB6cyh0KXt2YXIgbj0wLGU9cWEvMyxyPVBzKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpJYSxlPXRbMV0qSWEpOltuKkZhLGUqRmFdfSxpfWZ1bmN0aW9uIFJzKHQsbil7dmFyIGU9UWEodCkscj0oZStRYShuKSkvMjtpZihIYShyKTxEYSlyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49R2EodCk7ZnVuY3Rpb24gZSh0LGUpe3JldHVyblt0Km4sUWEoZSkvbl19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW3QvbixldShlKm4pXX0sZX0odCk7dmFyIGk9MStlKigyKnItZSksbz1LYShpKS9yO2Z1bmN0aW9uIGEodCxuKXt2YXIgZT1LYShpLTIqcipRYShuKSkvcjtyZXR1cm5bZSpRYSh0Kj1yKSxvLWUqR2EodCldfXJldHVybiBhLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSxldSgoaS0odCp0K2UqZSkqcipyKS8oMipyKSldfSxhfWZ1bmN0aW9uIExzKCl7cmV0dXJuIHpzKFJzKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIERzKCl7cmV0dXJuIExzKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gVXModCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9R2EobiksaT1HYShlKSxvPXQocippKTtyZXR1cm5bbyppKlFhKG4pLG8qUWEoZSldfX1mdW5jdGlvbiBxcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1LYShuKm4rZSplKSxpPXQociksbz1RYShpKSxhPUdhKGkpO3JldHVybltYYShuKm8sciphKSxldShyJiZlKm8vcildfX12YXIgT3M9VXMoZnVuY3Rpb24odCl7cmV0dXJuIEthKDIvKDErdCkpfSk7T3MuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiAyKmV1KHQvMil9KTt2YXIgWXM9VXMoZnVuY3Rpb24odCl7cmV0dXJuKHQ9bnUodCkpJiZ0L1FhKHQpfSk7ZnVuY3Rpb24gQnModCxuKXtyZXR1cm5bdCxXYSh0dSgoT2ErbikvMikpXX1mdW5jdGlvbiBGcyh0KXt2YXIgbixlLHIsaT1Dcyh0KSxvPWkuY2VudGVyLGE9aS5zY2FsZSx1PWkudHJhbnNsYXRlLGY9aS5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiBzKCl7dmFyIG89cWEqYSgpLHU9aShSZihpLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gZihudWxsPT1jP1tbdVswXS1vLHVbMV0tb10sW3VbMF0rbyx1WzFdK29dXTp0PT09QnM/W1tNYXRoLm1heCh1WzBdLW8sYyksbl0sW01hdGgubWluKHVbMF0rbyxlKSxyXV06W1tjLE1hdGgubWF4KHVbMV0tbyxuKV0sW2UsTWF0aC5taW4odVsxXStvLHIpXV0pfXJldHVybiBpLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHMoKSk6YSgpfSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSh0KSxzKCkpOnUoKX0saS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCkscygpKTpvKCl9LGkuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPW49ZT1yPW51bGw6KGM9K3RbMF1bMF0sbj0rdFswXVsxXSxlPSt0WzFdWzBdLHI9K3RbMV1bMV0pLHMoKSk6bnVsbD09Yz9udWxsOltbYyxuXSxbZSxyXV19LHMoKX1mdW5jdGlvbiBJcyh0KXtyZXR1cm4gdHUoKE9hK3QpLzIpfWZ1bmN0aW9uIEhzKHQsbil7dmFyIGU9R2EodCkscj10PT09bj9RYSh0KTpXYShlL0dhKG4pKS9XYShJcyhuKS9Jcyh0KSksaT1lKlphKElzKHQpLHIpL3I7aWYoIXIpcmV0dXJuIEJzO2Z1bmN0aW9uIG8odCxuKXtpPjA/bjwtT2ErRGEmJihuPS1PYStEYSk6bj5PYS1EYSYmKG49T2EtRGEpO3ZhciBlPWkvWmEoSXMobikscik7cmV0dXJuW2UqUWEocip0KSxpLWUqR2Eocip0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uLG89SmEocikqS2EodCp0K2UqZSk7cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksMipqYShaYShpL28sMS9yKSktT2FdfSxvfWZ1bmN0aW9uIGpzKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gWHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOihlLUdhKG4pKS8obi10KSxpPWUvcit0O2lmKEhhKHIpPERhKXJldHVybiBqcztmdW5jdGlvbiBvKHQsbil7dmFyIGU9aS1uLG89cip0O3JldHVybltlKlFhKG8pLGktZSpHYShvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGktSmEocikqS2EodCp0K2UqZSldfSxvfVlzLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gdH0pLEJzLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqamEoJGEobikpLU9hXX0sanMuaW52ZXJ0PWpzO3ZhciBHcz0xLjM0MDI2NCxWcz0tLjA4MTEwNiwkcz04OTNlLTYsV3M9LjAwMzc5Nixacz1LYSgzKS8yO2Z1bmN0aW9uIFFzKHQsbil7dmFyIGU9ZXUoWnMqUWEobikpLHI9ZSplLGk9cipyKnI7cmV0dXJuW3QqR2EoZSkvKFpzKihHcyszKlZzKnIraSooNyokcys5KldzKnIpKSksZSooR3MrVnMqcitpKigkcytXcypyKSldfWZ1bmN0aW9uIEpzKHQsbil7dmFyIGU9R2Eobikscj1HYSh0KSplO3JldHVybltlKlFhKHQpL3IsUWEobikvcl19ZnVuY3Rpb24gS3ModCxuLGUscil7cmV0dXJuIDE9PT10JiYxPT09biYmMD09PWUmJjA9PT1yP21jOl9zKHtwb2ludDpmdW5jdGlvbihpLG8pe3RoaXMuc3RyZWFtLnBvaW50KGkqdCtlLG8qbityKX19KX1mdW5jdGlvbiB0bCh0LG4pe3ZhciBlPW4qbixyPWUqZTtyZXR1cm5bdCooLjg3MDctLjEzMTk3OSplK3IqKHIqKC4wMDM5NzEqZS0uMDAxNTI5KnIpLS4wMTM3OTEpKSxuKigxLjAwNzIyNitlKiguMDE1MDg1K3IqKC4wMjg4NzQqZS0uMDQ0NDc1LS4wMDU5MTYqcikpKV19ZnVuY3Rpb24gbmwodCxuKXtyZXR1cm5bR2EobikqUWEodCksUWEobildfWZ1bmN0aW9uIGVsKHQsbil7dmFyIGU9R2Eobikscj0xK0dhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBybCh0LG4pe3JldHVybltXYSh0dSgoT2ErbikvMikpLC10XX1mdW5jdGlvbiBpbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBvbCh0LG4pe3JldHVybiB0K24ueH1mdW5jdGlvbiBhbCh0LG4pe3JldHVybiBNYXRoLm1heCh0LG4ueSl9ZnVuY3Rpb24gdWwodCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBmbCh0LG4pe3ZhciBlLHIsaSxvLGEsdT1uZXcgaGwodCksZj0rdC52YWx1ZSYmKHUudmFsdWU9dC52YWx1ZSksYz1bdV07Zm9yKG51bGw9PW4mJihuPWNsKTtlPWMucG9wKCk7KWlmKGYmJihlLnZhbHVlPStlLmRhdGEudmFsdWUpLChpPW4oZS5kYXRhKSkmJihhPWkubGVuZ3RoKSlmb3IoZS5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pYy5wdXNoKHI9ZS5jaGlsZHJlbltvXT1uZXcgaGwoaVtvXSkpLHIucGFyZW50PWUsci5kZXB0aD1lLmRlcHRoKzE7cmV0dXJuIHUuZWFjaEJlZm9yZShsbCl9ZnVuY3Rpb24gY2wodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gc2wodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIGxsKHQpe3ZhciBuPTA7ZG97dC5oZWlnaHQ9bn13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrbil9ZnVuY3Rpb24gaGwodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9UXMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHI9bixpPXIqcixvPWkqaSppLGE9MDthPDEyJiYobz0oaT0oci09ZT0ociooR3MrVnMqaStvKigkcytXcyppKSktbikvKEdzKzMqVnMqaStvKig3KiRzKzkqV3MqaSkpKSpyKSppKmksIShIYShlKTxVYSkpOysrYSk7cmV0dXJuW1pzKnQqKEdzKzMqVnMqaStvKig3KiRzKzkqV3MqaSkpL0dhKHIpLGV1KFFhKHIpL1pzKV19LEpzLmludmVydD1xcyhqYSksdGwuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGUscj1uLGk9MjU7ZG97dmFyIG89cipyLGE9bypvO3ItPWU9KHIqKDEuMDA3MjI2K28qKC4wMTUwODUrYSooLjAyODg3NCpvLS4wNDQ0NzUtLjAwNTkxNiphKSkpLW4pLygxLjAwNzIyNitvKiguMDQ1MjU1K2EqKC4yNTk4NjYqby0uMzExMzI1LS4wMDU5MTYqMTEqYSkpKX13aGlsZShIYShlKT5EYSYmLS1pPjApO3JldHVyblt0LyguODcwNysobz1yKnIpKihvKihvKm8qbyooLjAwMzk3MS0uMDAxNTI5Km8pLS4wMTM3OTEpLS4xMzE5NzkpKSxyXX0sbmwuaW52ZXJ0PXFzKGV1KSxlbC5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqamEodCl9KSxybC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMipqYSgkYSh0KSktT2FdfSxobC5wcm90b3R5cGU9ZmwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpobCxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2hBZnRlcih1bCl9LGVhY2g6ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10aGlzLGE9W29dO2Rve2ZvcihuPWEucmV2ZXJzZSgpLGE9W107bz1uLnBvcCgpOylpZih0KG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcilhLnB1c2goZVtyXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXRoaXMsbz1baV0sYT1bXTtpPW8ucG9wKCk7KWlmKGEucHVzaChpKSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pO2Zvcig7aT1hLnBvcCgpOyl0KGkpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe2Zvcih2YXIgZT0rdChuLmRhdGEpfHwwLHI9bi5jaGlsZHJlbixpPXImJnIubGVuZ3RoOy0taT49MDspZSs9cltpXS52YWx1ZTtuLnZhbHVlPWV9KX0sc29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pfSxwYXRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9ZnVuY3Rpb24odCxuKXtpZih0PT09bilyZXR1cm4gdDt2YXIgZT10LmFuY2VzdG9ycygpLHI9bi5hbmNlc3RvcnMoKSxpPW51bGw7Zm9yKHQ9ZS5wb3AoKSxuPXIucG9wKCk7dD09PW47KWk9dCx0PWUucG9wKCksbj1yLnBvcCgpO3JldHVybiBpfShuLHQpLHI9W25dO24hPT1lOyluPW4ucGFyZW50LHIucHVzaChuKTtmb3IodmFyIGk9ci5sZW5ndGg7dCE9PWU7KXIuc3BsaWNlKGksMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxuPVt0XTt0PXQucGFyZW50OyluLnB1c2godCk7cmV0dXJuIG59LGRlc2NlbmRhbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt0LnB1c2gobil9KSx0fSxsZWF2ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fHQucHVzaChuKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPVtdO3JldHVybiB0LmVhY2goZnVuY3Rpb24oZSl7ZSE9PXQmJm4ucHVzaCh7c291cmNlOmUucGFyZW50LHRhcmdldDplfSl9KSxufSxjb3B5OmZ1bmN0aW9uKCl7cmV0dXJuIGZsKHRoaXMpLmVhY2hCZWZvcmUoc2wpfX07dmFyIGRsPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBwbCh0KXtmb3IodmFyIG4sZSxyPTAsaT0odD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPXQubGVuZ3RoO3I7KWU9TWF0aC5yYW5kb20oKSpyLS18MCxuPXRbcl0sdFtyXT10W2VdLHRbZV09bjtyZXR1cm4gdH0oZGwuY2FsbCh0KSkpLmxlbmd0aCxvPVtdO3I8aTspbj10W3JdLGUmJnlsKGUsbik/KytyOihlPWJsKG89dmwobyxuKSkscj0wKTtyZXR1cm4gZX1mdW5jdGlvbiB2bCh0LG4pe3ZhciBlLHI7aWYoX2wobix0KSlyZXR1cm5bbl07Zm9yKGU9MDtlPHQubGVuZ3RoOysrZSlpZihnbChuLHRbZV0pJiZfbChtbCh0W2VdLG4pLHQpKXJldHVyblt0W2VdLG5dO2ZvcihlPTA7ZTx0Lmxlbmd0aC0xOysrZSlmb3Iocj1lKzE7cjx0Lmxlbmd0aDsrK3IpaWYoZ2wobWwodFtlXSx0W3JdKSxuKSYmZ2wobWwodFtlXSxuKSx0W3JdKSYmZ2wobWwodFtyXSxuKSx0W2VdKSYmX2woeGwodFtlXSx0W3JdLG4pLHQpKXJldHVyblt0W2VdLHRbcl0sbl07dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uIGdsKHQsbil7dmFyIGU9dC5yLW4ucixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPDB8fGUqZTxyKnIraSppfWZ1bmN0aW9uIHlsKHQsbil7dmFyIGU9dC5yLW4ucisxZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gX2wodCxuKXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoOysrZSlpZigheWwodCxuW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBibCh0KXtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpyZXR1cm57eDoobj10WzBdKS54LHk6bi55LHI6bi5yfTtjYXNlIDI6cmV0dXJuIG1sKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiB4bCh0WzBdLHRbMV0sdFsyXSl9dmFyIG59ZnVuY3Rpb24gbWwodCxuKXt2YXIgZT10Lngscj10LnksaT10LnIsbz1uLngsYT1uLnksdT1uLnIsZj1vLWUsYz1hLXIscz11LWksbD1NYXRoLnNxcnQoZipmK2MqYyk7cmV0dXJue3g6KGUrbytmL2wqcykvMix5OihyK2ErYy9sKnMpLzIscjoobCtpK3UpLzJ9fWZ1bmN0aW9uIHhsKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz10LnIsYT1uLngsdT1uLnksZj1uLnIsYz1lLngscz1lLnksbD1lLnIsaD1yLWEsZD1yLWMscD1pLXUsdj1pLXMsZz1mLW8seT1sLW8sXz1yKnIraSppLW8qbyxiPV8tYSphLXUqdStmKmYsbT1fLWMqYy1zKnMrbCpsLHg9ZCpwLWgqdix3PShwKm0tdipiKS8oMip4KS1yLE09KHYqZy1wKnkpL3gsQT0oZCpiLWgqbSkvKDIqeCktaSxUPShoKnktZCpnKS94LE49TSpNK1QqVC0xLFM9Mioobyt3Kk0rQSpUKSxFPXcqdytBKkEtbypvLGs9LShOPyhTK01hdGguc3FydChTKlMtNCpOKkUpKS8oMipOKTpFL1MpO3JldHVybnt4OnIrdytNKmsseTppK0ErVCprLHI6a319ZnVuY3Rpb24gd2wodCxuLGUpe3ZhciByLGksbyxhLHU9dC54LW4ueCxmPXQueS1uLnksYz11KnUrZipmO2M/KGk9bi5yK2UucixpKj1pLGE9dC5yK2UucixpPihhKj1hKT8ocj0oYythLWkpLygyKmMpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsYS9jLXIqcikpLGUueD10Lngtcip1LW8qZixlLnk9dC55LXIqZitvKnUpOihyPShjK2ktYSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxpL2MtcipyKSksZS54PW4ueCtyKnUtbypmLGUueT1uLnkrcipmK28qdSkpOihlLng9bi54K2UucixlLnk9bi55KX1mdW5jdGlvbiBNbCh0LG4pe3ZhciBlPXQucituLnItMWUtNixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPjAmJmUqZT5yKnIraSppfWZ1bmN0aW9uIEFsKHQpe3ZhciBuPXQuXyxlPXQubmV4dC5fLHI9bi5yK2UucixpPShuLngqZS5yK2UueCpuLnIpL3Isbz0obi55KmUucitlLnkqbi5yKS9yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIFRsKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBObCh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGw7aWYoKG49dFswXSkueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2Uucjt3bChlLG4scj10WzJdKSxuPW5ldyBUbChuKSxlPW5ldyBUbChlKSxyPW5ldyBUbChyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcih1PTM7dTxpOysrdSl7d2wobi5fLGUuXyxyPXRbdV0pLHI9bmV3IFRsKHIpLGY9ZS5uZXh0LGM9bi5wcmV2aW91cyxzPWUuXy5yLGw9bi5fLnI7ZG97aWYoczw9bCl7aWYoTWwoZi5fLHIuXykpe2U9ZixuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS11O2NvbnRpbnVlIHR9cys9Zi5fLnIsZj1mLm5leHR9ZWxzZXtpZihNbChjLl8sci5fKSl7KG49YykubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1sKz1jLl8ucixjPWMucHJldmlvdXN9fXdoaWxlKGYhPT1jLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLG89QWwobik7KHI9ci5uZXh0KSE9PWU7KShhPUFsKHIpKTxvJiYobj1yLG89YSk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1wbChuKSx1PTA7dTxpOysrdSkobj10W3VdKS54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBTbCh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRWwoKXtyZXR1cm4gMH1mdW5jdGlvbiBrbCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ2wodCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBQbCh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIHpsKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLGE9ci5sZW5ndGgsdT10KGUpKm58fDA7aWYodSlmb3IoaT0wO2k8YTsrK2kpcltpXS5yKz11O2lmKG89TmwociksdSlmb3IoaT0wO2k8YTsrK2kpcltpXS5yLT11O2Uucj1vK3V9fX1mdW5jdGlvbiBSbCh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBMbCh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gRGwodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsZj1hLmxlbmd0aCxjPXQudmFsdWUmJihyLW4pL3QudmFsdWU7Kyt1PGY7KShvPWFbdV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqY312YXIgVWw9IiQiLHFsPXtkZXB0aDotMX0sT2w9e307ZnVuY3Rpb24gWWwodCl7cmV0dXJuIHQuaWR9ZnVuY3Rpb24gQmwodCl7cmV0dXJuIHQucGFyZW50SWR9ZnVuY3Rpb24gRmwodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gSWwodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uWzBdOnQudH1mdW5jdGlvbiBIbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bbi5sZW5ndGgtMV06dC50fWZ1bmN0aW9uIGpsKHQsbixlKXt2YXIgcj1lLyhuLmktdC5pKTtuLmMtPXIsbi5zKz1lLHQuYys9cixuLnorPWUsbi5tKz1lfWZ1bmN0aW9uIFhsKHQsbixlKXtyZXR1cm4gdC5hLnBhcmVudD09PW4ucGFyZW50P3QuYTplfWZ1bmN0aW9uIEdsKHQsbil7dGhpcy5fPXQsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPW51bGwsdGhpcy5BPW51bGwsdGhpcy5hPXRoaXMsdGhpcy56PTAsdGhpcy5tPTAsdGhpcy5jPTAsdGhpcy5zPTAsdGhpcy50PW51bGwsdGhpcy5pPW59ZnVuY3Rpb24gVmwodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsZj1hLmxlbmd0aCxjPXQudmFsdWUmJihpLWUpL3QudmFsdWU7Kyt1PGY7KShvPWFbdV0pLngwPW4sby54MT1yLG8ueTA9ZSxvLnkxPWUrPW8udmFsdWUqY31HbC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShobC5wcm90b3R5cGUpO3ZhciAkbD0oMStNYXRoLnNxcnQoNSkpLzI7ZnVuY3Rpb24gV2wodCxuLGUscixpLG8pe2Zvcih2YXIgYSx1LGYsYyxzLGwsaCxkLHAsdixnLHk9W10sXz1uLmNoaWxkcmVuLGI9MCxtPTAseD1fLmxlbmd0aCx3PW4udmFsdWU7Yjx4Oyl7Zj1pLWUsYz1vLXI7ZG97cz1fW20rK10udmFsdWV9d2hpbGUoIXMmJm08eCk7Zm9yKGw9aD1zLGc9cypzKih2PU1hdGgubWF4KGMvZixmL2MpLyh3KnQpKSxwPU1hdGgubWF4KGgvZyxnL2wpO208eDsrK20pe2lmKHMrPXU9X1ttXS52YWx1ZSx1PGwmJihsPXUpLHU+aCYmKGg9dSksZz1zKnMqdiwoZD1NYXRoLm1heChoL2csZy9sKSk+cCl7cy09dTticmVha31wPWR9eS5wdXNoKGE9e3ZhbHVlOnMsZGljZTpmPGMsY2hpbGRyZW46Xy5zbGljZShiLG0pfSksYS5kaWNlP0RsKGEsZSxyLGksdz9yKz1jKnMvdzpvKTpWbChhLGUscix3P2UrPWYqcy93Omksbyksdy09cyxiPW19cmV0dXJuIHl9dmFyIFpsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe1dsKG4sdCxlLHIsaSxvKX1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7dmFyIFFsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKChhPXQuX3NxdWFyaWZ5KSYmYS5yYXRpbz09PW4pZm9yKHZhciBhLHUsZixjLHMsbD0tMSxoPWEubGVuZ3RoLGQ9dC52YWx1ZTsrK2w8aDspe2ZvcihmPSh1PWFbbF0pLmNoaWxkcmVuLGM9dS52YWx1ZT0wLHM9Zi5sZW5ndGg7YzxzOysrYyl1LnZhbHVlKz1mW2NdLnZhbHVlO3UuZGljZT9EbCh1LGUscixpLHIrPShvLXIpKnUudmFsdWUvZCk6VmwodSxlLHIsZSs9KGktZSkqdS52YWx1ZS9kLG8pLGQtPXUudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPVdsKG4sdCxlLHIsaSxvKSxhLnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oJGwpO2Z1bmN0aW9uIEpsKHQsbil7cmV0dXJuIHRbMF0tblswXXx8dFsxXS1uWzFdfWZ1bmN0aW9uIEtsKHQpe2Zvcih2YXIgbixlLHIsaT10Lmxlbmd0aCxvPVswLDFdLGE9Mix1PTI7dTxpOysrdSl7Zm9yKDthPjEmJihuPXRbb1thLTJdXSxlPXRbb1thLTFdXSxyPXRbdV0sKGVbMF0tblswXSkqKHJbMV0tblsxXSktKGVbMV0tblsxXSkqKHJbMF0tblswXSk8PTApOyktLWE7b1thKytdPXV9cmV0dXJuIG8uc2xpY2UoMCxhKX1mdW5jdGlvbiB0aCgpe3JldHVybiBNYXRoLnJhbmRvbSgpfXZhciBuaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsMT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dCx0PTApOmUtPXQsZnVuY3Rpb24oKXtyZXR1cm4gbigpKmUrdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGVoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3ZhciByLGk7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7dmFyIG87aWYobnVsbCE9cilvPXIscj1udWxsO2Vsc2UgZG97cj0yKm4oKS0xLG89MipuKCktMSxpPXIqcitvKm99d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpvKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLHJoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSgpe3ZhciB0PWVoLnNvdXJjZShuKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxpaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAscj0wO3I8dDsrK3IpZSs9bigpO3JldHVybiBlfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksb2g9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPWloLnNvdXJjZShuKSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSgpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxhaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtbigpKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksdWg9QXJyYXkucHJvdG90eXBlLGZoPXVoLm1hcCxjaD11aC5zbGljZSxzaD17bmFtZToiaW1wbGljaXQifTtmdW5jdGlvbiBsaCh0KXt2YXIgbj1LaSgpLGU9W10scj1zaDtmdW5jdGlvbiBpKGkpe3ZhciBvPWkrIiIsYT1uLmdldChvKTtpZighYSl7aWYociE9PXNoKXJldHVybiByO24uc2V0KG8sYT1lLnB1c2goaSkpfXJldHVybiB0WyhhLTEpJXQubGVuZ3RoXX1yZXR1cm4gdD1udWxsPT10P1tdOmNoLmNhbGwodCksaS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdLG49S2koKTtmb3IodmFyIHIsbyxhPS0xLHU9dC5sZW5ndGg7KythPHU7KW4uaGFzKG89KHI9dFthXSkrIiIpfHxuLnNldChvLGUucHVzaChyKSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9Y2guY2FsbChuKSxpKTp0LnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkpOnJ9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBsaCgpLmRvbWFpbihlKS5yYW5nZSh0KS51bmtub3duKHIpfSxpfWZ1bmN0aW9uIGhoKCl7dmFyIHQsbixlPWxoKCkudW5rbm93bih2b2lkIDApLHI9ZS5kb21haW4saT1lLnJhbmdlLG89WzAsMV0sYT0hMSx1PTAsZj0wLGM9LjU7ZnVuY3Rpb24gcygpe3ZhciBlPXIoKS5sZW5ndGgscz1vWzFdPG9bMF0sbD1vW3MtMF0saD1vWzEtc107dD0oaC1sKS9NYXRoLm1heCgxLGUtdSsyKmYpLGEmJih0PU1hdGguZmxvb3IodCkpLGwrPShoLWwtdCooZS11KSkqYyxuPXQqKDEtdSksYSYmKGw9TWF0aC5yb3VuZChsKSxuPU1hdGgucm91bmQobikpO3ZhciBkPWcoZSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBsK3Qqbn0pO3JldHVybiBpKHM/ZC5yZXZlcnNlKCk6ZCl9cmV0dXJuIGRlbGV0ZSBlLnVua25vd24sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCkscygpKTpyKCl9LGUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Wyt0WzBdLCt0WzFdXSxzKCkpOm8uc2xpY2UoKX0sZS5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvPVsrdFswXSwrdFsxXV0sYT0hMCxzKCl9LGUuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGUuc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxlLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhdCxzKCkpOmF9LGUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1mPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6dX0sZS5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOmZ9LGUuYWxpZ249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOmN9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBoaCgpLmRvbWFpbihyKCkpLnJhbmdlKG8pLnJvdW5kKGEpLnBhZGRpbmdJbm5lcih1KS5wYWRkaW5nT3V0ZXIoZikuYWxpZ24oYyl9LHMoKX1mdW5jdGlvbiBkaCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gcGgodCl7cmV0dXJuK3R9dmFyIHZoPVswLDFdO2Z1bmN0aW9uIGdoKHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OmRoKG4pfWZ1bmN0aW9uIHloKHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLGE9blswXSx1PW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksYT1yKHUsYSkpOihpPWUoaSxvKSxhPXIoYSx1KSksZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fWZ1bmN0aW9uIF9oKHQsbixlLHIpe3ZhciBvPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLGE9bmV3IEFycmF5KG8pLHU9bmV3IEFycmF5KG8pLGY9LTE7Zm9yKHRbb108dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrZjxvOylhW2ZdPWUodFtmXSx0W2YrMV0pLHVbZl09cihuW2ZdLG5bZisxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPWkodCxuLDEsbyktMTtyZXR1cm4gdVtlXShhW2VdKG4pKX19ZnVuY3Rpb24gYmgodCxuKXtyZXR1cm4gbi5kb21haW4odC5kb21haW4oKSkucmFuZ2UodC5yYW5nZSgpKS5pbnRlcnBvbGF0ZSh0LmludGVycG9sYXRlKCkpLmNsYW1wKHQuY2xhbXAoKSl9ZnVuY3Rpb24gbWgodCxuKXt2YXIgZSxyLGksbz12aCxhPXZoLHU9bWUsZj0hMTtmdW5jdGlvbiBjKCl7cmV0dXJuIGU9TWF0aC5taW4oby5sZW5ndGgsYS5sZW5ndGgpPjI/X2g6eWgscj1pPW51bGwsc31mdW5jdGlvbiBzKG4pe3JldHVybihyfHwocj1lKG8sYSxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PW4/MDp0Pj1lPzE6cih0KX19fSh0KTp0LHUpKSkoK24pfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4oaXx8KGk9ZShhLG8sZ2gsZj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP246dD49MT9lOnIodCl9fX0obik6bikpKSgrdCl9LHMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWZoLmNhbGwodCxwaCksYygpKTpvLnNsaWNlKCl9LHMucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9Y2guY2FsbCh0KSxjKCkpOmEuc2xpY2UoKX0scy5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhPWNoLmNhbGwodCksdT14ZSxjKCl9LHMuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ISF0LGMoKSk6Zn0scy5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGMoKSk6dX0sYygpfWZ1bmN0aW9uIHhoKG4pe3ZhciBlPW4uZG9tYWluO3JldHVybiBuLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gbShuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvPW5bMF0sYT1uW24ubGVuZ3RoLTFdLHU9dyhvLGEsbnVsbD09ZT8xMDplKTtzd2l0Y2goKHI9YmEobnVsbD09cj8iLGYiOnIpKS50eXBlKXtjYXNlInMiOnZhciBmPU1hdGgubWF4KE1hdGguYWJzKG8pLE1hdGguYWJzKGEpKTtyZXR1cm4gbnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9a2EodSxmKSl8fChyLnByZWNpc2lvbj1pKSx0LmZvcm1hdFByZWZpeChyLGYpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPUNhKHUsTWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpKSl8fChyLnByZWNpc2lvbj1pLSgiZSI9PT1yLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9RWEodSkpfHwoci5wcmVjaXNpb249aS0yKigiJSI9PT1yLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQocil9KGUoKSxuLHIpfSxuLm5pY2U9ZnVuY3Rpb24odCl7bnVsbD09dCYmKHQ9MTApO3ZhciByLGk9ZSgpLG89MCxhPWkubGVuZ3RoLTEsdT1pW29dLGY9aVthXTtyZXR1cm4gZjx1JiYocj11LHU9ZixmPXIscj1vLG89YSxhPXIpLChyPXgodSxmLHQpKT4wP3I9eCh1PU1hdGguZmxvb3IodS9yKSpyLGY9TWF0aC5jZWlsKGYvcikqcix0KTpyPDAmJihyPXgodT1NYXRoLmNlaWwodSpyKS9yLGY9TWF0aC5mbG9vcihmKnIpL3IsdCkpLHI+MD8oaVtvXT1NYXRoLmZsb29yKHUvcikqcixpW2FdPU1hdGguY2VpbChmL3IpKnIsZShpKSk6cjwwJiYoaVtvXT1NYXRoLmNlaWwodSpyKS9yLGlbYV09TWF0aC5mbG9vcihmKnIpL3IsZShpKSksbn0sbn1mdW5jdGlvbiB3aCh0LG4pe3ZhciBlLHI9MCxpPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W3JdLGE9dFtpXTtyZXR1cm4gYTxvJiYoZT1yLHI9aSxpPWUsZT1vLG89YSxhPWUpLHRbcl09bi5mbG9vcihvKSx0W2ldPW4uY2VpbChhKSx0fWZ1bmN0aW9uIE1oKHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06ZGgobil9ZnVuY3Rpb24gQWgodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIFRoKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBOaCh0KXtyZXR1cm4gMTA9PT10P1RoOnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFNoKHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBFaCh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBraCh0LG4pe3JldHVybiB0PDA/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9ZnVuY3Rpb24gQ2goKXt2YXIgdD0xLG49bWgoZnVuY3Rpb24obixlKXtyZXR1cm4oZT1raChlLHQpLShuPWtoKG4sdCkpKT9mdW5jdGlvbihyKXtyZXR1cm4oa2gocix0KS1uKS9lfTpkaChlKX0sZnVuY3Rpb24obixlKXtyZXR1cm4gZT1raChlLHQpLShuPWtoKG4sdCkpLGZ1bmN0aW9uKHIpe3JldHVybiBraChuK2UqciwxL3QpfX0pLGU9bi5kb21haW47cmV0dXJuIG4uZXhwb25lbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZShlKCkpKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYmgobixDaCgpLmV4cG9uZW50KHQpKX0seGgobil9dmFyIFBoPW5ldyBEYXRlLHpoPW5ldyBEYXRlO2Z1bmN0aW9uIFJoKHQsbixlLHIpe2Z1bmN0aW9uIGkobil7cmV0dXJuIHQobj1uZXcgRGF0ZSgrbikpLG59cmV0dXJuIGkuZmxvb3I9aSxpLmNlaWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZShlLTEpKSxuKGUsMSksdChlKSxlfSxpLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBuPWkodCksZT1pLmNlaWwodCk7cmV0dXJuIHQtbjxlLXQ/bjplfSxpLm9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQ9bmV3IERhdGUoK3QpLG51bGw9PWU/MTpNYXRoLmZsb29yKGUpKSx0fSxpLnJhbmdlPWZ1bmN0aW9uKGUscixvKXt2YXIgYSx1PVtdO2lmKGU9aS5jZWlsKGUpLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShlPHImJm8+MCkpcmV0dXJuIHU7ZG97dS5wdXNoKGE9bmV3IERhdGUoK2UpKSxuKGUsbyksdChlKX13aGlsZShhPGUmJmU8cik7cmV0dXJuIHV9LGkuZmlsdGVyPWZ1bmN0aW9uKGUpe3JldHVybiBSaChmdW5jdGlvbihuKXtpZihuPj1uKWZvcig7dChuKSwhZShuKTspbi5zZXRUaW1lKG4tMSl9LGZ1bmN0aW9uKHQscil7aWYodD49dClpZihyPDApZm9yKDsrK3I8PTA7KWZvcig7bih0LC0xKSwhZSh0KTspO2Vsc2UgZm9yKDstLXI+PTA7KWZvcig7bih0LDEpLCFlKHQpOyk7fSl9LGUmJihpLmNvdW50PWZ1bmN0aW9uKG4scil7cmV0dXJuIFBoLnNldFRpbWUoK24pLHpoLnNldFRpbWUoK3IpLHQoUGgpLHQoemgpLE1hdGguZmxvb3IoZShQaCx6aCkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihuKXtyZXR1cm4gcihuKSV0PT0wfTpmdW5jdGlvbihuKXtyZXR1cm4gaS5jb3VudCgwLG4pJXQ9PTB9KTppOm51bGx9KSxpfXZhciBMaD1SaChmdW5jdGlvbigpe30sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3Qrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4tdH0pO0xoLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/UmgoZnVuY3Rpb24obil7bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0sZnVuY3Rpb24obixlKXtuLnNldFRpbWUoK24rZSp0KX0sZnVuY3Rpb24obixlKXtyZXR1cm4oZS1uKS90fSk6TGg6bnVsbH07dmFyIERoPUxoLnJhbmdlLFVoPTZlNCxxaD02MDQ4ZTUsT2g9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKDFlMypNYXRoLmZsb29yKHQvMWUzKSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzFlMypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8xZTN9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLFloPU9oLnJhbmdlLEJoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvVWgpKlVoKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLEZoPUJoLnJhbmdlLEloPVJoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpVaCUzNmU1O248MCYmKG4rPTM2ZTUpLHQuc2V0VGltZSgzNmU1Kk1hdGguZmxvb3IoKCt0LW4pLzM2ZTUpK24pfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSxIaD1JaC5yYW5nZSxqaD1SaChmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksWGg9amgucmFuZ2U7ZnVuY3Rpb24gR2godCl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe24uc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSs3LXQpJTcpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqVWgpL3FofSl9dmFyIFZoPUdoKDApLCRoPUdoKDEpLFdoPUdoKDIpLFpoPUdoKDMpLFFoPUdoKDQpLEpoPUdoKDUpLEtoPUdoKDYpLHRkPVZoLnJhbmdlLG5kPSRoLnJhbmdlLGVkPVdoLnJhbmdlLHJkPVpoLnJhbmdlLGlkPVFoLnJhbmdlLG9kPUpoLnJhbmdlLGFkPUtoLnJhbmdlLHVkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0TW9udGgodC5nZXRNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLGZkPXVkLnJhbmdlLGNkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSk7Y2QuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldEZ1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRGdWxsWWVhcigpL3QpKnQpLG4uc2V0TW9udGgoMCwxKSxuLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgc2Q9Y2QucmFuZ2UsbGQ9UmgoZnVuY3Rpb24odCl7dC5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qVWgpfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1VofSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSxoZD1sZC5yYW5nZSxkZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSxwZD1kZC5yYW5nZSx2ZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRGF0ZSgpLTF9KSxnZD12ZC5yYW5nZTtmdW5jdGlvbiB5ZCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9xaH0pfXZhciBfZD15ZCgwKSxiZD15ZCgxKSxtZD15ZCgyKSx4ZD15ZCgzKSx3ZD15ZCg0KSxNZD15ZCg1KSxBZD15ZCg2KSxUZD1fZC5yYW5nZSxOZD1iZC5yYW5nZSxTZD1tZC5yYW5nZSxFZD14ZC5yYW5nZSxrZD13ZC5yYW5nZSxDZD1NZC5yYW5nZSxQZD1BZC5yYW5nZSx6ZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMioobi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSxSZD16ZC5yYW5nZSxMZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pO0xkLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/UmgoZnVuY3Rpb24obil7bi5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxuLnNldFVUQ01vbnRoKDAsMSksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24obixlKXtuLnNldFVUQ0Z1bGxZZWFyKG4uZ2V0VVRDRnVsbFllYXIoKStlKnQpfSk6bnVsbH07dmFyIERkPUxkLnJhbmdlO2Z1bmN0aW9uIFVkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBxZCh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBPZCh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBZZCh0KXt2YXIgbj10LmRhdGVUaW1lLGU9dC5kYXRlLHI9dC50aW1lLGk9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMsdT10Lm1vbnRocyxmPXQuc2hvcnRNb250aHMsYz1WZChpKSxzPSRkKGkpLGw9VmQobyksaD0kZChvKSxkPVZkKGEpLHA9JGQoYSksdj1WZCh1KSxnPSRkKHUpLHk9VmQoZiksXz0kZChmKSxiPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6cHAsZTpwcCxmOmJwLEg6dnAsSTpncCxqOnlwLEw6X3AsbTptcCxNOnhwLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldEhvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOndwLHU6TXAsVTpBcCxWOlRwLHc6TnAsVzpTcCx4Om51bGwsWDpudWxsLHk6RXAsWTprcCxaOkNwLCIlIjokcH0sbT17YTpmdW5jdGlvbih0KXtyZXR1cm4gYVt0LmdldFVUQ0RheSgpXX0sQTpmdW5jdGlvbih0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uKHQpe3JldHVybiB1W3QuZ2V0VVRDTW9udGgoKV19LGM6bnVsbCxkOlBwLGU6UHAsZjpVcCxIOnpwLEk6UnAsajpMcCxMOkRwLG06cXAsTTpPcCxwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxROldwLHM6WnAsUzpZcCx1OkJwLFU6RnAsVjpJcCx3OkhwLFc6anAseDpudWxsLFg6bnVsbCx5OlhwLFk6R3AsWjpWcCwiJSI6JHB9LHg9e2E6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC53PXBbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9bC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9aFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj15LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1fW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPWdbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sYzpmdW5jdGlvbih0LGUscil7cmV0dXJuIEEodCxuLGUscil9LGQ6aXAsZTppcCxmOnNwLEg6YXAsSTphcCxqOm9wLEw6Y3AsbTpycCxNOnVwLHA6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWMuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXNbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sUTpocCxzOmRwLFM6ZnAsdTpaZCxVOlFkLFY6SmQsdzpXZCxXOktkLHg6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBBKHQsZSxuLHIpfSxYOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gQSh0LHIsbixlKX0seTpucCxZOnRwLFo6ZXAsIiUiOmxwfTtmdW5jdGlvbiB3KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyxhPVtdLHU9LTEsZj0wLGM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrdTxjOykzNz09PXQuY2hhckNvZGVBdCh1KSYmKGEucHVzaCh0LnNsaWNlKGYsdSkpLG51bGwhPShpPUZkW3I9dC5jaGFyQXQoKyt1KV0pP3I9dC5jaGFyQXQoKyt1KTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSxhLnB1c2gociksZj11KzEpO3JldHVybiBhLnB1c2godC5zbGljZShmLHUpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBNKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbz1PZCgxOTAwKTtpZihBKG8sdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhpPShyPXFkKE9kKG8ueSkpKS5nZXRVVENEYXkoKSxyPWk+NHx8MD09PWk/YmQuY2VpbChyKTpiZChyKSxyPXZkLm9mZnNldChyLDcqKG8uVi0xKSksby55PXIuZ2V0VVRDRnVsbFllYXIoKSxvLm09ci5nZXRVVENNb250aCgpLG8uZD1yLmdldFVUQ0RhdGUoKSsoby53KzYpJTcpOihpPShyPW4oT2Qoby55KSkpLmdldERheSgpLHI9aT40fHwwPT09aT8kaC5jZWlsKHIpOiRoKHIpLHI9amgub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRGdWxsWWVhcigpLG8ubT1yLmdldE1vbnRoKCksby5kPXIuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCksaT0iWiJpbiBvP3FkKE9kKG8ueSkpLmdldFVUQ0RheSgpOm4oT2Qoby55KSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShpKzUpJTc6by53Kzcqby5VLShpKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxxZChvKSk6bihvKX19ZnVuY3Rpb24gQSh0LG4sZSxyKXtmb3IodmFyIGksbyxhPTAsdT1uLmxlbmd0aCxmPWUubGVuZ3RoO2E8dTspe2lmKHI+PWYpcmV0dXJuLTE7aWYoMzc9PT0oaT1uLmNoYXJDb2RlQXQoYSsrKSkpe2lmKGk9bi5jaGFyQXQoYSsrKSwhKG89eFtpIGluIEZkP24uY2hhckF0KGErKyk6aV0pfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfXJldHVybiBiLng9dyhlLGIpLGIuWD13KHIsYiksYi5jPXcobixiKSxtLng9dyhlLG0pLG0uWD13KHIsbSksbS5jPXcobixtKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBuPXcodCs9IiIsYik7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49TSh0Kz0iIixVZCk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBuPXcodCs9IiIsbSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49TSh0LHFkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19dmFyIEJkLEZkPXsiLSI6IiIsXzoiICIsMDoiMCJ9LElkPS9eXHMqXGQrLyxIZD0vXiUvLGpkPS9bXFxeJCorP3xbXF0oKS57fV0vZztmdW5jdGlvbiBYZCh0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBHZCh0KXtyZXR1cm4gdC5yZXBsYWNlKGpkLCJcXCQmIil9ZnVuY3Rpb24gVmQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKEdkKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gJGQodCl7Zm9yKHZhciBuPXt9LGU9LTEscj10Lmxlbmd0aDsrK2U8cjspblt0W2VdLnRvTG93ZXJDYXNlKCldPWU7cmV0dXJuIG59ZnVuY3Rpb24gV2QodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0Lnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWmQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0LnU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUWQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSmQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlY9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS2QodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Llc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrNCkpO3JldHVybiByPyh0Lnk9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lnk9K3JbMF0rKCtyWzBdPjY4PzE5MDA6MmUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlcCh0LG4sZSl7dmFyIHI9L14oWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8vLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Llo9clsxXT8wOi0oclsyXSsoclszXXx8IjAwIikpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQubT0wLHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQuTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuTD1NYXRoLmZsb29yKHJbMF0vMWUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBscCh0LG4sZSl7dmFyIHI9SGQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBocCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5RPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGRwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9MWUzKityWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBwKHQsbil7cmV0dXJuIFhkKHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24gdnAodCxuKXtyZXR1cm4gWGQodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gZ3AodCxuKXtyZXR1cm4gWGQodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIHlwKHQsbil7cmV0dXJuIFhkKDEramguY291bnQoY2QodCksdCksbiwzKX1mdW5jdGlvbiBfcCh0LG4pe3JldHVybiBYZCh0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gYnAodCxuKXtyZXR1cm4gX3AodCxuKSsiMDAwIn1mdW5jdGlvbiBtcCh0LG4pe3JldHVybiBYZCh0LmdldE1vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIHhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWludXRlcygpLG4sMil9ZnVuY3Rpb24gd3AodCxuKXtyZXR1cm4gWGQodC5nZXRTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBNcCh0KXt2YXIgbj10LmdldERheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gQXAodCxuKXtyZXR1cm4gWGQoVmguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBUcCh0LG4pe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIHQ9ZT49NHx8MD09PWU/UWgodCk6UWguY2VpbCh0KSxYZChRaC5jb3VudChjZCh0KSx0KSsoND09PWNkKHQpLmdldERheSgpKSxuLDIpfWZ1bmN0aW9uIE5wKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIFNwKHQsbil7cmV0dXJuIFhkKCRoLmNvdW50KGNkKHQpLHQpLG4sMil9ZnVuY3Rpb24gRXAodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIGtwKHQsbil7cmV0dXJuIFhkKHQuZ2V0RnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBDcCh0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKG4+MD8iLSI6KG4qPS0xLCIrIikpK1hkKG4vNjB8MCwiMCIsMikrWGQobiU2MCwiMCIsMil9ZnVuY3Rpb24gUHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENEYXRlKCksbiwyKX1mdW5jdGlvbiB6cCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0hvdXJzKCksbiwyKX1mdW5jdGlvbiBScCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gTHAodCxuKXtyZXR1cm4gWGQoMSt2ZC5jb3VudChMZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIERwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBVcCh0LG4pe3JldHVybiBEcCh0LG4pKyIwMDAifWZ1bmN0aW9uIHFwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gT3AodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBZcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIEJwKHQpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBGcCh0LG4pe3JldHVybiBYZChfZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIElwKHQsbil7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT93ZCh0KTp3ZC5jZWlsKHQpLFhkKHdkLmNvdW50KExkKHQpLHQpKyg0PT09TGQodCkuZ2V0VVRDRGF5KCkpLG4sMil9ZnVuY3Rpb24gSHAodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24ganAodCxuKXtyZXR1cm4gWGQoYmQuY291bnQoTGQodCksdCksbiwyKX1mdW5jdGlvbiBYcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gR3AodCxuKXtyZXR1cm4gWGQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIFZwKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiAkcCgpe3JldHVybiIlIn1mdW5jdGlvbiBXcCh0KXtyZXR1cm4rdH1mdW5jdGlvbiBacCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfWZ1bmN0aW9uIFFwKG4pe3JldHVybiBCZD1ZZChuKSx0LnRpbWVGb3JtYXQ9QmQuZm9ybWF0LHQudGltZVBhcnNlPUJkLnBhcnNlLHQudXRjRm9ybWF0PUJkLnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPUJkLnV0Y1BhcnNlLEJkfVFwKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIEpwPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9OnQudXRjRm9ybWF0KCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTt2YXIgS3A9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbih0KXt2YXIgbj1uZXcgRGF0ZSh0KTtyZXR1cm4gaXNOYU4obik/bnVsbDpufTp0LnV0Y1BhcnNlKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKSx0dj0xZTMsbnY9NjAqdHYsZXY9NjAqbnYscnY9MjQqZXYsaXY9Nypydixvdj0zMCpydixhdj0zNjUqcnY7ZnVuY3Rpb24gdXYodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIGZ2KHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIGN2KHQsbixyLGksbyxhLHUsZixjKXt2YXIgcz1taChnaCx2ZSksbD1zLmludmVydCxoPXMuZG9tYWluLGQ9YygiLiVMIikscD1jKCI6JVMiKSx2PWMoIiVJOiVNIiksZz1jKCIlSSAlcCIpLHk9YygiJWEgJWQiKSxfPWMoIiViICVkIiksYj1jKCIlQiIpLG09YygiJVkiKSx4PVtbdSwxLHR2XSxbdSw1LDUqdHZdLFt1LDE1LDE1KnR2XSxbdSwzMCwzMCp0dl0sW2EsMSxudl0sW2EsNSw1Km52XSxbYSwxNSwxNSpudl0sW2EsMzAsMzAqbnZdLFtvLDEsZXZdLFtvLDMsMypldl0sW28sNiw2KmV2XSxbbywxMiwxMipldl0sW2ksMSxydl0sW2ksMiwyKnJ2XSxbciwxLGl2XSxbbiwxLG92XSxbbiwzLDMqb3ZdLFt0LDEsYXZdXTtmdW5jdGlvbiBNKGUpe3JldHVybih1KGUpPGU/ZDphKGUpPGU/cDpvKGUpPGU/djppKGUpPGU/ZzpuKGUpPGU/cihlKTxlP3k6Xzp0KGUpPGU/YjptKShlKX1mdW5jdGlvbiBBKG4scixpLG8pe2lmKG51bGw9PW4mJihuPTEwKSwibnVtYmVyIj09dHlwZW9mIG4pe3ZhciBhPU1hdGguYWJzKGktcikvbix1PWUoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5yaWdodCh4LGEpO3U9PT14Lmxlbmd0aD8obz13KHIvYXYsaS9hdixuKSxuPXQpOnU/KG89KHU9eFthL3hbdS0xXVsyXTx4W3VdWzJdL2E/dS0xOnVdKVsxXSxuPXVbMF0pOihvPU1hdGgubWF4KHcocixpLG4pLDEpLG49Zil9cmV0dXJuIG51bGw9PW8/bjpuLmV2ZXJ5KG8pfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUobCh0KSl9LHMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2goZmguY2FsbCh0LGZ2KSk6aCgpLm1hcCh1dil9LHMudGlja3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPWgoKSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLGE9bzxpO3JldHVybiBhJiYoZT1pLGk9byxvPWUpLGU9KGU9QSh0LGksbyxuKSk/ZS5yYW5nZShpLG8rMSk6W10sYT9lLnJldmVyc2UoKTplfSxzLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09bj9NOmMobil9LHMubmljZT1mdW5jdGlvbih0LG4pe3ZhciBlPWgoKTtyZXR1cm4odD1BKHQsZVswXSxlW2UubGVuZ3RoLTFdLG4pKT9oKHdoKGUsdCkpOnN9LHMuY29weT1mdW5jdGlvbigpe3JldHVybiBiaChzLGN2KHQsbixyLGksbyxhLHUsZixjKSl9LHN9ZnVuY3Rpb24gc3YodCl7Zm9yKHZhciBuPXQubGVuZ3RoLzZ8MCxlPW5ldyBBcnJheShuKSxyPTA7cjxuOyllW3JdPSIjIit0LnNsaWNlKDYqciw2Kisrcik7cmV0dXJuIGV9dmFyIGx2PXN2KCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxodj1zdigiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2IiksZHY9c3YoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIwMmE2NzYxZDY2NjY2NiIpLHB2PXN2KCJhNmNlZTMxZjc4YjRiMmRmOGEzM2EwMmNmYjlhOTllMzFhMWNmZGJmNmZmZjdmMDBjYWIyZDY2YTNkOWFmZmZmOTliMTU5MjgiKSx2dj1zdigiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZmZmNjZTVkOGJkZmRkYWVjZjJmMmYyIiksZ3Y9c3YoImIzZTJjZGZkY2RhY2NiZDVlOGY0Y2FlNGU2ZjVjOWZmZjJhZWYxZTJjY2NjY2NjYyIpLHl2PXN2KCJlNDFhMWMzNzdlYjg0ZGFmNGE5ODRlYTNmZjdmMDBmZmZmMzNhNjU2MjhmNzgxYmY5OTk5OTkiKSxfdj1zdigiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0ZmZkOTJmZTVjNDk0YjNiM2IzIiksYnY9c3YoIjhkZDNjN2ZmZmZiM2JlYmFkYWZiODA3MjgwYjFkM2ZkYjQ2MmIzZGU2OWZjY2RlNWQ5ZDlkOWJjODBiZGNjZWJjNWZmZWQ2ZiIpO2Z1bmN0aW9uIG12KHQpe3JldHVybiBsZSh0W3QubGVuZ3RoLTFdKX12YXIgeHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZDhiMzY1ZjVmNWY1NWFiNGFjIiwiYTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4NTcxIiwiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIikubWFwKHN2KSx3dj1tdih4diksTXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiYWY4ZGMzZjdmN2Y3N2ZiZjdiIiwiN2IzMjk0YzJhNWNmYTZkYmEwMDA4ODM3IiwiN2IzMjk0YzJhNWNmZjdmN2Y3YTZkYmEwMDA4ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZjdmN2Y3ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIikubWFwKHN2KSxBdj1tdihNdiksVHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwiZDAxYzhiZjFiNmRhYjhlMTg2NGRhYzI2IiwiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZTlhM2M5ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IikubWFwKHN2KSxOdj1tdihUdiksU3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiOTk4ZWMzZjdmN2Y3ZjFhMzQwIiwiNWUzYzk5YjJhYmQyZmRiODYzZTY2MTAxIiwiNWUzYzk5YjJhYmQyZjdmN2Y3ZmRiODYzZTY2MTAxIiwiNTQyNzg4OTk4ZWMzZDhkYWViZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4OTk4ZWMzZDhkYWViZjdmN2Y3ZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IikubWFwKHN2KSxFdj1tdihTdiksa3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZjdmN2Y3NjdhOWNmIiwiY2EwMDIwZjRhNTgyOTJjNWRlMDU3MWIwIiwiY2EwMDIwZjRhNTgyZjdmN2Y3OTJjNWRlMDU3MWIwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZWY4YTYyZmRkYmM3ZjdmN2Y3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIikubWFwKHN2KSxDdj1tdihrdiksUHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZmZmZmZmOTk5OTk5IiwiY2EwMDIwZjRhNTgyYmFiYWJhNDA0MDQwIiwiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZWY4YTYyZmRkYmM3ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIikubWFwKHN2KSx6dj1tdihQdiksUnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFiZmRiIiwiZDcxOTFjZmRhZTYxYWJkOWU5MmM3YmI2IiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkOWU5MmM3YmI2IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZmZmZmJmZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IikubWFwKHN2KSxMdj1tdihSdiksRHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFjZjYwIiwiZDcxOTFjZmRhZTYxYTZkOTZhMWE5NjQxIiwiZDcxOTFjZmRhZTYxZmZmZmJmYTZkOTZhMWE5NjQxIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZmZmZmJmZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IikubWFwKHN2KSxVdj1tdihEdikscXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTlkNTk0IiwiZDcxOTFjZmRhZTYxYWJkZGE0MmI4M2JhIiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZmZmZmJmZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIikubWFwKHN2KSxPdj1tdihxdiksWXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWY5OTlkOGM5MmNhMjVmIiwiZWRmOGZiYjJlMmUyNjZjMmE0MjM4YjQ1IiwiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKHN2KSxCdj1tdihZdiksRnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBlY2Y0OWViY2RhODg1NmE3IiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg0MTlkIiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkODEwZjdjNGQwMDRiIikubWFwKHN2KSxJdj1tdihGdiksSHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBmM2RiYThkZGI1NDNhMmNhIiwiZjBmOWU4YmFlNGJjN2JjY2M0MmI4Y2JlIiwiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg2OGFjMDg0MDgxIikubWFwKHN2KSxqdj1tdihIdiksWHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlOGM4ZmRiYjg0ZTM0YTMzIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2YwMDAwIikubWFwKHN2KSxHdj1tdihYdiksVnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlMmYwYTZiZGRiMWM5MDk5IiwiZjZlZmY3YmRjOWUxNjdhOWNmMDI4MThhIiwiZjZlZmY3YmRjOWUxNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2YzU5MDE0NjM2IikubWFwKHN2KSwkdj1tdihWdiksV3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlN2YyYTZiZGRiMmI4Y2JlIiwiZjFlZWY2YmRjOWUxNzRhOWNmMDU3MGIwIiwiZjFlZWY2YmRjOWUxNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4IikubWFwKHN2KSxadj1tdihXdiksUXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTdlMWVmYzk5NGM3ZGQxYzc3IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwY2UxMjU2IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTgwMDQzNjcwMDFmIikubWFwKHN2KSxKdj1tdihRdiksS3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmRlMGRkZmE5ZmI1YzUxYjhhIiwiZmVlYmUyZmJiNGI5Zjc2OGExYWUwMTdlIiwiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3NDkwMDZhIikubWFwKHN2KSx0Zz1tdihLdiksbmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWRmOGIxN2ZjZGJiMmM3ZmI4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MjI1ZWE4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4IikubWFwKHN2KSxlZz1tdihuZykscmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjdmY2I5YWRkZDhlMzFhMzU0IiwiZmZmZmNjYzJlNjk5NzhjNjc5MjM4NDQzIiwiZmZmZmNjYzJlNjk5NzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA2ODM3MDA0NTI5IikubWFwKHN2KSxpZz1tdihyZyksb2c9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZmN2JjZmVjNDRmZDk1ZjBlIiwiZmZmZmQ0ZmVkOThlZmU5OTI5Y2M0YzAyIiwiZmZmZmQ0ZmVkOThlZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOTkzNDA0NjYyNTA2IikubWFwKHN2KSxhZz1tdihvZyksdWc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZlZGEwZmViMjRjZjAzYjIwIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZTMxYTFjIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYmQwMDI2ODAwMDI2IikubWFwKHN2KSxmZz1tdih1ZyksY2c9bmV3IEFycmF5KDMpLmNvbmNhdCgiZGVlYmY3OWVjYWUxMzE4MmJkIiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg1MTljMDgzMDZiIikubWFwKHN2KSxzZz1tdihjZyksbGc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWUwYTFkOTliMzFhMzU0IiwiZWRmOGU5YmFlNGIzNzRjNDc2MjM4YjQ1IiwiZWRmOGU5YmFlNGIzNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKHN2KSxoZz1tdihsZyksZGc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjBmMGYwYmRiZGJkNjM2MzYzIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NTI1MjUyIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIikubWFwKHN2KSxwZz1tdihkZyksdmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWZlZGY1YmNiZGRjNzU2YmIxIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIikubWFwKHN2KSxnZz1tdih2ZykseWc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlMGQyZmM5MjcyZGUyZDI2IiwiZmVlNWQ5ZmNhZTkxZmI2YTRhY2IxODFkIiwiZmVlNWQ5ZmNhZTkxZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkYTUwZjE1NjcwMDBkIikubWFwKHN2KSxfZz1tdih5ZyksYmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlNmNlZmRhZTZiZTY1NTBkIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZDk0NzAxIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxYTYzNjAzN2YyNzA0IikubWFwKHN2KSxtZz1tdihiZykseGc9R2UoS24oMzAwLC41LDApLEtuKC0yNDAsLjUsMSkpLHdnPUdlKEtuKC0xMDAsLjc1LC4zNSksS24oODAsMS41LC44KSksTWc9R2UoS24oMjYwLC43NSwuMzUpLEtuKDgwLDEuNSwuOCkpLEFnPUtuKCk7dmFyIFRnPWJuKCksTmc9TWF0aC5QSS8zLFNnPTIqTWF0aC5QSS8zO2Z1bmN0aW9uIEVnKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fXZhciBrZz1FZyhzdigiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLENnPUVnKHN2KCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksUGc9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSx6Zz1FZyhzdigiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpO2Z1bmN0aW9uIFJnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgTGc9TWF0aC5hYnMsRGc9TWF0aC5hdGFuMixVZz1NYXRoLmNvcyxxZz1NYXRoLm1heCxPZz1NYXRoLm1pbixZZz1NYXRoLnNpbixCZz1NYXRoLnNxcnQsRmc9MWUtMTIsSWc9TWF0aC5QSSxIZz1JZy8yLGpnPTIqSWc7ZnVuY3Rpb24gWGcodCl7cmV0dXJuIHQ+PTE/SGc6dDw9LTE/LUhnOk1hdGguYXNpbih0KX1mdW5jdGlvbiBHZyh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiBWZyh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiAkZyh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFdnKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIFpnKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIFFnKHQsbixlLHIsaSxvLGEpe3ZhciB1PXQtZSxmPW4tcixjPShhP286LW8pL0JnKHUqdStmKmYpLHM9YypmLGw9LWMqdSxoPXQrcyxkPW4rbCxwPWUrcyx2PXIrbCxnPShoK3ApLzIseT0oZCt2KS8yLF89cC1oLGI9di1kLG09XypfK2IqYix4PWktbyx3PWgqdi1wKmQsTT0oYjwwPy0xOjEpKkJnKHFnKDAseCp4Km0tdyp3KSksQT0odypiLV8qTSkvbSxUPSgtdypfLWIqTSkvbSxOPSh3KmIrXypNKS9tLFM9KC13Kl8rYipNKS9tLEU9QS1nLGs9VC15LEM9Ti1nLFA9Uy15O3JldHVybiBFKkUrayprPkMqQytQKlAmJihBPU4sVD1TKSx7Y3g6QSxjeTpULHgwMTotcyx5MDE6LWwseDExOkEqKGkveC0xKSx5MTE6VCooaS94LTEpfX1mdW5jdGlvbiBKZyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gS2codCl7cmV0dXJuIG5ldyBKZyh0KX1mdW5jdGlvbiB0eSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBueSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBleSgpe3ZhciB0PXR5LG49bnksZT1SZyghMCkscj1udWxsLGk9S2csbz1udWxsO2Z1bmN0aW9uIGEoYSl7dmFyIHUsZixjLHM9YS5sZW5ndGgsbD0hMTtmb3IobnVsbD09ciYmKG89aShjPUdpKCkpKSx1PTA7dTw9czsrK3UpISh1PHMmJmUoZj1hW3VdLHUsYSkpPT09bCYmKChsPSFsKT9vLmxpbmVTdGFydCgpOm8ubGluZUVuZCgpKSxsJiZvLnBvaW50KCt0KGYsdSxhKSwrbihmLHUsYSkpO2lmKGMpcmV0dXJuIG89bnVsbCxjKyIifHxudWxsfXJldHVybiBhLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZygrbiksYSk6dH0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOm59LGEuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCEhdCksYSk6ZX0sYS5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPXImJihvPWkocikpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9yPW89bnVsbDpvPWkocj10KSxhKTpyfSxhfWZ1bmN0aW9uIHJ5KCl7dmFyIHQ9dHksbj1udWxsLGU9UmcoMCkscj1ueSxpPVJnKCEwKSxvPW51bGwsYT1LZyx1PW51bGw7ZnVuY3Rpb24gZihmKXt2YXIgYyxzLGwsaCxkLHA9Zi5sZW5ndGgsdj0hMSxnPW5ldyBBcnJheShwKSx5PW5ldyBBcnJheShwKTtmb3IobnVsbD09byYmKHU9YShkPUdpKCkpKSxjPTA7Yzw9cDsrK2Mpe2lmKCEoYzxwJiZpKGg9ZltjXSxjLGYpKT09PXYpaWYodj0hdilzPWMsdS5hcmVhU3RhcnQoKSx1LmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHUubGluZUVuZCgpLHUubGluZVN0YXJ0KCksbD1jLTE7bD49czstLWwpdS5wb2ludChnW2xdLHlbbF0pO3UubGluZUVuZCgpLHUuYXJlYUVuZCgpfXYmJihnW2NdPSt0KGgsYyxmKSx5W2NdPStlKGgsYyxmKSx1LnBvaW50KG4/K24oaCxjLGYpOmdbY10scj8rcihoLGMsZik6eVtjXSkpfWlmKGQpcmV0dXJuIHU9bnVsbCxkKyIifHxudWxsfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZXkoKS5kZWZpbmVkKGkpLmN1cnZlKGEpLmNvbnRleHQobyl9cmV0dXJuIGYueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlJnKCtlKSxuPW51bGwsZik6dH0sZi54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxmKTp0fSxmLngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpufSxmLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCkscj1udWxsLGYpOmV9LGYueTA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6cn0sZi5saW5lWDA9Zi5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShlKX0sZi5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShyKX0sZi5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngobikueShlKX0sZi5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxmKTppfSxmLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbnVsbCE9byYmKHU9YShvKSksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P289dT1udWxsOnU9YShvPXQpLGYpOm99LGZ9ZnVuY3Rpb24gaXkodCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59ZnVuY3Rpb24gb3kodCl7cmV0dXJuIHR9SmcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsbil9fX07dmFyIGF5PWZ5KEtnKTtmdW5jdGlvbiB1eSh0KXt0aGlzLl9jdXJ2ZT10fWZ1bmN0aW9uIGZ5KHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG5ldyB1eSh0KG4pKX1yZXR1cm4gbi5fY3VydmU9dCxufWZ1bmN0aW9uIGN5KHQpe3ZhciBuPXQuY3VydmU7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIHN5KCl7cmV0dXJuIGN5KGV5KCkuY3VydmUoYXkpKX1mdW5jdGlvbiBseSgpe3ZhciB0PXJ5KCkuY3VydmUoYXkpLG49dC5jdXJ2ZSxlPXQubGluZVgwLHI9dC5saW5lWDEsaT10LmxpbmVZMCxvPXQubGluZVkxO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQuc3RhcnRBbmdsZT10LngwLGRlbGV0ZSB0LngwLHQuZW5kQW5nbGU9dC54MSxkZWxldGUgdC54MSx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmlubmVyUmFkaXVzPXQueTAsZGVsZXRlIHQueTAsdC5vdXRlclJhZGl1cz10LnkxLGRlbGV0ZSB0LnkxLHQubGluZVN0YXJ0QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3koZSgpKX0sZGVsZXRlIHQubGluZVgwLHQubGluZUVuZEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KHIoKSl9LGRlbGV0ZSB0LmxpbmVYMSx0LmxpbmVJbm5lclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShpKCkpfSxkZWxldGUgdC5saW5lWTAsdC5saW5lT3V0ZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gY3kobygpKX0sZGVsZXRlIHQubGluZVkxLHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihmeSh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiBoeSh0LG4pe3JldHVyblsobj0rbikqTWF0aC5jb3ModC09TWF0aC5QSS8yKSxuKk1hdGguc2luKHQpXX11eS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl9jdXJ2ZS5wb2ludChuKk1hdGguc2luKHQpLG4qLU1hdGguY29zKHQpKX19O3ZhciBkeT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gcHkodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIHZ5KHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBneSh0KXt2YXIgbj1weSxlPXZ5LHI9dHksaT1ueSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9ZHkuY2FsbChhcmd1bWVudHMpLGY9bi5hcHBseSh0aGlzLHUpLGM9ZS5hcHBseSh0aGlzLHUpO2lmKG98fChvPWE9R2koKSksdChvLCtyLmFwcGx5KHRoaXMsKHVbMF09Zix1KSksK2kuYXBwbHkodGhpcyx1KSwrci5hcHBseSh0aGlzLCh1WzBdPWMsdSkpLCtpLmFwcGx5KHRoaXMsdSkpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOnJ9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTppfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX1mdW5jdGlvbiB5eSh0LG4sZSxyLGkpe3QubW92ZVRvKG4sZSksdC5iZXppZXJDdXJ2ZVRvKG49KG4rcikvMixlLG4saSxyLGkpfWZ1bmN0aW9uIF95KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obixlPShlK2kpLzIscixlLHIsaSl9ZnVuY3Rpb24gYnkodCxuLGUscixpKXt2YXIgbz1oeShuLGUpLGE9aHkobixlPShlK2kpLzIpLHU9aHkocixlKSxmPWh5KHIsaSk7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8oYVswXSxhWzFdLHVbMF0sdVsxXSxmWzBdLGZbMV0pfXZhciBteT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0lnKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsamcpfX0seHk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sd3k9TWF0aC5zcXJ0KDEvMyksTXk9Mip3eSxBeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL015KSxyPWUqd3k7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxUeT1NYXRoLnNpbihJZy8xMCkvTWF0aC5zaW4oNypJZy8xMCksTnk9TWF0aC5zaW4oamcvMTApKlR5LFN5PS1NYXRoLmNvcyhqZy8xMCkqVHksRXk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQoLjg5MDgxMzA5MTUyOTI4NTIqbikscj1OeSplLGk9U3kqZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciBhPWpnKm8vNSx1PU1hdGguY29zKGEpLGY9TWF0aC5zaW4oYSk7dC5saW5lVG8oZiplLC11KmUpLHQubGluZVRvKHUqci1mKmksZipyK3UqaSl9dC5jbG9zZVBhdGgoKX19LGt5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSxDeT1NYXRoLnNxcnQoMyksUHk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqQ3kpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLUN5KmUsLWUpLHQubGluZVRvKEN5KmUsLWUpLHQuY2xvc2VQYXRoKCl9fSx6eT1NYXRoLnNxcnQoMykvMixSeT0xL01hdGguc3FydCgxMiksTHk9MyooUnkvMisxKSxEeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0x5KSxyPWUvMixpPWUqUnksbz1yLGE9ZSpSeStlLHU9LW8sZj1hO3QubW92ZVRvKHIsaSksdC5saW5lVG8obyxhKSx0LmxpbmVUbyh1LGYpLHQubGluZVRvKC0uNSpyLXp5KmksenkqcistLjUqaSksdC5saW5lVG8oLS41Km8tenkqYSx6eSpvKy0uNSphKSx0LmxpbmVUbygtLjUqdS16eSpmLHp5KnUrLS41KmYpLHQubGluZVRvKC0uNSpyK3p5KmksLS41KmktenkqciksdC5saW5lVG8oLS41Km8renkqYSwtLjUqYS16eSpvKSx0LmxpbmVUbygtLjUqdSt6eSpmLC0uNSpmLXp5KnUpLHQuY2xvc2VQYXRoKCl9fSxVeT1bbXkseHksQXksa3ksRXksUHksRHldO2Z1bmN0aW9uIHF5KCl7fWZ1bmN0aW9uIE95KHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBZeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gQnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEZ5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBJeSh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBZeSh0KSx0aGlzLl9iZXRhPW59WXkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpPeSh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sQnkucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIrMip0aGlzLl94MykvMywodGhpcy5feTIrMip0aGlzLl95MykvMyksdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzKzIqdGhpcy5feDIpLzMsKHRoaXMuX3kzKzIqdGhpcy5feTIpLzMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpLHRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mj10LHRoaXMuX3kyPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g0PXQsdGhpcy5feTQ9bix0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDArNCp0aGlzLl94MSt0KS82LCh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzYpO2JyZWFrO2RlZmF1bHQ6T3kodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LEZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBlPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYscj0odGhpcy5feTArNCp0aGlzLl95MStuKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oZSxyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6T3kodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LEl5LnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aC0xO2lmKGU+MClmb3IodmFyIHIsaT10WzBdLG89blswXSxhPXRbZV0taSx1PW5bZV0tbyxmPS0xOysrZjw9ZTspcj1mL2UsdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2ZdKygxLXRoaXMuX2JldGEpKihpK3IqYSksdGhpcy5fYmV0YSpuW2ZdKygxLXRoaXMuX2JldGEpKihvK3IqdSkpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgSHk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxPT09bj9uZXcgWXkodCk6bmV3IEl5KHQsbil9cmV0dXJuIGUuYmV0YT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC44NSk7ZnVuY3Rpb24gankodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBYeSh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9WHkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOmp5KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEd5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFh5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFZ5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1WeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6ankodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciAkeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBWeSh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtmdW5jdGlvbiBXeSh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9V3kucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6ankodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBaeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBXeSh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtmdW5jdGlvbiBReSh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLGE9dC5feTI7aWYodC5fbDAxX2E+Rmcpe3ZhciB1PTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqdS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9mLGk9KGkqdS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9mfWlmKHQuX2wyM19hPkZnKXt2YXIgYz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxzPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKmMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9zLGE9KGEqYyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL3N9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLGEsdC5feDIsdC5feTIpfWZ1bmN0aW9uIEp5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59SnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpReSh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBLeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IEp5KHQsbik6bmV3IFh5KHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7ZnVuY3Rpb24gdF8odCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn10Xy5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIG5fPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgdF8odCxuKTpuZXcgVnkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBlXyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWVfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpReSh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciByXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IGVfKHQsbik6bmV3IFd5KHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7ZnVuY3Rpb24gaV8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIG9fKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBhXyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksYT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLHU9KG8qaSthKnIpLyhyK2kpO3JldHVybihvXyhvKStvXyhhKSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnMoYSksLjUqTWF0aC5hYnModSkpfHwwfWZ1bmN0aW9uIHVfKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBmXyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLGE9dC5feTEsdT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK3UsaSt1Km4sby11LGEtdSplLG8sYSl9ZnVuY3Rpb24gY18odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHNfKHQpe3RoaXMuX2NvbnRleHQ9bmV3IGxfKHQpfWZ1bmN0aW9uIGxfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBoXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gZF8odCl7dmFyIG4sZSxyPXQubGVuZ3RoLTEsaT1uZXcgQXJyYXkociksbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocik7Zm9yKGlbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxuPTE7bjxyLTE7KytuKWlbbl09MSxvW25dPTQsYVtuXT00KnRbbl0rMip0W24rMV07Zm9yKGlbci0xXT0yLG9bci0xXT03LGFbci0xXT04KnRbci0xXSt0W3JdLG49MTtuPHI7KytuKWU9aVtuXS9vW24tMV0sb1tuXS09ZSxhW25dLT1lKmFbbi0xXTtmb3IoaVtyLTFdPWFbci0xXS9vW3ItMV0sbj1yLTI7bj49MDstLW4paVtuXT0oYVtuXS1pW24rMV0pL29bbl07Zm9yKG9bci0xXT0odFtyXStpW3ItMV0pLzIsbj0wO248ci0xOysrbilvW25dPTIqdFtuKzFdLWlbbisxXTtyZXR1cm5baSxvXX1mdW5jdGlvbiBwXyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl90PW59ZnVuY3Rpb24gdl8odCxuKXtpZigoaT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG89MSxhPXRbblswXV0sdT1hLmxlbmd0aDtvPGk7KytvKWZvcihyPWEsYT10W25bb11dLGU9MDtlPHU7KytlKWFbZV1bMV0rPWFbZV1bMF09aXNOYU4ocltlXVsxXSk/cltlXVswXTpyW2VdWzFdfWZ1bmN0aW9uIGdfKHQpe2Zvcih2YXIgbj10Lmxlbmd0aCxlPW5ldyBBcnJheShuKTstLW4+PTA7KWVbbl09bjtyZXR1cm4gZX1mdW5jdGlvbiB5Xyh0LG4pe3JldHVybiB0W25dfWZ1bmN0aW9uIF9fKHQpe3ZhciBuPXQubWFwKGJfKTtyZXR1cm4gZ18odCkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuW3RdLW5bZV19KX1mdW5jdGlvbiBiXyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gbV8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHhfKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHdfKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIE1fKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gQV8odCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBUXyh0LG4pe3ZhciBlPW4scj1uLlIsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gTl8odCxuKXt2YXIgZT1uLHI9bi5MLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIFNfKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBFXyh0LG4sZSxyKXt2YXIgaT1bbnVsbCxudWxsXSxvPUpfLnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1uLGUmJkNfKGksdCxuLGUpLHImJkNfKGksbix0LHIpLFpfW3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLFpfW24uaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24ga18odCxuLGUpe3ZhciByPVtuLGVdO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIENfKHQsbixlLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09ZT90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PW4sdC5yaWdodD1lKX1mdW5jdGlvbiBQXyh0LG4sZSxyLGkpe3ZhciBvLGE9dFswXSx1PXRbMV0sZj1hWzBdLGM9YVsxXSxzPTAsbD0xLGg9dVswXS1mLGQ9dVsxXS1jO2lmKG89bi1mLGh8fCEobz4wKSl7aWYoby89aCxoPDApe2lmKG88cylyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGg+MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWlmKG89ci1mLGh8fCEobzwwKSl7aWYoby89aCxoPDApe2lmKG8+bClyZXR1cm47bz5zJiYocz1vKX1lbHNlIGlmKGg+MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWlmKG89ZS1jLGR8fCEobz4wKSl7aWYoby89ZCxkPDApe2lmKG88cylyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGQ+MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWlmKG89aS1jLGR8fCEobzwwKSl7aWYoby89ZCxkPDApe2lmKG8+bClyZXR1cm47bz5zJiYocz1vKX1lbHNlIGlmKGQ+MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfXJldHVybiEocz4wfHxsPDEpfHwocz4wJiYodFswXT1bZitzKmgsYytzKmRdKSxsPDEmJih0WzFdPVtmK2wqaCxjK2wqZF0pLCEwKX19fX19ZnVuY3Rpb24gel8odCxuLGUscixpKXt2YXIgbz10WzFdO2lmKG8pcmV0dXJuITA7dmFyIGEsdSxmPXRbMF0sYz10LmxlZnQscz10LnJpZ2h0LGw9Y1swXSxoPWNbMV0sZD1zWzBdLHA9c1sxXSx2PShsK2QpLzIsZz0oaCtwKS8yO2lmKHA9PT1oKXtpZih2PG58fHY+PXIpcmV0dXJuO2lmKGw+ZCl7aWYoZil7aWYoZlsxXT49aSlyZXR1cm59ZWxzZSBmPVt2LGVdO289W3YsaV19ZWxzZXtpZihmKXtpZihmWzFdPGUpcmV0dXJufWVsc2UgZj1bdixpXTtvPVt2LGVdfX1lbHNlIGlmKHU9Zy0oYT0obC1kKS8ocC1oKSkqdixhPC0xfHxhPjEpaWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9WyhlLXUpL2EsZV07bz1bKGktdSkvYSxpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVsoaS11KS9hLGldO289WyhlLXUpL2EsZV19ZWxzZSBpZihoPHApe2lmKGYpe2lmKGZbMF0+PXIpcmV0dXJufWVsc2UgZj1bbixhKm4rdV07bz1bcixhKnIrdV19ZWxzZXtpZihmKXtpZihmWzBdPG4pcmV0dXJufWVsc2UgZj1bcixhKnIrdV07bz1bbixhKm4rdV19cmV0dXJuIHRbMF09Zix0WzFdPW8sITB9ZnVuY3Rpb24gUl8odCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBMXyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gRF8odCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWlfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX0sY18ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5fdDA9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOmZfKHRoaXMsdGhpcy5fdDAsdV8odGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1OYU47aWYobj0rbiwodD0rdCkhPT10aGlzLl94MXx8biE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLGZfKHRoaXMsdV8odGhpcyxlPWFfKHRoaXMsdCxuKSksZSk7YnJlYWs7ZGVmYXVsdDpmXyh0aGlzLHRoaXMuX3QwLGU9YV8odGhpcyx0LG4pKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW4sdGhpcy5fdDA9ZX19fSwoc18ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoY18ucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24odCxuKXtjXy5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLG4sdCl9LGxfLnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5tb3ZlVG8obix0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5saW5lVG8obix0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKG4sdCxyLGUsbyxpKX19LGhfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGg7aWYoZSlpZih0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRbMF0sblswXSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odFswXSxuWzBdKSwyPT09ZSl0aGlzLl9jb250ZXh0LmxpbmVUbyh0WzFdLG5bMV0pO2Vsc2UgZm9yKHZhciByPWRfKHQpLGk9ZF8obiksbz0wLGE9MTthPGU7KytvLCsrYSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oclswXVtvXSxpWzBdW29dLHJbMV1bb10saVsxXVtvXSx0W2FdLG5bYV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PWUpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19LHBfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsbiksdGhpcy5fY29udGV4dC5saW5lVG8odCxuKTtlbHNle3ZhciBlPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKGUsdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8oZSxuKX19dGhpcy5feD10LHRoaXMuX3k9bn19LE1fLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TV8saW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGUscixpO2lmKHQpe2lmKG4uUD10LG4uTj10Lk4sdC5OJiYodC5OLlA9biksdC5OPW4sdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9bn1lbHNlIHQuUj1uO2U9dH1lbHNlIHRoaXMuXz8odD1TXyh0aGlzLl8pLG4uUD1udWxsLG4uTj10LHQuUD10Lkw9bixlPXQpOihuLlA9bi5OPW51bGwsdGhpcy5fPW4sZT1udWxsKTtmb3Iobi5MPW4uUj1udWxsLG4uVT1lLG4uQz0hMCx0PW47ZSYmZS5DOyllPT09KHI9ZS5VKS5MPyhpPXIuUikmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuUiYmKFRfKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLE5fKHRoaXMscikpOihpPXIuTCkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuTCYmKE5fKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLFRfKHRoaXMscikpLGU9dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgbixlLHIsaT10LlUsbz10LkwsYT10LlI7aWYoZT1vP2E/U18oYSk6bzphLGk/aS5MPT09dD9pLkw9ZTppLlI9ZTp0aGlzLl89ZSxvJiZhPyhyPWUuQyxlLkM9dC5DLGUuTD1vLG8uVT1lLGUhPT1hPyhpPWUuVSxlLlU9dC5VLHQ9ZS5SLGkuTD10LGUuUj1hLGEuVT1lKTooZS5VPWksaT1lLHQ9ZS5SKSk6KHI9dC5DLHQ9ZSksdCYmKHQuVT1pKSwhcilpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigobj1pLlIpLkMmJihuLkM9ITEsaS5DPSEwLFRfKHRoaXMsaSksbj1pLlIpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uUiYmbi5SLkN8fChuLkwuQz0hMSxuLkM9ITAsTl8odGhpcyxuKSxuPWkuUiksbi5DPWkuQyxpLkM9bi5SLkM9ITEsVF8odGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigobj1pLkwpLkMmJihuLkM9ITEsaS5DPSEwLE5fKHRoaXMsaSksbj1pLkwpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uTCYmbi5MLkN8fChuLlIuQz0hMSxuLkM9ITAsVF8odGhpcyxuKSxuPWkuTCksbi5DPWkuQyxpLkM9bi5MLkM9ITEsTl8odGhpcyxpKSx0PXRoaXMuXzticmVha31uLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBVXyxxXz1bXTtmdW5jdGlvbiBPXygpe0FfKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBZXyh0KXt2YXIgbj10LlAsZT10Lk47aWYobiYmZSl7dmFyIHI9bi5zaXRlLGk9dC5zaXRlLG89ZS5zaXRlO2lmKHIhPT1vKXt2YXIgYT1pWzBdLHU9aVsxXSxmPXJbMF0tYSxjPXJbMV0tdSxzPW9bMF0tYSxsPW9bMV0tdSxoPTIqKGYqbC1jKnMpO2lmKCEoaD49LXRiKSl7dmFyIGQ9ZipmK2MqYyxwPXMqcytsKmwsdj0obCpkLWMqcCkvaCxnPShmKnAtcypkKS9oLHk9cV8ucG9wKCl8fG5ldyBPXzt5LmFyYz10LHkuc2l0ZT1pLHkueD12K2EseS55PSh5LmN5PWcrdSkrTWF0aC5zcXJ0KHYqditnKmcpLHQuY2lyY2xlPXk7Zm9yKHZhciBfPW51bGwsYj1RXy5fO2I7KWlmKHkueTxiLnl8fHkueT09PWIueSYmeS54PD1iLngpe2lmKCFiLkwpe189Yi5QO2JyZWFrfWI9Yi5MfWVsc2V7aWYoIWIuUil7Xz1iO2JyZWFrfWI9Yi5SfVFfLmluc2VydChfLHkpLF98fChVXz15KX19fX1mdW5jdGlvbiBCXyh0KXt2YXIgbj10LmNpcmNsZTtuJiYobi5QfHwoVV89bi5OKSxRXy5yZW1vdmUobikscV8ucHVzaChuKSxBXyhuKSx0LmNpcmNsZT1udWxsKX12YXIgRl89W107ZnVuY3Rpb24gSV8oKXtBXyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gSF8odCl7dmFyIG49Rl8ucG9wKCl8fG5ldyBJXztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBqXyh0KXtCXyh0KSxXXy5yZW1vdmUodCksRl8ucHVzaCh0KSxBXyh0KX1mdW5jdGlvbiBYXyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCxhPXQuTix1PVt0XTtqXyh0KTtmb3IodmFyIGY9bztmLmNpcmNsZSYmTWF0aC5hYnMoZS1mLmNpcmNsZS54KTxLXyYmTWF0aC5hYnMoci1mLmNpcmNsZS5jeSk8S187KW89Zi5QLHUudW5zaGlmdChmKSxqXyhmKSxmPW87dS51bnNoaWZ0KGYpLEJfKGYpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYXRoLmFicyhlLWMuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWMuY2lyY2xlLmN5KTxLXzspYT1jLk4sdS5wdXNoKGMpLGpfKGMpLGM9YTt1LnB1c2goYyksQl8oYyk7dmFyIHMsbD11Lmxlbmd0aDtmb3Iocz0xO3M8bDsrK3MpYz11W3NdLGY9dVtzLTFdLENfKGMuZWRnZSxmLnNpdGUsYy5zaXRlLGkpO2Y9dVswXSwoYz11W2wtMV0pLmVkZ2U9RV8oZi5zaXRlLGMuc2l0ZSxudWxsLGkpLFlfKGYpLFlfKGMpfWZ1bmN0aW9uIEdfKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sYT10WzFdLHU9V18uXzt1OylpZigocj1WXyh1LGEpLW8pPktfKXU9dS5MO2Vsc2V7aWYoISgoaT1vLSRfKHUsYSkpPktfKSl7cj4tS18/KG49dS5QLGU9dSk6aT4tS18/KG49dSxlPXUuTik6bj1lPXU7YnJlYWt9aWYoIXUuUil7bj11O2JyZWFrfXU9dS5SfSFmdW5jdGlvbih0KXtaX1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciBmPUhfKHQpO2lmKFdfLmluc2VydChuLGYpLG58fGUpe2lmKG49PT1lKXJldHVybiBCXyhuKSxlPUhfKG4uc2l0ZSksV18uaW5zZXJ0KGYsZSksZi5lZGdlPWUuZWRnZT1FXyhuLnNpdGUsZi5zaXRlKSxZXyhuKSx2b2lkIFlfKGUpO2lmKGUpe0JfKG4pLEJfKGUpO3ZhciBjPW4uc2l0ZSxzPWNbMF0sbD1jWzFdLGg9dFswXS1zLGQ9dFsxXS1sLHA9ZS5zaXRlLHY9cFswXS1zLGc9cFsxXS1sLHk9MiooaCpnLWQqdiksXz1oKmgrZCpkLGI9dip2K2cqZyxtPVsoZypfLWQqYikveStzLChoKmItdipfKS95K2xdO0NfKGUuZWRnZSxjLHAsbSksZi5lZGdlPUVfKGMsdCxudWxsLG0pLGUuZWRnZT1FXyh0LHAsbnVsbCxtKSxZXyhuKSxZXyhlKX1lbHNlIGYuZWRnZT1FXyhuLnNpdGUsZi5zaXRlKX19ZnVuY3Rpb24gVl8odCxuKXt2YXIgZT10LnNpdGUscj1lWzBdLGk9ZVsxXSxvPWktbjtpZighbylyZXR1cm4gcjt2YXIgYT10LlA7aWYoIWEpcmV0dXJuLTEvMDt2YXIgdT0oZT1hLnNpdGUpWzBdLGY9ZVsxXSxjPWYtbjtpZighYylyZXR1cm4gdTt2YXIgcz11LXIsbD0xL28tMS9jLGg9cy9jO3JldHVybiBsPygtaCtNYXRoLnNxcnQoaCpoLTIqbCoocypzLygtMipjKS1mK2MvMitpLW8vMikpKS9sK3I6KHIrdSkvMn1mdW5jdGlvbiAkXyh0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiBWXyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9dmFyIFdfLFpfLFFfLEpfLEtfPTFlLTYsdGI9MWUtMTI7ZnVuY3Rpb24gbmIodCxuKXtyZXR1cm4gblsxXS10WzFdfHxuWzBdLXRbMF19ZnVuY3Rpb24gZWIodCxuKXt2YXIgZSxyLGksbz10LnNvcnQobmIpLnBvcCgpO2ZvcihKXz1bXSxaXz1uZXcgQXJyYXkodC5sZW5ndGgpLFdfPW5ldyBNXyxRXz1uZXcgTV87OylpZihpPVVfLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSlvWzBdPT09ZSYmb1sxXT09PXJ8fChHXyhvKSxlPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztYXyhpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsbixlLHIsaT0wLG89Wl8ubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9Wl9baV0pJiYocj0obj10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIGE9bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxyOysrZSlhW2VdPWUsdVtlXT1SXyh0LEpfW25bZV1dKTtmb3IoYS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHVbbl0tdVt0XX0pLGU9MDtlPHI7KytlKXVbZV09blthW2VdXTtmb3IoZT0wO2U8cjsrK2UpbltlXT11W2VdfX0oKSxuKXt2YXIgYT0rblswXVswXSx1PStuWzBdWzFdLGY9K25bMV1bMF0sYz0rblsxXVsxXTshZnVuY3Rpb24odCxuLGUscil7Zm9yKHZhciBpLG89Sl8ubGVuZ3RoO28tLTspel8oaT1KX1tvXSx0LG4sZSxyKSYmUF8oaSx0LG4sZSxyKSYmKE1hdGguYWJzKGlbMF1bMF0taVsxXVswXSk+S198fE1hdGguYWJzKGlbMF1bMV0taVsxXVsxXSk+S18pfHxkZWxldGUgSl9bb119KGEsdSxmLGMpLGZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sYSx1LGYsYyxzLGwsaCxkLHAsdixnPVpfLmxlbmd0aCx5PSEwO2ZvcihpPTA7aTxnOysraSlpZihvPVpfW2ldKXtmb3IoYT1vLnNpdGUsdT0oZj1vLmhhbGZlZGdlcykubGVuZ3RoO3UtLTspSl9bZlt1XV18fGYuc3BsaWNlKHUsMSk7Zm9yKHU9MCxjPWYubGVuZ3RoO3U8YzspcD0oZD1EXyhvLEpfW2ZbdV1dKSlbMF0sdj1kWzFdLGw9KHM9TF8obyxKX1tmWysrdSVjXV0pKVswXSxoPXNbMV0sKE1hdGguYWJzKHAtbCk+S198fE1hdGguYWJzKHYtaCk+S18pJiYoZi5zcGxpY2UodSwwLEpfLnB1c2goa18oYSxkLE1hdGguYWJzKHAtdCk8S18mJnItdj5LXz9bdCxNYXRoLmFicyhsLXQpPEtfP2g6cl06TWF0aC5hYnModi1yKTxLXyYmZS1wPktfP1tNYXRoLmFicyhoLXIpPEtfP2w6ZSxyXTpNYXRoLmFicyhwLWUpPEtfJiZ2LW4+S18/W2UsTWF0aC5hYnMobC1lKTxLXz9oOm5dOk1hdGguYWJzKHYtbik8S18mJnAtdD5LXz9bTWF0aC5hYnMoaC1uKTxLXz9sOnQsbl06bnVsbCkpLTEpLCsrYyk7YyYmKHk9ITEpfWlmKHkpe3ZhciBfLGIsbSx4PTEvMDtmb3IoaT0wLHk9bnVsbDtpPGc7KytpKShvPVpfW2ldKSYmKG09KF89KGE9by5zaXRlKVswXS10KSpfKyhiPWFbMV0tbikqYik8eCYmKHg9bSx5PW8pO2lmKHkpe3ZhciB3PVt0LG5dLE09W3Qscl0sQT1bZSxyXSxUPVtlLG5dO3kuaGFsZmVkZ2VzLnB1c2goSl8ucHVzaChrXyhhPXkuc2l0ZSx3LE0pKS0xLEpfLnB1c2goa18oYSxNLEEpKS0xLEpfLnB1c2goa18oYSxBLFQpKS0xLEpfLnB1c2goa18oYSxULHcpKS0xKX19Zm9yKGk9MDtpPGc7KytpKShvPVpfW2ldKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIFpfW2ldKX0oYSx1LGYsYyl9dGhpcy5lZGdlcz1KXyx0aGlzLmNlbGxzPVpfLFdfPVFfPUpfPVpfPW51bGx9ZnVuY3Rpb24gcmIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGliKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gb2IodCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWViLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZWIscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihuKXt2YXIgZT1uLmhhbGZlZGdlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIExfKG4sdFtlXSl9KTtyZXR1cm4gZS5kYXRhPW4uc2l0ZS5kYXRhLGV9KX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sbj10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpZihvPShpPWUuaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciBpLG8sYSx1LGYsYyxzPWUuc2l0ZSxsPS0xLGg9bltpW28tMV1dLGQ9aC5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdDsrK2w8bzspYT1kLGQ9KGg9bltpW2xdXSkubGVmdD09PXM/aC5yaWdodDpoLmxlZnQsYSYmZCYmcjxhLmluZGV4JiZyPGQuaW5kZXgmJihmPWEsYz1kLCgodT1zKVswXS1jWzBdKSooZlsxXS11WzFdKS0odVswXS1mWzBdKSooY1sxXS11WzFdKTwwKSYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLGQuZGF0YV0pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pfSxmaW5kOmZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPXRoaXMsYT1vLl9mb3VuZHx8MCx1PW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW2FdKTspaWYoKythPj11KXJldHVybiBudWxsO3ZhciBmPXQtaS5zaXRlWzBdLGM9bi1pLnNpdGVbMV0scz1mKmYrYypjO2Rve2k9by5jZWxsc1tyPWFdLGE9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPW8uZWRnZXNbZV0sdT1yLmxlZnQ7aWYodSE9PWkuc2l0ZSYmdXx8KHU9ci5yaWdodCkpe3ZhciBmPXQtdVswXSxjPW4tdVsxXSxsPWYqZitjKmM7bDxzJiYocz1sLGE9dS5pbmRleCl9fSl9d2hpbGUobnVsbCE9PWEpO3JldHVybiBvLl9mb3VuZD1yLG51bGw9PWV8fHM8PWUqZT9pLnNpdGU6bnVsbH19LG9iLnByb3RvdHlwZT17Y29uc3RydWN0b3I6b2Isc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IG9iKHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gMD09PXQmMD09PW4/dGhpczpuZXcgb2IodGhpcy5rLHRoaXMueCt0aGlzLmsqdCx0aGlzLnkrdGhpcy5rKm4pfSxhcHBseTpmdW5jdGlvbih0KXtyZXR1cm5bdFswXSp0aGlzLmsrdGhpcy54LHRbMV0qdGhpcy5rK3RoaXMueV19LGFwcGx5WDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy54fSxhcHBseVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueX0saW52ZXJ0OmZ1bmN0aW9uKHQpe3JldHVyblsodFswXS10aGlzLngpL3RoaXMuaywodFsxXS10aGlzLnkpL3RoaXMua119LGludmVydFg6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy54KS90aGlzLmt9LGludmVydFk6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy55KS90aGlzLmt9LHJlc2NhbGVYOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0scmVzY2FsZVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLngrIiwiK3RoaXMueSsiKSBzY2FsZSgiK3RoaXMuaysiKSJ9fTt2YXIgYWI9bmV3IG9iKDEsMCwwKTtmdW5jdGlvbiB1Yih0KXtyZXR1cm4gdC5fX3pvb218fGFifWZ1bmN0aW9uIGZiKCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBjYigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHNiKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIGxiKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PShlPWUub3duZXJTVkdFbGVtZW50fHxlKS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIGhiKCl7cmV0dXJuIHRoaXMuX196b29tfHxhYn1mdW5jdGlvbiBkYigpe3JldHVybi10LmV2ZW50LmRlbHRhWSoodC5ldmVudC5kZWx0YU1vZGU/MTIwOjEpLzUwMH1mdW5jdGlvbiBwYigpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiB2Yih0LG4sZSl7dmFyIHI9dC5pbnZlcnRYKG5bMF1bMF0pLWVbMF1bMF0saT10LmludmVydFgoblsxXVswXSktZVsxXVswXSxvPXQuaW52ZXJ0WShuWzBdWzFdKS1lWzBdWzFdLGE9dC5pbnZlcnRZKG5bMV1bMV0pLWVbMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKGk+cj8ocitpKS8yOk1hdGgubWluKDAscil8fE1hdGgubWF4KDAsaSksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9dWIucHJvdG90eXBlPW9iLnByb3RvdHlwZSx0LnZlcnNpb249IjUuNy4wIix0LmJpc2VjdD1pLHQuYmlzZWN0UmlnaHQ9aSx0LmJpc2VjdExlZnQ9byx0LmFzY2VuZGluZz1uLHQuYmlzZWN0b3I9ZSx0LmNyb3NzPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sdSxmPXQubGVuZ3RoLGM9bi5sZW5ndGgscz1uZXcgQXJyYXkoZipjKTtmb3IobnVsbD09ZSYmKGU9YSkscj1vPTA7cjxmOysrcilmb3IodT10W3JdLGk9MDtpPGM7KytpLCsrbylzW29dPWUodSxuW2ldKTtyZXR1cm4gc30sdC5kZXNjZW5kaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfSx0LmRldmlhdGlvbj1jLHQuZXh0ZW50PXMsdC5oaXN0b2dyYW09ZnVuY3Rpb24oKXt2YXIgdD12LG49cyxlPU07ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHU9ci5sZW5ndGgsZj1uZXcgQXJyYXkodSk7Zm9yKG89MDtvPHU7KytvKWZbb109dChyW29dLG8scik7dmFyIGM9bihmKSxzPWNbMF0sbD1jWzFdLGg9ZShmLHMsbCk7QXJyYXkuaXNBcnJheShoKXx8KGg9dyhzLGwsaCksaD1nKE1hdGguY2VpbChzL2gpKmgsbCxoKSk7Zm9yKHZhciBkPWgubGVuZ3RoO2hbMF08PXM7KWguc2hpZnQoKSwtLWQ7Zm9yKDtoW2QtMV0+bDspaC5wb3AoKSwtLWQ7dmFyIHAsdj1uZXcgQXJyYXkoZCsxKTtmb3Iobz0wO288PWQ7KytvKShwPXZbb109W10pLngwPW8+MD9oW28tMV06cyxwLngxPW88ZD9oW29dOmw7Zm9yKG89MDtvPHU7KytvKXM8PShhPWZbb10pJiZhPD1sJiZ2W2koaCxhLDAsZCldLnB1c2gocltvXSk7cmV0dXJuIHZ9cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpwKG4pLHIpOnR9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cChbdFswXSx0WzFdXSkscik6bn0sci50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9wKGguY2FsbCh0KSk6cCh0KSxyKTplfSxyfSx0LnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PWQuY2FsbCh0LHUpLnNvcnQobiksTWF0aC5jZWlsKChyLWUpLygyKihBKHQsLjc1KS1BKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdC50aHJlc2hvbGRTY290dD1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIE1hdGguY2VpbCgoZS1uKS8oMy41KmModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdC50aHJlc2hvbGRTdHVyZ2VzPU0sdC5tYXg9VCx0Lm1lYW49ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9cixvPS0xLGE9MDtpZihudWxsPT1uKWZvcig7KytvPHI7KWlzTmFOKGU9dSh0W29dKSk/LS1pOmErPWU7ZWxzZSBmb3IoOysrbzxyOylpc05hTihlPXUobih0W29dLG8sdCkpKT8tLWk6YSs9ZTtpZihpKXJldHVybiBhL2l9LHQubWVkaWFuPWZ1bmN0aW9uKHQsZSl7dmFyIHIsaT10Lmxlbmd0aCxvPS0xLGE9W107aWYobnVsbD09ZSlmb3IoOysrbzxpOylpc05hTihyPXUodFtvXSkpfHxhLnB1c2gocik7ZWxzZSBmb3IoOysrbzxpOylpc05hTihyPXUoZSh0W29dLG8sdCkpKXx8YS5wdXNoKHIpO3JldHVybiBBKGEuc29ydChuKSwuNSl9LHQubWVyZ2U9Tix0Lm1pbj1TLHQucGFpcnM9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1hKTtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLTEsaT10WzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT1uKGksaT10WysrZV0pO3JldHVybiBvfSx0LnBlcm11dGU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbbltlXV07cmV0dXJuIHJ9LHQucXVhbnRpbGU9QSx0LnJhbmdlPWcsdC5zY2FuPWZ1bmN0aW9uKHQsZSl7aWYocj10Lmxlbmd0aCl7dmFyIHIsaSxvPTAsYT0wLHU9dFthXTtmb3IobnVsbD09ZSYmKGU9bik7KytvPHI7KShlKGk9dFtvXSx1KTwwfHwwIT09ZSh1LHUpKSYmKHU9aSxhPW8pO3JldHVybiAwPT09ZSh1LHUpP2E6dm9pZCAwfX0sdC5zaHVmZmxlPWZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPShudWxsPT1lP3QubGVuZ3RoOmUpLShuPW51bGw9PW4/MDorbik7bzspaT1NYXRoLnJhbmRvbSgpKm8tLXwwLHI9dFtvK25dLHRbbytuXT10W2krbl0sdFtpK25dPXI7cmV0dXJuIHR9LHQuc3VtPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10Lmxlbmd0aCxpPS0xLG89MDtpZihudWxsPT1uKWZvcig7KytpPHI7KShlPSt0W2ldKSYmKG8rPWUpO2Vsc2UgZm9yKDsrK2k8cjspKGU9K24odFtpXSxpLHQpKSYmKG8rPWUpO3JldHVybiBvfSx0LnRpY2tzPW0sdC50aWNrSW5jcmVtZW50PXgsdC50aWNrU3RlcD13LHQudHJhbnNwb3NlPUUsdC52YXJpYW5jZT1mLHQuemlwPWZ1bmN0aW9uKCl7cmV0dXJuIEUoYXJndW1lbnRzKX0sdC5heGlzVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBCKHosdCl9LHQuYXhpc1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBCKFIsdCl9LHQuYXhpc0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gQihMLHQpfSx0LmF4aXNMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBCKEQsdCl9LHQuYnJ1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gUmkod2kpfSx0LmJydXNoWD1mdW5jdGlvbigpe3JldHVybiBSaShtaSl9LHQuYnJ1c2hZPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKHhpKX0sdC5icnVzaFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgbj10Ll9fYnJ1c2g7cmV0dXJuIG4/bi5kaW0ub3V0cHV0KG4uc2VsZWN0aW9uKTpudWxsfSx0LmNob3JkPWZ1bmN0aW9uKCl7dmFyIHQ9MCxuPW51bGwsZT1udWxsLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBvLGEsdSxmLGMscyxsPWkubGVuZ3RoLGg9W10sZD1nKGwpLHA9W10sdj1bXSx5PXYuZ3JvdXBzPW5ldyBBcnJheShsKSxfPW5ldyBBcnJheShsKmwpO2ZvcihvPTAsYz0tMTsrK2M8bDspe2ZvcihhPTAscz0tMTsrK3M8bDspYSs9aVtjXVtzXTtoLnB1c2goYSkscC5wdXNoKGcobCkpLG8rPWF9Zm9yKG4mJmQuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuKGhbdF0saFtlXSl9KSxlJiZwLmZvckVhY2goZnVuY3Rpb24odCxuKXt0LnNvcnQoZnVuY3Rpb24odCxyKXtyZXR1cm4gZShpW25dW3RdLGlbbl1bcl0pfSl9KSxmPShvPVlpKDAsT2ktdCpsKS9vKT90Ok9pL2wsYT0wLGM9LTE7KytjPGw7KXtmb3IodT1hLHM9LTE7KytzPGw7KXt2YXIgYj1kW2NdLG09cFtiXVtzXSx4PWlbYl1bbV0sdz1hLE09YSs9eCpvO19bbSpsK2JdPXtpbmRleDpiLHN1YmluZGV4Om0sc3RhcnRBbmdsZTp3LGVuZEFuZ2xlOk0sdmFsdWU6eH19eVtiXT17aW5kZXg6YixzdGFydEFuZ2xlOnUsZW5kQW5nbGU6YSx2YWx1ZTpoW2JdfSxhKz1mfWZvcihjPS0xOysrYzxsOylmb3Iocz1jLTE7KytzPGw7KXt2YXIgQT1fW3MqbCtjXSxUPV9bYypsK3NdOyhBLnZhbHVlfHxULnZhbHVlKSYmdi5wdXNoKEEudmFsdWU8VC52YWx1ZT97c291cmNlOlQsdGFyZ2V0OkF9Ontzb3VyY2U6QSx0YXJnZXQ6VH0pfXJldHVybiByP3Yuc29ydChyKTp2fXJldHVybiBpLnBhZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVlpKDAsbiksaSk6dH0saS5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaSk6bn0saS5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsaSk6ZX0saS5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bnVsbDoobj10LHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0LnNvdXJjZS52YWx1ZSt0LnRhcmdldC52YWx1ZSxlLnNvdXJjZS52YWx1ZStlLnRhcmdldC52YWx1ZSl9KS5fPXQsaSk6ciYmci5fO3ZhciBufSxpfSx0LnJpYmJvbj1mdW5jdGlvbigpe3ZhciB0PVZpLG49JGksZT1XaSxyPVppLGk9UWksbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSx1PUJpLmNhbGwoYXJndW1lbnRzKSxmPXQuYXBwbHkodGhpcyx1KSxjPW4uYXBwbHkodGhpcyx1KSxzPStlLmFwcGx5KHRoaXMsKHVbMF09Zix1KSksbD1yLmFwcGx5KHRoaXMsdSktcWksaD1pLmFwcGx5KHRoaXMsdSktcWksZD1zKkxpKGwpLHA9cypEaShsKSx2PStlLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksZz1yLmFwcGx5KHRoaXMsdSktcWkseT1pLmFwcGx5KHRoaXMsdSktcWk7aWYob3x8KG89YT1HaSgpKSxvLm1vdmVUbyhkLHApLG8uYXJjKDAsMCxzLGwsaCksbD09PWcmJmg9PT15fHwoby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KkxpKGcpLHYqRGkoZykpLG8uYXJjKDAsMCx2LGcseSkpLG8ucXVhZHJhdGljQ3VydmVUbygwLDAsZCxwKSxvLmNsb3NlUGF0aCgpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTplfSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpGaSgrdCksYSk6cn0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTppfSxhLnNvdXJjZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGEpOnR9LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9LHQubmVzdD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPVtdLGk9W107ZnVuY3Rpb24gbyhlLGksYSx1KXtpZihpPj1yLmxlbmd0aClyZXR1cm4gbnVsbCE9dCYmZS5zb3J0KHQpLG51bGwhPW4/bihlKTplO2Zvcih2YXIgZixjLHMsbD0tMSxoPWUubGVuZ3RoLGQ9cltpKytdLHA9S2koKSx2PWEoKTsrK2w8aDspKHM9cC5nZXQoZj1kKGM9ZVtsXSkrIiIpKT9zLnB1c2goYyk6cC5zZXQoZixbY10pO3JldHVybiBwLmVhY2goZnVuY3Rpb24odCxuKXt1KHYsbixvKHQsaSxhLHUpKX0pLHZ9cmV0dXJuIGU9e29iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsdG8sbm8pfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLGVvLHJvKX0sZW50cmllczpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG8pe2lmKCsrbz5yLmxlbmd0aClyZXR1cm4gZTt2YXIgYSx1PWlbby0xXTtyZXR1cm4gbnVsbCE9biYmbz49ci5sZW5ndGg/YT1lLmVudHJpZXMoKTooYT1bXSxlLmVhY2goZnVuY3Rpb24obixlKXthLnB1c2goe2tleTplLHZhbHVlczp0KG4sbyl9KX0pKSxudWxsIT11P2Euc29ydChmdW5jdGlvbih0LG4pe3JldHVybiB1KHQua2V5LG4ua2V5KX0pOmF9KG8odCwwLGVvLHJvKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiByLnB1c2godCksZX0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGlbci5sZW5ndGgtMV09dCxlfSxzb3J0VmFsdWVzOmZ1bmN0aW9uKG4pe3JldHVybiB0PW4sZX0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBuPXQsZX19fSx0LnNldD1hbyx0Lm1hcD1LaSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKGUpO3JldHVybiBufSx0LnZhbHVlcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2godFtlXSk7cmV0dXJuIG59LHQuZW50cmllcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goe2tleTplLHZhbHVlOnRbZV19KTtyZXR1cm4gbn0sdC5jb2xvcj12bix0LnJnYj1ibix0LmhzbD1Nbix0LmxhYj1Vbix0LmhjbD1Ibix0LmxjaD1mdW5jdGlvbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SW4odCk6bmV3IGpuKGUsbix0LG51bGw9PXI/MTpyKX0sdC5ncmF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBxbih0LDAsMCxudWxsPT1uPzE6bil9LHQuY3ViZWhlbGl4PUtuLHQuY29udG91cnM9Z28sdC5jb250b3VyRGVuc2l0eT1mdW5jdGlvbigpe3ZhciB0PWJvLG49bW8sZT14byxyPTk2MCxpPTUwMCxvPTIwLGE9Mix1PTMqbyxmPXIrMip1Pj5hLGM9aSsyKnU+PmEscz1jbygyMCk7ZnVuY3Rpb24gbChyKXt2YXIgaT1uZXcgRmxvYXQzMkFycmF5KGYqYyksbD1uZXcgRmxvYXQzMkFycmF5KGYqYyk7ci5mb3JFYWNoKGZ1bmN0aW9uKHIsbyxzKXt2YXIgbD0rdChyLG8scykrdT4+YSxoPStuKHIsbyxzKSt1Pj5hLGQ9K2UocixvLHMpO2w+PTAmJmw8ZiYmaD49MCYmaDxjJiYoaVtsK2gqZl0rPWQpfSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSk7dmFyIGQ9cyhpKTtpZighQXJyYXkuaXNBcnJheShkKSl7dmFyIHA9VChpKTtkPXcoMCxwLGQpLChkPWcoMCxNYXRoLmZsb29yKHAvZCkqZCxkKSkuc2hpZnQoKX1yZXR1cm4gZ28oKS50aHJlc2hvbGRzKGQpLnNpemUoW2YsY10pKGkpLm1hcChoKX1mdW5jdGlvbiBoKHQpe3JldHVybiB0LnZhbHVlKj1NYXRoLnBvdygyLC0yKmEpLHQuY29vcmRpbmF0ZXMuZm9yRWFjaChkKSx0fWZ1bmN0aW9uIGQodCl7dC5mb3JFYWNoKHApfWZ1bmN0aW9uIHAodCl7dC5mb3JFYWNoKHYpfWZ1bmN0aW9uIHYodCl7dFswXT10WzBdKk1hdGgucG93KDIsYSktdSx0WzFdPXRbMV0qTWF0aC5wb3coMixhKS11fWZ1bmN0aW9uIHkoKXtyZXR1cm4gZj1yKzIqKHU9MypvKT4+YSxjPWkrMip1Pj5hLGx9cmV0dXJuIGwueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNvKCtuKSxsKTp0fSxsLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjbygrdCksbCk6bn0sbC53ZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjbygrdCksbCk6ZX0sbC5zaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltyLGldO3ZhciBuPU1hdGguY2VpbCh0WzBdKSxlPU1hdGguY2VpbCh0WzFdKTtpZighKG4+PTB8fG4+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHI9bixpPWUseSgpfSxsLmNlbGxTaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiAxPDxhO2lmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7cmV0dXJuIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikseSgpfSxsLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGwpOnN9LGwuYmFuZHdpZHRoPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNYXRoLnNxcnQobyoobysxKSk7aWYoISgodD0rdCk+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiYW5kd2lkdGgiKTtyZXR1cm4gbz1NYXRoLnJvdW5kKChNYXRoLnNxcnQoNCp0KnQrMSktMSkvMikseSgpfSxsfSx0LmRpc3BhdGNoPUksdC5kcmFnPWZ1bmN0aW9uKCl7dmFyIG4sZSxyLGksbz1XdCxhPVp0LHU9UXQsZj1KdCxjPXt9LHM9SSgic3RhcnQiLCJkcmFnIiwiZW5kIiksbD0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIoZikub24oInRvdWNoc3RhcnQuZHJhZyIseSkub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIixiKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHU9bSgibW91c2UiLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpLEZ0LHRoaXMsYXJndW1lbnRzKTt1JiYoRHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLHYsITApLm9uKCJtb3VzZXVwLmRyYWciLGcsITApLFh0KHQuZXZlbnQudmlldyksSHQoKSxyPSExLG49dC5ldmVudC5jbGllbnRYLGU9dC5ldmVudC5jbGllbnRZLHUoInN0YXJ0IikpfX1mdW5jdGlvbiB2KCl7aWYoanQoKSwhcil7dmFyIGk9dC5ldmVudC5jbGllbnRYLW4sbz10LmV2ZW50LmNsaWVudFktZTtyPWkqaStvKm8+aH1jLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gZygpe0R0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsbnVsbCksR3QodC5ldmVudC52aWV3LHIpLGp0KCksYy5tb3VzZSgiZW5kIil9ZnVuY3Rpb24geSgpe2lmKG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5sZW5ndGg7Zm9yKG49MDtuPHU7KytuKShlPW0ocltuXS5pZGVudGlmaWVyLGksSXQsdGhpcyxhcmd1bWVudHMpKSYmKEh0KCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihuPTA7bjxpOysrbikoZT1jW3Jbbl0uaWRlbnRpZmllcl0pJiYoanQoKSxlKCJkcmFnIikpfWZ1bmN0aW9uIGIoKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPXIubGVuZ3RoO2ZvcihpJiZjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aT1udWxsfSw1MDApLG49MDtuPG87KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihIdCgpLGUoImVuZCIpKX1mdW5jdGlvbiBtKG4sZSxyLGksbyl7dmFyIGEsZixoLHA9cihlLG4pLHY9cy5jb3B5KCk7aWYoQ3QobmV3ICR0KGQsImJlZm9yZXN0YXJ0IixhLG4sbCxwWzBdLHBbMV0sMCwwLHYpLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPSh0LmV2ZW50LnN1YmplY3Q9YT11LmFwcGx5KGksbykpJiYoZj1hLngtcFswXXx8MCxoPWEueS1wWzFdfHwwLCEwKX0pKXJldHVybiBmdW5jdGlvbiB0KHUpe3ZhciBzLGc9cDtzd2l0Y2godSl7Y2FzZSJzdGFydCI6Y1tuXT10LHM9bCsrO2JyZWFrO2Nhc2UiZW5kIjpkZWxldGUgY1tuXSwtLWw7Y2FzZSJkcmFnIjpwPXIoZSxuKSxzPWx9Q3QobmV3ICR0KGQsdSxhLG4scyxwWzBdK2YscFsxXStoLHBbMF0tZ1swXSxwWzFdLWdbMV0sdiksdi5hcHBseSx2LFt1LGksb10pfX1yZXR1cm4gZC5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCghIXQpLGQpOm99LGQuY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VnQodCksZCk6YX0sZC5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VnQodCksZCk6dX0sZC50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCghIXQpLGQpOmZ9LGQub249ZnVuY3Rpb24oKXt2YXIgdD1zLm9uLmFwcGx5KHMsYXJndW1lbnRzKTtyZXR1cm4gdD09PXM/ZDp0fSxkLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9KHQ9K3QpKnQsZCk6TWF0aC5zcXJ0KGgpfSxkfSx0LmRyYWdEaXNhYmxlPVh0LHQuZHJhZ0VuYWJsZT1HdCx0LmRzdkZvcm1hdD1Fbyx0LmNzdlBhcnNlPUNvLHQuY3N2UGFyc2VSb3dzPVBvLHQuY3N2Rm9ybWF0PXpvLHQuY3N2Rm9ybWF0Um93cz1Sbyx0LnRzdlBhcnNlPURvLHQudHN2UGFyc2VSb3dzPVVvLHQudHN2Rm9ybWF0PXFvLHQudHN2Rm9ybWF0Um93cz1Pbyx0LmVhc2VMaW5lYXI9ZnVuY3Rpb24odCl7cmV0dXJuK3R9LHQuZWFzZVF1YWQ9RHIsdC5lYXNlUXVhZEluPWZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHQuZWFzZVF1YWRPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHQuZWFzZVF1YWRJbk91dD1Ecix0LmVhc2VDdWJpYz1Vcix0LmVhc2VDdWJpY0luPWZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sdC5lYXNlQ3ViaWNPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSx0LmVhc2VDdWJpY0luT3V0PVVyLHQuZWFzZVBvbHk9WXIsdC5lYXNlUG9seUluPXFyLHQuZWFzZVBvbHlPdXQ9T3IsdC5lYXNlUG9seUluT3V0PVlyLHQuZWFzZVNpbj1Jcix0LmVhc2VTaW5Jbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KkZyKX0sdC5lYXNlU2luT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KkZyKX0sdC5lYXNlU2luSW5PdXQ9SXIsdC5lYXNlRXhwPUhyLHQuZWFzZUV4cEluPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfSx0LmVhc2VFeHBPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9LHQuZWFzZUV4cEluT3V0PUhyLHQuZWFzZUNpcmNsZT1qcix0LmVhc2VDaXJjbGVJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfSx0LmVhc2VDaXJjbGVPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LHQuZWFzZUNpcmNsZUluT3V0PWpyLHQuZWFzZUJvdW5jZT1uaSx0LmVhc2VCb3VuY2VJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1uaSgxLXQpfSx0LmVhc2VCb3VuY2VPdXQ9bmksdC5lYXNlQm91bmNlSW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLW5pKDEtdCk6bmkodC0xKSsxKS8yfSx0LmVhc2VCYWNrPWlpLHQuZWFzZUJhY2tJbj1laSx0LmVhc2VCYWNrT3V0PXJpLHQuZWFzZUJhY2tJbk91dD1paSx0LmVhc2VFbGFzdGljPXVpLHQuZWFzZUVsYXN0aWNJbj1haSx0LmVhc2VFbGFzdGljT3V0PXVpLHQuZWFzZUVsYXN0aWNJbk91dD1maSx0LmJsb2I9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKFlvKX0sdC5idWZmZXI9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEJvKX0sdC5kc3Y9ZnVuY3Rpb24odCxuLGUscil7Mz09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9dm9pZCAwKTt2YXIgaT1Fbyh0KTtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBpLnBhcnNlKHQscil9KX0sdC5jc3Y9am8sdC50c3Y9WG8sdC5pbWFnZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHIpe3ZhciBpPW5ldyBJbWFnZTtmb3IodmFyIG8gaW4gbilpW29dPW5bb107aS5vbmVycm9yPXIsaS5vbmxvYWQ9ZnVuY3Rpb24oKXtlKGkpfSxpLnNyYz10fSl9LHQuanNvbj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oR28pfSx0LnRleHQ9SW8sdC54bWw9JG8sdC5odG1sPVdvLHQuc3ZnPVpvLHQuZm9yY2VDZW50ZXI9ZnVuY3Rpb24odCxuKXt2YXIgZTtmdW5jdGlvbiByKCl7dmFyIHIsaSxvPWUubGVuZ3RoLGE9MCx1PTA7Zm9yKHI9MDtyPG87KytyKWErPShpPWVbcl0pLngsdSs9aS55O2ZvcihhPWEvby10LHU9dS9vLW4scj0wO3I8bzsrK3IpKGk9ZVtyXSkueC09YSxpLnktPXV9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PW4mJihuPTApLHIuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXR9LHIueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixyKTp0fSxyLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscik6bn0scn0sdC5mb3JjZUNvbGxpZGU9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPTEsaT0xO2Z1bmN0aW9uIG8oKXtmb3IodmFyIHQsbyx1LGYsYyxzLGwsaD1uLmxlbmd0aCxkPTA7ZDxpOysrZClmb3Iobz1yYShuLHVhLGZhKS52aXNpdEFmdGVyKGEpLHQ9MDt0PGg7Kyt0KXU9blt0XSxzPWVbdS5pbmRleF0sbD1zKnMsZj11LngrdS52eCxjPXUueSt1LnZ5LG8udmlzaXQocCk7ZnVuY3Rpb24gcCh0LG4sZSxpLG8pe3ZhciBhPXQuZGF0YSxoPXQucixkPXMraDtpZighYSlyZXR1cm4gbj5mK2R8fGk8Zi1kfHxlPmMrZHx8bzxjLWQ7aWYoYS5pbmRleD51LmluZGV4KXt2YXIgcD1mLWEueC1hLnZ4LHY9Yy1hLnktYS52eSxnPXAqcCt2KnY7ZzxkKmQmJigwPT09cCYmKGcrPShwPUpvKCkpKnApLDA9PT12JiYoZys9KHY9Sm8oKSkqdiksZz0oZC0oZz1NYXRoLnNxcnQoZykpKS9nKnIsdS52eCs9KHAqPWcpKihkPShoKj1oKS8obCtoKSksdS52eSs9KHYqPWcpKmQsYS52eC09cCooZD0xLWQpLGEudnktPXYqZCl9fX1mdW5jdGlvbiBhKHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPWVbdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gdSgpe2lmKG4pe3ZhciByLGksbz1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobykscj0wO3I8bzsrK3IpaT1uW3JdLGVbaS5pbmRleF09K3QoaSxyLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8obnVsbD09dD8xOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCx1KCl9LG8uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxvKTppfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8ucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLHUoKSxvKTp0fSxvfSx0LmZvcmNlTGluaz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGE9Y2EsdT1mdW5jdGlvbih0KXtyZXR1cm4gMS9NYXRoLm1pbihpW3Quc291cmNlLmluZGV4XSxpW3QudGFyZ2V0LmluZGV4XSl9LGY9UW8oMzApLGM9MTtmdW5jdGlvbiBzKHIpe2Zvcih2YXIgaT0wLGE9dC5sZW5ndGg7aTxjOysraSlmb3IodmFyIHUsZixzLGwsaCxkLHAsdj0wO3Y8YTsrK3YpZj0odT10W3ZdKS5zb3VyY2UsbD0ocz11LnRhcmdldCkueCtzLnZ4LWYueC1mLnZ4fHxKbygpLGg9cy55K3MudnktZi55LWYudnl8fEpvKCksbCo9ZD0oKGQ9TWF0aC5zcXJ0KGwqbCtoKmgpKS1lW3ZdKS9kKnIqblt2XSxoKj1kLHMudngtPWwqKHA9b1t2XSkscy52eS09aCpwLGYudngrPWwqKHA9MS1wKSxmLnZ5Kz1oKnB9ZnVuY3Rpb24gbCgpe2lmKHIpe3ZhciB1LGYsYz1yLmxlbmd0aCxzPXQubGVuZ3RoLGw9S2kocixhKTtmb3IodT0wLGk9bmV3IEFycmF5KGMpO3U8czsrK3UpKGY9dFt1XSkuaW5kZXg9dSwib2JqZWN0IiE9dHlwZW9mIGYuc291cmNlJiYoZi5zb3VyY2U9c2EobCxmLnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgZi50YXJnZXQmJihmLnRhcmdldD1zYShsLGYudGFyZ2V0KSksaVtmLnNvdXJjZS5pbmRleF09KGlbZi5zb3VyY2UuaW5kZXhdfHwwKSsxLGlbZi50YXJnZXQuaW5kZXhdPShpW2YudGFyZ2V0LmluZGV4XXx8MCkrMTtmb3IodT0wLG89bmV3IEFycmF5KHMpO3U8czsrK3UpZj10W3VdLG9bdV09aVtmLnNvdXJjZS5pbmRleF0vKGlbZi5zb3VyY2UuaW5kZXhdK2lbZi50YXJnZXQuaW5kZXhdKTtuPW5ldyBBcnJheShzKSxoKCksZT1uZXcgQXJyYXkocyksZCgpfX1mdW5jdGlvbiBoKCl7aWYocilmb3IodmFyIGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpbltlXT0rdSh0W2VdLGUsdCl9ZnVuY3Rpb24gZCgpe2lmKHIpZm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7KytuKWVbbl09K2YodFtuXSxuLHQpfXJldHVybiBudWxsPT10JiYodD1bXSkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxsKCl9LHMubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixsKCkscyk6dH0scy5pZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LHMpOmF9LHMuaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxzKTpjfSxzLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGgoKSxzKTp1fSxzLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGQoKSxzKTpmfSxzfSx0LmZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpPVFvKC0zMCksbz0xLGE9MS8wLHU9LjgxO2Z1bmN0aW9uIGYocil7dmFyIGksbz10Lmxlbmd0aCxhPXJhKHQsbGEsaGEpLnZpc2l0QWZ0ZXIocyk7Zm9yKGU9cixpPTA7aTxvOysraSluPXRbaV0sYS52aXNpdChsKX1mdW5jdGlvbiBjKCl7aWYodCl7dmFyIG4sZSxvPXQubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShvKSxuPTA7bjxvOysrbillPXRbbl0scltlLmluZGV4XT0raShlLG4sdCl9fWZ1bmN0aW9uIHModCl7dmFyIG4sZSxpLG8sYSx1PTAsZj0wO2lmKHQubGVuZ3RoKXtmb3IoaT1vPWE9MDthPDQ7KythKShuPXRbYV0pJiYoZT1NYXRoLmFicyhuLnZhbHVlKSkmJih1Kz1uLnZhbHVlLGYrPWUsaSs9ZSpuLngsbys9ZSpuLnkpO3QueD1pL2YsdC55PW8vZn1lbHNleyhuPXQpLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPXJbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIGwodCxpLGYsYyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIHM9dC54LW4ueCxsPXQueS1uLnksaD1jLWksZD1zKnMrbCpsO2lmKGgqaC91PGQpcmV0dXJuIGQ8YSYmKDA9PT1zJiYoZCs9KHM9Sm8oKSkqcyksMD09PWwmJihkKz0obD1KbygpKSpsKSxkPG8mJihkPU1hdGguc3FydChvKmQpKSxuLnZ4Kz1zKnQudmFsdWUqZS9kLG4udnkrPWwqdC52YWx1ZSplL2QpLCEwO2lmKCEodC5sZW5ndGh8fGQ+PWEpKXsodC5kYXRhIT09bnx8dC5uZXh0KSYmKDA9PT1zJiYoZCs9KHM9Sm8oKSkqcyksMD09PWwmJihkKz0obD1KbygpKSpsKSxkPG8mJihkPU1hdGguc3FydChvKmQpKSk7ZG97dC5kYXRhIT09biYmKGg9clt0LmRhdGEuaW5kZXhdKmUvZCxuLnZ4Kz1zKmgsbi52eSs9bCpoKX13aGlsZSh0PXQubmV4dCl9fXJldHVybiBmLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGMoKX0sZi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxjKCksZik6aX0sZi5kaXN0YW5jZU1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10KnQsZik6TWF0aC5zcXJ0KG8pfSxmLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQqdCxmKTpNYXRoLnNxcnQoYSl9LGYudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCp0LGYpOk1hdGguc3FydCh1KX0sZn0sdC5mb3JjZVJhZGlhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGE9UW8oLjEpO2Z1bmN0aW9uIHUodCl7Zm9yKHZhciBhPTAsdT1yLmxlbmd0aDthPHU7KythKXt2YXIgZj1yW2FdLGM9Zi54LW58fDFlLTYscz1mLnktZXx8MWUtNixsPU1hdGguc3FydChjKmMrcypzKSxoPShvW2FdLWwpKmlbYV0qdC9sO2YudngrPWMqaCxmLnZ5Kz1zKmh9fWZ1bmN0aW9uIGYoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilvW25dPSt0KHJbbl0sbixyKSxpW25dPWlzTmFOKG9bbl0pPzA6K2EocltuXSxuLHIpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8oK3QpKSxudWxsPT1uJiYobj0wKSxudWxsPT1lJiYoZT0wKSx1LmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGYoKX0sdS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxmKCksdSk6YX0sdS5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksZigpLHUpOnR9LHUueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCx1KTpufSx1Lnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsdSk6ZX0sdX0sdC5mb3JjZVNpbXVsYXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZT0xLHI9LjAwMSxpPTEtTWF0aC5wb3cociwxLzMwMCksbz0wLGE9LjYsdT1LaSgpLGY9dXIocyksYz1JKCJ0aWNrIiwiZW5kIik7ZnVuY3Rpb24gcygpe2woKSxjLmNhbGwoInRpY2siLG4pLGU8ciYmKGYuc3RvcCgpLGMuY2FsbCgiZW5kIixuKSl9ZnVuY3Rpb24gbCgpe3ZhciBuLHIsZj10Lmxlbmd0aDtmb3IoZSs9KG8tZSkqaSx1LmVhY2goZnVuY3Rpb24odCl7dChlKX0pLG49MDtuPGY7KytuKW51bGw9PShyPXRbbl0pLmZ4P3IueCs9ci52eCo9YTooci54PXIuZngsci52eD0wKSxudWxsPT1yLmZ5P3IueSs9ci52eSo9YTooci55PXIuZnksci52eT0wKX1mdW5jdGlvbiBoKCl7Zm9yKHZhciBuLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2Upe2lmKChuPXRbZV0pLmluZGV4PWUsaXNOYU4obi54KXx8aXNOYU4obi55KSl7dmFyIGk9ZGEqTWF0aC5zcXJ0KGUpLG89ZSpwYTtuLng9aSpNYXRoLmNvcyhvKSxuLnk9aSpNYXRoLnNpbihvKX0oaXNOYU4obi52eCl8fGlzTmFOKG4udnkpKSYmKG4udng9bi52eT0wKX19ZnVuY3Rpb24gZChuKXtyZXR1cm4gbi5pbml0aWFsaXplJiZuLmluaXRpYWxpemUodCksbn1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGgoKSxuPXt0aWNrOmwscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBmLnJlc3RhcnQocyksbn0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBmLnN0b3AoKSxufSxub2RlczpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGgoKSx1LmVhY2goZCksbik6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qsbik6ZX0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbik6cn0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKToraX0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsbik6MS1hfSxmb3JjZTpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PWU/dS5yZW1vdmUodCk6dS5zZXQodCxkKGUpKSxuKTp1LmdldCh0KX0sZmluZDpmdW5jdGlvbihuLGUscil7dmFyIGksbyxhLHUsZixjPTAscz10Lmxlbmd0aDtmb3IobnVsbD09cj9yPTEvMDpyKj1yLGM9MDtjPHM7KytjKShhPShpPW4tKHU9dFtjXSkueCkqaSsobz1lLXUueSkqbyk8ciYmKGY9dSxyPWEpO3JldHVybiBmfSxvbjpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxlKSxuKTpjLm9uKHQpfX19LHQuZm9yY2VYPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ4Kz0ocltvXS1pLngpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcmNlWT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaT1RbyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGksbz0wLGE9bi5sZW5ndGg7bzxhOysrbykoaT1uW29dKS52eSs9KHJbb10taS55KSplW29dKnR9ZnVuY3Rpb24gYSgpe2lmKG4pe3ZhciBvLGE9bi5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KGEpLHI9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKWVbb109aXNOYU4ocltvXT0rdChuW29dLG8sbikpPzA6K2kobltvXSxvLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8obnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksYSgpLG8pOml9LG8ueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxhKCksbyk6dH0sb30sdC5mb3JtYXREZWZhdWx0TG9jYWxlPVNhLHQuZm9ybWF0TG9jYWxlPU5hLHQuZm9ybWF0U3BlY2lmaWVyPWJhLHQucHJlY2lzaW9uRml4ZWQ9RWEsdC5wcmVjaXNpb25QcmVmaXg9a2EsdC5wcmVjaXNpb25Sb3VuZD1DYSx0Lmdlb0FyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHl1LnJlc2V0KCksc3UodCxfdSksMip5dX0sdC5nZW9Cb3VuZHM9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU7aWYoUnU9enU9LShDdT1QdT0xLzApLE91PVtdLHN1KHQscmYpLGU9T3UubGVuZ3RoKXtmb3IoT3Uuc29ydChkZiksbj0xLG89W3I9T3VbMF1dO248ZTsrK24pcGYociwoaT1PdVtuXSlbMF0pfHxwZihyLGlbMV0pPyhoZihyWzBdLGlbMV0pPmhmKHJbMF0sclsxXSkmJihyWzFdPWlbMV0pLGhmKGlbMF0sclsxXSk+aGYoclswXSxyWzFdKSYmKHJbMF09aVswXSkpOm8ucHVzaChyPWkpO2ZvcihhPS0xLzAsbj0wLHI9b1tlPW8ubGVuZ3RoLTFdO248PWU7cj1pLCsrbilpPW9bbl0sKHU9aGYoclsxXSxpWzBdKSk+YSYmKGE9dSxDdT1pWzBdLHp1PXJbMV0pfXJldHVybiBPdT1ZdT1udWxsLEN1PT09MS8wfHxQdT09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tDdSxQdV0sW3p1LFJ1XV19LHQuZ2VvQ2VudHJvaWQ9ZnVuY3Rpb24odCl7QnU9RnU9SXU9SHU9anU9WHU9R3U9VnU9JHU9V3U9WnU9MCxzdSh0LHZmKTt2YXIgbj0kdSxlPVd1LHI9WnUsaT1uKm4rZSplK3IqcjtyZXR1cm4gaTxVYSYmKG49WHUsZT1HdSxyPVZ1LEZ1PERhJiYobj1JdSxlPUh1LHI9anUpLChpPW4qbitlKmUrcipyKTxVYSk/W05hTixOYU5dOltYYShlLG4pKkZhLGV1KHIvS2EoaSkpKkZhXX0sdC5nZW9DaXJjbGU9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9TmYoWzAsMF0pLHI9TmYoOTApLGk9TmYoNiksbz17cG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goZT1uKGUscikpLGVbMF0qPUZhLGVbMV0qPUZhfX07ZnVuY3Rpb24gYSgpe3ZhciBhPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqSWEsZj1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYTtyZXR1cm4gdD1bXSxuPWtmKC1hWzBdKklhLC1hWzFdKklhLDApLmludmVydCxMZihvLHUsZiwxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9bj1udWxsLGF9cmV0dXJuIGEuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmYoWyt0WzBdLCt0WzFdXSksYSk6ZX0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZigrdCksYSk6cn0sYS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZigrdCksYSk6aX0sYX0sdC5nZW9DbGlwQW50aW1lcmlkaWFuPUdmLHQuZ2VvQ2xpcENpcmNsZT1WZix0Lmdlb0NsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCxhPTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9WmYocixpLG8sYSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt1WzBdWzBdLGk9K3VbMF1bMV0sbz0rdVsxXVswXSxhPSt1WzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyxhXV19fX0sdC5nZW9DbGlwUmVjdGFuZ2xlPVpmLHQuZ2VvQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmY2MuaGFzT3duUHJvcGVydHkodC50eXBlKT9jY1t0LnR5cGVdOmxjKSh0LG4pfSx0Lmdlb0Rpc3RhbmNlPWZjLHQuZ2VvR3JhdGljdWxlPWJjLHQuZ2VvR3JhdGljdWxlMTA9ZnVuY3Rpb24oKXtyZXR1cm4gYmMoKSgpfSx0Lmdlb0ludGVycG9sYXRlPWZ1bmN0aW9uKHQsbil7dmFyIGU9dFswXSpJYSxyPXRbMV0qSWEsaT1uWzBdKklhLG89blsxXSpJYSxhPUdhKHIpLHU9UWEociksZj1HYShvKSxjPVFhKG8pLHM9YSpHYShlKSxsPWEqUWEoZSksaD1mKkdhKGkpLGQ9ZipRYShpKSxwPTIqZXUoS2EocnUoby1yKSthKmYqcnUoaS1lKSkpLHY9UWEocCksZz1wP2Z1bmN0aW9uKHQpe3ZhciBuPVFhKHQqPXApL3YsZT1RYShwLXQpL3Yscj1lKnMrbipoLGk9ZSpsK24qZCxvPWUqdStuKmM7cmV0dXJuW1hhKGkscikqRmEsWGEobyxLYShyKnIraSppKSkqRmFdfTpmdW5jdGlvbigpe3JldHVybltlKkZhLHIqRmFdfTtyZXR1cm4gZy5kaXN0YW5jZT1wLGd9LHQuZ2VvTGVuZ3RoPW9jLHQuZ2VvUGF0aD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT00LjU7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKCtpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksc3UodCxlKHIpKSksci5yZXN1bHQoKX1yZXR1cm4gby5hcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoU2MpKSxTYy5yZXN1bHQoKX0sby5tZWFzdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoZHMpKSxkcy5yZXN1bHQoKX0sby5ib3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShVYykpLFVjLnJlc3VsdCgpfSxvLmNlbnRyb2lkPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoWmMpKSxaYy5yZXN1bHQoKX0sby5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PW4/KHQ9bnVsbCxtYyk6KHQ9bikuc3RyZWFtLG8pOnR9LG8uY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10PyhuPW51bGwsbmV3IGdzKTpuZXcgYXMobj10KSwiZnVuY3Rpb24iIT10eXBlb2YgaSYmci5wb2ludFJhZGl1cyhpKSxvKTpufSxvLnBvaW50UmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KHIucG9pbnRSYWRpdXMoK3QpLCt0KSxvKTppfSxvLnByb2plY3Rpb24odCkuY29udGV4dChuKX0sdC5nZW9BbGJlcnM9RHMsdC5nZW9BbGJlcnNVc2E9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT1EcygpLHU9THMoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGY9THMoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXtvPVt0LG5dfX07ZnVuY3Rpb24gcyh0KXt2YXIgbj10WzBdLGE9dFsxXTtyZXR1cm4gbz1udWxsLGUucG9pbnQobixhKSxvfHwoci5wb2ludChuLGEpLG8pfHwoaS5wb2ludChuLGEpLG8pfWZ1bmN0aW9uIGwoKXtyZXR1cm4gdD1uPW51bGwsc31yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIG49YS5zY2FsZSgpLGU9YS50cmFuc2xhdGUoKSxyPSh0WzBdLWVbMF0pL24saT0odFsxXS1lWzFdKS9uO3JldHVybihpPj0uMTImJmk8LjIzNCYmcj49LS40MjUmJnI8LS4yMTQ/dTppPj0uMTY2JiZpPC4yMzQmJnI+PS0uMjE0JiZyPC0uMTE1P2Y6YSkuaW52ZXJ0KHQpfSxzLnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdCYmbj09PWU/dDoocj1bYS5zdHJlYW0obj1lKSx1LnN0cmVhbShlKSxmLnN0cmVhbShlKV0saT1yLmxlbmd0aCx0PXtwb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT0tMTsrK2U8aTspcltlXS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9LTE7Kyt0PGk7KXJbdF0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5wb2x5Z29uRW5kKCl9fSk7dmFyIHIsaX0scy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKHQpLHUucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLGwoKSk6YS5wcmVjaXNpb24oKX0scy5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5zY2FsZSh0KSx1LnNjYWxlKC4zNSp0KSxmLnNjYWxlKHQpLHMudHJhbnNsYXRlKGEudHJhbnNsYXRlKCkpKTphLnNjYWxlKCl9LHMudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhLnRyYW5zbGF0ZSgpO3ZhciBuPWEuc2NhbGUoKSxvPSt0WzBdLHM9K3RbMV07cmV0dXJuIGU9YS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW28tLjQ1NSpuLHMtLjIzOCpuXSxbbysuNDU1Km4scysuMjM4Km5dXSkuc3RyZWFtKGMpLHI9dS50cmFuc2xhdGUoW28tLjMwNypuLHMrLjIwMSpuXSkuY2xpcEV4dGVudChbW28tLjQyNSpuK0RhLHMrLjEyKm4rRGFdLFtvLS4yMTQqbi1EYSxzKy4yMzQqbi1EYV1dKS5zdHJlYW0oYyksaT1mLnRyYW5zbGF0ZShbby0uMjA1Km4scysuMjEyKm5dKS5jbGlwRXh0ZW50KFtbby0uMjE0Km4rRGEscysuMTY2Km4rRGFdLFtvLS4xMTUqbi1EYSxzKy4yMzQqbi1EYV1dKS5zdHJlYW0oYyksbCgpfSxzLmZpdEV4dGVudD1mdW5jdGlvbih0LG4pe3JldHVybiB4cyhzLHQsbil9LHMuZml0U2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiB3cyhzLHQsbil9LHMuZml0V2lkdGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMocyx0LG4pfSxzLmZpdEhlaWdodD1mdW5jdGlvbih0LG4pe3JldHVybiBBcyhzLHQsbil9LHMuc2NhbGUoMTA3MCl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIENzKE9zKS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWFSYXc9T3MsdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBDcyhZcykuc2NhbGUoNzkuNDE4OCkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3PVlzLHQuZ2VvQ29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4genMoSHMpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9SHMsdC5nZW9Db25pY0VxdWFsQXJlYT1Mcyx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PVJzLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiB6cyhYcykuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PVhzLHQuZ2VvRXF1YWxFYXJ0aD1mdW5jdGlvbigpe3JldHVybiBDcyhRcykuc2NhbGUoMTc3LjE1OCl9LHQuZ2VvRXF1YWxFYXJ0aFJhdz1Rcyx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiBDcyhqcykuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9anMsdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBDcyhKcykuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz1Kcyx0Lmdlb0lkZW50aXR5PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHIsaSxvLGE9MSx1PTAsZj0wLGM9MSxzPTEsbD1tYyxoPW51bGwsZD1tYztmdW5jdGlvbiBwKCl7cmV0dXJuIHI9aT1udWxsLG99cmV0dXJuIG89e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gciYmaT09PXQ/cjpyPWwoZChpPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9cixoPXQ9bj1lPW51bGwscCgpKTpkfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PXI/KGg9dD1uPWU9bnVsbCxtYyk6WmYoaD0rclswXVswXSx0PStyWzBdWzFdLG49K3JbMV1bMF0sZT0rclsxXVsxXSkscCgpKTpudWxsPT1oP251bGw6W1toLHRdLFtuLGVdXX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoKGE9K3QpKmMsYSpzLHUsZikscCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSpjLGEqcyx1PSt0WzBdLGY9K3RbMV0pLHAoKSk6W3UsZl19LHJlZmxlY3RYOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUtzKGEqKGM9dD8tMToxKSxhKnMsdSxmKSxwKCkpOmM8MH0scmVmbGVjdFk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSpjLGEqKHM9dD8tMToxKSx1LGYpLHAoKSk6czwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4geHMobyx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKG8sdCxuKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMobyx0LG4pfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gQXMobyx0LG4pfX19LHQuZ2VvUHJvamVjdGlvbj1Dcyx0Lmdlb1Byb2plY3Rpb25NdXRhdG9yPVBzLHQuZ2VvTWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gRnMoQnMpLnNjYWxlKDk2MS9CYSl9LHQuZ2VvTWVyY2F0b3JSYXc9QnMsdC5nZW9OYXR1cmFsRWFydGgxPWZ1bmN0aW9uKCl7cmV0dXJuIENzKHRsKS5zY2FsZSgxNzUuMjk1KX0sdC5nZW9OYXR1cmFsRWFydGgxUmF3PXRsLHQuZ2VvT3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKG5sKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK0RhKX0sdC5nZW9PcnRob2dyYXBoaWNSYXc9bmwsdC5nZW9TdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGVsKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9ZWwsdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1GcyhybCksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6Wyh0PW4oKSlbMV0sLXRbMF1dfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6Wyh0PWUoKSlbMF0sdFsxXSx0WzJdLTkwXX0sZShbMCwwLDkwXSkuc2NhbGUoMTU5LjE1NSl9LHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3PXJsLHQuZ2VvUm90YXRpb249UmYsdC5nZW9TdHJlYW09c3UsdC5nZW9UcmFuc2Zvcm09ZnVuY3Rpb24odCl7cmV0dXJue3N0cmVhbTpfcyh0KX19LHQuY2x1c3Rlcj1mdW5jdGlvbigpe3ZhciB0PWlsLG49MSxlPTEscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvLGE9MDtpLmVhY2hBZnRlcihmdW5jdGlvbihuKXt2YXIgZT1uLmNoaWxkcmVuO2U/KG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZWR1Y2Uob2wsMCkvdC5sZW5ndGh9KGUpLG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gMSt0LnJlZHVjZShhbCwwKX0oZSkpOihuLng9bz9hKz10KG4sbyk6MCxuLnk9MCxvPW4pfSk7dmFyIHU9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uWzBdO3JldHVybiB0fShpKSxmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9bltuLmxlbmd0aC0xXTtyZXR1cm4gdH0oaSksYz11LngtdCh1LGYpLzIscz1mLngrdChmLHUpLzI7cmV0dXJuIGkuZWFjaEFmdGVyKHI/ZnVuY3Rpb24odCl7dC54PSh0LngtaS54KSpuLHQueT0oaS55LXQueSkqZX06ZnVuY3Rpb24odCl7dC54PSh0LngtYykvKHMtYykqbix0Lnk9KDEtKGkueT90LnkvaS55OjEpKSplfSl9cmV0dXJuIGkuc2VwYXJhdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkpOnR9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMSxuPSt0WzBdLGU9K3RbMV0saSk6cj9udWxsOltuLGVdfSxpLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEwLG49K3RbMF0sZT0rdFsxXSxpKTpyP1tuLGVdOm51bGx9LGl9LHQuaGllcmFyY2h5PWZsLHQucGFjaz1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj0xLGU9MSxyPUVsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIGkueD1uLzIsaS55PWUvMix0P2kuZWFjaEJlZm9yZShQbCh0KSkuZWFjaEFmdGVyKHpsKHIsLjUpKS5lYWNoQmVmb3JlKFJsKDEpKTppLmVhY2hCZWZvcmUoUGwoQ2wpKS5lYWNoQWZ0ZXIoemwoRWwsMSkpLmVhY2hBZnRlcih6bChyLGkuci9NYXRoLm1pbihuLGUpKSkuZWFjaEJlZm9yZShSbChNYXRoLm1pbihuLGUpLygyKmkucikpKSxpfXJldHVybiBpLnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT0oZT1uKT9udWxsOlNsKGUpLGkpOnQ7dmFyIGV9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGkpOltuLGVdfSxpLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCksaSk6cn0saX0sdC5wYWNrU2libGluZ3M9ZnVuY3Rpb24odCl7cmV0dXJuIE5sKHQpLHR9LHQucGFja0VuY2xvc2U9cGwsdC5wYXJ0aXRpb249ZnVuY3Rpb24oKXt2YXIgdD0xLG49MSxlPTAscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvPWkuaGVpZ2h0KzE7cmV0dXJuIGkueDA9aS55MD1lLGkueDE9dCxpLnkxPW4vbyxpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7ci5jaGlsZHJlbiYmRGwocixyLngwLHQqKHIuZGVwdGgrMSkvbixyLngxLHQqKHIuZGVwdGgrMikvbik7dmFyIGk9ci54MCxvPXIueTAsYT1yLngxLWUsdT1yLnkxLWU7YTxpJiYoaT1hPShpK2EpLzIpLHU8byYmKG89dT0obyt1KS8yKSxyLngwPWksci55MD1vLHIueDE9YSxyLnkxPXV9fShuLG8pKSxyJiZpLmVhY2hCZWZvcmUoTGwpLGl9cmV0dXJuIGkucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGkpOnJ9LGkuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZVswXSxuPStlWzFdLGkpOlt0LG5dfSxpLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saX0sdC5zdHJhdGlmeT1mdW5jdGlvbigpe3ZhciB0PVlsLG49Qmw7ZnVuY3Rpb24gZShlKXt2YXIgcixpLG8sYSx1LGYsYyxzPWUubGVuZ3RoLGw9bmV3IEFycmF5KHMpLGg9e307Zm9yKGk9MDtpPHM7KytpKXI9ZVtpXSx1PWxbaV09bmV3IGhsKHIpLG51bGwhPShmPXQocixpLGUpKSYmKGYrPSIiKSYmKGhbYz1VbCsodS5pZD1mKV09YyBpbiBoP09sOnUpO2ZvcihpPTA7aTxzOysraSlpZih1PWxbaV0sbnVsbCE9KGY9bihlW2ldLGksZSkpJiYoZis9IiIpKXtpZighKGE9aFtVbCtmXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2YpO2lmKGE9PT1PbCl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitmKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaCh1KTphLmNoaWxkcmVuPVt1XSx1LnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz11fWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PXFsLG8uZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS1zfSkuZWFjaEJlZm9yZShsbCksby5wYXJlbnQ9bnVsbCxzPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiBvfXJldHVybiBlLmlkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLGUpOnR9LGUucGFyZW50SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U2wodCksZSk6bn0sZX0sdC50cmVlPWZ1bmN0aW9uKCl7dmFyIHQ9Rmwsbj0xLGU9MSxyPW51bGw7ZnVuY3Rpb24gaShpKXt2YXIgZj1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGksbyxhPW5ldyBHbCh0LDApLHU9W2FdO249dS5wb3AoKTspaWYocj1uLl8uY2hpbGRyZW4pZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KG89ci5sZW5ndGgpLGk9by0xO2k+PTA7LS1pKXUucHVzaChlPW4uY2hpbGRyZW5baV09bmV3IEdsKHJbaV0saSkpLGUucGFyZW50PW47cmV0dXJuKGEucGFyZW50PW5ldyBHbChudWxsLDApKS5jaGlsZHJlbj1bYV0sYX0oaSk7aWYoZi5lYWNoQWZ0ZXIobyksZi5wYXJlbnQubT0tZi56LGYuZWFjaEJlZm9yZShhKSxyKWkuZWFjaEJlZm9yZSh1KTtlbHNle3ZhciBjPWkscz1pLGw9aTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PGMueCYmKGM9dCksdC54PnMueCYmKHM9dCksdC5kZXB0aD5sLmRlcHRoJiYobD10KX0pO3ZhciBoPWM9PT1zPzE6dChjLHMpLzIsZD1oLWMueCxwPW4vKHMueCtoK2QpLHY9ZS8obC5kZXB0aHx8MSk7aS5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QueD0odC54K2QpKnAsdC55PXQuZGVwdGgqdn0pfXJldHVybiBpfWZ1bmN0aW9uIG8obil7dmFyIGU9bi5jaGlsZHJlbixyPW4ucGFyZW50LmNoaWxkcmVuLGk9bi5pP3Jbbi5pLTFdOm51bGw7aWYoZSl7IWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPTAscj0wLGk9dC5jaGlsZHJlbixvPWkubGVuZ3RoOy0tbz49MDspKG49aVtvXSkueis9ZSxuLm0rPWUsZSs9bi5zKyhyKz1uLmMpfShuKTt2YXIgbz0oZVswXS56K2VbZS5sZW5ndGgtMV0ueikvMjtpPyhuLno9aS56K3Qobi5fLGkuXyksbi5tPW4uei1vKTpuLno9b31lbHNlIGkmJihuLno9aS56K3Qobi5fLGkuXykpO24ucGFyZW50LkE9ZnVuY3Rpb24obixlLHIpe2lmKGUpe2Zvcih2YXIgaSxvPW4sYT1uLHU9ZSxmPW8ucGFyZW50LmNoaWxkcmVuWzBdLGM9by5tLHM9YS5tLGw9dS5tLGg9Zi5tO3U9SGwodSksbz1JbChvKSx1JiZvOylmPUlsKGYpLChhPUhsKGEpKS5hPW4sKGk9dS56K2wtby56LWMrdCh1Ll8sby5fKSk+MCYmKGpsKFhsKHUsbixyKSxuLGkpLGMrPWkscys9aSksbCs9dS5tLGMrPW8ubSxoKz1mLm0scys9YS5tO3UmJiFIbChhKSYmKGEudD11LGEubSs9bC1zKSxvJiYhSWwoZikmJihmLnQ9byxmLm0rPWMtaCxyPW4pfXJldHVybiByfShuLGksbi5wYXJlbnQuQXx8clswXSl9ZnVuY3Rpb24gYSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gdSh0KXt0LngqPW4sdC55PXQuZGVwdGgqZX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC50cmVlbWFwPWZ1bmN0aW9uKCl7dmFyIHQ9Wmwsbj0hMSxlPTEscj0xLGk9WzBdLG89RWwsYT1FbCx1PUVsLGY9RWwsYz1FbDtmdW5jdGlvbiBzKHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPWUsdC55MT1yLHQuZWFjaEJlZm9yZShsKSxpPVswXSxuJiZ0LmVhY2hCZWZvcmUoTGwpLHR9ZnVuY3Rpb24gbChuKXt2YXIgZT1pW24uZGVwdGhdLHI9bi54MCtlLHM9bi55MCtlLGw9bi54MS1lLGg9bi55MS1lO2w8ciYmKHI9bD0ocitsKS8yKSxoPHMmJihzPWg9KHMraCkvMiksbi54MD1yLG4ueTA9cyxuLngxPWwsbi55MT1oLG4uY2hpbGRyZW4mJihlPWlbbi5kZXB0aCsxXT1vKG4pLzIscis9YyhuKS1lLHMrPWEobiktZSwobC09dShuKS1lKTxyJiYocj1sPShyK2wpLzIpLChoLT1mKG4pLWUpPHMmJihzPWg9KHMraCkvMiksdChuLHIscyxsLGgpKX1yZXR1cm4gcy5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0hIXQscyk6bn0scy5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0scyk6W2Uscl19LHMudGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1TbChuKSxzKTp0fSxzLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nSW5uZXIodCkucGFkZGluZ091dGVyKHQpOnMucGFkZGluZ0lubmVyKCl9LHMucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOm99LHMucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3MucGFkZGluZ1RvcCh0KS5wYWRkaW5nUmlnaHQodCkucGFkZGluZ0JvdHRvbSh0KS5wYWRkaW5nTGVmdCh0KTpzLnBhZGRpbmdUb3AoKX0scy5wYWRkaW5nVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmF9LHMucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOnV9LHMucGFkZGluZ0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxzKTpmfSxzLnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmN9LHN9LHQudHJlZW1hcEJpbmFyeT1mdW5jdGlvbih0LG4sZSxyLGkpe3ZhciBvLGEsdT10LmNoaWxkcmVuLGY9dS5sZW5ndGgsYz1uZXcgQXJyYXkoZisxKTtmb3IoY1swXT1hPW89MDtvPGY7KytvKWNbbysxXT1hKz11W29dLnZhbHVlOyFmdW5jdGlvbiB0KG4sZSxyLGksbyxhLGYpe2lmKG4+PWUtMSl7dmFyIHM9dVtuXTtyZXR1cm4gcy54MD1pLHMueTA9byxzLngxPWEsdm9pZChzLnkxPWYpfWZvcih2YXIgbD1jW25dLGg9ci8yK2wsZD1uKzEscD1lLTE7ZDxwOyl7dmFyIHY9ZCtwPj4+MTtjW3ZdPGg/ZD12KzE6cD12fWgtY1tkLTFdPGNbZF0taCYmbisxPGQmJi0tZDt2YXIgZz1jW2RdLWwseT1yLWc7aWYoYS1pPmYtbyl7dmFyIF89KGkqeSthKmcpL3I7dChuLGQsZyxpLG8sXyxmKSx0KGQsZSx5LF8sbyxhLGYpfWVsc2V7dmFyIGI9KG8qeStmKmcpL3I7dChuLGQsZyxpLG8sYSxiKSx0KGQsZSx5LGksYixhLGYpfX0oMCxmLHQudmFsdWUsbixlLHIsaSl9LHQudHJlZW1hcERpY2U9RGwsdC50cmVlbWFwU2xpY2U9VmwsdC50cmVlbWFwU2xpY2VEaWNlPWZ1bmN0aW9uKHQsbixlLHIsaSl7KDEmdC5kZXB0aD9WbDpEbCkodCxuLGUscixpKX0sdC50cmVlbWFwU3F1YXJpZnk9WmwsdC50cmVlbWFwUmVzcXVhcmlmeT1RbCx0LmludGVycG9sYXRlPW1lLHQuaW50ZXJwb2xhdGVBcnJheT1kZSx0LmludGVycG9sYXRlQmFzaXM9ZWUsdC5pbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkPXJlLHQuaW50ZXJwb2xhdGVEYXRlPXBlLHQuaW50ZXJwb2xhdGVEaXNjcmV0ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX0sdC5pbnRlcnBvbGF0ZUh1ZT1mdW5jdGlvbih0LG4pe3ZhciBlPWFlKCt0LCtuKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49ZSh0KTtyZXR1cm4gbi0zNjAqTWF0aC5mbG9vcihuLzM2MCl9fSx0LmludGVycG9sYXRlTnVtYmVyPXZlLHQuaW50ZXJwb2xhdGVPYmplY3Q9Z2UsdC5pbnRlcnBvbGF0ZVJvdW5kPXhlLHQuaW50ZXJwb2xhdGVTdHJpbmc9YmUsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1DZSx0LmludGVycG9sYXRlVHJhbnNmb3JtU3ZnPVBlLHQuaW50ZXJwb2xhdGVab29tPXFlLHQuaW50ZXJwb2xhdGVSZ2I9Y2UsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzPWxlLHQuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZD1oZSx0LmludGVycG9sYXRlSHNsPVllLHQuaW50ZXJwb2xhdGVIc2xMb25nPUJlLHQuaW50ZXJwb2xhdGVMYWI9ZnVuY3Rpb24odCxuKXt2YXIgZT1mZSgodD1Vbih0KSkubCwobj1VbihuKSkubCkscj1mZSh0LmEsbi5hKSxpPWZlKHQuYixuLmIpLG89ZmUodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmw9ZShuKSx0LmE9cihuKSx0LmI9aShuKSx0Lm9wYWNpdHk9byhuKSx0KyIifX0sdC5pbnRlcnBvbGF0ZUhjbD1JZSx0LmludGVycG9sYXRlSGNsTG9uZz1IZSx0LmludGVycG9sYXRlQ3ViZWhlbGl4PVhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPUdlLHQucGllY2V3aXNlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPTAscj1uLmxlbmd0aC0xLGk9blswXSxvPW5ldyBBcnJheShyPDA/MDpyKTtlPHI7KW9bZV09dChpLGk9blsrK2VdKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49TWF0aC5tYXgoMCxNYXRoLm1pbihyLTEsTWF0aC5mbG9vcih0Kj1yKSkpO3JldHVybiBvW25dKHQtbil9fSx0LnF1YW50aXplPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LHQucGF0aD1HaSx0LnBvbHlnb25BcmVhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMn0sdC5wb2x5Z29uQ2VudHJvaWQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89MCxhPTAsdT10W2ktMV0sZj0wOysrcjxpOyluPXUsdT10W3JdLGYrPWU9blswXSp1WzFdLXVbMF0qblsxXSxvKz0oblswXSt1WzBdKSplLGErPShuWzFdK3VbMV0pKmU7cmV0dXJuW28vKGYqPTMpLGEvZl19LHQucG9seWdvbkh1bGw9ZnVuY3Rpb24odCl7aWYoKGU9dC5sZW5ndGgpPDMpcmV0dXJuIG51bGw7dmFyIG4sZSxyPW5ldyBBcnJheShlKSxpPW5ldyBBcnJheShlKTtmb3Iobj0wO248ZTsrK24pcltuXT1bK3Rbbl1bMF0sK3Rbbl1bMV0sbl07Zm9yKHIuc29ydChKbCksbj0wO248ZTsrK24paVtuXT1bcltuXVswXSwtcltuXVsxXV07dmFyIG89S2wociksYT1LbChpKSx1PWFbMF09PT1vWzBdLGY9YVthLmxlbmd0aC0xXT09PW9bby5sZW5ndGgtMV0sYz1bXTtmb3Iobj1vLmxlbmd0aC0xO24+PTA7LS1uKWMucHVzaCh0W3Jbb1tuXV1bMl1dKTtmb3Iobj0rdTtuPGEubGVuZ3RoLWY7KytuKWMucHVzaCh0W3JbYVtuXV1bMl1dKTtyZXR1cm4gY30sdC5wb2x5Z29uQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscixpPXQubGVuZ3RoLG89dFtpLTFdLGE9blswXSx1PW5bMV0sZj1vWzBdLGM9b1sxXSxzPSExLGw9MDtsPGk7KytsKWU9KG89dFtsXSlbMF0sKHI9b1sxXSk+dSE9Yz51JiZhPChmLWUpKih1LXIpLyhjLXIpK2UmJihzPSFzKSxmPWUsYz1yO3JldHVybiBzfSx0LnBvbHlnb25MZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLGE9b1swXSx1PW9bMV0sZj0wOysrcjxpOyluPWEsZT11LG4tPWE9KG89dFtyXSlbMF0sZS09dT1vWzFdLGYrPU1hdGguc3FydChuKm4rZSplKTtyZXR1cm4gZn0sdC5xdWFkdHJlZT1yYSx0LnJhbmRvbVVuaWZvcm09bmgsdC5yYW5kb21Ob3JtYWw9ZWgsdC5yYW5kb21Mb2dOb3JtYWw9cmgsdC5yYW5kb21CYXRlcz1vaCx0LnJhbmRvbUlyd2luSGFsbD1paCx0LnJhbmRvbUV4cG9uZW50aWFsPWFoLHQuc2NhbGVCYW5kPWhoLHQuc2NhbGVQb2ludD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiB0KG4pe3ZhciBlPW4uY29weTtyZXR1cm4gbi5wYWRkaW5nPW4ucGFkZGluZ091dGVyLGRlbGV0ZSBuLnBhZGRpbmdJbm5lcixkZWxldGUgbi5wYWRkaW5nT3V0ZXIsbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoZSgpKX0sbn0oaGgoKS5wYWRkaW5nSW5uZXIoMSkpfSx0LnNjYWxlSWRlbnRpdHk9ZnVuY3Rpb24gdCgpe3ZhciBuPVswLDFdO2Z1bmN0aW9uIGUodCl7cmV0dXJuK3R9cmV0dXJuIGUuaW52ZXJ0PWUsZS5kb21haW49ZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1maC5jYWxsKHQscGgpLGUpOm4uc2xpY2UoKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4obil9LHhoKGUpfSx0LnNjYWxlTGluZWFyPWZ1bmN0aW9uIHQoKXt2YXIgbj1taChnaCx2ZSk7cmV0dXJuIG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLHQoKSl9LHhoKG4pfSx0LnNjYWxlTG9nPWZ1bmN0aW9uIG4oKXt2YXIgZT1taChNaCxBaCkuZG9tYWluKFsxLDEwXSkscj1lLmRvbWFpbixpPTEwLG89U2goMTApLGE9TmgoMTApO2Z1bmN0aW9uIHUoKXtyZXR1cm4gbz1TaChpKSxhPU5oKGkpLHIoKVswXTwwJiYobz1FaChvKSxhPUVoKGEpKSxlfXJldHVybiBlLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsdSgpKTppfSxlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSx1KCkpOnIoKX0sZS50aWNrcz1mdW5jdGlvbih0KXt2YXIgbixlPXIoKSx1PWVbMF0sZj1lW2UubGVuZ3RoLTFdOyhuPWY8dSkmJihoPXUsdT1mLGY9aCk7dmFyIGMscyxsLGg9byh1KSxkPW8oZikscD1udWxsPT10PzEwOit0LHY9W107aWYoIShpJTEpJiZkLWg8cCl7aWYoaD1NYXRoLnJvdW5kKGgpLTEsZD1NYXRoLnJvdW5kKGQpKzEsdT4wKXtmb3IoO2g8ZDsrK2gpZm9yKHM9MSxjPWEoaCk7czxpOysrcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2UgZm9yKDtoPGQ7KytoKWZvcihzPWktMSxjPWEoaCk7cz49MTstLXMpaWYoISgobD1jKnMpPHUpKXtpZihsPmYpYnJlYWs7di5wdXNoKGwpfX1lbHNlIHY9bShoLGQsTWF0aC5taW4oZC1oLHApKS5tYXAoYSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgdT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC9hKE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PXU/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKHdoKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGEoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIGEoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBiaChlLG4oKS5iYXNlKGkpKX0sZX0sdC5zY2FsZU9yZGluYWw9bGgsdC5zY2FsZUltcGxpY2l0PXNoLHQuc2NhbGVQb3c9Q2gsdC5zY2FsZVNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ2goKS5leHBvbmVudCguNSl9LHQuc2NhbGVRdWFudGlsZT1mdW5jdGlvbiB0KCl7dmFyIGU9W10scj1bXSxvPVtdO2Z1bmN0aW9uIGEoKXt2YXIgdD0wLG49TWF0aC5tYXgoMSxyLmxlbmd0aCk7Zm9yKG89bmV3IEFycmF5KG4tMSk7Kyt0PG47KW9bdC0xXT1BKGUsdC9uKTtyZXR1cm4gdX1mdW5jdGlvbiB1KHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltpKG8sdCldfXJldHVybiB1LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj1yLmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06W24+MD9vW24tMV06ZVswXSxuPG8ubGVuZ3RoP29bbl06ZVtlLmxlbmd0aC0xXV19LHUuZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIHIsaT0wLG89dC5sZW5ndGg7aTxvOysraSludWxsPT0ocj10W2ldKXx8aXNOYU4ocj0rcil8fGUucHVzaChyKTtyZXR1cm4gZS5zb3J0KG4pLGEoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1jaC5jYWxsKHQpLGEoKSk6ci5zbGljZSgpfSx1LnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKGUpLnJhbmdlKHIpfSx1fSx0LnNjYWxlUXVhbnRpemU9ZnVuY3Rpb24gdCgpe3ZhciBuPTAsZT0xLHI9MSxvPVsuNV0sYT1bMCwxXTtmdW5jdGlvbiB1KHQpe2lmKHQ8PXQpcmV0dXJuIGFbaShvLHQsMCxyKV19ZnVuY3Rpb24gZigpe3ZhciB0PS0xO2ZvcihvPW5ldyBBcnJheShyKTsrK3Q8cjspb1t0XT0oKHQrMSkqZS0odC1yKSpuKS8ocisxKTtyZXR1cm4gdX1yZXR1cm4gdS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0sZT0rdFsxXSxmKCkpOltuLGVdfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPShhPWNoLmNhbGwodCkpLmxlbmd0aC0xLGYoKSk6YS5zbGljZSgpfSx1LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgaT1hLmluZGV4T2YodCk7cmV0dXJuIGk8MD9bTmFOLE5hTl06aTwxP1tuLG9bMF1dOmk+PXI/W29bci0xXSxlXTpbb1tpLTFdLG9baV1dfSx1LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihbbixlXSkucmFuZ2UoYSl9LHhoKHUpfSx0LnNjYWxlVGhyZXNob2xkPWZ1bmN0aW9uIHQoKXt2YXIgbj1bLjVdLGU9WzAsMV0scj0xO2Z1bmN0aW9uIG8odCl7aWYodDw9dClyZXR1cm4gZVtpKG4sdCwwLHIpXX1yZXR1cm4gby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Y2guY2FsbCh0KSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLG8pOm4uc2xpY2UoKX0sby5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6ZS5zbGljZSgpfSxvLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1lLmluZGV4T2YodCk7cmV0dXJuW25bci0xXSxuW3JdXX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4obikucmFuZ2UoZSl9LG99LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGN2KGNkLHVkLFZoLGpoLEloLEJoLE9oLExoLHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSx0LnNjYWxlVXRjPWZ1bmN0aW9uKCl7cmV0dXJuIGN2KExkLHpkLF9kLHZkLGRkLGxkLE9oLExoLHQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHQuc2NhbGVTZXF1ZW50aWFsPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPTEsaT0xLG89ITE7ZnVuY3Rpb24gYSh0KXt2YXIgcj0odC1lKSppO3JldHVybiBuKG8/TWF0aC5tYXgoMCxNYXRoLm1pbigxLHIpKTpyKX1yZXR1cm4gYS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxpPWU9PT1yPzA6MS8oci1lKSxhKTpbZSxyXX0sYS5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0hIXQsYSk6b30sYS5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChuKS5kb21haW4oW2Uscl0pLmNsYW1wKG8pfSx4aChhKX0sdC5zY2FsZURpdmVyZ2luZz1mdW5jdGlvbiB0KG4pe3ZhciBlPTAscj0uNSxpPTEsbz0xLGE9MSx1PSExO2Z1bmN0aW9uIGYodCl7dmFyIGU9LjUrKCh0PSt0KS1yKSoodDxyP286YSk7cmV0dXJuIG4odT9NYXRoLm1heCgwLE1hdGgubWluKDEsZSkpOmUpfXJldHVybiBmLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9K3RbMl0sbz1lPT09cj8wOi41LyhyLWUpLGE9cj09PWk/MDouNS8oaS1yKSxmKTpbZSxyLGldfSxmLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSEhdCxmKTp1fSxmLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGYpOm59LGYuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyLGldKS5jbGFtcCh1KX0seGgoZil9LHQuc2NoZW1lQ2F0ZWdvcnkxMD1sdix0LnNjaGVtZUFjY2VudD1odix0LnNjaGVtZURhcmsyPWR2LHQuc2NoZW1lUGFpcmVkPXB2LHQuc2NoZW1lUGFzdGVsMT12dix0LnNjaGVtZVBhc3RlbDI9Z3YsdC5zY2hlbWVTZXQxPXl2LHQuc2NoZW1lU2V0Mj1fdix0LnNjaGVtZVNldDM9YnYsdC5pbnRlcnBvbGF0ZUJyQkc9d3YsdC5zY2hlbWVCckJHPXh2LHQuaW50ZXJwb2xhdGVQUkduPUF2LHQuc2NoZW1lUFJHbj1Ndix0LmludGVycG9sYXRlUGlZRz1Odix0LnNjaGVtZVBpWUc9VHYsdC5pbnRlcnBvbGF0ZVB1T3I9RXYsdC5zY2hlbWVQdU9yPVN2LHQuaW50ZXJwb2xhdGVSZEJ1PUN2LHQuc2NoZW1lUmRCdT1rdix0LmludGVycG9sYXRlUmRHeT16dix0LnNjaGVtZVJkR3k9UHYsdC5pbnRlcnBvbGF0ZVJkWWxCdT1Mdix0LnNjaGVtZVJkWWxCdT1Sdix0LmludGVycG9sYXRlUmRZbEduPVV2LHQuc2NoZW1lUmRZbEduPUR2LHQuaW50ZXJwb2xhdGVTcGVjdHJhbD1Pdix0LnNjaGVtZVNwZWN0cmFsPXF2LHQuaW50ZXJwb2xhdGVCdUduPUJ2LHQuc2NoZW1lQnVHbj1Zdix0LmludGVycG9sYXRlQnVQdT1Jdix0LnNjaGVtZUJ1UHU9RnYsdC5pbnRlcnBvbGF0ZUduQnU9anYsdC5zY2hlbWVHbkJ1PUh2LHQuaW50ZXJwb2xhdGVPclJkPUd2LHQuc2NoZW1lT3JSZD1Ydix0LmludGVycG9sYXRlUHVCdUduPSR2LHQuc2NoZW1lUHVCdUduPVZ2LHQuaW50ZXJwb2xhdGVQdUJ1PVp2LHQuc2NoZW1lUHVCdT1Xdix0LmludGVycG9sYXRlUHVSZD1Kdix0LnNjaGVtZVB1UmQ9UXYsdC5pbnRlcnBvbGF0ZVJkUHU9dGcsdC5zY2hlbWVSZFB1PUt2LHQuaW50ZXJwb2xhdGVZbEduQnU9ZWcsdC5zY2hlbWVZbEduQnU9bmcsdC5pbnRlcnBvbGF0ZVlsR249aWcsdC5zY2hlbWVZbEduPXJnLHQuaW50ZXJwb2xhdGVZbE9yQnI9YWcsdC5zY2hlbWVZbE9yQnI9b2csdC5pbnRlcnBvbGF0ZVlsT3JSZD1mZyx0LnNjaGVtZVlsT3JSZD11Zyx0LmludGVycG9sYXRlQmx1ZXM9c2csdC5zY2hlbWVCbHVlcz1jZyx0LmludGVycG9sYXRlR3JlZW5zPWhnLHQuc2NoZW1lR3JlZW5zPWxnLHQuaW50ZXJwb2xhdGVHcmV5cz1wZyx0LnNjaGVtZUdyZXlzPWRnLHQuaW50ZXJwb2xhdGVQdXJwbGVzPWdnLHQuc2NoZW1lUHVycGxlcz12Zyx0LmludGVycG9sYXRlUmVkcz1fZyx0LnNjaGVtZVJlZHM9eWcsdC5pbnRlcnBvbGF0ZU9yYW5nZXM9bWcsdC5zY2hlbWVPcmFuZ2VzPWJnLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PXhnLHQuaW50ZXJwb2xhdGVSYWluYm93PWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gQWcuaD0zNjAqdC0xMDAsQWcucz0xLjUtMS41Km4sQWcubD0uOC0uOSpuLEFnKyIifSx0LmludGVycG9sYXRlV2FybT13Zyx0LmludGVycG9sYXRlQ29vbD1NZyx0LmludGVycG9sYXRlU2luZWJvdz1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gdD0oLjUtdCkqTWF0aC5QSSxUZy5yPTI1NSoobj1NYXRoLnNpbih0KSkqbixUZy5nPTI1NSoobj1NYXRoLnNpbih0K05nKSkqbixUZy5iPTI1NSoobj1NYXRoLnNpbih0K1NnKSkqbixUZysiIn0sdC5pbnRlcnBvbGF0ZVZpcmlkaXM9a2csdC5pbnRlcnBvbGF0ZU1hZ21hPUNnLHQuaW50ZXJwb2xhdGVJbmZlcm5vPVBnLHQuaW50ZXJwb2xhdGVQbGFzbWE9emcsdC5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIER0KFcodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sdC5jcmVhdG9yPVcsdC5sb2NhbD1xdCx0Lm1hdGNoZXI9cnQsdC5tb3VzZT1GdCx0Lm5hbWVzcGFjZT0kLHQubmFtZXNwYWNlcz1WLHQuY2xpZW50UG9pbnQ9QnQsdC5zZWxlY3Q9RHQsdC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSdChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBSdChbbnVsbD09dD9bXTp0XSx6dCl9LHQuc2VsZWN0aW9uPUx0LHQuc2VsZWN0b3I9USx0LnNlbGVjdG9yQWxsPUssdC5zdHlsZT1sdCx0LnRvdWNoPUl0LHQudG91Y2hlcz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPVl0KCkudG91Y2hlcyk7Zm9yKHZhciBlPTAscj1uP24ubGVuZ3RoOjAsaT1uZXcgQXJyYXkocik7ZTxyOysrZSlpW2VdPUJ0KHQsbltlXSk7cmV0dXJuIGl9LHQud2luZG93PXN0LHQuY3VzdG9tRXZlbnQ9Q3QsdC5hcmM9ZnVuY3Rpb24oKXt2YXIgdD1HZyxuPVZnLGU9UmcoMCkscj1udWxsLGk9JGcsbz1XZyxhPVpnLHU9bnVsbDtmdW5jdGlvbiBmKCl7dmFyIGYsYyxzLGw9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyktSGcscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyx2PUxnKHAtZCksZz1wPmQ7aWYodXx8KHU9Zj1HaSgpKSxoPGwmJihjPWgsaD1sLGw9YyksaD5GZylpZih2PmpnLUZnKXUubW92ZVRvKGgqVWcoZCksaCpZZyhkKSksdS5hcmMoMCwwLGgsZCxwLCFnKSxsPkZnJiYodS5tb3ZlVG8obCpVZyhwKSxsKllnKHApKSx1LmFyYygwLDAsbCxwLGQsZykpO2Vsc2V7dmFyIHksXyxiPWQsbT1wLHg9ZCx3PXAsTT12LEE9dixUPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsTj1UPkZnJiYocj8rci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6QmcobCpsK2gqaCkpLFM9T2coTGcoaC1sKS8yLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksRT1TLGs9UztpZihOPkZnKXt2YXIgQz1YZyhOL2wqWWcoVCkpLFA9WGcoTi9oKllnKFQpKTsoTS09MipDKT5GZz8oeCs9Qyo9Zz8xOi0xLHctPUMpOihNPTAseD13PShkK3ApLzIpLChBLT0yKlApPkZnPyhiKz1QKj1nPzE6LTEsbS09UCk6KEE9MCxiPW09KGQrcCkvMil9dmFyIHo9aCpVZyhiKSxSPWgqWWcoYiksTD1sKlVnKHcpLEQ9bCpZZyh3KTtpZihTPkZnKXt2YXIgVT1oKlVnKG0pLHE9aCpZZyhtKSxPPWwqVWcoeCksWT1sKllnKHgpO2lmKHY8SWcpe3ZhciBCPU0+Rmc/ZnVuY3Rpb24odCxuLGUscixpLG8sYSx1KXt2YXIgZj1lLXQsYz1yLW4scz1hLWksbD11LW8saD0ocyoobi1vKS1sKih0LWkpKS8obCpmLXMqYyk7cmV0dXJuW3QraCpmLG4raCpjXX0oeixSLE8sWSxVLHEsTCxEKTpbTCxEXSxGPXotQlswXSxJPVItQlsxXSxIPVUtQlswXSxqPXEtQlsxXSxYPTEvWWcoKChzPShGKkgrSSpqKS8oQmcoRipGK0kqSSkqQmcoSCpIK2oqaikpKT4xPzA6czwtMT9JZzpNYXRoLmFjb3MocykpLzIpLEc9QmcoQlswXSpCWzBdK0JbMV0qQlsxXSk7RT1PZyhTLChsLUcpLyhYLTEpKSxrPU9nKFMsKGgtRykvKFgrMSkpfX1BPkZnP2s+Rmc/KHk9UWcoTyxZLHosUixoLGssZyksXz1RZyhVLHEsTCxELGgsayxnKSx1Lm1vdmVUbyh5LmN4K3kueDAxLHkuY3kreS55MDEpLGs8Uz91LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoXy55MDEsXy54MDEpLCFnKToodS5hcmMoeS5jeCx5LmN5LGssRGcoeS55MDEseS54MDEpLERnKHkueTExLHkueDExKSwhZyksdS5hcmMoMCwwLGgsRGcoeS5jeSt5LnkxMSx5LmN4K3kueDExKSxEZyhfLmN5K18ueTExLF8uY3grXy54MTEpLCFnKSx1LmFyYyhfLmN4LF8uY3ksayxEZyhfLnkxMSxfLngxMSksRGcoXy55MDEsXy54MDEpLCFnKSkpOih1Lm1vdmVUbyh6LFIpLHUuYXJjKDAsMCxoLGIsbSwhZykpOnUubW92ZVRvKHosUiksbD5GZyYmTT5GZz9FPkZnPyh5PVFnKEwsRCxVLHEsbCwtRSxnKSxfPVFnKHosUixPLFksbCwtRSxnKSx1LmxpbmVUbyh5LmN4K3kueDAxLHkuY3kreS55MDEpLEU8Uz91LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoXy55MDEsXy54MDEpLCFnKToodS5hcmMoeS5jeCx5LmN5LEUsRGcoeS55MDEseS54MDEpLERnKHkueTExLHkueDExKSwhZyksdS5hcmMoMCwwLGwsRGcoeS5jeSt5LnkxMSx5LmN4K3kueDExKSxEZyhfLmN5K18ueTExLF8uY3grXy54MTEpLGcpLHUuYXJjKF8uY3gsXy5jeSxFLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6dS5hcmMoMCwwLGwsdyx4LGcpOnUubGluZVRvKEwsRCl9ZWxzZSB1Lm1vdmVUbygwLDApO2lmKHUuY2xvc2VQYXRoKCksZilyZXR1cm4gdT1udWxsLGYrIiJ8fG51bGx9cmV0dXJuIGYuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgZT0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIscj0oK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItSWcvMjtyZXR1cm5bVWcocikqZSxZZyhyKSplXX0sZi5pbm5lclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxmKTp0fSxmLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOmV9LGYucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6aX0sZi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpvfSxmLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOmF9LGYuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT10P251bGw6dCxmKTp1fSxmfSx0LmFyZWE9cnksdC5saW5lPWV5LHQucGllPWZ1bmN0aW9uKCl7dmFyIHQ9b3ksbj1peSxlPW51bGwscj1SZygwKSxpPVJnKGpnKSxvPVJnKDApO2Z1bmN0aW9uIGEoYSl7dmFyIHUsZixjLHMsbCxoPWEubGVuZ3RoLGQ9MCxwPW5ldyBBcnJheShoKSx2PW5ldyBBcnJheShoKSxnPStyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx5PU1hdGgubWluKGpnLE1hdGgubWF4KC1qZyxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1nKSksXz1NYXRoLm1pbihNYXRoLmFicyh5KS9oLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxiPV8qKHk8MD8tMToxKTtmb3IodT0wO3U8aDsrK3UpKGw9dltwW3VdPXVdPSt0KGFbdV0sdSxhKSk+MCYmKGQrPWwpO2ZvcihudWxsIT1uP3Auc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuKHZbdF0sdltlXSl9KTpudWxsIT1lJiZwLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShhW3RdLGFbbl0pfSksdT0wLGM9ZD8oeS1oKmIpL2Q6MDt1PGg7Kyt1LGc9cylmPXBbdV0scz1nKygobD12W2ZdKT4wP2wqYzowKStiLHZbZl09e2RhdGE6YVtmXSxpbmRleDp1LHZhbHVlOmwsc3RhcnRBbmdsZTpnLGVuZEFuZ2xlOnMscGFkQW5nbGU6X307cmV0dXJuIHZ9cmV0dXJuIGEudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZygrbiksYSk6dH0sYS5zb3J0VmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZT1udWxsLGEpOm59LGEuc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG49bnVsbCxhKTplfSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTppfSxhLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOm99LGF9LHQuYXJlYVJhZGlhbD1seSx0LnJhZGlhbEFyZWE9bHksdC5saW5lUmFkaWFsPXN5LHQucmFkaWFsTGluZT1zeSx0LnBvaW50UmFkaWFsPWh5LHQubGlua0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4gZ3koeXkpfSx0LmxpbmtWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiBneShfeSl9LHQubGlua1JhZGlhbD1mdW5jdGlvbigpe3ZhciB0PWd5KGJ5KTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fSx0LnN5bWJvbD1mdW5jdGlvbigpe3ZhciB0PVJnKG15KSxuPVJnKDY0KSxlPW51bGw7ZnVuY3Rpb24gcigpe3ZhciByO2lmKGV8fChlPXI9R2koKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhlLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscilyZXR1cm4gZT1udWxsLHIrIiJ8fG51bGx9cmV0dXJuIHIudHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKG4pLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyKTpufSxyLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOnQscik6ZX0scn0sdC5zeW1ib2xzPVV5LHQuc3ltYm9sQ2lyY2xlPW15LHQuc3ltYm9sQ3Jvc3M9eHksdC5zeW1ib2xEaWFtb25kPUF5LHQuc3ltYm9sU3F1YXJlPWt5LHQuc3ltYm9sU3Rhcj1FeSx0LnN5bWJvbFRyaWFuZ2xlPVB5LHQuc3ltYm9sV3llPUR5LHQuY3VydmVCYXNpc0Nsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJ5KHQpfSx0LmN1cnZlQmFzaXNPcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnkodCl9LHQuY3VydmVCYXNpcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFl5KHQpfSx0LmN1cnZlQnVuZGxlPUh5LHQuY3VydmVDYXJkaW5hbENsb3NlZD0keSx0LmN1cnZlQ2FyZGluYWxPcGVuPVp5LHQuY3VydmVDYXJkaW5hbD1HeSx0LmN1cnZlQ2F0bXVsbFJvbUNsb3NlZD1uXyx0LmN1cnZlQ2F0bXVsbFJvbU9wZW49cl8sdC5jdXJ2ZUNhdG11bGxSb209S3ksdC5jdXJ2ZUxpbmVhckNsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGlfKHQpfSx0LmN1cnZlTGluZWFyPUtnLHQuY3VydmVNb25vdG9uZVg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjXyh0KX0sdC5jdXJ2ZU1vbm90b25lWT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHNfKHQpfSx0LmN1cnZlTmF0dXJhbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGhfKHQpfSx0LmN1cnZlU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsLjUpfSx0LmN1cnZlU3RlcEFmdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwxKX0sdC5jdXJ2ZVN0ZXBCZWZvcmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDApfSx0LnN0YWNrPWZ1bmN0aW9uKCl7dmFyIHQ9UmcoW10pLG49Z18sZT12XyxyPXlfO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1PXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGY9aS5sZW5ndGgsYz11Lmxlbmd0aCxzPW5ldyBBcnJheShjKTtmb3Iobz0wO288YzsrK28pe2Zvcih2YXIgbCxoPXVbb10sZD1zW29dPW5ldyBBcnJheShmKSxwPTA7cDxmOysrcClkW3BdPWw9WzAsK3IoaVtwXSxoLHAsaSldLGwuZGF0YT1pW3BdO2Qua2V5PWh9Zm9yKG89MCxhPW4ocyk7bzxjOysrbylzW2Fbb11dLmluZGV4PW87cmV0dXJuIGUocyxhKSxzfXJldHVybiBpLmtleXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZyhkeS5jYWxsKG4pKSxpKTp0fSxpLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGkpOnJ9LGkub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9nXzoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKGR5LmNhbGwodCkpLGkpOm59LGkub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/dl86dCxpKTplfSxpfSx0LnN0YWNrT2Zmc2V0RXhwYW5kPWZ1bmN0aW9uKHQsbil7aWYoKHI9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9dFswXS5sZW5ndGg7bzxhOysrbyl7Zm9yKGk9ZT0wO2U8cjsrK2UpaSs9dFtlXVtvXVsxXXx8MDtpZihpKWZvcihlPTA7ZTxyOysrZSl0W2VdW29dWzFdLz1pfXZfKHQsbil9fSx0LnN0YWNrT2Zmc2V0RGl2ZXJnaW5nPWZ1bmN0aW9uKHQsbil7aWYoKHU9dC5sZW5ndGgpPjEpZm9yKHZhciBlLHIsaSxvLGEsdSxmPTAsYz10W25bMF1dLmxlbmd0aDtmPGM7KytmKWZvcihvPWE9MCxlPTA7ZTx1OysrZSkoaT0ocj10W25bZV1dW2ZdKVsxXS1yWzBdKT49MD8oclswXT1vLHJbMV09bys9aSk6aTwwPyhyWzFdPWEsclswXT1hKz1pKTpyWzBdPW99LHQuc3RhY2tPZmZzZXROb25lPXZfLHQuc3RhY2tPZmZzZXRTaWxob3VldHRlPWZ1bmN0aW9uKHQsbil7aWYoKGU9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyPTAsaT10W25bMF1dLG89aS5sZW5ndGg7cjxvOysrcil7Zm9yKHZhciBhPTAsdT0wO2E8ZTsrK2EpdSs9dFthXVtyXVsxXXx8MDtpW3JdWzFdKz1pW3JdWzBdPS11LzJ9dl8odCxuKX19LHQuc3RhY2tPZmZzZXRXaWdnbGU9ZnVuY3Rpb24odCxuKXtpZigoaT10Lmxlbmd0aCk+MCYmKHI9KGU9dFtuWzBdXSkubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCxhPTE7YTxyOysrYSl7Zm9yKHZhciB1PTAsZj0wLGM9MDt1PGk7Kyt1KXtmb3IodmFyIHM9dFtuW3VdXSxsPXNbYV1bMV18fDAsaD0obC0oc1thLTFdWzFdfHwwKSkvMixkPTA7ZDx1OysrZCl7dmFyIHA9dFtuW2RdXTtoKz0ocFthXVsxXXx8MCktKHBbYS0xXVsxXXx8MCl9Zis9bCxjKz1oKmx9ZVthLTFdWzFdKz1lW2EtMV1bMF09byxmJiYoby09Yy9mKX1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLHZfKHQsbil9fSx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9X18sdC5zdGFja09yZGVyRGVzY2VuZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gX18odCkucmV2ZXJzZSgpfSx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoYl8pLG89Z18odCkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBpW25dLWlbdF19KSxhPTAsdT0wLGY9W10sYz1bXTtmb3Iobj0wO248cjsrK24pZT1vW25dLGE8dT8oYSs9aVtlXSxmLnB1c2goZSkpOih1Kz1pW2VdLGMucHVzaChlKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChmKX0sdC5zdGFja09yZGVyTm9uZT1nXyx0LnN0YWNrT3JkZXJSZXZlcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBnXyh0KS5yZXZlcnNlKCl9LHQudGltZUludGVydmFsPVJoLHQudGltZU1pbGxpc2Vjb25kPUxoLHQudGltZU1pbGxpc2Vjb25kcz1EaCx0LnV0Y01pbGxpc2Vjb25kPUxoLHQudXRjTWlsbGlzZWNvbmRzPURoLHQudGltZVNlY29uZD1PaCx0LnRpbWVTZWNvbmRzPVloLHQudXRjU2Vjb25kPU9oLHQudXRjU2Vjb25kcz1ZaCx0LnRpbWVNaW51dGU9QmgsdC50aW1lTWludXRlcz1GaCx0LnRpbWVIb3VyPUloLHQudGltZUhvdXJzPUhoLHQudGltZURheT1qaCx0LnRpbWVEYXlzPVhoLHQudGltZVdlZWs9VmgsdC50aW1lV2Vla3M9dGQsdC50aW1lU3VuZGF5PVZoLHQudGltZVN1bmRheXM9dGQsdC50aW1lTW9uZGF5PSRoLHQudGltZU1vbmRheXM9bmQsdC50aW1lVHVlc2RheT1XaCx0LnRpbWVUdWVzZGF5cz1lZCx0LnRpbWVXZWRuZXNkYXk9WmgsdC50aW1lV2VkbmVzZGF5cz1yZCx0LnRpbWVUaHVyc2RheT1RaCx0LnRpbWVUaHVyc2RheXM9aWQsdC50aW1lRnJpZGF5PUpoLHQudGltZUZyaWRheXM9b2QsdC50aW1lU2F0dXJkYXk9S2gsdC50aW1lU2F0dXJkYXlzPWFkLHQudGltZU1vbnRoPXVkLHQudGltZU1vbnRocz1mZCx0LnRpbWVZZWFyPWNkLHQudGltZVllYXJzPXNkLHQudXRjTWludXRlPWxkLHQudXRjTWludXRlcz1oZCx0LnV0Y0hvdXI9ZGQsdC51dGNIb3Vycz1wZCx0LnV0Y0RheT12ZCx0LnV0Y0RheXM9Z2QsdC51dGNXZWVrPV9kLHQudXRjV2Vla3M9VGQsdC51dGNTdW5kYXk9X2QsdC51dGNTdW5kYXlzPVRkLHQudXRjTW9uZGF5PWJkLHQudXRjTW9uZGF5cz1OZCx0LnV0Y1R1ZXNkYXk9bWQsdC51dGNUdWVzZGF5cz1TZCx0LnV0Y1dlZG5lc2RheT14ZCx0LnV0Y1dlZG5lc2RheXM9RWQsdC51dGNUaHVyc2RheT13ZCx0LnV0Y1RodXJzZGF5cz1rZCx0LnV0Y0ZyaWRheT1NZCx0LnV0Y0ZyaWRheXM9Q2QsdC51dGNTYXR1cmRheT1BZCx0LnV0Y1NhdHVyZGF5cz1QZCx0LnV0Y01vbnRoPXpkLHQudXRjTW9udGhzPVJkLHQudXRjWWVhcj1MZCx0LnV0Y1llYXJzPURkLHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9UXAsdC50aW1lRm9ybWF0TG9jYWxlPVlkLHQuaXNvRm9ybWF0PUpwLHQuaXNvUGFyc2U9S3AsdC5ub3c9aXIsdC50aW1lcj11cix0LnRpbWVyRmx1c2g9ZnIsdC50aW1lb3V0PWhyLHQuaW50ZXJ2YWw9ZnVuY3Rpb24odCxuLGUpe3ZhciByPW5ldyBhcixpPW47cmV0dXJuIG51bGw9PW4/KHIucmVzdGFydCh0LG4sZSkscik6KG49K24sZT1udWxsPT1lP2lyKCk6K2Usci5yZXN0YXJ0KGZ1bmN0aW9uIG8oYSl7YSs9aSxyLnJlc3RhcnQobyxpKz1uLGUpLHQoYSl9LG4sZSkscil9LHQudHJhbnNpdGlvbj16cix0LmFjdGl2ZT1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Ll9fdHJhbnNpdGlvbjtpZihpKWZvcihyIGluIG49bnVsbD09bj9udWxsOm4rIiIsaSlpZigoZT1pW3JdKS5zdGF0ZT5nciYmZS5uYW1lPT09bilyZXR1cm4gbmV3IFByKFtbdF1dLGxpLG4sK3IpO3JldHVybiBudWxsfSx0LmludGVycnVwdD1Ocix0LnZvcm9ub2k9ZnVuY3Rpb24oKXt2YXIgdD14XyxuPXdfLGU9bnVsbDtmdW5jdGlvbiByKHIpe3JldHVybiBuZXcgZWIoci5tYXAoZnVuY3Rpb24oZSxpKXt2YXIgbz1bTWF0aC5yb3VuZCh0KGUsaSxyKS9LXykqS18sTWF0aC5yb3VuZChuKGUsaSxyKS9LXykqS19dO3JldHVybiBvLmluZGV4PWksby5kYXRhPWUsb30pLGUpfXJldHVybiByLnBvbHlnb25zPWZ1bmN0aW9uKHQpe3JldHVybiByKHQpLnBvbHlnb25zKCl9LHIubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkubGlua3MoKX0sci50cmlhbmdsZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkudHJpYW5nbGVzKCl9LHIueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOm1fKCtuKSxyKTp0fSxyLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptXygrdCkscik6bn0sci5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOltbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dLHIpOmUmJltbZVswXVswXSxlWzBdWzFdXSxbZVsxXVswXSxlWzFdWzFdXV19LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1swLDBdLFsrdFswXSwrdFsxXV1dLHIpOmUmJltlWzFdWzBdLWVbMF1bMF0sZVsxXVsxXS1lWzBdWzFdXX0scn0sdC56b29tPWZ1bmN0aW9uKCl7dmFyIG4sZSxyPXNiLGk9bGIsbz12YixhPWRiLHU9cGIsZj1bMCwxLzBdLGM9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0scz0yNTAsbD1xZSxoPVtdLGQ9SSgic3RhcnQiLCJ6b29tIiwiZW5kIikscD01MDAsdj0xNTAsZz0wO2Z1bmN0aW9uIHkodCl7dC5wcm9wZXJ0eSgiX196b29tIixoYikub24oIndoZWVsLnpvb20iLEEpLm9uKCJtb3VzZWRvd24uem9vbSIsVCkub24oImRibGNsaWNrLnpvb20iLE4pLmZpbHRlcih1KS5vbigidG91Y2hzdGFydC56b29tIixTKS5vbigidG91Y2htb3ZlLnpvb20iLEUpLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLGspLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBfKHQsbil7cmV0dXJuKG49TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4pKSk9PT10Lms/dDpuZXcgb2Iobix0LngsdC55KX1mdW5jdGlvbiBiKHQsbixlKXt2YXIgcj1uWzBdLWVbMF0qdC5rLGk9blsxXS1lWzFdKnQuaztyZXR1cm4gcj09PXQueCYmaT09PXQueT90Om5ldyBvYih0LmsscixpKX1mdW5jdGlvbiBtKHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHgodCxuLGUpe3Qub24oInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJ6b29tIixmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxyPXcodGhpcyx0KSxvPWkuYXBwbHkodGhpcyx0KSxhPWV8fG0obyksdT1NYXRoLm1heChvWzFdWzBdLW9bMF1bMF0sb1sxXVsxXS1vWzBdWzFdKSxmPXRoaXMuX196b29tLGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLHQpOm4scz1sKGYuaW52ZXJ0KGEpLmNvbmNhdCh1L2YuayksYy5pbnZlcnQoYSkuY29uY2F0KHUvYy5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9YztlbHNle3ZhciBuPXModCksZT11L25bMl07dD1uZXcgb2IoZSxhWzBdLW5bMF0qZSxhWzFdLW5bMV0qZSl9ci56b29tKG51bGwsdCl9fSl9ZnVuY3Rpb24gdyh0LG4pe2Zvcih2YXIgZSxyPTAsaT1oLmxlbmd0aDtyPGk7KytyKWlmKChlPWhbcl0pLnRoYXQ9PT10KXJldHVybiBlO3JldHVybiBuZXcgTSh0LG4pfWZ1bmN0aW9uIE0odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLmluZGV4PS0xLHRoaXMuYWN0aXZlPTAsdGhpcy5leHRlbnQ9aS5hcHBseSh0LG4pfWZ1bmN0aW9uIEEoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9dyh0aGlzLGFyZ3VtZW50cyksbj10aGlzLl9fem9vbSxlPU1hdGgubWF4KGZbMF0sTWF0aC5taW4oZlsxXSxuLmsqTWF0aC5wb3coMixhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpKSxpPUZ0KHRoaXMpO2lmKHQud2hlZWwpdC5tb3VzZVswXVswXT09PWlbMF0mJnQubW91c2VbMF1bMV09PT1pWzFdfHwodC5tb3VzZVsxXT1uLmludmVydCh0Lm1vdXNlWzBdPWkpKSxjbGVhclRpbWVvdXQodC53aGVlbCk7ZWxzZXtpZihuLms9PT1lKXJldHVybjt0Lm1vdXNlPVtpLG4uaW52ZXJ0KGkpXSxOcih0aGlzKSx0LnN0YXJ0KCl9Y2IoKSx0LndoZWVsPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LndoZWVsPW51bGwsdC5lbmQoKX0sdiksdC56b29tKCJtb3VzZSIsbyhiKF8obixlKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGMpKX19ZnVuY3Rpb24gVCgpe2lmKCFlJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49dyh0aGlzLGFyZ3VtZW50cyksaT1EdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuem9vbSIsZnVuY3Rpb24oKXtpZihjYigpLCFuLm1vdmVkKXt2YXIgZT10LmV2ZW50LmNsaWVudFgtdSxyPXQuZXZlbnQuY2xpZW50WS1mO24ubW92ZWQ9ZSplK3Iqcj5nfW4uem9vbSgibW91c2UiLG8oYihuLnRoYXQuX196b29tLG4ubW91c2VbMF09RnQobi50aGF0KSxuLm1vdXNlWzFdKSxuLmV4dGVudCxjKSl9LCEwKS5vbigibW91c2V1cC56b29tIixmdW5jdGlvbigpe2kub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksR3QodC5ldmVudC52aWV3LG4ubW92ZWQpLGNiKCksbi5lbmQoKX0sITApLGE9RnQodGhpcyksdT10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFk7WHQodC5ldmVudC52aWV3KSxmYigpLG4ubW91c2U9W2EsdGhpcy5fX3pvb20uaW52ZXJ0KGEpXSxOcih0aGlzKSxuLnN0YXJ0KCl9fWZ1bmN0aW9uIE4oKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49dGhpcy5fX3pvb20sZT1GdCh0aGlzKSxhPW4uaW52ZXJ0KGUpLHU9bi5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpLGY9byhiKF8obix1KSxlLGEpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGMpO2NiKCkscz4wP0R0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihzKS5jYWxsKHgsZixlKTpEdCh0aGlzKS5jYWxsKHkudHJhbnNmb3JtLGYpfX1mdW5jdGlvbiBTKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGksbyxhLHU9dyh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGM9Zi5sZW5ndGg7Zm9yKGZiKCksaT0wO2k8YzsrK2kpYT1bYT1JdCh0aGlzLGYsKG89ZltpXSkuaWRlbnRpZmllciksdGhpcy5fX3pvb20uaW52ZXJ0KGEpLG8uaWRlbnRpZmllcl0sdS50b3VjaDA/dS50b3VjaDF8fCh1LnRvdWNoMT1hKToodS50b3VjaDA9YSxlPSEwKTtpZihuJiYobj1jbGVhclRpbWVvdXQobiksIXUudG91Y2gxKSlyZXR1cm4gdS5lbmQoKSx2b2lkKChhPUR0KHRoaXMpLm9uKCJkYmxjbGljay56b29tIikpJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7ZSYmKG49c2V0VGltZW91dChmdW5jdGlvbigpe249bnVsbH0scCksTnIodGhpcyksdS5zdGFydCgpKX19ZnVuY3Rpb24gRSgpe3ZhciBlLHIsaSxhLHU9dyh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLHM9Zi5sZW5ndGg7Zm9yKGNiKCksbiYmKG49Y2xlYXJUaW1lb3V0KG4pKSxlPTA7ZTxzOysrZSlpPUl0KHRoaXMsZiwocj1mW2VdKS5pZGVudGlmaWVyKSx1LnRvdWNoMCYmdS50b3VjaDBbMl09PT1yLmlkZW50aWZpZXI/dS50b3VjaDBbMF09aTp1LnRvdWNoMSYmdS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJih1LnRvdWNoMVswXT1pKTtpZihyPXUudGhhdC5fX3pvb20sdS50b3VjaDEpe3ZhciBsPXUudG91Y2gwWzBdLGg9dS50b3VjaDBbMV0sZD11LnRvdWNoMVswXSxwPXUudG91Y2gxWzFdLHY9KHY9ZFswXS1sWzBdKSp2Kyh2PWRbMV0tbFsxXSkqdixnPShnPXBbMF0taFswXSkqZysoZz1wWzFdLWhbMV0pKmc7cj1fKHIsTWF0aC5zcXJ0KHYvZykpLGk9WyhsWzBdK2RbMF0pLzIsKGxbMV0rZFsxXSkvMl0sYT1bKGhbMF0rcFswXSkvMiwoaFsxXStwWzFdKS8yXX1lbHNle2lmKCF1LnRvdWNoMClyZXR1cm47aT11LnRvdWNoMFswXSxhPXUudG91Y2gwWzFdfXUuem9vbSgidG91Y2giLG8oYihyLGksYSksdS5leHRlbnQsYykpfWZ1bmN0aW9uIGsoKXt2YXIgbixyLGk9dyh0aGlzLGFyZ3VtZW50cyksbz10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGE9by5sZW5ndGg7Zm9yKGZiKCksZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dChmdW5jdGlvbigpe2U9bnVsbH0scCksbj0wO248YTsrK24pcj1vW25dLGkudG91Y2gwJiZpLnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj9kZWxldGUgaS50b3VjaDA6aS50b3VjaDEmJmkudG91Y2gxWzJdPT09ci5pZGVudGlmaWVyJiZkZWxldGUgaS50b3VjaDE7aS50b3VjaDEmJiFpLnRvdWNoMCYmKGkudG91Y2gwPWkudG91Y2gxLGRlbGV0ZSBpLnRvdWNoMSksaS50b3VjaDA/aS50b3VjaDBbMV09dGhpcy5fX3pvb20uaW52ZXJ0KGkudG91Y2gwWzBdKTppLmVuZCgpfXJldHVybiB5LnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLGhiKSx0IT09ZT94KHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0seS5zY2FsZUJ5PWZ1bmN0aW9uKHQsbil7eS5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bil9KX0seS5zY2FsZVRvPWZ1bmN0aW9uKHQsbil7eS50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5fX3pvb20scj1tKHQpLGE9ZS5pbnZlcnQociksdT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuO3JldHVybiBvKGIoXyhlLHUpLHIsYSksdCxjKX0pfSx5LnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyl9KX0seS50cmFuc2xhdGVUbz1mdW5jdGlvbih0LG4sZSl7eS50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dGhpcy5fX3pvb20sYT1tKHQpO3JldHVybiBvKGFiLnRyYW5zbGF0ZShhWzBdLGFbMV0pLnNjYWxlKHIuaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiwiZnVuY3Rpb24iPT10eXBlb2YgZT8tZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LWUpLHQsYyl9KX0sTS5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWgucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09bi5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09bi5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPW4sdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihoLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgaWIoeSx0LHRoaXMudGhhdC5fX3pvb20pLGQuYXBwbHksZCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSx5LndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYigrdCkseSk6YX0seS5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnJ9LHkudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoISF0KSx5KTp1fSx5LmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSx5KTppfSx5LnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmWzBdPSt0WzBdLGZbMV09K3RbMV0seSk6W2ZbMF0sZlsxXV19LHkudHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjWzBdWzBdPSt0WzBdWzBdLGNbMV1bMF09K3RbMV1bMF0sY1swXVsxXT0rdFswXVsxXSxjWzFdWzFdPSt0WzFdWzFdLHkpOltbY1swXVswXSxjWzBdWzFdXSxbY1sxXVswXSxjWzFdWzFdXV19LHkuY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQseSk6b30seS5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCx5KTpzfSx5LmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQseSk6bH0seS5vbj1mdW5jdGlvbigpe3ZhciB0PWQub24uYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiB0PT09ZD95OnR9LHkuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0odD0rdCkqdCx5KTpNYXRoLnNxcnQoZyl9LHl9LHQuem9vbVRyYW5zZm9ybT11Yix0Lnpvb21JZGVudGl0eT1hYixPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9yZWdpc3RyeS5qcwp2YXIgcGU7CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7ZC5OT1RfTE9BREVEPSJOT1RfTE9BREVEIjtkLkxPQURFRD0iTE9BREVEIjtkLkZBSUxFRD0iRkFJTEVEIn0pKGIuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZXx8KGIuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT17fSkpO2IuZGFzaGJvYXJkUmVnaXN0cnk9e307Yi5yZWdpc3RlckRhc2hib2FyZD1mdW5jdGlvbigpe3ZhciBkPXtwbHVnaW46ImJlaG9sZGVyIixlbGVtZW50TmFtZToidGYtYmVob2xkZXItZGFzaGJvYXJkIixzaG91bGRSZW1vdmVEb206ITB9O2lmKCFkLnBsdWdpbil0aHJvdyBFcnJvcigiRGFzaGJvYXJkLnBsdWdpbiBtdXN0IGJlIHByZXNlbnQiKTtpZighZC5lbGVtZW50TmFtZSl0aHJvdyBFcnJvcigiRGFzaGJvYXJkLmVsZW1lbnROYW1lIG11c3QgYmUgcHJlc2VudCIpO2lmKGQucGx1Z2luIGluIGIuZGFzaGJvYXJkUmVnaXN0cnkpdGhyb3cgRXJyb3IoYFBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7ZC5wbHVnaW59YCk7ZC50YWJOYW1lfHwKKGQudGFiTmFtZT1kLnBsdWdpbik7Yi5kYXNoYm9hcmRSZWdpc3RyeVtkLnBsdWdpbl09ZH19KShwZXx8KHBlPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdXRpbHMvdXRpbHMuanMKdmFyIHJmOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChmLGgsayl7cmV0dXJuIDE9PT1mP2g6a31iLmFnZ3JlZ2F0ZVRhZ0luZm89ZnVuY3Rpb24oZixoKXtsZXQgaz12b2lkIDA7Y29uc3Qgcj17fTtPYmplY3Qua2V5cyhmKS5mb3JFYWNoKHA9Pntjb25zdCBtPWZbcF07dm9pZCAwPT09ayYmKGs9bS5kaXNwbGF5TmFtZSk7ayE9PW0uZGlzcGxheU5hbWUmJihrPW51bGwpO3ZvaWQgMD09PXJbbS5kZXNjcmlwdGlvbl0mJihyW20uZGVzY3JpcHRpb25dPVtdKTtyW20uZGVzY3JpcHRpb25dLnB1c2gocCl9KTtoPW51bGwhPWs/azpoO2NvbnN0IGw9KCgpPT57Y29uc3QgcD1PYmplY3Qua2V5cyhyKTtyZXR1cm4gMD09PXAubGVuZ3RoPyIiOjE9PT1wLmxlbmd0aD9wWzBdOmAkeyJceDNjcFx4M2VceDNjc3Ryb25nXHgzZU11bHRpcGxlIGRlc2NyaXB0aW9uczpceDNjL3N0cm9uZ1x4M2VceDNjL3BceDNlIn08dWw+JHtwLm1hcChtPT57Y29uc3Qgbj1yW21dLm1hcCh1PT5gPGNvZGU+JHt1LnJlcGxhY2UoLzwvZywiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZywKIlx4MjZndDsiKS5yZXBsYWNlKC8mL2csIlx4MjZhbXA7Iil9PC9jb2RlPmApLHE9MjxuLmxlbmd0aD9uLnNsaWNlKDAsbi5sZW5ndGgtMSkuam9pbigiLCAiKSsiLCBhbmQgIituW24ubGVuZ3RoLTFdOm4uam9pbigiIGFuZCAiKTtyZXR1cm5gPGxpPjxwPkZvciAke2Qobi5sZW5ndGgsInJ1biIsInJ1bnMiKX0gJHtxfTo8L3A+JHttfTwvbGk+YH0pLmpvaW4oIiIpfTwvdWw+YH0pKCk7cmV0dXJue2Rpc3BsYXlOYW1lOmgsZGVzY3JpcHRpb246bH19fSkocmZ8fChyZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX19hY3RpdmVDaGFuZ2VkIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZToibG9hZGluZyIsb2JzZXJ2ZXI6Il9fYWx0Q2hhbmdlZCJ9LF9fY29vbGluZ0Rvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6ZnVuY3Rpb24oYixkKXtyZXR1cm5bYnx8ZD8iYWN0aXZlIjoiIixkPyJjb29sZG93biI6IiJdLmpvaW4oIiAiKX0sX19hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dGhpcy5fX3NldEFyaWFIaWRkZW4oIWIpO3RoaXMuX19jb29saW5nRG93bj0hYiYmZH0sX19hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJsb2FkaW5nIj09PWI/dGhpcy5hbHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKXx8YjoodGhpcy5fX3NldEFyaWFIaWRkZW4oIiI9PT0KYiksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGIpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fX2Nvb2xpbmdEb3duPXRoaXMuYWN0aXZlPSExfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9kYXRhLWxvYWRlci1iZWhhdmlvci5qcwooZnVuY3Rpb24oYil7bGV0IGQ7KGZ1bmN0aW9uKGYpe2ZbZi5MT0FESU5HPTBdPSJMT0FESU5HIjtmW2YuTE9BREVEPTFdPSJMT0FERUQifSkoZHx8KGQ9e30pKTtiLkRhdGFMb2FkZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2FkRGF0YUlmQWN0aXZlIn0sbG9hZEtleTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmY9PlN0cmluZyhmKX0sbG9hZERhdGFDYWxsYmFjazpGdW5jdGlvbixyZXF1ZXN0RGF0YTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBmPT50aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5nZXREYXRhTG9hZFVybChmKSl9fSxnZXREYXRhTG9hZFVybDpGdW5jdGlvbixkYXRhTG9hZGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKdmFsdWU6ITF9LF9kYXRhTG9hZFN0YXRlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9sb2FkRGF0YUFzeW5jOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2RhdGFUb0xvYWRDaGFuZ2VkKGlzQXR0YWNoZWQsIGRhdGFUb0xvYWQuKikiXSxvbkxvYWRGaW5pc2goKXt9LHJlbG9hZCgpe3RoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTt0aGlzLl9sb2FkRGF0YSgpfSxyZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCk7dGhpcy5fY2FuY2VsbGVyJiZ0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dGhpcy5fZGF0YUxvYWRTdGF0ZSYmdGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sCl9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sY3JlYXRlZCgpe3RoaXMuX2xvYWREYXRhPV8udGhyb3R0bGUodGhpcy5fbG9hZERhdGFJbXBsLDEwMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pfSxkZXRhY2hlZCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9LF9sb2FkRGF0YUlmQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2xvYWREYXRhKCl9LF9sb2FkRGF0YUltcGwoKXt0aGlzLmFjdGl2ZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz10aGlzLmFzeW5jKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57aWYoIWYuY2FuY2VsbGVkKXJldHVybiB0aGlzLl9zZXREYXRhTG9hZGluZyghMCksZj10aGlzLmRhdGFUb0xvYWQuZmlsdGVyKGg9Pgp7aD10aGlzLmdldERhdGFMb2FkTmFtZShoKTtyZXR1cm4hdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoaCl9KS5tYXAoaD0+e2NvbnN0IGs9dGhpcy5nZXREYXRhTG9hZE5hbWUoaCk7dGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURJTkcpO3JldHVybiB0aGlzLnJlcXVlc3REYXRhKGgpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHI9PntyLmNhbmNlbGxlZHx8KHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGssZC5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGgsci52YWx1ZSkpO3JldHVybiBrfSkpfSksUHJvbWlzZS5hbGwoZikudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoaD0+e2lmKCFoLmNhbmNlbGxlZCl7Y29uc3Qgaz1uZXcgU2V0KGgudmFsdWUpO2lmKHRoaXMuZGF0YVRvTG9hZC5zb21lKHI9PmsuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKHIpKSkpdGhpcy5vbkxvYWRGaW5pc2goKX1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLnNvbWUoaz0+Cms9PT1kLkxPQURJTkcpfHx0aGlzLl9zZXREYXRhTG9hZGluZyghMSl9KSwoKT0+e30pLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7Y2FuY2VsbGVkOmh9KT0+e2h8fCh0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwpfSkpfSkpKX19fSkoY2R8fChjZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvcGxvdHRhYmxlLmpzCi8qCiBNSVQKIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIHRoZSBTaWduYXR1cmUgQVBJIHRvIGhlbHAgaW4gY29tcGFyaW5nIHdoZW4gdHdvCiBQbG90dGFibGUgb2JqZWN0cyBoYXZlICJjaGFuZ2VkIi4KCiBNZW1vaXphdGlvbiBpbiBQbG90dGFibGUgaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBzY2FsZXMgYW5kIGRhdGFzZXRzLiBXZSBjYW5ub3Qgc2ltcGx5CiByZWZlcmVuY2UgY29tcGFyZSB0d28gZS5nLiBzY2FsZXMgc2luY2UgaXQgbWF5IGhhdmUgaW50ZXJuYWxseSBtdXRhdGVkLiBUbyByZXNvbHZlIHRoaXMsCiB3ZSB3cml0ZSBhIHJlY3Vyc2l2ZSBTaWduYXR1cmUgaW50ZXJmYWNlIHRoYXQgaG9sZHMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHdoYXRldmVyCiBzdGF0ZSB0aGUgc2NhbGUvZGF0YSB3YXMgaW4gYXQgdGhlIHRpbWUuIFRoZW4gb24gbWVtb2l6ZWQgZnVuY3Rpb24gaW52b2NhdGlvbiB3ZSBzaWduIHRoZQogbmV3IGlucHV0cyBhbmQgY29tcGFyZSB0aGUgc2lnbmF0dXJlcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHJlY29tcHV0ZS4KCiBXZSBtdXN0IGhhbmQtd3JpdGUgYSBzaWduYXR1cmUgZm9yIGVhY2ggY3VzdG9tIGNsYXNzIHdlIHdpc2ggdG8gc3VwcG9ydC4KIE1JVAoKIEBmaWxlb3ZlcnZpZXcgbWFudWFsbHkgYWRkIGQzLXNlbGVjdGlvbi1tdWx0aSB0byBkMyBkZWZhdWx0IGJ1bmRsZS4gTW9zdCBvZiB0aGlzIGNvZGUgaXMKIGNvcGllZCBmcm9tIGQzLXNlbGVjdGlvbi1tdWx0aUAxLjAuMC4KIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2VsZWN0aW9uLW11bHRpL2lzc3Vlcy8xMSBmb3Igd2h5IHdlIGhhdmUgdG8gZG8gdGhpcwogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBjb252ZW5pZW50IHRodW5rIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgY29tbW9uIGNhc2UKIG9mIGNyZWF0aW5nIGEgbWVtb2l6ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdHMgaW5wdXRzIGZyb20gbXV0YWJsZSBjbGFzcyBwcm9wZXJ0aWVzLgogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBmdW5jdGlvbiBtZW1vaXplciB1c2luZyB0aGUgU2lnbmF0dXJlIEFQSS4KIFBsb3R0YWJsZSAzLjcuMCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZSkKIENvcHlyaWdodCAyMDE0LTIwMTcgUGFsYW50aXIgVGVjaG5vbG9naWVzCiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRSkKIGlzLXBsYWluLW9iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtcGxhaW4tb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD4KCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuCiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1kKHJlcXVpcmUoImQzIikpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImQzIl0sZCk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBsb3R0YWJsZT1kKHJlcXVpcmUoImQzIikpOmIuUGxvdHRhYmxlPWQoYi5kMyl9KSh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihkKXtmdW5jdGlvbiBmKGspe2lmKGhba10pcmV0dXJuIGhba10uZXhwb3J0czt2YXIgcj1oW2tdPXtpOmssbDohMSxleHBvcnRzOnt9fTtkW2tdLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLGYpO3IubD0hMDtyZXR1cm4gci5leHBvcnRzfXZhciBoPXt9O2YubT1kO2YuYz1oO2YuaT1mdW5jdGlvbihrKXtyZXR1cm4ga307Zi5kPWZ1bmN0aW9uKGsscixsKXtmLm8oayxyKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGssCnIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpsfSl9O2Yubj1mdW5jdGlvbihrKXt2YXIgcj1rJiZrLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4ga1siZGVmYXVsdCJdfTpmdW5jdGlvbigpe3JldHVybiBrfTtmLmQociwiYSIscik7cmV0dXJuIHJ9O2Yubz1mdW5jdGlvbihrLHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoayxyKX07Zi5wPSIiO3JldHVybiBmKGYucz0xNDApfShbZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ZD1oKDEwNyk7Zi5BcnJheT1kO2Q9aCgxMTApO2YuQ29sb3I9ZDtkPWgoNTUpO2YuRE9NPWQ7ZD1oKDU2KTtmLk1hdGg9ZDtkPWgoMTEzKTtmLk9iamVjdD1kO2Q9aCg1Nyk7Zi5SVHJlZT1kO2Q9aCgxMTUpO2YuU3RhY2tpbmc9ZDtkPWgoMzUpO2YuV2luZG93PWQ7ayhoKDEwOCkpO2soaCgxMDkpKTtrKGgoMTIpKTsKayhoKDExMSkpO2soaCgxMTIpKTtrKGgoNTgpKTtrKGgoMTE2KSl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1ifSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhHLEQsQil7dmFyIEg9RC5hY2Nlc3NvcjtEPUQuc2NhbGU7aWYobnVsbD09RClyZXR1cm5bXTt2YXIgSz1HLmRhdGEoKTtudWxsIT1CJiYoSz1LLmZpbHRlcihmdW5jdGlvbihMLEope3JldHVybiBCKEwsSixHKX0pKTtLPUsubWFwKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEgoTCxKLEcpfSk7cmV0dXJuIEQuZXh0ZW50T2ZWYWx1ZXMoSyl9dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEcsRCl7ZnVuY3Rpb24gQigpe3RoaXMuY29uc3RydWN0b3I9R31mb3IodmFyIEggaW4gRClELmhhc093blByb3BlcnR5KEgpJiYoR1tIXT1EW0hdKTtHLnByb3RvdHlwZT1udWxsPT09RD9PYmplY3QuY3JlYXRlKEQpOihCLnByb3RvdHlwZT1ELnByb3RvdHlwZSxuZXcgQil9LGw9aCgxKSxwPWgoNyk7ZD1oKDQpO3ZhciBtPQpoKDE4KSxuPWgoNikscT1oKDkpLHU9aCgyMCksdz1oKDApLEE9aCgxMikseT1oKDEwKSx4PWgoNTEpLEM9aCg1Mik7Zi5SZW5kZXJlcj15Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO2g9ZnVuY3Rpb24oRyl7ZnVuY3Rpb24gRCgpe3ZhciBCPUcuY2FsbCh0aGlzKXx8dGhpcztCLl9kYXRhQ2hhbmdlZD0hMTtCLl9hdHRyRXh0ZW50cz17fTtCLl9hbmltYXRlPSExO0IuX2FuaW1hdG9ycz17fTtCLl9wcm9wZXJ0eUV4dGVudHM9e307Qi5fcmVzZXRFbnRpdHlTdG9yZT1mdW5jdGlvbigpe0IuX2NhY2hlZEVudGl0eVN0b3JlPXZvaWQgMH07Qi5fb3ZlcmZsb3dIaWRkZW49ITA7Qi5hZGRDbGFzcygicGxvdCIpO0IuX2RhdGFzZXRUb0RyYXdlcj1uZXcgdy5NYXA7Qi5fYXR0ckJpbmRpbmdzPWwubWFwKCk7Qi5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihLLEwpe3JldHVybiBCLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlKEssTCl9O0IuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIucmVuZGVyKCl9OwpCLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBCLl9vbkRhdGFzZXRVcGRhdGUoKX07Qi5fcHJvcGVydHlCaW5kaW5ncz1sLm1hcCgpO3ZhciBIPShuZXcgcC5FYXNpbmcpLm1heFRvdGFsRHVyYXRpb24oRC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5hbmltYXRvcih4LkFuaW1hdG9yLk1BSU4sSCk7Qi5hbmltYXRvcih4LkFuaW1hdG9yLlJFU0VULG5ldyBwLk51bGwpO0IuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT13LldpbmRvdy5kZWJvdW5jZShDLkRlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZLEIuX3Jlc2V0RW50aXR5U3RvcmUpO3JldHVybiBCfXIoRCxHKTtELmdldFRvdGFsRHJhd1RpbWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gSC5yZWR1Y2UoZnVuY3Rpb24oSyxMKXtyZXR1cm4gSytMLmFuaW1hdG9yLnRvdGFsVGltZShCLmxlbmd0aCl9LDApfTtELmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKEIsSCl7cmV0dXJuIEIubWFwKGZ1bmN0aW9uKEspe3ZhciBMPQpLLmF0dHJUb1Byb2plY3RvcixKPXt9O09iamVjdC5rZXlzKEwpLmZvckVhY2goZnVuY3Rpb24oTyl7SltPXT1mdW5jdGlvbihTLE4pe3JldHVybiBMW09dKFMsTixIKX19KTtyZXR1cm57YXR0clRvQXBwbGllZFByb2plY3RvcjpKLGFuaW1hdG9yOksuYW5pbWF0b3J9fSl9O0QucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihCKXtCPUEuY29lcmNlRXh0ZXJuYWxEMyhCKTtHLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLEIpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5faXNTZXR1cHx8KEcucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLAohMCksdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSCl7cmV0dXJuIEIuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldChIKX0pKX07RC5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGU9ZnVuY3Rpb24oKXt2YXIgQj10aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTtCLmVtcHR5KCkmJihCPXRoaXMuZWxlbWVudCgpLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGxvdC1jYW52YXMtY29udGFpbmVyIiwhMCksQi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSkpfTtELnByb3RvdHlwZS5zZXRCb3VuZHM9ZnVuY3Rpb24oQixILEssTCl7Ry5wcm90b3R5cGUuc2V0Qm91bmRzLmNhbGwodGhpcyxCLEgsSyxMKTt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7bnVsbCE9dGhpcy5fY2FudmFzJiYodGhpcy5fYnVmZmVyQ2FudmFzJiYhdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQmJih0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLAp0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiKSksdGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoImhlaWdodCIsdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIpKSwoSz10aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpJiZLLmRyYXdJbWFnZSh0aGlzLl9jYW52YXMubm9kZSgpLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITApLEs9bnVsbCE9d2luZG93LmRldmljZVBpeGVsUmF0aW8/d2luZG93LmRldmljZVBpeGVsUmF0aW86MSx0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLEIqSyksdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIsSCpLKSxMPXRoaXMuX2NhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJihMLnNldFRyYW5zZm9ybShLLDAsMCxLLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzJiZMLmRyYXdJbWFnZSh0aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLDAsMCxCLEgpKX07RC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBCPXRoaXM7CkcucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe3JldHVybiBILm9mZlVwZGF0ZShCLl9yZW5kZXJDYWxsYmFjayl9KTt0aGlzLmRhdGFzZXRzKFtdKX07RC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihCKXtCPXRoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQik7InN2ZyI9PT10aGlzLnJlbmRlcmVyKCk/Qi51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk6Qi51c2VDYW52YXModGhpcy5fY2FudmFzKTtyZXR1cm4gQn07RC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbi5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgcS5TVkdEcmF3ZXIoInBhdGgiLCIiKX0sZnVuY3Rpb24oQil7cmV0dXJuIG5ldyBtLkNhbnZhc0RyYXdlcihCLGZ1bmN0aW9uKCl7fSl9KX07RC5wcm90b3R5cGUuX2dldEFuaW1hdG9yPWZ1bmN0aW9uKEIpe3JldHVybiB0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCk/CnRoaXMuX2FuaW1hdG9yc1tCXXx8bmV3IHAuTnVsbDpuZXcgcC5OdWxsfTtELnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLnJlbmRlckxvd1ByaW9yaXR5KCl9O0QucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oQixILEspe2lmKG51bGw9PUgpcmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7dGhpcy5fYmluZEF0dHIoQixILEspO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24oQixILEssTCl7dmFyIEo9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQik7Sj1udWxsIT1KP0ouc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldChCLHthY2Nlc3NvcjoiZnVuY3Rpb24iPT09dHlwZW9mIEg/SDpmdW5jdGlvbigpe3JldHVybiBIfSxzY2FsZTpLLHBvc3RTY2FsZTpMfSk7Cm51bGwhPUomJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KEosQik7bnVsbCE9SyYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KEssQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fYmluZEF0dHI9ZnVuY3Rpb24oQixILEspe3ZhciBMPXRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7TD1udWxsIT1MP0wuc2NhbGU6bnVsbDt0aGlzLl9hdHRyQmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgSD9IOmZ1bmN0aW9uKCl7cmV0dXJuIEh9LHNjYWxlOkt9KTtudWxsIT1MJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShMLEIpO251bGwhPUsmJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShLLEIpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX07RC5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfTtELnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvciYmKHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpKTtyZXR1cm4gdy5PYmplY3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9O0QucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBCPXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEssTCl7QltMXT1ELl9zY2FsZWRBY2Nlc3NvcihLKX0pO3ZhciBIPXRoaXMuX3Byb3BlcnR5UHJvamVjdG9ycygpO09iamVjdC5rZXlzKEgpLmZvckVhY2goZnVuY3Rpb24oSyl7bnVsbD09QltLXSYmKEJbS109SFtLXSl9KTtyZXR1cm4gQn07RC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtHLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX2lzQW5jaG9yZWQmJih0aGlzLl9wYWludCgpLAp0aGlzLl9kYXRhQ2hhbmdlZD0hMSk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyQ2FsbGJhY2soKX07RC5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24oQil7aWYobnVsbD09QilyZXR1cm4gdGhpcy5fYW5pbWF0ZTt0aGlzLl9hbmltYXRlPUI7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe0cucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NjYWxlcz1mdW5jdGlvbigpe3ZhciBCPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgpe0g9SC5zY2FsZTtudWxsIT1IJiYtMT09PUIuaW5kZXhPZihIKSYmQi5wdXNoKEgpfSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgpe0g9SC5zY2FsZTtudWxsIT1IJiYtMT09PUIuaW5kZXhPZihIKSYmQi5wdXNoKEgpfSk7CnJldHVybiBCfTtELnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cz1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSCl7cmV0dXJuIEguYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcihCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0pfTtELnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07RC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHI9ZnVuY3Rpb24oQil7dmFyIEg9dGhpcztudWxsPT10aGlzLl9hdHRyRXh0ZW50c1tCXSYmKHRoaXMuX2F0dHJFeHRlbnRzW0JdPXUubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gSC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiBILl9hdHRyQmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbihLLEwpe3JldHVybiBudWxsPT1MfHxudWxsPT1MLmFjY2Vzc29yP251bGw6Sy5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIGsoSiwKTCxudWxsKX0pfSkpO3JldHVybiB0aGlzLl9hdHRyRXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQil7dmFyIEg9dGhpcztudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl0mJih0aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBILmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEguX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbigpe3JldHVybiBILl9maWx0ZXJGb3JQcm9wZXJ0eShCKX0sZnVuY3Rpb24oSyxMLEope3JldHVybiBudWxsPT1MfHxudWxsPT1MLmFjY2Vzc29yP251bGw6Sy5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIGsoTyxMLEopfSl9KSk7cmV0dXJuIHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZT1mdW5jdGlvbihCLEgpe3ZhciBLPXRoaXM7aWYoIXRoaXMuX2lzQW5jaG9yZWQmJgohSClyZXR1cm5bXTt2YXIgTD1bXTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihKLE8pe0ouc2NhbGU9PT1CJiYoSj1LLmdldEV4dGVudHNGb3JBdHRyKE8pLG51bGwhPUomJihMPUwuY29uY2F0KGwubWVyZ2UoSikpKSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSixPKXtKLnNjYWxlPT09QiYmKEo9Sy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoTyksbnVsbCE9SiYmKEw9TC5jb25jYXQobC5tZXJnZShKKSkpKX0pO3JldHVybiBMfTtELnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbihCLEgpe2lmKHZvaWQgMD09PUgpcmV0dXJuIHRoaXMuX2FuaW1hdG9yc1tCXTt0aGlzLl9hbmltYXRvcnNbQl09SDtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fY2FudmFzPyJzdmciOiJjYW52YXMifTtELnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX2FkZERhdGFzZXQoQik7CnRoaXMuX29uRGF0YXNldFVwZGF0ZSgpfTtELnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9yZW1vdmVEYXRhc2V0KEIpO3ZhciBIPXRoaXMuX2NyZWF0ZURyYXdlcihCKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuc2V0KEIsSCk7dGhpcy5faXNTZXR1cCYmdGhpcy5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEIpO0Iub25VcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe2lmKC0xPT09dGhpcy5kYXRhc2V0cygpLmluZGV4T2YoQikpcmV0dXJuIHRoaXM7dGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKEIpO0Iub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKEIpOwpyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihCKXt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEIpLnJlbW92ZSgpfTtELnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihCKXt2YXIgSD10aGlzLEs9W107dGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goZnVuY3Rpb24oTCxKKXtyZXR1cm4gSy5wdXNoKEopfSk7aWYobnVsbD09QilyZXR1cm4gSztLLmZvckVhY2goZnVuY3Rpb24oTCl7cmV0dXJuIEguX3JlbW92ZURhdGFzZXQoTCl9KTtCLmZvckVhY2goZnVuY3Rpb24oTCl7cmV0dXJuIEguX2FkZERhdGFzZXQoTCl9KTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IHAuTnVsbH1dfTtELnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe307RC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQil7dmFyIEg9dGhpcyxLPVtdO0IuZm9yRWFjaChmdW5jdGlvbihMLEope3ZhciBPPUguX2RhdGFzZXRUb0RyYXdlci5nZXQoTCksUz0wO0wuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oTixSKXt2YXIgWD1ILl9waXhlbFBvaW50KE4sUixMKTt3Lk1hdGguaXNOYU4oWC54KXx8dy5NYXRoLmlzTmFOKFgueSl8fChLLnB1c2goe2RhdHVtOk4sZ2V0IHBvc2l0aW9uKCl7cmV0dXJuIEguX3BpeGVsUG9pbnQuY2FsbChILE4sUixMKX0saW5kZXg6UixkYXRhc2V0OkwsZGF0YXNldEluZGV4OkosY29tcG9uZW50OkgsZHJhd2VyOk8sdmFsaWREYXR1bUluZGV4OlN9KSxTKyspfSl9KTtyZXR1cm4gS307RC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgQj1uZXcgdy5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSCl7cmV0dXJuIEIuc2V0KEgsCkguZGF0YSgpKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5fcGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3I7dmFyIEg9dGhpcy5fZ2VuZXJhdGVEcmF3U3RlcHMoKSxLPXRoaXMuX2dldERhdGFUb0RyYXcoKSxMPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEIuX2RhdGFzZXRUb0RyYXdlci5nZXQoTyl9KTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSl7dmFyIEo9dGhpcy5fY2FudmFzLm5vZGUoKTtKLmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxKLmNsaWVudFdpZHRoLEouY2xpZW50SGVpZ2h0KTt0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMX10aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihPLFMpe3ZhciBOPUQuYXBwbHlEcmF3U3RlcHMoSCxPKTtMW1NdLmRyYXcoSy5nZXQoTyksTil9KTtKPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEQuZ2V0VG90YWxEcmF3VGltZShLLmdldChPKSwKSCl9KTtKPXcuTWF0aC5tYXgoSiwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQoSil9O0QucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQil7dmFyIEg9dGhpczt2b2lkIDA9PT1CJiYoQj10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBsLnNlbGVjdEFsbCgpO3ZhciBLPVtdO0IuZm9yRWFjaChmdW5jdGlvbihMKXtMPUguX2RhdGFzZXRUb0RyYXdlci5nZXQoTCk7bnVsbCE9TCYmKEw9TC5nZXRWaXN1YWxQcmltaXRpdmVzKCksSy5wdXNoLmFwcGx5KEssTCkpfSk7cmV0dXJuIGwuc2VsZWN0QWxsKEspfTtELnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgSD10aGlzO3JldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZShCKS5lbnRpdGllcygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSC5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KEspfSl9O0QucHJvdG90eXBlLl9nZXRFbnRpdHlTdG9yZT1mdW5jdGlvbihCKXtmdW5jdGlvbiBIKEope3JldHVybiBLLl9lbnRpdHlCb3VuZHMoSil9CnZhciBLPXRoaXM7aWYodm9pZCAwIT09Qil7dmFyIEw9bmV3IHcuRW50aXR5U3RvcmU7TC5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyhCKSxILHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpO3JldHVybiBMfXZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoTD1uZXcgdy5FbnRpdHlTdG9yZSxMLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHRoaXMuZGF0YXNldHMoKSksSCx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKSx0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZT1MKTtyZXR1cm4gdGhpcy5fY2FjaGVkRW50aXR5U3RvcmV9O0QucHJvdG90eXBlLl9sb2NhbE9yaWdpbkJvdW5kcz1mdW5jdGlvbigpe3JldHVybnt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTp0aGlzLmhlaWdodCgpfX19O0QucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQil7Qj10aGlzLl9waXhlbFBvaW50KEIuZGF0dW0sCkIuaW5kZXgsQi5kYXRhc2V0KTtyZXR1cm57eDpCLngseTpCLnksd2lkdGg6MCxoZWlnaHQ6MH19O0QucHJvdG90eXBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHk9ZnVuY3Rpb24oQil7cmV0dXJue2JvdW5kczp0aGlzLl9lbnRpdHlCb3VuZHMoQiksY29tcG9uZW50OkIuY29tcG9uZW50LGRhdGFzZXQ6Qi5kYXRhc2V0LGRhdGFzZXRJbmRleDpCLmRhdGFzZXRJbmRleCxkYXR1bTpCLmRhdHVtLGluZGV4OkIuaW5kZXgscG9zaXRpb246Qi5wb3NpdGlvbixzZWxlY3Rpb246bC5zZWxlY3QoQi5kcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW0IudmFsaWREYXR1bUluZGV4XSl9fTtELnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoInBsb3RzIG11c3QgaW1wbGVtZW50IGVudGl0aWVzQXQiKTt9O0QucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oQil7Qj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3QoQik7CnJldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoQil9O0QucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oQixIKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PUg/e3g6Qi50b3BMZWZ0LngseTpCLnRvcExlZnQueSx3aWR0aDpCLmJvdHRvbVJpZ2h0LngtQi50b3BMZWZ0LngsaGVpZ2h0OkIuYm90dG9tUmlnaHQueS1CLnRvcExlZnQueX06e3g6Qi5taW4seTpILm1pbix3aWR0aDpCLm1heC1CLm1pbixoZWlnaHQ6SC5tYXgtSC5taW59KX07RC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbihCKXt2YXIgSD10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSC5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KEspfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPQpmdW5jdGlvbihCKXt2YXIgSD10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShLKX0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihCKXt2YXIgSD10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWUJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShLKX0pfTtELnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oQil7Qi5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub2ZmVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTsKRC5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9uVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtCLm9uVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTtELnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7cmV0dXJue319O0QuX3NjYWxlZEFjY2Vzc29yPWZ1bmN0aW9uKEIpe3ZhciBIPUIuc2NhbGUsSz1CLmFjY2Vzc29yLEw9Qi5wb3N0U2NhbGUsSj1udWxsPT1IP0s6ZnVuY3Rpb24oTyxTLE4pe3JldHVybiBILnNjYWxlKEsoTyxTLE4pKX07cmV0dXJuIG51bGw9PUw/SjpmdW5jdGlvbihPLFMsTil7cmV0dXJuIEwoSihPLFMsTiksTyxTLE4pfX07RC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19O0QucHJvdG90eXBlLl9hbmltYXRlT25OZXh0UmVuZGVyPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH07cmV0dXJuIER9KGQuQ29tcG9uZW50KTtoLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OPTYwMDtmLlBsb3Q9aH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7Zm9yKHZhciBtIGluIHApZi5oYXNPd25Qcm9wZXJ0eShtKXx8KGZbbV09cFttXSl9ZD1oKDEwNSk7Zi5UaWNrR2VuZXJhdG9ycz1kO2soaCg1NCkpO2soaCgxMDEpKTtrKGgoMTAyKSk7ayhoKDEwMykpO2soaCgxMDQpKTtrKGgoMTA2KSk7dmFyIHI9aCg1NCksbD1oKDExKTtmLmlzVHJhbnNmb3JtYWJsZT1mdW5jdGlvbihwKXtyZXR1cm4gcCBpbnN0YW5jZW9mIGwuUXVhbnRpdGF0aXZlU2NhbGV8fHAgaW5zdGFuY2VvZiByLkNhdGVnb3J5fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSkscj1oKDMwKSxsPWgoMCkscD1oKDEyKTtkPWgoMTApO2YuWEFsaWdubWVudD1kLm1ha2VFbnVtKFsibGVmdCIsImNlbnRlciIsInJpZ2h0Il0pOwpmLllBbGlnbm1lbnQ9ZC5tYWtlRW51bShbInRvcCIsImNlbnRlciIsImJvdHRvbSJdKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbSgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExO3RoaXMuX29yaWdpbj17eDowLHk6MH07dGhpcy5feEFsaWdubWVudD0ibGVmdCI7dGhpcy5feUFsaWdubWVudD0idG9wIjt0aGlzLl9pc0FuY2hvcmVkPXRoaXMuX2lzU2V0dXA9ITE7dGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQ7dGhpcy5fZGVzdHJveWVkPSExO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3RoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1tLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24obil7bj1wLmNvZXJjZUV4dGVybmFsRDMobik7aWYodGhpcy5fZGVzdHJveWVkKXRocm93IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTt0aGlzLmlzUm9vdCgpJiYKKHRoaXMuX3Jvb3RFbGVtZW50PW4sdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NlZCgicGxvdHRhYmxlIiwhMCkpO251bGwhPXRoaXMuX2VsZW1lbnQ/bi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOih0aGlzLl9lbGVtZW50PW4uYXBwZW5kKCJkaXYiKSx0aGlzLl9zZXR1cCgpKTt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKG4pe3RoaXMuX2lzQW5jaG9yZWQmJm4odGhpcyk7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24obil7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24ocSl7bi5fZWxlbWVudC5jbGFzc2VkKHEsCiEwKX0pLHRoaXMuX2Nzc0NsYXNzZXM9bmV3IGwuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fb3ZlcmZsb3dIaWRkZW4/dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIiwhMCk6dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsITApLHRoaXMuX2lzU2V0dXA9ITApfTttLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3JldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW58fG51bGw9PXF8fG51bGw9PXUpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgRXJyb3IoImFuY2hvcigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRlTGF5b3V0KCkiKTtpZihudWxsIT10aGlzLl9yb290RWxlbWVudCluPXt4OjAseTowfSx1PXRoaXMuX3Jvb3RFbGVtZW50Lm5vZGUoKSxxPWwuRE9NLmVsZW1lbnRXaWR0aCh1KSx1PWwuRE9NLmVsZW1lbnRIZWlnaHQodSk7ZWxzZSB0aHJvdyBFcnJvcigibnVsbCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCB0byBjb21wdXRlTGF5b3V0KCkgb24gYSBub24tcm9vdCwgdW5hbmNob3JlZCBub2RlIik7fXZhciB3PXRoaXMuX3NpemVGcm9tT2ZmZXIocSx1KSxBPXcuaGVpZ2h0O3c9dy53aWR0aDt0aGlzLnNldEJvdW5kcyh3LEEsbi54KyhxLXcpKm0uX3hBbGlnblRvUHJvcG9ydGlvblt0aGlzLl94QWxpZ25tZW50XSxuLnkrKHUtQSkqbS5feUFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3lBbGlnbm1lbnRdKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihuLHEsdSx3KXt2b2lkIDA9PT11JiYodT0wKTt2b2lkIDA9PT13JiYodz0wKTt0aGlzLl93aWR0aD1uO3RoaXMuX2hlaWdodD1xO3RoaXMuX29yaWdpbj17eDp1LHk6d307bnVsbCE9dGhpcy5fZWxlbWVudCYmdGhpcy5fZWxlbWVudC5zdHlsZXMoe2xlZnQ6dSsicHgiLGhlaWdodDpxKyJweCIsdG9wOncrInB4Iix3aWR0aDpuKyJweCJ9KTtudWxsIT10aGlzLl9yZXNpemVIYW5kbGVyJiZ0aGlzLl9yZXNpemVIYW5kbGVyKHt3aWR0aDpuLGhlaWdodDpxfSl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5yZXF1ZXN0ZWRTcGFjZShuLHEpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbihuLHUubWluV2lkdGgpOm4saGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihxLHUubWluSGVpZ2h0KTpxfX07bS5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJjA8PXRoaXMud2lkdGgoKSYmMDw9dGhpcy5oZWlnaHQoKSYmci5yZWdpc3RlclRvUmVuZGVyKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O20ucHJvdG90eXBlLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiZyLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpfTttLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbihuKXt0aGlzLl9yZXNpemVIYW5kbGVyPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJih0aGlzLmlzUm9vdCgpP3RoaXMuX3NjaGVkdWxlQ29tcHV0ZUxheW91dCgpOgp0aGlzLnBhcmVudCgpLnJlZHJhdygpKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fTttLnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbihuKXt0aGlzLmRldGFjaCgpO2lmKG51bGwhPW4pe249InN0cmluZyI9PT10eXBlb2Ygbj9rLnNlbGVjdChuKTpuIGluc3RhbmNlb2YgRWxlbWVudD9rLnNlbGVjdChuKTpwLmNvZXJjZUV4dGVybmFsRDMobik7aWYoIW4ubm9kZSgpfHxudWxsPT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIHJlcXVpcmVzIGEgdmFsaWQgRWxlbWVudCB0byByZW5kZXJUbyIpO2lmKCJzdmciPT09bi5ub2RlKCkubm9kZU5hbWUpdGhyb3cgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3Iobil9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiSWYgYSBDb21wb25lbnQgaGFzIG5ldmVyIGJlZW4gcmVuZGVyZWQgYmVmb3JlLCB0aGVuIHJlbmRlclRvIG11c3QgYmUgZ2l2ZW4gYSBub2RlIHRvIHJlbmRlciB0bywgb3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7CnIucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyk7ci5mbHVzaCgpfTttLnByb3RvdHlwZS54QWxpZ25tZW50PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7bj1uLnRvTG93ZXJDYXNlKCk7aWYobnVsbD09bS5feEFsaWduVG9Qcm9wb3J0aW9uW25dKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQ6ICIrbik7dGhpcy5feEFsaWdubWVudD1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnlBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feUFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl95QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl95QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PQpuPyExOm51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5oYXMobik6dGhpcy5fZWxlbWVudC5jbGFzc2VkKG4pfTttLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihuKXtudWxsIT1uJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZChuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobiwhMCkpfTttLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihuKXtudWxsIT1uJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZShuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobiwhMSkpfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITF9O20ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITF9O20ucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMucGFyZW50KG51bGwpO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7dGhpcy5faXNBbmNob3JlZD0KITE7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EZXRhY2g9ZnVuY3Rpb24obil7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEZXRhY2g9ZnVuY3Rpb24obil7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24obil7aWYodm9pZCAwPT09bilyZXR1cm4gdGhpcy5fcGFyZW50O2lmKG51bGwhPT1uJiYhbi5oYXModGhpcykpdGhyb3cgRXJyb3IoIlBhc3NlZCBpbnZhbGlkIHBhcmVudCIpO3RoaXMuX3BhcmVudD1uO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm9yaWdpbigpO3JldHVybnt0b3BMZWZ0Om4sYm90dG9tUmlnaHQ6e3g6bi54K3RoaXMud2lkdGgoKSx5Om4ueSt0aGlzLmhlaWdodCgpfX19O20ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95ZWQ9CiEwO3RoaXMuZGV0YWNoKCl9O20ucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofTttLnByb3RvdHlwZS5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fTttLnByb3RvdHlwZS5vcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLl9vcmlnaW4ueCx5OnRoaXMuX29yaWdpbi55fX07bS5wcm90b3R5cGUub3JpZ2luVG9Sb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXMub3JpZ2luKCkscT10aGlzLnBhcmVudCgpO251bGwhPXE7KXt2YXIgdT1xLm9yaWdpbigpO24ueCs9dS54O24ueSs9dS55O3E9cS5wYXJlbnQoKX1yZXR1cm4gbn07bS5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzOyFuLmlzUm9vdCgpOyluPW4ucGFyZW50KCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmlzUm9vdD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnBhcmVudCgpfTttLnByb3RvdHlwZS5mb3JlZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvcmVncm91bmRDb250YWluZXJ9OwptLnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9O20ucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH07bS5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fTttLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9O3JldHVybiBtfSgpO2QuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfTtkLl95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX07Zi5Db21wb25lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDU5KSk7ayhoKDYyKSk7ayhoKDEzMykpO2soaCgyMSkpO2soaCg2NCkpO2soaCg2NikpfSwKZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIpe3RoaXMuX3N2Z0RyYXdlckZhY3Rvcnk9azt0aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5PXJ9aC5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKGspe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIHI9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO3IuYXR0YWNoVG8oayk7dGhpcy5fY3VycmVudERyYXdlcj1yfTtoLnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnkoay5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9O2gucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfTtoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT0KdGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKX07aC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihrLHIpe3RoaXMuX2N1cnJlbnREcmF3ZXIuZHJhdyhrLHIpfTtoLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpfTtoLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGspe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoayl9O3JldHVybiBofSgpO2YuUHJveHlEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDcwKSk7ayhoKDcxKSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe3ZvaWQgMD09PXAmJihwPTMpO3IocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBtLnRvRml4ZWQocCl9fQpmdW5jdGlvbiByKHApe2lmKDA+cHx8MjA8cCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAiKTtpZihwIT09TWF0aC5mbG9vcihwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKTt9dmFyIGw9aCgxKTtmLmN1cnJlbmN5PWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1wJiYocD0yKTt2b2lkIDA9PT1tJiYobT0iJCIpO3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcT1rKHApO3JldHVybiBmdW5jdGlvbih1KXt2YXIgdz1xKE1hdGguYWJzKHUpKTsiIiE9PXcmJih3PW4/bSt3OncrbSwwPnUmJih3PSItIit3KSk7cmV0dXJuIHd9fTtmLmZpeGVkPWs7Zi5nZW5lcmFsPWZ1bmN0aW9uKCl7dmFyIHA7dm9pZCAwPT09cCYmKHA9Myk7cihwKTtyZXR1cm4gZnVuY3Rpb24obSl7aWYoIm51bWJlciI9PT10eXBlb2YgbSl7dmFyIG49TWF0aC5wb3coMTAscCk7cmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKG0qCm4pL24pfXJldHVybiBTdHJpbmcobSl9fTtmLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBTdHJpbmcocCl9fTtmLnBlcmNlbnRhZ2U9ZnVuY3Rpb24ocCl7dm9pZCAwPT09cCYmKHA9MCk7dmFyIG09ayhwKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHE9bi50b1N0cmluZygpO3E9TWF0aC5wb3coMTAscS5sZW5ndGgtKHEuaW5kZXhPZigiLiIpKzEpKTtyZXR1cm4gbShwYXJzZUludCgoMTAwKm4qcSkudG9TdHJpbmcoKSwxMCkvcSkrIiUifX07Zi5zaVN1ZmZpeD1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0zKTtyKHApO3JldHVybiBmdW5jdGlvbihtKXtyZXR1cm4gbC5mb3JtYXQoIi4iK3ArInMiKShtKX19O2Yuc2hvcnRTY2FsZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0zKTtyKHApO3ZhciBtPWwuZm9ybWF0KCIuIitwKyJlIiksbj1sLmZvcm1hdCgiLiIrcCsiZiIpLHE9TWF0aC5wb3coMTAsMTgpLHU9TWF0aC5wb3coMTAsLXApOwpyZXR1cm4gZnVuY3Rpb24odyl7dmFyIEE9TWF0aC5hYnModyk7aWYoKEE8dXx8QT49cSkmJjAhPT1BKXJldHVybiBtKHcpO2Zvcih2YXIgeT0tMTtBPj1NYXRoLnBvdygxRTMseSsyKSYmND55Oyl5Kys7QT0tMT09PXk/bih3KTpuKHcvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV07aWYoMDx3JiYiMTAwMCI9PT1BLnN1YnN0cigwLDQpfHwwPncmJiItMTAwMCI9PT1BLnN1YnN0cigwLDUpKTQ+eT8oeSsrLEE9bih3L01hdGgucG93KDFFMyx5KzEpKSsiS01CVFEiW3ldKTpBPW0odyk7cmV0dXJuIEF9fTtmLm11bHRpVGltZT1mdW5jdGlvbigpe3ZhciBwPVt7c3BlY2lmaWVyOiIuJUwiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0TWlsbGlzZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiI6JVMiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0U2Vjb25kcygpfX0se3NwZWNpZmllcjoiJUk6JU0iLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PQptLmdldE1pbnV0ZXMoKX19LHtzcGVjaWZpZXI6IiVJICVwIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldEhvdXJzKCl9fSx7c3BlY2lmaWVyOiIlYSAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXREYXkoKSYmMSE9PW0uZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIgJWQiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMSE9PW0uZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0TW9udGgoKX19XTtyZXR1cm4gZnVuY3Rpb24obSl7dmFyIG49cC5maWx0ZXIoZnVuY3Rpb24ocSl7cmV0dXJuIHEucHJlZGljYXRlKG0pfSk7cmV0dXJuIGwudGltZUZvcm1hdCgwPG4ubGVuZ3RoP25bMF0uc3BlY2lmaWVyOiIlWSIpKG0pfX07Zi50aW1lPWZ1bmN0aW9uKHApe3JldHVybiBsLnRpbWVGb3JtYXQocCl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSxyPWgoMCk7CmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSl7dGhpcy5fcm9vdD1rLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKTt0aGlzLl9jbGFzc05hbWU9bTt0aGlzLl9zdmdFbGVtZW50TmFtZT1wfWwucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3RoaXMuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cyhwKTt2YXIgcT0wO20uZm9yRWFjaChmdW5jdGlvbih1KXtyLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIG4uX2RyYXdTdGVwKHUpfSxxKTtxKz11LmFuaW1hdG9yLnRvdGFsVGltZShwLmxlbmd0aCl9KX07bC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlcyYmKHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz10aGlzLl9zZWxlY3Rpb24ubm9kZXMoKSk7cmV0dXJuIHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlc307CmwucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW3BdfTtsLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yb290LnJlbW92ZSgpfTtsLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihwKXtwLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9yb290Lm5vZGUoKSl9O2wucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH07bC5wcm90b3R5cGUuc2VsZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRWxlbWVudE5hbWV9O2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7fTtsLnByb3RvdHlwZS5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzPWZ1bmN0aW9uKHApe3A9cC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPW19KTtwPXRoaXMuX3Jvb3Quc2VsZWN0QWxsKHRoaXMuc2VsZWN0b3IoKSkuZGF0YShwKTsKdGhpcy5fc2VsZWN0aW9uPXAuZW50ZXIoKS5hcHBlbmQodGhpcy5fc3ZnRWxlbWVudE5hbWUpLm1lcmdlKHApO3AuZXhpdCgpLnJlbW92ZSgpO3RoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz1udWxsO251bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKTt0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbil9O2wucHJvdG90eXBlLl9kcmF3U3RlcD1mdW5jdGlvbihwKXt2YXIgbT10aGlzO1siZmlsbCIsInN0cm9rZSJdLmZvckVhY2goZnVuY3Rpb24obil7bnVsbCE9cC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dJiZtLl9zZWxlY3Rpb24uYXR0cihuLHAuYXR0clRvQXBwbGllZFByb2plY3RvcltuXSl9KTtwLmFuaW1hdG9yLmFuaW1hdGUodGhpcy5fc2VsZWN0aW9uLHAuYXR0clRvQXBwbGllZFByb2plY3Rvcik7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsCiEwKX07cmV0dXJuIGx9KCk7Zi5TVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmKXtmLm1ha2VFbnVtPWZ1bmN0aW9uKGgpe3JldHVybiBoLnJlZHVjZShmdW5jdGlvbihrLHIpe2tbcl09cjtyZXR1cm4ga30se30pfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihtLG4pe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW19Zm9yKHZhciB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG1bdV09blt1XSk7bS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHEpfSxyPWgoMSksbD1oKDI2KSxwPWgoMCk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKCl7dmFyIHE9bS5jYWxsKHRoaXMpfHx0aGlzO3EuX3RpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odSl7cmV0dXJuIHUuZGVmYXVsdFRpY2tzKCl9O3EuX3BhZFByb3BvcnRpb249LjA1O3EuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD0KITA7cS5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnM9bmV3IHAuU2V0O3JldHVybiBxfWsobixtKTtuLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dGhpcy5fZG9tYWluTWF4PXRoaXMuX2RvbWFpbk1pbj1udWxsO20ucHJvdG90eXBlLmF1dG9Eb21haW4uY2FsbCh0aGlzKX07bi5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGU9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLl9kb21haW5NaW4mJm51bGwhPXRoaXMuX2RvbWFpbk1heCl0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NYXhdKTtlbHNle3ZhciBxPXRoaXMuX2dldEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbj8ocT1xWzFdLHRoaXMuX2RvbWFpbk1pbj49cSYmKHE9dGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NaW5dKVsxXSksdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4scV0pKToKbnVsbCE9dGhpcy5fZG9tYWluTWF4PyhxPXFbMF0sdGhpcy5fZG9tYWluTWF4PD1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWF4LHRoaXMuX2RvbWFpbk1heF0pWzBdKSx0aGlzLl9zZXREb21haW4oW3EsdGhpcy5fZG9tYWluTWF4XSkpOm0ucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlLmNhbGwodGhpcyl9fTtuLnByb3RvdHlwZS5fZ2V0VW5ib3VuZGVkRXh0ZW50PWZ1bmN0aW9uKHEpe3ZvaWQgMD09PXEmJihxPSExKTtxPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHEpO3ZhciB1PXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09cS5sZW5ndGgmJihxPVtwLk1hdGgubWluKHEsdVswXSkscC5NYXRoLm1heChxLHVbMV0pXSx1PXRoaXMuX3BhZERvbWFpbihxKSk7cmV0dXJuIHV9O24ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoKTtudWxsIT10aGlzLl9kb21haW5NaW4mJgoocVswXT10aGlzLl9kb21haW5NaW4pO251bGwhPXRoaXMuX2RvbWFpbk1heCYmKHFbMV09dGhpcy5fZG9tYWluTWF4KTtyZXR1cm4gcX07bi5wcm90b3R5cGUuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcj1mdW5jdGlvbihxKXt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5hZGQocSk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTtuLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmRlbGV0ZShxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnBhZFByb3BvcnRpb249ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fcGFkUHJvcG9ydGlvbjtpZigwPnEpdGhyb3cgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTt0aGlzLl9wYWRQcm9wb3J0aW9uPXE7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwpyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX3BhZERvbWFpbj1mdW5jdGlvbihxKXt2YXIgdT10aGlzO2lmKHFbMF0udmFsdWVPZigpPT09cVsxXS52YWx1ZU9mKCkpcmV0dXJuIHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKHEpO2lmKDA9PT10aGlzLl9wYWRQcm9wb3J0aW9uKXJldHVybiBxO3ZhciB3PXRoaXMuX3BhZFByb3BvcnRpb24vMixBPXFbMF0seT1xWzFdLHg9ITEsQz0hMTt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKEQpe0QodSkuZm9yRWFjaChmdW5jdGlvbihCKXtCLnZhbHVlT2YoKT09PUEudmFsdWVPZigpJiYoeD0hMCk7Qi52YWx1ZU9mKCk9PT15LnZhbHVlT2YoKSYmKEM9ITApfSl9KTt2YXIgRz10aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ocSk7cT14P0E6dGhpcy5pbnZlcnQodGhpcy5zY2FsZShBKS0odGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp3KTt3PUM/Cnk6dGhpcy5pbnZlcnQodGhpcy5zY2FsZSh5KSsodGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp3KTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oRyk7cmV0dXJuIHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD90aGlzLl9uaWNlRG9tYWluKFtxLHddKTpbcSx3XX07bi5wcm90b3R5cGUuc25hcHBpbmdEb21haW5FbmFibGVkPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9cSx0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCkpfTtuLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKTt9O24ucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihxKXtudWxsIT1xJiYodGhpcy5fZG9tYWluTWluPXFbMF0sdGhpcy5fZG9tYWluTWF4PXFbMV0pOwpyZXR1cm4gbS5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxxKX07bi5wcm90b3R5cGUuZG9tYWluTWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuZG9tYWluKClbMF07dGhpcy5fZG9tYWluTWluPXE7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5kb21haW5NYXg9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVsxXTt0aGlzLl9kb21haW5NYXg9cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHEpe3E9ci5leHRlbnQocS5maWx0ZXIoZnVuY3Rpb24odSl7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKCt1KX0pKTtyZXR1cm4gbnVsbD09cVswXXx8bnVsbD09cVsxXT9bXTpxfTtuLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHEsdSl7dmFyIHc9dGhpczt0aGlzLmRvbWFpbih0aGlzLnJhbmdlKCkubWFwKGZ1bmN0aW9uKEEpe3JldHVybiB3LmludmVydChsLnpvb21PdXQoQSwKcSx1KSl9KSl9O24ucHJvdG90eXBlLnBhbj1mdW5jdGlvbihxKXt2YXIgdT10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHUuaW52ZXJ0KHcrcSl9KSl9O24ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGVUcmFuc2Zvcm1hdGlvbiIpO307bi5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnRlZFRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCIpO307bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKTsKfTtuLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpO307bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHcpe3JldHVybiBwLk1hdGguaXNOYU4odyl8fEluZmluaXR5PT09d3x8LUluZmluaXR5PT09d311KHFbMF0pfHx1KHFbMV0pP3AuV2luZG93Lndhcm4oIldhcm5pbmc6IFF1YW50aXRhdGl2ZVNjYWxlcyBjYW5ub3QgdGFrZSBOYU4gb3IgSW5maW5pdHkgYXMgYSBkb21haW4gdmFsdWUuIElnbm9yaW5nLiIpOm0ucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERlZmF1bHRUaWNrcyIpO307bi5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0dlbmVyYXRvcih0aGlzKX07Cm4ucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9uaWNlRG9tYWluIik7fTtuLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZGVmYXVsdEV4dGVudCIpO307bi5wcm90b3R5cGUudGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBxPVBsb3R0YWJsZS5TY2FsZXMuVGlja0dlbmVyYXRvcnMuaW50ZWdlclRpY2tHZW5lcmF0b3IoKTtudWxsIT1xJiYodGhpcy5fdGlja0dlbmVyYXRvcj1xKX07cmV0dXJuIG59KGgoMTcpLlNjYWxlKTtkLl9ERUZBVUxUX05VTV9USUNLUz0xMDtmLlF1YW50aXRhdGl2ZVNjYWxlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpO2YuY29lcmNlRXh0ZXJuYWxEMz1mdW5jdGlvbihyKXtpZihudWxsPT1yLmF0dHJzKXtpZihudWxsPT1yLm5vZGVzKXt2YXIgbD1bXTtyLmVhY2goZnVuY3Rpb24oKXtsLnB1c2godGhpcyl9KTsKcmV0dXJuIGsuc2VsZWN0QWxsKGwpfXJldHVybiBrLnNlbGVjdEFsbChyLm5vZGVzKCkpfXJldHVybiByfX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDgzKSk7ayhoKDg0KSk7ayhoKDg1KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCg0NCkpO2soaCg0NSkpO2soaCg0NikpO2soaCgxOCkpO2soaCg2KSk7ayhoKDMzKSk7ayhoKDM0KSk7ayhoKDQ3KSk7ayhoKDkpKTtrKGgoNDgpKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3ZhciBrPXRoaXM7dGhpcy5fYW5jaG9yQ2FsbGJhY2s9ZnVuY3Rpb24ocil7cmV0dXJuIGsuX2FuY2hvcihyKX07dGhpcy5fZW5hYmxlZD0hMH1oLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihrKXt0aGlzLl9kaXNjb25uZWN0KCk7CnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG89azt0aGlzLl9jb25uZWN0KCk7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRldGFjaEZyb209ZnVuY3Rpb24oKXt0aGlzLmRldGFjaCgpfTtoLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9kaXNjb25uZWN0KCk7dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1udWxsO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9ayk/dGhpcy5fY29ubmVjdCgpOnRoaXMuX2Rpc2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITB9O2gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITF9O2gucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlPWZ1bmN0aW9uKGspe3ZhciByPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7CnJldHVybnt4OmsueC1yLngseTprLnktci55fX07aC5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PWZ1bmN0aW9uKGspe3JldHVybiAwPD1rLngmJjA8PWsueSYmay54PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJmsueTw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX07aC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZWQoKSYmbnVsbCE9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyYmIXRoaXMuX2lzQW5jaG9yZWQpdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vbkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O2gucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fdW5hbmNob3IoKTtudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiZ0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O3JldHVybiBofSgpOwpmLkludGVyYWN0aW9uPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgdyBpbiBxKXEuaGFzT3duUHJvcGVydHkodykmJihuW3ddPXFbd10pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0scj1oKDMpLGw9aCgwKSxwPWgoNTIpLG09aCgyKTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTt1Ll9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExO3UuX2RlZmVycmVkUmVuZGVyaW5nPSExO3UuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm09ZnVuY3Rpb24odyxBLHkseCl7dS5faXNBbmNob3JlZCYmKG51bGwhPXUuX3JlbmRlckFyZWEmJnUuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwKInRyYW5zbGF0ZSgiK3crIiwgIitBKyIpIHNjYWxlKCIreSsiLCAiK3grIikiKSxudWxsIT11Ll9jYW52YXMmJnUuX2NhbnZhcy5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdysicHgsICIrQSsicHgpIHNjYWxlKCIreSsiLCAiK3grIikiKSl9O3UuYWRkQ2xhc3MoInh5LXBsb3QiKTt1Ll9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCl9O3UuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKX07dS5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtpZih1LmRlZmVycmVkUmVuZGVyaW5nKCkpe3ZhciB3PXUueCgpJiZ1LngoKS5zY2FsZSxBPXUueSgpJiZ1LnkoKS5zY2FsZTt1Ll9kZWZlcnJlZFJlbmRlcmVyLnVwZGF0ZURvbWFpbnModyxBKX1lbHNlIHUucmVuZGVyKCl9Owp1Ll9kZWZlcnJlZFJlbmRlcmVyPW5ldyBwLkRlZmVycmVkUmVuZGVyZXIoZnVuY3Rpb24oKXtyZXR1cm4gdS5yZW5kZXIoKX0sdS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybSk7cmV0dXJuIHV9ayhxLG4pO3EucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZGVmZXJyZWRSZW5kZXJpbmcoKSYmdGhpcy5fZGVmZXJyZWRSZW5kZXJlci5yZXNldFRyYW5zZm9ybXMoKTtyZXR1cm4gbi5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyl9O3EucHJvdG90eXBlLmRlZmVycmVkUmVuZGVyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nfTtxLnByb3RvdHlwZS54PWZ1bmN0aW9uKHUsdyxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9YX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1hfS0VZLHUsdyxBKTt1PXRoaXMud2lkdGgoKTtudWxsIT13JiZudWxsIT11JiZ3LnJhbmdlKFswLHVdKTsKdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUueT1mdW5jdGlvbih1LHcsQSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQocS5fWV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShxLl9ZX0tFWSx1LHcsQSk7dT10aGlzLmhlaWdodCgpO251bGwhPXcmJm51bGwhPXUmJih3IGluc3RhbmNlb2Ygci5DYXRlZ29yeT93LnJhbmdlKFswLHVdKTp3LnJhbmdlKFt1LDBdKSk7dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKHUpe3JldHVybiJ4Ij09PXUmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/dGhpcy5fbWFrZUZpbHRlckJ5UHJvcGVydHkoInkiKToKInkiPT09dSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieCIpOm51bGx9O3EucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eT1mdW5jdGlvbih1KXt1PXRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHUpO2lmKG51bGwhPXUpe3ZhciB3PXUuYWNjZXNzb3IsQT11LnNjYWxlO2lmKG51bGwhPUEpcmV0dXJuIGZ1bmN0aW9uKHkseCxDKXt2YXIgRz1BLnJhbmdlKCk7cmV0dXJuIGwuTWF0aC5pblJhbmdlKEEuc2NhbGUodyh5LHgsQykpLEdbMF0sR1sxXSl9fXJldHVybiBudWxsfTtxLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx3KXtuLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLHUsdyk7dS5vZmZVcGRhdGUodz09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9OwpxLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKHUsdyl7bi5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx3KTt1Lm9uVXBkYXRlKHc9PT1xLl9YX0tFWT90aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrOnRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayk7dGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZT1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPwoieCI6dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj8ieSI6Im5vbmUiO3N3aXRjaCh1KXtjYXNlICJ4Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSEwO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTticmVhaztjYXNlICJ5Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITA7dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKTticmVhaztjYXNlICJub25lIjp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPXRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiSW52YWxpZCBzY2FsZSBuYW1lICciK3UrIicsIG11c3QgYmUgJ3gnLCAneScgb3IgJ25vbmUnIik7fXJldHVybiB0aGlzfTtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHUsdyxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcywKdSx3LEEpO3U9KHU9dGhpcy54KCkpJiZ1LnNjYWxlO251bGwhPXUmJnUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk7dT0odT10aGlzLnkoKSkmJnUuc2NhbGU7bnVsbCE9dSYmKHUgaW5zdGFuY2VvZiByLkNhdGVnb3J5P3UucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pOnUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbj1mdW5jdGlvbigpe3ZhciB1PXRoaXMueCgpLnNjYWxlO251bGwhPXUmJnUuYXV0b0RvbWFpbigpfTtxLnByb3RvdHlwZS5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy55KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLnNob3dBbGxEYXRhPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVg9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCl9O3EucHJvdG90eXBlLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWT1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX3Byb2plY3RvcnNSZWFkeT1mdW5jdGlvbigpe3ZhciB1PXRoaXMueCgpLHc9dGhpcy55KCk7cmV0dXJuIG51bGwhPXUmJm51bGwhPXUuYWNjZXNzb3ImJm51bGwhPXcmJm51bGwhPXcuYWNjZXNzb3J9O3EucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHUsdyxBKXt2YXIgeT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx4PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwpyZXR1cm57eDp5KHUsdyxBKSx5OngodSx3LEEpfX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KHkseCxDKXt2YXIgRz1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHcueCgpKSh5LHgsQyk7eT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHcueSgpKSh5LHgsQyk7cmV0dXJuIGwuTWF0aC5pc1ZhbGlkTnVtYmVyKEcpJiZsLk1hdGguaXNWYWxpZE51bWJlcih5KX12YXIgdz10aGlzLEE9bi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbih5KXtBLnNldCh5LEEuZ2V0KHkpLmZpbHRlcihmdW5jdGlvbih4LEMpe3JldHVybiB1KHgsQyx5KX0pKX0pO3JldHVybiBBfTtyZXR1cm4gcX0obS5QbG90KTtkLl9YX0tFWT0ieCI7ZC5fWV9LRVk9InkiO2YuWFlQbG90PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9CiEwO3RoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITE7dGhpcy5fdXBkYXRlSWQ9MDt0aGlzLl9jYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnM9bmV3IGsuU2V0fXIucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3IucHJvdG90eXBlLl9nZXRBbGxJbmNsdWRlZFZhbHVlcz1mdW5jdGlvbihsKXt2YXIgcD10aGlzO3ZvaWQgMD09PWwmJihsPSExKTt2YXIgbT1bXTt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe249bihwLGwpO209bS5jb25jYXQobil9KTtyZXR1cm4gbX07ci5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybltdfTtyLnByb3RvdHlwZS5vblVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuYWRkKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShsKTsKcmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKys7dGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9O3IucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMDt0aGlzLl9zZXREb21haW4odGhpcy5fZ2V0RXh0ZW50KCkpfTtyLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5JiZ0aGlzLmF1dG9Eb21haW4oKX07ci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGUiKTt9O3IucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O3IucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9nZXREb21haW4oKTsKdGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITE7dGhpcy5fc2V0RG9tYWluKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9nZXREb21haW4iKTt9O3IucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obCl7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzc3x8KHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITAsdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKGwpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSl9O3IucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKTt9O3IucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldFJhbmdlKCk7CnRoaXMuX3NldFJhbmdlKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldFJhbmdlIik7fTtyLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX3NldFJhbmdlIik7fTtyLnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKGwpe3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmFkZChsKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07ci5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9OwpyZXR1cm4gcn0oKTtmLlNjYWxlPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHEsdSx3LEEpe2Zvcih2YXIgeT17fSx4PTA7eDx1Lmxlbmd0aDt4Kyspe3ZhciBDPXVbeF07cS5oYXNPd25Qcm9wZXJ0eShDKSYmKHlbQ109cVtDXSh3LEEpKX1yZXR1cm4geX1mdW5jdGlvbiByKHEpe3JldHVybihudWxsIT1xWyJzdHJva2Utb3BhY2l0eSJdP3BhcnNlRmxvYXQocVsic3Ryb2tlLW9wYWNpdHkiXSk6MSkqKG51bGwhPXEub3BhY2l0eT9wYXJzZUZsb2F0KHEub3BhY2l0eSk6MSl9ZnVuY3Rpb24gbChxKXtyZXR1cm4obnVsbCE9cVsiZmlsbC1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJmaWxsLW9wYWNpdHkiXSk6MSkqKG51bGwhPXEub3BhY2l0eT9wYXJzZUZsb2F0KHEub3BhY2l0eSk6MSl9ZnVuY3Rpb24gcChxKXtyZXR1cm4gbnVsbCE9cVsic3Ryb2tlLXdpZHRoIl0/cGFyc2VGbG9hdChxWyJzdHJva2Utd2lkdGgiXSk6MX1mdW5jdGlvbiBtKHEsdSl7aWYodS5zdHJva2Upe3EubGluZVdpZHRoPQpwKHUpO3ZhciB3PW4uY29sb3IodS5zdHJva2UpO3cub3BhY2l0eSo9cih1KTtxLnN0cm9rZVN0eWxlPXcudG9TdHJpbmcoKTtxLnN0cm9rZSgpfXUuZmlsbCYmKHc9bi5jb2xvcih1LmZpbGwpLHcub3BhY2l0eSo9bCh1KSxxLmZpbGxTdHlsZT13LnRvU3RyaW5nKCkscS5maWxsKCkpfXZhciBuPWgoMSk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHEodSx3KXt0aGlzLl9jb250ZXh0PXU7dGhpcy5fZHJhd1N0ZXA9d31xLnByb3RvdHlwZS5nZXREcmF3U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmF3U3RlcH07cS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih1LHcpe3c9d1t3Lmxlbmd0aC0xXS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yO3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsdSx3KTt0aGlzLl9jb250ZXh0LnJlc3RvcmUoKX07cS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybltdfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PQpmdW5jdGlvbigpe3JldHVybiBudWxsfTtxLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3JldHVybiBxfSgpO2YuQ2FudmFzRHJhd2VyPWQ7Zi5Db250ZXh0U3R5bGVBdHRycz0iZmlsbC1vcGFjaXR5IGZpbGwgb3BhY2l0eSBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggc3Ryb2tlIi5zcGxpdCgiICIpO2YucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzPWZ1bmN0aW9uKHEsdSx3LEEpe3JldHVybiBrKHEsZi5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQodSksdyxBKX07Zi5yZXNvbHZlQXR0cmlidXRlcz1rO2YuZ2V0U3Ryb2tlV2lkdGg9cDtmLnJlbmRlckFyZWE9ZnVuY3Rpb24ocSx1LHcsQSl7cS5zYXZlKCk7cS5iZWdpblBhdGgoKTt1LmNvbnRleHQocSk7dSh3KTtxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlckxpbmU9ZnVuY3Rpb24ocSx1LHcsQSl7cS5zYXZlKCk7cS5iZWdpblBhdGgoKTt1LmNvbnRleHQocSk7dSh3KTsKcS5saW5lSm9pbj0icm91bmQiO20ocSxBKTtxLnJlc3RvcmUoKX07Zi5yZW5kZXJQYXRoV2l0aFN0eWxlPW19LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCg1MCkpO2soaCgyNykpO2soaCg1MSkpO2soaCg5MykpO2soaCg1MykpO2soaCg5NCkpO2soaCg5NSkpO2soaCg5NikpO2soaCg5NykpO2soaCg5OCkpO2soaCg5OSkpO2soaCgxMDApKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDkyKSk7ayhoKDkxKSk7ZD1oKDQ5KTtmLnNpZ249ZC5zaWdufSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhyKXtmb3IodmFyIGwgaW4gcilmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT1yW2xdKX1rKGgoMTM0KSk7ayhoKDEzNSkpO2soaCgxMzYpKTtrKGgoMTM3KSl9LGZ1bmN0aW9uKGQsCmYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHcgaW4gcSlxLmhhc093blByb3BlcnR5KHcpJiYoblt3XT1xW3ddKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHI9aCgxKSxsPWgoNSk7ZD1oKDQpO3ZhciBwPWgoOCksbT1oKDApO2g9aCgxMCk7Zi5BeGlzT3JpZW50YXRpb249aC5tYWtlRW51bShbImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInRvcCJdKTtoPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEodSx3KXt2YXIgQT1uLmNhbGwodGhpcyl8fHRoaXM7QS5fZW5kVGlja0xlbmd0aD01O0EuX2lubmVyVGlja0xlbmd0aD01O0EuX3RpY2tMYWJlbFBhZGRpbmc9MTA7QS5fbWFyZ2luPTE1O0EuX3Nob3dFbmRUaWNrTGFiZWxzPSExO0EuX2Fubm90YXRpb25zRW5hYmxlZD0hMTtBLl9hbm5vdGF0aW9uVGllckNvdW50PQoxO2lmKG51bGw9PXV8fG51bGw9PXcpdGhyb3cgRXJyb3IoIkF4aXMgcmVxdWlyZXMgYSBzY2FsZSBhbmQgb3JpZW50YXRpb24iKTtBLl9zY2FsZT11O0Eub3JpZW50YXRpb24odyk7QS5fc2V0RGVmYXVsdEFsaWdubWVudCgpO0EuYWRkQ2xhc3MoImF4aXMiKTtBLmlzSG9yaXpvbnRhbCgpP0EuYWRkQ2xhc3MoIngtYXhpcyIpOkEuYWRkQ2xhc3MoInktYXhpcyIpO0EuZm9ybWF0dGVyKHAuaWRlbnRpdHkoKSk7QS5fcmVzY2FsZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEEuX3Jlc2NhbGUoKX07QS5fc2NhbGUub25VcGRhdGUoQS5fcmVzY2FsZUNhbGxiYWNrKTtBLl9hbm5vdGF0ZWRUaWNrcz1bXTtBLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXAuaWRlbnRpdHkoKTtyZXR1cm4gQX1rKHEsbik7cS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVzY2FsZUNhbGxiYWNrKX07CnEucHJvdG90eXBlLnRpY2tMYWJlbERhdGFPbkVsZW1lbnQ9ZnVuY3Rpb24odSl7aWYobnVsbCE9dSl7Zm9yKHZhciB3O251bGwhPXUmJnUuY2xhc3NMaXN0JiZ2b2lkIDA9PT13Oyl1LmNsYXNzTGlzdC5jb250YWlucyhxLlRJQ0tfTEFCRUxfQ0xBU1MpP3c9dTp1PXUucGFyZW50Tm9kZTtyZXR1cm4gdm9pZCAwPT09dT92b2lkIDA6ci5zZWxlY3QodSkuZGF0dW0oKX19O3EucHJvdG90eXBlLl9jb21wdXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciB1PTAsdz0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2lmKHc9dGhpcy5fY29tcHV0ZUhlaWdodCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQT0KdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMipxLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc7dys9QSp0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKX19ZWxzZSB1PXRoaXMuX2NvbXB1dGVXaWR0aCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpJiYoQT10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyx1Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKTtyZXR1cm57bWluV2lkdGg6dSxtaW5IZWlnaHQ6d319O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCl9O3EucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuX3Jlc2NhbGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfTtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbih1LHcsQSl7bi5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdSx3LEEpO3RoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5fc2NhbGUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih1LHcpe3ZhciBBPXRoaXMucmVxdWVzdGVkU3BhY2UodSx3KTtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT97d2lkdGg6dSxoZWlnaHQ6QS5taW5IZWlnaHR9OntoZWlnaHQ6dyx3aWR0aDpBLm1pbldpZHRofX07cS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGlja01hcmtDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lcj0KdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKTt0aGlzLl9iYXNlbGluZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tbGluZS1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tY2lyY2xlLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIsITApO3ZhciB1PXRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiLAohMCk7dT1uZXcgbC5TdmdDb250ZXh0KHUubm9kZSgpKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih1KTt0aGlzLl9hbm5vdGF0aW9uV3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIsdSl9O3EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHc9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitxLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh1KSxBPXcuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh3KTtBLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpKTtyLnNlbGVjdChBLm5vZGVzKClbMF0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTsKci5zZWxlY3QoQS5ub2RlcygpW3UubGVuZ3RoLTFdKS5jbGFzc2VkKHEuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSk7dy5leGl0KCkucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUuYXR0cnModGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCkpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5ub3RhdGVkVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGVkVGlja3N9O3EucHJvdG90eXBlLmFubm90YXRpb25Gb3JtYXR0ZXI9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcjt0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXU7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbnNFbmFibGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWR9O3EucHJvdG90eXBlLmFubm90YXRpb25UaWVyQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudH07cS5wcm90b3R5cGUuX2RyYXdBbm5vdGF0aW9ucz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoZmEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiB5KGZhKTtjYXNlICJ0b3AiOmNhc2UgImxlZnQiOnJldHVybiB5KGZhKS1ELmdldChmYSkuaGVpZ2h0fX1mdW5jdGlvbiB3KGZhKXtyZXR1cm4gTC5oYXMoZmEpPyJoaWRkZW4iOiJ2aXNpYmxlIn1mdW5jdGlvbiBBKGZhKXtyZXR1cm4gQy5fc2NhbGUuc2NhbGUoZmEpfWZ1bmN0aW9uIHkoZmEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiBLLmdldChmYSkqSCtPO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIEotCk8tSy5nZXQoZmEpKkh9fWZ1bmN0aW9uIHgoZmEsb2EsWil7ZmE9ZmEuc2VsZWN0QWxsKCIuIitaKS5kYXRhKEIpO29hPWZhLmVudGVyKCkuYXBwZW5kKG9hKS5jbGFzc2VkKFosITApLm1lcmdlKGZhKTtmYS5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIG9hfXZhciBDPXRoaXMsRz1xLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcsRD1uZXcgbS5NYXAsQj10aGlzLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyKCk7Qi5mb3JFYWNoKGZ1bmN0aW9uKGZhKXt2YXIgb2E9Qy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoQy5hbm5vdGF0aW9uRm9ybWF0dGVyKCkoZmEpKTtELnNldChmYSx7d2lkdGg6b2Eud2lkdGgrMipHLGhlaWdodDpvYS5oZWlnaHQrMipHfSl9KTt2YXIgSD10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKkcsSz10aGlzLl9hbm5vdGF0aW9uVG9UaWVyKEQpLEw9bmV3IG0uU2V0LEo9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOgp0aGlzLndpZHRoKCksTz10aGlzLl9jb3JlU2l6ZSgpLFM9TWF0aC5taW4odGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCksTWF0aC5mbG9vcigoSi1PKS9IKSk7Sy5mb3JFYWNoKGZ1bmN0aW9uKGZhLG9hKXsoLTE9PT1mYXx8ZmE+PVMpJiZMLmFkZChvYSl9KTtzd2l0Y2godGhpcy5vcmllbnRhdGlvbigpKXtjYXNlICJib3R0b20iOmNhc2UgInJpZ2h0Ijp2YXIgTj0wO2JyZWFrO2Nhc2UgInRvcCI6Tj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOk49dGhpcy53aWR0aCgpfXZhciBSPXRoaXMuaXNIb3Jpem9udGFsKCk7eCh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGluZS1jb250YWluZXIiKSwibGluZSIscS5BTk5PVEFUSU9OX0xJTkVfQ0xBU1MpLmF0dHJzKHt4MTpSP0E6Tix4MjpSP0E6eSx5MTpSP046QSx5MjpSP3k6QSx2aXNpYmlsaXR5Ond9KTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiksCiJjaXJjbGUiLHEuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1MpLmF0dHJzKHtjeDpSP0E6TixjeTpSP046QSxyOjN9KTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIpLCJyZWN0IixxLkFOTk9UQVRJT05fUkVDVF9DTEFTUykuYXR0cnMoe3g6Uj9BOnUseTpSP3U6QSx3aWR0aDpSP2Z1bmN0aW9uKGZhKXtyZXR1cm4gRC5nZXQoZmEpLndpZHRofTpmdW5jdGlvbihmYSl7cmV0dXJuIEQuZ2V0KGZhKS5oZWlnaHR9LGhlaWdodDpSP2Z1bmN0aW9uKGZhKXtyZXR1cm4gRC5nZXQoZmEpLmhlaWdodH06ZnVuY3Rpb24oZmEpe3JldHVybiBELmdldChmYSkud2lkdGh9LHZpc2liaWxpdHk6d30pO3ZhciBYPXRoaXMuX2Fubm90YXRpb25Xcml0ZXIsYWE9dGhpcy5hbm5vdGF0aW9uRm9ybWF0dGVyKCk7Tj14KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiKSwiZyIscS5BTk5PVEFUSU9OX0xBQkVMX0NMQVNTKTsKTi5zZWxlY3RBbGwoIi50ZXh0LWNvbnRhaW5lciIpLnJlbW92ZSgpO04uYXR0cnMoe3RyYW5zZm9ybTpmdW5jdGlvbihmYSl7dmFyIG9hPVI/QShmYSk6dShmYSk7ZmE9Uj91KGZhKTpBKGZhKTtyZXR1cm4idHJhbnNsYXRlKCIrb2ErIiwiK2ZhKyIpIn0sdmlzaWJpbGl0eTp3fSkuZWFjaChmdW5jdGlvbihmYSl7WC53cml0ZShhYShmYSksUj9ELmdldChmYSkud2lkdGg6RC5nZXQoZmEpLmhlaWdodCxSP0QuZ2V0KGZhKS5oZWlnaHQ6RC5nZXQoZmEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpSPzA6OTB9LHIuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07cS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLHc9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIG51bGw9PUE/ITE6Cm0uTWF0aC5pblJhbmdlKHUuX3NjYWxlLnNjYWxlKEEpLHdbMF0sd1sxXSl9KSl9O3EucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB1PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksdz10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4odyx1KX07cS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtxLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih1KXt2YXIgdz10aGlzLEE9W1tdXSx5PW5ldyBtLk1hcCx4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEc9CncuX3NjYWxlLnNjYWxlKEMpLEQ9dS5nZXQoQykud2lkdGg7aWYoMD5HfHxHK0Q+eCl5LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihLKXtyZXR1cm4gQVtLXS5zb21lKGZ1bmN0aW9uKEwpe3ZhciBKPXcuX3NjYWxlLnNjYWxlKEwpO0w9dS5nZXQoTCkud2lkdGg7cmV0dXJuIEcrRD49SiYmRzw9SitMfSl9LEg9MDtCKEgpOylIKyssQS5sZW5ndGg9PT1IJiZBLnB1c2goW10pO0FbSF0ucHVzaChDKTt5LnNldChDLEgpfX0pO3JldHVybiB5fTtxLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKcS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB1PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dS54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp1LngyPXRoaXMud2lkdGgoKTt1LnkxPXRoaXMuaGVpZ2h0KCk7dS55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnUueDE9dGhpcy53aWR0aCgpO3UueDI9dGhpcy53aWR0aCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dS55Mj10aGlzLmhlaWdodCgpfXJldHVybiB1fTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoeCl7cmV0dXJuIEEuX3NjYWxlLnNjYWxlKHgpfXZhciBBPXRoaXM7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB5PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh5LngxPQp3LHkueDI9dyk6KHkueTE9dyx5LnkyPXcpO3U9dT90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6eS55Mj11O2JyZWFrO2Nhc2UgInRvcCI6eS55MT10aGlzLmhlaWdodCgpO3kueTI9dGhpcy5oZWlnaHQoKS11O2JyZWFrO2Nhc2UgImxlZnQiOnkueDE9dGhpcy53aWR0aCgpO3kueDI9dGhpcy53aWR0aCgpLXU7YnJlYWs7Y2FzZSAicmlnaHQiOnkueDI9dX1yZXR1cm4geX07cS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpxLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07cS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3EucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD51KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dSl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3U9dS50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dSYmImJvdHRvbSIhPT0KdSYmImxlZnQiIT09dSYmInJpZ2h0IiE9PXUpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnEucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHc9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKTt3LmVtcHR5KCl8fHcuZWFjaChmdW5jdGlvbigpe20uRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1KXx8ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX01BUktfQ0xBU1MpLHc9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgQT1yLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT1BfHwidmlzaWJsZSI9PT1BfSkuZGF0YSgpO3UuZWFjaChmdW5jdGlvbihBKXstMT09PXcuaW5kZXhPZihBKSYmci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHF9KGQuQ29tcG9uZW50KTtoLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2guVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2guVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7aC5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7aC5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7aC5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2guQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2guX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2YuQXhpcz1ofSxmdW5jdGlvbihkLGYpe2YuU0hPV19XQVJOSU5HUz0hMDtmLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfXIucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgbD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxwPTA7cDxsLmxlbmd0aDtwKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbFtwXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07ci5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgbD10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O3IucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O3IucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdLmFkZChwKTt0aGlzLl9jb25uZWN0KCl9O3IucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5kZWxldGUocCk7dGhpcy5fZGlzY29ubmVjdCgpfTtyLnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMV09YXJndW1lbnRzW21dO209dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXTtudWxsIT1tJiZtLmNhbGxDYWxsYmFja3MuYXBwbHkobSxwKX07cmV0dXJuIHJ9KCk7Zi5EaXNwYXRjaGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fAooZltsXT1yW2xdKX1rKGgoODcpKTtrKGgoODgpKTtrKGgoNDApKTtrKGgoODkpKTtrKGgoOTApKTtkPWgoMjYpO2Yuem9vbU91dD1kLnpvb21PdXR9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaChuLHEsdSl7cmV0dXJuIHUtKHUtbikqcX1mdW5jdGlvbiBrKG4scSx1KXtyZXR1cm4obipxLXUpLyhxLTEpfWZ1bmN0aW9uIHIobixxLHUsdyl7dmFyIEE9MTxxO3U9QT93OnU7aWYobnVsbD09dSlyZXR1cm4gcTtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oQT9NYXRoLm1pbjpNYXRoLm1heCkocSx1L01hdGguYWJzKG5bMV0tblswXSkpfWZ1bmN0aW9uIGwobixxLHUsdyxBKXtpZigxPj1xKXJldHVybntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX07aWYobnVsbD09dyYmbnVsbD09QSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O3ZhciB5PXAobikseD1tKG4pLEM9eD9JbmZpbml0eTotSW5maW5pdHk7eD14Py1JbmZpbml0eTpJbmZpbml0eTt3PW51bGw9PQp3P0M6dztBPW51bGw9PUE/eDpBO3g9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9eFswXTt4PXhbMV07QT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQSk7eD1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7dmFyIEc9aCh4LHEsdSk7dz1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyk7bj1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1oKG4scSx1KTtyZXR1cm4gTWF0aC5hYnMoRy1DKT5NYXRoLmFicyhBLXcpPyhxPShBLXcpLyh4LW4pLDEhPT1xP3tjZW50ZXJQb2ludDprKHgscSxBKSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX0pOkc+QSE9eT97Y2VudGVyUG9pbnQ6ayh4LHEsQSksem9vbUFtb3VudDpxfTpDPHchPXk/e2NlbnRlclBvaW50OmsobixxLHcpLHpvb21BbW91bnQ6cX06e2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfX1mdW5jdGlvbiBwKG4pe249bi5yYW5nZSgpO3JldHVybiBuWzFdPG5bMF19ZnVuY3Rpb24gbShuKXtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIG5bMV08blswXX1mLnpvb21PdXQ9aDtmLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihuLHEsdSx3LEEseSx4KXtxPXIobixxLHcsQSk7cmV0dXJuIGwobixxLHUseSx4KX07Zi5jb25zdHJhaW5ab29tRXh0ZW50cz1yO2YuY29uc3RyYWluWm9vbVZhbHVlcz1sO2YuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihuLHEsdSx3KXt2YXIgQT1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseT1BWzBdLHg9QVsxXTtBPXAobik7MDxxIT09QT8odT13LG51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih4KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWF4Ok1hdGgubWluKSh5K3EsbikteSkpOm51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih5KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWluOk1hdGgubWF4KSh5K3EsbikteSk7cmV0dXJuIHF9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhILApLLEwpe3ZhciBKPUguc2NhbGU7aWYoSiBpbnN0YW5jZW9mIHkuQ2F0ZWdvcnkpTD1KLnJhbmdlQmFuZCgpO2Vsc2V7dmFyIE89SC5hY2Nlc3NvcjtIPWwuc2V0KEMuQXJyYXkuZmxhdHRlbihLLm1hcChmdW5jdGlvbihTKXtyZXR1cm4gUy5kYXRhKCkubWFwKGZ1bmN0aW9uKE4sUil7cmV0dXJuIE8oTixSLFMpfSkuZmlsdGVyKGZ1bmN0aW9uKE4pe3JldHVybiBudWxsIT1OfSkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuK1N9KTtILnNvcnQoZnVuY3Rpb24oUyxOKXtyZXR1cm4gUy1OfSk7SD1ILm1hcChmdW5jdGlvbihTKXtyZXR1cm4gSi5zY2FsZShTKX0pO0g9bC5wYWlycyhIKTtMPUMuTWF0aC5taW4oSCxmdW5jdGlvbihTKXtyZXR1cm4gTWF0aC5hYnMoU1sxXS1TWzBdKX0sTCpCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7TCo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gTH0KdmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEgsSyl7ZnVuY3Rpb24gTCgpe3RoaXMuY29uc3RydWN0b3I9SH1mb3IodmFyIEogaW4gSylLLmhhc093blByb3BlcnR5KEopJiYoSFtKXT1LW0pdKTtILnByb3RvdHlwZT1udWxsPT09Sz9PYmplY3QuY3JlYXRlKEspOihMLnByb3RvdHlwZT1LLnByb3RvdHlwZSxuZXcgTCl9LGw9aCgxKSxwPWgoNSksbT1oKDcpLG49aCg4KSxxPWgoMTQpLHU9aCg2KSx3PWgoMzQpLEE9aCgyMCkseT1oKDMpLHg9aCgxMSksQz1oKDApO2Q9aCgxMCk7dmFyIEc9aCgxOSksRD1oKDIpO2g9aCgxNik7Zi5CYXJPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2YuTGFiZWxzUG9zaXRpb249ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtmLkJhckFsaWdubWVudD1kLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSyhMKXt2b2lkIDA9PT0KTCYmKEw9InZlcnRpY2FsIik7dmFyIEo9SC5jYWxsKHRoaXMpfHx0aGlzO0ouX2xhYmVsRm9ybWF0dGVyPW4uaWRlbnRpdHkoKTtKLl9sYWJlbHNFbmFibGVkPSExO0ouX2xhYmVsc1Bvc2l0aW9uPWYuTGFiZWxzUG9zaXRpb24uZW5kO0ouX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0ouX2JhckFsaWdubWVudD0ibWlkZGxlIjtKLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9QS5tZW1vaXplKGspO0ouX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7Si5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09TCYmImhvcml6b250YWwiIT09TCl0aHJvdyBFcnJvcihMKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0ouX2lzVmVydGljYWw9InZlcnRpY2FsIj09PUw7Si5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBtLk51bGwpO0ouYXR0cigiZmlsbCIsKG5ldyB5LkNvbG9yKS5yYW5nZSgpWzBdKTtKLmF0dHIoSy5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEouX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtKLl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7Si5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0ouYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEp9cihLLEgpO0sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oTCxKLE8pe0gucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLEwsSixPKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLng9ZnVuY3Rpb24oTCxKKXtpZihudWxsPT1MKXJldHVybiBILnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09Sj9ILnByb3RvdHlwZS54LmNhbGwodGhpcyxMKTpILnByb3RvdHlwZS54LmNhbGwodGhpcyxMLEopO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS55PWZ1bmN0aW9uKEwsSil7aWYobnVsbD09CkwpcmV0dXJuIEgucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1KP0gucHJvdG90eXBlLnkuY2FsbCh0aGlzLEwpOkgucHJvdG90eXBlLnkuY2FsbCh0aGlzLEwsSik7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O0sucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O0sucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChLLl9CQVJfRU5EX0tFWSl9O0sucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihMKXtpZihudWxsPT1MKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PUw7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtLLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtLLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB3LlJlY3RhbmdsZVNWR0RyYXdlcihLLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKEwpe3JldHVybiBuZXcgcS5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoTCl9KX07Sy5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtLLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBMPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIEw/TCBpbnN0YW5jZW9mIHkuVGltZT9uZXcgRGF0ZSgwKTowOjB9O0sucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oTCl7SC5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsTCl9O0sucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEwpe0gucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxMKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihMKXtILnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxMKX07Sy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTCl7SC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLEwpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihMKXtpZihudWxsPT1MKXJldHVybiBILnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0gucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKTCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oTCxKKXtpZihudWxsPT1MKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkO3RoaXMuX2xhYmVsc0VuYWJsZWQ9TDtudWxsIT1KJiYodGhpcy5fbGFiZWxzUG9zaXRpb249Sik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKEwpe2lmKG51bGw9PUwpcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPUw7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oTCl7dmFyIEo9SC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsTCksTz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoSy5fTEFCRUxfQVJFQV9DTEFTUywKITApLFM9bmV3IHAuU3ZnQ29udGV4dChPLm5vZGUoKSksTj1uZXcgcC5DYWNoZU1lYXN1cmVyKFMpO1M9bmV3IHAuV3JpdGVyKE4sUyk7dGhpcy5fbGFiZWxDb25maWcuc2V0KEwse2xhYmVsQXJlYTpPLG1lYXN1cmVyOk4sd3JpdGVyOlN9KTtyZXR1cm4gSn07Sy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihMKXtILnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxMKTt2YXIgSj10aGlzLl9sYWJlbENvbmZpZy5nZXQoTCk7bnVsbCE9SiYmKEoubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShMKSl9O0sucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oTCl7dmFyIEo9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gTyhiYSxrYSxXLEVhKXtyZXR1cm4gSi5fcGl4ZWxQb2ludEJhcihmYShiYSxrYSxXKSxvYSxFYSl9CnZhciBTPUouX2lzVmVydGljYWw/TC54OkwueSxOPUouX2lzVmVydGljYWw/TC55OkwueCxSPUouYm91bmRzKCksWD17bWluOjAsbWF4OlIuYm90dG9tUmlnaHQueC1SLnRvcExlZnQueH0sYWE9e21pbjowLG1heDpSLmJvdHRvbVJpZ2h0LnktUi50b3BMZWZ0Lnl9LGZhPUQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoSi5sZW5ndGgoKSksb2E9Si5sZW5ndGgoKS5zY2FsZS5zY2FsZShKLmJhc2VsaW5lVmFsdWUoKSksWj1JbmZpbml0eSxjYT1JbmZpbml0eSxqYTtKLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihiYSl7dmFyIGthPUouX2VudGl0eUJvdW5kcyhiYSk7aWYoQy5ET00uaW50ZXJzZWN0c0JCb3goWCxhYSxrYSkpe3ZhciBXPTAsRWE9MDtpZighQy5ET00uaW50ZXJzZWN0c0JCb3goTC54LEwueSxrYSwuNSkpe0VhPU8oYmEuZGF0dW0sYmEuaW5kZXgsYmEuZGF0YXNldCxrYSk7Vz1NYXRoLmFicyhTLShKLl9pc1ZlcnRpY2FsP0VhLng6RWEueSkpOwp2YXIgdmE9Si5faXNWZXJ0aWNhbD9rYS55OmthLng7a2E9dmErKEouX2lzVmVydGljYWw/a2EuaGVpZ2h0OmthLndpZHRoKTtFYT1OPj12YS0uNSYmTjw9a2ErLjU/MDpNYXRoLmFicyhOLShKLl9pc1ZlcnRpY2FsP0VhLnk6RWEueCkpfWlmKFc8Wnx8Vz09PVomJkVhPGNhKWphPWJhLFo9VyxjYT1FYX19KTtpZih2b2lkIDAhPT1qYSlyZXR1cm4gSi5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KGphKX0pfTtLLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEwpe3JldHVybiB0aGlzLl9lbnRpdGllc0ludGVyc2VjdGluZyhMLngsTC55KX07Sy5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEwsSil7dmFyIE89dGhpcyxTPVtdO3RoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKE4pe0MuRE9NLmludGVyc2VjdHNCQm94KEwsSixPLl9lbnRpdHlCb3VuZHMoTikpJiZTLnB1c2goTy5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pKX0pOwpyZXR1cm4gU307Sy5wcm90b3R5cGUuX3VwZGF0ZUxlbmd0aFNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpe3ZhciBMPXRoaXMubGVuZ3RoKCkuc2NhbGU7TCBpbnN0YW5jZW9mIHguUXVhbnRpdGF0aXZlU2NhbGUmJihMLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSxMLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSl9fTtLLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBMPXRoaXM7dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7cmV0dXJuIEgucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwoTCl9KX07Sy5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihMKXt2YXIgSj10aGlzLE89dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7Ck89e3gxOnRoaXMuX2lzVmVydGljYWw/MDpPLHkxOnRoaXMuX2lzVmVydGljYWw/TzowLHgyOnRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOk8seTI6dGhpcy5faXNWZXJ0aWNhbD9POnRoaXMuaGVpZ2h0KCl9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUsTyk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUyl7cmV0dXJuIEouX2xhYmVsQ29uZmlnLmdldChTKS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KTt0aGlzLl9sYWJlbHNFbmFibGVkJiZDLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEouX2RyYXdMYWJlbHMoKX0sTCl9O0sucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihMKXt2YXIgSj10aGlzLE89SC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxMKTtpZigieCI9PT1MJiZ0aGlzLl9pc1ZlcnRpY2FsKUw9dGhpcy54KCk7CmVsc2V7aWYoInkiIT09THx8dGhpcy5faXNWZXJ0aWNhbClyZXR1cm4gTztMPXRoaXMueSgpfWlmKCEoTCYmTC5zY2FsZSYmTC5zY2FsZSBpbnN0YW5jZW9mIHguUXVhbnRpdGF0aXZlU2NhbGUpKXJldHVybiBPO3ZhciBTPUwuc2NhbGUsTj10aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpO3JldHVybiBPPU8ubWFwKGZ1bmN0aW9uKFIpe3JldHVybiBsLmV4dGVudChbUy5pbnZlcnQoSi5fZ2V0UG9zaXRpb25BdHRyKFMuc2NhbGUoUlswXSksTikpLFMuaW52ZXJ0KEouX2dldFBvc2l0aW9uQXR0cihTLnNjYWxlKFJbMF0pLE4pK04pLFMuaW52ZXJ0KEouX2dldFBvc2l0aW9uQXR0cihTLnNjYWxlKFJbMV0pLE4pKSxTLmludmVydChKLl9nZXRQb3NpdGlvbkF0dHIoUy5zY2FsZShSWzFdKSxOKStOKV0pfSl9O0sucHJvdG90eXBlLl9nZXRQb3NpdGlvbkF0dHI9ZnVuY3Rpb24oTCxKKXt0aGlzLl9pc1ZlcnRpY2FsfHwoTC09SixKKj0tMSk7c3dpdGNoKHRoaXMuX2JhckFsaWdubWVudCl7Y2FzZSAic3RhcnQiOnJldHVybiBMOwpjYXNlICJlbmQiOnJldHVybiBMLUo7ZGVmYXVsdDpyZXR1cm4gTC1KLzJ9fTtLLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBMPXRoaXMsSj10aGlzLl9nZXREYXRhVG9EcmF3KCksTz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxTPXRoaXMuZGF0YXNldHMoKS5zb21lKGZ1bmN0aW9uKE4pe3JldHVybiBKLmdldChOKS5zb21lKGZ1bmN0aW9uKFIsWCl7cmV0dXJuIG51bGw9PVI/ITE6TC5fZHJhd0xhYmVsKFIsWCxOLE8pfSl9KTt0aGlzLl9oaWRlQmFyc0lmQW55QXJlVG9vV2lkZSYmUyYmdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTil7cmV0dXJuIEwuX2xhYmVsQ29uZmlnLmdldChOKS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KX07Sy5wcm90b3R5cGUuX2RyYXdMYWJlbD1mdW5jdGlvbihMLEosTyxTKXt2YXIgTj10aGlzLl9sYWJlbENvbmZpZy5nZXQoTyksUj1OLmxhYmVsQXJlYSxYPU4ubWVhc3VyZXI7Tj1OLndyaXRlcjsKdmFyIGFhPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsZmE9YWEoTCxKLE8pO2FhPXRoaXMubGVuZ3RoKCkuc2NhbGU7dmFyIG9hPW51bGwhPWFhP2FhLnNjYWxlKGZhKTpmYSxaPW51bGwhPWFhP2FhLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxjYT17eDpTLngoTCxKLE8pLHk6Uy55KEwsSixPKX07YWE9e3dpZHRoOlMud2lkdGgoTCxKLE8pLGhlaWdodDpTLmhlaWdodChMLEosTyl9O2ZhPXRoaXMuX2xhYmVsRm9ybWF0dGVyKGZhLEwsSixPKTtYPVgubWVhc3VyZShmYSk7dmFyIGphPXRoaXMuX3Nob3VsZFNob3dMYWJlbE9uQmFyKGNhLGFhLFgpO2NhPXRoaXMuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcyhjYSxhYSxYLGphLHRoaXMuX2lzVmVydGljYWw/b2E8PVo6b2E8Wik7b2E9Y2EuY29udGFpbmVyRGltZW5zaW9ucztaPWNhLmxhYmVsQ29udGFpbmVyT3JpZ2luO2NhPWNhLmFsaWdubWVudDtMPVMuZmlsbChMLEosTyk7Uj10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihSLApaLGphLEwpO04ud3JpdGUoZmEsb2Eud2lkdGgsb2EuaGVpZ2h0LHt4QWxpZ246Y2EueCx5QWxpZ246Y2EueX0sUi5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP2FhLndpZHRoPFgud2lkdGg6YWEuaGVpZ2h0PFguaGVpZ2h0fTtLLnByb3RvdHlwZS5fc2hvdWxkU2hvd0xhYmVsT25CYXI9ZnVuY3Rpb24oTCxKLE8pe2lmKHRoaXMuX2xhYmVsc1Bvc2l0aW9uPT09Zi5MYWJlbHNQb3NpdGlvbi5vdXRzaWRlKXJldHVybiExO0w9dGhpcy5faXNWZXJ0aWNhbD9MLnk6TC54O3ZhciBTPXRoaXMuX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtKPXRoaXMuX2lzVmVydGljYWw/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCk7Tz10aGlzLl9pc1ZlcnRpY2FsP08uaGVpZ2h0Ok8ud2lkdGg7dmFyIE49TCtTO04+Sj9TPUotTDowPkwmJihTPU4pO3JldHVybiBPK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSPD1TfTtLLnByb3RvdHlwZS5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzPQpmdW5jdGlvbihMLEosTyxTLE4pe2Z1bmN0aW9uIFIoa2Epe3N3aXRjaChrYSl7Y2FzZSAidG9wTGVmdCI6Wj1YLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IjtqYSs9Sy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7YmErPUsuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2JyZWFrO2Nhc2UgImNlbnRlciI6YmErPShmYStvYSkvMjticmVhaztjYXNlICJib3R0b21SaWdodCI6Wj1YLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsamEtPUsuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLGJhKz1jYS1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUi1vYX19dmFyIFg9dGhpcyxhYT10aGlzLl9pc1ZlcnRpY2FsP0wueTpMLngsZmE9dGhpcy5faXNWZXJ0aWNhbD9KLmhlaWdodDpKLndpZHRoLG9hPXRoaXMuX2lzVmVydGljYWw/Ty5oZWlnaHQ6Ty53aWR0aCxaPSJjZW50ZXIiLGNhPWZhLGphPWFhLGJhPWFhO2lmKFMpc3dpdGNoKHRoaXMuX2xhYmVsc1Bvc2l0aW9uKXtjYXNlIGYuTGFiZWxzUG9zaXRpb24uc3RhcnQ6Tj8KUigiYm90dG9tUmlnaHQiKTpSKCJ0b3BMZWZ0Iik7YnJlYWs7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLm1pZGRsZTpSKCJjZW50ZXIiKTticmVhaztjYXNlIGYuTGFiZWxzUG9zaXRpb24uZW5kOk4/UigidG9wTGVmdCIpOlIoImJvdHRvbVJpZ2h0Iil9ZWxzZSBOPyhaPXRoaXMuX2lzVmVydGljYWw/InRvcCI6ImxlZnQiLGNhPWZhK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK29hLGphLT1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitvYSxiYS09Sy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrb2EpOihaPXRoaXMuX2lzVmVydGljYWw/ImJvdHRvbSI6InJpZ2h0IixjYT1mYStLLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitvYSxiYSs9ZmErSy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIpO3JldHVybntjb250YWluZXJEaW1lbnNpb25zOnt3aWR0aDp0aGlzLl9pc1ZlcnRpY2FsP0oud2lkdGg6Y2EsaGVpZ2h0OnRoaXMuX2lzVmVydGljYWw/Y2E6Si5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/CkwueDpqYSx5OnRoaXMuX2lzVmVydGljYWw/amE6TC55fSxsYWJlbE9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsP0wueCtKLndpZHRoLzItTy53aWR0aC8yOmJhLHk6dGhpcy5faXNWZXJ0aWNhbD9iYTpMLnkrSi5oZWlnaHQvMi1PLmhlaWdodC8yfSxhbGlnbm1lbnQ6e3g6dGhpcy5faXNWZXJ0aWNhbD8iY2VudGVyIjpaLHk6dGhpcy5faXNWZXJ0aWNhbD9aOiJjZW50ZXIifX19O0sucHJvdG90eXBlLl9jcmVhdGVMYWJlbENvbnRhaW5lcj1mdW5jdGlvbihMLEosTyxTKXtMPUwuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSi54KyIsICIrSi55KyIpIik7Tz8oTC5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKSxPPTEuNipDLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsUyk8Qy5Db2xvci5jb250cmFzdCgiYmxhY2siLFMpLEwuY2xhc3NlZChPPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKSk6TC5jbGFzc2VkKCJvZmYtYmFyLWxhYmVsIiwhMCk7cmV0dXJuIEx9OwpLLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgTD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBKPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE89dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksUz10aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCI7Slt0aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCJdPWZ1bmN0aW9uKCl7cmV0dXJuIE99O0pbU109ZnVuY3Rpb24oKXtyZXR1cm4gMH07TC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6SixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHLkFuaW1hdG9yLlJFU0VUKX0pfUwucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEcuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gTH07Sy5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTChjYSwKamEsYmEpe3JldHVybiBNYXRoLmFicyhTLWFhKGNhLGphLGJhKSl9dmFyIEo9dGhpcyxPPUgucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLFM9dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTj10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsUj10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsWD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxmYT1PW0suX0JBUl9USElDS05FU1NfS0VZXSxvYT1PLmdhcCxaPW51bGw9PW9hP2ZhOmZ1bmN0aW9uKGNhLGphLGJhKXtyZXR1cm4gZmEoY2EsamEsYmEpLW9hKGNhLGphLGJhKX07Ty53aWR0aD10aGlzLl9pc1ZlcnRpY2FsP1o6TDtPLmhlaWdodD10aGlzLl9pc1ZlcnRpY2FsP0w6WjtPW05dPWZ1bmN0aW9uKGNhLGphLGJhKXtjYT1hYShjYSxqYSxiYSk7cmV0dXJuIGNhPlM/ClM6Y2F9O09bUl09ZnVuY3Rpb24oY2EsamEsYmEpe3JldHVybiBKLl9nZXRQb3NpdGlvbkF0dHIoWChjYSxqYSxiYSksZmEoY2EsamEsYmEpKX07cmV0dXJuIE99O0sucHJvdG90eXBlLl91cGRhdGVUaGlja25lc3NBdHRyPWZ1bmN0aW9uKCl7dmFyIEw9dGhpcyxKPXRoaXMucG9zaXRpb24oKSxPPXRoaXMuYmFyRW5kKCk7bnVsbCE9SiYmbnVsbCE9Tz8odGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMSx0aGlzLmF0dHIoSy5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oUyxOLFIpe3ZhciBYPUouYWNjZXNzb3IoUyxOLFIpO1M9Ty5hY2Nlc3NvcihTLE4sUik7WD1KLnNjYWxlP0ouc2NhbGUuc2NhbGUoWCk6WDtTPU8uc2NhbGU/Ty5zY2FsZS5zY2FsZShTKTpTO3JldHVybiBNYXRoLmFicyhTLVgpfSkpOih0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwLHRoaXMuYXR0cihLLl9CQVJfVEhJQ0tORVNTX0tFWSxmdW5jdGlvbigpe3JldHVybiBMLl9iYXJQaXhlbFRoaWNrbmVzcygpfSkpfTsKSy5wcm90b3R5cGUuX2JhclBpeGVsVGhpY2tuZXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M/dGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/dGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzKHRoaXMucG9zaXRpb24oKSx0aGlzLmRhdGFzZXRzKCksdGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6dGhpcy5oZWlnaHQoKSk6MDowfTtLLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihMKXt2b2lkIDA9PT1MJiYoTD10aGlzLmRhdGFzZXRzKCkpO3JldHVybiB0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT9ILnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsTCk6W119O0sucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oTCl7cmV0dXJuIHRoaXMuX3BpeGVsQm91bmRzKEwuZGF0dW0sTC5pbmRleCxMLmRhdGFzZXQpfTtLLnByb3RvdHlwZS5fcGl4ZWxCb3VuZHM9ZnVuY3Rpb24oTCxKLE8pe3ZhciBTPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwpyZXR1cm57eDpTLngoTCxKLE8pLHk6Uy55KEwsSixPKSx3aWR0aDpTLndpZHRoKEwsSixPKSxoZWlnaHQ6Uy5oZWlnaHQoTCxKLE8pfX07Sy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oTCxKLE8pe3ZhciBTPXRoaXMuX3BpeGVsQm91bmRzKEwsSixPKTtMPSh0aGlzLl9pc1ZlcnRpY2FsP0QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOkQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpKShMLEosTyk7Sj0odGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKS5zY2FsZTp0aGlzLngoKS5zY2FsZSkuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpO3JldHVybiB0aGlzLl9waXhlbFBvaW50QmFyKEwsSixTKX07Sy5wcm90b3R5cGUuX3BpeGVsUG9pbnRCYXI9ZnVuY3Rpb24oTCxKLE8pe2lmKHRoaXMuX2lzVmVydGljYWwpe3ZhciBTPU8ueCtPLndpZHRoLzI7TD1MPD1KP08ueTpPLnkrTy5oZWlnaHR9ZWxzZSBTPUw+PUo/Ty54K08ud2lkdGg6Ty54LEw9Ty55K08uaGVpZ2h0LwoyO3JldHVybnt4OlMseTpMfX07Sy5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEwsSil7SC5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyxMLEopfTtLLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBMPXRoaXMsSj1uZXcgQy5NYXAsTz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxTPXRoaXMud2lkdGgoKSxOPXRoaXMuaGVpZ2h0KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUil7dmFyIFg9Ui5kYXRhKCkubWFwKGZ1bmN0aW9uKGFhLGZhKXtyZXR1cm4gTC5faXNEYXR1bU9uU2NyZWVuKE8sUyxOLGFhLGZhLFIpP2FhOm51bGx9KTtKLnNldChSLFgpfSk7cmV0dXJuIEp9O0sucHJvdG90eXBlLl9pc0RhdHVtT25TY3JlZW49ZnVuY3Rpb24oTCxKLE8sUyxOLFIpe3ZhciBYPUwueChTLE4sUiksYWE9TC55KFMsTixSKSxmYT1MLndpZHRoKFMsTixSKTtMPUwuaGVpZ2h0KFMsTixSKTsKcmV0dXJuIEMuTWF0aC5pc1ZhbGlkTnVtYmVyKFgpJiZDLk1hdGguaXNWYWxpZE51bWJlcihhYSkmJkMuTWF0aC5pc1ZhbGlkTnVtYmVyKGZhKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoTCk/Qy5NYXRoLmJvdW5kc0ludGVyc2VjdHMoWCxhYSxmYSxMLEosTyk6ITF9O3JldHVybiBLfShoLlhZUGxvdCk7Qi5fQkFSX1RISUNLTkVTU19SQVRJTz0uOTU7Qi5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU89LjQ7Qi5fQkFSX0FSRUFfQ0xBU1M9ImJhci1hcmVhIjtCLl9CQVJfRU5EX0tFWT0iYmFyRW5kIjtCLl9CQVJfVEhJQ0tORVNTX0tFWT0id2lkdGgiO0IuX0xBQkVMX0FSRUFfQ0xBU1M9ImJhci1sYWJlbC10ZXh0LWFyZWEiO0IuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSPTEwO2YuQmFyPUJ9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odyxBKXtmdW5jdGlvbiB5KCl7dGhpcy5jb25zdHJ1Y3Rvcj13fWZvcih2YXIgeCBpbiBBKUEuaGFzT3duUHJvcGVydHkoeCkmJgood1t4XT1BW3hdKTt3LnByb3RvdHlwZT1udWxsPT09QT9PYmplY3QuY3JlYXRlKEEpOih5LnByb3RvdHlwZT1BLnByb3RvdHlwZSxuZXcgeSl9LHI9aCgxKSxsPWgoNSkscD1oKDgpLG09aCgzKSxuPWgoMCk7ZD1oKDEwKTt2YXIgcT1oKDIyKTtmLlRpbWVJbnRlcnZhbD1kLm1ha2VFbnVtKCJzZWNvbmQgbWludXRlIGhvdXIgZGF5IHdlZWsgbW9udGggeWVhciIuc3BsaXQoIiAiKSk7Zi5UaW1lQXhpc09yaWVudGF0aW9uPWQubWFrZUVudW0oWyJ0b3AiLCJib3R0b20iXSk7Zi5UaWVyTGFiZWxQb3NpdGlvbj1kLm1ha2VFbnVtKFsiYmV0d2VlbiIsImNlbnRlciJdKTtoPWZ1bmN0aW9uKHcpe2Z1bmN0aW9uIEEoeSx4KXt5PXcuY2FsbCh0aGlzLHkseCl8fHRoaXM7eS5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPW51bGw7eS5fdGllckxhYmVsUG9zaXRpb25zPVtdO3kuYWRkQ2xhc3MoInRpbWUtYXhpcyIpO3kudGlja0xhYmVsUGFkZGluZyg1KTt5LmF4aXNDb25maWd1cmF0aW9ucyhBLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyk7CnkuYW5ub3RhdGlvbkZvcm1hdHRlcihwLnRpbWUoIiVhICViICVkLCAlWSIpKTtyZXR1cm4geX1rKEEsdyk7QS5wcm90b3R5cGUudGllckxhYmVsUG9zaXRpb25zPWZ1bmN0aW9uKHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucztpZigheS5ldmVyeShmdW5jdGlvbih4KXtyZXR1cm4iYmV0d2VlbiI9PT14LnRvTG93ZXJDYXNlKCl8fCJjZW50ZXIiPT09eC50b0xvd2VyQ2FzZSgpfSkpdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIHBvc2l0aW9uIGZvciB0aWVyIGxhYmVscyIpO3RoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucz15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLm1heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb247dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPXk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUuY3VycmVudEF4aXNDb25maWd1cmF0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF19O0EucHJvdG90eXBlLmF4aXNDb25maWd1cmF0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsIT15KXt0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnM9eTt0aGlzLl9udW1UaWVycz1uLk1hdGgubWF4KHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcubGVuZ3RofSksMCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fc2V0dXBEb21FbGVtZW50cygpO3k9dGhpcy50aWVyTGFiZWxQb3NpdGlvbnMoKTtmb3IodmFyIHg9W10sQz0wO0M8dGhpcy5fbnVtVGllcnM7QysrKXgucHVzaCh5W0NdfHwiYmV0d2VlbiIpO3RoaXMudGllckxhYmVsUG9zaXRpb25zKHgpO3RoaXMucmVkcmF3KCl9fTtBLnByb3RvdHlwZS5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXg9CmZ1bmN0aW9uKCl7dmFyIHk9dGhpcyx4PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5sZW5ndGg7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24oQyxHKXtHPHgmJkMuZXZlcnkoZnVuY3Rpb24oRCl7cmV0dXJuIHkuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbihEKX0pJiYoeD1HKX0pO3g9PT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoJiYobi5XaW5kb3cud2Fybigiem9vbWVkIG91dCB0b28gZmFyOiBjb3VsZCBub3QgZmluZCBzdWl0YWJsZSBpbnRlcnZhbCB0byBkaXNwbGF5IGxhYmVscyIpLC0teCk7cmV0dXJuIHh9O0EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHkpe2lmKHkmJigicmlnaHQiPT09eS50b0xvd2VyQ2FzZSgpfHwibGVmdCI9PT15LnRvTG93ZXJDYXNlKCkpKXRocm93IEVycm9yKHkrIiBpcyBub3QgYSBzdXBwb3J0ZWQgb3JpZW50YXRpb24gZm9yIFRpbWVBeGlzIC0gb25seSBob3Jpem9udGFsIG9yaWVudGF0aW9ucyBhcmUgc3VwcG9ydGVkIik7CnJldHVybiB3LnByb3RvdHlwZS5vcmllbnRhdGlvbi5jYWxsKHRoaXMseSl9O0EucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt0aGlzLl90aWVySGVpZ2h0cz1bXTtmb3IodmFyIHg9MDt4PHRoaXMuX251bVRpZXJzO3grKyl0aGlzLl90aWVySGVpZ2h0cy5wdXNoKHkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrKCJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT8wOnRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpKSk7cmV0dXJuIHIuc3VtKHRoaXMuX3RpZXJIZWlnaHRzKX07QS5wcm90b3R5cGUuX2dldEludGVydmFsTGVuZ3RoPWZ1bmN0aW9uKHkpe3ZhciB4PXRoaXMuX3NjYWxlLmRvbWFpbigpWzBdO3k9bS5UaW1lLnRpbWVJbnRlcnZhbFRvRDNUaW1lKHkuaW50ZXJ2YWwpLm9mZnNldCh4LHkuc3RlcCk7cmV0dXJuIHk+dGhpcy5fc2NhbGUuZG9tYWluKClbMV0/dGhpcy53aWR0aCgpOgpNYXRoLmFicyh0aGlzLl9zY2FsZS5zY2FsZSh5KS10aGlzLl9zY2FsZS5zY2FsZSh4KSl9O0EucHJvdG90eXBlLl9tYXhXaWR0aEZvckludGVydmFsPWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKHkuZm9ybWF0dGVyKEEuX0xPTkdfREFURSkpLndpZHRofTtBLnByb3RvdHlwZS5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHkpe2lmKG51bGwhPXRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbil7dmFyIHg9QS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uXSxDPUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3kuaW50ZXJ2YWxdO2lmKG51bGwhPXgmJm51bGwhPUMmJkM8eClyZXR1cm4hMX14PXRoaXMuX21heFdpZHRoRm9ySW50ZXJ2YWwoeSkrMip0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtyZXR1cm4gTWF0aC5taW4odGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgoeSksCnRoaXMud2lkdGgoKSk+PXh9O0EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHkseCl7dmFyIEM9dy5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLHkseCk7eT10aGlzLl90aWVySGVpZ2h0cy5yZWR1Y2UoZnVuY3Rpb24oRyxEKXtyZXR1cm4gRytEPkMuaGVpZ2h0P0c6RytEfSk7eD10aGlzLm1hcmdpbigpKyh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKnRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk6MCk7Qy5oZWlnaHQ9TWF0aC5taW4oQy5oZWlnaHQseSt4KTtyZXR1cm4gQ307QS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fc2V0dXBEb21FbGVtZW50cygpfTtBLnByb3RvdHlwZS5fc2V0dXBEb21FbGVtZW50cz1mdW5jdGlvbigpe3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrQS5USU1FX0FYSVNfVElFUl9DTEFTUykucmVtb3ZlKCk7CnRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnM9W107dGhpcy5fdGllck1hcmtDb250YWluZXJzPVtdO3RoaXMuX3RpZXJCYXNlbGluZXM9W107dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnJlbW92ZSgpO3RoaXMuX2Jhc2VsaW5lLnJlbW92ZSgpO2Zvcih2YXIgeT0wO3k8dGhpcy5fbnVtVGllcnM7Kyt5KXt2YXIgeD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKEEuVElNRV9BWElTX1RJRVJfQ0xBU1MsITApO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnMucHVzaCh4LmFwcGVuZCgiZyIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKSk7dGhpcy5fdGllck1hcmtDb250YWluZXJzLnB1c2goeC5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX01BUktfQ0xBU1MrIi1jb250YWluZXIiLCEwKSk7dGhpcy5fdGllckJhc2VsaW5lcy5wdXNoKHguYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKSl9eT1uZXcgbC5TdmdDb250ZXh0KHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbMF0ubm9kZSgpKTsKdGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih5KX07QS5wcm90b3R5cGUuX2dldFRpY2tJbnRlcnZhbFZhbHVlcz1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fc2NhbGUudGlja0ludGVydmFsKHkuaW50ZXJ2YWwseS5zdGVwKX07QS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeT10aGlzO3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF0ucmVkdWNlKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIHguY29uY2F0KHkuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyhDKSl9LFtdKX07QS5wcm90b3R5cGUuX2NsZWFuVGllcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHk9MDt5PHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnMubGVuZ3RoO3krKyl0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLnJlbW92ZSgpLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyQmFzZWxpbmVzW3ldLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXt5PXRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCksQz15Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4gRy52YWx1ZU9mKCl9KTstMT09PUMuaW5kZXhPZih4WzBdLnZhbHVlT2YoKSkmJnkudW5zaGlmdCh4WzBdKTstMT09PUMuaW5kZXhPZih4WzFdLnZhbHVlT2YoKSkmJnkucHVzaCh4WzFdKTtyZXR1cm4geX07QS5wcm90b3R5cGUuX3JlbmRlclRpZXJMYWJlbHM9ZnVuY3Rpb24oeSx4LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbih4KSxCPVtdOyJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXSYmCjE9PT14LnN0ZXA/RC5tYXAoZnVuY3Rpb24oTyxTKXtTKzE+PUQubGVuZ3RofHxCLnB1c2gobmV3IERhdGUoKERbUysxXS52YWx1ZU9mKCktRFtTXS52YWx1ZU9mKCkpLzIrRFtTXS52YWx1ZU9mKCkpKX0pOkI9RDt5PXkuc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCLGZ1bmN0aW9uKE8pe3JldHVybiBTdHJpbmcoTy52YWx1ZU9mKCkpfSk7dmFyIEg9eS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsITApO0guYXBwZW5kKCJ0ZXh0Iik7dmFyIEs9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ118fDE9PT14LnN0ZXA/MDp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt2YXIgTD0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9yLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMrMSkpLXRoaXMudGlja0xhYmVsUGFkZGluZygpOiJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdPwp0aGlzLmhlaWdodCgpLXIuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpLXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpOnRoaXMuaGVpZ2h0KCktci5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7SD15Lm1lcmdlKEgpO3ZhciBKPUguc2VsZWN0QWxsKCJ0ZXh0Iik7MDxKLnNpemUoKSYmSi5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitLKyIsIitMKyIpIik7eS5leGl0KCkucmVtb3ZlKCk7SC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKE8pe3JldHVybiJ0cmFuc2xhdGUoIitHLl9zY2FsZS5zY2FsZShPKSsiLDApIn0pO0M9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ118fDE9PT14LnN0ZXA/Im1pZGRsZSI6InN0YXJ0IjtILnNlbGVjdEFsbCgidGV4dCIpLnRleHQoeC5mb3JtYXR0ZXIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQyl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWNrTWFya3M9CmZ1bmN0aW9uKHkseCl7eT10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeF0uc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHkpO3ZhciBDPXkuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHEuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHkpLEc9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCksRD10aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLHgpLnJlZHVjZShmdW5jdGlvbihCLEgpe3JldHVybiBCK0h9LDApOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhHLnkxPUQsRy55Mj1EKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmlubmVyVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3hdKSk6KEcueTE9dGhpcy5oZWlnaHQoKS1ELEcueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbeF0/dGhpcy5pbm5lclRpY2tMZW5ndGgoKToKdGhpcy5fdGllckhlaWdodHNbeF0pKSk7Qy5hdHRycyhHKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRy55MT1ELEcueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbeF0/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbeF0pKTooRy55MT10aGlzLmhlaWdodCgpLUQsRy55Mj10aGlzLmhlaWdodCgpLShEKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t4XSkpKTtyLnNlbGVjdChDLm5vZGVzKClbMF0pLmF0dHJzKEcpO3Iuc2VsZWN0KEMubm9kZXMoKVtDLnNpemUoKS0xXSkuYXR0cnMoRyk7ci5zZWxlY3QoQy5ub2RlcygpWzBdKS5jbGFzc2VkKHEuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTtyLnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmNsYXNzZWQocS5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApO3kuZXhpdCgpLnJlbW92ZSgpfTsKQS5wcm90b3R5cGUuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcz1mdW5jdGlvbih5KXt5PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgeD15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxDPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO0MueTI9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6dGhpcy5oZWlnaHQoKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt4LmF0dHJzKEMpO3kuZXhpdCgpLnJlbW92ZSgpfTtBLnByb3RvdHlwZS5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcz1mdW5jdGlvbigpe3JldHVybiAxPnRoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg/W106dGhpcy5fZ2V0VGlja0ludGVydmFsVmFsdWVzKHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4LQoxXVswXSl9O0EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHk9dGhpczt0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4PXRoaXMuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4KCk7dmFyIHg9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdO3RoaXMuX2NsZWFuVGllcnMoKTt4LmZvckVhY2goZnVuY3Rpb24oSCxLKXtyZXR1cm4geS5fcmVuZGVyVGllckxhYmVscyh5Ll90aWVyTGFiZWxDb250YWluZXJzW0tdLEgsSyl9KTtmb3IodmFyIEM9eC5tYXAoZnVuY3Rpb24oSCl7cmV0dXJuIHkuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKEgpfSksRz0wLEQ9MDtEPE1hdGgubWF4KHgubGVuZ3RoLDEpOysrRCl7dmFyIEI9dGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCk7Qi55MSs9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/RzotRztCLnkyPUIueTE7CnRoaXMuX3RpZXJCYXNlbGluZXNbRF0uYXR0cnMoQikuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iik7Rys9dGhpcy5fdGllckhlaWdodHNbRF19Rz1bXTtEPXRoaXMuX3NjYWxlLmRvbWFpbigpO0Q9dGhpcy5fc2NhbGUuc2NhbGUoRFsxXSktdGhpcy5fc2NhbGUuc2NhbGUoRFswXSk7MS41KnRoaXMuX2dldEludGVydmFsTGVuZ3RoKHhbMF0pPj1EJiYoRz10aGlzLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzKCkpO3RoaXMuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcyhHKTt0aGlzLl9oaWRlT3ZlcmZsb3dpbmdUaWVycygpO2ZvcihEPTA7RDx4Lmxlbmd0aDsrK0QpdGhpcy5fcmVuZGVyVGlja01hcmtzKENbRF0sRCksdGhpcy5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzKEQpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpZXJzPQpmdW5jdGlvbigpe3ZhciB5PXRoaXMseD10aGlzLmhlaWdodCgpLEM9MDt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLmF0dHIoInZpc2liaWxpdHkiLGZ1bmN0aW9uKEcsRCl7Qys9eS5fdGllckhlaWdodHNbRF07cmV0dXJuIEM8PXg/ImluaGVyaXQiOiJoaWRkZW4ifSl9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHM9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geChIKXtyZXR1cm4gTWF0aC5mbG9vcihHLmxlZnQpPD1NYXRoLmNlaWwoSC5sZWZ0KSYmTWF0aC5mbG9vcihHLnRvcCk8PU1hdGguY2VpbChILnRvcCkmJk1hdGguZmxvb3IoSC5yaWdodCk8PU1hdGguY2VpbChHLmxlZnQrQy53aWR0aCgpKSYmTWF0aC5mbG9vcihILmJvdHRvbSk8PU1hdGguY2VpbChHLnRvcCtDLmhlaWdodCgpKX12YXIgQz10aGlzLEc9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEQ9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrCnEuQXhpcy5USUNLX01BUktfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBIPXIuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09SHx8ImluaGVyaXQiPT09SH0pLm5vZGVzKCkubWFwKGZ1bmN0aW9uKEgpe3JldHVybiBILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSksQjt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBIPXIuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09SHx8ImluaGVyaXQiPT09SH0pLmVhY2goZnVuY3Rpb24oSCxLKXtIPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIEw9ci5zZWxlY3QodGhpcyksSj1EW0tdLE89RFtLKzFdO0s9bnVsbCE9QiYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEgsQik7Sj1udWxsIT1KJiZuLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSCwKSik7Tz1udWxsIT1PJiZuLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSCxPKTsheChIKXx8S3x8Snx8Tz9MLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik6KEI9SCxMLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpKX0pfTtBLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt3LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gQX0ocS5BeGlzKTtoLlRJTUVfQVhJU19USUVSX0NMQVNTPSJ0aW1lLWF4aXMtdGllciI7aC5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVg9KHU9e30sdVtmLlRpbWVJbnRlcnZhbC5zZWNvbmRdPTAsdVtmLlRpbWVJbnRlcnZhbC5taW51dGVdPTEsdVtmLlRpbWVJbnRlcnZhbC5ob3VyXT0yLHVbZi5UaW1lSW50ZXJ2YWwuZGF5XT0zLHVbZi5UaW1lSW50ZXJ2YWwud2Vla109NCx1W2YuVGltZUludGVydmFsLm1vbnRoXT01LHVbZi5UaW1lSW50ZXJ2YWwueWVhcl09CjYsdSk7aC5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlM9W1t7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6NSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjE1LApmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MzAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSwKW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjMwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LApzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDozLGZvcm1hdHRlcjpwLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Nixmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEyLGZvcm1hdHRlcjpwLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVhICVlIil9LAp7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWUiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDozLGZvcm1hdHRlcjpwLnRpbWUoIiViIil9LAp7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDo2LGZvcm1hdHRlcjpwLnRpbWUoIiViIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIleSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjUsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSwKW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MTAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoyMDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MUUzLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XV07aC5fTE9OR19EQVRFPW5ldyBEYXRlKDk5OTksOCwyOSwxMiw1OSw5OTk5KTtmLlRpbWU9aDt2YXIgdX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9CnAucHJvdG90eXBlLG5ldyBtKX0scj1oKDEyKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT1sLmNhbGwodGhpcyl8fHRoaXM7bS5fZGV0YWNoQ2FsbGJhY2s9ZnVuY3Rpb24obil7cmV0dXJuIG0ucmVtb3ZlKG4pfTtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7bT1yLmNvZXJjZUV4dGVybmFsRDMobSk7bC5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxtKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBxLmFuY2hvcihuLmVsZW1lbnQoKSl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5yZW5kZXIoKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiaGFzKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307cC5wcm90b3R5cGUuX2Fkb3B0QW5kQW5jaG9yPQpmdW5jdGlvbihtKXttLnBhcmVudCh0aGlzKTttLm9uRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKTt0aGlzLl9pc0FuY2hvcmVkJiZtLmFuY2hvcih0aGlzLmVsZW1lbnQoKSl9O3AucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihtKXt0aGlzLmhhcyhtKSYmKG0ub2ZmRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKSx0aGlzLl9yZW1vdmUobSksbS5kZXRhY2goKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbigpe307cC5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiX2ZvckVhY2goKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIik7fTtwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0uZGVzdHJveSgpfSl9O3AucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT0KZnVuY3Rpb24oKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLmludmFsaWRhdGVDYWNoZSgpfSl9O3JldHVybiBwfShoKDQpLkNvbXBvbmVudCk7Zi5Db21wb25lbnRDb250YWluZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoQSl7bi5hZGQoQSk7bS5hZGQoQSk7cigpfWZ1bmN0aW9uIHIoKXtxfHwocT0hMCx3LnJlbmRlcigpKX12YXIgbD1oKDApO2Q9aCgxMCk7dmFyIHA9aCgzOSksbT1uZXcgbC5TZXQsbj1uZXcgbC5TZXQscT0hMSx1PSExO2YuUG9saWN5PWQubWFrZUVudW0oWyJpbW1lZGlhdGUiLCJhbmltYXRpb25GcmFtZSIsInRpbWVvdXQiXSk7dmFyIHc9bmV3IHAuQW5pbWF0aW9uRnJhbWU7Zi5yZW5kZXJQb2xpY3k9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdztzd2l0Y2goQSl7Y2FzZSBmLlBvbGljeS5pbW1lZGlhdGU6dz1uZXcgcC5JbW1lZGlhdGU7YnJlYWs7Y2FzZSBmLlBvbGljeS5hbmltYXRpb25GcmFtZTp3PW5ldyBwLkFuaW1hdGlvbkZyYW1lOwpicmVhaztjYXNlIGYuUG9saWN5LnRpbWVvdXQ6dz1uZXcgcC5UaW1lb3V0O2JyZWFrO2RlZmF1bHQ6bC5XaW5kb3cud2FybigiVW5yZWNvZ25pemVkIHJlbmRlclBvbGljeTogIitBKX19O2YucmVnaXN0ZXJUb1JlbmRlcj1mdW5jdGlvbihBKXt1JiZsLldpbmRvdy53YXJuKCJSZWdpc3RlcmVkIHRvIHJlbmRlciB3aGlsZSBvdGhlciBjb21wb25lbnRzIGFyZSBmbHVzaGluZzogcmVxdWVzdCBtYXkgYmUgaWdub3JlZCIpO20uYWRkKEEpO3IoKX07Zi5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcj1rO2YucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oQSl7ayhBKX07Zi5mbHVzaD1mdW5jdGlvbigpe2lmKHEpe24uZm9yRWFjaChmdW5jdGlvbih5KXtyZXR1cm4geS5jb21wdXRlTGF5b3V0KCl9KTttLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkucmVuZGVyKCl9KTt1PSEwO3ZhciBBPW5ldyBsLlNldDttLmZvckVhY2goZnVuY3Rpb24oeSl7dHJ5e3kucmVuZGVySW1tZWRpYXRlbHkoKX1jYXRjaCh4KXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHg7Cn0sMCksQS5hZGQoeSl9fSk7bj1uZXcgbC5TZXQ7bT1BO3U9cT0hMX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKTtmLmNpcmNsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sQ2lyY2xlKS5zaXplKE1hdGguUEkqTWF0aC5wb3cobC8yLDIpKX19O2Yuc3F1YXJlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xTcXVhcmUpLnNpemUoTWF0aC5wb3cobCwyKSl9fTtmLmNyb3NzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xDcm9zcykuc2l6ZSg1LzkqTWF0aC5wb3cobCwyKSl9fTtmLmRpYW1vbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbERpYW1vbmQpLnNpemUoTWF0aC50YW4oTWF0aC5QSS82KSpNYXRoLnBvdyhsLDIpLwoyKX19O2YudHJpYW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFRyaWFuZ2xlKS5zaXplKE1hdGguc3FydCgzKSpNYXRoLnBvdyhsLzIsMikpfX07Zi5zdGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xTdGFyKS5zaXplKC44OTA4MTMwOTE1MjkyODUyKk1hdGgucG93KGwvMiwyKSl9fTt2YXIgcj0zKigxL01hdGguc3FydCgxMikvMisxKTtmLnd5ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sV3llKS5zaXplKHIqTWF0aC5wb3cobC8yLjQsMikpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgdyBpbiBxKXEuaGFzT3duUHJvcGVydHkodykmJihuW3ddPQpxW3ddKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHI9aCgyNSksbD1oKDApLHA9aCgxMiksbT1oKDM3KTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fZGV0ZWN0aW9uUmFkaXVzPTM7dS5fcmVzaXphYmxlPSExO3UuX21vdmFibGU9ITE7dS5faGFzQ29ybmVycz0hMDt1LmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpO3UuX2RyYWdJbnRlcmFjdGlvbj1uZXcgci5EcmFnO3UuX3NldFVwQ2FsbGJhY2tzKCk7dS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHUpO3UuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt1Ll9kcmFnQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3UuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7cmV0dXJuIHV9ayhxLG4pO3EucHJvdG90eXBlLl9zZXRVcENhbGxiYWNrcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoSCwKSyl7MD09PUImJkgueD09PUsueCYmSC55PT09Sy55JiZ5LmJveFZpc2libGUoITEpO3kuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5LmJvdW5kcygpKX1mdW5jdGlvbiB3KEgsSyl7c3dpdGNoKEIpe2Nhc2UgMDpHLng9Sy54O0cueT1LLnk7YnJlYWs7Y2FzZSAxOnguYm90dG9tP0cueT1LLnk6eC50b3AmJihDLnk9Sy55KTt4LnJpZ2h0P0cueD1LLng6eC5sZWZ0JiYoQy54PUsueCk7YnJlYWs7Y2FzZSAyOkg9Sy54LUQueDt2YXIgTD1LLnktRC55O0MueCs9SDtDLnkrPUw7Ry54Kz1IO0cueSs9TDtEPUt9eS5fc2V0Qm91bmRzKHt0b3BMZWZ0OkMsYm90dG9tUmlnaHQ6R30pO3kuX3hCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueFNjYWxlKCkmJnkuX3NldFhFeHRlbnQoW3kueFNjYWxlKCkuaW52ZXJ0KEMueCkseS54U2NhbGUoKS5pbnZlcnQoRy54KV0pO3kuX3lCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueVNjYWxlKCkmJgp5Ll9zZXRZRXh0ZW50KFt5LnlTY2FsZSgpLmludmVydChDLnkpLHkueVNjYWxlKCkuaW52ZXJ0KEcueSldKTt5LnJlbmRlcigpO3kuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5LmJvdW5kcygpKX1mdW5jdGlvbiBBKEgpe3g9eS5fZ2V0UmVzaXppbmdFZGdlcyhIKTt2YXIgSz15LmJvdW5kcygpO0s9Sy50b3BMZWZ0Lng8PUgueCYmSC54PD1LLmJvdHRvbVJpZ2h0LngmJksudG9wTGVmdC55PD1ILnkmJkgueTw9Sy5ib3R0b21SaWdodC55O3kuYm94VmlzaWJsZSgpJiYoeC50b3B8fHguYm90dG9tfHx4LmxlZnR8fHgucmlnaHQpP0I9MTp5LmJveFZpc2libGUoKSYmeS5tb3ZhYmxlKCkmJks/Qj0yOihCPTAseS5fc2V0Qm91bmRzKHt0b3BMZWZ0OkgsYm90dG9tUmlnaHQ6SH0pLHkuX3hCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueFNjYWxlKCkmJnkuX3NldFhFeHRlbnQoW3kueFNjYWxlKCkuaW52ZXJ0KEgueCkseS54U2NhbGUoKS5pbnZlcnQoSC54KV0pLAp5Ll95Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnlTY2FsZSgpJiZ5Ll9zZXRZRXh0ZW50KFt5LnlTY2FsZSgpLmludmVydChILnkpLHkueVNjYWxlKCkuaW52ZXJ0KEgueSldKSx5LnJlbmRlcigpKTt5LmJveFZpc2libGUoITApO0s9eS5ib3VuZHMoKTtDPXt4OksudG9wTGVmdC54LHk6Sy50b3BMZWZ0Lnl9O0c9e3g6Sy5ib3R0b21SaWdodC54LHk6Sy5ib3R0b21SaWdodC55fTtEPUg7eS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoSyl9dmFyIHk9dGhpcyx4LEMsRyxELEI9MDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh3KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHUpO3RoaXMuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoQSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodyk7CnkuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHUpO3kuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4gdy5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX12YXIgdz10aGlzO24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2RldGVjdGlvbkVkZ2VUPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlQj11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUw9dSgpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VSPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTtpZih0aGlzLl9oYXNDb3JuZXJzKXt2YXIgQT1mdW5jdGlvbigpe3JldHVybiB3Ll9ib3guYXBwZW5kKCJjaXJjbGUiKS5zdHlsZXMoe29wYWNpdHk6MCwKZmlsbDoicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZUZpbGwifSl9O3RoaXMuX2RldGVjdGlvbkNvcm5lclRMPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10bCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lclRSPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10ciIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJMPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1ibCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJSPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1iciIsITApfX07cS5wcm90b3R5cGUuX2dldFJlc2l6aW5nRWRnZXM9ZnVuY3Rpb24odSl7dmFyIHc9e3RvcDohMSxib3R0b206ITEsbGVmdDohMSxyaWdodDohMX07aWYoIXRoaXMucmVzaXphYmxlKCkpcmV0dXJuIHc7dmFyIEE9dGhpcy5ib3VuZHMoKSx5PUEudG9wTGVmdC55LHg9QS5ib3R0b21SaWdodC55LEM9QS50b3BMZWZ0Lng7QT1BLmJvdHRvbVJpZ2h0Lng7dmFyIEc9dGhpcy5fZGV0ZWN0aW9uUmFkaXVzOwpDLUc8PXUueCYmdS54PD1BK0cmJih3LnRvcD15LUc8PXUueSYmdS55PD15K0csdy5ib3R0b209eC1HPD11LnkmJnUueTw9eCtHKTt5LUc8PXUueSYmdS55PD14K0cmJih3LmxlZnQ9Qy1HPD11LngmJnUueDw9QytHLHcucmlnaHQ9QS1HPD11LngmJnUueDw9QStHKTtyZXR1cm4gd307cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuYm94VmlzaWJsZSgpKXt2YXIgdT10aGlzLmJvdW5kcygpLHc9dS50b3BMZWZ0LnksQT11LmJvdHRvbVJpZ2h0LnkseT11LnRvcExlZnQueDt1PXUuYm90dG9tUmlnaHQueDt0aGlzLl9kZXRlY3Rpb25FZGdlVC5hdHRycyh7eDE6eSx5MTp3LHgyOnUseTI6dywic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VCLmF0dHJzKHt4MTp5LHkxOkEseDI6dSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqCnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VMLmF0dHJzKHt4MTp5LHkxOncseDI6eSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZVIuYXR0cnMoe3gxOnUseTE6dyx4Mjp1LHkyOkEsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9oYXNDb3JuZXJzJiYodGhpcy5fZGV0ZWN0aW9uQ29ybmVyVEwuYXR0cnMoe2N4OnksY3k6dyxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lclRSLmF0dHJzKHtjeDp1LGN5Oncscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTC5hdHRycyh7Y3g6eSxjeTpBLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQlIuYXR0cnMoe2N4OnUsY3k6QSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pKX1yZXR1cm4gdGhpc307CnEucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9O3EucHJvdG90eXBlLnJlc2l6YWJsZT1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9yZXNpemFibGU7dGhpcy5fcmVzaXphYmxlPXU7dGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odSl7dSYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKSl9O3EucHJvdG90eXBlLm1vdmFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW92YWJsZX07cS5wcm90b3R5cGUuX3NldE1vdmFibGVDbGFzcz1mdW5jdGlvbigpe3RoaXMubW92YWJsZSgpJiZ0aGlzLmVuYWJsZWQoKT8KdGhpcy5hZGRDbGFzcygibW92YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIm1vdmFibGUiKX07cS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh1KX07cS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbih1KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbih1KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKHUpfTtxLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5kcmFnSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufTsKcS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHUpO3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModGhpcy5yZXNpemFibGUoKSk7dGhpcy5fc2V0TW92YWJsZUNsYXNzKCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdT10aGlzO24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih3KXtyZXR1cm4gdS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodyl9KTt0aGlzLl9kcmFnQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24odyl7cmV0dXJuIHUuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHcpfSk7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHcpe3JldHVybiB1Ll9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh3KX0pOwp0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRTdGF0ZSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKTtuLnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHUpe3U9cC5jb2VyY2VFeHRlcm5hbEQzKHUpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTtuLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLHUpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fcmVzZXRTdGF0ZT1mdW5jdGlvbigpe3RoaXMuYm91bmRzKHt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDowLHk6MH19KX07cmV0dXJuIHF9KGgoNDMpLlNlbGVjdGlvbkJveExheWVyKTtmLkRyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9CnB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3JldHVybiBwLmNhbGwodGhpcywicGF0aCIsImxpbmUiKXx8dGhpc31rKG0scCk7bS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24obil7bi5zdHlsZSgiZmlsbCIsIm5vbmUiKX07bS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbigpe3JldHVybiBwLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywwKX07cmV0dXJuIG19KGgoOSkuU1ZHRHJhd2VyKTtmLkxpbmVTVkdEcmF3ZXI9ZDt2YXIgbD1bIm9wYWNpdHkiLCJzdHJva2Utb3BhY2l0eSIsInN0cm9rZS13aWR0aCIsInN0cm9rZSJdO2YubWFrZUxpbmVDYW52YXNEcmF3U3RlcD0KZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKG0sbixxKXtxPXIucmVzb2x2ZUF0dHJpYnV0ZXMocSxsLG5bMF0sMCk7ci5yZW5kZXJMaW5lKG0scCgpLG5bMF0scSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHE9cC5jYWxsKHRoaXMsInJlY3QiLCIiKXx8dGhpcztxLl9yb290Q2xhc3NOYW1lPW47cS5fcm9vdC5jbGFzc2VkKHEuX3Jvb3RDbGFzc05hbWUsITApO3JldHVybiBxfWsobSxwKTtyZXR1cm4gbX0oaCg5KS5TVkdEcmF3ZXIpO2YuUmVjdGFuZ2xlU1ZHRHJhd2VyPQpkO3ZhciBsPVsieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdO2YuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocCxtLG4pe3Auc2F2ZSgpO20uZm9yRWFjaChmdW5jdGlvbihxLHUpe251bGwhPXEmJihxPXIucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKG4sbCxxLHUpLHAuYmVnaW5QYXRoKCkscC5yZWN0KHEueCxxLnkscS53aWR0aCxxLmhlaWdodCksci5yZW5kZXJQYXRoV2l0aFN0eWxlKHAscSkpfSk7cC5yZXN0b3JlKCl9O2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXtyZXR1cm4gcC5jYWxsKHRoaXMsbixmLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwKXx8dGhpc31rKG0scCk7cmV0dXJuIG19KHIuQ2FudmFzRHJhd2VyKTtmLlJlY3RhbmdsZUNhbnZhc0RyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtsLlNIT1dfV0FSTklOR1MmJmNvbnNvbGUud2FybihwKX1mdW5jdGlvbiByKHAsbSl7Zm9yKHZhciBuPVtdLHE9MjtxPGFyZ3VtZW50cy5sZW5ndGg7cSsrKW5bcS0KMl09YXJndW1lbnRzW3FdO3JldHVybiAwPT09bT8ocChuKSwtMSk6d2luZG93LnNldFRpbWVvdXQocCxtLG4pfXZhciBsPWgoMjMpO2Yud2Fybj1rO2Yuc2V0VGltZW91dD1yO2YuZGVib3VuY2U9ZnVuY3Rpb24ocCxtLG4pe2Z1bmN0aW9uIHEoKXttLmFwcGx5KG4sdyl9dmFyIHU9bnVsbCx3PVtdO3JldHVybiBmdW5jdGlvbigpe3c9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtjbGVhclRpbWVvdXQodSk7dT1yKHEscCl9fTtmLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24ocCxtLG4pe3ZvaWQgMD09PW4mJihuPSIiKTtrKCJNZXRob2QgIitwKyIgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uICIrbSsiLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHJlbGVhc2Ugbm90ZXMuICIrbil9fSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMucnVsZXI9bnVsbCE9ay5jcmVhdGVSdWxlcj9rLmNyZWF0ZVJ1bGVyKCk6a31oLnByb3RvdHlwZS5tZWFzdXJlPQpmdW5jdGlvbihrKXt2b2lkIDA9PT1rJiYoaz1oLkhFSUdIVF9URVhUKTtyZXR1cm4gdGhpcy5ydWxlcihrKX07cmV0dXJuIGh9KCk7ZC5IRUlHSFRfVEVYVD0iYmRwcWwiO2YuQWJzdHJhY3RNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhyKXtmb3IodmFyIGwgaW4gcilmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT1yW2xdKX1rKGgoMzIpKTtrKGgoNzQpKTtrKGgoNzUpKTtrKGgoNDEpKTtrKGgoNDIpKTtrKGgoNzYpKTtrKGgoNzcpKTtrKGgoNzgpKTtrKGgoNzkpKTtrKGgoNDMpKTtrKGgoODApKTtrKGgoODEpKTtrKGgoODIpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHIobCxwKXt2b2lkIDA9PT1sJiYobD1bXSk7dm9pZCAwPT09cCYmKHA9e30pO3RoaXMuX3VwZGF0ZUlkPTA7dGhpcy5fZGF0YT1sO3RoaXMuX21ldGFkYXRhPXA7dGhpcy5fY2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0fXIucHJvdG90eXBlLm9uVXBkYXRlPQpmdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuYWRkKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShsKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9kYXRhO3RoaXMuX2RhdGE9bDt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5tZXRhZGF0YT1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9tZXRhZGF0YTt0aGlzLl9tZXRhZGF0YT1sO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLnVwZGF0ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZUlkfTtyLnByb3RvdHlwZS5fZGlzcGF0Y2hVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJZCsrO3RoaXMuX2NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpfTtyZXR1cm4gcn0oKTsKZi5EYXRhc2V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApLHI9aCgzMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7ci5mbHVzaCgpfTtyZXR1cm4gbH0oKTtmLkltbWVkaWF0ZT1kO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7fWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2suRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKHIuZmx1c2gpfTtyZXR1cm4gbH0oKTtmLkFuaW1hdGlvbkZyYW1lPWQ7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl90aW1lb3V0TXNlYz1rLkRPTS5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EU31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHIuZmx1c2gsdGhpcy5fdGltZW91dE1zZWMpfTtyZXR1cm4gbH0oKTtmLlRpbWVvdXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLAptKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0scj1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX2tleVByZXNzQ2FsbGJhY2tzPXt9O24uX2tleVJlbGVhc2VDYWxsYmFja3M9e307bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bi5fZG93bmVkS2V5cz1uZXcgbC5TZXQ7bi5fa2V5RG93bkNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUtleURvd25FdmVudChxLHUpfTtuLl9rZXlVcENhbGxiYWNrPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9oYW5kbGVLZXlVcEV2ZW50KHEpfTtyZXR1cm4gbn1rKG0scCk7Cm0ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPXIuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXI9ci5LZXkuZ2V0RGlzcGF0Y2hlcigpO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spfTttLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub2ZmTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9bnVsbDsKdGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVLZXlEb3duRXZlbnQ9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5sYXN0TW91c2VQb3NpdGlvbigpKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh1KSYmIXEucmVwZWF0JiYodGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0mJnRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLmNhbGxDYWxsYmFja3MobiksdGhpcy5fZG93bmVkS2V5cy5hZGQobikpfTttLnByb3RvdHlwZS5faGFuZGxlS2V5VXBFdmVudD1mdW5jdGlvbihuKXt0aGlzLl9kb3duZWRLZXlzLmhhcyhuKSYmdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXSYmdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5jYWxsQ2FsbGJhY2tzKG4pOwp0aGlzLl9kb3duZWRLZXlzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25LZXlQcmVzcz1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dfHwodGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl09bmV3IGwuQ2FsbGJhY2tTZXQpO3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLmFkZChxKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmS2V5UHJlc3M9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5kZWxldGUocSk7MD09PXRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25LZXlSZWxlYXNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXXx8KHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl09bmV3IGwuQ2FsbGJhY2tTZXQpO3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uYWRkKHEpO3JldHVybiB0aGlzfTsKbS5wcm90b3R5cGUub2ZmS2V5UmVsZWFzZT1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uZGVsZXRlKHEpOzA9PT10aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuS2V5PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0scj1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXt2b2lkIDA9PT1tJiYobT1bXSk7dmFyIG49bC5jYWxsKHRoaXMpfHx0aGlzO24uX2NvbXBvbmVudHM9CltdO24uYWRkQ2xhc3MoImNvbXBvbmVudC1ncm91cCIpO20uZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5hcHBlbmQocSl9KTtyZXR1cm4gbn1rKHAsbCk7cC5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24obSl7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChtKX07cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG0pe3JldHVybiAwPD10aGlzLl9jb21wb25lbnRzLmluZGV4T2YobSl9O3AucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG0sbil7dmFyIHE9dGhpcy5fY29tcG9uZW50cy5tYXAoZnVuY3Rpb24odSl7cmV0dXJuIHUucmVxdWVzdGVkU3BhY2UobSxuKX0pO3JldHVybnttaW5XaWR0aDpyLk1hdGgubWF4KHEsZnVuY3Rpb24odSl7cmV0dXJuIHUubWluV2lkdGh9LDApLG1pbkhlaWdodDpyLk1hdGgubWF4KHEsZnVuY3Rpb24odSl7cmV0dXJuIHUubWluSGVpZ2h0fSwwKX19O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obSxuLHEpe3ZhciB1PQp0aGlzO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLG0sbixxKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuY29tcHV0ZUxheW91dCh7eDowLHk6MH0sdS53aWR0aCgpLHUuaGVpZ2h0KCkpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG0sbil7cmV0dXJue3dpZHRoOm0saGVpZ2h0Om59fTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoZnVuY3Rpb24obSl7cmV0dXJuIG0uZml4ZWRXaWR0aCgpfSl9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoZnVuY3Rpb24obSl7cmV0dXJuIG0uZml4ZWRIZWlnaHQoKX0pfTtwLnByb3RvdHlwZS5jb21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuc2xpY2UoKX07cC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKG0pe251bGw9PQptfHx0aGlzLmhhcyhtKXx8KG0uZGV0YWNoKCksdGhpcy5fY29tcG9uZW50cy5wdXNoKG0pLHRoaXMuX2Fkb3B0QW5kQW5jaG9yKG0pLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKG0pOzA8PW0mJnRoaXMuX2NvbXBvbmVudHMuc3BsaWNlKG0sMSl9O3JldHVybiBwfShoKDI5KS5Db21wb25lbnRDb250YWluZXIpO2YuR3JvdXA9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtoKDApO2Q9aCg0KTt2YXIgcjsoZnVuY3Rpb24obCl7bFtsLlZBTFVFPTBdPQoiVkFMVUUiO2xbbC5QSVhFTD0xXT0iUElYRUwifSkocnx8KHI9e30pKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7dmFyIG49bC5jYWxsKHRoaXMpfHx0aGlzO24uX21vZGU9ci5WQUxVRTtpZihtIT09cC5PUklFTlRBVElPTl9WRVJUSUNBTCYmbSE9PXAuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEd1aWRlTGluZUxheWVyIik7bi5fb3JpZW50YXRpb249bTtuLl9vdmVyZmxvd0hpZGRlbj0hMDtuLmFkZENsYXNzKCJndWlkZS1saW5lLWxheWVyIik7bi5faXNWZXJ0aWNhbCgpP24uYWRkQ2xhc3MoInZlcnRpY2FsIik6bi5hZGRDbGFzcygiaG9yaXpvbnRhbCIpO24uX3NjYWxlVXBkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtuLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7bi5yZW5kZXIoKX07cmV0dXJuIG59ayhwLGwpO3AucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2wucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9ndWlkZUxpbmU9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiZ3VpZGUtbGluZSIsITApfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihtLG4pe3JldHVybnt3aWR0aDptLGhlaWdodDpufX07cC5wcm90b3R5cGUuX2lzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249PT1wLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obSxuLHEpe2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLG0sbixxKTtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5zY2FsZSgpLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pOnRoaXMuc2NhbGUoKS5yYW5nZShbdGhpcy5oZWlnaHQoKSwKMF0pKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLl9ndWlkZUxpbmUuYXR0cnMoe3gxOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTowLHkxOnRoaXMuX2lzVmVydGljYWwoKT8wOnRoaXMucGl4ZWxQb3NpdGlvbigpLHgyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTp0aGlzLndpZHRoKCkseTI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy5waXhlbFBvc2l0aW9uKCl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9tb2RlPT09ci5WQUxVRSYmbnVsbCE9dGhpcy52YWx1ZSgpP3RoaXMuX3BpeGVsUG9zaXRpb249CnRoaXMuc2NhbGUoKS5zY2FsZSh0aGlzLnZhbHVlKCkpOnRoaXMuX21vZGU9PT1yLlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9O3AucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbihtKXt0aGlzLl9waXhlbFBvc2l0aW9uPW07bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpO3RoaXMucmVuZGVyKCl9O3AucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX3NjYWxlO3ZhciBuPXRoaXMuX3NjYWxlO251bGwhPW4mJm4ub2ZmVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spO3RoaXMuX3NjYWxlPW07dGhpcy5fc2NhbGUub25VcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayk7CnRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl92YWx1ZTt0aGlzLl92YWx1ZT1tO3RoaXMuX21vZGU9ci5WQUxVRTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucGl4ZWxQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9waXhlbFBvc2l0aW9ufTtwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO251bGwhPXRoaXMuc2NhbGUoKSYmdGhpcy5zY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKX07cmV0dXJuIHB9KGQuQ29tcG9uZW50KTtkLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMPSJ2ZXJ0aWNhbCI7ZC5PUklFTlRBVElPTl9IT1JJWk9OVEFMPSJob3Jpem9udGFsIjsKZi5HdWlkZUxpbmVMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgwKTtkPWgoNCk7dmFyIGw7KGZ1bmN0aW9uKHApe3BbcC5WQUxVRT0wXT0iVkFMVUUiO3BbcC5QSVhFTD0xXT0iUElYRUwifSkobD1mLlByb3BlcnR5TW9kZXx8KGYuUHJvcGVydHlNb2RlPXt9KSk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2JveFZpc2libGU9ITE7bi5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDowLHk6MH19O24uX3hCb3VuZHNNb2RlPWwuUElYRUw7bi5feUJvdW5kc01vZGU9CmwuUElYRUw7bi5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpO24uX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7bi5yZW5kZXIoKX07bi5fb3ZlcmZsb3dIaWRkZW49ITA7bi5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF07bi5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3AucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzZWxlY3Rpb24tYm94IiwhMCkucmVtb3ZlKCk7dGhpcy5fYm94QXJlYT10aGlzLl9ib3guYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic2VsZWN0aW9uLWFyZWEiLCEwKX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obixxKXtyZXR1cm57d2lkdGg6bixoZWlnaHQ6cX19O20ucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9nZXRCb3VuZHMoKTsKdGhpcy5fc2V0Qm91bmRzKG4pO3RoaXMuX3lCb3VuZHNNb2RlPXRoaXMuX3hCb3VuZHNNb2RlPWwuUElYRUw7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihuKXt0aGlzLl9ib3hCb3VuZHM9e3RvcExlZnQ6e3g6TWF0aC5taW4obi50b3BMZWZ0Lngsbi5ib3R0b21SaWdodC54KSx5Ok1hdGgubWluKG4udG9wTGVmdC55LG4uYm90dG9tUmlnaHQueSl9LGJvdHRvbVJpZ2h0Ont4Ok1hdGgubWF4KG4udG9wTGVmdC54LG4uYm90dG9tUmlnaHQueCkseTpNYXRoLm1heChuLnRvcExlZnQueSxuLmJvdHRvbVJpZ2h0LnkpfX19O20ucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWwuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1pbih0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSwKdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5taW4odGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfSxib3R0b21SaWdodDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWwuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5tYXgodGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWF4KHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLAp0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9fX07bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuX2JveFZpc2libGUpe3ZhciBuPXRoaXMuYm91bmRzKCkscT1uLnRvcExlZnQueSx1PW4uYm90dG9tUmlnaHQueSx3PW4udG9wTGVmdC54O249bi5ib3R0b21SaWdodC54O2lmKCEoci5NYXRoLmlzVmFsaWROdW1iZXIocSkmJnIuTWF0aC5pc1ZhbGlkTnVtYmVyKHUpJiZyLk1hdGguaXNWYWxpZE51bWJlcih3KSYmci5NYXRoLmlzVmFsaWROdW1iZXIobikpKXRocm93IEVycm9yKCJib3VuZHMgaGF2ZSBub3QgYmVlbiBwcm9wZXJseSBzZXQiKTt0aGlzLl9ib3hBcmVhLmF0dHJzKHt4OncseTpxLHdpZHRoOm4tdyxoZWlnaHQ6dS1xfSk7dGhpcy5jb250ZW50KCkubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2JveC5ub2RlKCkpfWVsc2UgdGhpcy5fYm94LnJlbW92ZSgpOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuYm94VmlzaWJsZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9ib3hWaXNpYmxlO3RoaXMuX2JveFZpc2libGU9bjt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O20ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O20ucHJvdG90eXBlLnhTY2FsZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl94U2NhbGU7bnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl94U2NhbGU9bjt0aGlzLl94Qm91bmRzTW9kZT1sLlZBTFVFO3RoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueVNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PQpuKXJldHVybiB0aGlzLl95U2NhbGU7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl95U2NhbGU9bjt0aGlzLl95Qm91bmRzTW9kZT1sLlZBTFVFO3RoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRYRXh0ZW50KCl9O20ucHJvdG90eXBlLl9nZXRYRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3hCb3VuZHNNb2RlPT09bC5WQUxVRT90aGlzLl94RXh0ZW50Om51bGw9PXRoaXMuX3hTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueCksdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueCldfTttLnByb3RvdHlwZS5fc2V0WEV4dGVudD0KZnVuY3Rpb24obil7dGhpcy5feEV4dGVudD1ufTttLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFlFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feUJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3lFeHRlbnQ6bnVsbD09dGhpcy5feVNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55KSx0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55KV19O20ucHJvdG90eXBlLl9zZXRZRXh0ZW50PWZ1bmN0aW9uKG4pe3RoaXMuX3lFeHRlbnQ9bn07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3AucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMueFNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTtudWxsIT10aGlzLl95U2NhbGUmJgp0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9O3JldHVybiBtfShkLkNvbXBvbmVudCk7Zi5TZWxlY3Rpb25Cb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3JldHVybiByLmNhbGwodGhpcywicGF0aCIsImFyYyBmaWxsIil8fHRoaXN9ayhsLHIpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoInN0cm9rZSIsIm5vbmUiKX07cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLkFyY1NWR0RyYXdlcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHJbbV09bFttXSk7ci5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gci5jYWxsKHRoaXMsInBhdGgiLCJhcmMgb3V0bGluZSIpfHx0aGlzfWsobCxyKTtsLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihwKXtwLnN0eWxlKCJmaWxsIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjT3V0bGluZVNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9CnB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3JldHVybiBwLmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31rKG0scCk7bS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24obil7bi5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTttLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXguY2FsbCh0aGlzLDApfTtyZXR1cm4gbX0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJlYVNWR0RyYXdlcj1kO3ZhciBsPVsiZmlsbCIsIm9wYWNpdHkiLCJmaWxsLW9wYWNpdHkiXTtmLm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKG0sCm4scSl7cT1yLnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3IucmVuZGVyQXJlYShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocixsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJihyW21dPWxbbV0pO3IucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbihyKXtmdW5jdGlvbiBsKCl7cmV0dXJuIHIuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9ayhsLHIpO3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5TZWdtZW50U1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKG4scSx1LHcsQSl7cmV0dXJuIDA8PXUrQSYmdS1BPD1uJiYwPD13K0EmJnctQTw9cX1mdW5jdGlvbiByKG4scSx1KXtpZihudWxsPT1uKXJldHVybiExOwpmb3IodmFyIHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIEE9dVt3XTtpZihuW0FdIT1xW0FdKXJldHVybiExfXJldHVybiEwfXZhciBsPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB3IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh3KSYmKG5bd109cVt3XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxwPWgoODYpLG09aCgxOCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7cmV0dXJuIG4uY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9bChxLG4pO3JldHVybiBxfShoKDkpLlNWR0RyYXdlcik7Zi5TeW1ib2xTVkdEcmF3ZXI9ZDtmLm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihuLHEsdSl7dmFyIHc9dGhpcztyZXR1cm4gZnVuY3Rpb24oQSx5LHgpe3ZhciBDPUEuY2FudmFzLEc9Qy5jbGllbnRXaWR0aDsKQz1DLmNsaWVudEhlaWdodDtmb3IodmFyIEQ9bmV3IHAuQ2FudmFzQnVmZmVyKDAsMCksQj1xKCksSD11KCksSz1udWxsLEw9bnVsbCxKPW51bGwsTz0wO088eS5sZW5ndGg7TysrKXt2YXIgUz15W09dO2lmKG51bGwhPVMpe3ZhciBOPW0ucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHgsWyJ4IiwieSJdLFMsTyksUj1IKFMsTyxuKTtpZihrKEcsQyxOLngsTi55LFIpKXt2YXIgWD1yKEssTixtLkNvbnRleHRTdHlsZUF0dHJzKTtTPUIoUyxPLHcuX2RhdGFzZXQpO1gmJko9PVImJkw9PVN8fChLPW0uZ2V0U3Ryb2tlV2lkdGgoTiksSz1SK0srMSwoSz5ELnNjcmVlbldpZHRofHxLPkQuc2NyZWVuSGVpZ2h0KSYmRC5yZXNpemUoSyxLLCEwKSxELmNsZWFyKCksSz1ELmN0eCxLLmJlZ2luUGF0aCgpLFMoUikuY29udGV4dChLKShudWxsKSxLLmNsb3NlUGF0aCgpLG0ucmVuZGVyUGF0aFdpdGhTdHlsZShLLE4pLEw9UyxKPVIsSz1OKTtELmJsaXRDZW50ZXIoQSxOLngsTi55KX19fX19fSwKZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoRCl7cmV0dXJuIEQgaW5zdGFuY2VvZiB5P0Q6RCBpbnN0YW5jZW9mIERhdGU/cChELnZhbHVlT2YoKSk6RCBpbnN0YW5jZW9mIEEuU2NhbGU/cihEKTpEIGluc3RhbmNlb2Ygdy5EYXRhc2V0P2woRCk6dShEKT9uKEQpOkFycmF5LmlzQXJyYXkoRCk/bShEKTpwKEQpfWZ1bmN0aW9uIHIoRCl7RD17ZG9tYWluOkQuZG9tYWluKCkscmFuZ2U6RC5yYW5nZSgpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKSxyZWY6cChEKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gbChEKXtEPXtyZWY6cChEKSx1cGRhdGVJZDpELnVwZGF0ZUlkKCl9O3JldHVybiBuKEQpfWZ1bmN0aW9uIHAoRCl7cmV0dXJuIG5ldyBDKEQpfWZ1bmN0aW9uIG0oRCl7cmV0dXJuIG5ldyB4KEQubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBrKEIpfSkpfWZ1bmN0aW9uIG4oRCl7dmFyIEI9e30sSDtmb3IoSCBpbiBEKUQuaGFzT3duUHJvcGVydHkoSCkmJihCW0hdPWsoRFtIXSkpO3JldHVybiBuZXcgRyhCKX0KdmFyIHE9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSCgpe3RoaXMuY29uc3RydWN0b3I9RH1mb3IodmFyIEsgaW4gQilCLmhhc093blByb3BlcnR5KEspJiYoRFtLXT1CW0tdKTtELnByb3RvdHlwZT1udWxsPT09Qj9PYmplY3QuY3JlYXRlKEIpOihILnByb3RvdHlwZT1CLnByb3RvdHlwZSxuZXcgSCl9LHU9aCgxMjgpLHc9aCgzOCksQT1oKDE3KTtmLnNpZ249aztmLnNpZ25TY2FsZT1yO2Yuc2lnbkRhdGFzZXQ9bDtmLnNpZ25SZWY9cDtmLnNpZ25BcnJheT1tO2Yuc2lnbk9iaj1uO3ZhciB5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRCgpe31ELnByb3RvdHlwZS5pc0RpZmZlcmVudD1mdW5jdGlvbihCKXtyZXR1cm4gQiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/dGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudChCKTohMH07cmV0dXJuIER9KCk7Zi5TaWduYXR1cmU9eTt2YXIgeD1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEgpe3ZhciBLPUQuY2FsbCh0aGlzKXx8CnRoaXM7Sy5hcnJheT1IO3JldHVybiBLfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihIKXtpZihILmFycmF5Lmxlbmd0aCE9PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgSz0wO0s8dGhpcy5hcnJheS5sZW5ndGg7SysrKWlmKHRoaXMuYXJyYXlbS10uaXNEaWZmZXJlbnQoSC5hcnJheVtLXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLkFycmF5U2lnbmF0dXJlPXg7dmFyIEM9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihIKXt2YXIgSz1ELmNhbGwodGhpcyl8fHRoaXM7Sy5yZWY9SDtyZXR1cm4gS31xKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oSCl7cmV0dXJuIHRoaXMucmVmIT09SC5yZWZ9O3JldHVybiBCfSh5KTtmLlJlZmVyZW5jZVNpZ25hdHVyZT1DO3ZhciBHPWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSCl7dmFyIEs9RC5jYWxsKHRoaXMpfHx0aGlzO0sub2JqPQpIO3JldHVybiBLfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihIKXt2YXIgSz1PYmplY3Qua2V5cyh0aGlzLm9iaiksTD1PYmplY3Qua2V5cyhILm9iaik7aWYoSy5sZW5ndGghPT1MLmxlbmd0aClyZXR1cm4hMDtmb3IoTD0wO0w8Sy5sZW5ndGg7TCsrKXt2YXIgSj1LW0xdO2lmKCFILm9iai5oYXNPd25Qcm9wZXJ0eShKKXx8dGhpcy5vYmpbSl0uaXNEaWZmZXJlbnQoSC5vYmpbSl0pKXJldHVybiEwfXJldHVybiExfTtyZXR1cm4gQn0oeSk7Zi5PYmplY3RTaWduYXR1cmU9R30sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXl9Zm9yKHZhciBHIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109eFtHXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSwKcj1oKDEpLGw9aCgzKSxwPWgoMCksbT1oKDE0KSxuPWgoNDYpLHE9aCg2KSx1PWgoMzMpLHc9aCgxOSk7ZD1oKDUzKTt2YXIgQT1oKDIpO2g9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJhcmVhLXBsb3QiKTtDLnkwKDApO0MuYXR0cigiZmlsbC1vcGFjaXR5IiwuMjUpO0MuYXR0cigiZmlsbCIsKG5ldyBsLkNvbG9yKS5yYW5nZSgpWzBdKTtDLl9saW5lRHJhd2Vycz1uZXcgcC5NYXA7cmV0dXJuIEN9ayh4LHkpO3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQyxHKXtpZihudWxsPT1DKXJldHVybiB5LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rz95LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp5LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEcpO251bGwhPUcmJihDPXRoaXMueTAoKS5hY2Nlc3NvcixudWxsIT1DJiZ0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTBfS0VZLEMsRyksdGhpcy5fdXBkYXRlWVNjYWxlKCkpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUueTA9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fWTBfS0VZKTt2YXIgRz10aGlzLnkoKTt0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTBfS0VZLEMsRyYmRy5zY2FsZSk7dGhpcy5fdXBkYXRlWVNjYWxlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3kucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVZU2NhbGUoKX07eC5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9saW5lRHJhd2Vycy5zZXQoQyxuZXcgbS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdS5MaW5lU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsdS5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9CkEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy54KCkpLEg9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnkoKSk7cmV0dXJuIEcuX2QzTGluZUZhY3RvcnkoQyxCLEgpfSkpfSkpO3kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxDKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihDKXt5LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxDKTtDPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChDKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9DLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpDLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBDfTt4LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEMpO3RoaXMuX2xpbmVEcmF3ZXJzLmdldChDKS5yZW1vdmUoKX07eC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD0KZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzKCksRD10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEg9QS5QbG90LmFwcGx5RHJhd1N0ZXBzKEcsQik7Qy5fbGluZURyYXdlcnMuZ2V0KEIpLmRyYXcoRC5nZXQoQiksSCl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlTGluZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCk7Ry5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RyxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih3LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih3LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtDLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpcztyZXR1cm4gbmV3IHEuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uQXJlYVNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBtLkNhbnZhc0RyYXdlcihELG4ubWFrZUFyZWFDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy54KCkpLEg9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnkoKSksCks9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnkwKCkpO3JldHVybiBHLl9jcmVhdGVBcmVhR2VuZXJhdG9yKEIsSCxLLEcuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQixIKSxDKX0pKX0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0cuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iody5BbmltYXRvci5NQUlOKX0pOwpyZXR1cm4gQ307eC5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciBDPXRoaXMuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KCJ5MCIpO0M9cC5BcnJheS51bmlxKHAuQXJyYXkuZmxhdHRlbihDKSk7dmFyIEc9MT09PUMubGVuZ3RoP0NbMF06bnVsbDtDPShDPXRoaXMueSgpKSYmQy5zY2FsZTtudWxsIT1DJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihDLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPUcmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltHXX0sQy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfTt4LnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249CmZ1bmN0aW9uKCl7cmV0dXJuIEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKX07eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtDLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO3JldHVybiBDfTt4LnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7dm9pZCAwPT09QyYmKEM9dGhpcy5kYXRhc2V0cygpKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSlyZXR1cm4gci5zZWxlY3RBbGwoKTt2YXIgRD15LnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcyxDKS5ub2RlcygpO0MubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBHLl9saW5lRHJhd2Vycy5nZXQoQil9KS5maWx0ZXIoZnVuY3Rpb24oQil7cmV0dXJuIG51bGwhPQpCfSkuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gRC5wdXNoLmFwcGx5KEQsQi5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSk7cmV0dXJuIHIuc2VsZWN0QWxsKEQpfTt4LnByb3RvdHlwZS5fY29uc3RydWN0QXJlYVByb2plY3Rvcj1mdW5jdGlvbihDLEcsRCl7dmFyIEI9dGhpcyxIPXRoaXMuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihLLEwsSil7cmV0dXJuIEIuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQyxHLEQsSCxKKShLKX19O3gucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIGZ1bmN0aW9uKEQsQixIKXt2YXIgSz1DKEQsQixIKTtEPUcoRCxCLEgpO3JldHVybiBwLk1hdGguaXNWYWxpZE51bWJlcihLKSYmcC5NYXRoLmlzVmFsaWROdW1iZXIoRCl9fTt4LnByb3RvdHlwZS5fY3JlYXRlQXJlYUdlbmVyYXRvcj0KZnVuY3Rpb24oQyxHLEQsQixIKXt2YXIgSz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gci5hcmVhKCkueChmdW5jdGlvbihMLEope3JldHVybiBDKEwsSixIKX0pLnkxKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEcoTCxKLEgpfSkueTAoZnVuY3Rpb24oTCxKKXtyZXR1cm4gRChMLEosSCl9KS5jdXJ2ZShLKS5kZWZpbmVkKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEIoTCxKLEgpfSl9O3JldHVybiB4fShkLkxpbmUpO2guX1kwX0tFWT0ieTAiO2YuQXJlYT1ofSxmdW5jdGlvbihkLGYpeyhmdW5jdGlvbihoKXtoLk1BSU49Im1haW4iO2guUkVTRVQ9InJlc2V0In0pKGYuQW5pbWF0b3J8fChmLkFuaW1hdG9yPXt9KSl9LGZ1bmN0aW9uKGQsZil7dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dmFyIHI9dGhpczt0aGlzLnRyYW5zbGF0ZT10aGlzLnNjYWxlPTA7dGhpcy5jYWNoZWREb21haW49W251bGwsbnVsbF07dGhpcy5sYXN0U2VlbkRvbWFpbj1bbnVsbCxudWxsXTt0aGlzLnVwZGF0ZURvbWFpbj0KZnVuY3Rpb24obCl7ci5sYXN0U2VlbkRvbWFpbj1sLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7dmFyIHA9bC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIuY2FjaGVkRG9tYWluWzFdKS1sLnNjYWxlVHJhbnNmb3JtYXRpb24oci5jYWNoZWREb21haW5bMF0pLG09bC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIubGFzdFNlZW5Eb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbihyLmxhc3RTZWVuRG9tYWluWzBdKTtyLnNjYWxlPXAvbXx8MTtyLnRyYW5zbGF0ZT1sLnNjYWxlVHJhbnNmb3JtYXRpb24oci5jYWNoZWREb21haW5bMF0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbihyLmxhc3RTZWVuRG9tYWluWzBdKSpyLnNjYWxlfHwwfX1rLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2NhbGU9MTt0aGlzLnRyYW5zbGF0ZT0wO3RoaXMuY2FjaGVkRG9tYWluPXRoaXMubGFzdFNlZW5Eb21haW59O2sucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbihyKXt0aGlzLmNhY2hlZERvbWFpbj0Kci5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpfTtyZXR1cm4ga30oKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhyLGwpe3ZhciBwPXRoaXM7dGhpcy5yZW5kZXJDYWxsYmFjaz1yO3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjaz1sO3RoaXMuZG9tYWluVHJhbnNmb3JtWD1uZXcgaDt0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IGg7dGhpcy5yZW5kZXJEZWZlcnJlZD1mdW5jdGlvbigpe3AuYXBwbHlUcmFuc2Zvcm0oKTtjbGVhclRpbWVvdXQocC50aW1lb3V0VG9rZW4pO3AudGltZW91dFRva2VuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtwLnJlbmRlckNhbGxiYWNrKCl9LGsuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZKX19ay5wcm90b3R5cGUuc2V0RG9tYWlucz1mdW5jdGlvbihyLGwpe3ImJnRoaXMuZG9tYWluVHJhbnNmb3JtWC5zZXREb21haW4ocik7bCYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNldERvbWFpbihsKTt0aGlzLnJlbmRlckRlZmVycmVkKCl9O2sucHJvdG90eXBlLnVwZGF0ZURvbWFpbnM9CmZ1bmN0aW9uKHIsbCl7ciYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnVwZGF0ZURvbWFpbihyKTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkudXBkYXRlRG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUucmVzZXRUcmFuc2Zvcm1zPWZ1bmN0aW9uKCl7dGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCk7dGhpcy5kb21haW5UcmFuc2Zvcm1ZLnJlc2V0KCk7dGhpcy5hcHBseVRyYW5zZm9ybSgpfTtrLnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjayh0aGlzLmRvbWFpblRyYW5zZm9ybVgudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNjYWxlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5zY2FsZSl9O3JldHVybiBrfSgpO2QuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZPTIwMDtmLkRlZmVycmVkUmVuZGVyZXI9ZH0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxHKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBHKUcuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUdbQl0pO0MucHJvdG90eXBlPW51bGw9PT1HP09iamVjdC5jcmVhdGUoRyk6KEQucHJvdG90eXBlPUcucHJvdG90eXBlLG5ldyBEKX0scj1oKDEpLGw9aCg3KSxwPWgoMTQpLG09aCg2KSxuPWgoMzMpLHE9aCgzKSx1PWgoMTEpLHc9aCgwKTtkPWgoMTApO3ZhciBBPWgoMTkpLHk9aCgyKTtoPWgoMTYpO3ZhciB4PXtsaW5lYXI6ci5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6ci5jdXJ2ZUxpbmVhckNsb3NlZCxzdGVwOnIuY3VydmVTdGVwLHN0ZXBCZWZvcmU6ci5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOnIuY3VydmVTdGVwQWZ0ZXIsYmFzaXM6ci5jdXJ2ZUJhc2lzLGJhc2lzT3BlbjpyLmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOnIuY3VydmVCYXNpc0Nsb3NlZCwKYnVuZGxlOnIuY3VydmVCdW5kbGUsY2FyZGluYWw6ci5jdXJ2ZUNhcmRpbmFsLGNhcmRpbmFsT3BlbjpyLmN1cnZlQ2FyZGluYWxPcGVuLGNhcmRpbmFsQ2xvc2VkOnIuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTpyLmN1cnZlTW9ub3RvbmVYfTtmLkN1cnZlTmFtZT1kLm1ha2VFbnVtKCJsaW5lYXIgbGluZWFyQ2xvc2VkIHN0ZXAgc3RlcEJlZm9yZSBzdGVwQWZ0ZXIgYmFzaXMgYmFzaXNPcGVuIGJhc2lzQ2xvc2VkIGJ1bmRsZSBjYXJkaW5hbCBjYXJkaW5hbE9wZW4gY2FyZGluYWxDbG9zZWQgbW9ub3RvbmUiLnNwbGl0KCIgIikpO2g9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9jdXJ2ZT0ibGluZWFyIjtELl9hdXRvcmFuZ2VTbW9vdGg9ITE7RC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ITA7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPSExO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQ9ITE7RC5hZGRDbGFzcygibGluZS1wbG90Iik7CnZhciBCPW5ldyBsLkVhc2luZztCLnN0ZXBEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0IuZWFzaW5nTW9kZSgiZXhwSW5PdXQiKTtCLm1heFRvdGFsRHVyYXRpb24oeS5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtELmFuaW1hdG9yKEEuQW5pbWF0b3IuTUFJTixCKTtELmF0dHIoInN0cm9rZSIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtELmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS54PWZ1bmN0aW9uKEQsQixIKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS54LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueC5jYWxsKHRoaXMsRCxCLEgpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUueT1mdW5jdGlvbihELEIsSCl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUueS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLnkuY2FsbCh0aGlzLEQsQiwKSCk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKTtDLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyxEKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmF1dG9yYW5nZVNtb290aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdXRvcmFuZ2VTbW9vdGh9O0cucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQoIXRoaXMuYXV0b3JhbmdlU21vb3RoKCkpOyJ5Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYKdGhpcy55KCkmJnRoaXMueSgpLnNjYWxlJiZ0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9O0cucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2N1cnZlO3RoaXMuX2N1cnZlPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkfTtHLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDt0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmNvbGxhcHNlRGVuc2VMaW5lc0VuYWJsZWQ9CmZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDt0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7cmV0dXJuIG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEgpe3JldHVybiBuZXcgcC5DYW52YXNEcmF3ZXIoSCxuLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZDNMaW5lRmFjdG9yeShEKX0pKX0pfTtHLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oRCl7dmFyIEI9Qy5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxEKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RofHx0aGlzLmF1dG9yYW5nZU1vZGUoKSE9PQpEfHwieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIEI7RD10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7dmFyIEg9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/RC5sZWZ0LmNvbmNhdChELnJpZ2h0KS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEsueX0pOkQudG9wLmNvbmNhdChELmJvdHRvbSkubWFwKGZ1bmN0aW9uKEspe3JldHVybiBLLnh9KTtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIHIuZXh0ZW50KHIubWVyZ2UoW0ssSF0pKX0pfTtHLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciBEPXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJue2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX07CnZhciBCPXRoaXMueSgpLnNjYWxlLEg9dGhpcy54KCkuc2NhbGUsSz17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxMPUguc2NhbGUoSC5kb21haW4oKVswXSksSj1ILnNjYWxlKEguZG9tYWluKClbMV0pLE89Qi5zY2FsZShCLmRvbWFpbigpWzBdKSxTPUIuc2NhbGUoQi5kb21haW4oKVsxXSk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTil7Zm9yKHZhciBSPU4uZGF0YSgpLFgsYWEsZmEsb2EsWixjYSxqYSxiYT0xO2JhPFIubGVuZ3RoO2JhKyspb2E9Y2F8fEguc2NhbGUoRC54KCkuYWNjZXNzb3IoUltiYS0xXSxiYS0xLE4pKSxaPWphfHxCLnNjYWxlKEQueSgpLmFjY2Vzc29yKFJbYmEtMV0sYmEtMSxOKSksY2E9SC5zY2FsZShELngoKS5hY2Nlc3NvcihSW2JhXSxiYSxOKSksamE9Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihSW2JhXSxiYSxOKSksb2E8TD09PUw8PWNhJiYoWD1MLW9hLGFhPWNhLW9hLGZhPWphLVosWD1YKmZhL2FhLEsubGVmdC5wdXNoKHt4OkwsCnk6Qi5pbnZlcnQoWitYKX0pKSxvYTxKPT09Sjw9Y2EmJihYPUotb2EsYWE9Y2Etb2EsZmE9amEtWixYPVgqZmEvYWEsSy5yaWdodC5wdXNoKHt4OkoseTpCLmludmVydChaK1gpfSkpLFo8Uz09PVM8PWphJiYoYWE9Y2Etb2EsWD1TLVosZmE9amEtWixYPVgqYWEvZmEsSy50b3AucHVzaCh7eDpILmludmVydChvYStYKSx5OlN9KSksWjxPPT09Tzw9amEmJihhYT1jYS1vYSxYPU8tWixmYT1qYS1aLFg9WCphYS9mYSxLLmJvdHRvbS5wdXNoKHt4OkguaW52ZXJ0KG9hK1gpLHk6T30pKX0pO3JldHVybiBLfTtHLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgRD10aGlzLnkoKS5zY2FsZS5kb21haW4oKSxCPU1hdGgubWF4KERbMF0sRFsxXSk7RD1NYXRoLm1pbihEWzBdLERbMV0pO0I9MD5CJiZCfHwwPEQmJkR8fDA7dmFyIEg9dGhpcy55KCkuc2NhbGUuc2NhbGUoQik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEh9fTtHLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9CmZ1bmN0aW9uKCl7dmFyIEQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtCLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtELnB1c2goe2F0dHJUb1Byb2plY3RvcjpCLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEEuQW5pbWF0b3IuUkVTRVQpfSl9RC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5NQUlOKX0pO3JldHVybiBEfTtHLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTtPYmplY3Qua2V5cyhEKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCJkIiE9PQpCKXt2YXIgSD1EW0JdO0RbQl09ZnVuY3Rpb24oSyxMLEope3JldHVybiAwPEsubGVuZ3RoP0goS1swXSxMLEopOm51bGx9fX0pO3JldHVybiBEfTtHLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe0Q9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkoRCk7cmV0dXJuIG51bGwhPUQ/W0RdOltdfTtHLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24oRCl7dmFyIEI9SW5maW5pdHksSD1JbmZpbml0eSxLLEw9dGhpcy5ib3VuZHMoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihKKXtpZih3Lk1hdGgud2l0aGluKEoucG9zaXRpb24sTCkpe3ZhciBPPU1hdGguYWJzKEQueC1KLnBvc2l0aW9uLngpLFM9TWF0aC5hYnMoRC55LUoucG9zaXRpb24ueSk7aWYoTzxCfHxPPT09QiYmUzxIKUs9SixCPU8sSD1TfX0pO3JldHVybiBLfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwpELmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIER9O0cucHJvdG90eXBlLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yPWZ1bmN0aW9uKEQsQil7dmFyIEg9dGhpcztyZXR1cm4gZnVuY3Rpb24oSyxMLEope3JldHVybiBILl9kM0xpbmVGYWN0b3J5KEosRCxCKShLKX19O0cucHJvdG90eXBlLl9kM0xpbmVGYWN0b3J5PWZ1bmN0aW9uKEQsQixIKXtmdW5jdGlvbiBLKEwsSixPKXt2YXIgUz1CKEwsSixPKTtMPUgoTCxKLE8pO3JldHVybiB3Lk1hdGguaXNWYWxpZE51bWJlcihTKSYmdy5NYXRoLmlzVmFsaWROdW1iZXIoTCl9dm9pZCAwPT09QiYmKEI9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpO3ZvaWQgMD09PUgmJihIPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gci5saW5lKCkueChmdW5jdGlvbihMLEope3JldHVybiBCKEwsCkosRCl9KS55KGZ1bmN0aW9uKEwsSil7cmV0dXJuIEgoTCxKLEQpfSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoZnVuY3Rpb24oTCxKKXtyZXR1cm4gSyhMLEosRCl9KX07Ry5wcm90b3R5cGUuX2dldEN1cnZlRmFjdG9yeT1mdW5jdGlvbigpe3ZhciBEPXRoaXMuY3VydmUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBEPyhEPXhbRF0sbnVsbD09RD94LmxpbmVhcjpEKTpEfTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1uZXcgdy5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSCl7dmFyIEs9SC5kYXRhKCk7aWYoRC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWR8fEQuX2Rvd25zYW1wbGluZ0VuYWJsZWQpe3ZhciBMPUsubWFwKGZ1bmN0aW9uKEosTyl7cmV0dXJuIE99KTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCYmKEw9RC5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZyhILEwpKTtELl9kb3duc2FtcGxpbmdFbmFibGVkJiYKKEw9RC5fZmlsdGVyRG93bnNhbXBsaW5nKEgsTCkpO0QuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCYmKEw9RC5fZmlsdGVyRGVuc2VMaW5lcyhILEwpKTtCLnNldChILFtMLm1hcChmdW5jdGlvbihKKXtyZXR1cm4gS1tKXX0pXSl9ZWxzZSBCLnNldChILFtLXSl9KTtyZXR1cm4gQn07Ry5wcm90b3R5cGUuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBIKGZhLG9hKXtyZXR1cm4gdy5NYXRoLmluUmFuZ2UoZmEsMCxLLndpZHRoKCkpJiZ3Lk1hdGguaW5SYW5nZShvYSwwLEsuaGVpZ2h0KCkpfWZvcih2YXIgSz10aGlzLEw9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxPPUQuZGF0YSgpLFM9W10sTj0wO048Qi5sZW5ndGg7TisrKXt2YXIgUj1MKE9bQltOXV0sQltOXSxEKSxYPUooT1tCW05dXSxCW05dLEQpO1I9SChSLFgpO2lmKCFSJiZudWxsIT1CW04tCjFdJiZudWxsIT1PW0JbTi0xXV0pe1g9TChPW0JbTi0xXV0sQltOLTFdLEQpO3ZhciBhYT1KKE9bQltOLTFdXSxCW04tMV0sRCk7Uj1SfHxIKFgsYWEpfVJ8fG51bGw9PUJbTisxXXx8bnVsbD09T1tCW04rMV1dfHwoWD1MKE9bQltOKzFdXSxCW04rMV0sRCksYWE9SihPW0JbTisxXV0sQltOKzFdLEQpLFI9Unx8SChYLGFhKSk7UiYmUy5wdXNoKEJbTl0pfXJldHVybiBTfTtHLnByb3RvdHlwZS5fZmlsdGVyRG93bnNhbXBsaW5nPWZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSChqYSxiYSl7dmFyIGthPUwoS1tCW2phXV0sQltqYV0sRCksVz1KKEtbQltqYV1dLEJbamFdLEQpLEVhPUwoS1tCW2phKzFdXSxCW2phKzFdLEQpO2phPUooS1tCW2phKzFdXSxCW2phKzFdLEQpO3JldHVybiBJbmZpbml0eT09PWJhP01hdGguZmxvb3Ioa2EpPT09TWF0aC5mbG9vcihFYSk6TWF0aC5mbG9vcihqYSk9PT1NYXRoLmZsb29yKFcrKEVhLWthKSpiYSl9aWYoMD09PUIubGVuZ3RoKXJldHVybltdO2Zvcih2YXIgSz0KRC5kYXRhKCksTD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxKPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLE89W0JbMF1dLFM9MDtTPEIubGVuZ3RoLTE7KXt2YXIgTj1CW1NdLFI9TChLW0JbU11dLEJbU10sRCksWD1KKEtbQltTXV0sQltTXSxEKSxhYT1MKEtbQltTKzFdXSxCW1MrMV0sRCksZmE9SihLW0JbUysxXV0sQltTKzFdLEQpO2ZhPU1hdGguZmxvb3IoUik9PT1NYXRoLmZsb29yKGFhKT9JbmZpbml0eTooZmEtWCkvKGFhLVIpO2FhPUJbU107WD1JbmZpbml0eT09PWZhP1g6UjtSPWFhO2Zvcih2YXIgb2E9WCxaPSEwO1M8Qi5sZW5ndGgtMSYmKFp8fEgoUyxmYSkpOyl7UysrO1o9ITE7dmFyIGNhPUluZmluaXR5PT09ZmE/SihLW0JbU11dLEJbU10sRCk6TChLW0JbU11dLEJbU10sRCk7Y2E+b2EmJihvYT1jYSxSPUJbU10pO2NhPFgmJihYPWNhLGFhPUJbU10pfWZhPUJbU107YWEhPT1OJiZPLnB1c2goYWEpO1IhPT1hYSYmUiE9PU4mJk8ucHVzaChSKTsKZmEhPT1OJiZmYSE9PWFhJiZmYSE9PVImJk8ucHVzaChmYSl9cmV0dXJuIE99O0cucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKEQsQil7aWYoMD09PUIubGVuZ3RoKXJldHVybltdO3ZhciBIPUQuZGF0YSgpLEs9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksTD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gdGhpcy5fYnVja2V0QnlYKEQsQixmdW5jdGlvbihKKXtyZXR1cm4gSyhIW0pdLEosRCl9LGZ1bmN0aW9uKEope3JldHVybiBMKEhbSl0sSixEKX0pfTtHLnByb3RvdHlwZS5fYnVja2V0QnlYPWZ1bmN0aW9uKEQsQixILEspe3ZhciBMPVtdO0Q9RC5kYXRhKCk7Zm9yKHZhciBKPW51bGwsTz0wO088PUIubGVuZ3RoOysrTyl7dmFyIFM9QltPXTtpZihudWxsIT1EW1NdKXt2YXIgTj1NYXRoLmZsb29yKEgoUykpLFI9SyhTKTtudWxsPT1KP0o9bmV3IHcuQnVja2V0KFMsTixSKTpKLmlzSW5CdWNrZXQoTik/Si5hZGRUb0J1Y2tldChSLApTKTooTC5wdXNoLmFwcGx5KEwsSi5nZXRVbmlxdWVJbmRpY2VzKCkpLEo9bmV3IHcuQnVja2V0KFMsTixSKSl9fW51bGwhPUomJkwucHVzaC5hcHBseShMLEouZ2V0VW5pcXVlSW5kaWNlcygpKTtyZXR1cm4gTH07cmV0dXJuIEd9KGguWFlQbG90KTtmLkxpbmU9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB3IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh3KSYmKG5bd109cVt3XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxyPWgoMSksbD1oKDI2KSxwPWgoMCksbT1bMCwxXTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fcmFuZ2U9WzAsMV07dS5fZDNTY2FsZT1yLnNjYWxlQmFuZCgpO3UuX2QzU2NhbGUucmFuZ2UobSk7CnUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZT1yLnNjYWxlTGluZWFyKCk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbihtKTt1Ll9pbm5lclBhZGRpbmc9cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nKCk7dS5fb3V0ZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZygpO3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdT0obmV3IHEpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpO3JldHVybiB1fTtxLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih1KXtyZXR1cm4gcC5BcnJheS51bmlxKHUpfTsKcS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyx1KX07cS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdSx3PXRoaXM7dm9pZCAwPT09dSYmKHU9dGhpcy5yYW5nZSgpKTt2YXIgQT10aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLHk9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMF0pLHg9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMV0pO3U9dGhpcy5fZDNTY2FsZS5kb21haW4oKTt2YXIgQz11Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4gdy5fZDNTY2FsZShHKStBLzJ9KTt5PXIuYmlzZWN0KEMseSk7eD1yLmJpc2VjdChDLHgpO3JldHVybiB1LnNsaWNlKHkseCl9O3EucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKHUpe3JldHVybiBuLnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsCnUpfTtxLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMS8uNy0xfTtxLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4uNS8uN307cS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHU9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLHc9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih1KTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcih3KX07cS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfTtxLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9O3EucHJvdG90eXBlLnRpY2tzPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5faW5uZXJQYWRkaW5nO3RoaXMuX2lubmVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fb3V0ZXJQYWRkaW5nO3RoaXMuX291dGVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih1KXt1PXRoaXMuX2QzU2NhbGUodSkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odSx3KXt2YXIgQT10aGlzOwp0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbih5KXtyZXR1cm4gQS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChsLnpvb21PdXQoeSx1LHcpKX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odSl7dmFyIHc9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbihBKXtyZXR1cm4gdy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChBK3UpfSkpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydCh1KX07CnEucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG19O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX07cS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odSl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih1KTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtxLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4odSk7dGhpcy5fc2V0QmFuZHMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfTsKcS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHUpe3RoaXMuX3JhbmdlPXU7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHUpO3RoaXMuX3NldEJhbmRzKCl9O3EucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih1KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9O3JldHVybiBxfShoKDE3KS5TY2FsZSk7Zi5DYXRlZ29yeT1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh4KXt0cnl7dmFyIEM9eC5ub2RlKCkuZ2V0QkJveCgpfWNhdGNoKEcpe0M9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19cmV0dXJuIEN9ZnVuY3Rpb24gcih4KXtpZigibnVtYmVyIj09PXR5cGVvZiB4KXJldHVybnttaW46eCxtYXg6eH07aWYoeCBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB4JiYibWF4ImluIHgpcmV0dXJuIHg7dGhyb3cgRXJyb3IoImlucHV0ICciK3grIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7Cn1mdW5jdGlvbiBsKHgsQyl7eD14LmdldFByb3BlcnR5VmFsdWUoQyk7cmV0dXJuIHBhcnNlRmxvYXQoeCl8fDB9ZnVuY3Rpb24gcCh4KXtpZihudWxsPT14fHwibm9uZSI9PT14KXJldHVybiBudWxsO3g9eC5tYXRjaChBKTtpZihudWxsPT14fHwyPngubGVuZ3RoKXJldHVybiBudWxsO3g9eFsxXS5zcGxpdCh5KS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHBhcnNlRmxvYXQoQyl9KTtyZXR1cm4gNiE9eC5sZW5ndGg/bnVsbDp4fXZhciBtPWgoMSksbj1NYXRoO2YuY29udGFpbnM9ZnVuY3Rpb24oeCxDKXtmb3IoO251bGwhPUMmJkMhPT14OylDPUMucGFyZW50Tm9kZTtyZXR1cm4gQz09PXh9O2YuZWxlbWVudEJCb3g9aztmLmVudGl0eUJvdW5kcz1mdW5jdGlvbih4KXtyZXR1cm4geCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/ayhtLnNlbGVjdCh4KSk6eCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50Pyh4PXguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6eC5sZWZ0LHk6eC50b3Asd2lkdGg6eC53aWR0aCwKaGVpZ2h0OnguaGVpZ2h0fSk6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19O2YuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFM9MUUzLzYwO2YucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw9ZnVuY3Rpb24oeCl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHgpOnNldFRpbWVvdXQoeCxmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX07Zi5lbGVtZW50V2lkdGg9ZnVuY3Rpb24oeCl7eD14IGluc3RhbmNlb2YgbS5zZWxlY3Rpb24/eC5ub2RlKCk6eDt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgpO3JldHVybiBsKHgsIndpZHRoIikrbCh4LCJwYWRkaW5nLWxlZnQiKStsKHgsInBhZGRpbmctcmlnaHQiKStsKHgsImJvcmRlci1sZWZ0LXdpZHRoIikrbCh4LCJib3JkZXItcmlnaHQtd2lkdGgiKX07Zi5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKHgpe3g9eCBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uPwp4Lm5vZGUoKTp4O3g9d2luZG93LmdldENvbXB1dGVkU3R5bGUoeCk7cmV0dXJuIGwoeCwiaGVpZ2h0IikrbCh4LCJwYWRkaW5nLXRvcCIpK2woeCwicGFkZGluZy1ib3R0b20iKStsKHgsImJvcmRlci10b3Atd2lkdGgiKStsKHgsImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIHE9L3RyYW5zbGF0ZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLyx1PS9yb3RhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpXHMqXCkvLHc9L3NjYWxlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSg/Oig/Oig/OlxzKyw/XHMqKXwoPzosXHMqKSkoKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSk/XHMqXCkvO2YuZ2V0VHJhbnNsYXRlVmFsdWVzPWZ1bmN0aW9uKHgpe3g9cS5leGVjKHguYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPXgpe3ZhciBDPQp4WzJdO3JldHVyblsreFsxXSwrKHZvaWQgMD09PUM/MDpDKV19cmV0dXJuWzAsMF19O2YuZ2V0Um90YXRlPWZ1bmN0aW9uKHgpe3g9dS5leGVjKHguYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT14Pyt4WzFdOjB9O2YuZ2V0U2NhbGVWYWx1ZXM9ZnVuY3Rpb24oeCl7dmFyIEM9dy5leGVjKHguYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT1DPyh4PUNbMV0sQz1DWzJdLFsreCxudWxsPT1DPyt4OitDXSk6WzAsMF19O2YuY2xpZW50UmVjdHNPdmVybGFwPWZ1bmN0aW9uKHgsQyl7cmV0dXJuIG4uZmxvb3IoeC5yaWdodCk8PW4uY2VpbChDLmxlZnQpfHxuLmNlaWwoeC5sZWZ0KT49bi5mbG9vcihDLnJpZ2h0KXx8bi5mbG9vcih4LmJvdHRvbSk8PW4uY2VpbChDLnRvcCl8fG4uY2VpbCh4LnRvcCk+PW4uZmxvb3IoQy5ib3R0b20pPyExOiEwfTtmLmV4cGFuZFJlY3Q9ZnVuY3Rpb24oeCxDKXtyZXR1cm57bGVmdDp4LmxlZnQtQyx0b3A6eC50b3AtQyxyaWdodDp4LnJpZ2h0KwpDLGJvdHRvbTp4LmJvdHRvbStDLHdpZHRoOngud2lkdGgrMipDLGhlaWdodDp4LmhlaWdodCsyKkN9fTtmLmNsaWVudFJlY3RJbnNpZGU9ZnVuY3Rpb24oeCxDKXtyZXR1cm4gbi5mbG9vcihDLmxlZnQpPD1uLmNlaWwoeC5sZWZ0KSYmbi5mbG9vcihDLnRvcCk8PW4uY2VpbCh4LnRvcCkmJm4uZmxvb3IoeC5yaWdodCk8PW4uY2VpbChDLnJpZ2h0KSYmbi5mbG9vcih4LmJvdHRvbSk8PW4uY2VpbChDLmJvdHRvbSl9O2YuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24oeCxDLEcsRCl7dm9pZCAwPT09RCYmKEQ9LjUpO3g9cih4KTtDPXIoQyk7cmV0dXJuIEcueCtHLndpZHRoPj14Lm1pbi1EJiZHLng8PXgubWF4K0QmJkcueStHLmhlaWdodD49Qy5taW4tRCYmRy55PD1DLm1heCtEfTtmLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uKHgpe2Zvcih2YXIgQz1bXTt4JiZ4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KUMucHVzaCh4KSx4PXgucGFyZW50RWxlbWVudDtyZXR1cm4gQ307CmYuZ2V0RWxlbWVudFRyYW5zZm9ybT1mdW5jdGlvbih4KXt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgsbnVsbCk7eD14LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8eC5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7cmV0dXJuIHAoeCl9O3ZhciBBPS9ebWF0cml4XCgoW14pXSspXCkkLyx5PS9bLCBdKy99LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHUsdyl7cmV0dXJuW3VbMF0qd1swXSt1WzJdKndbMV0sdVsxXSp3WzBdK3VbM10qd1sxXSx1WzBdKndbMl0rdVsyXSp3WzNdLHVbMV0qd1syXSt1WzNdKndbM10sdVswXSp3WzRdK3VbMl0qd1s1XSt1WzRdLHVbMV0qd1s0XSt1WzNdKndbNV0rdVs1XV19ZnVuY3Rpb24gcih1LHcpe3JldHVyblt1WzBdLAp1WzFdLHVbMl0sdVszXSx1WzBdKndbMF0rdVsyXSp3WzFdK3VbNF0sdVsxXSp3WzBdK3VbM10qd1sxXSt1WzVdXX1mdW5jdGlvbiBsKHUpe3ZhciB3PXVbMF0qdVszXS11WzFdKnVbMl07aWYoMD09PXcpdGhyb3cgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3c9MS93O3JldHVyblt3KnVbM10sdyotdVsxXSx3Ki11WzJdLHcqdVswXSx3KigtdVszXSp1WzRdK3VbMl0qdVs1XSksdyoodVsxXSp1WzRdKy11WzBdKnVbNV0pXX12YXIgcD1oKDEpLG09aCg1NSksbj1NYXRoLHE9WzEsMCwwLDEsMCwwXTtmLmluUmFuZ2U9ZnVuY3Rpb24odSx3LEEpe3JldHVybiBuLm1pbih3LEEpPD11JiZ1PD1uLm1heCh3LEEpfTtmLmNsYW1wPWZ1bmN0aW9uKHUsdyxBKXtyZXR1cm4gbi5taW4obi5tYXgodyx1KSxBKX07Zi5tYXg9ZnVuY3Rpb24odSx3LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2Ygdz93Om51bGw7dz1udWxsPT15P3c6QTt1PW51bGw9PXk/cC5tYXgodSk6cC5tYXgodSx5KTtyZXR1cm4gdm9pZCAwIT09CnU/dTp3fTtmLm1pbj1mdW5jdGlvbih1LHcsQSl7dmFyIHk9ImZ1bmN0aW9uIj09PXR5cGVvZiB3P3c6bnVsbDt3PW51bGw9PXk/dzpBO3U9bnVsbD09eT9wLm1pbih1KTpwLm1pbih1LHkpO3JldHVybiB2b2lkIDAhPT11P3U6d307Zi5pc05hTj1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXV9O2YuaXNWYWxpZE51bWJlcj1mdW5jdGlvbih1KXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiB1JiYxPnUtdX07Zi5yYW5nZT1mdW5jdGlvbih1LHcsQSl7dm9pZCAwPT09QSYmKEE9MSk7aWYoMD09PUEpdGhyb3cgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTt3PW4ubWF4KG4uY2VpbCgody11KS9BKSwwKTtmb3IodmFyIHk9W10seD0wO3g8dzsrK3gpeVt4XT11K0EqeDtyZXR1cm4geX07Zi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odSx3KXtyZXR1cm4gbi5wb3cody55LXUueSwyKStuLnBvdyh3LngtdS54LDIpfTtmLmRlZ3JlZXNUb1JhZGlhbnM9ZnVuY3Rpb24odSl7cmV0dXJuIHUvMzYwKgpuLlBJKjJ9O2Yud2l0aGluPWZ1bmN0aW9uKHUsdyl7cmV0dXJuIHcudG9wTGVmdC54PD11LngmJncuYm90dG9tUmlnaHQueD49dS54JiZ3LnRvcExlZnQueTw9dS55JiZ3LmJvdHRvbVJpZ2h0Lnk+PXUueX07Zi5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uKHUsdyxBLHkseCxDKXtyZXR1cm4gdTw9MCt4JiYwPD11K0EmJnc8PTArQyYmMDw9dyt5fTtmLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24odSl7dT1tLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHUpO2Zvcih2YXIgdz1xLEE9bnVsbCx5PTA7eTx1Lmxlbmd0aDt5Kyspe3ZhciB4PXVbeV0sQz1tLmdldEVsZW1lbnRUcmFuc2Zvcm0oeCk7aWYobnVsbCE9Qyl7dmFyIEc9eC5jbGllbnRXaWR0aC8yLEQ9eC5jbGllbnRIZWlnaHQvMjt3PXIodyxbRyxEXSk7dz1rKHcsbChDKSk7dz1yKHcsWy1HLC1EXSl9Qz14LnNjcm9sbExlZnQ7Rz14LnNjcm9sbFRvcDtpZihudWxsPT09QXx8eD09PUEpQy09eC5vZmZzZXRMZWZ0K3guY2xpZW50TGVmdCwKRy09eC5vZmZzZXRUb3AreC5jbGllbnRUb3AsQT14Lm9mZnNldFBhcmVudDt3PXIodyxbQyxHXSl9cmV0dXJuIHd9O2YubXVsdGlwbHlNYXRyaXg9aztmLnByZW11bHRpcGx5VHJhbnNsYXRlPWZ1bmN0aW9uKHUsdyl7cmV0dXJuW3dbMF0sd1sxXSx3WzJdLHdbM10sd1s0XSt1WzBdLHdbNV0rdVsxXV19O2YubXVsdGlwbHlUcmFuc2xhdGU9cjtmLmludmVydE1hdHJpeD1sO2YuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odSx3KXtyZXR1cm57eDp1WzBdKncueCt1WzJdKncueSt1WzRdLHk6dVsxXSp3LngrdVszXSp3LnkrdVs1XX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9bmV3IChoKDExNCkuU3BsaXRTdHJhdGVneUxpbmVhcik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT01KTt2b2lkIDA9PT1uJiYobj1rKTt0aGlzLm1heE5vZGVDaGlsZHJlbj1tO3RoaXMuc3BsaXRTdHJhdGVneT1uO3RoaXMucm9vdD1uZXcgcighMCk7dGhpcy5zaXplPTB9cC5wcm90b3R5cGUuZ2V0Um9vdD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fTtwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgcighMCk7dGhpcy5zaXplPTB9O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtLG4pe2Zvcih2YXIgcT10aGlzLnJvb3Q7IXEubGVhZjspcT1xLnN1YnRyZWUobSk7bT1yLnZhbHVlTm9kZShtLG4pO3EuaW5zZXJ0KG0pO2Zvcih0aGlzLnNpemUrPTE7cS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KXE9cS5zcGxpdCh0aGlzLnNwbGl0U3RyYXRlZ3kpLG51bGw9PXEucGFyZW50JiYodGhpcy5yb290PXEpfTtwLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24obil7cmV0dXJuIG4uY29udGFpbnMobSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdFg9CmZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFgobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RZPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFkobixtKX0pfTtwLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihtKXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhbSh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gbjtmb3IodmFyIHE9W3RoaXMucm9vdF07MDxxLmxlbmd0aDspZm9yKHZhciB1PXEuc2hpZnQoKSx3PTA7dzx1LmVudHJpZXMubGVuZ3RoO3crKyl7dmFyIEE9dS5lbnRyaWVzW3ddO20oQS5ib3VuZHMpJiYodS5sZWFmP24ucHVzaChBLnZhbHVlKTpxLnB1c2goQSkpfXJldHVybiBufTtyZXR1cm4gcH0oKTtmLlJUcmVlPWQ7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0pe3RoaXMubGVhZj1tO3RoaXMuYm91bmRzPQpudWxsO3RoaXMuZW50cmllcz1bXTt0aGlzLnZhbHVlPXRoaXMucGFyZW50PW51bGx9cC52YWx1ZU5vZGU9ZnVuY3Rpb24obSxuKXt2YXIgcT1uZXcgcCghMCk7cS5ib3VuZHM9bTtxLnZhbHVlPW47cmV0dXJuIHF9O3AucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPm19O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtKXt0aGlzLmVudHJpZXMucHVzaChtKTttLnBhcmVudD10aGlzO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPWwudW5pb25BbGwoW24uYm91bmRzLG0uYm91bmRzXSksbj1uLnBhcmVudH07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5lbnRyaWVzLmluZGV4T2YobSk7aWYoMDw9bSlmb3IodGhpcy5lbnRyaWVzLnNwbGljZShtLDEpLG09dGhpcztudWxsIT1tOyltLmJvdW5kcz1sLnVuaW9uQWxsKG0uZW50cmllcy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uYm91bmRzfSkpLAptPW0ucGFyZW50O3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKG0pe2Zvcih2YXIgbj1udWxsLHE9MDtxPHRoaXMuZW50cmllcy5sZW5ndGg7cSsrKXt2YXIgdT10aGlzLmVudHJpZXNbcV0sdz11LnVuaW9uQXJlYURpZmZlcmVuY2UobSk7aWYoSW5maW5pdHk+d3x8SW5maW5pdHk9PT13JiZudWxsIT1uJiZ1LmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpbj11fXJldHVybiBufTtwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihtKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgcCh0aGlzLmxlYWYpLG5ldyBwKHRoaXMubGVhZildO20uc3BsaXQodGhpcy5lbnRyaWVzLG4pO209bnVsbCE9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQ6bmV3IHAoITEpO20uaW5zZXJ0KG5bMF0pO20uaW5zZXJ0KG5bMV0pO3JldHVybiBtfTtwLnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmFicyhsLnVuaW9uKHRoaXMuYm91bmRzLAptKS5hcmVhKCktdGhpcy5ib3VuZHMuYXJlYSgpKX07cC5wcm90b3R5cGUubWF4RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFmPzE6MSt0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLm1heERlcHRoKCl9KS5yZWR1Y2UoZnVuY3Rpb24obSxuKXtyZXR1cm4gTWF0aC5tYXgobSxuKX0pfTtyZXR1cm4gcH0oKTtmLlJUcmVlTm9kZT1yO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtLG4scSx1KXt0aGlzLnhsPW07dGhpcy55bD1uO3RoaXMueGg9cTt0aGlzLnloPXU7dGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGw7dGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXAueHl3aD1mdW5jdGlvbihtLG4scSx1KXtyZXR1cm4gbmV3IHAobSxuLG0rcSxuK3UpfTtwLmVudGl0eUJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IHAobS54LG0ueSxtLngrbS53aWR0aCxtLnkrbS5oZWlnaHQpfTtwLmJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gcC5wb2ludFBhaXIobS50b3BMZWZ0LAptLmJvdHRvbVJpZ2h0KX07cC5wb2ludFBhaXI9ZnVuY3Rpb24obSxuKXtyZXR1cm4gbmV3IHAoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5tYXgobS54LG4ueCksTWF0aC5tYXgobS55LG4ueSkpfTtwLnBvaW50cz1mdW5jdGlvbihtKXtpZigyPm0ubGVuZ3RoKXRocm93IEVycm9yKCJuZWVkIGF0IGxlYXN0IDIgcG9pbnRzIHRvIGNyZWF0ZSBib3VuZHMiKTt2YXIgbj1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS54fSk7bT1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS55fSk7cmV0dXJuIG5ldyBwKG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWluKHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbi5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5tYXgocSx1KX0pLG0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSl9O3AudW5pb249ZnVuY3Rpb24obSwKbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueGwsbi54bCksTWF0aC5taW4obS55bCxuLnlsKSxNYXRoLm1heChtLnhoLG4ueGgpLE1hdGgubWF4KG0ueWgsbi55aCkpfTtwLnVuaW9uQWxsPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW59KTtyZXR1cm4gMD09PW0ubGVuZ3RoP251bGw6bS5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gcC51bmlvbihuLHEpfSl9O3AuaXNCb3VuZHNPdmVybGFwQm91bmRzPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaXNCb3VuZHNPdmVybGFwWChtLG4pJiZwLmlzQm91bmRzT3ZlcmxhcFkobSxuKX07cC5pc0JvdW5kc092ZXJsYXBYPWZ1bmN0aW9uKG0sbil7cmV0dXJuIShtLnhoPG4ueGwpJiYhKG0ueGw+bi54aCl9O3AuaXNCb3VuZHNPdmVybGFwWT1mdW5jdGlvbihtLG4pe3JldHVybiEobS55aDxuLnlsKSYmIShtLnlsPm4ueWgpfTtwLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5hcmVhQ2FjaGVkJiYKKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSk7cmV0dXJuIHRoaXMuYXJlYUNhY2hlZH07cC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMueGw8PW0ueCYmdGhpcy54aD49bS54JiZ0aGlzLnlsPD1tLnkmJnRoaXMueWg+PW0ueX07cmV0dXJuIHB9KCk7Zi5SVHJlZUJvdW5kcz1sfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W107dGhpcy5zaXplPTB9aC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNlNldClyZXR1cm4gdGhpcy5fZXM2U2V0LmFkZChrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpczt0aGlzLmhhcyhrKXx8KHRoaXMuX3ZhbHVlcy5wdXNoKGspLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoKTsKcmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIGs9dGhpcy5fZXM2U2V0LmRlbGV0ZShrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsaztrPXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspO3JldHVybi0xIT09az8odGhpcy5fdmFsdWVzLnNwbGljZShrLDEpLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoLCEwKTohMX07aC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe3JldHVybiBudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmhhcyhrKTotMSE9PXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspfTtoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGsscil7dmFyIGw9dGhpcztudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmZvckVhY2goZnVuY3Rpb24ocCxtKXtyZXR1cm4gay5jYWxsKHIscCxtLGwpfSxyKTp0aGlzLl92YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihwKXtrLmNhbGwociwKcCxwLGwpfSl9O3JldHVybiBofSgpO2YuU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCgxMzEpKTtrKGgoMTMwKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0scj1oKDIxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO3EuY2FjaGU9bmV3IHIuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGU9CmZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmNhY2hlLmdldChtKX07cC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9O3JldHVybiBwfShoKDYxKS5DaGFyYWN0ZXJNZWFzdXJlcik7Zi5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocixsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJihyW21dPWxbbV0pO3IucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbihyKXtmdW5jdGlvbiBsKCl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwKdGhpc31rKGwscik7bC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24ocCl7cmV0dXJuIHIucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMscCl9O2wucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzO3A9cC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBtLl9tZWFzdXJlQ2hhcmFjdGVyKG4pfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihuLHEpe3JldHVybiBNYXRoLm1heChuLHEuaGVpZ2h0KX0sMCksd2lkdGg6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gbitxLndpZHRofSwwKX19O3JldHVybiBsfShoKDYzKS5NZWFzdXJlcik7Zi5DaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhyKXtmb3IodmFyIGwgaW4gcilmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT1yW2xdKX1rKGgoMzYpKTtrKGgoNjApKTtrKGgoMTMyKSk7ayhoKDYxKSk7ayhoKDYzKSl9LApmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHI9aCgzNik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09biYmKG49ITEpO209bC5jYWxsKHRoaXMsbSl8fHRoaXM7bS51c2VHdWFyZHM9bjtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuX2FkZEd1YXJkcz1mdW5jdGlvbihtKXtyZXR1cm4gci5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK20rci5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfTtwLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIG47dm9pZCAwPT09biYmKG49ITEpO249dGhpcy51c2VHdWFyZHN8fApufHwvXltcdCBdJC8udGVzdChtKTttPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4/dGhpcy5fYWRkR3VhcmRzKG0pOm0pO20ud2lkdGgtPW4/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowO3JldHVybiBtfTtwLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7dm9pZCAwPT09bSYmKG09ci5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTtpZigiIj09PW0udHJpbSgpKXJldHVybnt3aWR0aDowLGhlaWdodDowfTttPW0udHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUxpbmUocSl9KTtyZXR1cm57aGVpZ2h0Om0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIHErdS5oZWlnaHR9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdS53aWR0aCl9LDApfX07cC5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe251bGw9PXRoaXMuZ3VhcmRXaWR0aCYmCih0aGlzLmd1YXJkV2lkdGg9bC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKTtyZXR1cm4gdGhpcy5ndWFyZFdpZHRofTtyZXR1cm4gcH0oci5BYnN0cmFjdE1lYXN1cmVyKTtmLk1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCgxMzgpKTtrKGgoNjUpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7dGhpcy5tYXhMaW5lcyhJbmZpbml0eSk7dGhpcy50ZXh0VHJpbW1pbmcoKTt0aGlzLmFsbG93QnJlYWtpbmdXb3JkcygpO3RoaXMuX3Rva2VuaXplcj1uZXcgay5Ub2tlbml6ZXI7dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXIucHJvdG90eXBlLm1heExpbmVzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21heExpbmVzO3RoaXMuX21heExpbmVzPWw7cmV0dXJuIHRoaXN9OwpyLnByb3RvdHlwZS50ZXh0VHJpbW1pbmc9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0VHJpbW1pbmc9ImVsbGlwc2lzIn07ci5wcm90b3R5cGUuYWxsb3dCcmVha2luZ1dvcmRzPWZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzPSEwfTtyLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPXRoaXM7dm9pZCAwPT09biYmKG49SW5maW5pdHkpO3ZhciB1PXtub0Jyb2tlV29yZHM6MCxub0xpbmVzOjAsb3JpZ2luYWxUZXh0OmwsdHJ1bmNhdGVkVGV4dDoiIix3cmFwcGVkVGV4dDoiIn07bT17YXZhaWxhYmxlTGluZXM6TWF0aC5taW4oTWF0aC5mbG9vcihuL3AubWVhc3VyZSgpLmhlaWdodCksdGhpcy5fbWF4TGluZXMpLGF2YWlsYWJsZVdpZHRoOm0sY2FuRml0VGV4dDohMCxjdXJyZW50TGluZToiIix3cmFwcGluZzp1fTt2YXIgdz1sLnNwbGl0KCJcbiIpO3JldHVybiB3LnJlZHVjZShmdW5jdGlvbihBLHkseCl7cmV0dXJuIHEuYnJlYWtMaW5lVG9GaXRXaWR0aChBLAp5LHghPT13Lmxlbmd0aC0xLHApfSxtKS53cmFwcGluZ307ci5wcm90b3R5cGUuYnJlYWtMaW5lVG9GaXRXaWR0aD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO2wuY2FuRml0VGV4dHx8IiI9PT1sLndyYXBwaW5nLnRydW5jYXRlZFRleHR8fChsLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPSJcbiIpO2w9dGhpcy5fdG9rZW5pemVyLnRva2VuaXplKHApLnJlZHVjZShmdW5jdGlvbih1LHcpe3JldHVybiBxLndyYXBOZXh0VG9rZW4odyx1LG4pfSxsKTtwPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuY3VycmVudExpbmUpO2wud3JhcHBpbmcubm9MaW5lcys9KygiIiE9PXApO2wud3JhcHBpbmcubm9MaW5lcz09PWwuYXZhaWxhYmxlTGluZXMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZyYmbT9sLmNhbkZpdFRleHQ9ITE6bC53cmFwcGluZy53cmFwcGVkVGV4dCs9cDtsLmN1cnJlbnRMaW5lPSJcbiI7cmV0dXJuIGx9O3IucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKGwsCnAsbSl7dmFyIG49dGhpcyxxPXRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz9sLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24odSx3KXtyZXR1cm4gdyE9PWwubGVuZ3RoLTE/dStuLl9icmVha2luZ0NoYXJhY3Rlcjp1fSk6W2xdO3JldHVybiBtLm1lYXN1cmUobCkud2lkdGg8PXB8fHEuZXZlcnkoZnVuY3Rpb24odSl7cmV0dXJuIG0ubWVhc3VyZSh1KS53aWR0aDw9cH0pfTtyLnByb3RvdHlwZS5hZGRFbGxpcHNpcz1mdW5jdGlvbihsLHAsbSl7aWYoIm5vbmUiPT09dGhpcy5fdGV4dFRyaW1taW5nKXJldHVybntyZW1haW5pbmdUb2tlbjoiIix3cmFwcGVkVG9rZW46bH07dmFyIG49bC5zdWJzdHJpbmcoMCkudHJpbSgpLHE9bS5tZWFzdXJlKG4pLndpZHRoLHU9bS5tZWFzdXJlKCIuLi4iKS53aWR0aCx3PTA8bC5sZW5ndGgmJiJcbiI9PT1sWzBdPyJcbiI6IiI7aWYocDw9dSlyZXR1cm57cmVtYWluaW5nVG9rZW46bCx3cmFwcGVkVG9rZW46dysiLi4uIi5zdWJzdHIoMCxNYXRoLmZsb29yKHAvCih1LzMpKSl9O2Zvcig7cSt1PnA7KW49ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5zdWJzdHIoMCxuLmxlbmd0aC0xKSkscT1tLm1lYXN1cmUobikud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuc3Vic3RyaW5nKG4ubGVuZ3RoKSwiLSIpLnRyaW0oKSx3cmFwcGVkVG9rZW46dytuKyIuLi4ifX07ci5wcm90b3R5cGUud3JhcE5leHRUb2tlbj1mdW5jdGlvbihsLHAsbSl7aWYoIXAuY2FuRml0VGV4dHx8cC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lc3x8IXRoaXMuY2FuRml0VG9rZW4obCxwLmF2YWlsYWJsZVdpZHRoLG0pKXJldHVybiB0aGlzLmZpbmlzaFdyYXBwaW5nKGwscCxtKTtmb3IoO2w7KXt2YXIgbj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgobCxwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC5jdXJyZW50TGluZT1uLmxpbmU7bD1uLnJlbWFpbmluZ1Rva2VuO2lmKG51bGwhPWwpaWYocC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPQorbi5icmVha1dvcmQsKytwLndyYXBwaW5nLm5vTGluZXMscC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lcyl7bT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUscC5hdmFpbGFibGVXaWR0aCxtKTtwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbjtwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4rbDtwLmN1cnJlbnRMaW5lPSJcbiI7YnJlYWt9ZWxzZSBwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChwLmN1cnJlbnRMaW5lKSxwLmN1cnJlbnRMaW5lPSJcbiJ9cmV0dXJuIHB9O3IucHJvdG90eXBlLmZpbmlzaFdyYXBwaW5nPWZ1bmN0aW9uKGwscCxtKXtwLmNhbkZpdFRleHQmJnAuYXZhaWxhYmxlTGluZXMhPT1wLndyYXBwaW5nLm5vTGluZXMmJnRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nPyhtPXRoaXMuYWRkRWxsaXBzaXMocC5jdXJyZW50TGluZSsKbCxwLmF2YWlsYWJsZVdpZHRoLG0pLHAud3JhcHBpbmcud3JhcHBlZFRleHQrPW0ud3JhcHBlZFRva2VuLHAud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9bS5yZW1haW5pbmdUb2tlbixwLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhtLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDxsLmxlbmd0aCkscC53cmFwcGluZy5ub0xpbmVzKz0rKDA8bS53cmFwcGVkVG9rZW4ubGVuZ3RoKSxwLmN1cnJlbnRMaW5lPSIiKTpwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPWw7cC5jYW5GaXRUZXh0PSExO3JldHVybiBwfTtyLnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKGwscCxtLG4pe2lmKHZvaWQgMD09PXEpdmFyIHE9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI7aWYobi5tZWFzdXJlKHArbCkud2lkdGg8PW0pcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnArbCxyZW1haW5pbmdUb2tlbjpudWxsfTtpZigiIj09PWwudHJpbSgpKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwLApyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcylyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCxyZW1haW5pbmdUb2tlbjpsfTtmb3IodmFyIHU9MDt1PGwubGVuZ3RoOylpZihuLm1lYXN1cmUocCtsLnN1YnN0cmluZygwLHUrMSkrcSkud2lkdGg8PW0pKyt1O2Vsc2UgYnJlYWs7bT0iIjswPHUmJihtPXEpO3JldHVybnticmVha1dvcmQ6MDx1LGxpbmU6cCtsLnN1YnN0cmluZygwLHUpK20scmVtYWluaW5nVG9rZW46bC5zdWJzdHJpbmcodSl9fTtyZXR1cm4gcn0oKTtmLldyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpeyhmdW5jdGlvbihrKXtmb3IodmFyIHIgaW4gaylmLmhhc093blByb3BlcnR5KHIpfHwoZltyXT1rW3JdKX0pKGgoMTM5KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCg3MikpO2soaCg3MykpO2soaCgyOCkpfSxmdW5jdGlvbihkLApmKXtmLnZlcnNpb249IjMuNy4wIn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoeCxDKXtyZXR1cm4geC5lYWNoKGZ1bmN0aW9uKCl7dmFyIEc9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiByKHgsQyl7Zm9yKHZhciBHIGluIEMpeC5hdHRyKEcsQ1tHXSk7cmV0dXJuIHh9ZnVuY3Rpb24gbCh4LEMsRyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcyksSDtmb3IoSCBpbiBEKUIuc3R5bGUoSCxEW0hdLEcpfSl9ZnVuY3Rpb24gcCh4LEMsRyl7Zm9yKHZhciBEIGluIEMpeC5zdHlsZShELENbRF0sRyk7cmV0dXJuIHh9ZnVuY3Rpb24gbSh4LEMpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRz1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLEI7Zm9yKEIgaW4gRylELnByb3BlcnR5KEIsCkdbQl0pfSl9ZnVuY3Rpb24gbih4LEMpe2Zvcih2YXIgRyBpbiBDKXgucHJvcGVydHkoRyxDW0ddKTtyZXR1cm4geH1mdW5jdGlvbiBxKHgsQyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBHPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih4KSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB1KHgsQyl7Zm9yKHZhciBHIGluIEMpeC5hdHRyKEcsQ1tHXSk7cmV0dXJuIHh9ZnVuY3Rpb24gdyh4LEMsRyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih4KSxIO2ZvcihIIGluIEQpQi5zdHlsZShILERbSF0sRyl9KX1mdW5jdGlvbiBBKHgsQyxHKXtmb3IodmFyIEQgaW4gQyl4LnN0eWxlKEQsQ1tEXSxHKTtyZXR1cm4geH12YXIgeT1kPWgoMSk7eS5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09CnR5cGVvZiB4P2s6cikodGhpcyx4KX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB4P2w6cCkodGhpcyx4LCIiKX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9tOm4pKHRoaXMseCl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9xOnUpKHRoaXMseCl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/dzpBKSh0aGlzLHgsIiIpfX0sZnVuY3Rpb24oZCxmLGgpe2Q9aCgxMTcpO3ZhciBrPWgoMTIpO2g9aCgxMCk7dmFyIHI9e2xpbmVhcjpkLmVhc2VMaW5lYXIscXVhZDpkLmVhc2VRdWFkLHF1YWRJbjpkLmVhc2VRdWFkSW4scXVhZE91dDpkLmVhc2VRdWFkT3V0LApxdWFkSW5PdXQ6ZC5lYXNlUXVhZEluT3V0LGN1YmljOmQuZWFzZUN1YmljLGN1YmljSW46ZC5lYXNlQ3ViaWNJbixjdWJpY091dDpkLmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmQuZWFzZUN1YmljSW5PdXQscG9seTpkLmVhc2VQb2x5LHBvbHlJbjpkLmVhc2VQb2x5SW4scG9seU91dDpkLmVhc2VQb2x5T3V0LHBvbHlJbk91dDpkLmVhc2VQb2x5SW5PdXQsc2luOmQuZWFzZVNpbixzaW5JbjpkLmVhc2VTaW5JbixzaW5PdXQ6ZC5lYXNlU2luT3V0LHNpbkluT3V0OmQuZWFzZVNpbkluT3V0LGV4cDpkLmVhc2VFeHAsZXhwSW46ZC5lYXNlRXhwSW4sZXhwT3V0OmQuZWFzZUV4cE91dCxleHBJbk91dDpkLmVhc2VFeHBJbk91dCxjaXJjbGU6ZC5lYXNlQ2lyY2xlLGNpcmNsZUluOmQuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpkLmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6ZC5lYXNlQ2lyY2xlSW5PdXQsYm91bmNlOmQuZWFzZUJvdW5jZSxib3VuY2VJbjpkLmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6ZC5lYXNlQm91bmNlT3V0LApib3VuY2VJbk91dDpkLmVhc2VCb3VuY2VJbk91dCxiYWNrOmQuZWFzZUJhY2ssYmFja0luOmQuZWFzZUJhY2tJbixiYWNrT3V0OmQuZWFzZUJhY2tPdXQsYmFja0luT3V0OmQuZWFzZUJhY2tJbk91dCxlbGFzdGljOmQuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OmQuZWFzZUVsYXN0aWNPdXQsZWxhc3RpY0luT3V0OmQuZWFzZUVsYXN0aWNJbk91dH07Zi5FYXNlTmFtZT1oLm1ha2VFbnVtKCJsaW5lYXIgcXVhZCBxdWFkSW4gcXVhZE91dCBxdWFkSW5PdXQgY3ViaWMgY3ViaWNJbiBjdWJpY091dCBjdWJpY0luT3V0IHBvbHkgcG9seUluIHBvbHlPdXQgcG9seUluT3V0IHNpbiBzaW5JbiBzaW5PdXQgc2luSW5PdXQgZXhwIGV4cEluIGV4cE91dCBleHBJbk91dCBjaXJjbGUgY2lyY2xlSW4gY2lyY2xlT3V0IGNpcmNsZUluT3V0IGJvdW5jZSBib3VuY2VJbiBib3VuY2VPdXQgYm91bmNlSW5PdXQgYmFjayBiYWNrSW4gYmFja091dCBiYWNrSW5PdXQgZWxhc3RpYyBlbGFzdGljSW4gZWxhc3RpY091dCBlbGFzdGljSW5PdXQiLnNwbGl0KCIgIikpOwpoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3N0YXJ0RGVsYXk9bC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcER1cmF0aW9uPWwuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcERlbGF5PWwuX0RFRkFVTFRfSVRFUkFUSVZFX0RFTEFZX01JTExJU0VDT05EUzt0aGlzLl9tYXhUb3RhbER1cmF0aW9uPWwuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUzt0aGlzLl9lYXNpbmdNb2RlPWwuX0RFRkFVTFRfRUFTSU5HX01PREV9bC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK20qTWF0aC5tYXgocC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9O2wucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3A9ay5jb2VyY2VFeHRlcm5hbEQzKHApOwp2YXIgcT1wLnNpemUoKSx1PXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocSk7cmV0dXJuIHAudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoZnVuY3Rpb24odyxBKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrdSpBfSkuYXR0cnMobSl9O2wucHJvdG90eXBlLnN0YXJ0RGVsYXk9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc3RhcnREZWxheTt0aGlzLl9zdGFydERlbGF5PXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiBNYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7dGhpcy5fc3RlcER1cmF0aW9uPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwRGVsYXl9O2wucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb249CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX21heFRvdGFsRHVyYXRpb247dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5lYXNpbmdNb2RlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2Vhc2luZ01vZGU7dGhpcy5fZWFzaW5nTW9kZT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmVhc2luZ01vZGUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBwPyhwPXJbcF0sbnVsbD09cD9yLmxpbmVhcjpwKTpwfTtsLnByb3RvdHlwZS5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLm1heFRvdGFsRHVyYXRpb24oKS10aGlzLnN0ZXBEdXJhdGlvbigpO209TWF0aC5tYXgobSwwKTtwPW0vTWF0aC5tYXgocC0xLDEpO3JldHVybiBNYXRoLm1pbih0aGlzLnN0ZXBEZWxheSgpLHApfTtyZXR1cm4gbH0oKTtoLl9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUz0KMDtoLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMDtoLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTU7aC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPUluZmluaXR5O2guX0RFRkFVTFRfRUFTSU5HX01PREU9ImV4cE91dCI7Zi5FYXNpbmc9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMTIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7fXIucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbigpe3JldHVybiAwfTtyLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGwscCl7bD1rLmNvZXJjZUV4dGVybmFsRDMobCk7cmV0dXJuIGwuYXR0cnMocCl9O3JldHVybiByfSgpO2YuTnVsbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24gdygpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYKKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KToody5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHcpfSxyPWgoMSksbD1oKDUpLHA9aCg0KSxtPWgoMCksbj1oKDIyKTtkPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUodyxBKXt2b2lkIDA9PT1BJiYoQT0iYm90dG9tIik7dz1xLmNhbGwodGhpcyx3LEEpfHx0aGlzO3cuX3RpY2tMYWJlbEFuZ2xlPTA7dy5fdGlja0xhYmVsU2hlYXJBbmdsZT0wO3cuYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKTtyZXR1cm4gd31rKHUscSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB3PW5ldyBsLldyYXBwZXI7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJncubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpO3JldHVybiB3fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwKIl93cml0ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLl90eXBlc2V0dGVyQ29udGV4dCl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkcmF3KCl9O3UucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHcsQSl7dmFyIHk9dGhpcy5pc0hvcml6b250YWwoKT8wOnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKSx4PXRoaXMuaXNIb3Jpem9udGFsKCk/CnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBDPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT94Kz1DOnkrPUN9dz10aGlzLl9tZWFzdXJlVGlja0xhYmVscyh3LEEpO3JldHVybnttaW5XaWR0aDp3LnVzZWRXaWR0aCt5LG1pbkhlaWdodDp3LnVzZWRIZWlnaHQreH19O3UucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB3PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksQT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodDp0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwKdGhpcy5oZWlnaHQoKSkubWluV2lkdGgseT10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKEEteSx3KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn07dS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odyxBKXtyZXR1cm4gcC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx3LEEpfTt1LnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih3KXt2YXIgQTt2b2lkIDA9PT13JiYodz10aGlzLl9zY2FsZSk7dm9pZCAwPT09QSYmKEE9dy5pbnZlcnRSYW5nZSgpKTt2YXIgeT1NYXRoLmNlaWwodS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqKDA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkpLwp3LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOkEuZmlsdGVyKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIDA9PT1DJXl9KSxzdGVwV2lkdGg6eSp3LnN0ZXBXaWR0aCgpfX07dS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7dGhyb3cgRXJyb3IoIkFuZ2xlIHVuZGVmaW5lZCBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTt9O3UucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZX07dS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24odyl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoO3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9CmZ1bmN0aW9uKHcpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczt0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX07dS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih3LEEpe3ZhciB5PXRoaXM7c3dpdGNoKHRoaXMudGlja0xhYmVsQW5nbGUoKSl7Y2FzZSAwOnZhciB4PXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O3ZhciBDPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6eD17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifTsKQz17bGVmdDoidG9wIixyaWdodDoiYm90dG9tIix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTticmVhaztjYXNlIC05MDp4PXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LEM9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19QS5lYWNoKGZ1bmN0aW9uKEcpe3ZhciBEPXIuc2VsZWN0KHRoaXMpLEI9eS5pc0hvcml6b250YWwoKT93Onkud2lkdGgoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpLEg9eS5pc0hvcml6b250YWwoKT95LmhlaWdodCgpLXkuX3RpY2tTcGFjZVJlcXVpcmVkKCk6dyxLPXt4QWxpZ246eFt5Lm9yaWVudGF0aW9uKCldLHlBbGlnbjpDW3kub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnkudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6eS50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXkuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT0KeS5vcmllbnRhdGlvbigpJiZCPnkuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgTD1CLXkuX3RpY2tMYWJlbE1heFdpZHRoO0w9RC5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK0wrIiwgMCkiO0QuYXR0cigidHJhbnNmb3JtIixMKX1CPU1hdGgubWluKEIseS5fdGlja0xhYmVsTWF4V2lkdGgpfXkuX3dyaXRlci53cml0ZSh5LmZvcm1hdHRlcigpKEcpLEIsSCxLLEQubm9kZSgpKX0pfTt1LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24odyxBKXt2YXIgeT10aGlzLHg9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT93OkFdKSxDPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oeCk7eD1DLmRvbWFpbjtDPUMuc3RlcFdpZHRoO3ZhciBHPXctdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRz1DLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEc9QS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSwKRz1NYXRoLm1heChHLDApKTt2YXIgRD1DO3RoaXMuaXNIb3Jpem9udGFsKCkmJihEPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSwwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihEPXctdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksRD1NYXRoLm1heChELDApKTtudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEc9TWF0aC5taW4oRyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO0E9eC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIHkuX3dyYXBwZXIud3JhcCh5LmZvcm1hdHRlcigpKEIpLHkuX21lYXN1cmVyLEcsRCl9KTt3PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9yLnN1bTptLk1hdGgubWF4O3g9dGhpcy5pc0hvcml6b250YWwoKSYmMD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlP20uTWF0aC5tYXg6ci5zdW07dz13KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkud2lkdGh9LDApOwpBPXgoQSxmdW5jdGlvbihCKXtyZXR1cm4geS5fbWVhc3VyZXIubWVhc3VyZShCLndyYXBwZWRUZXh0KS5oZWlnaHR9LDApOzAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEE9W0Esd10sdz1BWzBdLEE9QVsxXSk7cmV0dXJue3VzZWRXaWR0aDp3LHVzZWRIZWlnaHQ6QX19O3UucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHc9dGhpcztxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBBPXRoaXMuX3NjYWxlLHk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhBKSx4PXkuZG9tYWluLEM9eT15LnN0ZXBXaWR0aDt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEM9TWF0aC5taW4oQyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3g9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoeCk7dmFyIEc9eC5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZSh4KTt4LmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oRCl7dmFyIEI9QS5zY2FsZShEKS1DLzI7RD13LmlzSG9yaXpvbnRhbCgpP0I6MDtCPXcuaXNIb3Jpem9udGFsKCk/MDpCO3JldHVybiJ0cmFuc2xhdGUoIitEKyIsIitCKyIpIn0pO0cudGV4dCgiIik7dGhpcy5fZHJhd1RpY2tzKHksRyk7eT0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt4PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreSsiLCIreCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLl9zaG93QWxsVGlja0xhYmVscygpO3RoaXMuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWwoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24odyxBLHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHcsQSx5KTt0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB1fShuLkF4aXMpO2QuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1O2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KToody5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHcpfSwKcj1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHcsQSl7dz1xLmNhbGwodGhpcyx3LEEpfHx0aGlzO3cuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiO3cuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExO3cuZm9ybWF0dGVyKHAuZ2VuZXJhbCgpKTtyZXR1cm4gd31rKHUscSk7dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHc9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHcpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKDEpfTt1LnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6CnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdzpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt3KX07dS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB3PXRoaXMsQT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKGZ1bmN0aW9uKHkpe3k9dy5mb3JtYXR0ZXIoKSh5KTtyZXR1cm4gdy5fbWVhc3VyZXIubWVhc3VyZSh5KS53aWR0aH0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlQXBwcm94aW1hdGVUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgiTSIpLndpZHRoO0E9QS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHcuZm9ybWF0dGVyKCkoeCkubGVuZ3RoKgp5fSk7cmV0dXJuIG0uTWF0aC5tYXgoQSwwKX07dS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdzpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt3KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLl9zY2FsZSxBPXcuZG9tYWluKCkseT1BWzBdPD1BWzFdP0FbMF06QVsxXSx4PUFbMF0+PUFbMV0/QVswXTpBWzFdO3JldHVybiB3LnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDPj15JiZDPD14fSl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB3PQp0aGlzLl9jb21wdXRlV2lkdGgoKTtpZih3PnRoaXMud2lkdGgoKXx8dzx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSl7dGhpcy5yZWRyYXcoKTtyZXR1cm59fXRoaXMucmVuZGVyKCl9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB3PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSx5PXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHg9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksQz0ibWlkZGxlIixHPTAsRD0wLEI9MCxIPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UgImxlZnQiOkM9ImVuZCI7Rz0teDtIPXg7YnJlYWs7Y2FzZSAiY2VudGVyIjpIPXkreDticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEg9Rz14fWVsc2Ugc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJ0b3AiOkEuZHk9CiItMC4zZW0iO0I9eDtEPS14O2JyZWFrO2Nhc2UgImNlbnRlciI6Qj15K3g7YnJlYWs7Y2FzZSAiYm90dG9tIjpBLmR5PSIxZW0iLEQ9Qj14fXk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpBLng9eS54MTtBLmR5PSIwLjk1ZW0iO0Q9eS55MStIO2JyZWFrO2Nhc2UgInRvcCI6QS54PXkueDE7QS5keT0iLS4yNWVtIjtEPXkueTEtSDticmVhaztjYXNlICJsZWZ0IjpDPSJlbmQiO0c9eS54MS1CO0EueT15LnkxO2JyZWFrO2Nhc2UgInJpZ2h0IjpDPSJzdGFydCIsRz15LngxK0IsQS55PXkueTF9Qj10aGlzLl9nZXRUaWNrVmFsdWVzKCk7Qj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCKTtCLmV4aXQoKS5yZW1vdmUoKTtCLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChuLkF4aXMuVElDS19MQUJFTF9DTEFTUywKITApLm1lcmdlKEIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikuYXR0cnMoQSkudGV4dChmdW5jdGlvbihLKXtyZXR1cm4gdy5mb3JtYXR0ZXIoKShLKX0pO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitHKyIsICIrRCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKTsiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwp3PXcudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT13JiYiY2VudGVyIiE9PXcmJiJyaWdodCIhPT13KXRocm93IEVycm9yKHcrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKTt9ZWxzZSBpZigidG9wIiE9PXcmJiJjZW50ZXIiIT09dyYmImJvdHRvbSIhPT13KXRocm93IEVycm9yKHcrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSEwfTt1LnByb3RvdHlwZS5faGlkZUVuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCkE9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1BLnNpemUoKSl7dmFyIHk9QS5ub2RlcygpWzBdO20uRE9NLmNsaWVudFJlY3RJbnNpZGUoeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx3KXx8ci5zZWxlY3QoeSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTtBPUEubm9kZXMoKVtBLnNpemUoKS0xXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKEEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdyl8fHIuc2VsZWN0KEEpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fTt1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdz10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHg9ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4iaW5oZXJpdCI9PT0KeHx8InZpc2libGUiPT09eH0pLEE9dy5ub2RlcygpLm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLHk9MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbCh5LEEpJiZ5PEEubGVuZ3RoOyl5Kz0xO3cuZWFjaChmdW5jdGlvbih4LEMpe3g9ci5zZWxlY3QodGhpcyk7MCE9PUMleSYmeC5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSl9O3UucHJvdG90eXBlLl9oYXNPdmVybGFwV2l0aEludGVydmFsPWZ1bmN0aW9uKHcsQSl7dmFyIHk9ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpO0E9QS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIG0uRE9NLmV4cGFuZFJlY3QoQyx5KX0pO2Zvcih2YXIgeD0wO3g8QS5sZW5ndGgtdzt4Kz13KWlmKG0uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChBW3hdLEFbeCt3XSkpcmV0dXJuITE7cmV0dXJuITB9Owp1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtmLk51bWVyaWM9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfTtkPWgoNDIpO3ZhciByPWgoMjUpLGw9aCgwKTtoPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7ZnVuY3Rpb24gcSgpe3gmJih4PSExLHkuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdShDLEcpe3gmJih5Ll9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSh5Ll9pc1ZlcnRpY2FsKCk/CkcueDpHLnkpLHkuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdyhDKXtBKEMpJiYoeD0hMCx5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gQShDKXtyZXR1cm4geS5faXNWZXJ0aWNhbCgpJiZ5LnBpeGVsUG9zaXRpb24oKS15LmRldGVjdGlvblJhZGl1cygpPD1DLngmJkMueDw9eS5waXhlbFBvc2l0aW9uKCkreS5kZXRlY3Rpb25SYWRpdXMoKXx8IXkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy55JiZDLnk8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl9dmFyIHk9cC5jYWxsKHRoaXMsbil8fHRoaXM7eS5fZGV0ZWN0aW9uUmFkaXVzPTM7eS5fZW5hYmxlZD0hMDt5LmFkZENsYXNzKCJkcmFnLWxpbmUtbGF5ZXIiKTt5LmFkZENsYXNzKCJlbmFibGVkIik7eS5fZHJhZ0ludGVyYWN0aW9uPW5ldyByLkRyYWc7eS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHkpOwp2YXIgeD0hMTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQodyk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHEpO3kuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQodyk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQocSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfTt5Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt5Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB5fWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLApzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9OwptLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9bik/dGhpcy5hZGRDbGFzcygiZW5hYmxlZCIpOnRoaXMucmVtb3ZlQ2xhc3MoImVuYWJsZWQiKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cmV0dXJuIG19KGQuR3VpZGVMaW5lTGF5ZXIpO2YuRHJhZ0xpbmVMYXllcj1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsLHAsbSl7dmFyIG49Cnt9O2lmKHZvaWQgMCE9PW0pZm9yKHZhciBxPTA7cTxtLmxlbmd0aDtxKyspblttW3FdXT1tW3EtMV07cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB3PWwuc2NhbGUodSk7aWYoIXApcmV0dXJuIHc7dmFyIEE7dT12b2lkIDA9PT1uW3VdP3ZvaWQgMDpsLnNjYWxlKG5bdV0pO3ZvaWQgMCE9PXUmJihBPXUrKHctdSkvMik7cmV0dXJuIEF9fXZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygiZ3JpZGxpbmVzIik7cS5feFNjYWxlPW07cS5feVNjYWxlPW47cS5fcmVuZGVyQ2FsbGJhY2s9CmZ1bmN0aW9uKCl7cmV0dXJuIHEucmVuZGVyKCl9O2lmKHEuX3hTY2FsZSlxLl94U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO2lmKHEuX3lTY2FsZSlxLl95U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiBxfXIocCxsKTtwLnByb3RvdHlwZS5iZXR3ZWVuWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iZXR3ZWVuWH07cC5wcm90b3R5cGUuYmV0d2Vlblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlbll9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTt0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCk7dGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9yZWRyYXdYTGluZXMoKTt0aGlzLl9yZWRyYXdZTGluZXMoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblgoKSxuPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkxIiwwKS5hdHRyKCJ4MiIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cC5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIG09dGhpcy5iZXR3ZWVuWSgpLApuPXRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3lMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIsayh0aGlzLl95U2NhbGUsbSx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIixtKS5jbGFzc2VkKCJ6ZXJvbGluZSIsZnVuY3Rpb24ocSl7cmV0dXJuIDA9PT1xfSk7bi5leGl0KCkucmVtb3ZlKCl9fTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuR3JpZGxpbmVzPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgdyBpbiBxKXEuaGFzT3duUHJvcGVydHkodykmJgooblt3XT1xW3ddKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHI9aCg1KSxsPWgoMjMpLHA9aCg4KSxtPWgoMCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKHUpe3ZhciB3PW4uY2FsbCh0aGlzKXx8dGhpczt3Ll90ZXh0UGFkZGluZz01O2lmKG51bGw9PXUpdGhyb3cgRXJyb3IoIkludGVycG9sYXRlZENvbG9yTGVnZW5kIHJlcXVpcmVzIGEgaW50ZXJwb2xhdGVkQ29sb3JTY2FsZSIpO3cuX3NjYWxlPXU7dy5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdy5yZWRyYXcoKX07dy5fc2NhbGUub25VcGRhdGUody5fcmVkcmF3Q2FsbGJhY2spO3cuX2Zvcm1hdHRlcj1wLmdlbmVyYWwoKTt3Ll9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI7dy5fZXhwYW5kcz0hMTt3LmFkZENsYXNzKCJsZWdlbmQiKTt3LmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7cmV0dXJuIHd9ayhxLApuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHBhbmRzfTtxLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih1KXt1PXUudG9Mb3dlckNhc2UoKTtpZigiaG9yaXpvbnRhbCI9PT11fHwibGVmdCI9PT11fHwicmlnaHQiPT09dSlyZXR1cm4gdTt0aHJvdyBFcnJvcignIicrdSsnIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQnKTt9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PQp1KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0aGlzLl9vcmllbnRhdGlvbj1xLl9lbnN1cmVPcmllbnRhdGlvbih1KTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIHc9dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXUpcmV0dXJuW3dbMF1dO2Zvcih2YXIgQT0od1sxXS13WzBdKS8odS0xKSx5PVtdLHg9MDt4PHU7eCsrKXkucHVzaCh3WzBdK0EqeCk7cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApO3RoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKTt0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3RoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIHU9bmV3IHIuU3ZnQ29udGV4dCh0aGlzLmNvbnRlbnQoKS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyByLk1lYXN1cmVyKHUpO3RoaXMuX3dyYXBwZXI9bmV3IHIuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHIuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHUsdGhpcy5fd3JhcHBlcil9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPQpmdW5jdGlvbigpe3ZhciB1PXRoaXMsdz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEE9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB1Ll9tZWFzdXJlci5tZWFzdXJlKHUuX2Zvcm1hdHRlcihDKSkud2lkdGh9KSx5PXEuX0RFRkFVTFRfTlVNX1NXQVRDSEVTO2lmKHRoaXMuX2lzVmVydGljYWwoKSl7dmFyIHg9bS5NYXRoLm1heChBLDApO0E9dyt3K3RoaXMuX3RleHRQYWRkaW5nK3grdGhpcy5fdGV4dFBhZGRpbmc7eD15Knd9ZWxzZSB4PXcrdyt3LEE9dGhpcy5fdGV4dFBhZGRpbmcrQVswXSt5KncrQVsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6QSxtaW5IZWlnaHQ6eH19O3EucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwp2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKSxBPXRoaXMuX2Zvcm1hdHRlcih3WzBdKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoQSkud2lkdGgseD10aGlzLl9mb3JtYXR0ZXIod1sxXSk7dz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHgpLndpZHRoO3ZhciBDPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsRz10aGlzLl90ZXh0UGFkZGluZyxEPTAsQj0wLEg9MCxLPTAsTD17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSj17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sTz17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciBTPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIE49TWF0aC5tYXgoeSx3KTt2YXIgUj0odGhpcy53aWR0aCgpLU4tMip0aGlzLl90ZXh0UGFkZGluZykvMjt3PU1hdGgubWF4KHRoaXMud2lkdGgoKS1SLTIqRy1OLDApOwpDPTE7dmFyIFg9ZnVuY3Rpb24oZmEsb2Epe3JldHVybiB1LmhlaWdodCgpLShvYSsxKX07Si55QWxpZ249InRvcCI7Qj0wO0wueUFsaWduPSJib3R0b20iO0s9MDtpZigibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbil7dmFyIGFhPWZ1bmN0aW9uKCl7cmV0dXJuIEcrTitHfTtKLnhBbGlnbj0icmlnaHQiO0Q9LShSK3crRyk7TC54QWxpZ249InJpZ2h0IjtIPS0oUit3K0cpfWVsc2UgYWE9ZnVuY3Rpb24oKXtyZXR1cm4gUn0sSi54QWxpZ249ImxlZnQiLEQ9Uit3K0csTC54QWxpZ249ImxlZnQiLEg9Uit3K0c7Ty53aWR0aD13O08uaGVpZ2h0PVMqQ31lbHNlIFI9TWF0aC5tYXgoRywodGhpcy5oZWlnaHQoKS1DKS8yKSxTPU1hdGgubWF4KE1hdGguZmxvb3IodGhpcy53aWR0aCgpLTQqRy15LXcpLDApLHc9MSxDPU1hdGgubWF4KHRoaXMuaGVpZ2h0KCktMipSLDApLGFhPWZ1bmN0aW9uKGZhLG9hKXtyZXR1cm4gTWF0aC5mbG9vcih5KzIqRykrb2F9LFg9ZnVuY3Rpb24oKXtyZXR1cm4gUn0sCkoueEFsaWduPSJyaWdodCIsRD0tRyxMLnhBbGlnbj0ibGVmdCIsSD1HLE8ueT1SLE8ud2lkdGg9Uyp3LE8uaGVpZ2h0PUM7Ty54PWFhKG51bGwsMCk7dGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeCx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxKLHRoaXMuX3VwcGVyTGFiZWwubm9kZSgpKTt0aGlzLl91cHBlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwgIitCKyIpIik7dGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoQSx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxMLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTt0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0grIiwgIitLKyIpIik7dGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnMoTyk7QT10aGlzLl9nZW5lcmF0ZVRpY2tzKFMpO0E9dGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKEEpOwp4PUEuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKTtEPUEubWVyZ2UoeCk7QS5leGl0KCkucmVtb3ZlKCk7RC5hdHRycyh7ZmlsbDpmdW5jdGlvbihmYSl7cmV0dXJuIHUuX3NjYWxlLnNjYWxlKGZhKX0sd2lkdGg6dyxoZWlnaHQ6Qyx4OmFhLHk6WCwic2hhcGUtcmVuZGVyaW5nIjoiY3Jpc3BFZGdlcyJ9KTtsLkFERF9USVRMRV9FTEVNRU5UUyYmeC5hcHBlbmQoInRpdGxlIikudGV4dChmdW5jdGlvbihmYSl7cmV0dXJuIHUuX2Zvcm1hdHRlcihmYSl9KTtyZXR1cm4gdGhpc307cmV0dXJuIHF9KGgoNCkuQ29tcG9uZW50KTtkLl9ERUZBVUxUX05VTV9TV0FUQ0hFUz0xMTtkLkxFR0VORF9MQUJFTF9DTEFTUz0ibGVnZW5kLWxhYmVsIjtmLkludGVycG9sYXRlZENvbG9yTGVnZW5kPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJgoobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHI9aCg1KTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT0iIik7dm9pZCAwPT09biYmKG49MCk7dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuYWRkQ2xhc3MoImxhYmVsIik7cS50ZXh0KG0pO3EuYW5nbGUobik7cS54QWxpZ25tZW50KCJjZW50ZXIiKS55QWxpZ25tZW50KCJjZW50ZXIiKTtxLl9wYWRkaW5nPTA7cmV0dXJuIHF9ayhwLGwpO3AucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIG09dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KSxuPSgwPT09dGhpcy5hbmdsZSgpP20ud2lkdGg6bS5oZWlnaHQpKzIqdGhpcy5wYWRkaW5nKCk7bT0oMD09PXRoaXMuYW5nbGUoKT9tLmhlaWdodDptLndpZHRoKSsyKnRoaXMucGFkZGluZygpO3JldHVybnttaW5XaWR0aDpuLAptaW5IZWlnaHQ6bX19O3AucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2wucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3RleHRDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIik7dmFyIG09bmV3IHIuU3ZnQ29udGV4dCh0aGlzLl90ZXh0Q29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IHIuQ2FjaGVNZWFzdXJlcihtKTt0aGlzLl93cmFwcGVyPW5ldyByLldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyByLldyaXRlcih0aGlzLl9tZWFzdXJlcixtLHRoaXMuX3dyYXBwZXIpO3RoaXMudGV4dCh0aGlzLl90ZXh0KX07cC5wcm90b3R5cGUudGV4dD1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl90ZXh0O2lmKCJzdHJpbmciIT09dHlwZW9mIG0pdGhyb3cgRXJyb3IoIkxhYmVsLnRleHQoKSBvbmx5IHRha2VzIHN0cmluZ3MgYXMgaW5wdXQiKTt0aGlzLl90ZXh0PW07dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuYW5nbGU9CmZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX2FuZ2xlO20lPTM2MDsxODA8bT9tLT0zNjA6LTE4MD5tJiYobSs9MzYwKTtpZigtOTA9PT1tfHwwPT09bXx8OTA9PT1tKXRoaXMuX2FuZ2xlPW07ZWxzZSB0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgYW5nbGUgZm9yIExhYmVsIik7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucGFkZGluZz1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9wYWRkaW5nO209K207aWYoMD5tKXRocm93IEVycm9yKG0rIiBpcyBub3QgYSB2YWxpZCBwYWRkaW5nIHZhbHVlLiBDYW5ub3QgYmUgbGVzcyB0aGFuIDAuIik7dGhpcy5fcGFkZGluZz1tO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9CmZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBtPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj1NYXRoLm1heChNYXRoLm1pbigodGhpcy5oZWlnaHQoKS1tLmhlaWdodCkvMix0aGlzLnBhZGRpbmcoKSksMCk7bT1NYXRoLm1heChNYXRoLm1pbigodGhpcy53aWR0aCgpLW0ud2lkdGgpLzIsdGhpcy5wYWRkaW5nKCkpLDApO3RoaXMuX3RleHRDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO209dGhpcy53aWR0aCgpLTIqbTtuPXRoaXMuaGVpZ2h0KCktMipuO3ZhciBxPXt4QWxpZ246dGhpcy54QWxpZ25tZW50KCkseUFsaWduOnRoaXMueUFsaWdubWVudCgpLHRleHRSb3RhdGlvbjp0aGlzLmFuZ2xlKCl9O3RoaXMuX3dyaXRlci53cml0ZSh0aGlzLl90ZXh0LG0sbixxKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBwfShoKDQpLkNvbXBvbmVudCk7Zi5MYWJlbD1kO2g9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtLG4pe209bC5jYWxsKHRoaXMsbSxuKXx8dGhpczttLmFkZENsYXNzKHAuVElUTEVfTEFCRUxfQ0xBU1MpO3JldHVybiBtfWsocCxsKTtyZXR1cm4gcH0oZCk7aC5USVRMRV9MQUJFTF9DTEFTUz0idGl0bGUtbGFiZWwiO2YuVGl0bGVMYWJlbD1oO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtLG4pe209bC5jYWxsKHRoaXMsbSxuKXx8dGhpczttLmFkZENsYXNzKHAuQVhJU19MQUJFTF9DTEFTUyk7cmV0dXJuIG19ayhwLGwpO3JldHVybiBwfShkKTtkLkFYSVNfTEFCRUxfQ0xBU1M9ImF4aXMtbGFiZWwiO2YuQXhpc0xhYmVsPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8CmZ1bmN0aW9uKEEseSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9QX1mb3IodmFyIEMgaW4geSl5Lmhhc093blByb3BlcnR5KEMpJiYoQVtDXT15W0NdKTtBLnByb3RvdHlwZT1udWxsPT09eT9PYmplY3QuY3JlYXRlKHkpOih4LnByb3RvdHlwZT15LnByb3RvdHlwZSxuZXcgeCl9LHI9aCgxKSxsPWgoNSkscD1oKDIzKSxtPWgoOCksbj1oKDMxKSxxPWgoMCk7ZD1oKDQpO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQSh5LHgsQyl7dm9pZCAwPT09eSYmKHk9W10pO3ZvaWQgMD09PXgmJih4PTApO3ZvaWQgMD09PUMmJihDPUluZmluaXR5KTt0aGlzLmNvbHVtbnM9eTt0aGlzLmJvdHRvbVBhZGRpbmc9eDt0aGlzLm1heFdpZHRoPUN9QS5wcm90b3R5cGUuYWRkQ29sdW1uPWZ1bmN0aW9uKHkpe3ZhciB4PXkud2lkdGgsQz10aGlzLmdldFdpZHRoQXZhaWxhYmxlKCk7eS53aWR0aD1NYXRoLm1pbihDLHgpO3RoaXMuY29sdW1ucy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRCb3VuZHM9CmZ1bmN0aW9uKHkpe2Zvcih2YXIgeD10aGlzLmNvbHVtbnNbeV0sQz0wLEc9MDtHPHk7RysrKUMrPXRoaXMuY29sdW1uc1tHXS53aWR0aDtyZXR1cm57dG9wTGVmdDp7eDpDLHk6MH0sYm90dG9tUmlnaHQ6e3g6Qyt4LndpZHRoLHk6eC5oZWlnaHR9fX07QS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHEuTWF0aC5tYXgodGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbih5KXtyZXR1cm4geS5oZWlnaHR9KSwwKSt0aGlzLmJvdHRvbVBhZGRpbmd9O0EucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMuY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24oeSx4KXtyZXR1cm4geSt4LndpZHRofSwwKSx0aGlzLm1heFdpZHRoKX07QS5wcm90b3R5cGUuZ2V0V2lkdGhBdmFpbGFibGU9ZnVuY3Rpb24oKXt2YXIgeT10aGlzLmdldFdpZHRoKCk7cmV0dXJuIE1hdGgubWF4KHRoaXMubWF4V2lkdGgteSwwKX07cmV0dXJuIEF9KCksdz1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSwKeCxDLEcpe3ZvaWQgMD09PXkmJih5PUluZmluaXR5KTt2b2lkIDA9PT14JiYoeD1JbmZpbml0eSk7dm9pZCAwPT09QyYmKEM9MCk7dm9pZCAwPT09RyYmKEc9W10pO3RoaXMubWF4V2lkdGg9eTt0aGlzLm1heEhlaWdodD14O3RoaXMucGFkZGluZz1DO3RoaXMucm93cz1HfUEucHJvdG90eXBlLmFkZFJvdz1mdW5jdGlvbih5KXt5Lm1heFdpZHRoPXRoaXMubWF4V2lkdGgtMip0aGlzLnBhZGRpbmc7dGhpcy5yb3dzLnB1c2goeSl9O0EucHJvdG90eXBlLmdldENvbHVtbkJvdW5kcz1mdW5jdGlvbih5LHgpe3ZhciBDPXRoaXMuZ2V0Um93Qm91bmRzKHkpO3k9dGhpcy5yb3dzW3ldLmdldEJvdW5kcyh4KTt5LnRvcExlZnQueCs9Qy50b3BMZWZ0Lng7eS5ib3R0b21SaWdodC54Kz1DLnRvcExlZnQueDt5LnRvcExlZnQueSs9Qy50b3BMZWZ0Lnk7eS5ib3R0b21SaWdodC55Kz1DLnRvcExlZnQueTtyZXR1cm4geX07QS5wcm90b3R5cGUuZ2V0Um93Qm91bmRzPWZ1bmN0aW9uKHkpe2Zvcih2YXIgeD0KdGhpcy5wYWRkaW5nLEM9dGhpcy5wYWRkaW5nLEc9MDtHPHk7RysrKUMrPXRoaXMucm93c1tHXS5nZXRIZWlnaHQoKTtyZXR1cm57dG9wTGVmdDp7eCx5OkN9LGJvdHRvbVJpZ2h0Ont4OngrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHgpe3JldHVybiB5K3guZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4ocS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7ZD1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHgpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09eCl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9eDtDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9bS5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEcsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEgpfSk7cmV0dXJuIEIuaW5kZXhPZihHKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31rKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3guYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7eD1uZXcgbC5TdmdDb250ZXh0KHgubm9kZSgpLG51bGwscC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoeCk7dGhpcy5fd3JhcHBlcj0obmV3IGwuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIseCx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PQp4KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih4KXtpZihudWxsPT14KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih4KXtudWxsIT14JiYodGhpcy5fY29tcGFyYXRvcj0KeCx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbCE9eD8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9eCx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih4LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHcoeCxDLHRoaXMuX3BhZGRpbmcpO3g9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oSywKTCl7cmV0dXJuIEcuX2NvbXBhcmF0b3IoRy5fZm9ybWF0dGVyKEspLEcuX2Zvcm1hdHRlcihMKSl9KTt2YXIgSD1uZXcgdTtCLmFkZFJvdyhIKTtILmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt4LmZvckVhY2goZnVuY3Rpb24oSyl7SC5jb2x1bW5zLmxlbmd0aC8yPT09Ry5tYXhFbnRyaWVzUGVyUm93KCkmJihIPW5ldyB1LEguYm90dG9tUGFkZGluZz1HLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEgpKTt2YXIgTD1ILmdldFdpZHRoQXZhaWxhYmxlKCksSj1HLl9mb3JtYXR0ZXIoSyksTz1HLl9tZWFzdXJlci5tZWFzdXJlKEopLndpZHRoOzA+TC1ELU8mJjE8SC5jb2x1bW5zLmxlbmd0aCYmKEg9bmV3IHUsSC5ib3R0b21QYWRkaW5nPUcuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSCkpO0guYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Syx0eXBlOiJzeW1ib2wifX0pO0w9SC5nZXRXaWR0aEF2YWlsYWJsZSgpO0w9TWF0aC5taW4oTCwKTyk7Ry5fd3JhcHBlci5tYXhMaW5lcyhHLm1heExpbmVzUGVyRW50cnkoKSk7Sj1HLl93cmFwcGVyLndyYXAoSixHLl9tZWFzdXJlcixMKS5ub0xpbmVzKkQ7SC5hZGRDb2x1bW4oe3dpZHRoOkwsaGVpZ2h0OkosZGF0YTp7bmFtZTpLLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQyl7eD10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHEuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx4XSx4KSxDKTtyZXR1cm57bWluSGVpZ2h0OnguZ2V0SGVpZ2h0KCksbWluV2lkdGg6eC5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih4KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBHPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBHLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixIKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBLPUcuZ2V0Um93Qm91bmRzKEgpO3JldHVybiBxLk1hdGgud2l0aGluKHgsSyk/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihMLEosTyl7dmFyIFM9Ry5nZXRDb2x1bW5Cb3VuZHMoSCxPKTtpZihxLk1hdGgud2l0aGluKHgsUykpe0w9Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbSF07Tz1yLnNlbGVjdChMKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoTy8yKV07dmFyIE49ci5zZWxlY3QoTykuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO1M9cS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKHIuc2VsZWN0KEwpKTtOPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhOKTtyZXR1cm5be2JvdW5kczpxLkRPTS5lbGVtZW50QkJveChyLnNlbGVjdChMKSksZGF0dW06Si5kYXRhLm5hbWUscG9zaXRpb246e3g6U1swXStOWzBdLHk6U1sxXStOWzFdfSxzZWxlY3Rpb246ci5zZWxlY3QoTyksCmNvbXBvbmVudDpDfV19cmV0dXJuIEx9LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB4PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh4LnJvd3MpLEc9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixIKXtCPXguZ2V0Um93Qm91bmRzKEgpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ry5lYWNoKGZ1bmN0aW9uKEIsSCl7Zm9yKHZhciBLPQpbXSxMPTA7TDxCLmNvbHVtbnMubGVuZ3RoO0wrPTIpSy5wdXNoKFtCLmNvbHVtbnNbTF0sQi5jb2x1bW5zW0wrMV1dKTtCPXIuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKEspO0s9Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO0suYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSil7Sj1KWzBdO3JldHVybiBELnN5bWJvbCgpKEouZGF0YS5uYW1lLEgpKC42KkouaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSil7Sj1KWzBdO3JldHVybiJ0cmFuc2xhdGUoIisoeC5nZXRDb2x1bW5Cb3VuZHMoSCx4LnJvd3NbSF0uY29sdW1ucy5pbmRleE9mKEopKS50b3BMZWZ0LngrSi53aWR0aC8yKSsiLCAiK0ouaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSil7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSlswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEope3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShKWzBdLmRhdGEubmFtZSxIKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihKKXtyZXR1cm4idHJhbnNsYXRlKCIreC5nZXRDb2x1bW5Cb3VuZHMoSCx4LnJvd3NbSF0uY29sdW1ucy5pbmRleE9mKEpbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihKKXt2YXIgTz1yLnNlbGVjdCh0aGlzKTtKPUpbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihKLmRhdGEubmFtZSksSi53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sTy5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXg7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGQuQ29tcG9uZW50KTtkLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2QuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2QuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7Zi5MZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0scj1oKDIpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gbnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKG4pe3ZhciBxLHU9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih3KXt3PXcuZW50aXR5TmVhcmVzdChuKTtpZihudWxsIT13KXt2YXIgQT1sLk1hdGguZGlzdGFuY2VTcXVhcmVkKHcucG9zaXRpb24sbik7QTw9dSYmKHU9QSxxPXcpfX0pO3JldHVybiBxfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obil7aWYobnVsbCE9biYmIShuIGluc3RhbmNlb2Ygci5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKcC5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoNDEpLkdyb3VwKTtmLlBsb3RHcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgxKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7cS5fcm93UGFkZGluZz0wO3EuX2NvbHVtblBhZGRpbmc9MDtxLl9yb3dzPVtdO3EuX3Jvd1dlaWdodHM9W107cS5fY29sdW1uV2VpZ2h0cz1bXTtxLl9uUm93cz0wO3EuX25Db2xzPTA7cS5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtxLmFkZENsYXNzKCJ0YWJsZSIpO24uZm9yRWFjaChmdW5jdGlvbih1LHcpe3UuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnEuYWRkKEEsdyx5KX0pfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG4pe2Zvcih2YXIgcT0wO3E8dGhpcy5fblJvd3M7cSsrKWZvcih2YXIgdT0wO3U8dGhpcy5fbkNvbHM7dSsrKW51bGwhPXRoaXMuX3Jvd3NbcV1bdV0mJm4odGhpcy5fcm93c1txXVt1XSl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bilyZXR1cm4hMDtyZXR1cm4hMX07bS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24obixxKXtyZXR1cm4gMD5ufHxuPj10aGlzLl9uUm93c3x8MD5xfHxxPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3Nbbl1bcV19O20ucHJvdG90eXBlLmFkZD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXMobikpe2lmKG51bGwhPSh0aGlzLl9yb3dzW3FdJiZ0aGlzLl9yb3dzW3FdW3VdKSl0aHJvdyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO24uZGV0YWNoKCk7dGhpcy5fblJvd3M9TWF0aC5tYXgocSsxLHRoaXMuX25Sb3dzKTt0aGlzLl9uQ29scz1NYXRoLm1heCh1KzEsdGhpcy5fbkNvbHMpO3RoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKTt0aGlzLl9yb3dzW3FdW3VdPW47dGhpcy5fYWRvcHRBbmRBbmNob3Iobik7dGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bil7dGhpcy5fcm93c1txXVt1XT0KbnVsbDtyZXR1cm59fTttLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB3PXRoaXMuX3Jvd3MsQT1yLnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtuLT10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKTtxLT10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKTt3PW0uX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMsdyxmdW5jdGlvbihOKXtyZXR1cm4gbnVsbD09Tnx8Ti5maXhlZEhlaWdodCgpfSk7QT1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLEEsZnVuY3Rpb24oTil7cmV0dXJuIG51bGw9PU58fE4uZml4ZWRXaWR0aCgpfSk7dmFyIHk9QS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIDA9PT1OPy41Ok59KSx4PXcubWFwKGZ1bmN0aW9uKE4pe3JldHVybiAwPT09Tj8uNTpOfSk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxuKTt2YXIgQz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeCwKcSksRz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEQ9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKTt4PTA7Zm9yKHZhciBCLEgsSzs7KXtEPWwuQXJyYXkuYWRkKEQsQyk7eT1sLkFycmF5LmFkZChHLHkpO0I9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyh5LEQsdSk7Rz1CLmd1YXJhbnRlZWRXaWR0aHM7RD1CLmd1YXJhbnRlZWRIZWlnaHRzO0g9Qi53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24oTil7cmV0dXJuIE59KTtLPUIud2FudHNIZWlnaHRBcnIuc29tZShmdW5jdGlvbihOKXtyZXR1cm4gTn0pO3ZhciBMPU8sSj1TO3ZhciBPPW4tci5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTt2YXIgUz1xLXIuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9dm9pZCAwO0g/KHk9Qi53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTj8uMTowfSkseT1sLkFycmF5LmFkZCh5LEEpKTp5PUE7Qz12b2lkIDA7Sz8oQz1CLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTj8KLjE6MH0pLEM9bC5BcnJheS5hZGQoQyx3KSk6Qz13O3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksTyk7Qz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxTKTt4Kys7Sj0wPFMmJlMhPT1KO2lmKCEoMDxPJiZPIT09THx8SikpYnJlYWs7aWYoNTx4KWJyZWFrfU89bi1yLnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO1M9cS1yLnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShBLE8pO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHcsUyk7cmV0dXJue2NvbFByb3BvcnRpb25hbFNwYWNlOnkscm93UHJvcG9ydGlvbmFsU3BhY2U6QyxndWFyYW50ZWVkV2lkdGhzOkIuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czpCLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6SCx3YW50c0hlaWdodDpLfX07bS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgdz0KbC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxBPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSx4PWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fblJvd3MpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEcpe0MuZm9yRWFjaChmdW5jdGlvbihELEIpe0Q9bnVsbCE9RD9ELnJlcXVlc3RlZFNwYWNlKG5bQl0scVtHXSk6e21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O3dbQl09TWF0aC5tYXgod1tCXSx1P01hdGgubWluKEQubWluV2lkdGgsbltCXSk6RC5taW5XaWR0aCk7QVtHXT1NYXRoLm1heChBW0ddLHU/TWF0aC5taW4oRC5taW5IZWlnaHQscVtHXSk6RC5taW5IZWlnaHQpO3ZhciBIPUQubWluV2lkdGg+bltCXTt5W0JdPXlbQl18fEg7Qj1ELm1pbkhlaWdodD5xW0ddO3hbR109eFtHXXx8Qn0pfSk7cmV0dXJue2d1YXJhbnRlZWRXaWR0aHM6dywKZ3VhcmFudGVlZEhlaWdodHM6QSx3YW50c1dpZHRoQXJyOnksd2FudHNIZWlnaHRBcnI6eH19O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fY2FsY3VsYXRlZExheW91dD10aGlzLl9pdGVyYXRlTGF5b3V0KG4scSk7cmV0dXJue21pbldpZHRoOnIuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnIuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dmFyIHc9dGhpcztwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxuLHEsdSk7bj1yLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpO3E9ci5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyk7dT10aGlzLl9jYWxjdWxhdGVkTGF5b3V0O2lmKG4+dGhpcy53aWR0aCgpfHwKcT50aGlzLmhlaWdodCgpKXU9dGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSwhMCk7dmFyIEE9MCx5PWwuQXJyYXkuYWRkKHUucm93UHJvcG9ydGlvbmFsU3BhY2UsdS5ndWFyYW50ZWVkSGVpZ2h0cykseD1sLkFycmF5LmFkZCh1LmNvbFByb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZFdpZHRocyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7dmFyIEQ9MDtDLmZvckVhY2goZnVuY3Rpb24oQixIKXtudWxsIT1CJiZCLmNvbXB1dGVMYXlvdXQoe3g6RCx5OkF9LHhbSF0seVtHXSk7RCs9eFtIXSt3Ll9jb2x1bW5QYWRkaW5nfSk7QSs9eVtHXSt3Ll9yb3dQYWRkaW5nfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1BhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fcm93UGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpOwp0aGlzLl9yb3dQYWRkaW5nPW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihuKXx8MD5uKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1dlaWdodD1mdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX3Jvd1dlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9CmZ1bmN0aW9uKG4scSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1tuXTtpZighbC5NYXRoLmlzVmFsaWROdW1iZXIocSl8fDA+cSl0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uV2VpZ2h0c1tuXT1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXt2YXIgbj1yLnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gbS5fZml4ZWRTcGFjZShuLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBtLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW58fG4uZml4ZWRIZWlnaHQoKX0pfTttLnByb3RvdHlwZS5fcGFkVGFibGVUb1NpemU9ZnVuY3Rpb24obixxKXtmb3IodmFyIHU9CjA7dTxuO3UrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t1XSYmKHRoaXMuX3Jvd3NbdV09W10sdGhpcy5fcm93V2VpZ2h0c1t1XT1udWxsKTtmb3IodmFyIHc9MDt3PHE7dysrKXZvaWQgMD09PXRoaXMuX3Jvd3NbdV1bd10mJih0aGlzLl9yb3dzW3VdW3ddPW51bGwpfWZvcih3PTA7dzxxO3crKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW3ddJiYodGhpcy5fY29sdW1uV2VpZ2h0c1t3XT1udWxsKX07bS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuLm1hcChmdW5jdGlvbih3LEEpe3JldHVybiBudWxsIT13P3c6cVtBXS5tYXAodSkucmVkdWNlKGZ1bmN0aW9uKHkseCl7cmV0dXJuIHkmJnh9LCEwKT8wOjF9KX07bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlPWZ1bmN0aW9uKG4scSl7dmFyIHU9ci5zdW0obik7cmV0dXJuIDA9PT11P2wuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCxuLmxlbmd0aCk6bi5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHEqCncvdX0pfTttLl9maXhlZFNwYWNlPWZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh3KXtyZXR1cm4gdy5yZWR1Y2UoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQSYmeX0sITApfXJldHVybiB1KG4ubWFwKGZ1bmN0aW9uKHcpe3JldHVybiB1KHcubWFwKHEpKX0pKX07cmV0dXJuIG19KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5UYWJsZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3ZhciBwPXIuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ4LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTsKcmV0dXJuIHB9ayhsLHIpO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxtLG4pe3IucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7ci5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6cC50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDpwLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfTtsLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbihwKXtwJiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9O2wucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiByLnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKfTtsLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHIucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpO307cmV0dXJuIGx9KGgoMzIpLkRyYWdCb3hMYXllcik7Zi5YRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocixsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJihyW21dPWxbbV0pO3IucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbihyKXtmdW5jdGlvbiBsKCl7dmFyIHA9ci5jYWxsKHRoaXMpfHx0aGlzO3AuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKTtwLl9oYXNDb3JuZXJzPSExO3JldHVybiBwfWsobCxyKTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLG0sbil7ci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxtLG4pO3RoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihwKXtyLnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6cC50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnAuYm90dG9tUmlnaHQueX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gci5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiByLnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWURyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3ZhciBwPXIuY2FsbCh0aGlzKXx8dGhpcztwLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2wuX0tFWURPV05fRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXlkb3duKG0pfTsKcC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihtKXtyZXR1cm4gcC5fcHJvY2Vzc0tleXVwKG0pfTtyZXR1cm4gcH1rKGwscik7bC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnRbbC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXAmJihwPW5ldyBsLGRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXT1wKTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscC5rZXlDb2RlLHApfTtsLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLApwKX07bC5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSxwKX07bC5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwKX07cmV0dXJuIGx9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7ZC5fS0VZRE9XTl9FVkVOVF9OQU1FPSJrZXlkb3duIjtkLl9LRVlVUF9FVkVOVF9OQU1FPSJrZXl1cCI7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0scj1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXtmdW5jdGlvbiBuKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuX2xhc3RNb3VzZVBvc2l0aW9uPXt4Oi0xLHk6LTF9O3EuX3RyYW5zbGF0b3I9ci5nZXRUcmFuc2xhdG9yKG0pO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VPVkVSX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRV09bjtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1VUX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRURPV05fRVZFTlRfTkFNRV09CmZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX1dIRUVMX0VWRU5UX05BTUUpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX0RCTENMSUNLX0VWRU5UX05BTUUpfTtyZXR1cm4gcX1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCksCnE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VVUF9FVkVOVF9OQU1FLAptKX07cC5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25XaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZldoZWVsPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fV0hFRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25EYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZkRibENsaWNrPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fREJMQ0xJQ0tfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbihtLG4scSwKdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3UrIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJwYWdlIj09PXV8fHRoaXMuZXZlbnRJbnNpZGUobSxuKSl0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihuLmNsaWVudFgsbi5jbGllbnRZKSx0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQocSx0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksbil9O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHIuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3AucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9ufTtyZXR1cm4gcH0oaCgyNCkuRGlzcGF0Y2hlcik7ZC5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiOwpkLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtkLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjtkLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCI7ZC5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biI7ZC5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIjtkLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCI7ZC5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siO2YuTW91c2U9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSxyPWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8CnRoaXM7bi5fdHJhbnNsYXRvcj1yLmdldFRyYW5zbGF0b3IobSk7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0sCnEscC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gbn1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCkscT1uW3AuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1xJiYocT1uZXcgcChtKSxuW3AuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX07cC5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNITU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9uVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaEVuZD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciKwp1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigiZWxlbWVudCIhPT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpe209bi5jaGFuZ2VkVG91Y2hlczt1PXt9O2Zvcih2YXIgdz1bXSxBPTA7QTxtLmxlbmd0aDtBKyspe3ZhciB5PW1bQV0seD15LmlkZW50aWZpZXI7eT10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbih5LmNsaWVudFgseS5jbGllbnRZKTtudWxsIT15JiYodVt4XT15LHcucHVzaCh4KSl9MDx3Lmxlbmd0aCYmdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEsdyx1LG4pfX07cC5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxuKXtyZXR1cm4gci5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUobSxuKX07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIjtkLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiO2QuX1RPVUNITU9WRV9FVkVOVF9OQU1FPQoidG91Y2htb3ZlIjtkLl9UT1VDSEVORF9FVkVOVF9OQU1FPSJ0b3VjaGVuZCI7ZC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRT0idG91Y2hjYW5jZWwiO2YuVG91Y2g9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIsbCl7dm9pZCAwPT09bCYmKGw9d2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuc2NyZWVuV2lkdGg9azt0aGlzLnNjcmVlbkhlaWdodD1yO3RoaXMuZGV2aWNlUGl4ZWxSYXRpbz1sO3RoaXMucGl4ZWxXaWR0aD1rKmw7dGhpcy5waXhlbEhlaWdodD1yKmw7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtoLnNpemVQaXhlbHModGhpcy5jdHgsayxyLGwpfWguc2l6ZVBpeGVscz1mdW5jdGlvbihrLHIsbCxwKXt2YXIgbT1rLmNhbnZhczttLndpZHRoPXIqcDttLmhlaWdodD1sKnA7bS5zdHlsZS53aWR0aD1yKyJweCI7bS5zdHlsZS5oZWlnaHQ9CmwrInB4IjtrLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ay5zY2FsZShwLHApfTtoLnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKGsscixsKXt2b2lkIDA9PT1yJiYocj0wKTt2b2lkIDA9PT1sJiYobD0wKTtrLmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxyLGwsdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9O2gucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24oayxyLGwpe3ZvaWQgMD09PXImJihyPTApO3ZvaWQgMD09PWwmJihsPTApO3RoaXMuYmxpdChrLE1hdGguZmxvb3Ioci10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3IobC10aGlzLnNjcmVlbkhlaWdodC8yKSl9O2gucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihrLHIsbCl7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBwPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9cjt0aGlzLnBpeGVsV2lkdGg9aypwO3RoaXMucGl4ZWxIZWlnaHQ9cipwOwpoLnNpemVQaXhlbHModGhpcy5jdHgsayxyLHApO2wmJnRoaXMuY3R4LnRyYW5zbGF0ZShrLzIsay8yKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oayl7dmFyIHI9dGhpcy5waXhlbFdpZHRoLGw9dGhpcy5waXhlbEhlaWdodCxwPXRoaXMuY3R4O3Auc2F2ZSgpO3Auc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtudWxsPT1rP3AuY2xlYXJSZWN0KDAsMCxyLGwpOihwLmZpbGxTdHlsZT1rLHAuZmlsbFJlY3QoMCwwLHIsbCkpO3AucmVzdG9yZSgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9O3JldHVybiBofSgpO2YuQ2FudmFzQnVmZmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9jbGlja2VkRG93bj0hMTtuLl9kb3VibGVDbGlja2luZz0hMTtuLl9vbkNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bihxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAocSx1KX07bi5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVEYmxDbGljayhxLAp1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bih1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUsdyl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAodVtxWzBdXSx3KX07bi5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9jbGlja2VkRG93bj0hMX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXIuTW91c2UuZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKdGhpcy5fdG91Y2hEaXNwYXRjaGVyPXIuVG91Y2guZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMsdz10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2NsaWNrZWREb3duJiZtLl9wb2ludHNFcXVhbCh3LHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9kb3VibGVDbGlja2luZ3x8dS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHcsCnEpfSwwKTt0aGlzLl9jbGlja2VkRG93bj0hMX07bS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcztuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uobik7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITA7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4scSk7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1Ll9kb3VibGVDbGlja2luZz0hMX0sMCl9O20uX3BvaW50c0VxdWFsPWZ1bmN0aW9uKG4scSl7cmV0dXJuIG4ueD09PXEueCYmbi55PT09cS55fTttLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuQ2xpY2s9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fZHJhZ2dpbmc9ITE7bi5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMDtuLl9tb3VzZUZpbHRlcj1tLl9ERUZBVUxUX01PVVNFX0ZJTFRFUjsKbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9zdGFydERyYWcocSx1KX07bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RvRHJhZyhxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2VuZERyYWcocSx1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSx3KXtyZXR1cm4gbi5fc3RhcnREcmFnKHVbcVswXV0sdyl9O24uX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2RvRHJhZyh1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUsdyl7cmV0dXJuIG4uX2VuZERyYWcodVtxWzBdXSx3KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9CmZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1yLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9ci5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfTsKbS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbj0KZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3JldHVybiB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50P3t4OmwuTWF0aC5jbGFtcChuLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6bC5NYXRoLmNsYW1wKG4ueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTpufTttLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJiF0aGlzLl9tb3VzZUZpbHRlcihxKXx8KG49dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKSx0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHEucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl9kcmFnT3JpZ2luPW4sdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbikpKX07bS5wcm90b3R5cGUuX2RvRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnZ2luZyYmCnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSl9O20ucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJjAhPT1xLmJ1dHRvbnx8IXRoaXMuX2RyYWdnaW5nfHwodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKG4pKSl9O20ucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSExfTttLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbihuKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX21vdXNlRmlsdGVyPW4pfTttLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKG4pfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2QuX0RFRkFVTFRfTU9VU0VfRklMVEVSPWZ1bmN0aW9uKHApe3JldHVybiAwPT09cC5idXR0b259O2YuRHJhZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUsdyl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9CnV9Zm9yKHZhciB5IGluIHcpdy5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09d1t5XSk7dS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQS5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEEpfSxyPWgoMSksbD1oKDEzKSxwPWgoMyksbT1oKDApLG49aCgyNSk7ZD1oKDE1KTt2YXIgcT1oKDI2KTtoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoQSx5KXt2YXIgeD11LmNhbGwodGhpcyl8fHRoaXM7eC5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eC5fd2hlZWxDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB4Ll9oYW5kbGVXaGVlbEV2ZW50KEMsRyl9O3guX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB4Ll9oYW5kbGVUb3VjaFN0YXJ0KEMsRyl9O3guX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIHguX2hhbmRsZVBpbmNoKEMsRyl9O3guX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHguX2hhbmRsZVRvdWNoRW5kKEMpfTsKeC5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihDKXtyZXR1cm4geC5faGFuZGxlVG91Y2hFbmQoQyl9O3guX3BhbkVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt4Ll96b29tRW5kQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3guX3Bhblpvb21VcGRhdGVDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7eC5feFNjYWxlcz1uZXcgbS5TZXQ7eC5feVNjYWxlcz1uZXcgbS5TZXQ7eC5fZHJhZ0ludGVyYWN0aW9uPW5ldyBuLkRyYWc7eC5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKTt4Ll90b3VjaElkcz1yLm1hcCgpO3guX21pbkRvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3guX21heERvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3guX21pbkRvbWFpblZhbHVlcz1uZXcgbS5NYXA7eC5fbWF4RG9tYWluVmFsdWVzPW5ldyBtLk1hcDtudWxsIT1BJiZ4LmFkZFhTY2FsZShBKTtudWxsIT15JiZ4LmFkZFlTY2FsZSh5KTtyZXR1cm4geH1rKHcsdSk7dy5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3cucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKEEpezAhPT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fd2hlZWxGaWx0ZXI9QSl9O3cucHJvdG90eXBlLnBhbj1mdW5jdGlvbihBKXt2YXIgeT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih4LEEueCkpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LnBhbih5Ll9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHgsQS55KSl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX07dy5wcm90b3R5cGUuem9vbT1mdW5jdGlvbihBLHkseCl7dmFyIEM9dGhpczt2b2lkIDA9PT14JiYoeD0hMCk7aWYobnVsbCE9eSl7dmFyIEc9eS54O3ZhciBEPXkueTt4JiYodGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXtCPUMuX2NvbnN0cmFpbmVkWm9vbShCLApBLEcpO0c9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pLHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQixBLEQpO0Q9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pKX10aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBIPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1HPyhIWzFdK0hbMF0pLzI6Ryl9KTt0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBIPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1EPyhIWzFdK0hbMF0pLzI6RCl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTtyZXR1cm57em9vbUFtb3VudDpBLGNlbnRlclZhbHVlOntjZW50ZXJYOkcsY2VudGVyWTpEfX19O3cucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oQSl7dS5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKEEpOwp0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1sLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O3cucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3UucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07dy5wcm90b3R5cGUuX2hhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24oQSx5KXtmb3IodmFyIHg9MDt4PEEubGVuZ3RoJiYyPnRoaXMuX3RvdWNoSWRzLnNpemUoKTt4Kyspe3ZhciBDPUFbeF07dGhpcy5fdG91Y2hJZHMuc2V0KEMudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbQ10pKX19Owp3LnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24oQSx5KXt2YXIgeD10aGlzO2lmKCEoMj50aGlzLl90b3VjaElkcy5zaXplKCkpKXt2YXIgQz10aGlzLl90b3VjaElkcy52YWx1ZXMoKTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKENbMF0pKSYmdGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzFdKSkpe3ZhciBHPXcuX3BvaW50RGlzdGFuY2UoQ1swXSxDWzFdKTtpZigwIT09Ryl7QS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3guX3RvdWNoSWRzLmhhcyhMLnRvU3RyaW5nKCkpJiZ4Ll90b3VjaElkcy5zZXQoTC50b1N0cmluZygpLHguX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoeVtMXSkpfSk7QT10aGlzLl90b3VjaElkcy52YWx1ZXMoKTt2YXIgRD13Ll9wb2ludERpc3RhbmNlKEFbMF0sQVsxXSk7aWYoMCE9PUQpe3ZhciBCPUcvRCxIPUEubWFwKGZ1bmN0aW9uKEwsCkope3JldHVybnt4OihMLngtQ1tKXS54KS9CLHk6KEwueS1DW0pdLnkpL0J9fSk7Rz13LmNlbnRlclBvaW50KENbMF0sQ1sxXSk7Rz10aGlzLnpvb20oQixHKTtBPUcuY2VudGVyVmFsdWU7dmFyIEs9Ry56b29tQW1vdW50O0c9QS5jZW50ZXJYO0E9QS5jZW50ZXJZO0Q9Qy5tYXAoZnVuY3Rpb24oTCxKKXtyZXR1cm57eDpIW0pdLngqSytMLngseTpIW0pdLnkqSytMLnl9fSk7dGhpcy5wYW4oe3g6Ry0oRFswXS54K0RbMV0ueCkvMix5OkEtKERbMF0ueStEWzFdLnkpLzJ9KX19fX19O3cuY2VudGVyUG9pbnQ9ZnVuY3Rpb24oQSx5KXtyZXR1cm57eDooTWF0aC5taW4oQS54LHkueCkrTWF0aC5tYXgoQS54LHkueCkpLzIseTooTWF0aC5tYXgoQS55LHkueSkrTWF0aC5taW4oQS55LHkueSkpLzJ9fTt3Ll9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKEEseSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhNYXRoLm1heChBLngseS54KS1NYXRoLm1pbihBLngseS54KSwyKStNYXRoLnBvdyhNYXRoLm1heChBLnksCnkueSktTWF0aC5taW4oQS55LHkueSksMikpfTt3LnByb3RvdHlwZS5faGFuZGxlVG91Y2hFbmQ9ZnVuY3Rpb24oQSl7dmFyIHk9dGhpcztBLmZvckVhY2goZnVuY3Rpb24oeCl7eS5fdG91Y2hJZHMucmVtb3ZlKHgudG9TdHJpbmcoKSl9KTswPHRoaXMuX3RvdWNoSWRzLnNpemUoKSYmdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3cucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50PWZ1bmN0aW9uKEEseSl7dGhpcy5fd2hlZWxGaWx0ZXIoeSkmJihBPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQoQSkmJih5LnByZXZlbnREZWZhdWx0KCksdGhpcy56b29tKE1hdGgucG93KDIsKDAhPT15LmRlbHRhWT95LmRlbHRhWTp5LmRlbHRhWCkqKHkuZGVsdGFNb2RlP3cuX1BJWEVMU19QRVJfTElORToxKSouMDAyKSxBKSx0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSkpfTt3LnByb3RvdHlwZS5fY29uc3RyYWluZWRab29tPQpmdW5jdGlvbihBLHkseCl7cmV0dXJuIHEuY29uc3RyYWluZWRab29tKEEseSx4LHRoaXMubWluRG9tYWluRXh0ZW50KEEpLHRoaXMubWF4RG9tYWluRXh0ZW50KEEpLHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3cucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKEEseSl7cmV0dXJuIHEuY29uc3RyYWluZWRUcmFuc2xhdGlvbihBLHksdGhpcy5taW5Eb21haW5WYWx1ZShBKSx0aGlzLm1heERvbWFpblZhbHVlKEEpKX07dy5wcm90b3R5cGUuX3NldHVwRHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIEE9dGhpczt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uY29uc3RyYWluZWRUb0NvbXBvbmVudCgpO3ZhciB5O3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChmdW5jdGlvbigpe3JldHVybiB5PW51bGx9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKGZ1bmN0aW9uKHgsQyl7Mjw9QS5fdG91Y2hJZHMuc2l6ZSgpfHwKKEEucGFuKHt4OihudWxsPT15P3gueDp5LngpLUMueCx5OihudWxsPT15P3gueTp5LnkpLUMueX0pLHk9Qyl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uKCl7cmV0dXJuIEEuX3BhbkVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9KX07dy5wcm90b3R5cGUuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHM9ZnVuY3Rpb24oQSl7cmV0dXJuIG51bGwhPXRoaXMubWluRG9tYWluRXh0ZW50KEEpJiZudWxsIT10aGlzLm1heERvbWFpbkV4dGVudChBKSYmIShBIGluc3RhbmNlb2YgcC5MaW5lYXIpJiYhKEEgaW5zdGFuY2VvZiBwLlRpbWUpfTt3LnByb3RvdHlwZS54U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feFNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pO3JldHVybiBBfTt3LnByb3RvdHlwZS55U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feVNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pOwpyZXR1cm4gQX07dy5wcm90b3R5cGUuYWRkWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuYWRkKEEpfTt3LnByb3RvdHlwZS5yZW1vdmVYU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feFNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5hZGRZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5hZGQoQSl9O3cucHJvdG90eXBlLnJlbW92ZVlTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl95U2NhbGVzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoQSk7CnJldHVybiB0aGlzfTt3LnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZ2V0KEEpfTt3LnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21heERvbWFpbkV4dGVudHMuZ2V0KEEpfTt3LnByb3RvdHlwZS5taW5Eb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heERvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbz1mdW5jdGlvbihBKXt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpOwp0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3ZhciB5PUEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSx4PXlbMV07dGhpcy5taW5Eb21haW5WYWx1ZShBLHlbMF0pO3RoaXMubWF4RG9tYWluVmFsdWUoQSx4KTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuRW5kQ2FsbGJhY2tzLmFkZChBKX07dy5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmFkZChBKX07dy5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKEEpe3RoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKEEpOwpyZXR1cm4gdGhpc307dy5wcm90b3R5cGUub2ZmUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307cmV0dXJuIHd9KGQuSW50ZXJhY3Rpb24pO2guX1BJWEVMU19QRVJfTElORT0xMjA7Zi5QYW5ab29tPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0scj1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX292ZXJDb21wb25lbnQ9ITE7bi5fcG9pbnRlckVudGVyQ2FsbGJhY2tzPQpuZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyRXhpdENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVNb3VzZUV2ZW50KHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUsdyl7cmV0dXJuIG4uX2hhbmRsZVRvdWNoRXZlbnQodVtxWzBdXSx3KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXIuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1yLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX21vdXNlRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLHEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudD1mdW5jdGlvbihuLHEpe3E9dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sCnEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlUG9pbnRlckV2ZW50PWZ1bmN0aW9uKG4scSl7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3ZhciB1PXRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pO3UmJnE/KHRoaXMuX292ZXJDb21wb25lbnR8fHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpOnRoaXMuX292ZXJDb21wb25lbnQmJnRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mobik7dGhpcy5fb3ZlckNvbXBvbmVudD11JiZxfTttLnByb3RvdHlwZS5vblBvaW50ZXJFbnRlcj1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZShuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyTW92ZT1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRXhpdD1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5Qb2ludGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIwKTtmLm1lbVRodW5rPWZ1bmN0aW9uKCl7Zm9yKHZhciByPVtdLGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXJbbF09YXJndW1lbnRzW2xdO3ZhciBwPXIuc2xpY2UoMCwKLTEpLG09ay5tZW1vaXplKHJbci5sZW5ndGgtMV0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscT1wLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5hcHBseShuKX0pO3JldHVybiBtLmFwcGx5KHZvaWQgMCxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg0OSk7Zi5tZW1vaXplPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIHU9W10sdz0wO3c8YXJndW1lbnRzLmxlbmd0aDt3KyspdVt3XT1hcmd1bWVudHNbd107aWYobilyZXR1cm4gbTt3PWsuc2lnbkFycmF5KHUpO3ZvaWQgMD09PXB8fHAuaXNEaWZmZXJlbnQodyk/KHEmJmNvbnNvbGUubG9nKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxwPXcsbT1yLmFwcGx5KHRoaXMsdSkpOnEmJmNvbnNvbGUubG9nKCJjYWNoZSBoaXQhIik7cmV0dXJuIG19dmFyIHA9dm9pZCAwLG0sbj0hMSxxPSExO2wuZG9Mb2NrZWQ9ZnVuY3Rpb24odSl7aWYobil0aHJvdyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwpuPSEwO3U9dS5hcHBseSh0aGlzKTtuPSExO3JldHVybiB1fTtsLmxvZ1BlcmZvcm1hbmNlPWZ1bmN0aW9uKHUpe3ZvaWQgMD09PXUmJih1PSEwKTtxPXU7cmV0dXJuIHRoaXN9O3JldHVybiBsfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB3IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh3KSYmKG5bd109cVt3XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxyPWgoMyksbD1oKDApLHA9aCgyNyksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2b2lkIDA9PT11JiYodT0idmVydGljYWwiKTt1PW4uY2FsbCh0aGlzLHUpfHx0aGlzO3UuX2NsdXN0ZXJPZmZzZXRzPW5ldyBsLk1hcDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4geS5yYW5nZUJhbmQoKX12YXIgdz10aGlzLEE9bi5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykseT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO0Eud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OkEud2lkdGg7QS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9BLmhlaWdodDp1O3ZhciB4PUEueCxDPUEueTtBLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbihHLEQsQil7cmV0dXJuIHgoRyxELEIpK3cuX2NsdXN0ZXJPZmZzZXRzLmdldChCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiB4KEcsRCxCKX07QS55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKSt3Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9O3JldHVybiBBfTtxLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHU9CnRoaXMsdz10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7cmV0dXJuIHUuX2NsdXN0ZXJPZmZzZXRzLnNldChBLHcuc2NhbGUoU3RyaW5nKHkpKS13LnJhbmdlQmFuZCgpLzIpfSl9O3EucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB1PW5ldyByLkNhdGVnb3J5O3UuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oQSx5KXtyZXR1cm4gU3RyaW5nKHkpfSkpO3ZhciB3PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKHAuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3UucmFuZ2UoWzAsdyhudWxsLDAsbnVsbCldKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKTtyZXR1cm4gbi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX07cmV0dXJuIHF9KHAuQmFyKTtmLkNsdXN0ZXJlZEJhcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSxyPWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoOCksbj1oKDMpLHE9aCgwKSx1PWgoNDQpLHc9aCg0NSksQT1oKDYpLHk9aCgzNSkseD1oKDIpO2Q9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9zdGFydEFuZ2xlPTA7RC5fZW5kQW5nbGU9MipNYXRoLlBJO0QuX2xhYmVsRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtELl9sYWJlbHNFbmFibGVkPSExO0QuaW5uZXJSYWRpdXMoMCk7RC5vdXRlclJhZGl1cyhmdW5jdGlvbigpe3ZhciBCPUQuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChELndpZHRoKCktCkIueCxCLngpLE1hdGgubWF4KEQuaGVpZ2h0KCktQi55LEIueSkpfSk7RC5hZGRDbGFzcygicGllLXBsb3QiKTtELmF0dHIoImZpbGwiLGZ1bmN0aW9uKEIsSCl7cmV0dXJuIFN0cmluZyhIKX0sbmV3IG4uQ29sb3IpO0QuX3N0cm9rZURyYXdlcnM9bmV3IHEuTWFwO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO0MucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gQi5hdHRhY2hUbyhELl9yZW5kZXJBcmVhKX0pfTtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEQsQixIKXtDLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxELEIsSCk7RD10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QueCsiLCIrRC55KyIpIik7RD1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktCkQueCxELngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktRC55LEQueSkpO251bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLERdKTtudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBxLldpbmRvdy53YXJuKCJPbmx5IG9uZSBkYXRhc2V0IGlzIHN1cHBvcnRlZCBpbiBQaWUgcGxvdHMiKSx0aGlzO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3ZhciBCPW5ldyB3LkFyY091dGxpbmVTVkdEcmF3ZXI7dGhpcy5faXNTZXR1cCYmQi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKdGhpcy5fc3Ryb2tlRHJhd2Vycy5zZXQoRCxCKTtDLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsRCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsRCk7dGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoRCkucmVtb3ZlKCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxEKTt0aGlzLl9zdGFydEFuZ2xlcz1bXTt0aGlzLl9lbmRBbmdsZXM9W107cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt2b2lkIDA9PT1EJiYoRD10aGlzLmRhdGFzZXRzKCkpO3ZhciBIPUMucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLApEKS5ub2RlcygpO0QuZm9yRWFjaChmdW5jdGlvbihLKXtLPUIuX3N0cm9rZURyYXdlcnMuZ2V0KEspO251bGwhPUsmJkgucHVzaC5hcHBseShILEsuZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiByLnNlbGVjdEFsbChIKX07Ry5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe0MucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkFyY1NWR0RyYXdlcn0sZnVuY3Rpb24oKXt5Lndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBpZSBQbG90ISIpO3JldHVybiBudWxsfSl9O0cucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTsKcmV0dXJuIEMucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxEKS5tYXAoZnVuY3Rpb24oSCl7SC5wb3NpdGlvbi54Kz1CLndpZHRoKCkvMjtILnBvc2l0aW9uLnkrPUIuaGVpZ2h0KCkvMjt2YXIgSz1yLnNlbGVjdChCLl9zdHJva2VEcmF3ZXJzLmdldChILmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoSC5pbmRleCkpO0guc3Ryb2tlU2VsZWN0aW9uPUs7cmV0dXJuIEh9KX07Ry5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fU0VDVE9SX1ZBTFVFX0tFWSl9O0cucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fSU5ORVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEcuX0lOTkVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5vdXRlclJhZGl1cz0KZnVuY3Rpb24oRCxCKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChHLl9PVVRFUl9SQURJVVNfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoRy5fT1VURVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTt0aGlzLl9zdGFydEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fZW5kQW5nbGU7dGhpcy5fZW5kQW5nbGU9RDt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7CnRoaXMuX2xhYmVsc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcy53aWR0aCgpLzIsSD10aGlzLmhlaWdodCgpLzI7RD10aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoe3g6RC54LUIseTpELnktSH0pO3JldHVybiBudWxsPT1EP1tdOlt0aGlzLmVudGl0aWVzKClbRF1dfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxIPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxLPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTsKQi5kPWZ1bmN0aW9uKEwsSixPKXtyZXR1cm4gci5hcmMoKS5pbm5lclJhZGl1cyhIKEwsSixPKSkub3V0ZXJSYWRpdXMoSyhMLEosTykpLnN0YXJ0QW5nbGUoRC5fc3RhcnRBbmdsZXNbSl0pLmVuZEFuZ2xlKEQuX2VuZEFuZ2xlc1tKXSkoTCxKKX07cmV0dXJuIEJ9O0cucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgRD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksQj10aGlzLmRhdGFzZXRzKClbMF0sSD10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KEIpO0g9ci5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUodGhpcy5fc3RhcnRBbmdsZSkuZW5kQW5nbGUodGhpcy5fZW5kQW5nbGUpLnZhbHVlKGZ1bmN0aW9uKEssTCl7cmV0dXJuIEQoSyxMLEIpfSkoSCk7dGhpcy5fc3RhcnRBbmdsZXM9SC5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEsuc3RhcnRBbmdsZX0pOwp0aGlzLl9lbmRBbmdsZXM9SC5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEsuZW5kQW5nbGV9KX19O0cucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsQj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsSD1NYXRoLnNpbihEKTtEPU1hdGguY29zKEQpO3ZhciBLPU1hdGguc2luKEIpO0I9TWF0aC5jb3MoQik7dmFyIEw7aWYoMDw9SCYmMDw9SylpZigwPD1EJiYwPD1CKXt2YXIgSj1EO3ZhciBPPUw9MDt2YXIgUz1LfWVsc2UgMD5EJiYwPkI/KEo9MCxMPS1CLE89MCxTPUgpOjA8PUQmJjA+Qj8oSj1ELEw9LUIsTz0wLFM9SCk6MD5EJiYwPD1CJiYoTz1MPUo9MSxTPU1hdGgubWF4KEgsSykpO2Vsc2UgMDw9SCYmMD5LPzA8PUQmJjA8PUI/KEo9TWF0aC5tYXgoRCxCKSxTPU89TD0xKTowPkQmJgowPkI/KEo9MCxMPTEsTz0tSyxTPUgpOjA8PUQmJjA+Qj8oSj1ELEw9MSxPPS1LLFM9MSk6MD5EJiYwPD1CJiYoSj1CLE89TD0xLFM9SCk6MD5IJiYwPD1LPzA8PUQmJjA8PUI/KEo9MSxMPTAsTz0tSCxTPUspOjA+RCYmMD5CPyhKPTEsTD1NYXRoLm1heCgtRCwtQiksUz1PPTEpOjA8PUQmJjA+Qj8oSj0xLEw9LUIsTz0tSCxTPTEpOjA+RCYmMDw9QiYmKEo9MSxMPS1ELE89MSxTPUspOjA+SCYmMD5LJiYoMDw9RCYmMDw9Qj8oSj1CLEw9MCxPPS1ILFM9MCk6MD5EJiYwPkI/KEo9MCxMPS1ELE89LUssUz0wKTowPD1EJiYwPkI/KEw9Sj0xLE89TWF0aC5tYXgoRCwtQiksUz0xKTowPkQmJjA8PUImJihKPUIsTD0tRCxPPTEsUz0wKSk7cmV0dXJue3g6MD09TytTPzA6Ty8oTytTKSp0aGlzLndpZHRoKCkseTowPT1KK0w/MDpKLyhKK0wpKnRoaXMuaGVpZ2h0KCl9fTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CmlmKDA9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBEO3ZhciBCPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxIPXRoaXMuZGF0YXNldHMoKVswXSxLPUQuZ2V0KEgpLmZpbHRlcihmdW5jdGlvbihMLEope3JldHVybiBHLl9pc1ZhbGlkRGF0YShCKEwsSixIKSl9KTtELnNldChILEspO3JldHVybiBEfTtHLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbihEKXtyZXR1cm4gcS5NYXRoLmlzVmFsaWROdW1iZXIoRCkmJjA8PUR9O0cucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEQsQixIKXt2YXIgSz14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIUcuX2lzVmFsaWREYXRhKEsoRCxCLEgpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBMPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShELEIsSCk7RD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoRCwKQixIKTtMPShMK0QpLzI7RD1yLnBpZSgpLnNvcnQobnVsbCkudmFsdWUoZnVuY3Rpb24oSixPKXtKPUsoSixPLEgpO3JldHVybiBHLl9pc1ZhbGlkRGF0YShKKT9KOjB9KS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShILmRhdGEoKSk7Qj0oRFtCXS5zdGFydEFuZ2xlK0RbQl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6TCpNYXRoLnNpbihCKSx5Oi1MKk1hdGguY29zKEIpfX07Ry5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpO3RoaXMuX2xhYmVsc0VuYWJsZWQmJnEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZHJhd0xhYmVscygpfSxEKTt2YXIgSD10aGlzLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcygpLEs9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3ZhciBKPQp4LlBsb3QuYXBwbHlEcmF3U3RlcHMoSCxMKTtCLl9zdHJva2VEcmF3ZXJzLmdldChMKS5kcmF3KEsuZ2V0KEwpLEopfSl9O0cucHJvdG90eXBlLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBwLk51bGx9XX07Ry5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbihEKXt2YXIgQj1NYXRoLnNxcnQoTWF0aC5wb3coRC54LDIpK01hdGgucG93KEQueSwyKSksSD1NYXRoLmFjb3MoLUQueS9CKTswPkQueCYmKEg9MipNYXRoLlBJLUgpO2ZvcihEPTA7RDx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7RCsrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW0RdPEgmJnRoaXMuX2VuZEFuZ2xlc1tEXT5IKXt2YXIgSz1EO2JyZWFrfWlmKHZvaWQgMCE9PUspe0Q9dGhpcy5kYXRhc2V0cygpWzBdO3ZhciBMPUQuZGF0YSgpW0tdO0g9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKEwsCkssRCk7RD10aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTCxLLEQpO2lmKEI+SCYmQjxEKXJldHVybiBLfXJldHVybiBudWxsfTtHLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxIPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLEs9bmV3IGwuU3ZnQ29udGV4dChILm5vZGUoKSksTD1uZXcgbC5DYWNoZU1lYXN1cmVyKEspLEo9bmV3IGwuV3JpdGVyKEwsSyksTz10aGlzLmRhdGFzZXRzKClbMF07dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChPKS5mb3JFYWNoKGZ1bmN0aW9uKFMsTil7dmFyIFI9RC5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKFMsTixPKTtpZihxLk1hdGguaXNWYWxpZE51bWJlcihSKSl7Uj1ELl9sYWJlbEZvcm1hdHRlcihSLFMsTixPKTt2YXIgWD1MLm1lYXN1cmUoUiksYWE9KEQuX2VuZEFuZ2xlc1tOXStELl9zdGFydEFuZ2xlc1tOXSkvCjIsZmE9RC5vdXRlclJhZGl1cygpLmFjY2Vzc29yKFMsTixPKTtELm91dGVyUmFkaXVzKCkuc2NhbGUmJihmYT1ELm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoZmEpKTt2YXIgb2E9RC5pbm5lclJhZGl1cygpLmFjY2Vzc29yKFMsTixPKTtELmlubmVyUmFkaXVzKCkuc2NhbGUmJihvYT1ELmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUob2EpKTtvYT0oZmErb2EpLzI7ZmE9TWF0aC5zaW4oYWEpKm9hLVgud2lkdGgvMjtvYT0tTWF0aC5jb3MoYWEpKm9hLVguaGVpZ2h0LzI7dmFyIFo9W3t4OmZhLHk6b2F9LHt4OmZhLHk6b2ErWC5oZWlnaHR9LHt4OmZhK1gud2lkdGgseTpvYX0se3g6ZmErWC53aWR0aCx5Om9hK1guaGVpZ2h0fV07KGFhPVouZXZlcnkoZnVuY3Rpb24oY2Epe3JldHVybiBNYXRoLmFicyhjYS54KTw9RC53aWR0aCgpLzImJk1hdGguYWJzKGNhLnkpPD1ELmhlaWdodCgpLzJ9KSkmJihhYT1aLm1hcChmdW5jdGlvbihjYSl7cmV0dXJuIEQuX3NsaWNlSW5kZXhGb3JQb2ludChjYSl9KS5ldmVyeShmdW5jdGlvbihjYSl7cmV0dXJuIGNhPT09Ck59KSk7Uz1CLmZpbGwoUyxOLE8pO1M9MS42KnEuQ29sb3IuY29udHJhc3QoIndoaXRlIixTKTxxLkNvbG9yLmNvbnRyYXN0KCJibGFjayIsUyk7ZmE9SC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitmYSsiLCIrb2ErIikiKTtmYS5jbGFzc2VkKFM/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApO2ZhLnN0eWxlKCJ2aXNpYmlsaXR5IixhYT8iaW5oZXJpdCI6ImhpZGRlbiIpO0oud3JpdGUoUixYLndpZHRoLFguaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxmYS5ub2RlKCkpfX0pfTtyZXR1cm4gR30oeC5QbG90KTtkLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2QuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7ZC5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIjtmLlBpZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHkseCl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9Cnl9Zm9yKHZhciBHIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109eFtHXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSxyPWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoMTQpLG49aCg2KSxxPWgoMzQpLHU9aCgzKSx3PWgoMCksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IHAuTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdS5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9ayh4LHkpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlU1ZHRHJhd2VyfSxmdW5jdGlvbihDKXtyZXR1cm4gbmV3IG0uUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEMpfSl9Owp4LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUdbeC5fWDJfS0VZXSxIPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9R1t4Ll9ZMl9LRVldLEw9dGhpcy54KCkuc2NhbGUsSj10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhHLndpZHRoPWZ1bmN0aW9uKE8sUyxOKXtyZXR1cm4gTWF0aC5hYnMoQihPLFMsTiktRChPLFMsTikpfSxHLng9ZnVuY3Rpb24oTyxTLE4pe3JldHVybiBNYXRoLm1pbihCKE8sUyxOKSxEKE8sUyxOKSl9KTooRy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBDLl9yZWN0YW5nbGVXaWR0aChMKX0sRy54PWZ1bmN0aW9uKE8sUyxOKXtyZXR1cm4gRChPLFMsTiktLjUqRy53aWR0aChPLFMsTil9KTtudWxsIT1LPyhHLmhlaWdodD1mdW5jdGlvbihPLApTLE4pe3JldHVybiBNYXRoLmFicyhLKE8sUyxOKS1IKE8sUyxOKSl9LEcueT1mdW5jdGlvbihPLFMsTil7cmV0dXJuIE1hdGgubWF4KEsoTyxTLE4pLEgoTyxTLE4pKS1HLmhlaWdodChPLFMsTil9KTooRy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSil9LEcueT1mdW5jdGlvbihPLFMsTil7cmV0dXJuIEgoTyxTLE4pLS41KkcuaGVpZ2h0KE8sUyxOKX0pO2RlbGV0ZSBHW3guX1gyX0tFWV07ZGVsZXRlIEdbeC5fWTJfS0VZXTtyZXR1cm4gR307eC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKX1dfTt4LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQyl7cmV0dXJuIngyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywKIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07eC5wcm90b3R5cGUueD1mdW5jdGlvbihDLEcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHguX1gyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS54Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9YMl9LRVkpfTt4LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsCkcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueTIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHguX1kyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS55Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9ZMl9LRVkpfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sSD1ELmluZGV4LEs9RC5kYXRhc2V0O0Q9Ry54KEIsCkgsSyk7dmFyIEw9Ry55KEIsSCxLKSxKPUcud2lkdGgoQixILEspO0I9Ry5oZWlnaHQoQixILEspO3JldHVybiBEPD1DLngmJkMueDw9RCtKJiZMPD1DLnkmJkMueTw9TCtCfSl9O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3gucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRyxELEIpe3JldHVybnt4OkIueChDLEcsRCkseTpCLnkoQyxHLEQpLHdpZHRoOkIud2lkdGgoQyxHLEQpLGhlaWdodDpCLmhlaWdodChDLEcsRCl9fTt4LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKdGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEg9Qi54KEMsRyxEKSxLPUIueShDLEcsRCksTD1CLndpZHRoKEMsRyxEKTtDPUIuaGVpZ2h0KEMsRyxEKTtyZXR1cm57eDpIK0wvMix5OksrQy8yfX07eC5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB1LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpOwp2YXIgRz1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD1yLnNldCh3LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSy5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEcoTCxKLEspLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuK0t9KSxCPXcuTWF0aC5taW4oRCwwKTtEPXcuTWF0aC5tYXgoRCwwKTt2YXIgSD1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUgpL01hdGguYWJzKEQtQil9O3gucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHcuTWFwLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEgsSyl7cmV0dXJuIHcuTWF0aC5pc1ZhbGlkTnVtYmVyKEcueChILEssRCkpJiYKdy5NYXRoLmlzVmFsaWROdW1iZXIoRy55KEgsSyxEKSkmJncuTWF0aC5pc1ZhbGlkTnVtYmVyKEcud2lkdGgoSCxLLEQpKSYmdy5NYXRoLmlzVmFsaWROdW1iZXIoRy5oZWlnaHQoSCxLLEQpKT9IOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJncuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRy5fZHJhd0xhYmVscygpfSxDKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChHLEQsQil9KX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbD0KZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMsSD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxLPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLEw9bmV3IGwuU3ZnQ29udGV4dChLLm5vZGUoKSksSj1uZXcgbC5DYWNoZU1lYXN1cmVyKEwpLE89bmV3IGwuV3JpdGVyKEosTCk7TD10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBTPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTj1NYXRoLm1pbi5hcHBseShudWxsLEwpLFI9TWF0aC5tYXguYXBwbHkobnVsbCxMKSxYPU1hdGgubWluLmFwcGx5KG51bGwsUyksYWE9TWF0aC5tYXguYXBwbHkobnVsbCxTKTtDLmdldChHKS5mb3JFYWNoKGZ1bmN0aW9uKGZhLG9hKXtpZihudWxsIT1mYSl7dmFyIFo9IiIrQi5sYWJlbCgpKGZhLG9hLEcpLGNhPUoubWVhc3VyZShaKSxqYT1ILngoZmEsb2EsRyksYmE9SC55KGZhLG9hLEcpLGthPUgud2lkdGgoZmEsb2EsRyksVz1ILmhlaWdodChmYSxvYSxHKTsKY2EuaGVpZ2h0PD1XJiZjYS53aWR0aDw9a2EmJihXPShXLWNhLmhlaWdodCkvMixqYSs9KGthLWNhLndpZHRoKS8yLGJhKz1XLGthPXttaW46amEsbWF4OmphK2NhLndpZHRofSxXPXttaW46YmEsbWF4OmJhK2NhLmhlaWdodH0sa2EubWluPE58fGthLm1heD5SfHxXLm1pbjxYfHxXLm1heD5hYXx8Qi5fb3ZlcmxheUxhYmVsKGthLFcsb2EsRCxDKXx8KGZhPUguZmlsbChmYSxvYSxHKSxmYT0xLjYqdy5Db2xvci5jb250cmFzdCgid2hpdGUiLGZhKTx3LkNvbG9yLmNvbnRyYXN0KCJibGFjayIsZmEpLGphPUsuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIramErIiwiK2JhKyIpIiksamEuY2xhc3NlZChmYT8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCksTy53cml0ZShaLGNhLndpZHRoLGNhLmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0samEubm9kZSgpKSkpfX0pfTt4LnByb3RvdHlwZS5fb3ZlcmxheUxhYmVsPWZ1bmN0aW9uKEMsCkcsRCxCLEgpe2Zvcih2YXIgSz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxMPXRoaXMuZGF0YXNldHMoKSxKPUI7SjxMLmxlbmd0aDtKKyspZm9yKHZhciBPPUxbSl0sUz1ILmdldChPKSxOPUo9PT1CP0QrMTowO048Uy5sZW5ndGg7TisrKWlmKHcuRE9NLmludGVyc2VjdHNCQm94KEMsRyx0aGlzLl9lbnRpdHlCQm94KFNbTl0sTixPLEspKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIHh9KGgoMTYpLlhZUGxvdCk7ZC5fWDJfS0VZPSJ4MiI7ZC5fWTJfS0VZPSJ5MiI7Zi5SZWN0YW5nbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXl9Zm9yKHZhciBHIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109eFtHXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSxyPWgoMzEpLApsPWgoNikscD1oKDQ4KSxtPWgoNyksbj1oKDE0KSxxPWgoMyksdT1oKDApLHc9aCgxOSksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJzY2F0dGVyLXBsb3QiKTt2YXIgRz1uZXcgbS5FYXNpbmc7Ry5zdGFydERlbGF5KDUpO0cuc3RlcER1cmF0aW9uKDI1MCk7Ry5tYXhUb3RhbER1cmF0aW9uKEEuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qy5hbmltYXRvcih3LkFuaW1hdG9yLk1BSU4sRyk7Qy5hdHRyKCJvcGFjaXR5IiwuNik7Qy5hdHRyKCJmaWxsIiwobmV3IHEuQ29sb3IpLnJhbmdlKClbMF0pO0Muc2l6ZSg2KTt2YXIgRD1yLmNpcmNsZSgpO0Muc3ltYm9sKGZ1bmN0aW9uKCl7cmV0dXJuIER9KTtyZXR1cm4gQ31rKHgseSk7eC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpcztyZXR1cm4geS5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMuY2FsbCh0aGlzLApDKS5tYXAoZnVuY3Rpb24oRCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnNpemUoKSkoRC5kYXR1bSxELmluZGV4LEQuZGF0YXNldCk7RC5kaWFtZXRlcj1CO3JldHVybiBEfSl9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpcztyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU3ltYm9sU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG4uQ2FudmFzRHJhd2VyKEQscC5tYWtlU3ltYm9sQ2FudmFzRHJhd1N0ZXAoQyxmdW5jdGlvbigpe3JldHVybiBBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcuc3ltYm9sKCkpfSxmdW5jdGlvbigpe3JldHVybiBBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcuc2l6ZSgpKX0pKX0pfTt4LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKEMsRyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fU0laRV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9TSVpFX0tFWSwKQyxHKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fU1lNQk9MX0tFWSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5zZXQoeC5fU1lNQk9MX0tFWSx7YWNjZXNzb3I6Q30pO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc3ltYm9sKCkpO0cuZD1mdW5jdGlvbihCLEgsSyl7cmV0dXJuIEQoQixILEspKDApKG51bGwpfTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHcuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7Qy54PUc7Qy55PUQ7Qy50cmFuc2Zvcm09ZnVuY3Rpb24oQixILEspe3JldHVybiJ0cmFuc2xhdGUoIitHKEIsSCxLKSsiLCIrRChCLEgsSykrIikifTtDLmQ9dGhpcy5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yKCk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3I9ZnVuY3Rpb24oKXt2YXIgQz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc3ltYm9sKCkpLEc9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNpemUoKSk7cmV0dXJuIGZ1bmN0aW9uKEQsQiwKSCl7cmV0dXJuIEMoRCxCLEgpKEcoRCxCLEgpKShudWxsKX19O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJue3g6Qy5wb3NpdGlvbi54LUMuZGlhbWV0ZXIvMix5OkMucG9zaXRpb24ueS1DLmRpYW1ldGVyLzIsd2lkdGg6Qy5kaWFtZXRlcixoZWlnaHQ6Qy5kaWFtZXRlcn19O3gucHJvdG90eXBlLl9lbnRpdHlWaXNpYmxlT25QbG90PWZ1bmN0aW9uKEMsRyl7dmFyIEQ9e21pbjpHLnRvcExlZnQueCxtYXg6Ry5ib3R0b21SaWdodC54fTtHPXttaW46Ry50b3BMZWZ0LnksbWF4OkcuYm90dG9tUmlnaHQueX07Qz10aGlzLl9lbnRpdHlCb3VuZHMoQyk7cmV0dXJuIHUuRE9NLmludGVyc2VjdHNCQm94KEQsRyxDKX07eC5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihDKXt2YXIgRz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNpemUoKSk7CnJldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEgpe3ZhciBLPUguZGF0dW0sTD1ILmluZGV4LEo9SC5kYXRhc2V0O0g9RyhLLEwsSik7dmFyIE89RChLLEwsSik7Sz1CKEssTCxKKTtyZXR1cm4gSC1LLzI8PUMueCYmQy54PD1IK0svMiYmTy1LLzI8PUMueSYmQy55PD1PK0svMn0pfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTtkLl9TSVpFX0tFWT0ic2l6ZSI7ZC5fU1lNQk9MX0tFWT0ic3ltYm9sIjtmLlNjYXR0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih1LHcpe2Z1bmN0aW9uIEEoKXt0aGlzLmNvbnN0cnVjdG9yPXV9Zm9yKHZhciB5IGluIHcpdy5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09d1t5XSk7dS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQS5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEEpfSxyPWgoNyksbD1oKDYpLHA9aCg0NyksbT1oKDMpLG49aCgzNSkscT1oKDIpOwpkPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoKXt2YXIgQT11LmNhbGwodGhpcyl8fHRoaXM7QS5hZGRDbGFzcygic2VnbWVudC1wbG90Iik7QS5hdHRyKCJzdHJva2UiLChuZXcgbS5Db2xvcikucmFuZ2UoKVswXSk7QS5hdHRyKCJzdHJva2Utd2lkdGgiLCIycHgiKTtyZXR1cm4gQX1rKHcsdSk7dy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbC5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgcC5TZWdtZW50U1ZHRHJhd2VyfSxmdW5jdGlvbigpe24ud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gU2VnbWVudCBQbG90ISIpO3JldHVybiBudWxsfSl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyByLk51bGx9XX07dy5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PQpmdW5jdGlvbihBKXtyZXR1cm4ieDIiPT09QT91LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ4Iik6InkyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieSIpOnUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsQSl9O3cucHJvdG90eXBlLng9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT1BKXJldHVybiB1LnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09eT91LnByb3RvdHlwZS54LmNhbGwodGhpcyxBKToodS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSx5KSxBPShBPXRoaXMueDIoKSkmJkEuYWNjZXNzb3IsbnVsbCE9QSYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1gyX0tFWSxBLHkpKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUueDI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQody5fWDJfS0VZKX07dy5wcm90b3R5cGUueT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PQpBKXJldHVybiB1LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09eT91LnByb3RvdHlwZS55LmNhbGwodGhpcyxBKToodS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSx5KSxBPShBPXRoaXMueTIoKSkmJkEuYWNjZXNzb3IsbnVsbCE9QSYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1kyX0tFWSxBLHkpKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUueTI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQody5fWTJfS0VZKX07dy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBBPXUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtBLngxPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpO0EueDI9bnVsbD09dGhpcy54MigpP3EuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpOnEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54MigpKTtBLnkxPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwpBLnkyPW51bGw9PXRoaXMueTIoKT9xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSk7cmV0dXJuIEF9O3cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQSl7QT10aGlzLmVudGl0eU5lYXJlc3QoQSk7cmV0dXJuIG51bGwhPUE/W0FdOltdfTt3LnByb3RvdHlwZS5lbnRpdGllc0luPWZ1bmN0aW9uKEEseSl7aWYobnVsbD09eSl7dmFyIHg9e21pbjpBLnRvcExlZnQueCxtYXg6QS5ib3R0b21SaWdodC54fTtBPXttaW46QS50b3BMZWZ0LnksbWF4OkEuYm90dG9tUmlnaHQueX19ZWxzZSB4PUEsQT15O3JldHVybiB0aGlzLl9lbnRpdGllc0ludGVyc2VjdGluZyh4LEEpfTt3LnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24oQSx5KXt2YXIgeD10aGlzLEM9W10sRz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihEKXt4Ll9saW5lSW50ZXJzZWN0c0JveChELApBLHksRykmJkMucHVzaChEKX0pO3JldHVybiBDfTt3LnByb3RvdHlwZS5fbGluZUludGVyc2VjdHNCb3g9ZnVuY3Rpb24oQSx5LHgsQyl7dmFyIEc9dGhpcyxEPUMueDEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCksQj1DLngyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEg9Qy55MShBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KTtBPUMueTIoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7aWYoeS5taW48PUQmJkQ8PXkubWF4JiZ4Lm1pbjw9SCYmSDw9eC5tYXh8fHkubWluPD1CJiZCPD15Lm1heCYmeC5taW48PUEmJkE8PXgubWF4KXJldHVybiEwO3ZhciBLPXt4OkQseTpIfSxMPXt4OkIseTpBfSxKPVt7eDp5Lm1pbix5OngubWlufSx7eDp5Lm1pbix5OngubWF4fSx7eDp5Lm1heCx5OngubWF4fSx7eDp5Lm1heCx5OngubWlufV07cmV0dXJuIDA8Si5maWx0ZXIoZnVuY3Rpb24oTyxTKXtyZXR1cm4gMCE9PVM/Ry5fbGluZUludGVyc2VjdHNTZWdtZW50KEssTCxPLEpbUy0KMV0pJiZHLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQoTyxKW1MtMV0sSyxMKTohMX0pLmxlbmd0aH07dy5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbihBLHkseCxDKXtmdW5jdGlvbiBHKEQsQixIKXtyZXR1cm4oQi54LUQueCkqKEgueS1CLnkpLShCLnktRC55KSooSC54LUIueCl9cmV0dXJuIDA+RyhBLHkseCkqRyhBLHksQyl9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuU2VnbWVudD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24gdygpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYocVtBXT11W0FdKTtxLnByb3RvdHlwZT1udWxsPT09dT9PYmplY3QuY3JlYXRlKHUpOih3LnByb3RvdHlwZT11LnByb3RvdHlwZSxuZXcgdyl9LHI9aCgxKSxsPWgoNykscD1oKDIwKSxtPQpoKDApO2Q9aCg1MCk7dmFyIG49aCgyKTtoPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoKXt2YXIgdz1xLmNhbGwodGhpcyl8fHRoaXM7dy5fc3RhY2tpbmdSZXN1bHQ9cC5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiB3LmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHcueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB3LnkoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4gdy5fc3RhY2tpbmdPcmRlcn0sZnVuY3Rpb24oQSx5LHgsQyl7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2soQSx5LHgsQyl9KTt3Ll9zdGFja2VkRXh0ZW50PXAubWVtVGh1bmsody5fc3RhY2tpbmdSZXN1bHQsZnVuY3Rpb24oKXtyZXR1cm4gdy54KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHcuX2ZpbHRlckZvclByb3BlcnR5KCJ5Iil9LGZ1bmN0aW9uKEEseSx4KXtyZXR1cm4gbS5TdGFja2luZy5zdGFja2VkRXh0ZW50KEEseSx4KX0pO3cuX2Jhc2VsaW5lVmFsdWU9MDt3Ll9zdGFja2luZ09yZGVyPQoiYm90dG9tdXAiO3cuYWRkQ2xhc3MoInN0YWNrZWQtYXJlYS1wbG90Iik7dy5hdHRyKCJmaWxsLW9wYWNpdHkiLDEpO3cuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVyblt3Ll9iYXNlbGluZVZhbHVlXX07dy5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCghMSk7cmV0dXJuIHd9ayh1LHEpO3UucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKHcpe3JldHVybiBudWxsPT13P3EucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcyk6dz8obS5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTpxLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsdyl9O3UucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbC5OdWxsfTt1LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTt1LnByb3RvdHlwZS54PWZ1bmN0aW9uKHcsQSl7aWYobnVsbD09dylyZXR1cm4gcS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUE/cS5wcm90b3R5cGUueC5jYWxsKHRoaXMsdyk6cS5wcm90b3R5cGUueC5jYWxsKHRoaXMsdyxBKTt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUueT1mdW5jdGlvbih3LEEpe2lmKG51bGw9PXcpcmV0dXJuIHEucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnkuY2FsbCh0aGlzLHcpOnEucHJvdG90eXBlLnkuY2FsbCh0aGlzLHcsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odyl7aWYobnVsbD09dylyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPQp3O3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHEucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKX07dS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbigpe3ZhciB3PXRoaXMueSgpLnNjYWxlLnNjYWxlKHRoaXMuX2Jhc2VsaW5lVmFsdWUpO3c9e3gxOjAseTE6dyx4Mjp0aGlzLndpZHRoKCkseTI6d307dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSx3KX07dS5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciB3PXRoaXMueSgpO3c9dyYmdy5zY2FsZTtudWxsIT13JiYody5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdy5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfTsKdS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3EucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHcpe3JldHVybiJ5Ij09PXc/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06cS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyx3KX07dS5wcm90b3R5cGUuX2NoZWNrU2FtZURvbWFpbj1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdz10aGlzLmRhdGFzZXRzKCksQT10aGlzLngoKS5hY2Nlc3Nvcix5PXcubWFwKGZ1bmN0aW9uKEMpe3JldHVybiByLnNldChDLmRhdGEoKS5tYXAoZnVuY3Rpb24oRyxEKXtyZXR1cm4gQShHLEQsQykudG9TdHJpbmcoKX0pKS52YWx1ZXMoKX0pLHg9dS5fZG9tYWluS2V5cyh3LEEpO3kuc29tZShmdW5jdGlvbihDKXtyZXR1cm4gQy5sZW5ndGghPT0KeC5sZW5ndGh9KSYmbS5XaW5kb3cud2FybigidGhlIGRvbWFpbnMgYWNyb3NzIHRoZSBkYXRhc2V0cyBhcmUgbm90IHRoZSBzYW1lLiBQbG90IG1heSBwcm9kdWNlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIil9fTt1Ll9kb21haW5LZXlzPWZ1bmN0aW9uKHcsQSl7dmFyIHk9ci5zZXQoKTt3LmZvckVhY2goZnVuY3Rpb24oeCl7eC5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihDLEcpe3kuYWRkKEEoQyxHLHgpKX0pfSk7cmV0dXJuIHkudmFsdWVzKCl9O3UucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB3KEQsQixIKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoQyhELEIsSCkpfXZhciBBPXRoaXMseT1xLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcykseD10aGlzLnkoKS5hY2Nlc3NvcixDPXRoaXMueCgpLmFjY2Vzc29yLEc9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTt5LmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihuLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwKZnVuY3Rpb24oRCxCLEgpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZSgreChELEIsSCkrRy5nZXQoSCkuZ2V0KHcoRCxCLEgpKS5vZmZzZXQpfSxmdW5jdGlvbihELEIsSCl7cmV0dXJuIEEueSgpLnNjYWxlLnNjYWxlKEcuZ2V0KEgpLmdldCh3KEQsQixIKSkub2Zmc2V0KX0pO3JldHVybiB5fTt1LnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih3LEEseSl7dmFyIHg9cS5wcm90b3R5cGUuX3BpeGVsUG9pbnQuY2FsbCh0aGlzLHcsQSx5KSxDPXRoaXMueCgpLmFjY2Vzc29yKHcsQSx5KTt3PXRoaXMueSgpLmFjY2Vzc29yKHcsQSx5KTt5PXRoaXMueSgpLnNjYWxlLnNjYWxlKCt3K3RoaXMuX3N0YWNraW5nUmVzdWx0KCkuZ2V0KHkpLmdldChtLlN0YWNraW5nLm5vcm1hbGl6ZUtleShDKSkub2Zmc2V0KTtyZXR1cm57eDp4LngseX19O3JldHVybiB1fShkLkFyZWEpO2YuU3RhY2tlZEFyZWE9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih1LAp3KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB3KXcuaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXdbeV0pO3UucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEEucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBBKX0scj1oKDUpLGw9aCg4KSxwPWgoMjApLG09aCgwKSxuPWgoMjcpLHE9aCgyKTtkPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoQSl7dm9pZCAwPT09QSYmKEE9InZlcnRpY2FsIik7dmFyIHk9dS5jYWxsKHRoaXMsQSl8fHRoaXM7eS5fZXh0cmVtYUZvcm1hdHRlcj1sLmlkZW50aXR5KCk7eS5fc3RhY2tpbmdSZXN1bHQ9cC5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiB5LmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHkucG9zaXRpb24oKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geS5sZW5ndGgoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geS5fc3RhY2tpbmdPcmRlcn0sZnVuY3Rpb24oeCwKQyxHLEQpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrKHgsQyxHLEQpfSk7eS5fc3RhY2tlZEV4dGVudD1wLm1lbVRodW5rKHkuX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHkucG9zaXRpb24oKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geS5fZmlsdGVyRm9yUHJvcGVydHkoeS5faXNWZXJ0aWNhbD8ieSI6IngiKX0sZnVuY3Rpb24oeCxDLEcpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrZWRFeHRlbnQoeCxDLEcpfSk7eS5hZGRDbGFzcygic3RhY2tlZC1iYXItcGxvdCIpO3kuX3N0YWNraW5nT3JkZXI9ImJvdHRvbXVwIjtyZXR1cm4geX1rKHcsdSk7dy5wcm90b3R5cGUuc3RhY2tpbmdPcmRlcj1mdW5jdGlvbihBKXtpZihudWxsPT1BKXJldHVybiB0aGlzLl9zdGFja2luZ09yZGVyO3RoaXMuX3N0YWNraW5nT3JkZXI9QTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuZXh0cmVtYUZvcm1hdHRlcj1mdW5jdGlvbihBKXtpZigwPT09CmFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX2V4dHJlbWFGb3JtYXR0ZXI7dGhpcy5fZXh0cmVtYUZvcm1hdHRlcj1BO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3UucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2xhYmVsQXJlYT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5CYXIuX0xBQkVMX0FSRUFfQ0xBU1MsITApO3ZhciBBPW5ldyByLlN2Z0NvbnRleHQodGhpcy5fbGFiZWxBcmVhLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IHIuQ2FjaGVNZWFzdXJlcihBKTt0aGlzLl93cml0ZXI9bmV3IHIuV3JpdGVyKHRoaXMuX21lYXN1cmVyLEEpfTt3LnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoTCxKKXt2YXIgTz14Ll9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpLFM9eC53aWR0aCgpLE49eC5oZWlnaHQoKTtMLmZvckVhY2goZnVuY3Rpb24oUil7aWYoUi5leHRlbnQhPT0KQyl7dmFyIFg9eC5leHRyZW1hRm9ybWF0dGVyKCkoUi5leHRlbnQpLGFhPXguX21lYXN1cmVyLm1lYXN1cmUoWCksZmE9Ui5zdGFja2VkRGF0dW0sb2E9ZmEub3JpZ2luYWxEYXR1bSxaPWZhLm9yaWdpbmFsSW5kZXg7ZmE9ZmEub3JpZ2luYWxEYXRhc2V0O3guX2lzRGF0dW1PblNjcmVlbihPLFMsTixvYSxaLGZhKSYmKG9hPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKG9hLFosZmEpLFo9RC5zY2FsZShSLmV4dGVudCksUj14Ll9nZXRQb3NpdGlvbkF0dHIoRy5zY2FsZShSLmF4aXNWYWx1ZSksb2EpK29hLzIsUj1KKHguX2lzVmVydGljYWw/e3g6Uix5Olp9Ont4OloseTpSfSxhYSxvYSksWD15KFgse3RvcExlZnQ6Uixib3R0b21SaWdodDp7eDpSLngrYWEud2lkdGgseTpSLnkrYWEuaGVpZ2h0fX0sb2EpLEsucHVzaChYKSl9fSl9ZnVuY3Rpb24geShMLEosTyl7dmFyIFM9Si50b3BMZWZ0LE49Uy54LFI9Uy55O1M9Si5ib3R0b21SaWdodC54LQpKLnRvcExlZnQueDtKPUouYm90dG9tUmlnaHQueS1KLnRvcExlZnQueTtPPXguX2lzVmVydGljYWw/Uz5POko+TztPfHwoTj14Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTisiLCAiK1IrIikiKSxOLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCkseC5fd3JpdGVyLndyaXRlKEwsUyxKLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxOLm5vZGUoKSkpO3JldHVybiBPfXZhciB4PXRoaXM7dS5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIEM9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLEc9dGhpcy5wb3NpdGlvbigpLnNjYWxlLEQ9dGhpcy5sZW5ndGgoKS5zY2FsZSxCPW0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSksSD1CLm1pbmltdW1FeHRlbnRzLEs9W107QShCLm1heGltdW1FeHRlbnRzLApmdW5jdGlvbihMLEope3ZhciBPPXguX2lzVmVydGljYWw/Si53aWR0aDpKLmhlaWdodDtKPXguX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtyZXR1cm57eDp4Ll9pc1ZlcnRpY2FsP0wueC1PLzI6TC54K3cuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6eC5faXNWZXJ0aWNhbD9MLnktSjpMLnktTy8yfX0pO0EoSCxmdW5jdGlvbihMLEope3ZhciBPPXguX2lzVmVydGljYWw/Si53aWR0aDpKLmhlaWdodDtKPXguX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtyZXR1cm57eDp4Ll9pc1ZlcnRpY2FsP0wueC1PLzI6TC54LUoseTp4Ll9pc1ZlcnRpY2FsP0wueSt3Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUjpMLnktTy8yfX0pO0suc29tZShmdW5jdGlvbihMKXtyZXR1cm4gTH0pJiZ0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoUywKTixSKXtyZXR1cm4gMD4rTChTLE4sUik/QyhTLE4sUik6eChTLE4sUil9ZnVuY3Rpb24geShTLE4sUil7cmV0dXJuIE1hdGguYWJzKHgoUyxOLFIpLUMoUyxOLFIpKX1mdW5jdGlvbiB4KFMsTixSKXtyZXR1cm4gSy5zY2FsZSgrTChTLE4sUikrTy5nZXQoUikuZ2V0KEcoUyxOLFIpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoUyxOLFIpe3JldHVybiBLLnNjYWxlKE8uZ2V0KFIpLmdldChHKFMsTixSKSkub2Zmc2V0KX1mdW5jdGlvbiBHKFMsTixSKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoSihTLE4sUikpfXZhciBEPXRoaXMsQj11LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxIPXRoaXMuX2lzVmVydGljYWw/InkiOiJ4IixLPXRoaXMubGVuZ3RoKCkuc2NhbGUsTD10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLEo9dGhpcy5wb3NpdGlvbigpLmFjY2Vzc29yLE89dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtCW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6CiJ3aWR0aCJdPXk7QltIXT1mdW5jdGlvbihTLE4sUil7cmV0dXJuIEQuX2lzVmVydGljYWw/QShTLE4sUik6QShTLE4sUikteShTLE4sUil9O3JldHVybiBCfTt3LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt3LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gd30obi5CYXIpO2QuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSPTU7Zi5TdGFja2VkQmFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnRvdGFsPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KG0uX1RPVEFMX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KG0uX1RPVEFMX0tFWSwKbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnIuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7bj1wLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTt0aGlzLl9jb25uZWN0b3JBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQVJFQV9DTEFTUywhMCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4ieSI9PT1uP1t0aGlzLl9leHRlbnRdOnAucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCm4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx3PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHkseCl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSx5LHgpO2lmKHcoQSx5LHgpKXJldHVybiBNYXRoLm1pbih1LnNjYWxlKEMpLHUuc2NhbGUoMCkpO0E9bi5fc3VidG90YWxzW3ldO2lmKDA9PT15KXJldHVybiAwPkM/dS5zY2FsZShBLUMpOnUuc2NhbGUoQSk7eT1uLl9zdWJ0b3RhbHNbeS0xXTtyZXR1cm4gQT55P3Uuc2NhbGUoQSk6dS5zY2FsZSh5KX0pO251bGw9PXRoaXMuYXR0cigiaGVpZ2h0IikmJihxLmhlaWdodD1mdW5jdGlvbihBLHkseCl7dmFyIEM9dyhBLHkseCk7QT1uLnkoKS5hY2Nlc3NvcihBLHkseCk7aWYoQylyZXR1cm4gTWF0aC5hYnModS5zY2FsZShBKS0KdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHkseCl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSx5LHgpKyIgIik7aWYodyhBLHkseCkpcmV0dXJuIEMrbS5fQkFSX1RPVEFMX0NMQVNTO0E9bi55KCkuYWNjZXNzb3IoQSx5LHgpO3JldHVybiBDKygwPEE/bS5fQkFSX0dST1dUSF9DTEFTUzptLl9CQVJfREVDTElORV9DTEFTUyl9O3JldHVybiBxfTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3VidG90YWxzKCk7cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PQpmdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx3PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih4LEMpe3ZhciBHPXEueSgpLmFjY2Vzc29yKHgsQyxuKTsoeD1xLnRvdGFsKCkuYWNjZXNzb3IoeCxDLG4pKSYmMCE9PUN8fChBKz1HKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PUEpO0E+dyYmKHc9QSk7eCYmKEc8dSYmKHU9RyksRz53JiYodz1HKSk7aWYoIXkmJngpe0M9Ry1BO2ZvcihHPTA7RzxxLl9zdWJ0b3RhbHMubGVuZ3RoO0crKylxLl9zdWJ0b3RhbHNbR10rPUM7eT0hMDtBKz1DO3UrPUM7dys9Q319KTt0aGlzLl9leHRlbnQ9W3Usd119O20ucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxxPXRoaXMuZGF0YXNldHMoKVswXSx1PTE7dTxxLmRhdGEoKS5sZW5ndGg7dSsrKXt2YXIgdz11LTEsQT1xLmRhdGEoKVt1XSwKeT1xLmRhdGEoKVt3XTt5PW4ueCh5LHcscSk7dmFyIHg9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbd118fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t3XSlDPW4ueShBLHUscSkrbi5oZWlnaHQoQSx1LHEpO3RoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIix5KS5hdHRyKCJ4MiIseCkuYXR0cigieTEiLEMpLmF0dHIoInkyIixDKX19O20ucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRhdGFzZXRzKCk7MDxuLmxlbmd0aCYmKG49bltuLmxlbmd0aC0xXSx0aGlzLl9zdWJ0b3RhbHM9W10sdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KG4pKX07cmV0dXJuIG19KGQuQmFyKTsKaC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPSJ0b3RhbCI7Zi5XYXRlcmZhbGw9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7CnN3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249ci5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj1yLnNjYWxlT3JkaW5hbChyLnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjAiOmNhc2UgImNhdGVnb3J5MjAiOmNhc2UgIjIwIjpuPXIuc2NhbGVPcmRpbmFsKHIuc2NoZW1lQ2F0ZWdvcnkyMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGIiOmNhc2UgImNhdGVnb3J5MjBiIjpjYXNlICIyMGIiOm49ci5zY2FsZU9yZGluYWwoci5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGMiOmNhc2UgImNhdGVnb3J5MjBjIjpjYXNlICIyMGMiOm49ci5zY2FsZU9yZGluYWwoci5zY2hlbWVDYXRlZ29yeTIwYyk7CmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTttLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7bS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfTttLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49W10scT1yLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLHU9bC5Db2xvci5jb2xvclRlc3QocSwiIiksdz0wLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9QSYmdzx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmCihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSksdysrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3cpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7cmV0dXJuIGwuQ29sb3IubGlnaHRlbkNvbG9yKHEsTWF0aC5sb2cobiptLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0ibGluZWFyIik7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlICJsaW5lYXIiOnEuX2NvbG9yU2NhbGU9CnIuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9ci5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9ci5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9ci5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3EucmFuZ2UobS5SRURTKTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24obil7bj1yLmV4dGVudChuKTtyZXR1cm4gbnVsbD09blswXXx8bnVsbD09blsxXT9bXTpufTttLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX07bS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSksdz1xLXU7cmV0dXJuIHIuaW50ZXJwb2xhdGVMYWIoblt1XSxuW01hdGguY2VpbChxKV0pKHcpfX19O20ucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O20ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOzA8bi5sZW5ndGgmJnRoaXMuX3NldERvbWFpbihbbC5NYXRoLm1pbihuLAowKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihuKXt0aGlzLl9jb2xvclJhbmdlPW47dGhpcy5fcmVzZXRTY2FsZSgpfTtyZXR1cm4gbX0oaCgxNykuU2NhbGUpO2QuUkVEUz0iI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmQuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7Zi5JbnRlcnBvbGF0ZWRDb2xvcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHI9aCgxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT0KbC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9ci5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5zY2FsZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5pbnZlcnQobSl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obSl7dGhpcy5fZDNTY2FsZS5yYW5nZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChtKX07cC5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07CnAucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihtW3VdPW5bdV0pO20ucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHEucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBxKX0scj1oKDEpLGw9aCgwKSxwPWgoMyk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKHEpe3ZvaWQgMD09PXEmJihxPTEwKTt2YXIgdT1tLmNhbGwodGhpcyl8fHRoaXM7dS5fZDNTY2FsZT1yLnNjYWxlTGluZWFyKCk7dS5fYmFzZT1xO3UuX3Bpdm90PXUuX2Jhc2U7dS5fc2V0RG9tYWluKHUuX2RlZmF1bHRFeHRlbnQoKSk7CmlmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuX2ludmVydGVkQWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocSl7dmFyIHU9MD5xPy0xOjE7cT1NYXRoLnBvdyh0aGlzLl9iYXNlLHEqdSk7cTx0aGlzLl9waXZvdCYmKHE9dGhpcy5fcGl2b3QqKHEtMSkvKHRoaXMuX3Bpdm90LTEpKTtyZXR1cm4gcSp1fTtuLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0aGlzLl9hZGp1c3RlZExvZyhxKSl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5faW52ZXJ0ZWRBZGp1c3RlZExvZyh0aGlzLl9kM1NjYWxlLmludmVydChxKSl9OwpuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4ocSl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn07bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPXE7bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsClt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcShHLEQsQil7cmV0dXJuW0csRCxCXS5zb3J0KGZ1bmN0aW9uKEgsSyl7cmV0dXJuIEgtS30pWzFdfXZhciB1PWwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSx3PWwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxBPXEodSx3LC10aGlzLl9waXZvdCkseT1xKHUsdyx0aGlzLl9waXZvdCk7QT10aGlzLl9sb2dUaWNrcygtQSwtdSkubWFwKGZ1bmN0aW9uKEcpe3JldHVybi1HfSkucmV2ZXJzZSgpO3k9dGhpcy5fbG9nVGlja3MoeSx3KTt2YXIgeD1NYXRoLm1heCh1LAotdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4odyx0aGlzLl9waXZvdCk7eD1yLnNjYWxlTGluZWFyKCkuZG9tYWluKFt4LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3MoeCxDKSk7QT1BLmNvbmNhdCh4KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXIuc2NhbGVMaW5lYXIoKS5kb21haW4oW3Usd10pLnRpY2tzKCkpO3JldHVybiBBfTtuLnByb3RvdHlwZS5fbG9nVGlja3M9ZnVuY3Rpb24ocSx1KXt2YXIgdz10aGlzLEE9dGhpcy5faG93TWFueVRpY2tzKHEsdSk7aWYoMD09PUEpcmV0dXJuW107dmFyIHk9TWF0aC5mbG9vcihNYXRoLmxvZyhxKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSkseD1NYXRoLmNlaWwoTWF0aC5sb2codSkvTWF0aC5sb2codGhpcy5fYmFzZSkpO0E9ci5yYW5nZSh4LHksLU1hdGguY2VpbCgoeC15KS9BKSk7eT1yLnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKTt2YXIgQz1sLkFycmF5LnVuaXEoeSk7QT1BLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIE1hdGgucG93KHcuX2Jhc2UsCkctMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRyl7cmV0dXJuIHE8PUcmJkc8PXV9KS5zb3J0KGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEctRH0pfTtuLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHc9dGhpcy5fYWRqdXN0ZWRMb2cobC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxBPXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSk7cmV0dXJuIE1hdGguY2VpbCgodGhpcy5fYWRqdXN0ZWRMb2codSktdGhpcy5fYWRqdXN0ZWRMb2cocSkpLyhBLXcpKnAuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX07bi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fYmFzZV19O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj0KZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsdGhpcy5fYmFzZV06W3EqdGhpcy5fYmFzZSxxL3RoaXMuX2Jhc2VdKTpxfTtuLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtuLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07bi5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07cmV0dXJuIG59KGgoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtmLk1vZGlmaWVkTG9nPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2YuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHIpe2lmKDA+PXIpdGhyb3cgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGwpe2w9CmwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvcikqcjtwPTA9PT1wJXI/W106W3BdO3ZhciBuPWsuTWF0aC5yYW5nZSgwLE1hdGguZmxvb3IoKGwtbSkvcikrMSkubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBtK3Eqcn0pO3JldHVybiBwLmNvbmNhdChuKS5jb25jYXQoMD09PWwlcj9bXTpbbF0pfX07Zi5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbD1yLmRlZmF1bHRUaWNrcygpO3JldHVybiBsLmZpbHRlcihmdW5jdGlvbihwLG0pe3JldHVybiAwPT09cCUxfHwwPT09bXx8bT09PWwubGVuZ3RoLTF9KX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTsKcC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMSksbD1oKDI4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fZDNTY2FsZT1yLnNjYWxlVGltZSgpO24uYXV0b0RvbWFpbigpO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS50aWNrSW50ZXJ2YWw9ZnVuY3Rpb24obixxKXt2b2lkIDA9PT1xJiYocT0xKTt2YXIgdT1yLnNjYWxlVGltZSgpO20udGltZUludGVydmFsVG9EM1RpbWUobikuZXZlcnkocSk7dS5kb21haW4odGhpcy5kb21haW4oKSk7dS5yYW5nZSh0aGlzLnJhbmdlKCkpO3JldHVybiB1LnRpY2tzKCl9O20ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obil7aWYoblsxXTxuWzBdKXRocm93IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX07bS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKG4pe3ZhciBxPW5bMF0uZ2V0VGltZSgpLHU9blsxXS5nZXRUaW1lKCk7cmV0dXJuIHE9PT11PyhuPW5ldyBEYXRlKHEpLG4uc2V0RGF0ZShuLmdldERhdGUoKS0xKSx1PW5ldyBEYXRlKHUpLHUuc2V0RGF0ZSh1LmdldERhdGUoKSsxKSxbbix1XSk6bn07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUobikpfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmludmVydChuKS5nZXRUaW1lKCl9O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW25bMF0udmFsdWVPZigpLG5bMV0udmFsdWVPZigpXX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRvbWFpbigpO3JldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKG4pe3RoaXMuZG9tYWluKFtuZXcgRGF0ZShuWzBdKSxuZXcgRGF0ZShuWzFdKV0pfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4obik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9OwptLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fZDNTY2FsZS5yYW5nZShuKX07bS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChuKX07bS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07bS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihuKS5uaWNlKCkuZG9tYWluKCl9O20udGltZUludGVydmFsVG9EM1RpbWU9ZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UgbC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiByLnRpbWVTZWNvbmQ7Y2FzZSBsLlRpbWVJbnRlcnZhbC5taW51dGU6cmV0dXJuIHIudGltZU1pbnV0ZTtjYXNlIGwuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIHIudGltZUhvdXI7Y2FzZSBsLlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIHIudGltZURheTsKY2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiByLnRpbWVXZWVrO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubW9udGg6cmV0dXJuIHIudGltZU1vbnRoO2Nhc2UgbC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gci50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK24pO319O3JldHVybiBtfShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5UaW1lPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHI9QXJyYXk7Zi5hZGQ9ZnVuY3Rpb24obCxwKXtpZihsLmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiBsLm1hcChmdW5jdGlvbihtLG4pe3JldHVybiBsW25dK3Bbbl19KX07Zi51bmlxPWZ1bmN0aW9uKGwpe3ZhciBwPWsuc2V0KCksbT1bXTtsLmZvckVhY2goZnVuY3Rpb24obil7cC5oYXMoU3RyaW5nKG4pKXx8CihwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07Zi5mbGF0dGVuPWZ1bmN0aW9uKGwpe3JldHVybiByLnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbCl9O2YuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24obCxwKXtmb3IodmFyIG09W10sbj0wO248cDtuKyspbVtuXT0iZnVuY3Rpb24iPT09dHlwZW9mIGw/bChuKTpsO3JldHVybiBtfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIsbCl7dGhpcy5tYXhJbmRleD10aGlzLm1pbkluZGV4PXRoaXMuZXhpdEluZGV4PXRoaXMuZW50cnlJbmRleD1rO3RoaXMuYnVja2V0VmFsdWU9cjt0aGlzLm1heFZhbHVlPXRoaXMubWluVmFsdWU9bH1oLnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKGspe3JldHVybiBrPT10aGlzLmJ1Y2tldFZhbHVlfTtoLnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbihrLHIpe2s8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9ayx0aGlzLm1pbkluZGV4PQpyKTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPWssdGhpcy5tYXhJbmRleD1yKTt0aGlzLmV4aXRJbmRleD1yfTtoLnByb3RvdHlwZS5nZXRVbmlxdWVJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIGs9W3RoaXMuZW50cnlJbmRleCx0aGlzLm1heEluZGV4LHRoaXMubWluSW5kZXgsdGhpcy5leGl0SW5kZXhdO3JldHVybiBrLmZpbHRlcihmdW5jdGlvbihyLGwpe3JldHVybiAwPT1sfHxyIT1rW2wtMV19KX07cmV0dXJuIGh9KCk7Zi5CdWNrZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHJbbV09bFttXSk7ci5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gbnVsbCE9PQpyJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwscik7bC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgcD10aGlzLG09W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspbVtuXT1hcmd1bWVudHNbbl07dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3EuYXBwbHkocCxtKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gbH0oaCg1OCkuU2V0KTtmLkNhbGxiYWNrU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2Z1bmN0aW9uIG0odSl7dS89MjU1O3JldHVybi4wMzkyOD49dT91LzEyLjkyOmwucG93KCh1Ky4wNTUpLzEuMDU1LDIuNCl9dmFyIG49ci5yZ2IocCk7cD1tKG4ucik7dmFyIHE9bShuLmcpO249bShuLmIpO3JldHVybi4yMTI2KnArLjcxNTIqcSsuMDcyMipufXZhciByPWgoMSksbD1NYXRoO2YuY29udHJhc3Q9ZnVuY3Rpb24ocCxtKXtwPWsocCkrLjA1O209ayhtKSsuMDU7cmV0dXJuIHA+bT9wL206bS9wfTtmLmxpZ2h0ZW5Db2xvcj0KZnVuY3Rpb24ocCxtKXtyZXR1cm4gci5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTtmLmNvbG9yVGVzdD1mdW5jdGlvbihwLG0pe3AuY2xhc3NlZChtLCEwKTt2YXIgbj1wLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7bj0vXCgoLispXCkvLmV4ZWMobik7aWYoIW4pcmV0dXJuIG51bGw7bj1uWzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHEpe3E9K3E7dmFyIHU9cS50b1N0cmluZygxNik7cmV0dXJuIDE2PnE/IjAiK3U6dX0pO2lmKDQ9PT1uLmxlbmd0aCYmIjAwIj09PW5bM10pcmV0dXJuIG51bGw7bj0iIyIrbi5qb2luKCIiKTtwLmNsYXNzZWQobSwhMSk7cmV0dXJuIG59fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSxyPWgoNTcpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZW50aXRpZXM9W107dGhpcy5fcnRyZWU9bmV3IHIuUlRyZWU7dGhpcy5fdHJlZT1rLnF1YWR0cmVlKCkueChmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLngpfSkueShmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLnkpfSl9CmwucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihwLG0sbil7KHc9dGhpcy5fZW50aXRpZXMpLnB1c2guYXBwbHkodyxwKTtpZih2b2lkIDAhPT1uKWZvcihuPXIuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHc9MDt3PHAubGVuZ3RoO3crKyl7dmFyIHE9cFt3XSx1PXIuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpO3IuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKG4sdSkmJih0aGlzLl90cmVlLmFkZChxKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKSl9ZWxzZSBmb3IodGhpcy5fdHJlZS5hZGRBbGwocCksdz0wO3c8cC5sZW5ndGg7dysrKXE9cFt3XSx1PXIuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpLHRoaXMuX3J0cmVlLmluc2VydCh1LHEpO3ZhciB3fTtsLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl90cmVlLmZpbmQocC54LHAueSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdChyLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9OwpsLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WChyLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHIuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHApKX07bC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9O3JldHVybiBsfSgpO2YuRW50aXR5U3RvcmU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXIucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLHApe2lmKGsuaXNOYU4obCkpdGhyb3cgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwppZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQobCxwKSx0aGlzO2Zvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1ttXS52YWx1ZT1wLHRoaXM7dGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHtrZXk6bCx2YWx1ZTpwfSk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmdldD1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlfTtyLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKGwpOwpmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWwpcmV0dXJuITA7cmV0dXJuITF9O3IucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24obCxwKXt2YXIgbT10aGlzO251bGwhPXRoaXMuX2VzNk1hcD90aGlzLl9lczZNYXAuZm9yRWFjaChmdW5jdGlvbihuLHEpe3JldHVybiBsLmNhbGwocCxuLHEsbSl9LHApOnRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbihuKXtsLmNhbGwocCxuLnZhbHVlLG4ua2V5LG0pfSl9O3IucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShwLDEpLCEwO3JldHVybiExfTsKcmV0dXJuIHJ9KCk7Zi5NYXA9ZH0sZnVuY3Rpb24oZCxmKXtmLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgaD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKyloW2tdPWFyZ3VtZW50c1trXTtrPXt9O2Zvcih2YXIgcj0wO3I8aC5sZW5ndGg7cisrKWZvcih2YXIgbD1oW3JdLHA9MCxtPU9iamVjdC5rZXlzKGwpO3A8bS5sZW5ndGg7cCsrKXt2YXIgbj1tW3BdO2tbbl09bFtuXX1yZXR1cm4ga319LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayxyKXtmb3IodmFyIGw9TWF0aC5jZWlsKGsubGVuZ3RoLzIpLHA9MDtwPGw7cCsrKXJbMF0uaW5zZXJ0KGtbcF0pO2ZvcihwPWw7cDxrLmxlbmd0aDtwKyspclsxXS5pbnNlcnQoa1twXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneVRyaXZpYWw9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihrLHIpe2s9Cmsuc2xpY2UoKTtmb3IodGhpcy5jaG9vc2VGaXJzdFNwbGl0KGsscik7MDxrLmxlbmd0aDspdGhpcy5hZGROZXh0KGsscil9O2gucHJvdG90eXBlLmNob29zZUZpcnN0U3BsaXQ9ZnVuY3Rpb24oayxyKXtmb3IodmFyIGw9MCxwPTAsbT1rLmxlbmd0aC0xLG49ay5sZW5ndGgtMSxxPTE7cTxrLmxlbmd0aC0xO3ErKyl7dmFyIHU9a1txXTt1LmJvdW5kcy54bD5rW21dLmJvdW5kcy54bD9tPXE6dS5ib3VuZHMueGg8a1tsXS5ib3VuZHMueGgmJihsPXEpO3UuYm91bmRzLnlsPmtbbl0uYm91bmRzLnlsP249cTp1LmJvdW5kcy55aDxrW3BdLmJvdW5kcy55aCYmKHA9cSl9cD1NYXRoLmFicyhrW2xdLmJvdW5kcy54aC1rW21dLmJvdW5kcy54bCk+TWF0aC5hYnMoa1twXS5ib3VuZHMueWgta1tuXS5ib3VuZHMueWwpP1tsLG1dOltwLG5dO2w9cFswXTtwPXBbMV07bD09PXAmJihsPTAscD1rLmxlbmd0aC0xKTtyWzBdLmluc2VydChrLnNwbGljZShNYXRoLm1heChsLHApLDEpWzBdKTtyWzFdLmluc2VydChrLnNwbGljZShNYXRoLm1pbihsLApwKSwxKVswXSl9O2gucHJvdG90eXBlLmFkZE5leHQ9ZnVuY3Rpb24oayxyKXtmb3IodmFyIGw9bnVsbCxwPW51bGwsbT1udWxsLG49MDtuPGsubGVuZ3RoO24rKyl7dmFyIHE9a1tuXSx1PXJbMF0udW5pb25BcmVhRGlmZmVyZW5jZShxLmJvdW5kcyk7cT1yWzFdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO2lmKHU8cHx8bnVsbD09bClsPW4scD11LG09clswXTtxPHAmJihsPW4scD1xLG09clsxXSl9bS5pbnNlcnQoay5zcGxpY2UobCwxKVswXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneUxpbmVhcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhtKXtyZXR1cm4gU3RyaW5nKG0pfXZhciByPWgoMSksbD1oKDApO2Q9aCgxMCk7Zi5JU3RhY2tpbmdPcmRlcj1kLm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciBwPU1hdGg7Zi5zdGFjaz1mdW5jdGlvbihtLG4scSx1KXt2b2lkIDA9PT11JiYodT0iYm90dG9tdXAiKTt2YXIgdz1yLm1hcCgpLEE9CnIubWFwKCkseT1uZXcgbC5NYXA7InRvcGRvd24iPT09dSYmKG09bS5zbGljZSgpLG0ucmV2ZXJzZSgpKTttLmZvckVhY2goZnVuY3Rpb24oeCl7dmFyIEM9bmV3IGwuTWFwO3guZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oRyxEKXt2YXIgQj1rKG4oRyxELHgpKSxIPStxKEcsRCx4KSxLPTA8PUg/dzpBO2lmKEsuaGFzKEIpKXt2YXIgTD1LLmdldChCKTtLLnNldChCLEwrSCl9ZWxzZSBMPTAsSy5zZXQoQixIKTtDLnNldChCLHtvZmZzZXQ6TCx2YWx1ZTpILGF4aXNWYWx1ZTpuKEcsRCx4KSxvcmlnaW5hbERhdHVtOkcsb3JpZ2luYWxEYXRhc2V0Ongsb3JpZ2luYWxJbmRleDpEfSl9KTt5LnNldCh4LEMpfSk7cmV0dXJuIHl9O2Yuc3RhY2tlZEV4dGVudHM9ZnVuY3Rpb24obSl7dmFyIG49bmV3IGwuTWFwLHE9bmV3IGwuTWFwO20uZm9yRWFjaChmdW5jdGlvbih1KXt1LmZvckVhY2goZnVuY3Rpb24odyxBKXt2YXIgeT1sLk1hdGgubWF4KFt3Lm9mZnNldCt3LnZhbHVlLHcub2Zmc2V0XSwKdy5vZmZzZXQpLHg9bC5NYXRoLm1pbihbdy5vZmZzZXQrdy52YWx1ZSx3Lm9mZnNldF0sdy5vZmZzZXQpLEM9dy5heGlzVmFsdWU7bi5oYXMoQSk/bi5nZXQoQSkuZXh0ZW50PHkmJm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp3fSk6bi5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnd9KTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ+eCYmcS5zZXQoQSx7ZXh0ZW50OngsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnd9KTpxLnNldChBLHtleHRlbnQ6eCxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06d30pfSl9KTtyZXR1cm57bWF4aW11bUV4dGVudHM6bixtaW5pbXVtRXh0ZW50czpxfX07Zi5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT1bXTttLmZvckVhY2goZnVuY3Rpb24oQSx5KXt5LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHgsQyl7aWYobnVsbD09cXx8cSh4LEMseSkpeD1BLmdldChrKG4oeCxDLHkpKSksCnUucHVzaCh4LnZhbHVlK3gub2Zmc2V0KX0pfSk7bT1sLk1hdGgubWF4KHUsMCk7dmFyIHc9bC5NYXRoLm1pbih1LDApO3JldHVybltwLm1pbih3LDApLHAubWF4KDAsbSldfTtmLm5vcm1hbGl6ZUtleT1rfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24obCl7bD1sLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt2YXIgcD1sLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I7bnVsbD09cCYmKHA9bmV3IHIobCksbC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yPXApO3JldHVybiBwfTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCl7dGhpcy5fcm9vdEVsZW1lbnQ9cH1sLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24ocCxtKXtwPXt4OnAseTptfTttPWsuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bT9wOmsuTWF0aC5hcHBseVRyYW5zZm9ybShtLApwKX07bC5pc0V2ZW50SW5zaWRlPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuRE9NLmNvbnRhaW5zKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG0udGFyZ2V0KX07cmV0dXJuIGx9KCk7Zi5UcmFuc2xhdG9yPXJ9LGZ1bmN0aW9uKGQsZixoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGs9aCgxMjQpO2guZChmLCJlYXNlTGluZWFyIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgcj1oKDEyNik7aC5kKGYsImVhc2VRdWFkIixmdW5jdGlvbigpe3JldHVybiByLmF9KTtoLmQoZiwiZWFzZVF1YWRJbiIsZnVuY3Rpb24oKXtyZXR1cm4gci5ifSk7aC5kKGYsImVhc2VRdWFkT3V0IixmdW5jdGlvbigpe3JldHVybiByLmN9KTtoLmQoZiwiZWFzZVF1YWRJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gci5hfSk7dmFyIGw9aCgxMjEpO2guZChmLCJlYXNlQ3ViaWMiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2guZChmLCJlYXNlQ3ViaWNJbiIsCmZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2guZChmLCJlYXNlQ3ViaWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2guZChmLCJlYXNlQ3ViaWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7dmFyIHA9aCgxMjUpO2guZChmLCJlYXNlUG9seSIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7aC5kKGYsImVhc2VQb2x5SW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2guZChmLCJlYXNlUG9seU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7aC5kKGYsImVhc2VQb2x5SW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO3ZhciBtPWgoMTI3KTtoLmQoZiwiZWFzZVNpbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7aC5kKGYsImVhc2VTaW5JbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7aC5kKGYsImVhc2VTaW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uY30pO2guZChmLCJlYXNlU2luSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO3ZhciBuPWgoMTIzKTtoLmQoZiwKImVhc2VFeHAiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2guZChmLCJlYXNlRXhwSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYn0pO2guZChmLCJlYXNlRXhwT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmN9KTtoLmQoZiwiZWFzZUV4cEluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcT1oKDEyMCk7aC5kKGYsImVhc2VDaXJjbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO2guZChmLCJlYXNlQ2lyY2xlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYn0pO2guZChmLCJlYXNlQ2lyY2xlT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmN9KTtoLmQoZiwiZWFzZUNpcmNsZUluT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmF9KTt2YXIgdT1oKDExOSk7aC5kKGYsImVhc2VCb3VuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pO2guZChmLCJlYXNlQm91bmNlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYn0pO2guZChmLCJlYXNlQm91bmNlT3V0IixmdW5jdGlvbigpe3JldHVybiB1LmF9KTsKaC5kKGYsImVhc2VCb3VuY2VJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5jfSk7dmFyIHc9aCgxMTgpO2guZChmLCJlYXNlQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4gdy5hfSk7aC5kKGYsImVhc2VCYWNrSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHcuYn0pO2guZChmLCJlYXNlQmFja091dCIsZnVuY3Rpb24oKXtyZXR1cm4gdy5jfSk7aC5kKGYsImVhc2VCYWNrSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHcuYX0pO3ZhciBBPWgoMTIyKTtoLmQoZiwiZWFzZUVsYXN0aWMiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luIixmdW5jdGlvbigpe3JldHVybiBBLmJ9KTtoLmQoZiwiZWFzZUVsYXN0aWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmN9KX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTsKaC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIHUqdSooKG0rMSkqdS1tKX1tPSttO3Eub3ZlcnNob290PW47cmV0dXJuIHF9KDEuNzAxNTgpLHI9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHcpe3JldHVybi0tdyp3KigobisxKSp3K24pKzF9bj0rbjt1Lm92ZXJzaG9vdD1xO3JldHVybiB1fSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24gdyhBKXtyZXR1cm4oMT4oQSo9Mik/QSpBKigocSsxKSpBLXEpOihBLT0yKSpBKigocSsxKSpBK3EpKzIpLzJ9cT0rcTt3Lm92ZXJzaG9vdD11O3JldHVybiB3fSgxLjcwMTU4KX0sZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKHkpe3JldHVybih5PSt5KTxrP0EqeSp5Onk8bD9BKih5LT1yKSp5K3A6eTxuP0EqKHktPW0pKnkrcTpBKih5LT11KSp5K3d9Zi5iPWZ1bmN0aW9uKHkpe3JldHVybiAxLWgoMS15KX07Zi5hPWg7Zi5jPWZ1bmN0aW9uKHkpe3JldHVybigxPj0KKHkqPTIpPzEtaCgxLXkpOmgoeS0xKSsxKS8yfTt2YXIgaz00LzExLHI9Ni8xMSxsPTgvMTEscD0uNzUsbT05LzExLG49MTAvMTEscT0uOTM3NSx1PTIxLzIyLHc9Ljk4NDM3NSxBPTEvay9rfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1oKmgpfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLWgqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpPzEtTWF0aC5zcXJ0KDEtaCpoKTpNYXRoLnNxcnQoMS0oaC09MikqaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBoKmgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybi0taCpoKmgrMX07Zi5hPWZ1bmN0aW9uKGgpe3JldHVybigxPj0oaCo9Mik/aCpoKmg6KGgtPTIpKmgqaCsyKS8yfX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiByfSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTsKaC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaz0yKk1hdGguUEkscj1mdW5jdGlvbiB1KG4scSl7ZnVuY3Rpb24gdyh5KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0teSkqTWF0aC5zaW4oKEEteSkvcSl9dmFyIEE9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihxLz1rKTt3LmFtcGxpdHVkZT1mdW5jdGlvbih5KXtyZXR1cm4gdSh5LHEqayl9O3cucGVyaW9kPWZ1bmN0aW9uKHkpe3JldHVybiB1KG4seSl9O3JldHVybiB3fSgxLC4zKSxsPWZ1bmN0aW9uIHcocSx1KXtmdW5jdGlvbiBBKHgpe3JldHVybiAxLXEqTWF0aC5wb3coMiwtMTAqKHg9K3gpKSpNYXRoLnNpbigoeCt5KS91KX12YXIgeT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHUvPWspO0EuYW1wbGl0dWRlPWZ1bmN0aW9uKHgpe3JldHVybiB3KHgsdSprKX07QS5wZXJpb2Q9ZnVuY3Rpb24oeCl7cmV0dXJuIHcocSx4KX07cmV0dXJuIEF9KDEsLjMpLHA9ZnVuY3Rpb24gQSh1LHcpe2Z1bmN0aW9uIHkoQyl7cmV0dXJuKDA+CihDPTIqQy0xKT91Kk1hdGgucG93KDIsMTAqQykqTWF0aC5zaW4oKHgtQykvdyk6Mi11Kk1hdGgucG93KDIsLTEwKkMpKk1hdGguc2luKCh4K0MpL3cpKS8yfXZhciB4PU1hdGguYXNpbigxLyh1PU1hdGgubWF4KDEsdSkpKSoody89ayk7eS5hbXBsaXR1ZGU9ZnVuY3Rpb24oQyl7cmV0dXJuIEEoQyx3KmspfTt5LnBlcmlvZD1mdW5jdGlvbihDKXtyZXR1cm4gQSh1LEMpfTtyZXR1cm4geX0oMSwuMyl9LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnBvdygyLDEwKmgtMTApfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP01hdGgucG93KDIsMTAqaC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKmgpKS8yfX0sZnVuY3Rpb24oZCxmKXtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuK2h9fSxmdW5jdGlvbihkLGYsaCl7aC5kKGYsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTtoLmQoZiwKImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTtoLmQoZiwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciBrPWZ1bmN0aW9uIG4obSl7ZnVuY3Rpb24gcSh1KXtyZXR1cm4gTWF0aC5wb3codSxtKX1tPSttO3EuZXhwb25lbnQ9bjtyZXR1cm4gcX0oMykscj1mdW5jdGlvbiBxKG4pe2Z1bmN0aW9uIHUodyl7cmV0dXJuIDEtTWF0aC5wb3coMS13LG4pfW49K247dS5leHBvbmVudD1xO3JldHVybiB1fSgzKSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24gdyhBKXtyZXR1cm4oMT49KEEqPTIpP01hdGgucG93KEEscSk6Mi1NYXRoLnBvdygyLUEscSkpLzJ9cT0rcTt3LmV4cG9uZW50PXU7cmV0dXJuIHd9KDMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpofTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqKDItaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaDotLWgqKDItaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKHIpe3JldHVybiAxLQpNYXRoLmNvcyhyKmspfTtmLmM9ZnVuY3Rpb24ocil7cmV0dXJuIE1hdGguc2luKHIqayl9O2YuYT1mdW5jdGlvbihyKXtyZXR1cm4oMS1NYXRoLmNvcyhoKnIpKS8yfTt2YXIgaD1NYXRoLlBJLGs9aC8yfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsKXtyZXR1cm4hMD09PXIobCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGwpfXZhciByPWgoMTI5KTtkLmV4cG9ydHM9ZnVuY3Rpb24obCl7aWYoITE9PT1rKGwpKXJldHVybiExO2w9bC5jb25zdHJ1Y3RvcjtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGwpcmV0dXJuITE7bD1sLnByb3RvdHlwZTtyZXR1cm4hMT09PWsobCl8fCExPT09bC5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpPyExOiEwfX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWZ1bmN0aW9uKGYpe3JldHVybiBudWxsIT1mJiYib2JqZWN0Ij09PXR5cGVvZiBmJiYhMT09PUFycmF5LmlzQXJyYXkoZil9fSxmdW5jdGlvbihkLApmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIsbCl7dm9pZCAwPT09ciYmKHI9MTApO3ZvaWQgMD09PWwmJihsPXt9KTt2YXIgcD10aGlzO3RoaXMuY3R4PWs7dGhpcy5saW5lSGVpZ2h0PXI7dGhpcy5zdHlsZT1sO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cC5jdHguZm9udD1wLnN0eWxlLmZvbnQ7cmV0dXJue3dpZHRoOnAuY3R4Lm1lYXN1cmVUZXh0KG0pLndpZHRoLGhlaWdodDpwLmxpbmVIZWlnaHR9fX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24obSxuLHEpe251bGw9PXEmJihxPXAuY3R4KTtxLnNhdmUoKTtxLnRyYW5zbGF0ZShuLnRyYW5zbGF0ZVswXSxuLnRyYW5zbGF0ZVsxXSk7cS5yb3RhdGUobi5yb3RhdGUqTWF0aC5QSS8xODApO3JldHVybiBwLmNyZWF0ZUNhbnZhc1BlbihxKX07dm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9aC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKGspe3ZhciByPQp0aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7ay5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe2sudGV4dEFsaWduPXA7bnVsbCE9ci5zdHlsZS5mb250JiYoay5mb250PXIuc3R5bGUuZm9udCk7bnVsbCE9ci5zdHlsZS5maWxsJiYoay5maWxsU3R5bGU9ci5zdHlsZS5maWxsLGsuZmlsbFRleHQobCxtLG4pKTtudWxsIT1yLnN0eWxlLnN0cm9rZSYmKGsuc3Ryb2tlU3R5bGU9ci5zdHlsZS5maWxsLGsuc3Ryb2tlVGV4dChsLG0sbikpfX19O3JldHVybiBofSgpO2YuQ2FudmFzQ29udGV4dD1kfSxmdW5jdGlvbihkLGYpe3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLmFwcGVuZD1mdW5jdGlvbihyLGwpe2Zvcih2YXIgcD1bXSxtPTI7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMl09YXJndW1lbnRzW21dO3A9ay5jcmVhdGUuYXBwbHkoayxbbF0uY29uY2F0KHApKTtyLmFwcGVuZENoaWxkKHApO3JldHVybiBwfTtrLmNyZWF0ZT1mdW5jdGlvbihyKXtmb3IodmFyIGw9CltdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoay5TVkdfTlMscik7ay5hZGRDbGFzc2VzLmFwcGx5KGssW3BdLmNvbmNhdChsKSk7cmV0dXJuIHB9O2suYWRkQ2xhc3Nlcz1mdW5jdGlvbihyKXtmb3IodmFyIGw9W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbFtwLTFdPWFyZ3VtZW50c1twXTtsPWwuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT1tfSk7bnVsbCE9ci5jbGFzc0xpc3Q/bC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3IuY2xhc3NMaXN0LmFkZChtKX0pOnIuc2V0QXR0cmlidXRlKCJjbGFzcyIsbC5qb2luKCIgIikpfTtrLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24ocil7aWYoci5nZXRCQm94KXRyeXt2YXIgbD1yLmdldEJCb3goKTtyZXR1cm57d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9fWNhdGNoKHApe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19O3JldHVybiBrfSgpOwpoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuU3ZnVXRpbHM9aDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhyLGwscCl7dm9pZCAwPT09cCYmKHA9ITEpO3ZhciBtPXRoaXM7dGhpcy5lbGVtZW50PXI7dGhpcy5jbGFzc05hbWU9bDt0aGlzLmFkZFRpdGxlRWxlbWVudD1wO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgbj1tLmdldFRleHRFbGVtZW50cyhtLmVsZW1lbnQpLHE9bi5wYXJlbnRFbGVtZW50LHU9bi5jb250YWluZXJFbGVtZW50LHc9bi50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24oQSl7cS5hcHBlbmRDaGlsZCh1KTt3LnRleHRDb250ZW50PUE7QT1oLmdldERpbWVuc2lvbnModyk7cS5yZW1vdmVDaGlsZCh1KTtyZXR1cm4gQX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG4scSx1KXtudWxsPT11JiYodT1tLmVsZW1lbnQpO3U9aC5hcHBlbmQodSwiZyIsInRleHQtY29udGFpbmVyIixtLmNsYXNzTmFtZSk7bS5hZGRUaXRsZUVsZW1lbnQmJgooaC5hcHBlbmQodSwidGl0bGUiKS50ZXh0Q29udGVudD1uLHUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbikpO249aC5hcHBlbmQodSwiZyIsInRleHQtYXJlYSIpO24uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitxLnRyYW5zbGF0ZVswXSsiLCIrcS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIisocS5yb3RhdGUrIikiKSk7cmV0dXJuIG0uY3JlYXRlU3ZnTGluZVBlbihuKX19ay5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHIpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXJ9O2sucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24ocil7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPWguYXBwZW5kKHIsInRleHQiLCJ0ZXh0LWxpbmUiKTtxLnRleHRDb250ZW50PWw7cS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixwKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO3Euc2V0QXR0cmlidXRlKCJ5IiwKIi0wLjI1ZW0iKX19fTtrLnByb3RvdHlwZS5nZXRUZXh0RWxlbWVudHM9ZnVuY3Rpb24ocil7aWYoInRleHQiPT09ci50YWdOYW1lKXt2YXIgbD1yLnBhcmVudEVsZW1lbnQ7bnVsbD09bCYmKGw9ci5wYXJlbnROb2RlKTtsLnJlbW92ZUNoaWxkKHIpO3JldHVybntjb250YWluZXJFbGVtZW50OnIscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50OnJ9fXZhciBwPXIucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPXApcmV0dXJuIGw9ci5wYXJlbnRFbGVtZW50LG51bGw9PWwmJihsPXIucGFyZW50Tm9kZSksbC5yZW1vdmVDaGlsZChyKSx7Y29udGFpbmVyRWxlbWVudDpyLHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDpwfTtsPWguY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OnIsdGV4dEVsZW1lbnQ6bH19O3JldHVybiBrfSgpO2YuU3ZnQ29udGV4dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMjEpLGw9aCgzNik7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZhciBxPXAuY2FsbCh0aGlzLG4pfHx0aGlzO3EuZGltQ2FjaGU9bmV3IHIuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24obil7cmV0dXJuIHAucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7CnJldHVybiB0aGlzLmRpbUNhY2hlLmdldChuKX07bS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRpbUNhY2hlLmNsZWFyKCk7cC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKX07cmV0dXJuIG19KGgoNjApLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg1OSkscj1oKDYyKSxsPWgoNjQpLHA9aCg2Nik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0obil7dGhpcy5jb250ZXh0PW47dGhpcy5tZWFzdXJlcj1uZXcgci5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCk7dGhpcy53cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy53cml0ZXI9bmV3IHAuV3JpdGVyKHRoaXMubWVhc3VyZXIsdGhpcy5jb250ZXh0LHRoaXMud3JhcHBlcil9bS5zdmc9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuZXcgbShuZXcgay5TdmdDb250ZXh0KG4scSx1KSl9O20uY2FudmFzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuQ2FudmFzQ29udGV4dChuLApxLHUpKX07bS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixxLHUsdyxBKXt0aGlzLndyaXRlci53cml0ZShuLHEsdSx3LEEpfTttLnByb3RvdHlwZS5jbGVhck1lYXN1cmVyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLm1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfSgpO2YuVHlwZXNldHRlcj1kfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMuY2FjaGU9e307dGhpcy5jb21wdXRlPWt9aC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe3RoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoayl8fCh0aGlzLmNhY2hlW2tdPXRoaXMuY29tcHV0ZShrKSk7cmV0dXJuIHRoaXMuY2FjaGVba119O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fTtyZXR1cm4gdGhpc307cmV0dXJuIGh9KCk7Zi5DYWNoZT1kfSxmdW5jdGlvbihkLGYpe2YuTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5hcnJheUVxPWZ1bmN0aW9uKGsscil7aWYobnVsbD09Cmt8fG51bGw9PXIpcmV0dXJuIGs9PT1yO2lmKGsubGVuZ3RoIT09ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspaWYoa1tsXSE9PXJbbF0pcmV0dXJuITE7cmV0dXJuITB9O2gub2JqRXE9ZnVuY3Rpb24oayxyKXtpZihudWxsPT1rfHxudWxsPT1yKXJldHVybiBrPT09cjt2YXIgbD1PYmplY3Qua2V5cyhrKS5zb3J0KCkscD1PYmplY3Qua2V5cyhyKS5zb3J0KCksbT1sLm1hcChmdW5jdGlvbihxKXtyZXR1cm4ga1txXX0pLG49cC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHJbcV19KTtyZXR1cm4gaC5hcnJheUVxKGwscCkmJmguYXJyYXlFcShtLG4pfTtoLnN0cmljdEVxPWZ1bmN0aW9uKGsscil7cmV0dXJuIGs9PT1yfTtoLmRlZmF1bHRzPWZ1bmN0aW9uKGspe2Zvcih2YXIgcj1bXSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKylyW2wtMV09YXJndW1lbnRzW2xdO2lmKG51bGw9PWspdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CnZhciBwPU9iamVjdChrKTtyLmZvckVhY2goZnVuY3Rpb24obSl7aWYobnVsbCE9bSlmb3IodmFyIG4gaW4gbSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxuKSYmKHBbbl09bVtuXSl9KTtyZXR1cm4gcH07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7Zi5TdHJpbmdNZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLmNvbWJpbmVXaGl0ZXNwYWNlPWZ1bmN0aW9uKGspe3JldHVybiBrLnJlcGxhY2UoL1sgXHRdKy9nLCIgIil9O2guaXNOb3RFbXB0eVN0cmluZz1mdW5jdGlvbihrKXtyZXR1cm4gayYmIiIhPT1rLnRyaW0oKX07aC50cmltU3RhcnQ9ZnVuY3Rpb24oayxyKXtpZighaylyZXR1cm4gaztrPWsuc3BsaXQoIiIpO3ZhciBsPXI/ZnVuY3Rpb24ocCl7cmV0dXJuIHAuc3BsaXQocikuc29tZShoLmlzTm90RW1wdHlTdHJpbmcpfTpoLmlzTm90RW1wdHlTdHJpbmc7cmV0dXJuIGsucmVkdWNlKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGwocCttKT8KcCttOnB9LCIiKX07aC50cmltRW5kPWZ1bmN0aW9uKGsscil7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtrPWgudHJpbVN0YXJ0KGsuam9pbigiIikscikuc3BsaXQoIiIpO2sucmV2ZXJzZSgpO3JldHVybiBrLmpvaW4oIiIpfTtyZXR1cm4gaH0oKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3RoaXMuV29yZERpdmlkZXJSZWdFeHA9L1xXLzt0aGlzLldoaXRlc3BhY2VSZWdFeHA9L1xzL31oLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihrKXt2YXIgcj10aGlzO3JldHVybiBrLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24obCxwKXtyZXR1cm4gbC5zbGljZSgwLC0xKS5jb25jYXQoci5zaG91bGRDcmVhdGVOZXdUb2tlbihsW2wubGVuZ3RoLTFdLHApKX0sWyIiXSl9O2gucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKGsscil7aWYoIWspcmV0dXJuW3JdO3ZhciBsPWtbay5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpJiYKdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3Qocik/W2srcl06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCl8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHIpP1trLHJdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKXx8dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KHIpP2w9PT1yP1trK3JdOltrLHJdOltrK3JdfTtyZXR1cm4gaH0oKTtmLlRva2VuaXplcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwscik7bC5wcm90b3R5cGUud3JhcD0KZnVuY3Rpb24ocCxtLG4scSl7ZnVuY3Rpb24gdShEKXtyZXR1cm4gci5wcm90b3R5cGUud3JhcC5jYWxsKHcscCxtLEQscSl9dmFyIHc9dGhpczt2b2lkIDA9PT1xJiYocT1JbmZpbml0eSk7aWYoMTxwLnNwbGl0KCJcbiIpLmxlbmd0aCl0aHJvdyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIEE9dShuKTtpZigyPkEubm9MaW5lcylyZXR1cm4gQTtmb3IodmFyIHk9MCx4PTA7eDxsLk5PX1dSQVBfSVRFUkFUSU9OUyYmbj55OysreCl7dmFyIEM9KG4reSkvMixHPXUoQyk7dGhpcy5hcmVTYW1lUmVzdWx0cyhBLEcpPyhuPUMsQT1HKTp5PUN9cmV0dXJuIEF9O2wucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIHAubm9MaW5lcz09PW0ubm9MaW5lcyYmcC50cnVuY2F0ZWRUZXh0PT09bS50cnVuY2F0ZWRUZXh0fTtyZXR1cm4gbH0oaCg2NSkuV3JhcHBlcik7ZC5OT19XUkFQX0lURVJBVElPTlM9CjU7Zi5TaW5nbGVMaW5lV3JhcHBlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMSkscj17dGV4dFJvdGF0aW9uOjAsdGV4dFNoZWFyOjAseEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCJ9O2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSxuKXt0aGlzLl9tZWFzdXJlcj1wO3RoaXMuX3BlbkZhY3Rvcnk9bTt0aGlzLl93cmFwcGVyPW59bC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24ocCl7dGhpcy5fbWVhc3VyZXI9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbihwKXt0aGlzLl93cmFwcGVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24ocCl7dGhpcy5fcGVuRmFjdG9yeT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihwLG0sbixxLHUpe3ZvaWQgMD09PXEmJihxPXt9KTtxPWsuTWV0aG9kcy5kZWZhdWx0cyh7fSxyLHEpO2lmKC0xPT09bC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHEudGV4dFJvdGF0aW9uKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgcm90YXRpb24gLSAiKwpxLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK2wuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9cS50ZXh0U2hlYXImJi04MD5xLnRleHRTaGVhcnx8ODA8cS50ZXh0U2hlYXIpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIitxLnRleHRTaGVhcisiLiBNdXN0IGJlIGJldHdlZW4gLTgwIGFuZCA4MCIpO3ZhciB3PTQ1PE1hdGguYWJzKE1hdGguYWJzKHEudGV4dFJvdGF0aW9uKS05MCksQT13P206bix5PXc/bjptLHg9cS50ZXh0U2hlYXIsQz14Kk1hdGguUEkvMTgwO3c9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt2YXIgRz13Kk1hdGgudGFuKEMpO0E9QS9NYXRoLmNvcyhDKS1NYXRoLmFicyhHKTt2YXIgRD15Kk1hdGguY29zKEMpO3k9ay5TdHJpbmdNZXRob2RzLmNvbWJpbmVXaGl0ZXNwYWNlKHApO3k9KHRoaXMuX3dyYXBwZXI/dGhpcy5fd3JhcHBlci53cmFwKHksdGhpcy5fbWVhc3VyZXIsCkEsRCkud3JhcHBlZFRleHQ6eSkuc3BsaXQoIlxuIik7Qz1sLlhPZmZzZXRGYWN0b3JbcS54QWxpZ25dKkEqTWF0aC5zaW4oQyktbC5ZT2Zmc2V0RmFjdG9yW3EueUFsaWduXSooRC15Lmxlbmd0aCp3KTt4PXEudGV4dFJvdGF0aW9uK3g7c3dpdGNoKHEudGV4dFJvdGF0aW9uKXtjYXNlIDkwOm09W20rQywwXTticmVhaztjYXNlIC05MDptPVstQyxuXTticmVhaztjYXNlIDE4MDptPVttLG4rQ107YnJlYWs7ZGVmYXVsdDptPVswLC1DXX1wPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKHAse3RyYW5zbGF0ZTptLHJvdGF0ZTp4fSx1KTt0aGlzLndyaXRlTGluZXMoeSxwLEEsdyxHLHEueEFsaWduKTtudWxsIT1wLmRlc3Ryb3kmJnAuZGVzdHJveSgpfTtsLnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHAsbSxuLHEsdSx3KXtwLmZvckVhY2goZnVuY3Rpb24oQSx5KXttLndyaXRlKEEsbC5BbmNob3JDb252ZXJ0ZXJbd10sKDA8dT8oeSsxKSp1OnkqdSkrbipsLlhPZmZzZXRGYWN0b3Jbd10sCih5KzEpKnEpfSl9O3JldHVybiBsfSgpO2QuU3VwcG9ydGVkUm90YXRpb249Wy05MCwwLDE4MCw5MF07ZC5BbmNob3JDb252ZXJ0ZXI9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9O2QuWE9mZnNldEZhY3Rvcj17Y2VudGVyOi41LGxlZnQ6MCxyaWdodDoxfTtkLllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH07Zi5Xcml0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9aCg2OSk7ZD1oKDcpO2YuQW5pbWF0b3JzPWQ7ZD1oKDY3KTtmLkF4ZXM9ZDtkPWgoMzcpO2YuQ29tcG9uZW50cz1kO2Q9aCgyMyk7Zi5Db25maWdzPWQ7ZD1oKDgpO2YuRm9ybWF0dGVycz1kO2Q9aCgzMCk7Zi5SZW5kZXJDb250cm9sbGVyPWQ7ZD1oKDM5KTtmLlJlbmRlclBvbGljaWVzPWQ7ZD1oKDMxKTtmLlN5bWJvbEZhY3Rvcmllcz1kO2Q9aCgxMyk7Zi5EaXNwYXRjaGVycz0KZDtkPWgoMTQpO2YuRHJhd2Vycz1kO2Q9aCgyNSk7Zi5JbnRlcmFjdGlvbnM9ZDtkPWgoMTkpO2YuUGxvdHM9ZDtkPWgoMyk7Zi5TY2FsZXM9ZDtkPWgoMCk7Zi5VdGlscz1kO2soaCgyMikpO2Q9aCgyOCk7Zi5UaW1lSW50ZXJ2YWw9ZC5UaW1lSW50ZXJ2YWw7ayhoKDQpKTtrKGgoMjkpKTtrKGgoMzgpKTtkPWgoNjgpO2YudmVyc2lvbj1kLnZlcnNpb247ayhoKDI0KSk7ayhoKDYpKTtrKGgoMTUpKTtrKGgoNDApKTtrKGgoMTYpKTtrKGgoMikpO2soaCgxMSkpO2soaCgxNykpfV0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy9wbG90dGFibGUtaW50ZXJhY3Rpb25zLmpzCnZhciBzZjsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSl7Y29uc3Qgbj1bXTtmb3IoO20mJm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYobi5wdXNoKG0pLG0uYXNzaWduZWRTbG90KW09bS5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihtLnBhcmVudEVsZW1lbnQpbT1tLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBxPW0ucGFyZW50Tm9kZTttPXEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3EuaG9zdDpxIT09bT9xOm51bGx9cmV0dXJuIG59ZnVuY3Rpb24gZihtKXt2YXIgbj1kKG0pO209aDtsZXQgcT1udWxsO2Zvcihjb25zdCB3IG9mIG4pe249UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHcpO2lmKG51bGwhPW4pe3ZhciB1PXcuY2xpZW50V2lkdGgvMjtjb25zdCBBPXcuY2xpZW50SGVpZ2h0LzI7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFt1LEFdKTttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KG0sUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KG4pKTsKbT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFstdSwtQV0pfW49dy5zY3JvbGxMZWZ0O3U9dy5zY3JvbGxUb3A7aWYobnVsbD09PXF8fHc9PT1xKW4tPXcub2Zmc2V0TGVmdCt3LmNsaWVudExlZnQsdS09dy5vZmZzZXRUb3Ardy5jbGllbnRUb3AscT13Lm9mZnNldFBhcmVudDttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKG0sW24sdV0pfXJldHVybiBtfWNvbnN0IGg9WzEsMCwwLDEsMCwwXTtjbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKG0sbil7bT17eDptLHk6bn07bj1mKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bj9tOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKG4sbSl9fWNsYXNzIHIgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGsobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKG0pe2NvbnN0IG49bS5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcT1uW3IuX0RJU1BBVENIRVJfS0VZXTtxfHwocT1uZXcgcihtKSxuW3IuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihtKXtzdXBlcihtKTt0aGlzLl9ldmVudFRhcmdldD1tLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9bltsLl9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IGwobSksbltsLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fVBsb3R0YWJsZS5JbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PQpmdW5jdGlvbihtKXtyZXR1cm4gMDw9bS54JiYwPD1tLnkmJm0ueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJm0ueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBwIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1yLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19Yi5Qb2ludGVySW50ZXJhY3Rpb249cH0pKHNmfHwoc2Y9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LWhlbHBlcnMuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtsZXQgcj1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7ci50aWNrR2VuZXJhdG9yKCk7bGV0IGw9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMociwiYm90dG9tIik7bC5mb3JtYXR0ZXIoYi5zdGVwRm9ybWF0dGVyKTtyZXR1cm57c2NhbGU6cixheGlzOmwsYWNjZXNzb3I6cD0+cC5zdGVwfX1mdW5jdGlvbiBmKCl7bGV0IHI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6cixheGlzOm5ldyBQbG90dGFibGUuQXhlcy5UaW1lKHIsImJvdHRvbSIpLGFjY2Vzc29yOmw9Pmwud2FsbF90aW1lfX1mdW5jdGlvbiBoKCl7bGV0IHI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpyLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMociwiYm90dG9tIiksYWNjZXNzb3I6Yi5yZWxhdGl2ZUFjY2Vzc29yfX1iLlNZTUJPTFNfTElTVD1be2NoYXJhY3RlcjoiXHUyNWZjIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmV9LAp7Y2hhcmFjdGVyOiJcdTI1YzYiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6Ilx1MjViMiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGV9LHtjaGFyYWN0ZXI6Ilx1MjYwNSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3Rhcn0se2NoYXJhY3RlcjoiXHUyNzFhIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO2xldCBrOyhmdW5jdGlvbihyKXtyLlNURVA9InN0ZXAiO3IuUkVMQVRJVkU9InJlbGF0aXZlIjtyLldBTExfVElNRT0id2FsbF90aW1lIn0pKGs9Yi5YVHlwZXx8KGIuWFR5cGU9e30pKTtiLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDtiLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OPTM7Yi5UT09MVElQX1lfUElYRUxfT0ZGU0VUPTIwO2IuVE9PTFRJUF9DSVJDTEVfU0laRT00O2IuTkFOX1NZTUJPTF9TSVpFPQo2O2IubXVsdGlzY2FsZUZvcm1hdHRlcj1mdW5jdGlvbihyKXtyZXR1cm4gbD0+e2xldCBwPU1hdGguYWJzKGwpOzFFLTE1PnAmJihwPTApO3JldHVybigxRTQ8PXA/ZDMuZm9ybWF0KCIuIityKyJ+ZSIpOjA8cCYmLjAxPnA/ZDMuZm9ybWF0KCIuIityKyJ+ZSIpOmQzLmZvcm1hdCgiLiIrcisifmciKSkobCl9fTtiLmNvbXB1dGVEb21haW49ZnVuY3Rpb24ocixsKXtyPXIuZmlsdGVyKG49PmlzRmluaXRlKG4pKTtpZigwPT09ci5sZW5ndGgpcmV0dXJuWy0uMSwxLjFdO2w/KHI9Xy5zb3J0QnkociksbD1kMy5xdWFudGlsZShyLC4wNSkscj1kMy5xdWFudGlsZShyLC45NSkpOihsPWQzLm1pbihyKSxyPWQzLm1heChyKSk7bGV0IHAsbT1yLWw7cD0wPT09bT8xLjEqTWF0aC5hYnMobCkrMS4xOi4yKm07bD1bMDw9bCYmbDxtPy0uMSpyOmwtcCxyK3BdO3JldHVybiBsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGwpLm5pY2UoKS5kb21haW4oKX07Yi5hY2Nlc3Nvcml6ZT1mdW5jdGlvbihyKXtyZXR1cm4gbD0+Cmxbcl19O2Iuc3RlcEZvcm1hdHRlcj1kMy5mb3JtYXQoYC4ke2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7Yi5zdGVwWD1kO2IudGltZUZvcm1hdHRlcj1QbG90dGFibGUuRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtiLndhbGxYPWY7Yi5yZWxhdGl2ZUFjY2Vzc29yPShyLGwscCk9PntpZihudWxsIT1yLnJlbGF0aXZlKXJldHVybiByLnJlbGF0aXZlO2w9cC5kYXRhKCk7cmV0dXJuKCtyLndhbGxfdGltZS0oMDxsLmxlbmd0aD8rbFswXS53YWxsX3RpbWU6MCkpLzM2RTV9O2IucmVsYXRpdmVGb3JtYXR0ZXI9cj0+e2xldCBsPSIiLHA9TWF0aC5mbG9vcihyLzI0KTtyLT0yNCpwO3AmJihsKz1wKyJkICIpO2xldCBtPU1hdGguZmxvb3Iocik7cj02MCooci1tKTtpZihtfHxwKWwrPW0rImggIjtsZXQgbj1NYXRoLmZsb29yKHIpO3I9NjAqKHItbik7aWYobnx8bXx8cClsKz1uKyJtICI7cmV0dXJuIGwrTWF0aC5mbG9vcihyKSsicyJ9O2IucmVsYXRpdmVYPQpoO2IuZ2V0WENvbXBvbmVudHM9ZnVuY3Rpb24ocil7c3dpdGNoKHIpe2Nhc2Ugay5TVEVQOnJldHVybiBkKCk7Y2FzZSBrLldBTExfVElNRTpyZXR1cm4gZigpO2Nhc2Ugay5SRUxBVElWRTpyZXR1cm4gaCgpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgeFR5cGU6ICIrcik7fX19KShzZnx8KHNmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydC9kcmFnWm9vbUludGVyYWN0aW9uLmpzCnZhciB0ZzsKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3RvcihmLGgsayl7c3VwZXIoKTt0aGlzLmVhc2VGbj1kMy5lYXNlQ3ViaWNJbk91dDt0aGlzLl9hbmltYXRpb25UaW1lPTc1MDt0aGlzLnhTY2FsZShmKTt0aGlzLnlTY2FsZShoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuRHJhZzt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLkNsaWNrO3RoaXMuc2V0dXBDYWxsYmFja3MoKTt0aGlzLnVuem9vbU1ldGhvZD1rO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpfSk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSl9aW50ZXJhY3Rpb25TdGFydChmKXt0aGlzLm9uU3RhcnQ9CmZ9aW50ZXJhY3Rpb25FbmQoZil7dGhpcy5vbkVuZD1mfWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgZj0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoaD0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6aH0pO3RoaXMub25TdGFydCgpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoaCxrKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6a30pO3RoaXMuYm94VmlzaWJsZSghMCk7Zj0hMH0pO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoKGgsayk9Pnt0aGlzLmJveFZpc2libGUoITEpO3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6a30pO2lmKGYpdGhpcy56b29tKCk7ZWxzZSB0aGlzLm9uRW5kKCk7Zj0hMX0pO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24ub25Eb3VibGVDbGljayh0aGlzLnVuem9vbS5iaW5kKHRoaXMpKX1hbmltYXRpb25UaW1lKGYpe2lmKG51bGw9PQpmKXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKDA+Zil0aHJvdyBFcnJvcigiYW5pbWF0aW9uVGltZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTt0aGlzLl9hbmltYXRpb25UaW1lPWY7cmV0dXJuIHRoaXN9ZWFzZShmKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGYpdGhyb3cgRXJyb3IoImVhc2UgZnVuY3Rpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7MD09PWYoMCkmJjE9PT1mKDEpfHxQbG90dGFibGUuVXRpbHMuV2luZG93Lndhcm4oIkVhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgZigwKVx4M2RceDNkMCBceDI2XHgyNiBmKDEpXHgzZFx4M2QxLiBCYWQgYmVoYXZpb3IgbWF5IHJlc3VsdC4iKTt0aGlzLmVhc2VGbj1mO3JldHVybiB0aGlzfXpvb20oKXtsZXQgZj10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksaD10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksaz10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCkscj10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7CmYhPT1oJiZrIT09ciYmdGhpcy5pbnRlcnBvbGF0ZVpvb20oZixoLGsscil9dW56b29tKCl7dmFyIGY9dGhpcy54U2NhbGUoKTtmLl9kb21haW5NaW49bnVsbDtmLl9kb21haW5NYXg9bnVsbDtmPWYuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGYpO3RoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKGYpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCFmKTt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpfWludGVycG9sYXRlWm9vbShmLGgsayxyKXtsZXQgbD10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxwPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLG09dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCksbj10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxxPXRoaXMuZWFzZUZuLHU9KHkseCxDKT0+ZDMuaW50ZXJwb2xhdGVOdW1iZXIoeSx4KShxKEMpKTt0aGlzLmlzWm9vbWluZyghMCk7CmxldCB3PURhdGUubm93KCksQT0oKT0+e3ZhciB5PURhdGUubm93KCktdzt5PTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSx5L3RoaXMuX2FuaW1hdGlvblRpbWUpO2xldCB4PXUobCxmLHkpLEM9dShwLGgseSksRz11KG0sayx5KSxEPXUobixyLHkpO3RoaXMueFNjYWxlKCkuZG9tYWluKFt4LENdKTt0aGlzLnlTY2FsZSgpLmRvbWFpbihbRyxEXSk7MT55P1Bsb3R0YWJsZS5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoQSk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTtBKCl9fWIuRHJhZ1pvb21MYXllcj1kfSkodGd8fCh0Zz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Bhblpvb21EcmFnTGF5ZXIuanMKdmFyIHVnOwooZnVuY3Rpb24oYil7bGV0IGQ7KGZ1bmN0aW9uKGgpe2hbaC5OT05FPTBdPSJOT05FIjtoW2guRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciO2hbaC5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKGR8fChkPXt9KSk7Y2xhc3MgZiBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3Vwe2NvbnN0cnVjdG9yKGgsayxyKXtzdXBlcigpO3RoaXMuc3RhdGU9ZC5OT05FO3RoaXMucGFuU3RhcnRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IFBsb3R0YWJsZS5VdGlscy5DYWxsYmFja1NldDt0aGlzLnBhblpvb209bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUGFuWm9vbShoLGspO3RoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihwPT5mLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMucGFuWm9vbS53aGVlbEZpbHRlcih0aGlzLmNhblNjcm9sbFpvb20pO3RoaXMuZHJhZ1pvb21MYXllcj1uZXcgdGcuRHJhZ1pvb21MYXllcihoLAprLHIpO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihwPT4hZi5pc1BhbktleShwKSYmMD09PXAuYnV0dG9uKTt0aGlzLmFwcGVuZCh0aGlzLmRyYWdab29tTGF5ZXIpO2NvbnN0IGw9dGhpcy5vbldoZWVsLmJpbmQodGhpcyk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1QbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbChsKTt0aGlzLnBhblpvb20uYXR0YWNoVG8odGhpcyl9KTt0aGlzLm9uRGV0YWNoKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20oKTt0aGlzLl9tb3VzZURpc3BhdGNoZXImJih0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwobCksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09ZC5OT05FJiYKdGhpcy5zZXRTdGF0ZShkLlBBTk5JTkcpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuUEFOTklORyYmdGhpcy5zZXRTdGF0ZShkLk5PTkUpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09ZC5OT05FJiZ0aGlzLnNldFN0YXRlKGQuRFJBR19aT09NSU5HKX0pO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCk9Pnt0aGlzLnN0YXRlPT1kLkRSQUdfWk9PTUlORyYmdGhpcy5zZXRTdGF0ZShkLk5PTkUpfSl9b25XaGVlbChoLGspe2lmKCF0aGlzLmNhblNjcm9sbFpvb20oaykmJihoPXRoaXMuZWxlbWVudCgpLGguc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpKXt2YXIgcj1oLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgiaGVscCIsITApO3IuYXBwZW5kKCJzcGFuIikudGV4dCgiQWx0ICsgU2Nyb2xsIHRvIFpvb20iKTsKci5vbigiYW5pbWF0aW9uZW5kIiwoKT0+dm9pZCByLnJlbW92ZSgpKX19c3RhdGljIGlzUGFuS2V5KGgpe3JldHVybiEhaC5hbHRLZXl8fCEhaC5zaGlmdEtleX1jYW5TY3JvbGxab29tKGgpe3JldHVybiBoLmFsdEtleX1zZXRTdGF0ZShoKXtpZih0aGlzLnN0YXRlIT1oKXt2YXIgaz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9aDt0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGspKTt0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGgpKTtrPT1kLlBBTk5JTkcmJnRoaXMucGFuRW5kQ2FsbGJhY2suY2FsbENhbGxiYWNrcygpO2g9PWQuUEFOTklORyYmdGhpcy5wYW5TdGFydENhbGxiYWNrLmNhbGxDYWxsYmFja3MoKX19c3RhdGVDbGFzc05hbWUoaCl7c3dpdGNoKGgpe2Nhc2UgZC5QQU5OSU5HOnJldHVybiJwYW5uaW5nIjtjYXNlIGQuRFJBR19aT09NSU5HOnJldHVybiJkcmFnLXpvb21pbmciO2RlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQoaCl7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZChoKX1vblBhbkVuZChoKXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZChoKX1vblNjcm9sbFpvb20oaCl7dGhpcy5wYW5ab29tLm9uWm9vbUVuZChoKX1vbkRyYWdab29tU3RhcnQoaCl7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQoaCl9b25EcmFnWm9vbUVuZChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQoaCl9fQpiLlBhblpvb21EcmFnTGF5ZXI9Zn0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXJkLWhlYWRpbmcvdXRpbC5qcwp2YXIgSGg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0IGg9Zi5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7aWYoIWgpcmV0dXJuIG51bGw7aWYoND09Zi5sZW5ndGgpZm9yKGY9MTszPj1mO2YrKyloW2ZdKz1oW2ZdO3JldHVybltwYXJzZUludChoWzFdLDE2KSxwYXJzZUludChoWzJdLDE2KSxwYXJzZUludChoWzNdLDE2KV19Yi5mb3JtYXREYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBmP2YudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn07Yi5waWNrVGV4dENvbG9yPWZ1bmN0aW9uKGYpe3JldHVybihmPWQoZikpPzEyNTxNYXRoLnJvdW5kKCgyOTkqZlswXSs1ODcqZlsxXSsxMTQqZlsyXSkvMUUzKT8iaW5oZXJpdCI6IiNlZWUiOiJpbmhlcml0In19KShIaHx8KEhoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yYW5nZS1iZWhhdmlvci9pcm9uLXJhbmdlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcj17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZShiKS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKGIpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbihiKXtiPXBhcnNlRmxvYXQoYik7CmlmKCF0aGlzLnN0ZXApcmV0dXJuIGI7Yj1NYXRoLnJvdW5kKChiLXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiAxPnRoaXMuc3RlcD9iLygxL3RoaXMuc3RlcCkrdGhpcy5taW46Yip0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4oYik/dGhpcy5vbGRWYWx1ZTpiO3JldHVybiB0aGlzLnZhbHVlIT09Yn0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItaGVscGVycy5qcwp2YXIgSWg7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgsayxyLGwscCl7dGhpcy5ydW49aDt0aGlzLnRhZz1rO3RoaXMubmFtZT1yO3RoaXMuc2NhbGFyRGF0YT1sO3RoaXMuc3ltYm9sPXB9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YShoKXt0aGlzLnNjYWxhckRhdGE9aH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19Yi5EYXRhU2VyaWVzPWQ7Yi5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lPWZ1bmN0aW9uKGgsayl7cmV0dXJuYCR7a30gKCR7aH0pYH07Y2xhc3MgZntjb25zdHJ1Y3RvcihoKXt0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZT1ofXNjYWxlKGgpe3JldHVybiB0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZS5zY2FsZSh0aGlzLnBhcnNlUnVuTmFtZShoKSl9cGFyc2VSdW5OYW1lKGgpe3JldHVybihoPWgubWF0Y2goL1woKC4qKVwpJC8pKT8KaFsxXToiIn19Yi5EYXRhU2VyaWVzQ29sb3JTY2FsZT1mfSkoSWh8fChJaD17fSkpOwoKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiltb2R1bGUuZXhwb3J0cz1mKCk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZClkZWZpbmUoW10sZik7ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpZz13aW5kb3c7ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpZz1nbG9iYWw7ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKWc9c2VsZjtlbHNlIGc9dGhpcztnLmdyYXBobGliPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7CnZhciBmPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGY7fXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsaWI9cmVxdWlyZSgiLi9saWIiKTttb2R1bGUuZXhwb3J0cz17R3JhcGg6bGliLkdyYXBoLGpzb246cmVxdWlyZSgiLi9saWIvanNvbiIpLGFsZzpyZXF1aXJlKCIuL2xpYi9hbGciKSx2ZXJzaW9uOmxpYi52ZXJzaW9ufX0seyIuL2xpYiI6MTcsIi4vbGliL2FsZyI6OCwiLi9saWIvanNvbiI6MTh9XSwKMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9Y29tcG9uZW50cztmdW5jdGlvbiBjb21wb25lbnRzKGcpe3ZhciB2aXNpdGVkPXt9LGNtcHRzPVtdLGNtcHQ7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtjbXB0LnB1c2godik7Xy5lYWNoKGcuc3VjY2Vzc29ycyh2KSxkZnMpO18uZWFjaChnLnByZWRlY2Vzc29ycyh2KSxkZnMpfV8uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7Y21wdD1bXTtkZnModik7aWYoY21wdC5sZW5ndGgpY21wdHMucHVzaChjbXB0KX0pO3JldHVybiBjbXB0c319LHsiLi4vbG9kYXNoIjoxOX1dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRmcztmdW5jdGlvbiBkZnMoZyx2cyxvcmRlcil7aWYoIV8uaXNBcnJheSh2cykpdnM9Clt2c107dmFyIG5hdmlnYXRpb249KGcuaXNEaXJlY3RlZCgpP2cuc3VjY2Vzc29yczpnLm5laWdoYm9ycykuYmluZChnKTt2YXIgYWNjPVtdLHZpc2l0ZWQ9e307Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKCFnLmhhc05vZGUodikpdGhyb3cgbmV3IEVycm9yKCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6ICIrdik7ZG9EZnMoZyx2LG9yZGVyPT09InBvc3QiLHZpc2l0ZWQsbmF2aWdhdGlvbixhY2MpfSk7cmV0dXJuIGFjY31mdW5jdGlvbiBkb0RmcyhnLHYscG9zdG9yZGVyLHZpc2l0ZWQsbmF2aWdhdGlvbixhY2Mpe2lmKCFfLmhhcyh2aXNpdGVkLHYpKXt2aXNpdGVkW3ZdPXRydWU7aWYoIXBvc3RvcmRlcilhY2MucHVzaCh2KTtfLmVhY2gobmF2aWdhdGlvbih2KSxmdW5jdGlvbih3KXtkb0RmcyhnLHcscG9zdG9yZGVyLHZpc2l0ZWQsbmF2aWdhdGlvbixhY2MpfSk7aWYocG9zdG9yZGVyKWFjYy5wdXNoKHYpfX19LHsiLi4vbG9kYXNoIjoxOX1dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgZGlqa3N0cmE9cmVxdWlyZSgiLi9kaWprc3RyYSIpLF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmFBbGw7ZnVuY3Rpb24gZGlqa3N0cmFBbGwoZyx3ZWlnaHRGdW5jLGVkZ2VGdW5jKXtyZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLGZ1bmN0aW9uKGFjYyx2KXthY2Nbdl09ZGlqa3N0cmEoZyx2LHdlaWdodEZ1bmMsZWRnZUZ1bmMpfSx7fSl9fSx7Ii4uL2xvZGFzaCI6MTksIi4vZGlqa3N0cmEiOjV9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1kaWprc3RyYTt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGRpamtzdHJhKGcsc291cmNlLHdlaWdodEZuLGVkZ2VGbil7cmV0dXJuIHJ1bkRpamtzdHJhKGcsClN0cmluZyhzb3VyY2UpLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GVU5DLGVkZ2VGbnx8ZnVuY3Rpb24odil7cmV0dXJuIGcub3V0RWRnZXModil9KX1mdW5jdGlvbiBydW5EaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHYsdkVudHJ5O3ZhciB1cGRhdGVOZWlnaGJvcnM9ZnVuY3Rpb24oZWRnZSl7dmFyIHc9ZWRnZS52IT09dj9lZGdlLnY6ZWRnZS53LHdFbnRyeT1yZXN1bHRzW3ddLHdlaWdodD13ZWlnaHRGbihlZGdlKSxkaXN0YW5jZT12RW50cnkuZGlzdGFuY2Urd2VpZ2h0O2lmKHdlaWdodDwwKXRocm93IG5ldyBFcnJvcigiZGlqa3N0cmEgZG9lcyBub3QgYWxsb3cgbmVnYXRpdmUgZWRnZSB3ZWlnaHRzLiAiKyJCYWQgZWRnZTogIitlZGdlKyIgV2VpZ2h0OiAiK3dlaWdodCk7aWYoZGlzdGFuY2U8d0VudHJ5LmRpc3RhbmNlKXt3RW50cnkuZGlzdGFuY2U9ZGlzdGFuY2U7d0VudHJ5LnByZWRlY2Vzc29yPQp2O3BxLmRlY3JlYXNlKHcsZGlzdGFuY2UpfX07Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7dmFyIGRpc3RhbmNlPXY9PT1zb3VyY2U/MDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7cmVzdWx0c1t2XT17ZGlzdGFuY2U6ZGlzdGFuY2V9O3BxLmFkZCh2LGRpc3RhbmNlKX0pO3doaWxlKHBxLnNpemUoKT4wKXt2PXBxLnJlbW92ZU1pbigpO3ZFbnRyeT1yZXN1bHRzW3ZdO2lmKHZFbnRyeS5kaXN0YW5jZT09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSlicmVhaztlZGdlRm4odikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpfXJldHVybiByZXN1bHRzfX0seyIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIjoxNSwiLi4vbG9kYXNoIjoxOX1dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHRhcmphbj1yZXF1aXJlKCIuL3RhcmphbiIpO21vZHVsZS5leHBvcnRzPWZpbmRDeWNsZXM7ZnVuY3Rpb24gZmluZEN5Y2xlcyhnKXtyZXR1cm4gXy5maWx0ZXIodGFyamFuKGcpLApmdW5jdGlvbihjbXB0KXtyZXR1cm4gY21wdC5sZW5ndGg+MXx8Y21wdC5sZW5ndGg9PT0xJiZnLmhhc0VkZ2UoY21wdFswXSxjbXB0WzBdKX0pfX0seyIuLi9sb2Rhc2giOjE5LCIuL3RhcmphbiI6MTN9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1mbG95ZFdhcnNoYWxsO3ZhciBERUZBVUxUX1dFSUdIVF9GVU5DPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLHdlaWdodEZuLGVkZ2VGbil7cmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRmxveWRXYXJzaGFsbChnLHdlaWdodEZuLGVkZ2VGbil7dmFyIHJlc3VsdHM9e30sbm9kZXM9Zy5ub2RlcygpO25vZGVzLmZvckVhY2goZnVuY3Rpb24odil7cmVzdWx0c1t2XT0Ke307cmVzdWx0c1t2XVt2XT17ZGlzdGFuY2U6MH07bm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KXtpZih2IT09dylyZXN1bHRzW3ZdW3ddPXtkaXN0YW5jZTpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl9fSk7ZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSl7dmFyIHc9ZWRnZS52PT09dj9lZGdlLnc6ZWRnZS52LGQ9d2VpZ2h0Rm4oZWRnZSk7cmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6ZCxwcmVkZWNlc3Nvcjp2fX0pfSk7bm9kZXMuZm9yRWFjaChmdW5jdGlvbihrKXt2YXIgcm93Sz1yZXN1bHRzW2tdO25vZGVzLmZvckVhY2goZnVuY3Rpb24oaSl7dmFyIHJvd0k9cmVzdWx0c1tpXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGope3ZhciBpaz1yb3dJW2tdO3ZhciBraj1yb3dLW2pdO3ZhciBpaj1yb3dJW2pdO3ZhciBhbHREaXN0YW5jZT1pay5kaXN0YW5jZStrai5kaXN0YW5jZTtpZihhbHREaXN0YW5jZTxpai5kaXN0YW5jZSl7aWouZGlzdGFuY2U9YWx0RGlzdGFuY2U7aWoucHJlZGVjZXNzb3I9CmtqLnByZWRlY2Vzc29yfX0pfSl9KTtyZXR1cm4gcmVzdWx0c319LHsiLi4vbG9kYXNoIjoxOX1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtjb21wb25lbnRzOnJlcXVpcmUoIi4vY29tcG9uZW50cyIpLGRpamtzdHJhOnJlcXVpcmUoIi4vZGlqa3N0cmEiKSxkaWprc3RyYUFsbDpyZXF1aXJlKCIuL2RpamtzdHJhLWFsbCIpLGZpbmRDeWNsZXM6cmVxdWlyZSgiLi9maW5kLWN5Y2xlcyIpLGZsb3lkV2Fyc2hhbGw6cmVxdWlyZSgiLi9mbG95ZC13YXJzaGFsbCIpLGlzQWN5Y2xpYzpyZXF1aXJlKCIuL2lzLWFjeWNsaWMiKSxwb3N0b3JkZXI6cmVxdWlyZSgiLi9wb3N0b3JkZXIiKSxwcmVvcmRlcjpyZXF1aXJlKCIuL3ByZW9yZGVyIikscHJpbTpyZXF1aXJlKCIuL3ByaW0iKSx0YXJqYW46cmVxdWlyZSgiLi90YXJqYW4iKSx0b3Bzb3J0OnJlcXVpcmUoIi4vdG9wc29ydCIpfX0seyIuL2NvbXBvbmVudHMiOjIsIi4vZGlqa3N0cmEiOjUsCiIuL2RpamtzdHJhLWFsbCI6NCwiLi9maW5kLWN5Y2xlcyI6NiwiLi9mbG95ZC13YXJzaGFsbCI6NywiLi9pcy1hY3ljbGljIjo5LCIuL3Bvc3RvcmRlciI6MTAsIi4vcHJlb3JkZXIiOjExLCIuL3ByaW0iOjEyLCIuL3RhcmphbiI6MTMsIi4vdG9wc29ydCI6MTR9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgdG9wc29ydD1yZXF1aXJlKCIuL3RvcHNvcnQiKTttb2R1bGUuZXhwb3J0cz1pc0FjeWNsaWM7ZnVuY3Rpb24gaXNBY3ljbGljKGcpe3RyeXt0b3Bzb3J0KGcpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKXJldHVybiBmYWxzZTt0aHJvdyBlO31yZXR1cm4gdHJ1ZX19LHsiLi90b3Bzb3J0IjoxNH1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cG9zdG9yZGVyO2Z1bmN0aW9uIHBvc3RvcmRlcihnLHZzKXtyZXR1cm4gZGZzKGcsCnZzLCJwb3N0Iil9fSx7Ii4vZGZzIjozfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBkZnM9cmVxdWlyZSgiLi9kZnMiKTttb2R1bGUuZXhwb3J0cz1wcmVvcmRlcjtmdW5jdGlvbiBwcmVvcmRlcihnLHZzKXtyZXR1cm4gZGZzKGcsdnMsInByZSIpfX0seyIuL2RmcyI6M31dLDEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaCIpLFByaW9yaXR5UXVldWU9cmVxdWlyZSgiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSIpO21vZHVsZS5leHBvcnRzPXByaW07ZnVuY3Rpb24gcHJpbShnLHdlaWdodEZ1bmMpe3ZhciByZXN1bHQ9bmV3IEdyYXBoLHBhcmVudHM9e30scHE9bmV3IFByaW9yaXR5UXVldWUsdjtmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSl7dmFyIHc9ZWRnZS52PT09dj9lZGdlLnc6ZWRnZS52LHByaT1wcS5wcmlvcml0eSh3KTtpZihwcmkhPT0KdW5kZWZpbmVkKXt2YXIgZWRnZVdlaWdodD13ZWlnaHRGdW5jKGVkZ2UpO2lmKGVkZ2VXZWlnaHQ8cHJpKXtwYXJlbnRzW3ddPXY7cHEuZGVjcmVhc2UodyxlZGdlV2VpZ2h0KX19fWlmKGcubm9kZUNvdW50KCk9PT0wKXJldHVybiByZXN1bHQ7Xy5lYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtwcS5hZGQodixOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO3Jlc3VsdC5zZXROb2RlKHYpfSk7cHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLDApO3ZhciBpbml0PWZhbHNlO3doaWxlKHBxLnNpemUoKT4wKXt2PXBxLnJlbW92ZU1pbigpO2lmKF8uaGFzKHBhcmVudHMsdikpcmVzdWx0LnNldEVkZ2UodixwYXJlbnRzW3ZdKTtlbHNlIGlmKGluaXQpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiAiK2cpO2Vsc2UgaW5pdD10cnVlO2cubm9kZUVkZ2VzKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0fX0seyIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIjoxNSwKIi4uL2dyYXBoIjoxNiwiLi4vbG9kYXNoIjoxOX1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz10YXJqYW47ZnVuY3Rpb24gdGFyamFuKGcpe3ZhciBpbmRleD0wLHN0YWNrPVtdLHZpc2l0ZWQ9e30scmVzdWx0cz1bXTtmdW5jdGlvbiBkZnModil7dmFyIGVudHJ5PXZpc2l0ZWRbdl09e29uU3RhY2s6dHJ1ZSxsb3dsaW5rOmluZGV4LGluZGV4OmluZGV4Kyt9O3N0YWNrLnB1c2godik7Zy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odyl7aWYoIV8uaGFzKHZpc2l0ZWQsdykpe2Rmcyh3KTtlbnRyeS5sb3dsaW5rPU1hdGgubWluKGVudHJ5Lmxvd2xpbmssdmlzaXRlZFt3XS5sb3dsaW5rKX1lbHNlIGlmKHZpc2l0ZWRbd10ub25TdGFjayllbnRyeS5sb3dsaW5rPU1hdGgubWluKGVudHJ5Lmxvd2xpbmssdmlzaXRlZFt3XS5pbmRleCl9KTtpZihlbnRyeS5sb3dsaW5rPT09ZW50cnkuaW5kZXgpe3ZhciBjbXB0PQpbXSx3O2Rve3c9c3RhY2sucG9wKCk7dmlzaXRlZFt3XS5vblN0YWNrPWZhbHNlO2NtcHQucHVzaCh3KX13aGlsZSh2IT09dyk7cmVzdWx0cy5wdXNoKGNtcHQpfX1nLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KXtpZighXy5oYXModmlzaXRlZCx2KSlkZnModil9KTtyZXR1cm4gcmVzdWx0c319LHsiLi4vbG9kYXNoIjoxOX1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz10b3Bzb3J0O3RvcHNvcnQuQ3ljbGVFeGNlcHRpb249Q3ljbGVFeGNlcHRpb247ZnVuY3Rpb24gdG9wc29ydChnKXt2YXIgdmlzaXRlZD17fSxzdGFjaz17fSxyZXN1bHRzPVtdO2Z1bmN0aW9uIHZpc2l0KG5vZGUpe2lmKF8uaGFzKHN0YWNrLG5vZGUpKXRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbjtpZighXy5oYXModmlzaXRlZCxub2RlKSl7c3RhY2tbbm9kZV09dHJ1ZTt2aXNpdGVkW25vZGVdPXRydWU7Xy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLAp2aXNpdCk7ZGVsZXRlIHN0YWNrW25vZGVdO3Jlc3VsdHMucHVzaChub2RlKX19Xy5lYWNoKGcuc2lua3MoKSx2aXNpdCk7aWYoXy5zaXplKHZpc2l0ZWQpIT09Zy5ub2RlQ291bnQoKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gQ3ljbGVFeGNlcHRpb24oKXt9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9UHJpb3JpdHlRdWV1ZTtmdW5jdGlvbiBQcmlvcml0eVF1ZXVlKCl7dGhpcy5fYXJyPVtdO3RoaXMuX2tleUluZGljZXM9e319UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubGVuZ3RofTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHgua2V5fSl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmhhcz0KZnVuY3Rpb24oa2V5KXtyZXR1cm4gXy5oYXModGhpcy5fa2V5SW5kaWNlcyxrZXkpfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5wcmlvcml0eT1mdW5jdGlvbihrZXkpe3ZhciBpbmRleD10aGlzLl9rZXlJbmRpY2VzW2tleV07aWYoaW5kZXghPT11bmRlZmluZWQpcmV0dXJuIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2lmKHRoaXMuc2l6ZSgpPT09MCl0aHJvdyBuZXcgRXJyb3IoIlF1ZXVlIHVuZGVyZmxvdyIpO3JldHVybiB0aGlzLl9hcnJbMF0ua2V5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oa2V5LHByaW9yaXR5KXt2YXIga2V5SW5kaWNlcz10aGlzLl9rZXlJbmRpY2VzO2tleT1TdHJpbmcoa2V5KTtpZighXy5oYXMoa2V5SW5kaWNlcyxrZXkpKXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIgaW5kZXg9YXJyLmxlbmd0aDtrZXlJbmRpY2VzW2tleV09aW5kZXg7YXJyLnB1c2goe2tleTprZXksCnByaW9yaXR5OnByaW9yaXR5fSk7dGhpcy5fZGVjcmVhc2UoaW5kZXgpO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluPWZ1bmN0aW9uKCl7dGhpcy5fc3dhcCgwLHRoaXMuX2Fyci5sZW5ndGgtMSk7dmFyIG1pbj10aGlzLl9hcnIucG9wKCk7ZGVsZXRlIHRoaXMuX2tleUluZGljZXNbbWluLmtleV07dGhpcy5faGVhcGlmeSgwKTtyZXR1cm4gbWluLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2U9ZnVuY3Rpb24oa2V5LHByaW9yaXR5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKHByaW9yaXR5PnRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkpdGhyb3cgbmV3IEVycm9yKCJOZXcgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcHJpb3JpdHkuICIrIktleTogIitrZXkrIiBPbGQ6ICIrdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSsiIE5ldzogIitwcmlvcml0eSk7dGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eT0KcHJpb3JpdHk7dGhpcy5fZGVjcmVhc2UoaW5kZXgpfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeT1mdW5jdGlvbihpKXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIgbD0yKmkscj1sKzEsbGFyZ2VzdD1pO2lmKGw8YXJyLmxlbmd0aCl7bGFyZ2VzdD1hcnJbbF0ucHJpb3JpdHk8YXJyW2xhcmdlc3RdLnByaW9yaXR5P2w6bGFyZ2VzdDtpZihyPGFyci5sZW5ndGgpbGFyZ2VzdD1hcnJbcl0ucHJpb3JpdHk8YXJyW2xhcmdlc3RdLnByaW9yaXR5P3I6bGFyZ2VzdDtpZihsYXJnZXN0IT09aSl7dGhpcy5fc3dhcChpLGxhcmdlc3QpO3RoaXMuX2hlYXBpZnkobGFyZ2VzdCl9fX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2RlY3JlYXNlPWZ1bmN0aW9uKGluZGV4KXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIgcHJpb3JpdHk9YXJyW2luZGV4XS5wcmlvcml0eTt2YXIgcGFyZW50O3doaWxlKGluZGV4IT09MCl7cGFyZW50PWluZGV4Pj4xO2lmKGFycltwYXJlbnRdLnByaW9yaXR5PHByaW9yaXR5KWJyZWFrOwp0aGlzLl9zd2FwKGluZGV4LHBhcmVudCk7aW5kZXg9cGFyZW50fX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX3N3YXA9ZnVuY3Rpb24oaSxqKXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIga2V5SW5kaWNlcz10aGlzLl9rZXlJbmRpY2VzO3ZhciBvcmlnQXJyST1hcnJbaV07dmFyIG9yaWdBcnJKPWFycltqXTthcnJbaV09b3JpZ0Fycko7YXJyW2pdPW9yaWdBcnJJO2tleUluZGljZXNbb3JpZ0Fyckoua2V5XT1pO2tleUluZGljZXNbb3JpZ0Fyckkua2V5XT1qfX0seyIuLi9sb2Rhc2giOjE5fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9R3JhcGg7dmFyIERFRkFVTFRfRURHRV9OQU1FPSJceDAwIixHUkFQSF9OT0RFPSJceDAwIixFREdFX0tFWV9ERUxJTT0iXHUwMDAxIjtmdW5jdGlvbiBHcmFwaChvcHRzKXt0aGlzLl9pc0RpcmVjdGVkPV8uaGFzKG9wdHMsImRpcmVjdGVkIik/b3B0cy5kaXJlY3RlZDoKdHJ1ZTt0aGlzLl9pc011bHRpZ3JhcGg9Xy5oYXMob3B0cywibXVsdGlncmFwaCIpP29wdHMubXVsdGlncmFwaDpmYWxzZTt0aGlzLl9pc0NvbXBvdW5kPV8uaGFzKG9wdHMsImNvbXBvdW5kIik/b3B0cy5jb21wb3VuZDpmYWxzZTt0aGlzLl9sYWJlbD11bmRlZmluZWQ7dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49Xy5jb25zdGFudCh1bmRlZmluZWQpO3RoaXMuX25vZGVzPXt9O2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3BhcmVudD17fTt0aGlzLl9jaGlsZHJlbj17fTt0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXT17fX10aGlzLl9pbj17fTt0aGlzLl9wcmVkcz17fTt0aGlzLl9vdXQ9e307dGhpcy5fc3Vjcz17fTt0aGlzLl9lZGdlT2Jqcz17fTt0aGlzLl9lZGdlTGFiZWxzPXt9fUdyYXBoLnByb3RvdHlwZS5fbm9kZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQ9MDtHcmFwaC5wcm90b3R5cGUuaXNEaXJlY3RlZD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEaXJlY3RlZH07R3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc011bHRpZ3JhcGh9O0dyYXBoLnByb3RvdHlwZS5pc0NvbXBvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ29tcG91bmR9O0dyYXBoLnByb3RvdHlwZS5zZXRHcmFwaD1mdW5jdGlvbihsYWJlbCl7dGhpcy5fbGFiZWw9bGFiZWw7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH07R3JhcGgucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWw9ZnVuY3Rpb24obmV3RGVmYXVsdCl7aWYoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSluZXdEZWZhdWx0PV8uY29uc3RhbnQobmV3RGVmYXVsdCk7dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPW5ld0RlZmF1bHQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ub2RlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUNvdW50fTsKR3JhcGgucHJvdG90eXBlLm5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIF8ua2V5cyh0aGlzLl9ub2Rlcyl9O0dyYXBoLnByb3RvdHlwZS5zb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBfLmlzRW1wdHkoc2VsZi5faW5bdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zaW5rcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX291dFt2XSl9KX07R3JhcGgucHJvdG90eXBlLnNldE5vZGVzPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgYXJncz1hcmd1bWVudHM7dmFyIHNlbGY9dGhpcztfLmVhY2godnMsZnVuY3Rpb24odil7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldE5vZGUodix2YWx1ZSk7ZWxzZSBzZWxmLnNldE5vZGUodil9KTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldE5vZGU9CmZ1bmN0aW9uKHYsdmFsdWUpe2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXtpZihhcmd1bWVudHMubGVuZ3RoPjEpdGhpcy5fbm9kZXNbdl09dmFsdWU7cmV0dXJuIHRoaXN9dGhpcy5fbm9kZXNbdl09YXJndW1lbnRzLmxlbmd0aD4xP3ZhbHVlOnRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnRbdl09R1JBUEhfTk9ERTt0aGlzLl9jaGlsZHJlblt2XT17fTt0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXVt2XT10cnVlfXRoaXMuX2luW3ZdPXt9O3RoaXMuX3ByZWRzW3ZdPXt9O3RoaXMuX291dFt2XT17fTt0aGlzLl9zdWNzW3ZdPXt9OysrdGhpcy5fbm9kZUNvdW50O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gdGhpcy5fbm9kZXNbdl19O0dyYXBoLnByb3RvdHlwZS5oYXNOb2RlPWZ1bmN0aW9uKHYpe3JldHVybiBfLmhhcyh0aGlzLl9ub2Rlcyx2KX07R3JhcGgucHJvdG90eXBlLnJlbW92ZU5vZGU9CmZ1bmN0aW9uKHYpe3ZhciBzZWxmPXRoaXM7aWYoXy5oYXModGhpcy5fbm9kZXMsdikpe3ZhciByZW1vdmVFZGdlPWZ1bmN0aW9uKGUpe3NlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSl9O2RlbGV0ZSB0aGlzLl9ub2Rlc1t2XTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtkZWxldGUgdGhpcy5fcGFyZW50W3ZdO18uZWFjaCh0aGlzLmNoaWxkcmVuKHYpLGZ1bmN0aW9uKGNoaWxkKXtzZWxmLnNldFBhcmVudChjaGlsZCl9KTtkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl19Xy5lYWNoKF8ua2V5cyh0aGlzLl9pblt2XSkscmVtb3ZlRWRnZSk7ZGVsZXRlIHRoaXMuX2luW3ZdO2RlbGV0ZSB0aGlzLl9wcmVkc1t2XTtfLmVhY2goXy5rZXlzKHRoaXMuX291dFt2XSkscmVtb3ZlRWRnZSk7ZGVsZXRlIHRoaXMuX291dFt2XTtkZWxldGUgdGhpcy5fc3Vjc1t2XTstLXRoaXMuX25vZGVDb3VudH1yZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldFBhcmVudD0KZnVuY3Rpb24odixwYXJlbnQpe2lmKCF0aGlzLl9pc0NvbXBvdW5kKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGgiKTtpZihfLmlzVW5kZWZpbmVkKHBhcmVudCkpcGFyZW50PUdSQVBIX05PREU7ZWxzZXtwYXJlbnQrPSIiO2Zvcih2YXIgYW5jZXN0b3I9cGFyZW50OyFfLmlzVW5kZWZpbmVkKGFuY2VzdG9yKTthbmNlc3Rvcj10aGlzLnBhcmVudChhbmNlc3RvcikpaWYoYW5jZXN0b3I9PT12KXRocm93IG5ldyBFcnJvcigiU2V0dGluZyAiK3BhcmVudCsiIGFzIHBhcmVudCBvZiAiK3YrIiB3b3VsZCBjcmVhdGUgYSBjeWNsZSIpO3RoaXMuc2V0Tm9kZShwYXJlbnQpfXRoaXMuc2V0Tm9kZSh2KTt0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTt0aGlzLl9wYXJlbnRbdl09cGFyZW50O3RoaXMuX2NoaWxkcmVuW3BhcmVudF1bdl09dHJ1ZTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdD0KZnVuY3Rpb24odil7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt2XV1bdl19O0dyYXBoLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24odil7aWYodGhpcy5faXNDb21wb3VuZCl7dmFyIHBhcmVudD10aGlzLl9wYXJlbnRbdl07aWYocGFyZW50IT09R1JBUEhfTk9ERSlyZXR1cm4gcGFyZW50fX07R3JhcGgucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKHYpe2lmKF8uaXNVbmRlZmluZWQodikpdj1HUkFQSF9OT0RFO2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBjaGlsZHJlbj10aGlzLl9jaGlsZHJlblt2XTtpZihjaGlsZHJlbilyZXR1cm4gXy5rZXlzKGNoaWxkcmVuKX1lbHNlIGlmKHY9PT1HUkFQSF9OT0RFKXJldHVybiB0aGlzLm5vZGVzKCk7ZWxzZSBpZih0aGlzLmhhc05vZGUodikpcmV0dXJuW119O0dyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnM9ZnVuY3Rpb24odil7dmFyIHByZWRzVj10aGlzLl9wcmVkc1t2XTtpZihwcmVkc1YpcmV0dXJuIF8ua2V5cyhwcmVkc1YpfTsKR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnM9ZnVuY3Rpb24odil7dmFyIHN1Y3NWPXRoaXMuX3N1Y3Nbdl07aWYoc3Vjc1YpcmV0dXJuIF8ua2V5cyhzdWNzVil9O0dyYXBoLnByb3RvdHlwZS5uZWlnaGJvcnM9ZnVuY3Rpb24odil7dmFyIHByZWRzPXRoaXMucHJlZGVjZXNzb3JzKHYpO2lmKHByZWRzKXJldHVybiBfLnVuaW9uKHByZWRzLHRoaXMuc3VjY2Vzc29ycyh2KSl9O0dyYXBoLnByb3RvdHlwZS5pc0xlYWY9ZnVuY3Rpb24odil7dmFyIG5laWdoYm9ycztpZih0aGlzLmlzRGlyZWN0ZWQoKSluZWlnaGJvcnM9dGhpcy5zdWNjZXNzb3JzKHYpO2Vsc2UgbmVpZ2hib3JzPXRoaXMubmVpZ2hib3JzKHYpO3JldHVybiBuZWlnaGJvcnMubGVuZ3RoPT09MH07R3JhcGgucHJvdG90eXBlLmZpbHRlck5vZGVzPWZ1bmN0aW9uKGZpbHRlcil7dmFyIGNvcHk9bmV3IHRoaXMuY29uc3RydWN0b3Ioe2RpcmVjdGVkOnRoaXMuX2lzRGlyZWN0ZWQsbXVsdGlncmFwaDp0aGlzLl9pc011bHRpZ3JhcGgsCmNvbXBvdW5kOnRoaXMuX2lzQ29tcG91bmR9KTtjb3B5LnNldEdyYXBoKHRoaXMuZ3JhcGgoKSk7dmFyIHNlbGY9dGhpcztfLmVhY2godGhpcy5fbm9kZXMsZnVuY3Rpb24odmFsdWUsdil7aWYoZmlsdGVyKHYpKWNvcHkuc2V0Tm9kZSh2LHZhbHVlKX0pO18uZWFjaCh0aGlzLl9lZGdlT2JqcyxmdW5jdGlvbihlKXtpZihjb3B5Lmhhc05vZGUoZS52KSYmY29weS5oYXNOb2RlKGUudykpY29weS5zZXRFZGdlKGUsc2VsZi5lZGdlKGUpKX0pO3ZhciBwYXJlbnRzPXt9O2Z1bmN0aW9uIGZpbmRQYXJlbnQodil7dmFyIHBhcmVudD1zZWxmLnBhcmVudCh2KTtpZihwYXJlbnQ9PT11bmRlZmluZWR8fGNvcHkuaGFzTm9kZShwYXJlbnQpKXtwYXJlbnRzW3ZdPXBhcmVudDtyZXR1cm4gcGFyZW50fWVsc2UgaWYocGFyZW50IGluIHBhcmVudHMpcmV0dXJuIHBhcmVudHNbcGFyZW50XTtlbHNlIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCl9aWYodGhpcy5faXNDb21wb3VuZClfLmVhY2goY29weS5ub2RlcygpLApmdW5jdGlvbih2KXtjb3B5LnNldFBhcmVudCh2LGZpbmRQYXJlbnQodikpfSk7cmV0dXJuIGNvcHl9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0RWRnZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VDb3VudH07R3JhcGgucHJvdG90eXBlLmVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKX07R3JhcGgucHJvdG90eXBlLnNldFBhdGg9ZnVuY3Rpb24odnMsdmFsdWUpe3ZhciBzZWxmPXRoaXMsYXJncz1hcmd1bWVudHM7Xy5yZWR1Y2UodnMsZnVuY3Rpb24odix3KXtpZihhcmdzLmxlbmd0aD4xKXNlbGYuc2V0RWRnZSh2LHcsdmFsdWUpO2Vsc2Ugc2VsZi5zZXRFZGdlKHYsCncpO3JldHVybiB3fSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRFZGdlPWZ1bmN0aW9uKCl7dmFyIHYsdyxuYW1lLHZhbHVlLHZhbHVlU3BlY2lmaWVkPWZhbHNlLGFyZzA9YXJndW1lbnRzWzBdO2lmKHR5cGVvZiBhcmcwPT09Im9iamVjdCImJmFyZzAhPT1udWxsJiYidiJpbiBhcmcwKXt2PWFyZzAudjt3PWFyZzAudztuYW1lPWFyZzAubmFtZTtpZihhcmd1bWVudHMubGVuZ3RoPT09Mil7dmFsdWU9YXJndW1lbnRzWzFdO3ZhbHVlU3BlY2lmaWVkPXRydWV9fWVsc2V7dj1hcmcwO3c9YXJndW1lbnRzWzFdO25hbWU9YXJndW1lbnRzWzNdO2lmKGFyZ3VtZW50cy5sZW5ndGg+Mil7dmFsdWU9YXJndW1lbnRzWzJdO3ZhbHVlU3BlY2lmaWVkPXRydWV9fXY9IiIrdjt3PSIiK3c7aWYoIV8uaXNVbmRlZmluZWQobmFtZSkpbmFtZT0iIituYW1lO3ZhciBlPWVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtpZihfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLAplKSl7aWYodmFsdWVTcGVjaWZpZWQpdGhpcy5fZWRnZUxhYmVsc1tlXT12YWx1ZTtyZXR1cm4gdGhpc31pZighXy5pc1VuZGVmaW5lZChuYW1lKSYmIXRoaXMuX2lzTXVsdGlncmFwaCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoIFx4M2QgZmFsc2UiKTt0aGlzLnNldE5vZGUodik7dGhpcy5zZXROb2RlKHcpO3RoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWVTcGVjaWZpZWQ/dmFsdWU6dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsdyxuYW1lKTt2YXIgZWRnZU9iaj1lZGdlQXJnc1RvT2JqKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3Y9ZWRnZU9iai52O3c9ZWRnZU9iai53O09iamVjdC5mcmVlemUoZWRnZU9iaik7dGhpcy5fZWRnZU9ianNbZV09ZWRnZU9iajtpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9zdWNzW3ZdLHcpO3RoaXMuX2luW3ddW2VdPQplZGdlT2JqO3RoaXMuX291dFt2XVtlXT1lZGdlT2JqO3RoaXMuX2VkZ2VDb3VudCsrO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/ZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtyZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXX07R3JhcGgucHJvdG90eXBlLmhhc0VkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsZSl9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT8KZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKSxlZGdlPXRoaXMuX2VkZ2VPYmpzW2VdO2lmKGVkZ2Upe3Y9ZWRnZS52O3c9ZWRnZS53O2RlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2VdO2RlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tlXTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3ByZWRzW3ddLHYpO2RlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSx3KTtkZWxldGUgdGhpcy5faW5bd11bZV07ZGVsZXRlIHRoaXMuX291dFt2XVtlXTt0aGlzLl9lZGdlQ291bnQtLX1yZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmluRWRnZXM9ZnVuY3Rpb24odix1KXt2YXIgaW5WPXRoaXMuX2luW3ZdO2lmKGluVil7dmFyIGVkZ2VzPV8udmFsdWVzKGluVik7aWYoIXUpcmV0dXJuIGVkZ2VzO3JldHVybiBfLmZpbHRlcihlZGdlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZWRnZS52PT09CnV9KX19O0dyYXBoLnByb3RvdHlwZS5vdXRFZGdlcz1mdW5jdGlvbih2LHcpe3ZhciBvdXRWPXRoaXMuX291dFt2XTtpZihvdXRWKXt2YXIgZWRnZXM9Xy52YWx1ZXMob3V0Vik7aWYoIXcpcmV0dXJuIGVkZ2VzO3JldHVybiBfLmZpbHRlcihlZGdlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZWRnZS53PT09d30pfX07R3JhcGgucHJvdG90eXBlLm5vZGVFZGdlcz1mdW5jdGlvbih2LHcpe3ZhciBpbkVkZ2VzPXRoaXMuaW5FZGdlcyh2LHcpO2lmKGluRWRnZXMpcmV0dXJuIGluRWRnZXMuY29uY2F0KHRoaXMub3V0RWRnZXModix3KSl9O2Z1bmN0aW9uIGluY3JlbWVudE9ySW5pdEVudHJ5KG1hcCxrKXtpZihtYXBba10pbWFwW2tdKys7ZWxzZSBtYXBba109MX1mdW5jdGlvbiBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KG1hcCxrKXtpZighLS1tYXBba10pZGVsZXRlIG1hcFtrXX1mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCx2Xyx3XyxuYW1lKXt2YXIgdj0iIit2Xzt2YXIgdz0KIiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gditFREdFX0tFWV9ERUxJTSt3K0VER0VfS0VZX0RFTElNKyhfLmlzVW5kZWZpbmVkKG5hbWUpP0RFRkFVTFRfRURHRV9OQU1FOm5hbWUpfWZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCx2Xyx3XyxuYW1lKXt2YXIgdj0iIit2Xzt2YXIgdz0iIit3XztpZighaXNEaXJlY3RlZCYmdj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXZhciBlZGdlT2JqPXt2OnYsdzp3fTtpZihuYW1lKWVkZ2VPYmoubmFtZT1uYW1lO3JldHVybiBlZGdlT2JqfWZ1bmN0aW9uIGVkZ2VPYmpUb0lkKGlzRGlyZWN0ZWQsZWRnZU9iail7cmV0dXJuIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmoudixlZGdlT2JqLncsZWRnZU9iai5uYW1lKX19LHsiLi9sb2Rhc2giOjE5fV0sMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtHcmFwaDpyZXF1aXJlKCIuL2dyYXBoIiksCnZlcnNpb246cmVxdWlyZSgiLi92ZXJzaW9uIil9fSx7Ii4vZ3JhcGgiOjE2LCIuL3ZlcnNpb24iOjIwfV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaCIpO21vZHVsZS5leHBvcnRzPXt3cml0ZTp3cml0ZSxyZWFkOnJlYWR9O2Z1bmN0aW9uIHdyaXRlKGcpe3ZhciBqc29uPXtvcHRpb25zOntkaXJlY3RlZDpnLmlzRGlyZWN0ZWQoKSxtdWx0aWdyYXBoOmcuaXNNdWx0aWdyYXBoKCksY29tcG91bmQ6Zy5pc0NvbXBvdW5kKCl9LG5vZGVzOndyaXRlTm9kZXMoZyksZWRnZXM6d3JpdGVFZGdlcyhnKX07aWYoIV8uaXNVbmRlZmluZWQoZy5ncmFwaCgpKSlqc29uLnZhbHVlPV8uY2xvbmUoZy5ncmFwaCgpKTtyZXR1cm4ganNvbn1mdW5jdGlvbiB3cml0ZU5vZGVzKGcpe3JldHVybiBfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGVWYWx1ZT1nLm5vZGUodikscGFyZW50PQpnLnBhcmVudCh2KSxub2RlPXt2OnZ9O2lmKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpbm9kZS52YWx1ZT1ub2RlVmFsdWU7aWYoIV8uaXNVbmRlZmluZWQocGFyZW50KSlub2RlLnBhcmVudD1wYXJlbnQ7cmV0dXJuIG5vZGV9KX1mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpe3JldHVybiBfLm1hcChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2VWYWx1ZT1nLmVkZ2UoZSksZWRnZT17djplLnYsdzplLnd9O2lmKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpZWRnZS5uYW1lPWUubmFtZTtpZighXy5pc1VuZGVmaW5lZChlZGdlVmFsdWUpKWVkZ2UudmFsdWU9ZWRnZVZhbHVlO3JldHVybiBlZGdlfSl9ZnVuY3Rpb24gcmVhZChqc29uKXt2YXIgZz0obmV3IEdyYXBoKGpzb24ub3B0aW9ucykpLnNldEdyYXBoKGpzb24udmFsdWUpO18uZWFjaChqc29uLm5vZGVzLGZ1bmN0aW9uKGVudHJ5KXtnLnNldE5vZGUoZW50cnkudixlbnRyeS52YWx1ZSk7aWYoZW50cnkucGFyZW50KWcuc2V0UGFyZW50KGVudHJ5LnYsCmVudHJ5LnBhcmVudCl9KTtfLmVhY2goanNvbi5lZGdlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXRFZGdlKHt2OmVudHJ5LnYsdzplbnRyeS53LG5hbWU6ZW50cnkubmFtZX0sZW50cnkudmFsdWUpfSk7cmV0dXJuIGd9fSx7Ii4vZ3JhcGgiOjE2LCIuL2xvZGFzaCI6MTl9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxvZGFzaDtpZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2xvZGFzaD1yZXF1aXJlKCJsb2Rhc2giKX1jYXRjaChlKXt9aWYoIWxvZGFzaClsb2Rhc2g9d2luZG93Ll87bW9kdWxlLmV4cG9ydHM9bG9kYXNofSx7ImxvZGFzaCI6dW5kZWZpbmVkfV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPSIyLjEuNSJ9LHt9XX0se30sWzFdKSgxKX0pOwooZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKW1vZHVsZS5leHBvcnRzPWYoKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxmKTtlbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIilnPXdpbmRvdztlbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT0idW5kZWZpbmVkIilnPWdsb2JhbDtlbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpZz1zZWxmO2Vsc2UgZz10aGlzO2cuZGFncmU9ZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj0KbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZjt9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e2dyYXBobGliOnJlcXVpcmUoIi4vbGliL2dyYXBobGliIiksbGF5b3V0OnJlcXVpcmUoIi4vbGliL2xheW91dCIpLGRlYnVnOnJlcXVpcmUoIi4vbGliL2RlYnVnIiksdXRpbDp7dGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikudGltZSxub3RpbWU6cmVxdWlyZSgiLi9saWIvdXRpbCIpLm5vdGltZX0sCnZlcnNpb246cmVxdWlyZSgiLi9saWIvdmVyc2lvbiIpfX0seyIuL2xpYi9kZWJ1ZyI6NiwiLi9saWIvZ3JhcGhsaWIiOjcsIi4vbGliL2xheW91dCI6OSwiLi9saWIvdXRpbCI6MjksIi4vbGliL3ZlcnNpb24iOjMwfV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxncmVlZHlGQVM9cmVxdWlyZSgiLi9ncmVlZHktZmFzIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sdW5kbzp1bmRvfTtmdW5jdGlvbiBydW4oZyl7dmFyIGZhcz1nLmdyYXBoKCkuYWN5Y2xpY2VyPT09ImdyZWVkeSI/Z3JlZWR5RkFTKGcsd2VpZ2h0Rm4oZykpOmRmc0ZBUyhnKTtfLmZvckVhY2goZmFzLGZ1bmN0aW9uKGUpe3ZhciBsYWJlbD1nLmVkZ2UoZSk7Zy5yZW1vdmVFZGdlKGUpO2xhYmVsLmZvcndhcmROYW1lPWUubmFtZTtsYWJlbC5yZXZlcnNlZD10cnVlO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLF8udW5pcXVlSWQoInJldiIpKX0pO2Z1bmN0aW9uIHdlaWdodEZuKGcpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZy5lZGdlKGUpLndlaWdodH19Cn1mdW5jdGlvbiBkZnNGQVMoZyl7dmFyIGZhcz1bXSxzdGFjaz17fSx2aXNpdGVkPXt9O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7c3RhY2tbdl09dHJ1ZTtfLmZvckVhY2goZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtpZihfLmhhcyhzdGFjayxlLncpKWZhcy5wdXNoKGUpO2Vsc2UgZGZzKGUudyl9KTtkZWxldGUgc3RhY2tbdl19Xy5mb3JFYWNoKGcubm9kZXMoKSxkZnMpO3JldHVybiBmYXN9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBsYWJlbD1nLmVkZ2UoZSk7aWYobGFiZWwucmV2ZXJzZWQpe2cucmVtb3ZlRWRnZShlKTt2YXIgZm9yd2FyZE5hbWU9bGFiZWwuZm9yd2FyZE5hbWU7ZGVsZXRlIGxhYmVsLnJldmVyc2VkO2RlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtnLnNldEVkZ2UoZS53LGUudixsYWJlbCxmb3J3YXJkTmFtZSl9fSl9fSx7Ii4vZ3JlZWR5LWZhcyI6OCwKIi4vbG9kYXNoIjoxMH1dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1hZGRCb3JkZXJTZWdtZW50cztmdW5jdGlvbiBhZGRCb3JkZXJTZWdtZW50cyhnKXtmdW5jdGlvbiBkZnModil7dmFyIGNoaWxkcmVuPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodik7aWYoY2hpbGRyZW4ubGVuZ3RoKV8uZm9yRWFjaChjaGlsZHJlbixkZnMpO2lmKF8uaGFzKG5vZGUsIm1pblJhbmsiKSl7bm9kZS5ib3JkZXJMZWZ0PVtdO25vZGUuYm9yZGVyUmlnaHQ9W107Zm9yKHZhciByYW5rPW5vZGUubWluUmFuayxtYXhSYW5rPW5vZGUubWF4UmFuaysxO3Jhbms8bWF4UmFuazsrK3Jhbmspe2FkZEJvcmRlck5vZGUoZywiYm9yZGVyTGVmdCIsIl9ibCIsdixub2RlLHJhbmspO2FkZEJvcmRlck5vZGUoZywiYm9yZGVyUmlnaHQiLCJfYnIiLHYsbm9kZSxyYW5rKX19fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksCmRmcyl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByb3AscHJlZml4LHNnLHNnTm9kZSxyYW5rKXt2YXIgbGFiZWw9e3dpZHRoOjAsaGVpZ2h0OjAscmFuazpyYW5rLGJvcmRlclR5cGU6cHJvcH0scHJldj1zZ05vZGVbcHJvcF1bcmFuay0xXSxjdXJyPXV0aWwuYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbGFiZWwscHJlZml4KTtzZ05vZGVbcHJvcF1bcmFua109Y3VycjtnLnNldFBhcmVudChjdXJyLHNnKTtpZihwcmV2KWcuc2V0RWRnZShwcmV2LGN1cnIse3dlaWdodDoxfSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9e2FkanVzdDphZGp1c3QsdW5kbzp1bmRvfTtmdW5jdGlvbiBhZGp1c3QoZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImxyInx8cmFua0Rpcj09PSJybCIpc3dhcFdpZHRoSGVpZ2h0KGcpfQpmdW5jdGlvbiB1bmRvKGcpe3ZhciByYW5rRGlyPWcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7aWYocmFua0Rpcj09PSJidCJ8fHJhbmtEaXI9PT0icmwiKXJldmVyc2VZKGcpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIil7c3dhcFhZKGcpO3N3YXBXaWR0aEhlaWdodChnKX19ZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0KGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c3dhcFdpZHRoSGVpZ2h0T25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3N3YXBXaWR0aEhlaWdodE9uZShnLmVkZ2UoZSkpfSl9ZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0T25lKGF0dHJzKXt2YXIgdz1hdHRycy53aWR0aDthdHRycy53aWR0aD1hdHRycy5oZWlnaHQ7YXR0cnMuaGVpZ2h0PXd9ZnVuY3Rpb24gcmV2ZXJzZVkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXZlcnNlWU9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxyZXZlcnNlWU9uZSk7aWYoXy5oYXMoZWRnZSwieSIpKXJldmVyc2VZT25lKGVkZ2UpfSl9ZnVuY3Rpb24gcmV2ZXJzZVlPbmUoYXR0cnMpe2F0dHJzLnk9LWF0dHJzLnl9ZnVuY3Rpb24gc3dhcFhZKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c3dhcFhZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsc3dhcFhZT25lKTtpZihfLmhhcyhlZGdlLCJ4Iikpc3dhcFhZT25lKGVkZ2UpfSl9ZnVuY3Rpb24gc3dhcFhZT25lKGF0dHJzKXt2YXIgeD1hdHRycy54O2F0dHJzLng9YXR0cnMueTthdHRycy55PXh9fSx7Ii4vbG9kYXNoIjoxMH1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPUxpc3Q7ZnVuY3Rpb24gTGlzdCgpe3ZhciBzZW50aW5lbD0Ke307c2VudGluZWwuX25leHQ9c2VudGluZWwuX3ByZXY9c2VudGluZWw7dGhpcy5fc2VudGluZWw9c2VudGluZWx9TGlzdC5wcm90b3R5cGUuZGVxdWV1ZT1mdW5jdGlvbigpe3ZhciBzZW50aW5lbD10aGlzLl9zZW50aW5lbCxlbnRyeT1zZW50aW5lbC5fcHJldjtpZihlbnRyeSE9PXNlbnRpbmVsKXt1bmxpbmsoZW50cnkpO3JldHVybiBlbnRyeX19O0xpc3QucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24oZW50cnkpe3ZhciBzZW50aW5lbD10aGlzLl9zZW50aW5lbDtpZihlbnRyeS5fcHJldiYmZW50cnkuX25leHQpdW5saW5rKGVudHJ5KTtlbnRyeS5fbmV4dD1zZW50aW5lbC5fbmV4dDtzZW50aW5lbC5fbmV4dC5fcHJldj1lbnRyeTtzZW50aW5lbC5fbmV4dD1lbnRyeTtlbnRyeS5fcHJldj1zZW50aW5lbH07TGlzdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgc3Rycz1bXSxzZW50aW5lbD10aGlzLl9zZW50aW5lbCxjdXJyPXNlbnRpbmVsLl9wcmV2O3doaWxlKGN1cnIhPT0Kc2VudGluZWwpe3N0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLGZpbHRlck91dExpbmtzKSk7Y3Vycj1jdXJyLl9wcmV2fXJldHVybiJbIitzdHJzLmpvaW4oIiwgIikrIl0ifTtmdW5jdGlvbiB1bmxpbmsoZW50cnkpe2VudHJ5Ll9wcmV2Ll9uZXh0PWVudHJ5Ll9uZXh0O2VudHJ5Ll9uZXh0Ll9wcmV2PWVudHJ5Ll9wcmV2O2RlbGV0ZSBlbnRyeS5fbmV4dDtkZWxldGUgZW50cnkuX3ByZXZ9ZnVuY3Rpb24gZmlsdGVyT3V0TGlua3Moayx2KXtpZihrIT09Il9uZXh0IiYmayE9PSJfcHJldiIpcmV0dXJuIHZ9fSx7fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17ZGVidWdPcmRlcmluZzpkZWJ1Z09yZGVyaW5nfTtmdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpe3ZhciBsYXllck1hdHJpeD0KdXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBoPShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWUsbXVsdGlncmFwaDp0cnVlfSkpLnNldEdyYXBoKHt9KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2guc2V0Tm9kZSh2LHtsYWJlbDp2fSk7aC5zZXRQYXJlbnQodiwibGF5ZXIiK2cubm9kZSh2KS5yYW5rKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7aC5zZXRFZGdlKGUudixlLncse30sZS5uYW1lKX0pO18uZm9yRWFjaChsYXllck1hdHJpeCxmdW5jdGlvbihsYXllcixpKXt2YXIgbGF5ZXJWPSJsYXllciIraTtoLnNldE5vZGUobGF5ZXJWLHtyYW5rOiJzYW1lIn0pO18ucmVkdWNlKGxheWVyLGZ1bmN0aW9uKHUsdil7aC5zZXRFZGdlKHUsdix7c3R5bGU6ImludmlzIn0pO3JldHVybiB2fSl9KTtyZXR1cm4gaH19LHsiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGdyYXBobGliOwppZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2dyYXBobGliPXJlcXVpcmUoImdyYXBobGliIil9Y2F0Y2goZSl7fWlmKCFncmFwaGxpYilncmFwaGxpYj13aW5kb3cuZ3JhcGhsaWI7bW9kdWxlLmV4cG9ydHM9Z3JhcGhsaWJ9LHsiZ3JhcGhsaWIiOnVuZGVmaW5lZH1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoLExpc3Q9cmVxdWlyZSgiLi9kYXRhL2xpc3QiKTttb2R1bGUuZXhwb3J0cz1ncmVlZHlGQVM7dmFyIERFRkFVTFRfV0VJR0hUX0ZOPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZ3JlZWR5RkFTKGcsd2VpZ2h0Rm4pe2lmKGcubm9kZUNvdW50KCk8PTEpcmV0dXJuW107dmFyIHN0YXRlPWJ1aWxkU3RhdGUoZyx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRk4pO3ZhciByZXN1bHRzPWRvR3JlZWR5RkFTKHN0YXRlLmdyYXBoLHN0YXRlLmJ1Y2tldHMsCnN0YXRlLnplcm9JZHgpO3JldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cyxmdW5jdGlvbihlKXtyZXR1cm4gZy5vdXRFZGdlcyhlLnYsZS53KX0pLHRydWUpfWZ1bmN0aW9uIGRvR3JlZWR5RkFTKGcsYnVja2V0cyx6ZXJvSWR4KXt2YXIgcmVzdWx0cz1bXSxzb3VyY2VzPWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0sc2lua3M9YnVja2V0c1swXTt2YXIgZW50cnk7d2hpbGUoZy5ub2RlQ291bnQoKSl7d2hpbGUoZW50cnk9c2lua3MuZGVxdWV1ZSgpKXJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnkpO3doaWxlKGVudHJ5PXNvdXJjZXMuZGVxdWV1ZSgpKXJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnkpO2lmKGcubm9kZUNvdW50KCkpZm9yKHZhciBpPWJ1Y2tldHMubGVuZ3RoLTI7aT4wOy0taSl7ZW50cnk9YnVja2V0c1tpXS5kZXF1ZXVlKCk7aWYoZW50cnkpe3Jlc3VsdHM9cmVzdWx0cy5jb25jYXQocmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCwKZW50cnksdHJ1ZSkpO2JyZWFrfX19cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSxjb2xsZWN0UHJlZGVjZXNzb3JzKXt2YXIgcmVzdWx0cz1jb2xsZWN0UHJlZGVjZXNzb3JzP1tdOnVuZGVmaW5lZDtfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLGZ1bmN0aW9uKGVkZ2Upe3ZhciB3ZWlnaHQ9Zy5lZGdlKGVkZ2UpLHVFbnRyeT1nLm5vZGUoZWRnZS52KTtpZihjb2xsZWN0UHJlZGVjZXNzb3JzKXJlc3VsdHMucHVzaCh7djplZGdlLnYsdzplZGdlLnd9KTt1RW50cnkub3V0LT13ZWlnaHQ7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCx1RW50cnkpfSk7Xy5mb3JFYWNoKGcub3V0RWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdz1lZGdlLncsd0VudHJ5PWcubm9kZSh3KTt3RW50cnlbImluIl0tPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHdFbnRyeSl9KTsKZy5yZW1vdmVOb2RlKGVudHJ5LnYpO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIGJ1aWxkU3RhdGUoZyx3ZWlnaHRGbil7dmFyIGZhc0dyYXBoPW5ldyBHcmFwaCxtYXhJbj0wLG1heE91dD0wO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7ZmFzR3JhcGguc2V0Tm9kZSh2LHt2OnYsImluIjowLG91dDowfSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBwcmV2V2VpZ2h0PWZhc0dyYXBoLmVkZ2UoZS52LGUudyl8fDAsd2VpZ2h0PXdlaWdodEZuKGUpLGVkZ2VXZWlnaHQ9cHJldldlaWdodCt3ZWlnaHQ7ZmFzR3JhcGguc2V0RWRnZShlLnYsZS53LGVkZ2VXZWlnaHQpO21heE91dD1NYXRoLm1heChtYXhPdXQsZmFzR3JhcGgubm9kZShlLnYpLm91dCs9d2VpZ2h0KTttYXhJbj1NYXRoLm1heChtYXhJbixmYXNHcmFwaC5ub2RlKGUudylbImluIl0rPXdlaWdodCl9KTt2YXIgYnVja2V0cz1fLnJhbmdlKG1heE91dCttYXhJbiszKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExpc3R9KTsKdmFyIHplcm9JZHg9bWF4SW4rMTtfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSxmdW5jdGlvbih2KXthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LGZhc0dyYXBoLm5vZGUodikpfSk7cmV0dXJue2dyYXBoOmZhc0dyYXBoLGJ1Y2tldHM6YnVja2V0cyx6ZXJvSWR4Onplcm9JZHh9fWZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZW50cnkpe2lmKCFlbnRyeS5vdXQpYnVja2V0c1swXS5lbnF1ZXVlKGVudHJ5KTtlbHNlIGlmKCFlbnRyeVsiaW4iXSlidWNrZXRzW2J1Y2tldHMubGVuZ3RoLTFdLmVucXVldWUoZW50cnkpO2Vsc2UgYnVja2V0c1tlbnRyeS5vdXQtZW50cnlbImluIl0remVyb0lkeF0uZW5xdWV1ZShlbnRyeSl9fSx7Ii4vZGF0YS9saXN0Ijo1LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTB9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGFjeWNsaWM9cmVxdWlyZSgiLi9hY3ljbGljIiksCm5vcm1hbGl6ZT1yZXF1aXJlKCIuL25vcm1hbGl6ZSIpLHJhbms9cmVxdWlyZSgiLi9yYW5rIiksbm9ybWFsaXplUmFua3M9cmVxdWlyZSgiLi91dGlsIikubm9ybWFsaXplUmFua3MscGFyZW50RHVtbXlDaGFpbnM9cmVxdWlyZSgiLi9wYXJlbnQtZHVtbXktY2hhaW5zIikscmVtb3ZlRW1wdHlSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5yZW1vdmVFbXB0eVJhbmtzLG5lc3RpbmdHcmFwaD1yZXF1aXJlKCIuL25lc3RpbmctZ3JhcGgiKSxhZGRCb3JkZXJTZWdtZW50cz1yZXF1aXJlKCIuL2FkZC1ib3JkZXItc2VnbWVudHMiKSxjb29yZGluYXRlU3lzdGVtPXJlcXVpcmUoIi4vY29vcmRpbmF0ZS1zeXN0ZW0iKSxvcmRlcj1yZXF1aXJlKCIuL29yZGVyIikscG9zaXRpb249cmVxdWlyZSgiLi9wb3NpdGlvbiIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWxheW91dDtmdW5jdGlvbiBsYXlvdXQoZyxvcHRzKXt2YXIgdGltZT0Kb3B0cyYmb3B0cy5kZWJ1Z1RpbWluZz91dGlsLnRpbWU6dXRpbC5ub3RpbWU7dGltZSgibGF5b3V0IixmdW5jdGlvbigpe3ZhciBsYXlvdXRHcmFwaD10aW1lKCIgIGJ1aWxkTGF5b3V0R3JhcGgiLGZ1bmN0aW9uKCl7cmV0dXJuIGJ1aWxkTGF5b3V0R3JhcGgoZyl9KTt0aW1lKCIgIHJ1bkxheW91dCIsZnVuY3Rpb24oKXtydW5MYXlvdXQobGF5b3V0R3JhcGgsdGltZSl9KTt0aW1lKCIgIHVwZGF0ZUlucHV0R3JhcGgiLGZ1bmN0aW9uKCl7dXBkYXRlSW5wdXRHcmFwaChnLGxheW91dEdyYXBoKX0pfSl9ZnVuY3Rpb24gcnVuTGF5b3V0KGcsdGltZSl7dGltZSgiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMiLGZ1bmN0aW9uKCl7bWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKX0pO3RpbWUoIiAgICByZW1vdmVTZWxmRWRnZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIGFjeWNsaWMiLGZ1bmN0aW9uKCl7YWN5Y2xpYy5ydW4oZyl9KTt0aW1lKCIgICAgbmVzdGluZ0dyYXBoLnJ1biIsCmZ1bmN0aW9uKCl7bmVzdGluZ0dyYXBoLnJ1bihnKX0pO3RpbWUoIiAgICByYW5rIixmdW5jdGlvbigpe3JhbmsodXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZykpfSk7dGltZSgiICAgIGluamVjdEVkZ2VMYWJlbFByb3hpZXMiLGZ1bmN0aW9uKCl7aW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKX0pO3RpbWUoIiAgICByZW1vdmVFbXB0eVJhbmtzIixmdW5jdGlvbigpe3JlbW92ZUVtcHR5UmFua3MoZyl9KTt0aW1lKCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXAiLGZ1bmN0aW9uKCl7bmVzdGluZ0dyYXBoLmNsZWFudXAoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplUmFua3MiLGZ1bmN0aW9uKCl7bm9ybWFsaXplUmFua3MoZyl9KTt0aW1lKCIgICAgYXNzaWduUmFua01pbk1heCIsZnVuY3Rpb24oKXthc3NpZ25SYW5rTWluTWF4KGcpfSk7dGltZSgiICAgIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKX0pO3RpbWUoIiAgICBub3JtYWxpemUucnVuIiwKZnVuY3Rpb24oKXtub3JtYWxpemUucnVuKGcpfSk7dGltZSgiICAgIHBhcmVudER1bW15Q2hhaW5zIixmdW5jdGlvbigpe3BhcmVudER1bW15Q2hhaW5zKGcpfSk7dGltZSgiICAgIGFkZEJvcmRlclNlZ21lbnRzIixmdW5jdGlvbigpe2FkZEJvcmRlclNlZ21lbnRzKGcpfSk7dGltZSgiICAgIG9yZGVyIixmdW5jdGlvbigpe29yZGVyKGcpfSk7dGltZSgiICAgIGluc2VydFNlbGZFZGdlcyIsZnVuY3Rpb24oKXtpbnNlcnRTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWRqdXN0Q29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLmFkanVzdChnKX0pO3RpbWUoIiAgICBwb3NpdGlvbiIsZnVuY3Rpb24oKXtwb3NpdGlvbihnKX0pO3RpbWUoIiAgICBwb3NpdGlvblNlbGZFZGdlcyIsZnVuY3Rpb24oKXtwb3NpdGlvblNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICByZW1vdmVCb3JkZXJOb2RlcyIsZnVuY3Rpb24oKXtyZW1vdmVCb3JkZXJOb2RlcyhnKX0pO3RpbWUoIiAgICBub3JtYWxpemUudW5kbyIsCmZ1bmN0aW9uKCl7bm9ybWFsaXplLnVuZG8oZyl9KTt0aW1lKCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHMiLGZ1bmN0aW9uKCl7Zml4dXBFZGdlTGFiZWxDb29yZHMoZyl9KTt0aW1lKCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW0iLGZ1bmN0aW9uKCl7Y29vcmRpbmF0ZVN5c3RlbS51bmRvKGcpfSk7dGltZSgiICAgIHRyYW5zbGF0ZUdyYXBoIixmdW5jdGlvbigpe3RyYW5zbGF0ZUdyYXBoKGcpfSk7dGltZSgiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzIixmdW5jdGlvbigpe2Fzc2lnbk5vZGVJbnRlcnNlY3RzKGcpfSk7dGltZSgiICAgIHJldmVyc2VQb2ludHMiLGZ1bmN0aW9uKCl7cmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYy51bmRvIixmdW5jdGlvbigpe2FjeWNsaWMudW5kbyhnKX0pfWZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCxsYXlvdXRHcmFwaCl7Xy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgaW5wdXRMYWJlbD0KaW5wdXRHcmFwaC5ub2RlKHYpLGxheW91dExhYmVsPWxheW91dEdyYXBoLm5vZGUodik7aWYoaW5wdXRMYWJlbCl7aW5wdXRMYWJlbC54PWxheW91dExhYmVsLng7aW5wdXRMYWJlbC55PWxheW91dExhYmVsLnk7aWYobGF5b3V0R3JhcGguY2hpbGRyZW4odikubGVuZ3RoKXtpbnB1dExhYmVsLndpZHRoPWxheW91dExhYmVsLndpZHRoO2lucHV0TGFiZWwuaGVpZ2h0PWxheW91dExhYmVsLmhlaWdodH19fSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgaW5wdXRMYWJlbD1pbnB1dEdyYXBoLmVkZ2UoZSksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGguZWRnZShlKTtpbnB1dExhYmVsLnBvaW50cz1sYXlvdXRMYWJlbC5wb2ludHM7aWYoXy5oYXMobGF5b3V0TGFiZWwsIngiKSl7aW5wdXRMYWJlbC54PWxheW91dExhYmVsLng7aW5wdXRMYWJlbC55PWxheW91dExhYmVsLnl9fSk7aW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoPWxheW91dEdyYXBoLmdyYXBoKCkud2lkdGg7CmlucHV0R3JhcGguZ3JhcGgoKS5oZWlnaHQ9bGF5b3V0R3JhcGguZ3JhcGgoKS5oZWlnaHR9dmFyIGdyYXBoTnVtQXR0cnM9WyJub2Rlc2VwIiwiZWRnZXNlcCIsInJhbmtzZXAiLCJtYXJnaW54IiwibWFyZ2lueSJdLGdyYXBoRGVmYXVsdHM9e3JhbmtzZXA6NTAsZWRnZXNlcDoyMCxub2Rlc2VwOjUwLHJhbmtkaXI6InRiIn0sZ3JhcGhBdHRycz1bImFjeWNsaWNlciIsInJhbmtlciIsInJhbmtkaXIiLCJhbGlnbiJdLG5vZGVOdW1BdHRycz1bIndpZHRoIiwiaGVpZ2h0Il0sbm9kZURlZmF1bHRzPXt3aWR0aDowLGhlaWdodDowfSxlZGdlTnVtQXR0cnM9WyJtaW5sZW4iLCJ3ZWlnaHQiLCJ3aWR0aCIsImhlaWdodCIsImxhYmVsb2Zmc2V0Il0sZWRnZURlZmF1bHRzPXttaW5sZW46MSx3ZWlnaHQ6MSx3aWR0aDowLGhlaWdodDowLGxhYmVsb2Zmc2V0OjEwLGxhYmVscG9zOiJyIn0sZWRnZUF0dHJzPVsibGFiZWxwb3MiXTtmdW5jdGlvbiBidWlsZExheW91dEdyYXBoKGlucHV0R3JhcGgpe3ZhciBnPQpuZXcgR3JhcGgoe211bHRpZ3JhcGg6dHJ1ZSxjb21wb3VuZDp0cnVlfSksZ3JhcGg9Y2Fub25pY2FsaXplKGlucHV0R3JhcGguZ3JhcGgoKSk7Zy5zZXRHcmFwaChfLm1lcmdlKHt9LGdyYXBoRGVmYXVsdHMsc2VsZWN0TnVtYmVyQXR0cnMoZ3JhcGgsZ3JhcGhOdW1BdHRycyksXy5waWNrKGdyYXBoLGdyYXBoQXR0cnMpKSk7Xy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ub2RlKHYpKTtnLnNldE5vZGUodixfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsbm9kZU51bUF0dHJzKSxub2RlRGVmYXVsdHMpKTtnLnNldFBhcmVudCh2LGlucHV0R3JhcGgucGFyZW50KHYpKX0pO18uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Y2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7Zy5zZXRFZGdlKGUsXy5tZXJnZSh7fSxlZGdlRGVmYXVsdHMsc2VsZWN0TnVtYmVyQXR0cnMoZWRnZSwKZWRnZU51bUF0dHJzKSxfLnBpY2soZWRnZSxlZGdlQXR0cnMpKSl9KTtyZXR1cm4gZ31mdW5jdGlvbiBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpe3ZhciBncmFwaD1nLmdyYXBoKCk7Z3JhcGgucmFua3NlcC89MjtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtlZGdlLm1pbmxlbio9MjtpZihlZGdlLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkhPT0iYyIpaWYoZ3JhcGgucmFua2Rpcj09PSJUQiJ8fGdyYXBoLnJhbmtkaXI9PT0iQlQiKWVkZ2Uud2lkdGgrPWVkZ2UubGFiZWxvZmZzZXQ7ZWxzZSBlZGdlLmhlaWdodCs9ZWRnZS5sYWJlbG9mZnNldH0pfWZ1bmN0aW9uIGluamVjdEVkZ2VMYWJlbFByb3hpZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS53aWR0aCYmZWRnZS5oZWlnaHQpe3ZhciB2PWcubm9kZShlLnYpLHc9Zy5ub2RlKGUudyksbGFiZWw9e3Jhbms6KHcucmFuay0Kdi5yYW5rKS8yK3YucmFuayxlOmV9O3V0aWwuYWRkRHVtbXlOb2RlKGcsImVkZ2UtcHJveHkiLGxhYmVsLCJfZXAiKX19KX1mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpe3ZhciBtYXhSYW5rPTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5ib3JkZXJUb3Ape25vZGUubWluUmFuaz1nLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7bm9kZS5tYXhSYW5rPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSkucmFuazttYXhSYW5rPV8ubWF4KG1heFJhbmssbm9kZS5tYXhSYW5rKX19KTtnLmdyYXBoKCkubWF4UmFuaz1tYXhSYW5rfWZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJlZGdlLXByb3h5Iil7Zy5lZGdlKG5vZGUuZSkubGFiZWxSYW5rPW5vZGUucmFuaztnLnJlbW92ZU5vZGUodil9fSl9CmZ1bmN0aW9uIHRyYW5zbGF0ZUdyYXBoKGcpe3ZhciBtaW5YPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhYPTAsbWluWT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWF4WT0wLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLG1hcmdpblg9Z3JhcGhMYWJlbC5tYXJnaW54fHwwLG1hcmdpblk9Z3JhcGhMYWJlbC5tYXJnaW55fHwwO2Z1bmN0aW9uIGdldEV4dHJlbWVzKGF0dHJzKXt2YXIgeD1hdHRycy54LHk9YXR0cnMueSx3PWF0dHJzLndpZHRoLGg9YXR0cnMuaGVpZ2h0O21pblg9TWF0aC5taW4obWluWCx4LXcvMik7bWF4WD1NYXRoLm1heChtYXhYLHgrdy8yKTttaW5ZPU1hdGgubWluKG1pblkseS1oLzIpO21heFk9TWF0aC5tYXgobWF4WSx5K2gvMil9Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtnZXRFeHRyZW1lcyhnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKWdldEV4dHJlbWVzKGVkZ2UpfSk7Cm1pblgtPW1hcmdpblg7bWluWS09bWFyZ2luWTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtub2RlLngtPW1pblg7bm9kZS55LT1taW5ZfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLGZ1bmN0aW9uKHApe3AueC09bWluWDtwLnktPW1pbll9KTtpZihfLmhhcyhlZGdlLCJ4IikpZWRnZS54LT1taW5YO2lmKF8uaGFzKGVkZ2UsInkiKSllZGdlLnktPW1pbll9KTtncmFwaExhYmVsLndpZHRoPW1heFgtbWluWCttYXJnaW5YO2dyYXBoTGFiZWwuaGVpZ2h0PW1heFktbWluWSttYXJnaW5ZfWZ1bmN0aW9uIGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLG5vZGVWPWcubm9kZShlLnYpLG5vZGVXPWcubm9kZShlLncpLHAxLHAyO2lmKCFlZGdlLnBvaW50cyl7ZWRnZS5wb2ludHM9CltdO3AxPW5vZGVXO3AyPW5vZGVWfWVsc2V7cDE9ZWRnZS5wb2ludHNbMF07cDI9ZWRnZS5wb2ludHNbZWRnZS5wb2ludHMubGVuZ3RoLTFdfWVkZ2UucG9pbnRzLnVuc2hpZnQodXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVWLHAxKSk7ZWRnZS5wb2ludHMucHVzaCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVcscDIpKX0pfWZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKF8uaGFzKGVkZ2UsIngiKSl7aWYoZWRnZS5sYWJlbHBvcz09PSJsInx8ZWRnZS5sYWJlbHBvcz09PSJyIillZGdlLndpZHRoLT1lZGdlLmxhYmVsb2Zmc2V0O3N3aXRjaChlZGdlLmxhYmVscG9zKXtjYXNlICJsIjplZGdlLngtPWVkZ2Uud2lkdGgvMitlZGdlLmxhYmVsb2Zmc2V0O2JyZWFrO2Nhc2UgInIiOmVkZ2UueCs9ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWt9fX0pfWZ1bmN0aW9uIHJldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLnJldmVyc2VkKWVkZ2UucG9pbnRzLnJldmVyc2UoKX0pfWZ1bmN0aW9uIHJlbW92ZUJvcmRlck5vZGVzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aWYoZy5jaGlsZHJlbih2KS5sZW5ndGgpe3ZhciBub2RlPWcubm9kZSh2KSx0PWcubm9kZShub2RlLmJvcmRlclRvcCksYj1nLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLGw9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlckxlZnQpKSxyPWcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJSaWdodCkpO25vZGUud2lkdGg9TWF0aC5hYnMoci54LWwueCk7bm9kZS5oZWlnaHQ9TWF0aC5hYnMoYi55LXQueSk7bm9kZS54PWwueCtub2RlLndpZHRoLzI7bm9kZS55PXQueStub2RlLmhlaWdodC8yfX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aWYoZy5ub2RlKHYpLmR1bW15PT09ImJvcmRlciIpZy5yZW1vdmVOb2RlKHYpfSl9ZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe2lmKGUudj09PWUudyl7dmFyIG5vZGU9Zy5ub2RlKGUudik7aWYoIW5vZGUuc2VsZkVkZ2VzKW5vZGUuc2VsZkVkZ2VzPVtdO25vZGUuc2VsZkVkZ2VzLnB1c2goe2U6ZSxsYWJlbDpnLmVkZ2UoZSl9KTtnLnJlbW92ZUVkZ2UoZSl9fSl9ZnVuY3Rpb24gaW5zZXJ0U2VsZkVkZ2VzKGcpe3ZhciBsYXllcnM9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO18uZm9yRWFjaChsYXllcnMsZnVuY3Rpb24obGF5ZXIpe3ZhciBvcmRlclNoaWZ0PTA7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUub3JkZXI9aStvcmRlclNoaWZ0O18uZm9yRWFjaChub2RlLnNlbGZFZGdlcyxmdW5jdGlvbihzZWxmRWRnZSl7dXRpbC5hZGREdW1teU5vZGUoZywic2VsZmVkZ2UiLHt3aWR0aDpzZWxmRWRnZS5sYWJlbC53aWR0aCxoZWlnaHQ6c2VsZkVkZ2UubGFiZWwuaGVpZ2h0LHJhbms6bm9kZS5yYW5rLG9yZGVyOmkrICsrb3JkZXJTaGlmdCwKZTpzZWxmRWRnZS5lLGxhYmVsOnNlbGZFZGdlLmxhYmVsfSwiX3NlIil9KTtkZWxldGUgbm9kZS5zZWxmRWRnZXN9KX0pfWZ1bmN0aW9uIHBvc2l0aW9uU2VsZkVkZ2VzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuZHVtbXk9PT0ic2VsZmVkZ2UiKXt2YXIgc2VsZk5vZGU9Zy5ub2RlKG5vZGUuZS52KSx4PXNlbGZOb2RlLngrc2VsZk5vZGUud2lkdGgvMix5PXNlbGZOb2RlLnksZHg9bm9kZS54LXgsZHk9c2VsZk5vZGUuaGVpZ2h0LzI7Zy5zZXRFZGdlKG5vZGUuZSxub2RlLmxhYmVsKTtnLnJlbW92ZU5vZGUodik7bm9kZS5sYWJlbC5wb2ludHM9W3t4OngrMipkeC8zLHk6eS1keX0se3g6eCs1KmR4LzYseTp5LWR5fSx7eDp4K2R4LHk6eX0se3g6eCs1KmR4LzYseTp5K2R5fSx7eDp4KzIqZHgvMyx5OnkrZHl9XTtub2RlLmxhYmVsLng9bm9kZS54O25vZGUubGFiZWwueT1ub2RlLnl9fSl9ZnVuY3Rpb24gc2VsZWN0TnVtYmVyQXR0cnMob2JqLAphdHRycyl7cmV0dXJuIF8ubWFwVmFsdWVzKF8ucGljayhvYmosYXR0cnMpLE51bWJlcil9ZnVuY3Rpb24gY2Fub25pY2FsaXplKGF0dHJzKXt2YXIgbmV3QXR0cnM9e307Xy5mb3JFYWNoKGF0dHJzLGZ1bmN0aW9uKHYsayl7bmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXT12fSk7cmV0dXJuIG5ld0F0dHJzfX0seyIuL2FjeWNsaWMiOjIsIi4vYWRkLWJvcmRlci1zZWdtZW50cyI6MywiLi9jb29yZGluYXRlLXN5c3RlbSI6NCwiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwLCIuL25lc3RpbmctZ3JhcGgiOjExLCIuL25vcm1hbGl6ZSI6MTIsIi4vb3JkZXIiOjE3LCIuL3BhcmVudC1kdW1teS1jaGFpbnMiOjIyLCIuL3Bvc2l0aW9uIjoyNCwiLi9yYW5rIjoyNiwiLi91dGlsIjoyOX1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbG9kYXNoO2lmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7bG9kYXNoPXJlcXVpcmUoImxvZGFzaCIpfWNhdGNoKGUpe31pZighbG9kYXNoKWxvZGFzaD0Kd2luZG93Ll87bW9kdWxlLmV4cG9ydHM9bG9kYXNofSx7ImxvZGFzaCI6dW5kZWZpbmVkfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bixjbGVhbnVwOmNsZWFudXB9O2Z1bmN0aW9uIHJ1bihnKXt2YXIgcm9vdD11dGlsLmFkZER1bW15Tm9kZShnLCJyb290Iix7fSwiX3Jvb3QiKTt2YXIgZGVwdGhzPXRyZWVEZXB0aHMoZyk7dmFyIGhlaWdodD1fLm1heChfLnZhbHVlcyhkZXB0aHMpKS0xO3ZhciBub2RlU2VwPTIqaGVpZ2h0KzE7Zy5ncmFwaCgpLm5lc3RpbmdSb290PXJvb3Q7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtnLmVkZ2UoZSkubWlubGVuKj1ub2RlU2VwfSk7dmFyIHdlaWdodD1zdW1XZWlnaHRzKGcpKzE7Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbihjaGlsZCl7ZGZzKGcscm9vdCxub2RlU2VwLAp3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCl9KTtnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3I9bm9kZVNlcH1mdW5jdGlvbiBkZnMoZyxyb290LG5vZGVTZXAsd2VpZ2h0LGhlaWdodCxkZXB0aHMsdil7dmFyIGNoaWxkcmVuPWcuY2hpbGRyZW4odik7aWYoIWNoaWxkcmVuLmxlbmd0aCl7aWYodiE9PXJvb3QpZy5zZXRFZGdlKHJvb3Qsdix7d2VpZ2h0OjAsbWlubGVuOm5vZGVTZXB9KTtyZXR1cm59dmFyIHRvcD11dGlsLmFkZEJvcmRlck5vZGUoZywiX2J0IiksYm90dG9tPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYmIiKSxsYWJlbD1nLm5vZGUodik7Zy5zZXRQYXJlbnQodG9wLHYpO2xhYmVsLmJvcmRlclRvcD10b3A7Zy5zZXRQYXJlbnQoYm90dG9tLHYpO2xhYmVsLmJvcmRlckJvdHRvbT1ib3R0b207Xy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsd2VpZ2h0LGhlaWdodCxkZXB0aHMsY2hpbGQpO3ZhciBjaGlsZE5vZGU9Zy5ub2RlKGNoaWxkKSwKY2hpbGRUb3A9Y2hpbGROb2RlLmJvcmRlclRvcD9jaGlsZE5vZGUuYm9yZGVyVG9wOmNoaWxkLGNoaWxkQm90dG9tPWNoaWxkTm9kZS5ib3JkZXJCb3R0b20/Y2hpbGROb2RlLmJvcmRlckJvdHRvbTpjaGlsZCx0aGlzV2VpZ2h0PWNoaWxkTm9kZS5ib3JkZXJUb3A/d2VpZ2h0OjIqd2VpZ2h0LG1pbmxlbj1jaGlsZFRvcCE9PWNoaWxkQm90dG9tPzE6aGVpZ2h0LWRlcHRoc1t2XSsxO2cuc2V0RWRnZSh0b3AsY2hpbGRUb3Ase3dlaWdodDp0aGlzV2VpZ2h0LG1pbmxlbjptaW5sZW4sbmVzdGluZ0VkZ2U6dHJ1ZX0pO2cuc2V0RWRnZShjaGlsZEJvdHRvbSxib3R0b20se3dlaWdodDp0aGlzV2VpZ2h0LG1pbmxlbjptaW5sZW4sbmVzdGluZ0VkZ2U6dHJ1ZX0pfSk7aWYoIWcucGFyZW50KHYpKWcuc2V0RWRnZShyb290LHRvcCx7d2VpZ2h0OjAsbWlubGVuOmhlaWdodCtkZXB0aHNbdl19KX1mdW5jdGlvbiB0cmVlRGVwdGhzKGcpe3ZhciBkZXB0aHM9e307ZnVuY3Rpb24gZGZzKHYsZGVwdGgpe3ZhciBjaGlsZHJlbj0KZy5jaGlsZHJlbih2KTtpZihjaGlsZHJlbiYmY2hpbGRyZW4ubGVuZ3RoKV8uZm9yRWFjaChjaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7ZGZzKGNoaWxkLGRlcHRoKzEpfSk7ZGVwdGhzW3ZdPWRlcHRofV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZnVuY3Rpb24odil7ZGZzKHYsMSl9KTtyZXR1cm4gZGVwdGhzfWZ1bmN0aW9uIHN1bVdlaWdodHMoZyl7cmV0dXJuIF8ucmVkdWNlKGcuZWRnZXMoKSxmdW5jdGlvbihhY2MsZSl7cmV0dXJuIGFjYytnLmVkZ2UoZSkud2VpZ2h0fSwwKX1mdW5jdGlvbiBjbGVhbnVwKGcpe3ZhciBncmFwaExhYmVsPWcuZ3JhcGgoKTtnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7ZGVsZXRlIGdyYXBoTGFiZWwubmVzdGluZ1Jvb3Q7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS5uZXN0aW5nRWRnZSlnLnJlbW92ZUVkZ2UoZSl9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sCjEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sdW5kbzp1bmRvfTtmdW5jdGlvbiBydW4oZyl7Zy5ncmFwaCgpLmR1bW15Q2hhaW5zPVtdO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZWRnZSl7bm9ybWFsaXplRWRnZShnLGVkZ2UpfSl9ZnVuY3Rpb24gbm9ybWFsaXplRWRnZShnLGUpe3ZhciB2PWUudix2UmFuaz1nLm5vZGUodikucmFuayx3PWUudyx3UmFuaz1nLm5vZGUodykucmFuayxuYW1lPWUubmFtZSxlZGdlTGFiZWw9Zy5lZGdlKGUpLGxhYmVsUmFuaz1lZGdlTGFiZWwubGFiZWxSYW5rO2lmKHdSYW5rPT09dlJhbmsrMSlyZXR1cm47Zy5yZW1vdmVFZGdlKGUpO3ZhciBkdW1teSxhdHRycyxpO2ZvcihpPTAsKyt2UmFuazt2UmFuazx3UmFuazsrK2ksKyt2UmFuayl7ZWRnZUxhYmVsLnBvaW50cz1bXTthdHRycz17d2lkdGg6MCwKaGVpZ2h0OjAsZWRnZUxhYmVsOmVkZ2VMYWJlbCxlZGdlT2JqOmUscmFuazp2UmFua307ZHVtbXk9dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZSIsYXR0cnMsIl9kIik7aWYodlJhbms9PT1sYWJlbFJhbmspe2F0dHJzLndpZHRoPWVkZ2VMYWJlbC53aWR0aDthdHRycy5oZWlnaHQ9ZWRnZUxhYmVsLmhlaWdodDthdHRycy5kdW1teT0iZWRnZS1sYWJlbCI7YXR0cnMubGFiZWxwb3M9ZWRnZUxhYmVsLmxhYmVscG9zfWcuc2V0RWRnZSh2LGR1bW15LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSk7aWYoaT09PTApZy5ncmFwaCgpLmR1bW15Q2hhaW5zLnB1c2goZHVtbXkpO3Y9ZHVtbXl9Zy5zZXRFZGdlKHYsdyx7d2VpZ2h0OmVkZ2VMYWJlbC53ZWlnaHR9LG5hbWUpfWZ1bmN0aW9uIHVuZG8oZyl7Xy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucyxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodiksb3JpZ0xhYmVsPW5vZGUuZWRnZUxhYmVsLHc7Zy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwKb3JpZ0xhYmVsKTt3aGlsZShub2RlLmR1bW15KXt3PWcuc3VjY2Vzc29ycyh2KVswXTtnLnJlbW92ZU5vZGUodik7b3JpZ0xhYmVsLnBvaW50cy5wdXNoKHt4Om5vZGUueCx5Om5vZGUueX0pO2lmKG5vZGUuZHVtbXk9PT0iZWRnZS1sYWJlbCIpe29yaWdMYWJlbC54PW5vZGUueDtvcmlnTGFiZWwueT1ub2RlLnk7b3JpZ0xhYmVsLndpZHRoPW5vZGUud2lkdGg7b3JpZ0xhYmVsLmhlaWdodD1ub2RlLmhlaWdodH12PXc7bm9kZT1nLm5vZGUodil9fSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1hZGRTdWJncmFwaENvbnN0cmFpbnRzO2Z1bmN0aW9uIGFkZFN1YmdyYXBoQ29uc3RyYWludHMoZyxjZyx2cyl7dmFyIHByZXY9e30scm9vdFByZXY7Xy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe3ZhciBjaGlsZD1nLnBhcmVudCh2KSxwYXJlbnQsCnByZXZDaGlsZDt3aGlsZShjaGlsZCl7cGFyZW50PWcucGFyZW50KGNoaWxkKTtpZihwYXJlbnQpe3ByZXZDaGlsZD1wcmV2W3BhcmVudF07cHJldltwYXJlbnRdPWNoaWxkfWVsc2V7cHJldkNoaWxkPXJvb3RQcmV2O3Jvb3RQcmV2PWNoaWxkfWlmKHByZXZDaGlsZCYmcHJldkNoaWxkIT09Y2hpbGQpe2NnLnNldEVkZ2UocHJldkNoaWxkLGNoaWxkKTtyZXR1cm59Y2hpbGQ9cGFyZW50fX0pfX0seyIuLi9sb2Rhc2giOjEwfV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWJhcnljZW50ZXI7ZnVuY3Rpb24gYmFyeWNlbnRlcihnLG1vdmFibGUpe3JldHVybiBfLm1hcChtb3ZhYmxlLGZ1bmN0aW9uKHYpe3ZhciBpblY9Zy5pbkVkZ2VzKHYpO2lmKCFpblYubGVuZ3RoKXJldHVybnt2OnZ9O2Vsc2V7dmFyIHJlc3VsdD1fLnJlZHVjZShpblYsZnVuY3Rpb24oYWNjLGUpe3ZhciBlZGdlPWcuZWRnZShlKSwKbm9kZVU9Zy5ub2RlKGUudik7cmV0dXJue3N1bTphY2Muc3VtK2VkZ2Uud2VpZ2h0Km5vZGVVLm9yZGVyLHdlaWdodDphY2Mud2VpZ2h0K2VkZ2Uud2VpZ2h0fX0se3N1bTowLHdlaWdodDowfSk7cmV0dXJue3Y6dixiYXJ5Y2VudGVyOnJlc3VsdC5zdW0vcmVzdWx0LndlaWdodCx3ZWlnaHQ6cmVzdWx0LndlaWdodH19fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz1idWlsZExheWVyR3JhcGg7ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBoKGcscmFuayxyZWxhdGlvbnNoaXApe3ZhciByb290PWNyZWF0ZVJvb3ROb2RlKGcpLHJlc3VsdD0obmV3IEdyYXBoKHtjb21wb3VuZDp0cnVlfSkpLnNldEdyYXBoKHtyb290OnJvb3R9KS5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodil9KTsKXy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodikscGFyZW50PWcucGFyZW50KHYpO2lmKG5vZGUucmFuaz09PXJhbmt8fG5vZGUubWluUmFuazw9cmFuayYmcmFuazw9bm9kZS5tYXhSYW5rKXtyZXN1bHQuc2V0Tm9kZSh2KTtyZXN1bHQuc2V0UGFyZW50KHYscGFyZW50fHxyb290KTtfLmZvckVhY2goZ1tyZWxhdGlvbnNoaXBdKHYpLGZ1bmN0aW9uKGUpe3ZhciB1PWUudj09PXY/ZS53OmUudixlZGdlPXJlc3VsdC5lZGdlKHUsdiksd2VpZ2h0PSFfLmlzVW5kZWZpbmVkKGVkZ2UpP2VkZ2Uud2VpZ2h0OjA7cmVzdWx0LnNldEVkZ2UodSx2LHt3ZWlnaHQ6Zy5lZGdlKGUpLndlaWdodCt3ZWlnaHR9KX0pO2lmKF8uaGFzKG5vZGUsIm1pblJhbmsiKSlyZXN1bHQuc2V0Tm9kZSh2LHtib3JkZXJMZWZ0Om5vZGUuYm9yZGVyTGVmdFtyYW5rXSxib3JkZXJSaWdodDpub2RlLmJvcmRlclJpZ2h0W3JhbmtdfSl9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKXt2YXIgdjsKd2hpbGUoZy5oYXNOb2RlKHY9Xy51bmlxdWVJZCgiX3Jvb3QiKSkpO3JldHVybiB2fX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMH1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1jcm9zc0NvdW50O2Z1bmN0aW9uIGNyb3NzQ291bnQoZyxsYXllcmluZyl7dmFyIGNjPTA7Zm9yKHZhciBpPTE7aTxsYXllcmluZy5sZW5ndGg7KytpKWNjKz10d29MYXllckNyb3NzQ291bnQoZyxsYXllcmluZ1tpLTFdLGxheWVyaW5nW2ldKTtyZXR1cm4gY2N9ZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsbm9ydGhMYXllcixzb3V0aExheWVyKXt2YXIgc291dGhQb3M9Xy56aXBPYmplY3Qoc291dGhMYXllcixfLm1hcChzb3V0aExheWVyLGZ1bmN0aW9uKHYsaSl7cmV0dXJuIGl9KSk7dmFyIHNvdXRoRW50cmllcz1fLmZsYXR0ZW4oXy5tYXAobm9ydGhMYXllcixmdW5jdGlvbih2KXtyZXR1cm4gXy5jaGFpbihnLm91dEVkZ2VzKHYpKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3Bvczpzb3V0aFBvc1tlLnddLAp3ZWlnaHQ6Zy5lZGdlKGUpLndlaWdodH19KS5zb3J0QnkoInBvcyIpLnZhbHVlKCl9KSx0cnVlKTt2YXIgZmlyc3RJbmRleD0xO3doaWxlKGZpcnN0SW5kZXg8c291dGhMYXllci5sZW5ndGgpZmlyc3RJbmRleDw8PTE7dmFyIHRyZWVTaXplPTIqZmlyc3RJbmRleC0xO2ZpcnN0SW5kZXgtPTE7dmFyIHRyZWU9Xy5tYXAobmV3IEFycmF5KHRyZWVTaXplKSxmdW5jdGlvbigpe3JldHVybiAwfSk7dmFyIGNjPTA7Xy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KXt2YXIgaW5kZXg9ZW50cnkucG9zK2ZpcnN0SW5kZXg7dHJlZVtpbmRleF0rPWVudHJ5LndlaWdodDt2YXIgd2VpZ2h0U3VtPTA7d2hpbGUoaW5kZXg+MCl7aWYoaW5kZXglMil3ZWlnaHRTdW0rPXRyZWVbaW5kZXgrMV07aW5kZXg9aW5kZXgtMT4+MTt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0fWNjKz1lbnRyeS53ZWlnaHQqd2VpZ2h0U3VtfSkpO3JldHVybiBjY319LHsiLi4vbG9kYXNoIjoxMH1dLAoxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksaW5pdE9yZGVyPXJlcXVpcmUoIi4vaW5pdC1vcmRlciIpLGNyb3NzQ291bnQ9cmVxdWlyZSgiLi9jcm9zcy1jb3VudCIpLHNvcnRTdWJncmFwaD1yZXF1aXJlKCIuL3NvcnQtc3ViZ3JhcGgiKSxidWlsZExheWVyR3JhcGg9cmVxdWlyZSgiLi9idWlsZC1sYXllci1ncmFwaCIpLGFkZFN1YmdyYXBoQ29uc3RyYWludHM9cmVxdWlyZSgiLi9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHMiKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPW9yZGVyO2Z1bmN0aW9uIG9yZGVyKGcpe3ZhciBtYXhSYW5rPXV0aWwubWF4UmFuayhnKSxkb3duTGF5ZXJHcmFwaHM9YnVpbGRMYXllckdyYXBocyhnLF8ucmFuZ2UoMSxtYXhSYW5rKzEpLCJpbkVkZ2VzIiksdXBMYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsCl8ucmFuZ2UobWF4UmFuay0xLC0xLC0xKSwib3V0RWRnZXMiKTt2YXIgbGF5ZXJpbmc9aW5pdE9yZGVyKGcpO2Fzc2lnbk9yZGVyKGcsbGF5ZXJpbmcpO3ZhciBiZXN0Q0M9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGJlc3Q7Zm9yKHZhciBpPTAsbGFzdEJlc3Q9MDtsYXN0QmVzdDw0OysraSwrK2xhc3RCZXN0KXtzd2VlcExheWVyR3JhcGhzKGklMj9kb3duTGF5ZXJHcmFwaHM6dXBMYXllckdyYXBocyxpJTQ+PTIpO2xheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKTt2YXIgY2M9Y3Jvc3NDb3VudChnLGxheWVyaW5nKTtpZihjYzxiZXN0Q0Mpe2xhc3RCZXN0PTA7YmVzdD1fLmNsb25lRGVlcChsYXllcmluZyk7YmVzdENDPWNjfX1hc3NpZ25PcmRlcihnLGJlc3QpfWZ1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaHMoZyxyYW5rcyxyZWxhdGlvbnNoaXApe3JldHVybiBfLm1hcChyYW5rcyxmdW5jdGlvbihyYW5rKXtyZXR1cm4gYnVpbGRMYXllckdyYXBoKGcscmFuayxyZWxhdGlvbnNoaXApfSl9CmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsYmlhc1JpZ2h0KXt2YXIgY2c9bmV3IEdyYXBoO18uZm9yRWFjaChsYXllckdyYXBocyxmdW5jdGlvbihsZyl7dmFyIHJvb3Q9bGcuZ3JhcGgoKS5yb290O3ZhciBzb3J0ZWQ9c29ydFN1YmdyYXBoKGxnLHJvb3QsY2csYmlhc1JpZ2h0KTtfLmZvckVhY2goc29ydGVkLnZzLGZ1bmN0aW9uKHYsaSl7bGcubm9kZSh2KS5vcmRlcj1pfSk7YWRkU3ViZ3JhcGhDb25zdHJhaW50cyhsZyxjZyxzb3J0ZWQudnMpfSl9ZnVuY3Rpb24gYXNzaWduT3JkZXIoZyxsYXllcmluZyl7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXtnLm5vZGUodikub3JkZXI9aX0pfSl9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHMiOjEzLCIuL2J1aWxkLWxheWVyLWdyYXBoIjoxNSwiLi9jcm9zcy1jb3VudCI6MTYsCiIuL2luaXQtb3JkZXIiOjE4LCIuL3NvcnQtc3ViZ3JhcGgiOjIwfV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWluaXRPcmRlcjtmdW5jdGlvbiBpbml0T3JkZXIoZyl7dmFyIHZpc2l0ZWQ9e30sc2ltcGxlTm9kZXM9Xy5maWx0ZXIoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiFnLmNoaWxkcmVuKHYpLmxlbmd0aH0pLG1heFJhbms9Xy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpLGxheWVycz1fLm1hcChfLnJhbmdlKG1heFJhbmsrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7dmFyIG5vZGU9Zy5ub2RlKHYpO2xheWVyc1tub2RlLnJhbmtdLnB1c2godik7Xy5mb3JFYWNoKGcuc3VjY2Vzc29ycyh2KSxkZnMpfXZhciBvcmRlcmVkVnM9Cl8uc29ydEJ5KHNpbXBsZU5vZGVzLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pO18uZm9yRWFjaChvcmRlcmVkVnMsZGZzKTtyZXR1cm4gbGF5ZXJzfX0seyIuLi9sb2Rhc2giOjEwfV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXJlc29sdmVDb25mbGljdHM7ZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0cyhlbnRyaWVzLGNnKXt2YXIgbWFwcGVkRW50cmllcz17fTtfLmZvckVhY2goZW50cmllcyxmdW5jdGlvbihlbnRyeSxpKXt2YXIgdG1wPW1hcHBlZEVudHJpZXNbZW50cnkudl09e2luZGVncmVlOjAsImluIjpbXSxvdXQ6W10sdnM6W2VudHJ5LnZdLGk6aX07aWYoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpe3RtcC5iYXJ5Y2VudGVyPWVudHJ5LmJhcnljZW50ZXI7dG1wLndlaWdodD1lbnRyeS53ZWlnaHR9fSk7Xy5mb3JFYWNoKGNnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVudHJ5Vj0KbWFwcGVkRW50cmllc1tlLnZdLGVudHJ5Vz1tYXBwZWRFbnRyaWVzW2Uud107aWYoIV8uaXNVbmRlZmluZWQoZW50cnlWKSYmIV8uaXNVbmRlZmluZWQoZW50cnlXKSl7ZW50cnlXLmluZGVncmVlKys7ZW50cnlWLm91dC5wdXNoKG1hcHBlZEVudHJpZXNbZS53XSl9fSk7dmFyIHNvdXJjZVNldD1fLmZpbHRlcihtYXBwZWRFbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4hZW50cnkuaW5kZWdyZWV9KTtyZXR1cm4gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCl9ZnVuY3Rpb24gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCl7dmFyIGVudHJpZXM9W107ZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KXtyZXR1cm4gZnVuY3Rpb24odUVudHJ5KXtpZih1RW50cnkubWVyZ2VkKXJldHVybjtpZihfLmlzVW5kZWZpbmVkKHVFbnRyeS5iYXJ5Y2VudGVyKXx8Xy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcil8fHVFbnRyeS5iYXJ5Y2VudGVyPj12RW50cnkuYmFyeWNlbnRlciltZXJnZUVudHJpZXModkVudHJ5LAp1RW50cnkpfX1mdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KXtyZXR1cm4gZnVuY3Rpb24od0VudHJ5KXt3RW50cnlbImluIl0ucHVzaCh2RW50cnkpO2lmKC0td0VudHJ5LmluZGVncmVlPT09MClzb3VyY2VTZXQucHVzaCh3RW50cnkpfX13aGlsZShzb3VyY2VTZXQubGVuZ3RoKXt2YXIgZW50cnk9c291cmNlU2V0LnBvcCgpO2VudHJpZXMucHVzaChlbnRyeSk7Xy5mb3JFYWNoKGVudHJ5WyJpbiJdLnJldmVyc2UoKSxoYW5kbGVJbihlbnRyeSkpO18uZm9yRWFjaChlbnRyeS5vdXQsaGFuZGxlT3V0KGVudHJ5KSl9cmV0dXJuIF8uY2hhaW4oZW50cmllcykuZmlsdGVyKGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4hZW50cnkubWVyZ2VkfSkubWFwKGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4gXy5waWNrKGVudHJ5LFsidnMiLCJpIiwiYmFyeWNlbnRlciIsIndlaWdodCJdKX0pLnZhbHVlKCl9ZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCxzb3VyY2Upe3ZhciBzdW09MCx3ZWlnaHQ9MDsKaWYodGFyZ2V0LndlaWdodCl7c3VtKz10YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0O3dlaWdodCs9dGFyZ2V0LndlaWdodH1pZihzb3VyY2Uud2VpZ2h0KXtzdW0rPXNvdXJjZS5iYXJ5Y2VudGVyKnNvdXJjZS53ZWlnaHQ7d2VpZ2h0Kz1zb3VyY2Uud2VpZ2h0fXRhcmdldC52cz1zb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7dGFyZ2V0LmJhcnljZW50ZXI9c3VtL3dlaWdodDt0YXJnZXQud2VpZ2h0PXdlaWdodDt0YXJnZXQuaT1NYXRoLm1pbihzb3VyY2UuaSx0YXJnZXQuaSk7c291cmNlLm1lcmdlZD10cnVlfX0seyIuLi9sb2Rhc2giOjEwfV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGJhcnljZW50ZXI9cmVxdWlyZSgiLi9iYXJ5Y2VudGVyIikscmVzb2x2ZUNvbmZsaWN0cz1yZXF1aXJlKCIuL3Jlc29sdmUtY29uZmxpY3RzIiksc29ydD1yZXF1aXJlKCIuL3NvcnQiKTttb2R1bGUuZXhwb3J0cz0Kc29ydFN1YmdyYXBoO2Z1bmN0aW9uIHNvcnRTdWJncmFwaChnLHYsY2csYmlhc1JpZ2h0KXt2YXIgbW92YWJsZT1nLmNoaWxkcmVuKHYpLG5vZGU9Zy5ub2RlKHYpLGJsPW5vZGU/bm9kZS5ib3JkZXJMZWZ0OnVuZGVmaW5lZCxicj1ub2RlP25vZGUuYm9yZGVyUmlnaHQ6dW5kZWZpbmVkLHN1YmdyYXBocz17fTtpZihibCltb3ZhYmxlPV8uZmlsdGVyKG1vdmFibGUsZnVuY3Rpb24odyl7cmV0dXJuIHchPT1ibCYmdyE9PWJyfSk7dmFyIGJhcnljZW50ZXJzPWJhcnljZW50ZXIoZyxtb3ZhYmxlKTtfLmZvckVhY2goYmFyeWNlbnRlcnMsZnVuY3Rpb24oZW50cnkpe2lmKGcuY2hpbGRyZW4oZW50cnkudikubGVuZ3RoKXt2YXIgc3ViZ3JhcGhSZXN1bHQ9c29ydFN1YmdyYXBoKGcsZW50cnkudixjZyxiaWFzUmlnaHQpO3N1YmdyYXBoc1tlbnRyeS52XT1zdWJncmFwaFJlc3VsdDtpZihfLmhhcyhzdWJncmFwaFJlc3VsdCwiYmFyeWNlbnRlciIpKW1lcmdlQmFyeWNlbnRlcnMoZW50cnksCnN1YmdyYXBoUmVzdWx0KX19KTt2YXIgZW50cmllcz1yZXNvbHZlQ29uZmxpY3RzKGJhcnljZW50ZXJzLGNnKTtleHBhbmRTdWJncmFwaHMoZW50cmllcyxzdWJncmFwaHMpO3ZhciByZXN1bHQ9c29ydChlbnRyaWVzLGJpYXNSaWdodCk7aWYoYmwpe3Jlc3VsdC52cz1fLmZsYXR0ZW4oW2JsLHJlc3VsdC52cyxicl0sdHJ1ZSk7aWYoZy5wcmVkZWNlc3NvcnMoYmwpLmxlbmd0aCl7dmFyIGJsUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxiclByZWQ9Zy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7aWYoIV8uaGFzKHJlc3VsdCwiYmFyeWNlbnRlciIpKXtyZXN1bHQuYmFyeWNlbnRlcj0wO3Jlc3VsdC53ZWlnaHQ9MH1yZXN1bHQuYmFyeWNlbnRlcj0ocmVzdWx0LmJhcnljZW50ZXIqcmVzdWx0LndlaWdodCtibFByZWQub3JkZXIrYnJQcmVkLm9yZGVyKS8ocmVzdWx0LndlaWdodCsyKTtyZXN1bHQud2VpZ2h0Kz0yfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLApzdWJncmFwaHMpe18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtlbnRyeS52cz1fLmZsYXR0ZW4oZW50cnkudnMubWFwKGZ1bmN0aW9uKHYpe2lmKHN1YmdyYXBoc1t2XSlyZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO3JldHVybiB2fSksdHJ1ZSl9KX1mdW5jdGlvbiBtZXJnZUJhcnljZW50ZXJzKHRhcmdldCxvdGhlcil7aWYoIV8uaXNVbmRlZmluZWQodGFyZ2V0LmJhcnljZW50ZXIpKXt0YXJnZXQuYmFyeWNlbnRlcj0odGFyZ2V0LmJhcnljZW50ZXIqdGFyZ2V0LndlaWdodCtvdGhlci5iYXJ5Y2VudGVyKm90aGVyLndlaWdodCkvKHRhcmdldC53ZWlnaHQrb3RoZXIud2VpZ2h0KTt0YXJnZXQud2VpZ2h0Kz1vdGhlci53ZWlnaHR9ZWxzZXt0YXJnZXQuYmFyeWNlbnRlcj1vdGhlci5iYXJ5Y2VudGVyO3RhcmdldC53ZWlnaHQ9b3RoZXIud2VpZ2h0fX19LHsiLi4vbG9kYXNoIjoxMCwiLi9iYXJ5Y2VudGVyIjoxNCwiLi9yZXNvbHZlLWNvbmZsaWN0cyI6MTksIi4vc29ydCI6MjF9XSwKMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXNvcnQ7ZnVuY3Rpb24gc29ydChlbnRyaWVzLGJpYXNSaWdodCl7dmFyIHBhcnRzPXV0aWwucGFydGl0aW9uKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLmhhcyhlbnRyeSwiYmFyeWNlbnRlciIpfSk7dmFyIHNvcnRhYmxlPXBhcnRzLmxocyx1bnNvcnRhYmxlPV8uc29ydEJ5KHBhcnRzLnJocyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuLWVudHJ5Lml9KSx2cz1bXSxzdW09MCx3ZWlnaHQ9MCx2c0luZGV4PTA7c29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCk7Xy5mb3JFYWNoKHNvcnRhYmxlLGZ1bmN0aW9uKGVudHJ5KXt2c0luZGV4Kz1lbnRyeS52cy5sZW5ndGg7dnMucHVzaChlbnRyeS52cyk7CnN1bSs9ZW50cnkuYmFyeWNlbnRlciplbnRyeS53ZWlnaHQ7d2VpZ2h0Kz1lbnRyeS53ZWlnaHQ7dnNJbmRleD1jb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLHZzSW5kZXgpfSk7dmFyIHJlc3VsdD17dnM6Xy5mbGF0dGVuKHZzLHRydWUpfTtpZih3ZWlnaHQpe3Jlc3VsdC5iYXJ5Y2VudGVyPXN1bS93ZWlnaHQ7cmVzdWx0LndlaWdodD13ZWlnaHR9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLGluZGV4KXt2YXIgbGFzdDt3aGlsZSh1bnNvcnRhYmxlLmxlbmd0aCYmKGxhc3Q9Xy5sYXN0KHVuc29ydGFibGUpKS5pPD1pbmRleCl7dW5zb3J0YWJsZS5wb3AoKTt2cy5wdXNoKGxhc3QudnMpO2luZGV4Kyt9cmV0dXJuIGluZGV4fWZ1bmN0aW9uIGNvbXBhcmVXaXRoQmlhcyhiaWFzKXtyZXR1cm4gZnVuY3Rpb24oZW50cnlWLGVudHJ5Vyl7aWYoZW50cnlWLmJhcnljZW50ZXI8ZW50cnlXLmJhcnljZW50ZXIpcmV0dXJuLTE7ZWxzZSBpZihlbnRyeVYuYmFyeWNlbnRlcj4KZW50cnlXLmJhcnljZW50ZXIpcmV0dXJuIDE7cmV0dXJuIWJpYXM/ZW50cnlWLmktZW50cnlXLmk6ZW50cnlXLmktZW50cnlWLml9fX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXBhcmVudER1bW15Q2hhaW5zO2Z1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpe3ZhciBwb3N0b3JkZXJOdW1zPXBvc3RvcmRlcihnKTtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxlZGdlT2JqPW5vZGUuZWRnZU9iaixwYXRoRGF0YT1maW5kUGF0aChnLHBvc3RvcmRlck51bXMsZWRnZU9iai52LGVkZ2VPYmoudykscGF0aD1wYXRoRGF0YS5wYXRoLGxjYT1wYXRoRGF0YS5sY2EscGF0aElkeD0wLHBhdGhWPXBhdGhbcGF0aElkeF0sYXNjZW5kaW5nPXRydWU7d2hpbGUodiE9PWVkZ2VPYmoudyl7bm9kZT0KZy5ub2RlKHYpO2lmKGFzY2VuZGluZyl7d2hpbGUoKHBhdGhWPXBhdGhbcGF0aElkeF0pIT09bGNhJiZnLm5vZGUocGF0aFYpLm1heFJhbms8bm9kZS5yYW5rKXBhdGhJZHgrKztpZihwYXRoVj09PWxjYSlhc2NlbmRpbmc9ZmFsc2V9aWYoIWFzY2VuZGluZyl7d2hpbGUocGF0aElkeDxwYXRoLmxlbmd0aC0xJiZnLm5vZGUocGF0aFY9cGF0aFtwYXRoSWR4KzFdKS5taW5SYW5rPD1ub2RlLnJhbmspcGF0aElkeCsrO3BhdGhWPXBhdGhbcGF0aElkeF19Zy5zZXRQYXJlbnQodixwYXRoVik7dj1nLnN1Y2Nlc3NvcnModilbMF19fSl9ZnVuY3Rpb24gZmluZFBhdGgoZyxwb3N0b3JkZXJOdW1zLHYsdyl7dmFyIHZQYXRoPVtdLHdQYXRoPVtdLGxvdz1NYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdyxwb3N0b3JkZXJOdW1zW3ddLmxvdyksbGltPU1hdGgubWF4KHBvc3RvcmRlck51bXNbdl0ubGltLHBvc3RvcmRlck51bXNbd10ubGltKSxwYXJlbnQsbGNhO3BhcmVudD12O2Rve3BhcmVudD0KZy5wYXJlbnQocGFyZW50KTt2UGF0aC5wdXNoKHBhcmVudCl9d2hpbGUocGFyZW50JiYocG9zdG9yZGVyTnVtc1twYXJlbnRdLmxvdz5sb3d8fGxpbT5wb3N0b3JkZXJOdW1zW3BhcmVudF0ubGltKSk7bGNhPXBhcmVudDtwYXJlbnQ9dzt3aGlsZSgocGFyZW50PWcucGFyZW50KHBhcmVudCkpIT09bGNhKXdQYXRoLnB1c2gocGFyZW50KTtyZXR1cm57cGF0aDp2UGF0aC5jb25jYXQod1BhdGgucmV2ZXJzZSgpKSxsY2E6bGNhfX1mdW5jdGlvbiBwb3N0b3JkZXIoZyl7dmFyIHJlc3VsdD17fSxsaW09MDtmdW5jdGlvbiBkZnModil7dmFyIGxvdz1saW07Xy5mb3JFYWNoKGcuY2hpbGRyZW4odiksZGZzKTtyZXN1bHRbdl09e2xvdzpsb3csbGltOmxpbSsrfX1fLmZvckVhY2goZy5jaGlsZHJlbigpLGRmcyk7cmV0dXJuIHJlc3VsdH19LHsiLi9sb2Rhc2giOjEwfV0sMjM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPQpyZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtwb3NpdGlvblg6cG9zaXRpb25YLGZpbmRUeXBlMUNvbmZsaWN0czpmaW5kVHlwZTFDb25mbGljdHMsZmluZFR5cGUyQ29uZmxpY3RzOmZpbmRUeXBlMkNvbmZsaWN0cyxhZGRDb25mbGljdDphZGRDb25mbGljdCxoYXNDb25mbGljdDpoYXNDb25mbGljdCx2ZXJ0aWNhbEFsaWdubWVudDp2ZXJ0aWNhbEFsaWdubWVudCxob3Jpem9udGFsQ29tcGFjdGlvbjpob3Jpem9udGFsQ29tcGFjdGlvbixhbGlnbkNvb3JkaW5hdGVzOmFsaWduQ29vcmRpbmF0ZXMsZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6ZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQsYmFsYW5jZTpiYWxhbmNlfTtmdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyl7dmFyIGNvbmZsaWN0cz17fTtmdW5jdGlvbiB2aXNpdExheWVyKHByZXZMYXllcixsYXllcil7dmFyIGswPTAsc2NhblBvcz0KMCxwcmV2TGF5ZXJMZW5ndGg9cHJldkxheWVyLmxlbmd0aCxsYXN0Tm9kZT1fLmxhc3QobGF5ZXIpO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe3ZhciB3PWZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KSxrMT13P2cubm9kZSh3KS5vcmRlcjpwcmV2TGF5ZXJMZW5ndGg7aWYod3x8dj09PWxhc3ROb2RlKXtfLmZvckVhY2gobGF5ZXIuc2xpY2Uoc2NhblBvcyxpKzEpLGZ1bmN0aW9uKHNjYW5Ob2RlKXtfLmZvckVhY2goZy5wcmVkZWNlc3NvcnMoc2Nhbk5vZGUpLGZ1bmN0aW9uKHUpe3ZhciB1TGFiZWw9Zy5ub2RlKHUpLHVQb3M9dUxhYmVsLm9yZGVyO2lmKCh1UG9zPGswfHxrMTx1UG9zKSYmISh1TGFiZWwuZHVtbXkmJmcubm9kZShzY2FuTm9kZSkuZHVtbXkpKWFkZENvbmZsaWN0KGNvbmZsaWN0cyx1LHNjYW5Ob2RlKX0pfSk7c2NhblBvcz1pKzE7azA9azF9fSk7cmV0dXJuIGxheWVyfV8ucmVkdWNlKGxheWVyaW5nLHZpc2l0TGF5ZXIpO3JldHVybiBjb25mbGljdHN9CmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHNjYW4oc291dGgsc291dGhQb3Msc291dGhFbmQscHJldk5vcnRoQm9yZGVyLG5leHROb3J0aEJvcmRlcil7dmFyIHY7Xy5mb3JFYWNoKF8ucmFuZ2Uoc291dGhQb3Msc291dGhFbmQpLGZ1bmN0aW9uKGkpe3Y9c291dGhbaV07aWYoZy5ub2RlKHYpLmR1bW15KV8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXt2YXIgdU5vZGU9Zy5ub2RlKHUpO2lmKHVOb2RlLmR1bW15JiYodU5vZGUub3JkZXI8cHJldk5vcnRoQm9yZGVyfHx1Tm9kZS5vcmRlcj5uZXh0Tm9ydGhCb3JkZXIpKWFkZENvbmZsaWN0KGNvbmZsaWN0cyx1LHYpfSl9KX1mdW5jdGlvbiB2aXNpdExheWVyKG5vcnRoLHNvdXRoKXt2YXIgcHJldk5vcnRoUG9zPS0xLG5leHROb3J0aFBvcyxzb3V0aFBvcz0wO18uZm9yRWFjaChzb3V0aCxmdW5jdGlvbih2LHNvdXRoTG9va2FoZWFkKXtpZihnLm5vZGUodikuZHVtbXk9PT0KImJvcmRlciIpe3ZhciBwcmVkZWNlc3NvcnM9Zy5wcmVkZWNlc3NvcnModik7aWYocHJlZGVjZXNzb3JzLmxlbmd0aCl7bmV4dE5vcnRoUG9zPWcubm9kZShwcmVkZWNlc3NvcnNbMF0pLm9yZGVyO3NjYW4oc291dGgsc291dGhQb3Msc291dGhMb29rYWhlYWQscHJldk5vcnRoUG9zLG5leHROb3J0aFBvcyk7c291dGhQb3M9c291dGhMb29rYWhlYWQ7cHJldk5vcnRoUG9zPW5leHROb3J0aFBvc319c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aC5sZW5ndGgsbmV4dE5vcnRoUG9zLG5vcnRoLmxlbmd0aCl9KTtyZXR1cm4gc291dGh9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c31mdW5jdGlvbiBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsdil7aWYoZy5ub2RlKHYpLmR1bW15KXJldHVybiBfLmZpbmQoZy5wcmVkZWNlc3NvcnModiksZnVuY3Rpb24odSl7cmV0dXJuIGcubm9kZSh1KS5kdW1teX0pfWZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywKdix3KXtpZih2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9dmFyIGNvbmZsaWN0c1Y9Y29uZmxpY3RzW3ZdO2lmKCFjb25mbGljdHNWKWNvbmZsaWN0c1t2XT1jb25mbGljdHNWPXt9O2NvbmZsaWN0c1Zbd109dHJ1ZX1mdW5jdGlvbiBoYXNDb25mbGljdChjb25mbGljdHMsdix3KXtpZih2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSx3KX1mdW5jdGlvbiB2ZXJ0aWNhbEFsaWdubWVudChnLGxheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKXt2YXIgcm9vdD17fSxhbGlnbj17fSxwb3M9e307Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixvcmRlcil7cm9vdFt2XT12O2FsaWduW3ZdPXY7cG9zW3ZdPW9yZGVyfSl9KTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBwcmV2SWR4PS0xO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXt2YXIgd3M9bmVpZ2hib3JGbih2KTsKaWYod3MubGVuZ3RoKXt3cz1fLnNvcnRCeSh3cyxmdW5jdGlvbih3KXtyZXR1cm4gcG9zW3ddfSk7dmFyIG1wPSh3cy5sZW5ndGgtMSkvMjtmb3IodmFyIGk9TWF0aC5mbG9vcihtcCksaWw9TWF0aC5jZWlsKG1wKTtpPD1pbDsrK2kpe3ZhciB3PXdzW2ldO2lmKGFsaWduW3ZdPT09diYmcHJldklkeDxwb3Nbd10mJiFoYXNDb25mbGljdChjb25mbGljdHMsdix3KSl7YWxpZ25bd109djthbGlnblt2XT1yb290W3ZdPXJvb3Rbd107cHJldklkeD1wb3Nbd119fX19KX0pO3JldHVybntyb290OnJvb3QsYWxpZ246YWxpZ259fWZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsbGF5ZXJpbmcscm9vdCxhbGlnbixyZXZlcnNlU2VwKXt2YXIgeHM9e30sYmxvY2tHPWJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCksYm9yZGVyVHlwZT1yZXZlcnNlU2VwPyJib3JkZXJMZWZ0IjoiYm9yZGVyUmlnaHQiO2Z1bmN0aW9uIGl0ZXJhdGUoc2V0WHNGdW5jLG5leHROb2Rlc0Z1bmMpe3ZhciBzdGFjaz0KYmxvY2tHLm5vZGVzKCk7dmFyIGVsZW09c3RhY2sucG9wKCk7dmFyIHZpc2l0ZWQ9e307d2hpbGUoZWxlbSl7aWYodmlzaXRlZFtlbGVtXSlzZXRYc0Z1bmMoZWxlbSk7ZWxzZXt2aXNpdGVkW2VsZW1dPXRydWU7c3RhY2sucHVzaChlbGVtKTtzdGFjaz1zdGFjay5jb25jYXQobmV4dE5vZGVzRnVuYyhlbGVtKSl9ZWxlbT1zdGFjay5wb3AoKX19ZnVuY3Rpb24gcGFzczEoZWxlbSl7eHNbZWxlbV09YmxvY2tHLmluRWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gTWF0aC5tYXgoYWNjLHhzW2Uudl0rYmxvY2tHLmVkZ2UoZSkpfSwwKX1mdW5jdGlvbiBwYXNzMihlbGVtKXt2YXIgbWluPWJsb2NrRy5vdXRFZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1pbihhY2MseHNbZS53XS1ibG9ja0cuZWRnZShlKSl9LE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dmFyIG5vZGU9Zy5ub2RlKGVsZW0pO2lmKG1pbiE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmCm5vZGUuYm9yZGVyVHlwZSE9PWJvcmRlclR5cGUpeHNbZWxlbV09TWF0aC5tYXgoeHNbZWxlbV0sbWluKX1pdGVyYXRlKHBhc3MxLF8uYmluZChibG9ja0cucHJlZGVjZXNzb3JzLGJsb2NrRykpO2l0ZXJhdGUocGFzczIsXy5iaW5kKGJsb2NrRy5zdWNjZXNzb3JzLGJsb2NrRykpO18uZm9yRWFjaChhbGlnbixmdW5jdGlvbih2KXt4c1t2XT14c1tyb290W3ZdXX0pO3JldHVybiB4c31mdW5jdGlvbiBidWlsZEJsb2NrR3JhcGgoZyxsYXllcmluZyxyb290LHJldmVyc2VTZXApe3ZhciBibG9ja0dyYXBoPW5ldyBHcmFwaCxncmFwaExhYmVsPWcuZ3JhcGgoKSxzZXBGbj1zZXAoZ3JhcGhMYWJlbC5ub2Rlc2VwLGdyYXBoTGFiZWwuZWRnZXNlcCxyZXZlcnNlU2VwKTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciB1O18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXt2YXIgdlJvb3Q9cm9vdFt2XTtibG9ja0dyYXBoLnNldE5vZGUodlJvb3QpO2lmKHUpe3ZhciB1Um9vdD0Kcm9vdFt1XSxwcmV2TWF4PWJsb2NrR3JhcGguZWRnZSh1Um9vdCx2Um9vdCk7YmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LHZSb290LE1hdGgubWF4KHNlcEZuKGcsdix1KSxwcmV2TWF4fHwwKSl9dT12fSl9KTtyZXR1cm4gYmxvY2tHcmFwaH1mdW5jdGlvbiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyl7cmV0dXJuIF8ubWluQnkoXy52YWx1ZXMoeHNzKSxmdW5jdGlvbih4cyl7dmFyIG1heD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7dmFyIG1pbj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7Xy5mb3JJbih4cyxmdW5jdGlvbih4LHYpe3ZhciBoYWxmV2lkdGg9d2lkdGgoZyx2KS8yO21heD1NYXRoLm1heCh4K2hhbGZXaWR0aCxtYXgpO21pbj1NYXRoLm1pbih4LWhhbGZXaWR0aCxtaW4pfSk7cmV0dXJuIG1heC1taW59KX1mdW5jdGlvbiBhbGlnbkNvb3JkaW5hdGVzKHhzcyxhbGlnblRvKXt2YXIgYWxpZ25Ub1ZhbHM9Xy52YWx1ZXMoYWxpZ25UbyksYWxpZ25Ub01pbj0KXy5taW4oYWxpZ25Ub1ZhbHMpLGFsaWduVG9NYXg9Xy5tYXgoYWxpZ25Ub1ZhbHMpO18uZm9yRWFjaChbInUiLCJkIl0sZnVuY3Rpb24odmVydCl7Xy5mb3JFYWNoKFsibCIsInIiXSxmdW5jdGlvbihob3Jpeil7dmFyIGFsaWdubWVudD12ZXJ0K2hvcml6LHhzPXhzc1thbGlnbm1lbnRdLGRlbHRhO2lmKHhzPT09YWxpZ25UbylyZXR1cm47dmFyIHhzVmFscz1fLnZhbHVlcyh4cyk7ZGVsdGE9aG9yaXo9PT0ibCI/YWxpZ25Ub01pbi1fLm1pbih4c1ZhbHMpOmFsaWduVG9NYXgtXy5tYXgoeHNWYWxzKTtpZihkZWx0YSl4c3NbYWxpZ25tZW50XT1fLm1hcFZhbHVlcyh4cyxmdW5jdGlvbih4KXtyZXR1cm4geCtkZWx0YX0pfSl9KX1mdW5jdGlvbiBiYWxhbmNlKHhzcyxhbGlnbil7cmV0dXJuIF8ubWFwVmFsdWVzKHhzcy51bCxmdW5jdGlvbihpZ25vcmUsdil7aWYoYWxpZ24pcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtlbHNle3ZhciB4cz1fLnNvcnRCeShfLm1hcCh4c3MsCnYpKTtyZXR1cm4oeHNbMV0reHNbMl0pLzJ9fSl9ZnVuY3Rpb24gcG9zaXRpb25YKGcpe3ZhciBsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyksY29uZmxpY3RzPV8ubWVyZ2UoZmluZFR5cGUxQ29uZmxpY3RzKGcsbGF5ZXJpbmcpLGZpbmRUeXBlMkNvbmZsaWN0cyhnLGxheWVyaW5nKSk7dmFyIHhzcz17fSxhZGp1c3RlZExheWVyaW5nO18uZm9yRWFjaChbInUiLCJkIl0sZnVuY3Rpb24odmVydCl7YWRqdXN0ZWRMYXllcmluZz12ZXJ0PT09InUiP2xheWVyaW5nOl8udmFsdWVzKGxheWVyaW5nKS5yZXZlcnNlKCk7Xy5mb3JFYWNoKFsibCIsInIiXSxmdW5jdGlvbihob3Jpeil7aWYoaG9yaXo9PT0iciIpYWRqdXN0ZWRMYXllcmluZz1fLm1hcChhZGp1c3RlZExheWVyaW5nLGZ1bmN0aW9uKGlubmVyKXtyZXR1cm4gXy52YWx1ZXMoaW5uZXIpLnJldmVyc2UoKX0pO3ZhciBuZWlnaGJvckZuPV8uYmluZCh2ZXJ0PT09InUiP2cucHJlZGVjZXNzb3JzOmcuc3VjY2Vzc29ycywKZyk7dmFyIGFsaWduPXZlcnRpY2FsQWxpZ25tZW50KGcsYWRqdXN0ZWRMYXllcmluZyxjb25mbGljdHMsbmVpZ2hib3JGbik7dmFyIHhzPWhvcml6b250YWxDb21wYWN0aW9uKGcsYWRqdXN0ZWRMYXllcmluZyxhbGlnbi5yb290LGFsaWduLmFsaWduLGhvcml6PT09InIiKTtpZihob3Jpej09PSJyIil4cz1fLm1hcFZhbHVlcyh4cyxmdW5jdGlvbih4KXtyZXR1cm4teH0pO3hzc1t2ZXJ0K2hvcml6XT14c30pfSk7dmFyIHNtYWxsZXN0V2lkdGg9ZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZyx4c3MpO2FsaWduQ29vcmRpbmF0ZXMoeHNzLHNtYWxsZXN0V2lkdGgpO3JldHVybiBiYWxhbmNlKHhzcyxnLmdyYXBoKCkuYWxpZ24pfWZ1bmN0aW9uIHNlcChub2RlU2VwLGVkZ2VTZXAscmV2ZXJzZVNlcCl7cmV0dXJuIGZ1bmN0aW9uKGcsdix3KXt2YXIgdkxhYmVsPWcubm9kZSh2KSx3TGFiZWw9Zy5ub2RlKHcpLHN1bT0wLGRlbHRhO3N1bSs9dkxhYmVsLndpZHRoLzI7aWYoXy5oYXModkxhYmVsLAoibGFiZWxwb3MiKSlzd2l0Y2godkxhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UgImwiOmRlbHRhPS12TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT12TGFiZWwud2lkdGgvMjticmVha31pZihkZWx0YSlzdW0rPXJldmVyc2VTZXA/ZGVsdGE6LWRlbHRhO2RlbHRhPTA7c3VtKz0odkxhYmVsLmR1bW15P2VkZ2VTZXA6bm9kZVNlcCkvMjtzdW0rPSh3TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9d0xhYmVsLndpZHRoLzI7aWYoXy5oYXMod0xhYmVsLCJsYWJlbHBvcyIpKXN3aXRjaCh3TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9d0xhYmVsLndpZHRoLzI7YnJlYWs7Y2FzZSAiciI6ZGVsdGE9LXdMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtyZXR1cm4gc3VtfX1mdW5jdGlvbiB3aWR0aChnLHYpe3JldHVybiBnLm5vZGUodikud2lkdGh9Cn0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6Mjl9XSwyNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIikscG9zaXRpb25YPXJlcXVpcmUoIi4vYmsiKS5wb3NpdGlvblg7bW9kdWxlLmV4cG9ydHM9cG9zaXRpb247ZnVuY3Rpb24gcG9zaXRpb24oZyl7Zz11dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKTtwb3NpdGlvblkoZyk7Xy5mb3JFYWNoKHBvc2l0aW9uWChnKSxmdW5jdGlvbih4LHYpe2cubm9kZSh2KS54PXh9KX1mdW5jdGlvbiBwb3NpdGlvblkoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxyYW5rU2VwPWcuZ3JhcGgoKS5yYW5rc2VwLHByZXZZPTA7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgbWF4SGVpZ2h0PV8ubWF4KF8ubWFwKGxheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikuaGVpZ2h0fSkpOwpfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7Zy5ub2RlKHYpLnk9cHJldlkrbWF4SGVpZ2h0LzJ9KTtwcmV2WSs9bWF4SGVpZ2h0K3JhbmtTZXB9KX19LHsiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vYmsiOjIzfV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsc2xhY2s9cmVxdWlyZSgiLi91dGlsIikuc2xhY2s7bW9kdWxlLmV4cG9ydHM9ZmVhc2libGVUcmVlO2Z1bmN0aW9uIGZlYXNpYmxlVHJlZShnKXt2YXIgdD1uZXcgR3JhcGgoe2RpcmVjdGVkOmZhbHNlfSk7dmFyIHN0YXJ0PWcubm9kZXMoKVswXSxzaXplPWcubm9kZUNvdW50KCk7dC5zZXROb2RlKHN0YXJ0LHt9KTt2YXIgZWRnZSxkZWx0YTt3aGlsZSh0aWdodFRyZWUodCxnKTxzaXplKXtlZGdlPWZpbmRNaW5TbGFja0VkZ2UodCxnKTtkZWx0YT10Lmhhc05vZGUoZWRnZS52KT8Kc2xhY2soZyxlZGdlKTotc2xhY2soZyxlZGdlKTtzaGlmdFJhbmtzKHQsZyxkZWx0YSl9cmV0dXJuIHR9ZnVuY3Rpb24gdGlnaHRUcmVlKHQsZyl7ZnVuY3Rpb24gZGZzKHYpe18uZm9yRWFjaChnLm5vZGVFZGdlcyh2KSxmdW5jdGlvbihlKXt2YXIgZWRnZVY9ZS52LHc9dj09PWVkZ2VWP2UudzplZGdlVjtpZighdC5oYXNOb2RlKHcpJiYhc2xhY2soZyxlKSl7dC5zZXROb2RlKHcse30pO3Quc2V0RWRnZSh2LHcse30pO2Rmcyh3KX19KX1fLmZvckVhY2godC5ub2RlcygpLGRmcyk7cmV0dXJuIHQubm9kZUNvdW50KCl9ZnVuY3Rpb24gZmluZE1pblNsYWNrRWRnZSh0LGcpe3JldHVybiBfLm1pbkJ5KGcuZWRnZXMoKSxmdW5jdGlvbihlKXtpZih0Lmhhc05vZGUoZS52KSE9PXQuaGFzTm9kZShlLncpKXJldHVybiBzbGFjayhnLGUpfSl9ZnVuY3Rpb24gc2hpZnRSYW5rcyh0LGcsZGVsdGEpe18uZm9yRWFjaCh0Lm5vZGVzKCksZnVuY3Rpb24odil7Zy5ub2RlKHYpLnJhbmsrPWRlbHRhfSl9Cn0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOH1dLDI2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgcmFua1V0aWw9cmVxdWlyZSgiLi91dGlsIiksbG9uZ2VzdFBhdGg9cmFua1V0aWwubG9uZ2VzdFBhdGgsZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLG5ldHdvcmtTaW1wbGV4PXJlcXVpcmUoIi4vbmV0d29yay1zaW1wbGV4Iik7bW9kdWxlLmV4cG9ydHM9cmFuaztmdW5jdGlvbiByYW5rKGcpe3N3aXRjaChnLmdyYXBoKCkucmFua2VyKXtjYXNlICJuZXR3b3JrLXNpbXBsZXgiOm5ldHdvcmtTaW1wbGV4UmFua2VyKGcpO2JyZWFrO2Nhc2UgInRpZ2h0LXRyZWUiOnRpZ2h0VHJlZVJhbmtlcihnKTticmVhaztjYXNlICJsb25nZXN0LXBhdGgiOmxvbmdlc3RQYXRoUmFua2VyKGcpO2JyZWFrO2RlZmF1bHQ6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyl9fXZhciBsb25nZXN0UGF0aFJhbmtlcj1sb25nZXN0UGF0aDsKZnVuY3Rpb24gdGlnaHRUcmVlUmFua2VyKGcpe2xvbmdlc3RQYXRoKGcpO2ZlYXNpYmxlVHJlZShnKX1mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKXtuZXR3b3JrU2ltcGxleChnKX19LHsiLi9mZWFzaWJsZS10cmVlIjoyNSwiLi9uZXR3b3JrLXNpbXBsZXgiOjI3LCIuL3V0aWwiOjI4fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGZlYXNpYmxlVHJlZT1yZXF1aXJlKCIuL2ZlYXNpYmxlLXRyZWUiKSxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjayxpbml0UmFuaz1yZXF1aXJlKCIuL3V0aWwiKS5sb25nZXN0UGF0aCxwcmVvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wcmVvcmRlcixwb3N0b3JkZXI9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5hbGcucG9zdG9yZGVyLHNpbXBsaWZ5PXJlcXVpcmUoIi4uL3V0aWwiKS5zaW1wbGlmeTttb2R1bGUuZXhwb3J0cz1uZXR3b3JrU2ltcGxleDsKbmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcz1pbml0TG93TGltVmFsdWVzO25ldHdvcmtTaW1wbGV4LmluaXRDdXRWYWx1ZXM9aW5pdEN1dFZhbHVlcztuZXR3b3JrU2ltcGxleC5jYWxjQ3V0VmFsdWU9Y2FsY0N1dFZhbHVlO25ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZT1sZWF2ZUVkZ2U7bmV0d29ya1NpbXBsZXguZW50ZXJFZGdlPWVudGVyRWRnZTtuZXR3b3JrU2ltcGxleC5leGNoYW5nZUVkZ2VzPWV4Y2hhbmdlRWRnZXM7ZnVuY3Rpb24gbmV0d29ya1NpbXBsZXgoZyl7Zz1zaW1wbGlmeShnKTtpbml0UmFuayhnKTt2YXIgdD1mZWFzaWJsZVRyZWUoZyk7aW5pdExvd0xpbVZhbHVlcyh0KTtpbml0Q3V0VmFsdWVzKHQsZyk7dmFyIGUsZjt3aGlsZShlPWxlYXZlRWRnZSh0KSl7Zj1lbnRlckVkZ2UodCxnLGUpO2V4Y2hhbmdlRWRnZXModCxnLGUsZil9fWZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCxnKXt2YXIgdnM9cG9zdG9yZGVyKHQsdC5ub2RlcygpKTt2cz12cy5zbGljZSgwLAp2cy5sZW5ndGgtMSk7Xy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2Fzc2lnbkN1dFZhbHVlKHQsZyx2KX0pfWZ1bmN0aW9uIGFzc2lnbkN1dFZhbHVlKHQsZyxjaGlsZCl7dmFyIGNoaWxkTGFiPXQubm9kZShjaGlsZCkscGFyZW50PWNoaWxkTGFiLnBhcmVudDt0LmVkZ2UoY2hpbGQscGFyZW50KS5jdXR2YWx1ZT1jYWxjQ3V0VmFsdWUodCxnLGNoaWxkKX1mdW5jdGlvbiBjYWxjQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50LGNoaWxkSXNUYWlsPXRydWUsZ3JhcGhFZGdlPWcuZWRnZShjaGlsZCxwYXJlbnQpLGN1dFZhbHVlPTA7aWYoIWdyYXBoRWRnZSl7Y2hpbGRJc1RhaWw9ZmFsc2U7Z3JhcGhFZGdlPWcuZWRnZShwYXJlbnQsY2hpbGQpfWN1dFZhbHVlPWdyYXBoRWRnZS53ZWlnaHQ7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKGNoaWxkKSxmdW5jdGlvbihlKXt2YXIgaXNPdXRFZGdlPWUudj09PWNoaWxkLG90aGVyPQppc091dEVkZ2U/ZS53OmUudjtpZihvdGhlciE9PXBhcmVudCl7dmFyIHBvaW50c1RvSGVhZD1pc091dEVkZ2U9PT1jaGlsZElzVGFpbCxvdGhlcldlaWdodD1nLmVkZ2UoZSkud2VpZ2h0O2N1dFZhbHVlKz1wb2ludHNUb0hlYWQ/b3RoZXJXZWlnaHQ6LW90aGVyV2VpZ2h0O2lmKGlzVHJlZUVkZ2UodCxjaGlsZCxvdGhlcikpe3ZhciBvdGhlckN1dFZhbHVlPXQuZWRnZShjaGlsZCxvdGhlcikuY3V0dmFsdWU7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD8tb3RoZXJDdXRWYWx1ZTpvdGhlckN1dFZhbHVlfX19KTtyZXR1cm4gY3V0VmFsdWV9ZnVuY3Rpb24gaW5pdExvd0xpbVZhbHVlcyh0cmVlLHJvb3Qpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Milyb290PXRyZWUubm9kZXMoKVswXTtkZnNBc3NpZ25Mb3dMaW0odHJlZSx7fSwxLHJvb3QpfWZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLHZpc2l0ZWQsbmV4dExpbSx2LHBhcmVudCl7dmFyIGxvdz1uZXh0TGltLGxhYmVsPXRyZWUubm9kZSh2KTsKdmlzaXRlZFt2XT10cnVlO18uZm9yRWFjaCh0cmVlLm5laWdoYm9ycyh2KSxmdW5jdGlvbih3KXtpZighXy5oYXModmlzaXRlZCx3KSluZXh0TGltPWRmc0Fzc2lnbkxvd0xpbSh0cmVlLHZpc2l0ZWQsbmV4dExpbSx3LHYpfSk7bGFiZWwubG93PWxvdztsYWJlbC5saW09bmV4dExpbSsrO2lmKHBhcmVudClsYWJlbC5wYXJlbnQ9cGFyZW50O2Vsc2UgZGVsZXRlIGxhYmVsLnBhcmVudDtyZXR1cm4gbmV4dExpbX1mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSl7cmV0dXJuIF8uZmluZCh0cmVlLmVkZ2VzKCksZnVuY3Rpb24oZSl7cmV0dXJuIHRyZWUuZWRnZShlKS5jdXR2YWx1ZTwwfSl9ZnVuY3Rpb24gZW50ZXJFZGdlKHQsZyxlZGdlKXt2YXIgdj1lZGdlLnYsdz1lZGdlLnc7aWYoIWcuaGFzRWRnZSh2LHcpKXt2PWVkZ2Uudzt3PWVkZ2Uudn12YXIgdkxhYmVsPXQubm9kZSh2KSx3TGFiZWw9dC5ub2RlKHcpLHRhaWxMYWJlbD12TGFiZWwsZmxpcD1mYWxzZTtpZih2TGFiZWwubGltPndMYWJlbC5saW0pe3RhaWxMYWJlbD0Kd0xhYmVsO2ZsaXA9dHJ1ZX12YXIgY2FuZGlkYXRlcz1fLmZpbHRlcihnLmVkZ2VzKCksZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGZsaXA9PT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS52KSx0YWlsTGFiZWwpJiZmbGlwIT09aXNEZXNjZW5kYW50KHQsdC5ub2RlKGVkZ2UudyksdGFpbExhYmVsKX0pO3JldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIHNsYWNrKGcsZWRnZSl9KX1mdW5jdGlvbiBleGNoYW5nZUVkZ2VzKHQsZyxlLGYpe3ZhciB2PWUudix3PWUudzt0LnJlbW92ZUVkZ2Uodix3KTt0LnNldEVkZ2UoZi52LGYudyx7fSk7aW5pdExvd0xpbVZhbHVlcyh0KTtpbml0Q3V0VmFsdWVzKHQsZyk7dXBkYXRlUmFua3ModCxnKX1mdW5jdGlvbiB1cGRhdGVSYW5rcyh0LGcpe3ZhciByb290PV8uZmluZCh0Lm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcubm9kZSh2KS5wYXJlbnR9KSx2cz1wcmVvcmRlcih0LHJvb3QpO3ZzPXZzLnNsaWNlKDEpOwpfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIHBhcmVudD10Lm5vZGUodikucGFyZW50LGVkZ2U9Zy5lZGdlKHYscGFyZW50KSxmbGlwcGVkPWZhbHNlO2lmKCFlZGdlKXtlZGdlPWcuZWRnZShwYXJlbnQsdik7ZmxpcHBlZD10cnVlfWcubm9kZSh2KS5yYW5rPWcubm9kZShwYXJlbnQpLnJhbmsrKGZsaXBwZWQ/ZWRnZS5taW5sZW46LWVkZ2UubWlubGVuKX0pfWZ1bmN0aW9uIGlzVHJlZUVkZ2UodHJlZSx1LHYpe3JldHVybiB0cmVlLmhhc0VkZ2UodSx2KX1mdW5jdGlvbiBpc0Rlc2NlbmRhbnQodHJlZSx2TGFiZWwscm9vdExhYmVsKXtyZXR1cm4gcm9vdExhYmVsLmxvdzw9dkxhYmVsLmxpbSYmdkxhYmVsLmxpbTw9cm9vdExhYmVsLmxpbX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL3V0aWwiOjI4fV0sMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpOwptb2R1bGUuZXhwb3J0cz17bG9uZ2VzdFBhdGg6bG9uZ2VzdFBhdGgsc2xhY2s6c2xhY2t9O2Z1bmN0aW9uIGxvbmdlc3RQYXRoKGcpe3ZhciB2aXNpdGVkPXt9O2Z1bmN0aW9uIGRmcyh2KXt2YXIgbGFiZWw9Zy5ub2RlKHYpO2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuIGxhYmVsLnJhbms7dmlzaXRlZFt2XT10cnVlO3ZhciByYW5rPV8ubWluQnkoXy5tYXAoZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtyZXR1cm4gZGZzKGUudyktZy5lZGdlKGUpLm1pbmxlbn0pKTtpZihyYW5rPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfHxyYW5rPT09dW5kZWZpbmVkfHxyYW5rPT09bnVsbClyYW5rPTA7cmV0dXJuIGxhYmVsLnJhbms9cmFua31fLmZvckVhY2goZy5zb3VyY2VzKCksZGZzKX1mdW5jdGlvbiBzbGFjayhnLGUpe3JldHVybiBnLm5vZGUoZS53KS5yYW5rLWcubm9kZShlLnYpLnJhbmstZy5lZGdlKGUpLm1pbmxlbn19LHsiLi4vbG9kYXNoIjoxMH1dLDI5OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9e2FkZER1bW15Tm9kZTphZGREdW1teU5vZGUsc2ltcGxpZnk6c2ltcGxpZnksYXNOb25Db21wb3VuZEdyYXBoOmFzTm9uQ29tcG91bmRHcmFwaCxzdWNjZXNzb3JXZWlnaHRzOnN1Y2Nlc3NvcldlaWdodHMscHJlZGVjZXNzb3JXZWlnaHRzOnByZWRlY2Vzc29yV2VpZ2h0cyxpbnRlcnNlY3RSZWN0OmludGVyc2VjdFJlY3QsYnVpbGRMYXllck1hdHJpeDpidWlsZExheWVyTWF0cml4LG5vcm1hbGl6ZVJhbmtzOm5vcm1hbGl6ZVJhbmtzLHJlbW92ZUVtcHR5UmFua3M6cmVtb3ZlRW1wdHlSYW5rcyxhZGRCb3JkZXJOb2RlOmFkZEJvcmRlck5vZGUsbWF4UmFuazptYXhSYW5rLHBhcnRpdGlvbjpwYXJ0aXRpb24sdGltZTp0aW1lLG5vdGltZTpub3RpbWV9O2Z1bmN0aW9uIGFkZER1bW15Tm9kZShnLHR5cGUsYXR0cnMsbmFtZSl7dmFyIHY7CmRvIHY9Xy51bmlxdWVJZChuYW1lKTt3aGlsZShnLmhhc05vZGUodikpO2F0dHJzLmR1bW15PXR5cGU7Zy5zZXROb2RlKHYsYXR0cnMpO3JldHVybiB2fWZ1bmN0aW9uIHNpbXBsaWZ5KGcpe3ZhciBzaW1wbGlmaWVkPShuZXcgR3JhcGgpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzaW1wbGlmaWVkLnNldE5vZGUodixnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgc2ltcGxlTGFiZWw9c2ltcGxpZmllZC5lZGdlKGUudixlLncpfHx7d2VpZ2h0OjAsbWlubGVuOjF9LGxhYmVsPWcuZWRnZShlKTtzaW1wbGlmaWVkLnNldEVkZ2UoZS52LGUudyx7d2VpZ2h0OnNpbXBsZUxhYmVsLndlaWdodCtsYWJlbC53ZWlnaHQsbWlubGVuOk1hdGgubWF4KHNpbXBsZUxhYmVsLm1pbmxlbixsYWJlbC5taW5sZW4pfSl9KTtyZXR1cm4gc2ltcGxpZmllZH1mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZyl7dmFyIHNpbXBsaWZpZWQ9CihuZXcgR3JhcGgoe211bHRpZ3JhcGg6Zy5pc011bHRpZ3JhcGgoKX0pKS5zZXRHcmFwaChnLmdyYXBoKCkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aWYoIWcuY2hpbGRyZW4odikubGVuZ3RoKXNpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3NpbXBsaWZpZWQuc2V0RWRnZShlLGcuZWRnZShlKSl9KTtyZXR1cm4gc2ltcGxpZmllZH1mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpe3ZhciB3ZWlnaHRNYXA9Xy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBzdWNzPXt9O18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3N1Y3NbZS53XT0oc3Vjc1tlLnddfHwwKStnLmVkZ2UoZSkud2VpZ2h0fSk7cmV0dXJuIHN1Y3N9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpe3ZhciB3ZWlnaHRNYXA9Xy5tYXAoZy5ub2RlcygpLApmdW5jdGlvbih2KXt2YXIgcHJlZHM9e307Xy5mb3JFYWNoKGcuaW5FZGdlcyh2KSxmdW5jdGlvbihlKXtwcmVkc1tlLnZdPShwcmVkc1tlLnZdfHwwKStnLmVkZ2UoZSkud2VpZ2h0fSk7cmV0dXJuIHByZWRzfSk7cmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSx3ZWlnaHRNYXApfWZ1bmN0aW9uIGludGVyc2VjdFJlY3QocmVjdCxwb2ludCl7dmFyIHg9cmVjdC54O3ZhciB5PXJlY3QueTt2YXIgZHg9cG9pbnQueC14O3ZhciBkeT1wb2ludC55LXk7dmFyIHc9cmVjdC53aWR0aC8yO3ZhciBoPXJlY3QuaGVpZ2h0LzI7aWYoIWR4JiYhZHkpdGhyb3cgbmV3IEVycm9yKCJOb3QgcG9zc2libGUgdG8gZmluZCBpbnRlcnNlY3Rpb24gaW5zaWRlIG9mIHRoZSByZWN0YW5nbGUiKTt2YXIgc3gsc3k7aWYoTWF0aC5hYnMoZHkpKnc+TWF0aC5hYnMoZHgpKmgpe2lmKGR5PDApaD0taDtzeD1oKmR4L2R5O3N5PWh9ZWxzZXtpZihkeDwwKXc9LXc7c3g9dztzeT13KmR5L2R4fXJldHVybnt4OngrCnN4LHk6eStzeX19ZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKXt2YXIgbGF5ZXJpbmc9Xy5tYXAoXy5yYW5nZShtYXhSYW5rKGcpKzEpLGZ1bmN0aW9uKCl7cmV0dXJuW119KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxyYW5rPW5vZGUucmFuaztpZighXy5pc1VuZGVmaW5lZChyYW5rKSlsYXllcmluZ1tyYW5rXVtub2RlLm9yZGVyXT12fSk7cmV0dXJuIGxheWVyaW5nfWZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmtzKGcpe3ZhciBtaW49Xy5taW5CeShfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKF8uaGFzKG5vZGUsInJhbmsiKSlub2RlLnJhbmstPW1pbn0pfWZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZyl7dmFyIG9mZnNldD1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7CnZhciBsYXllcnM9W107Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgcmFuaz1nLm5vZGUodikucmFuay1vZmZzZXQ7aWYoIWxheWVyc1tyYW5rXSlsYXllcnNbcmFua109W107bGF5ZXJzW3JhbmtdLnB1c2godil9KTt2YXIgZGVsdGE9MCxub2RlUmFua0ZhY3Rvcj1nLmdyYXBoKCkubm9kZVJhbmtGYWN0b3I7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbih2cyxpKXtpZihfLmlzVW5kZWZpbmVkKHZzKSYmaSVub2RlUmFua0ZhY3RvciE9PTApLS1kZWx0YTtlbHNlIGlmKGRlbHRhKV8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0pfWZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZyxwcmVmaXgscmFuayxvcmRlcil7dmFyIG5vZGU9e3dpZHRoOjAsaGVpZ2h0OjB9O2lmKGFyZ3VtZW50cy5sZW5ndGg+PTQpe25vZGUucmFuaz1yYW5rO25vZGUub3JkZXI9b3JkZXJ9cmV0dXJuIGFkZER1bW15Tm9kZShnLCJib3JkZXIiLG5vZGUscHJlZml4KX0KZnVuY3Rpb24gbWF4UmFuayhnKXtyZXR1cm4gXy5tYXgoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKXJldHVybiByYW5rfSkpfWZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLGZuKXt2YXIgcmVzdWx0PXtsaHM6W10scmhzOltdfTtfLmZvckVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7aWYoZm4odmFsdWUpKXJlc3VsdC5saHMucHVzaCh2YWx1ZSk7ZWxzZSByZXN1bHQucmhzLnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0aW1lKG5hbWUsZm4pe3ZhciBzdGFydD1fLm5vdygpO3RyeXtyZXR1cm4gZm4oKX1maW5hbGx5e2NvbnNvbGUubG9nKG5hbWUrIiB0aW1lOiAiKyhfLm5vdygpLXN0YXJ0KSsibXMiKX19ZnVuY3Rpb24gbm90aW1lKG5hbWUsZm4pe3JldHVybiBmbigpfX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTB9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPSIwLjguMiJ9LHt9XX0se30sWzFdKSgxKX0pOwovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2Fubm90YXRpb24uanMKdmFyIHRmOwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayhxKXtyZXR1cm4oZC5yZW5kZXIuQW5ub3RhdGlvblR5cGVbcV18fCIiKS50b0xvd2VyQ2FzZSgpfHxudWxsfWZ1bmN0aW9uIHIocSx1KXt1LmFubm90YXRpb25UeXBlPT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWT9mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQocSwidXNlIikuYXR0cigiY2xhc3MiLCJzdW1tYXJ5IikuYXR0cigieGxpbms6aHJlZiIsIiNzdW1tYXJ5LWljb24iKS5hdHRyKCJjdXJzb3IiLCJwb2ludGVyIik6KHE9Zi5ub2RlLmJ1aWxkU2hhcGUocSx1LGYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKSxmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQocSwidGl0bGUiKS50ZXh0KHUubm9kZS5uYW1lKSl9ZnVuY3Rpb24gbChxLHUpe2xldCB3PXUubm9kZS5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIHAocSx3W3cubGVuZ3RoLTFdLHUsbnVsbCl9ZnVuY3Rpb24gcChxLHUsCncsQSl7bGV0IHk9Zi5DbGFzcy5Bbm5vdGF0aW9uLkxBQkVMO0EmJih5Kz0iICIrQSk7cT1xLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIix5KS5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLHcuaXNJbj8iZW5kIjoic3RhcnQiKS50ZXh0KHUpO3JldHVybiBiLmdyYXBoLnNjZW5lLm5vZGUuZW5mb3JjZUxhYmVsV2lkdGgocSwtMSl9ZnVuY3Rpb24gbShxLHUsdyxBKXtxLm9uKCJtb3VzZW92ZXIiLHk9PntBLmZpcmUoImFubm90YXRpb24taGlnaGxpZ2h0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp1Lm5vZGUubmFtZX0pfSkub24oIm1vdXNlb3V0Iix5PT57QS5maXJlKCJhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp1Lm5vZGUubmFtZX0pfSkub24oImNsaWNrIix5PT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7QS5maXJlKCJhbm5vdGF0aW9uLXNlbGVjdCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pOwppZih3LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmdy5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkNPTlNUQU5UKXEub24oImNvbnRleHRtZW51IixmLmNvbnRleHRtZW51LmdldE1lbnUoQSxmLm5vZGUuZ2V0Q29udGV4dE1lbnUody5ub2RlLEEpKSl9ZnVuY3Rpb24gbihxLHUsdyxBKXtsZXQgeT1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHUpO3cucmVuZGVyTm9kZUluZm8mJncuYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUyYmZi5ub2RlLnN0eWxpemUocSx3LnJlbmRlck5vZGVJbmZvLEEsZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpO3cuYW5ub3RhdGlvblR5cGU9PT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZJiYody53aWR0aCs9MTApO3Euc2VsZWN0KCJ0ZXh0LiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsCnkrdy5keCsody5pc0luPy0xOjEpKih3LndpZHRoLzIrdy5sYWJlbE9mZnNldCkpLmF0dHIoInkiLHUueSt3LmR5KTtxLnNlbGVjdCgidXNlLnN1bW1hcnkiKS50cmFuc2l0aW9uKCkuYXR0cigieCIseSt3LmR4LTMpLmF0dHIoInkiLHUueSt3LmR5LTYpO2YucG9zaXRpb25FbGxpcHNlKHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIGVsbGlwc2UiKSx5K3cuZHgsdS55K3cuZHksdy53aWR0aCx3LmhlaWdodCk7Zi5wb3NpdGlvblJlY3QocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgcmVjdCIpLHkrdy5keCx1Lnkrdy5keSx3LndpZHRoLHcuaGVpZ2h0KTtmLnBvc2l0aW9uUmVjdChxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiB1c2UiKSx5K3cuZHgsdS55K3cuZHksdy53aWR0aCx3LmhlaWdodCk7cS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkFubm90YXRpb24uRURHRSkudHJhbnNpdGlvbigpLmF0dHIoImQiLHg9Pgp7eD14LnBvaW50cy5tYXAoQz0+KHt4OkMuZHgreSx5OkMuZHkrdS55fSkpO3JldHVybiBmLmVkZ2UuaW50ZXJwb2xhdGUoeCl9KX1oLmJ1aWxkR3JvdXA9ZnVuY3Rpb24ocSx1LHcsQSl7cT1xLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKHUubGlzdCx5PT55Lm5vZGUubmFtZSk7cS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIseT0+eS5ub2RlLm5hbWUpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO0EuYWRkQW5ub3RhdGlvbkdyb3VwKHksdyx4KTtsZXQgQz1mLkNsYXNzLkFubm90YXRpb24uRURHRSxHPXkucmVuZGVyTWV0YWVkZ2VJbmZvJiZ5LnJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZTtHJiYhRy5udW1SZWd1bGFyRWRnZXMmJihDKz0iICIrZi5DbGFzcy5Bbm5vdGF0aW9uLkNPTlRST0xfRURHRSk7RyYmRy5udW1SZWZFZGdlcyYmKEMrPSIgIitmLkNsYXNzLkVkZ2UuUkVGX0xJTkUpOwpmLmVkZ2UuYXBwZW5kRWRnZSh4LHksQSxDKTt5LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVM/KGwoeCx5KSxyKHgseSkpOnAoeCx5Lm5vZGUubmFtZSx5LGYuQ2xhc3MuQW5ub3RhdGlvbi5FTExJUFNJUyl9KS5tZXJnZShxKS5hdHRyKCJjbGFzcyIseT0+Zi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKyIgIitrKHkuYW5ub3RhdGlvblR5cGUpKyIgIitmLm5vZGUubm9kZUNsYXNzKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB4PWQzLnNlbGVjdCh0aGlzKTtuKHgsdyx5LEEpO3kuYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUyYmbSh4LHcseSxBKX0pO3EuZXhpdCgpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO0EucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKHksdyx4KX0pLnJlbW92ZSgpO3JldHVybiBxfX0pKGYuYW5ub3RhdGlvbnx8KGYuYW5ub3RhdGlvbj17fSkpfSkoZC5zY2VuZXx8CihkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb2xvcnMuanMKKGZ1bmN0aW9uKGIpe2IuQ09MT1JTPVt7bmFtZToiR29vZ2xlIEJsdWUiLGNvbG9yOiIjNDE4NGYzIixhY3RpdmU6IiMzYTUzYzUiLGRpc2FibGVkOiIjY2FkOGZjIn0se25hbWU6Ikdvb2dsZSBSZWQiLGNvbG9yOiIjZGI0NDM3IixhY3RpdmU6IiM4ZjJhMGMiLGRpc2FibGVkOiIjZThjNmMxIn0se25hbWU6Ikdvb2dsZSBZZWxsb3ciLGNvbG9yOiIjZjRiNDAwIixhY3RpdmU6IiNkYjkyMDAiLGRpc2FibGVkOiIjZjdlOGIwIn0se25hbWU6Ikdvb2dsZSBHcmVlbiIsY29sb3I6IiMwZjlkNTgiLGFjdGl2ZToiIzQ4ODA0NiIsZGlzYWJsZWQ6IiNjMmUxY2MifSx7bmFtZToiUHVycGxlIixjb2xvcjoiI2FhNDZiYiIsYWN0aXZlOiIjNWMxMzk4IixkaXNhYmxlZDoiI2Q3YmNlNiJ9LHtuYW1lOiJUZWFsIixjb2xvcjoiIzAwYWJjMCIsYWN0aXZlOiIjNDc4MjhlIixkaXNhYmxlZDoiI2MyZWFmMiJ9LHtuYW1lOiJEZWVwIE9yYW5nZSIsY29sb3I6IiNmZjZmNDIiLGFjdGl2ZToiI2NhNGEwNiIsCmRpc2FibGVkOiIjZjJjYmJhIn0se25hbWU6IkxpbWUiLGNvbG9yOiIjOWQ5YzIzIixhY3RpdmU6IiM3Zjc3MWQiLGRpc2FibGVkOiIjZjFmNGMyIn0se25hbWU6IkluZGlnbyIsY29sb3I6IiM1YjZhYmYiLGFjdGl2ZToiIzNlNDdhOSIsZGlzYWJsZWQ6IiNjNWM4ZTgifSx7bmFtZToiUGluayIsY29sb3I6IiNlZjYxOTEiLGFjdGl2ZToiI2NhMWM2MCIsZGlzYWJsZWQ6IiNlOWI5Y2UifSx7bmFtZToiRGVlcCBUZWFsIixjb2xvcjoiIzAwNzg2YSIsYWN0aXZlOiIjMmI0ZjQzIixkaXNhYmxlZDoiI2JlZGVkYSJ9LHtuYW1lOiJEZWVwIFBpbmsiLGNvbG9yOiIjYzExNzVhIixhY3RpdmU6IiM3NTA4NGYiLGRpc2FibGVkOiIjZGU4Y2FlIn0se25hbWU6IkdyYXkiLGNvbG9yOiIjOUU5RTlFIixhY3RpdmU6IiM0MjQyNDIiLGRpc2FibGVkOiJGNUY1RjUifV0ucmVkdWNlKChkLGYpPT57ZFtmLm5hbWVdPWY7cmV0dXJuIGR9LHt9KTtiLk9QX0dST1VQX0NPTE9SUz1be2NvbG9yOiJHb29nbGUgUmVkIiwKZ3JvdXBzOiJnZW5fbGVnYWN5X29wcyBsZWdhY3lfb3BzIGxlZ2FjeV9mbG9nc19pbnB1dCBsZWdhY3lfaW1hZ2VfaW5wdXQgbGVnYWN5X2lucHV0X2V4YW1wbGVfaW5wdXQgbGVnYWN5X3NlcXVlbmNlX2lucHV0IGxlZ2FjeV9zZXRpX2lucHV0X2lucHV0Ii5zcGxpdCgiICIpfSx7Y29sb3I6IkRlZXAgT3JhbmdlIixncm91cHM6WyJjb25zdGFudF9vcHMiXX0se2NvbG9yOiJJbmRpZ28iLGdyb3VwczpbInN0YXRlX29wcyJdfSx7Y29sb3I6IlB1cnBsZSIsZ3JvdXBzOlsibm5fb3BzIiwibm4iXX0se2NvbG9yOiJHb29nbGUgR3JlZW4iLGdyb3VwczpbIm1hdGhfb3BzIl19LHtjb2xvcjoiTGltZSIsZ3JvdXBzOlsiYXJyYXlfb3BzIl19LHtjb2xvcjoiVGVhbCIsZ3JvdXBzOlsiY29udHJvbF9mbG93X29wcyIsImRhdGFfZmxvd19vcHMiXX0se2NvbG9yOiJQaW5rIixncm91cHM6WyJzdW1tYXJ5X29wcyJdfSx7Y29sb3I6IkRlZXAgUGluayIsZ3JvdXBzOlsiaW9fb3BzIl19XS5yZWR1Y2UoKGQsCmYpPT57Zi5ncm91cHMuZm9yRWFjaChmdW5jdGlvbihoKXtkW2hdPWYuY29sb3J9KTtyZXR1cm4gZH0se30pfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb21tb24uanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi5PUF9HUkFQSD0ib3BfZ3JhcGgiO2YuQ09OQ0VQVFVBTF9HUkFQSD0iY29uY2VwdHVhbF9ncmFwaCI7Zi5QUk9GSUxFPSJwcm9maWxlIn0pKGQuU2VsZWN0aW9uVHlwZXx8KGQuU2VsZWN0aW9uVHlwZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29udGV4dG1lbnUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsocil7bGV0IGw9MCxwPTA7Zm9yKDtyJiYwPD1yLm9mZnNldExlZnQmJjA8PXIub2Zmc2V0VG9wOylsKz1yLm9mZnNldExlZnQtci5zY3JvbGxMZWZ0LHArPXIub2Zmc2V0VG9wLXIuc2Nyb2xsVG9wLHI9ci5vZmZzZXRQYXJlbnQ7cmV0dXJue2xlZnQ6bCx0b3A6cH19aC5nZXRNZW51PWZ1bmN0aW9uKHIsbCl7Y29uc3QgcD1yLmdldENvbnRleHRNZW51KCksbT1kMy5zZWxlY3Qoci5nZXRDb250ZXh0TWVudSgpKTtyZXR1cm4gZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KHkpe3kmJnkuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMocCl8fChtLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix1LHtjYXB0dXJlOiEwfSkpfWxldCB3PWQzLmV2ZW50O2NvbnN0IEE9ayhyKTttLnN0eWxlKCJkaXNwbGF5IiwiYmxvY2siKS5zdHlsZSgibGVmdCIsCncuY2xpZW50WC1BLmxlZnQrMSsicHgiKS5zdHlsZSgidG9wIix3LmNsaWVudFktQS50b3ArMSsicHgiKTt3LnByZXZlbnREZWZhdWx0KCk7dy5zdG9wUHJvcGFnYXRpb24oKTtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSx7Y2FwdHVyZTohMH0pO20uaHRtbCgiIik7bS5hcHBlbmQoInVsIikuc2VsZWN0QWxsKCJsaSIpLmRhdGEobCkuZW50ZXIoKS5hcHBlbmQoImxpIikub24oImNsaWNrIix5PT57eS5hY3Rpb24odGhpcyxuLHEpO3UoKX0pLmh0bWwoZnVuY3Rpb24oeSl7cmV0dXJuIHkudGl0bGUobil9KX19fSkoZi5jb250ZXh0bWVudXx8KGYuY29udGV4dG1lbnU9e30pKX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9lZGdlLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHkpe3JldHVybiB5LnYrZC5FREdFX0tFWV9ERUxJTSt5Lnd9ZnVuY3Rpb24gcih5LHgpe3g9eC5nZXROb2RlQnlOYW1lKHkudik7aWYobnVsbD09eC5vdXRwdXRTaGFwZXN8fF8uaXNFbXB0eSh4Lm91dHB1dFNoYXBlcykpcmV0dXJuIG51bGw7eT14Lm91dHB1dFNoYXBlc1t5Lm91dHB1dFRlbnNvcktleV07cmV0dXJuIG51bGw9PXk/bnVsbDowPT09eS5sZW5ndGg/InNjYWxhciI6eS5tYXAoQz0+LTE9PT1DPyI/IjpDKS5qb2luKCJcdTAwZDciKX1mdW5jdGlvbiBsKHkseCl7cmV0dXJuIHguZWRnZUxhYmVsRnVuY3Rpb24/eC5lZGdlTGFiZWxGdW5jdGlvbih5LHgpOjE8eS5iYXNlRWRnZUxpc3QubGVuZ3RoP3kuYmFzZUVkZ2VMaXN0Lmxlbmd0aCsiIHRlbnNvcnMiOnIoeS5iYXNlRWRnZUxpc3RbMF0seCl9ZnVuY3Rpb24gcCh5LHgsQyl7Y29uc3QgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLAoicGF0aCIpO2ZvcihsZXQgRD0xO0Q8eS5sZW5ndGg7RCsrKWlmKEcuc2V0QXR0cmlidXRlKCJkIixDKHkuc2xpY2UoMCxEKSkpLEcuZ2V0VG90YWxMZW5ndGgoKT54KXJldHVybiBELTE7cmV0dXJuIHkubGVuZ3RoLTF9ZnVuY3Rpb24gbSh5LHgsQyl7dmFyIEc9ZDMubGluZSgpLngoSz0+Sy54KS55KEs9PksueSksRD1kMy5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsInBhdGgiKSkuYXR0cigiZCIsRyh5KSksQj0reC5hdHRyKCJtYXJrZXJXaWR0aCIpLEg9eC5hdHRyKCJ2aWV3Qm94Iikuc3BsaXQoIiAiKS5tYXAoTnVtYmVyKTtIPUhbMl0tSFswXTt4PSt4LmF0dHIoInJlZlgiKTtEPUQubm9kZSgpO2lmKEMpcmV0dXJuIEIqPTEteC9ILEM9RC5nZXRQb2ludEF0TGVuZ3RoKEIpLEc9cCh5LEIsRykseVtHLTFdPXt4OkMueCx5OkMueX0seS5zbGljZShHLTEpO0M9MS14L0g7Qj1ELmdldFRvdGFsTGVuZ3RoKCktQipDO0M9CkQuZ2V0UG9pbnRBdExlbmd0aChCKTtHPXAoeSxCLEcpO3lbR109e3g6Qy54LHk6Qy55fTtyZXR1cm4geS5zbGljZSgwLEcrMSl9ZnVuY3Rpb24gbih5LHgsQyxHKXtHPUd8fGYuQ2xhc3MuRWRnZS5MSU5FO3gubGFiZWwmJngubGFiZWwuc3RydWN0dXJhbCYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuU1RSVUNUVVJBTCk7eC5sYWJlbCYmeC5sYWJlbC5tZXRhZWRnZSYmeC5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcyYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuUkVGRVJFTkNFX0VER0UpO0MuaGFuZGxlRWRnZVNlbGVjdGVkJiYoRys9IiAiK2YuQ2xhc3MuRWRnZS5TRUxFQ1RBQkxFKTtsZXQgRD0icGF0aF8iK2soeCk7aWYoQy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24pdmFyIEI9Qy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24oeCxHKTtlbHNlIEI9MSxudWxsIT14LmxhYmVsJiZudWxsIT14LmxhYmVsLm1ldGFlZGdlJiYoQj14LmxhYmVsLm1ldGFlZGdlLnRvdGFsU2l6ZSksCkI9Qy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlKEIpO0c9eS5hcHBlbmQoInBhdGgiKS5hdHRyKCJpZCIsRCkuYXR0cigiY2xhc3MiLEcpLnN0eWxlKCJzdHJva2Utd2lkdGgiLEIrInB4Iik7eC5sYWJlbCYmeC5sYWJlbC5tZXRhZWRnZSYmKHgubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXM/KEI9YHJlZmVyZW5jZS1hcnJvd2hlYWQtJHtBKEIpfWAsRy5zdHlsZSgibWFya2VyLXN0YXJ0IixgdXJsKCMke0J9KWApLHgubGFiZWwuc3RhcnRNYXJrZXJJZD1CKTooQj1gZGF0YWZsb3ctYXJyb3doZWFkLSR7QShCKX1gLEcuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Qn0pYCkseC5sYWJlbC5lbmRNYXJrZXJJZD1CKSk7bnVsbCE9eC5sYWJlbCYmbnVsbCE9eC5sYWJlbC5tZXRhZWRnZSYmKHg9bCh4LmxhYmVsLm1ldGFlZGdlLEMucmVuZGVySGllcmFyY2h5KSxudWxsIT14JiZ5LmFwcGVuZCgidGV4dCIpLmFwcGVuZCgidGV4dFBhdGgiKS5hdHRyKCJ4bGluazpocmVmIiwKIiMiK0QpLmF0dHIoInN0YXJ0T2Zmc2V0IiwiNTAlIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJkb21pbmFudC1iYXNlbGluZSIsImNlbnRyYWwiKS50ZXh0KHgpKX1mdW5jdGlvbiBxKHkseCxDLEcsRCl7Rz1DLmxhYmVsO2xldCBCPUcuYWRqb2luaW5nTWV0YWVkZ2UsSD1HLnBvaW50czt5PXkuc2hhZG93Um9vdDtDLmxhYmVsLnN0YXJ0TWFya2VySWQmJihIPW0oSCxkMy5zZWxlY3QoeS5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLnN0YXJ0TWFya2VySWQpKSwhMCkpO0MubGFiZWwuZW5kTWFya2VySWQmJihIPW0oSCxkMy5zZWxlY3QoeS5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLmVuZE1hcmtlcklkKSksITEpKTtpZighQilyZXR1cm4gZDMuaW50ZXJwb2xhdGUoRCxoLmludGVycG9sYXRlKEgpKTtsZXQgSz1CLmVkZ2VHcm91cC5ub2RlKCkuZmlyc3RDaGlsZCxMPUcubWV0YWVkZ2UuaW5ib3VuZDtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgSj1LLmdldFBvaW50QXRMZW5ndGgoTD8KSy5nZXRUb3RhbExlbmd0aCgpOjApLm1hdHJpeFRyYW5zZm9ybShLLmdldENUTSgpKS5tYXRyaXhUcmFuc2Zvcm0oeC5nZXRDVE0oKS5pbnZlcnNlKCkpLE89TD8wOkgubGVuZ3RoLTE7SFtPXS54PUoueDtIW09dLnk9Si55O3JldHVybiBoLmludGVycG9sYXRlKEgpfX1mdW5jdGlvbiB1KHkseCl7ZDMuc2VsZWN0KHgpLnNlbGVjdCgicGF0aC4iK2YuQ2xhc3MuRWRnZS5MSU5FKS50cmFuc2l0aW9uKCkuYXR0clR3ZWVuKCJkIixmdW5jdGlvbihDLEcsRCl7cmV0dXJuIHEoeSx0aGlzLEMsRyxEKX0pfWZ1bmN0aW9uIHcoeSx4KXt5LmNsYXNzZWQoImZhZGVkIix4LmxhYmVsLmlzRmFkZWRPdXQpO3g9eC5sYWJlbC5tZXRhZWRnZTt5LnNlbGVjdCgicGF0aC4iK2YuQ2xhc3MuRWRnZS5MSU5FKS5jbGFzc2VkKCJjb250cm9sLWRlcCIseCYmIXgubnVtUmVndWxhckVkZ2VzKX1oLk1JTl9FREdFX1dJRFRIPS43NTtoLk1BWF9FREdFX1dJRFRIPTEyO2guRURHRV9XSURUSF9TSVpFX0JBU0VEX1NDQUxFPQpkMy5zY2FsZVBvdygpLmV4cG9uZW50KC4zKS5kb21haW4oWzEsNUU2XSkucmFuZ2UoW2guTUlOX0VER0VfV0lEVEgsaC5NQVhfRURHRV9XSURUSF0pLmNsYW1wKCEwKTtsZXQgQT1kMy5zY2FsZVF1YW50aXplKCkuZG9tYWluKFtoLk1JTl9FREdFX1dJRFRILGguTUFYX0VER0VfV0lEVEhdKS5yYW5nZShbInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4bGFyZ2UiXSk7aC5nZXRFZGdlS2V5PWs7aC5idWlsZEdyb3VwPWZ1bmN0aW9uKHkseCxDKXtsZXQgRz1bXTtHPV8ucmVkdWNlKHguZWRnZXMoKSwoRCxCKT0+e2xldCBIPXguZWRnZShCKTtELnB1c2goe3Y6Qi52LHc6Qi53LGxhYmVsOkh9KTtyZXR1cm4gRH0sRyk7eT1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoeSwiZyIsZi5DbGFzcy5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoRyxrKTt5LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGYuQ2xhc3MuRWRnZS5HUk9VUCkuYXR0cigiZGF0YS1lZGdlIiwKaykuZWFjaChmdW5jdGlvbihEKXtsZXQgQj1kMy5zZWxlY3QodGhpcyk7RC5sYWJlbC5lZGdlR3JvdXA9QjtDLl9lZGdlR3JvdXBJbmRleFtrKEQpXT1CO2lmKEMuaGFuZGxlRWRnZVNlbGVjdGVkKUIub24oImNsaWNrIixIPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Qy5maXJlKCJlZGdlLXNlbGVjdCIse2VkZ2VEYXRhOkgsZWRnZUdyb3VwOkJ9KX0pO24oQixELEMpfSkubWVyZ2UoeSkuZWFjaChmdW5jdGlvbigpe3UoQyx0aGlzKX0pLmVhY2goZnVuY3Rpb24oRCl7dyhkMy5zZWxlY3QodGhpcyksRCxDKX0pO3kuZXhpdCgpLmVhY2goRD0+e2RlbGV0ZSBDLl9lZGdlR3JvdXBJbmRleFtrKEQpXX0pLnJlbW92ZSgpO3JldHVybiB5fTtoLmdldExhYmVsRm9yQmFzZUVkZ2U9cjtoLmdldExhYmVsRm9yRWRnZT1sO2guYXBwZW5kRWRnZT1uO2guaW50ZXJwb2xhdGU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlQmFzaXMpLngoeT0+eS54KS55KHk9PnkueSl9KShmLmVkZ2V8fChmLmVkZ2U9Cnt9KSl9KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZXh0ZXJucy5qcwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9ncmFwaC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoSixPLFMsTixSKXtyZXR1cm4oUz9TKyIvIjoiIikrKEorKCJ1bmRlZmluZWQiIT09dHlwZW9mIE4mJiJ1bmRlZmluZWQiIT09dHlwZW9mIFI/IlsiK04rIi0iK1IrIl0iOiIjIikrTyl9ZnVuY3Rpb24gaChKKXtpZighSilyZXR1cm4gbnVsbDtmb3IobGV0IE89MDtPPEoubGVuZ3RoO08rKyl7bGV0IHtrZXk6Uyx2YWx1ZTpOfT1KW09dO2lmKCJfb3V0cHV0X3NoYXBlcyI9PT1TKXtpZighTi5saXN0LnNoYXBlKWJyZWFrO2xldCBSPU4ubGlzdC5zaGFwZS5tYXAoWD0+WC51bmtub3duX3Jhbms/bnVsbDpudWxsPT1YLmRpbXx8MT09PVguZGltLmxlbmd0aCYmbnVsbD09WC5kaW1bMF0uc2l6ZT9bXTpYLmRpbS5tYXAoYWE9PmFhLnNpemUpKTtKLnNwbGljZShPLDEpO3JldHVybiBSfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBrKEope2lmKCFKKXJldHVybiBudWxsO2ZvcihsZXQgTz0wO088Si5sZW5ndGg7TysrKWlmKCJfWGxhQ2x1c3RlciI9PT0KSltPXS5rZXkpcmV0dXJuIEpbT10udmFsdWUuc3x8bnVsbDtyZXR1cm4gbnVsbH1mdW5jdGlvbiByKEope2xldCBPPVtdO18uZWFjaChKLFM9PntsZXQgTj0iXiI9PT1TWzBdO04mJihTPVMuc3Vic3RyaW5nKDEpKTtsZXQgUj1TLFg9IjAiLGFhPVMubWF0Y2goLyguKik6KFx3KzpcZCspJC8pO2lmKGFhKVI9YWFbMV0sWD1hYVsyXTtlbHNlIGlmKGFhPVMubWF0Y2goLyguKik6KFxkKykkLykpUj1hYVsxXSxYPWFhWzJdOzAhPT1PLmxlbmd0aCYmUj09PU9bTy5sZW5ndGgtMV0ubmFtZXx8Ty5wdXNoKHtuYW1lOlIsb3V0cHV0VGVuc29yS2V5OlgsaXNDb250cm9sRGVwZW5kZW5jeTpOfSl9KTtyZXR1cm4gT31mdW5jdGlvbiBsKEosTyxTLE4sUixYKXtPIT09Uy5uYW1lJiZKLmVkZ2VzLnB1c2goe3Y6Tyx3OlMubmFtZSxvdXRwdXRUZW5zb3JLZXk6Ti5vdXRwdXRUZW5zb3JLZXksaXNDb250cm9sRGVwZW5kZW5jeTpOLmlzQ29udHJvbERlcGVuZGVuY3ksaXNSZWZlcmVuY2VFZGdlOiEwPT09ClIucmVmRWRnZXNbUy5vcCsiICIrWF19KX1mdW5jdGlvbiBwKEosTyxTKXtTPVN8fHt9O2xldCBOPW5ldyBncmFwaGxpYi5HcmFwaChTKTtOLnNldEdyYXBoKHtuYW1lOkoscmFua2RpcjpTLnJhbmtkaXJ8fCJCVCIsdHlwZTpPfSk7cmV0dXJuIE59ZnVuY3Rpb24gbShKKXtyZXR1cm4gZnVuY3Rpb24oTyl7Zm9yKGxldCBTPTA7UzxKLmxlbmd0aDtTKyspe2xldCBOPW5ldyBSZWdFeHAoSltTXSk7aWYoInN0cmluZyI9PT10eXBlb2YgTy5vcCYmTy5vcC5tYXRjaChOKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gbihKKXtsZXQgTz1KLnNwbGl0KGQuTkFNRVNQQUNFX0RFTElNKTtyZXR1cm4gSitkLk5BTUVTUEFDRV9ERUxJTSsiKCIrT1tPLmxlbmd0aC0xXSsiKSJ9ZnVuY3Rpb24gcShKLE8pe2xldCBTPXt9LE49e307Si5zb3J0KCk7Zm9yKGxldCBSPTA7UjxKLmxlbmd0aC0xOysrUil7bGV0IFg9SltSXTtfLmVhY2godyhYKS5zbGljZSgwLC0xKSxhYT0+e05bYWFdPSEwfSk7Zm9yKGxldCBhYT0KUisxO2FhPEoubGVuZ3RoOysrYWEpe2xldCBmYT1KW2FhXTtpZihfLnN0YXJ0c1dpdGgoZmEsWCkpe2lmKGZhLmxlbmd0aD5YLmxlbmd0aCYmZmEuY2hhckF0KFgubGVuZ3RoKT09PWQuTkFNRVNQQUNFX0RFTElNKXtTW1hdPW4oWCk7YnJlYWt9fWVsc2UgYnJlYWt9fV8uZWFjaChPLFI9PntSIGluIE4mJihTW1JdPW4oUikpfSk7cmV0dXJuIFN9ZnVuY3Rpb24gdShKKXtsZXQgTz1KLm5vZGVzKCkubWFwKGZ1bmN0aW9uKFMpe3JldHVybiBKLm5laWdoYm9ycyhTKS5sZW5ndGh9KTtPLnNvcnQoKTtyZXR1cm4gT31mdW5jdGlvbiB3KEosTyl7bGV0IFM9W10sTj1KLmluZGV4T2YoZC5OQU1FU1BBQ0VfREVMSU0pO2Zvcig7MDw9TjspUy5wdXNoKEouc3Vic3RyaW5nKDAsTikpLE49Si5pbmRleE9mKGQuTkFNRVNQQUNFX0RFTElNLE4rMSk7TyYmKE89T1tKXSkmJlMucHVzaChPKTtTLnB1c2goSik7cmV0dXJuIFN9ZC5OQU1FU1BBQ0VfREVMSU09Ii8iO2QuUk9PVF9OQU1FPSJfX3Jvb3RfXyI7CmQuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWD0iX19mdW5jdGlvbl9saWJyYXJ5X18iO2QuTEFSR0VfQVRUUlNfS0VZPSJfdG9vX2xhcmdlX2F0dHJzIjtkLkxJTUlUX0FUVFJfU0laRT0xMDI0O2QuRURHRV9LRVlfREVMSU09Ii0tIjtsZXQgQTsoZnVuY3Rpb24oSil7SltKLkZVTEw9MF09IkZVTEwiO0pbSi5FTUJFRERFRD0xXT0iRU1CRURERUQiO0pbSi5NRVRBPTJdPSJNRVRBIjtKW0ouU0VSSUVTPTNdPSJTRVJJRVMiO0pbSi5DT1JFPTRdPSJDT1JFIjtKW0ouU0hBRE9XPTVdPSJTSEFET1ciO0pbSi5CUklER0U9Nl09IkJSSURHRSI7SltKLkVER0U9N109IkVER0UifSkoQT1kLkdyYXBoVHlwZXx8KGQuR3JhcGhUeXBlPXt9KSk7bGV0IHk7KGZ1bmN0aW9uKEope0pbSi5NRVRBPTBdPSJNRVRBIjtKW0ouT1A9MV09Ik9QIjtKW0ouU0VSSUVTPTJdPSJTRVJJRVMiO0pbSi5CUklER0U9M109IkJSSURHRSI7SltKLkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KSh5PWQuTm9kZVR5cGV8fAooZC5Ob2RlVHlwZT17fSkpO2xldCB4OyhmdW5jdGlvbihKKXtKW0ouSU5DTFVERT0wXT0iSU5DTFVERSI7SltKLkVYQ0xVREU9MV09IkVYQ0xVREUiO0pbSi5VTlNQRUNJRklFRD0yXT0iVU5TUEVDSUZJRUQifSkoeD1kLkluY2x1c2lvblR5cGV8fChkLkluY2x1c2lvblR5cGU9e30pKTsoZnVuY3Rpb24oSil7SltKLkdST1VQPTBdPSJHUk9VUCI7SltKLlVOR1JPVVA9MV09IlVOR1JPVVAifSkoZC5TZXJpZXNHcm91cGluZ1R5cGV8fChkLlNlcmllc0dyb3VwaW5nVHlwZT17fSkpO2NsYXNzIEN7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9O3RoaXMuZWRnZXM9W119fWQuU2xpbUdyYXBoPUM7Y2xhc3MgR3tjb25zdHJ1Y3RvcihKKXt0aGlzLnR5cGU9eS5FTExJUFNJUzt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLnN0YXRzPXRoaXMucGFyZW50Tm9kZT1udWxsO3RoaXMuc2V0TnVtTW9yZU5vZGVzKEopO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2RlcyhKKXt0aGlzLm51bU1vcmVOb2Rlcz0KSjt0aGlzLm5hbWU9Ii4uLiAiK0orIiBtb3JlIn19ZC5FbGxpcHNpc05vZGVJbXBsPUc7Y2xhc3MgRHtjb25zdHJ1Y3RvcihKKXt0aGlzLm9wPUoub3A7dGhpcy5uYW1lPUoubmFtZTt0aGlzLmRldmljZT1KLmRldmljZTt0aGlzLmF0dHI9Si5hdHRyO3RoaXMuaW5wdXRzPXIoSi5pbnB1dCk7dGhpcy5vdXRwdXRTaGFwZXM9aChKLmF0dHIpO3RoaXMueGxhQ2x1c3Rlcj1rKEouYXR0cik7dGhpcy5jb21wYXRpYmxlPSExO3RoaXMudHlwZT15Lk9QO3RoaXMuaXNHcm91cE5vZGU9ITE7dGhpcy5jYXJkaW5hbGl0eT0xO3RoaXMuaW5FbWJlZGRpbmdzPVtdO3RoaXMub3V0RW1iZWRkaW5ncz1bXTt0aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLm93bmluZ1Nlcmllcz1udWxsfX1kLk9wTm9kZUltcGw9RDtkLmNyZWF0ZU1ldGFub2RlPWZ1bmN0aW9uKEosTz17fSl7cmV0dXJuIG5ldyBIKEosTyl9O2Quam9pblN0YXRzSW5mb1dpdGhHcmFwaD1mdW5jdGlvbihKLApPLFMpe18uZWFjaChKLm5vZGVzLE49PntOLnN0YXRzPW51bGx9KTtfLmVhY2goTy5kZXZfc3RhdHMsTj0+e1MmJiFTW04uZGV2aWNlXXx8Xy5lYWNoKE4ubm9kZV9zdGF0cyxSPT57bGV0IFg9Ui5ub2RlX25hbWUgaW4gSi5ub2Rlcz9SLm5vZGVfbmFtZTpuKFIubm9kZV9uYW1lKTtpZihYIGluIEoubm9kZXMpe3ZhciBhYT0wO1IubWVtb3J5JiZfLmVhY2goUi5tZW1vcnksb2E9PntvYS50b3RhbF9ieXRlcyYmKDA8b2EudG90YWxfYnl0ZXM/YWErPU51bWJlcihvYS50b3RhbF9ieXRlcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciAiK1gpKX0pO3ZhciBmYT1udWxsO1Iub3V0cHV0JiYoZmE9Xy5tYXAoUi5vdXRwdXQsb2E9Pl8ubWFwKG9hLnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0sWj0+TnVtYmVyKFouc2l6ZSkpKSk7Si5ub2Rlc1tYXS5kZXZpY2U9Ti5kZXZpY2U7bnVsbD09Si5ub2Rlc1tYXS5zdGF0cyYmKEoubm9kZXNbWF0uc3RhdHM9Cm5ldyBCKGZhKSk7Si5ub2Rlc1tYXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24oYWEpO1IuYWxsX2VuZF9yZWxfbWljcm9zJiYoMDxSLmFsbF9lbmRfcmVsX21pY3Jvcz9KLm5vZGVzW1hdLnN0YXRzLmFkZEV4ZWN1dGlvblRpbWUoUi5hbGxfc3RhcnRfbWljcm9zLFIuYWxsX3N0YXJ0X21pY3JvcytSLmFsbF9lbmRfcmVsX21pY3Jvcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIHJ1bnRpbWUgZm9yICIrWCkpfX0pfSl9O2NsYXNzIEJ7Y29uc3RydWN0b3IoSil7dGhpcy50b3RhbEJ5dGVzPTA7dGhpcy5vdXRwdXRTaXplPUp9YWRkRXhlY3V0aW9uVGltZShKLE8pe3RoaXMuc3RhcnRUaW1lPW51bGwhPXRoaXMuc3RhcnRUaW1lP01hdGgubWluKHRoaXMuc3RhcnRUaW1lLEopOko7dGhpcy5lbmRUaW1lPW51bGwhPXRoaXMuZW5kVGltZT9NYXRoLm1heCh0aGlzLmVuZFRpbWUsTyk6T31hZGRCeXRlc0FsbG9jYXRpb24oSil7dGhpcy50b3RhbEJ5dGVzPW51bGwhPXRoaXMudG90YWxCeXRlcz8KTWF0aC5tYXgodGhpcy50b3RhbEJ5dGVzLEopOkp9Y29tYmluZShKKXtudWxsIT1KLnRvdGFsQnl0ZXMmJih0aGlzLnRvdGFsQnl0ZXMrPUoudG90YWxCeXRlcyk7bnVsbCE9Si5nZXRUb3RhbE1pY3JvcygpJiZ0aGlzLmFkZEV4ZWN1dGlvblRpbWUoSi5zdGFydFRpbWUsSi5lbmRUaW1lKX1nZXRUb3RhbE1pY3Jvcygpe3JldHVybiBudWxsPT10aGlzLnN0YXJ0VGltZXx8bnVsbD09dGhpcy5lbmRUaW1lP251bGw6dGhpcy5lbmRUaW1lLXRoaXMuc3RhcnRUaW1lfX1kLk5vZGVTdGF0cz1CO2NsYXNzIEh7Y29uc3RydWN0b3IoSixPPXt9KXt0aGlzLm5hbWU9Sjt0aGlzLnR5cGU9eS5NRVRBO3RoaXMuZGVwdGg9MTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9MDt0aGlzLm1ldGFncmFwaD1wKEosQS5NRVRBLE8pO3RoaXMuYnJpZGdlZ3JhcGg9bnVsbDt0aGlzLm9wSGlzdG9ncmFtPXt9O3RoaXMuZGV2aWNlSGlzdG9ncmFtPXt9O3RoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT0Ke307dGhpcy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtPXtjb21wYXRpYmxlOjAsaW5jb21wYXRpYmxlOjB9O3RoaXMucGFyZW50Tm9kZT10aGlzLnRlbXBsYXRlSWQ9bnVsbDt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLmFzc29jaWF0ZWRGdW5jdGlvbj0iIn1nZXRGaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5tZXRhZ3JhcGgubm9kZXMoKVswXSl9Z2V0Um9vdE9wKCl7bGV0IEo9dGhpcy5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5uYW1lKyIvKCIrSltKLmxlbmd0aC0xXSsiKSIpfWxlYXZlcygpe2xldCBKPVtdLE89W3RoaXNdLFM7Zm9yKDtPLmxlbmd0aDspe2xldCBOPU8uc2hpZnQoKTtOLmlzR3JvdXBOb2RlPyhTPU4ubWV0YWdyYXBoLF8uZWFjaChTLm5vZGVzKCksUj0+Ty5wdXNoKFMubm9kZShSKSkpKTpKLnB1c2goTi5uYW1lKX1yZXR1cm4gSn19CmQuTWV0YW5vZGVJbXBsPUg7ZC5jcmVhdGVNZXRhZWRnZT1mdW5jdGlvbihKLE8pe3JldHVybiBuZXcgSyhKLE8pfTtjbGFzcyBLe2NvbnN0cnVjdG9yKEosTyl7dGhpcy52PUo7dGhpcy53PU87dGhpcy5iYXNlRWRnZUxpc3Q9W107dGhpcy5pbmJvdW5kPW51bGw7dGhpcy50b3RhbFNpemU9dGhpcy5udW1SZWZFZGdlcz10aGlzLm51bUNvbnRyb2xFZGdlcz10aGlzLm51bVJlZ3VsYXJFZGdlcz0wfWFkZEJhc2VFZGdlKEosTyl7dGhpcy5iYXNlRWRnZUxpc3QucHVzaChKKTtKLmlzQ29udHJvbERlcGVuZGVuY3k/dGhpcy5udW1Db250cm9sRWRnZXMrPTE6dGhpcy5udW1SZWd1bGFyRWRnZXMrPTE7Si5pc1JlZmVyZW5jZUVkZ2UmJih0aGlzLm51bVJlZkVkZ2VzKz0xKTt0aGlzLnRvdGFsU2l6ZSs9Sy5jb21wdXRlU2l6ZU9mRWRnZShKLE8pO08ubWF4TWV0YUVkZ2VTaXplPU1hdGgubWF4KE8ubWF4TWV0YUVkZ2VTaXplLHRoaXMudG90YWxTaXplKX1zdGF0aWMgY29tcHV0ZVNpemVPZkVkZ2UoSiwKTyl7bGV0IFM9Ty5ub2RlKEoudik7aWYoIVMub3V0cHV0U2hhcGVzKXJldHVybiAxO08uaGFzU2hhcGVJbmZvPSEwO0o9T2JqZWN0LmtleXMoUy5vdXRwdXRTaGFwZXMpLm1hcChOPT5TLm91dHB1dFNoYXBlc1tOXSkubWFwKE49Pm51bGw9PU4/MTpOLnJlZHVjZSgoUixYKT0+ey0xPT09WCYmKFg9MSk7cmV0dXJuIFIqWH0sMSkpO3JldHVybiBfLnN1bShKKX19ZC5NZXRhZWRnZUltcGw9SztkLmNyZWF0ZVNlcmllc05vZGU9ZnVuY3Rpb24oSixPLFMsTixSLFgpe3JldHVybiBuZXcgTChKLE8sUyxOLFIsWCl9O2QuZ2V0U2VyaWVzTm9kZU5hbWU9ZjtjbGFzcyBMe2NvbnN0cnVjdG9yKEosTyxTLE4sUixYKXt0aGlzLm5hbWU9Unx8ZihKLE8sUyk7dGhpcy50eXBlPXkuU0VSSUVTO3RoaXMuaGFzTG9vcD0hMTt0aGlzLnByZWZpeD1KO3RoaXMuc3VmZml4PU87dGhpcy5jbHVzdGVySWQ9Tjt0aGlzLmlkcz1bXTt0aGlzLnBhcmVudD1TO3RoaXMuaXNHcm91cE5vZGU9ITA7dGhpcy5jYXJkaW5hbGl0eT0KMDt0aGlzLm1ldGFncmFwaD1wKFIsQS5TRVJJRVMsWCk7dGhpcy5wYXJlbnROb2RlPXRoaXMuYnJpZGdlZ3JhcGg9bnVsbDt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09e307dGhpcy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtPXtjb21wYXRpYmxlOjAsaW5jb21wYXRpYmxlOjB9O3RoaXMuaGFzTm9uQ29udHJvbEVkZ2VzPSExO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfX1kLkRlZmF1bHRCdWlsZFBhcmFtcz17ZW5hYmxlRW1iZWRkaW5nOiEwLGluRW1iZWRkaW5nVHlwZXM6WyJDb25zdCJdLG91dEVtYmVkZGluZ1R5cGVzOlsiXlthLXpBLVpdK1N1bW1hcnkkIl0scmVmRWRnZXM6eyJBc3NpZ24gMCI6ITAsIkFzc2lnbkFkZCAwIjohMCwiQXNzaWduU3ViIDAiOiEwLCJhc3NpZ24gMCI6ITAsImFzc2lnbl9hZGQgMCI6ITAsImFzc2lnbl9zdWIgMCI6ITAsImNvdW50X3VwX3RvIDAiOiEwLCJTY2F0dGVyQWRkIDAiOiEwLCJTY2F0dGVyU3ViIDAiOiEwLAoiU2NhdHRlclVwZGF0ZSAwIjohMCwic2NhdHRlcl9hZGQgMCI6ITAsInNjYXR0ZXJfc3ViIDAiOiEwLCJzY2F0dGVyX3VwZGF0ZSAwIjohMH19O2QuYnVpbGQ9ZnVuY3Rpb24oSixPLFMpe2xldCBOPXt9LFI9e30sWD17fSxhYT1tKE8uaW5FbWJlZGRpbmdUeXBlcyksZmE9bShPLm91dEVtYmVkZGluZ1R5cGVzKSxvYT1bXSxaPUoubm9kZSxjYT1BcnJheShaLmxlbmd0aCk7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBqYT1BcnJheShaLmxlbmd0aCksYmE9MDtjb25zdCBrYT1FYT0+e2xldCB2YT1uZXcgRChFYSk7aWYoYWEodmEpKXJldHVybiBvYS5wdXNoKHZhLm5hbWUpLE5bdmEubmFtZV09dmE7aWYoZmEodmEpKXJldHVybiBvYS5wdXNoKHZhLm5hbWUpLFJbdmEubmFtZV09dmEsXy5lYWNoKHZhLmlucHV0cyx5YT0+e3lhPXlhLm5hbWU7WFt5YV09WFt5YV18fFtdO1hbeWFdLnB1c2godmEpfSksdmE7amFbYmFdPQp2YTtjYVtiYV09dmEubmFtZTtiYSsrO3JldHVybiB2YX07Xy5lYWNoKFosa2EpO2NvbnN0IFc9RWE9Pntjb25zdCB2YT1kLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrRWEuc2lnbmF0dXJlLm5hbWU7a2Eoe25hbWU6dmEsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiIiLGF0dHI6W119KTtpZihFYS5zaWduYXR1cmUuaW5wdXRfYXJnKXtsZXQgeGE9MDt2YXIgeWE9U2E9PntrYSh7bmFtZTp2YStkLk5BTUVTUEFDRV9ERUxJTStTYS5uYW1lLGlucHV0OltdLGRldmljZToiIixvcDoiaW5wdXRfYXJnIixhdHRyOlt7a2V5OiJUIix2YWx1ZTp7dHlwZTpTYS50eXBlfX1dfSkuZnVuY3Rpb25JbnB1dEluZGV4PXhhO3hhKyt9O0VhLnNpZ25hdHVyZS5pbnB1dF9hcmcubmFtZT95YShFYS5zaWduYXR1cmUuaW5wdXRfYXJnKTpfLmVhY2goRWEuc2lnbmF0dXJlLmlucHV0X2FyZyx5YSl9bGV0IEFhPTA7Y29uc3QgRmE9e307RWEuc2lnbmF0dXJlLm91dHB1dF9hcmcmJih5YT14YT0+e0ZhW3ZhKwpkLk5BTUVTUEFDRV9ERUxJTSt4YS5uYW1lXT1BYTtBYSsrfSxFYS5zaWduYXR1cmUub3V0cHV0X2FyZy5uYW1lP3lhKEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnKTpfLmVhY2goRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcseWEpKTtfLmVhY2goRWEubm9kZV9kZWYseGE9Pnt4YS5uYW1lPXZhKyIvIit4YS5uYW1lOyJzdHJpbmciPT09dHlwZW9mIHhhLmlucHV0JiYoeGEuaW5wdXQ9W3hhLmlucHV0XSk7Y29uc3QgU2E9a2EoeGEpO18uaXNOdW1iZXIoRmFbeGEubmFtZV0pJiYoU2EuZnVuY3Rpb25PdXRwdXRJbmRleD1GYVt4YS5uYW1lXSk7Xy5lYWNoKFNhLmlucHV0cyxYYT0+e1hhLm5hbWU9dmErZC5OQU1FU1BBQ0VfREVMSU0rWGEubmFtZX0pfSl9O0oubGlicmFyeSYmSi5saWJyYXJ5LmZ1bmN0aW9uJiZfLmVhY2goSi5saWJyYXJ5LmZ1bmN0aW9uLFcpO2phLnNwbGljZShiYSk7Y2Euc3BsaWNlKGJhKTtyZXR1cm4gamF9LFMpLnRoZW4oamE9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkJ1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSIsCjcwLCgpPT57bGV0IGJhPXEoY2Esb2EpLGthPW5ldyBDO18uZWFjaChqYSxXPT57bGV0IEVhPWJhW1cubmFtZV18fFcubmFtZTtrYS5ub2Rlc1tFYV09VztXLm5hbWUgaW4gWCYmKFcub3V0RW1iZWRkaW5ncz1YW1cubmFtZV0sXy5lYWNoKFcub3V0RW1iZWRkaW5ncyx2YT0+e3ZhLm5hbWU9YmFbdmEubmFtZV18fHZhLm5hbWV9KSk7Vy5uYW1lPUVhfSk7Xy5lYWNoKGphLFc9PntfLmVhY2goVy5pbnB1dHMsKEVhLHZhKT0+e2xldCB5YT1FYS5uYW1lO2lmKHlhIGluIE4pe0VhPU5beWFdO1cuaW5FbWJlZGRpbmdzLnB1c2goRWEpO2Zvcih2YXIgQWEgb2YgRWEuaW5wdXRzKWwoa2EsYmFbQWEubmFtZV18fEFhLm5hbWUsVyxBYSxPLHZhKX1lbHNlIGlmKHlhIGluIFIpe0FhPVJbeWFdO2ZvcihsZXQgRmEgb2YgQWEuaW5wdXRzKWwoa2EsYmFbRmEubmFtZV18fEZhLm5hbWUsVyxFYSxPLHZhKX1lbHNlIGwoa2EsYmFbeWFdfHx5YSxXLEVhLE8sdmEpfSl9KTtfLmVhY2goTixXPT57Vy5uYW1lPQpiYVtXLm5hbWVdfHxXLm5hbWV9KTtyZXR1cm4ga2F9LFMpKX07ZC5jcmVhdGVHcmFwaD1wO2QuZ2V0U3RyaWN0TmFtZT1uO2QuaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlPWZ1bmN0aW9uKEosTyl7Sj11KEopO089dShPKTtmb3IobGV0IFM9MDtTPEoubGVuZ3RoO1MrKylpZihKW1NdIT09T1tTXSlyZXR1cm4hMTtyZXR1cm4hMH07ZC5nZXRIaWVyYXJjaGljYWxQYXRoPXc7ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihKKXtyZXR1cm4gSj09PWIuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFPyJBZGQgdG8gbWFpbiBncmFwaCI6IlJlbW92ZSBmcm9tIG1haW4gZ3JhcGgifTtkLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihKKXtyZXR1cm4gSj09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQPyJVbmdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIjoiR3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMifTtkLnRvZ2dsZU5vZGVTZXJpZXNHcm91cD0KZnVuY3Rpb24oSixPKXtKW09dPU8gaW4gSiYmSltPXSE9PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQP2IuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQOmIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB9fSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vaGllcmFyY2h5LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgodyxBLHkseCl7QT15P3cuaW5FZGdlcyhBLm5hbWUpOncub3V0RWRnZXMoQS5uYW1lKTtfLmVhY2goQSxDPT57Qz13LmVkZ2UoQyk7KEMubnVtUmVndWxhckVkZ2VzP3gucmVndWxhcjp4LmNvbnRyb2wpLnB1c2goQyl9KX1mdW5jdGlvbiBrKHcsQSl7Y29uc3QgeT17fTtfLmVhY2goQS5ub2Rlcyx4PT57bGV0IEM9ZC5nZXRIaWVyYXJjaGljYWxQYXRoKHgubmFtZSksRz13LnJvb3Q7Ry5kZXB0aD1NYXRoLm1heChDLmxlbmd0aCxHLmRlcHRoKTt5W3gub3BdfHwoeVt4Lm9wXT1bXSk7eVt4Lm9wXS5wdXNoKHgpO2ZvcihsZXQgQj0wO0I8Qy5sZW5ndGg7QisrKXtHLmRlcHRoPU1hdGgubWF4KEcuZGVwdGgsQy5sZW5ndGgtQik7Ry5jYXJkaW5hbGl0eSs9eC5jYXJkaW5hbGl0eTtHLm9wSGlzdG9ncmFtW3gub3BdPShHLm9wSGlzdG9ncmFtW3gub3BdfHwwKSsxO251bGwhPXguZGV2aWNlJiYoRy5kZXZpY2VIaXN0b2dyYW1beC5kZXZpY2VdPQooRy5kZXZpY2VIaXN0b2dyYW1beC5kZXZpY2VdfHwwKSsxKTtudWxsIT14LnhsYUNsdXN0ZXImJihHLnhsYUNsdXN0ZXJIaXN0b2dyYW1beC54bGFDbHVzdGVyXT0oRy54bGFDbHVzdGVySGlzdG9ncmFtW3gueGxhQ2x1c3Rlcl18fDApKzEpO3guY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMTtfLmVhY2goeC5pbkVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8CjApKzF9KTtfLmVhY2goeC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEcuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkcuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEcuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtpZihCPT09Qy5sZW5ndGgtMSlicmVhazt2YXIgRD1DW0JdO2xldCBIPXcubm9kZShEKTtIfHwoSD1kLmNyZWF0ZU1ldGFub2RlKEQsdy5ncmFwaE9wdGlvbnMpLEgucGFyZW50Tm9kZT1HLHcuc2V0Tm9kZShELEgpLEcubWV0YWdyYXBoLnNldE5vZGUoRCxIKSwwPT09RC5pbmRleE9mKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkmJkcubmFtZT09PWIuZ3JhcGguUk9PVF9OQU1FJiYoRD1ELnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSx5W0RdfHwKKHlbRF09W10pLHcubGlicmFyeUZ1bmN0aW9uc1tEXT17bm9kZTpILHVzYWdlczp5W0RdfSxILmFzc29jaWF0ZWRGdW5jdGlvbj1EKSk7Rz1IfXcuc2V0Tm9kZSh4Lm5hbWUseCk7eC5wYXJlbnROb2RlPUc7Ry5tZXRhZ3JhcGguc2V0Tm9kZSh4Lm5hbWUseCk7Xy5lYWNoKHguaW5FbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3cuc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXh9KTtfLmVhY2goeC5vdXRFbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3cuc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXh9KX0pfWZ1bmN0aW9uIHIodyxBKXtsZXQgeT13LmdldE5vZGVNYXAoKSx4PVtdLEM9W10sRz0oRCxCKT0+e2xldCBIPTA7Zm9yKDtEOylCW0grK109RC5uYW1lLEQ9RC5wYXJlbnROb2RlO3JldHVybiBILTF9O18uZWFjaChBLmVkZ2VzLEQ9Pnt2YXIgQj1HKEEubm9kZXNbRC52XSx4KSxIPUcoQS5ub2Rlc1tELnddLEMpO2lmKC0xIT09QiYmLTEhPT1IKXtmb3IoO3hbQl09PT1DW0hdOylpZihCLS0sCkgtLSwwPkJ8fDA+SCl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO3ZhciBLPXlbeFtCKzFdXTtCPXhbQl07SD1DW0hdO3ZhciBMPUsubWV0YWdyYXBoLmVkZ2UoQixIKTtMfHwoTD1kLmNyZWF0ZU1ldGFlZGdlKEIsSCksSy5tZXRhZ3JhcGguc2V0RWRnZShCLEgsTCkpO0suaGFzTm9uQ29udHJvbEVkZ2VzfHxELmlzQ29udHJvbERlcGVuZGVuY3l8fChLLmhhc05vbkNvbnRyb2xFZGdlcz0hMCk7TC5hZGRCYXNlRWRnZShELHcpfX0pfWZ1bmN0aW9uIGwodyxBLHkseCxDLEcpe2xldCBEPXcubWV0YWdyYXBoO18uZWFjaChELm5vZGVzKCksQj0+e0I9RC5ub2RlKEIpO0IudHlwZT09PWIuZ3JhcGguTm9kZVR5cGUuTUVUQSYmbChCLEEseSx4LEMsRyl9KTt3PXAoRCk7dz0oRz9uOm0pKHcsRCxBLmdyYXBoT3B0aW9ucyk7Xy5lYWNoKHcsZnVuY3Rpb24oQixIKXtsZXQgSz1CLm1ldGFncmFwaC5ub2RlcygpO18uZWFjaChLLEw9Pgp7TD1ELm5vZGUoTCk7TC5vd25pbmdTZXJpZXN8fChMLm93bmluZ1Nlcmllcz1IKX0pO0subGVuZ3RoPHgmJiEoQi5uYW1lIGluIEMpJiYoQ1tCLm5hbWVdPWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApO0IubmFtZSBpbiBDJiZDW0IubmFtZV09PT1iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQfHwoQS5zZXROb2RlKEgsQiksRC5zZXROb2RlKEgsQiksXy5lYWNoKEssTD0+e2xldCBKPUQubm9kZShMKTtCLm1ldGFncmFwaC5zZXROb2RlKEwsSik7Qi5wYXJlbnROb2RlPUoucGFyZW50Tm9kZTtCLmNhcmRpbmFsaXR5Kys7bnVsbCE9Si5kZXZpY2UmJihCLmRldmljZUhpc3RvZ3JhbVtKLmRldmljZV09KEIuZGV2aWNlSGlzdG9ncmFtW0ouZGV2aWNlXXx8MCkrMSk7bnVsbCE9Si54bGFDbHVzdGVyJiYoQi54bGFDbHVzdGVySGlzdG9ncmFtW0oueGxhQ2x1c3Rlcl09KEIueGxhQ2x1c3Rlckhpc3RvZ3JhbVtKLnhsYUNsdXN0ZXJdfHwwKSsxKTtKLmNvbXBhdGlibGU/CkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaChKLmluRW1iZWRkaW5ncyxPPT57Ty5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7Xy5lYWNoKEoub3V0RW1iZWRkaW5ncyxPPT57Ty5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPQooQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO0oucGFyZW50Tm9kZT1CO3lbTF09SDtELnJlbW92ZU5vZGUoTCl9KSl9KX1mdW5jdGlvbiBwKHcpe3JldHVybiBfLnJlZHVjZSh3Lm5vZGVzKCksKEEseSk9Pnt5PXcubm9kZSh5KTtpZih5LnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpcmV0dXJuIEE7bGV0IHg9eS5vcDt4JiYoQVt4XT1BW3hdfHxbXSxBW3hdLnB1c2goeS5uYW1lKSk7cmV0dXJuIEF9LHt9KX1mdW5jdGlvbiBtKHcsQSx5KXtsZXQgeD17fTtfLmVhY2godyxmdW5jdGlvbihDLEcpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fTtfLmVhY2goQyxmdW5jdGlvbihCKXt2YXIgSD0iKiI9PT1CLmNoYXJBdChCLmxlbmd0aC0xKSxLPUIuc3BsaXQoIi8iKSxMPUtbSy5sZW5ndGgtMV07Sz1LLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpO3ZhciBKPUwubWF0Y2goL14oXEQqKV8oXGQrKSQvKTtsZXQgTz0iIjtKPyhMPUpbMV0sSj1KWzJdKToKKEw9SD9MLnN1YnN0cigwLEwubGVuZ3RoLTEpOkwsSj0wLE89SD8iKiI6IiIpO0g9ZC5nZXRTZXJpZXNOb2RlTmFtZShMLE8sSyk7RFtIXT1EW0hdfHxbXTtCPWQuY3JlYXRlU2VyaWVzTm9kZShMLE8sSywrSixCLHkpO0RbSF0ucHVzaChCKX0pO18uZWFjaChELGZ1bmN0aW9uKEIpe2lmKCEoMj5CLmxlbmd0aCkpe0Iuc29ydChmdW5jdGlvbihLLEwpe3JldHVybitLLmNsdXN0ZXJJZC0rTC5jbHVzdGVySWR9KTt2YXIgSD1bQlswXV07Zm9yKGxldCBLPTE7SzxCLmxlbmd0aDtLKyspe2xldCBMPUJbS107TC5jbHVzdGVySWQ9PT1IW0gubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0gucHVzaChMKToocShILHgsK0csQSx5KSxIPVtMXSl9cShILHgsK0csQSx5KX19KX19KTtyZXR1cm4geH1mdW5jdGlvbiBuKHcsQSx5KXtsZXQgeD17fTtfLmVhY2godyxmdW5jdGlvbihDLEcpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fSxCPXt9O18uZWFjaChDLGZ1bmN0aW9uKEspe2xldCBMPSIqIj09PQpLLmNoYXJBdChLLmxlbmd0aC0xKTt2YXIgSj1LLnNwbGl0KCIvIik7bGV0IE89SltKLmxlbmd0aC0xXTtKPUouc2xpY2UoMCxKLmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgUz0vKFxkKykvZzt2YXIgTjtsZXQgUixYLGFhLGZhPTA7Zm9yKDtOPVMuZXhlYyhPKTspKytmYSxSPU8uc2xpY2UoMCxOLmluZGV4KSxYPU5bMF0sTj1PLnNsaWNlKE4uaW5kZXgrTlswXS5sZW5ndGgpLGFhPWQuZ2V0U2VyaWVzTm9kZU5hbWUoUixOLEopLERbYWFdPURbYWFdLERbYWFdfHwoRFthYV09ZC5jcmVhdGVTZXJpZXNOb2RlKFIsTixKLCtYLEsseSkpLERbYWFdLmlkcy5wdXNoKFgpLEJbS109QltLXXx8W10sQltLXS5wdXNoKFthYSxYXSk7MT5mYSYmKFI9TD9PLnN1YnN0cigwLE8ubGVuZ3RoLTEpOk8sWD0wLE49TD8iKiI6IiIsYWE9ZC5nZXRTZXJpZXNOb2RlTmFtZShSLE4sSiksRFthYV09RFthYV0sRFthYV18fChEW2FhXT1kLmNyZWF0ZVNlcmllc05vZGUoUixOLEosK1gsSyx5KSksRFthYV0uaWRzLnB1c2goWCksCkJbS109QltLXXx8W10sQltLXS5wdXNoKFthYSxYXSkpfSk7dmFyIEg9e307Xy5lYWNoKEIsZnVuY3Rpb24oSyxMKXtLLnNvcnQoZnVuY3Rpb24oUyxOKXtyZXR1cm4gRFtOWzBdXS5pZHMubGVuZ3RoLURbU1swXV0uaWRzLmxlbmd0aH0pO3ZhciBKPUtbMF1bMF07Sz1LWzBdWzFdO0hbSl09SFtKXXx8W107Y29uc3QgTz1MLnNwbGl0KCIvIik7TD1kLmNyZWF0ZVNlcmllc05vZGUoRFtKXS5wcmVmaXgsRFtKXS5zdWZmaXgsTy5zbGljZSgwLE8ubGVuZ3RoLTEpLmpvaW4oIi8iKSwrSyxMLHkpO0hbSl0ucHVzaChMKX0pO18uZWFjaChILGZ1bmN0aW9uKEspe2lmKCEoMj5LLmxlbmd0aCkpe0suc29ydChmdW5jdGlvbihKLE8pe3JldHVybitKLmNsdXN0ZXJJZC0rTy5jbHVzdGVySWR9KTt2YXIgTD1bS1swXV07Zm9yKGxldCBKPTE7SjxLLmxlbmd0aDtKKyspe2xldCBPPUtbSl07Ty5jbHVzdGVySWQ9PT1MW0wubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0wucHVzaChPKToocShMLHgsK0csQSwKeSksTD1bT10pfXEoTCx4LCtHLEEseSl9fSl9fSk7cmV0dXJuIHh9ZnVuY3Rpb24gcSh3LEEseSx4LEMpe2lmKDE8dy5sZW5ndGgpe2xldCBHPWQuZ2V0U2VyaWVzTm9kZU5hbWUod1swXS5wcmVmaXgsd1swXS5zdWZmaXgsd1swXS5wYXJlbnQsd1swXS5jbHVzdGVySWQsd1t3Lmxlbmd0aC0xXS5jbHVzdGVySWQpLEQ9ZC5jcmVhdGVTZXJpZXNOb2RlKHdbMF0ucHJlZml4LHdbMF0uc3VmZml4LHdbMF0ucGFyZW50LHksRyxDKTtfLmVhY2godyxmdW5jdGlvbihCKXtELmlkcy5wdXNoKEIuY2x1c3RlcklkKTtELm1ldGFncmFwaC5zZXROb2RlKEIubmFtZSx4Lm5vZGUoQi5uYW1lKSl9KTtBW0ddPUR9fWNsYXNzIHV7Y29uc3RydWN0b3Iodyl7dGhpcy5oYXNTaGFwZUluZm89ITE7dGhpcy5tYXhNZXRhRWRnZVNpemU9MTt0aGlzLmdyYXBoT3B0aW9ucz13fHx7fTt0aGlzLmdyYXBoT3B0aW9ucy5jb21wb3VuZD0hMDt0aGlzLnJvb3Q9ZC5jcmVhdGVNZXRhbm9kZShkLlJPT1RfTkFNRSx0aGlzLmdyYXBoT3B0aW9ucyk7CnRoaXMubGlicmFyeUZ1bmN0aW9ucz17fTt0aGlzLnhsYUNsdXN0ZXJzPXRoaXMuZGV2aWNlcz10aGlzLnRlbXBsYXRlcz1udWxsO3RoaXMuaW5kZXg9e307dGhpcy5pbmRleFtkLlJPT1RfTkFNRV09dGhpcy5yb290O3RoaXMub3JkZXJpbmdzPXt9fWdldE5vZGVNYXAoKXtyZXR1cm4gdGhpcy5pbmRleH1ub2RlKHcpe3JldHVybiB0aGlzLmluZGV4W3ddfXNldE5vZGUodyxBKXt0aGlzLmluZGV4W3ddPUF9Z2V0QnJpZGdlZ3JhcGgodyl7dmFyIEE9dGhpcy5pbmRleFt3XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSBpbiBoaWVyYXJjaHk6ICIrdyk7aWYoISgibWV0YWdyYXBoImluIEEpKXJldHVybiBudWxsO2lmKEEuYnJpZGdlZ3JhcGgpcmV0dXJuIEEuYnJpZGdlZ3JhcGg7bGV0IHk9QS5icmlkZ2VncmFwaD1kLmNyZWF0ZUdyYXBoKCJCUklER0VHUkFQSCIsZC5HcmFwaFR5cGUuQlJJREdFLHRoaXMuZ3JhcGhPcHRpb25zKTtpZighKEEucGFyZW50Tm9kZSYmCiJtZXRhZ3JhcGgiaW4gQS5wYXJlbnROb2RlKSlyZXR1cm4geTt2YXIgeD1BLnBhcmVudE5vZGU7QT14Lm1ldGFncmFwaDt4PXRoaXMuZ2V0QnJpZGdlZ3JhcGgoeC5uYW1lKTtfLmVhY2goW0EseF0sQz0+e0MuZWRnZXMoKS5maWx0ZXIoRz0+Ry52PT09d3x8Ry53PT09dykuZm9yRWFjaChHPT57bGV0IEQ9Ry53PT09dyxCPUMuZWRnZShHKTtfLmVhY2goQi5iYXNlRWRnZUxpc3QsSD0+e2xldCBbSyxMXT1EP1tILncsRy52XTpbSC52LEcud107dmFyIEo9dGhpcy5nZXRDaGlsZE5hbWUodyxLKTtKPXt2OkQ/TDpKLHc6RD9KOkx9O2xldCBPPXkuZWRnZShKKTtPfHwoTz1kLmNyZWF0ZU1ldGFlZGdlKEoudixKLncpLE8uaW5ib3VuZD1ELHkuc2V0RWRnZShKLnYsSi53LE8pKTtPLmFkZEJhc2VFZGdlKEgsdGhpcyl9KX0pfSk7cmV0dXJuIHl9Z2V0Q2hpbGROYW1lKHcsQSl7bGV0IHk9dGhpcy5pbmRleFtBXTtmb3IoO3k7KXtpZih5LnBhcmVudE5vZGUmJnkucGFyZW50Tm9kZS5uYW1lPT09CncpcmV0dXJuIHkubmFtZTt5PXkucGFyZW50Tm9kZX10aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgaW1tZWRpYXRlIGNoaWxkIGZvciBkZXNjZW5kYW50OiAiK0EpO31nZXRQcmVkZWNlc3NvcnModyl7bGV0IEE9dGhpcy5pbmRleFt3XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdyk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCEwKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5pbkVtYmVkZGluZ3MseD0+e18uZWFjaChBLmlucHV0cyxDPT57aWYoQy5uYW1lPT09eC5uYW1lKXtsZXQgRz1uZXcgZC5NZXRhZWRnZUltcGwoeC5uYW1lLHcpO0cuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6Qy5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTpDLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdjp4Lm5hbWUsd30sdGhpcyk7eS5yZWd1bGFyLnB1c2goRyl9fSl9KTtyZXR1cm4geX1nZXRTdWNjZXNzb3JzKHcpe2xldCBBPQp0aGlzLmluZGV4W3ddO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit3KTtsZXQgeT10aGlzLmdldE9uZVdheUVkZ2VzKEEsITEpO0EuaXNHcm91cE5vZGV8fF8uZWFjaChBLm91dEVtYmVkZGluZ3MseD0+e18uZWFjaCh4LmlucHV0cyxDPT57aWYoQy5uYW1lPT09dyl7bGV0IEc9bmV3IGQuTWV0YWVkZ2VJbXBsKHcseC5uYW1lKTtHLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OkMuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6Qy5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHY6dyx3OngubmFtZX0sdGhpcyk7eS5yZWd1bGFyLnB1c2goRyl9fSl9KTtyZXR1cm4geX1nZXRPbmVXYXlFZGdlcyh3LEEpe2xldCB5PXtjb250cm9sOltdLHJlZ3VsYXI6W119O2lmKCF3LnBhcmVudE5vZGV8fCF3LnBhcmVudE5vZGUuaXNHcm91cE5vZGUpcmV0dXJuIHk7dmFyIHg9dy5wYXJlbnROb2RlO2xldCBDPQp4Lm1ldGFncmFwaDt4PXRoaXMuZ2V0QnJpZGdlZ3JhcGgoeC5uYW1lKTtoKEMsdyxBLHkpO2goeCx3LEEseSk7cmV0dXJuIHl9Z2V0VG9wb2xvZ2ljYWxPcmRlcmluZyh3KXt2YXIgQT10aGlzLmluZGV4W3ddO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit3KTtpZighQS5pc0dyb3VwTm9kZSlyZXR1cm4gbnVsbDtpZih3IGluIHRoaXMub3JkZXJpbmdzKXJldHVybiB0aGlzLm9yZGVyaW5nc1t3XTtsZXQgeT17fSx4PXt9LEM9QS5tZXRhZ3JhcGg7Xy5lYWNoKEMuZWRnZXMoKSxEPT57Qy5lZGdlKEQpLm51bVJlZ3VsYXJFZGdlcyYmKEQudiBpbiB5fHwoeVtELnZdPVtdKSx5W0Qudl0ucHVzaChELncpLHhbRC53XT0hMCl9KTtsZXQgRz1fLmRpZmZlcmVuY2UoXy5rZXlzKHkpLF8ua2V5cyh4KSk7dz10aGlzLm9yZGVyaW5nc1t3XT17fTtmb3IoQT0wO0cubGVuZ3RoOyl7bGV0IEQ9Ry5zaGlmdCgpO3dbRF09QSsrO18uZWFjaCh5W0RdLEI9PgpHLnB1c2goQikpO2RlbGV0ZSB5W0RdfXJldHVybiB3fWdldFRlbXBsYXRlSW5kZXgoKXtsZXQgdz1kMy5rZXlzKHRoaXMudGVtcGxhdGVzKSxBPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih3KS5yYW5nZShkMy5yYW5nZSgwLHcubGVuZ3RoKSk7cmV0dXJuIHk9PkEoeSl9fWYuRGVmYXVsdEhpZXJhcmNoeVBhcmFtcz17dmVyaWZ5VGVtcGxhdGU6ITAsc2VyaWVzTm9kZU1pblNpemU6NSxzZXJpZXNNYXA6e30scmFua0RpcmVjdGlvbjoiQlQiLHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6ITF9O2YuYnVpbGQ9ZnVuY3Rpb24odyxBLHkpe2xldCB4PW5ldyB1KHtyYW5rZGlyOkEucmFua0RpcmVjdGlvbn0pLEM9e307cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkFkZGluZyBub2RlcyIsMjAsKCk9PntsZXQgRz17fSxEPXt9O18uZWFjaCh3Lm5vZGVzLEI9PntCLmRldmljZSYmKEdbQi5kZXZpY2VdPSEwKTtCLnhsYUNsdXN0ZXImJihEW0IueGxhQ2x1c3Rlcl09ITApfSk7CnguZGV2aWNlcz1fLmtleXMoRyk7eC54bGFDbHVzdGVycz1fLmtleXMoRCk7ayh4LHcpfSx5KS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJEZXRlY3Qgc2VyaWVzIiwyMCwoKT0+ezA8QS5zZXJpZXNOb2RlTWluU2l6ZSYmbCh4LnJvb3QseCxDLEEuc2VyaWVzTm9kZU1pblNpemUsQS5zZXJpZXNNYXAsQS51c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zKX0seSkpLnRoZW4oKCk9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkFkZGluZyBlZGdlcyIsMzAsKCk9PntyKHgsdyxDKX0seSkpLnRoZW4oKCk9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkZpbmRpbmcgc2ltaWxhciBzdWJncmFwaHMiLDMwLCgpPT57eC50ZW1wbGF0ZXM9ZC50ZW1wbGF0ZS5kZXRlY3QoeCxBLnZlcmlmeVRlbXBsYXRlKX0seSkpLnRoZW4oKCk9PngpfTtmLmpvaW5BbmRBZ2dyZWdhdGVTdGF0cz1mdW5jdGlvbih3KXtsZXQgQT17fSx5PXt9O18uZWFjaCh3LnJvb3QubGVhdmVzKCksCng9Pnt4PXcubm9kZSh4KTtudWxsIT14LmRldmljZSYmKEFbeC5kZXZpY2VdPSEwKTtudWxsIT14LnhsYUNsdXN0ZXImJih5W3gueGxhQ2x1c3Rlcl09ITApfSk7dy5kZXZpY2VzPV8ua2V5cyhBKTt3LnhsYUNsdXN0ZXJzPV8ua2V5cyh5KTtfLmVhY2gody5nZXROb2RlTWFwKCkseD0+e3guaXNHcm91cE5vZGUmJih4LnN0YXRzPW5ldyBkLk5vZGVTdGF0cyhudWxsKSx4LmRldmljZUhpc3RvZ3JhbT17fSl9KTtfLmVhY2gody5yb290LmxlYXZlcygpLHg9PntsZXQgQz14PXcubm9kZSh4KTtmb3IoO251bGwhPUMucGFyZW50Tm9kZTspe2lmKG51bGwhPXguZGV2aWNlKXt2YXIgRz1DLnBhcmVudE5vZGUuZGV2aWNlSGlzdG9ncmFtO0dbeC5kZXZpY2VdPShHW3guZGV2aWNlXXx8MCkrMX1udWxsIT14LnhsYUNsdXN0ZXImJihHPUMucGFyZW50Tm9kZS54bGFDbHVzdGVySGlzdG9ncmFtLEdbeC54bGFDbHVzdGVyXT0oR1t4LnhsYUNsdXN0ZXJdfHwwKSsxKTtudWxsIT14LnN0YXRzJiZDLnBhcmVudE5vZGUuc3RhdHMuY29tYmluZSh4LnN0YXRzKTsKQz1DLnBhcmVudE5vZGV9fSl9O2YuZ2V0SW5jb21wYXRpYmxlT3BzPWZ1bmN0aW9uKHcsQSl7bGV0IHk9W10seD17fTtfLmVhY2gody5yb290LmxlYXZlcygpLEM9PntDPXcubm9kZShDKTtpZihDLnR5cGU9PWQuTm9kZVR5cGUuT1Ape2lmKCFDLmNvbXBhdGlibGUpaWYoQy5vd25pbmdTZXJpZXMpaWYoQSYmQS5zZXJpZXNNYXBbQy5vd25pbmdTZXJpZXNdPT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl5LnB1c2goQyk7ZWxzZXtpZigheFtDLm93bmluZ1Nlcmllc10pe2xldCBHPXcubm9kZShDLm93bmluZ1Nlcmllcyk7RyYmKHhbQy5vd25pbmdTZXJpZXNdPUcseS5wdXNoKEcpKX19ZWxzZSB5LnB1c2goQyk7Xy5lYWNoKEMuaW5FbWJlZGRpbmdzLEc9PntHLmNvbXBhdGlibGV8fHkucHVzaChHKX0pO18uZWFjaChDLm91dEVtYmVkZGluZ3MsRz0+e0cuY29tcGF0aWJsZXx8eS5wdXNoKEcpfSl9fSk7cmV0dXJuIHl9fSkoZC5oaWVyYXJjaHl8fChkLmhpZXJhcmNoeT0Ke30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2xheW91dC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKHgpe3gubm9kZS5pc0dyb3VwTm9kZSYmcih4KTt4Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQT9wKHgpOngubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJm0oeCl9ZnVuY3Rpb24gayh4KXt4LmluYm94V2lkdGg9MDx4LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/Zi5QQVJBTVMuYW5ub3RhdGlvbnMuaW5ib3hXaWR0aDowO3gub3V0Ym94V2lkdGg9MDx4Lm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoP2YuUEFSQU1TLmFubm90YXRpb25zLm91dGJveFdpZHRoOjA7eC5jb3JlQm94LndpZHRoPXgud2lkdGg7eC5jb3JlQm94LmhlaWdodD14LmhlaWdodDt4LndpZHRoPU1hdGgubWF4KHguY29yZUJveC53aWR0aCt4LmluYm94V2lkdGgreC5vdXRib3hXaWR0aCwzKnguZGlzcGxheU5hbWUubGVuZ3RoKX1mdW5jdGlvbiByKHgpe2xldCBDPXguY29yZUdyYXBoLm5vZGVzKCkubWFwKEc9Pgp4LmNvcmVHcmFwaC5ub2RlKEcpKS5jb25jYXQoeC5pc29sYXRlZEluRXh0cmFjdCx4Lmlzb2xhdGVkT3V0RXh0cmFjdCx4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0KTtfLmVhY2goQyxHPT57c3dpdGNoKEcubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6Xy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5vcCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpfLmV4dGVuZChHLGYuUEFSQU1TLm5vZGVTaXplLmJyaWRnZSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6Ry5leHBhbmRlZD9oKEcpOihfLmV4dGVuZChHLGYuUEFSQU1TLm5vZGVTaXplLm1ldGEpLEcuaGVpZ2h0PWYuUEFSQU1TLm5vZGVTaXplLm1ldGEuaGVpZ2h0KEcubm9kZS5jYXJkaW5hbGl0eSkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6Ry5leHBhbmRlZD8oXy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuZXhwYW5kZWQpLGgoRykpOl8uZXh0ZW5kKEcsRy5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcz8KZi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLnZlcnRpY2FsOmYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy5ob3Jpem9udGFsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK0cubm9kZS50eXBlKTt9Ry5leHBhbmRlZHx8ayhHKTtuKEcpfSl9ZnVuY3Rpb24gbCh4LEMpe18uZXh0ZW5kKHguZ3JhcGgoKSx7bm9kZXNlcDpDLm5vZGVTZXAscmFua3NlcDpDLnJhbmtTZXAsZWRnZXNlcDpDLmVkZ2VTZXB9KTtsZXQgRz1bXSxEPVtdO18uZWFjaCh4Lm5vZGVzKCksSj0+e3gubm9kZShKKS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLkJSSURHRT9HLnB1c2goSik6RC5wdXNoKEopfSk7aWYoIUQubGVuZ3RoKXJldHVybnt3aWR0aDowLGhlaWdodDowfTtkYWdyZS5sYXlvdXQoeCk7bGV0IEI9SW5maW5pdHksSD1JbmZpbml0eSxLPS1JbmZpbml0eSxMPS1JbmZpbml0eTtfLmVhY2goRCxKPT57Sj14Lm5vZGUoSik7dmFyIE89LjUqSi53aWR0aCxTPUoueC0KTztPPUoueCtPO0I9UzxCP1M6QjtLPU8+Sz9POks7Tz0uNSpKLmhlaWdodDtTPUoueS1PO0o9Si55K087SD1TPEg/UzpIO0w9Sj5MP0o6TH0pO18uZWFjaCh4LmVkZ2VzKCksSj0+e0o9eC5lZGdlKEopO2lmKCFKLnN0cnVjdHVyYWwpe3ZhciBPPXgubm9kZShKLm1ldGFlZGdlLnYpLFM9eC5ub2RlKEoubWV0YWVkZ2Uudyk7aWYoMz09PUoucG9pbnRzLmxlbmd0aCYmQShKLnBvaW50cykpe2lmKG51bGwhPU8pe3ZhciBOPU8uZXhwYW5kZWQ/Ty54OnUoTyk7Si5wb2ludHNbMF0ueD1OfW51bGwhPVMmJihOPVMuZXhwYW5kZWQ/Uy54OnUoUyksSi5wb2ludHNbMl0ueD1OKTtKLnBvaW50cz1bSi5wb2ludHNbMF0sSi5wb2ludHNbMV1dfU49Si5wb2ludHNbSi5wb2ludHMubGVuZ3RoLTJdO251bGwhPVMmJihKLnBvaW50c1tKLnBvaW50cy5sZW5ndGgtMV09eShOLFMpKTtTPUoucG9pbnRzWzFdO251bGwhPU8mJihKLnBvaW50c1swXT15KFMsTykpO18uZWFjaChKLnBvaW50cyxSPT57Qj1SLng8CkI/Ui54OkI7Sz1SLng+Sz9SLng6SztIPVIueTxIP1IueTpIO0w9Ui55Pkw/Ui55Okx9KX19KTtfLmVhY2goeC5ub2RlcygpLEo9PntKPXgubm9kZShKKTtKLngtPUI7Si55LT1IfSk7Xy5lYWNoKHguZWRnZXMoKSxKPT57Xy5lYWNoKHguZWRnZShKKS5wb2ludHMsTz0+e08ueC09QjtPLnktPUh9KX0pO3JldHVybnt3aWR0aDpLLUIsaGVpZ2h0OkwtSH19ZnVuY3Rpb24gcCh4KXtsZXQgQz1mLlBBUkFNUy5zdWJzY2VuZS5tZXRhO18uZXh0ZW5kKHgsQyk7Xy5leHRlbmQoeC5jb3JlQm94LGwoeC5jb3JlR3JhcGgsZi5QQVJBTVMuZ3JhcGgubWV0YSkpO3ZhciBHPXguaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoP18ubWF4KHguaXNvbGF0ZWRJbkV4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4LmluRXh0cmFjdEJveC53aWR0aD1udWxsIT1HP0c6MDt4LmluRXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5pc29sYXRlZEluRXh0cmFjdCwoQixILEspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDoKMDtILng9MDtILnk9QitLK0guaGVpZ2h0LzI7cmV0dXJuIEIrSytILmhlaWdodH0sMCk7Rz14Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/Xy5tYXgoeC5pc29sYXRlZE91dEV4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4Lm91dEV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rz9HOjA7eC5vdXRFeHRyYWN0Qm94LmhlaWdodD1fLnJlZHVjZSh4Lmlzb2xhdGVkT3V0RXh0cmFjdCwoQixILEspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDowO0gueD0wO0gueT1CK0srSC5oZWlnaHQvMjtyZXR1cm4gQitLK0guaGVpZ2h0fSwwKTtHPXgubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoP18ubWF4KHgubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGg9bnVsbCE9Rz9HOjA7eC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodD1fLnJlZHVjZSh4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LChCLEgsCkspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDowO0gueD0wO0gueT1CK0srSC5oZWlnaHQvMjtyZXR1cm4gQitLK0guaGVpZ2h0fSwwKTtHPTA7MDx4Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCYmRysrOzA8eC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoJiZHKys7MDx4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aCYmRysrOzA8eC5jb3JlR3JhcGgubm9kZUNvdW50KCkmJkcrKztsZXQgRD1mLlBBUkFNUy5zdWJzY2VuZS5tZXRhLmV4dHJhY3RYT2Zmc2V0O0c9MT49Rz8wOkcqRDt4LmNvcmVCb3gud2lkdGgrPU1hdGgubWF4KGYuTUlOX0FVWF9XSURUSCx4LmluRXh0cmFjdEJveC53aWR0aCt4Lm91dEV4dHJhY3RCb3gud2lkdGgpK0creC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoK0c7eC5jb3JlQm94LmhlaWdodD1DLmxhYmVsSGVpZ2h0K01hdGgubWF4KHguaW5FeHRyYWN0Qm94LmhlaWdodCx4LmNvcmVCb3guaGVpZ2h0LHgubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQsCngub3V0RXh0cmFjdEJveC5oZWlnaHQpO3gud2lkdGg9eC5jb3JlQm94LndpZHRoK0MucGFkZGluZ0xlZnQrQy5wYWRkaW5nUmlnaHQ7eC5oZWlnaHQ9eC5wYWRkaW5nVG9wK3guY29yZUJveC5oZWlnaHQreC5wYWRkaW5nQm90dG9tfWZ1bmN0aW9uIG0oeCl7bGV0IEM9eC5jb3JlR3JhcGgsRz1mLlBBUkFNUy5zdWJzY2VuZS5zZXJpZXM7Xy5leHRlbmQoeCxHKTtfLmV4dGVuZCh4LmNvcmVCb3gsbCh4LmNvcmVHcmFwaCxmLlBBUkFNUy5ncmFwaC5zZXJpZXMpKTtfLmVhY2goQy5ub2RlcygpLEQ9PntDLm5vZGUoRCkuZXhjbHVkZWQ9ITF9KTt4LndpZHRoPXguY29yZUJveC53aWR0aCtHLnBhZGRpbmdMZWZ0K0cucGFkZGluZ1JpZ2h0O3guaGVpZ2h0PXguY29yZUJveC5oZWlnaHQrRy5wYWRkaW5nVG9wK0cucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBuKHgpe2lmKCF4LmV4cGFuZGVkKXt2YXIgQz14LmluQW5ub3RhdGlvbnMubGlzdCxHPXgub3V0QW5ub3RhdGlvbnMubGlzdDtfLmVhY2goQywKTz0+cShPKSk7Xy5lYWNoKEcsTz0+cShPKSk7dmFyIEQ9Zi5QQVJBTVMuYW5ub3RhdGlvbnMsQj1fLnJlZHVjZShDLChPLFMsTik9PntOPTA8Tj9ELnlPZmZzZXQ6MDtTLmR4PS0oeC5jb3JlQm94LndpZHRoK1Mud2lkdGgpLzItRC54T2Zmc2V0O1MuZHk9TytOK1MuaGVpZ2h0LzI7cmV0dXJuIE8rTitTLmhlaWdodH0sMCk7Xy5lYWNoKEMsTz0+e08uZHktPUIvMjtPLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgSD1fLnJlZHVjZShHLChPLFMsTik9PntOPTA8Tj9ELnlPZmZzZXQ6MDtTLmR4PSh4LmNvcmVCb3gud2lkdGgrUy53aWR0aCkvMitELnhPZmZzZXQ7Uy5keT1PK04rUy5oZWlnaHQvMjtyZXR1cm4gTytOK1MuaGVpZ2h0fSwwKTtfLmVhY2goRyxPPT57Ty5keS09SC8yO08ubGFiZWxPZmZzZXQ9RC5sYWJlbE9mZnNldH0pO3ZhciBLPU1hdGgubWluKHguaGVpZ2h0LzIteC5yYWRpdXMsQi8yKTtLPTA+Sz8wOks7dmFyIEw9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsCkMubGVuZ3RoLTFdKS5yYW5nZShbLUssS10pO18uZWFjaChDLChPLFMpPT57Ty5wb2ludHM9W3tkeDpPLmR4K08ud2lkdGgvMixkeTpPLmR5fSx7ZHg6LXguY29yZUJveC53aWR0aC8yLGR5OjE8Qy5sZW5ndGg/TChTKTowfV19KTtLPU1hdGgubWluKHguaGVpZ2h0LzIteC5yYWRpdXMsSC8yKTtLPTA+Sz8wOks7dmFyIEo9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsRy5sZW5ndGgtMV0pLnJhbmdlKFstSyxLXSk7Xy5lYWNoKEcsKE8sUyk9PntPLnBvaW50cz1be2R4OnguY29yZUJveC53aWR0aC8yLGR5OjE8Ry5sZW5ndGg/SihTKTowfSx7ZHg6Ty5keC1PLndpZHRoLzIsZHk6Ty5keX1dfSk7eC5oZWlnaHQ9TWF0aC5tYXgoeC5oZWlnaHQsQixIKX19ZnVuY3Rpb24gcSh4KXtzd2l0Y2goeC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBkLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVDpfLmV4dGVuZCh4LGYuUEFSQU1TLmNvbnN0YW50LnNpemUpO2JyZWFrO2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU0hPUlRDVVQ6aWYoeC5ub2RlLnR5cGU9PT0KZC5Ob2RlVHlwZS5PUClfLmV4dGVuZCh4LGYuUEFSQU1TLnNob3J0Y3V0U2l6ZS5vcCk7ZWxzZSBpZih4Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSlfLmV4dGVuZCh4LGYuUEFSQU1TLnNob3J0Y3V0U2l6ZS5tZXRhKTtlbHNlIGlmKHgubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpXy5leHRlbmQoeCxmLlBBUkFNUy5zaG9ydGN1dFNpemUuc2VyaWVzKTtlbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIG5vZGUgdHlwZTogIit4Lm5vZGUudHlwZSk7YnJlYWs7Y2FzZSBkLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZOl8uZXh0ZW5kKHgsZi5QQVJBTVMuY29uc3RhbnQuc2l6ZSl9fWZ1bmN0aW9uIHUoeCl7cmV0dXJuIHguZXhwYW5kZWQ/eC54OngueC14LndpZHRoLzIrKHguaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD94LmluYm94V2lkdGg6MCkreC5jb3JlQm94LndpZHRoLzJ9ZnVuY3Rpb24gdyh4LEMpe3JldHVybiAxODAqTWF0aC5hdGFuKChDLnkteC55KS8oQy54LQp4LngpKS9NYXRoLlBJfWZ1bmN0aW9uIEEoeCl7bGV0IEM9dyh4WzBdLHhbMV0pO2ZvcihsZXQgRz0xO0c8eC5sZW5ndGgtMTtHKyspe2xldCBEPXcoeFtHXSx4W0crMV0pO2lmKDE8TWF0aC5hYnMoRC1DKSlyZXR1cm4hMTtDPUR9cmV0dXJuITB9ZnVuY3Rpb24geSh4LEMpe2xldCBHPUMuZXhwYW5kZWQ/Qy54OnUoQyksRD1DLnk7dmFyIEI9eC54LUc7eD14LnktRDtsZXQgSD1DLmV4cGFuZGVkP0Mud2lkdGg6Qy5jb3JlQm94LndpZHRoLEs9Qy5leHBhbmRlZD9DLmhlaWdodDpDLmNvcmVCb3guaGVpZ2h0O01hdGguYWJzKHgpKkgvMj5NYXRoLmFicyhCKSpLLzI/KDA+eCYmKEs9LUspLEM9MD09PXg/MDpLLzIqQi94LEI9Sy8yKTooMD5CJiYoSD0tSCksQz1ILzIsQj0wPT09Qj8wOkgvMip4L0IpO3JldHVybnt4OkcrQyx5OkQrQn19Zi5QQVJBTVM9e2FuaW1hdGlvbjp7ZHVyYXRpb246MjUwfSxncmFwaDp7bWV0YTp7bm9kZVNlcDo1LHJhbmtTZXA6MjUsZWRnZVNlcDo1fSxzZXJpZXM6e25vZGVTZXA6NSwKcmFua1NlcDoyNSxlZGdlU2VwOjV9LHBhZGRpbmc6e3BhZGRpbmdUb3A6NDAscGFkZGluZ0xlZnQ6MjB9fSxzdWJzY2VuZTp7bWV0YTp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoyMCxleHRyYWN0WE9mZnNldDoxNSxleHRyYWN0WU9mZnNldDoyMH0sc2VyaWVzOntwYWRkaW5nVG9wOjEwLHBhZGRpbmdCb3R0b206MTAscGFkZGluZ0xlZnQ6MTAscGFkZGluZ1JpZ2h0OjEwLGxhYmVsSGVpZ2h0OjEwfX0sbm9kZVNpemU6e21ldGE6e3JhZGl1czo1LHdpZHRoOjYwLG1heExhYmVsV2lkdGg6NTIsaGVpZ2h0OmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFsxLDIwMF0pLnJhbmdlKFsxNSw2MF0pLmNsYW1wKCEwKSxleHBhbmRCdXR0b25SYWRpdXM6M30sb3A6e3dpZHRoOjE1LGhlaWdodDo2LHJhZGl1czozLGxhYmVsT2Zmc2V0Oi04LG1heExhYmVsV2lkdGg6MzB9LHNlcmllczp7ZXhwYW5kZWQ6e3JhZGl1czoxMCwKbGFiZWxPZmZzZXQ6MH0sdmVydGljYWw6e3dpZHRoOjE2LGhlaWdodDoxMyxsYWJlbE9mZnNldDotMTN9LGhvcml6b250YWw6e3dpZHRoOjI0LGhlaWdodDo4LHJhZGl1czoxMCxsYWJlbE9mZnNldDotMTB9fSxicmlkZ2U6e3dpZHRoOjIwLGhlaWdodDoyMCxyYWRpdXM6MixsYWJlbE9mZnNldDowfX0sc2hvcnRjdXRTaXplOntvcDp7d2lkdGg6MTAsaGVpZ2h0OjR9LG1ldGE6e3dpZHRoOjEyLGhlaWdodDo0LHJhZGl1czoxfSxzZXJpZXM6e3dpZHRoOjE0LGhlaWdodDo0fX0sYW5ub3RhdGlvbnM6e2luYm94V2lkdGg6NTAsb3V0Ym94V2lkdGg6NTAseE9mZnNldDoxMCx5T2Zmc2V0OjMsbGFiZWxPZmZzZXQ6MixtYXhMYWJlbFdpZHRoOjEyMH0sY29uc3RhbnQ6e3NpemU6e3dpZHRoOjQsaGVpZ2h0OjR9fSxzZXJpZXM6e21heFN0YWNrQ291bnQ6MyxwYXJhbGxlbFN0YWNrT2Zmc2V0UmF0aW86LjIsdG93ZXJTdGFja09mZnNldFJhdGlvOi41fSxtaW5pbWFwOntzaXplOjE1MH19O2YuTUlOX0FVWF9XSURUSD0KMTQwO2YubGF5b3V0U2NlbmU9aDtmLmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGU9dX0pKGQubGF5b3V0fHwoZC5sYXlvdXQ9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2xvYWRlci5qcwp2YXIgSmg9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGIsZCxmLGgpe3JldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihrLHIpe2Z1bmN0aW9uIGwobil7dHJ5e20oaC5uZXh0KG4pKX1jYXRjaChxKXtyKHEpfX1mdW5jdGlvbiBwKG4pe3RyeXttKGhbInRocm93Il0obikpfWNhdGNoKHEpe3IocSl9fWZ1bmN0aW9uIG0obil7bi5kb25lP2sobi52YWx1ZSk6KG5ldyBmKGZ1bmN0aW9uKHEpe3Eobi52YWx1ZSl9KSkudGhlbihsLHApfW0oKGg9aC5hcHBseShiLGR8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi5mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoPWZ1bmN0aW9uKGgsayxyLGw9bmV3IGQub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyLHA9ZC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtcyl7Y29uc3QgbT1kLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCwyMCwiR3JhcGgiKSxuPWQudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihoLDUwLCJOYW1lc3BhY2UgaGllcmFyY2h5Iik7cmV0dXJuIGQucGFyc2VyLmZldGNoQW5kUGFyc2VHcmFwaERhdGEoayxyLGQudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihoLDMwLCJEYXRhIikpLnRoZW4oZnVuY3Rpb24ocSl7aWYoIXEubm9kZSl0aHJvdyBFcnJvcigiVGhlIGdyYXBoIGlzIGVtcHR5LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBUZW5zb3JGbG93IGNvdWxkIG5vdCB0cmFjZSBhbnkgZ3JhcGguIFBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTk2MSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTsKcmV0dXJuIGQuYnVpbGQocSxkLkRlZmF1bHRCdWlsZFBhcmFtcyxtKX0sKCk9Pnt0aHJvdyBFcnJvcigiTWFsZm9ybWVkIEdyYXBoRGVmLiBUaGlzIGNhbiBzb21ldGltZXMgYmUgY2F1c2VkIGJ5IGEgYmFkIG5ldHdvcmsgY29ubmVjdGlvbiBvciBkaWZmaWN1bHR5IHJlY29uY2lsaW5nIG11bHRpcGxlIEdyYXBoRGVmczsgZm9yIHRoZSBsYXR0ZXIgY2FzZSwgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy8xOTI5LiIpO30pLnRoZW4ocT0+SmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2Qub3AuY2hlY2tPcHNGb3JDb21wYXRpYmlsaXR5KHEsbCk7Y29uc3QgdT15aWVsZCBkLmhpZXJhcmNoeS5idWlsZChxLHAsbik7cmV0dXJue2dyYXBoOnEsZ3JhcGhIaWVyYXJjaHk6dX19KSkuY2F0Y2gocT0+e2gucmVwb3J0RXJyb3IoYEdyYXBoIHZpc3VhbGl6YXRpb24gZmFpbGVkLlxuXG4ke3F9YCxxKTt0aHJvdyBxOwp9KX19KShkLmxvYWRlcnx8KGQubG9hZGVyPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9ub2RlLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKFosY2EsamEpe2lmKGNhLm5vZGUuaXNHcm91cE5vZGUpe2lmKGNhLmV4cGFuZGVkKXJldHVybiBmLmJ1aWxkR3JvdXAoWixjYSxqYSxmLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtmLnNlbGVjdENoaWxkKFosImciLGYuQ2xhc3MuU3Vic2NlbmUuR1JPVVApLnJlbW92ZSgpfXJldHVybiBudWxsfWZ1bmN0aW9uIHIoWixjYSl7bGV0IGphPWNhLngtY2Eud2lkdGgvMitjYS5wYWRkaW5nTGVmdDtjYT1jYS55LWNhLmhlaWdodC8yK2NhLnBhZGRpbmdUb3A7Wj1mLnNlbGVjdENoaWxkKFosImciLGYuQ2xhc3MuU3Vic2NlbmUuR1JPVVApO2YudHJhbnNsYXRlKFosamEsY2EpfWZ1bmN0aW9uIGwoWixjYSxqYSl7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiZyIsZi5DbGFzcy5Ob2RlLkJVVFRPTl9DT05UQUlORVIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJjaXJjbGUiLGYuQ2xhc3MuTm9kZS5CVVRUT05fQ0lSQ0xFKTsKZi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInBhdGgiLGYuQ2xhc3MuTm9kZS5FWFBBTkRfQlVUVE9OKS5hdHRyKCJkIiwiTTAsLTIuMiBWMi4yIE0tMi4yLDAgSDIuMiIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJwYXRoIixmLkNsYXNzLk5vZGUuQ09MTEFQU0VfQlVUVE9OKS5hdHRyKCJkIiwiTS0yLjIsMCBIMi4yIik7Wi5vbigiY2xpY2siLGJhPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7amEuZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTpiYS5ub2RlLm5hbWV9KX0pO2YucG9zaXRpb25CdXR0b24oWixjYSl9ZnVuY3Rpb24gcChaLGNhLGphLGJhKXtpZihiYSlaLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2Vsc2V7dmFyIGthPWYuY29udGV4dG1lbnUuZ2V0TWVudShqYSxtKGNhLm5vZGUsamEpKTtaLm9uKCJkYmxjbGljayIsVz0+e2phLmZpcmUoIm5vZGUtdG9nZ2xlLWV4cGFuZCIse25hbWU6Vy5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW92ZXIiLApXPT57amEuaXNOb2RlRXhwYW5kZWQoVyl8fGphLmZpcmUoIm5vZGUtaGlnaGxpZ2h0Iix7bmFtZTpXLm5vZGUubmFtZX0pfSkub24oIm1vdXNlb3V0IixXPT57amEuaXNOb2RlRXhwYW5kZWQoVyl8fGphLmZpcmUoIm5vZGUtdW5oaWdobGlnaHQiLHtuYW1lOlcubm9kZS5uYW1lfSl9KS5vbigiY2xpY2siLFc9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtqYS5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6Vy5ub2RlLm5hbWV9KX0pLm9uKCJjb250ZXh0bWVudSIsKFcsRWEpPT57amEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOlcubm9kZS5uYW1lfSk7a2EuY2FsbChXLEVhKX0pfX1mdW5jdGlvbiBtKFosY2Epe2xldCBqYT1be3RpdGxlOigpPT5kLmdldEluY2x1ZGVOb2RlQnV0dG9uU3RyaW5nKFouaW5jbHVkZSksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtZXh0cmFjdCIse25hbWU6Wi5uYW1lfSl9fV07Y2Eubm9kZUNvbnRleHRNZW51SXRlbXMmJihqYT1qYS5jb25jYXQoY2Eubm9kZUNvbnRleHRNZW51SXRlbXMpKTsKbihaKSYmamEucHVzaCh7dGl0bGU6KCk9PncoWiksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHtuYW1lOnEoWil9KX19KTtyZXR1cm4gamF9ZnVuY3Rpb24gbihaKXtyZXR1cm4gbnVsbCE9PXEoWil9ZnVuY3Rpb24gcShaKXtyZXR1cm4gWj9aLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz9aLm5hbWU6Wi50eXBlPT09ZC5Ob2RlVHlwZS5PUD9aLm93bmluZ1NlcmllczpudWxsOm51bGx9ZnVuY3Rpb24gdShaKXtsZXQgY2E9bnVsbDtpZighWilyZXR1cm4gbnVsbDtaLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz9jYT1aOloucGFyZW50Tm9kZSYmWi5wYXJlbnROb2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyYmKGNhPVoucGFyZW50Tm9kZSk7cmV0dXJuIGNhfWZ1bmN0aW9uIHcoWil7cmV0dXJuIGIuZ3JhcGguZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nKG51bGwhPT11KFopP2IuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQOgpiLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKX1mdW5jdGlvbiBBKFosY2EsamEpe3ZhciBiYT1jYS5kaXNwbGF5TmFtZTtsZXQga2E9Y2Eubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiYhY2EuZXhwYW5kZWQ7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwidGV4dCIsZi5DbGFzcy5Ob2RlLkxBQkVMKTtsZXQgVz1aLm5vZGUoKTtXLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoVyk7Wi5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKTtrYSYmKGJhLmxlbmd0aD5qYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoJiYoYmE9YmEuc3Vic3RyKDAsamEubWF4TWV0YW5vZGVMYWJlbExlbmd0aC0yKSsiLi4uIiksamE9eChqYSksWi5hdHRyKCJmb250LXNpemUiLGphKGJhLmxlbmd0aCkrInB4IikpO2JhPVoudGV4dChiYSk7eShiYSxjYS5ub2RlLnR5cGUsY2EpO3JldHVybiBafWZ1bmN0aW9uIHkoWixjYSxqYSl7bGV0IGJhPVoubm9kZSgpO3ZhciBrYT0KYmEuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7bGV0IFc9YmEudGV4dENvbnRlbnQsRWE9bnVsbDtzd2l0Y2goY2Epe2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmphJiYhamEuZXhwYW5kZWQmJihFYT1kLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5tYXhMYWJlbFdpZHRoKTticmVhaztjYXNlIGQuTm9kZVR5cGUuT1A6RWE9ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm9wLm1heExhYmVsV2lkdGg7YnJlYWs7Y2FzZSAtMTpFYT1kLmxheW91dC5QQVJBTVMuYW5ub3RhdGlvbnMubWF4TGFiZWxXaWR0aH1pZighKG51bGw9PT1FYXx8a2E8PUVhKSl7Zm9yKGthPTE7YmEuZ2V0U3ViU3RyaW5nTGVuZ3RoKDAsa2EpPEVhOylrYSsrO2NhPWJhLnRleHRDb250ZW50LnN1YnN0cigwLGthKTtkbyBjYT1jYS5zdWJzdHIoMCxjYS5sZW5ndGgtMSksYmEudGV4dENvbnRlbnQ9Y2ErIi4uLiIsa2E9YmEuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7d2hpbGUoa2E+RWEmJjA8Y2EubGVuZ3RoKTtyZXR1cm4gWi5hcHBlbmQoInRpdGxlIikudGV4dChXKX19CmZ1bmN0aW9uIHgoWil7ZmF8fChmYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250LFoubWF4TWV0YW5vZGVMYWJlbExlbmd0aF0pLnJhbmdlKFtaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSxaLm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZV0pLmNsYW1wKCEwKSk7cmV0dXJuIGZhfWZ1bmN0aW9uIEMoWixjYSxqYSxiYSl7Zi5zZWxlY3RDaGlsZChaLCJ0ZXh0IixmLkNsYXNzLk5vZGUuTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixjYSkuYXR0cigieSIsamErYmEpfWZ1bmN0aW9uIEcoWixjYSxqYSl7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiZyIsamEpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5PUDpjYT1jYS5ub2RlO2lmKF8uaXNOdW1iZXIoY2EuZnVuY3Rpb25JbnB1dEluZGV4KXx8Xy5pc051bWJlcihjYS5mdW5jdGlvbk91dHB1dEluZGV4KSl7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosCiJwb2x5Z29uIixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTticmVha31mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiZWxsaXBzZSIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpqYT0iYW5ub3RhdGlvbiI7Y2EuY29yZUdyYXBoJiYoamE9Y2Eubm9kZS5oYXNOb25Db250cm9sRWRnZXM/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCIpO2xldCBiYT1bZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVF07Y2EuaXNGYWRlZE91dCYmYmEucHVzaCgiZmFkZWQtZWxsaXBzZSIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJ1c2UiLGJhKS5hdHRyKCJ4bGluazpocmVmIiwiI29wLXNlcmllcy0iK2phKyItc3RhbXAiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGNhLnJhZGl1cykuYXR0cigicnkiLGNhLnJhZGl1cyk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwKInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixjYS5yYWRpdXMpLmF0dHIoInJ5IixjYS5yYWRpdXMpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsY2EucmFkaXVzKS5hdHRyKCJyeSIsY2EucmFkaXVzKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fXJldHVybiBafWZ1bmN0aW9uIEQoWil7c3dpdGNoKFoubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6cmV0dXJuIGYuQ2xhc3MuT1BOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOnJldHVybiBmLkNsYXNzLk1FVEFOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6cmV0dXJuIGYuQ2xhc3MuU0VSSUVTTk9ERTtjYXNlIGQuTm9kZVR5cGUuQlJJREdFOnJldHVybiBmLkNsYXNzLkJSSURHRU5PREU7Y2FzZSBkLk5vZGVUeXBlLkVMTElQU0lTOnJldHVybiBmLkNsYXNzLkVMTElQU0lTTk9ERX10aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIisKWi5ub2RlLnR5cGUpO31mdW5jdGlvbiBCKFosY2Epe3ZhciBqYT1mLnNlbGVjdENoaWxkKFosImciLGYuQ2xhc3MuTm9kZS5TSEFQRSk7bGV0IGJhPWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUoY2EpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5PUDp7Y29uc3Qga2E9Y2Eubm9kZTtfLmlzTnVtYmVyKGthLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIoa2EuZnVuY3Rpb25PdXRwdXRJbmRleCk/KGphPWYuc2VsZWN0Q2hpbGQoamEsInBvbHlnb24iKSxmLnBvc2l0aW9uVHJpYW5nbGUoamEsY2EueCxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpKTooamE9Zi5zZWxlY3RDaGlsZChqYSwiZWxsaXBzZSIpLGYucG9zaXRpb25FbGxpcHNlKGphLGJhLGNhLnksY2EuY29yZUJveC53aWR0aCxjYS5jb3JlQm94LmhlaWdodCkpO0MoWixiYSxjYS55LGNhLmxhYmVsT2Zmc2V0KTticmVha31jYXNlIGQuTm9kZVR5cGUuTUVUQTpqYT0KamEuc2VsZWN0QWxsKCJyZWN0Iik7Y2EuZXhwYW5kZWQ/KGYucG9zaXRpb25SZWN0KGphLGNhLngsY2EueSxjYS53aWR0aCxjYS5oZWlnaHQpLHIoWixjYSksQyhaLGJhLGNhLnksLWNhLmhlaWdodC8yK2NhLmxhYmVsSGVpZ2h0LzIpKTooZi5wb3NpdGlvblJlY3QoamEsYmEsY2EueSxjYS5jb3JlQm94LndpZHRoLGNhLmNvcmVCb3guaGVpZ2h0KSxDKFosYmEsY2EueSwwKSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpqYT1mLnNlbGVjdENoaWxkKGphLCJ1c2UiKTtjYS5leHBhbmRlZD8oZi5wb3NpdGlvblJlY3QoamEsY2EueCxjYS55LGNhLndpZHRoLGNhLmhlaWdodCkscihaLGNhKSxDKFosYmEsY2EueSwtY2EuaGVpZ2h0LzIrY2EubGFiZWxIZWlnaHQvMikpOihmLnBvc2l0aW9uUmVjdChqYSxiYSxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpLEMoWixiYSxjYS55LGNhLmxhYmVsT2Zmc2V0KSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpaPQpmLnNlbGVjdENoaWxkKGphLCJyZWN0Iik7Zi5wb3NpdGlvblJlY3QoWixjYS54LGNhLnksY2Eud2lkdGgsY2EuaGVpZ2h0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fX1mdW5jdGlvbiBIKFosY2EsamEpe2xldCBiYT1iLmdyYXBoLnV0aWwuZXNjYXBlUXVlcnlTZWxlY3RvcihaKTtpZighamEpcmV0dXJuYHVybCgjJHtiYX0pYDtqYT1kMy5zZWxlY3QoamEpO2xldCBrYT1qYS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpO2thLmVtcHR5KCkmJihrYT1qYS5hcHBlbmQoImRlZnMiKS5hdHRyKCJpZCIsIl9ncmFwaC1ncmFkaWVudHMiKSk7bGV0IFc9a2Euc2VsZWN0KCJsaW5lYXJHcmFkaWVudCMiK2JhKTtpZihXLmVtcHR5KCkpe1c9a2EuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIixaKTtXLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2xldCBFYT0wO18uZWFjaChjYSx2YT0+e2xldCB5YT0KdmEuY29sb3I7Vy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEVhKS5hdHRyKCJzdG9wLWNvbG9yIix5YSk7Vy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEVhK3ZhLnByb3BvcnRpb24pLmF0dHIoInN0b3AtY29sb3IiLHlhKTtFYSs9dmEucHJvcG9ydGlvbn0pfXJldHVybmB1cmwoIyR7YmF9KWB9ZnVuY3Rpb24gSyhaLGNhLGphLGJhLGthKXtsZXQgVz1kLnJlbmRlci5NZXRhbm9kZUNvbG9ycztzd2l0Y2goY2Epe2Nhc2Ugb2EuU1RSVUNUVVJFOnJldHVybiBqYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEE/KGNhPWphLm5vZGUudGVtcGxhdGVJZCxudWxsPT09Y2E/Vy5VTktOT1dOOlcuU1RSVUNUVVJFX1BBTEVUVEUoWihjYSksYmEpKTpqYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz9iYT9XLkVYUEFOREVEX0NPTE9SOiJ3aGl0ZSI6amEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5CUklER0U/amEuc3RydWN0dXJhbD8iI2YwZSI6amEubm9kZS5pbmJvdW5kPwoiIzBlZiI6IiNmZTAiOl8uaXNOdW1iZXIoamEubm9kZS5mdW5jdGlvbklucHV0SW5kZXgpPyIjNzk1NTQ4IjpfLmlzTnVtYmVyKGphLm5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCk/IiMwMDk2ODgiOiJ3aGl0ZSI7Y2FzZSBvYS5ERVZJQ0U6cmV0dXJuIG51bGw9PWphLmRldmljZUNvbG9ycz9XLlVOS05PV046YmE/Vy5FWFBBTkRFRF9DT0xPUjpIKCJkZXZpY2UtIitqYS5ub2RlLm5hbWUsamEuZGV2aWNlQ29sb3JzLGthKTtjYXNlIG9hLlhMQV9DTFVTVEVSOnJldHVybiBudWxsPT1qYS54bGFDbHVzdGVyQ29sb3JzP1cuVU5LTk9XTjpiYT9XLkVYUEFOREVEX0NPTE9SOkgoInhsYS0iK2phLm5vZGUubmFtZSxqYS54bGFDbHVzdGVyQ29sb3JzLGthKTtjYXNlIG9hLkNPTVBVVEVfVElNRTpyZXR1cm4gYmE/Vy5FWFBBTkRFRF9DT0xPUjpqYS5jb21wdXRlVGltZUNvbG9yfHxXLlVOS05PV047Y2FzZSBvYS5NRU1PUlk6cmV0dXJuIGJhP1cuRVhQQU5ERURfQ09MT1I6amEubWVtb3J5Q29sb3J8fApXLlVOS05PV047Y2FzZSBvYS5PUF9DT01QQVRJQklMSVRZOnJldHVybiBudWxsPT1qYS5jb21wYXRpYmlsaXR5Q29sb3JzP1cuVU5LTk9XTjpiYT9XLkVYUEFOREVEX0NPTE9SOkgoIm9wLWNvbXBhdC0iK2phLm5vZGUubmFtZSxqYS5jb21wYXRpYmlsaXR5Q29sb3JzLGthKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmtub3duIGNhc2UgdG8gY29sb3Igbm9kZXMgYnkiKTt9fWZ1bmN0aW9uIEwoWixjYSxqYSxiYSl7YmE9YmF8fGYuQ2xhc3MuTm9kZS5TSEFQRTtsZXQga2E9amEuaXNOb2RlU2VsZWN0ZWQoY2Eubm9kZS5uYW1lKSxXPWNhLmlzSW5FeHRyYWN0fHxjYS5pc091dEV4dHJhY3R8fGNhLmlzTGlicmFyeUZ1bmN0aW9uLEVhPWNhLmV4cGFuZGVkJiZiYSE9PWYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFLHZhPWNhLmlzRmFkZWRPdXQ7Wi5jbGFzc2VkKCJoaWdobGlnaHRlZCIsamEuaXNOb2RlSGlnaGxpZ2h0ZWQoY2Eubm9kZS5uYW1lKSk7Wi5jbGFzc2VkKCJzZWxlY3RlZCIsa2EpOwpaLmNsYXNzZWQoImV4dHJhY3QiLFcpO1ouY2xhc3NlZCgiZXhwYW5kZWQiLEVhKTtaLmNsYXNzZWQoImZhZGVkIix2YSk7Wj1aLnNlbGVjdCgiLiIrYmErIiAuIitmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTtjYT1LKGphLnRlbXBsYXRlSW5kZXgsb2FbamEuY29sb3JCeS50b1VwcGVyQ2FzZSgpXSxjYSxFYSxqYS5nZXRHcmFwaFN2Z1Jvb3QoKSk7Wi5zdHlsZSgiZmlsbCIsY2EpO1ouc3R5bGUoInN0cm9rZSIsa2E/bnVsbDpKKGNhKSl9ZnVuY3Rpb24gSihaKXtyZXR1cm4idXJsIj09PVouc3Vic3RyaW5nKDAsMyk/ZC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuR1JBRElFTlRfT1VUTElORTpkMy5yZ2IoWikuZGFya2VyKCkudG9TdHJpbmcoKX1mdW5jdGlvbiBPKFosY2Epe2xldCBqYT1bXTtaPWNhLmdldE5vZGVCeU5hbWUoWik7aWYoWiBpbnN0YW5jZW9mIGIuZ3JhcGguT3BOb2RlSW1wbClyZXR1cm5bWl0uY29uY2F0KFouaW5FbWJlZGRpbmdzKTtaPVoubWV0YWdyYXBoLm5vZGVzKCk7Cl8uZWFjaChaLGZ1bmN0aW9uKGJhKXtqYT1qYS5jb25jYXQoTyhiYSxjYSkpfSk7cmV0dXJuIGphfWZ1bmN0aW9uIFMoWixjYSxqYSxiYSl7aWYoYmFbamEubmFtZV0pcmV0dXJuIGJhO2JhW2phLm5hbWVdPSEwO3ZhciBrYT1qYS5pbnB1dHM7bGV0IFc9YWEoY2EsamEpO2QzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtXLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRWE9e307Xy5lYWNoKGthLGZ1bmN0aW9uKEFhKXtBYT1jYS5nZXROb2RlQnlOYW1lKEFhLm5hbWUpO2lmKHZvaWQgMCE9PUFhKXtBYSBpbnN0YW5jZW9mIGQuTWV0YW5vZGVJbXBsJiYoQWE9Yi5ncmFwaC5nZXRTdHJpY3ROYW1lKEFhLm5hbWUpLEFhPWNhLmdldE5vZGVCeU5hbWUoQWEpKTt2YXIgRmE9YWEoY2EsQWEpLHhhPUVhW0ZhLm5hbWVdO3hhP3hhLm9wTm9kZXMucHVzaChBYSk6RWFbRmEubmFtZV09e3Zpc2libGVQYXJlbnQ6RmEsb3BOb2RlczpbQWFdfX19KTsKbGV0IHZhPXt9LHlhPVtXXTt2YVtXLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6MCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfTtqYT1XO2ZvcihrYT0xO2phLm5hbWUhPT1iLmdyYXBoLlJPT1RfTkFNRTtrYSsrKWphPWphLnBhcmVudE5vZGUsdmFbamEubmFtZV09e3RyYWNlZDohMSxpbmRleDprYSxjb25uZWN0aW9uRW5kcG9pbnRzOltdfSx5YVtrYV09amE7Xy5mb3JPd24oRWEsZnVuY3Rpb24oQWEpe2xldCBGYT1BYS52aXNpYmxlUGFyZW50O18uZWFjaChBYS5vcE5vZGVzLGZ1bmN0aW9uKHhhKXtiYT1TKFosY2EseGEsYmEpfSk7RmEubmFtZSE9PVcubmFtZSYmTihaLEZhLHZhLHlhKX0pO3JldHVybiBiYX1mdW5jdGlvbiBOKFosY2EsamEsYmEpe3ZhciBrYT1jYSxXPWNhO2ZvcihjYT1bXTshamFba2EubmFtZV07KVcubmFtZSE9PWthLm5hbWUmJmNhLnB1c2goW1csa2FdKSxXPWthLGthPWthLnBhcmVudE5vZGU7amE9amFba2EubmFtZV0uaW5kZXg7bGV0IEVhPWJhW01hdGgubWF4KGphLQoxLDApXS5uYW1lO1c9a2E9Vy5uYW1lO2NvbnN0IHZhPWQzLnNlbGVjdChaKTt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7V30tLSR7RWF9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApO18uZWFjaChjYSxmdW5jdGlvbih5YSl7dmEuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3lhWzBdLm5hbWV9LS0ke0VhfWArYH5+JHt5YVsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSk7Zm9yKFo9MTtaPGphO1orKyl2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7a2F9fn4ke2JhW1pdLm5hbWV9YCtgfn5JTi0tJHtiYVtaLTFdLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfWZ1bmN0aW9uIFIoWixjYSl7bGV0IGphPXt9O18uZWFjaChjYSxmdW5jdGlvbihiYSl7YmE9Wi5nZXROb2RlQnlOYW1lKGJhKTtiYT1hYShaLGJhKTtqYVtiYS5uYW1lXT1iYX0pO3JldHVybiBqYX1mdW5jdGlvbiBYKFosCmNhKXtfLmZvck93bihjYSxmdW5jdGlvbihqYSl7Zm9yKDtqYS5uYW1lIT09Yi5ncmFwaC5ST09UX05BTUU7KXtjb25zdCBiYT1kMy5zZWxlY3QoWikuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7amEubmFtZX0iXWApOyFiYS5ub2RlcygpLmxlbmd0aHx8YmEuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0Iil8fGJhLmNsYXNzZWQoInNlbGVjdGVkIil8fGJhLmNsYXNzZWQoIm9wIil8fGJhLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITApO2phPWphLnBhcmVudE5vZGV9fSl9ZnVuY3Rpb24gYWEoWixjYSl7bGV0IGphPSExLGJhPWNhO2Zvcig7IWphOylpZihjYT1iYSxiYT1jYS5wYXJlbnROb2RlLHZvaWQgMD09PWJhKWphPSEwO2Vsc2V7bGV0IGthPVouZ2V0UmVuZGVyTm9kZUJ5TmFtZShiYS5uYW1lKTtrYSYmKGthLmV4cGFuZGVkfHxiYSBpbnN0YW5jZW9mIGQuT3BOb2RlSW1wbCkmJihqYT0hMCl9cmV0dXJuIGNhfWguYnVpbGRHcm91cD1mdW5jdGlvbihaLGNhLGphKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoiZyIsZi5DbGFzcy5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoY2EsYmE9PmJhLm5vZGUubmFtZSsiOiIrYmEubm9kZS50eXBlKTtaLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixiYT0+YmEubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGJhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO2phLmFkZE5vZGVHcm91cChiYS5ub2RlLm5hbWUsa2EpfSkubWVyZ2UoWikuYXR0cigiY2xhc3MiLGJhPT5mLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoYmEpKS5lYWNoKGZ1bmN0aW9uKGJhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO3ZhciBXPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtmLmFubm90YXRpb24uYnVpbGRHcm91cChXLGJhLmluQW5ub3RhdGlvbnMsYmEsamEpO1c9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKGthLCJnIixmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKTsKZi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoVyxiYS5vdXRBbm5vdGF0aW9ucyxiYSxqYSk7Vz1HKGthLGJhLGYuQ2xhc3MuTm9kZS5TSEFQRSk7YmEubm9kZS5pc0dyb3VwTm9kZSYmbChXLGJhLGphKTtwKFcsYmEsamEpO2soa2EsYmEsamEpO1c9QShrYSxiYSxqYSk7cChXLGJhLGphLGJhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSk7TChrYSxiYSxqYSk7QihrYSxiYSl9KTtaLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKGJhKXtqYS5yZW1vdmVOb2RlR3JvdXAoYmEubm9kZS5uYW1lKTtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpOzA8YmEuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKFc9PntqYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoVyxiYSl9KTswPGJhLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoJiZrYS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpLnNlbGVjdEFsbCgiLiIrCmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChXPT57amEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFcsYmEpfSl9KS5yZW1vdmUoKTtyZXR1cm4gWn07aC5nZXRDb250ZXh0TWVudT1tO2guY2FuQmVJblNlcmllcz1uO2guZ2V0U2VyaWVzTmFtZT1xO2guZ2V0R3JvdXBTZXR0aW5nTGFiZWw9dztoLmVuZm9yY2VMYWJlbFdpZHRoPXk7bGV0IGZhPW51bGw7aC5idWlsZFNoYXBlPUc7aC5ub2RlQ2xhc3M9RDtsZXQgb2E7KGZ1bmN0aW9uKFope1pbWi5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7WltaLkRFVklDRT0xXT0iREVWSUNFIjtaW1ouWExBX0NMVVNURVI9Ml09IlhMQV9DTFVTVEVSIjtaW1ouQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO1pbWi5NRU1PUlk9NF09Ik1FTU9SWSI7WltaLk9QX0NPTVBBVElCSUxJVFk9NV09Ik9QX0NPTVBBVElCSUxJVFkifSkob2E9aC5Db2xvckJ5fHwoaC5Db2xvckJ5PXt9KSk7aC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zPWZ1bmN0aW9uKFope2QzLnNlbGVjdChaKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTsKaC5nZXRGaWxsRm9yTm9kZT1LO2guc3R5bGl6ZT1MO2guZ2V0U3Ryb2tlRm9yRmlsbD1KO2gudXBkYXRlSW5wdXRUcmFjZT1mdW5jdGlvbihaLGNhLGphLGJhKXtjb25zdCBrYT1kMy5zZWxlY3QoWik7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtY2hpbGQiKS5jbGFzc2VkKCJpbnB1dC1jaGlsZCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiLAohMSk7aWYoY2EmJmJhJiZqYSl7amE9TyhqYSxjYSk7dmFyIFc9e307Xy5lYWNoKGphLGZ1bmN0aW9uKEVhKXtXPVMoWixjYSxFYSxXKX0pO2phPU9iamVjdC5rZXlzKFcpO2phPVIoY2EsamEpO1goWixqYSk7a2Euc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goZnVuY3Rpb24oRWEpe2thLnNlbGVjdEFsbChgW2RhdGEtbmFtZT0iJHtFYS5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pO2thLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9fTtoLmdldFZpc2libGVQYXJlbnQ9YWF9KShmLm5vZGV8fChmLm5vZGU9e30pKX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwKKGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vb3AuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtpc05vdFRwdU9wKGspe3JldHVybi0xIT1rLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJjcHU6Iil8fC0xIT1rLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJncHU6Iik/ITA6LTE9PWsudG9Mb3dlckNhc2UoKS5zZWFyY2goInRwdSIpfW9wVmFsaWQoayl7cmV0dXJuIDA9PWsubmFtZS5zZWFyY2goZC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8IWsub3B8fGsuZGV2aWNlJiZ0aGlzLmlzTm90VHB1T3Aoay5kZXZpY2UpfHxrLmRldmljZSYmLTEhPWsuZGV2aWNlLnNlYXJjaCgiVFBVX1NZU1RFTSIpPyEwOl8uaW5jbHVkZXMoaC5XSElURUxJU1Qsay5vcCl9fWguV0hJVEVMSVNUPSJBYnMgQWNvcyBBY29zaCBBZGQgQWRkTiBBZGp1c3RDb250cmFzdHYyIEFkanVzdEh1ZSBBZGp1c3RTYXR1cmF0aW9uIEFsbCBBbmdsZSBBbnkgQXBwcm94aW1hdGVFcXVhbCBBcmdNYXggQXJnTWluIEFzaW4gQXNpbmggQXNzZXJ0IEFzc2lnbkFkZFZhcmlhYmxlT3AgQXNzaWduU3ViVmFyaWFibGVPcCBBc3NpZ25WYXJpYWJsZU9wIEF0YW4gQXRhbjIgQXRhbmggQXZnUG9vbCBBdmdQb29sM0QgQXZnUG9vbDNER3JhZCBBdmdQb29sR3JhZCBCYXRjaE1hdE11bCBCYXRjaFRvU3BhY2UgQmF0Y2hUb1NwYWNlTkQgQmlhc0FkZCBCaWFzQWRkR3JhZCBCaWFzQWRkVjEgQml0Y2FzdCBCaXR3aXNlQW5kIEJpdHdpc2VPciBCaXR3aXNlWG9yIEJyb2FkY2FzdEFyZ3MgQnJvYWRjYXN0R3JhZGllbnRBcmdzIEJ1Y2tldGl6ZSBDYXN0IENlaWwgQ2hlY2tOdW1lcmljcyBDaG9sZXNreSBDbGlwQnlWYWx1ZSBDb21wbGV4IENvbXBsZXhBYnMgQ29uY2F0IENvbmNhdE9mZnNldCBDb25jYXRWMiBDb25qIENvbmp1Z2F0ZVRyYW5zcG9zZSBDb25zdCBDb250cm9sVHJpZ2dlciBDb252MkQgQ29udjJEQmFja3Byb3BGaWx0ZXIgQ29udjJEQmFja3Byb3BJbnB1dCBDb252M0QgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiBDb252M0RCYWNrcHJvcElucHV0VjIgQ29zIENvc2ggQ3Jvc3MgQ3Jvc3NSZXBsaWNhU3VtIEN1bXByb2QgQ3Vtc3VtIERlcHRoVG9TcGFjZSBEZXB0aHdpc2VDb252MmROYXRpdmUgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCBEaWFnIERpYWdQYXJ0IERpZ2FtbWEgRGl2IER5bmFtaWNTdGl0Y2ggRWx1IEVsdUdyYWQgRW1wdHkgRXF1YWwgRXJmIEVyZmMgRXhwIEV4cGFuZERpbXMgRXhwbTEgRXh0cmFjdEltYWdlUGF0Y2hlcyBGRlQgRkZUMkQgRkZUM0QgRmFrZVF1YW50V2l0aE1pbk1heEFyZ3MgRmFrZVF1YW50V2l0aE1pbk1heEFyZ3NHcmFkaWVudCBGYWtlUXVhbnRXaXRoTWluTWF4VmFycyBGYWtlUXVhbnRXaXRoTWluTWF4VmFyc0dyYWRpZW50IEZpbGwgRmxvb3IgRmxvb3JEaXYgRmxvb3JNb2QgRnVzZWRCYXRjaE5vcm0gRnVzZWRCYXRjaE5vcm1HcmFkIEZ1c2VkQmF0Y2hOb3JtR3JhZFYyIEZ1c2VkQmF0Y2hOb3JtVjIgR2F0aGVyIEdhdGhlck5kIEdhdGhlclYyIEdldEl0ZW0gR3JlYXRlciBHcmVhdGVyRXF1YWwgSFNWVG9SR0IgSUZGVCBJRkZUMkQgSUZGVDNEIElSRkZUIElSRkZUMkQgSVJGRlQzRCBJZGVudGl0eSBJZGVudGl0eU4gSWYgSW1hZyBJbmZlZWREZXF1ZXVlIEluZmVlZERlcXVldWVUdXBsZSBJbnBsYWNlQWRkIElucGxhY2VVcGRhdGUgSW52IEludmVydCBJbnZlcnRQZXJtdXRhdGlvbiBJc0Zpbml0ZSBJc0luZiBJc05hbiBMMkxvc3MgTFJOIExSTkdyYWQgTGVmdFNoaWZ0IExlc3MgTGVzc0VxdWFsIExnYW1tYSBMaW5TcGFjZSBMaXN0RGlmZiBMb2cgTG9nMXAgTG9nU29mdG1heCBMb2dpY2FsQW5kIExvZ2ljYWxOb3QgTG9naWNhbE9yIE1hdE11bCBNYXRyaXhCYW5kUGFydCBNYXRyaXhEaWFnIE1hdHJpeERpYWdQYXJ0IE1hdHJpeFNldERpYWcgTWF0cml4VHJpYW5ndWxhclNvbHZlIE1heCBNYXhQb29sIE1heFBvb2wzRCBNYXhQb29sM0RHcmFkIE1heFBvb2wzREdyYWRHcmFkIE1heFBvb2xHcmFkIE1heFBvb2xHcmFkR3JhZCBNYXhQb29sR3JhZEdyYWRWMiBNYXhQb29sR3JhZFYyIE1heFBvb2xWMiBNYXhpbXVtIE1lYW4gTWluIE1pbmltdW0gTWlycm9yUGFkIE1vZCBNdWwgTXVsdGlub21pYWwgTmVnIE5vT3AgTm9uTWF4U3VwcHJlc3Npb25WNCBOb3RFcXVhbCBPbmVIb3QgT25lc0xpa2UgT3V0ZmVlZEVucXVldWUgT3V0ZmVlZEVucXVldWVUdXBsZSBQYWNrIFBhZCBQYWRWMiBQYXJhbGxlbER5bmFtaWNTdGl0Y2ggUGxhY2Vob2xkZXJXaXRoRGVmYXVsdCBQb3cgUHJldmVudEdyYWRpZW50IFByb2QgUXIgUXVhbnRpemVBbmREZXF1YW50aXplVjIgUXVhbnRpemVBbmREZXF1YW50aXplVjMgUkZGVCBSRkZUMkQgUkZGVDNEIFJHQlRvSFNWIFJhbmRvbVNodWZmbGUgUmFuZG9tU3RhbmRhcmROb3JtYWwgUmFuZG9tVW5pZm9ybSBSYW5kb21Vbmlmb3JtSW50IFJhbmdlIFJhbmsgUmVhZFZhcmlhYmxlT3AgUmVhbCBSZWFsRGl2IFJlY2lwcm9jYWwgUmVjaXByb2NhbEdyYWQgUmVjdlRQVUVtYmVkZGluZ0FjdGl2YXRpb25zIFJlbHUgUmVsdTYgUmVsdTZHcmFkIFJlbHVHcmFkIFJlc2hhcGUgUmVzaXplQmlsaW5lYXIgUmVzaXplQmlsaW5lYXJHcmFkIFJlc291cmNlQXBwbHlBZGFNYXggUmVzb3VyY2VBcHBseUFkYWRlbHRhIFJlc291cmNlQXBwbHlBZGFncmFkIFJlc291cmNlQXBwbHlBZGFncmFkREEgUmVzb3VyY2VBcHBseUFkYW0gUmVzb3VyY2VBcHBseUFkZFNpZ24gUmVzb3VyY2VBcHBseUNlbnRlcmVkUk1TUHJvcCBSZXNvdXJjZUFwcGx5RnRybCBSZXNvdXJjZUFwcGx5RnRybFYyIFJlc291cmNlQXBwbHlHcmFkaWVudERlc2NlbnQgUmVzb3VyY2VBcHBseU1vbWVudHVtIFJlc291cmNlQXBwbHlQb3dlclNpZ24gUmVzb3VyY2VBcHBseVByb3hpbWFsQWRhZ3JhZCBSZXNvdXJjZUFwcGx5UHJveGltYWxHcmFkaWVudERlc2NlbnQgUmVzb3VyY2VBcHBseVJNU1Byb3AgUmVzb3VyY2VHYXRoZXIgUmVzb3VyY2VTY2F0dGVyQWRkIFJlc291cmNlU2NhdHRlckRpdiBSZXNvdXJjZVNjYXR0ZXJNYXggUmVzb3VyY2VTY2F0dGVyTWluIFJlc291cmNlU2NhdHRlck11bCBSZXNvdXJjZVNjYXR0ZXJOZEFkZCBSZXNvdXJjZVNjYXR0ZXJOZFVwZGF0ZSBSZXNvdXJjZVNjYXR0ZXJTdWIgUmVzb3VyY2VTY2F0dGVyVXBkYXRlIFJlc291cmNlU3RyaWRlZFNsaWNlQXNzaWduIFJldmVyc2UgUmV2ZXJzZVNlcXVlbmNlIFJldmVyc2VWMiBSaWdodFNoaWZ0IFJpbnQgUm91bmQgUnNxcnQgUnNxcnRHcmFkIFNjYXR0ZXJOZCBTZWxlY3QgU2VsdSBTZWx1R3JhZCBTZW5kVFBVRW1iZWRkaW5nR3JhZGllbnRzIFNoYXBlIFNoYXBlTiBTaWdtb2lkIFNpZ21vaWRHcmFkIFNpZ24gU2luIFNpbmggU2l6ZSBTbGljZSBTbmFwc2hvdCBTb2Z0bWF4IFNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzIFNvZnRwbHVzIFNvZnRwbHVzR3JhZCBTb2Z0c2lnbiBTb2Z0c2lnbkdyYWQgU3BhY2VUb0JhdGNoIFNwYWNlVG9CYXRjaE5EIFNwYWNlVG9EZXB0aCBTcGFyc2VNYXRNdWwgU3BhcnNlU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU3BhcnNlVG9EZW5zZSBTcGxpdCBTcGxpdFYgU3FydCBTcXJ0R3JhZCBTcXVhcmUgU3F1YXJlZERpZmZlcmVuY2UgU3F1ZWV6ZSBTdGFja0Nsb3NlVjIgU3RhY2tQb3BWMiBTdGFja1B1c2hWMiBTdGFja1YyIFN0YXRlbGVzc0lmIFN0YXRlbGVzc1JhbmRvbU5vcm1hbCBTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtIFN0YXRlbGVzc1RydW5jYXRlZE5vcm1hbCBTdGF0ZWxlc3NXaGlsZSBTdG9wR3JhZGllbnQgU3RyaWRlZFNsaWNlIFN0cmlkZWRTbGljZUdyYWQgU3ViIFN1bSBTeW1ib2xpY0dyYWRpZW50IFRQVUVtYmVkZGluZ0FjdGl2YXRpb25zIFRhbiBUYW5oIFRhbmhHcmFkIFRlbnNvckFycmF5Q2xvc2VWMyBUZW5zb3JBcnJheUNvbmNhdFYzIFRlbnNvckFycmF5R2F0aGVyVjMgVGVuc29yQXJyYXlHcmFkVjMgVGVuc29yQXJyYXlSZWFkVjMgVGVuc29yQXJyYXlTY2F0dGVyVjMgVGVuc29yQXJyYXlTaXplVjMgVGVuc29yQXJyYXlTcGxpdFYzIFRlbnNvckFycmF5VjMgVGVuc29yQXJyYXlXcml0ZVYzIFRpbGUgVG9wS1YyIFRyYW5zcG9zZSBUcnVuY2F0ZURpdiBUcnVuY2F0ZU1vZCBUcnVuY2F0ZWROb3JtYWwgVW5wYWNrIFVuc29ydGVkU2VnbWVudE1heCBVbnNvcnRlZFNlZ21lbnRNaW4gVW5zb3J0ZWRTZWdtZW50UHJvZCBVbnNvcnRlZFNlZ21lbnRTdW0gVmFySXNJbml0aWFsaXplZE9wIFZhcmlhYmxlU2hhcGUgV2hpbGUgWGxhRHluYW1pY1VwZGF0ZVNsaWNlIFhsYUhvc3RDb21wdXRlIFhsYUlmIFhsYVJlY3YgWGxhUmVkdWNlV2luZG93IFhsYVNlbmQgWGxhU29ydCBYbGFXaGlsZSBaZXJvc0xpa2UgRW50ZXIgRXhpdCBMb29wQ29uZCBNZXJnZSBOZXh0SXRlcmF0aW9uIFN3aXRjaCBfQXJnIF9QYXJhbGxlbENvbmNhdFVwZGF0ZSBfUmV0dmFsIF9UUFVDb21waWxlIF9UUFVFeGVjdXRlIFRQVUNvbXBpbGF0aW9uUmVzdWx0IFRQVVJlcGxpY2F0ZWRJbnB1dCBUUFVSZXBsaWNhdGVkT3V0cHV0IFRQVVJlcGxpY2F0ZU1ldGFkYXRhIE1lcmdlVjJDaGVja3BvaW50cyBSZXN0b3JlVjIgU2F2ZVYyIEFib3J0IEFzc2VydCBBc3NpZ24gUGxhY2Vob2xkZXIgUGxhY2Vob2xkZXJWMiBTaGFyZGVkRmlsZW5hbWUgU3RyaW5nSm9pbiBWYXJpYWJsZSBWYXJpYWJsZVYyIFZhckhhbmRsZU9wIEF1ZGlvU3VtbWFyeSBBdWRpb1N1bW1hcnlWMiBEZWJ1Z051bWVyaWNTdW1tYXJ5IEhpc3RvZ3JhbVN1bW1hcnkgSW1hZ2VTdW1tYXJ5IE1lcmdlU3VtbWFyeSBTY2FsYXJTdW1tYXJ5IFN0YXRzQWdncmVnYXRvclN1bW1hcnkiLnNwbGl0KCIgIik7CmYuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyPWg7Zi5jaGVja09wc0ZvckNvbXBhdGliaWxpdHk9ZnVuY3Rpb24oayxyKXtpZihudWxsPT09cil0aHJvdyBFcnJvcigiQ29tcGF0aWJpbGl0eSBwcm92aWRlciByZXF1aXJlZCwgYnV0IGdvdDogIityKTtfLmVhY2goay5ub2RlcyxsPT57bC5jb21wYXRpYmxlPXIub3BWYWxpZChsKTtfLmVhY2gobC5pbkVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT1yLm9wVmFsaWQocCl9KTtfLmVhY2gobC5vdXRFbWJlZGRpbmdzLHA9PntwLmNvbXBhdGlibGU9ci5vcFZhbGlkKHApfSl9KX19KShkLm9wfHwoZC5vcD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcGFyc2VyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgodSl7aWYoInRydWUiPT09dSlyZXR1cm4hMDtpZigiZmFsc2UiPT09dSlyZXR1cm4hMTtpZignIic9PT11WzBdKXJldHVybiB1LnN1YnN0cmluZygxLHUubGVuZ3RoLTEpO2xldCB3PXBhcnNlRmxvYXQodSk7cmV0dXJuIGlzTmFOKHcpP3U6d31mdW5jdGlvbiBrKHUpe3JldHVybiBuZXcgUHJvbWlzZSgodyxBKT0+e2ZldGNoKHUpLnRoZW4oeT0+e3kub2s/eS5hcnJheUJ1ZmZlcigpLnRoZW4odyxBKTp5LnRleHQoKS50aGVuKEEsQSl9KX0pfWZ1bmN0aW9uIHIodSx3LEE9MUU2LHk9IlxuIil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHgsQyl7ZnVuY3Rpb24gRyhELEIsSCl7dmFyIEs9SD49dS5ieXRlTGVuZ3RoO0I9Qi5zcGxpdCh5KTtCWzBdPUQrQlswXTtjb25zdCBMPUs/IiI6Qi5wb3AoKTtmb3IobGV0IEogb2YgQil0cnl7dyhKKX1jYXRjaChPKXtDKE8pO3JldHVybn1LP3goITApOgooRD1uZXcgQmxvYihbdS5zbGljZShILEgrQSldKSxLPW5ldyBGaWxlUmVhZGVyLEsub25sb2FkPWZ1bmN0aW9uKEope0coTCxKLnRhcmdldC5yZXN1bHQsSCtBKX0sSy5yZWFkQXNUZXh0KEQpKX1HKCIiLCIiLDApfSl9ZnVuY3Rpb24gbCh1KXtyZXR1cm4gbSh1LG4pfWZ1bmN0aW9uIHAodSl7cmV0dXJuIG0odSxxKS50aGVuKHc9Pncuc3RlcF9zdGF0cyl9ZnVuY3Rpb24gbSh1LHcpe2Z1bmN0aW9uIEEoQil7bGV0IEg9Qi5pbmRleE9mKCI6IiksSz1CLnN1YnN0cmluZygwLEgpLnRyaW0oKTtCPWgoQi5zdWJzdHJpbmcoSCsyKS50cmltKCkpO3JldHVybntuYW1lOkssdmFsdWU6Qn19ZnVuY3Rpb24geShCLEgsSyxMKXtsZXQgSj1CW0hdO251bGw9PUo/QltIXT1MLmpvaW4oIi4iKWluIHc/W0tdOks6QXJyYXkuaXNBcnJheShKKT9KLnB1c2goSyk6QltIXT1bSixLXX1sZXQgeD17fSxDPVtdLEc9W10sRD14O3JldHVybiByKHUsZnVuY3Rpb24oQil7aWYoQilzd2l0Y2goQj1CLnRyaW0oKSwKQltCLmxlbmd0aC0xXSl7Y2FzZSAieyI6Qj1CLnN1YnN0cmluZygwLEIubGVuZ3RoLTIpLnRyaW0oKTtsZXQgSD17fTtDLnB1c2goRCk7Ry5wdXNoKEIpO3koRCxCLEgsRyk7RD1IO2JyZWFrO2Nhc2UgIn0iOkQ9Qy5wb3AoKTtHLnBvcCgpO2JyZWFrO2RlZmF1bHQ6Qj1BKEIpLHkoRCxCLm5hbWUsQi52YWx1ZSxHLmNvbmNhdChCLm5hbWUpKX19KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KX1mLmZldGNoUGJUeHQ9aztmLmZldGNoQW5kUGFyc2VNZXRhZGF0YT1mdW5jdGlvbih1LHcpe3JldHVybiBiLmdyYXBoLnV0aWwucnVuVGFzaygoKT0+bnVsbD09dT9Qcm9taXNlLnJlc29sdmUobnVsbCk6ayh1KSx3KS50aGVuKEE9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJQYXJzaW5nIG1ldGFkYXRhLnBidHh0Iiw2MCwoKT0+bnVsbCE9QT9wKEEpOlByb21pc2UucmVzb2x2ZShudWxsKSx3KSl9O2YuZmV0Y2hBbmRQYXJzZUdyYXBoRGF0YT1mdW5jdGlvbih1LHcsQSl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJSZWFkaW5nIGdyYXBoIHBidHh0IiwKNDAsKCk9Pnc/bmV3IFByb21pc2UoZnVuY3Rpb24oeSx4KXtsZXQgQz1uZXcgRmlsZVJlYWRlcjtDLm9ubG9hZD0oKT0+eShDLnJlc3VsdCk7Qy5vbmVycm9yPSgpPT54KEMuZXJyb3IpO0MucmVhZEFzQXJyYXlCdWZmZXIodyl9KTprKHUpLEEpLnRoZW4oeT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgpPT5sKHkpLEEpKX07Zi5zdHJlYW1QYXJzZT1yO2NvbnN0IG49eyJsaWJyYXJ5LmZ1bmN0aW9uIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuaW5wdXQiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5iIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLAoibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUuaW5wdXRfYXJnIjohMCwKImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0scT17InN0ZXBfc3RhdHMuZGV2X3N0YXRzIjohMCwKInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dCI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMubWVtb3J5IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSI6ITB9O2YucGFyc2VHcmFwaFBiVHh0PWw7Zi5wYXJzZVN0YXRzUGJUeHQ9cH0pKGQucGFyc2VyfHwoZC5wYXJzZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3Byb3RvLmpzCgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3JlbmRlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKE4sUixYLGFhLGZhKXtSPW5ldyBIKFIsWCxhYSxmYSwhMCk7Ti5pbkFubm90YXRpb25zLnB1c2goUil9ZnVuY3Rpb24gayhOLFIsWCxhYSxmYSl7Uj1uZXcgSChSLFgsYWEsZmEsITEpO04ub3V0QW5ub3RhdGlvbnMucHVzaChSKX1mdW5jdGlvbiByKE4sUil7Xy5lYWNoKE4ubm9kZXMoKSxYPT57WD1OLm5vZGUoWCk7WC5leHBhbmRlZD0xPFI7aWYoMDxSKXN3aXRjaChYLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpsKFgsUi0xKX19KX1mdW5jdGlvbiBsKE4sUil7Ti5jb3JlR3JhcGgmJnIoTi5jb3JlR3JhcGgsUil9ZnVuY3Rpb24gcChOLFIsWCl7bGV0IGFhPU4ubm9kZShSKSxmYT1OLm5vZGUoWCksb2E9Ti5lZGdlKFIsWCk7aWYoYWEubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREUmJmZhLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5JTkNMVURFfHwKYWEubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREV8fGZhLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFKWsoYWEsZmEubm9kZSxmYSxvYSxLLlNIT1JUQ1VUKSxoKGZhLGFhLm5vZGUsYWEsb2EsSy5TSE9SVENVVCksTi5yZW1vdmVFZGdlKFIsWCl9ZnVuY3Rpb24gbShOLFIsWCl7bGV0IGFhPU4uY29yZUdyYXBoLGZhPWFhLm5vZGUoUik7ZmEuaXNPdXRFeHRyYWN0PSEwO18uZWFjaChhYS5wcmVkZWNlc3NvcnMoUiksb2E9PntwKGFhLG9hLFIpfSk7KEcuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxYKSYmXy5lYWNoKGFhLnN1Y2Nlc3NvcnMoUiksb2E9PntwKGFhLFIsb2EpfSk7MD09PWFhLm5laWdoYm9ycyhSKS5sZW5ndGgmJihmYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTi5pc29sYXRlZE91dEV4dHJhY3QucHVzaChmYSksYWEucmVtb3ZlTm9kZShSKSl9ZnVuY3Rpb24gbihOLFIsWCl7bGV0IGFhPU4uY29yZUdyYXBoLApmYT1hYS5ub2RlKFIpO2ZhLmlzSW5FeHRyYWN0PSEwO18uZWFjaChhYS5zdWNjZXNzb3JzKFIpLG9hPT57cChhYSxSLG9hKX0pOyhHLmRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZXx8WCkmJl8uZWFjaChhYS5wcmVkZWNlc3NvcnMoUiksb2E9PntwKGFhLG9hLFIpfSk7MD09PWFhLm5laWdoYm9ycyhSKS5sZW5ndGgmJihmYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGZhKSxhYS5yZW1vdmVOb2RlKFIpKX1mdW5jdGlvbiBxKE4sUil7aWYoTi50eXBlPT09ZC5Ob2RlVHlwZS5PUClmb3IodmFyIFg9MDtYPFIubGVuZ3RoO1grKyl7aWYoTi5vcD09PVJbWF0pcmV0dXJuITB9ZWxzZSBpZihOLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJihOPU4uZ2V0Um9vdE9wKCkpKWZvcihYPTA7WDxSLmxlbmd0aDtYKyspaWYoTi5vcD09PVJbWF0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdShOKXtsZXQgUj1OLmNvcmVHcmFwaDsKXy5lYWNoKFIubm9kZXMoKSxYPT57Ui5ub2RlKFgpLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxYLnN0YXJ0c1dpdGgoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KE4uY29yZUdyYXBoLm91dEVkZ2VzKFgpLmxlbmd0aD5OLmNvcmVHcmFwaC5pbkVkZ2VzKFgpLmxlbmd0aD9tKE4sWCwhMCk6bihOLFgsITApKX0pfWZ1bmN0aW9uIHcoTil7bGV0IFI9Ti5jb3JlR3JhcGg7Xy5lYWNoKFIubm9kZXMoKSxYPT57bGV0IGFhPVIubm9kZShYKTthYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJnEoYWEubm9kZSxHLm91dEV4dHJhY3RUeXBlcykmJm0oTixYKX0pfWZ1bmN0aW9uIEEoTil7bGV0IFI9Ti5jb3JlR3JhcGg7Xy5lYWNoKFIubm9kZXMoKSxYPT57bGV0IGFhPVIubm9kZShYKTthYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJnEoYWEubm9kZSxHLmluRXh0cmFjdFR5cGVzKSYmCm4oTixYKX0pfWZ1bmN0aW9uIHkoTil7bGV0IFI9Ti5jb3JlR3JhcGgsWD17fSxhYT17fSxmYT0wO18uZWFjaChSLm5vZGVzKCksa2E9PntpZihSLm5vZGUoa2EpLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCl7dmFyIFc9Xy5yZWR1Y2UoUi5wcmVkZWNlc3NvcnMoa2EpLCh2YSx5YSk9Pnt5YT1SLmVkZ2UoeWEsa2EpLm1ldGFlZGdlO3JldHVybiB2YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1XJiYwPFIucHJlZGVjZXNzb3JzKGthKS5sZW5ndGgmJihXPVIucHJlZGVjZXNzb3JzKGthKS5sZW5ndGgpO3ZhciBFYT1fLnJlZHVjZShSLnN1Y2Nlc3NvcnMoa2EpLCh2YSx5YSk9Pnt5YT1SLmVkZ2Uoa2EseWEpLm1ldGFlZGdlO3JldHVybiB2YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1FYSYmMDxSLnN1Y2Nlc3NvcnMoa2EpLmxlbmd0aCYmKEVhPVIuc3VjY2Vzc29ycyhrYSkubGVuZ3RoKTtYW2thXT1XO2FhW2thXT1FYTsKZmErK319KTtpZighKGZhPEcubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikpe3ZhciBvYT1HLm1pbkRlZ3JlZUZvckV4dHJhY3Rpb24tMSxaPU1hdGgucm91bmQoLjc1KmZhKSxjYT1NYXRoLnJvdW5kKC4yNSpmYSksamE9T2JqZWN0LmtleXMoWCkuc29ydCgoa2EsVyk9Plhba2FdLVhbV10pLGJhPVhbamFbWl1dO2JhPWJhK2JhLVhbamFbY2FdXTtiYT1NYXRoLm1heChiYSxvYSk7Zm9yKGxldCBrYT1mYS0xO1hbamFba2FdXT5iYTtrYS0tKW4oTixqYVtrYV0pO2phPU9iamVjdC5rZXlzKGFhKS5zb3J0KChrYSxXKT0+YWFba2FdLWFhW1ddKTtaPWFhW2phW1pdXTtjYT1aKzQqKFotYWFbamFbY2FdXSk7Y2E9TWF0aC5tYXgoY2Esb2EpO2ZvcihvYT1mYS0xO2FhW2phW29hXV0+Y2E7b2EtLSkoWj1SLm5vZGUoamFbb2FdKSkmJiFaLmlzSW5FeHRyYWN0JiZtKE4samFbb2FdKX19ZnVuY3Rpb24geChOKXtsZXQgUj1OLmNvcmVHcmFwaCxYPXt9O18uZWFjaChSLmVkZ2VzKCksYWE9PntSLmVkZ2UoYWEpLm1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlc3x8CigoWFthYS52XT1YW2FhLnZdfHxbXSkucHVzaChhYSksKFhbYWEud109WFthYS53XXx8W10pLnB1c2goYWEpKX0pO18uZWFjaChYLGFhPT57YWEubGVuZ3RoPkcubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKGFhLGZhPT5wKFIsZmEudixmYS53KSl9KX1mdW5jdGlvbiBDKE4pe3UoTik7Ry5vdXRFeHRyYWN0VHlwZXMmJncoTik7Ry5pbkV4dHJhY3RUeXBlcyYmQShOKTt5KE4pO0cubWF4Q29udHJvbERlZ3JlZSYmeChOKTtsZXQgUj1OLmNvcmVHcmFwaDtfLmVhY2goUi5ub2RlcygpLFg9PntsZXQgYWE9Ui5ub2RlKFgpO3ZhciBmYT1SLm5laWdoYm9ycyhYKS5sZW5ndGg7aWYoYWEubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09ZmEpe2ZhPTA8YWEub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7bGV0IG9hPTA8YWEuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDthYS5pc0luRXh0cmFjdD8oTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9CmQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFIucmVtb3ZlTm9kZShYKSk6YWEuaXNPdXRFeHRyYWN0PyhOLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUi5yZW1vdmVOb2RlKFgpKTpHLmV4dHJhY3RJc29sYXRlZE5vZGVzV2l0aEFubm90YXRpb25zT25PbmVTaWRlJiYoZmEmJiFvYT8oYWEuaXNJbkV4dHJhY3Q9ITAsTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUi5yZW1vdmVOb2RlKFgpKTpvYSYmIWZhJiYoYWEuaXNPdXRFeHRyYWN0PSEwLE4uaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goYWEpLGFhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSxSLnJlbW92ZU5vZGUoWCkpKX19KX1mLk9wTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiIjZmZmZmZmIixERUZBVUxUX1NUUk9LRToiI2IyYjJiMiIsQ09NUEFUSUJMRToiIzBmOWQ1OCIsCklOQ09NUEFUSUJMRToiI2RiNDQzNyJ9O2YuTWV0YW5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2Q5ZDlkOSIsREVGQVVMVF9TVFJPS0U6IiNhNmE2YTYiLFNBVFVSQVRJT046LjYsTElHSFRORVNTOi44NSxFWFBBTkRFRF9DT0xPUjoiI2YwZjBmMCIsSFVFUzpbMjIwLDEwMCwxODAsNDAsMjAsMzQwLDI2MCwzMDAsMTQwLDYwXSxTVFJVQ1RVUkVfUEFMRVRURShOLFIpe3ZhciBYPWYuTWV0YW5vZGVDb2xvcnMuSFVFUztOPVhbTiVYLmxlbmd0aF07WD1NYXRoLnNpbihOKk1hdGguUEkvMzYwKTtyZXR1cm4gZDMuaHNsKE4sLjAxKihSPzMwOjkwLTYwKlgpLC4wMSooUj85NTo4MCkpLnRvU3RyaW5nKCl9LERFVklDRV9QQUxFVFRFKE4pe3JldHVybiBmLk1ldGFub2RlQ29sb3JzLlNUUlVDVFVSRV9QQUxFVFRFKE4pfSxYTEFfQ0xVU1RFUl9QQUxFVFRFKE4pe3JldHVybiBmLk1ldGFub2RlQ29sb3JzLlNUUlVDVFVSRV9QQUxFVFRFKE4pfSxVTktOT1dOOiIjZWVlIixHUkFESUVOVF9PVVRMSU5FOiIjODg4In07CmYuU2VyaWVzTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiJ3aGl0ZSIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIifTtjb25zdCBHPXtlbmFibGVFeHRyYWN0aW9uOiEwLG1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb246MTUsbWluRGVncmVlRm9yRXh0cmFjdGlvbjo1LG1heENvbnRyb2xEZWdyZWU6NCxtYXhCcmlkZ2VQYXRoRGVncmVlOjQsb3V0RXh0cmFjdFR5cGVzOlsiTm9PcCJdLGluRXh0cmFjdFR5cGVzOltdLGRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZTohMCxleHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZTohMCxlbmFibGVCcmlkZ2VncmFwaDohMCxtaW5NYXhDb2xvcnM6WyIjZmZmNWYwIiwiI2ZiNmE0YSJdLG1heEFubm90YXRpb25zOjV9LEQ9bmV3IFJlZ0V4cCgiXig/OiIrYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKyIpPyhcXHcrKV9bYS16MC05XXs4fSg/Ol9cXGQrKT8kIik7Y2xhc3MgQntjb25zdHJ1Y3RvcihOLApSKXt0aGlzLmhpZXJhcmNoeT1OO3RoaXMuZGlzcGxheWluZ1N0YXRzPVI7dGhpcy5pbmRleD17fTt0aGlzLnJlbmRlcmVkT3BOYW1lcz1bXTt0aGlzLmNvbXB1dGVTY2FsZXMoKTt0aGlzLmhhc1N1YmhpZXJhcmNoeT17fTt0aGlzLnJvb3Q9bmV3IFMoTi5yb290LE4uZ3JhcGhPcHRpb25zKTt0aGlzLmluZGV4W04ucm9vdC5uYW1lXT10aGlzLnJvb3Q7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChOLnJvb3QubmFtZSk7dGhpcy5idWlsZFN1YmhpZXJhcmNoeShOLnJvb3QubmFtZSk7dGhpcy5yb290LmV4cGFuZGVkPSEwO3RoaXMudHJhY2VJbnB1dHM9ITF9Y29tcHV0ZVNjYWxlcygpe3RoaXMuZGV2aWNlQ29sb3JNYXA9ZDMuc2NhbGVPcmRpbmFsKCkuZG9tYWluKHRoaXMuaGllcmFyY2h5LmRldmljZXMpLnJhbmdlKF8ubWFwKGQzLnJhbmdlKHRoaXMuaGllcmFyY2h5LmRldmljZXMubGVuZ3RoKSxmLk1ldGFub2RlQ29sb3JzLkRFVklDRV9QQUxFVFRFKSk7dGhpcy54bGFDbHVzdGVyQ29sb3JNYXA9CmQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSxmLk1ldGFub2RlQ29sb3JzLlhMQV9DTFVTVEVSX1BBTEVUVEUpKTtsZXQgTj10aGlzLmhpZXJhcmNoeS5yb290Lm1ldGFncmFwaDt2YXIgUj1kMy5tYXgoTi5ub2RlcygpLFg9PntYPU4ubm9kZShYKTtpZihudWxsIT1YLnN0YXRzKXJldHVybiBYLnN0YXRzLnRvdGFsQnl0ZXN9KTt0aGlzLm1lbW9yeVVzYWdlU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUl0pLnJhbmdlKEcubWluTWF4Q29sb3JzKTtSPWQzLm1heChOLm5vZGVzKCksWD0+e1g9Ti5ub2RlKFgpO2lmKG51bGwhPVguc3RhdHMpcmV0dXJuIFguc3RhdHMuZ2V0VG90YWxNaWNyb3MoKX0pO3RoaXMuY29tcHV0ZVRpbWVTY2FsZT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxSXSkucmFuZ2UoRy5taW5NYXhDb2xvcnMpOwp0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/ZC5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSx0aGlzLmhpZXJhcmNoeS5tYXhNZXRhRWRnZVNpemVdKS5yYW5nZShbZC5zY2VuZS5lZGdlLk1JTl9FREdFX1dJRFRILGQuc2NlbmUuZWRnZS5NQVhfRURHRV9XSURUSF0pfWdldFJlbmRlck5vZGVCeU5hbWUoTil7cmV0dXJuIHRoaXMuaW5kZXhbTl19Z2V0Tm9kZUJ5TmFtZShOKXtyZXR1cm4gdGhpcy5oaWVyYXJjaHkubm9kZShOKX1jb2xvckhpc3RvZ3JhbShOLFIpe2lmKDA8T2JqZWN0LmtleXMoTikubGVuZ3RoKXtjb25zdCBYPV8uc3VtKE9iamVjdC5rZXlzKE4pLm1hcChhYT0+TlthYV0pKTtyZXR1cm4gT2JqZWN0LmtleXMoTikubWFwKGFhPT4oe2NvbG9yOlIoYWEpLHByb3BvcnRpb246TlthYV0vWH0pKX1jb25zb2xlLmluZm8oIm5vIHBhaXJzIGZvdW5kISIpOwpyZXR1cm4gbnVsbH1nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoTil7aWYoIU4pcmV0dXJuIG51bGw7aWYoTiBpbiB0aGlzLmluZGV4KXJldHVybiB0aGlzLmluZGV4W05dO3ZhciBSPXRoaXMuaGllcmFyY2h5Lm5vZGUoTik7aWYoIVIpcmV0dXJuIG51bGw7bGV0IFg9Ui5pc0dyb3VwTm9kZT9uZXcgUyhSLHRoaXMuaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk6bmV3IEooUik7dGhpcy5pbmRleFtOXT1YO3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTik7Ui5zdGF0cyYmKFgubWVtb3J5Q29sb3I9dGhpcy5tZW1vcnlVc2FnZVNjYWxlKFIuc3RhdHMudG90YWxCeXRlcyksWC5jb21wdXRlVGltZUNvbG9yPXRoaXMuY29tcHV0ZVRpbWVTY2FsZShSLnN0YXRzLmdldFRvdGFsTWljcm9zKCkpKTtYLmlzRmFkZWRPdXQ9dGhpcy5kaXNwbGF5aW5nU3RhdHMmJiFiLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoUi5zdGF0cyk7dmFyIGFhPW51bGwsZmE9bnVsbCxvYT1udWxsOwppZihSLmlzR3JvdXBOb2RlKXthYT1SLmRldmljZUhpc3RvZ3JhbTtmYT1SLnhsYUNsdXN0ZXJIaXN0b2dyYW07dmFyIFo9Ui5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7Uj1SLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlO2lmKDAhPVp8fDAhPVIpb2E9Wi8oWitSKX1lbHNlKFo9WC5ub2RlLmRldmljZSkmJihhYT17W1pdOjF9KSwoWj1YLm5vZGUueGxhQ2x1c3RlcikmJihmYT17W1pdOjF9KSxYLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuT1AmJihvYT1YLm5vZGUuY29tcGF0aWJsZT8xOjApO2FhJiYoWC5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShhYSx0aGlzLmRldmljZUNvbG9yTWFwKSk7ZmEmJihYLnhsYUNsdXN0ZXJDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShmYSx0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpO251bGwhPW9hJiYoWC5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6Yi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUsCnByb3BvcnRpb246b2F9LHtjb2xvcjpiLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFLHByb3BvcnRpb246MS1vYX1dKTtyZXR1cm4gdGhpcy5pbmRleFtOXX1nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKE4pe3ZhciBSPWQuZ2V0SGllcmFyY2hpY2FsUGF0aChOKTtsZXQgWD0wLGFhPW51bGw7Zm9yKDtYPFIubGVuZ3RoJiYoTj1SW1hdLGFhPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShOKSxhYS5leHBhbmRlZCk7WCsrKTtyZXR1cm4gWD09Ui5sZW5ndGgtMiYmKFI9UltYKzFdLGFhLmluQW5ub3RhdGlvbnMubm9kZU5hbWVzW1JdfHxhYS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbUl0pP1I6Tn1zZXREZXB0aChOKXtsKHRoaXMucm9vdCwrTil9aXNOb2RlQXV4aWxpYXJ5KE4pe2xldCBSPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShOLm5vZGUucGFyZW50Tm9kZS5uYW1lKSxYPV8uZmluZChSLmlzb2xhdGVkSW5FeHRyYWN0LGFhPT5hYS5ub2RlLm5hbWU9PT0KTi5ub2RlLm5hbWUpO2lmKFgpcmV0dXJuITA7WD1fLmZpbmQoUi5pc29sYXRlZE91dEV4dHJhY3QsYWE9PmFhLm5vZGUubmFtZT09PU4ubm9kZS5uYW1lKTtyZXR1cm4hIVh9Z2V0TmFtZXNPZlJlbmRlcmVkT3BzKCl7cmV0dXJuIHRoaXMucmVuZGVyZWRPcE5hbWVzfWNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoTixSLFgsYWEpe3ZhciBmYT1YLm5hbWUucmVwbGFjZShSLGFhKTtsZXQgb2E9Ti5tZXRhZ3JhcGgubm9kZShmYSk7aWYob2EpcmV0dXJuIG9hO29hPW5ldyBkLk9wTm9kZUltcGwoe25hbWU6ZmEsaW5wdXQ6W10sZGV2aWNlOlguZGV2aWNlLG9wOlgub3AsYXR0cjpfLmNsb25lRGVlcChYLmF0dHIpfSk7b2EuY2FyZGluYWxpdHk9WC5jYXJkaW5hbGl0eTtvYS5pbmNsdWRlPVguaW5jbHVkZTtvYS5vdXRwdXRTaGFwZXM9Xy5jbG9uZURlZXAoWC5vdXRwdXRTaGFwZXMpO29hLnhsYUNsdXN0ZXI9WC54bGFDbHVzdGVyO29hLmZ1bmN0aW9uSW5wdXRJbmRleD1YLmZ1bmN0aW9uSW5wdXRJbmRleDsKb2EuZnVuY3Rpb25PdXRwdXRJbmRleD1YLmZ1bmN0aW9uT3V0cHV0SW5kZXg7b2EuaW5wdXRzPVguaW5wdXRzLm1hcChaPT57Y29uc3QgY2E9Xy5jbG9uZShaKTtjYS5uYW1lPVoubmFtZS5yZXBsYWNlKFIsYWEpO3JldHVybiBjYX0pO29hLnBhcmVudE5vZGU9TjtOLm1ldGFncmFwaC5zZXROb2RlKG9hLm5hbWUsb2EpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUob2EubmFtZSxvYSk7ZmE9Wj0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKE4sUixaLGFhKTtvYS5pbkVtYmVkZGluZ3M9WC5pbkVtYmVkZGluZ3MubWFwKGZhKTtvYS5vdXRFbWJlZGRpbmdzPVgub3V0RW1iZWRkaW5ncy5tYXAoZmEpO3JldHVybiBvYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKE4sUixYLGFhLGZhKXtjb25zdCBvYT17fTtOPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihOLFIsWCxhYSxmYSxvYSk7Xy5pc0VtcHR5KG9hKXx8dGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhSLApvYSk7cmV0dXJuIE59Y2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihOLFIsWCxhYSxmYSxvYSl7Y29uc3QgWj1iLmdyYXBoLmNyZWF0ZU1ldGFub2RlKFgubmFtZS5yZXBsYWNlKGFhLGZhKSk7Wi5kZXB0aD1YLmRlcHRoO1ouY2FyZGluYWxpdHk9WC5jYXJkaW5hbGl0eTtaLnRlbXBsYXRlSWQ9WC50ZW1wbGF0ZUlkO1oub3BIaXN0b2dyYW09Xy5jbG9uZShYLm9wSGlzdG9ncmFtKTtaLmRldmljZUhpc3RvZ3JhbT1fLmNsb25lKFguZGV2aWNlSGlzdG9ncmFtKTtaLnhsYUNsdXN0ZXJIaXN0b2dyYW09Xy5jbG9uZShYLnhsYUNsdXN0ZXJIaXN0b2dyYW0pO1ouaGFzTm9uQ29udHJvbEVkZ2VzPVguaGFzTm9uQ29udHJvbEVkZ2VzO1ouaW5jbHVkZT1YLmluY2x1ZGU7Wi5ub2RlQXR0cmlidXRlcz1fLmNsb25lKFgubm9kZUF0dHJpYnV0ZXMpO1ouYXNzb2NpYXRlZEZ1bmN0aW9uPVguYXNzb2NpYXRlZEZ1bmN0aW9uO18uZWFjaChYLm1ldGFncmFwaC5ub2RlcygpLGNhPT4Ke2NhPVgubWV0YWdyYXBoLm5vZGUoY2EpO3N3aXRjaChjYS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpjYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTixSLGNhLGFhLGZhLG9hKTtjYS5wYXJlbnROb2RlPVo7Wi5tZXRhZ3JhcGguc2V0Tm9kZShjYS5uYW1lLGNhKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKGNhLm5hbWUsY2EpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpjYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoWixhYSxjYSxmYSk7Xy5pc051bWJlcihjYS5mdW5jdGlvbklucHV0SW5kZXgpJiZ0aGlzLnBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoUixjYSk7Xy5pc051bWJlcihjYS5mdW5jdGlvbk91dHB1dEluZGV4KSYmKG9hW2NhLmZ1bmN0aW9uT3V0cHV0SW5kZXhdPWNhKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybihjYS5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSk7CnRoaXMuY2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhYLFosYWEsZmEpO3JldHVybiBafWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoTixSLFgsYWEpe18uZWFjaChOLm1ldGFncmFwaC5lZGdlcygpLGZhPT57ZmE9Ti5tZXRhZ3JhcGguZWRnZShmYSk7Y29uc3Qgb2E9ZmEudi5yZXBsYWNlKFgsYWEpLFo9ZmEudy5yZXBsYWNlKFgsYWEpLGNhPW5ldyBkLk1ldGFlZGdlSW1wbChvYSxaKTtjYS5pbmJvdW5kPWZhLmluYm91bmQ7Y2EubnVtUmVndWxhckVkZ2VzPWZhLm51bVJlZ3VsYXJFZGdlcztjYS5udW1Db250cm9sRWRnZXM9ZmEubnVtQ29udHJvbEVkZ2VzO2NhLm51bVJlZkVkZ2VzPWZhLm51bVJlZkVkZ2VzO2NhLnRvdGFsU2l6ZT1mYS50b3RhbFNpemU7ZmEuYmFzZUVkZ2VMaXN0JiYoY2EuYmFzZUVkZ2VMaXN0PWZhLmJhc2VFZGdlTGlzdC5tYXAoamE9Pntjb25zdCBiYT1fLmNsb25lKGphKTtiYS52PWphLnYucmVwbGFjZShYLGFhKTtiYS53PWphLncucmVwbGFjZShYLGFhKTsKcmV0dXJuIGJhfSkpO1IubWV0YWdyYXBoLm5vZGUoWik/Ui5tZXRhZ3JhcGguc2V0RWRnZShvYSxaLGNhKTpSLm1ldGFncmFwaC5zZXRFZGdlKFosb2EsY2EpfSl9cGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhOLFIpe2xldCBYPU1hdGgubWluKFIuZnVuY3Rpb25JbnB1dEluZGV4LE4uaW5wdXRzLmxlbmd0aC0xKTtmb3IodmFyIGFhPV8uY2xvbmUoTi5pbnB1dHNbWF0pO2FhLmlzQ29udHJvbERlcGVuZGVuY3k7KVgrKyxhYT1OLmlucHV0c1tYXTtSLmlucHV0cy5wdXNoKGFhKTthYT10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTi5uYW1lKTtsZXQgZmEsb2E9MDtfLmVhY2goYWEucmVndWxhcixaPT57b2ErPVoubnVtUmVndWxhckVkZ2VzO2lmKG9hPlgpcmV0dXJuIGZhPVosITF9KTtfLmVhY2goZmEuYmFzZUVkZ2VMaXN0LFo9PntaLnc9PT1OLm5hbWUmJihaLnc9Ui5uYW1lKTtaLnY9PT1OLm5hbWUmJihaLnY9Ui5uYW1lKX0pfXBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKE4sClIpe2NvbnN0IFg9dGhpcy5oaWVyYXJjaHkuZ2V0U3VjY2Vzc29ycyhOLm5hbWUpO18uZWFjaChYLnJlZ3VsYXIsYWE9PntfLmVhY2goYWEuYmFzZUVkZ2VMaXN0LGZhPT57Y29uc3Qgb2E9dGhpcy5oaWVyYXJjaHkubm9kZShmYS53KTtfLmVhY2gob2EuaW5wdXRzLFo9PntaLm5hbWU9PT1OLm5hbWUmJihaLm5hbWU9UltaLm91dHB1dFRlbnNvcktleV0ubmFtZSxaLm91dHB1dFRlbnNvcktleT1mYS5vdXRwdXRUZW5zb3JLZXkpfSl9KTtfLmVhY2goYWEuYmFzZUVkZ2VMaXN0LGZhPT57ZmEudj1SW2ZhLm91dHB1dFRlbnNvcktleV0ubmFtZTtmYS5vdXRwdXRUZW5zb3JLZXk9IjAifSl9KX1idWlsZFN1YmhpZXJhcmNoeShOKXtpZighKE4gaW4gdGhpcy5oYXNTdWJoaWVyYXJjaHkpKXt0aGlzLmhhc1N1YmhpZXJhcmNoeVtOXT0hMDt2YXIgUj10aGlzLmluZGV4W05dO2lmKFIubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBfHxSLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKXt2YXIgWD0KUi5ub2RlLm1ldGFncmFwaCxhYT1SLmNvcmVHcmFwaCxmYT1bXSxvYT1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fChfLmVhY2goWC5ub2RlcygpLHlhPT57Y29uc3QgQWE9WC5ub2RlKHlhKSxGYT10aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW0FhLm9wXTtGYSYmMCE9PXlhLmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHlhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShYLEFhLEZhLm5vZGUsRmEubm9kZS5uYW1lLEFhLm5hbWUpLGZhLnB1c2goQWEpLG9hLnB1c2goeWEpKX0pLF8uZWFjaChvYSwoeWEsQWEpPT57QWE9ZmFbQWFdO3lhLnBhcmVudE5vZGU9QWEucGFyZW50Tm9kZTtYLnNldE5vZGUoQWEubmFtZSx5YSk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShBYS5uYW1lLHlhKX0pKTtfLmVhY2goWC5ub2RlcygpLHlhPT57bGV0IEFhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhKSwKRmE9QWEubm9kZTthYS5zZXROb2RlKHlhLEFhKTtGYS5pc0dyb3VwTm9kZXx8KF8uZWFjaChGYS5pbkVtYmVkZGluZ3MseGE9PntsZXQgU2E9bmV3IE8obnVsbCksWGE9bmV3IEooeGEpO2goQWEseGEsWGEsU2EsSy5DT05TVEFOVCk7dGhpcy5pbmRleFt4YS5uYW1lXT1YYX0pLF8uZWFjaChGYS5vdXRFbWJlZGRpbmdzLHhhPT57bGV0IFNhPW5ldyBPKG51bGwpLFhhPW5ldyBKKHhhKTtrKEFhLHhhLFhhLFNhLEsuU1VNTUFSWSk7dGhpcy5pbmRleFt4YS5uYW1lXT1YYX0pKX0pO18uZWFjaChYLmVkZ2VzKCkseWE9Pnt2YXIgQWE9WC5lZGdlKHlhKTtBYT1uZXcgTyhBYSk7QWEuaXNGYWRlZE91dD10aGlzLmluZGV4W3lhLnZdLmlzRmFkZWRPdXR8fHRoaXMuaW5kZXhbeWEud10uaXNGYWRlZE91dDthYS5zZXRFZGdlKHlhLnYseWEudyxBYSl9KTtHLmVuYWJsZUV4dHJhY3Rpb24mJlIubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZDKFIpO18uaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8CnRoaXMuYnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhYKTtOPT09Yi5ncmFwaC5ST09UX05BTUUmJl8uZm9yT3duKHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMseWE9Pnt5YT15YS5ub2RlO2NvbnN0IEFhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhLm5hbWUpO1IubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QucHVzaChBYSk7QWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFO2FhLnJlbW92ZU5vZGUoeWEubmFtZSl9KTt2YXIgWj1SLm5vZGUucGFyZW50Tm9kZTtpZihaKXt2YXIgY2E9dGhpcy5pbmRleFtaLm5hbWVdLGphPSh5YSwuLi5BYSk9PkFhLmNvbmNhdChbeWE/IklOIjoiT1VUIl0pLmpvaW4oIn5+IiksYmE9dGhpcy5oaWVyYXJjaHkuZ2V0QnJpZGdlZ3JhcGgoTiksa2E9e30sVz17fSxFYT17fTtfLmVhY2goYmEuZWRnZXMoKSx5YT0+e2xldCBBYT0hIVgubm9kZSh5YS53KSxGYT1BYT95YS52OnlhLnc7YmEuZWRnZSh5YSkubnVtUmVndWxhckVkZ2VzPwpBYT9XW0ZhXT0oV1tGYV18fDApKzE6a2FbRmFdPShrYVtGYV18fDApKzE6RWFbRmFdPShFYVtGYV18fDApKzF9KTt2YXIgdmE9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO18uZWFjaChiYS5lZGdlcygpLHlhPT57dmFyIEFhPWJhLmVkZ2UoeWEpO2xldCBGYT0hIVgubm9kZSh5YS53KSxbeGEsU2FdPUZhP1t5YS53LHlhLnZdOlt5YS52LHlhLnddO3ZhciBYYT10aGlzLmluZGV4W3hhXSx1Yj10aGlzLmluZGV4W1NhXSxCYj11Yj91Yi5ub2RlOnZhW1NhXSxxYj0hQWEubnVtUmVndWxhckVkZ2VzJiZFYVtTYV0+Ry5tYXhDb250cm9sRGVncmVlLFssemJdPUZhP1tSLmluQW5ub3RhdGlvbnMsWGEuaW5Bbm5vdGF0aW9uc106W1Iub3V0QW5ub3RhdGlvbnMsWGEub3V0QW5ub3RhdGlvbnNdO2xldCB2Yj0oRmE/VzprYSlbU2FdPkcubWF4QnJpZGdlUGF0aERlZ3JlZTt5YT1udWxsO3ZhciBHYj0hMTtHLmVuYWJsZUJyaWRnZWdyYXBoJiYhdmImJiFxYiYmWGEuaXNJbkNvcmUoKSYmKEdiPQpPYj0+Y2EuY29yZUdyYXBoLmVkZ2UoRmE/e3Y6T2IsdzpOfTp7djpOLHc6T2J9KSwoeWE9R2IoU2EpKXx8KHlhPUdiKGphKEZhLFNhLFoubmFtZSkpKSxHYj0hIXlhKTtYYT0hMTtpZih5YSYmIUFhLm51bVJlZ3VsYXJFZGdlcyl7WGE9eWE7Zm9yKHFiPWNhLm5vZGU7WGEuYWRqb2luaW5nTWV0YWVkZ2U7KVhhPVhhLmFkam9pbmluZ01ldGFlZGdlLHFiPXFiLnBhcmVudE5vZGU7cWI9dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhxYi5uYW1lKTtYYT1YYS5tZXRhZWRnZTtYYT1xYltYYS52XT5xYltYYS53XX1HYiYmIVhhPyhCYj1qYShGYSxOKSx1Yj1qYShGYSxTYSxOKSx6Yj1hYS5ub2RlKHViKSx6Ynx8KEdiPWFhLm5vZGUoQmIpLEdifHwoR2I9bmV3IEooe25hbWU6QmIsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eTowLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVELAppbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFtCYl09R2IsYWEuc2V0Tm9kZShCYixHYikpLHpiPW5ldyBKKHtuYW1lOnViLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFt1Yl09emIsYWEuc2V0Tm9kZSh1Yix6YiksYWEuc2V0UGFyZW50KHViLEJiKSxHYi5ub2RlLmNhcmRpbmFsaXR5KyspLEFhPW5ldyBPKEFhKSxBYS5hZGpvaW5pbmdNZXRhZWRnZT15YSxGYT9hYS5zZXRFZGdlKHViLHhhLEFhKTphYS5zZXRFZGdlKHhhLHViLEFhKSk6emIucHVzaChuZXcgSChCYix1YixuZXcgTyhBYSksSy5TSE9SVENVVCxGYSkpfSk7Xy5lYWNoKFshMCwhMV0seWE9PntsZXQgQWE9amEoeWEsTiksRmE9YWEubm9kZShBYSk7RmEmJl8uZWFjaChhYS5ub2RlcygpLAp4YT0+e2lmKGFhLm5vZGUoeGEpLm5vZGUudHlwZSE9PWQuTm9kZVR5cGUuQlJJREdFJiYoeWE/IWFhLnByZWRlY2Vzc29ycyh4YSkubGVuZ3RoOiFhYS5zdWNjZXNzb3JzKHhhKS5sZW5ndGgpKXt2YXIgU2E9amEoeWEsTiwiU1RSVUNUVVJBTF9UQVJHRVQiKSxYYT1hYS5ub2RlKFNhKTtYYXx8KFhhPW5ldyBKKHtuYW1lOlNhLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnlhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWGEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1NhXT1YYSxhYS5zZXROb2RlKFNhLFhhKSxGYS5ub2RlLmNhcmRpbmFsaXR5KyssYWEuc2V0UGFyZW50KFNhLEFhKSk7WGE9bmV3IE8obnVsbCk7WGEuc3RydWN0dXJhbD0hMDtYYS53ZWlnaHQtLTt5YT9hYS5zZXRFZGdlKFNhLHhhLFhhKTphYS5zZXRFZGdlKHhhLApTYSxYYSl9fSl9KX19fX1idWlsZFN1YmhpZXJhcmNoaWVzRm9yTmVlZGVkRnVuY3Rpb25zKE4pe18uZWFjaChOLmVkZ2VzKCksUj0+e1I9Ti5lZGdlKFIpO1I9bmV3IE8oUik7Xy5mb3JFYWNoKFIubWV0YWVkZ2UuYmFzZUVkZ2VMaXN0LFg9Pnt2YXIgYWE9WC52LnNwbGl0KGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGZhPWFhLmxlbmd0aDswPD1mYTtmYS0tKXtYPWFhLnNsaWNlKDAsZmEpO2NvbnN0IG9hPXRoaXMuaGllcmFyY2h5Lm5vZGUoWC5qb2luKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSk7aWYob2Epe2lmKG9hLnR5cGU9PT1kLk5vZGVUeXBlLk9QJiZ0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW29hLm9wXSlmb3IoYWE9MTthYTxYLmxlbmd0aDthYSsrKShmYT1YLnNsaWNlKDAsYWEpLmpvaW4oYi5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKSYmdGhpcy5idWlsZFN1YmhpZXJhcmNoeShmYSk7YnJlYWt9fX0pfSl9fWYuUmVuZGVyR3JhcGhJbmZvPUI7CmNsYXNzIEh7Y29uc3RydWN0b3IoTixSLFgsYWEsZmEpe3RoaXMubm9kZT1OO3RoaXMucmVuZGVyTm9kZUluZm89Ujt0aGlzLnJlbmRlck1ldGFlZGdlSW5mbz1YO3RoaXMuYW5ub3RhdGlvblR5cGU9YWE7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmR5PXRoaXMuZHg9MDtYJiZYLm1ldGFlZGdlJiYodGhpcy52PVgubWV0YWVkZ2Uudix0aGlzLnc9WC5tZXRhZWRnZS53KTt0aGlzLmlzSW49ZmE7dGhpcy5wb2ludHM9W119fWYuQW5ub3RhdGlvbj1IO2xldCBLOyhmdW5jdGlvbihOKXtOW04uU0hPUlRDVVQ9MF09IlNIT1JUQ1VUIjtOW04uQ09OU1RBTlQ9MV09IkNPTlNUQU5UIjtOW04uU1VNTUFSWT0yXT0iU1VNTUFSWSI7TltOLkVMTElQU0lTPTNdPSJFTExJUFNJUyJ9KShLPWYuQW5ub3RhdGlvblR5cGV8fChmLkFubm90YXRpb25UeXBlPXt9KSk7Y2xhc3MgTHtjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdD1bXTt0aGlzLm5vZGVOYW1lcz17fX1wdXNoKE4pe2lmKCEoTi5ub2RlLm5hbWUgaW4KdGhpcy5ub2RlTmFtZXMpKWlmKHRoaXMubm9kZU5hbWVzW04ubm9kZS5uYW1lXT0hMCx0aGlzLmxpc3QubGVuZ3RoPEcubWF4QW5ub3RhdGlvbnMpdGhpcy5saXN0LnB1c2goTik7ZWxzZXt2YXIgUj10aGlzLmxpc3RbdGhpcy5saXN0Lmxlbmd0aC0xXTtSLmFubm90YXRpb25UeXBlPT09Sy5FTExJUFNJUz8oTj1SLm5vZGUsTi5zZXROdW1Nb3JlTm9kZXMoKytOLm51bU1vcmVOb2RlcykpOihSPW5ldyBiLmdyYXBoLkVsbGlwc2lzTm9kZUltcGwoMSksdGhpcy5saXN0LnB1c2gobmV3IEgoUixuZXcgSihSKSxudWxsLEsuRUxMSVBTSVMsTi5pc0luKSkpfX19Zi5Bbm5vdGF0aW9uTGlzdD1MO2NsYXNzIEp7Y29uc3RydWN0b3IoTil7dGhpcy5ub2RlPU47dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IEw7dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgTDt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9CjA7dGhpcy5zdHJ1Y3R1cmFsPXRoaXMuZXhjbHVkZWQ9ITE7dGhpcy5wYWRkaW5nQm90dG9tPXRoaXMucGFkZGluZ1JpZ2h0PXRoaXMucGFkZGluZ0xlZnQ9dGhpcy5wYWRkaW5nVG9wPXRoaXMubGFiZWxIZWlnaHQ9dGhpcy5yYWRpdXM9dGhpcy5sYWJlbE9mZnNldD0wO3RoaXMuaXNPdXRFeHRyYWN0PXRoaXMuaXNJbkV4dHJhY3Q9ITE7dGhpcy5jb3JlQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzRmFkZWRPdXQ9ITE7dGhpcy5kaXNwbGF5TmFtZT1OLm5hbWUuc3Vic3RyaW5nKE4ubmFtZS5sYXN0SW5kZXhPZihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkrMSk7Ti50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZOLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChOPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TlsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT0KdGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCkpKX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYhdGhpcy5pc091dEV4dHJhY3QmJiF0aGlzLmlzTGlicmFyeUZ1bmN0aW9ufX1mLlJlbmRlck5vZGVJbmZvPUo7Y2xhc3MgT3tjb25zdHJ1Y3RvcihOKXt0aGlzLm1ldGFlZGdlPU47dGhpcy5hZGpvaW5pbmdNZXRhZWRnZT1udWxsO3RoaXMuc3RydWN0dXJhbD0hMTt0aGlzLndlaWdodD0xO3RoaXMuaXNGYWRlZE91dD0hMX19Zi5SZW5kZXJNZXRhZWRnZUluZm89TztjbGFzcyBTIGV4dGVuZHMgSntjb25zdHJ1Y3RvcihOLFIpe3N1cGVyKE4pO049Ti5tZXRhZ3JhcGguZ3JhcGgoKTtSLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWQuY3JlYXRlR3JhcGgoTi5uYW1lLGQuR3JhcGhUeXBlLkNPUkUsUik7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD0Ke3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXTt0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD1bXTt0aGlzLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0PVtdfX1mLlJlbmRlckdyb3VwTm9kZUluZm89UztmLm1ha2VJbkV4dHJhY3Q9bjtmLm1hcEluZGV4VG9IdWU9ZnVuY3Rpb24oTil7cmV0dXJuIDErNTc5LjI1NjE2Nzk3MjUqTiUzNTh9O2YuZXhwYW5kVW50aWxOb2RlSXNTaG93bj1mdW5jdGlvbihOLFIpe3ZhciBYPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpO1I9Ui5zcGxpdCgiLyIpO3ZhciBhYT1SW1IubGVuZ3RoLTFdLm1hdGNoKC8oLiopOlx3Ky8pOzI9PT1hYS5sZW5ndGgmJihSW1IubGVuZ3RoLTFdPWFhWzFdKTthYT1SWzBdO2xldCBmYT1OLmdldFJlbmRlck5vZGVCeU5hbWUoYWEpO2ZvcihsZXQgb2E9MTtvYTxSLmxlbmd0aCYmZmEubm9kZS50eXBlIT09CmIuZ3JhcGguTm9kZVR5cGUuT1A7b2ErKylOLmJ1aWxkU3ViaGllcmFyY2h5KGFhKSxmYS5leHBhbmRlZD0hMCxYLnNldE5vZGVFeHBhbmRlZChmYSksYWErPSIvIitSW29hXSxmYT1OLmdldFJlbmRlck5vZGVCeU5hbWUoYWEpO3JldHVybiBmYS5ub2RlLm5hbWV9fSkoZC5yZW5kZXJ8fChkLnJlbmRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxLHUsdyxBKXt2YXIgeT1rKHEsdSx3KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdSk7aWYodyBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx3Lmxlbmd0aDt5KyspdS5jbGFzc0xpc3QuYWRkKHdbeV0pO2Vsc2UgdS5jbGFzc0xpc3QuYWRkKHcpO0E/cS5ub2RlKCkuaW5zZXJ0QmVmb3JlKHUsQSk6cS5ub2RlKCkuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIGQzLnNlbGVjdCh1KS5kYXR1bShxLmRhdHVtKCkpfWZ1bmN0aW9uIGsocSx1LHcpe3E9cS5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHEubGVuZ3RoO0ErKyl7bGV0IHk9cVtBXTtpZih5LnRhZ05hbWU9PT11KWlmKHcgaW5zdGFuY2VvZiBBcnJheSl7bGV0IHg9ITA7Zm9yKGxldCBDPTA7Qzx3Lmxlbmd0aDtDKyspeD14JiZ5LmNsYXNzTGlzdC5jb250YWlucyh3W0NdKTsKaWYoeClyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXd8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHcpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiByKHEsdSl7bGV0IHc9dS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz8wOmQubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2woayhxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpLDAsdyk7dmFyIEE9MDx1Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB4PTA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1kLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxHPTA7QSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dS5jb3JlQm94LndpZHRoLEE9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXUuaW5FeHRyYWN0Qm94LndpZHRoLzItdS5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0oeD9DOjApLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx3KSk7eSYmKHk9dS5jb3JlQm94LndpZHRoLHk9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktZC5sYXlvdXQuTUlOX0FVWF9XSURUSCt1Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXUub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHg/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHcpKTt4JiYodT11LmNvcmVCb3gud2lkdGgtdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdSx3KSl9ZnVuY3Rpb24gbChxLAp1LHcpe251bGwhPXEuYXR0cigidHJhbnNmb3JtIikmJihxPXEudHJhbnNpdGlvbigicG9zaXRpb24iKSk7cS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit1KyIsIit3KyIpIil9ZnVuY3Rpb24gcChxLHUpe3JldHVybiB1P3EudG9GaXhlZCgwKToxPD1NYXRoLmFicyhxKT9xLnRvRml4ZWQoMSk6cS50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIG0ocSx1LHcsQSl7bGV0IHk9IkRldmljZTogIitxLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3EuZHR5cGUrIlxuIjtsZXQgeD0iKHNjYWxhcikiOzA8cS5zaGFwZS5sZW5ndGgmJih4PSIoIitxLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIreCsiXG5cbiMoZWxlbWVudHMpOiAiKSsodSsiXG4iKTtxPVtdO2Zvcih1PTA7dTx3Lmxlbmd0aDt1KyspMDx3W3VdJiZxLnB1c2goIiMoIitmLmhlYWx0aFBpbGxFbnRyaWVzW3VdLmxhYmVsKyIpOiAiK3dbdV0pO3krPXEuam9pbigiLCAiKSsiXG5cbiI7QS5tYXg+PQpBLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gbihxLHUsdyxBLHk9NjAseD0xMCxDPTAsRyl7ZDMuc2VsZWN0KHEucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih1KXt2YXIgRD11LnZhbHVlLEI9RC5zbGljZSgyLDgpLEg9QlswXSxLPUJbMV0sTD1CWzVdLEo9RFsxXSxPPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09eCYmKHg9MTApO251bGw9PUMmJihDPTApO251bGwhPXcmJncubm9kZS50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIseC89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBTPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChTKTt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtOLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBSPTAsWD0iMCUiO2ZvcihsZXQgZmE9MDtmYTxCLmxlbmd0aDtmYSsrKWlmKEJbZmFdKXtSKz1CW2ZhXTt2YXIgYWE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwic3RvcCIpO2FhLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixYKTthYS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbZmFdLmJhY2tncm91bmRfY29sb3IpO04uYXBwZW5kQ2hpbGQoYWEpO1g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwic3RvcCIpO2FhPTEwMCpSL0orIiUiO1guc2V0QXR0cmlidXRlKCJvZmZzZXQiLGFhKTtYLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZi5oZWFsdGhQaWxsRW50cmllc1tmYV0uYmFja2dyb3VuZF9jb2xvcik7Ck4uYXBwZW5kQ2hpbGQoWCk7WD1hYX1TLmFwcGVuZENoaWxkKE4pO1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwicmVjdCIpO1Muc2V0QXR0cmlidXRlKCJmaWxsIiwidXJsKCMiK0ErIikiKTtTLnNldEF0dHJpYnV0ZSgid2lkdGgiLFN0cmluZyh5KSk7Uy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKHgpKTtTLnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMpKTtELmFwcGVuZENoaWxkKFMpO1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGl0bGUiKTtTLnRleHRDb250ZW50PW0odSxKLEIsTyk7RC5hcHBlbmRDaGlsZChTKTt1PSExO2lmKG51bGwhPXcmJihTPXcueC15LzIseD13LnkteC13LmhlaWdodC8yLTIsMD53LmxhYmVsT2Zmc2V0JiYoeCs9dy5sYWJlbE9mZnNldCksRC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK1MrIiwgIit4KyIpIiksKEJbMl18fEJbM118fEJbNF0pJiYodz13Lm5vZGUuYXR0cikmJgp3Lmxlbmd0aCkpZm9yKEI9MDtCPHcubGVuZ3RoO0IrKylpZigiVCI9PT13W0JdLmtleSl7dT0odz13W0JdLnZhbHVlLnR5cGUpJiYvXkRUXyhCT09MfElOVHxVSU5UKS8udGVzdCh3KTticmVha313PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsInRleHQiKTtpZihOdW1iZXIuaXNGaW5pdGUoTy5taW4pJiZOdW1iZXIuaXNGaW5pdGUoTy5tYXgpKXtpZihCPXAoTy5taW4sdSksTz1wKE8ubWF4LHUpLHcudGV4dENvbnRlbnQ9MTxKP0IrIiB+ICIrTzpCLDA8SHx8MDxLfHwwPEwpdy50ZXh0Q29udGVudCs9IiAoIixKPVtdLDA8SCYmSi5wdXNoKGBOYU5cdTAwZDcke0h9YCksMDxLJiZKLnB1c2goYC1cdTIyMWVcdTAwZDcke0t9YCksMDxMJiZKLnB1c2goYCtcdTIyMWVcdTAwZDcke0x9YCksdy50ZXh0Q29udGVudCs9Si5qb2luKCI7ICIpKyIpIn1lbHNlIHcudGV4dENvbnRlbnQ9IihObyBmaW5pdGUgZWxlbWVudHMpIjt3LmNsYXNzTGlzdC5hZGQoImhlYWx0aC1waWxsLXN0YXRzIik7Cm51bGw9PUcmJihHPXkvMik7dy5zZXRBdHRyaWJ1dGUoIngiLFN0cmluZyhHKSk7dy5zZXRBdHRyaWJ1dGUoInkiLFN0cmluZyhDLTIpKTtELmFwcGVuZENoaWxkKHcpO1BvbHltZXIuZG9tKHEucGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQoRCl9fWYuU1ZHX05BTUVTUEFDRT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuQ2xhc3M9e05vZGU6e0NPTlRBSU5FUjoibm9kZXMiLEdST1VQOiJub2RlIixTSEFQRToibm9kZXNoYXBlIixDT0xPUl9UQVJHRVQ6Im5vZGVjb2xvcnRhcmdldCIsTEFCRUw6Im5vZGVsYWJlbCIsQlVUVE9OX0NPTlRBSU5FUjoiYnV0dG9uY29udGFpbmVyIixCVVRUT05fQ0lSQ0xFOiJidXR0b25jaXJjbGUiLEVYUEFORF9CVVRUT046ImV4cGFuZGJ1dHRvbiIsQ09MTEFQU0VfQlVUVE9OOiJjb2xsYXBzZWJ1dHRvbiJ9LEVkZ2U6e0NPTlRBSU5FUjoiZWRnZXMiLEdST1VQOiJlZGdlIixMSU5FOiJlZGdlbGluZSIsUkVGRVJFTkNFX0VER0U6InJlZmVyZW5jZWVkZ2UiLApSRUZfTElORToicmVmbGluZSIsU0VMRUNUQUJMRToic2VsZWN0YWJsZWVkZ2UiLFNFTEVDVEVEOiJzZWxlY3RlZGVkZ2UiLFNUUlVDVFVSQUw6InN0cnVjdHVyYWwifSxBbm5vdGF0aW9uOntPVVRCT1g6Im91dC1hbm5vdGF0aW9ucyIsSU5CT1g6ImluLWFubm90YXRpb25zIixHUk9VUDoiYW5ub3RhdGlvbiIsTk9ERToiYW5ub3RhdGlvbi1ub2RlIixFREdFOiJhbm5vdGF0aW9uLWVkZ2UiLENPTlRST0xfRURHRToiYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UiLExBQkVMOiJhbm5vdGF0aW9uLWxhYmVsIixFTExJUFNJUzoiYW5ub3RhdGlvbi1lbGxpcHNpcyJ9LFNjZW5lOntHUk9VUDoic2NlbmUiLENPUkU6ImNvcmUiLEZVTkNUSU9OX0xJQlJBUlk6ImZ1bmN0aW9uLWxpYnJhcnkiLElORVhUUkFDVDoiaW4tZXh0cmFjdCIsT1VURVhUUkFDVDoib3V0LWV4dHJhY3QifSxTdWJzY2VuZTp7R1JPVVA6InN1YnNjZW5lIn0sT1BOT0RFOiJvcCIsTUVUQU5PREU6Im1ldGEiLFNFUklFU05PREU6InNlcmllcyIsCkJSSURHRU5PREU6ImJyaWRnZSIsRUxMSVBTSVNOT0RFOiJlbGxpcHNpcyJ9O2YuaGVhbHRoUGlsbEVudHJpZXM9W3tiYWNrZ3JvdW5kX2NvbG9yOiIjQ0MyRjJDIixsYWJlbDoiTmFOIn0se2JhY2tncm91bmRfY29sb3I6IiNGRjhEMDAiLGxhYmVsOiItXHUyMjFlIn0se2JhY2tncm91bmRfY29sb3I6IiNFQUVBRUEiLGxhYmVsOiItIn0se2JhY2tncm91bmRfY29sb3I6IiNBNUE1QTUiLGxhYmVsOiIwIn0se2JhY2tncm91bmRfY29sb3I6IiMyNjI2MjYiLGxhYmVsOiIrIn0se2JhY2tncm91bmRfY29sb3I6IiMwMDNFRDQiLGxhYmVsOiIrXHUyMjFlIn1dO2YuZml0PWZ1bmN0aW9uKHEsdSx3LEEpe3ZhciB5PXEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IHg9bnVsbDt0cnl7aWYoeD11LmdldEJCb3goKSwwPT09eC53aWR0aClyZXR1cm59Y2F0Y2goQyl7cmV0dXJufXU9ZC5sYXlvdXQuUEFSQU1TLmdyYXBoO3k9ZDMuem9vbUlkZW50aXR5LnNjYWxlKC45Kk1hdGgubWluKHkud2lkdGgvCngud2lkdGgseS5oZWlnaHQveC5oZWlnaHQsMikpLnRyYW5zbGF0ZSh1LnBhZGRpbmcucGFkZGluZ0xlZnQsdS5wYWRkaW5nLnBhZGRpbmdUb3ApO2QzLnNlbGVjdChxKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKHcudHJhbnNmb3JtLHkpLm9uKCJlbmQuZml0dGVkIiwoKT0+e3cub24oImVuZC5maXR0ZWQiLG51bGwpO0EoKX0pfTtmLnBhblRvTm9kZT1mdW5jdGlvbihxLHUsdyxBKXt3PWQzLnNlbGVjdCh1KS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7cX0iXWApLm5vZGUoKTtpZighdylyZXR1cm4gY29uc29sZS53YXJuKGBwYW5Ub05vZGUoKSBmYWlsZWQgZm9yIG5vZGUgbmFtZSAiJHtxfSJgKSwhMTt2YXIgeT13LmdldEJCb3goKSx4PXcuZ2V0U2NyZWVuQ1RNKCk7cT11LmNyZWF0ZVNWR1BvaW50KCk7dz11LmNyZWF0ZVNWR1BvaW50KCk7cS54PXkueDtxLnk9eS55O3cueD15LngreS53aWR0aDt3Lnk9eS55K3kuaGVpZ2h0O3E9cS5tYXRyaXhUcmFuc2Zvcm0oeCk7dz0Kdy5tYXRyaXhUcmFuc2Zvcm0oeCk7eD0oRyxELEIsSCk9PiEoRz5CJiZEPEgpO3k9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBDPXkudG9wK3kuaGVpZ2h0LTE1MDtyZXR1cm4geChxLngsdy54LHkubGVmdCx5LmxlZnQreS53aWR0aC0zMjApfHx4KHEueSx3LnkseS50b3AsQyk/KHg9eS5sZWZ0K3kud2lkdGgvMi0ocS54K3cueCkvMixxPXkudG9wK3kuaGVpZ2h0LzItKHEueSt3LnkpLzIsdz1kMy56b29tVHJhbnNmb3JtKHUpLGQzLnNlbGVjdCh1KS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKEEudHJhbnNsYXRlQnkseC93LmsscS93LmspLCEwKTohMX07Zi5zZWxlY3RPckNyZWF0ZUNoaWxkPWg7Zi5zZWxlY3RDaGlsZD1rO2YuYnVpbGRHcm91cD1mdW5jdGlvbihxLHUsdyxBKXtBPUF8fGYuQ2xhc3MuU2NlbmUuR1JPVVA7bGV0IHk9ayhxLCJnIixBKS5lbXB0eSgpO3E9aChxLCJnIixBKTtBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5DT1JFKTtsZXQgeD1fLnJlZHVjZSh1LmNvcmVHcmFwaC5ub2RlcygpLAooQyxHKT0+e0c9dS5jb3JlR3JhcGgubm9kZShHKTtHLmV4Y2x1ZGVkfHxDLnB1c2goRyk7cmV0dXJuIEN9LFtdKTt1Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZ4LnJldmVyc2UoKTtmLmVkZ2UuYnVpbGRHcm91cChBLHUuY29yZUdyYXBoLHcpO2Yubm9kZS5idWlsZEdyb3VwKEEseCx3KTswPHUuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPyhBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLGYubm9kZS5idWlsZEdyb3VwKEEsdS5pc29sYXRlZEluRXh0cmFjdCx3KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCkucmVtb3ZlKCk7MDx1Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLGYubm9kZS5idWlsZEdyb3VwKEEsdS5pc29sYXRlZE91dEV4dHJhY3QsdykpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5yZW1vdmUoKTswPHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPwooQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LHcpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkucmVtb3ZlKCk7cihxLHUpO3kmJnEuYXR0cigib3BhY2l0eSIsMCkudHJhbnNpdGlvbigpLmF0dHIoIm9wYWNpdHkiLDEpO3JldHVybiBxfTtmLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcj1mdW5jdGlvbihxLHUpe2QzLnNlbGVjdChxKS5vbigiY2xpY2siLCgpPT57dS5maXJlKCJncmFwaC1zZWxlY3QiKX0pfTtmLnRyYW5zbGF0ZT1sO2YucG9zaXRpb25SZWN0PWZ1bmN0aW9uKHEsdSx3LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigieCIsdS1BLzIpLmF0dHIoInkiLHcteS8yKS5hdHRyKCJ3aWR0aCIsQSkuYXR0cigiaGVpZ2h0Iix5KX07Zi5wb3NpdGlvblRyaWFuZ2xlPWZ1bmN0aW9uKHEsdSx3LEEseSl7eS89MjtBLz0yO3U9W1t1LHcteV0sW3UrQSwKdyt5XSxbdS1BLHcreV1dO3EudHJhbnNpdGlvbigpLmF0dHIoInBvaW50cyIsdS5tYXAoeD0+eC5qb2luKCIsIikpLmpvaW4oIiAiKSl9O2YucG9zaXRpb25CdXR0b249ZnVuY3Rpb24ocSx1KXtsZXQgdz1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHUpKyh1LmV4cGFuZGVkP3Uud2lkdGg6dS5jb3JlQm94LndpZHRoKS8yLTYsQT11LnktKHUuZXhwYW5kZWQ/dS5oZWlnaHQ6dS5jb3JlQm94LmhlaWdodCkvMis2O3Uubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5TRVJJRVN8fHUuZXhwYW5kZWR8fCh3Kz0xMCxBLT0yKTt1PSJ0cmFuc2xhdGUoIit3KyIsIitBKyIpIjtxLnNlbGVjdEFsbCgicGF0aCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLHUpO3Euc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkuYXR0cih7Y3g6dyxjeTpBLHI6ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEuZXhwYW5kQnV0dG9uUmFkaXVzfSl9O2YucG9zaXRpb25FbGxpcHNlPQpmdW5jdGlvbihxLHUsdyxBLHkpe3EudHJhbnNpdGlvbigpLmF0dHIoImN4Iix1KS5hdHRyKCJjeSIsdykuYXR0cigicngiLEEvMikuYXR0cigicnkiLHkvMil9O2YuaHVtYW5pemVIZWFsdGhQaWxsU3RhdD1wO2YuYWRkSGVhbHRoUGlsbD1uO2YuYWRkSGVhbHRoUGlsbHM9ZnVuY3Rpb24ocSx1LHcpe2lmKHUpe3ZhciBBPTE7ZDMuc2VsZWN0KHEpLnNlbGVjdEFsbCgiZy5ub2Rlc2hhcGUiKS5lYWNoKGZ1bmN0aW9uKHkpe2NvbnN0IHg9dVt5Lm5vZGUubmFtZV07bih0aGlzLHg/eFt3XTpudWxsLHksQSsrKX0pfX19KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdGVtcGxhdGUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChuKXtsZXQgcT1fLm1hcCh7ZGVwdGg6bi5kZXB0aCwifFZ8IjpuLm1ldGFncmFwaC5ub2RlcygpLmxlbmd0aCwifEV8IjpuLm1ldGFncmFwaC5lZGdlcygpLmxlbmd0aH0sZnVuY3Rpb24odSx3KXtyZXR1cm4gdysiXHgzZCIrdX0pLmpvaW4oIiAiKTtuPV8ubWFwKG4ub3BIaXN0b2dyYW0sZnVuY3Rpb24odSx3KXtyZXR1cm4gdysiXHgzZCIrdX0pLmpvaW4oIiwiKTtyZXR1cm4gcSsiIFtvcHNdICIrbn1mdW5jdGlvbiBrKG4pe2NvbnN0IHE9bi5nZXROb2RlTWFwKCk7bGV0IHU9T2JqZWN0LmtleXMocSkucmVkdWNlKCh3LEEpPT57Y29uc3QgeT1xW0FdO2lmKHkudHlwZSE9PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gdztBPUEuc3BsaXQoIi8iKS5sZW5ndGgtMTtsZXQgeD1oKHkpLEM9d1t4XXx8e25vZGVzOltdLGxldmVsOkF9O3dbeF09QztDLm5vZGVzLnB1c2goeSk7Qy5sZXZlbD5BJiYoQy5sZXZlbD0KQSk7cmV0dXJuIHd9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXModSkubWFwKHc9Plt3LHVbd11dKS5maWx0ZXIoKFssd10pPT57dz13Lm5vZGVzO2lmKDE8dy5sZW5ndGgpcmV0dXJuITA7dz13WzBdO3JldHVybiB3LnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJncuYXNzb2NpYXRlZEZ1bmN0aW9ufSkuc29ydCgoWyx3XSk9Pncubm9kZXNbMF0uZGVwdGgpfWZ1bmN0aW9uIHIobixxKXtyZXR1cm4gXy5yZWR1Y2UobixmdW5jdGlvbih1LHcpe2xldCBBPXdbMF0seT1bXTt3WzFdLm5vZGVzLmZvckVhY2goZnVuY3Rpb24oeCl7Zm9yKGxldCBDPTA7Qzx5Lmxlbmd0aDtDKyspaWYoIXF8fHAoeVtDXS5tZXRhbm9kZS5tZXRhZ3JhcGgseC5tZXRhZ3JhcGgpKXt4LnRlbXBsYXRlSWQ9eVtDXS5tZXRhbm9kZS50ZW1wbGF0ZUlkO3lbQ10ubWVtYmVycy5wdXNoKHgubmFtZSk7cmV0dXJufXgudGVtcGxhdGVJZD1BKyJbIit5Lmxlbmd0aCsiXSI7eS5wdXNoKHttZXRhbm9kZTp4LG1lbWJlcnM6W3gubmFtZV19KX0pOwp5LmZvckVhY2goZnVuY3Rpb24oeCl7dVt4Lm1ldGFub2RlLnRlbXBsYXRlSWRdPXtsZXZlbDp3WzFdLmxldmVsLG5vZGVzOngubWVtYmVyc319KTtyZXR1cm4gdX0se30pfWZ1bmN0aW9uIGwobixxLHUpe3JldHVybiBfLnNvcnRCeShuLFt3PT5xLm5vZGUodykub3Asdz0+cS5ub2RlKHcpLnRlbXBsYXRlSWQsdz0+cS5uZWlnaGJvcnModykubGVuZ3RoLHc9PnEucHJlZGVjZXNzb3JzKHcpLmxlbmd0aCx3PT5xLnN1Y2Nlc3NvcnModykubGVuZ3RoLHc9Pncuc3Vic3RyKHUubGVuZ3RoKV0pfWZ1bmN0aW9uIHAobixxKXtmdW5jdGlvbiB1KEgsSyl7bGV0IEw9SC5zdWJzdHIody5sZW5ndGgpLEo9Sy5zdWJzdHIoQS5sZW5ndGgpO2lmKHlbTF1eeFtKXSlyZXR1cm4gY29uc29sZS53YXJuKCJkaWZmZXJlbnQgdmlzaXQgcGF0dGVybiIsIlsiK3crIl0iLEwsIlsiK0ErIl0iLEopLCEwO3lbTF18fCh5W0xdPXhbSl09ITAsQy5wdXNoKHtuMTpILG4yOkt9KSk7cmV0dXJuITF9aWYoIWIuZ3JhcGguaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlKG4sCnEpKXJldHVybiExO2xldCB3PW4uZ3JhcGgoKS5uYW1lLEE9cS5ncmFwaCgpLm5hbWUseT17fSx4PXt9LEM9W107dmFyIEc9bi5zb3VyY2VzKCksRD1xLnNvdXJjZXMoKTtpZihHLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiZGlmZmVyZW50IHNvdXJjZSBsZW5ndGgiKSwhMTtHPWwoRyxuLHcpO0Q9bChELHEsQSk7Zm9yKHZhciBCPTA7QjxHLmxlbmd0aDtCKyspaWYodShHW0JdLERbQl0pKXJldHVybiExO2Zvcig7MDxDLmxlbmd0aDspe0Q9Qy5wb3AoKTtpZighbShuLm5vZGUoRC5uMSkscS5ub2RlKEQubjIpKSlyZXR1cm4hMTtHPW4uc3VjY2Vzc29ycyhELm4xKTtEPXEuc3VjY2Vzc29ycyhELm4yKTtpZihHLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixHLEQpLCExO0c9bChHLG4sdyk7RD1sKEQscSxBKTtmb3IoQj0wO0I8Ry5sZW5ndGg7QisrKWlmKHUoR1tCXSxEW0JdKSlyZXR1cm4hMX1yZXR1cm4hMH0KZnVuY3Rpb24gbShuLHEpe2lmKG4udHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gbi50ZW1wbGF0ZUlkJiZxLnRlbXBsYXRlSWQmJm4udGVtcGxhdGVJZD09PXEudGVtcGxhdGVJZDtpZihuLnR5cGU9PT1kLk5vZGVUeXBlLk9QJiZxLnR5cGU9PT1kLk5vZGVUeXBlLk9QKXJldHVybiBuLm9wPT09cS5vcDtpZihuLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyYmcS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe2xldCB1PW4ubWV0YWdyYXBoLm5vZGVDb3VudCgpO3JldHVybiB1PT09cS5tZXRhZ3JhcGgubm9kZUNvdW50KCkmJigwPT09dXx8bi5tZXRhZ3JhcGgubm9kZShuLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcD09PXEubWV0YWdyYXBoLm5vZGUocS5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3ApfXJldHVybiExfWYuZGV0ZWN0PWZ1bmN0aW9uKG4scSl7bj1rKG4pO2xldCB1PXIobixxKTtyZXR1cm4gT2JqZWN0LmtleXModSkuc29ydCh3PT51W3ddLmxldmVsKS5yZWR1Y2UoKHcsCkEpPT57d1tBXT11W0FdO3JldHVybiB3fSx7fSl9fSkoZC50ZW1wbGF0ZXx8KGQudGVtcGxhdGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3V0aWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi50aW1lPWZ1bmN0aW9uKGgsayl7bGV0IHI9RGF0ZS5ub3coKTtrPWsoKTtjb25zb2xlLmxvZyhoLCI6IixEYXRlLm5vdygpLXIsIm1zIik7cmV0dXJuIGt9O2YuZ2V0VHJhY2tlcj1mdW5jdGlvbihoKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihrKXtoLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpoLnByb2dyZXNzLnZhbHVlLG1zZzprfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUrayxtc2c6aC5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oayxyKXtjb25zb2xlLmVycm9yKHIuc3RhY2spO2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmssZXJyb3I6ITB9KX19fTtmLmdldFN1YnRhc2tUcmFja2VyPWZ1bmN0aW9uKGgsayxyKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihsKXtoLnNldE1lc3NhZ2UocisKIjogIitsKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24obCl7aC51cGRhdGVQcm9ncmVzcyhsKmsvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24obCxwKXtoLnJlcG9ydEVycm9yKHIrIjogIitsLHApfX19O2YucnVuVGFzaz1mdW5jdGlvbihoLGspe2suc2V0TWVzc2FnZSgiUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIpO3RyeXtsZXQgcj1iLmdyYXBoLnV0aWwudGltZSgiUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsaCk7ay51cGRhdGVQcm9ncmVzcyg0MCk7cmV0dXJuIHJ9Y2F0Y2gocil7ay5yZXBvcnRFcnJvcigiRmFpbGVkIFJlYWRpbmcgbWV0YWRhdGEgcGJ0eHQiLHIpfX07Zi5ydW5Bc3luY1Rhc2s9ZnVuY3Rpb24oaCxrLHIsbCl7cmV0dXJuIG5ldyBQcm9taXNlKHA9PntsLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgbT1iLmdyYXBoLnV0aWwudGltZShoLHIpO2wudXBkYXRlUHJvZ3Jlc3Moayk7cChtKX1jYXRjaChtKXtsLnJlcG9ydEVycm9yKCJGYWlsZWQgIisKaCxtKX19LDIwKX0pfTtmLnJ1bkFzeW5jUHJvbWlzZVRhc2s9ZnVuY3Rpb24oaCxrLHIsbCl7cmV0dXJuIG5ldyBQcm9taXNlKChwLG0pPT57ZnVuY3Rpb24gbihxKXtsLnJlcG9ydEVycm9yKCJGYWlsZWQgIitoLHEpO20ocSl9bC5zZXRNZXNzYWdlKGgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7bGV0IHE9RGF0ZS5ub3coKTtyKCkudGhlbihmdW5jdGlvbih1KXtjb25zb2xlLmxvZyhoLCI6IixEYXRlLm5vdygpLXEsIm1zIik7bC51cGRhdGVQcm9ncmVzcyhrKTtwKHUpfSkuY2F0Y2gobil9Y2F0Y2gocSl7bihxKX19LDIwKX0pfTtmLmVzY2FwZVF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVwbGFjZSgvKFs6LlxbXF0sL1xcXChcKV0pL2csIlxcJDEiKX07Zi5NRU1PUllfVU5JVFM9W3tzeW1ib2w6IkIifSx7c3ltYm9sOiJLQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiTUIiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IkdCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJUQiIsCm51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlBCIixudW1Vbml0czoxMDI0fV07Zi5USU1FX1VOSVRTPVt7c3ltYm9sOiJcdTAwYjVzIn0se3N5bWJvbDoibXMiLG51bVVuaXRzOjFFM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07Zi5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGU9ZnVuY3Rpb24oaCxrLHI9MCl7cmV0dXJuIHIrMTxrLmxlbmd0aCYmaD49a1tyKzFdLm51bVVuaXRzP2IuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoaC9rW3IrMV0ubnVtVW5pdHMsayxyKzEpOk51bWJlcihoLnRvUHJlY2lzaW9uKDMpKSsiICIra1tyXS5zeW1ib2x9O2YuaGFzRGlzcGxheWFibGVOb2RlU3RhdHM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgmJigwPGgudG90YWxCeXRlc3x8MDxoLmdldFRvdGFsTWljcm9zKCl8fGgub3V0cHV0U2l6ZSk/CiEwOiExfTtmLnJlbW92ZUNvbW1vblByZWZpeD1mdW5jdGlvbihoKXtpZigyPmgubGVuZ3RoKXJldHVybiBoO2xldCBrPTAscj0wLGw9Xy5taW4oXy5tYXAoaCxwPT5wLmxlbmd0aCkpO2Zvcig7Oyl7aysrO2xldCBwPV8ubWFwKGgsbT0+bS5zdWJzdHJpbmcoMCxrKSk7aWYocC5ldmVyeSgobSxuKT0+MD09PW4/ITA6bT09PXBbbi0xXSkpe2lmKGs+PWwpcmV0dXJuIGg7cj1rfWVsc2UgYnJlYWt9cmV0dXJuIF8ubWFwKGgscD0+cC5zdWJzdHJpbmcocikpfTtmLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZT1mdW5jdGlvbihoKXtoPStuZXcgRGF0ZS0rbmV3IERhdGUoaC8xRTMpO3JldHVybiAzRTQ+aD8ianVzdCBub3ciOjZFND5oP01hdGguZmxvb3IoaC8xRTMpKyIgc2Vjb25kcyBhZ28iOjEyRTQ+aD8iYSBtaW51dGUgYWdvIjozNkU1Pmg/TWF0aC5mbG9vcihoLzZFNCkrIiBtaW51dGVzIGFnbyI6MT09TWF0aC5mbG9vcihoLzM2RTUpPyJhbiBob3VyIGFnbyI6ODY0RTU+aD9NYXRoLmZsb29yKGgvCjM2RTUpKyIgaG91cnMgYWdvIjoxNzI4RTU+aD8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKGgvODY0RTUpKyIgZGF5cyBhZ28ifX0pKGQudXRpbHx8KGQudXRpbD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbWluaW1hcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2NsYXNzIGZ7Y29uc3RydWN0b3IoaCxrLHIsbCxwLG0pe3RoaXMuc3ZnPWg7dGhpcy5sYWJlbFBhZGRpbmc9bTt0aGlzLnpvb21HPWs7dGhpcy5tYWluWm9vbT1yO3RoaXMubWF4V2FuZEg9cDtoPWQzLnNlbGVjdChsLnNoYWRvd1Jvb3QpO2xldCBuPWguc2VsZWN0KCJzdmciKSxxPW4uc2VsZWN0KCJyZWN0Iik7dGhpcy52aWV3cG9pbnRDb29yZD17eDowLHk6MH07az1kMy5kcmFnKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwoKT0+e3RoaXMudmlld3BvaW50Q29vcmQueD1kMy5ldmVudC54O3RoaXMudmlld3BvaW50Q29vcmQueT1kMy5ldmVudC55O3RoaXMudXBkYXRlVmlld3BvaW50KCl9KTtxLmRhdHVtKHRoaXMudmlld3BvaW50Q29vcmQpLmNhbGwoayk7bi5vbigiY2xpY2siLCgpPT57aWYoIWQzLmV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciB1PU51bWJlcihxLmF0dHIoIndpZHRoIikpLHc9TnVtYmVyKHEuYXR0cigiaGVpZ2h0IikpLApBPWQzLm1vdXNlKG4ubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9QVswXS11LzI7dGhpcy52aWV3cG9pbnRDb29yZC55PUFbMV0tdy8yO3RoaXMudXBkYXRlVmlld3BvaW50KCl9fSk7dGhpcy52aWV3cG9pbnQ9cS5ub2RlKCk7dGhpcy5taW5pbWFwU3ZnPW4ubm9kZSgpO3RoaXMubWluaW1hcD1sO3RoaXMuY2FudmFzPWguc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCk7dGhpcy5jYW52YXNCdWZmZXI9aC5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCk7dGhpcy5kb3dubG9hZENhbnZhcz1oLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpO2QzLnNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTt0aGlzLnVwZGF0ZSgpfXVwZGF0ZVZpZXdwb2ludCgpe2QzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCkuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpO2xldCBoPQotdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGs9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtkMy5zZWxlY3QodGhpcy5zdmcpLmNhbGwodGhpcy5tYWluWm9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnRyYW5zbGF0ZShoLGspLnNjYWxlKHRoaXMuc2NhbGVNYWluKSl9dXBkYXRlKCl7bGV0IGg9bnVsbDt0cnl7aWYoaD10aGlzLnpvb21HLmdldEJCb3goKSwwPT09aC53aWR0aClyZXR1cm59Y2F0Y2godSl7cmV0dXJufXZhciBrPWQzLnNlbGVjdCgiI2dyYXBoZG93bmxvYWQiKTt0aGlzLmRvd25sb2FkPWsubm9kZSgpO2sub24oImNsaWNrIiwoKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodGhpcy5kb3dubG9hZC5ocmVmKTt2YXIgdT10aGlzLmRvd25sb2FkQ2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7Y29uc3Qgdz11LnNsaWNlKDAsdS5pbmRleE9mKCIsIikpO2lmKHcuZW5kc1dpdGgoIjtiYXNlNjQiKSl7dmFyIEE9CmF0b2IodS5zbGljZSh1LmluZGV4T2YoIiwiKSsxKSk7dT0obmV3IFVpbnQ4QXJyYXkoQS5sZW5ndGgpKS5tYXAoKHkseCk9PkEuY2hhckNvZGVBdCh4KSk7dGhpcy5kb3dubG9hZC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3VdLHt0eXBlOiJpbWFnZS9wbmcifSkpfWVsc2UgY29uc29sZS53YXJuKGBub24tYmFzZTY0IGRhdGEgVVJMICgke3d9KTsgY2Fubm90IHVzZSBibG9iIGRvd25sb2FkYCksdGhpcy5kb3dubG9hZC5ocmVmPXV9KTtrPWQzLnNlbGVjdCh0aGlzLnN2Zyk7dmFyIHI9IiIsbD10aGlzLnN2ZztsPShsLmdldFJvb3ROb2RlP2wuZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IodmFyIHA9MDtwPGwubGVuZ3RoO3ArKyl0cnl7dmFyIG09bFtwXS5jc3NSdWxlc3x8bFtwXS5ydWxlcztpZihudWxsIT1tKWZvcihsZXQgdT0wO3U8bS5sZW5ndGg7dSsrKXIrPW1bdV0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csCiIiKSsiXG4ifWNhdGNoKHUpe2lmKCJTZWN1cml0eUVycm9yIiE9PXUubmFtZSl0aHJvdyB1O31tPWsuYXBwZW5kKCJzdHlsZSIpO20udGV4dChyKTtyPWQzLnNlbGVjdCh0aGlzLnpvb21HKTtsPXIuYXR0cigidHJhbnNmb3JtIik7ci5hdHRyKCJ0cmFuc2Zvcm0iLG51bGwpO2guaGVpZ2h0Kz1oLnk7aC53aWR0aCs9aC54O2guaGVpZ2h0Kz0yKnRoaXMubGFiZWxQYWRkaW5nO2gud2lkdGgrPTIqdGhpcy5sYWJlbFBhZGRpbmc7ay5hdHRyKCJ3aWR0aCIsaC53aWR0aCkuYXR0cigiaGVpZ2h0IixoLmhlaWdodCk7dGhpcy5zY2FsZU1pbmltYXA9dGhpcy5tYXhXYW5kSC9NYXRoLm1heChoLndpZHRoLGguaGVpZ2h0KTt0aGlzLm1pbmltYXBTaXplPXt3aWR0aDpoLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwLGhlaWdodDpoLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcH07ZDMuc2VsZWN0KHRoaXMubWluaW1hcFN2ZykuYXR0cih0aGlzLm1pbmltYXBTaXplKTtkMy5zZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7CnA9ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpO3Auc3R5bGUoIndpZHRoIixoLndpZHRoKTtwLnN0eWxlKCJoZWlnaHQiLGguaGVpZ2h0KTtwLmF0dHIoIndpZHRoIiwzKmgud2lkdGgpO3AuYXR0cigiaGVpZ2h0IiwzKmguaGVpZ2h0KTtudWxsIT10aGlzLnRyYW5zbGF0ZSYmbnVsbCE9dGhpcy56b29tJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMuem9vbSgpKTtsZXQgbj0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTttLnJlbW92ZSgpO2suYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCk7ci5hdHRyKCJ0cmFuc2Zvcm0iLGwpO2xldCBxPW5ldyBJbWFnZTtxLm9ubG9hZD0oKT0+e3ZhciB1PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dS5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCwKdGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuc3R5bGUoImRpc3BsYXkiLG51bGwpO2QzLnNlbGVjdCh0aGlzLmNhbnZhcykuc3R5bGUoImRpc3BsYXkiLCJub25lIik7W3RoaXMuY2FudmFzLHRoaXMuY2FudmFzQnVmZmVyXT1bdGhpcy5jYW52YXNCdWZmZXIsdGhpcy5jYW52YXNdfSk7dT10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7dS5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpO3UuZHJhd0ltYWdlKHEsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfTtxLm9uZXJyb3I9KCk9PntxLnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuXSx7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKX07cS5zcmM9CiJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldFx4M2R1dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChuKX16b29tKGgpe2lmKG51bGwhPXRoaXMuc2NhbGVNaW5pbWFwKXtoJiYodGhpcy50cmFuc2xhdGU9W2gueCxoLnldLHRoaXMuc2NhbGVNYWluPWguayk7dmFyIGs9dGhpcy5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1kMy5zZWxlY3QodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47dGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtoPWsud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47az1rLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtyLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KS5hdHRyKCJ3aWR0aCIsCmgpLmF0dHIoImhlaWdodCIsayk7cj10aGlzLm1pbmltYXBTaXplLndpZHRoO3ZhciBsPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LHA9dGhpcy52aWV3cG9pbnRDb29yZC54LG09dGhpcy52aWV3cG9pbnRDb29yZC55Oy44PihNYXRoLm1pbihNYXRoLm1heCgwLHAraCksciktTWF0aC5taW4oTWF0aC5tYXgoMCxwKSxyKSkqKE1hdGgubWluKE1hdGgubWF4KDAsbStrKSxsKS1NYXRoLm1pbihNYXRoLm1heCgwLG0pLGwpKS8ocipsKT90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX19ZC5NaW5pbWFwPWZ9KShiLnNjZW5lfHwoYi5zY2VuZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxzZWxlY3RlZERhdGE6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0SGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfbG9hZERhdGEoZGF0YXNldHMsIHNlbGVjdGVkRGF0YSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsCiJfbG9hZEZpbGUoc2VsZWN0ZWRGaWxlLCBvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX2xvYWREYXRhKCl7dGhpcy5kZWJvdW5jZSgibG9hZCIsKCk9Pntjb25zdCBmPXRoaXMuZGF0YXNldHNbdGhpcy5zZWxlY3RlZERhdGFdO2YmJnRoaXMuX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZi5wYXRoKX0pfSxfcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmLGgpe2NvbnN0IGs9dGhpcy5vdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLHI9dGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI7dGhpcy5wcm9ncmVzcz17dmFsdWU6MCxtc2c6IiJ9O2NvbnN0IGw9Yi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykscD1PYmplY3QuYXNzaWduKHt9LGIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMsayk7Yi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChsLApmLGgscixwKS50aGVuKCh7Z3JhcGg6bSxncmFwaEhpZXJhcmNoeTpufSk9Pnt0aGlzLl9zZXRPdXRIaWVyYXJjaHlQYXJhbXMocCk7dGhpcy5fc2V0T3V0R3JhcGgobSk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkobil9KX0sX2xvYWRGaWxlKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL2hlYWx0aC1waWxscy5qcwp2YXIgS2g7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGsscil7aWYobnVsbD09ayl0aHJvdyBFcnJvcihgTWlzc2luZyByZWZWYWx1ZSBmb3IgY29uZGl0aW9uICgke3J9KS5gKTt9ZnVuY3Rpb24gZihrKXtyZXR1cm4gbnVsbD09a3x8MD09ay5sZW5ndGh8fDEhPT1rWzBdfWNvbnN0IGg9e0lORl9PUl9OQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUgb3IgTmFOIixwcmVkaWNhdGU6az0+MDxrWzJdfHwwPGtbM118fDA8a1s3XX0sSU5GOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIixwcmVkaWNhdGU6az0+MDxrWzNdfHwwPGtbN119LE5BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zIE5hTiIscHJlZGljYXRlOms9PjA8a1syXX0sTUFYX0dUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2UiLHByZWRpY2F0ZTooayxyKT0+e2QociwiTUFYX0dUIik7cmV0dXJuIGtbOV0+cn19LE1BWF9MVDp7ZGVzY3JpcHRpb246Ik1heCBceDNjIixwcmVkaWNhdGU6KGsscik9PntkKHIsIk1BWF9MVCIpOwpyZXR1cm4ga1s5XTxyfX0sTUlOX0dUOntkZXNjcmlwdGlvbjoiTWluIFx4M2UiLHByZWRpY2F0ZTooayxyKT0+e2QociwiTUlOX0dUIik7cmV0dXJuIGtbOF0+cn19LE1JTl9MVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNjIixwcmVkaWNhdGU6KGsscik9PntkKHIsIk1JTl9MVCIpO3JldHVybiBrWzhdPHJ9fSxNRUFOX0dUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNlIixwcmVkaWNhdGU6KGsscik9PntkKHIsIk1FQU5fR1QiKTtyZXR1cm4ga1sxMF0+cn19LE1FQU5fTFQ6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2MiLHByZWRpY2F0ZTooayxyKT0+e2QociwiTUVBTl9MVCIpO3JldHVybiBrWzEwXTxyfX0sUkFOR0VfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzZSIscHJlZGljYXRlOihrLHIpPT57ZChyLCJSQU5HRV9HVCIpO3JldHVybiBrWzldLWtbOF0+cn19LFJBTkdFX0xUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2MiLHByZWRpY2F0ZTooayxyKT0+e2QociwiUkFOR0VfTFQiKTsKcmV0dXJuIGtbOV0ta1s4XTxyfX0sU1REREVWX0dUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2UiLHByZWRpY2F0ZTooayxyKT0+e2QociwiU1REREVWX0dUIik7cmV0dXJuIE1hdGguc3FydChrWzExXSk+cn19LFNURERFVl9MVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNjIixwcmVkaWNhdGU6KGsscik9PntkKHIsIlNURERFVl9MVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPHJ9fX07Yi50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXk9ZnVuY3Rpb24oayl7Zm9yKGNvbnN0IHIgaW4gaClpZihoLmhhc093blByb3BlcnR5KHIpJiZoW3JdLmRlc2NyaXB0aW9uPT09aylyZXR1cm4gcjtyZXR1cm4gbnVsbH07Yi5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5PWZ1bmN0aW9uKGsscixsKXtpZihmKHIpKXJldHVybiExO2s9aFtrXS5wcmVkaWNhdGU7cmV0dXJuIGsocixsKX19KShLaHx8KEtoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGVuc29yLXdpZGdldC90ZW5zb3Jfd2lkZ2V0X2JpbmFyeS5qcwpmdW5jdGlvbiBMaChiKXtyZXR1cm4gbnVsbCE9PWIubWF0Y2goL15pbnRbMC05XSskLyl8fG51bGwhPT1iLm1hdGNoKC9edWludFswLTldKyQvKX1mdW5jdGlvbiBNaChiKXtyZXR1cm4gbnVsbCE9PWIubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PWIubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gWWkoYil7cmV0dXJuImJvb2wiPT09Yi50b0xvd2VyQ2FzZSgpfHwiYm9vbGVhbiI9PT1iLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gWmkoYil7cmV0dXJuInN0ciI9PT1iLnRvTG93ZXJDYXNlKCl8fCJzdHJpbmciPT09Yi50b0xvd2VyQ2FzZSgpfQpjbGFzcyAkaXtjb25zdHJ1Y3RvcihiKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yi5hcHBlbmRDaGlsZCh0aGlzLmRyb3Bkb3duKX1zaG93KGIsZCxmKXtmLmZvckVhY2goaz0+e2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0iKTtyLnRleHRDb250ZW50PWsuY2FwdGlvbjt0aGlzLmRyb3Bkb3duLmFwcGVuZENoaWxkKHIpO2suZGlzYWJsZWQ/ci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tZGlzYWJsZWQiKToKKHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGw9PntsLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09ay5vbkNsaWNrKWsub25DbGljayhsKTt0aGlzLmhpZGUoKX0pLHIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsbD0+e2lmKG51bGwhPT1rLm9uSG92ZXIpay5vbkhvdmVyKGwpO3IuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpfSksci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoKT0+e3IuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO2lmKG51bGwhPT1rLm9uSG92ZXIpe3ZhciBsPVtdO2ZvcihsZXQgcD0wO3A8ci5jaGlsZHJlbi5sZW5ndGg7KytwKXtjb25zdCBtPXIuY2hpbGRyZW5bcF07bS5jbGFzc0xpc3QuY29udGFpbnMoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIikmJmwucHVzaChtKX1sLmZvckVhY2gocD0+CnIucmVtb3ZlQ2hpbGQocCkpfX0pKX0pO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0iYmxvY2siO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPWIrInB4Ijt0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQ9ZCsicHgiO2Y9dGhpcy5kcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBoPWYubGVmdC1kO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPShiLShmLnRvcC1iKSkudG9GaXhlZCgxKSsicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0oZC1oKS50b0ZpeGVkKDEpKyJweCI7dGhpcy5pc1Nob3duPSEwO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj0oKT0+e3RoaXMuaGlkZSgpfTtzZXRUaW1lb3V0KCgpPT53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmx1ckhpZGVGdW5jdGlvbiksNTApfWhpZGUoKXtmb3IodGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmRyb3Bkb3duLmZpcnN0Q2hpbGQ7KXRoaXMuZHJvcGRvd24ucmVtb3ZlQ2hpbGQodGhpcy5kcm9wZG93bi5maXJzdENoaWxkKTsKdGhpcy5pc1Nob3duPSExO251bGwhPXRoaXMuYmx1ckhpZGVGdW5jdGlvbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJsdXJIaWRlRnVuY3Rpb24pfXNob3duKCl7cmV0dXJuIHRoaXMuaXNTaG93bn19CmNsYXNzIGFqe2NvbnN0cnVjdG9yKGIsZCl7dGhpcy5jb25maWc9Yjt0aGlzLnBhcmVudEVsZW1lbnQ9ZDt0aGlzLmJhc2VGbGF0TWVudT1uZXcgJGkodGhpcy5wYXJlbnRFbGVtZW50KTt0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zPXt9O3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goKGYsaCk9PntudWxsIT1mLm9wdGlvbnMmJih0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW2hdPWYuZGVmYXVsdFNlbGVjdGlvbil9KX1zaG93KGIsZCl7Y29uc3QgZj1bXTt0aGlzLmNvbmZpZy5pdGVtcy5mb3JFYWNoKChoLGspPT57Y29uc3Qgcj17Y2FwdGlvbjpoLmNhcHRpb24sb25DbGljazpudWxsLG9uSG92ZXI6bnVsbH07aWYobnVsbCE9aC5vcHRpb25zKXtjb25zdCBsPXRoaXMuY3VycmVudENob2ljZVNlbGVjdGlvbnNba107ci5vbkhvdmVyPXA9Pnt2YXIgbT1wLnRhcmdldDtjb25zdCBuPVtdO2gub3B0aW9ucy5mb3JFYWNoKChxLHUpPT57bi5wdXNoKHtjYXB0aW9uOnU9PT1sPwpxKyIgKFx1MjcxMykiOnEsb25DbGljazooKT0+e2whPT11JiYodGhpcy5jdXJyZW50Q2hvaWNlU2VsZWN0aW9uc1trXT11LGguY2FsbGJhY2sodSkpfSxvbkhvdmVyOm51bGx9KX0pO3A9bmV3ICRpKG0pO209bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtwLnNob3cobS50b3AsbS5yaWdodCxuKX19ZWxzZSByLm9uQ2xpY2s9aC5jYWxsYmFjaztudWxsPT1oLmlzRW5hYmxlZHx8aC5pc0VuYWJsZWQoKXx8KHIuZGlzYWJsZWQ9ITApO2YucHVzaChyKX0pO3RoaXMuYmFzZUZsYXRNZW51LnNob3coYixkLGYpfWhpZGUoKXt0aGlzLmJhc2VGbGF0TWVudS5oaWRlKCl9c2hvd24oKXtyZXR1cm4gdGhpcy5iYXNlRmxhdE1lbnUuc2hvd24oKX19ZnVuY3Rpb24gYmooYil7bGV0IGQ9MTtiLmZvckVhY2goZj0+e2QqPWZ9KTtyZXR1cm4gZH1mdW5jdGlvbiBjaihiKXtyZXR1cm4gMD09PWIubGVuZ3RoPyJzY2FsYXIiOmBbJHtifV1gfQpmdW5jdGlvbiBkaihiKXtjb25zdCBkPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfTt2YXIgZj1iLmxlbmd0aDtpZigxPT09ZilkLnZpZXdpbmdEaW1zPVswXTtlbHNlIGlmKDE8Zil7aWYoMjxmKWZvcihsZXQgaD0wO2g8Zi0yOysraClkLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5wdXNoKHtkaW06aCxpbmRleDowPT09YltoXT9udWxsOjB9KTtmb3IoZj1iLmxlbmd0aC0yO2Y8Yi5sZW5ndGg7KytmKWQudmlld2luZ0RpbXMucHVzaChmKX1yZXR1cm4gZH0KZnVuY3Rpb24gZWooYixkKXtpZihiLnZpZXdpbmdEaW1zWzBdIT09ZC52aWV3aW5nRGltc1swXXx8Yi52aWV3aW5nRGltc1sxXSE9PWQudmlld2luZ0RpbXNbMV0pcmV0dXJuITE7ZD1iLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZj0+Zi5kaW0pO2Quc29ydCgpO2I9Yi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGY9PmYuZGltKTtiLnNvcnQoKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZCk9PT1KU09OLnN0cmluZ2lmeShiKX12YXIgZmo7KGZ1bmN0aW9uKGIpe2JbYi5VUD0xXT0iVVAiO2JbYi5ET1dOPTJdPSJET1dOIjtiW2IuTEVGVD0zXT0iTEVGVCI7YltiLlJJR0hUPTRdPSJSSUdIVCJ9KShmanx8KGZqPXt9KSk7CmNsYXNzIGdqe2NvbnN0cnVjdG9yKGIsZCxmLGgsayxyKXt0aGlzLnNoYXBlPWI7dGhpcy5zbGljZURpbXM9W107dGhpcy5zbGljZUluZGljZXM9W107aWYoMD09PWJqKHRoaXMuc2hhcGUpKXRocm93IEVycm9yKCJUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0ZW5zb3Igd2l0aCB6ZXJvIGVsZW1lbnRzLiIpO2ZvcihiPTA7YjxkLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5sZW5ndGg7KytiKXt0aGlzLnNsaWNlRGltcy5wdXNoKGQuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW2JdLmRpbSk7Y29uc3QgbD1kLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tiXS5pbmRleDtpZihudWxsPT09bCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGR1ZSB0byAiK2B1bmRldGVybWluZWQgc2xpY2luZyBpbmRleCBhdCBkaW1lbnNpb24gJHtifWApO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2gobCl9dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoOwppZigwPHRoaXMucmFuayYmdGhpcy5zbGljZURpbXMubGVuZ3RoPj10aGlzLnJhbmspdGhyb3cgRXJyb3IoYEV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICR7dGhpcy5yYW5rfSwgYCtgYnV0IGdvdCBsZW5ndGggJHt0aGlzLnNsaWNlRGltcy5sZW5ndGh9YCk7dGhpcy52aWV3RGltcz1bXTtmb3IoZD0wO2Q8dGhpcy5yYW5rOysrZCktMT09PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoZCkmJnRoaXMudmlld0RpbXMucHVzaChkKTtpZigyPHRoaXMudmlld0RpbXMubGVuZ3RoKXRocm93IEVycm9yKCJPbmx5IHNlbGVjdGlvbnMgaW4gMUQgYW5kIDJEIGFyZSBzdXBwb3J0ZWQuIik7dGhpcy5yb3dTdGFydD1udWxsPT1mPzA6Zjt0aGlzLmNvbFN0YXJ0PW51bGw9PWg/MDpoO3RoaXMucm93Q291bnQ9bnVsbD09az8xOms7dGhpcy5jb2xDb3VudD1udWxsPT1yPzE6cn1nZXRFbGVtZW50U3RhdHVzKGIpe2lmKGIubGVuZ3RoIT09dGhpcy5yYW5rKXRocm93IEVycm9yKGBFeHBlY3RlZCBpbmRpY2VzIHRvIGhhdmUgYSByYW5rIG9mICR7dGhpcy5yYW5rfSwgYCsKYGJ1dCBnb3QgJHtiLmxlbmd0aH0gKFske2J9XSlgKTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoOysrZClpZigtMSE9PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoZCkmJmJbZF0hPT10aGlzLnNsaWNlSW5kaWNlc1t0aGlzLnNsaWNlRGltcy5pbmRleE9mKGQpXSlyZXR1cm4gbnVsbDtkPW51bGw7Y29uc3QgZj10aGlzLnJvd1N0YXJ0K3RoaXMucm93Q291bnQ7dmFyIGg9dGhpcy5jb2xTdGFydCt0aGlzLmNvbENvdW50O2lmKDA9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCkwPT09Yi5sZW5ndGgmJihkPXt0b3BFZGdlOiEwLGJvdHRvbUVkZ2U6ITAsbGVmdEVkZ2U6ITAscmlnaHRFZGdlOiEwfSk7ZWxzZSBpZigxPT09dGhpcy52aWV3RGltcy5sZW5ndGgpaD10aGlzLnZpZXdEaW1zWzBdLGJbaF0+PXRoaXMucm93U3RhcnQmJmJbaF08ZiYmKGQ9e3RvcEVkZ2U6YltoXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpiW2hdPT09Zi0xLGxlZnRFZGdlOiEwLHJpZ2h0RWRnZTohMH0pO2Vsc2UgaWYoMj09PQp0aGlzLnZpZXdEaW1zLmxlbmd0aCl7Y29uc3Qgaz10aGlzLnZpZXdEaW1zWzBdLHI9dGhpcy52aWV3RGltc1sxXTtiW2tdPj10aGlzLnJvd1N0YXJ0JiZiW2tdPGYmJmJbcl0+PXRoaXMuY29sU3RhcnQmJmJbcl08aCYmKGQ9e3RvcEVkZ2U6YltrXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpiW2tdPT09Zi0xLGxlZnRFZGdlOmJbcl09PT10aGlzLmNvbFN0YXJ0LHJpZ2h0RWRnZTpiW3JdPT09aC0xfSl9ZWxzZSB0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBsZW5ndGggb2Ygdmlld0RpbXM6ICR7dGhpcy52aWV3RGltc31gKTtyZXR1cm4gZH1tb3ZlKGIsZCl7bGV0IGY9bnVsbDtpZigwPT09dGhpcy5yYW5rfHwxPT09dGhpcy5yYW5rJiYoYj09PWZqLkxFRlR8fGI9PT1mai5SSUdIVCkpcmV0dXJuIG51bGw7aWYobnVsbD09PWQudmVydGljYWxSYW5nZXx8bnVsbD09PWQudmVydGljYWxSYW5nZVsxXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIG1vdmUgZHVlIHRvIHVuZGV0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKYj09PWZqLlVQPzA8dGhpcy5yb3dTdGFydCYmKHRoaXMucm93U3RhcnQtLSxudWxsIT1kLnZlcnRpY2FsUmFuZ2UmJnRoaXMucm93U3RhcnQ8ZC52ZXJ0aWNhbFJhbmdlWzBdJiYoZj1mai5VUCkpOmI9PT1mai5ET1dOP251bGwhPWQudmlld2luZ0RpbXMmJm51bGwhPWQudmlld2luZ0RpbXNbMF0mJnRoaXMucm93U3RhcnQ8dGhpcy5zaGFwZVtkLnZpZXdpbmdEaW1zWzBdXS0xJiYodGhpcy5yb3dTdGFydCsrLG51bGwhPWQudmVydGljYWxSYW5nZSYmdGhpcy5yb3dTdGFydD49ZC52ZXJ0aWNhbFJhbmdlWzFdJiYoZj1mai5ET1dOKSk6Yj09PWZqLkxFRlQ/MDx0aGlzLmNvbFN0YXJ0JiYodGhpcy5jb2xTdGFydC0tLG51bGwhPWQuaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0PGQuaG9yaXpvbnRhbFJhbmdlWzBdJiYoZj1mai5MRUZUKSk6Yj09PWZqLlJJR0hUJiZudWxsIT1kLnZpZXdpbmdEaW1zJiZudWxsIT1kLnZpZXdpbmdEaW1zWzFdJiZ0aGlzLmNvbFN0YXJ0PHRoaXMuc2hhcGVbZC52aWV3aW5nRGltc1sxXV0tCjEmJih0aGlzLmNvbFN0YXJ0KyssbnVsbCE9ZC5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ+PWQuaG9yaXpvbnRhbFJhbmdlWzFdJiYoZj1mai5SSUdIVCkpO3RoaXMuY29sQ291bnQ9dGhpcy5yb3dDb3VudD0xO3JldHVybiBmfWdldFJvd1N0YXJ0KCl7cmV0dXJuIHRoaXMucm93U3RhcnR9Z2V0Um93Q291bnQoKXtyZXR1cm4gdGhpcy5yb3dDb3VudH1nZXRDb2xTdGFydCgpe3JldHVybiB0aGlzLmNvbFN0YXJ0fWdldENvbENvdW50KCl7cmV0dXJuIHRoaXMuY29sQ291bnR9fQpjbGFzcyBoantjb25zdHJ1Y3RvcihiLGQsZj0oKT0+e30pe3RoaXMucm9vdERpdj1iO3RoaXMuc2hhcGU9ZDt0aGlzLm9uU2xpY2luZ1NwZWNDaGFuZ2U9Zjt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuYnJhY2tldERpdnM9W251bGwsbnVsbF07dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDM+dGhpcy5yYW5rKXRocm93IEVycm9yKCJEaW1lbnNpb24gY29udHJvbCBpcyBub3QgYXBwbGljYWJsZSB0byB0ZW5zb3Igc2hhcGVzIGxlc3MgdGhhbiAiK2AzRDogcmVjZWl2ZWQgJHt0aGlzLnJhbmt9RCB0ZW5zb3Igc2hhcGU6IGArYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zaGFwZSl9LmApO3RoaXMuY3JlYXRlQ29tcG9uZW50cygpO3RoaXMuc2xpY2luZ1NwZWM9ZGooZCl9Y3JlYXRlQ29tcG9uZW50cygpe2Zvcig7dGhpcy5yb290RGl2LmZpcnN0Q2hpbGQ7KXRoaXMucm9vdERpdi5yZW1vdmVDaGlsZCh0aGlzLnJvb3REaXYuZmlyc3RDaGlsZCk7CnRoaXMuZGltQ29udHJvbHM9W107dGhpcy5kaW1JbnB1dHM9W107dGhpcy5jb21tYXM9W107dGhpcy5kcm9wZG93bnM9W107dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5icmFja2V0RGl2c1swXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzBdLnRleHRDb250ZW50PSJTbGljaW5nOiBbIjt0aGlzLmJyYWNrZXREaXZzWzBdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMF0pO2ZvcihsZXQgZD0wO2Q8dGhpcy5yYW5rOysrZCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO2IudGl0bGU9YERpbWVuc2lvbiAke2R9OiBzaXplPSR7dGhpcy5zaGFwZVtkXX1gO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChiKTt0aGlzLmRpbUNvbnRyb2xzLnB1c2goYik7CnRoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkLnB1c2goITEpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoYik7dGhpcy5kaW1JbnB1dHMucHVzaChiKTtkPHRoaXMucmFuay0xJiYoYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWNvbW1hIiksYi50ZXh0Q29udGVudD0iLCIsdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKGIpLHRoaXMuY29tbWFzLnB1c2goYikpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKGIpO3RoaXMuZHJvcGRvd25zLnB1c2goYil9dGhpcy5icmFja2V0RGl2c1sxXT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1sxXS50ZXh0Q29udGVudD0iXSI7dGhpcy5icmFja2V0RGl2c1sxXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzFdKTt0aGlzLnJvb3REaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKCk9Pnt0aGlzLmNsZWFyQWxsRHJvcGRvd25zKCl9KX1yZW5kZXIoYil7bnVsbCE9YiYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7Y29uc3QgZD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZj0+Zi5kaW0pO2I9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGY9PgpmLmluZGV4KTtmb3IobGV0IGY9MDtmPHRoaXMucmFuazsrK2Ype2NvbnN0IGg9dGhpcy5kaW1Db250cm9sc1tmXSxrPXRoaXMuZGltSW5wdXRzW2ZdLHI9dGhpcy5kcm9wZG93bnNbZl07aWYoIm5vbmUiIT09ay5zdHlsZS5kaXNwbGF5KWNvbnRpbnVlO2NvbnN0IGw9dGhpcy5zaGFwZVtmXTtpZigtMSE9PWQuaW5kZXhPZihmKSl7Y29uc3QgcD1iW2QuaW5kZXhPZihmKV07aC50ZXh0Q29udGVudD1TdHJpbmcocCk7ay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO2sudHlwZT0ibnVtYmVyIjtrLm1pbj0iMCI7ay5tYXg9U3RyaW5nKGwtMSk7ay52YWx1ZT1TdHJpbmcocCk7dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbZl18fChoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2suc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLGsuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwKKCk9PntpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiU2xpY2luZyBjb250cm9sIGNoYW5nZSBjYWxsYmFjayBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc3BlYy4iKTtjb25zdCBtPXBhcnNlSW50KGsudmFsdWUsMTApOyFpc0Zpbml0ZShtKXx8MD5tfHxtPj1sfHxNYXRoLmZsb29yKGwpIT1sP2sudmFsdWU9U3RyaW5nKHRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW2QuaW5kZXhPZihmKV0uaW5kZXgpOih0aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tkLmluZGV4T2YoZildLmluZGV4PW0saC50ZXh0Q29udGVudD1TdHJpbmcobSksdGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlKHRoaXMuc2xpY2luZ1NwZWMpKX0pLGsuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsKCk9PntrLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2guc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLHRoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2ZdPQohMCl9ZWxzZXtpZih0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdPT09Zil7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtoLnRleHRDb250ZW50PWBcdTIxOTUgJHt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF19OmArYCR7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdfWB9ZWxzZXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTtoLnRleHRDb250ZW50PWBcdTIxOTQgJHt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXX06YCtgJHt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXX1gfWguY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTt0aGlzLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtmXXx8KGguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAooKT0+e2NvbnN0IHA9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKHIscC5ib3R0b20scC5sZWZ0LGYpfSksdGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbZl09ITApfX19cmVuZGVyRHJvcGRvd25NZW51SXRlbXMoYixkLGYsaCl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtjb25zdCBrPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChyPT5yLmRpbSk7Zm9yKGxldCByPTA7cjx0aGlzLnJhbms7KytyKXtpZigtMT09PWsuaW5kZXhPZihyKSljb250aW51ZTtpZihoPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSYmcjw9dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXXx8Cmg9PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0mJnI+PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pY29udGludWU7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2wudGV4dENvbnRlbnQ9YFN3YXAgd2l0aCBkaW1lbnNpb24gJHtyfWA7Yi5hcHBlbmRDaGlsZChsKTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT57bC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIik7dGhpcy5kaW1Db250cm9sc1tyXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoKT0+e2wuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpOwp0aGlzLmRpbUNvbnRyb2xzW3JdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTtjb25zdCBwPXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1oO2wuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIkRpbWVuc2lvbiBzd2FwcGluZyBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjIik7Y29uc3QgbT1rLmluZGV4T2Yocik7dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1twPzA6MV09cjt0aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1ttXT17ZGltOmgsaW5kZXg6MH07dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9bnVsbDtpZih0aGlzLm9uU2xpY2luZ1NwZWNDaGFuZ2UpdGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlKHRoaXMuc2xpY2luZ1NwZWMpfSl9Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwKKCk9PntiLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7aWYoYi5maXJzdENoaWxkKXtiLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Yi5zdHlsZS50b3A9YCR7ZH1weGA7Yi5zdHlsZS5sZWZ0PWAke2Z9cHhgO2Iuc3R5bGUuZGlzcGxheT0iYmxvY2siO2NvbnN0IHI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPXIubGVmdC1mO2Iuc3R5bGUudG9wPShkLShyLnRvcC1kKSkudG9GaXhlZCgxKSsicHgiO2Iuc3R5bGUubGVmdD0oZi1sKS50b0ZpeGVkKDEpKyJweCJ9fXNldFNsaWNpbmdTcGVjKGIpe3RoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiKSk7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIkNhbm5vdCBzZXQgc2xpY2luZyBzcGVjIHRvIG51bGwuIik7dGhpcy5yZW5kZXIodGhpcy5zbGljaW5nU3BlYyl9Y2xlYXJBbGxEcm9wZG93bnMoKXt0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGI9PntpZihudWxsIT1iKXtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpOwpiLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pfX1mdW5jdGlvbiBRayhiKXtyZXR1cm4gMjA+PWIubGVuZ3RoP2I6Yi5zbGljZSgwLDEwKSsiLi4uIitiLnNsaWNlKGIubGVuZ3RoLTcsYi5sZW5ndGgpfWZ1bmN0aW9uIFJrKGIsZCl7aWYoaXNOYU4oYikpcmV0dXJuIk5hTiI7aWYoLUluZmluaXR5PT09YilyZXR1cm4iLVx1MjIxZSI7aWYoSW5maW5pdHk9PT1iKXJldHVybiIrXHUyMjFlIjtpZihudWxsPT1mKXt2YXIgZj1NYXRoLmFicyhiKTtmPTFFMz5mJiYuMDE8PWZ8fDA9PT1mPyJmaXhlZCI6ImV4cG9uZW50aWFsIn1yZXR1cm4gbnVsbD09Znx8ImZpeGVkIj09PWY/ZD9gJHtifWA6Yi50b0ZpeGVkKDIpOmIudG9FeHBvbmVudGlhbCgyKX1mdW5jdGlvbiBTayhiLGQ9ITApe3JldHVybiBiP2Q/IlQiOiJUcnVlIjpkPyJGIjoiRmFsc2UifWZ1bmN0aW9uIFRrKGIsZD00KXtyZXR1cm4gbnVsbD09PWR8fGIubGVuZ3RoPD1kP2I6Yi5zbGljZSgwLGQtMSkrIlx1MjAyNiJ9CmNsYXNzIFVre2NvbnN0cnVjdG9yKGIpe3RoaXMuY29uZmlnPWI7aWYoIWlzRmluaXRlKGIubWluKSl0aHJvdyBFcnJvcihgbWluIHZhbHVlICgke2IubWlufSkgaXMgbm90IGZpbml0ZWApO2lmKCFpc0Zpbml0ZShiLm1heCkpdGhyb3cgRXJyb3IoYG1heCB2YWx1ZSAoJHtiLm1heH0pIGlzIG5vdCBmaW5pdGVgKTtpZihiLm1heDxiLm1pbil0aHJvdyBFcnJvcihgbWF4ICgke2IubWF4fSkgaXMgPCBtaW4gKCR7Yi5taW59KWApO31yZW5kZXIoYixkKXtpZih0aGlzLmNvbmZpZy5taW4hPT10aGlzLmNvbmZpZy5tYXgpe3ZhciBmPWIuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1mKXt2YXIgaD1iLndpZHRoLzEwMCxrPWIuaGVpZ2h0LHI9LjYqaztmb3IobGV0IGw9MDsxMDA+bDsrK2wpe2NvbnN0IHA9aCpsLG09LjIqayxbbixxLHVdPXRoaXMuZ2V0UkdCKGwvMTAwKih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKSt0aGlzLmNvbmZpZy5taW4pO2YuYmVnaW5QYXRoKCk7Zi5maWxsU3R5bGU9CmByZ2JhKCR7bn0sICR7cX0sICR7dX0sIDEpYDtmLmZpbGxSZWN0KHAsbSxoLHIpO2Yuc3Ryb2tlKCl9bnVsbCE9ZCYmZD49dGhpcy5jb25maWcubWluJiZkPD10aGlzLmNvbmZpZy5tYXgmJihiPShkLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pKmIud2lkdGgsZi5iZWdpblBhdGgoKSxmLmZpbGxTdHlsZT0icmdiYSgwLCAwLCAwLCAxKSIsZi5tb3ZlVG8oYiwuMiprKSxmLmxpbmVUbyhiLTQsMCksZi5saW5lVG8oYis0LDApLGYuZmlsbCgpLGYuYmVnaW5QYXRoKCksZi5tb3ZlVG8oYiwuOCprKSxmLmxpbmVUbyhiLTQsayksZi5saW5lVG8oYis0LGspLGYuZmlsbCgpKX19fX0KY2xhc3MgVmsgZXh0ZW5kcyBVa3tnZXRSR0IoYil7aWYoaXNOYU4oYikpcmV0dXJuWzI1NSwwLDBdO2lmKCFpc0Zpbml0ZShiKSlyZXR1cm4gMDxiP1swLDAsMjU1XTpbMjU1LDEyNy41LDBdO2I9dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihiLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pO2I9TWF0aC5tYXgoTWF0aC5taW4oYiwxKSwwKTtyZXR1cm5bMjU1KmIsMjU1KmIsMjU1KmJdfX0KY2xhc3MgV2sgZXh0ZW5kcyBVa3tnZXRSR0IoYil7aWYoaXNOYU4oYikpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoYikpcmV0dXJuIDA+Yj9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07bGV0IGQ9MCxmPTAsaD0wO2I9dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihiLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pO2I9TWF0aC5tYXgoTWF0aC5taW4oYiwxKSwwKTsuMzU+PWI/KGY9Yi8uMzUsaD0xKTouMzU8YiYmLjY1Pj1iPyhkPShiLS4zNSkvKC42NS0uMzUpLGY9MSxoPSguNjUtYikvKC42NS0uMzUpKTouNjU8YiYmKGQ9MSxmPSgxLWIpLy4zNSk7cmV0dXJuWzI1NSpkLDI1NSpmLDI1NSpoXX19CkpoPWZ1bmN0aW9uKGIsZCxmLGgpe2Z1bmN0aW9uIGsocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBmP3I6bmV3IGYoZnVuY3Rpb24obCl7bChyKX0pfXJldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihyLGwpe2Z1bmN0aW9uIHAocSl7dHJ5e24oaC5uZXh0KHEpKX1jYXRjaCh1KXtsKHUpfX1mdW5jdGlvbiBtKHEpe3RyeXtuKGhbInRocm93Il0ocSkpfWNhdGNoKHUpe2wodSl9fWZ1bmN0aW9uIG4ocSl7cS5kb25lP3IocS52YWx1ZSk6ayhxLnZhbHVlKS50aGVuKHAsbSl9bigoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9O3ZhciBYazsoZnVuY3Rpb24oYil7YltiLlRFWFQ9MV09IlRFWFQiO2JbYi5JTUFHRT0yXT0iSU1BR0UifSkoWGt8fChYaz17fSkpO2NvbnN0IFlrPXtHcmF5c2NhbGU6VmssSmV0OldrfTsKY2xhc3MgWmt7Y29uc3RydWN0b3IoYixkLGYpe3RoaXMucm9vdEVsZW1lbnQ9Yjt0aGlzLnRlbnNvclZpZXc9ZDt0aGlzLmJhc2VSdWxlclRpY2s9dGhpcy50b3BSdWxlcj10aGlzLnZhbHVlU2VjdGlvbj10aGlzLnNsaWNpbmdTcGVjUm9vdD10aGlzLm1lbnVUaHVtYj10aGlzLmluZm9TdWJzZWN0aW9uPXRoaXMuaGVhZGVyU2VjdGlvbj1udWxsO3RoaXMudG9wUnVsZXJUaWNrcz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdO3RoaXMudmFsdWVSb3dzPVtdO3RoaXMudmFsdWVEaXZzPVtdO3RoaXMuc2xpY2luZ0NvbnRyb2w9dGhpcy52YWx1ZVRvb2x0aXA9bnVsbDt0aGlzLmNvbHNDdXRvZmY9dGhpcy5yb3dzQ3V0b2ZmPSExO3RoaXMubWVudT10aGlzLm1lbnVDb25maWc9dGhpcy5zZWxlY3Rpb249bnVsbDt0aGlzLmNvbG9yTWFwTmFtZT0iR3JheXNjYWxlIjt0aGlzLmNvbG9yTWFwPW51bGw7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9ITE7dGhpcy5pbWFnZUNlbGxTaXplPTE2O3RoaXMubWluSW1hZ2VDZWxsU2l6ZT0KNDt0aGlzLm1heEltYWdlQ2VsbFNpemU9NDA7dGhpcy56b29tU3RlcFJhdGlvPTEuMjt0aGlzLm51bWVyaWNTdW1tYXJ5PW51bGw7dGhpcy5vcHRpb25zPWZ8fHt9O3RoaXMuc2xpY2luZ1NwZWM9ZGoodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO3RoaXMucmFuaz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZS5sZW5ndGg7dGhpcy52YWx1ZVJlbmRlck1vZGU9WGsuVEVYVH1yZW5kZXIoKXtyZXR1cm4gSmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3RoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShMaCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fE1oKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8WWkodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxaaSh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpKXRocm93IEVycm9yKGBSZW5kZXJpbmcgZHR5cGUgJHt0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZX0gaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7CnlpZWxkIHRoaXMucmVuZGVyVmFsdWVzKCl9KX1yZW5kZXJIZWFkZXIoKXtudWxsPT10aGlzLmhlYWRlclNlY3Rpb24mJih0aGlzLmhlYWRlclNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5oZWFkZXJTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtaGVhZGVyIiksdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMuY3JlYXRlTWVudSgpKTt0aGlzLnJlbmRlckluZm8oKX1yZW5kZXJJbmZvKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSwKdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9cmVuZGVyTmFtZSgpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgbmFtZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO2lmKG51bGwhPXRoaXMub3B0aW9ucy5uYW1lJiYwIT09dGhpcy5vcHRpb25zLm5hbWUubGVuZ3RoKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdGVuc29yLW5hbWUiKTtiLnRleHRDb250ZW50PVFrKHRoaXMub3B0aW9ucy5uYW1lKTsKYi50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKGIpfX1yZW5kZXJEVHlwZSgpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgZHR5cGUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZSIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtkLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwiKTtkLnRleHRDb250ZW50PSJkdHlwZToiO2IuYXBwZW5kQ2hpbGQoZCk7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ZC50ZXh0Q29udGVudD10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTtiLmFwcGVuZENoaWxkKGQpO3RoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoYil9cmVuZGVyU2hhcGUoKXtpZihudWxsPT0KdGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO2NvbnN0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlIik7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIik7ZC50ZXh0Q29udGVudD0ic2hhcGU6IjtiLmFwcGVuZENoaWxkKGQpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIik7ZC50ZXh0Q29udGVudD1jaih0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7Yi5hcHBlbmRDaGlsZChkKTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKGIpfWNyZWF0ZU1lbnUoKXt0aGlzLm1lbnVDb25maWc9e2l0ZW1zOltdfTsKaWYoTWgodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxMaCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fFlpKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpiPT57MD09PWI/KHRoaXMudmFsdWVSZW5kZXJNb2RlPVhrLlRFWFQsdGhpcy5yZW5kZXJWYWx1ZXMoKSk6KHRoaXMudmFsdWVSZW5kZXJNb2RlPVhrLklNQUdFLHRoaXMudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZD0+e3RoaXMubnVtZXJpY1N1bW1hcnk9ZDt0aGlzLnJlbmRlclZhbHVlcygpfSkpfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJTZWxlY3QgY29sb3IgbWFwLi4uIixvcHRpb25zOk9iamVjdC5rZXlzKFlrKSxkZWZhdWx0U2VsZWN0aW9uOjAsY2FsbGJhY2s6Yj0+Cnt0aGlzLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhZaylbYl07dGhpcy5yZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOigpPT50aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFfSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246Ilpvb20gaW4gKEltYWdlIG1vZGUpIixjYWxsYmFjazooKT0+e3RoaXMuem9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6KCk9PnRoaXMudmFsdWVSZW5kZXJNb2RlPT09WGsuSU1BR0V9KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazooKT0+e3RoaXMuem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOigpPT50aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFfSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyBhaih0aGlzLm1lbnVDb25maWcsCnRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5yZW5kZXJNZW51VGh1bWIoKSl9em9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpe3RoaXMuaW1hZ2VDZWxsU2l6ZSp0aGlzLnpvb21TdGVwUmF0aW88PXRoaXMubWF4SW1hZ2VDZWxsU2l6ZSYmKHRoaXMuaW1hZ2VDZWxsU2l6ZSo9dGhpcy56b29tU3RlcFJhdGlvLHRoaXMucmVuZGVyVmFsdWVzKCkpfXpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9cmVuZGVyTWVudVRodW1iKCl7aWYobnVsbD09dGhpcy5oZWFkZXJTZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgbWVudSB0aHVtYiBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaGVhZGVyIHNlY3Rpb24uIik7dGhpcy5tZW51VGh1bWI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57aWYobnVsbCE9PXRoaXMubWVudSlpZih0aGlzLm1lbnUuc2hvd24oKSl0aGlzLm1lbnUuaGlkZSgpO2Vsc2V7Y29uc3QgYj10aGlzLm1lbnVUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLm1lbnUuc2hvdyhiLmJvdHRvbSxiLmxlZnQpfX0pfXJlbmRlclZhbHVlcygpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Mjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLAp0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2xpY2luZ1NwZWNSb290KSk7bnVsbD09dGhpcy52YWx1ZVNlY3Rpb24mJih0aGlzLnZhbHVlU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXNlY3Rpb24iKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVTZWN0aW9uKSx0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYj0+SmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBkPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/ZD1iLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P2Q9Yi5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihkPWIuc2hpZnRLZXkpOwpkJiZ0aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFPyhiLnN0b3BQcm9wYWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKSwwPGIuZGVsdGFZP3RoaXMuem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKTp0aGlzLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKSk6bnVsbCE9dGhpcy5zZWxlY3Rpb24mJihiLnN0b3BQcm9wYWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKSx0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKSx5aWVsZCB0aGlzLnNjcm9sbFVwT3JEb3duKDA8Yi5kZWx0YVk/ZmouRE9XTjpmai5VUCkpfSkpLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYj0+e3ZhciBkPVszOCw0MCwzNywzOV07aWYobnVsbCE9dGhpcy5zZWxlY3Rpb24mJi0xIT09ZC5pbmRleE9mKGIua2V5Q29kZSkpe2Iuc3RvcFByb3BhZ2F0aW9uKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpOwpsZXQgZj1kPW51bGw7Mzg9PT1iLmtleUNvZGU/Zj1mai5VUDo0MD09PWIua2V5Q29kZT9mPWZqLkRPV046Mzc9PT1iLmtleUNvZGU/Zj1mai5MRUZUOjM5PT09Yi5rZXlDb2RlJiYoZj1mai5SSUdIVCk7bnVsbCE9PWYmJihkPXRoaXMuc2VsZWN0aW9uLm1vdmUoZix0aGlzLnNsaWNpbmdTcGVjKSk7bnVsbD09PWQ/dGhpcy5yZW5kZXJTZWxlY3Rpb24oKTpkPT09ZmouVVB8fGQ9PT1mai5ET1dOP3RoaXMuc2Nyb2xsVXBPckRvd24oZCk6KGQ9PT1mai5MRUZUfHxkPT09ZmouUklHSFQpJiZ0aGlzLnNjcm9sbExlZnRPclJpZ2h0KGQpfX0pKTt0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCk7dGhpcy5jcmVhdGVUb3BSdWxlcigpO3RoaXMuY3JlYXRlTGVmdFJ1bGVyKCk7dGhpcy5jcmVhdGVWYWx1ZURpdnMoKTt5aWVsZCB0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpOzI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgaGoodGhpcy5zbGljaW5nU3BlY1Jvb3QsdGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUsCmI9PkpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtlaih0aGlzLnNsaWNpbmdTcGVjLGIpPyh0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYikpLHlpZWxkIHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCkpOih0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYikpLHlpZWxkIHRoaXMucmVuZGVyKCkpfSkpLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKX0pfWNsZWFyVmFsdWVTZWN0aW9uKCl7aWYobnVsbCE9PXRoaXMudmFsdWVTZWN0aW9uKXtmb3IoO3RoaXMudmFsdWVTZWN0aW9uLmZpcnN0Q2hpbGQ7KXRoaXMudmFsdWVTZWN0aW9uLnJlbW92ZUNoaWxkKHRoaXMudmFsdWVTZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMudG9wUnVsZXI9bnVsbDt0aGlzLnZhbHVlUm93cz1bXX19Y3JlYXRlVG9wUnVsZXIoKXtpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7Cm51bGw9PXRoaXMudG9wUnVsZXImJih0aGlzLnRvcFJ1bGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudG9wUnVsZXIuY2xhc3NMaXN0LmFkZCgidGVuZXNvci13aWRnZXQtdG9wLXJ1bGVyIiksdGhpcy50b3BSdWxlci5zdHlsZS53aGl0ZVNwYWNlPSJub3dyYXAiLHRoaXMudmFsdWVTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMudG9wUnVsZXIpLHRoaXMudG9wUnVsZXJUaWNrcz1bXSx0aGlzLnRvcFJ1bGVyLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixmPT5KaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bnVsbCE9dGhpcy5zZWxlY3Rpb24mJihmLnN0b3BQcm9wYWdhdGlvbigpLGYucHJldmVudERlZmF1bHQoKSx0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKSx5aWVsZCB0aGlzLnNjcm9sbExlZnRPclJpZ2h0KDA8Zi5kZWx0YVk/ZmouUklHSFQ6ZmouTEVGVCkpfSkpKTtmb3IoO3RoaXMudG9wUnVsZXIuZmlyc3RDaGlsZDspdGhpcy50b3BSdWxlci5yZW1vdmVDaGlsZCh0aGlzLnRvcFJ1bGVyLmZpcnN0Q2hpbGQpOwp0aGlzLmJhc2VSdWxlclRpY2s9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5iYXNlUnVsZXJUaWNrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2siKTt0aGlzLnRvcFJ1bGVyLmFwcGVuZENoaWxkKHRoaXMuYmFzZVJ1bGVyVGljayk7Mjw9dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9WzAsbnVsbF0pO2xldCBiO2I9MT49dGhpcy5yYW5rPzE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07Y29uc3QgZD10aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O3RoaXMuY29sc0N1dG9mZj0hMTtmb3IobGV0IGY9MDtmPGI7KytmKXtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpO3RoaXMudmFsdWVSZW5kZXJNb2RlPT09ClhrLklNQUdFJiYoaC5zdHlsZS53aWR0aD1gJHt0aGlzLmltYWdlQ2VsbFNpemV9cHhgKTt0aGlzLnRvcFJ1bGVyLmFwcGVuZENoaWxkKGgpO3RoaXMudG9wUnVsZXJUaWNrcy5wdXNoKGgpO2lmKGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ+PWQpe2lmKDI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKGBNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPWYrMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKGBNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPQpifX1jcmVhdGVMZWZ0UnVsZXIoKXtpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgbGVmdCBydWxlciBkdWUgdG8gbWlzc2luZyB2YWx1ZSBzZWN0aW9uLiIpO3RoaXMudmFsdWVSb3dzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107MTw9dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPVswLG51bGxdKTtsZXQgYjtiPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Y29uc3QgZD10aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtmb3IobGV0IGY9MDtmPGI7KytmKXtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1yb3ciKTt0aGlzLnZhbHVlUmVuZGVyTW9kZT09PQpYay5JTUFHRSYmKGguc3R5bGUuaGVpZ2h0PWAke3RoaXMuaW1hZ2VDZWxsU2l6ZX1weGAsaC5zdHlsZS5saW5lSGVpZ2h0PWAke3RoaXMuaW1hZ2VDZWxsU2l6ZX1weGApO3RoaXMudmFsdWVTZWN0aW9uLmFwcGVuZENoaWxkKGgpO3RoaXMudmFsdWVSb3dzLnB1c2goaCk7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2siKTt0aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFJiYoay5zdHlsZS5oZWlnaHQ9YCR7dGhpcy5pbWFnZUNlbGxTaXplfXB4YCxrLnN0eWxlLmxpbmVIZWlnaHQ9YCR7dGhpcy5pbWFnZUNlbGxTaXplfXB4YCk7aC5hcHBlbmRDaGlsZChrKTt0aGlzLmxlZnRSdWxlclRpY2tzLnB1c2goayk7aWYoay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20+PWQpe2lmKDE8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcihgTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgJHt0aGlzLnJhbmt9RCB0ZW5zb3IuYCk7CnRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1mKzE7dGhpcy5yb3dzQ3V0b2ZmPSEwfWJyZWFrfX1pZighdGhpcy5yb3dzQ3V0b2ZmJiYxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1ifX1jcmVhdGVWYWx1ZURpdnMoKXtpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2NvbnN0IGI9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aCxkPXRoaXMudmFsdWVSb3dzLmxlbmd0aDtmb3IobGV0IGY9MDtmPGQ7KytmKXt0aGlzLnZhbHVlRGl2c1tmXT1bXTtmb3IobGV0IGg9MDtoPGI7KytoKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwprLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1Yay5JTUFHRSYmKGsuc3R5bGUud2lkdGg9YCR7dGhpcy5pbWFnZUNlbGxTaXplfXB4YCxrLnN0eWxlLmhlaWdodD1gJHt0aGlzLmltYWdlQ2VsbFNpemV9cHhgLGsuc3R5bGUubGluZUhlaWdodD1gJHt0aGlzLmltYWdlQ2VsbFNpemV9cHhgKTt0aGlzLnZhbHVlUm93c1tmXS5hcHBlbmRDaGlsZChrKTt0aGlzLnZhbHVlRGl2c1tmXS5wdXNoKGspO2suYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5zZWxlY3Rpb249bmV3IGdqKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlLHRoaXMuc2xpY2luZ1NwZWMsbnVsbD09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlfHxudWxsPT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0/MDp0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rZixudWxsPT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8Cm51bGw9PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPzA6dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0raCwxLDEpO3RoaXMucmVuZGVyU2VsZWN0aW9uKCl9KTtrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT57Y29uc3Qgcj1rLmdldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiKTtpZihudWxsIT09cil7dmFyIGw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwPWsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbT1wLmJvdHRvbS1wLnRvcCxuPXAucmlnaHQtcC5sZWZ0LHE9dGhpcy5jYWxjdWxhdGVJbmRpY2VzKGYsaCk7dGhpcy5kcmF3VmFsdWVUb29sdGlwKHEscixwLnRvcC1sLnRvcCsuOCptLHAubGVmdC1sLmxlZnQrLjc1Km4pfX0pO2suYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKCk9Pnt0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKX0pfX19cmVuZGVyVG9wUnVsZXIoKXtpZigyPD10aGlzLnJhbmspe2NvbnN0IGI9CnRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO2ZvcihsZXQgZD0wO2Q8dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDsrK2Qpe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcihgTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAke3RoaXMucmFua31EIHRlbnNvci5gKTtjb25zdCBmPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK2Q7dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLnRvcFJ1bGVyVGlja3NbZF0udGV4dENvbnRlbnQ9ZjxiP2Ake2Z9YDoiIil9fX1yZW5kZXJMZWZ0UnVsZXIoKXtpZigxPD10aGlzLnJhbmspe2NvbnN0IGI9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07Zm9yKGxldCBkPTA7ZDx0aGlzLmxlZnRSdWxlclRpY2tzLmxlbmd0aDsrK2Qpe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgdmVydGNpYWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApOwpjb25zdCBmPXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStkO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy5sZWZ0UnVsZXJUaWNrc1tkXS50ZXh0Q29udGVudD1mPGI/YCR7Zn1gOiIiKX19fXJlbmRlclZhbHVlRGl2cygpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Y29uc3QgYj10aGlzLnZhbHVlRGl2cy5sZW5ndGgsZD10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGg7bGV0IGY9eWllbGQgdGhpcy50ZW5zb3JWaWV3LnZpZXcodGhpcy5zbGljaW5nU3BlYyk7MD09PXRoaXMucmFuaz9mPVtbZl1dOjE9PT10aGlzLnJhbmsmJihmPWYubWFwKHA9PltwXSkpO2NvbnN0IGg9dGhpcy5nZXRWYWx1ZUNsYXNzKCksaz10aGlzLnZhbHVlUmVuZGVyTW9kZTtpZihrPT09WGsuSU1BR0Upe2lmKG51bGw9PXRoaXMubnVtZXJpY1N1bW1hcnkpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG51bWVyaWMgc3VtbWFyeSIpOwp2YXIgcj10aGlzLm51bWVyaWNTdW1tYXJ5Lm1pbmltdW0sbD10aGlzLm51bWVyaWNTdW1tYXJ5Lm1heGltdW07aWYobnVsbD09cnx8bnVsbD09bCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHJlbmRlciBpbWFnZSByZXByZXNlbnRhdGlvbiBvZiB0ZW5zb3IgZHVlIHRvIG1pc3NpbmcgbWluaW11bSBvciBtYXhpbXVtIHZhbHVlcyBpbiBudW1lcmljIHN1bW1hcnkiKTtyPXttaW46cixtYXg6bH07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBZaz9uZXcgWWtbdGhpcy5jb2xvck1hcE5hbWVdKHIpOm5ldyBWayhyKX1mb3Iocj0wO3I8YjsrK3IpZm9yKGw9MDtsPGQ7KytsKXtjb25zdCBwPXRoaXMudmFsdWVEaXZzW3JdW2xdO2lmKHI8Zi5sZW5ndGgmJmw8ZltyXS5sZW5ndGgpe2NvbnN0IG09ZltyXVtsXTtpZihrPT09WGsuSU1BR0Upe2NvbnN0IFtuLHEsdV09dGhpcy5jb2xvck1hcC5nZXRSR0IobSk7cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YHJnYigke259LCAke3F9LCAke3V9KWB9ZWxzZSJudW1lcmljIj09PQpoP3AudGV4dENvbnRlbnQ9UmsobSxMaCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpOiJib29sZWFuIj09PWg/cC50ZXh0Q29udGVudD1TayhtKToic3RyaW5nIj09PWgmJihwLnRleHRDb250ZW50PVRrKG0pKTtwLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLHRoaXMuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcobSkpfWVsc2UgcC50ZXh0Q29udGVudD0iIixwLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLCIiKX10aGlzLnJlbmRlclNlbGVjdGlvbigpfSl9Z2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcoYil7cmV0dXJuImJvb2xlYW4iPT09dGhpcy5nZXRWYWx1ZUNsYXNzKCk/U2soYiwhMSk6InN0cmluZyI9PT10aGlzLmdldFZhbHVlQ2xhc3MoKT9gTGVuZ3RoLSR7Yi5sZW5ndGh9IHN0cmluZzogIiR7VGsoYiw1MDApfSJgOlN0cmluZyhiKX1yZW5kZXJTZWxlY3Rpb24oKXtpZihudWxsIT10aGlzLnNlbGVjdGlvbil7dmFyIGI9dGhpcy52YWx1ZURpdnMubGVuZ3RoLApkPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aDtmb3IobGV0IGg9MDtoPGI7KytoKWZvcihsZXQgaz0wO2s8ZDsrK2spe2NvbnN0IHI9dGhpcy52YWx1ZURpdnNbaF1ba107ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKTtyLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKTtyLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtyLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tcmlnaHQiKTt2YXIgZj10aGlzLmNhbGN1bGF0ZUluZGljZXMoaCxrKTtmPXRoaXMuc2VsZWN0aW9uLmdldEVsZW1lbnRTdGF0dXMoZik7bnVsbCE9PWYmJihyLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpLApmLnRvcEVkZ2UmJnIuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpLGYuYm90dG9tRWRnZSYmci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIiksZi5sZWZ0RWRnZSYmci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpLGYucmlnaHRFZGdlJiZyLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19fWNhbGN1bGF0ZUluZGljZXMoYixkKXtjb25zdCBmPVtdLGg9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKHI9PnIuZGltKSxrPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChyPT5yLmluZGV4KTtmb3IobGV0IHI9MDtyPHRoaXMucmFuazsrK3IpaWYoLTEhPT1oLmluZGV4T2Yocikpe2NvbnN0IGw9a1toLmluZGV4T2YocildOwppZihudWxsPT09bCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzOiAiK2BVbmRldGVybWluZWQgaW5kZXggYXQgZGltZW5zaW9uICR7cn1gKTtmLnB1c2gobCl9ZWxzZSBpZihyPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZXx8bnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO2YucHVzaCh0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rYil9ZWxzZSBpZihyPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlfHxudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKZi5wdXNoKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK2QpfXJldHVybiBmfWRyYXdWYWx1ZVRvb2x0aXAoYixkLGYsaCl7bnVsbD09PXRoaXMudmFsdWVUb29sdGlwJiYodGhpcy52YWx1ZVRvb2x0aXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy52YWx1ZVRvb2x0aXAuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIiksdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnZhbHVlVG9vbHRpcCkpO2Zvcig7dGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZDspdGhpcy52YWx1ZVRvb2x0aXAucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZCk7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIik7ay50ZXh0Q29udGVudD1gSW5kaWNlczogJHtKU09OLnN0cmluZ2lmeShiKX1gOwp0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChrKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIik7Yi50ZXh0Q29udGVudD1kO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKGIpO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLnRvcD1gJHtmfXB4YDt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS5sZWZ0PWAke2h9cHhgO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLnZhbHVlUmVuZGVyTW9kZT09WGsuSU1BR0UmJm51bGwhPXRoaXMuY29sb3JNYXAmJihmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGYuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIiksdGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoZiksdGhpcy5jb2xvck1hcC5yZW5kZXIoZixwYXJzZUZsb2F0KGQpKSl9aGlkZVZhbHVlVG9vbHRpcCgpe251bGwhPQp0aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKXtyZXR1cm4gSmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe251bGwhPXRoaXMuc2xpY2luZ0NvbnRyb2wmJnRoaXMuc2xpY2luZ0NvbnRyb2wuc2V0U2xpY2luZ1NwZWModGhpcy5zbGljaW5nU3BlYyk7dGhpcy5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpO3RoaXMucmVuZGVyVG9wUnVsZXIoKTt0aGlzLnJlbmRlckxlZnRSdWxlcigpO3lpZWxkIHRoaXMucmVuZGVyVmFsdWVEaXZzKCl9KX1jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpe2lmKDI8PXRoaXMucmFuayl7dmFyIGI9dGhpcy50b3BSdWxlclRpY2tzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuc2hvd0luZGljZXNPblRpY2tzPWIucmlnaHQtYi5sZWZ0PjkqTWF0aC5jZWlsKE1hdGgubG9nKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dKS8KTWF0aC5MTjEwKX1lbHNlIDE9PT10aGlzLnJhbms/KGI9dGhpcy5sZWZ0UnVsZXJUaWNrc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0xNjxiLmJvdHRvbS1iLnRvcCk6dGhpcy5zaG93SW5kaWNlc09uVGlja3M9ITF9c2Nyb2xsSG9yaXpvbnRhbGx5KGIpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoISgxPj10aGlzLnJhbmspKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgJHt0aGlzLnJhbmt9RCB0ZW5zb3IuYCk7dmFyIGQ9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07aWYoMD5ifHxiPj1kKXRocm93IEVycm9yKGBJbmRleCBvdXQgb2YgYm91bmQ6ICR7Yn0gaXMgb3V0c2lkZSBbMCwgJHtkfV0pYCk7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF09CmI7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09Yit0aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoO2Q9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV0+ZCYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPWQpO3lpZWxkIHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCl9fSl9c2Nyb2xsVmVydGljYWxseShiKXtyZXR1cm4gSmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2lmKDAhPT10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpOwp2YXIgZD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTtpZigwPmJ8fGI+PWQpdGhyb3cgRXJyb3IoYEluZGV4IG91dCBvZiBib3VuZDogJHtifSBpcyBvdXRzaWRlIFswLCAke2R9XSlgKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF09Yjt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Yit0aGlzLnZhbHVlUm93cy5sZW5ndGg7ZD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0+ZCYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1kKTt5aWVsZCB0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpfX0pfXNjcm9sbFVwT3JEb3duKGIpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoMCE9PXRoaXMucmFuayYmdGhpcy5yb3dzQ3V0b2ZmKXtpZihudWxsPT09CnRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcihgTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgJHt0aGlzLnJhbmt9RCB0ZW5zb3IuYCk7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWZXJ0aWNhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHJvd3MuIik7dmFyIGQ9dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdO2I9PT1mai5ET1dOP2Q8dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0tKHRoaXMudmFsdWVSb3dzLmxlbmd0aC0xKSYmKHlpZWxkIHRoaXMuc2Nyb2xsVmVydGljYWxseShkKzEpKTowPD1kLTEmJih5aWVsZCB0aGlzLnNjcm9sbFZlcnRpY2FsbHkoZC0xKSl9fSl9c2Nyb2xsTGVmdE9yUmlnaHQoYil7cmV0dXJuIEpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtpZighKDE+PXRoaXMucmFuaykmJnRoaXMuY29sc0N1dG9mZil7aWYobnVsbD09PQp0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiSG9yaXpvbnRhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhvcml6b250YWwgcmFuZ2UuIik7dmFyIGQ9dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF07Yj09PWZqLlJJR0hUP2Q8dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0tKHRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGgtMSkmJih5aWVsZCB0aGlzLnNjcm9sbEhvcml6b250YWxseShkKzEpKTowPD1kLTEmJih5aWVsZCB0aGlzLnNjcm9sbEhvcml6b250YWxseShkLTEpKX19KX1uYXZpZ2F0ZVRvSW5kaWNlcygpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhyb3cgRXJyb3IoIm5hdmlnYXRlVG9JbmRpY2VzKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTt9KX1nZXRWYWx1ZUNsYXNzKCl7Y29uc3QgYj10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTsKcmV0dXJuIExoKGIpfHxNaChiKT8ibnVtZXJpYyI6WWkoYik/ImJvb2xlYW4iOiJzdHJpbmcifX12YXIgJGs9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdGVuc29yV2lkZ2V0OmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gbmV3IFprKGIsZCxmKX0sVkVSU0lPTjoiMC4wLjAifSk7d2luZG93LnRlbnNvcl93aWRnZXQ9JGs7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2QmJigiZG9jdW1lbnQiPT09Yj90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYj90aGlzLnNjcm9sbFRhcmdldD0oZD10aGlzLmRvbUhvc3QpJiZkLiQ/ZC4kW2JdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmIpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1iLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixiKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yil9LHNldCBfc2Nyb2xsTGVmdChiKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYix3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yil9LHNjcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhiLGQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZCl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtkPWQ9PT10aGlzLl9kb2M/d2luZG93OmQ7Yj90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9Yjt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihiLHRoaXMuc2Nyb2xsVGFyZ2V0KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnViYXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToibWVudWJhciJ9LGtleUJpbmRpbmdzOntsZWZ0OiJfb25MZWZ0S2V5IixyaWdodDoiX29uUmlnaHRLZXkifSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LGdldCBfaXNSVEwoKXtyZXR1cm4icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbn0sX29uTGVmdEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9mb2N1c05leHQoKTp0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25SaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD8KdGhpcy5fZm9jdXNQcmV2aW91cygpOnRoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGxlZnQgcmlnaHQgZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQoYil9fTtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3I9W1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlci5qcwpKaD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYixkLGYsaCl7cmV0dXJuIG5ldyAoZnx8KGY9UHJvbWlzZSkpKGZ1bmN0aW9uKGsscil7ZnVuY3Rpb24gbChuKXt0cnl7bShoLm5leHQobikpfWNhdGNoKHEpe3IocSl9fWZ1bmN0aW9uIHAobil7dHJ5e20oaFsidGhyb3ciXShuKSl9Y2F0Y2gocSl7cihxKX19ZnVuY3Rpb24gbShuKXtuLmRvbmU/ayhuLnZhbHVlKToobmV3IGYoZnVuY3Rpb24ocSl7cShuLnZhbHVlKX0pKS50aGVuKGwscCl9bSgoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9OwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3Rpb246T2JqZWN0LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxoaWVyYXJjaHlQYXJhbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5iLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zfSxvdXRHcmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRHcmFwaDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRTdGF0czp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSwKX2dyYXBoUnVuVGFnOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIiwiX3NlbGVjdGVkRmlsZUNoYW5nZWQoc2VsZWN0ZWRGaWxlLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX3NlbGVjdGlvbkNoYW5nZWQoKXt0aGlzLmRlYm91bmNlKCJzZWxlY3Rpb25jaGFuZ2UiLCgpPT57dGhpcy5fbG9hZCh0aGlzLnNlbGVjdGlvbil9KX0sX2xvYWQ6ZnVuY3Rpb24oZil7Y29uc3QgaD1mLnJ1bixrPWYudGFnO2Y9Zi50eXBlO3N3aXRjaChmKXtjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDpjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIOnRoaXMuX3NldE91dFN0YXRzKG51bGwpO3ZhciByPW5ldyBVUkxTZWFyY2hQYXJhbXM7ci5zZXQoInJ1biIsaCk7ci5zZXQoImNvbmNlcHR1YWwiLFN0cmluZyhmPT09Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEgpKTsKayYmci5zZXQoInRhZyIsayk7Zj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixyKTtyZXR1cm4gdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmKS50aGVuKCgpPT57dGhpcy5fZ3JhcGhSdW5UYWc9e3J1bjpoLHRhZzprfX0pO2Nhc2UgYi5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6eyh7dGFnczpmfT10aGlzLmRhdGFzZXRzLmZpbmQoKHtuYW1lOm19KT0+bT09PWgpKTtjb25zdCBsPWYuZmluZChtPT5tLnRhZz09PWspLm9wR3JhcGg/azpudWxsO2NvbnNvbGUuYXNzZXJ0KGYuZmluZChtPT5tLnRhZz09PWwpLGBSZXF1aXJlZCB0YWcgKCR7bH0pIGlzIG1pc3NpbmcuYCk7Zj10aGlzLl9ncmFwaFJ1blRhZyYmdGhpcy5fZ3JhcGhSdW5UYWcucnVuPT09aCYmdGhpcy5fZ3JhcGhSdW5UYWcudGFnPT09bD9Qcm9taXNlLnJlc29sdmUoKTp0aGlzLl9sb2FkKHtydW46aCx0YWc6bCx0eXBlOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0pOwpyPW5ldyBVUkxTZWFyY2hQYXJhbXM7ci5zZXQoInRhZyIsayk7ci5zZXQoInJ1biIsaCk7Y29uc3QgcD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL3J1bl9tZXRhZGF0YSIscik7cmV0dXJuIGYudGhlbigoKT0+dGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEocCkpfWRlZmF1bHQ6cmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKGBVbmtub3duIHNlbGVjdGlvbiB0eXBlOiAke2Z9YCkpfX0sX3JlYWRBbmRQYXJzZU1ldGFkYXRhOmZ1bmN0aW9uKGYpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7Yi5ncmFwaC5wYXJzZXIuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhKGYsYi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykpLnRoZW4oaD0+e3RoaXMuX3NldE91dFN0YXRzKGgpfSl9LF9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoOmZ1bmN0aW9uKGYsaCl7cmV0dXJuIEpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt0aGlzLnNldCgicHJvZ3Jlc3MiLAp7dmFsdWU6MCxtc2c6IiJ9KTtyZXR1cm4gYi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChiLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSxmLGgsdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXIsdGhpcy5oaWVyYXJjaHlQYXJhbXMpLnRoZW4oKHtncmFwaDprLGdyYXBoSGllcmFyY2h5OnJ9KT0+e3RoaXMuX3NldE91dEdyYXBoKGspO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KHIpfSl9KX0sX3NlbGVjdGVkRmlsZUNoYW5nZWQ6ZnVuY3Rpb24oZil7aWYoZil7Zj1mLnRhcmdldDt2YXIgaD1mLmZpbGVzWzBdO2gmJihmLnZhbHVlPSIiLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobnVsbCxoKSl9fX0pfSkoZC5sb2FkZXJ8fChkLmxvYWRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUuanMKdmFyIGVsOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChoKXtjb25zdCBbayxyLGxdPWg7cmV0dXJue3dhbGxfdGltZTprLHN0ZXA6cixtaW46ZDMubWluKGwubWFwKChbcF0pPT5wKSksbWF4OmQzLm1heChsLm1hcCgoWyxwXSk9PnApKSxidWNrZXRzOmwubWFwKChbcCxtLG5dKT0+KHtsZWZ0OnAscmlnaHQ6bSxjb3VudDpufSkpfX1mdW5jdGlvbiBmKGgsayxyLGw9MzApe3I9PT1rJiYocj0xLjEqaysxLGs9ay8xLjEtMSk7Y29uc3QgcD0oci1rKS9sO2xldCBtPTA7cmV0dXJuIGQzLnJhbmdlKGsscixwKS5tYXAobj0+e2NvbnN0IHE9bitwO2xldCB1PTA7Zm9yKDttPGguYnVja2V0cy5sZW5ndGg7KXtjb25zdCBBPU1hdGgubWluKHIsaC5idWNrZXRzW21dLnJpZ2h0KTt2YXIgdz1NYXRoLm1heChrLGguYnVja2V0c1ttXS5sZWZ0KTtjb25zdCB5PU1hdGgubWluKEEscSktTWF0aC5tYXgodyxuKTt3PXkvKEEtdykqaC5idWNrZXRzW21dLmNvdW50O3UrPTA8eT93OjA7aWYoQT5xKWJyZWFrO20rK31yZXR1cm57eDpuLApkeDpwLHk6dX19KX1iLmJhY2tlbmRUb0ludGVybWVkaWF0ZT1kO2IuaW50ZXJtZWRpYXRlVG9EMz1mO2IuYmFja2VuZFRvVno9ZnVuY3Rpb24oaCl7aD1oLm1hcChkKTtjb25zdCBrPWQzLm1pbihoLGw9PmwubWluKSxyPWQzLm1heChoLGw9PmwubWF4KTtyZXR1cm4gaC5tYXAobD0+KHt3YWxsX3RpbWU6bC53YWxsX3RpbWUsc3RlcDpsLnN0ZXAsYmluczpmKGwsayxyKX0pKX19KShlbHx8KGVsPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy11dGlscy90Zi1ocGFyYW1zLXV0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChCKXtyZXR1cm4iIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWU/Qi5kaXNwbGF5TmFtZTpCLm5hbWV9ZnVuY3Rpb24gayhCKXtpZigiIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWUpcmV0dXJuIEIuZGlzcGxheU5hbWU7bGV0IEg9Qi5uYW1lLmdyb3VwO0I9Qi5uYW1lLnRhZzt2b2lkIDA9PT1IJiYoSD0iIik7dm9pZCAwPT09QiYmKEI9IiIpO3JldHVybiIiPT09SD9COkgrIi4iK0J9ZnVuY3Rpb24gcihCKXtyZXR1cm4gQi5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBsKEIpe3JldHVybiBCLm1ldHJpY0NvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIHAoQixIKXtyZXR1cm4gQltIXX1mdW5jdGlvbiBtKEIsSCl7cmV0dXJuIEIuZmluZChLPT5fLmlzRXF1YWwoSy5uYW1lLEgpKX1mdW5jdGlvbiBuKEIsSCxLKXtyZXR1cm4gSC5ocGFyYW1zW0IuaHBhcmFtQ29sdW1uc1tLXS5ocGFyYW1JbmZvLm5hbWVdfQpmdW5jdGlvbiBxKEIsSCxLKXtCPW0oSC5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNDb2x1bW5zW0tdLm1ldHJpY0luZm8ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gdShCLEgsSyl7cmV0dXJuIEs8Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9uKEIsSCxLKTpxKEIsSCxLLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgpfWZ1bmN0aW9uIHcoQil7cmV0dXJuIEIuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIEEoQil7cmV0dXJuIEIubWV0cmljSW5mb3MubGVuZ3RofWZ1bmN0aW9uIHkoQixILEspe3JldHVybiBILmhwYXJhbXNbQi5ocGFyYW1JbmZvc1tLXS5uYW1lXX1mdW5jdGlvbiB4KEIsSCxLKXtCPW0oSC5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNJbmZvc1tLXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiBDKEIsSCxLKXtyZXR1cm4gSzxCLmhwYXJhbUluZm9zLmxlbmd0aD95KEIsSCxLKTp4KEIsSCxLLUIuaHBhcmFtSW5mb3MubGVuZ3RoKX0KZnVuY3Rpb24gRyhCKXtyZXR1cm4gXy5pc051bWJlcihCKT9CLnRvUHJlY2lzaW9uKDUpOnZvaWQgMD09PUI/IiI6Qi50b1N0cmluZygpfWZ1bmN0aW9uIEQoQixIKXtyZXR1cm4gQipCK0gqSH1mLmhwYXJhbU5hbWU9aDtmLm1ldHJpY05hbWU9aztmLnNjaGVtYUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gSDxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP2goQi5ocGFyYW1Db2x1bW5zW0hdLmhwYXJhbUluZm8pOmsoQi5tZXRyaWNDb2x1bW5zW0gtQi5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9O2YubnVtSFBhcmFtcz1yO2YubnVtTWV0cmljcz1sO2YubnVtQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gcihCKStsKEIpfTtmLmhwYXJhbVZhbHVlQnlOYW1lPXA7Zi5tZXRyaWNWYWx1ZUJ5TmFtZT1tO2YuaHBhcmFtVmFsdWVCeUluZGV4PW47Zi5tZXRyaWNWYWx1ZUJ5SW5kZXg9cTtmLmNvbHVtblZhbHVlQnlJbmRleD11O2YubnVtZXJpY0NvbHVtbkV4dGVudD0KZnVuY3Rpb24oQixILEspe3JldHVybiBkMy5leHRlbnQoSCxMPT51KEIsTCxLKSl9O2YuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleD1mdW5jdGlvbihCLEgsSyl7aWYoSzxILmhwYXJhbUluZm9zLmxlbmd0aClCPUIuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoTD0+TC5ocGFyYW1JbmZvLm5hbWU9PT1ILmhwYXJhbUluZm9zW0tdLm5hbWUpO2Vsc2V7Y29uc3QgTD1ILm1ldHJpY0luZm9zW0stSC5ocGFyYW1JbmZvcy5sZW5ndGhdLm5hbWU7Qj1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoK0IubWV0cmljQ29sdW1ucy5maW5kSW5kZXgoSj0+Si5tZXRyaWNJbmZvLm5hbWU9PT1MKX1jb25zb2xlLmFzc2VydCgtMSE9PUIpO3JldHVybiBCfTtmLnNjaGVtYVZpc2libGVDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSCl7cmV0dXJuIEg8Qi5ocGFyYW1JbmZvcy5sZW5ndGg/aChCLmhwYXJhbUluZm9zW0hdKTprKEIubWV0cmljSW5mb3NbSC1CLmhwYXJhbUluZm9zLmxlbmd0aF0pfTtmLm51bVZpc2libGVIUGFyYW1zPQp3O2YubnVtVmlzaWJsZU1ldHJpY3M9QTtmLm51bVZpc2libGVDb2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiB3KEIpK0EoQil9O2YudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ9ZnVuY3Rpb24oQixILEspe3JldHVybiBkMy5leHRlbnQoSCxMPT5DKEIsTCxLKSl9O2YucHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEgpe3JldHVybiBHKHAoQixIKSl9O2YucHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEgpe3JldHVybiBHKG0oQixIKSl9O2Yuc2Vzc2lvbkdyb3VwV2l0aE5hbWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gQi5maW5kKEs9PksubmFtZT09PUgpfTtmLmhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg9eTtmLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg9eDtmLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg9QztmLnByZXR0eVByaW50PUc7Zi5sMk5vcm1TcXVhcmVkPUQ7Zi5ldWNsaWRlYW5EaXN0PWZ1bmN0aW9uKEIsSCxLLEwpe3JldHVybiBNYXRoLnNxcnQoRChCLQpLLEgtTCkpfTtmLnBvaW50VG9SZWN0YW5nbGVEaXN0PWZ1bmN0aW9uKEIsSCxLLEwsSixPKXtpZihCPEsmJkg8TClyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSCxLLEwpO2lmKEs8PUImJkI8SiYmSDxMKXJldHVybiBMLUg7aWYoSjw9QiYmSDxMKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixILEosTCk7aWYoQjxLJiZMPD1IJiZIPE8pcmV0dXJuIEstQjtpZihLPD1CJiZCPEomJkw8PUgmJkg8TylyZXR1cm4gMDtpZihKPD1CJiZMPD1IJiZIPE8pcmV0dXJuIEItSjtpZihCPEsmJk88PUgpcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEgsSyxPKTtpZihLPD1CJiZCPEomJk88PUgpcmV0dXJuIEgtTztpZihKPD1CJiZPPD1IKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixILEosTyk7dGhyb3ciUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4iO307Zi50cmFuc2xhdGVTdHI9ZnVuY3Rpb24oQixIKXtyZXR1cm4gdm9pZCAwPT09SD8idHJhbnNsYXRlKCIrCkIrIikiOiJ0cmFuc2xhdGUoIitCKyIsIitIKyIpIn07Zi5yb3RhdGVTdHI9ZnVuY3Rpb24oQixIKXtsZXQgSz0icm90YXRlKDkwIjt2b2lkIDAhPT1CJiZ2b2lkIDAhPT1IJiYoSz1LKyIsIitCKyIsIitIKTtyZXR1cm4gSysiKSJ9O2YuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oQil7cmV0dXJuIG51bGw9PT1CfHx2b2lkIDA9PT1CfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q9ZnVuY3Rpb24oQixILEssTCxKLE8pe0IudmlzaXQoKFMsTixSLFgsYWEpPT57aWYodm9pZCAwPT09Uy5sZW5ndGgpe2RvIE49Qi54KCkoUy5kYXRhKSxSPUIueSgpKFMuZGF0YSksSDw9TiYmTjxMJiZLPD1SJiZSPEomJk8oUy5kYXRhKTt3aGlsZShTPVMubmV4dCk7cmV0dXJuITB9cmV0dXJuIE4+PUx8fFg8PUh8fFI+PUp8fGFhPD1LfSl9O2YucXVhZFRyZWVWaXNpdFBvaW50c0luRGlzaz1mdW5jdGlvbihCLEgsSyxMLEope0IudmlzaXQoKE8sUyxOLFIsWCk9PntpZih2b2lkIDA9PT1PLmxlbmd0aCl7ZG8gUz0KQi54KCkoTy5kYXRhKSxOPUIueSgpKE8uZGF0YSksUz1mLmV1Y2xpZGVhbkRpc3QoSCxLLFMsTiksUzw9TCYmSihPLmRhdGEsUyk7d2hpbGUoTz1PLm5leHQpO3JldHVybiEwfXJldHVybiBmLnBvaW50VG9SZWN0YW5nbGVEaXN0KEgsSyxTLE4sUixYKT5MfSl9O2YuZmlsdGVyU2V0PWZ1bmN0aW9uKEIsSCl7Y29uc3QgSz1uZXcgU2V0O0IuZm9yRWFjaChMPT57SChMKSYmSy5hZGQoTCl9KTtyZXR1cm4gS307Zi5zZXRBcnJheU9ic2VydmFibHk9ZnVuY3Rpb24oQixIKXtjb25zdCBLPUIuZ2V0KCJzZXNzaW9uR3JvdXBzIixCKTtBcnJheS5pc0FycmF5KEspP0Iuc3BsaWNlLmFwcGx5KEIsWyJzZXNzaW9uR3JvdXBzIiwwLEsubGVuZ3RoXS5jb25jYXQoSCkpOkIuc2V0KCJzZXNzaW9uR3JvdXBzIixIKX07Zi5oYXNoT2ZTdHJpbmc9ZnVuY3Rpb24oQil7bGV0IEg9MDtmb3IobGV0IEs9MDtLPEIubGVuZ3RoOysrSylIPTMxKkgrQi5jaGFyQ29kZUF0KEspJjQyOTQ5NjcyOTU7cmV0dXJuIEgrCk1hdGgucG93KDIsMzEpfX0pKGQudXRpbHN8fChkLnV0aWxzPXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1jZWxsLWNsaWNrLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yPXtsaXN0ZW5lcnM6e2NsaWNrOiJfb25DbGljayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXI9ZnVuY3Rpb24oYil7Yi50YXJnZXQhPT10aGlzLl9jZWxsQ29udGVudCYmdGhpcy5maXJlKCJjZWxsLWNvbnRlbnQtZm9jdXMiLHtjZWxsOnRoaXN9KX0uYmluZCh0aGlzKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlciwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxfb25DbGljazpmdW5jdGlvbihiKXsidmFhZGluLWdyaWQtc29ydGVyIiE9PXRoaXMubG9jYWxOYW1lJiZ0aGlzLmZpcmUoImNlbGwtZm9jdXMiLHtjZWxsOnRoaXN9KTtpZih0aGlzLl9jZWxsQ2xpY2spe3ZhciBkPVBvbHltZXIuZG9tKGIpLmxvY2FsVGFyZ2V0OwpkLmdldERpc3RyaWJ1dGVkTm9kZXMmJihkPVBvbHltZXIuZG9tKGQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKVswXSk7dmFyIGY9UG9seW1lci5kb20oYikucGF0aDtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGYsMCxmLmluZGV4T2YoZCkrMSk7ZC5jb250YWlucyh0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQucm9vdC5hY3RpdmVFbGVtZW50fHxkb2N1bWVudC5hY3RpdmVFbGVtZW50KXx8Zi5zb21lKHRoaXMuX2lzRm9jdXNhYmxlKXx8dGhpcy5fY2VsbENsaWNrKGIpfX0sX2lzRm9jdXNhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGU7ZD0tMSE9PUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZCkucXVlcnlTZWxlY3RvckFsbCgiW3RhYmluZGV4XSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgb2JqZWN0LCBpZnJhbWUsIGxhYmVsLCBhW2hyZWZdLCBhcmVhW2hyZWZdIiksYik7cmV0dXJuIWIuZGlzYWJsZWQmJgpkfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZm9jdXNhYmxlLWNlbGwtY29udGFpbmVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcj17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2ZvY3VzZWRSb3c6T2JqZWN0LF9mb2N1c2VkUm93SW5kZXg6TnVtYmVyLF9mb2N1c2VkQ2VsbDpPYmplY3QsX2ZvY3VzZWRDZWxsSW5kZXg6TnVtYmVyLF9sYXN0Rm9jdXNlZENlbGw6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYW5ub3VuY2VGb2N1c2VkQ2VsbChfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2Rpc3BhdGNoRXZlbnRzKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZm9jdXNlZENlbGxDaGFuZ2VkKF9mb2N1c2VkUm93SW5kZXgsIF9mb2N1c2VkQ2VsbEluZGV4KSJdLF9hbm5vdW5jZUZvY3VzZWRDZWxsOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdGhpcy5kb21Ib3N0Lm5hdmlnYXRpbmcmJmQmJihkPVBvbHltZXIuRWxlbWVudD9iLl9jZWxsQ29udGVudC5nZXRBdHRyaWJ1dGUoInNsb3QiKToKYi5fY2VsbENvbnRlbnQuaWQsInZhYWRpbi1ncmlkLXRhYmxlLWJvZHkiIT09dGhpcy5pc3x8Yi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIil8fChiPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYi5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGIpLGQ9dGhpcy5kb21Ib3N0LiQuaGVhZGVyLmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bYl0uX2NlbGxDb250ZW50LmlkKyIgIitkKSx0aGlzLmRvbUhvc3QuJC5mb290ZXJGb2N1c1RyYXAuYWN0aXZlVGFyZ2V0PWQpfSxfZGlzcGF0Y2hFdmVudHM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c291dCIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9dm9pZCAwKSwKZCYmKGIuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPWIpKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oZixoKXtmLmZvY3VzZWQ9aD09PWI7Zi5mb2N1c2VkJiYodGhpcy5fZm9jdXNlZFJvdz1mLHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9TWF0aC5taW4oZCxmLmNoaWxkcmVuLmxlbmd0aC0xKSx0aGlzLl9mb2N1c2VkQ2VsbD1mLmNoaWxkcmVuW3RoaXMuX2ZvY3VzZWRDZWxsSW5kZXhdKTtmLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oayxyKXtrLmZvY3VzZWQ9cj09PXRoaXMuX2ZvY3VzZWRDZWxsSW5kZXh9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sZm9jdXNMZWZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5tYXgoMCxiLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCktMSldKX19LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMSx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sX3Zpc2libGVDZWxsSW5kZXhlczpmdW5jdGlvbigpe3ZhciBiPVtdO2lmKHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4pe2Zvcih2YXIgZD10aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmhpZGRlbnx8ZFtmXT09PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfHxiLnB1c2goZik7Yi5zb3J0KGZ1bmN0aW9uKGgsayl7cmV0dXJuIGRbaF0uY29sdW1uLl9vcmRlcjxkW2tdLmNvbHVtbi5fb3JkZXI/LTE6MX0pfXJldHVybiBifSwKZm9jdXNQYWdlRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMTAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LGZvY3VzUGFnZVVwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEwKX0sZm9jdXNSaWdodDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5taW4oYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpKzEsYi5sZW5ndGgtMSldKX19LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSl9LGZvY3VzSG9tZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iWzBdKX19LGZvY3VzRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YltiLmxlbmd0aC0xXSl9fSxmb2N1c0ZpcnN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PTA7dGhpcy5mb2N1c0hvbWUoKX0sZm9jdXNMYXN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7dGhpcy5mb2N1c0VuZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWZvb3Rlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRhcmdldDpPYmplY3QsX3Jvd3M6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCB0YXJnZXQpIiwiX3Jvd3NDaGFuZ2VkKF9yb3dzKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe3RoaXMuX3Jvd3MmJnRoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtQb2x5bWVyLmRvbShsKS5pbm5lckhUTUw9IiJ9KTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgcj10aGlzLl9jcmVhdGVSb3coKTtyLnRhcmdldD1mO3IuX2lzQ29sdW1uUm93PWs9PWQubGVuZ3RoLTE7ci5jb2x1bW5zPWRba107aC5wdXNoKHIpfXRoaXMuX3Jvd3M9InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciI9PT10aGlzLmxvY2FsTmFtZT9oOmgucmV2ZXJzZSgpfX0sX3Jvd3NDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0KIiI7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpfS5iaW5kKHRoaXMpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLF9jcmVhdGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZFJvdyhfZm9jdXNlZFJvdykiXSxfYW5ub3VuY2VGb2N1c2VkUm93OmZ1bmN0aW9uKGQpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6IlJvdyAiKyhkLmluZGV4KzEpKyIgb2YgIisKdGhpcy5kb21Ib3N0LnNpemV9KX0sX21vdmVGb2N1c1RvRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkQ2VsbC5mb2N1c2VkPSExO3RoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsLmZvY3VzZWQ9ITA7dGhpcy5fZm9jdXNlZENlbGw9dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LF9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGwmJnRoaXMuX2ZvY3VzZWRDZWxsIT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpP3RoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKTp0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5kb21Ib3N0LnNpemUtMSl9LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93JiYKdGhpcy5fZm9jdXNlZENlbGw9PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbD90aGlzLl9mb2N1c2VkQ2VsbENoYW5nZWQodGhpcy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpOih0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSksdGhpcy5fZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsKCkmJnRoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmRvbUhvc3Quc2l6ZS0xO3RoaXMuZm9jdXNFbmQoKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oaCl7aC5mb2N1c2VkPWguaW5kZXg9PT1kO2guaW5kZXg9PT1kJiYodGhpcy5fZm9jdXNlZFJvdz0KaCx0aGlzLl9mb2N1c2VkQ2VsbD1oLmNoaWxkcmVuW2ZdKTtoLml0ZXJhdGVDZWxscyhmdW5jdGlvbihrLHIpe2suZm9jdXNlZD1yPT09Zn0pfS5iaW5kKHRoaXMpKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYj10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShiKTtyZXR1cm4gYn0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYil7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYil9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYiksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT0KYlsiX18iK2QrIl9fIl0mJmJbIl9fIitkKyJfXyJdIT09ZiYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpkLHZhbHVlOmYsaW5zdDpifSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGIsZCxmKXswIT09ZC5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmIuaXRlbSxwYXRoOmQuc3Vic3RyaW5nKDUpLHZhbHVlOmZ9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGIsZCxmKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGIsZCxmKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1tiXT1kO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZXQoYixkKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihiLApkKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixiXSxkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yubm90aWZ5UGF0aChiLGQpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYixkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1iLnBhdGgpe3ZhciBkPTA7dmFyIGY9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWIucGF0aClkPWIudmFsdWUuaW5kZXgsZj1iLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Zvcih2YXIgaz1kO2s8ZCtmO2srKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1trXS5zZXQoaCx0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2hdKX0sdGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc2VsZWN0aW9uLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNlbGVjdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtc0NoYW5nZWQoc2VsZWN0ZWRJdGVtcy4qKSJdLGxpc3RlbmVyczp7InRlbXBsYXRlLWluc3RhbmNlLWNoYW5nZWQiOiJfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRTZWxlY3Rpb24ifSxfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRTZWxlY3Rpb246ZnVuY3Rpb24oYil7aWYoInNlbGVjdGVkIj09PWIuZGV0YWlsLnByb3Ape3ZhciBkPWIuZGV0YWlsLmluc3QuaXRlbTsodGhpcy5faXNTZWxlY3RlZChkKT90aGlzLmRlc2VsZWN0SXRlbTp0aGlzLnNlbGVjdEl0ZW0pLmJpbmQodGhpcykoZCk7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDoodGhpcy5faXNTZWxlY3RlZChkKT8iU2VsZWN0ZWQiOiJEZXNlbGVjdGVkIikrIiBSb3cgIisKKGIuZGV0YWlsLmluc3QuaW5kZXgrMSkrIiBvZiAiK3RoaXMuc2l6ZX0pO2Iuc3RvcFByb3BhZ2F0aW9uKCl9fSxfaXNTZWxlY3RlZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zJiYtMTx0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihiKX0sc2VsZWN0SXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpO3RoaXMuX2lzU2VsZWN0ZWQoYil8fHRoaXMucHVzaCgic2VsZWN0ZWRJdGVtcyIsYil9LGRlc2VsZWN0SXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpO2I9dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYik7LTE8YiYmdGhpcy5zcGxpY2UoInNlbGVjdGVkSXRlbXMiLGIsMSl9LF90b2dnbGVJdGVtOmZ1bmN0aW9uKGIpe2I9dGhpcy5fdGFrZUl0ZW0oYik7LTE9PT10aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihiKT90aGlzLnNlbGVjdEl0ZW0oYik6dGhpcy5kZXNlbGVjdEl0ZW0oYil9LF90YWtlSXRlbTpmdW5jdGlvbihiKXtyZXR1cm4ibnVtYmVyIj09PQp0eXBlb2YgYiYmMDw9YiYmdGhpcy5pdGVtcyYmdGhpcy5pdGVtcy5sZW5ndGg+Yj90aGlzLml0ZW1zW2JdOmJ9LF9zZWxlY3RlZEl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXshdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zfHwic2VsZWN0ZWRJdGVtcyIhPT1iLnBhdGgmJiJzZWxlY3RlZEl0ZW1zLnNwbGljZXMiIT09Yi5wYXRofHx0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZC5pdGVtKX0uYmluZCh0aGlzKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC9pcm9uLWxpc3QtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGw9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXTtyZXR1cm57aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7bWF4UGh5c2ljYWxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifX0sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfcGh5c2ljYWxJbmRleEZvcktleTpudWxsLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCwKX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfaXRlbXNSZW5kZXJlZDohMSxfbGFzdFBhZ2U6bnVsbCxfbWF4UGFnZXM6MyxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtCnRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcH0sX21pblZpcnR1YWxTdGFydDowLGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxfdmlydHVhbFN0YXJ0VmFsOjAsc2V0IF92aXJ0dWFsU3RhcnQoZil7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPU1hdGgubWluKHRoaXMuX21heFZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLl9taW5WaXJ0dWFsU3RhcnQsZikpfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LF9waHlzaWNhbFN0YXJ0VmFsOjAsc2V0IF9waHlzaWNhbFN0YXJ0KGYpe3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9ZiV0aGlzLl9waHlzaWNhbENvdW50OzA+dGhpcy5fcGh5c2ljYWxTdGFydFZhbCYmKHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dGhpcy5fcGh5c2ljYWxDb3VudCt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsKTsKdGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsQ291bnRWYWw6MCxzZXQgX3BoeXNpY2FsQ291bnQoZil7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1mO3RoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx9LF9waHlzaWNhbEVuZDowLGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX29wdFBoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9tYXhQYWdlc30sCmdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0JiYhKCF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aCYmIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ApO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoLGspe2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKTtpZihmPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBrfSl8fDB9cmV0dXJuIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCwKayl7aWYoZjx0aGlzLl9zY3JvbGxCb3R0b20pdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rO2Vsc2UgcmV0dXJuITA7Zis9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGgpfSl9cmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKVsicGFkZGluZy10b3AiXXx8MCwxMCk7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0fSxfdXBkYXRlOmZ1bmN0aW9uKGYsaCl7dGhpcy5fYXNzaWduTW9kZWxzKGYpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoZik7aWYoaClmb3IoO2gubGVuZ3RoOylmPWgucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCl9LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl92aWV3cG9ydEhlaWdodClyZXR1cm4hMTt2YXIgZj10aGlzLl9waHlzaWNhbFNpemVzLnJlZHVjZShmdW5jdGlvbihrLHIpe3JldHVybiBrKyhyfHwxMDApfSwwKSxoPWY+dGhpcy5fdmlld3BvcnRIZWlnaHQ7aWYoZj49dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZoKXJldHVybiExO2Y9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fdmlld3BvcnRIZWlnaHQpOzA9PT1mP3RoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpKSk6dGhpcy5fbGFzdFBhZ2UhPT1mJiZoP1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsdGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyx0aGlzLl9pdGVtc1BlclJvdyksCjE2KSk6dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC8odGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3BoeXNpY2FsQ291bnQpKnRoaXMuX21heFBhZ2VzLXRoaXMuX3BoeXNpY2FsQ291bnQpfHwxKSk7dGhpcy5fbGFzdFBhZ2U9ZjtyZXR1cm4hMH0sX2RlYm91bmNlVGVtcGxhdGU6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmKSl9LF9pbmNyZWFzZVBvb2w6ZnVuY3Rpb24oZil7dmFyIGg9dGhpcy5fcGh5c2ljYWxDb3VudDtmPU1hdGgubWluKHRoaXMuX3BoeXNpY2FsQ291bnQrZix0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMubWF4UGh5c2ljYWxDb3VudCwyNSkpLWg7MD49Znx8KFtdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGYpKSwKW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbFNpemVzLEFycmF5KGYpKSx0aGlzLl9waHlzaWNhbENvdW50PWgrZix0aGlzLl91cGRhdGUoKSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj0wPHRoaXMuX3ZpcnR1YWxDb3VudHx8MDx0aGlzLl9waHlzaWNhbENvdW50O3RoaXMuaXNBdHRhY2hlZCYmIXRoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2lzVmlzaWJsZSYmZiYmKHRoaXMuX2xhc3RQYWdlPTAsdGhpcy5fdXBkYXRlKCksdGhpcy5faXRlbXNSZW5kZXJlZD0hMCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oZixoKXt2YXIgayxyO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZoKWZvcihyPTA7cjxoLmxlbmd0aDtyKyspe3ZhciBsPWhbcl07dmFyIHA9dGhpcy5fY29tcHV0ZVZpZHgobCk7aWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGt9ZWxzZXtsPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHA9dGhpcy5fdmlydHVhbFN0YXJ0O2w8dGhpcy5fcGh5c2ljYWxDb3VudDtsKyssCnArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4gaztmb3IobD0wO2w8dGhpcy5fcGh5c2ljYWxTdGFydDtsKysscCsrKWlmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoZi10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrZn0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxpbmcmJlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIGg9MCxrPTAscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXXx8MDt0aGlzLl9waHlzaWNhbFNpemVzW3BdPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0ub2Zmc2V0SGVpZ2h0OwpoKz10aGlzLl9waHlzaWNhbFNpemVzW3BdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3BdPzE6MH0sZik7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUraC1rO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09ciYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChsKnIraCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBmPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoKXt0aGlzLl9waHlzaWNhbEl0ZW1zW2hdLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCxmKTtmKz10aGlzLl9waHlzaWNhbFNpemVzW2hdfSl9LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19LApfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihmKXtyZXR1cm4gZiV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBmPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7ZiYmKHRoaXMuX3BoeXNpY2FsVG9wLT1mLGR8fDA9PT10aGlzLl9waHlzaWNhbFRvcHx8dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxUb3AtZikpfSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihmKXt0aGlzLnNjcm9sbFRhcmdldCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1mKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihmKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LQp0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGY9KGY9Znx8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uZmx1c2goKTtmPU1hdGgubWluKE1hdGgubWF4KGYsMCksdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoZil8fGY+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9CmYtMTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGg9dGhpcy5fcGh5c2ljYWxTdGFydCxrPXRoaXMuX3ZpcnR1YWxTdGFydCxyPTAsbD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtrPGYmJnI8PWw7KXIrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKSxoPShoKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsaysrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3IpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PXRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX3BoeXNpY2FsSXRlbXMmJnRoaXMuX2lzVmlzaWJsZSYmKHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KSl9LmJpbmQodGhpcyksMSkpfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihmKXtmPXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbZl07bnVsbCE9ZiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCkpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGYpe3JldHVybiBmPj0KdGhpcy5fdmlydHVhbFN0YXJ0JiZmPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24oZil7cmV0dXJuIGY+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmY8PXRoaXMubGFzdFZpc2libGVJbmRleH19fSgpO3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3I9W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Jlc2l6YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmxvY2FsTmFtZSl7dmFyIGI9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4gYiYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1iLmxvY2FsTmFtZT9iLnJlc2l6YWJsZXx8ITE6ITF9fX0saGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmb290ZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX29yZGVyOk51bWJlcixfcmVvcmRlclN0YXR1czpCb29sZWFufSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihkKXswPD1kLmFkZGVkTm9kZXMubGVuZ3RoJiYodGhpcy5oZWFkZXJUZW1wbGF0ZT10aGlzLl9wcmVwYXJlSGVhZGVyVGVtcGxhdGUoKSx0aGlzLmZvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMudGVtcGxhdGU9dGhpcy5fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpKX10aGlzLl90ZW1wbGF0ZU9ic2VydmVyPVBvbHltZXIuRWxlbWVudD9uZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsYik6UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGIpfSxfcHJlcGFyZUhlYWRlclRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlLmhlYWRlciIpfHxudWxsLAp7fSl9LF9wcmVwYXJlRm9vdGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuZm9vdGVyIil8fG51bGwse30pfSxfcHJlcGFyZUJvZHlUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZTpub3QoLmhlYWRlcik6bm90KC5mb290ZXIpIix7fSkpfSxfcHJlcGFyZVRlbXBsYXRpemVyOmZ1bmN0aW9uKGIsZCl7aWYoYiYmIWIudGVtcGxhdGl6ZXIpe3ZhciBmPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtmLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7Zi5faW5zdGFuY2VQcm9wcz1kfHxmLl9pbnN0YW5jZVByb3BzO2YudGVtcGxhdGU9YjtiLnRlbXBsYXRpemVyPWZ9cmV0dXJuIGJ9LF9zZWxlY3RGaXJzdFRlbXBsYXRlOmZ1bmN0aW9uKGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbChiKSwKZnVuY3Rpb24oZCl7cmV0dXJuIFBvbHltZXIuZG9tKGQpLnBhcmVudE5vZGU9PT10aGlzfS5iaW5kKHRoaXMpKVswXX0sX2ZpbmRUZW1wbGF0ZTpmdW5jdGlvbihiKXsoYj10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGIpKSYmdGhpcy5kYXRhSG9zdCYmKGIuX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpO3JldHVybiBifSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhlYWRlclRlbXBsYXRlIix2YWx1ZTpifSl9LF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiZm9vdGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmbGV4R3JvdyIsdmFsdWU6Yn0pfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJ3aWR0aCIsdmFsdWU6Yn0pfSxfbGFzdEZyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoibGFzdEZyb3plbiIsdmFsdWU6Yn0pfX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSx0ZW1wbGF0ZTp7dHlwZTpPYmplY3R9fSxvYnNlcnZlcnM6Il9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO193aWR0aENoYW5nZWQod2lkdGgpO190ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpO19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgaXNBdHRhY2hlZCk7X2hpZGRlbkNoYW5nZWQoaGlkZGVuKTtfb3JkZXJDaGFuZ2VkKF9vcmRlcik7X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKF9yZW9yZGVyU3RhdHVzKTtfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIi5zcGxpdCgiOyIpLF9mcm96ZW5DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHZvaWQgMD09PXRoaXMuX29sZEZyb3plbiYmITE9PT1ifHx0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLAp7cGF0aDoiZnJvemVuIix2YWx1ZTpifSksdGhpcy5fb2xkRnJvemVuPWIpfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJmIudGVtcGxhdGl6ZXImJlBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoYi50ZW1wbGF0aXplcik7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoidGVtcGxhdGUiLHZhbHVlOmJ9LHtidWJibGVzOiExfSl9LF9oaWRkZW5DaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhpZGRlbiIsdmFsdWU6Yn0pfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6Im9yZGVyIix2YWx1ZTpifSl9LF9yZW9yZGVyU3RhdHVzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJyZW9yZGVyU3RhdHVzIix2YWx1ZTpifSl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJyZXNpemFibGUiLHZhbHVlOmJ9KX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1hcnJheS1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2l0ZW1zOkFycmF5fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLCBpdGVtcy4qKSJdLF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5zaXplPShifHxbXSkubGVuZ3RoLHRoaXMuZGF0YVByb3ZpZGVyPXRoaXMuZGF0YVByb3ZpZGVyfHx0aGlzLl9hcnJheURhdGFQcm92aWRlcix0aGlzLmNsZWFyQ2FjaGUoKSl9LF9hcnJheURhdGFQcm92aWRlcjpmdW5jdGlvbihiLGQpe3ZhciBmPSh0aGlzLml0ZW1zfHxbXSkuc2xpY2UoMCk7dGhpcy5fY2hlY2tQYXRocyh0aGlzLl9maWx0ZXJzLCJmaWx0ZXJpbmciLGYpJiYoZj10aGlzLl9maWx0ZXIoZikpO3RoaXMuc2l6ZT1mLmxlbmd0aDtiLnNvcnRPcmRlcnMubGVuZ3RoJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsInNvcnRpbmciLGYpJiYoZj1mLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpKTsKdmFyIGg9Yi5wYWdlKmIucGFnZVNpemU7ZChmLnNsaWNlKGgsaCtiLnBhZ2VTaXplKSxmLmxlbmd0aCl9LF9jaGVja1BhdGhzOmZ1bmN0aW9uKGIsZCxmKXtpZighZi5sZW5ndGgpcmV0dXJuITE7dmFyIGg9ITAsaztmb3IoayBpbiBiKXt2YXIgcj1iW2tdLnBhdGg7aWYociYmLTEhPT1yLmluZGV4T2YoIi4iKSl7dmFyIGw9ci5yZXBsYWNlKC9cLlteXC5dKiQvLCIiKTt2b2lkIDA9PT1Qb2x5bWVyLkJhc2UuZ2V0KGwsZlswXSkmJihjb25zb2xlLndhcm4oJ1BhdGggIicrcisnIiB1c2VkIGZvciAnK2QrIiBkb2VzIG5vdCBleGlzdCBpbiBhbGwgb2YgdGhlIGl0ZW1zLCAiK2QrIiBpcyBkaXNhYmxlZC4iKSxoPSExKX19cmV0dXJuIGh9LF9tdWx0aVNvcnQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oZil7cmV0dXJuImFzYyI9PT1mLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGIpLFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLApkKSk6ImRlc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxkKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSk6MH0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY/ZjpofSwwKX0sX25vcm1hbGl6ZUVtcHR5VmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PVt2b2lkIDAsbnVsbF0uaW5kZXhPZihiKT8iIjppc05hTihiKT9iLnRvU3RyaW5nKCk6Yn0sX2NvbXBhcmU6ZnVuY3Rpb24oYixkKXtiPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYik7ZD10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGQpO3JldHVybiBiPGQ/LTE6Yj5kPzE6MH0sX2ZpbHRlcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIDA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYudmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX0uYmluZCh0aGlzKSkubGVuZ3RofSwKdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWJbZF0ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWQubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhkKTpbZF19LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb25jYXQoZil9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7Yi5wdXNoKGQpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoZCkpYnJlYWs7ZD10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGQpfXJldHVybiBifSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhiLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1iKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBmLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZi5sb2NhbE5hbWUpfSgwPGIuYWRkZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RofHwwPGIucmVtb3ZlZE5vZGVzLmZpbHRlcihkKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGIsZCl7aWYoIWJ8fCFkfHxiLmxlbmd0aCE9ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTAsaD1iLmxlbmd0aDtmPGg7ZisrKWlmKGJbZl1pbnN0YW5jZW9mIEFycmF5JiZkW2ZdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGJbZl0sCmRbZl0pKXJldHVybiExfWVsc2UgaWYoYltmXSE9ZFtmXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihiKTshZHx8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoZCk6ZCBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2IrIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zb3J0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcj17cHJvcGVydGllczp7bXVsdGlTb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcHJldmlvdXNTb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsic29ydGVyLWNoYW5nZWQiOiJfb25Tb3J0ZXJDaGFuZ2VkIn0scmVhZHk6ZnVuY3Rpb24oKXtQb2x5bWVyLkVsZW1lbnQmJiFQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvdyYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYixmdW5jdGlvbihkKXtkLmZpcmUmJmQuZmlyZSgic29ydGVyLWNoYW5nZWQiKX0pfSl9LF9vblNvcnRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O3RoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLGQpO2QuX29yZGVyPW51bGw7dGhpcy5tdWx0aVNvcnQ/KGQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQoZCksdGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9MTx0aGlzLl9zb3J0ZXJzLmxlbmd0aD9oOm51bGx9LHRoaXMpKToodGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX29yZGVyPW51bGw7Zi5kaXJlY3Rpb249bnVsbH0pLGQuZGlyZWN0aW9uJiYodGhpcy5fc29ydGVycz1bZF0pKTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZKU09OLnN0cmluZ2lmeSh0aGlzLl9wcmV2aW91c1NvcnRlcnMpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX0sX21hcFNvcnRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLApkaXJlY3Rpb246Yi5kaXJlY3Rpb259fSl9LF9yZW1vdmVBcnJheUl0ZW06ZnVuY3Rpb24oYixkKXtkPWIuaW5kZXhPZihkKTstMTxkJiZiLnNwbGljZShkLDEpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGIudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGIudGFyZ2V0KTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLHZhbHVlOmIudmFsdWV9fSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3V0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChrLHIsbCl7ZnVuY3Rpb24gcCgpe2lmKDA9PT1rLmxlbmd0aClyZXR1cm5bMSwyXTtjb25zdCBbbSxuXT1kMy5leHRlbnQoayk7cmV0dXJuIG0hPT1uP1ttLG5dOjA8bT9bLjUqbSwxLjUqbV06MD5tP1sxLjUqbSwuNSptXTpbLTEsMV19aWYoIkxJTkVBUiI9PT1sKXJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihwKCkpLnJhbmdlKFtyLDBdKTtpZigiTE9HIj09PWwpcmV0dXJuIGw9cCgpLDA+PWxbMF0mJjA8PWxbMV0/aChrLHIsIkxJTkVBUiIpOmQzLnNjYWxlTG9nKCkuZG9tYWluKGwpLnJhbmdlKFtyLDBdKTtpZigiUVVBTlRJTEUiPT09bClyZXR1cm4gbD1kMy5yYW5nZSgyMCkubWFwKG09PnItbSpyLzE5KSwwPT09ay5sZW5ndGgmJihrPVsxXSksZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEoaykpLnJhbmdlKGwpO2lmKCJOT05fTlVNRVJJQyI9PT1sKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcShrLnNvcnQoKSkpLnJhbmdlKFtyLAowXSkucGFkZGluZyguMSk7dGhyb3cgUmFuZ2VFcnJvcigiVW5rbm93biBzY2FsZTogIitsKTt9Zi5maW5kQ2xvc2VzdFBhdGg9ZnVuY3Rpb24oayxyLGwpe2Z1bmN0aW9uIHAoeSx4LEMsRyl7Y29uc3QgRD15LUMsQj14LUc7Qz1tLUM7Rz1uLUc7Y29uc3QgSD0oRCpDK0IqRykvKEQqRCtCKkIpO3JldHVybiAwPj1IP2IuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMsRyk6MTw9SD9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZCh5LW0seC1uKTpiLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLUgqRCxHLUgqQil9aWYoMj5yLmxlbmd0aClyZXR1cm4gY29uc29sZS5lcnJvcigiTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIiksbnVsbDtjb25zdCBtPWxbMF0sbj1sWzFdO2lmKG08PXJbMF18fG0+PXJbci5sZW5ndGgtMV0pcmV0dXJuIG51bGw7Y29uc3QgcT1fLnNvcnRlZEluZGV4KHIsbSk7Y29uc29sZS5hc3NlcnQoMDxxKTsKY29uc29sZS5hc3NlcnQocTxyLmxlbmd0aCk7Y29uc3QgdT1xLTE7bGV0IHc9bnVsbCxBPW51bGw7ay5mb3JFYWNoKHk9Pntjb25zdCB4PXAoeS5jb250cm9sUG9pbnRzW3VdWzBdLHkuY29udHJvbFBvaW50c1t1XVsxXSx5LmNvbnRyb2xQb2ludHNbcV1bMF0seS5jb250cm9sUG9pbnRzW3FdWzFdKTsxMDA8eHx8IShudWxsPT09d3x8eDx3KXx8KHc9eCxBPXkpfSk7cmV0dXJuIEF9O2YucG9pbnRTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHIsbCl7cmV0dXJuIGsuZG9tYWluKCkuZmlsdGVyKHA9PntwPWsocCk7cmV0dXJuIHI8PXAmJnA8PWx9KX07Zi5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGsscixsKXtjb25zdCBwPWsucmFuZ2UoKSxtPXAuZmlsdGVyKG49PnI8PW4mJm48PWwpLm1hcChuPT57Y29uc3QgcT1rLmludmVydEV4dGVudChuKTtyZXR1cm4gbj09PXBbcC5sZW5ndGgtMV0/W3FbMF0scVsxXSsxXTpxfSk7cmV0dXJuIDA9PW0ubGVuZ3RoP1swLAowXTpkMy5leHRlbnQoZDMubWVyZ2UobSkpfTtmLmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHIsbCl7cmV0dXJuW2suaW52ZXJ0KHIpLGsuaW52ZXJ0KGwpXS5zb3J0KChwLG0pPT5wLW0pfTtmLmNyZWF0ZUF4aXNTY2FsZT1ofSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtYmFja2VuZC90Zi1ocGFyYW1zLWJhY2tlbmQuaHRtbC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2NsYXNzIGZ7Y29uc3RydWN0b3IoaCxrLHI9ITApe3RoaXMuX2FwaVVybD1oO3RoaXMuX3JlcXVlc3RNYW5hZ2VyPWs7dGhpcy5fdXNlSHR0cEdldD1yfWdldEV4cGVyaW1lbnQoaCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJleHBlcmltZW50IixoKX1nZXREb3dubG9hZFVybChoLGsscil7cmV0dXJuIHRoaXMuX2FwaVVybCsiL2Rvd25sb2FkX2RhdGE/IituZXcgVVJMU2VhcmNoUGFyYW1zKHtmb3JtYXQ6aCxjb2x1bW5zVmlzaWJpbGl0eTpKU09OLnN0cmluZ2lmeShyKSxyZXF1ZXN0OkpTT04uc3RyaW5naWZ5KGspfSl9bGlzdFNlc3Npb25Hcm91cHMoaCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJzZXNzaW9uX2dyb3VwcyIsaCl9bGlzdE1ldHJpY0V2YWxzKGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgibWV0cmljX2V2YWxzIixoKX1fc2VuZFJlcXVlc3QoaCxrKXtpZih0aGlzLl91c2VIdHRwR2V0KXJldHVybiBrPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShrKSksCnRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5fYXBpVXJsKyIvIitoKyI/cmVxdWVzdFx4M2QiK2spO2NvbnN0IHI9bmV3IGRjLlJlcXVlc3RPcHRpb25zO3Iud2l0aENyZWRlbnRpYWxzPSEwO3IubWV0aG9kVHlwZT0iUE9TVCI7ci5jb250ZW50VHlwZT0idGV4dC9wbGFpbiI7ci5ib2R5PUpTT04uc3RyaW5naWZ5KGspO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0V2l0aE9wdGlvbnModGhpcy5fYXBpVXJsKyIvIitoLHIpfX1kLkJhY2tlbmQ9Zn0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvdGhyZWUuanMKKGZ1bmN0aW9uKGIsZCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlP2QoZXhwb3J0cyk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLGQpOihiPWJ8fHNlbGYsZChiLlRIUkVFPXt9KSl9KSh0aGlzLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXt9ZnVuY3Rpb24gZihhLGMpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwfWZ1bmN0aW9uIGgoYSxjLGUsZyl7dGhpcy5feD1hfHwwO3RoaXMuX3k9Y3x8MDt0aGlzLl96PWV8fDA7dGhpcy5fdz12b2lkIDAhPT1nP2c6MX1mdW5jdGlvbiBrKGEsYyxlKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MDt0aGlzLno9ZXx8MH1mdW5jdGlvbiByKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdOzA8YXJndW1lbnRzLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX0KZnVuY3Rpb24gbChhLGMsZSxnLHQsdix6LEUsRixJKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpobCsrfSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLmltYWdlPXZvaWQgMCE9PWE/YTpsLkRFRkFVTFRfSU1BR0U7dGhpcy5taXBtYXBzPVtdO3RoaXMubWFwcGluZz12b2lkIDAhPT1jP2M6bC5ERUZBVUxUX01BUFBJTkc7dGhpcy53cmFwUz12b2lkIDAhPT1lP2U6MTAwMTt0aGlzLndyYXBUPXZvaWQgMCE9PWc/ZzoxMDAxO3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXQ/dDoxMDA2O3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PXY/djoxMDA4O3RoaXMuYW5pc290cm9weT12b2lkIDAhPT1GP0Y6MTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMzt0aGlzLnR5cGU9dm9pZCAwIT09RT9FOjEwMDk7dGhpcy5vZmZzZXQ9bmV3IGYoMCwwKTt0aGlzLnJlcGVhdD1uZXcgZigxLDEpO3RoaXMuY2VudGVyPW5ldyBmKDAsMCk7CnRoaXMucm90YXRpb249MDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITA7dGhpcy5tYXRyaXg9bmV3IHI7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITA7dGhpcy5wcmVtdWx0aXBseUFscGhhPSExO3RoaXMuZmxpcFk9ITA7dGhpcy51bnBhY2tBbGlnbm1lbnQ9NDt0aGlzLmVuY29kaW5nPXZvaWQgMCE9PUk/STozRTM7dGhpcy52ZXJzaW9uPTA7dGhpcy5vblVwZGF0ZT1udWxsfWZ1bmN0aW9uIHAoYSxjLGUsZyl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDA7dGhpcy56PWV8fDA7dGhpcy53PXZvaWQgMCE9PWc/ZzoxfWZ1bmN0aW9uIG0oYSxjLGUpe3RoaXMud2lkdGg9YTt0aGlzLmhlaWdodD1jO3RoaXMuc2Npc3Nvcj1uZXcgcCgwLDAsYSxjKTt0aGlzLnNjaXNzb3JUZXN0PSExO3RoaXMudmlld3BvcnQ9bmV3IHAoMCwwLGEsYyk7ZT1lfHx7fTt0aGlzLnRleHR1cmU9bmV3IGwodm9pZCAwLHZvaWQgMCxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLAplLmFuaXNvdHJvcHksZS5lbmNvZGluZyk7dGhpcy50ZXh0dXJlLmltYWdlPXt9O3RoaXMudGV4dHVyZS5pbWFnZS53aWR0aD1hO3RoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQ9Yzt0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXZvaWQgMCE9PWUuZ2VuZXJhdGVNaXBtYXBzP2UuZ2VuZXJhdGVNaXBtYXBzOiExO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09ZS5taW5GaWx0ZXI/ZS5taW5GaWx0ZXI6MTAwNjt0aGlzLmRlcHRoQnVmZmVyPXZvaWQgMCE9PWUuZGVwdGhCdWZmZXI/ZS5kZXB0aEJ1ZmZlcjohMDt0aGlzLnN0ZW5jaWxCdWZmZXI9dm9pZCAwIT09ZS5zdGVuY2lsQnVmZmVyP2Uuc3RlbmNpbEJ1ZmZlcjohMDt0aGlzLmRlcHRoVGV4dHVyZT12b2lkIDAhPT1lLmRlcHRoVGV4dHVyZT9lLmRlcHRoVGV4dHVyZTpudWxsfWZ1bmN0aW9uIG4oYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKTt0aGlzLnNhbXBsZXM9NH1mdW5jdGlvbiBxKCl7dGhpcy5lbGVtZW50cz0KWzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdOzA8YXJndW1lbnRzLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX1mdW5jdGlvbiB1KGEsYyxlLGcpe3RoaXMuX3g9YXx8MDt0aGlzLl95PWN8fDA7dGhpcy5fej1lfHwwO3RoaXMuX29yZGVyPWd8fHUuRGVmYXVsdE9yZGVyfWZ1bmN0aW9uIHcoKXt0aGlzLm1hc2s9MX1mdW5jdGlvbiBBKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aWwrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJPYmplY3QzRCI7dGhpcy5wYXJlbnQ9bnVsbDt0aGlzLmNoaWxkcmVuPVtdO3RoaXMudXA9QS5EZWZhdWx0VXAuY2xvbmUoKTt2YXIgYT1uZXcgayxjPW5ldyB1LGU9bmV3IGgsZz1uZXcgaygxLDEsMSk7Yy5fb25DaGFuZ2UoZnVuY3Rpb24oKXtlLnNldEZyb21FdWxlcihjLAohMSl9KTtlLl9vbkNoYW5nZShmdW5jdGlvbigpe2Muc2V0RnJvbVF1YXRlcm5pb24oZSx2b2lkIDAsITEpfSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmF9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpjfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Z30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgcX0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgcn19KTt0aGlzLm1hdHJpeD1uZXcgcTt0aGlzLm1hdHJpeFdvcmxkPW5ldyBxO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1BLkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMTt0aGlzLmxheWVycz1uZXcgdzt0aGlzLnZpc2libGU9ITA7CnRoaXMucmVjZWl2ZVNoYWRvdz10aGlzLmNhc3RTaGFkb3c9ITE7dGhpcy5mcnVzdHVtQ3VsbGVkPSEwO3RoaXMucmVuZGVyT3JkZXI9MDt0aGlzLnVzZXJEYXRhPXt9fWZ1bmN0aW9uIHkoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTY2VuZSI7dGhpcy5vdmVycmlkZU1hdGVyaWFsPXRoaXMuZm9nPXRoaXMuYmFja2dyb3VuZD1udWxsO3RoaXMuYXV0b1VwZGF0ZT0hMDsidW5kZWZpbmVkIiE9PXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfWZ1bmN0aW9uIHgoYSxjKXt0aGlzLm1pbj12b2lkIDAhPT1hP2E6bmV3IGsoSW5maW5pdHksSW5maW5pdHksSW5maW5pdHkpO3RoaXMubWF4PXZvaWQgMCE9PWM/YzpuZXcgaygtSW5maW5pdHksLUluZmluaXR5LC1JbmZpbml0eSl9ZnVuY3Rpb24gQyhhLGMsZSxnLHQpe3ZhciB2O3ZhciB6PTA7Zm9yKHY9YS5sZW5ndGgtCjM7ejw9djt6Kz0zKXtNZC5mcm9tQXJyYXkoYSx6KTt2YXIgRT1jLmRvdChNZCksRj1lLmRvdChNZCksST1nLmRvdChNZCk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KEUsRixJKSxNYXRoLm1pbihFLEYsSSkpPnQueCpNYXRoLmFicyhNZC54KSt0LnkqTWF0aC5hYnMoTWQueSkrdC56Kk1hdGguYWJzKE1kLnopKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIEcoYSxjKXt0aGlzLmNlbnRlcj12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5yYWRpdXM9dm9pZCAwIT09Yz9jOjB9ZnVuY3Rpb24gRChhLGMpe3RoaXMub3JpZ2luPXZvaWQgMCE9PWE/YTpuZXcgazt0aGlzLmRpcmVjdGlvbj12b2lkIDAhPT1jP2M6bmV3IGt9ZnVuY3Rpb24gQihhLGMsZSl7dGhpcy5hPXZvaWQgMCE9PWE/YTpuZXcgazt0aGlzLmI9dm9pZCAwIT09Yz9jOm5ldyBrO3RoaXMuYz12b2lkIDAhPT1lP2U6bmV3IGt9ZnVuY3Rpb24gSChhLGMsZSl7cmV0dXJuIHZvaWQgMD09PWMmJnZvaWQgMD09PWU/dGhpcy5zZXQoYSk6CnRoaXMuc2V0UkdCKGEsYyxlKX1mdW5jdGlvbiBLKGEsYyxlKXswPmUmJihlKz0xKTsxPGUmJi0tZTtyZXR1cm4gZTwxLzY/YSs2KihjLWEpKmU6LjU+ZT9jOmU8Mi8zP2ErNiooYy1hKSooMi8zLWUpOmF9ZnVuY3Rpb24gTChhKXtyZXR1cm4uMDQwNDU+YT8uMDc3Mzk5MzgwOCphOk1hdGgucG93KC45NDc4NjcyOTg2KmErLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBKKGEpe3JldHVybi4wMDMxMzA4PmE/MTIuOTIqYToxLjA1NSpNYXRoLnBvdyhhLC40MTY2NiktLjA1NX1mdW5jdGlvbiBPKGEsYyxlLGcsdCx2KXt0aGlzLmE9YTt0aGlzLmI9Yzt0aGlzLmM9ZTt0aGlzLm5vcm1hbD1nJiZnLmlzVmVjdG9yMz9nOm5ldyBrO3RoaXMudmVydGV4Tm9ybWFscz1BcnJheS5pc0FycmF5KGcpP2c6W107dGhpcy5jb2xvcj10JiZ0LmlzQ29sb3I/dDpuZXcgSDt0aGlzLnZlcnRleENvbG9ycz1BcnJheS5pc0FycmF5KHQpP3Q6W107dGhpcy5tYXRlcmlhbEluZGV4PXZvaWQgMCE9PXY/djowfQpmdW5jdGlvbiBTKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6amwrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJNYXRlcmlhbCI7dGhpcy5saWdodHM9dGhpcy5mb2c9ITA7dGhpcy5ibGVuZGluZz0xO3RoaXMuc2lkZT0wO3RoaXMudmVydGV4VGFuZ2VudHM9dGhpcy5mbGF0U2hhZGluZz0hMTt0aGlzLnZlcnRleENvbG9ycz0wO3RoaXMub3BhY2l0eT0xO3RoaXMudHJhbnNwYXJlbnQ9ITE7dGhpcy5ibGVuZFNyYz0yMDQ7dGhpcy5ibGVuZERzdD0yMDU7dGhpcy5ibGVuZEVxdWF0aW9uPTEwMDt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhPW51bGw7dGhpcy5kZXB0aEZ1bmM9Mzt0aGlzLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFRlc3Q9ITA7dGhpcy5zdGVuY2lsRnVuYz01MTk7dGhpcy5zdGVuY2lsUmVmPTA7dGhpcy5zdGVuY2lsTWFzaz0KMjU1O3RoaXMuc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbEZhaWw9NzY4MDt0aGlzLnN0ZW5jaWxXcml0ZT0hMTt0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGw7dGhpcy5jbGlwU2hhZG93cz10aGlzLmNsaXBJbnRlcnNlY3Rpb249ITE7dGhpcy5zaGFkb3dTaWRlPW51bGw7dGhpcy5jb2xvcldyaXRlPSEwO3RoaXMucHJlY2lzaW9uPW51bGw7dGhpcy5wb2x5Z29uT2Zmc2V0PSExO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wO3RoaXMuZGl0aGVyaW5nPSExO3RoaXMuYWxwaGFUZXN0PTA7dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITE7dGhpcy50b25lTWFwcGVkPXRoaXMudmlzaWJsZT0hMDt0aGlzLnVzZXJEYXRhPXt9O3RoaXMubmVlZHNVcGRhdGU9ITB9ZnVuY3Rpb24gTihhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoQmFzaWNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5saWdodE1hcD0KdGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBSKGEsYyxlKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5uYW1lPSIiO3RoaXMuYXJyYXk9YTt0aGlzLml0ZW1TaXplPQpjO3RoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC9jOjA7dGhpcy5ub3JtYWxpemVkPSEwPT09ZTt0aGlzLmR5bmFtaWM9ITE7dGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9O3RoaXMudmVyc2lvbj0wfWZ1bmN0aW9uIFgoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBJbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBhYShhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBmYShhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gb2EoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWihhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gY2EoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBJbnQzMkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gamEoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBVaW50MzJBcnJheShhKSwKYyxlKX1mdW5jdGlvbiBiYShhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IEZsb2F0MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGthKGEsYyxlKXtSLmNhbGwodGhpcyxuZXcgRmxvYXQ2NEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gVygpe3RoaXMudmVydGljZXM9W107dGhpcy5ub3JtYWxzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMudXZzPVtdO3RoaXMudXZzMj1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLm1vcnBoVGFyZ2V0cz17fTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBFYShhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuLUluZmluaXR5O2Zvcih2YXIgYz1hWzBdLGU9MSxnPQphLmxlbmd0aDtlPGc7KytlKWFbZV0+YyYmKGM9YVtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTprbCs9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSI7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDpJbmZpbml0eX07dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB5YShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2giO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgTih7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMuZHJhd01vZGU9CjA7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1mdW5jdGlvbiBBYShhLGMsZSxnLHQsdix6LEUpe2lmKG51bGw9PT0oMT09PWMuc2lkZT9nLmludGVyc2VjdFRyaWFuZ2xlKHosdix0LCEwLEUpOmcuaW50ZXJzZWN0VHJpYW5nbGUodCx2LHosMiE9PWMuc2lkZSxFKSkpcmV0dXJuIG51bGw7dmcuY29weShFKTt2Zy5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCk7Yz1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyh2Zyk7cmV0dXJuIGM8ZS5uZWFyfHxjPmUuZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6dmcuY2xvbmUoKSxvYmplY3Q6YX19ZnVuY3Rpb24gRmEoYSxjLGUsZyx0LHYseixFLEYsSSxNKXtOZC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsRik7T2QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LEkpO1BkLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxNKTt0PWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGMubW9ycGhUYXJnZXRzJiZ2JiZ0KXtOaC5zZXQoMCwwLDApO09oLnNldCgwLDAsMCk7ClBoLnNldCgwLDAsMCk7Zm9yKHZhciBQPTAsUT12Lmxlbmd0aDtQPFE7UCsrKXt2YXIgVT10W1BdLFY9dltQXTswIT09VSYmKGlqLmZyb21CdWZmZXJBdHRyaWJ1dGUoVixGKSxqai5mcm9tQnVmZmVyQXR0cmlidXRlKFYsSSksa2ouZnJvbUJ1ZmZlckF0dHJpYnV0ZShWLE0pLE5oLmFkZFNjYWxlZFZlY3Rvcihpai5zdWIoTmQpLFUpLE9oLmFkZFNjYWxlZFZlY3Rvcihqai5zdWIoT2QpLFUpLFBoLmFkZFNjYWxlZFZlY3Rvcihrai5zdWIoUGQpLFUpKX1OZC5hZGQoTmgpO09kLmFkZChPaCk7UGQuYWRkKFBoKX1pZihhPUFhKGEsYyxlLGcsTmQsT2QsUGQsdWYpKXomJihxZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosRikscmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEkpLHNlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixNKSxhLnV2PUIuZ2V0VVYodWYsTmQsT2QsUGQscWUscmUsc2UsbmV3IGYpKSxFJiYocWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLEYpLHJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSwKSSksc2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLE0pLGEudXYyPUIuZ2V0VVYodWYsTmQsT2QsUGQscWUscmUsc2UsbmV3IGYpKSx6PW5ldyBPKEYsSSxNKSxCLmdldE5vcm1hbChOZCxPZCxQZCx6Lm5vcm1hbCksYS5mYWNlPXo7cmV0dXJuIGF9ZnVuY3Rpb24geGEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpsbCs9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJHZW9tZXRyeSI7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9CnRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT10aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBTYShhLGMsZSxnLHQsdil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6dCxkZXB0aFNlZ21lbnRzOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYYShhLGMsZSxnLHQsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhhKGEsYyxlLGcsdCx2KXtmdW5jdGlvbiB6KFYsZWEsZGEscmEscGEscWEsdWEsbmEsdGEsQmEsVGEpe3ZhciBVYT1xYS90YSxDYT11YS9CYSxIYT1xYS8yLERhPXVhLzIsTWE9bmEvMjt1YT10YSsxO3ZhciBkYj1CYSsxLHRiPXFhPTAsS2EsYmIsamI9bmV3IGs7Zm9yKGJiPQowO2JiPGRiO2JiKyspe3ZhciBFYj1iYipDYS1EYTtmb3IoS2E9MDtLYTx1YTtLYSsrKWpiW1ZdPShLYSpVYS1IYSkqcmEsamJbZWFdPUViKnBhLGpiW2RhXT1NYSxJLnB1c2goamIueCxqYi55LGpiLnopLGpiW1ZdPTAsamJbZWFdPTAsamJbZGFdPTA8bmE/MTotMSxNLnB1c2goamIueCxqYi55LGpiLnopLFAucHVzaChLYS90YSksUC5wdXNoKDEtYmIvQmEpLHFhKz0xfWZvcihiYj0wO2JiPEJhO2JiKyspZm9yKEthPTA7S2E8dGE7S2ErKylWPVErS2ErdWEqKGJiKzEpLGVhPVErKEthKzEpK3VhKihiYisxKSxkYT1RKyhLYSsxKSt1YSpiYixGLnB1c2goUStLYSt1YSpiYixWLGRhKSxGLnB1c2goVixlYSxkYSksdGIrPTY7RS5hZGRHcm91cChVLHRiLFRhKTtVKz10YjtRKz1xYX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6YyxkZXB0aDplLHdpZHRoU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czp0LApkZXB0aFNlZ21lbnRzOnZ9O3ZhciBFPXRoaXM7YT1hfHwxO2M9Y3x8MTtlPWV8fDE7Zz1NYXRoLmZsb29yKGcpfHwxO3Q9TWF0aC5mbG9vcih0KXx8MTt2PU1hdGguZmxvb3Iodil8fDE7dmFyIEY9W10sST1bXSxNPVtdLFA9W10sUT0wLFU9MDt6KCJ6IiwieSIsIngiLC0xLC0xLGUsYyxhLHYsdCwwKTt6KCJ6IiwieSIsIngiLDEsLTEsZSxjLC1hLHYsdCwxKTt6KCJ4IiwieiIsInkiLDEsMSxhLGUsYyxnLHYsMik7eigieCIsInoiLCJ5IiwxLC0xLGEsZSwtYyxnLHYsMyk7eigieCIsInkiLCJ6IiwxLC0xLGEsYyxlLGcsdCw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGEsYywtZSxnLHQsNSk7dGhpcy5zZXRJbmRleChGKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShJLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoTSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoUCwyKSl9ZnVuY3Rpb24gdWIoYSl7dmFyIGM9e30sZTtmb3IoZSBpbiBhKXtjW2VdPQp7fTtmb3IodmFyIGcgaW4gYVtlXSl7dmFyIHQ9YVtlXVtnXTtjW2VdW2ddPXQmJih0LmlzQ29sb3J8fHQuaXNNYXRyaXgzfHx0LmlzTWF0cml4NHx8dC5pc1ZlY3RvcjJ8fHQuaXNWZWN0b3IzfHx0LmlzVmVjdG9yNHx8dC5pc1RleHR1cmUpP3QuY2xvbmUoKTpBcnJheS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fX1yZXR1cm4gY31mdW5jdGlvbiBCYihhKXtmb3IodmFyIGM9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz11YihhW2VdKSx0O2Zvcih0IGluIGcpY1t0XT1nW3RdfXJldHVybiBjfWZ1bmN0aW9uIHFiKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIjt0aGlzLmRlZmluZXM9e307dGhpcy51bmlmb3Jtcz17fTt0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Ijt0aGlzLmZyYWdtZW50U2hhZGVyPQoidm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iO3RoaXMubGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMuY2xpcHBpbmc9dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX07dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX07dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMDt0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMTt2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSwKdGhpcy5zZXRWYWx1ZXMoYSkpfWZ1bmN0aW9uIHpiKCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgcTt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiB2YihhLGMsZSxnKXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWE/YTo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOi4xO3RoaXMuZmFyPXZvaWQgMCE9PWc/ZzoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1jP2M6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBHYihhLGMsZSxnKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJlQ2FtZXJhIjt2YXIgdD1uZXcgdmIoOTAsCjEsYSxjKTt0LnVwLnNldCgwLC0xLDApO3QubG9va0F0KG5ldyBrKDEsMCwwKSk7dGhpcy5hZGQodCk7dmFyIHY9bmV3IHZiKDkwLDEsYSxjKTt2LnVwLnNldCgwLC0xLDApO3YubG9va0F0KG5ldyBrKC0xLDAsMCkpO3RoaXMuYWRkKHYpO3ZhciB6PW5ldyB2Yig5MCwxLGEsYyk7ei51cC5zZXQoMCwwLDEpO3oubG9va0F0KG5ldyBrKDAsMSwwKSk7dGhpcy5hZGQoeik7dmFyIEU9bmV3IHZiKDkwLDEsYSxjKTtFLnVwLnNldCgwLDAsLTEpO0UubG9va0F0KG5ldyBrKDAsLTEsMCkpO3RoaXMuYWRkKEUpO3ZhciBGPW5ldyB2Yig5MCwxLGEsYyk7Ri51cC5zZXQoMCwtMSwwKTtGLmxvb2tBdChuZXcgaygwLDAsMSkpO3RoaXMuYWRkKEYpO3ZhciBJPW5ldyB2Yig5MCwxLGEsYyk7SS51cC5zZXQoMCwtMSwwKTtJLmxvb2tBdChuZXcgaygwLDAsLTEpKTt0aGlzLmFkZChJKTtnPWd8fHtmb3JtYXQ6MTAyMixtYWdGaWx0ZXI6MTAwNixtaW5GaWx0ZXI6MTAwNn07dGhpcy5yZW5kZXJUYXJnZXQ9Cm5ldyBPYihlLGUsZyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjt0aGlzLnVwZGF0ZT1mdW5jdGlvbihNLFApe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO3ZhciBRPU0uZ2V0UmVuZGVyVGFyZ2V0KCksVT10aGlzLnJlbmRlclRhcmdldCxWPVUudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7VS50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMTtNLnNldFJlbmRlclRhcmdldChVLDApO00ucmVuZGVyKFAsdCk7TS5zZXRSZW5kZXJUYXJnZXQoVSwxKTtNLnJlbmRlcihQLHYpO00uc2V0UmVuZGVyVGFyZ2V0KFUsMik7TS5yZW5kZXIoUCx6KTtNLnNldFJlbmRlclRhcmdldChVLDMpO00ucmVuZGVyKFAsRSk7TS5zZXRSZW5kZXJUYXJnZXQoVSw0KTtNLnJlbmRlcihQLEYpO1UudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9VjtNLnNldFJlbmRlclRhcmdldChVLDUpO00ucmVuZGVyKFAsSSk7TS5zZXRSZW5kZXJUYXJnZXQoUSl9Owp0aGlzLmNsZWFyPWZ1bmN0aW9uKE0sUCxRLFUpe2Zvcih2YXIgVj1NLmdldFJlbmRlclRhcmdldCgpLGVhPXRoaXMucmVuZGVyVGFyZ2V0LGRhPTA7Nj5kYTtkYSsrKU0uc2V0UmVuZGVyVGFyZ2V0KGVhLGRhKSxNLmNsZWFyKFAsUSxVKTtNLnNldFJlbmRlclRhcmdldChWKX19ZnVuY3Rpb24gT2IoYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKX1mdW5jdGlvbiBBYihhLGMsZSxnLHQsdix6LEUsRixJLE0sUCl7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEksZyx0LE0sUCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUY/RjoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUk/SToxMDAzO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MX1mdW5jdGlvbiBIYihhLGMpe3RoaXMubm9ybWFsPXZvaWQgMCE9PWE/YTpuZXcgaygxLDAsMCk7dGhpcy5jb25zdGFudD12b2lkIDAhPT0KYz9jOjB9ZnVuY3Rpb24gbGMoYSxjLGUsZyx0LHYpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1hP2E6bmV3IEhiLHZvaWQgMCE9PWM/YzpuZXcgSGIsdm9pZCAwIT09ZT9lOm5ldyBIYix2b2lkIDAhPT1nP2c6bmV3IEhiLHZvaWQgMCE9PXQ/dDpuZXcgSGIsdm9pZCAwIT09dj92Om5ldyBIYl19ZnVuY3Rpb24gZWMoKXtmdW5jdGlvbiBhKHQsdil7ITEhPT1lJiYoZyh0LHYpLGMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpKX12YXIgYz1udWxsLGU9ITEsZz1udWxsO3JldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWcmJihjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe2U9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24odCl7Zz10fSxzZXRDb250ZXh0OmZ1bmN0aW9uKHQpe2M9dH19fWZ1bmN0aW9uIFFkKGEpe2Z1bmN0aW9uIGModCx2KXt2YXIgej10LmFycmF5LEU9dC5keW5hbWljPzM1MDQ4OjM1MDQ0LEY9YS5jcmVhdGVCdWZmZXIoKTsKYS5iaW5kQnVmZmVyKHYsRik7YS5idWZmZXJEYXRhKHYseixFKTt0Lm9uVXBsb2FkQ2FsbGJhY2soKTt2PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT92PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3Y9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT92PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Y9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT92PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT92PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih2PTUxMjEpO3JldHVybntidWZmZXI6Rix0eXBlOnYsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjp0LnZlcnNpb259fWZ1bmN0aW9uIGUodCx2LHope3ZhciBFPQp2LmFycmF5LEY9di51cGRhdGVSYW5nZTthLmJpbmRCdWZmZXIoeix0KTshMT09PXYuZHluYW1pYz9hLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUYuY291bnQ/YS5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09Ri5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihhLmJ1ZmZlclN1YkRhdGEoeixGLm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoRi5vZmZzZXQsRi5vZmZzZXQrRi5jb3VudCkpLEYuY291bnQ9LTEpfXZhciBnPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24odCl7dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodD10LmRhdGEpO3JldHVybiBnLmdldCh0KX0sCnJlbW92ZTpmdW5jdGlvbih0KXt0LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih0PXQuZGF0YSk7dmFyIHY9Zy5nZXQodCk7diYmKGEuZGVsZXRlQnVmZmVyKHYuYnVmZmVyKSxnLmRlbGV0ZSh0KSl9LHVwZGF0ZTpmdW5jdGlvbih0LHYpe3QuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHQ9dC5kYXRhKTt2YXIgej1nLmdldCh0KTt2b2lkIDA9PT16P2cuc2V0KHQsYyh0LHYpKTp6LnZlcnNpb248dC52ZXJzaW9uJiYoZSh6LmJ1ZmZlcix0LHYpLHoudmVyc2lvbj10LnZlcnNpb24pfX19ZnVuY3Rpb24gdWQoYSxjLGUsZyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IE5jKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBOYyhhLGMsZSxnKXt2YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlBsYW5lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307YT1hfHwxO2M9Y3x8MTt2YXIgdD1hLzIsdj1jLzI7ZT1NYXRoLmZsb29yKGUpfHwxO2c9TWF0aC5mbG9vcihnKXx8MTt2YXIgej1lKzEsRT1nKzEsRj1hL2UsST1jL2csTT1bXSxQPVtdLFE9W10sVT1bXTtmb3IoYT0wO2E8RTthKyspe3ZhciBWPWEqSS12O2ZvcihjPTA7Yzx6O2MrKylQLnB1c2goYypGLXQsLVYsMCksUS5wdXNoKDAsMCwxKSxVLnB1c2goYy9lKSxVLnB1c2goMS1hL2cpfWZvcihhPTA7YTxnO2ErKylmb3IoYz0wO2M8ZTtjKyspdD1jK3oqKGErMSksdj1jKzEreiooYSsxKSxFPWMrMSt6KmEsTS5wdXNoKGMreiphLHQsRSksTS5wdXNoKHQsdixFKTt0aGlzLnNldEluZGV4KE0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFAsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgYmEoUSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoVSwyKSl9ZnVuY3Rpb24gdmQoYSxjLGUsZyl7ZnVuY3Rpb24gdChQLFEpe2MuYnVmZmVycy5jb2xvci5zZXRDbGVhcihQLnIsUC5nLFAuYixRLGcpfXZhciB2PW5ldyBIKDApLHo9MCxFLEYsST1udWxsLE09MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB2fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFAsUSl7di5zZXQoUCk7ej12b2lkIDAhPT1RP1E6MTt0KHYseil9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbihQKXt6PVA7dCh2LHopfSxyZW5kZXI6ZnVuY3Rpb24oUCxRLFUsVil7UT1RLmJhY2tncm91bmQ7VT1hLnZyOyhVPVUuZ2V0U2Vzc2lvbiYmVS5nZXRTZXNzaW9uKCkpJiYiYWRkaXRpdmUiPT09VS5lbnZpcm9ubWVudEJsZW5kTW9kZSYmKFE9bnVsbCk7bnVsbD09PVE/KHQodix6KSxJPW51bGwsTT0wKTpRJiZRLmlzQ29sb3ImJgoodChRLDEpLFY9ITAsST1udWxsLE09MCk7KGEuYXV0b0NsZWFyfHxWKSYmYS5jbGVhcihhLmF1dG9DbGVhckNvbG9yLGEuYXV0b0NsZWFyRGVwdGgsYS5hdXRvQ2xlYXJTdGVuY2lsKTtpZihRJiYoUS5pc0N1YmVUZXh0dXJlfHxRLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09RiYmKEY9bmV3IHlhKG5ldyBYYSgxLDEsMSksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp1YihPYy5jdWJlLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6T2MuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6T2MuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEYuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxGLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxGLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGVhLGRhLHJhKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihyYS5tYXRyaXhXb3JsZCl9LApPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudEN1YmUudmFsdWV9fSksZS51cGRhdGUoRikpO1Y9US5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT9RLnRleHR1cmU6UTtGLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlPVY7Ri5tYXRlcmlhbC51bmlmb3Jtcy50RmxpcC52YWx1ZT1RLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzE6LTE7aWYoSSE9PVF8fE0hPT1WLnZlcnNpb24pRi5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxJPVEsTT1WLnZlcnNpb247UC51bnNoaWZ0KEYsRi5nZW9tZXRyeSxGLm1hdGVyaWFsLDAsMCxudWxsKX1lbHNlIGlmKFEmJlEuaXNUZXh0dXJlKXt2b2lkIDA9PT1FJiYoRT1uZXcgeWEobmV3IE5jKDIsMiksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOnViKE9jLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpPYy5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlciwKZnJhZ21lbnRTaGFkZXI6T2MuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGUudXBkYXRlKEUpKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1ROyEwPT09US5tYXRyaXhBdXRvVXBkYXRlJiZRLnVwZGF0ZU1hdHJpeCgpO0UubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShRLm1hdHJpeCk7aWYoSSE9PVF8fE0hPT1RLnZlcnNpb24pRS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxJPVEsTT1RLnZlcnNpb247UC51bnNoaWZ0KEUsRS5nZW9tZXRyeSxFLm1hdGVyaWFsLDAsMCxudWxsKX19fX1mdW5jdGlvbiBzYShhLGMsZSxnKXt2YXIgdDt0aGlzLnNldE1vZGU9CmZ1bmN0aW9uKHYpe3Q9dn07dGhpcy5yZW5kZXI9ZnVuY3Rpb24odix6KXthLmRyYXdBcnJheXModCx2LHopO2UudXBkYXRlKHosdCl9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHYseixFKXtpZihnLmlzV2ViR0wyKXt2YXIgRj1hO3ZhciBJPSJkcmF3QXJyYXlzSW5zdGFuY2VkIn1lbHNlIGlmKEY9Yy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxJPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1GKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59RltJXSh0LHosRSx2Lm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShFLHQsdi5tYXhJbnN0YW5jZWRDb3VudCl9fWZ1bmN0aW9uIE5iKGEsYyxlKXtmdW5jdGlvbiBnKHFhKXtpZigiaGlnaHAiPT09CnFhKXtpZigwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO3FhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1xYSYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgdCx2PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJmEgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LHo9dm9pZCAwIT09ZS5wcmVjaXNpb24/ZS5wcmVjaXNpb246ImhpZ2hwIixFPWcoeik7RSE9PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6Iix6LCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsRSwiaW5zdGVhZC4iKSwKej1FKTtlPSEwPT09ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9YS5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBGPWEuZ2V0UGFyYW1ldGVyKDM1NjYwKSxJPWEuZ2V0UGFyYW1ldGVyKDMzNzkpLE09YS5nZXRQYXJhbWV0ZXIoMzQwNzYpLFA9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFE9YS5nZXRQYXJhbWV0ZXIoMzYzNDcpLFU9YS5nZXRQYXJhbWV0ZXIoMzYzNDgpLFY9YS5nZXRQYXJhbWV0ZXIoMzYzNDkpLGVhPTA8RixkYT12fHwhIWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLHJhPWVhJiZkYSxwYT12P2EuZ2V0UGFyYW1ldGVyKDM2MTgzKTowO3JldHVybntpc1dlYkdMMjp2LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10KXJldHVybiB0O3ZhciBxYT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7cmV0dXJuIHQ9bnVsbCE9PXFhP2EuZ2V0UGFyYW1ldGVyKHFhLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk6MH0sCmdldE1heFByZWNpc2lvbjpnLHByZWNpc2lvbjp6LGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZSxtYXhUZXh0dXJlczpFLG1heFZlcnRleFRleHR1cmVzOkYsbWF4VGV4dHVyZVNpemU6SSxtYXhDdWJlbWFwU2l6ZTpNLG1heEF0dHJpYnV0ZXM6UCxtYXhWZXJ0ZXhVbmlmb3JtczpRLG1heFZhcnlpbmdzOlUsbWF4RnJhZ21lbnRVbmlmb3JtczpWLHZlcnRleFRleHR1cmVzOmVhLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpkYSxmbG9hdFZlcnRleFRleHR1cmVzOnJhLG1heFNhbXBsZXM6cGF9fWZ1bmN0aW9uIHljKCl7ZnVuY3Rpb24gYSgpe0kudmFsdWUhPT1nJiYoSS52YWx1ZT1nLEkubmVlZHNVcGRhdGU9MDx0KTtlLm51bVBsYW5lcz10O2UubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gYyhNLFAsUSxVKXt2YXIgVj1udWxsIT09TT9NLmxlbmd0aDowLGVhPW51bGw7aWYoMCE9PVYpe2VhPUkudmFsdWU7aWYoITAhPT1VfHxudWxsPT09ZWEpe1U9USs0KlY7UD1QLm1hdHJpeFdvcmxkSW52ZXJzZTsKRi5nZXROb3JtYWxNYXRyaXgoUCk7aWYobnVsbD09PWVhfHxlYS5sZW5ndGg8VSllYT1uZXcgRmxvYXQzMkFycmF5KFUpO2ZvcihVPTA7VSE9PVY7KytVLFErPTQpRS5jb3B5KE1bVV0pLmFwcGx5TWF0cml4NChQLEYpLEUubm9ybWFsLnRvQXJyYXkoZWEsUSksZWFbUSszXT1FLmNvbnN0YW50fUkudmFsdWU9ZWE7SS5uZWVkc1VwZGF0ZT0hMH1lLm51bVBsYW5lcz1WO3JldHVybiBlYX12YXIgZT10aGlzLGc9bnVsbCx0PTAsdj0hMSx6PSExLEU9bmV3IEhiLEY9bmV3IHIsST17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07dGhpcy51bmlmb3JtPUk7dGhpcy5udW1JbnRlcnNlY3Rpb249dGhpcy5udW1QbGFuZXM9MDt0aGlzLmluaXQ9ZnVuY3Rpb24oTSxQLFEpe3ZhciBVPTAhPT1NLmxlbmd0aHx8UHx8MCE9PXR8fHY7dj1QO2c9YyhNLFEsMCk7dD1NLmxlbmd0aDtyZXR1cm4gVX07dGhpcy5iZWdpblNoYWRvd3M9ZnVuY3Rpb24oKXt6PSEwO2MobnVsbCl9O3RoaXMuZW5kU2hhZG93cz0KZnVuY3Rpb24oKXt6PSExO2EoKX07dGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihNLFAsUSxVLFYsZWEpe2lmKCF2fHxudWxsPT09TXx8MD09PU0ubGVuZ3RofHx6JiYhUSl6P2MobnVsbCk6YSgpO2Vsc2V7UT16PzA6dDt2YXIgZGE9NCpRLHJhPVYuY2xpcHBpbmdTdGF0ZXx8bnVsbDtJLnZhbHVlPXJhO3JhPWMoTSxVLGRhLGVhKTtmb3IoTT0wO00hPT1kYTsrK00pcmFbTV09Z1tNXTtWLmNsaXBwaW5nU3RhdGU9cmE7dGhpcy5udW1JbnRlcnNlY3Rpb249UD90aGlzLm51bVBsYW5lczowO3RoaXMubnVtUGxhbmVzKz1RfX19ZnVuY3Rpb24gZGQoYSl7dmFyIGM9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT1jW2VdKXJldHVybiBjW2VdO3N3aXRjaChlKXtjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjp2YXIgZz1hLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7CmJyZWFrO2Nhc2UgIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6Zz1hLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6Zz1hLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fAphLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6Zz1hLmdldEV4dGVuc2lvbihlKX1udWxsPT09ZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK2UrIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKTtyZXR1cm4gY1tlXT1nfX19ZnVuY3Rpb24gd2QoYSxjLGUpe2Z1bmN0aW9uIGcoRSl7dmFyIEY9RS50YXJnZXQ7RT12LmdldChGKTtudWxsIT09RS5pbmRleCYmYy5yZW1vdmUoRS5pbmRleCk7Zm9yKHZhciBJIGluIEUuYXR0cmlidXRlcyljLnJlbW92ZShFLmF0dHJpYnV0ZXNbSV0pO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7di5kZWxldGUoRik7aWYoST16LmdldChFKSljLnJlbW92ZShJKSx6LmRlbGV0ZShFKTtlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gdChFKXt2YXIgRj1bXSxJPUUuaW5kZXgsTT1FLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PQpJKXt2YXIgUD1JLmFycmF5O0k9SS52ZXJzaW9uO009MDtmb3IodmFyIFE9UC5sZW5ndGg7TTxRO00rPTMpe3ZhciBVPVBbTSswXSxWPVBbTSsxXSxlYT1QW00rMl07Ri5wdXNoKFUsVixWLGVhLGVhLFUpfX1lbHNlIGZvcihQPU0uYXJyYXksST1NLnZlcnNpb24sTT0wLFE9UC5sZW5ndGgvMy0xO008UTtNKz0zKVU9TSswLFY9TSsxLGVhPU0rMixGLnB1c2goVSxWLFYsZWEsZWEsVSk7Rj1uZXcgKDY1NTM1PEVhKEYpP2phOlopKEYsMSk7Ri52ZXJzaW9uPUk7Yy51cGRhdGUoRiwzNDk2Myk7KFA9ei5nZXQoRSkpJiZjLnJlbW92ZShQKTt6LnNldChFLEYpfXZhciB2PW5ldyBXZWFrTWFwLHo9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEYpe3ZhciBJPXYuZ2V0KEYpO2lmKEkpcmV0dXJuIEk7Ri5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtGLmlzQnVmZmVyR2VvbWV0cnk/ST1GOkYuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUYuX2J1ZmZlckdlb21ldHJ5JiYoRi5fYnVmZmVyR2VvbWV0cnk9CihuZXcgdmEpLnNldEZyb21PYmplY3QoRSkpLEk9Ri5fYnVmZmVyR2VvbWV0cnkpO3Yuc2V0KEYsSSk7ZS5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBJfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEY9RS5pbmRleCxJPUUuYXR0cmlidXRlcztudWxsIT09RiYmYy51cGRhdGUoRiwzNDk2Myk7Zm9yKHZhciBNIGluIEkpYy51cGRhdGUoSVtNXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoTSBpbiBFKXtGPUVbTV07ST0wO2Zvcih2YXIgUD1GLmxlbmd0aDtJPFA7SSsrKWMudXBkYXRlKEZbSV0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBGPXouZ2V0KEUpO2lmKEYpe3ZhciBJPUUuaW5kZXg7bnVsbCE9PUkmJkYudmVyc2lvbjxJLnZlcnNpb24mJnQoRSl9ZWxzZSB0KEUpO3JldHVybiB6LmdldChFKX19fWZ1bmN0aW9uIHdnKGEsYyxlLGcpe3ZhciB0LHYsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7dD1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt2PUUudHlwZTt6PUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEYpe2EuZHJhd0VsZW1lbnRzKHQsRix2LEUqeik7ZS51cGRhdGUoRix0KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxGLEkpe2lmKGcuaXNXZWJHTDIpe3ZhciBNPWE7dmFyIFA9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihNPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUD0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1NKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufU1bUF0odCxJLHYsRip6LEUubWF4SW5zdGFuY2VkQ291bnQpO2UudXBkYXRlKEksdCxFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIG1sKCl7dmFyIGE9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmEscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXthLmZyYW1lKys7YS5jYWxscz0wO2EudHJpYW5nbGVzPTA7YS5wb2ludHM9MDthLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7Zz1nfHwxO2EuY2FsbHMrKztzd2l0Y2goZSl7Y2FzZSA0OmEudHJpYW5nbGVzKz1jLzMqZzticmVhaztjYXNlIDU6Y2FzZSA2OmEudHJpYW5nbGVzKz1nKihjLTIpO2JyZWFrO2Nhc2UgMTphLmxpbmVzKz1jLzIqZzticmVhaztjYXNlIDM6YS5saW5lcys9ZyooYy0xKTticmVhaztjYXNlIDI6YS5saW5lcys9ZypjO2JyZWFrO2Nhc2UgMDphLnBvaW50cys9ZypjO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLAplKX19fX1mdW5jdGlvbiBubChhLGMpe3JldHVybiBNYXRoLmFicyhjWzFdKS1NYXRoLmFicyhhWzFdKX1mdW5jdGlvbiBvbChhKXt2YXIgYz17fSxlPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihnLHQsdix6KXt2YXIgRT1nLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxGPUUubGVuZ3RoO2c9Y1t0LmlkXTtpZih2b2lkIDA9PT1nKXtnPVtdO2Zvcih2YXIgST0wO0k8RjtJKyspZ1tJXT1bSSwwXTtjW3QuaWRdPWd9dmFyIE09di5tb3JwaFRhcmdldHMmJnQubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3Y9di5tb3JwaE5vcm1hbHMmJnQubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoST0wO0k8RjtJKyspe3ZhciBQPWdbSV07MCE9PVBbMV0mJihNJiZ0LnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0kpLHYmJnQucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSSkpfWZvcihJPTA7STxGO0krKylQPWdbSV0sUFswXT1JLFBbMV09RVtJXTtnLnNvcnQobmwpOwpmb3IoST0wOzg+STtJKyspe2lmKFA9Z1tJXSlpZihFPVBbMF0sRj1QWzFdKXtNJiZ0LmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0ksTVtFXSk7diYmdC5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitJLHZbRV0pO2VbSV09Rjtjb250aW51ZX1lW0ldPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGEsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZSl9fX1mdW5jdGlvbiBwbChhLGMpe3ZhciBlPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyl7dmFyIHQ9Yy5yZW5kZXIuZnJhbWUsdj1nLmdlb21ldHJ5LHo9YS5nZXQoZyx2KTtlW3ouaWRdIT09dCYmKHYuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KGcpLGEudXBkYXRlKHopLGVbei5pZF09dCk7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gZWQoYSxjLGUsZyx0LHYseixFLEYsSSl7YT12b2lkIDAhPT1hP2E6W107bC5jYWxsKHRoaXMsYSx2b2lkIDAhPT1jP2M6MzAxLGUsZyx0LHYsCnZvaWQgMCE9PXo/ejoxMDIyLEUsRixJKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIHRlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gdWUoYSxjLGUsZyl7bC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmUsZGVwdGg6Z307dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiB2ZShhLGMsZSl7dmFyIGc9YVswXTtpZigwPj1nfHwwPGcpcmV0dXJuIGE7dmFyIHQ9YyplLHY9bGpbdF07dm9pZCAwPT09diYmKHY9bmV3IEZsb2F0MzJBcnJheSh0KSxsalt0XT12KTtpZigwIT09Yylmb3IoZy50b0FycmF5KHYsCjApLGc9MSx0PTA7ZyE9PWM7KytnKXQrPWUsYVtnXS50b0FycmF5KHYsdCk7cmV0dXJuIHZ9ZnVuY3Rpb24gdWMoYSxjKXtpZihhLmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKylpZihhW2VdIT09Y1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBwYyhhLGMpe2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKylhW2VdPWNbZV19ZnVuY3Rpb24gbWooYSxjKXt2YXIgZT1ualtjXTt2b2lkIDA9PT1lJiYoZT1uZXcgSW50MzJBcnJheShjKSxualtjXT1lKTtmb3IodmFyIGc9MDtnIT09YzsrK2cpZVtnXT1hLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gZX1mdW5jdGlvbiBxbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7ZVswXSE9PWMmJihhLnVuaWZvcm0xZih0aGlzLmFkZHIsYyksZVswXT1jKX1mdW5jdGlvbiBybChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09CmMueSlhLnVuaWZvcm0yZih0aGlzLmFkZHIsYy54LGMueSksZVswXT1jLngsZVsxXT1jLnl9ZWxzZSB1YyhlLGMpfHwoYS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKSxwYyhlLGMpKX1mdW5jdGlvbiBzbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHxlWzJdIT09Yy56KWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLngsYy55LGMueiksZVswXT1jLngsZVsxXT1jLnksZVsyXT1jLnp9ZWxzZSBpZih2b2lkIDAhPT1jLnIpe2lmKGVbMF0hPT1jLnJ8fGVbMV0hPT1jLmd8fGVbMl0hPT1jLmIpYS51bmlmb3JtM2YodGhpcy5hZGRyLGMucixjLmcsYy5iKSxlWzBdPWMucixlWzFdPWMuZyxlWzJdPWMuYn1lbHNlIHVjKGUsYyl8fChhLnVuaWZvcm0zZnYodGhpcy5hZGRyLGMpLHBjKGUsYykpfWZ1bmN0aW9uIHRsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1jLngpe2lmKGVbMF0hPT1jLnh8fGVbMV0hPT1jLnl8fAplWzJdIT09Yy56fHxlWzNdIT09Yy53KWEudW5pZm9ybTRmKHRoaXMuYWRkcixjLngsYy55LGMueixjLncpLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56LGVbM109Yy53fWVsc2UgdWMoZSxjKXx8KGEudW5pZm9ybTRmdih0aGlzLmFkZHIsYykscGMoZSxjKSl9ZnVuY3Rpb24gdWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3VjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGMpLHBjKGUsYykpOnVjKGUsZyl8fChvai5zZXQoZyksYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxvaikscGMoZSxnKSl9ZnVuY3Rpb24gdmwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3VjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGMpLHBjKGUsYykpOnVjKGUsZyl8fChwai5zZXQoZyksYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxwaikscGMoZSxnKSl9CmZ1bmN0aW9uIHdsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz91YyhlLGMpfHwoYS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxjKSxwYyhlLGMpKTp1YyhlLGcpfHwocWouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEscWopLHBjKGUsZykpfWZ1bmN0aW9uIHhsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHQ9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXQmJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsdCksZ1swXT10KTtlLnNhZmVTZXRUZXh0dXJlMkQoY3x8cmosdCl9ZnVuY3Rpb24geWwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUsdD1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09dCYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcix0KSxnWzBdPXQpO2Uuc2V0VGV4dHVyZTJEQXJyYXkoY3x8emwsdCl9ZnVuY3Rpb24gQWwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUsdD1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKZ1swXSE9PXQmJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsdCksZ1swXT10KTtlLnNldFRleHR1cmUzRChjfHxCbCx0KX1mdW5jdGlvbiBDbChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSx0PWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT10JiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHQpLGdbMF09dCk7ZS5zYWZlU2V0VGV4dHVyZUN1YmUoY3x8c2osdCl9ZnVuY3Rpb24gRGwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gRWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3VjKGUsYyl8fChhLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpLHBjKGUsYykpfWZ1bmN0aW9uIEZsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTt1YyhlLGMpfHwoYS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKSxwYyhlLGMpKX1mdW5jdGlvbiBHbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7dWMoZSxjKXx8KGEudW5pZm9ybTRpdih0aGlzLmFkZHIsCmMpLHBjKGUsYykpfWZ1bmN0aW9uIEhsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIHFsO2Nhc2UgMzU2NjQ6cmV0dXJuIHJsO2Nhc2UgMzU2NjU6cmV0dXJuIHNsO2Nhc2UgMzU2NjY6cmV0dXJuIHRsO2Nhc2UgMzU2NzQ6cmV0dXJuIHVsO2Nhc2UgMzU2NzU6cmV0dXJuIHZsO2Nhc2UgMzU2NzY6cmV0dXJuIHdsO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4geGw7Y2FzZSAzNTY3OTpyZXR1cm4gQWw7Y2FzZSAzNTY4MDpyZXR1cm4gQ2w7Y2FzZSAzNjI4OTpyZXR1cm4geWw7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIERsO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gRWw7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBGbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIEdsfX1mdW5jdGlvbiBJbChhLGMpe2EudW5pZm9ybTFmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gSmwoYSxjKXthLnVuaWZvcm0xaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIEtsKGEsCmMpe2EudW5pZm9ybTJpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gTGwoYSxjKXthLnVuaWZvcm0zaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIE1sKGEsYyl7YS51bmlmb3JtNGl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBObChhLGMpe2M9dmUoYyx0aGlzLnNpemUsMik7YS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBPbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsMyk7YS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBQbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtNGZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBRbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiBSbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsOSk7YS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiBTbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsMTYpO2EudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGMpfWZ1bmN0aW9uIFRsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCx0PW1qKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcix0KTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlMkQoY1thXXx8cmosdFthXSl9ZnVuY3Rpb24gVWwoYSxjLGUpe3ZhciBnPWMubGVuZ3RoLHQ9bWooZSxnKTthLnVuaWZvcm0xaXYodGhpcy5hZGRyLHQpO2ZvcihhPTA7YSE9PWc7KythKWUuc2FmZVNldFRleHR1cmVDdWJlKGNbYV18fHNqLHRbYV0pfWZ1bmN0aW9uIFZsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIElsO2Nhc2UgMzU2NjQ6cmV0dXJuIE5sO2Nhc2UgMzU2NjU6cmV0dXJuIE9sO2Nhc2UgMzU2NjY6cmV0dXJuIFBsO2Nhc2UgMzU2NzQ6cmV0dXJuIFFsO2Nhc2UgMzU2NzU6cmV0dXJuIFJsO2Nhc2UgMzU2NzY6cmV0dXJuIFNsO2Nhc2UgMzU2Nzg6cmV0dXJuIFRsO2Nhc2UgMzU2ODA6cmV0dXJuIFVsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBKbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIEtsOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIExsO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gTWx9fWZ1bmN0aW9uIFdsKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPUhsKGMudHlwZSl9ZnVuY3Rpb24gdGooYSxjLGUpe3RoaXMuaWQ9YTt0aGlzLmFkZHI9ZTt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1jLnNpemU7dGhpcy5zZXRWYWx1ZT1WbChjLnR5cGUpfWZ1bmN0aW9uIHVqKGEpe3RoaXMuaWQ9YTt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiB2aihhLGMpe2Euc2VxLnB1c2goYyk7YS5tYXBbYy5pZF09Y31mdW5jdGlvbiBYbChhLGMsZSl7dmFyIGc9YS5uYW1lLHQ9Zy5sZW5ndGg7Zm9yKFFoLmxhc3RJbmRleD0wOzspe3ZhciB2PVFoLmV4ZWMoZyksej1RaC5sYXN0SW5kZXgsRT12WzFdLEY9dlszXTsiXSI9PT12WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09Rnx8IlsiPT09RiYmeisyPT09dCl7dmooZSwKdm9pZCAwPT09Rj9uZXcgV2woRSxhLGMpOm5ldyB0aihFLGEsYykpO2JyZWFrfWVsc2Ugdj1lLm1hcFtFXSx2b2lkIDA9PT12JiYodj1uZXcgdWooRSksdmooZSx2KSksZT12fX1mdW5jdGlvbiB4ZChhLGMpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgZT1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcxOCksZz0wO2c8ZTsrK2cpe3ZhciB0PWEuZ2V0QWN0aXZlVW5pZm9ybShjLGcpO1hsKHQsYS5nZXRVbmlmb3JtTG9jYXRpb24oYyx0Lm5hbWUpLHRoaXMpfX1mdW5jdGlvbiB3aihhLGMsZSl7Yz1hLmNyZWF0ZVNoYWRlcihjKTthLnNoYWRlclNvdXJjZShjLGUpO2EuY29tcGlsZVNoYWRlcihjKTtyZXR1cm4gY31mdW5jdGlvbiBZbChhKXthPWEuc3BsaXQoIlxuIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXT1jKzErIjogIithW2NdO3JldHVybiBhLmpvaW4oIlxuIil9ZnVuY3Rpb24geGooYSl7c3dpdGNoKGEpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2EpO319ZnVuY3Rpb24geWooYSxjLGUpe3ZhciBnPWEuZ2V0U2hhZGVyUGFyYW1ldGVyKGMsMzU3MTMpLHQ9YS5nZXRTaGFkZXJJbmZvTG9nKGMpLnRyaW0oKTtyZXR1cm4gZyYmIiI9PT10PyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmUrIlxuIit0K1lsKGEuZ2V0U2hhZGVyU291cmNlKGMpKX1mdW5jdGlvbiB4ZyhhLGMpe2M9eGooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2NbMF0rIlRvTGluZWFyIitjWzFdKyI7IH0ifWZ1bmN0aW9uIFpsKGEsYyl7Yz14aihjKTtyZXR1cm4idmVjNCAiK2ErIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitjWzBdK2NbMV0rIjsgfSJ9ZnVuY3Rpb24gJGwoYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOmM9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmM9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6Yz0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmM9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmM9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2MpO31yZXR1cm4idmVjMyAiK2ErIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrYysiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBhbShhLGMsZSl7YT1hfHx7fTtyZXR1cm5bYS5kZXJpdmF0aXZlc3x8Yy5lbnZNYXBDdWJlVVZ8fGMuYnVtcE1hcHx8Yy50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGMuY2xlYXJjb2F0Tm9ybWFsTWFwfHxjLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGEuZnJhZ0RlcHRofHxjLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYS5kcmF3QnVmZmVycyYmZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYS5zaGFkZXJUZXh0dXJlTE9EfHxjLmVudk1hcCkmJmUuZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcih2Zikuam9pbigiXG4iKX0KZnVuY3Rpb24gYm0oYSl7dmFyIGM9W10sZTtmb3IoZSBpbiBhKXt2YXIgZz1hW2VdOyExIT09ZyYmYy5wdXNoKCIjZGVmaW5lICIrZSsiICIrZyl9cmV0dXJuIGMuam9pbigiXG4iKX1mdW5jdGlvbiBjbShhLGMpe2Zvcih2YXIgZT17fSxnPWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcihjLDM1NzIxKSx0PTA7dDxnO3QrKyl7dmFyIHY9YS5nZXRBY3RpdmVBdHRyaWIoYyx0KS5uYW1lO2Vbdl09YS5nZXRBdHRyaWJMb2NhdGlvbihjLHYpfXJldHVybiBlfWZ1bmN0aW9uIHZmKGEpe3JldHVybiIiIT09YX1mdW5jdGlvbiB6aihhLGMpe3JldHVybiBhLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csYy5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGMubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxjLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csYy5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmMubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csYy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxjLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csYy5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gQWooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcy1jLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIFJoKGEpe3JldHVybiBhLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihjLGUpe2M9cmJbZV07aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2UrIlx4M2UiKTtyZXR1cm4gUmgoYyl9KX0KZnVuY3Rpb24gQmooYSl7cmV0dXJuIGEucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGMsZSxnLHQpe2M9IiI7Zm9yKGU9cGFyc2VJbnQoZSk7ZTxwYXJzZUludChnKTtlKyspYys9dC5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitlKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxlKTtyZXR1cm4gY30pfWZ1bmN0aW9uIGRtKGEsYyxlLGcsdCx2LHope3ZhciBFPWEuZ2V0Q29udGV4dCgpLEY9Zy5kZWZpbmVzLEk9dC52ZXJ0ZXhTaGFkZXIsTT10LmZyYWdtZW50U2hhZGVyLFA9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09di5zaGFkb3dNYXBUeXBlP1A9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXYuc2hhZG93TWFwVHlwZT9QPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXYuc2hhZG93TWFwVHlwZSYmKFA9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgUT0iRU5WTUFQX1RZUEVfQ1VCRSIsVT0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsVj0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih2LmVudk1hcCl7c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlE9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlE9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlE9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlE9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0OlU9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChnLmNvbWJpbmUpe2Nhc2UgMDpWPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpWPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Vj0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBlYT0KMDxhLmdhbW1hRmFjdG9yP2EuZ2FtbWFGYWN0b3I6MSxkYT16LmlzV2ViR0wyPyIiOmFtKGcuZXh0ZW5zaW9ucyx2LGMpLHJhPWJtKEYpLHBhPUUuY3JlYXRlUHJvZ3JhbSgpO2cuaXNSYXdTaGFkZXJNYXRlcmlhbD8oRj1bcmFdLmZpbHRlcih2Zikuam9pbigiXG4iKSwwPEYubGVuZ3RoJiYoRis9IlxuIiksYz1bZGEscmFdLmZpbHRlcih2Zikuam9pbigiXG4iKSwwPGMubGVuZ3RoJiYoYys9IlxuIikpOihGPVsicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0Lm5hbWUscmEsdi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIrZWEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdi5tYXhCb25lcyx2LnVzZUZvZyYmCnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVToiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5kaXNwbGFjZW1lbnRNYXAmJnYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHYubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHYubW9ycGhOb3JtYWxzJiYhMT09PXYuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitQOiIiLHYuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHZmKS5qb2luKCJcbiIpLGM9W2RhLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXYucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0Lm5hbWUscmEsdi5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdi5hbHBoYVRlc3QrKHYuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIrZWEsdi51c2VGb2cmJnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrUToiIix2LmVudk1hcD8iI2RlZmluZSAiK1U6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitWOiIiLHYubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix2LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHYuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdi52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix2LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHYuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1A6IiIsdi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChnLmV4dGVuc2lvbnMmJmcuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx2LmVudk1hcCkmJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09di50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT12LnRvbmVNYXBwaW5nP3JiLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXYudG9uZU1hcHBpbmc/JGwoInRvbmVNYXBwaW5nIix2LnRvbmVNYXBwaW5nKToiIix2LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHYub3V0cHV0RW5jb2Rpbmd8fHYubWFwRW5jb2Rpbmd8fHYubWF0Y2FwRW5jb2Rpbmd8fHYuZW52TWFwRW5jb2Rpbmd8fAp2LmVtaXNzaXZlTWFwRW5jb2Rpbmc/cmIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdi5tYXBFbmNvZGluZz94ZygibWFwVGV4ZWxUb0xpbmVhciIsdi5tYXBFbmNvZGluZyk6IiIsdi5tYXRjYXBFbmNvZGluZz94ZygibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdi5tYXRjYXBFbmNvZGluZyk6IiIsdi5lbnZNYXBFbmNvZGluZz94ZygiZW52TWFwVGV4ZWxUb0xpbmVhciIsdi5lbnZNYXBFbmNvZGluZyk6IiIsdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3hnKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdi5vdXRwdXRFbmNvZGluZz9abCgibGluZWFyVG9PdXRwdXRUZXhlbCIsdi5vdXRwdXRFbmNvZGluZyk6IiIsdi5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2cuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcih2Zikuam9pbigiXG4iKSk7ST1SaChJKTtJPXpqKEksdik7ST1BaihJLHYpO009UmgoTSk7TT16aihNLAp2KTtNPUFqKE0sdik7ST1CaihJKTtNPUJqKE0pO3ouaXNXZWJHTDImJiFnLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFA9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLGcuaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUkubWF0Y2goUCkmJm51bGwhPT1NLm1hdGNoKFApJiYoej0hMCxJPUkucmVwbGFjZShQLCIiKSxNPU0ucmVwbGFjZShQLCIiKSksRj0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0YsYz1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrYyk7TT1jK007ST13aihFLDM1NjMzLEYrSSk7TT13aihFLDM1NjMyLE0pO0UuYXR0YWNoU2hhZGVyKHBhLEkpO0UuYXR0YWNoU2hhZGVyKHBhLE0pO3ZvaWQgMCE9PWcuaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihwYSwwLGcuaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT12Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHBhKTtpZihhLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXthPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocGEpLnRyaW0oKTt2PUUuZ2V0U2hhZGVySW5mb0xvZyhJKS50cmltKCk7ej1FLmdldFNoYWRlckluZm9Mb2coTSkudHJpbSgpO1E9UD0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNCkpUD0hMSxVPXlqKEUsSSwidmVydGV4IiksVj15aihFLE0sImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixhLFUsVik7ZWxzZSBpZigiIiE9PWEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGEpO2Vsc2UgaWYoIiI9PT12fHwiIj09PXopUT0hMTtRJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UCxtYXRlcmlhbDpnLHByb2dyYW1Mb2c6YSx2ZXJ0ZXhTaGFkZXI6e2xvZzp2LHByZWZpeDpGfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmN9fSl9RS5kZWxldGVTaGFkZXIoSSk7RS5kZWxldGVTaGFkZXIoTSk7dmFyIHFhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1xYSYmKHFhPW5ldyB4ZChFLHBhKSk7cmV0dXJuIHFhfTt2YXIgdWE7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dWEmJih1YT1jbShFLHBhKSk7cmV0dXJuIHVhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHBhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9dC5uYW1lO3RoaXMuaWQ9ZW0rKzt0aGlzLmNvZGU9ZTt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1wYTt0aGlzLnZlcnRleFNoYWRlcj1JO3RoaXMuZnJhZ21lbnRTaGFkZXI9TTtyZXR1cm4gdGhpc31mdW5jdGlvbiBmbShhLGMsZSl7ZnVuY3Rpb24gZyhGKXtGPUYuc2tlbGV0b24uYm9uZXM7aWYoZS5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBJPU1hdGgubWluKE1hdGguZmxvb3IoKGUubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEYubGVuZ3RoKTtyZXR1cm4gSTxGLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitGLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0krIi4iKSwwKTpJfWZ1bmN0aW9uIHQoRixJKXtpZihGKUYuaXNUZXh0dXJlP009Ri5lbmNvZGluZzpGLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksTT1GLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIE09M0UzOzNFMz09PU0mJkkmJihNPTMwMDcpO3JldHVybiBNfXZhciB2PVtdLHo9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihGLEksTSxQLFEsVSxWKXt2YXIgZWE9eltGLnR5cGVdLGRhPVYuaXNTa2lubmVkTWVzaD9nKFYpOjAscmE9ZS5wcmVjaXNpb247bnVsbCE9PUYucHJlY2lzaW9uJiYocmE9ZS5nZXRNYXhQcmVjaXNpb24oRi5wcmVjaXNpb24pLHJhIT09Ri5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixGLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgcGE9YS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6ZWEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZS52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzp0KHBhP3BhLnRleHR1cmU6bnVsbCxhLmdhbW1hT3V0cHV0KSxtYXA6ISFGLm1hcCxtYXBFbmNvZGluZzp0KEYubWFwLGEuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRi5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6dChGLm1hdGNhcCwKYS5nYW1tYUlucHV0KSxlbnZNYXA6ISFGLmVudk1hcCxlbnZNYXBNb2RlOkYuZW52TWFwJiZGLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnQoRi5lbnZNYXAsYS5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFGLmVudk1hcCYmKDMwNj09PUYuZW52TWFwLm1hcHBpbmd8fDMwNz09PUYuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRi5saWdodE1hcCxhb01hcDohIUYuYW9NYXAsZW1pc3NpdmVNYXA6ISFGLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6dChGLmVtaXNzaXZlTWFwLGEuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUYuYnVtcE1hcCxub3JtYWxNYXA6ISFGLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ri5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ri5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUYuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUYuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFGLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFGLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUYuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFGLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRi5ncmFkaWVudE1hcCxzaGVlbjohIUYuc2hlZW4sY29tYmluZTpGLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ri5ub3JtYWxNYXAmJkYudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkYudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUYubWFwfHwhIUYuYnVtcE1hcHx8ISFGLm5vcm1hbE1hcHx8ISFGLnNwZWN1bGFyTWFwfHwhIUYuYWxwaGFNYXB8fCEhRi5lbWlzc2l2ZU1hcHx8ISFGLnJvdWdobmVzc01hcHx8ISFGLm1ldGFsbmVzc01hcHx8ISFGLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFQLHVzZUZvZzpGLmZvZyxmb2dFeHAyOlAmJlAuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkYuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkYuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpGLnNraW5uaW5nJiYwPGRhLG1heEJvbmVzOmRhLHVzZVZlcnRleFRleHR1cmU6ZS5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpGLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ri5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmEubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczphLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6SS5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6SS5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpJLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkkucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6SS5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6SS5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6SS5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpJLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpRLG51bUNsaXBJbnRlcnNlY3Rpb246VSxkaXRoZXJpbmc6Ri5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDphLnNoYWRvd01hcC5lbmFibGVkJiZWLnJlY2VpdmVTaGFkb3cmJjA8TS5sZW5ndGgsc2hhZG93TWFwVHlwZTphLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkYudG9uZU1hcHBlZD9hLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6YS5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ri5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkYuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1GLnNpZGUsZmxpcFNpZGVkOjE9PT1GLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUYuZGVwdGhQYWNraW5nP0YuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihGLEkpe3ZhciBNPVtdO0kuc2hhZGVySUQ/TS5wdXNoKEkuc2hhZGVySUQpOihNLnB1c2goRi5mcmFnbWVudFNoYWRlciksCk0ucHVzaChGLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUYuZGVmaW5lcylmb3IodmFyIFAgaW4gRi5kZWZpbmVzKU0ucHVzaChQKSxNLnB1c2goRi5kZWZpbmVzW1BdKTtmb3IoUD0wO1A8RS5sZW5ndGg7UCsrKU0ucHVzaChJW0VbUF1dKTtNLnB1c2goRi5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7TS5wdXNoKGEuZ2FtbWFPdXRwdXQpO00ucHVzaChhLmdhbW1hRmFjdG9yKTtyZXR1cm4gTS5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRixJLE0sUCl7Zm9yKHZhciBRLFU9MCxWPXYubGVuZ3RoO1U8VjtVKyspe3ZhciBlYT12W1VdO2lmKGVhLmNvZGU9PT1QKXtRPWVhOysrUS51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVEmJihRPW5ldyBkbShhLGMsUCxGLEksTSxlKSx2LnB1c2goUSkpO3JldHVybiBRfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEYpezA9PT0tLUYudXNlZFRpbWVzJiYodlt2LmluZGV4T2YoRildPXZbdi5sZW5ndGgtMV0sCnYucG9wKCksRi5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXZ9ZnVuY3Rpb24gZ20oKXt2YXIgYT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBlPWEuZ2V0KGMpO3ZvaWQgMD09PWUmJihlPXt9LGEuc2V0KGMsZSkpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYyl7YS5kZWxldGUoYyl9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7YS5nZXQoYylbZV09Z30sZGlzcG9zZTpmdW5jdGlvbigpe2E9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBobShhLGMpe3JldHVybiBhLmdyb3VwT3JkZXIhPT1jLmdyb3VwT3JkZXI/YS5ncm91cE9yZGVyLWMuZ3JvdXBPcmRlcjphLnJlbmRlck9yZGVyIT09Yy5yZW5kZXJPcmRlcj9hLnJlbmRlck9yZGVyLWMucmVuZGVyT3JkZXI6YS5wcm9ncmFtIT09Yy5wcm9ncmFtP2EucHJvZ3JhbS5pZC1jLnByb2dyYW0uaWQ6YS5tYXRlcmlhbC5pZCE9PWMubWF0ZXJpYWwuaWQ/YS5tYXRlcmlhbC5pZC1jLm1hdGVyaWFsLmlkOmEueiE9PQpjLno/YS56LWMuejphLmlkLWMuaWR9ZnVuY3Rpb24gaW0oYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEueiE9PWMuej9jLnotYS56OmEuaWQtYy5pZH1mdW5jdGlvbiBDaigpe2Z1bmN0aW9uIGEoeixFLEYsSSxNLFApe3ZhciBRPWNbZV07dm9pZCAwPT09UT8oUT17aWQ6ei5pZCxvYmplY3Q6eixnZW9tZXRyeTpFLG1hdGVyaWFsOkYscHJvZ3JhbTpGLnByb2dyYW18fHYsZ3JvdXBPcmRlcjpJLHJlbmRlck9yZGVyOnoucmVuZGVyT3JkZXIsejpNLGdyb3VwOlB9LGNbZV09USk6KFEuaWQ9ei5pZCxRLm9iamVjdD16LFEuZ2VvbWV0cnk9RSxRLm1hdGVyaWFsPUYsUS5wcm9ncmFtPUYucHJvZ3JhbXx8dixRLmdyb3VwT3JkZXI9SSxRLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUS56PU0sUS5ncm91cD1QKTsKZSsrO3JldHVybiBRfXZhciBjPVtdLGU9MCxnPVtdLHQ9W10sdj17aWQ6LTF9O3JldHVybntvcGFxdWU6Zyx0cmFuc3BhcmVudDp0LGluaXQ6ZnVuY3Rpb24oKXtlPTA7Zy5sZW5ndGg9MDt0Lmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHosRSxGLEksTSxQKXt6PWEoeixFLEYsSSxNLFApOyghMD09PUYudHJhbnNwYXJlbnQ/dDpnKS5wdXNoKHopfSx1bnNoaWZ0OmZ1bmN0aW9uKHosRSxGLEksTSxQKXt6PWEoeixFLEYsSSxNLFApOyghMD09PUYudHJhbnNwYXJlbnQ/dDpnKS51bnNoaWZ0KHopfSxzb3J0OmZ1bmN0aW9uKCl7MTxnLmxlbmd0aCYmZy5zb3J0KGhtKTsxPHQubGVuZ3RoJiZ0LnNvcnQoaW0pfX19ZnVuY3Rpb24gam0oKXtmdW5jdGlvbiBhKGUpe2U9ZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7dmFyIHQ9Yy5nZXQoZSk7aWYodm9pZCAwPT09CnQpe3ZhciB2PW5ldyBDajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyx2KTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2Ugdj10LmdldChnKSx2b2lkIDA9PT12JiYodj1uZXcgQ2osdC5zZXQoZyx2KSk7cmV0dXJuIHZ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24ga20oKXt2YXIgYT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWFbYy5pZF0pcmV0dXJuIGFbYy5pZF07c3dpdGNoKGMudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGU9e2RpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSCxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGZ9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IGssZGlyZWN0aW9uOm5ldyBrLGNvbG9yOm5ldyBILGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJQb2ludExpZ2h0IjplPXtwb3NpdGlvbjpuZXcgayxjb2xvcjpuZXcgSCxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgayxza3lDb2xvcjpuZXcgSCxncm91bmRDb2xvcjpuZXcgSH07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6ZT17Y29sb3I6bmV3IEgscG9zaXRpb246bmV3IGssaGFsZldpZHRoOm5ldyBrLGhhbGZIZWlnaHQ6bmV3IGt9fXJldHVybiBhW2MuaWRdPWV9fX1mdW5jdGlvbiBsbShhLGMpe3JldHVybihjLmNhc3RTaGFkb3c/MTowKS0oYS5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gbW0oKXtmb3IodmFyIGE9Cm5ldyBrbSxjPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGU9MDs5PmU7ZSsrKWMucHJvYmUucHVzaChuZXcgayk7dmFyIGc9bmV3IGssdD1uZXcgcSx2PW5ldyBxO3JldHVybntzZXR1cDpmdW5jdGlvbih6LApFLEYpe2Zvcih2YXIgST0wLE09MCxQPTAsUT0wOzk+UTtRKyspYy5wcm9iZVtRXS5zZXQoMCwwLDApO3ZhciBVPUU9MCxWPTAsZWE9MCxkYT0wLHJhPTAscGE9MCxxYT0wO0Y9Ri5tYXRyaXhXb3JsZEludmVyc2U7ei5zb3J0KGxtKTtRPTA7Zm9yKHZhciB1YT16Lmxlbmd0aDtRPHVhO1ErKyl7dmFyIG5hPXpbUV0sdGE9bmEuY29sb3IsQmE9bmEuaW50ZW5zaXR5LFRhPW5hLmRpc3RhbmNlLFVhPW5hLnNoYWRvdyYmbmEuc2hhZG93Lm1hcD9uYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihuYS5pc0FtYmllbnRMaWdodClJKz10YS5yKkJhLE0rPXRhLmcqQmEsUCs9dGEuYipCYTtlbHNlIGlmKG5hLmlzTGlnaHRQcm9iZSlmb3IoVWE9MDs5PlVhO1VhKyspYy5wcm9iZVtVYV0uYWRkU2NhbGVkVmVjdG9yKG5hLnNoLmNvZWZmaWNpZW50c1tVYV0sQmEpO2Vsc2UgaWYobmEuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgQ2E9YS5nZXQobmEpO0NhLmNvbG9yLmNvcHkobmEuY29sb3IpLm11bHRpcGx5U2NhbGFyKG5hLmludGVuc2l0eSk7CkNhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpO2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG5hLnRhcmdldC5tYXRyaXhXb3JsZCk7Q2EuZGlyZWN0aW9uLnN1YihnKTtDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEYpO2lmKENhLnNoYWRvdz1uYS5jYXN0U2hhZG93KUJhPW5hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1VYSxjLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPW5hLnNoYWRvdy5tYXRyaXgscmErKztjLmRpcmVjdGlvbmFsW0VdPUNhO0UrK31lbHNlIGlmKG5hLmlzU3BvdExpZ2h0KXtDYT1hLmdldChuYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG5hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRik7Q2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIoQmEpOwpDYS5kaXN0YW5jZT1UYTtDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG5hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihuYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihGKTtDYS5jb25lQ29zPU1hdGguY29zKG5hLmFuZ2xlKTtDYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhuYS5hbmdsZSooMS1uYS5wZW51bWJyYSkpO0NhLmRlY2F5PW5hLmRlY2F5O2lmKENhLnNoYWRvdz1uYS5jYXN0U2hhZG93KUJhPW5hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5zcG90U2hhZG93TWFwW1ZdPVVhLGMuc3BvdFNoYWRvd01hdHJpeFtWXT1uYS5zaGFkb3cubWF0cml4LHFhKys7Yy5zcG90W1ZdPUNhO1YrK31lbHNlIGlmKG5hLmlzUmVjdEFyZWFMaWdodClDYT1hLmdldChuYSksCkNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKSxDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpLENhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKSx2LmlkZW50aXR5KCksdC5jb3B5KG5hLm1hdHJpeFdvcmxkKSx0LnByZW11bHRpcGx5KEYpLHYuZXh0cmFjdFJvdGF0aW9uKHQpLENhLmhhbGZXaWR0aC5zZXQoLjUqbmEud2lkdGgsMCwwKSxDYS5oYWxmSGVpZ2h0LnNldCgwLC41Km5hLmhlaWdodCwwKSxDYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHYpLENhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHYpLGMucmVjdEFyZWFbZWFdPUNhLGVhKys7ZWxzZSBpZihuYS5pc1BvaW50TGlnaHQpe0NhPWEuZ2V0KG5hKTtDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpO0NhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKTtDYS5jb2xvci5jb3B5KG5hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihuYS5pbnRlbnNpdHkpOwpDYS5kaXN0YW5jZT1uYS5kaXN0YW5jZTtDYS5kZWNheT1uYS5kZWNheTtpZihDYS5zaGFkb3c9bmEuY2FzdFNoYWRvdylCYT1uYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLENhLnNoYWRvd0NhbWVyYU5lYXI9QmEuY2FtZXJhLm5lYXIsQ2Euc2hhZG93Q2FtZXJhRmFyPUJhLmNhbWVyYS5mYXIsYy5wb2ludFNoYWRvd01hcFtVXT1VYSxjLnBvaW50U2hhZG93TWF0cml4W1VdPW5hLnNoYWRvdy5tYXRyaXgscGErKztjLnBvaW50W1VdPUNhO1UrK31lbHNlIG5hLmlzSGVtaXNwaGVyZUxpZ2h0JiYoQ2E9YS5nZXQobmEpLENhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpLENhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRiksQ2EuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLENhLnNreUNvbG9yLmNvcHkobmEuY29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSwKQ2EuZ3JvdW5kQ29sb3IuY29weShuYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQmEpLGMuaGVtaVtkYV09Q2EsZGErKyl9Yy5hbWJpZW50WzBdPUk7Yy5hbWJpZW50WzFdPU07Yy5hbWJpZW50WzJdPVA7ej1jLmhhc2g7aWYoei5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fHoucG9pbnRMZW5ndGghPT1VfHx6LnNwb3RMZW5ndGghPT1WfHx6LnJlY3RBcmVhTGVuZ3RoIT09ZWF8fHouaGVtaUxlbmd0aCE9PWRhfHx6Lm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXJhfHx6Lm51bVBvaW50U2hhZG93cyE9PXBhfHx6Lm51bVNwb3RTaGFkb3dzIT09cWEpYy5kaXJlY3Rpb25hbC5sZW5ndGg9RSxjLnNwb3QubGVuZ3RoPVYsYy5yZWN0QXJlYS5sZW5ndGg9ZWEsYy5wb2ludC5sZW5ndGg9VSxjLmhlbWkubGVuZ3RoPWRhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXJhLGMucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hcC5sZW5ndGg9cWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnJhLGMucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cWEsei5kaXJlY3Rpb25hbExlbmd0aD1FLHoucG9pbnRMZW5ndGg9VSx6LnNwb3RMZW5ndGg9Vix6LnJlY3RBcmVhTGVuZ3RoPWVhLHouaGVtaUxlbmd0aD1kYSx6Lm51bURpcmVjdGlvbmFsU2hhZG93cz1yYSx6Lm51bVBvaW50U2hhZG93cz1wYSx6Lm51bVNwb3RTaGFkb3dzPXFhLGMudmVyc2lvbj1ubSsrfSxzdGF0ZTpjfX1mdW5jdGlvbiBEaigpe3ZhciBhPW5ldyBtbSxjPVtdLGU9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtjLmxlbmd0aD0wO2UubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpjLHNoYWRvd3NBcnJheTplLGxpZ2h0czphfSxzZXR1cExpZ2h0czpmdW5jdGlvbihnKXthLnNldHVwKGMsZSxnKX0scHVzaExpZ2h0OmZ1bmN0aW9uKGcpe2MucHVzaChnKX0scHVzaFNoYWRvdzpmdW5jdGlvbihnKXtlLnB1c2goZyl9fX1mdW5jdGlvbiBvbSgpe2Z1bmN0aW9uIGEoZSl7ZT0KZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7aWYoITE9PT1jLmhhcyhlKSl7dmFyIHQ9bmV3IERqO2Muc2V0KGUsbmV3IFdlYWtNYXApO2MuZ2V0KGUpLnNldChnLHQpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSl9ZWxzZSExPT09Yy5nZXQoZSkuaGFzKGcpPyh0PW5ldyBEaixjLmdldChlKS5zZXQoZyx0KSk6dD1jLmdldChlKS5nZXQoZyk7cmV0dXJuIHR9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24geWQoYSl7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHpkKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBrO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIEVqKGEsYyxlKXtmdW5jdGlvbiBnKHRhLEJhKXt2YXIgVGE9Yy51cGRhdGUocmEpO1YudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnRhLm1hcC50ZXh0dXJlO1YudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO1YudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXBQYXNzKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxWLHJhLG51bGwpO2VhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXRhLm1hcFBhc3MudGV4dHVyZTtlYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXRhLm1hcFNpemU7ZWEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXApO2EuY2xlYXIoKTthLnJlbmRlckJ1ZmZlckRpcmVjdChCYSxudWxsLFRhLGVhLHJhLG51bGwpfWZ1bmN0aW9uIHQodGEsQmEsVGEsVWEsQ2EsSGEpe3ZhciBEYT10YS5nZW9tZXRyeTt2YXIgTWE9TTt2YXIgZGI9dGEuY3VzdG9tRGVwdGhNYXRlcmlhbDtUYS5pc1BvaW50TGlnaHQmJihNYT1QLGRiPXRhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpkYj9NYT1kYjooZGI9ITEsQmEubW9ycGhUYXJnZXRzJiYoRGEmJkRhLmlzQnVmZmVyR2VvbWV0cnk/ZGI9RGEubW9ycGhBdHRyaWJ1dGVzJiZEYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpEYSYmRGEuaXNHZW9tZXRyeSYmKGRiPURhLm1vcnBoVGFyZ2V0cyYmMDxEYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdGEuaXNTa2lubmVkTWVzaCYmITE9PT1CYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix0YSksdGE9dGEuaXNTa2lubmVkTWVzaCYmQmEuc2tpbm5pbmcsRGE9MCxkYiYmKERhfD0xKSx0YSYmKERhfD0yKSxNYT1NYVtEYV0pO2EubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihEYT1NYS51dWlkLApkYj1CYS51dWlkLHRhPVFbRGFdLHZvaWQgMD09PXRhJiYodGE9e30sUVtEYV09dGEpLERhPXRhW2RiXSx2b2lkIDA9PT1EYSYmKERhPU1hLmNsb25lKCksdGFbZGJdPURhKSxNYT1EYSk7TWEudmlzaWJsZT1CYS52aXNpYmxlO01hLndpcmVmcmFtZT1CYS53aXJlZnJhbWU7TWEuc2lkZT0zPT09SGE/bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOkJhLnNpZGU6bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOlVbQmEuc2lkZV07TWEuY2xpcFNoYWRvd3M9QmEuY2xpcFNoYWRvd3M7TWEuY2xpcHBpbmdQbGFuZXM9QmEuY2xpcHBpbmdQbGFuZXM7TWEuY2xpcEludGVyc2VjdGlvbj1CYS5jbGlwSW50ZXJzZWN0aW9uO01hLndpcmVmcmFtZUxpbmV3aWR0aD1CYS53aXJlZnJhbWVMaW5ld2lkdGg7TWEubGluZXdpZHRoPUJhLmxpbmV3aWR0aDtUYS5pc1BvaW50TGlnaHQmJk1hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihNYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVGEubWF0cml4V29ybGQpLApNYS5uZWFyRGlzdGFuY2U9VWEsTWEuZmFyRGlzdGFuY2U9Q2EpO3JldHVybiBNYX1mdW5jdGlvbiB2KHRhLEJhLFRhLFVhLENhKXtpZighMSE9PXRhLnZpc2libGUpe2lmKHRhLmxheWVycy50ZXN0KEJhLmxheWVycykmJih0YS5pc01lc2h8fHRhLmlzTGluZXx8dGEuaXNQb2ludHMpJiYodGEuY2FzdFNoYWRvd3x8dGEucmVjZWl2ZVNoYWRvdyYmMz09PUNhKSYmKCF0YS5mcnVzdHVtQ3VsbGVkfHx6LmludGVyc2VjdHNPYmplY3QodGEpKSl7dGEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVGEubWF0cml4V29ybGRJbnZlcnNlLHRhLm1hdHJpeFdvcmxkKTt2YXIgSGE9Yy51cGRhdGUodGEpLERhPXRhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRGEpKWZvcih2YXIgTWE9SGEuZ3JvdXBzLGRiPTAsdGI9TWEubGVuZ3RoO2RiPHRiO2RiKyspe3ZhciBLYT1NYVtkYl0sYmI9RGFbS2EubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJihiYj10KHRhLGJiLFVhLFRhLm5lYXIsClRhLmZhcixDYSksYS5yZW5kZXJCdWZmZXJEaXJlY3QoVGEsbnVsbCxIYSxiYix0YSxLYSkpfWVsc2UgRGEudmlzaWJsZSYmKGJiPXQodGEsRGEsVWEsVGEubmVhcixUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsbnVsbCkpfXRhPXRhLmNoaWxkcmVuO0hhPTA7Zm9yKERhPXRhLmxlbmd0aDtIYTxEYTtIYSsrKXYodGFbSGFdLEJhLFRhLFVhLENhKX19dmFyIHo9bmV3IGxjLEU9bmV3IGYsRj1uZXcgZixJPW5ldyBwLE09QXJyYXkoNCksUD1BcnJheSg0KSxRPXt9LFU9ezA6MSwxOjAsMjoyfSxWPW5ldyBxYih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZn0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLAplYT1WLmNsb25lKCk7ZWEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBkYT1uZXcgdmE7ZGEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciByYT1uZXcgeWEoZGEsVik7Zm9yKGRhPTA7NCE9PWRhOysrZGEpe3ZhciBwYT0wIT09KGRhJjEpLHFhPTAhPT0oZGEmMiksdWE9bmV3IHlkKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtNW2RhXT11YTtwYT1uZXcgemQoe21vcnBoVGFyZ2V0czpwYSxza2lubmluZzpxYX0pO1BbZGFdPXBhfXZhciBuYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih0YSxCYSxUYSl7aWYoITEhPT1uYS5lbmFibGVkJiYoITEhPT1uYS5hdXRvVXBkYXRlfHwhMSE9PW5hLm5lZWRzVXBkYXRlKSYmCjAhPT10YS5sZW5ndGgpe3ZhciBVYT1hLmdldFJlbmRlclRhcmdldCgpLENhPWEuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxIYT1hLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRGE9YS5zdGF0ZTtEYS5zZXRCbGVuZGluZygwKTtEYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0RhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RGEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgTWE9MCxkYj10YS5sZW5ndGg7TWE8ZGI7TWErKyl7dmFyIHRiPXRhW01hXSxLYT10Yi5zaGFkb3c7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHRiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KEthLm1hcFNpemUpO3ZhciBiYj1LYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGJiKTtGLmNvcHkoS2EubWFwU2l6ZSk7aWYoRS54PmV8fEUueT5lKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmUmJihGLng9TWF0aC5mbG9vcihlL2JiLngpLEUueD1GLngqYmIueCxLYS5tYXBTaXplLng9Ri54KSxFLnk+ZSYmKEYueT1NYXRoLmZsb29yKGUvYmIueSksRS55PUYueSpiYi55LEthLm1hcFNpemUueT1GLnkpO251bGwhPT1LYS5tYXB8fEthLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGJiPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EubWFwUGFzcz1uZXcgbShFLngsRS55LGJiKSxLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09S2EubWFwJiYoYmI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxLYS5tYXA9bmV3IG0oRS54LEUueSxiYiksS2EubWFwLnRleHR1cmUubmFtZT10Yi5uYW1lKyIuc2hhZG93TWFwIixLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYS5zZXRSZW5kZXJUYXJnZXQoS2EubWFwKTthLmNsZWFyKCk7YmI9S2EuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgamI9MDtqYjxiYjtqYisrKXt2YXIgRWI9S2EuZ2V0Vmlld3BvcnQoamIpO0kuc2V0KEYueCpFYi54LEYueSpFYi55LEYueCpFYi56LEYueSpFYi53KTtEYS52aWV3cG9ydChJKTtLYS51cGRhdGVNYXRyaWNlcyh0YixUYSxqYik7ej1LYS5nZXRGcnVzdHVtKCk7dihCYSxUYSxLYS5jYW1lcmEsdGIsdGhpcy50eXBlKX1LYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGcoS2EsVGEpfX1uYS5uZWVkc1VwZGF0ZT0hMTthLnNldFJlbmRlclRhcmdldChVYSxDYSxIYSl9fX1mdW5jdGlvbiBwbShhLGMsZSxnKXtmdW5jdGlvbiB0KGlhLEdhLExhKXt2YXIgbmI9bmV3IFVpbnQ4QXJyYXkoNCksVmE9YS5jcmVhdGVUZXh0dXJlKCk7YS5iaW5kVGV4dHVyZShpYSxWYSk7YS50ZXhQYXJhbWV0ZXJpKGlhLDEwMjQxLDk3MjgpO2EudGV4UGFyYW1ldGVyaShpYSwKMTAyNDAsOTcyOCk7Zm9yKGlhPTA7aWE8TGE7aWErKylhLnRleEltYWdlMkQoR2EraWEsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxuYik7cmV0dXJuIFZhfWZ1bmN0aW9uIHYoaWEsR2Epe3JhW2lhXT0xOzA9PT1wYVtpYV0mJihhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGlhKSxwYVtpYV09MSk7cWFbaWFdIT09R2EmJigoZy5pc1dlYkdMMj9hOmMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW2cuaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShpYSxHYSkscWFbaWFdPUdhKX1mdW5jdGlvbiB6KGlhKXshMCE9PXVhW2lhXSYmKGEuZW5hYmxlKGlhKSx1YVtpYV09ITApfWZ1bmN0aW9uIEUoaWEpeyExIT09dWFbaWFdJiYoYS5kaXNhYmxlKGlhKSx1YVtpYV09ITEpfWZ1bmN0aW9uIEYoaWEsR2EsTGEsbmIsVmEsaWIsa2IsUWEpe2lmKDA9PT1pYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLApCYT0hMCksNSE9PWlhKXtpZihpYSE9PVRhfHxRYSE9PXRiKXtpZigxMDAhPT1VYXx8MTAwIT09RGEpYS5ibGVuZEVxdWF0aW9uKDMyNzc0KSxEYT1VYT0xMDA7aWYoUWEpc3dpdGNoKGlhKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmEuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsaWEpfWVsc2Ugc3dpdGNoKGlhKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6YS5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmEuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGlhKX1kYj1NYT1IYT1DYT1udWxsO1RhPWlhO3RiPVFhfX1lbHNle1ZhPVZhfHxHYTtpYj1pYnx8TGE7a2I9a2J8fG5iO2lmKEdhIT09VWF8fFZhIT09RGEpYS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZS5jb252ZXJ0KEdhKSxlLmNvbnZlcnQoVmEpKSxVYT1HYSxEYT1WYTtpZihMYSE9PUNhfHxuYiE9PUhhfHxpYiE9PU1hfHxrYiE9PWRiKWEuYmxlbmRGdW5jU2VwYXJhdGUoZS5jb252ZXJ0KExhKSxlLmNvbnZlcnQobmIpLGUuY29udmVydChpYiksZS5jb252ZXJ0KGtiKSksQ2E9TGEsSGE9bmIsTWE9aWIsZGI9a2I7VGE9aWE7dGI9bnVsbH19ZnVuY3Rpb24gSShpYSl7S2EhPT1pYSYmKGlhP2EuZnJvbnRGYWNlKDIzMDQpOmEuZnJvbnRGYWNlKDIzMDUpLEthPWlhKX1mdW5jdGlvbiBNKGlhKXswIT09aWE/KHooMjg4NCksaWEhPT1iYiYmKDE9PT1pYT9hLmN1bGxGYWNlKDEwMjkpOgoyPT09aWE/YS5jdWxsRmFjZSgxMDI4KTphLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtiYj1pYX1mdW5jdGlvbiBQKGlhLEdhLExhKXtpZihpYSl7aWYoeigzMjgyMyksRWIhPT1HYXx8eGIhPT1MYSlhLnBvbHlnb25PZmZzZXQoR2EsTGEpLEViPUdhLHhiPUxhfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gUShpYSl7dm9pZCAwPT09aWEmJihpYT0zMzk4NCtoYS0xKTt6YSE9PWlhJiYoYS5hY3RpdmVUZXh0dXJlKGlhKSx6YT1pYSl9dmFyIFU9bmV3IGZ1bmN0aW9uKCl7dmFyIGlhPSExLEdhPW5ldyBwLExhPW51bGwsbmI9bmV3IHAoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oVmEpe0xhPT09VmF8fGlhfHwoYS5jb2xvck1hc2soVmEsVmEsVmEsVmEpLExhPVZhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFZhKXtpYT1WYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oVmEsaWIsa2IsUWEsZWIpeyEwPT09ZWImJihWYSo9UWEsaWIqPVFhLGtiKj1RYSk7R2Euc2V0KFZhLGliLGtiLFFhKTsKITE9PT1uYi5lcXVhbHMoR2EpJiYoYS5jbGVhckNvbG9yKFZhLGliLGtiLFFhKSxuYi5jb3B5KEdhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7aWE9ITE7TGE9bnVsbDtuYi5zZXQoLTEsMCwwLDApfX19LFY9bmV3IGZ1bmN0aW9uKCl7dmFyIGlhPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFZhKXtWYT96KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oVmEpe0dhPT09VmF8fGlhfHwoYS5kZXB0aE1hc2soVmEpLEdhPVZhKX0sc2V0RnVuYzpmdW5jdGlvbihWYSl7aWYoTGEhPT1WYSl7aWYoVmEpc3dpdGNoKFZhKXtjYXNlIDA6YS5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6YS5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6YS5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6YS5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6YS5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6YS5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6YS5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmEuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDphLmRlcHRoRnVuYyg1MTUpfWVsc2UgYS5kZXB0aEZ1bmMoNTE1KTtMYT1WYX19LHNldExvY2tlZDpmdW5jdGlvbihWYSl7aWE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhKXtuYiE9PVZhJiYoYS5jbGVhckRlcHRoKFZhKSxuYj1WYSl9LHJlc2V0OmZ1bmN0aW9uKCl7aWE9ITE7bmI9TGE9R2E9bnVsbH19fSxlYT1uZXcgZnVuY3Rpb24oKXt2YXIgaWE9ITEsR2E9bnVsbCxMYT1udWxsLG5iPW51bGwsVmE9bnVsbCxpYj1udWxsLGtiPW51bGwsUWE9bnVsbCxlYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKG1iKXtpYXx8KG1iP3ooMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obWIpe0dhPT09bWJ8fGlhfHwoYS5zdGVuY2lsTWFzayhtYiksR2E9bWIpfSxzZXRGdW5jOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihMYSE9PW1ifHxuYiE9PXBifHxWYSE9PXNiKWEuc3RlbmNpbEZ1bmMobWIscGIsCnNiKSxMYT1tYixuYj1wYixWYT1zYn0sc2V0T3A6ZnVuY3Rpb24obWIscGIsc2Ipe2lmKGliIT09bWJ8fGtiIT09cGJ8fFFhIT09c2IpYS5zdGVuY2lsT3AobWIscGIsc2IpLGliPW1iLGtiPXBiLFFhPXNifSxzZXRMb2NrZWQ6ZnVuY3Rpb24obWIpe2lhPW1ifSxzZXRDbGVhcjpmdW5jdGlvbihtYil7ZWIhPT1tYiYmKGEuY2xlYXJTdGVuY2lsKG1iKSxlYj1tYil9LHJlc2V0OmZ1bmN0aW9uKCl7aWE9ITE7ZWI9UWE9a2I9aWI9VmE9bmI9TGE9R2E9bnVsbH19fSxkYT1hLmdldFBhcmFtZXRlcigzNDkyMSkscmE9bmV3IFVpbnQ4QXJyYXkoZGEpLHBhPW5ldyBVaW50OEFycmF5KGRhKSxxYT1uZXcgVWludDhBcnJheShkYSksdWE9e30sbmE9bnVsbCx0YT1udWxsLEJhPW51bGwsVGE9bnVsbCxVYT1udWxsLENhPW51bGwsSGE9bnVsbCxEYT1udWxsLE1hPW51bGwsZGI9bnVsbCx0Yj0hMSxLYT1udWxsLGJiPW51bGwsamI9bnVsbCxFYj1udWxsLHhiPW51bGwsaGE9YS5nZXRQYXJhbWV0ZXIoMzU2NjEpLAptYT0hMTtkYT0wO2RhPWEuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09ZGEuaW5kZXhPZigiV2ViR0wiKT8oZGE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoZGEpWzFdKSxtYT0xPD1kYSk6LTEhPT1kYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGRhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhkYSlbMV0pLG1hPTI8PWRhKTt2YXIgemE9bnVsbCxKYT17fSxZYT1uZXcgcCxOYT1uZXcgcCxjYj17fTtjYlszNTUzXT10KDM1NTMsMzU1MywxKTtjYlszNDA2N109dCgzNDA2NywzNDA2OSw2KTtVLnNldENsZWFyKDAsMCwwLDEpO1Yuc2V0Q2xlYXIoMSk7ZWEuc2V0Q2xlYXIoMCk7eigyOTI5KTtWLnNldEZ1bmMoMyk7SSghMSk7TSgxKTt6KDI4ODQpO0YoMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlUsZGVwdGg6VixzdGVuY2lsOmVhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgaWE9MCxHYT1yYS5sZW5ndGg7aWE8R2E7aWErKylyYVtpYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihpYSl7dihpYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp2LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBpYT0wLEdhPXBhLmxlbmd0aDtpYSE9PUdhOysraWEpcGFbaWFdIT09cmFbaWFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaWEpLHBhW2lhXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1uYSYmKG5hPVtdLGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBpYT1hLmdldFBhcmFtZXRlcigzNDQ2NyksR2E9MDtHYTxpYS5sZW5ndGg7R2ErKyluYS5wdXNoKGlhW0dhXSk7CnJldHVybiBuYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihpYSl7cmV0dXJuIHRhIT09aWE/KGEudXNlUHJvZ3JhbShpYSksdGE9aWEsITApOiExfSxzZXRCbGVuZGluZzpGLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGlhLEdhKXsyPT09aWEuc2lkZT9FKDI4ODQpOnooMjg4NCk7dmFyIExhPTE9PT1pYS5zaWRlO0dhJiYoTGE9IUxhKTtJKExhKTsxPT09aWEuYmxlbmRpbmcmJiExPT09aWEudHJhbnNwYXJlbnQ/RigwKTpGKGlhLmJsZW5kaW5nLGlhLmJsZW5kRXF1YXRpb24saWEuYmxlbmRTcmMsaWEuYmxlbmREc3QsaWEuYmxlbmRFcXVhdGlvbkFscGhhLGlhLmJsZW5kU3JjQWxwaGEsaWEuYmxlbmREc3RBbHBoYSxpYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1Yuc2V0RnVuYyhpYS5kZXB0aEZ1bmMpO1Yuc2V0VGVzdChpYS5kZXB0aFRlc3QpO1Yuc2V0TWFzayhpYS5kZXB0aFdyaXRlKTtVLnNldE1hc2soaWEuY29sb3JXcml0ZSk7R2E9aWEuc3RlbmNpbFdyaXRlO2VhLnNldFRlc3QoR2EpO0dhJiYKKGVhLnNldEZ1bmMoaWEuc3RlbmNpbEZ1bmMsaWEuc3RlbmNpbFJlZixpYS5zdGVuY2lsTWFzayksZWEuc2V0T3AoaWEuc3RlbmNpbEZhaWwsaWEuc3RlbmNpbFpGYWlsLGlhLnN0ZW5jaWxaUGFzcykpO1AoaWEucG9seWdvbk9mZnNldCxpYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGlhLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpJLHNldEN1bGxGYWNlOk0sc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGlhKXtpYSE9PWpiJiYobWEmJmEubGluZVdpZHRoKGlhKSxqYj1pYSl9LHNldFBvbHlnb25PZmZzZXQ6UCxzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihpYSl7aWE/eigzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlEsYmluZFRleHR1cmU6ZnVuY3Rpb24oaWEsR2Epe251bGw9PT16YSYmUSgpO3ZhciBMYT1KYVt6YV07dm9pZCAwPT09TGEmJihMYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEphW3phXT1MYSk7aWYoTGEudHlwZSE9PWlhfHxMYS50ZXh0dXJlIT09CkdhKWEuYmluZFRleHR1cmUoaWEsR2F8fGNiW2lhXSksTGEudHlwZT1pYSxMYS50ZXh0dXJlPUdhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXthLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChpYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGlhKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChpYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGlhKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTNELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChpYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGlhKX19LHNjaXNzb3I6ZnVuY3Rpb24oaWEpeyExPT09WWEuZXF1YWxzKGlhKSYmKGEuc2Npc3NvcihpYS54LGlhLnksaWEueixpYS53KSxZYS5jb3B5KGlhKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGlhKXshMT09PQpOYS5lcXVhbHMoaWEpJiYoYS52aWV3cG9ydChpYS54LGlhLnksaWEueixpYS53KSxOYS5jb3B5KGlhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBpYT0wO2lhPHBhLmxlbmd0aDtpYSsrKTE9PT1wYVtpYV0mJihhLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpYSkscGFbaWFdPTApO3VhPXt9O3phPW5hPW51bGw7SmE9e307YmI9S2E9VGE9dGE9bnVsbDtVLnJlc2V0KCk7Vi5yZXNldCgpO2VhLnJlc2V0KCl9fX1mdW5jdGlvbiBxbShhLGMsZSxnLHQsdix6KXtmdW5jdGlvbiBFKGhhLG1hKXtyZXR1cm4gYmI/bmV3IE9mZnNjcmVlbkNhbnZhcyhoYSxtYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRihoYSxtYSx6YSxKYSl7dmFyIFlhPTE7aWYoaGEud2lkdGg+SmF8fGhhLmhlaWdodD5KYSlZYT1KYS9NYXRoLm1heChoYS53aWR0aCxoYS5oZWlnaHQpO2lmKDE+WWF8fCEwPT09bWEpe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZoYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmaGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gSmE9bWE/aGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3IsbWE9SmEoWWEqaGEud2lkdGgpLFlhPUphKFlhKmhhLmhlaWdodCksdm9pZCAwPT09S2EmJihLYT1FKG1hLFlhKSksemE9emE/RShtYSxZYSk6S2EsemEud2lkdGg9bWEsemEuaGVpZ2h0PVlhLHphLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGhhLDAsMCxtYSxZYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitoYS53aWR0aCsieCIraGEuaGVpZ2h0KyIpIHRvICgiK21hKyJ4IitZYSsiKS4iKSwKemE7ImRhdGEiaW4gaGEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitoYS53aWR0aCsieCIraGEuaGVpZ2h0KyIpLiIpfXJldHVybiBoYX1mdW5jdGlvbiBJKGhhKXtyZXR1cm4gaGIuaXNQb3dlck9mVHdvKGhhLndpZHRoKSYmaGIuaXNQb3dlck9mVHdvKGhhLmhlaWdodCl9ZnVuY3Rpb24gTShoYSl7cmV0dXJuIHQuaXNXZWJHTDI/ITE6MTAwMSE9PWhhLndyYXBTfHwxMDAxIT09aGEud3JhcFR8fDEwMDMhPT1oYS5taW5GaWx0ZXImJjEwMDYhPT1oYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUChoYSxtYSl7cmV0dXJuIGhhLmdlbmVyYXRlTWlwbWFwcyYmbWEmJjEwMDMhPT1oYS5taW5GaWx0ZXImJjEwMDYhPT1oYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUShoYSxtYSx6YSxKYSl7YS5nZW5lcmF0ZU1pcG1hcChoYSk7Zy5nZXQobWEpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoemEsSmEpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBVKGhhLG1hKXtpZighdC5pc1dlYkdMMilyZXR1cm4gaGE7dmFyIHphPWhhOzY0MDM9PT1oYSYmKDUxMjY9PT1tYSYmKHphPTMzMzI2KSw1MTMxPT09bWEmJih6YT0zMzMyNSksNTEyMT09PW1hJiYoemE9MzMzMjEpKTs2NDA3PT09aGEmJig1MTI2PT09bWEmJih6YT0zNDgzNyksNTEzMT09PW1hJiYoemE9MzQ4NDMpLDUxMjE9PT1tYSYmKHphPTMyODQ5KSk7NjQwOD09PWhhJiYoNTEyNj09PW1hJiYoemE9MzQ4MzYpLDUxMzE9PT1tYSYmKHphPTM0ODQyKSw1MTIxPT09bWEmJih6YT0zMjg1NikpOzMzMzI1PT09emF8fDMzMzI2PT09emF8fDM0ODQyPT09emF8fDM0ODM2PT09emE/Yy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT16YXx8MzQ4Mzc9PT16YSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gemF9ZnVuY3Rpb24gVihoYSl7cmV0dXJuIDEwMDM9PT1oYXx8MTAwND09PWhhfHwxMDA1PT09aGE/OTcyODo5NzI5fWZ1bmN0aW9uIGVhKGhhKXtoYT1oYS50YXJnZXQ7aGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZWEpO3JhKGhhKTtoYS5pc1ZpZGVvVGV4dHVyZSYmdGIuZGVsZXRlKGhhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGRhKGhhKXtoYT1oYS50YXJnZXQ7aGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZGEpO3BhKGhhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHJhKGhhKXt2YXIgbWE9Zy5nZXQoaGEpO3ZvaWQgMCE9PW1hLl9fd2ViZ2xJbml0JiYoYS5kZWxldGVUZXh0dXJlKG1hLl9fd2ViZ2xUZXh0dXJlKSxnLnJlbW92ZShoYSkpfWZ1bmN0aW9uIHBhKGhhKXt2YXIgbWE9Zy5nZXQoaGEpLHphPWcuZ2V0KGhhLnRleHR1cmUpO2lmKGhhKXt2b2lkIDAhPT16YS5fX3dlYmdsVGV4dHVyZSYmYS5kZWxldGVUZXh0dXJlKHphLl9fd2ViZ2xUZXh0dXJlKTsKaGEuZGVwdGhUZXh0dXJlJiZoYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGhhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcih6YT0wOzY+emE7emErKylhLmRlbGV0ZUZyYW1lYnVmZmVyKG1hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG1hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobWEuX193ZWJnbERlcHRoYnVmZmVyW3phXSk7ZWxzZSBhLmRlbGV0ZUZyYW1lYnVmZmVyKG1hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbWEuX193ZWJnbERlcHRoYnVmZmVyJiZhLmRlbGV0ZVJlbmRlcmJ1ZmZlcihtYS5fX3dlYmdsRGVwdGhidWZmZXIpO2cucmVtb3ZlKGhhLnRleHR1cmUpO2cucmVtb3ZlKGhhKX19ZnVuY3Rpb24gcWEoaGEsbWEpe3ZhciB6YT1nLmdldChoYSk7aGEuaXNWaWRlb1RleHR1cmUmJmRiKGhhKTtpZigwPGhhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWhhLnZlcnNpb24pe3ZhciBKYT1oYS5pbWFnZTtpZih2b2lkIDA9PT1KYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09SmEuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtUYSh6YSxoYSxtYSk7cmV0dXJufX1lLmFjdGl2ZVRleHR1cmUoMzM5ODQrbWEpO2UuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdWEoaGEsbWEpe2lmKDY9PT1oYS5pbWFnZS5sZW5ndGgpe3ZhciB6YT1nLmdldChoYSk7aWYoMDxoYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1oYS52ZXJzaW9uKXtCYSh6YSxoYSk7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K21hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTthLnBpeGVsU3RvcmVpKDM3NDQwLGhhLmZsaXBZKTt2YXIgSmE9aGEmJmhhLmlzQ29tcHJlc3NlZFRleHR1cmU7bWE9aGEuaW1hZ2VbMF0mJmhhLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciBZYT1bXSwKTmE9MDs2Pk5hO05hKyspWWFbTmFdPUphfHxtYT9tYT9oYS5pbWFnZVtOYV0uaW1hZ2U6aGEuaW1hZ2VbTmFdOkYoaGEuaW1hZ2VbTmFdLCExLCEwLHQubWF4Q3ViZW1hcFNpemUpO3ZhciBjYj1ZYVswXSxpYT1JKGNiKXx8dC5pc1dlYkdMMixHYT12LmNvbnZlcnQoaGEuZm9ybWF0KSxMYT12LmNvbnZlcnQoaGEudHlwZSksbmI9VShHYSxMYSk7dGEoMzQwNjcsaGEsaWEpO2lmKEphKXtmb3IoTmE9MDs2Pk5hO05hKyspe3ZhciBWYT1ZYVtOYV0ubWlwbWFwcztmb3IoSmE9MDtKYTxWYS5sZW5ndGg7SmErKyl7dmFyIGliPVZhW0phXTsxMDIzIT09aGEuZm9ybWF0JiYxMDIyIT09aGEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihHYSk/ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxpYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxHYSxMYSxpYi5kYXRhKX19emEuX19tYXhNaXBMZXZlbD1WYS5sZW5ndGgtMX1lbHNle1ZhPWhhLm1pcG1hcHM7Zm9yKE5hPTA7Nj5OYTtOYSsrKWlmKG1hKWZvcihlLnRleEltYWdlMkQoMzQwNjkrTmEsMCxuYixZYVtOYV0ud2lkdGgsWWFbTmFdLmhlaWdodCwwLEdhLExhLFlhW05hXS5kYXRhKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxpYj1pYi5pbWFnZVtOYV0uaW1hZ2UsZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSk7ZWxzZSBmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsR2EsTGEsWWFbTmFdKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxlLnRleEltYWdlMkQoMzQwNjkrTmEsSmErMSxuYixHYSxMYSxpYi5pbWFnZVtOYV0pO3phLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RofVAoaGEsCmlhKSYmUSgzNDA2NyxoYSxjYi53aWR0aCxjYi5oZWlnaHQpO3phLl9fdmVyc2lvbj1oYS52ZXJzaW9uO2lmKGhhLm9uVXBkYXRlKWhhLm9uVXBkYXRlKGhhKX1lbHNlIGUuYWN0aXZlVGV4dHVyZSgzMzk4NCttYSksZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIG5hKGhhLG1hKXtlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbWEpO2UuYmluZFRleHR1cmUoMzQwNjcsZy5nZXQoaGEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShoYSxtYSx6YSl7emE/KGEudGV4UGFyYW1ldGVyaShoYSwxMDI0Mix2LmNvbnZlcnQobWEud3JhcFMpKSxhLnRleFBhcmFtZXRlcmkoaGEsMTAyNDMsdi5jb252ZXJ0KG1hLndyYXBUKSksMzI4NzkhPT1oYSYmMzU4NjYhPT1oYXx8YS50ZXhQYXJhbWV0ZXJpKGhhLDMyODgyLHYuY29udmVydChtYS53cmFwUikpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MCx2LmNvbnZlcnQobWEubWFnRmlsdGVyKSksYS50ZXhQYXJhbWV0ZXJpKGhhLAoxMDI0MSx2LmNvbnZlcnQobWEubWluRmlsdGVyKSkpOihhLnRleFBhcmFtZXRlcmkoaGEsMTAyNDIsMzMwNzEpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MywzMzA3MSksMzI4NzkhPT1oYSYmMzU4NjYhPT1oYXx8YS50ZXhQYXJhbWV0ZXJpKGhhLDMyODgyLDMzMDcxKSwxMDAxPT09bWEud3JhcFMmJjEwMDE9PT1tYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MCxWKG1hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MSxWKG1hLm1pbkZpbHRlcikpLDEwMDMhPT1tYS5taW5GaWx0ZXImJjEwMDYhPT1tYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKISh6YT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09bWEudHlwZSYmbnVsbD09PWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW1hLnR5cGUmJm51bGw9PT0odC5pc1dlYkdMMnx8Yy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8bWEuYW5pc290cm9weXx8Zy5nZXQobWEpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYS50ZXhQYXJhbWV0ZXJmKGhhLHphLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG1hLmFuaXNvdHJvcHksdC5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxnLmdldChtYSkuX19jdXJyZW50QW5pc290cm9weT1tYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBCYShoYSxtYSl7dm9pZCAwPT09aGEuX193ZWJnbEluaXQmJihoYS5fX3dlYmdsSW5pdD0hMCxtYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixlYSksaGEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFRhKGhhLG1hLHphKXt2YXIgSmE9MzU1MzttYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEphPTM1ODY2KTttYS5pc0RhdGFUZXh0dXJlM0QmJihKYT0zMjg3OSk7QmEoaGEsbWEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCt6YSk7ZS5iaW5kVGV4dHVyZShKYSxoYS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxtYS5mbGlwWSk7YS5waXhlbFN0b3JlaSgzNzQ0MSxtYS5wcmVtdWx0aXBseUFscGhhKTthLnBpeGVsU3RvcmVpKDMzMTcsbWEudW5wYWNrQWxpZ25tZW50KTt6YT1NKG1hKSYmITE9PT1JKG1hLmltYWdlKTt6YT1GKG1hLmltYWdlLHphLCExLHQubWF4VGV4dHVyZVNpemUpO3ZhciBZYT1JKHphKXx8dC5pc1dlYkdMMixOYT12LmNvbnZlcnQobWEuZm9ybWF0KSxjYj12LmNvbnZlcnQobWEudHlwZSksaWE9VShOYSxjYik7dGEoSmEsbWEsWWEpO3ZhciBHYT1tYS5taXBtYXBzO2lmKG1hLmlzRGVwdGhUZXh0dXJlKXtpYT0KNjQwMjtpZigxMDE1PT09bWEudHlwZSl7aWYoIXQuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtpYT0zNjAxMn1lbHNlIHQuaXNXZWJHTDImJihpYT0zMzE4OSk7MTAyNj09PW1hLmZvcm1hdCYmNjQwMj09PWlhJiYxMDEyIT09bWEudHlwZSYmMTAxNCE9PW1hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxtYS50eXBlPTEwMTIsY2I9di5jb252ZXJ0KG1hLnR5cGUpKTsxMDI3PT09bWEuZm9ybWF0JiYoaWE9MzQwNDEsMTAyMCE9PW1hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbWEudHlwZT0xMDIwLGNiPQp2LmNvbnZlcnQobWEudHlwZSkpKTtlLnRleEltYWdlMkQoMzU1MywwLGlhLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLG51bGwpfWVsc2UgaWYobWEuaXNEYXRhVGV4dHVyZSlpZigwPEdhLmxlbmd0aCYmWWEpe2Zvcih2YXIgTGE9MCxuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsaWEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7bWEuZ2VuZXJhdGVNaXBtYXBzPSExO2hhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGlhLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLHphLmRhdGEpLGhhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG1hLmlzQ29tcHJlc3NlZFRleHR1cmUpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSwxMDIzIT09bWEuZm9ybWF0JiYxMDIyIT09bWEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihOYSk/CmUuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxMYSxpYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxKYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTplLnRleEltYWdlMkQoMzU1MyxMYSxpYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxOYSxjYixKYS5kYXRhKTtoYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgaWYobWEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpZS50ZXhJbWFnZTNEKDM1ODY2LDAsaWEsemEud2lkdGgsemEuaGVpZ2h0LHphLmRlcHRoLDAsTmEsY2IsemEuZGF0YSksaGEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYobWEuaXNEYXRhVGV4dHVyZTNEKWUudGV4SW1hZ2UzRCgzMjg3OSwwLGlhLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGhhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkdhLmxlbmd0aCYmWWEpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSxlLnRleEltYWdlMkQoMzU1MyxMYSxpYSxOYSxjYixKYSk7bWEuZ2VuZXJhdGVNaXBtYXBzPSExO2hhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGlhLE5hLGNiLHphKSxoYS5fX21heE1pcExldmVsPTA7UChtYSxZYSkmJlEoMzU1MyxtYSx6YS53aWR0aCx6YS5oZWlnaHQpO2hhLl9fdmVyc2lvbj1tYS52ZXJzaW9uO2lmKG1hLm9uVXBkYXRlKW1hLm9uVXBkYXRlKG1hKX1mdW5jdGlvbiBVYShoYSxtYSx6YSxKYSl7dmFyIFlhPXYuY29udmVydChtYS50ZXh0dXJlLmZvcm1hdCksTmE9di5jb252ZXJ0KG1hLnRleHR1cmUudHlwZSksY2I9VShZYSxOYSk7ZS50ZXhJbWFnZTJEKEphLDAsY2IsbWEud2lkdGgsbWEuaGVpZ2h0LDAsWWEsTmEsbnVsbCk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaGEpO2EuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnphLEphLGcuZ2V0KG1hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIENhKGhhLG1hLHphKXthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsaGEpO2lmKG1hLmRlcHRoQnVmZmVyJiYhbWEuc3RlbmNpbEJ1ZmZlcil6YT8oemE9TWEobWEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLDMzMTg5LG1hLndpZHRoLG1hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxtYS53aWR0aCxtYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsaGEpO2Vsc2UgaWYobWEuZGVwdGhCdWZmZXImJm1hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG1hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzNTA1NixtYS53aWR0aCxtYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm1hLndpZHRoLG1hLmhlaWdodCksYS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxoYSk7ZWxzZXtoYT12LmNvbnZlcnQobWEudGV4dHVyZS5mb3JtYXQpO3ZhciBKYT12LmNvbnZlcnQobWEudGV4dHVyZS50eXBlKTtoYT1VKGhhLEphKTt6YT8oemE9TWEobWEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLGhhLG1hLndpZHRoLG1hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxoYSxtYS53aWR0aCxtYS5oZWlnaHQpfWEuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBIYShoYSxtYSl7aWYobWEmJm1hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaGEpO2lmKCFtYS5kZXB0aFRleHR1cmV8fCFtYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKZy5nZXQobWEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmbWEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09bWEud2lkdGgmJm1hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1tYS5oZWlnaHR8fChtYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9bWEud2lkdGgsbWEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1tYS5oZWlnaHQsbWEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtxYShtYS5kZXB0aFRleHR1cmUsMCk7aGE9Zy5nZXQobWEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09bWEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsaGEsMCk7ZWxzZSBpZigxMDI3PT09bWEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsaGEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBEYShoYSl7dmFyIG1hPWcuZ2V0KGhhKSx6YT0hMD09PWhhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGhhLmRlcHRoVGV4dHVyZSl7aWYoemEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SGEobWEuX193ZWJnbEZyYW1lYnVmZmVyLGhhKX1lbHNlIGlmKHphKWZvcihtYS5fX3dlYmdsRGVwdGhidWZmZXI9W10semE9MDs2PnphO3phKyspYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbWEuX193ZWJnbEZyYW1lYnVmZmVyW3phXSksbWEuX193ZWJnbERlcHRoYnVmZmVyW3phXT1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG1hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0saGEpO2Vsc2UgYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbWEuX193ZWJnbEZyYW1lYnVmZmVyKSxtYS5fX3dlYmdsRGVwdGhidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShtYS5fX3dlYmdsRGVwdGhidWZmZXIsCmhhKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBNYShoYSl7cmV0dXJuIHQuaXNXZWJHTDImJmhhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbih0Lm1heFNhbXBsZXMsaGEuc2FtcGxlcyk6MH1mdW5jdGlvbiBkYihoYSl7dmFyIG1hPXoucmVuZGVyLmZyYW1lO3RiLmdldChoYSkhPT1tYSYmKHRiLnNldChoYSxtYSksaGEudXBkYXRlKCkpfXZhciB0Yj1uZXcgV2Vha01hcCxLYSxiYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsamI9MCxFYj0hMSx4Yj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgaGE9amI7aGE+PXQubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2hhKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrdC5tYXhUZXh0dXJlcyk7amIrPTE7cmV0dXJuIGhhfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe2piPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXFhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oaGEsbWEpe3ZhciB6YT1nLmdldChoYSk7MDxoYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1oYS52ZXJzaW9uP1RhKHphLGhhLG1hKTooZS5hY3RpdmVUZXh0dXJlKDMzOTg0K21hKSxlLmJpbmRUZXh0dXJlKDM1ODY2LHphLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGhhLG1hKXt2YXIgemE9Zy5nZXQoaGEpOzA8aGEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aGEudmVyc2lvbj9UYSh6YSxoYSxtYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCttYSksZS5iaW5kVGV4dHVyZSgzMjg3OSx6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXVhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPW5hO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaGEpe3ZhciBtYT1nLmdldChoYSksemE9Zy5nZXQoaGEudGV4dHVyZSk7CmhhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGRhKTt6YS5fX3dlYmdsVGV4dHVyZT1hLmNyZWF0ZVRleHR1cmUoKTt6Lm1lbW9yeS50ZXh0dXJlcysrO3ZhciBKYT0hMD09PWhhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLFlhPSEwPT09aGEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LE5hPUkoaGEpfHx0LmlzV2ViR0wyO2lmKEphKWZvcihtYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sWWE9MDs2PllhO1lhKyspbWEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXT1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihtYS5fX3dlYmdsRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFlhKWlmKHQuaXNXZWJHTDIpe21hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7bWEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCk7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG1hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CllhPXYuY29udmVydChoYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGNiPXYuY29udmVydChoYS50ZXh0dXJlLnR5cGUpO1lhPVUoWWEsY2IpO2NiPU1hKGhhKTthLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxjYixZYSxoYS53aWR0aCxoYS5oZWlnaHQpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG1hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxtYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtoYS5kZXB0aEJ1ZmZlciYmKG1hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG1hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixoYSwhMCkpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEphKXtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTt0YSgzNDA2NyxoYS50ZXh0dXJlLE5hKTtmb3IoWWE9MDs2PllhO1lhKyspVWEobWEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXSxoYSwzNjA2NCwzNDA2OStZYSk7UChoYS50ZXh0dXJlLE5hKSYmUSgzNDA2NyxoYS50ZXh0dXJlLGhhLndpZHRoLGhhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGUuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSksdGEoMzU1MyxoYS50ZXh0dXJlLE5hKSxVYShtYS5fX3dlYmdsRnJhbWVidWZmZXIsaGEsMzYwNjQsMzU1MyksUChoYS50ZXh0dXJlLE5hKSYmUSgzNTUzLGhhLnRleHR1cmUsaGEud2lkdGgsaGEuaGVpZ2h0KSxlLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7aGEuZGVwdGhCdWZmZXImJkRhKGhhKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oaGEpe3ZhciBtYT1oYS50ZXh0dXJlLHphPUkoaGEpfHwKdC5pc1dlYkdMMjtpZihQKG1hLHphKSl7emE9aGEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgSmE9Zy5nZXQobWEpLl9fd2ViZ2xUZXh0dXJlO2UuYmluZFRleHR1cmUoemEsSmEpO1EoemEsbWEsaGEud2lkdGgsaGEuaGVpZ2h0KTtlLmJpbmRUZXh0dXJlKHphLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihoYSl7aWYoaGEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHQuaXNXZWJHTDIpe3ZhciBtYT1nLmdldChoYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDgsbWEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxtYS5fX3dlYmdsRnJhbWVidWZmZXIpO21hPWhhLndpZHRoO3ZhciB6YT1oYS5oZWlnaHQsSmE9MTYzODQ7aGEuZGVwdGhCdWZmZXImJihKYXw9MjU2KTtoYS5zdGVuY2lsQnVmZmVyJiYoSmF8PTEwMjQpO2EuYmxpdEZyYW1lYnVmZmVyKDAsCjAsbWEsemEsMCwwLG1hLHphLEphLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihoYSxtYSl7aGEmJmhhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PUViJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksRWI9ITApLGhhPWhhLnRleHR1cmUpO3FhKGhhLG1hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oaGEsbWEpe2hhJiZoYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09eGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCnhiPSEwKSxoYT1oYS50ZXh0dXJlKTtoYSYmaGEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShoYS5pbWFnZSkmJjY9PT1oYS5pbWFnZS5sZW5ndGg/dWEoaGEsbWEpOm5hKGhhLG1hKX19ZnVuY3Rpb24gRmooYSxjLGUpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKGcpe2lmKDFFMz09PWcpcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1nKXJldHVybiAzMzA3MTtpZigxMDAyPT09ZylyZXR1cm4gMzM2NDg7aWYoMTAwMz09PWcpcmV0dXJuIDk3Mjg7aWYoMTAwND09PWcpcmV0dXJuIDk5ODQ7aWYoMTAwNT09PWcpcmV0dXJuIDk5ODY7aWYoMTAwNj09PWcpcmV0dXJuIDk3Mjk7aWYoMTAwNz09PWcpcmV0dXJuIDk5ODU7aWYoMTAwOD09PWcpcmV0dXJuIDk5ODc7aWYoMTAwOT09PWcpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWcpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1nKXJldHVybiAzMjgyMDtpZigxMDE5PT09ZylyZXR1cm4gMzM2MzU7aWYoMTAxMD09PWcpcmV0dXJuIDUxMjA7aWYoMTAxMT09PQpnKXJldHVybiA1MTIyO2lmKDEwMTI9PT1nKXJldHVybiA1MTIzO2lmKDEwMTM9PT1nKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1nKXJldHVybiA1MTI1O2lmKDEwMTU9PT1nKXJldHVybiA1MTI2O2lmKDEwMTY9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciB0PWMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXQpcmV0dXJuIHQuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PWcpcmV0dXJuIDY0MDY7aWYoMTAyMj09PWcpcmV0dXJuIDY0MDc7aWYoMTAyMz09PWcpcmV0dXJuIDY0MDg7aWYoMTAyND09PWcpcmV0dXJuIDY0MDk7aWYoMTAyNT09PWcpcmV0dXJuIDY0MTA7aWYoMTAyNj09PWcpcmV0dXJuIDY0MDI7aWYoMTAyNz09PWcpcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1nKXJldHVybiA2NDAzO2lmKDEwMD09PWcpcmV0dXJuIDMyNzc0O2lmKDEwMT09PWcpcmV0dXJuIDMyNzc4O2lmKDEwMj09PWcpcmV0dXJuIDMyNzc5O2lmKDIwMD09PWcpcmV0dXJuIDA7CmlmKDIwMT09PWcpcmV0dXJuIDE7aWYoMjAyPT09ZylyZXR1cm4gNzY4O2lmKDIwMz09PWcpcmV0dXJuIDc2OTtpZigyMDQ9PT1nKXJldHVybiA3NzA7aWYoMjA1PT09ZylyZXR1cm4gNzcxO2lmKDIwNj09PWcpcmV0dXJuIDc3MjtpZigyMDc9PT1nKXJldHVybiA3NzM7aWYoMjA4PT09ZylyZXR1cm4gNzc0O2lmKDIwOT09PWcpcmV0dXJuIDc3NTtpZigyMTA9PT1nKXJldHVybiA3NzY7aWYoMzM3NzY9PT1nfHwzMzc3Nz09PWd8fDMzNzc4PT09Z3x8MzM3Nzk9PT1nKWlmKHQ9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXQpe2lmKDMzNzc2PT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PWcpcmV0dXJuIHQuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1nKXJldHVybiB0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cmd8fDM1ODQxPT09Z3x8MzU4NDI9PT1nfHwzNTg0Mz09PWcpaWYodD1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXQpe2lmKDM1ODQwPT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PWcpcmV0dXJuIHQuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1nJiYodD1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09dCkpcmV0dXJuIHQuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PWd8fDM3ODA5PT09Z3x8Mzc4MTA9PT1nfHwzNzgxMT09PWd8fDM3ODEyPT09Z3x8Mzc4MTM9PT1nfHwzNzgxND09PWd8fDM3ODE1PT09Z3x8Mzc4MTY9PT0KZ3x8Mzc4MTc9PT1nfHwzNzgxOD09PWd8fDM3ODE5PT09Z3x8Mzc4MjA9PT1nfHwzNzgyMT09PWcpaWYodD1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09dClyZXR1cm4gZztpZigxMDM9PT1nfHwxMDQ9PT1nKXtpZihlLmlzV2ViR0wyKXtpZigxMDM9PT1nKXJldHVybiAzMjc3NTtpZigxMDQ9PT1nKXJldHVybiAzMjc3Nn10PWMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXQpe2lmKDEwMz09PWcpcmV0dXJuIHQuTUlOX0VYVDtpZigxMDQ9PT1nKXJldHVybiB0Lk1BWF9FWFR9fWlmKDEwMjA9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiAzNDA0Mjt0PWMuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXQpcmV0dXJuIHQuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiB3ZSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiB3ZihhKXt2Yi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9YXx8W119ZnVuY3Rpb24gR2ooYSxjLGUpe0hqLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKTtJai5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCk7dmFyIGc9SGouZGlzdGFuY2VUbyhJaiksdD1jLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdj1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej10WzE0XS8odFsxMF0tMSk7ZT10WzE0XS8odFsxMF0rMSk7dmFyIEU9KHRbOV0rMSkvdFs1XSxGPSh0WzldLTEpL3RbNV0sST0odFs4XS0xKS90WzBdLE09KHZbOF0rMSkvdlswXTt0PXoqSTt2PXoqTTtNPWcvKC1JK00pO0k9TSotSTtjLm1hdHJpeFdvcmxkLmRlY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLnRyYW5zbGF0ZVgoSSk7YS50cmFuc2xhdGVaKE0pO2EubWF0cml4V29ybGQuY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGEubWF0cml4V29ybGQpOwpjPXorTTt6PWUrTTthLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHQtSSx2KyhnLUkpLEUqZS96KmMsRiplL3oqYyxjLHopfWZ1bmN0aW9uIFNoKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbnVsbCE9PUkmJiEwPT09SS5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gZSgpe2lmKGMoKSl7dmFyIEhhPUkuZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO3o9MipIYS5yZW5kZXJXaWR0aCplYTtFPUhhLnJlbmRlckhlaWdodCplYTtUYT1hLmdldFBpeGVsUmF0aW8oKTthLmdldFNpemUoQmEpO2Euc2V0RHJhd2luZ0J1ZmZlclNpemUoeixFLDEpO3VhLnZpZXdwb3J0LnNldCgwLDAsei8yLEUpO25hLnZpZXdwb3J0LnNldCh6LzIsMCx6LzIsRSk7Q2Euc3RhcnQoKTtGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEYuZW5hYmxlZCYmYS5zZXREcmF3aW5nQnVmZmVyU2l6ZShCYS53aWR0aCxCYS5oZWlnaHQsVGEpLENhLnN0b3AoKSxGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIGcoSGEpe2Zvcih2YXIgRGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxNYT0wLGRiPTAsdGI9RGEubGVuZ3RoO01hPHRiO01hKyspe3ZhciBLYT1EYVtNYV07aWYoS2EmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1LYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUthLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09S2EuaWR8fEthLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxLYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxLYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGRiPT09SGEpcmV0dXJuIEthO2RiKyt9fX1mdW5jdGlvbiB0KCl7Zm9yKHZhciBIYT0wO0hhPFEubGVuZ3RoO0hhKyspe3ZhciBEYT1RW0hhXSxNYT1nKEhhKTtpZih2b2lkIDAhPT1NYSYmdm9pZCAwIT09TWEucG9zZSl7aWYobnVsbD09PU1hLnBvc2UpYnJlYWs7CnZhciBkYj1NYS5wb3NlOyExPT09ZGIuaGFzUG9zaXRpb24mJkRhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWRiLnBvc2l0aW9uJiZEYS5wb3NpdGlvbi5mcm9tQXJyYXkoZGIucG9zaXRpb24pO251bGwhPT1kYi5vcmllbnRhdGlvbiYmRGEucXVhdGVybmlvbi5mcm9tQXJyYXkoZGIub3JpZW50YXRpb24pO0RhLm1hdHJpeC5jb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeC5wcmVtdWx0aXBseShVKTtEYS5tYXRyaXguZGVjb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RGEudmlzaWJsZT0hMDtkYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1NYS5pZD8wOjE7dm9pZCAwPT09VWFbSGFdJiYoVWFbSGFdPSExKTtVYVtIYV0hPT1NYS5idXR0b25zW2RiXS5wcmVzc2VkJiYoVWFbSGFdPU1hLmJ1dHRvbnNbZGJdLnByZXNzZWQsITA9PT1VYVtIYV0/CkRhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBEYS52aXNpYmxlPSExfX1mdW5jdGlvbiB2KEhhLERhKXtudWxsIT09RGEmJjQ9PT1EYS5sZW5ndGgmJkhhLnNldChEYVswXSp6LERhWzFdKkUsRGFbMl0qeixEYVszXSpFKX12YXIgeixFLEY9dGhpcyxJPW51bGwsTT1udWxsLFA9bnVsbCxRPVtdLFU9bmV3IHEsVj1uZXcgcSxlYT0xLGRhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoTT1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlLCExKSk7dmFyIHJhPW5ldyBxLHBhPW5ldyBoLHFhPW5ldyBrLHVhPW5ldyB2Yjt1YS52aWV3cG9ydD1uZXcgcDt1YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgbmE9bmV3IHZiO25hLnZpZXdwb3J0PW5ldyBwO25hLmxheWVycy5lbmFibGUoMik7dmFyIHRhPW5ldyB3ZihbdWEsbmFdKTt0YS5sYXllcnMuZW5hYmxlKDEpO3RhLmxheWVycy5lbmFibGUoMik7dmFyIEJhPW5ldyBmLFRhLFVhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSGEpe3ZhciBEYT1RW0hhXTt2b2lkIDA9PT1EYSYmKERhPW5ldyB3ZSxEYS5tYXRyaXhBdXRvVXBkYXRlPSExLERhLnZpc2libGU9ITEsUVtIYV09RGEpO3JldHVybiBEYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSX07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSGEpe3ZvaWQgMCE9PUhhJiYoST1IYSk7Q2Euc2V0Q29udGV4dChIYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihIYSl7ZWE9SGF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEhhKXtkYT1IYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT0KSGEmJihQPUhhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSGEpe3ZhciBEYT0ibG9jYWwtZmxvb3IiPT09ZGE/MS42OjA7aWYoITE9PT1jKCkpcmV0dXJuIEhhLnBvc2l0aW9uLnNldCgwLERhLDApLEhhLnJvdGF0aW9uLnNldCgwLDAsMCksSGE7SS5kZXB0aE5lYXI9SGEubmVhcjtJLmRlcHRoRmFyPUhhLmZhcjtJLmdldEZyYW1lRGF0YShNKTtpZigibG9jYWwtZmxvb3IiPT09ZGEpe3ZhciBNYT1JLnN0YWdlUGFyYW1ldGVycztNYT9VLmZyb21BcnJheShNYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6VS5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1NLnBvc2U7TWE9bnVsbCE9PVA/UDpIYTtNYS5tYXRyaXguY29weShVKTtNYS5tYXRyaXguZGVjb21wb3NlKE1hLnBvc2l0aW9uLE1hLnF1YXRlcm5pb24sTWEuc2NhbGUpO251bGwhPT1EYS5vcmllbnRhdGlvbiYmKHBhLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksTWEucXVhdGVybmlvbi5tdWx0aXBseShwYSkpO251bGwhPT0KRGEucG9zaXRpb24mJihwYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVSkscWEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxxYS5hcHBseVF1YXRlcm5pb24ocGEpLE1hLnBvc2l0aW9uLmFkZChxYSkpO01hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dWEubmVhcj1IYS5uZWFyO25hLm5lYXI9SGEubmVhcjt1YS5mYXI9SGEuZmFyO25hLmZhcj1IYS5mYXI7dWEubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShNLmxlZnRWaWV3TWF0cml4KTtuYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KE0ucmlnaHRWaWV3TWF0cml4KTtWLmdldEludmVyc2UoVSk7ImxvY2FsLWZsb29yIj09PWRhJiYodWEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFYpLG5hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShWKSk7SGE9TWEucGFyZW50O251bGwhPT1IYSYmKHJhLmdldEludmVyc2UoSGEubWF0cml4V29ybGQpLHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSksbmEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHJhKSk7CnVhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodWEubWF0cml4V29ybGRJbnZlcnNlKTtuYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKG5hLm1hdHJpeFdvcmxkSW52ZXJzZSk7dWEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoTS5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7bmEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoTS5yaWdodFByb2plY3Rpb25NYXRyaXgpO0dqKHRhLHVhLG5hKTtIYT1JLmdldExheWVycygpO0hhLmxlbmd0aCYmKEhhPUhhWzBdLHYodWEudmlld3BvcnQsSGEubGVmdEJvdW5kcyksdihuYS52aWV3cG9ydCxIYS5yaWdodEJvdW5kcykpO3QoKTtyZXR1cm4gdGF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gVX07dGhpcy5pc1ByZXNlbnRpbmc9Yzt2YXIgQ2E9bmV3IGVjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihIYSl7Q2Euc2V0QW5pbWF0aW9uTG9vcChIYSk7YygpJiZDYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2MoKSYmSS5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEpqKGEsYyl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09RiYmbnVsbCE9PUl9ZnVuY3Rpb24gZyhxYSl7Zm9yKHZhciB1YT0wO3VhPFEubGVuZ3RoO3VhKyspVVt1YV09PT1xYS5pbnB1dFNvdXJjZSYmUVt1YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpxYS50eXBlfSl9ZnVuY3Rpb24gdCgpe2Euc2V0RnJhbWVidWZmZXIobnVsbCk7YS5zZXRSZW5kZXJUYXJnZXQoYS5nZXRSZW5kZXJUYXJnZXQoKSk7CnBhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdihxYSl7ST1xYTtwYS5zZXRDb250ZXh0KEYpO3BhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24geihxYSx1YSl7bnVsbD09PXVhP3FhLm1hdHJpeFdvcmxkLmNvcHkocWEubWF0cml4KTpxYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHVhLm1hdHJpeFdvcmxkLHFhLm1hdHJpeCk7cWEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocWEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRj1udWxsLEk9bnVsbCxNPSJsb2NhbC1mbG9vciIsUD1udWxsLFE9W10sVT1bXSxWPW5ldyB2YjtWLmxheWVycy5lbmFibGUoMSk7Vi52aWV3cG9ydD1uZXcgcDt2YXIgZWE9bmV3IHZiO2VhLmxheWVycy5lbmFibGUoMik7ZWEudmlld3BvcnQ9bmV3IHA7dmFyIGRhPW5ldyB3ZihbVixlYV0pO2RhLmxheWVycy5lbmFibGUoMSk7ZGEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihxYSl7dmFyIHVhPVFbcWFdO3ZvaWQgMD09PXVhJiYodWE9bmV3IHdlLHVhLm1hdHJpeEF1dG9VcGRhdGU9ITEsdWEudmlzaWJsZT0hMSxRW3FhXT11YSk7cmV0dXJuIHVhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHFhKXtNPXFhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gRn07dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHFhKXtGPXFhO251bGwhPT1GJiYoRi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixnKSxGLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsdCksRi51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRixjKX0pLEYucmVxdWVzdFJlZmVyZW5jZVNwYWNlKE0pLnRoZW4odiksClU9Ri5pbnB1dFNvdXJjZXMsRi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7VT1GLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhVKTtmb3IodmFyIHVhPTA7dWE8US5sZW5ndGg7dWErKylRW3VhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1VW3VhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocWEpe2lmKGUoKSl7dmFyIHVhPXFhLnBhcmVudCxuYT1kYS5jYW1lcmFzO3ooZGEsdWEpO2Zvcih2YXIgdGE9MDt0YTxuYS5sZW5ndGg7dGErKyl6KG5hW3RhXSx1YSk7cWEubWF0cml4V29ybGQuY29weShkYS5tYXRyaXhXb3JsZCk7cWE9cWEuY2hpbGRyZW47dGE9MDtmb3IodWE9cWEubGVuZ3RoO3RhPHVhO3RhKyspcWFbdGFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtHaihkYSxWLGVhKTtyZXR1cm4gZGF9cmV0dXJuIHFhfTt0aGlzLmlzUHJlc2VudGluZz1lO3ZhciByYT1udWxsLHBhPW5ldyBlYztwYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHFhLAp1YSl7UD11YS5nZXRWaWV3ZXJQb3NlKEkpO2lmKG51bGwhPT1QKXt2YXIgbmE9UC52aWV3cyx0YT1GLnJlbmRlclN0YXRlLmJhc2VMYXllcjthLnNldEZyYW1lYnVmZmVyKHRhLmZyYW1lYnVmZmVyKTtmb3IodmFyIEJhPTA7QmE8bmEubGVuZ3RoO0JhKyspe3ZhciBUYT1uYVtCYV0sVWE9dGEuZ2V0Vmlld3BvcnQoVGEpLENhPWRhLmNhbWVyYXNbQmFdO0NhLm1hdHJpeC5mcm9tQXJyYXkoVGEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKENhLm1hdHJpeCk7Q2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVGEucHJvamVjdGlvbk1hdHJpeCk7Q2Eudmlld3BvcnQuc2V0KFVhLngsVWEueSxVYS53aWR0aCxVYS5oZWlnaHQpOzA9PT1CYSYmZGEubWF0cml4LmNvcHkoQ2EubWF0cml4KX19Zm9yKEJhPTA7QmE8US5sZW5ndGg7QmErKyl7bmE9UVtCYV07aWYodGE9VVtCYV0paWYodGE9dWEuZ2V0UG9zZSh0YS50YXJnZXRSYXlTcGFjZSxJKSxudWxsIT09dGEpe25hLm1hdHJpeC5mcm9tQXJyYXkodGEudHJhbnNmb3JtLm1hdHJpeCk7Cm5hLm1hdHJpeC5kZWNvbXBvc2UobmEucG9zaXRpb24sbmEucm90YXRpb24sbmEuc2NhbGUpO25hLnZpc2libGU9ITA7Y29udGludWV9bmEudmlzaWJsZT0hMX1yYSYmcmEocWEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHFhKXtyYT1xYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gVGgoYSl7dmFyIGM7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsPT09aWI/ZmM6MX1mdW5jdGlvbiBnKCl7TWI9bmV3IGRkKFJhKTtnYz1uZXcgTmIoUmEsTWIsYSk7Z2MuaXNXZWJHTDJ8fChNYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxNYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksTWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksTWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLE1iLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksTWIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksTWIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO01iLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7ClBjPW5ldyBGaihSYSxNYixnYyk7eWI9bmV3IHBtKFJhLE1iLFBjLGdjKTt5Yi5zY2lzc29yKFRiLmNvcHkoeGUpLm11bHRpcGx5U2NhbGFyKGZjKS5mbG9vcigpKTt5Yi52aWV3cG9ydChMYi5jb3B5KHllKS5tdWx0aXBseVNjYWxhcihmYykuZmxvb3IoKSk7QWQ9bmV3IG1sKFJhKTtoYz1uZXcgZ207UWM9bmV3IHFtKFJhLE1iLHliLGhjLGdjLFBjLEFkKTt5Zz1uZXcgUWQoUmEpO1VoPW5ldyB3ZChSYSx5ZyxBZCk7emU9bmV3IHBsKFVoLEFkKTtLaj1uZXcgb2woUmEpO1JkPW5ldyBmbShpYSxNYixnYyk7emc9bmV3IGptO0FlPW5ldyBvbTtCZD1uZXcgdmQoaWEseWIsemUsbWEpO0xqPW5ldyBzYShSYSxNYixBZCxnYyk7TWo9bmV3IHdnKFJhLE1iLEFkLGdjKTtBZC5wcm9ncmFtcz1SZC5wcm9ncmFtcztpYS5jYXBhYmlsaXRpZXM9Z2M7aWEuZXh0ZW5zaW9ucz1NYjtpYS5wcm9wZXJ0aWVzPWhjO2lhLnJlbmRlckxpc3RzPXpnO2lhLnN0YXRlPXliO2lhLmluZm89QWR9ZnVuY3Rpb24gdChUKXtULnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7R2E9ITB9ZnVuY3Rpb24gdigpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0dhPSExO2coKX1mdW5jdGlvbiB6KFQpe1Q9VC50YXJnZXQ7VC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFQpfWZ1bmN0aW9uIEUoVCl7RihUKTtoYy5yZW1vdmUoVCl9ZnVuY3Rpb24gRihUKXt2YXIgWT1oYy5nZXQoVCkucHJvZ3JhbTtULnByb2dyYW09dm9pZCAwO3ZvaWQgMCE9PVkmJlJkLnJlbGVhc2VQcm9ncmFtKFkpfWZ1bmN0aW9uIEkoVCxZKXtULnJlbmRlcihmdW5jdGlvbihsYSl7aWEucmVuZGVyQnVmZmVySW1tZWRpYXRlKGxhLFkpfSl9ZnVuY3Rpb24gTShULFksbGEpe2lmKGxhJiZsYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhZ2MuaXNXZWJHTDImJm51bGw9PT1NYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7eWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSWE9bGEuYXR0cmlidXRlcztZPVkuZ2V0QXR0cmlidXRlcygpO1Q9VC5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcih2YXIgT2EgaW4gWSl7dmFyIGFiPVlbT2FdO2lmKDA8PWFiKXt2YXIgUGE9SWFbT2FdO2lmKHZvaWQgMCE9PVBhKXt2YXIgZmI9UGEubm9ybWFsaXplZCxDYj1QYS5pdGVtU2l6ZSxvYj15Zy5nZXQoUGEpO2lmKHZvaWQgMCE9PW9iKXt2YXIgJGE9b2IuYnVmZmVyLFJjPW9iLnR5cGU7b2I9b2IuYnl0ZXNQZXJFbGVtZW50O2lmKFBhLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe3ZhciB6Yz1QYS5kYXRhLEJlPXpjLnN0cmlkZTtQYT1QYS5vZmZzZXQ7emMmJnpjLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI/KHliLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYWIsemMubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bGEubWF4SW5zdGFuY2VkQ291bnQmJihsYS5tYXhJbnN0YW5jZWRDb3VudD16Yy5tZXNoUGVyQXR0cmlidXRlKgp6Yy5jb3VudCkpOnliLmVuYWJsZUF0dHJpYnV0ZShhYik7UmEuYmluZEJ1ZmZlcigzNDk2MiwkYSk7UmEudmVydGV4QXR0cmliUG9pbnRlcihhYixDYixSYyxmYixCZSpvYixQYSpvYil9ZWxzZSBQYS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8oeWIuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcihhYixQYS5tZXNoUGVyQXR0cmlidXRlKSx2b2lkIDA9PT1sYS5tYXhJbnN0YW5jZWRDb3VudCYmKGxhLm1heEluc3RhbmNlZENvdW50PVBhLm1lc2hQZXJBdHRyaWJ1dGUqUGEuY291bnQpKTp5Yi5lbmFibGVBdHRyaWJ1dGUoYWIpLFJhLmJpbmRCdWZmZXIoMzQ5NjIsJGEpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoYWIsQ2IsUmMsZmIsMCwwKX19ZWxzZSBpZih2b2lkIDAhPT1UJiYoZmI9VFtPYV0sdm9pZCAwIT09ZmIpKXN3aXRjaChmYi5sZW5ndGgpe2Nhc2UgMjpSYS52ZXJ0ZXhBdHRyaWIyZnYoYWIsZmIpO2JyZWFrO2Nhc2UgMzpSYS52ZXJ0ZXhBdHRyaWIzZnYoYWIsZmIpO2JyZWFrOwpjYXNlIDQ6UmEudmVydGV4QXR0cmliNGZ2KGFiLGZiKTticmVhaztkZWZhdWx0OlJhLnZlcnRleEF0dHJpYjFmdihhYixmYil9fX15Yi5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpfX1mdW5jdGlvbiBQKFQsWSxsYSxJYSl7aWYoITEhPT1ULnZpc2libGUpe2lmKFQubGF5ZXJzLnRlc3QoWS5sYXllcnMpKWlmKFQuaXNHcm91cClsYT1ULnJlbmRlck9yZGVyO2Vsc2UgaWYoVC5pc0xPRCkhMD09PVQuYXV0b1VwZGF0ZSYmVC51cGRhdGUoWSk7ZWxzZSBpZihULmlzTGlnaHQpY2IucHVzaExpZ2h0KFQpLFQuY2FzdFNoYWRvdyYmY2IucHVzaFNoYWRvdyhUKTtlbHNlIGlmKFQuaXNTcHJpdGUpe2lmKCFULmZydXN0dW1DdWxsZWR8fFZoLmludGVyc2VjdHNTcHJpdGUoVCkpe0lhJiZDZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHhmKTt2YXIgT2E9emUudXBkYXRlKFQpLGFiPVQubWF0ZXJpYWw7YWIudmlzaWJsZSYmTmEucHVzaChULE9hLGFiLApsYSxDZC56LG51bGwpfX1lbHNlIGlmKFQuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QpSWEmJkNkLnNldEZyb21NYXRyaXhQb3NpdGlvbihULm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoeGYpLE5hLnB1c2goVCxudWxsLFQubWF0ZXJpYWwsbGEsQ2QueixudWxsKTtlbHNlIGlmKFQuaXNNZXNofHxULmlzTGluZXx8VC5pc1BvaW50cylpZihULmlzU2tpbm5lZE1lc2gmJlQuc2tlbGV0b24udXBkYXRlKCksIVQuZnJ1c3R1bUN1bGxlZHx8VmguaW50ZXJzZWN0c09iamVjdChUKSlpZihJYSYmQ2Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFQubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh4ZiksT2E9emUudXBkYXRlKFQpLGFiPVQubWF0ZXJpYWwsQXJyYXkuaXNBcnJheShhYikpZm9yKHZhciBQYT1PYS5ncm91cHMsZmI9MCxDYj1QYS5sZW5ndGg7ZmI8Q2I7ZmIrKyl7dmFyIG9iPVBhW2ZiXSwkYT1hYltvYi5tYXRlcmlhbEluZGV4XTskYSYmJGEudmlzaWJsZSYmTmEucHVzaChULE9hLCRhLApsYSxDZC56LG9iKX1lbHNlIGFiLnZpc2libGUmJk5hLnB1c2goVCxPYSxhYixsYSxDZC56LG51bGwpO1Q9VC5jaGlsZHJlbjtmYj0wO2ZvcihDYj1ULmxlbmd0aDtmYjxDYjtmYisrKVAoVFtmYl0sWSxsYSxJYSl9fWZ1bmN0aW9uIFEoVCxZLGxhLElhKXtmb3IodmFyIE9hPTAsYWI9VC5sZW5ndGg7T2E8YWI7T2ErKyl7dmFyIFBhPVRbT2FdLGZiPVBhLm9iamVjdCxDYj1QYS5nZW9tZXRyeSxvYj12b2lkIDA9PT1JYT9QYS5tYXRlcmlhbDpJYTtQYT1QYS5ncm91cDtpZihsYS5pc0FycmF5Q2FtZXJhKXtzYj1sYTtmb3IodmFyICRhPWxhLmNhbWVyYXMsUmM9MCx6Yz0kYS5sZW5ndGg7UmM8emM7UmMrKyl7dmFyIEJlPSRhW1JjXTtmYi5sYXllcnMudGVzdChCZS5sYXllcnMpJiYoeWIudmlld3BvcnQoTGIuY29weShCZS52aWV3cG9ydCkpLGNiLnNldHVwTGlnaHRzKEJlKSxVKGZiLFksQmUsQ2Isb2IsUGEpKX19ZWxzZSBzYj1udWxsLFUoZmIsWSxsYSxDYixvYixQYSl9fWZ1bmN0aW9uIFUoVCwKWSxsYSxJYSxPYSxhYil7VC5vbkJlZm9yZVJlbmRlcihpYSxZLGxhLElhLE9hLGFiKTtjYj1BZS5nZXQoWSxzYnx8bGEpO1QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMobGEubWF0cml4V29ybGRJbnZlcnNlLFQubWF0cml4V29ybGQpO1Qubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeChULm1vZGVsVmlld01hdHJpeCk7VC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdD8oeWIuc2V0TWF0ZXJpYWwoT2EpLElhPWVhKGxhLFkuZm9nLE9hLFQpLGViPWM9bnVsbCxtYj0hMSxJKFQsSWEpKTppYS5yZW5kZXJCdWZmZXJEaXJlY3QobGEsWS5mb2csSWEsT2EsVCxhYik7Y2I9QWUuZ2V0KFksc2J8fGxhKX1mdW5jdGlvbiBWKFQsWSxsYSl7dmFyIElhPWhjLmdldChUKSxPYT1jYi5zdGF0ZS5saWdodHMsYWI9T2Euc3RhdGUudmVyc2lvbjtsYT1SZC5nZXRQYXJhbWV0ZXJzKFQsT2Euc3RhdGUsY2Iuc3RhdGUuc2hhZG93c0FycmF5LFksQWMubnVtUGxhbmVzLEFjLm51bUludGVyc2VjdGlvbiwKbGEpO3ZhciBQYT1SZC5nZXRQcm9ncmFtQ29kZShULGxhKSxmYj1JYS5wcm9ncmFtLENiPSEwO2lmKHZvaWQgMD09PWZiKVQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseik7ZWxzZSBpZihmYi5jb2RlIT09UGEpRihUKTtlbHNle2lmKElhLmxpZ2h0c1N0YXRlVmVyc2lvbiE9PWFiKUlhLmxpZ2h0c1N0YXRlVmVyc2lvbj1hYjtlbHNlIGlmKHZvaWQgMCE9PWxhLnNoYWRlcklEKXJldHVybjtDYj0hMX1DYiYmKGxhLnNoYWRlcklEPyhQYT1PY1tsYS5zaGFkZXJJRF0sSWEuc2hhZGVyPXtuYW1lOlQudHlwZSx1bmlmb3Jtczp1YihQYS51bmlmb3JtcyksdmVydGV4U2hhZGVyOlBhLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpQYS5mcmFnbWVudFNoYWRlcn0pOklhLnNoYWRlcj17bmFtZTpULnR5cGUsdW5pZm9ybXM6VC51bmlmb3Jtcyx2ZXJ0ZXhTaGFkZXI6VC52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6VC5mcmFnbWVudFNoYWRlcn0sUGE9UmQuZ2V0UHJvZ3JhbUNvZGUoVCwKbGEpLGZiPVJkLmFjcXVpcmVQcm9ncmFtKFQsSWEuc2hhZGVyLGxhLFBhKSxJYS5wcm9ncmFtPWZiLFQucHJvZ3JhbT1mYik7bGE9ZmIuZ2V0QXR0cmlidXRlcygpO2lmKFQubW9ycGhUYXJnZXRzKWZvcihQYT1ULm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cz0wO1BhPGlhLm1heE1vcnBoVGFyZ2V0cztQYSsrKTA8PWxhWyJtb3JwaFRhcmdldCIrUGFdJiZULm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cysrO2lmKFQubW9ycGhOb3JtYWxzKWZvcihQYT1ULm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscz0wO1BhPGlhLm1heE1vcnBoTm9ybWFscztQYSsrKTA8PWxhWyJtb3JwaE5vcm1hbCIrUGFdJiZULm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscysrO2xhPUlhLnNoYWRlci51bmlmb3JtcztpZighVC5pc1NoYWRlck1hdGVyaWFsJiYhVC5pc1Jhd1NoYWRlck1hdGVyaWFsfHwhMD09PVQuY2xpcHBpbmcpSWEubnVtQ2xpcHBpbmdQbGFuZXM9QWMubnVtUGxhbmVzLElhLm51bUludGVyc2VjdGlvbj0KQWMubnVtSW50ZXJzZWN0aW9uLGxhLmNsaXBwaW5nUGxhbmVzPUFjLnVuaWZvcm07SWEuZm9nPVk7SWEubGlnaHRzU3RhdGVWZXJzaW9uPWFiO1QubGlnaHRzJiYobGEuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9T2Euc3RhdGUuYW1iaWVudCxsYS5saWdodFByb2JlLnZhbHVlPU9hLnN0YXRlLnByb2JlLGxhLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlPU9hLnN0YXRlLmRpcmVjdGlvbmFsLGxhLnNwb3RMaWdodHMudmFsdWU9T2Euc3RhdGUuc3BvdCxsYS5yZWN0QXJlYUxpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5yZWN0QXJlYSxsYS5wb2ludExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5wb2ludCxsYS5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlPU9hLnN0YXRlLmhlbWksbGEuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsbGEuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgsbGEuc3BvdFNoYWRvd01hcC52YWx1ZT0KT2Euc3RhdGUuc3BvdFNoYWRvd01hcCxsYS5zcG90U2hhZG93TWF0cml4LnZhbHVlPU9hLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXgsbGEucG9pbnRTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUucG9pbnRTaGFkb3dNYXAsbGEucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUucG9pbnRTaGFkb3dNYXRyaXgpO1Q9SWEucHJvZ3JhbS5nZXRVbmlmb3JtcygpO1Q9eGQuc2VxV2l0aFZhbHVlKFQuc2VxLGxhKTtJYS51bmlmb3Jtc0xpc3Q9VH1mdW5jdGlvbiBlYShULFksbGEsSWEpe1FjLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIE9hPWhjLmdldChsYSksYWI9Y2Iuc3RhdGUubGlnaHRzO0FnJiYoV2h8fFQhPT1wYikmJkFjLnNldFN0YXRlKGxhLmNsaXBwaW5nUGxhbmVzLGxhLmNsaXBJbnRlcnNlY3Rpb24sbGEuY2xpcFNoYWRvd3MsVCxPYSxUPT09cGImJmxhLmlkPT09UWEpOyExPT09bGEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1PYS5wcm9ncmFtP2xhLm5lZWRzVXBkYXRlPSEwOgpsYS5mb2cmJk9hLmZvZyE9PVk/bGEubmVlZHNVcGRhdGU9ITA6bGEubGlnaHRzJiZPYS5saWdodHNTdGF0ZVZlcnNpb24hPT1hYi5zdGF0ZS52ZXJzaW9uP2xhLm5lZWRzVXBkYXRlPSEwOnZvaWQgMD09PU9hLm51bUNsaXBwaW5nUGxhbmVzfHxPYS5udW1DbGlwcGluZ1BsYW5lcz09PUFjLm51bVBsYW5lcyYmT2EubnVtSW50ZXJzZWN0aW9uPT09QWMubnVtSW50ZXJzZWN0aW9ufHwobGEubmVlZHNVcGRhdGU9ITApKTtsYS5uZWVkc1VwZGF0ZSYmKFYobGEsWSxJYSksbGEubmVlZHNVcGRhdGU9ITEpO3ZhciBQYT0hMSxmYj1hYj0hMSxDYj1PYS5wcm9ncmFtLG9iPUNiLmdldFVuaWZvcm1zKCksJGE9T2Euc2hhZGVyLnVuaWZvcm1zO3liLnVzZVByb2dyYW0oQ2IucHJvZ3JhbSkmJihmYj1hYj1QYT0hMCk7bGEuaWQhPT1RYSYmKFFhPWxhLmlkLGFiPSEwKTtpZihQYXx8cGIhPT1UKXtvYi5zZXRWYWx1ZShSYSwicHJvamVjdGlvbk1hdHJpeCIsVC5wcm9qZWN0aW9uTWF0cml4KTtnYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiYKb2Iuc2V0VmFsdWUoUmEsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFQuZmFyKzEpL01hdGguTE4yKSk7cGIhPT1UJiYocGI9VCxmYj1hYj0hMCk7aWYobGEuaXNTaGFkZXJNYXRlcmlhbHx8bGEuaXNNZXNoUGhvbmdNYXRlcmlhbHx8bGEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bGEuZW52TWFwKVBhPW9iLm1hcC5jYW1lcmFQb3NpdGlvbix2b2lkIDAhPT1QYSYmUGEuc2V0VmFsdWUoUmEsQ2Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFQubWF0cml4V29ybGQpKTsobGEuaXNNZXNoUGhvbmdNYXRlcmlhbHx8bGEuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxsYS5pc01lc2hCYXNpY01hdGVyaWFsfHxsYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxsYS5pc1NoYWRlck1hdGVyaWFsfHxsYS5za2lubmluZykmJm9iLnNldFZhbHVlKFJhLCJ2aWV3TWF0cml4IixULm1hdHJpeFdvcmxkSW52ZXJzZSl9aWYobGEuc2tpbm5pbmcmJihvYi5zZXRPcHRpb25hbChSYSxJYSwiYmluZE1hdHJpeCIpLApvYi5zZXRPcHRpb25hbChSYSxJYSwiYmluZE1hdHJpeEludmVyc2UiKSxUPUlhLnNrZWxldG9uKSlpZihQYT1ULmJvbmVzLGdjLmZsb2F0VmVydGV4VGV4dHVyZXMpe2lmKHZvaWQgMD09PVQuYm9uZVRleHR1cmUpe1BhPU1hdGguc3FydCg0KlBhLmxlbmd0aCk7UGE9aGIuY2VpbFBvd2VyT2ZUd28oUGEpO1BhPU1hdGgubWF4KFBhLDQpO3ZhciBSYz1uZXcgRmxvYXQzMkFycmF5KFBhKlBhKjQpO1JjLnNldChULmJvbmVNYXRyaWNlcyk7dmFyIHpjPW5ldyBBYihSYyxQYSxQYSwxMDIzLDEwMTUpO3pjLm5lZWRzVXBkYXRlPSEwO1QuYm9uZU1hdHJpY2VzPVJjO1QuYm9uZVRleHR1cmU9emM7VC5ib25lVGV4dHVyZVNpemU9UGF9b2Iuc2V0VmFsdWUoUmEsImJvbmVUZXh0dXJlIixULmJvbmVUZXh0dXJlLFFjKTtvYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmVTaXplIixULmJvbmVUZXh0dXJlU2l6ZSl9ZWxzZSBvYi5zZXRPcHRpb25hbChSYSxULCJib25lTWF0cmljZXMiKTthYiYmKG9iLnNldFZhbHVlKFJhLAoidG9uZU1hcHBpbmdFeHBvc3VyZSIsaWEudG9uZU1hcHBpbmdFeHBvc3VyZSksb2Iuc2V0VmFsdWUoUmEsInRvbmVNYXBwaW5nV2hpdGVQb2ludCIsaWEudG9uZU1hcHBpbmdXaGl0ZVBvaW50KSxsYS5saWdodHMmJnRiKCRhLGZiKSxZJiZsYS5mb2cmJm5hKCRhLFkpLGxhLmlzTWVzaEJhc2ljTWF0ZXJpYWw/ZGEoJGEsbGEpOmxhLmlzTWVzaExhbWJlcnRNYXRlcmlhbD8oZGEoJGEsbGEpLHRhKCRhLGxhKSk6bGEuaXNNZXNoUGhvbmdNYXRlcmlhbD8oZGEoJGEsbGEpLGxhLmlzTWVzaFRvb25NYXRlcmlhbD9UYSgkYSxsYSk6QmEoJGEsbGEpKTpsYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPyhkYSgkYSxsYSksbGEuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD9DYSgkYSxsYSk6VWEoJGEsbGEpKTpsYS5pc01lc2hNYXRjYXBNYXRlcmlhbD8oZGEoJGEsbGEpLEhhKCRhLGxhKSk6bGEuaXNNZXNoRGVwdGhNYXRlcmlhbD8oZGEoJGEsbGEpLERhKCRhLGxhKSk6bGEuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD8KKGRhKCRhLGxhKSxNYSgkYSxsYSkpOmxhLmlzTWVzaE5vcm1hbE1hdGVyaWFsPyhkYSgkYSxsYSksZGIoJGEsbGEpKTpsYS5pc0xpbmVCYXNpY01hdGVyaWFsPyhyYSgkYSxsYSksbGEuaXNMaW5lRGFzaGVkTWF0ZXJpYWwmJnBhKCRhLGxhKSk6bGEuaXNQb2ludHNNYXRlcmlhbD9xYSgkYSxsYSk6bGEuaXNTcHJpdGVNYXRlcmlhbD91YSgkYSxsYSk6bGEuaXNTaGFkb3dNYXRlcmlhbCYmKCRhLmNvbG9yLnZhbHVlLmNvcHkobGEuY29sb3IpLCRhLm9wYWNpdHkudmFsdWU9bGEub3BhY2l0eSksdm9pZCAwIT09JGEubHRjXzEmJigkYS5sdGNfMS52YWx1ZT1XYS5MVENfMSksdm9pZCAwIT09JGEubHRjXzImJigkYS5sdGNfMi52YWx1ZT1XYS5MVENfMikseGQudXBsb2FkKFJhLE9hLnVuaWZvcm1zTGlzdCwkYSxRYykpO2xhLmlzU2hhZGVyTWF0ZXJpYWwmJiEwPT09bGEudW5pZm9ybXNOZWVkVXBkYXRlJiYoeGQudXBsb2FkKFJhLE9hLnVuaWZvcm1zTGlzdCwkYSxRYyksbGEudW5pZm9ybXNOZWVkVXBkYXRlPQohMSk7bGEuaXNTcHJpdGVNYXRlcmlhbCYmb2Iuc2V0VmFsdWUoUmEsImNlbnRlciIsSWEuY2VudGVyKTtvYi5zZXRWYWx1ZShSYSwibW9kZWxWaWV3TWF0cml4IixJYS5tb2RlbFZpZXdNYXRyaXgpO29iLnNldFZhbHVlKFJhLCJub3JtYWxNYXRyaXgiLElhLm5vcm1hbE1hdHJpeCk7b2Iuc2V0VmFsdWUoUmEsIm1vZGVsTWF0cml4IixJYS5tYXRyaXhXb3JsZCk7cmV0dXJuIENifWZ1bmN0aW9uIGRhKFQsWSl7VC5vcGFjaXR5LnZhbHVlPVkub3BhY2l0eTtZLmNvbG9yJiZULmRpZmZ1c2UudmFsdWUuY29weShZLmNvbG9yKTtZLmVtaXNzaXZlJiZULmVtaXNzaXZlLnZhbHVlLmNvcHkoWS5lbWlzc2l2ZSkubXVsdGlwbHlTY2FsYXIoWS5lbWlzc2l2ZUludGVuc2l0eSk7WS5tYXAmJihULm1hcC52YWx1ZT1ZLm1hcCk7WS5hbHBoYU1hcCYmKFQuYWxwaGFNYXAudmFsdWU9WS5hbHBoYU1hcCk7WS5zcGVjdWxhck1hcCYmKFQuc3BlY3VsYXJNYXAudmFsdWU9WS5zcGVjdWxhck1hcCk7WS5lbnZNYXAmJgooVC5lbnZNYXAudmFsdWU9WS5lbnZNYXAsVC5mbGlwRW52TWFwLnZhbHVlPVkuZW52TWFwLmlzQ3ViZVRleHR1cmU/LTE6MSxULnJlZmxlY3Rpdml0eS52YWx1ZT1ZLnJlZmxlY3Rpdml0eSxULnJlZnJhY3Rpb25SYXRpby52YWx1ZT1ZLnJlZnJhY3Rpb25SYXRpbyxULm1heE1pcExldmVsLnZhbHVlPWhjLmdldChZLmVudk1hcCkuX19tYXhNaXBMZXZlbCk7WS5saWdodE1hcCYmKFQubGlnaHRNYXAudmFsdWU9WS5saWdodE1hcCxULmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPVkubGlnaHRNYXBJbnRlbnNpdHkpO1kuYW9NYXAmJihULmFvTWFwLnZhbHVlPVkuYW9NYXAsVC5hb01hcEludGVuc2l0eS52YWx1ZT1ZLmFvTWFwSW50ZW5zaXR5KTtpZihZLm1hcCl2YXIgbGE9WS5tYXA7ZWxzZSBZLnNwZWN1bGFyTWFwP2xhPVkuc3BlY3VsYXJNYXA6WS5kaXNwbGFjZW1lbnRNYXA/bGE9WS5kaXNwbGFjZW1lbnRNYXA6WS5ub3JtYWxNYXA/bGE9WS5ub3JtYWxNYXA6WS5idW1wTWFwP2xhPVkuYnVtcE1hcDoKWS5yb3VnaG5lc3NNYXA/bGE9WS5yb3VnaG5lc3NNYXA6WS5tZXRhbG5lc3NNYXA/bGE9WS5tZXRhbG5lc3NNYXA6WS5hbHBoYU1hcD9sYT1ZLmFscGhhTWFwOlkuZW1pc3NpdmVNYXAmJihsYT1ZLmVtaXNzaXZlTWFwKTt2b2lkIDAhPT1sYSYmKGxhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJihsYT1sYS50ZXh0dXJlKSwhMD09PWxhLm1hdHJpeEF1dG9VcGRhdGUmJmxhLnVwZGF0ZU1hdHJpeCgpLFQudXZUcmFuc2Zvcm0udmFsdWUuY29weShsYS5tYXRyaXgpKX1mdW5jdGlvbiByYShULFkpe1QuZGlmZnVzZS52YWx1ZS5jb3B5KFkuY29sb3IpO1Qub3BhY2l0eS52YWx1ZT1ZLm9wYWNpdHl9ZnVuY3Rpb24gcGEoVCxZKXtULmRhc2hTaXplLnZhbHVlPVkuZGFzaFNpemU7VC50b3RhbFNpemUudmFsdWU9WS5kYXNoU2l6ZStZLmdhcFNpemU7VC5zY2FsZS52YWx1ZT1ZLnNjYWxlfWZ1bmN0aW9uIHFhKFQsWSl7VC5kaWZmdXNlLnZhbHVlLmNvcHkoWS5jb2xvcik7VC5vcGFjaXR5LnZhbHVlPQpZLm9wYWNpdHk7VC5zaXplLnZhbHVlPVkuc2l6ZSpmYztULnNjYWxlLnZhbHVlPS41KkJjO1QubWFwLnZhbHVlPVkubWFwO251bGwhPT1ZLm1hcCYmKCEwPT09WS5tYXAubWF0cml4QXV0b1VwZGF0ZSYmWS5tYXAudXBkYXRlTWF0cml4KCksVC51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KFkubWFwLm1hdHJpeCkpfWZ1bmN0aW9uIHVhKFQsWSl7VC5kaWZmdXNlLnZhbHVlLmNvcHkoWS5jb2xvcik7VC5vcGFjaXR5LnZhbHVlPVkub3BhY2l0eTtULnJvdGF0aW9uLnZhbHVlPVkucm90YXRpb247VC5tYXAudmFsdWU9WS5tYXA7bnVsbCE9PVkubWFwJiYoITA9PT1ZLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZZLm1hcC51cGRhdGVNYXRyaXgoKSxULnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoWS5tYXAubWF0cml4KSl9ZnVuY3Rpb24gbmEoVCxZKXtULmZvZ0NvbG9yLnZhbHVlLmNvcHkoWS5jb2xvcik7WS5pc0ZvZz8oVC5mb2dOZWFyLnZhbHVlPVkubmVhcixULmZvZ0Zhci52YWx1ZT1ZLmZhcik6ClkuaXNGb2dFeHAyJiYoVC5mb2dEZW5zaXR5LnZhbHVlPVkuZGVuc2l0eSl9ZnVuY3Rpb24gdGEoVCxZKXtZLmVtaXNzaXZlTWFwJiYoVC5lbWlzc2l2ZU1hcC52YWx1ZT1ZLmVtaXNzaXZlTWFwKX1mdW5jdGlvbiBCYShULFkpe1Quc3BlY3VsYXIudmFsdWUuY29weShZLnNwZWN1bGFyKTtULnNoaW5pbmVzcy52YWx1ZT1NYXRoLm1heChZLnNoaW5pbmVzcywxRS00KTtZLmVtaXNzaXZlTWFwJiYoVC5lbWlzc2l2ZU1hcC52YWx1ZT1ZLmVtaXNzaXZlTWFwKTtZLmJ1bXBNYXAmJihULmJ1bXBNYXAudmFsdWU9WS5idW1wTWFwLFQuYnVtcFNjYWxlLnZhbHVlPVkuYnVtcFNjYWxlLDE9PT1ZLnNpZGUmJihULmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtZLm5vcm1hbE1hcCYmKFQubm9ybWFsTWFwLnZhbHVlPVkubm9ybWFsTWFwLFQubm9ybWFsU2NhbGUudmFsdWUuY29weShZLm5vcm1hbFNjYWxlKSwxPT09WS5zaWRlJiZULm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtZLmRpc3BsYWNlbWVudE1hcCYmCihULmRpc3BsYWNlbWVudE1hcC52YWx1ZT1ZLmRpc3BsYWNlbWVudE1hcCxULmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPVkuZGlzcGxhY2VtZW50U2NhbGUsVC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPVkuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gVGEoVCxZKXtCYShULFkpO1kuZ3JhZGllbnRNYXAmJihULmdyYWRpZW50TWFwLnZhbHVlPVkuZ3JhZGllbnRNYXApfWZ1bmN0aW9uIFVhKFQsWSl7VC5yb3VnaG5lc3MudmFsdWU9WS5yb3VnaG5lc3M7VC5tZXRhbG5lc3MudmFsdWU9WS5tZXRhbG5lc3M7WS5yb3VnaG5lc3NNYXAmJihULnJvdWdobmVzc01hcC52YWx1ZT1ZLnJvdWdobmVzc01hcCk7WS5tZXRhbG5lc3NNYXAmJihULm1ldGFsbmVzc01hcC52YWx1ZT1ZLm1ldGFsbmVzc01hcCk7WS5lbWlzc2l2ZU1hcCYmKFQuZW1pc3NpdmVNYXAudmFsdWU9WS5lbWlzc2l2ZU1hcCk7WS5idW1wTWFwJiYoVC5idW1wTWFwLnZhbHVlPVkuYnVtcE1hcCxULmJ1bXBTY2FsZS52YWx1ZT0KWS5idW1wU2NhbGUsMT09PVkuc2lkZSYmKFQuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO1kubm9ybWFsTWFwJiYoVC5ub3JtYWxNYXAudmFsdWU9WS5ub3JtYWxNYXAsVC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KFkubm9ybWFsU2NhbGUpLDE9PT1ZLnNpZGUmJlQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1kuZGlzcGxhY2VtZW50TWFwJiYoVC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9WS5kaXNwbGFjZW1lbnRNYXAsVC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1ZLmRpc3BsYWNlbWVudFNjYWxlLFQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1ZLmRpc3BsYWNlbWVudEJpYXMpO1kuZW52TWFwJiYoVC5lbnZNYXBJbnRlbnNpdHkudmFsdWU9WS5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIENhKFQsWSl7VWEoVCxZKTtULnJlZmxlY3Rpdml0eS52YWx1ZT1ZLnJlZmxlY3Rpdml0eTtULmNsZWFyY29hdC52YWx1ZT1ZLmNsZWFyY29hdDtULmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1ZLmNsZWFyY29hdFJvdWdobmVzczsKWS5zaGVlbiYmVC5zaGVlbi52YWx1ZS5jb3B5KFkuc2hlZW4pO1kuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVC5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KFkuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLFQuY2xlYXJjb2F0Tm9ybWFsTWFwLnZhbHVlPVkuY2xlYXJjb2F0Tm9ybWFsTWFwLDE9PT1ZLnNpZGUmJlQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1QudHJhbnNwYXJlbmN5LnZhbHVlPVkudHJhbnNwYXJlbmN5fWZ1bmN0aW9uIEhhKFQsWSl7WS5tYXRjYXAmJihULm1hdGNhcC52YWx1ZT1ZLm1hdGNhcCk7WS5idW1wTWFwJiYoVC5idW1wTWFwLnZhbHVlPVkuYnVtcE1hcCxULmJ1bXBTY2FsZS52YWx1ZT1ZLmJ1bXBTY2FsZSwxPT09WS5zaWRlJiYoVC5idW1wU2NhbGUudmFsdWUqPS0xKSk7WS5ub3JtYWxNYXAmJihULm5vcm1hbE1hcC52YWx1ZT1ZLm5vcm1hbE1hcCxULm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoWS5ub3JtYWxTY2FsZSksMT09PVkuc2lkZSYmClQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1kuZGlzcGxhY2VtZW50TWFwJiYoVC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9WS5kaXNwbGFjZW1lbnRNYXAsVC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1ZLmRpc3BsYWNlbWVudFNjYWxlLFQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1ZLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIERhKFQsWSl7WS5kaXNwbGFjZW1lbnRNYXAmJihULmRpc3BsYWNlbWVudE1hcC52YWx1ZT1ZLmRpc3BsYWNlbWVudE1hcCxULmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPVkuZGlzcGxhY2VtZW50U2NhbGUsVC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPVkuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gTWEoVCxZKXtZLmRpc3BsYWNlbWVudE1hcCYmKFQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPVkuZGlzcGxhY2VtZW50TWFwLFQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9WS5kaXNwbGFjZW1lbnRTY2FsZSxULmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ClkuZGlzcGxhY2VtZW50Qmlhcyk7VC5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KFkucmVmZXJlbmNlUG9zaXRpb24pO1QubmVhckRpc3RhbmNlLnZhbHVlPVkubmVhckRpc3RhbmNlO1QuZmFyRGlzdGFuY2UudmFsdWU9WS5mYXJEaXN0YW5jZX1mdW5jdGlvbiBkYihULFkpe1kuYnVtcE1hcCYmKFQuYnVtcE1hcC52YWx1ZT1ZLmJ1bXBNYXAsVC5idW1wU2NhbGUudmFsdWU9WS5idW1wU2NhbGUsMT09PVkuc2lkZSYmKFQuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO1kubm9ybWFsTWFwJiYoVC5ub3JtYWxNYXAudmFsdWU9WS5ub3JtYWxNYXAsVC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KFkubm9ybWFsU2NhbGUpLDE9PT1ZLnNpZGUmJlQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1kuZGlzcGxhY2VtZW50TWFwJiYoVC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9WS5kaXNwbGFjZW1lbnRNYXAsVC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1ZLmRpc3BsYWNlbWVudFNjYWxlLFQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT0KWS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB0YihULFkpe1QuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGU9WTtULmxpZ2h0UHJvYmUubmVlZHNVcGRhdGU9WTtULmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPVk7VC5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1ZO1Quc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZT1ZO1QucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9WTtULmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGU9WX1hPWF8fHt9O3ZhciBLYT12b2lkIDAhPT1hLmNhbnZhcz9hLmNhbnZhczpkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSxiYj12b2lkIDAhPT1hLmNvbnRleHQ/YS5jb250ZXh0Om51bGwsamI9dm9pZCAwIT09YS5hbHBoYT9hLmFscGhhOiExLEViPXZvaWQgMCE9PWEuZGVwdGg/YS5kZXB0aDohMCx4Yj12b2lkIDAhPT1hLnN0ZW5jaWw/YS5zdGVuY2lsOiEwLGhhPXZvaWQgMCE9PQphLmFudGlhbGlhcz9hLmFudGlhbGlhczohMSxtYT12b2lkIDAhPT1hLnByZW11bHRpcGxpZWRBbHBoYT9hLnByZW11bHRpcGxpZWRBbHBoYTohMCx6YT12b2lkIDAhPT1hLnByZXNlcnZlRHJhd2luZ0J1ZmZlcj9hLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxKYT12b2lkIDAhPT1hLnBvd2VyUHJlZmVyZW5jZT9hLnBvd2VyUHJlZmVyZW5jZToiZGVmYXVsdCIsWWE9dm9pZCAwIT09YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0P2EuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDohMSxOYT1udWxsLGNiPW51bGw7dGhpcy5kb21FbGVtZW50PUthO3RoaXMuZGVidWc9e2NoZWNrU2hhZGVyRXJyb3JzOiEwfTt0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9CjI7dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz10aGlzLmdhbW1hT3V0cHV0PXRoaXMuZ2FtbWFJbnB1dD0hMTt0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludD10aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9dGhpcy50b25lTWFwcGluZz0xO3RoaXMubWF4TW9ycGhUYXJnZXRzPTg7dGhpcy5tYXhNb3JwaE5vcm1hbHM9NDt2YXIgaWE9dGhpcyxHYT0hMSxMYT1udWxsLG5iPTAsVmE9MCxpYj1udWxsLGtiPW51bGwsUWE9LTE7dmFyIGViPWM9bnVsbDt2YXIgbWI9ITE7dmFyIHBiPW51bGwsc2I9bnVsbCxMYj1uZXcgcCxUYj1uZXcgcCxxYz1udWxsLFNjPUthLndpZHRoLEJjPUthLmhlaWdodCxmYz0xLHllPW5ldyBwKDAsMCxTYyxCYykseGU9bmV3IHAoMCwwLFNjLEJjKSxYaD0hMSxWaD1uZXcgbGMsQWM9bmV3IHljLEFnPSExLFdoPSExLHhmPW5ldyBxLENkPW5ldyBrO3RyeXtqYj17YWxwaGE6amIsZGVwdGg6RWIsc3RlbmNpbDp4YixhbnRpYWxpYXM6aGEscHJlbXVsdGlwbGllZEFscGhhOm1hLApwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6emEscG93ZXJQcmVmZXJlbmNlOkphLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6WWEseHJDb21wYXRpYmxlOiEwfTtLYS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0Iix0LCExKTtLYS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsdiwhMSk7dmFyIFJhPWJifHxLYS5nZXRDb250ZXh0KCJ3ZWJnbCIsamIpfHxLYS5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiLGpiKTtpZihudWxsPT09UmEpe2lmKG51bGwhPT1LYS5nZXRDb250ZXh0KCJ3ZWJnbCIpKXRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpO3Rocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1SYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihSYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSwKcmFuZ2VNYXg6MSxwcmVjaXNpb246MX19KX1jYXRjaChUKXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK1QubWVzc2FnZSksVDt9dmFyIE1iLGdjLHliLEFkLGhjLFFjLHlnLFVoLHplLFJkLHpnLEFlLEJkLEtqLExqLE1qLFBjO2coKTt2YXIgZmQ9InVuZGVmaW5lZCIhPT10eXBlb2YgbmF2aWdhdG9yJiYieHIiaW4gbmF2aWdhdG9yJiYic3VwcG9ydHNTZXNzaW9uImluIG5hdmlnYXRvci54cj9uZXcgSmooaWEsUmEpOm5ldyBTaChpYSk7dGhpcy52cj1mZDt2YXIgTmo9bmV3IEVqKGlhLHplLGdjLm1heFRleHR1cmVTaXplKTt0aGlzLnNoYWRvd01hcD1Oajt0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gUmF9O3RoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUmEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFQ9TWIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTsKVCYmVC5sb3NlQ29udGV4dCgpfTt0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXt2YXIgVD1NYi5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO1QmJlQucmVzdG9yZUNvbnRleHQoKX07dGhpcy5nZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKCl7cmV0dXJuIGZjfTt0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXt2YXIgVD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt2b2lkIDAhPT1UJiYoZmM9VCx0aGlzLnNldFNpemUoU2MsQmMsITEpKX07dGhpcy5nZXRTaXplPWZ1bmN0aW9uKFQpe3ZvaWQgMD09PVQmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRzaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCIpLFQ9bmV3IGYpO3JldHVybiBULnNldChTYyxCYyl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihULFksbGEpe2ZkLmlzUHJlc2VudGluZygpP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuIik6CihTYz1ULEJjPVksS2Eud2lkdGg9TWF0aC5mbG9vcihUKmZjKSxLYS5oZWlnaHQ9TWF0aC5mbG9vcihZKmZjKSwhMSE9PWxhJiYoS2Euc3R5bGUud2lkdGg9VCsicHgiLEthLnN0eWxlLmhlaWdodD1ZKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVCxZKSl9O3RoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVCl7dm9pZCAwPT09VCYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldGRyYXdpbmdCdWZmZXJTaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCIpLFQ9bmV3IGYpO3JldHVybiBULnNldChTYypmYyxCYypmYykuZmxvb3IoKX07dGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihULFksbGEpe1NjPVQ7QmM9WTtmYz1sYTtLYS53aWR0aD1NYXRoLmZsb29yKFQqbGEpO0thLmhlaWdodD1NYXRoLmZsb29yKFkqbGEpO3RoaXMuc2V0Vmlld3BvcnQoVCxZKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVCl7dm9pZCAwPT09ClQmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50Vmlld3BvcnQoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3I0IGFzIGFuIGFyZ3VtZW50IiksVD1uZXcgcCk7cmV0dXJuIFQuY29weShMYil9O3RoaXMuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVCl7cmV0dXJuIFQuY29weSh5ZSl9O3RoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVCxZKXsoMCkuaXNWZWN0b3I0P3llLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6eWUuc2V0KDAsMCxULFkpO3liLnZpZXdwb3J0KExiLmNvcHkoeWUpLm11bHRpcGx5U2NhbGFyKGZjKS5mbG9vcigpKX07dGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKFQpe3JldHVybiBULmNvcHkoeGUpfTt0aGlzLnNldFNjaXNzb3I9ZnVuY3Rpb24oVCxZLGxhLElhKXtULmlzVmVjdG9yND94ZS5zZXQoVC54LFQueSxULnosVC53KTp4ZS5zZXQoVCxZLGxhLElhKTt5Yi5zY2lzc29yKFRiLmNvcHkoeGUpLm11bHRpcGx5U2NhbGFyKGZjKS5mbG9vcigpKX07CnRoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gWGh9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVCl7eWIuc2V0U2Npc3NvclRlc3QoWGg9VCl9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiBCZC5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe0JkLnNldENsZWFyQ29sb3IuYXBwbHkoQmQsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIEJkLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7QmQuc2V0Q2xlYXJBbHBoYS5hcHBseShCZCxhcmd1bWVudHMpfTt0aGlzLmNsZWFyPWZ1bmN0aW9uKFQsWSxsYSl7dmFyIElhPTA7aWYodm9pZCAwPT09VHx8VClJYXw9MTYzODQ7aWYodm9pZCAwPT09WXx8WSlJYXw9MjU2O2lmKHZvaWQgMD09PWxhfHxsYSlJYXw9MTAyNDtSYS5jbGVhcihJYSl9O3RoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsCiExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHQsITEpO0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt6Zy5kaXNwb3NlKCk7QWUuZGlzcG9zZSgpO2hjLmRpc3Bvc2UoKTt6ZS5kaXNwb3NlKCk7ZmQuZGlzcG9zZSgpO0JnLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9ZnVuY3Rpb24oVCxZKXt5Yi5pbml0QXR0cmlidXRlcygpO3ZhciBsYT1oYy5nZXQoVCk7VC5oYXNQb3NpdGlvbnMmJiFsYS5wb3NpdGlvbiYmKGxhLnBvc2l0aW9uPVJhLmNyZWF0ZUJ1ZmZlcigpKTtULmhhc05vcm1hbHMmJiFsYS5ub3JtYWwmJihsYS5ub3JtYWw9UmEuY3JlYXRlQnVmZmVyKCkpOwpULmhhc1V2cyYmIWxhLnV2JiYobGEudXY9UmEuY3JlYXRlQnVmZmVyKCkpO1QuaGFzQ29sb3JzJiYhbGEuY29sb3ImJihsYS5jb2xvcj1SYS5jcmVhdGVCdWZmZXIoKSk7WT1ZLmdldEF0dHJpYnV0ZXMoKTtULmhhc1Bvc2l0aW9ucyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbGEucG9zaXRpb24pLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVC5wb3NpdGlvbkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS5wb3NpdGlvbiksUmEudmVydGV4QXR0cmliUG9pbnRlcihZLnBvc2l0aW9uLDMsNTEyNiwhMSwwLDApKTtULmhhc05vcm1hbHMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLGxhLm5vcm1hbCksUmEuYnVmZmVyRGF0YSgzNDk2MixULm5vcm1hbEFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS5ub3JtYWwpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoWS5ub3JtYWwsMyw1MTI2LCExLDAsMCkpO1QuaGFzVXZzJiYoUmEuYmluZEJ1ZmZlcigzNDk2MixsYS51diksUmEuYnVmZmVyRGF0YSgzNDk2MiwKVC51dkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS51diksUmEudmVydGV4QXR0cmliUG9pbnRlcihZLnV2LDIsNTEyNiwhMSwwLDApKTtULmhhc0NvbG9ycyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbGEuY29sb3IpLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVC5jb2xvckFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS5jb2xvciksUmEudmVydGV4QXR0cmliUG9pbnRlcihZLmNvbG9yLDMsNTEyNiwhMSwwLDApKTt5Yi5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1JhLmRyYXdBcnJheXMoNCwwLFQuY291bnQpO1QuY291bnQ9MH07dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9ZnVuY3Rpb24oVCxZLGxhLElhLE9hLGFiKXt5Yi5zZXRNYXRlcmlhbChJYSxPYS5pc01lc2gmJjA+T2EubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSk7dmFyIFBhPWVhKFQsWSxJYSxPYSksZmI9ITE7aWYoYyE9PWxhLmlkfHxlYiE9PVBhLmlkfHxtYiE9PSghMD09PUlhLndpcmVmcmFtZSkpYz0KbGEuaWQsZWI9UGEuaWQsbWI9ITA9PT1JYS53aXJlZnJhbWUsZmI9ITA7T2EubW9ycGhUYXJnZXRJbmZsdWVuY2VzJiYoS2oudXBkYXRlKE9hLGxhLElhLFBhKSxmYj0hMCk7dmFyIENiPWxhLmluZGV4LG9iPWxhLmF0dHJpYnV0ZXMucG9zaXRpb247WT0xOyEwPT09SWEud2lyZWZyYW1lJiYoQ2I9VWguZ2V0V2lyZWZyYW1lQXR0cmlidXRlKGxhKSxZPTIpO1Q9TGo7aWYobnVsbCE9PUNiKXt2YXIgJGE9eWcuZ2V0KENiKTtUPU1qO1Quc2V0SW5kZXgoJGEpfWZiJiYoTShJYSxQYSxsYSksbnVsbCE9PUNiJiZSYS5iaW5kQnVmZmVyKDM0OTYzLCRhLmJ1ZmZlcikpOyRhPUluZmluaXR5O251bGwhPT1DYj8kYT1DYi5jb3VudDp2b2lkIDAhPT1vYiYmKCRhPW9iLmNvdW50KTtvYj1sYS5kcmF3UmFuZ2Uuc3RhcnQqWTtQYT1udWxsIT09YWI/YWIuc3RhcnQqWTowO0NiPU1hdGgubWF4KG9iLFBhKTthYj1NYXRoLm1heCgwLE1hdGgubWluKCRhLG9iK2xhLmRyYXdSYW5nZS5jb3VudCpZLFBhKwoobnVsbCE9PWFiP2FiLmNvdW50Klk6SW5maW5pdHkpKS0xLUNiKzEpO2lmKDAhPT1hYil7aWYoT2EuaXNNZXNoKWlmKCEwPT09SWEud2lyZWZyYW1lKXliLnNldExpbmVXaWR0aChJYS53aXJlZnJhbWVMaW5ld2lkdGgqZSgpKSxULnNldE1vZGUoMSk7ZWxzZSBzd2l0Y2goT2EuZHJhd01vZGUpe2Nhc2UgMDpULnNldE1vZGUoNCk7YnJlYWs7Y2FzZSAxOlQuc2V0TW9kZSg1KTticmVhaztjYXNlIDI6VC5zZXRNb2RlKDYpfWVsc2UgT2EuaXNMaW5lPyhJYT1JYS5saW5ld2lkdGgsdm9pZCAwPT09SWEmJihJYT0xKSx5Yi5zZXRMaW5lV2lkdGgoSWEqZSgpKSxPYS5pc0xpbmVTZWdtZW50cz9ULnNldE1vZGUoMSk6T2EuaXNMaW5lTG9vcD9ULnNldE1vZGUoMik6VC5zZXRNb2RlKDMpKTpPYS5pc1BvaW50cz9ULnNldE1vZGUoMCk6T2EuaXNTcHJpdGUmJlQuc2V0TW9kZSg0KTtsYSYmbGEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT8wPGxhLm1heEluc3RhbmNlZENvdW50JiZULnJlbmRlckluc3RhbmNlcyhsYSwKQ2IsYWIpOlQucmVuZGVyKENiLGFiKX19O3RoaXMuY29tcGlsZT1mdW5jdGlvbihULFkpe2NiPUFlLmdldChULFkpO2NiLmluaXQoKTtULnRyYXZlcnNlKGZ1bmN0aW9uKGxhKXtsYS5pc0xpZ2h0JiYoY2IucHVzaExpZ2h0KGxhKSxsYS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KGxhKSl9KTtjYi5zZXR1cExpZ2h0cyhZKTtULnRyYXZlcnNlKGZ1bmN0aW9uKGxhKXtpZihsYS5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KGxhLm1hdGVyaWFsKSlmb3IodmFyIElhPTA7SWE8bGEubWF0ZXJpYWwubGVuZ3RoO0lhKyspVihsYS5tYXRlcmlhbFtJYV0sVC5mb2csbGEpO2Vsc2UgVihsYS5tYXRlcmlhbCxULmZvZyxsYSl9KX07dmFyIFloPW51bGwsQmc9bmV3IGVjO0JnLnNldEFuaW1hdGlvbkxvb3AoZnVuY3Rpb24oVCl7ZmQuaXNQcmVzZW50aW5nKCl8fFloJiZZaChUKX0pOyJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdyYmQmcuc2V0Q29udGV4dCh3aW5kb3cpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD0KZnVuY3Rpb24oVCl7WWg9VDtmZC5zZXRBbmltYXRpb25Mb29wKFQpO0JnLnN0YXJ0KCl9O3RoaXMucmVuZGVyPWZ1bmN0aW9uKFQsWSxsYSxJYSl7aWYodm9pZCAwIT09bGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIHJlbmRlclRhcmdldCBhcmd1bWVudCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGluc3RlYWQuIik7dmFyIE9hPWxhfWlmKHZvaWQgMCE9PUlhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSBmb3JjZUNsZWFyIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuY2xlYXIoKSBpbnN0ZWFkLiIpO3ZhciBhYj1JYX1ZJiZZLmlzQ2FtZXJhP0dhfHwoZWI9Yz1udWxsLG1iPSExLFFhPS0xLHBiPW51bGwsITA9PT1ULmF1dG9VcGRhdGUmJlQudXBkYXRlTWF0cml4V29ybGQoKSxudWxsPT09WS5wYXJlbnQmJlkudXBkYXRlTWF0cml4V29ybGQoKSxmZC5lbmFibGVkJiYKKFk9ZmQuZ2V0Q2FtZXJhKFkpKSxjYj1BZS5nZXQoVCxZKSxjYi5pbml0KCksVC5vbkJlZm9yZVJlbmRlcihpYSxULFksT2F8fGliKSx4Zi5tdWx0aXBseU1hdHJpY2VzKFkucHJvamVjdGlvbk1hdHJpeCxZLm1hdHJpeFdvcmxkSW52ZXJzZSksVmguc2V0RnJvbU1hdHJpeCh4ZiksV2g9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxBZz1BYy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsV2gsWSksTmE9emcuZ2V0KFQsWSksTmEuaW5pdCgpLFAoVCxZLDAsaWEuc29ydE9iamVjdHMpLCEwPT09aWEuc29ydE9iamVjdHMmJk5hLnNvcnQoKSxBZyYmQWMuYmVnaW5TaGFkb3dzKCksTmoucmVuZGVyKGNiLnN0YXRlLnNoYWRvd3NBcnJheSxULFkpLGNiLnNldHVwTGlnaHRzKFkpLEFnJiZBYy5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09T2EmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KE9hKSxCZC5yZW5kZXIoTmEsVCxZLGFiKSxsYT0KTmEub3BhcXVlLElhPU5hLnRyYW5zcGFyZW50LFQub3ZlcnJpZGVNYXRlcmlhbD8oT2E9VC5vdmVycmlkZU1hdGVyaWFsLGxhLmxlbmd0aCYmUShsYSxULFksT2EpLElhLmxlbmd0aCYmUShJYSxULFksT2EpKToobGEubGVuZ3RoJiZRKGxhLFQsWSksSWEubGVuZ3RoJiZRKElhLFQsWSkpLG51bGwhPT1pYiYmKFFjLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChpYiksUWMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoaWIpKSx5Yi5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLHliLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCkseWIuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSx5Yi5zZXRQb2x5Z29uT2Zmc2V0KCExKSxmZC5lbmFibGVkJiZmZC5zdWJtaXRGcmFtZSgpLGNiPU5hPW51bGwpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4iKX07dGhpcy5zZXRGcmFtZWJ1ZmZlcj0KZnVuY3Rpb24oVCl7TGEhPT1UJiZSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsVCk7TGE9VH07dGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiBuYn07dGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBWYX07dGhpcy5nZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gaWJ9O3RoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKFQsWSxsYSl7aWI9VDtuYj1ZO1ZhPWxhO1QmJnZvaWQgMD09PWhjLmdldChUKS5fX3dlYmdsRnJhbWVidWZmZXImJlFjLnNldHVwUmVuZGVyVGFyZ2V0KFQpO3ZhciBJYT1MYSxPYT0hMTtUPyhJYT1oYy5nZXQoVCkuX193ZWJnbEZyYW1lYnVmZmVyLFQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/KElhPUlhW1l8fDBdLE9hPSEwKTpJYT1ULmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9oYy5nZXQoVCkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyOklhLExiLmNvcHkoVC52aWV3cG9ydCksClRiLmNvcHkoVC5zY2lzc29yKSxxYz1ULnNjaXNzb3JUZXN0KTooTGIuY29weSh5ZSkubXVsdGlwbHlTY2FsYXIoZmMpLmZsb29yKCksVGIuY29weSh4ZSkubXVsdGlwbHlTY2FsYXIoZmMpLmZsb29yKCkscWM9WGgpO2tiIT09SWEmJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsSWEpLGtiPUlhKTt5Yi52aWV3cG9ydChMYik7eWIuc2Npc3NvcihUYik7eWIuc2V0U2Npc3NvclRlc3QocWMpO09hJiYoVD1oYy5nZXQoVC50ZXh0dXJlKSxSYS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA2NCwzNDA2OSsoWXx8MCksVC5fX3dlYmdsVGV4dHVyZSxsYXx8MCkpfTt0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24oVCxZLGxhLElhLE9hLGFiLFBhKXtpZihUJiZULmlzV2ViR0xSZW5kZXJUYXJnZXQpe3ZhciBmYj1oYy5nZXQoVCkuX193ZWJnbEZyYW1lYnVmZmVyO1QuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUmJnZvaWQgMCE9PVBhJiYoZmI9ZmJbUGFdKTtpZihmYil7UGE9CiExO2ZiIT09a2ImJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZmIpLFBhPSEwKTt0cnl7dmFyIENiPVQudGV4dHVyZSxvYj1DYi5mb3JtYXQsJGE9Q2IudHlwZTsxMDIzIT09b2ImJlBjLmNvbnZlcnQob2IpIT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09JGF8fFBjLmNvbnZlcnQoJGEpPT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PSRhJiYoZ2MuaXNXZWJHTDJ8fE1iLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8TWIuZ2V0KCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiKSl8fDEwMTY9PT0kYSYmKGdjLmlzV2ViR0wyP01iLmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpOk1iLmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IikpPwozNjA1Mz09PVJhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PVkmJlk8PVQud2lkdGgtSWEmJjA8PWxhJiZsYTw9VC5oZWlnaHQtT2EmJlJhLnJlYWRQaXhlbHMoWSxsYSxJYSxPYSxQYy5jb252ZXJ0KG9iKSxQYy5jb252ZXJ0KCRhKSxhYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1BhJiZSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsa2IpfX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIil9Owp0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihULFksbGEpe3ZhciBJYT1ZLmltYWdlLndpZHRoLE9hPVkuaW1hZ2UuaGVpZ2h0LGFiPVBjLmNvbnZlcnQoWS5mb3JtYXQpO1FjLnNldFRleHR1cmUyRChZLDApO1JhLmNvcHlUZXhJbWFnZTJEKDM1NTMsbGF8fDAsYWIsVC54LFQueSxJYSxPYSwwKX07dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbihULFksbGEsSWEpe3ZhciBPYT1ZLmltYWdlLndpZHRoLGFiPVkuaW1hZ2UuaGVpZ2h0LFBhPVBjLmNvbnZlcnQobGEuZm9ybWF0KSxmYj1QYy5jb252ZXJ0KGxhLnR5cGUpO1FjLnNldFRleHR1cmUyRChsYSwwKTtZLmlzRGF0YVRleHR1cmU/UmEudGV4U3ViSW1hZ2UyRCgzNTUzLElhfHwwLFQueCxULnksT2EsYWIsUGEsZmIsWS5pbWFnZS5kYXRhKTpSYS50ZXhTdWJJbWFnZTJEKDM1NTMsSWF8fDAsVC54LFQueSxQYSxmYixZLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiYKX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9ZnVuY3Rpb24gQ2coYSxjKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSChhKTt0aGlzLmRlbnNpdHk9dm9pZCAwIT09Yz9jOjIuNUUtNH1mdW5jdGlvbiBEZyhhLGMsZSl7dGhpcy5uYW1lPSIiO3RoaXMuY29sb3I9bmV3IEgoYSk7dGhpcy5uZWFyPXZvaWQgMCE9PWM/YzoxO3RoaXMuZmFyPXZvaWQgMCE9PWU/ZToxRTN9ZnVuY3Rpb24gU2QoYSxjKXt0aGlzLmFycmF5PWE7dGhpcy5zdHJpZGU9Yzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMuZHluYW1pYz0hMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24geWYoYSxjLGUsZyl7dGhpcy5kYXRhPWE7dGhpcy5pdGVtU2l6ZT1jO3RoaXMub2Zmc2V0PWU7dGhpcy5ub3JtYWxpemVkPSEwPT09Z31mdW5jdGlvbiBEZChhKXtTLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEgoMTY3NzcyMTUpO3RoaXMubWFwPW51bGw7dGhpcy5yb3RhdGlvbj0wO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPSExO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gemYoYSl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3ByaXRlIjtpZih2b2lkIDA9PT1DZSl7Q2U9bmV3IHZhO3ZhciBjPW5ldyBTZChuZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSw1KTtDZS5zZXRJbmRleChbMCwxLDIsMCwyLDNdKTtDZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgeWYoYywzLDAsITEpKTtDZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgeWYoYywyLDMsITEpKX10aGlzLmdlb21ldHJ5PUNlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09YT9hOm5ldyBEZDt0aGlzLmNlbnRlcj1uZXcgZiguNSwKLjUpfWZ1bmN0aW9uIEVnKGEsYyxlLGcsdCx2KXtEZS5zdWJWZWN0b3JzKGEsZSkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShnKTt2b2lkIDAhPT10PyhBZi54PXYqRGUueC10KkRlLnksQWYueT10KkRlLngrdipEZS55KTpBZi5jb3B5KERlKTthLmNvcHkoYyk7YS54Kz1BZi54O2EueSs9QWYueTthLmFwcGx5TWF0cml4NChPail9ZnVuY3Rpb24gQmYoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMT0QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse2xldmVsczp7ZW51bWVyYWJsZTohMCx2YWx1ZTpbXX19KTt0aGlzLmF1dG9VcGRhdGU9ITB9ZnVuY3Rpb24gQ2YoYSxjKXthJiZhLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eWEuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0KImF0dGFjaGVkIjt0aGlzLmJpbmRNYXRyaXg9bmV3IHE7dGhpcy5iaW5kTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiBGZyhhLGMpe2E9YXx8W107dGhpcy5ib25lcz1hLnNsaWNlKDApO3RoaXMuYm9uZU1hdHJpY2VzPW5ldyBGbG9hdDMyQXJyYXkoMTYqdGhpcy5ib25lcy5sZW5ndGgpO2lmKHZvaWQgMD09PWMpdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodGhpcy5ib25lcy5sZW5ndGg9PT1jLmxlbmd0aCl0aGlzLmJvbmVJbnZlcnNlcz1jLnNsaWNlKDApO2Vsc2UgZm9yKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b24gYm9uZUludmVyc2VzIGlzIHRoZSB3cm9uZyBsZW5ndGguIiksdGhpcy5ib25lSW52ZXJzZXM9W10sYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBxKX1mdW5jdGlvbiBaaCgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIEZiKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9CiJMaW5lQmFzaWNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5saW5ld2lkdGg9MTt0aGlzLmxpbmVqb2luPXRoaXMubGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFhiKGEsYyxlKXsxPT09ZSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLiIpO0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmUiO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgRmIoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBJYihhLGMpe1hiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBHZyhhLGMpe1hiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0KIkxpbmVMb29wIn1mdW5jdGlvbiBDYyhhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2ludHNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnNpemU9MTt0aGlzLnNpemVBdHRlbnVhdGlvbj0hMDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoVGFyZ2V0cz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBFZShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50cyI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09Yz9jOm5ldyBDYyh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9ZnVuY3Rpb24gJGgoYSxjLGUsZyx0LHYseil7dmFyIEU9YWkuZGlzdGFuY2VTcVRvUG9pbnQoYSk7RTxlJiYoZT1uZXcgayxhaS5jbG9zZXN0UG9pbnRUb1BvaW50KGEsZSksZS5hcHBseU1hdHJpeDQoZyksYT10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhlKSwKYTx0Lm5lYXJ8fGE+dC5mYXJ8fHYucHVzaCh7ZGlzdGFuY2U6YSxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChFKSxwb2ludDplLGluZGV4OmMsZmFjZTpudWxsLG9iamVjdDp6fSkpfWZ1bmN0aW9uIGJpKGEsYyxlLGcsdCx2LHosRSxGKXtsLmNhbGwodGhpcyxhLGMsZSxnLHQsdix6LEUsRik7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjI7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09dj92OjEwMDY7dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09dD90OjEwMDY7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gRmUoYSxjLGUsZyx0LHYseixFLEYsSSxNLFApe2wuY2FsbCh0aGlzLG51bGwsdix6LEUsRixJLGcsdCxNLFApO3RoaXMuaW1hZ2U9e3dpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWlwbWFwcz1hO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gRGYoYSxjLGUsZyx0LHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcsdCx2LHosRSxGKTt0aGlzLm5lZWRzVXBkYXRlPQohMH1mdW5jdGlvbiBFZihhLGMsZSxnLHQsdix6LEUsRixJKXtJPXZvaWQgMCE9PUk/SToxMDI2O2lmKDEwMjYhPT1JJiYxMDI3IT09SSl0aHJvdyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTt2b2lkIDA9PT1lJiYxMDI2PT09SSYmKGU9MTAxMik7dm9pZCAwPT09ZSYmMTAyNz09PUkmJihlPTEwMjApO2wuY2FsbCh0aGlzLG51bGwsZyx0LHYseixFLEksZSxGKTt0aGlzLmltYWdlPXt3aWR0aDphLGhlaWdodDpjfTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT16P3o6MTAwMzt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIEdlKGEpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGM9W10sZSxnLHQsdj1bMCwwXSx6PXt9LEU9WyJhIiwiYiIsImMiXTsKaWYoYSYmYS5pc0dlb21ldHJ5KXt2YXIgRj1hLmZhY2VzO3ZhciBJPTA7Zm9yKGc9Ri5sZW5ndGg7STxnO0krKyl7dmFyIE09RltJXTtmb3IoZT0wOzM+ZTtlKyspe3ZhciBQPU1bRVtlXV07dmFyIFE9TVtFWyhlKzEpJTNdXTt2WzBdPU1hdGgubWluKFAsUSk7dlsxXT1NYXRoLm1heChQLFEpO1A9dlswXSsiLCIrdlsxXTt2b2lkIDA9PT16W1BdJiYoeltQXT17aW5kZXgxOnZbMF0saW5kZXgyOnZbMV19KX19Zm9yKFAgaW4geilJPXpbUF0sRT1hLnZlcnRpY2VzW0kuaW5kZXgxXSxjLnB1c2goRS54LEUueSxFLnopLEU9YS52ZXJ0aWNlc1tJLmluZGV4Ml0sYy5wdXNoKEUueCxFLnksRS56KX1lbHNlIGlmKGEmJmEuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBrLG51bGwhPT1hLmluZGV4KXtGPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtNPWEuaW5kZXg7dmFyIFU9YS5ncm91cHM7MD09PVUubGVuZ3RoJiYoVT1be3N0YXJ0OjAsY291bnQ6TS5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7CmE9MDtmb3IodD1VLmxlbmd0aDthPHQ7KythKWZvcihJPVVbYV0sZT1JLnN0YXJ0LGc9SS5jb3VudCxJPWUsZz1lK2c7STxnO0krPTMpZm9yKGU9MDszPmU7ZSsrKVA9TS5nZXRYKEkrZSksUT1NLmdldFgoSSsoZSsxKSUzKSx2WzBdPU1hdGgubWluKFAsUSksdlsxXT1NYXRoLm1heChQLFEpLFA9dlswXSsiLCIrdlsxXSx2b2lkIDA9PT16W1BdJiYoeltQXT17aW5kZXgxOnZbMF0saW5kZXgyOnZbMV19KTtmb3IoUCBpbiB6KUk9eltQXSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRixJLmluZGV4MSksYy5wdXNoKEUueCxFLnksRS56KSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRixJLmluZGV4MiksYy5wdXNoKEUueCxFLnksRS56KX1lbHNlIGZvcihGPWEuYXR0cmlidXRlcy5wb3NpdGlvbixJPTAsZz1GLmNvdW50LzM7STxnO0krKylmb3IoZT0wOzM+ZTtlKyspej0zKkkrZSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRix6KSxjLnB1c2goRS54LEUueSxFLnopLHo9MypJKyhlKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEYsCnopLGMucHVzaChFLngsRS55LEUueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoYywzKSl9ZnVuY3Rpb24gRmYoYSxjLGUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQYXJhbWV0cmljR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17ZnVuYzphLHNsaWNlczpjLHN0YWNrczplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSGUoYSxjLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBIZShhLGMsZSl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsc2xpY2VzOmMsc3RhY2tzOmV9O3ZhciBnPVtdLHQ9W10sdj1bXSx6PVtdLEU9bmV3IGssRj1uZXcgayxJPW5ldyBrLE09bmV3IGssUD1uZXcgayxRLFU7Mz5hLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTsKdmFyIFY9YysxO2ZvcihRPTA7UTw9ZTtRKyspe3ZhciBlYT1RL2U7Zm9yKFU9MDtVPD1jO1UrKyl7dmFyIGRhPVUvYzthKGRhLGVhLEYpO3QucHVzaChGLngsRi55LEYueik7MDw9ZGEtMUUtNT8oYShkYS0xRS01LGVhLEkpLE0uc3ViVmVjdG9ycyhGLEkpKTooYShkYSsxRS01LGVhLEkpLE0uc3ViVmVjdG9ycyhJLEYpKTswPD1lYS0xRS01PyhhKGRhLGVhLTFFLTUsSSksUC5zdWJWZWN0b3JzKEYsSSkpOihhKGRhLGVhKzFFLTUsSSksUC5zdWJWZWN0b3JzKEksRikpO0UuY3Jvc3NWZWN0b3JzKE0sUCkubm9ybWFsaXplKCk7di5wdXNoKEUueCxFLnksRS56KTt6LnB1c2goZGEsZWEpfX1mb3IoUT0wO1E8ZTtRKyspZm9yKFU9MDtVPGM7VSsrKWE9USpWK1UrMSxFPShRKzEpKlYrVSsxLEY9KFErMSkqVitVLGcucHVzaChRKlYrVSxhLEYpLGcucHVzaChhLEUsRik7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh0LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwKbmV3IGJhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKHosMikpfWZ1bmN0aW9uIEdmKGEsYyxlLGcpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17dmVydGljZXM6YSxpbmRpY2VzOmMscmFkaXVzOmUsZGV0YWlsOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBtYyhhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gbWMoYSxjLGUsZyl7ZnVuY3Rpb24gdChWLGVhLGRhLHJhKXtyYT1NYXRoLnBvdygyLHJhKTt2YXIgcGE9W10scWEsdWE7Zm9yKHFhPTA7cWE8PXJhO3FhKyspe3BhW3FhXT1bXTt2YXIgbmE9Vi5jbG9uZSgpLmxlcnAoZGEscWEvcmEpLHRhPWVhLmNsb25lKCkubGVycChkYSxxYS9yYSksQmE9cmEtcWE7Zm9yKHVhPTA7dWE8PUJhO3VhKyspcGFbcWFdW3VhXT0wPT09dWEmJnFhPT09cmE/bmE6bmEuY2xvbmUoKS5sZXJwKHRhLHVhL0JhKX1mb3IocWE9MDtxYTwKcmE7cWErKylmb3IodWE9MDt1YTwyKihyYS1xYSktMTt1YSsrKVY9TWF0aC5mbG9vcih1YS8yKSwwPT09dWElMj8oeihwYVtxYV1bVisxXSkseihwYVtxYSsxXVtWXSkseihwYVtxYV1bVl0pKTooeihwYVtxYV1bVisxXSkseihwYVtxYSsxXVtWKzFdKSx6KHBhW3FhKzFdW1ZdKSl9ZnVuY3Rpb24gdigpe2Zvcih2YXIgVj0wO1Y8VS5sZW5ndGg7Vis9Nil7dmFyIGVhPVVbViswXSxkYT1VW1YrMl0scmE9VVtWKzRdLHBhPU1hdGgubWluKGVhLGRhLHJhKTsuOTxNYXRoLm1heChlYSxkYSxyYSkmJi4xPnBhJiYoLjI+ZWEmJihVW1YrMF0rPTEpLC4yPmRhJiYoVVtWKzJdKz0xKSwuMj5yYSYmKFVbVis0XSs9MSkpfX1mdW5jdGlvbiB6KFYpe1EucHVzaChWLngsVi55LFYueil9ZnVuY3Rpb24gRShWLGVhKXtWKj0zO2VhLng9YVtWKzBdO2VhLnk9YVtWKzFdO2VhLno9YVtWKzJdfWZ1bmN0aW9uIEYoKXtmb3IodmFyIFY9bmV3IGssZWE9bmV3IGssZGE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGYsCnFhPW5ldyBmLHVhPW5ldyBmLG5hPTAsdGE9MDtuYTxRLmxlbmd0aDtuYSs9OSx0YSs9Nil7Vi5zZXQoUVtuYSswXSxRW25hKzFdLFFbbmErMl0pO2VhLnNldChRW25hKzNdLFFbbmErNF0sUVtuYSs1XSk7ZGEuc2V0KFFbbmErNl0sUVtuYSs3XSxRW25hKzhdKTtwYS5zZXQoVVt0YSswXSxVW3RhKzFdKTtxYS5zZXQoVVt0YSsyXSxVW3RhKzNdKTt1YS5zZXQoVVt0YSs0XSxVW3RhKzVdKTtyYS5jb3B5KFYpLmFkZChlYSkuYWRkKGRhKS5kaXZpZGVTY2FsYXIoMyk7dmFyIEJhPU0ocmEpO0kocGEsdGErMCxWLEJhKTtJKHFhLHRhKzIsZWEsQmEpO0kodWEsdGErNCxkYSxCYSl9fWZ1bmN0aW9uIEkoVixlYSxkYSxyYSl7MD5yYSYmMT09PVYueCYmKFVbZWFdPVYueC0xKTswPT09ZGEueCYmMD09PWRhLnomJihVW2VhXT1yYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIE0oVil7cmV0dXJuIE1hdGguYXRhbjIoVi56LC1WLngpfWZ1bmN0aW9uIFAoVil7cmV0dXJuIE1hdGguYXRhbjIoLVYueSwKTWF0aC5zcXJ0KFYueCpWLngrVi56KlYueikpfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17dmVydGljZXM6YSxpbmRpY2VzOmMscmFkaXVzOmUsZGV0YWlsOmd9O2U9ZXx8MTtnPWd8fDA7dmFyIFE9W10sVT1bXTsoZnVuY3Rpb24oVil7Zm9yKHZhciBlYT1uZXcgayxkYT1uZXcgayxyYT1uZXcgayxwYT0wO3BhPGMubGVuZ3RoO3BhKz0zKUUoY1twYSswXSxlYSksRShjW3BhKzFdLGRhKSxFKGNbcGErMl0scmEpLHQoZWEsZGEscmEsVil9KShnKTsoZnVuY3Rpb24oVil7Zm9yKHZhciBlYT1uZXcgayxkYT0wO2RhPFEubGVuZ3RoO2RhKz0zKWVhLng9UVtkYSswXSxlYS55PVFbZGErMV0sZWEuej1RW2RhKzJdLGVhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFYpLFFbZGErMF09ZWEueCxRW2RhKzFdPWVhLnksUVtkYSsyXT1lYS56fSkoZSk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBWPW5ldyBrLGVhPTA7ZWE8ClEubGVuZ3RoO2VhKz0zKXtWLng9UVtlYSswXTtWLnk9UVtlYSsxXTtWLno9UVtlYSsyXTt2YXIgZGE9TShWKS8yL01hdGguUEkrLjUscmE9UChWKS9NYXRoLlBJKy41O1UucHVzaChkYSwxLXJhKX1GKCk7digpfSkoKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShRLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoUS5zbGljZSgpLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShVLDIpKTswPT09Zz90aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk6dGhpcy5ub3JtYWxpemVOb3JtYWxzKCl9ZnVuY3Rpb24gSGYoYSxjKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEllKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEllKGEsYyl7bWMuY2FsbCh0aGlzLFsxLDEsMSwKLTEsLTEsMSwtMSwxLC0xLDEsLTEsLTFdLFsyLDEsMCwwLDMsMiwxLDMsMCwyLDMsMV0sYSxjKTt0aGlzLnR5cGU9IlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9fWZ1bmN0aW9uIElmKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik9jdGFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFRkKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFRkKGEsYyl7bWMuY2FsbCh0aGlzLFsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxhLGMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBKZihhLGMpe3hhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iSWNvc2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEplKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEplKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yO21jLmNhbGwodGhpcyxbLTEsZSwwLDEsZSwwLC0xLC1lLDAsMSwtZSwwLDAsLTEsZSwwLDEsZSwwLC0xLC1lLDAsMSwtZSxlLDAsLTEsZSwwLDEsLWUsMCwtMSwtZSwwLDFdLFswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGEsYyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBLZihhLGMpe3hhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iRG9kZWNhaGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBLZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBLZShhLGMpe3ZhciBlPSgxK01hdGguc3FydCg1KSkvMixnPTEvZTttYy5jYWxsKHRoaXMsWy0xLC0xLC0xLC0xLC0xLDEsLTEsMSwtMSwtMSwxLDEsMSwtMSwtMSwxLC0xLDEsMSwxLC0xLDEsMSwxLDAsLWcsLWUsMCwtZyxlLDAsZywtZSwwLGcsZSwtZywtZSwwLC1nLGUsMCxnLC1lLDAsZyxlLDAsLWUsMCwtZyxlLDAsLWcsLWUsMCxnLGUsMCxnXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LAoxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldLGEsYyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gTGYoYSxjLGUsZyx0LHYpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDphLHR1YnVsYXJTZWdtZW50czpjLHJhZGl1czplLHJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnR9O3ZvaWQgMCE9PXYmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2E9bmV3IFVkKGEsYyxlLGcsdCk7dGhpcy50YW5nZW50cz1hLnRhbmdlbnRzO3RoaXMubm9ybWFscz1hLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9YS5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYSk7CnRoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFVkKGEsYyxlLGcsdCl7ZnVuY3Rpb24gdihxYSl7UT1hLmdldFBvaW50QXQocWEvYyxRKTt2YXIgdWE9Ri5ub3JtYWxzW3FhXTtxYT1GLmJpbm9ybWFsc1txYV07Zm9yKFY9MDtWPD1nO1YrKyl7dmFyIG5hPVYvZypNYXRoLlBJKjIsdGE9TWF0aC5zaW4obmEpO25hPS1NYXRoLmNvcyhuYSk7TS54PW5hKnVhLngrdGEqcWEueDtNLnk9bmEqdWEueSt0YSpxYS55O00uej1uYSp1YS56K3RhKnFhLno7TS5ub3JtYWxpemUoKTtkYS5wdXNoKE0ueCxNLnksTS56KTtJLng9US54K2UqTS54O0kueT1RLnkrZSpNLnk7SS56PVEueitlKk0uejtlYS5wdXNoKEkueCxJLnksSS56KX19ZnVuY3Rpb24geigpe2ZvcihWPTE7Vjw9YztWKyspZm9yKFU9MTtVPD1nO1UrKyl7dmFyIHFhPShnKzEpKlYrKFUtMSksdWE9KGcrMSkqVitVLG5hPShnKzEpKihWLTEpK1U7cGEucHVzaCgoZysxKSooVi0xKSsoVS0xKSxxYSxuYSk7cGEucHVzaChxYSx1YSxuYSl9fQpmdW5jdGlvbiBFKCl7Zm9yKFU9MDtVPD1jO1UrKylmb3IoVj0wO1Y8PWc7VisrKVAueD1VL2MsUC55PVYvZyxyYS5wdXNoKFAueCxQLnkpfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDphLHR1YnVsYXJTZWdtZW50czpjLHJhZGl1czplLHJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnR9O2M9Y3x8NjQ7ZT1lfHwxO2c9Z3x8ODt0PXR8fCExO3ZhciBGPWEuY29tcHV0ZUZyZW5ldEZyYW1lcyhjLHQpO3RoaXMudGFuZ2VudHM9Ri50YW5nZW50czt0aGlzLm5vcm1hbHM9Ri5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUYuYmlub3JtYWxzO3ZhciBJPW5ldyBrLE09bmV3IGssUD1uZXcgZixRPW5ldyBrLFUsVixlYT1bXSxkYT1bXSxyYT1bXSxwYT1bXTsoZnVuY3Rpb24oKXtmb3IoVT0wO1U8YztVKyspdihVKTt2KCExPT09dD9jOjApO0UoKTt6KCl9KSgpO3RoaXMuc2V0SW5kZXgocGEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBiYShlYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKGRhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShyYSwyKSl9ZnVuY3Rpb24gTWYoYSxjLGUsZyx0LHYseil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6dCxxOnZ9O3ZvaWQgMCE9PXomJmNvbnNvbGUud2FybigiVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLiIpO3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBMZShhLGMsZSxnLHQsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIExlKGEsYyxlLGcsdCx2KXtmdW5jdGlvbiB6KHRhLEJhLFRhLFVhLENhKXt2YXIgSGE9TWF0aC5zaW4odGEpO0JhPVRhLwpCYSp0YTtUYT1NYXRoLmNvcyhCYSk7Q2EueD1VYSooMitUYSkqLjUqTWF0aC5jb3ModGEpO0NhLnk9VWEqKDIrVGEpKkhhKi41O0NhLno9VWEqTWF0aC5zaW4oQmEpKi41fXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx0dWJlOmMsdHVidWxhclNlZ21lbnRzOmUscmFkaWFsU2VnbWVudHM6ZyxwOnQscTp2fTthPWF8fDE7Yz1jfHwuNDtlPU1hdGguZmxvb3IoZSl8fDY0O2c9TWF0aC5mbG9vcihnKXx8ODt0PXR8fDI7dj12fHwzO3ZhciBFPVtdLEY9W10sST1bXSxNPVtdLFAsUT1uZXcgayxVPW5ldyBrLFY9bmV3IGssZWE9bmV3IGssZGE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGs7Zm9yKFA9MDtQPD1lOysrUCl7dmFyIHFhPVAvZSp0Kk1hdGguUEkqMjt6KHFhLHQsdixhLFYpO3oocWErLjAxLHQsdixhLGVhKTtyYS5zdWJWZWN0b3JzKGVhLFYpO3BhLmFkZFZlY3RvcnMoZWEsVik7ZGEuY3Jvc3NWZWN0b3JzKHJhLApwYSk7cGEuY3Jvc3NWZWN0b3JzKGRhLHJhKTtkYS5ub3JtYWxpemUoKTtwYS5ub3JtYWxpemUoKTtmb3IocWE9MDtxYTw9ZzsrK3FhKXt2YXIgdWE9cWEvZypNYXRoLlBJKjIsbmE9LWMqTWF0aC5jb3ModWEpO3VhPWMqTWF0aC5zaW4odWEpO1EueD1WLngrKG5hKnBhLngrdWEqZGEueCk7US55PVYueSsobmEqcGEueSt1YSpkYS55KTtRLno9Vi56KyhuYSpwYS56K3VhKmRhLnopO0YucHVzaChRLngsUS55LFEueik7VS5zdWJWZWN0b3JzKFEsVikubm9ybWFsaXplKCk7SS5wdXNoKFUueCxVLnksVS56KTtNLnB1c2goUC9lKTtNLnB1c2gocWEvZyl9fWZvcihxYT0xO3FhPD1lO3FhKyspZm9yKFA9MTtQPD1nO1ArKylhPShnKzEpKnFhKyhQLTEpLGM9KGcrMSkqcWErUCx0PShnKzEpKihxYS0xKStQLEUucHVzaCgoZysxKSoocWEtMSkrKFAtMSksYSx0KSxFLnB1c2goYSxjLHQpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoRiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsCm5ldyBiYShJLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShNLDIpKX1mdW5jdGlvbiBOZihhLGMsZSxnLHQpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6YyxyYWRpYWxTZWdtZW50czplLHR1YnVsYXJTZWdtZW50czpnLGFyYzp0fTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgTWUoYSxjLGUsZyx0KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTWUoYSxjLGUsZyx0KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx0dWJlOmMscmFkaWFsU2VnbWVudHM6ZSx0dWJ1bGFyU2VnbWVudHM6ZyxhcmM6dH07YT1hfHwxO2M9Y3x8LjQ7ZT1NYXRoLmZsb29yKGUpfHw4O2c9TWF0aC5mbG9vcihnKXx8Njt0PXR8fDIqTWF0aC5QSTt2YXIgdj1bXSx6PVtdLEU9W10sRj1bXSxJPW5ldyBrLE09bmV3IGssClA9bmV3IGssUSxVO2ZvcihRPTA7UTw9ZTtRKyspZm9yKFU9MDtVPD1nO1UrKyl7dmFyIFY9VS9nKnQsZWE9US9lKk1hdGguUEkqMjtNLng9KGErYypNYXRoLmNvcyhlYSkpKk1hdGguY29zKFYpO00ueT0oYStjKk1hdGguY29zKGVhKSkqTWF0aC5zaW4oVik7TS56PWMqTWF0aC5zaW4oZWEpO3oucHVzaChNLngsTS55LE0ueik7SS54PWEqTWF0aC5jb3MoVik7SS55PWEqTWF0aC5zaW4oVik7UC5zdWJWZWN0b3JzKE0sSSkubm9ybWFsaXplKCk7RS5wdXNoKFAueCxQLnksUC56KTtGLnB1c2goVS9nKTtGLnB1c2goUS9lKX1mb3IoUT0xO1E8PWU7USsrKWZvcihVPTE7VTw9ZztVKyspYT0oZysxKSooUS0xKStVLTEsYz0oZysxKSooUS0xKStVLHQ9KGcrMSkqUStVLHYucHVzaCgoZysxKSpRK1UtMSxhLHQpLHYucHVzaChhLGMsdCk7dGhpcy5zZXRJbmRleCh2KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoRSwKMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKEYsMikpfWZ1bmN0aW9uIFBqKGEsYyxlLGcsdCl7aWYodD09PTA8cm0oYSxjLGUsZykpZm9yKHQ9Yzt0PGU7dCs9Zyl2YXIgdj1Raih0LGFbdF0sYVt0KzFdLHYpO2Vsc2UgZm9yKHQ9ZS1nO3Q+PWM7dC09Zyl2PVFqKHQsYVt0XSxhW3QrMV0sdik7diYmVmQodix2Lm5leHQpJiYoT2Yodiksdj12Lm5leHQpO3JldHVybiB2fWZ1bmN0aW9uIFBmKGEsYyl7aWYoIWEpcmV0dXJuIGE7Y3x8KGM9YSk7ZG97dmFyIGU9ITE7aWYoYS5zdGVpbmVyfHwhVmQoYSxhLm5leHQpJiYwIT09WWIoYS5wcmV2LGEsYS5uZXh0KSlhPWEubmV4dDtlbHNle09mKGEpO2E9Yz1hLnByZXY7aWYoYT09PWEubmV4dClicmVhaztlPSEwfX13aGlsZShlfHxhIT09Yyk7cmV0dXJuIGN9ZnVuY3Rpb24gUWYoYSxjLGUsZyx0LHYseil7aWYoYSl7IXomJnYmJnNtKGEsZyx0LHYpO2Zvcih2YXIgRT1hLEYsSTthLnByZXYhPT1hLm5leHQ7KWlmKEY9YS5wcmV2LApJPWEubmV4dCx2P3RtKGEsZyx0LHYpOnVtKGEpKWMucHVzaChGLmkvZSksYy5wdXNoKGEuaS9lKSxjLnB1c2goSS5pL2UpLE9mKGEpLEU9YT1JLm5leHQ7ZWxzZSBpZihhPUksYT09PUUpe3o/MT09PXo/KGE9dm0oYSxjLGUpLFFmKGEsYyxlLGcsdCx2LDIpKToyPT09eiYmd20oYSxjLGUsZyx0LHYpOlFmKFBmKGEpLGMsZSxnLHQsdiwxKTticmVha319fWZ1bmN0aW9uIHVtKGEpe3ZhciBjPWEucHJldixlPWEubmV4dDtpZigwPD1ZYihjLGEsZSkpcmV0dXJuITE7Zm9yKHZhciBnPWEubmV4dC5uZXh0O2chPT1hLnByZXY7KXtpZihOZShjLngsYy55LGEueCxhLnksZS54LGUueSxnLngsZy55KSYmMDw9WWIoZy5wcmV2LGcsZy5uZXh0KSlyZXR1cm4hMTtnPWcubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiB0bShhLGMsZSxnKXt2YXIgdD1hLnByZXYsdj1hLm5leHQ7aWYoMDw9WWIodCxhLHYpKXJldHVybiExO3ZhciB6PXQueD5hLng/dC54PnYueD90Lng6di54OmEueD52Lng/YS54OnYueCwKRT10Lnk+YS55P3QueT52Lnk/dC55OnYueTphLnk+di55P2EueTp2LnksRj1jaSh0Lng8YS54P3QueDx2Lng/dC54OnYueDphLng8di54P2EueDp2LngsdC55PGEueT90Lnk8di55P3QueTp2Lnk6YS55PHYueT9hLnk6di55LGMsZSxnKTtjPWNpKHosRSxjLGUsZyk7ZT1hLnByZXZaO2ZvcihnPWEubmV4dFo7ZSYmZS56Pj1GJiZnJiZnLno8PWM7KXtpZihlIT09YS5wcmV2JiZlIT09YS5uZXh0JiZOZSh0LngsdC55LGEueCxhLnksdi54LHYueSxlLngsZS55KSYmMDw9WWIoZS5wcmV2LGUsZS5uZXh0KSlyZXR1cm4hMTtlPWUucHJldlo7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTmUodC54LHQueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVliKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafWZvcig7ZSYmZS56Pj1GOyl7aWYoZSE9PWEucHJldiYmZSE9PWEubmV4dCYmTmUodC54LHQueSxhLngsYS55LHYueCx2LnksZS54LGUueSkmJjA8PVliKGUucHJldiwKZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2Wn1mb3IoO2cmJmcuejw9Yzspe2lmKGchPT1hLnByZXYmJmchPT1hLm5leHQmJk5lKHQueCx0LnksYS54LGEueSx2Lngsdi55LGcueCxnLnkpJiYwPD1ZYihnLnByZXYsZyxnLm5leHQpKXJldHVybiExO2c9Zy5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiB2bShhLGMsZSl7dmFyIGc9YTtkb3t2YXIgdD1nLnByZXYsdj1nLm5leHQubmV4dDshVmQodCx2KSYmUmoodCxnLGcubmV4dCx2KSYmUmYodCx2KSYmUmYodix0KSYmKGMucHVzaCh0LmkvZSksYy5wdXNoKGcuaS9lKSxjLnB1c2godi5pL2UpLE9mKGcpLE9mKGcubmV4dCksZz1hPXYpO2c9Zy5uZXh0fXdoaWxlKGchPT1hKTtyZXR1cm4gZ31mdW5jdGlvbiB3bShhLGMsZSxnLHQsdil7dmFyIHo9YTtkb3tmb3IodmFyIEU9ei5uZXh0Lm5leHQ7RSE9PXoucHJldjspe2lmKHouaSE9PUUuaSYmeG0oeixFKSl7YT1Taih6LEUpO3o9UGYoeix6Lm5leHQpO2E9UGYoYSxhLm5leHQpO1FmKHosCmMsZSxnLHQsdik7UWYoYSxjLGUsZyx0LHYpO3JldHVybn1FPUUubmV4dH16PXoubmV4dH13aGlsZSh6IT09YSl9ZnVuY3Rpb24geW0oYSxjLGUsZyl7dmFyIHQ9W10sdjt2YXIgej0wO2Zvcih2PWMubGVuZ3RoO3o8djt6Kyspe3ZhciBFPWNbel0qZzt2YXIgRj16PHYtMT9jW3orMV0qZzphLmxlbmd0aDtFPVBqKGEsRSxGLGcsITEpO0U9PT1FLm5leHQmJihFLnN0ZWluZXI9ITApO3QucHVzaCh6bShFKSl9dC5zb3J0KEFtKTtmb3Ioej0wO3o8dC5sZW5ndGg7eisrKUJtKHRbel0sZSksZT1QZihlLGUubmV4dCk7cmV0dXJuIGV9ZnVuY3Rpb24gQW0oYSxjKXtyZXR1cm4gYS54LWMueH1mdW5jdGlvbiBCbShhLGMpe2lmKGM9Q20oYSxjKSlhPVNqKGMsYSksUGYoYSxhLm5leHQpfWZ1bmN0aW9uIENtKGEsYyl7dmFyIGU9YyxnPWEueCx0PWEueSx2PS1JbmZpbml0eTtkb3tpZih0PD1lLnkmJnQ+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7dmFyIHo9ZS54Kyh0LWUueSkqKGUubmV4dC54LQplLngpLyhlLm5leHQueS1lLnkpO2lmKHo8PWcmJno+dil7dj16O2lmKHo9PT1nKXtpZih0PT09ZS55KXJldHVybiBlO2lmKHQ9PT1lLm5leHQueSlyZXR1cm4gZS5uZXh0fXZhciBFPWUueDxlLm5leHQueD9lOmUubmV4dH19ZT1lLm5leHR9d2hpbGUoZSE9PWMpO2lmKCFFKXJldHVybiBudWxsO2lmKGc9PT12KXJldHVybiBFLnByZXY7Yz1FO3o9RS54O3ZhciBGPUUueSxJPUluZmluaXR5O2ZvcihlPUUubmV4dDtlIT09Yzspe2lmKGc+PWUueCYmZS54Pj16JiZnIT09ZS54JiZOZSh0PEY/Zzp2LHQseixGLHQ8Rj92OmcsdCxlLngsZS55KSl7dmFyIE09TWF0aC5hYnModC1lLnkpLyhnLWUueCk7KE08SXx8TT09PUkmJmUueD5FLngpJiZSZihlLGEpJiYoRT1lLEk9TSl9ZT1lLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gc20oYSxjLGUsZyl7dmFyIHQ9YTtkbyBudWxsPT09dC56JiYodC56PWNpKHQueCx0LnksYyxlLGcpKSx0LnByZXZaPXQucHJldix0PXQubmV4dFo9dC5uZXh0O3doaWxlKHQhPT0KYSk7dC5wcmV2Wi5uZXh0Wj1udWxsO3QucHJldlo9bnVsbDtEbSh0KX1mdW5jdGlvbiBEbShhKXt2YXIgYyxlLGcsdCx2PTE7ZG97dmFyIHo9YTt2YXIgRT1hPW51bGw7Zm9yKGU9MDt6Oyl7ZSsrO3ZhciBGPXo7Zm9yKGM9Zz0wO2M8diYmKGcrKyxGPUYubmV4dFosRik7YysrKTtmb3IodD12OzA8Z3x8MDx0JiZGOykwIT09ZyYmKDA9PT10fHwhRnx8ei56PD1GLnopPyhjPXosej16Lm5leHRaLGctLSk6KGM9RixGPUYubmV4dFosdC0tKSxFP0UubmV4dFo9YzphPWMsYy5wcmV2Wj1FLEU9Yzt6PUZ9RS5uZXh0Wj1udWxsO3YqPTJ9d2hpbGUoMTxlKTtyZXR1cm4gYX1mdW5jdGlvbiBjaShhLGMsZSxnLHQpe2E9MzI3NjcqKGEtZSkqdDtjPTMyNzY3KihjLWcpKnQ7YT0oYXxhPDw4KSYxNjcxMTkzNTthPShhfGE8PDQpJjI1MjY0NTEzNTthPShhfGE8PDIpJjg1ODk5MzQ1OTtjPShjfGM8PDgpJjE2NzExOTM1O2M9KGN8Yzw8NCkmMjUyNjQ1MTM1O2M9KGN8Yzw8MikmODU4OTkzNDU5O3JldHVybihhfAphPDwxKSYxNDMxNjU1NzY1fCgoY3xjPDwxKSYxNDMxNjU1NzY1KTw8MX1mdW5jdGlvbiB6bShhKXt2YXIgYz1hLGU9YTtkb3tpZihjLng8ZS54fHxjLng9PT1lLngmJmMueTxlLnkpZT1jO2M9Yy5uZXh0fXdoaWxlKGMhPT1hKTtyZXR1cm4gZX1mdW5jdGlvbiBOZShhLGMsZSxnLHQsdix6LEUpe3JldHVybiAwPD0odC16KSooYy1FKS0oYS16KSoodi1FKSYmMDw9KGEteikqKGctRSktKGUteikqKGMtRSkmJjA8PShlLXopKih2LUUpLSh0LXopKihnLUUpfWZ1bmN0aW9uIHhtKGEsYyl7cmV0dXJuIGEubmV4dC5pIT09Yy5pJiZhLnByZXYuaSE9PWMuaSYmIUVtKGEsYykmJlJmKGEsYykmJlJmKGMsYSkmJkZtKGEsYyl9ZnVuY3Rpb24gWWIoYSxjLGUpe3JldHVybihjLnktYS55KSooZS54LWMueCktKGMueC1hLngpKihlLnktYy55KX1mdW5jdGlvbiBWZChhLGMpe3JldHVybiBhLng9PT1jLngmJmEueT09PWMueX1mdW5jdGlvbiBSaihhLGMsZSxnKXtyZXR1cm4gVmQoYSxlKSYmVmQoYywKZyl8fFZkKGEsZykmJlZkKGUsYyk/ITA6MDxZYihhLGMsZSkhPT0wPFliKGEsYyxnKSYmMDxZYihlLGcsYSkhPT0wPFliKGUsZyxjKX1mdW5jdGlvbiBFbShhLGMpe3ZhciBlPWE7ZG97aWYoZS5pIT09YS5pJiZlLm5leHQuaSE9PWEuaSYmZS5pIT09Yy5pJiZlLm5leHQuaSE9PWMuaSYmUmooZSxlLm5leHQsYSxjKSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuITF9ZnVuY3Rpb24gUmYoYSxjKXtyZXR1cm4gMD5ZYihhLnByZXYsYSxhLm5leHQpPzA8PVliKGEsYyxhLm5leHQpJiYwPD1ZYihhLGEucHJldixjKTowPlliKGEsYyxhLnByZXYpfHwwPlliKGEsYS5uZXh0LGMpfWZ1bmN0aW9uIEZtKGEsYyl7dmFyIGU9YSxnPSExLHQ9KGEueCtjLngpLzI7Yz0oYS55K2MueSkvMjtkbyBlLnk+YyE9PWUubmV4dC55PmMmJmUubmV4dC55IT09ZS55JiZ0PChlLm5leHQueC1lLngpKihjLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYoZz0hZyksZT1lLm5leHQ7d2hpbGUoZSE9PQphKTtyZXR1cm4gZ31mdW5jdGlvbiBTaihhLGMpe3ZhciBlPW5ldyBkaShhLmksYS54LGEueSksZz1uZXcgZGkoYy5pLGMueCxjLnkpLHQ9YS5uZXh0LHY9Yy5wcmV2O2EubmV4dD1jO2MucHJldj1hO2UubmV4dD10O3QucHJldj1lO2cubmV4dD1lO2UucHJldj1nO3YubmV4dD1nO2cucHJldj12O3JldHVybiBnfWZ1bmN0aW9uIFFqKGEsYyxlLGcpe2E9bmV3IGRpKGEsYyxlKTtnPyhhLm5leHQ9Zy5uZXh0LGEucHJldj1nLGcubmV4dC5wcmV2PWEsZy5uZXh0PWEpOihhLnByZXY9YSxhLm5leHQ9YSk7cmV0dXJuIGF9ZnVuY3Rpb24gT2YoYSl7YS5uZXh0LnByZXY9YS5wcmV2O2EucHJldi5uZXh0PWEubmV4dDthLnByZXZaJiYoYS5wcmV2Wi5uZXh0Wj1hLm5leHRaKTthLm5leHRaJiYoYS5uZXh0Wi5wcmV2Wj1hLnByZXZaKX1mdW5jdGlvbiBkaShhLGMsZSl7dGhpcy5pPWE7dGhpcy54PWM7dGhpcy55PWU7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PQpudWxsO3RoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBybShhLGMsZSxnKXtmb3IodmFyIHQ9MCx2PWUtZztjPGU7Yys9Zyl0Kz0oYVt2XS1hW2NdKSooYVtjKzFdK2FbdisxXSksdj1jO3JldHVybiB0fWZ1bmN0aW9uIFRqKGEpe3ZhciBjPWEubGVuZ3RoOzI8YyYmYVtjLTFdLmVxdWFscyhhWzBdKSYmYS5wb3AoKX1mdW5jdGlvbiBVaihhLGMpe2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWEucHVzaChjW2VdLngpLGEucHVzaChjW2VdLnkpfWZ1bmN0aW9uIFdkKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxvcHRpb25zOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBUYyhhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBUYyhhLGMpe2Z1bmN0aW9uIGUoRil7ZnVuY3Rpb24gSShRYSxlYixtYil7ZWJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7CnJldHVybiBlYi5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKG1iKS5hZGQoUWEpfWZ1bmN0aW9uIE0oUWEsZWIsbWIpe3ZhciBwYj1RYS54LWViLng7dmFyIHNiPVFhLnktZWIueTt2YXIgTGI9bWIueC1RYS54O3ZhciBUYj1tYi55LVFhLnkscWM9cGIqcGIrc2Iqc2I7aWYoTWF0aC5hYnMocGIqVGItc2IqTGIpPk51bWJlci5FUFNJTE9OKXt2YXIgU2M9TWF0aC5zcXJ0KHFjKSxCYz1NYXRoLnNxcnQoTGIqTGIrVGIqVGIpO3FjPWViLngtc2IvU2M7ZWI9ZWIueStwYi9TYztUYj0oKG1iLngtVGIvQmMtcWMpKlRiLShtYi55K0xiL0JjLWViKSpMYikvKHBiKlRiLXNiKkxiKTtMYj1xYytwYipUYi1RYS54O3BiPWViK3NiKlRiLVFhLnk7c2I9TGIqTGIrcGIqcGI7aWYoMj49c2IpcmV0dXJuIG5ldyBmKExiLHBiKTtzYj1NYXRoLnNxcnQoc2IvMil9ZWxzZSBRYT0hMSxwYj5OdW1iZXIuRVBTSUxPTj9MYj5OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpwYjwtTnVtYmVyLkVQU0lMT04/TGI8LU51bWJlci5FUFNJTE9OJiYKKFFhPSEwKTpNYXRoLnNpZ24oc2IpPT09TWF0aC5zaWduKFRiKSYmKFFhPSEwKSxRYT8oTGI9LXNiLHNiPU1hdGguc3FydChxYykpOihMYj1wYixwYj1zYixzYj1NYXRoLnNxcnQocWMvMikpO3JldHVybiBuZXcgZihMYi9zYixwYi9zYil9ZnVuY3Rpb24gUChRYSxlYil7Zm9yKGlhPVFhLmxlbmd0aDswPD0tLWlhOyl7dmFyIG1iPWlhO3ZhciBwYj1pYS0xOzA+cGImJihwYj1RYS5sZW5ndGgtMSk7dmFyIHNiLExiPXFhKzIqVWE7Zm9yKHNiPTA7c2I8TGI7c2IrKyl7dmFyIFRiPVlhKnNiLHFjPVlhKihzYisxKTtWKGViK21iK1RiLGViK3BiK1RiLGViK3BiK3FjLGViK21iK3FjKX19fWZ1bmN0aW9uIFEoUWEsZWIsbWIpe3JhLnB1c2goUWEpO3JhLnB1c2goZWIpO3JhLnB1c2gobWIpfWZ1bmN0aW9uIFUoUWEsZWIsbWIpe2VhKFFhKTtlYShlYik7ZWEobWIpO1FhPXQubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVUb3BVVihnLHQsUWEtMyxRYS0yLFFhLTEpO2RhKFFhWzBdKTtkYShRYVsxXSk7CmRhKFFhWzJdKX1mdW5jdGlvbiBWKFFhLGViLG1iLHBiKXtlYShRYSk7ZWEoZWIpO2VhKHBiKTtlYShlYik7ZWEobWIpO2VhKHBiKTtRYT10Lmxlbmd0aC8zO1FhPUhhLmdlbmVyYXRlU2lkZVdhbGxVVihnLHQsUWEtNixRYS0zLFFhLTIsUWEtMSk7ZGEoUWFbMF0pO2RhKFFhWzFdKTtkYShRYVszXSk7ZGEoUWFbMV0pO2RhKFFhWzJdKTtkYShRYVszXSl9ZnVuY3Rpb24gZWEoUWEpe3QucHVzaChyYVszKlFhXSk7dC5wdXNoKHJhWzMqUWErMV0pO3QucHVzaChyYVszKlFhKzJdKX1mdW5jdGlvbiBkYShRYSl7di5wdXNoKFFhLngpO3YucHVzaChRYS55KX12YXIgcmE9W10scGE9dm9pZCAwIT09Yy5jdXJ2ZVNlZ21lbnRzP2MuY3VydmVTZWdtZW50czoxMixxYT12b2lkIDAhPT1jLnN0ZXBzP2Muc3RlcHM6MSx1YT12b2lkIDAhPT1jLmRlcHRoP2MuZGVwdGg6MTAwLG5hPXZvaWQgMCE9PWMuYmV2ZWxFbmFibGVkP2MuYmV2ZWxFbmFibGVkOiEwLHRhPXZvaWQgMCE9PWMuYmV2ZWxUaGlja25lc3M/CmMuYmV2ZWxUaGlja25lc3M6NixCYT12b2lkIDAhPT1jLmJldmVsU2l6ZT9jLmJldmVsU2l6ZTp0YS0yLFRhPXZvaWQgMCE9PWMuYmV2ZWxPZmZzZXQ/Yy5iZXZlbE9mZnNldDowLFVhPXZvaWQgMCE9PWMuYmV2ZWxTZWdtZW50cz9jLmJldmVsU2VnbWVudHM6MyxDYT1jLmV4dHJ1ZGVQYXRoLEhhPXZvaWQgMCE9PWMuVVZHZW5lcmF0b3I/Yy5VVkdlbmVyYXRvcjpHbTt2b2lkIDAhPT1jLmFtb3VudCYmKGNvbnNvbGUud2FybigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4iKSx1YT1jLmFtb3VudCk7dmFyIERhPSExO2lmKENhKXt2YXIgTWE9Q2EuZ2V0U3BhY2VkUG9pbnRzKHFhKTtEYT0hMDtuYT0hMTt2YXIgZGI9Q2EuY29tcHV0ZUZyZW5ldEZyYW1lcyhxYSwhMSk7dmFyIHRiPW5ldyBrO3ZhciBLYT1uZXcgazt2YXIgYmI9bmV3IGt9bmF8fChUYT1CYT10YT1VYT0wKTt2YXIgamI7cGE9Ri5leHRyYWN0UG9pbnRzKHBhKTsKRj1wYS5zaGFwZTt2YXIgRWI9cGEuaG9sZXM7aWYoIWdkLmlzQ2xvY2tXaXNlKEYpKXtGPUYucmV2ZXJzZSgpO3ZhciB4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7dmFyIGhhPUViW3hiXTtnZC5pc0Nsb2NrV2lzZShoYSkmJihFYlt4Yl09aGEucmV2ZXJzZSgpKX19dmFyIG1hPWdkLnRyaWFuZ3VsYXRlU2hhcGUoRixFYiksemE9Rjt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyloYT1FYlt4Yl0sRj1GLmNvbmNhdChoYSk7dmFyIEphLFlhPUYubGVuZ3RoLE5hLGNiPW1hLmxlbmd0aDtwYT1bXTt2YXIgaWE9MDt2YXIgR2E9emEubGVuZ3RoO3ZhciBMYT1HYS0xO2ZvcihKYT1pYSsxO2lhPEdhO2lhKyssTGErKyxKYSsrKUxhPT09R2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCkscGFbaWFdPU0oemFbaWFdLHphW0xhXSx6YVtKYV0pO0NhPVtdO3ZhciBuYj1wYS5jb25jYXQoKTt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7aGE9RWJbeGJdO3ZhciBWYT0KW107aWE9MDtHYT1oYS5sZW5ndGg7TGE9R2EtMTtmb3IoSmE9aWErMTtpYTxHYTtpYSsrLExhKyssSmErKylMYT09PUdhJiYoTGE9MCksSmE9PT1HYSYmKEphPTApLFZhW2lhXT1NKGhhW2lhXSxoYVtMYV0saGFbSmFdKTtDYS5wdXNoKFZhKTtuYj1uYi5jb25jYXQoVmEpfWZvcihMYT0wO0xhPFVhO0xhKyspe0dhPUxhL1VhO3ZhciBpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7aWE9MDtmb3IoR2E9emEubGVuZ3RoO2lhPEdhO2lhKyspe3ZhciBrYj1JKHphW2lhXSxwYVtpYV0sSmEpO1Eoa2IueCxrYi55LC1pYil9eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGhhPUViW3hiXSxWYT1DYVt4Yl0saWE9MCxHYT1oYS5sZW5ndGg7aWE8R2E7aWErKylrYj1JKGhhW2lhXSxWYVtpYV0sSmEpLFEoa2IueCxrYi55LC1pYil9SmE9QmErVGE7Zm9yKGlhPTA7aWE8WWE7aWErKylrYj1uYT9JKEZbaWFdLG5iW2lhXSwKSmEpOkZbaWFdLERhPyhLYS5jb3B5KGRiLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihrYi55KSxiYi5jb3B5KE1hWzBdKS5hZGQoS2EpLmFkZCh0YiksUShiYi54LGJiLnksYmIueikpOlEoa2IueCxrYi55LDApO2ZvcihHYT0xO0dhPD1xYTtHYSsrKWZvcihpYT0wO2lhPFlhO2lhKyspa2I9bmE/SShGW2lhXSxuYltpYV0sSmEpOkZbaWFdLERhPyhLYS5jb3B5KGRiLm5vcm1hbHNbR2FdKS5tdWx0aXBseVNjYWxhcihrYi54KSx0Yi5jb3B5KGRiLmJpbm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbR2FdKS5hZGQoS2EpLmFkZCh0YiksUShiYi54LGJiLnksYmIueikpOlEoa2IueCxrYi55LHVhL3FhKkdhKTtmb3IoTGE9VWEtMTswPD1MYTtMYS0tKXtHYT1MYS9VYTtpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrClRhO2lhPTA7Zm9yKEdhPXphLmxlbmd0aDtpYTxHYTtpYSsrKWtiPUkoemFbaWFdLHBhW2lhXSxKYSksUShrYi54LGtiLnksdWEraWIpO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWZvcihoYT1FYlt4Yl0sVmE9Q2FbeGJdLGlhPTAsR2E9aGEubGVuZ3RoO2lhPEdhO2lhKyspa2I9SShoYVtpYV0sVmFbaWFdLEphKSxEYT9RKGtiLngsa2IueStNYVtxYS0xXS55LE1hW3FhLTFdLngraWIpOlEoa2IueCxrYi55LHVhK2liKX0oZnVuY3Rpb24oKXt2YXIgUWE9dC5sZW5ndGgvMztpZihuYSl7dmFyIGViPTAqWWE7Zm9yKGlhPTA7aWE8Y2I7aWErKylOYT1tYVtpYV0sVShOYVsyXStlYixOYVsxXStlYixOYVswXStlYik7ZWI9WWEqKHFhKzIqVWEpO2ZvcihpYT0wO2lhPGNiO2lhKyspTmE9bWFbaWFdLFUoTmFbMF0rZWIsTmFbMV0rZWIsTmFbMl0rZWIpfWVsc2V7Zm9yKGlhPTA7aWE8Y2I7aWErKylOYT1tYVtpYV0sVShOYVsyXSxOYVsxXSxOYVswXSk7Zm9yKGlhPTA7aWE8Y2I7aWErKylOYT0KbWFbaWFdLFUoTmFbMF0rWWEqcWEsTmFbMV0rWWEqcWEsTmFbMl0rWWEqcWEpfWcuYWRkR3JvdXAoUWEsdC5sZW5ndGgvMy1RYSwwKX0pKCk7KGZ1bmN0aW9uKCl7dmFyIFFhPXQubGVuZ3RoLzMsZWI9MDtQKHphLGViKTtlYis9emEubGVuZ3RoO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWhhPUViW3hiXSxQKGhhLGViKSxlYis9aGEubGVuZ3RoO2cuYWRkR3JvdXAoUWEsdC5sZW5ndGgvMy1RYSwxKX0pKCl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxvcHRpb25zOmN9O2E9QXJyYXkuaXNBcnJheShhKT9hOlthXTtmb3IodmFyIGc9dGhpcyx0PVtdLHY9W10sej0wLEU9YS5sZW5ndGg7ejxFO3orKyllKGFbel0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKHQsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKHYsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX0KZnVuY3Rpb24gVmooYSxjLGUpe2Uuc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBnPTAsdD1hLmxlbmd0aDtnPHQ7ZysrKWUuc2hhcGVzLnB1c2goYVtnXS51dWlkKTtlbHNlIGUuc2hhcGVzLnB1c2goYS51dWlkKTt2b2lkIDAhPT1jLmV4dHJ1ZGVQYXRoJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPWMuZXh0cnVkZVBhdGgudG9KU09OKCkpO3JldHVybiBlfWZ1bmN0aW9uIFNmKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRleHRHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt0ZXh0OmEscGFyYW1ldGVyczpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgT2UoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gT2UoYSxjKXtjPWN8fHt9O3ZhciBlPWMuZm9udDtpZighZXx8IWUuaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLApuZXcgeGE7YT1lLmdlbmVyYXRlU2hhcGVzKGEsYy5zaXplKTtjLmRlcHRoPXZvaWQgMCE9PWMuaGVpZ2h0P2MuaGVpZ2h0OjUwO3ZvaWQgMD09PWMuYmV2ZWxUaGlja25lc3MmJihjLmJldmVsVGhpY2tuZXNzPTEwKTt2b2lkIDA9PT1jLmJldmVsU2l6ZSYmKGMuYmV2ZWxTaXplPTgpO3ZvaWQgMD09PWMuYmV2ZWxFbmFibGVkJiYoYy5iZXZlbEVuYWJsZWQ9ITEpO1RjLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iVGV4dEJ1ZmZlckdlb21ldHJ5In1mdW5jdGlvbiBUZihhLGMsZSxnLHQsdix6KXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLGhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6dCx0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEVkKGEsYyxlLGcsdCx2LHopKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gRWQoYSxjLGUsZyx0LHYseil7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNwaGVyZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHdpZHRoU2VnbWVudHM6YyxoZWlnaHRTZWdtZW50czplLHBoaVN0YXJ0OmcscGhpTGVuZ3RoOnQsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9O2E9YXx8MTtjPU1hdGgubWF4KDMsTWF0aC5mbG9vcihjKXx8OCk7ZT1NYXRoLm1heCgyLE1hdGguZmxvb3IoZSl8fDYpO2c9dm9pZCAwIT09Zz9nOjA7dD12b2lkIDAhPT10P3Q6MipNYXRoLlBJO3Y9dm9pZCAwIT09dj92OjA7ej12b2lkIDAhPT16P3o6TWF0aC5QSTt2YXIgRT1NYXRoLm1pbih2K3osTWF0aC5QSSksRixJLE09MCxQPVtdLFE9bmV3IGssVT1uZXcgayxWPVtdLGVhPVtdLGRhPVtdLHJhPVtdO2ZvcihJPTA7STw9ZTtJKyspe3ZhciBwYT1bXSxxYT1JL2UsdWE9MDswPT1JJiYwPT12P3VhPS41L2M6ST09ZSYmRT09TWF0aC5QSSYmKHVhPS0uNS9jKTsKZm9yKEY9MDtGPD1jO0YrKyl7dmFyIG5hPUYvYztRLng9LWEqTWF0aC5jb3MoZytuYSp0KSpNYXRoLnNpbih2K3FhKnopO1EueT1hKk1hdGguY29zKHYrcWEqeik7US56PWEqTWF0aC5zaW4oZytuYSp0KSpNYXRoLnNpbih2K3FhKnopO2VhLnB1c2goUS54LFEueSxRLnopO1UuY29weShRKS5ub3JtYWxpemUoKTtkYS5wdXNoKFUueCxVLnksVS56KTtyYS5wdXNoKG5hK3VhLDEtcWEpO3BhLnB1c2goTSsrKX1QLnB1c2gocGEpfWZvcihJPTA7STxlO0krKylmb3IoRj0wO0Y8YztGKyspYT1QW0ldW0YrMV0sZz1QW0ldW0ZdLHQ9UFtJKzFdW0ZdLHo9UFtJKzFdW0YrMV0sKDAhPT1JfHwwPHYpJiZWLnB1c2goYSxnLHopLChJIT09ZS0xfHxFPE1hdGguUEkpJiZWLnB1c2goZyx0LHopO3RoaXMuc2V0SW5kZXgoVik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoZWEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBiYShkYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwKbmV3IGJhKHJhLDIpKX1mdW5jdGlvbiBVZihhLGMsZSxnLHQsdil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czphLG91dGVyUmFkaXVzOmMsdGhldGFTZWdtZW50czplLHBoaVNlZ21lbnRzOmcsdGhldGFTdGFydDp0LHRoZXRhTGVuZ3RoOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBQZShhLGMsZSxnLHQsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFBlKGEsYyxlLGcsdCx2KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUscGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnQsdGhldGFMZW5ndGg6dn07YT1hfHwuNTtjPWN8fDE7dD12b2lkIDAhPT10P3Q6MDt2PXZvaWQgMCE9PXY/djoyKk1hdGguUEk7ZT12b2lkIDAhPT1lP01hdGgubWF4KDMsCmUpOjg7Zz12b2lkIDAhPT1nP01hdGgubWF4KDEsZyk6MTt2YXIgej1bXSxFPVtdLEY9W10sST1bXSxNPWEsUD0oYy1hKS9nLFE9bmV3IGssVT1uZXcgZixWLGVhO2ZvcihWPTA7Vjw9ZztWKyspe2ZvcihlYT0wO2VhPD1lO2VhKyspYT10K2VhL2UqdixRLng9TSpNYXRoLmNvcyhhKSxRLnk9TSpNYXRoLnNpbihhKSxFLnB1c2goUS54LFEueSxRLnopLEYucHVzaCgwLDAsMSksVS54PShRLngvYysxKS8yLFUueT0oUS55L2MrMSkvMixJLnB1c2goVS54LFUueSk7TSs9UH1mb3IoVj0wO1Y8ZztWKyspZm9yKGM9ViooZSsxKSxlYT0wO2VhPGU7ZWErKylhPWVhK2MsdD1hK2UrMSx2PWErZSsyLE09YSsxLHoucHVzaChhLHQsTSksei5wdXNoKHQsdixNKTt0aGlzLnNldEluZGV4KHopO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBiYShGLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShJLDIpKX0KZnVuY3Rpb24gVmYoYSxjLGUsZyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUWUoYSxjLGUsZykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFFlKGEsYyxlLGcpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMYXRoZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3BvaW50czphLHNlZ21lbnRzOmMscGhpU3RhcnQ6ZSxwaGlMZW5ndGg6Z307Yz1NYXRoLmZsb29yKGMpfHwxMjtlPWV8fDA7Zz1nfHwyKk1hdGguUEk7Zz1oYi5jbGFtcChnLDAsMipNYXRoLlBJKTt2YXIgdD1bXSx2PVtdLHo9W10sRT0xL2MsRj1uZXcgayxJPW5ldyBmLE07Zm9yKE09MDtNPD1jO00rKyl7dmFyIFA9ZStNKkUqZzt2YXIgUT1NYXRoLnNpbihQKSxVPU1hdGguY29zKFApO2ZvcihQPTA7UDw9YS5sZW5ndGgtCjE7UCsrKUYueD1hW1BdLngqUSxGLnk9YVtQXS55LEYuej1hW1BdLngqVSx2LnB1c2goRi54LEYueSxGLnopLEkueD1NL2MsSS55PVAvKGEubGVuZ3RoLTEpLHoucHVzaChJLngsSS55KX1mb3IoTT0wO008YztNKyspZm9yKFA9MDtQPGEubGVuZ3RoLTE7UCsrKWU9UCtNKmEubGVuZ3RoLEU9ZSthLmxlbmd0aCxGPWUrYS5sZW5ndGgrMSxJPWUrMSx0LnB1c2goZSxFLEkpLHQucHVzaChFLEYsSSk7dGhpcy5zZXRJbmRleCh0KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYSh6LDIpKTt0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7aWYoZz09PTIqTWF0aC5QSSlmb3IoZz10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5LHQ9bmV3IGssdj1uZXcgayx6PW5ldyBrLGU9YyphLmxlbmd0aCozLFA9TT0wO008YS5sZW5ndGg7TSsrLFArPTMpdC54PWdbUCswXSx0Lnk9Z1tQKzFdLHQuej1nW1ArMl0sdi54PQpnW2UrUCswXSx2Lnk9Z1tlK1ArMV0sdi56PWdbZStQKzJdLHouYWRkVmVjdG9ycyh0LHYpLm5vcm1hbGl6ZSgpLGdbUCswXT1nW2UrUCswXT16LngsZ1tQKzFdPWdbZStQKzFdPXoueSxnW1ArMl09Z1tlK1ArMl09ei56fWZ1bmN0aW9uIFhkKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiOyJvYmplY3QiPT09dHlwZW9mIGMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuIiksYz1jLmN1cnZlU2VnbWVudHMpO3RoaXMucGFyYW1ldGVycz17c2hhcGVzOmEsY3VydmVTZWdtZW50czpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgWWQoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWWQoYSxjKXtmdW5jdGlvbiBlKE0pe3ZhciBQLFE9dC5sZW5ndGgvMztNPU0uZXh0cmFjdFBvaW50cyhjKTt2YXIgVT1NLnNoYXBlLFY9TS5ob2xlczshMT09PWdkLmlzQ2xvY2tXaXNlKFUpJiYKKFU9VS5yZXZlcnNlKCkpO009MDtmb3IoUD1WLmxlbmd0aDtNPFA7TSsrKXt2YXIgZWE9VltNXTshMD09PWdkLmlzQ2xvY2tXaXNlKGVhKSYmKFZbTV09ZWEucmV2ZXJzZSgpKX12YXIgZGE9Z2QudHJpYW5ndWxhdGVTaGFwZShVLFYpO009MDtmb3IoUD1WLmxlbmd0aDtNPFA7TSsrKWVhPVZbTV0sVT1VLmNvbmNhdChlYSk7TT0wO2ZvcihQPVUubGVuZ3RoO008UDtNKyspZWE9VVtNXSx0LnB1c2goZWEueCxlYS55LDApLHYucHVzaCgwLDAsMSksei5wdXNoKGVhLngsZWEueSk7TT0wO2ZvcihQPWRhLmxlbmd0aDtNPFA7TSsrKVU9ZGFbTV0sZy5wdXNoKFVbMF0rUSxVWzFdK1EsVVsyXStRKSxGKz0zfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFwZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLGN1cnZlU2VnbWVudHM6Y307Yz1jfHwxMjt2YXIgZz1bXSx0PVtdLHY9W10sej1bXSxFPTAsRj0wO2lmKCExPT09QXJyYXkuaXNBcnJheShhKSllKGEpO2Vsc2UgZm9yKHZhciBJPQowO0k8YS5sZW5ndGg7SSsrKWUoYVtJXSksdGhpcy5hZGRHcm91cChFLEYsSSksRSs9RixGPTA7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh0LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoeiwyKSl9ZnVuY3Rpb24gV2ooYSxjKXtjLnNoYXBlcz1bXTtpZihBcnJheS5pc0FycmF5KGEpKWZvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyljLnNoYXBlcy5wdXNoKGFbZV0udXVpZCk7ZWxzZSBjLnNoYXBlcy5wdXNoKGEudXVpZCk7cmV0dXJuIGN9ZnVuY3Rpb24gUmUoYSxjKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt0aHJlc2hvbGRBbmdsZTpjfTt2YXIgZT1bXTtjPU1hdGguY29zKGhiLkRFRzJSQUQqKHZvaWQgMCE9PWM/YzoxKSk7dmFyIGc9WzAsMF0sdD17fSx2PVsiYSIsImIiLCJjIl07CmlmKGEuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHo9bmV3IHhhO3ouZnJvbUJ1ZmZlckdlb21ldHJ5KGEpfWVsc2Ugej1hLmNsb25lKCk7ei5tZXJnZVZlcnRpY2VzKCk7ei5jb21wdXRlRmFjZU5vcm1hbHMoKTthPXoudmVydGljZXM7ej16LmZhY2VzO2Zvcih2YXIgRT0wLEY9ei5sZW5ndGg7RTxGO0UrKylmb3IodmFyIEk9eltFXSxNPTA7Mz5NO00rKyl7dmFyIFA9SVt2W01dXTt2YXIgUT1JW3ZbKE0rMSklM11dO2dbMF09TWF0aC5taW4oUCxRKTtnWzFdPU1hdGgubWF4KFAsUSk7UD1nWzBdKyIsIitnWzFdO3ZvaWQgMD09PXRbUF0/dFtQXT17aW5kZXgxOmdbMF0saW5kZXgyOmdbMV0sZmFjZTE6RSxmYWNlMjp2b2lkIDB9OnRbUF0uZmFjZTI9RX1mb3IoUCBpbiB0KWlmKGc9dFtQXSx2b2lkIDA9PT1nLmZhY2UyfHx6W2cuZmFjZTFdLm5vcm1hbC5kb3QoeltnLmZhY2UyXS5ub3JtYWwpPD1jKXY9YVtnLmluZGV4MV0sZS5wdXNoKHYueCx2Lnksdi56KSx2PWFbZy5pbmRleDJdLGUucHVzaCh2LngsCnYueSx2LnopO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGUsMykpfWZ1bmN0aW9uIFpkKGEsYyxlLGcsdCx2LHosRSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEscmFkaXVzQm90dG9tOmMsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czp0LG9wZW5FbmRlZDp2LHRoZXRhU3RhcnQ6eix0aGV0YUxlbmd0aDpFfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgaGQoYSxjLGUsZyx0LHYseixFKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gaGQoYSxjLGUsZyx0LHYseixFKXtmdW5jdGlvbiBGKHBhKXt2YXIgcWEsdWE9bmV3IGYsbmE9bmV3IGssdGE9MCxCYT0hMD09PXBhP2E6YyxUYT0hMD09PXBhPzE6LTE7dmFyIFVhPVY7Zm9yKHFhPTE7cWE8PWc7cWErKylQLnB1c2goMCxkYSpUYSwwKSxRLnB1c2goMCxUYSwwKSxVLnB1c2goLjUsLjUpLApWKys7dmFyIENhPVY7Zm9yKHFhPTA7cWE8PWc7cWErKyl7dmFyIEhhPXFhL2cqRSt6LERhPU1hdGguY29zKEhhKTtIYT1NYXRoLnNpbihIYSk7bmEueD1CYSpIYTtuYS55PWRhKlRhO25hLno9QmEqRGE7UC5wdXNoKG5hLngsbmEueSxuYS56KTtRLnB1c2goMCxUYSwwKTt1YS54PS41KkRhKy41O3VhLnk9LjUqSGEqVGErLjU7VS5wdXNoKHVhLngsdWEueSk7VisrfWZvcihxYT0wO3FhPGc7cWErKyl1YT1VYStxYSxuYT1DYStxYSwhMD09PXBhP00ucHVzaChuYSxuYSsxLHVhKTpNLnB1c2gobmErMSxuYSx1YSksdGErPTM7SS5hZGRHcm91cChyYSx0YSwhMD09PXBhPzE6Mik7cmErPXRhfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDphLHJhZGl1c0JvdHRvbTpjLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6dCxvcGVuRW5kZWQ6dix0aGV0YVN0YXJ0OnosdGhldGFMZW5ndGg6RX07CnZhciBJPXRoaXM7YT12b2lkIDAhPT1hP2E6MTtjPXZvaWQgMCE9PWM/YzoxO2U9ZXx8MTtnPU1hdGguZmxvb3IoZyl8fDg7dD1NYXRoLmZsb29yKHQpfHwxO3Y9dm9pZCAwIT09dj92OiExO3o9dm9pZCAwIT09ej96OjA7RT12b2lkIDAhPT1FP0U6MipNYXRoLlBJO3ZhciBNPVtdLFA9W10sUT1bXSxVPVtdLFY9MCxlYT1bXSxkYT1lLzIscmE9MDsoZnVuY3Rpb24oKXt2YXIgcGEscWEsdWE9bmV3IGssbmE9bmV3IGssdGE9MCxCYT0oYy1hKS9lO2ZvcihxYT0wO3FhPD10O3FhKyspe3ZhciBUYT1bXSxVYT1xYS90LENhPVVhKihjLWEpK2E7Zm9yKHBhPTA7cGE8PWc7cGErKyl7dmFyIEhhPXBhL2csRGE9SGEqRSt6LE1hPU1hdGguc2luKERhKTtEYT1NYXRoLmNvcyhEYSk7bmEueD1DYSpNYTtuYS55PS1VYSplK2RhO25hLno9Q2EqRGE7UC5wdXNoKG5hLngsbmEueSxuYS56KTt1YS5zZXQoTWEsQmEsRGEpLm5vcm1hbGl6ZSgpO1EucHVzaCh1YS54LHVhLnksdWEueik7VS5wdXNoKEhhLAoxLVVhKTtUYS5wdXNoKFYrKyl9ZWEucHVzaChUYSl9Zm9yKHBhPTA7cGE8ZztwYSsrKWZvcihxYT0wO3FhPHQ7cWErKyl1YT1lYVtxYSsxXVtwYV0sbmE9ZWFbcWErMV1bcGErMV0sQmE9ZWFbcWFdW3BhKzFdLE0ucHVzaChlYVtxYV1bcGFdLHVhLEJhKSxNLnB1c2godWEsbmEsQmEpLHRhKz02O0kuYWRkR3JvdXAocmEsdGEsMCk7cmErPXRhfSkoKTshMT09PXYmJigwPGEmJkYoITApLDA8YyYmRighMSkpO3RoaXMuc2V0SW5kZXgoTSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoUCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKFEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKFUsMikpfWZ1bmN0aW9uIFdmKGEsYyxlLGcsdCx2LHope1pkLmNhbGwodGhpcywwLGEsYyxlLGcsdCx2LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZywKb3BlbkVuZGVkOnQsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9fWZ1bmN0aW9uIFhmKGEsYyxlLGcsdCx2LHope2hkLmNhbGwodGhpcywwLGEsYyxlLGcsdCx2LHopO3RoaXMudHlwZT0iQ29uZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6dCx0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gWWYoYSxjLGUsZyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBTZShhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2UoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YSxzZWdtZW50czpjLHRoZXRhU3RhcnQ6ZSx0aGV0YUxlbmd0aDpnfTthPWF8fDE7Yz12b2lkIDAhPT1jP01hdGgubWF4KDMsYyk6ODtlPXZvaWQgMCE9PWU/ZTowO2c9dm9pZCAwIT09Zz9nOjIqTWF0aC5QSTt2YXIgdD1bXSx2PVtdLHo9W10sRT1bXSxGLEk9bmV3IGssTT1uZXcgZjt2LnB1c2goMCwwLDApO3oucHVzaCgwLDAsMSk7RS5wdXNoKC41LC41KTt2YXIgUD0wO2ZvcihGPTM7UDw9YztQKyssRis9Myl7dmFyIFE9ZStQL2MqZztJLng9YSpNYXRoLmNvcyhRKTtJLnk9YSpNYXRoLnNpbihRKTt2LnB1c2goSS54LEkueSxJLnopO3oucHVzaCgwLDAsMSk7TS54PSh2W0ZdL2ErMSkvMjtNLnk9KHZbRisxXS9hKzEpLzI7RS5wdXNoKE0ueCxNLnkpfWZvcihGPTE7Rjw9YztGKyspdC5wdXNoKEYsRisxLDApO3RoaXMuc2V0SW5kZXgodCk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKHosCjMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShFLDIpKX1mdW5jdGlvbiAkZChhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgwKTt0aGlzLnRyYW5zcGFyZW50PSEwO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFRlKGEpe3FiLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn1mdW5jdGlvbiBVYyhhKXtTLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5tZXRhbG5lc3M9dGhpcy5yb3VnaG5lc3M9LjU7dGhpcy5saWdodE1hcD10aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEgoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xOwp0aGlzLmJ1bXBNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLm1ldGFsbmVzc01hcD10aGlzLnJvdWdobmVzc01hcD1udWxsO3RoaXMuZW52TWFwSW50ZW5zaXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGFlKGEpe1VjLmNhbGwodGhpcyk7CnRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMudHlwZT0iTWVzaFBoeXNpY2FsTWF0ZXJpYWwiO3RoaXMucmVmbGVjdGl2aXR5PS41O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0PTA7dGhpcy5zaGVlbj1udWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsO3RoaXMudHJhbnNwYXJlbmN5PTA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gRGMoYSl7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaFBob25nTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEgoMTY3NzcyMTUpO3RoaXMuc3BlY3VsYXI9bmV3IEgoMTExODQ4MSk7dGhpcy5zaGluaW5lc3M9MzA7dGhpcy5saWdodE1hcD10aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEgoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KMTt0aGlzLmJ1bXBNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gYmUoYSl7RGMuY2FsbCh0aGlzKTsKdGhpcy5kZWZpbmVzPXtUT09OOiIifTt0aGlzLnR5cGU9Ik1lc2hUb29uTWF0ZXJpYWwiO3RoaXMuZ3JhZGllbnRNYXA9bnVsbDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBjZShhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiO3RoaXMuYnVtcE1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGRlKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9CiJNZXNoTGFtYmVydE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBIKDE2Nzc3MjE1KTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbWlzc2l2ZT1uZXcgSCgwKTt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPXRoaXMuZW1pc3NpdmVNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBlZShhKXtTLmNhbGwodGhpcyk7CnRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifTt0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5idW1wTWFwPXRoaXMubWFwPXRoaXMubWF0Y2FwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmFscGhhTWFwPW51bGw7dGhpcy5saWdodHM9dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBmZShhKXtGYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGEpfQpmdW5jdGlvbiByYyhhLGMsZSxnKXt0aGlzLnBhcmFtZXRlclBvc2l0aW9ucz1hO3RoaXMuX2NhY2hlZEluZGV4PTA7dGhpcy5yZXN1bHRCdWZmZXI9dm9pZCAwIT09Zz9nOm5ldyBjLmNvbnN0cnVjdG9yKGUpO3RoaXMuc2FtcGxlVmFsdWVzPWM7dGhpcy52YWx1ZVNpemU9ZX1mdW5jdGlvbiBIZyhhLGMsZSxnKXtyYy5jYWxsKHRoaXMsYSxjLGUsZyk7dGhpcy5fb2Zmc2V0TmV4dD10aGlzLl93ZWlnaHROZXh0PXRoaXMuX29mZnNldFByZXY9dGhpcy5fd2VpZ2h0UHJldj0tMH1mdW5jdGlvbiBaZihhLGMsZSxnKXtyYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gSWcoYSxjLGUsZyl7cmMuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFpiKGEsYyxlLGcpe2lmKHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYodm9pZCAwPT09Y3x8MD09PWMubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIisKYSk7dGhpcy5uYW1lPWE7dGhpcy50aW1lcz1WYi5jb252ZXJ0QXJyYXkoYyx0aGlzLlRpbWVCdWZmZXJUeXBlKTt0aGlzLnZhbHVlcz1WYi5jb252ZXJ0QXJyYXkoZSx0aGlzLlZhbHVlQnVmZmVyVHlwZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKGd8fHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfWZ1bmN0aW9uIEpnKGEsYyxlKXtaYi5jYWxsKHRoaXMsYSxjLGUpfWZ1bmN0aW9uIEtnKGEsYyxlLGcpe1piLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBVZShhLGMsZSxnKXtaYi5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gTGcoYSxjLGUsZyl7cmMuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uICRmKGEsYyxlLGcpe1piLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBNZyhhLGMsZSxnKXtaYi5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gVmUoYSxjLGUsZyl7WmIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIHZjKGEsYyxlKXt0aGlzLm5hbWU9YTt0aGlzLnRyYWNrcz0KZTt0aGlzLmR1cmF0aW9uPXZvaWQgMCE9PWM/YzotMTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7MD50aGlzLmR1cmF0aW9uJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1mdW5jdGlvbiBIbShhKXtzd2l0Y2goYS50b0xvd2VyQ2FzZSgpKXtjYXNlICJzY2FsYXIiOmNhc2UgImRvdWJsZSI6Y2FzZSAiZmxvYXQiOmNhc2UgIm51bWJlciI6Y2FzZSAiaW50ZWdlciI6cmV0dXJuIFVlO2Nhc2UgInZlY3RvciI6Y2FzZSAidmVjdG9yMiI6Y2FzZSAidmVjdG9yMyI6Y2FzZSAidmVjdG9yNCI6cmV0dXJuIFZlO2Nhc2UgImNvbG9yIjpyZXR1cm4gS2c7Y2FzZSAicXVhdGVybmlvbiI6cmV0dXJuICRmO2Nhc2UgImJvb2wiOmNhc2UgImJvb2xlYW4iOnJldHVybiBKZztjYXNlICJzdHJpbmciOnJldHVybiBNZ310aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICIrYSk7fWZ1bmN0aW9uIEltKGEpe2lmKHZvaWQgMD09PWEudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTsKdmFyIGM9SG0oYS50eXBlKTtpZih2b2lkIDA9PT1hLnRpbWVzKXt2YXIgZT1bXSxnPVtdO1ZiLmZsYXR0ZW5KU09OKGEua2V5cyxlLGcsInZhbHVlIik7YS50aW1lcz1lO2EudmFsdWVzPWd9cmV0dXJuIHZvaWQgMCE9PWMucGFyc2U/Yy5wYXJzZShhKTpuZXcgYyhhLm5hbWUsYS50aW1lcyxhLnZhbHVlcyxhLmludGVycG9sYXRpb24pfWZ1bmN0aW9uIGVpKGEsYyxlKXt2YXIgZz10aGlzLHQ9ITEsdj0wLHo9MCxFPXZvaWQgMDt0aGlzLm9uU3RhcnQ9dm9pZCAwO3RoaXMub25Mb2FkPWE7dGhpcy5vblByb2dyZXNzPWM7dGhpcy5vbkVycm9yPWU7dGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24oRil7eisrO2lmKCExPT09dCYmdm9pZCAwIT09Zy5vblN0YXJ0KWcub25TdGFydChGLHYseik7dD0hMH07dGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEYpe3YrKztpZih2b2lkIDAhPT1nLm9uUHJvZ3Jlc3MpZy5vblByb2dyZXNzKEYsdix6KTtpZih2PT09eiYmKHQ9ITEsdm9pZCAwIT09Zy5vbkxvYWQpKWcub25Mb2FkKCl9Owp0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbihGKXtpZih2b2lkIDAhPT1nLm9uRXJyb3IpZy5vbkVycm9yKEYpfTt0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24oRil7cmV0dXJuIEU/RShGKTpGfTt0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKEYpe0U9RjtyZXR1cm4gdGhpc319ZnVuY3Rpb24gRGIoYSl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PWE/YTpYajt0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucGF0aD0iIn1mdW5jdGlvbiB3YyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gZmkoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIGdpKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLl9wYXJzZXI9bnVsbH1mdW5jdGlvbiBOZyhhKXtEYi5jYWxsKHRoaXMsYSk7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gV2UoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIE9nKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBQZyhhKXtEYi5jYWxsKHRoaXMsCmEpfWZ1bmN0aW9uIFphKCl7dGhpcy50eXBlPSJDdXJ2ZSI7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWZ1bmN0aW9uIHNjKGEsYyxlLGcsdCx2LHosRSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSI7dGhpcy5hWD1hfHwwO3RoaXMuYVk9Y3x8MDt0aGlzLnhSYWRpdXM9ZXx8MTt0aGlzLnlSYWRpdXM9Z3x8MTt0aGlzLmFTdGFydEFuZ2xlPXR8fDA7dGhpcy5hRW5kQW5nbGU9dnx8MipNYXRoLlBJO3RoaXMuYUNsb2Nrd2lzZT16fHwhMTt0aGlzLmFSb3RhdGlvbj1FfHwwfWZ1bmN0aW9uIFhlKGEsYyxlLGcsdCx2KXtzYy5jYWxsKHRoaXMsYSxjLGUsZSxnLHQsdik7dGhpcy50eXBlPSJBcmNDdXJ2ZSJ9ZnVuY3Rpb24gaGkoKXtmdW5jdGlvbiBhKHYseixFLEYpe2M9djtlPUU7Zz0tMyp2KzMqei0yKkUtRjt0PTIqdi0yKnorRStGfXZhciBjPTAsZT0wLGc9MCx0PTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSSl7YSh6LEUsSSoKKEUtdiksSSooRi16KSl9LGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTpmdW5jdGlvbih2LHosRSxGLEksTSxQKXthKHosRSwoKHotdikvSS0oRS12KS8oSStNKSsoRS16KS9NKSpNLCgoRS16KS9NLShGLXopLyhNK1ApKyhGLUUpL1ApKk0pfSxjYWxjOmZ1bmN0aW9uKHYpe3ZhciB6PXYqdjtyZXR1cm4gYytlKnYrZyp6K3Qqeip2fX19ZnVuY3Rpb24gYmMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiO3RoaXMucG9pbnRzPWF8fFtdO3RoaXMuY2xvc2VkPWN8fCExO3RoaXMuY3VydmVUeXBlPWV8fCJjZW50cmlwZXRhbCI7dGhpcy50ZW5zaW9uPWd8fC41fWZ1bmN0aW9uIFlqKGEsYyxlLGcsdCl7Yz0uNSooZy1jKTt0PS41Kih0LWUpO3ZhciB2PWEqYTtyZXR1cm4oMiplLTIqZytjK3QpKmEqdisoLTMqZSszKmctMipjLXQpKnYrYyphK2V9ZnVuY3Rpb24gSm0oYSxjKXthPTEtYTtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gS20oYSxjKXtyZXR1cm4gMioKKDEtYSkqYSpjfWZ1bmN0aW9uIExtKGEsYyl7cmV0dXJuIGEqYSpjfWZ1bmN0aW9uIGFnKGEsYyxlLGcpe3JldHVybiBKbShhLGMpK0ttKGEsZSkrTG0oYSxnKX1mdW5jdGlvbiBNbShhLGMpe2E9MS1hO3JldHVybiBhKmEqYSpjfWZ1bmN0aW9uIE5tKGEsYyl7dmFyIGU9MS1hO3JldHVybiAzKmUqZSphKmN9ZnVuY3Rpb24gT20oYSxjKXtyZXR1cm4gMyooMS1hKSphKmEqY31mdW5jdGlvbiBQbShhLGMpe3JldHVybiBhKmEqYSpjfWZ1bmN0aW9uIGJnKGEsYyxlLGcsdCl7cmV0dXJuIE1tKGEsYykrTm0oYSxlKStPbShhLGcpK1BtKGEsdCl9ZnVuY3Rpb24gRWMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUiO3RoaXMudjA9YXx8bmV3IGY7dGhpcy52MT1jfHxuZXcgZjt0aGlzLnYyPWV8fG5ldyBmO3RoaXMudjM9Z3x8bmV3IGZ9ZnVuY3Rpb24gVmMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjsKdGhpcy52MD1hfHxuZXcgazt0aGlzLnYxPWN8fG5ldyBrO3RoaXMudjI9ZXx8bmV3IGs7dGhpcy52Mz1nfHxuZXcga31mdW5jdGlvbiBuYyhhLGMpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQ3VydmUiO3RoaXMudjE9YXx8bmV3IGY7dGhpcy52Mj1jfHxuZXcgZn1mdW5jdGlvbiBGYyhhLGMpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQ3VydmUzIjt0aGlzLnYxPWF8fG5ldyBrO3RoaXMudjI9Y3x8bmV3IGt9ZnVuY3Rpb24gR2MoYSxjLGUpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjt0aGlzLnYxPWN8fG5ldyBmO3RoaXMudjI9ZXx8bmV3IGZ9ZnVuY3Rpb24gV2MoYSxjLGUpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9YXx8bmV3IGs7dGhpcy52MT1jfHxuZXcgazt0aGlzLnYyPWV8fG5ldyBrfWZ1bmN0aW9uIEhjKGEpe1phLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iU3BsaW5lQ3VydmUiO3RoaXMucG9pbnRzPWF8fFtdfWZ1bmN0aW9uIGlkKCl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1cnZlUGF0aCI7dGhpcy5jdXJ2ZXM9W107dGhpcy5hdXRvQ2xvc2U9ITF9ZnVuY3Rpb24gSWMoYSl7aWQuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhdGgiO3RoaXMuY3VycmVudFBvaW50PW5ldyBmO2EmJnRoaXMuc2V0RnJvbVBvaW50cyhhKX1mdW5jdGlvbiBGZChhKXtJYy5jYWxsKHRoaXMsYSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMudHlwZT0iU2hhcGUiO3RoaXMuaG9sZXM9W119ZnVuY3Rpb24gS2IoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaWdodCI7dGhpcy5jb2xvcj1uZXcgSChhKTt0aGlzLmludGVuc2l0eT12b2lkIDAhPT1jP2M6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFFnKGEsYyxlKXtLYi5jYWxsKHRoaXMsYSxlKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PQp2b2lkIDA7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMuZ3JvdW5kQ29sb3I9bmV3IEgoYyl9ZnVuY3Rpb24gWGMoYSl7dGhpcy5jYW1lcmE9YTt0aGlzLmJpYXM9MDt0aGlzLnJhZGl1cz0xO3RoaXMubWFwU2l6ZT1uZXcgZig1MTIsNTEyKTt0aGlzLm1hcFBhc3M9dGhpcy5tYXA9bnVsbDt0aGlzLm1hdHJpeD1uZXcgcTt0aGlzLl9mcnVzdHVtPW5ldyBsYzt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoMSwxKTt0aGlzLl92aWV3cG9ydENvdW50PTE7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgwLDAsMSwxKV19ZnVuY3Rpb24gUmcoKXtYYy5jYWxsKHRoaXMsbmV3IHZiKDUwLDEsLjUsNTAwKSl9ZnVuY3Rpb24gU2coYSxjLGUsZyx0LHYpe0tiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IEE7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfSxzZXQ6ZnVuY3Rpb24oeil7dGhpcy5pbnRlbnNpdHk9ei9NYXRoLlBJfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT9lOjA7dGhpcy5hbmdsZT12b2lkIDAhPT1nP2c6TWF0aC5QSS8zO3RoaXMucGVudW1icmE9dm9pZCAwIT09dD90OjA7dGhpcy5kZWNheT12b2lkIDAhPT12P3Y6MTt0aGlzLnNoYWRvdz1uZXcgUmd9ZnVuY3Rpb24gaWkoKXtYYy5jYWxsKHRoaXMsbmV3IHZiKDkwLDEsLjUsNTAwKSk7dGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBmKDQsMik7dGhpcy5fdmlld3BvcnRDb3VudD02O3RoaXMuX3ZpZXdwb3J0cz1bbmV3IHAoMiwxLDEsMSksbmV3IHAoMCwxLDEsMSksbmV3IHAoMywxLDEsMSksbmV3IHAoMSwxLDEsMSksbmV3IHAoMywwLDEsMSksbmV3IHAoMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgaygxLAowLDApLG5ldyBrKC0xLDAsMCksbmV3IGsoMCwwLDEpLG5ldyBrKDAsMCwtMSksbmV3IGsoMCwxLDApLG5ldyBrKDAsLTEsMCldO3RoaXMuX2N1YmVVcHM9W25ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKV19ZnVuY3Rpb24gVGcoYSxjLGUsZyl7S2IuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJQb2ludExpZ2h0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG93ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gNCp0aGlzLmludGVuc2l0eSpNYXRoLlBJfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5pbnRlbnNpdHk9dC8oNCpNYXRoLlBJKX19KTt0aGlzLmRpc3RhbmNlPXZvaWQgMCE9PWU/ZTowO3RoaXMuZGVjYXk9dm9pZCAwIT09Zz9nOjE7dGhpcy5zaGFkb3c9bmV3IGlpfWZ1bmN0aW9uIGNnKGEsYyxlLGcsdCx2KXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjsKdGhpcy56b29tPTE7dGhpcy52aWV3PW51bGw7dGhpcy5sZWZ0PXZvaWQgMCE9PWE/YTotMTt0aGlzLnJpZ2h0PXZvaWQgMCE9PWM/YzoxO3RoaXMudG9wPXZvaWQgMCE9PWU/ZToxO3RoaXMuYm90dG9tPXZvaWQgMCE9PWc/ZzotMTt0aGlzLm5lYXI9dm9pZCAwIT09dD90Oi4xO3RoaXMuZmFyPXZvaWQgMCE9PXY/djoyRTM7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9ZnVuY3Rpb24gVWcoKXtYYy5jYWxsKHRoaXMsbmV3IGNnKC01LDUsNSwtNSwuNSw1MDApKX1mdW5jdGlvbiBWZyhhLGMpe0tiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iRGlyZWN0aW9uYWxMaWdodCI7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMudGFyZ2V0PW5ldyBBO3RoaXMuc2hhZG93PW5ldyBVZ31mdW5jdGlvbiBXZyhhLGMpe0tiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfQpmdW5jdGlvbiBYZyhhLGMsZSxnKXtLYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiO3RoaXMud2lkdGg9dm9pZCAwIT09ZT9lOjEwO3RoaXMuaGVpZ2h0PXZvaWQgMCE9PWc/ZzoxMH1mdW5jdGlvbiBZZyhhKXtEYi5jYWxsKHRoaXMsYSk7dGhpcy50ZXh0dXJlcz17fX1mdW5jdGlvbiBaZygpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD12b2lkIDB9ZnVuY3Rpb24gJGcoYSxjLGUsZyl7Im51bWJlciI9PT10eXBlb2YgZSYmKGc9ZSxlPSExLGNvbnNvbGUuZXJyb3IoIlRIUkVFLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIG5vcm1hbGl6ZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LiIpKTtSLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWd8fDF9ZnVuY3Rpb24gYWgoYSl7RGIuY2FsbCh0aGlzLGEpfQpmdW5jdGlvbiBiaChhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gamkoYSl7InVuZGVmaW5lZCI9PT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKTsidW5kZWZpbmVkIj09PXR5cGVvZiBmZXRjaCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLiIpO0RiLmNhbGwodGhpcyxhKTt0aGlzLm9wdGlvbnM9dm9pZCAwfWZ1bmN0aW9uIGtpKCl7dGhpcy50eXBlPSJTaGFwZVBhdGgiO3RoaXMuY29sb3I9bmV3IEg7dGhpcy5zdWJQYXRocz1bXTt0aGlzLmN1cnJlbnRQYXRoPW51bGx9ZnVuY3Rpb24gbGkoYSl7dGhpcy50eXBlPSJGb250Ijt0aGlzLmRhdGE9YX1mdW5jdGlvbiBRbShhLGMsZSl7YT1BcnJheS5mcm9tP0FycmF5LmZyb20oYSk6U3RyaW5nKGEpLnNwbGl0KCIiKTtjLz1lLnJlc29sdXRpb247CmZvcih2YXIgZz0oZS5ib3VuZGluZ0JveC55TWF4LWUuYm91bmRpbmdCb3gueU1pbitlLnVuZGVybGluZVRoaWNrbmVzcykqYyx0PVtdLHY9MCx6PTAsRT0wO0U8YS5sZW5ndGg7RSsrKXt2YXIgRj1hW0VdOyJcbiI9PT1GPyh2PTAsei09Zyk6KEY9Um0oRixjLHYseixlKSx2Kz1GLm9mZnNldFgsdC5wdXNoKEYucGF0aCkpfXJldHVybiB0fWZ1bmN0aW9uIFJtKGEsYyxlLGcsdCl7dmFyIHY9dC5nbHlwaHNbYV18fHQuZ2x5cGhzWyI/Il07aWYodil7YT1uZXcga2k7aWYodi5vKXt0PXYuX2NhY2hlZE91dGxpbmV8fCh2Ll9jYWNoZWRPdXRsaW5lPXYuby5zcGxpdCgiICIpKTtmb3IodmFyIHo9MCxFPXQubGVuZ3RoO3o8RTspc3dpdGNoKHRbeisrXSl7Y2FzZSAibSI6dmFyIEY9dFt6KytdKmMrZTt2YXIgST10W3orK10qYytnO2EubW92ZVRvKEYsSSk7YnJlYWs7Y2FzZSAibCI6Rj10W3orK10qYytlO0k9dFt6KytdKmMrZzthLmxpbmVUbyhGLEkpO2JyZWFrO2Nhc2UgInEiOkY9dFt6KytdKgpjK2U7ST10W3orK10qYytnO3ZhciBNPXRbeisrXSpjK2U7dmFyIFA9dFt6KytdKmMrZzthLnF1YWRyYXRpY0N1cnZlVG8oTSxQLEYsSSk7YnJlYWs7Y2FzZSAiYiI6Rj10W3orK10qYytlO0k9dFt6KytdKmMrZztNPXRbeisrXSpjK2U7UD10W3orK10qYytnO3ZhciBRPXRbeisrXSpjK2U7dmFyIFU9dFt6KytdKmMrZzthLmJlemllckN1cnZlVG8oTSxQLFEsVSxGLEkpfX1yZXR1cm57b2Zmc2V0WDp2LmhhKmMscGF0aDphfX1jb25zb2xlLmVycm9yKCdUSFJFRS5Gb250OiBjaGFyYWN0ZXIgIicrYSsnIiBkb2VzIG5vdCBleGlzdHMgaW4gZm9udCBmYW1pbHkgJyt0LmZhbWlseU5hbWUrIi4iKX1mdW5jdGlvbiBtaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gY2goYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIGRoKCl7dGhpcy5jb2VmZmljaWVudHM9W107Zm9yKHZhciBhPTA7OT5hO2ErKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBrKX1mdW5jdGlvbiBKYyhhLGMpe0tiLmNhbGwodGhpcywKdm9pZCAwLGMpO3RoaXMuc2g9dm9pZCAwIT09YT9hOm5ldyBkaH1mdW5jdGlvbiBuaShhLGMsZSl7SmMuY2FsbCh0aGlzLHZvaWQgMCxlKTthPShuZXcgSCkuc2V0KGEpO2U9KG5ldyBIKS5zZXQoYyk7Yz1uZXcgayhhLnIsYS5nLGEuYik7YT1uZXcgayhlLnIsZS5nLGUuYik7ZT1NYXRoLnNxcnQoTWF0aC5QSSk7dmFyIGc9ZSpNYXRoLnNxcnQoLjc1KTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5jb3B5KGMpLmFkZChhKS5tdWx0aXBseVNjYWxhcihlKTt0aGlzLnNoLmNvZWZmaWNpZW50c1sxXS5jb3B5KGMpLnN1YihhKS5tdWx0aXBseVNjYWxhcihnKX1mdW5jdGlvbiBvaShhLGMpe0pjLmNhbGwodGhpcyx2b2lkIDAsYyk7YT0obmV3IEgpLnNldChhKTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5zZXQoYS5yLGEuZyxhLmIpLm11bHRpcGx5U2NhbGFyKDIqTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBaaigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xOwp0aGlzLmV5ZVNlcD0uMDY0O3RoaXMuY2FtZXJhTD1uZXcgdmI7dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoMSk7dGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jYW1lcmFSPW5ldyB2Yjt0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSgyKTt0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLl9jYWNoZT17Zm9jdXM6bnVsbCxmb3Y6bnVsbCxhc3BlY3Q6bnVsbCxuZWFyOm51bGwsZmFyOm51bGwsem9vbTpudWxsLGV5ZVNlcDpudWxsfX1mdW5jdGlvbiBwaShhKXt0aGlzLmF1dG9TdGFydD12b2lkIDAhPT1hP2E6ITA7dGhpcy5lbGFwc2VkVGltZT10aGlzLm9sZFRpbWU9dGhpcy5zdGFydFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITF9ZnVuY3Rpb24gcWkoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpb0xpc3RlbmVyIjt0aGlzLmNvbnRleHQ9cmkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7CnRoaXMuZmlsdGVyPW51bGw7dGhpcy50aW1lRGVsdGE9MDt0aGlzLl9jbG9jaz1uZXcgcGl9ZnVuY3Rpb24gWWUoYSl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQXVkaW8iO3RoaXMubGlzdGVuZXI9YTt0aGlzLmNvbnRleHQ9YS5jb250ZXh0O3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KGEuZ2V0SW5wdXQoKSk7dGhpcy5hdXRvcGxheT0hMTt0aGlzLmJ1ZmZlcj1udWxsO3RoaXMuZGV0dW5lPTA7dGhpcy5sb29wPSExO3RoaXMub2Zmc2V0PXRoaXMuc3RhcnRUaW1lPTA7dGhpcy5kdXJhdGlvbj12b2lkIDA7dGhpcy5wbGF5YmFja1JhdGU9MTt0aGlzLmlzUGxheWluZz0hMTt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMDt0aGlzLnNvdXJjZVR5cGU9ImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gc2koYSl7WWUuY2FsbCh0aGlzLGEpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9CiJIUlRGIjt0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZnVuY3Rpb24gdGkoYSxjKXt0aGlzLmFuYWx5c2VyPWEuY29udGV4dC5jcmVhdGVBbmFseXNlcigpO3RoaXMuYW5hbHlzZXIuZmZ0U2l6ZT12b2lkIDAhPT1jP2M6MjA0ODt0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCk7YS5nZXRPdXRwdXQoKS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpfWZ1bmN0aW9uIHVpKGEsYyxlKXt0aGlzLmJpbmRpbmc9YTt0aGlzLnZhbHVlU2l6ZT1lO2E9RmxvYXQ2NEFycmF5O3N3aXRjaChjKXtjYXNlICJxdWF0ZXJuaW9uIjpjPXRoaXMuX3NsZXJwO2JyZWFrO2Nhc2UgInN0cmluZyI6Y2FzZSAiYm9vbCI6YT1BcnJheTtjPXRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmM9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYSg0KmUpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1jO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD0KdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9ZnVuY3Rpb24gYWsoYSxjLGUpe2U9ZXx8Y2MucGFyc2VUcmFja05hbWUoYyk7dGhpcy5fdGFyZ2V0R3JvdXA9YTt0aGlzLl9iaW5kaW5ncz1hLnN1YnNjcmliZV8oYyxlKX1mdW5jdGlvbiBjYyhhLGMsZSl7dGhpcy5wYXRoPWM7dGhpcy5wYXJzZWRQYXRoPWV8fGNjLnBhcnNlVHJhY2tOYW1lKGMpO3RoaXMubm9kZT1jYy5maW5kTm9kZShhLHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSl8fGE7dGhpcy5yb290Tm9kZT1hfWZ1bmN0aW9uIGJrKCl7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMuX29iamVjdHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5DYWNoZWRPYmplY3RzXz0wO3ZhciBhPXt9O3RoaXMuX2luZGljZXNCeVVVSUQ9YTtmb3IodmFyIGM9MCxlPWFyZ3VtZW50cy5sZW5ndGg7YyE9PWU7KytjKWFbYXJndW1lbnRzW2NdLnV1aWRdPWM7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9CltdO3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTt2YXIgZz10aGlzO3RoaXMuc3RhdHM9e29iamVjdHM6e2dldCB0b3RhbCgpe3JldHVybiBnLl9vYmplY3RzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHRoaXMudG90YWwtZy5uQ2FjaGVkT2JqZWN0c199fSxnZXQgYmluZGluZ3NQZXJPYmplY3QoKXtyZXR1cm4gZy5fYmluZGluZ3MubGVuZ3RofX19ZnVuY3Rpb24gY2soYSxjLGUpe3RoaXMuX21peGVyPWE7dGhpcy5fY2xpcD1jO3RoaXMuX2xvY2FsUm9vdD1lfHxudWxsO2E9Yy50cmFja3M7Yz1hLmxlbmd0aDtlPUFycmF5KGMpO2Zvcih2YXIgZz17ZW5kaW5nU3RhcnQ6MjQwMCxlbmRpbmdFbmQ6MjQwMH0sdD0wO3QhPT1jOysrdCl7dmFyIHY9YVt0XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtlW3RdPXY7di5zZXR0aW5ncz1nfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9Zzt0aGlzLl9pbnRlcnBvbGFudHM9ZTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPQpBcnJheShjKTt0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD10aGlzLl9ieUNsaXBDYWNoZUluZGV4PXRoaXMuX2NhY2hlSW5kZXg9bnVsbDt0aGlzLmxvb3A9MjIwMTt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7dGhpcy50aW1lPTA7dGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMud2VpZ2h0PXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnRpbWVTY2FsZT0xO3RoaXMucmVwZXRpdGlvbnM9SW5maW5pdHk7dGhpcy5wYXVzZWQ9ITE7dGhpcy5lbmFibGVkPSEwO3RoaXMuY2xhbXBXaGVuRmluaXNoZWQ9ITE7dGhpcy56ZXJvU2xvcGVBdEVuZD10aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITB9ZnVuY3Rpb24gdmkoYSl7dGhpcy5fcm9vdD1hO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gZWgoYSxjKXsic3RyaW5nIj09PQp0eXBlb2YgYSYmKGNvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKSxhPWMpO3RoaXMudmFsdWU9YX1mdW5jdGlvbiB3aShhLGMsZSl7U2QuY2FsbCh0aGlzLGEsYyk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWV8fDF9ZnVuY3Rpb24gZGsoYSxjLGUsZyl7dGhpcy5yYXk9bmV3IEQoYSxjKTt0aGlzLm5lYXI9ZXx8MDt0aGlzLmZhcj1nfHxJbmZpbml0eTt0aGlzLmNhbWVyYT1udWxsO3RoaXMucGFyYW1zPXtNZXNoOnt9LExpbmU6e30sTE9EOnt9LFBvaW50czp7dGhyZXNob2xkOjF9LFNwcml0ZTp7fX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5wYXJhbXMse1BvaW50Q2xvdWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuIik7cmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBlayhhLApjKXtyZXR1cm4gYS5kaXN0YW5jZS1jLmRpc3RhbmNlfWZ1bmN0aW9uIHhpKGEsYyxlLGcpe2lmKCExIT09YS52aXNpYmxlJiYoYS5yYXljYXN0KGMsZSksITA9PT1nKSl7YT1hLmNoaWxkcmVuO2c9MDtmb3IodmFyIHQ9YS5sZW5ndGg7Zzx0O2crKyl4aShhW2ddLGMsZSwhMCl9fWZ1bmN0aW9uIGZrKGEsYyxlKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1hP2E6MTt0aGlzLnBoaT12b2lkIDAhPT1jP2M6MDt0aGlzLnRoZXRhPXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIGdrKGEsYyxlKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1hP2E6MTt0aGlzLnRoZXRhPXZvaWQgMCE9PWM/YzowO3RoaXMueT12b2lkIDAhPT1lP2U6MDtyZXR1cm4gdGhpc31mdW5jdGlvbiB5aShhLGMpe3RoaXMubWluPXZvaWQgMCE9PWE/YTpuZXcgZihJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09Yz9jOm5ldyBmKC1JbmZpbml0eSwtSW5maW5pdHkpfWZ1bmN0aW9uIHppKGEsYyl7dGhpcy5zdGFydD0Kdm9pZCAwIT09YT9hOm5ldyBrO3RoaXMuZW5kPXZvaWQgMCE9PWM/YzpuZXcga31mdW5jdGlvbiBkZyhhKXtBLmNhbGwodGhpcyk7dGhpcy5tYXRlcmlhbD1hO3RoaXMucmVuZGVyPWZ1bmN0aW9uKCl7fX1mdW5jdGlvbiBlZyhhLGMsZSxnKXt0aGlzLm9iamVjdD1hO3RoaXMuc2l6ZT12b2lkIDAhPT1jP2M6MTthPXZvaWQgMCE9PWU/ZToxNjcxMTY4MDtnPXZvaWQgMCE9PWc/ZzoxO2M9MDsoZT10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmUuaXNHZW9tZXRyeT9jPTMqZS5mYWNlcy5sZW5ndGg6ZSYmZS5pc0J1ZmZlckdlb21ldHJ5JiYoYz1lLmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50KTtlPW5ldyB2YTtjPW5ldyBiYSg2KmMsMyk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixjKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmEsbGluZXdpZHRoOmd9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gWmUoYSxjKXtBLmNhbGwodGhpcyk7CnRoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1jO2E9bmV3IHZhO2M9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2Zvcih2YXIgZT0wLGc9MTszMj5lO2UrKyxnKyspe3ZhciB0PWUvMzIqTWF0aC5QSSoyLHY9Zy8zMipNYXRoLlBJKjI7Yy5wdXNoKE1hdGguY29zKHQpLE1hdGguc2luKHQpLDEsTWF0aC5jb3ModiksTWF0aC5zaW4odiksMSl9YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoYywzKSk7Yz1uZXcgRmIoe2ZvZzohMX0pO3RoaXMuY29uZT1uZXcgSWIoYSxjKTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gaGsoYSl7dmFyIGM9W107YSYmYS5pc0JvbmUmJmMucHVzaChhKTtmb3IodmFyIGU9MDtlPGEuY2hpbGRyZW4ubGVuZ3RoO2UrKyljLnB1c2guYXBwbHkoYywKaGsoYS5jaGlsZHJlbltlXSkpO3JldHVybiBjfWZ1bmN0aW9uICRlKGEpe2Zvcih2YXIgYz1oayhhKSxlPW5ldyB2YSxnPVtdLHQ9W10sdj1uZXcgSCgwLDAsMSksej1uZXcgSCgwLDEsMCksRT0wO0U8Yy5sZW5ndGg7RSsrKXt2YXIgRj1jW0VdO0YucGFyZW50JiZGLnBhcmVudC5pc0JvbmUmJihnLnB1c2goMCwwLDApLGcucHVzaCgwLDAsMCksdC5wdXNoKHYucix2Lmcsdi5iKSx0LnB1c2goei5yLHouZyx6LmIpKX1lLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShnLDMpKTtlLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYSh0LDMpKTtnPW5ldyBGYih7dmVydGV4Q29sb3JzOjIsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsdHJhbnNwYXJlbnQ6ITB9KTtJYi5jYWxsKHRoaXMsZSxnKTt0aGlzLnJvb3Q9YTt0aGlzLmJvbmVzPWM7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITF9ZnVuY3Rpb24gYWYoYSxjLGUpe3RoaXMubGlnaHQ9CmE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMuY29sb3I9ZTthPW5ldyBFZChjLDQsMik7Yz1uZXcgTih7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3lhLmNhbGwodGhpcyxhLGMpO3RoaXMubWF0cml4PXRoaXMubGlnaHQubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYmYoYSxjKXt0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHRIZWxwZXIiO3RoaXMubGlnaHQ9YTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsLTEsMCwxLDEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7Yz1uZXcgRmIoe2ZvZzohMX0pO1hiLmNhbGwodGhpcyxhLGMpO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFsxLDEsMCwtMSwxLDAsLTEsLTEsMCwxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CnRoaXMuYWRkKG5ldyB5YShhLG5ldyBOKHtzaWRlOjEsZm9nOiExfSkpKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGNmKGEsYyxlKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWU7YT1uZXcgVGQoYyk7YS5yb3RhdGVZKC41Kk1hdGguUEkpO3RoaXMubWF0ZXJpYWw9bmV3IE4oe3dpcmVmcmFtZTohMCxmb2c6ITF9KTt2b2lkIDA9PT10aGlzLmNvbG9yJiYodGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9Mik7Yz1hLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTthLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMypjLmNvdW50KSwzKSk7dGhpcy5hZGQobmV3IHlhKGEsdGhpcy5tYXRlcmlhbCkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZGYoYSxjKXt0aGlzLmxpZ2h0UHJvYmU9YTt0aGlzLnNpemU9CmM7YT1uZXcgcWIoe2RlZmluZXM6e0dBTU1BX09VVFBVVDoiIn0sdW5pZm9ybXM6e3NoOnt2YWx1ZTp0aGlzLmxpZ2h0UHJvYmUuc2guY29lZmZpY2llbnRzfSxpbnRlbnNpdHk6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5pbnRlbnNpdHl9fSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsZnJhZ21lbnRTaGFkZXI6IiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NlxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIG5vcm1hbCwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdC8vIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBub3JtYWwsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIGxpbmVhclRvT3V0cHV0KCBpbiB2ZWMzIGEgKSB7XG5cdCNpZmRlZiBHQU1NQV9PVVRQVVRcblx0XHRyZXR1cm4gcG93KCBhLCB2ZWMzKCAxLjAgLyBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSApO1xuXHQjZWxzZVxuXHRcdHJldHVybiBhO1xuXHQjZW5kaWZcbn1cbi8vIHNvdXJjZTogaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cdGZsb2F0IHggXHgzZCBub3JtYWwueCwgeSBceDNkIG5vcm1hbC55LCB6IFx4M2Qgbm9ybWFsLno7XG5cdC8vIGJhbmQgMFxuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0Ly8gYmFuZCAxXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdC8vIGJhbmQgMlxuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApO1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnVuaWZvcm0gdmVjMyBzaFsgOSBdOyAvLyBzaCBjb2VmZmljaWVudHNcbnVuaWZvcm0gZmxvYXQgaW50ZW5zaXR5OyAvLyBsaWdodCBwcm9iZSBpbnRlbnNpdHlcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgc2ggKTtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgUkVDSVBST0NBTF9QSSAqIGlycmFkaWFuY2UgKiBpbnRlbnNpdHk7XG5cdG91dGdvaW5nTGlnaHQgXHgzZCBsaW5lYXJUb091dHB1dCggb3V0Z29pbmdMaWdodCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCAxLjAgKTtcbn0ifSk7CmM9bmV3IEVkKDEsMzIsMTYpO3lhLmNhbGwodGhpcyxjLGEpO3RoaXMub25CZWZvcmVSZW5kZXIoKX1mdW5jdGlvbiBmaChhLGMsZSxnKXthPWF8fDEwO2M9Y3x8MTA7ZT1uZXcgSCh2b2lkIDAhPT1lP2U6NDQ3MzkyNCk7Zz1uZXcgSCh2b2lkIDAhPT1nP2c6ODk0Nzg0OCk7dmFyIHQ9Yy8yLHY9YS9jLHo9YS8yO2E9W107Zm9yKHZhciBFPVtdLEY9MCxJPTAsTT0tejtGPD1jO0YrKyxNKz12KXthLnB1c2goLXosMCxNLHosMCxNKTthLnB1c2goTSwwLC16LE0sMCx6KTt2YXIgUD1GPT09dD9lOmc7UC50b0FycmF5KEUsSSk7SSs9MztQLnRvQXJyYXkoRSxJKTtJKz0zO1AudG9BcnJheShFLEkpO0krPTM7UC50b0FycmF5KEUsSSk7SSs9M31jPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShhLDMpKTtjLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYShFLDMpKTtlPW5ldyBGYih7dmVydGV4Q29sb3JzOjJ9KTtJYi5jYWxsKHRoaXMsYyxlKX1mdW5jdGlvbiBnaChhLApjLGUsZyx0LHYpe2E9YXx8MTA7Yz1jfHwxNjtlPWV8fDg7Zz1nfHw2NDt0PW5ldyBIKHZvaWQgMCE9PXQ/dDo0NDczOTI0KTt2PW5ldyBIKHZvaWQgMCE9PXY/djo4OTQ3ODQ4KTt2YXIgej1bXSxFPVtdLEY7Zm9yKEY9MDtGPD1jO0YrKyl7dmFyIEk9Ri9jKjIqTWF0aC5QSTt2YXIgTT1NYXRoLnNpbihJKSphO0k9TWF0aC5jb3MoSSkqYTt6LnB1c2goMCwwLDApO3oucHVzaChNLDAsSSk7dmFyIFA9RiYxP3Q6djtFLnB1c2goUC5yLFAuZyxQLmIpO0UucHVzaChQLnIsUC5nLFAuYil9Zm9yKEY9MDtGPD1lO0YrKyl7UD1GJjE/dDp2O3ZhciBRPWEtYS9lKkY7Zm9yKGM9MDtjPGc7YysrKUk9Yy9nKjIqTWF0aC5QSSxNPU1hdGguc2luKEkpKlEsST1NYXRoLmNvcyhJKSpRLHoucHVzaChNLDAsSSksRS5wdXNoKFAucixQLmcsUC5iKSxJPShjKzEpL2cqMipNYXRoLlBJLE09TWF0aC5zaW4oSSkqUSxJPU1hdGguY29zKEkpKlEsei5wdXNoKE0sMCxJKSxFLnB1c2goUC5yLFAuZyxQLmIpfWE9Cm5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh6LDMpKTthLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYShFLDMpKTt6PW5ldyBGYih7dmVydGV4Q29sb3JzOjJ9KTtJYi5jYWxsKHRoaXMsYSx6KX1mdW5jdGlvbiBlZihhLGMsZSxnKXt0aGlzLmF1ZGlvPWE7dGhpcy5yYW5nZT1jfHwxO3RoaXMuZGl2aXNpb25zSW5uZXJBbmdsZT1lfHwxNjt0aGlzLmRpdmlzaW9uc091dGVyQW5nbGU9Z3x8MjthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMyooMyoodGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlKzIqdGhpcy5kaXZpc2lvbnNPdXRlckFuZ2xlKSszKSksMykpO2M9bmV3IEZiKHtjb2xvcjo2NTI4MH0pO2U9bmV3IEZiKHtjb2xvcjoxNjc3Njk2MH0pO1hiLmNhbGwodGhpcyxhLFtlLGNdKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGZnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PQpjP2M6MTthPXZvaWQgMCE9PWU/ZToxNjc3Njk2MDtnPXZvaWQgMCE9PWc/ZzoxO2M9MDsoZT10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmUuaXNHZW9tZXRyeT9jPWUuZmFjZXMubGVuZ3RoOmNvbnNvbGUud2FybigiVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4iKTtlPW5ldyB2YTtjPW5ldyBiYSg2KmMsMyk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixjKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmEsbGluZXdpZHRoOmd9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZmYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTsKdm9pZCAwPT09YyYmKGM9MSk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWy1jLGMsMCxjLGMsMCxjLC1jLDAsLWMsLWMsMCwtYyxjLDBdLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5saWdodFBsYW5lPW5ldyBYYihhLGMpO3RoaXMuYWRkKHRoaXMubGlnaHRQbGFuZSk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzAsMCwwLDAsMCwxXSwzKSk7dGhpcy50YXJnZXRMaW5lPW5ldyBYYihhLGMpO3RoaXMuYWRkKHRoaXMudGFyZ2V0TGluZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBnZyhhKXtmdW5jdGlvbiBjKFUsVixlYSl7ZShVLGVhKTtlKFYsZWEpfWZ1bmN0aW9uIGUoVSxWKXt2LnB1c2goMCwwLDApO3oucHVzaChWLnIsVi5nLFYuYik7dm9pZCAwPT09RVtVXSYmKEVbVV09W10pO0VbVV0ucHVzaCh2Lmxlbmd0aC8zLTEpfXZhciBnPW5ldyB2YSx0PW5ldyBGYih7Y29sb3I6MTY3NzcyMTUsdmVydGV4Q29sb3JzOjF9KSwKdj1bXSx6PVtdLEU9e30sRj1uZXcgSCgxNjc1NTIwMCksST1uZXcgSCgxNjcxMTY4MCksTT1uZXcgSCg0Mzc3NSksUD1uZXcgSCgxNjc3NzIxNSksUT1uZXcgSCgzMzU1NDQzKTtjKCJuMSIsIm4yIixGKTtjKCJuMiIsIm40IixGKTtjKCJuNCIsIm4zIixGKTtjKCJuMyIsIm4xIixGKTtjKCJmMSIsImYyIixGKTtjKCJmMiIsImY0IixGKTtjKCJmNCIsImYzIixGKTtjKCJmMyIsImYxIixGKTtjKCJuMSIsImYxIixGKTtjKCJuMiIsImYyIixGKTtjKCJuMyIsImYzIixGKTtjKCJuNCIsImY0IixGKTtjKCJwIiwibjEiLEkpO2MoInAiLCJuMiIsSSk7YygicCIsIm4zIixJKTtjKCJwIiwibjQiLEkpO2MoInUxIiwidTIiLE0pO2MoInUyIiwidTMiLE0pO2MoInUzIiwidTEiLE0pO2MoImMiLCJ0IixQKTtjKCJwIiwiYyIsUSk7YygiY24xIiwiY24yIixRKTtjKCJjbjMiLCJjbjQiLFEpO2MoImNmMSIsImNmMiIsUSk7YygiY2YzIiwiY2Y0IixRKTtnLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLApuZXcgYmEodiwzKSk7Zy5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgYmEoeiwzKSk7SWIuY2FsbCh0aGlzLGcsdCk7dGhpcy5jYW1lcmE9YTt0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4JiZ0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5wb2ludE1hcD1FO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gUWIoYSxjLGUsZyx0LHYseil7aGguc2V0KHQsdix6KS51bnByb2plY3QoZyk7YT1jW2FdO2lmKHZvaWQgMCE9PWEpZm9yKGU9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksYz0wLGc9YS5sZW5ndGg7YzxnO2MrKyllLnNldFhZWihhW2NdLGhoLngsaGgueSxoaC56KX1mdW5jdGlvbiBqZChhLGMpe3RoaXMub2JqZWN0PWE7dm9pZCAwPT09YyYmKGM9MTY3NzY5NjApO2E9bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNywKNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgRmxvYXQzMkFycmF5KDI0KSxnPW5ldyB2YTtnLnNldEluZGV4KG5ldyBSKGEsMSkpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIoZSwzKSk7SWIuY2FsbCh0aGlzLGcsbmV3IEZiKHtjb2xvcjpjfSkpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGhnKGEsYyl7dGhpcy50eXBlPSJCb3gzSGVscGVyIjt0aGlzLmJveD1hO2M9Y3x8MTY3NzY5NjA7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSk7dmFyIGU9bmV3IHZhO2Uuc2V0SW5kZXgobmV3IFIoYSwxKSk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsLTEsMSwxLDEsLTEsLTEsMSwtMSwtMSwtMSwtMSwxLC0xLC0xXSwzKSk7SWIuY2FsbCh0aGlzLGUsbmV3IEZiKHtjb2xvcjpjfSkpO3RoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9CmZ1bmN0aW9uIGlnKGEsYyxlKXt0aGlzLnR5cGU9IlBsYW5lSGVscGVyIjt0aGlzLnBsYW5lPWE7dGhpcy5zaXplPXZvaWQgMD09PWM/MTpjO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2M9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFsxLC0xLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwxLDAsMCwxLDAsMCwwXSwzKSk7Yy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtYYi5jYWxsKHRoaXMsYyxuZXcgRmIoe2NvbG9yOmF9KSk7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsMSwxLC0xLC0xLDEsMSwtMSwxXSwzKSk7Yy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLmFkZChuZXcgeWEoYyxuZXcgTih7Y29sb3I6YSxvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITF9KSkpfWZ1bmN0aW9uIGtkKGEsYyxlLGcsdCx2KXtBLmNhbGwodGhpcyk7CnZvaWQgMD09PWEmJihhPW5ldyBrKDAsMCwxKSk7dm9pZCAwPT09YyYmKGM9bmV3IGsoMCwwLDApKTt2b2lkIDA9PT1lJiYoZT0xKTt2b2lkIDA9PT1nJiYoZz0xNjc3Njk2MCk7dm9pZCAwPT09dCYmKHQ9LjIqZSk7dm9pZCAwPT09diYmKHY9LjIqdCk7dm9pZCAwPT09aWgmJihpaD1uZXcgdmEsaWguYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFswLDAsMCwwLDEsMF0sMykpLEFpPW5ldyBoZCgwLC41LDEsNSwxKSxBaS50cmFuc2xhdGUoMCwtLjUsMCkpO3RoaXMucG9zaXRpb24uY29weShjKTt0aGlzLmxpbmU9bmV3IFhiKGloLG5ldyBGYih7Y29sb3I6Z30pKTt0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmxpbmUpO3RoaXMuY29uZT1uZXcgeWEoQWksbmV3IE4oe2NvbG9yOmd9KSk7dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5hZGQodGhpcy5jb25lKTt0aGlzLnNldERpcmVjdGlvbihhKTt0aGlzLnNldExlbmd0aChlLAp0LHYpfWZ1bmN0aW9uIGpnKGEpe2E9YXx8MTt2YXIgYz1bMCwwLDAsYSwwLDAsMCwwLDAsMCxhLDAsMCwwLDAsMCwwLGFdO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGMsMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGJhKFsxLDAsMCwxLC42LDAsMCwxLDAsLjYsMSwwLDAsMCwxLDAsLjYsMV0sMykpO2M9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLGMpfWZ1bmN0aW9uIGlrKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuIik7YmMuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSI7dGhpcy5jbG9zZWQ9ITB9ZnVuY3Rpb24gamsoYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTsKYmMuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSJ9ZnVuY3Rpb24gQmkoYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtiYy5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn12b2lkIDA9PT1OdW1iZXIuRVBTSUxPTiYmKE51bWJlci5FUFNJTE9OPU1hdGgucG93KDIsLTUyKSk7dm9pZCAwPT09TnVtYmVyLmlzSW50ZWdlciYmKE51bWJlci5pc0ludGVnZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmaXNGaW5pdGUoYSkmJk1hdGguZmxvb3IoYSk9PT1hfSk7dm9pZCAwPT09TWF0aC5zaWduJiYoTWF0aC5zaWduPWZ1bmN0aW9uKGEpe3JldHVybiAwPmE/LTE6MDxhPzE6K2F9KTshMT09PSJuYW1lImluIEZ1bmN0aW9uLnByb3RvdHlwZSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwibmFtZSIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb25ccyooW15cKFxzXSopLylbMV19fSk7dm9pZCAwPT09T2JqZWN0LmFzc2lnbiYmKE9iamVjdC5hc3NpZ249ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBjPU9iamVjdChhKSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIGc9YXJndW1lbnRzW2VdO2lmKHZvaWQgMCE9PWcmJm51bGwhPT1nKWZvcih2YXIgdCBpbiBnKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChnLHQpJiYoY1t0XT1nW3RdKX1yZXR1cm4gY30pO09iamVjdC5hc3NpZ24oZC5wcm90b3R5cGUse2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO3ZhciBlPQp0aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09ZVthXSYmKGVbYV09W10pOy0xPT09ZVthXS5pbmRleE9mKGMpJiZlW2FdLnB1c2goYyl9LGhhc0V2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7dmFyIGU9dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1lW2FdJiYtMSE9PWVbYV0uaW5kZXhPZihjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyYmKGE9dGhpcy5fbGlzdGVuZXJzW2FdLHZvaWQgMCE9PWEmJihjPWEuaW5kZXhPZihjKSwtMSE9PWMmJmEuc3BsaWNlKGMsMSkpKX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhKXtpZih2b2lkIDAhPT10aGlzLl9saXN0ZW5lcnMpe3ZhciBjPXRoaXMuX2xpc3RlbmVyc1thLnR5cGVdO2lmKHZvaWQgMCE9PWMpe2EudGFyZ2V0PXRoaXM7Yz1jLnNsaWNlKDApO2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLmNhbGwodGhpcywKYSl9fX19KTtmb3IodmFyICRiPVtdLGtnPTA7MjU2PmtnO2tnKyspJGJba2ddPSgxNj5rZz8iMCI6IiIpK2tnLnRvU3RyaW5nKDE2KTt2YXIgaGI9e0RFRzJSQUQ6TWF0aC5QSS8xODAsUkFEMkRFRzoxODAvTWF0aC5QSSxnZW5lcmF0ZVVVSUQ6ZnVuY3Rpb24oKXt2YXIgYT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxjPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZz00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oJGJbYSYyNTVdKyRiW2E+PjgmMjU1XSskYlthPj4xNiYyNTVdKyRiW2E+PjI0JjI1NV0rIi0iKyRiW2MmMjU1XSskYltjPj44JjI1NV0rIi0iKyRiW2M+PjE2JjE1fDY0XSskYltjPj4yNCYyNTVdKyItIiskYltlJjYzfDEyOF0rJGJbZT4+OCYyNTVdKyItIiskYltlPj4xNiYyNTVdKyRiW2U+PjI0JjI1NV0rJGJbZyYyNTVdKyRiW2c+PjgmMjU1XSskYltnPj4xNiYyNTVdKyRiW2c+PjI0JjI1NV0pLnRvVXBwZXJDYXNlKCl9LApjbGFtcDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIE1hdGgubWF4KGMsTWF0aC5taW4oZSxhKSl9LGV1Y2xpZGVhbk1vZHVsbzpmdW5jdGlvbihhLGMpe3JldHVybihhJWMrYyklY30sbWFwTGluZWFyOmZ1bmN0aW9uKGEsYyxlLGcsdCl7cmV0dXJuIGcrKGEtYykqKHQtZykvKGUtYyl9LGxlcnA6ZnVuY3Rpb24oYSxjLGUpe3JldHVybigxLWUpKmErZSpjfSxzbW9vdGhzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKigzLTIqYSl9LHNtb290aGVyc3RlcDpmdW5jdGlvbihhLGMsZSl7aWYoYTw9YylyZXR1cm4gMDtpZihhPj1lKXJldHVybiAxO2E9KGEtYykvKGUtYyk7cmV0dXJuIGEqYSphKihhKig2KmEtMTUpKzEwKX0scmFuZEludDpmdW5jdGlvbihhLGMpe3JldHVybiBhK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooYy1hKzEpKX0scmFuZEZsb2F0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErCk1hdGgucmFuZG9tKCkqKGMtYSl9LHJhbmRGbG9hdFNwcmVhZDpmdW5jdGlvbihhKXtyZXR1cm4gYSooLjUtTWF0aC5yYW5kb20oKSl9LGRlZ1RvUmFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKmhiLkRFRzJSQUR9LHJhZFRvRGVnOmZ1bmN0aW9uKGEpe3JldHVybiBhKmhiLlJBRDJERUd9LGlzUG93ZXJPZlR3bzpmdW5jdGlvbihhKXtyZXR1cm4gMD09PShhJmEtMSkmJjAhPT1hfSxjZWlsUG93ZXJPZlR3bzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmNlaWwoTWF0aC5sb2coYSkvTWF0aC5MTjIpKX0sZmxvb3JQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjIpKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMueD1hfX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55fSwKc2V0OmZ1bmN0aW9uKGEpe3RoaXMueT1hfX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtpc1ZlY3RvcjI6ITAsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy54PWE7dGhpcy55PWM7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnk9dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYSl7dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiKwphKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLng9YS54O3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3JldHVybiB0aGlzfSxhZGRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kz1hO3RoaXMueSs9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7cmV0dXJuIHRoaXN9LApzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTtyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09YTt0aGlzLnktPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hLng7dGhpcy55Kj1hLnk7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCo9YTt0aGlzLnkqPWE7cmV0dXJuIHRoaXN9LGRpdmlkZTpmdW5jdGlvbihhKXt0aGlzLngvPWEueDt0aGlzLnkvPWEueTtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdO3RoaXMueT1hWzFdKmMrYVs0XSplK2FbN107cmV0dXJuIHRoaXN9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWF4KHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYS55KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYS54LE1hdGgubWluKGMueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYS55LE1hdGgubWluKGMueSx0aGlzLnkpKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLE1hdGgubWluKGMsCnRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGV8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGEsTWF0aC5taW4oYyxlKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0wPnRoaXMueD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PTA+dGhpcy55P01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KTsKcmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLngrdGhpcy55KmEueX0sY3Jvc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLnktdGhpcy55KmEueH0sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sYW5nbGU6ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpOzA+YSYmKGErPTIqTWF0aC5QSSk7cmV0dXJuIGF9LApkaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChhKSl9LGRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLng7YT10aGlzLnktYS55O3JldHVybiBjKmMrYSphfSxtYW5oYXR0YW5EaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyh0aGlzLngtYS54KStNYXRoLmFicyh0aGlzLnktYS55KX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhjLGEpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLng9PT10aGlzLngmJmEueT09PXRoaXMueX0sCmZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTtyZXR1cm4gYX0sZnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7dm9pZCAwIT09ZSYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7dGhpcy54PWEuZ2V0WChjKTt0aGlzLnk9YS5nZXRZKGMpO3JldHVybiB0aGlzfSxyb3RhdGVBcm91bmQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1NYXRoLmNvcyhjKTtjPU1hdGguc2luKGMpO3ZhciBnPXRoaXMueC1hLngsdD10aGlzLnktYS55O3RoaXMueD1nKmUtdCpjK2EueDt0aGlzLnk9ZypjK3QqZSthLnk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihoLAp7c2xlcnA6ZnVuY3Rpb24oYSxjLGUsZyl7cmV0dXJuIGUuY29weShhKS5zbGVycChjLGcpfSxzbGVycEZsYXQ6ZnVuY3Rpb24oYSxjLGUsZyx0LHYseil7dmFyIEU9ZVtnKzBdLEY9ZVtnKzFdLEk9ZVtnKzJdO2U9ZVtnKzNdO2c9dFt2KzBdO3ZhciBNPXRbdisxXSxQPXRbdisyXTt0PXRbdiszXTtpZihlIT09dHx8RSE9PWd8fEYhPT1NfHxJIT09UCl7dj0xLXo7dmFyIFE9RSpnK0YqTStJKlArZSp0LFU9MDw9UT8xOi0xLFY9MS1RKlE7Vj5OdW1iZXIuRVBTSUxPTiYmKFY9TWF0aC5zcXJ0KFYpLFE9TWF0aC5hdGFuMihWLFEqVSksdj1NYXRoLnNpbih2KlEpL1Ysej1NYXRoLnNpbih6KlEpL1YpO1UqPXo7RT1FKnYrZypVO0Y9Rip2K00qVTtJPUkqditQKlU7ZT1lKnYrdCpVO3Y9PT0xLXomJih6PTEvTWF0aC5zcXJ0KEUqRStGKkYrSSpJK2UqZSksRSo9eixGKj16LEkqPXosZSo9eil9YVtjXT1FO2FbYysxXT1GO2FbYysyXT1JO2FbYyszXT1lfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGgucHJvdG90eXBlLAp7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sejp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3p9LHNldDpmdW5jdGlvbihhKXt0aGlzLl96PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sdzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3d9LHNldDpmdW5jdGlvbihhKXt0aGlzLl93PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX19KTtPYmplY3QuYXNzaWduKGgucHJvdG90eXBlLHtpc1F1YXRlcm5pb246ITAsc2V0OmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuX3g9YTt0aGlzLl95PWM7dGhpcy5fej1lO3RoaXMuX3c9Zzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsCnRoaXMuX3ksdGhpcy5feix0aGlzLl93KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLl94PWEueDt0aGlzLl95PWEueTt0aGlzLl96PWEuejt0aGlzLl93PWEudzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21FdWxlcjpmdW5jdGlvbihhLGMpe2lmKCFhfHwhYS5pc0V1bGVyKXRocm93IEVycm9yKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTt2YXIgZT1hLl94LGc9YS5feSx0PWEuX3o7YT1hLm9yZGVyO3ZhciB2PU1hdGguY29zLHo9TWF0aC5zaW4sRT12KGUvMiksRj12KGcvMik7dj12KHQvMik7ZT16KGUvMik7Zz16KGcvMik7dD16KHQvMik7IlhZWiI9PT1hPyh0aGlzLl94PWUqRip2K0UqZyp0LHRoaXMuX3k9RSpnKnYtZSpGKnQsdGhpcy5fej1FKkYqdCtlKmcqdix0aGlzLl93PUUqRip2LWUqZyp0KToiWVhaIj09PQphPyh0aGlzLl94PWUqRip2K0UqZyp0LHRoaXMuX3k9RSpnKnYtZSpGKnQsdGhpcy5fej1FKkYqdC1lKmcqdix0aGlzLl93PUUqRip2K2UqZyp0KToiWlhZIj09PWE/KHRoaXMuX3g9ZSpGKnYtRSpnKnQsdGhpcy5feT1FKmcqditlKkYqdCx0aGlzLl96PUUqRip0K2UqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnQpOiJaWVgiPT09YT8odGhpcy5feD1lKkYqdi1FKmcqdCx0aGlzLl95PUUqZyp2K2UqRip0LHRoaXMuX3o9RSpGKnQtZSpnKnYsdGhpcy5fdz1FKkYqditlKmcqdCk6IllaWCI9PT1hPyh0aGlzLl94PWUqRip2K0UqZyp0LHRoaXMuX3k9RSpnKnYrZSpGKnQsdGhpcy5fej1FKkYqdC1lKmcqdix0aGlzLl93PUUqRip2LWUqZyp0KToiWFpZIj09PWEmJih0aGlzLl94PWUqRip2LUUqZyp0LHRoaXMuX3k9RSpnKnYtZSpGKnQsdGhpcy5fej1FKkYqdCtlKmcqdix0aGlzLl93PUUqRip2K2UqZyp0KTshMSE9PWMmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUF4aXNBbmdsZTpmdW5jdGlvbihhLApjKXtjLz0yO3ZhciBlPU1hdGguc2luKGMpO3RoaXMuX3g9YS54KmU7dGhpcy5feT1hLnkqZTt0aGlzLl96PWEueiplO3RoaXMuX3c9TWF0aC5jb3MoYyk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9YS5lbGVtZW50cyxlPWNbMF07YT1jWzRdO3ZhciBnPWNbOF0sdD1jWzFdLHY9Y1s1XSx6PWNbOV0sRT1jWzJdLEY9Y1s2XTtjPWNbMTBdO3ZhciBJPWUrditjOzA8ST8oZT0uNS9NYXRoLnNxcnQoSSsxKSx0aGlzLl93PS4yNS9lLHRoaXMuX3g9KEYteikqZSx0aGlzLl95PShnLUUpKmUsdGhpcy5fej0odC1hKSplKTplPnYmJmU+Yz8oZT0yKk1hdGguc3FydCgxK2Utdi1jKSx0aGlzLl93PShGLXopL2UsdGhpcy5feD0uMjUqZSx0aGlzLl95PShhK3QpL2UsdGhpcy5fej0oZytFKS9lKTp2PmM/KGU9MipNYXRoLnNxcnQoMSt2LWUtYyksdGhpcy5fdz0oZy1FKS9lLHRoaXMuX3g9KGErdCkvZSwKdGhpcy5feT0uMjUqZSx0aGlzLl96PSh6K0YpL2UpOihlPTIqTWF0aC5zcXJ0KDErYy1lLXYpLHRoaXMuX3c9KHQtYSkvZSx0aGlzLl94PShnK0UpL2UsdGhpcy5feT0oeitGKS9lLHRoaXMuX3o9LjI1KmUpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVVuaXRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5kb3QoYykrMTsxRS02PmU/KGU9MCxNYXRoLmFicyhhLngpPk1hdGguYWJzKGEueik/KHRoaXMuX3g9LWEueSx0aGlzLl95PWEueCx0aGlzLl96PTApOih0aGlzLl94PTAsdGhpcy5feT0tYS56LHRoaXMuX3o9YS55KSk6KHRoaXMuX3g9YS55KmMuei1hLnoqYy55LHRoaXMuX3k9YS56KmMueC1hLngqYy56LHRoaXMuX3o9YS54KmMueS1hLnkqYy54KTt0aGlzLl93PWU7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGFuZ2xlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKGhiLmNsYW1wKHRoaXMuZG90KGEpLC0xLAoxKSkpfSxyb3RhdGVUb3dhcmRzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5hbmdsZVRvKGEpO2lmKDA9PT1lKXJldHVybiB0aGlzO3RoaXMuc2xlcnAoYSxNYXRoLm1pbigxLGMvZSkpO3JldHVybiB0aGlzfSxpbnZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9LGNvbmp1Z2F0ZTpmdW5jdGlvbigpe3RoaXMuX3gqPS0xO3RoaXMuX3kqPS0xO3RoaXMuX3oqPS0xO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl94KmEuX3grdGhpcy5feSphLl95K3RoaXMuX3oqYS5feit0aGlzLl93KmEuX3d9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqCnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZW5ndGgoKTswPT09YT8odGhpcy5fej10aGlzLl95PXRoaXMuX3g9MCx0aGlzLl93PTEpOihhPTEvYSx0aGlzLl94Kj1hLHRoaXMuX3kqPWEsdGhpcy5feio9YSx0aGlzLl93Kj1hKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKGEsYykpOnRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLGEpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKGEsdGhpcyl9LG11bHRpcGx5UXVhdGVybmlvbnM6ZnVuY3Rpb24oYSwKYyl7dmFyIGU9YS5feCxnPWEuX3ksdD1hLl96O2E9YS5fdzt2YXIgdj1jLl94LHo9Yy5feSxFPWMuX3o7Yz1jLl93O3RoaXMuX3g9ZSpjK2EqditnKkUtdCp6O3RoaXMuX3k9ZypjK2Eqeit0KnYtZSpFO3RoaXMuX3o9dCpjK2EqRStlKnotZyp2O3RoaXMuX3c9YSpjLWUqdi1nKnotdCpFO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2xlcnA6ZnVuY3Rpb24oYSxjKXtpZigwPT09YylyZXR1cm4gdGhpcztpZigxPT09YylyZXR1cm4gdGhpcy5jb3B5KGEpO3ZhciBlPXRoaXMuX3gsZz10aGlzLl95LHQ9dGhpcy5feix2PXRoaXMuX3csej12KmEuX3crZSphLl94K2cqYS5feSt0KmEuX3o7MD56Pyh0aGlzLl93PS1hLl93LHRoaXMuX3g9LWEuX3gsdGhpcy5feT0tYS5feSx0aGlzLl96PS1hLl96LHo9LXopOnRoaXMuY29weShhKTtpZigxPD16KXJldHVybiB0aGlzLl93PXYsdGhpcy5feD1lLHRoaXMuX3k9Zyx0aGlzLl96PXQsdGhpczthPTEteip6O2lmKGE8PU51bWJlci5FUFNJTE9OKXJldHVybiB6PQoxLWMsdGhpcy5fdz16KnYrYyp0aGlzLl93LHRoaXMuX3g9eiplK2MqdGhpcy5feCx0aGlzLl95PXoqZytjKnRoaXMuX3ksdGhpcy5fej16KnQrYyp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXM7YT1NYXRoLnNxcnQoYSk7dmFyIEU9TWF0aC5hdGFuMihhLHopO3o9TWF0aC5zaW4oKDEtYykqRSkvYTtjPU1hdGguc2luKGMqRSkvYTt0aGlzLl93PXYqeit0aGlzLl93KmM7dGhpcy5feD1lKnordGhpcy5feCpjO3RoaXMuX3k9Zyp6K3RoaXMuX3kqYzt0aGlzLl96PXQqeit0aGlzLl96KmM7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3g9PT10aGlzLl94JiZhLl95PT09dGhpcy5feSYmYS5fej09PXRoaXMuX3omJmEuX3c9PT10aGlzLl93fSxmcm9tQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLl94PWFbY107dGhpcy5feT1hW2MrMV07CnRoaXMuX3o9YVtjKzJdO3RoaXMuX3c9YVtjKzNdO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMuX3g7YVtjKzFdPXRoaXMuX3k7YVtjKzJdPXRoaXMuX3o7YVtjKzNdPXRoaXMuX3c7cmV0dXJuIGF9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pO3ZhciBDaT1uZXcgayxraz1uZXcgaDtPYmplY3QuYXNzaWduKGsucHJvdG90eXBlLHtpc1ZlY3RvcjM6ITAsc2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMuej10aGlzLnk9dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYSl7dGhpcy54PWE7cmV0dXJuIHRoaXN9LApzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTsKdGhpcy56PWEuejtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7dGhpcy56Kz1hLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3RoaXMueis9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYztyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksCnRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3RoaXMuei09YS56O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTt0aGlzLnotPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnMoYSxjKTt0aGlzLngqPWEueDt0aGlzLnkqPWEueTt0aGlzLnoqPWEuejtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPQphO3JldHVybiB0aGlzfSxtdWx0aXBseVZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54KmMueDt0aGlzLnk9YS55KmMueTt0aGlzLno9YS56KmMuejtyZXR1cm4gdGhpc30sYXBwbHlFdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oa2suc2V0RnJvbUV1bGVyKGEpKX0sYXBwbHlBeGlzQW5nbGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oa2suc2V0RnJvbUF4aXNBbmdsZShhLGMpKX0sYXBwbHlNYXRyaXgzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMuejthPWEuZWxlbWVudHM7dGhpcy54PWFbMF0qYythWzNdKmUrYVs2XSpnO3RoaXMueT1hWzFdKmMrYVs0XSplK2FbN10qCmc7dGhpcy56PWFbMl0qYythWzVdKmUrYVs4XSpnO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt2YXIgdD0xLyhhWzNdKmMrYVs3XSplK2FbMTFdKmcrYVsxNV0pO3RoaXMueD0oYVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0pKnQ7dGhpcy55PShhWzFdKmMrYVs1XSplK2FbOV0qZythWzEzXSkqdDt0aGlzLno9KGFbMl0qYythWzZdKmUrYVsxMF0qZythWzE0XSkqdDtyZXR1cm4gdGhpc30sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMueix0PWEueCx2PWEueSx6PWEuejthPWEudzt2YXIgRT1hKmMrdipnLXoqZSxGPWEqZSt6KmMtdCpnLEk9YSpnK3QqZS12KmM7Yz0tdCpjLXYqZS16Kmc7dGhpcy54PUUqYStjKi10K0YqLXotSSotdjt0aGlzLnk9RiphK2MqLXYrSSotdC1FKi16O3RoaXMuej1JKmErYyoteitFKi12LUYqLXQ7cmV0dXJuIHRoaXN9LApwcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KGEucHJvamVjdGlvbk1hdHJpeCl9LHVucHJvamVjdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpfSx0cmFuc2Zvcm1EaXJlY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmc7dGhpcy55PWFbMV0qYythWzVdKmUrYVs5XSpnO3RoaXMuej1hWzJdKmMrYVs2XSplK2FbMTBdKmc7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGRpdmlkZTpmdW5jdGlvbihhKXt0aGlzLngvPWEueDt0aGlzLnkvPWEueTt0aGlzLnovPWEuejtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxtaW46ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWluKHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1pbih0aGlzLnksYS55KTt0aGlzLno9TWF0aC5taW4odGhpcy56LGEueik7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYS54LE1hdGgubWluKGMueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYS55LE1hdGgubWluKGMueSx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYS56LE1hdGgubWluKGMueix0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEsCk1hdGgubWluKGMsdGhpcy56KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7dGhpcy56PU1hdGgucm91bmQodGhpcy56KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9CjA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7cmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3RoaXMuej0tdGhpcy56O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLngrdGhpcy55KmEueSt0aGlzLnoqYS56fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen0sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrCk1hdGguYWJzKHRoaXMueil9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei10aGlzLnopKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxjcm9zczpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5jcm9zc1ZlY3RvcnMoYSxjKSk6dGhpcy5jcm9zc1ZlY3RvcnModGhpcywKYSl9LGNyb3NzVmVjdG9yczpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgdD1jLngsdj1jLnk7Yz1jLno7dGhpcy54PWcqYy1hKnY7dGhpcy55PWEqdC1lKmM7dGhpcy56PWUqdi1nKnQ7cmV0dXJuIHRoaXN9LHByb2plY3RPblZlY3RvcjpmdW5jdGlvbihhKXt2YXIgYz1hLmRvdCh0aGlzKS9hLmxlbmd0aFNxKCk7cmV0dXJuIHRoaXMuY29weShhKS5tdWx0aXBseVNjYWxhcihjKX0scHJvamVjdE9uUGxhbmU6ZnVuY3Rpb24oYSl7Q2kuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IoYSk7cmV0dXJuIHRoaXMuc3ViKENpKX0scmVmbGVjdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdWIoQ2kuY29weShhKS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KGEpKSl9LGFuZ2xlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWNvcyhoYi5jbGFtcCh0aGlzLmRvdChhKS9NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKmEubGVuZ3RoU3EoKSksLTEsMSkpfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChhKSl9LApkaXN0YW5jZVRvU3F1YXJlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngtYS54LGU9dGhpcy55LWEueTthPXRoaXMuei1hLno7cmV0dXJuIGMqYytlKmUrYSphfSxtYW5oYXR0YW5EaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyh0aGlzLngtYS54KStNYXRoLmFicyh0aGlzLnktYS55KStNYXRoLmFicyh0aGlzLnotYS56KX0sc2V0RnJvbVNwaGVyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKGEucmFkaXVzLGEucGhpLGEudGhldGEpfSxzZXRGcm9tU3BoZXJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1NYXRoLnNpbihjKSphO3RoaXMueD1nKk1hdGguc2luKGUpO3RoaXMueT1NYXRoLmNvcyhjKSphO3RoaXMuej1nKk1hdGguY29zKGUpO3JldHVybiB0aGlzfSxzZXRGcm9tQ3lsaW5kcmljYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKGEucmFkaXVzLGEudGhldGEsCmEueSl9LHNldEZyb21DeWxpbmRyaWNhbENvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy54PWEqTWF0aC5zaW4oYyk7dGhpcy55PWU7dGhpcy56PWEqTWF0aC5jb3MoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhQb3NpdGlvbjpmdW5jdGlvbihhKXthPWEuZWxlbWVudHM7dGhpcy54PWFbMTJdO3RoaXMueT1hWzEzXTt0aGlzLno9YVsxNF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwwKS5sZW5ndGgoKSxlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDEpLmxlbmd0aCgpO2E9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMikubGVuZ3RoKCk7dGhpcy54PWM7dGhpcy55PWU7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhDb2x1bW46ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkoYS5lbGVtZW50cyw0KmMpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PQp0aGlzLngmJmEueT09PXRoaXMueSYmYS56PT09dGhpcy56fSxmcm9tQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLng9YVtjXTt0aGlzLnk9YVtjKzFdO3RoaXMuej1hW2MrMl07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTtyZXR1cm4gdGhpc319KTt2YXIgZ2U9bmV3IGs7T2JqZWN0LmFzc2lnbihyLnByb3RvdHlwZSx7aXNNYXRyaXgzOiEwLHNldDpmdW5jdGlvbihhLApjLGUsZyx0LHYseixFLEYpe3ZhciBJPXRoaXMuZWxlbWVudHM7SVswXT1hO0lbMV09ZztJWzJdPXo7SVszXT1jO0lbNF09dDtJWzVdPUU7SVs2XT1lO0lbN109djtJWzhdPUY7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMF09YVswXTtjWzFdPWFbMV07Y1syXT1hWzJdO2NbM109YVszXTtjWzRdPWFbNF07Y1s1XT1hWzVdO2NbNl09YVs2XTtjWzddPWFbN107Y1s4XT1hWzhdO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4NDpmdW5jdGlvbihhKXthPWEuZWxlbWVudHM7dGhpcy5zZXQoYVswXSxhWzRdLGFbOF0sYVsxXSxhWzVdLGFbOV0sYVsyXSxhWzZdLGFbMTBdKTtyZXR1cm4gdGhpc30sCmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT1hLmNvdW50O2M8ZTtjKyspZ2UueD1hLmdldFgoYyksZ2UueT1hLmdldFkoYyksZ2Uuej1hLmdldFooYyksZ2UuYXBwbHlNYXRyaXgzKHRoaXMpLGEuc2V0WFlaKGMsZ2UueCxnZS55LGdlLnopO3JldHVybiBhfSxtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHQ9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxGPWVbN10sST1lWzJdLE09ZVs1XTtlPWVbOF07dmFyIFA9Z1swXSxRPWdbM10sVT1nWzZdLFY9Z1sxXSxlYT1nWzRdLGRhPWdbN10scmE9Z1syXSxwYT1nWzVdO2c9Z1s4XTsKY1swXT1hKlArdCpWK3YqcmE7Y1szXT1hKlErdCplYSt2KnBhO2NbNl09YSpVK3QqZGErdipnO2NbMV09eipQK0UqVitGKnJhO2NbNF09eipRK0UqZWErRipwYTtjWzddPXoqVStFKmRhK0YqZztjWzJdPUkqUCtNKlYrZSpyYTtjWzVdPUkqUStNKmVhK2UqcGE7Y1s4XT1JKlUrTSpkYStlKmc7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7Y1swXSo9YTtjWzNdKj1hO2NbNl0qPWE7Y1sxXSo9YTtjWzRdKj1hO2NbN10qPWE7Y1syXSo9YTtjWzVdKj1hO2NbOF0qPWE7cmV0dXJuIHRoaXN9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cyxjPWFbMF0sZT1hWzFdLGc9YVsyXSx0PWFbM10sdj1hWzRdLHo9YVs1XSxFPWFbNl0sRj1hWzddO2E9YVs4XTtyZXR1cm4gYyp2KmEtYyp6KkYtZSp0KmErZSp6KkUrZyp0KkYtZyp2KkV9LGdldEludmVyc2U6ZnVuY3Rpb24oYSxjKXthJiZhLmlzTWF0cml4NCYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgbm8gbG9uZ2VyIHRha2VzIGEgTWF0cml4NCBhcmd1bWVudC4iKTt2YXIgZT1hLmVsZW1lbnRzO2E9dGhpcy5lbGVtZW50czt2YXIgZz1lWzBdLHQ9ZVsxXSx2PWVbMl0sej1lWzNdLEU9ZVs0XSxGPWVbNV0sST1lWzZdLE09ZVs3XTtlPWVbOF07dmFyIFA9ZSpFLUYqTSxRPUYqSS1lKnosVT1NKnotRSpJLFY9ZypQK3QqUSt2KlU7aWYoMD09PVYpe2lmKCEwPT09Yyl0aHJvdyBFcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtyZXR1cm4gdGhpcy5pZGVudGl0eSgpfWM9MS9WO2FbMF09UCpjO2FbMV09KHYqTS1lKnQpKmM7YVsyXT0oRip0LXYqRSkqYzthWzNdPVEqYzthWzRdPQooZSpnLXYqSSkqYzthWzVdPSh2KnotRipnKSpjO2FbNl09VSpjO2FbN109KHQqSS1NKmcpKmM7YVs4XT0oRSpnLXQqeikqYztyZXR1cm4gdGhpc30sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVszXTthWzNdPWM7Yz1hWzJdO2FbMl09YVs2XTthWzZdPWM7Yz1hWzVdO2FbNV09YVs3XTthWzddPWM7cmV0dXJuIHRoaXN9LGdldE5vcm1hbE1hdHJpeDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NChhKS5nZXRJbnZlcnNlKHRoaXMpLnRyYW5zcG9zZSgpfSx0cmFuc3Bvc2VJbnRvQXJyYXk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthWzBdPWNbMF07YVsxXT1jWzNdO2FbMl09Y1s2XTthWzNdPWNbMV07YVs0XT1jWzRdO2FbNV09Y1s3XTthWzZdPWNbMl07YVs3XT1jWzVdO2FbOF09Y1s4XTtyZXR1cm4gdGhpc30sc2V0VXZUcmFuc2Zvcm06ZnVuY3Rpb24oYSxjLGUsZyx0LHYseil7dmFyIEU9Ck1hdGguY29zKHQpO3Q9TWF0aC5zaW4odCk7dGhpcy5zZXQoZSpFLGUqdCwtZSooRSp2K3QqeikrdithLC1nKnQsZypFLC1nKigtdCp2K0UqeikreitjLDAsMCwxKX0sc2NhbGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWE7ZVszXSo9YTtlWzZdKj1hO2VbMV0qPWM7ZVs0XSo9YztlWzddKj1jO3JldHVybiB0aGlzfSxyb3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt2YXIgZT10aGlzLmVsZW1lbnRzLGc9ZVswXSx0PWVbM10sdj1lWzZdLHo9ZVsxXSxFPWVbNF0sRj1lWzddO2VbMF09YypnK2EqejtlWzNdPWMqdCthKkU7ZVs2XT1jKnYrYSpGO2VbMV09LWEqZytjKno7ZVs0XT0tYSp0K2MqRTtlWzddPS1hKnYrYypGO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0rPWEqZVsyXTtlWzNdKz1hKmVbNV07ZVs2XSs9YSplWzhdO2VbMV0rPWMqZVsyXTtlWzRdKz0KYyplWzVdO2VbN10rPWMqZVs4XTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2Zvcih2YXIgZT0wOzk+ZTtlKyspaWYoY1tlXSE9PWFbZV0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07YVtjKzFdPWVbMV07YVtjKzJdPWVbMl07YVtjKzNdPWVbM107YVtjKzRdPWVbNF07YVtjKzVdPWVbNV07YVtjKzZdPWVbNl07YVtjKzddPWVbN107YVtjKzhdPWVbOF07cmV0dXJuIGF9fSk7dmFyIGdmLEdkPXtnZXREYXRhVVJMOmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIGEuc3JjOwppZighKGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkpe3ZvaWQgMD09PWdmJiYoZ2Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIikpO2dmLndpZHRoPWEud2lkdGg7Z2YuaGVpZ2h0PWEuaGVpZ2h0O3ZhciBjPWdmLmdldENvbnRleHQoIjJkIik7YSBpbnN0YW5jZW9mIEltYWdlRGF0YT9jLnB1dEltYWdlRGF0YShhLDAsMCk6Yy5kcmF3SW1hZ2UoYSwwLDAsYS53aWR0aCxhLmhlaWdodCk7YT1nZn1yZXR1cm4gMjA0ODxhLndpZHRofHwyMDQ4PGEuaGVpZ2h0P2EudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNik6YS50b0RhdGFVUkwoImltYWdlL3BuZyIpfX0saGw9MDtsLkRFRkFVTFRfSU1BR0U9dm9pZCAwO2wuREVGQVVMVF9NQVBQSU5HPTMwMDtsLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpsLGlzVGV4dHVyZTohMCx1cGRhdGVNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LAp0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWU7dGhpcy5pbWFnZT1hLmltYWdlO3RoaXMubWlwbWFwcz1hLm1pcG1hcHMuc2xpY2UoMCk7dGhpcy5tYXBwaW5nPWEubWFwcGluZzt0aGlzLndyYXBTPWEud3JhcFM7dGhpcy53cmFwVD1hLndyYXBUO3RoaXMubWFnRmlsdGVyPWEubWFnRmlsdGVyO3RoaXMubWluRmlsdGVyPWEubWluRmlsdGVyO3RoaXMuYW5pc290cm9weT1hLmFuaXNvdHJvcHk7dGhpcy5mb3JtYXQ9YS5mb3JtYXQ7dGhpcy50eXBlPWEudHlwZTt0aGlzLm9mZnNldC5jb3B5KGEub2Zmc2V0KTt0aGlzLnJlcGVhdC5jb3B5KGEucmVwZWF0KTt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9YS5nZW5lcmF0ZU1pcG1hcHM7dGhpcy5wcmVtdWx0aXBseUFscGhhPWEucHJlbXVsdGlwbHlBbHBoYTt0aGlzLmZsaXBZPWEuZmxpcFk7dGhpcy51bnBhY2tBbGlnbm1lbnQ9YS51bnBhY2tBbGlnbm1lbnQ7dGhpcy5lbmNvZGluZz1hLmVuY29kaW5nO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9dm9pZCAwPT09YXx8InN0cmluZyI9PT10eXBlb2YgYTtpZighYyYmdm9pZCAwIT09YS50ZXh0dXJlc1t0aGlzLnV1aWRdKXJldHVybiBhLnRleHR1cmVzW3RoaXMudXVpZF07dmFyIGU9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsbWFwcGluZzp0aGlzLm1hcHBpbmcsCnJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtpZih2b2lkIDAhPT10aGlzLmltYWdlKXt2YXIgZz10aGlzLmltYWdlO3ZvaWQgMD09PWcudXVpZCYmKGcudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKSk7aWYoIWMmJnZvaWQgMD09PWEuaW1hZ2VzW2cudXVpZF0pe2lmKEFycmF5LmlzQXJyYXkoZykpe3ZhciB0PQpbXTtmb3IodmFyIHY9MCx6PWcubGVuZ3RoO3Y8ejt2KyspdC5wdXNoKEdkLmdldERhdGFVUkwoZ1t2XSkpfWVsc2UgdD1HZC5nZXREYXRhVVJMKGcpO2EuaW1hZ2VzW2cudXVpZF09e3V1aWQ6Zy51dWlkLHVybDp0fX1lLmltYWdlPWcudXVpZH1jfHwoYS50ZXh0dXJlc1t0aGlzLnV1aWRdPWUpO3JldHVybiBlfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfSx0cmFuc2Zvcm1VdjpmdW5jdGlvbihhKXtpZigzMDAhPT10aGlzLm1hcHBpbmcpcmV0dXJuIGE7YS5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpO2lmKDA+YS54fHwxPGEueClzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAxRTM6YS54LT1NYXRoLmZsb29yKGEueCk7YnJlYWs7Y2FzZSAxMDAxOmEueD0wPmEueD8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueD0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLngpJTIpP01hdGguY2VpbChhLngpLWEueDphLngtTWF0aC5mbG9vcihhLngpfWlmKDA+CmEueXx8MTxhLnkpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMUUzOmEueS09TWF0aC5mbG9vcihhLnkpO2JyZWFrO2Nhc2UgMTAwMTphLnk9MD5hLnk/MDoxO2JyZWFrO2Nhc2UgMTAwMjphLnk9MT09PU1hdGguYWJzKE1hdGguZmxvb3IoYS55KSUyKT9NYXRoLmNlaWwoYS55KS1hLnk6YS55LU1hdGguZmxvb3IoYS55KX10aGlzLmZsaXBZJiYoYS55PTEtYS55KTtyZXR1cm4gYX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobC5wcm90b3R5cGUsIm5lZWRzVXBkYXRlIix7c2V0OmZ1bmN0aW9uKGEpeyEwPT09YSYmdGhpcy52ZXJzaW9uKyt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocC5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy56PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnd9LHNldDpmdW5jdGlvbihhKXt0aGlzLnc9YX19fSk7T2JqZWN0LmFzc2lnbihwLnByb3RvdHlwZSwKe2lzVmVjdG9yNDohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy54PWE7dGhpcy55PWM7dGhpcy56PWU7dGhpcy53PWc7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnc9dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhKXt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0VzpmdW5jdGlvbihhKXt0aGlzLnc9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7Y2FzZSAyOnRoaXMuej1jO2JyZWFrO2Nhc2UgMzp0aGlzLnc9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54OwpjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLng9YS54O3RoaXMueT1hLnk7dGhpcy56PWEuejt0aGlzLnc9dm9pZCAwIT09YS53P2EudzoxO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejt0aGlzLncrPWEudztyZXR1cm4gdGhpc30sCmFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3RoaXMueis9YTt0aGlzLncrPWE7cmV0dXJuIHRoaXN9LGFkZFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54K2MueDt0aGlzLnk9YS55K2MueTt0aGlzLno9YS56K2Muejt0aGlzLnc9YS53K2MudztyZXR1cm4gdGhpc30sYWRkU2NhbGVkVmVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz1hLngqYzt0aGlzLnkrPWEueSpjO3RoaXMueis9YS56KmM7dGhpcy53Kz1hLncqYztyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7dGhpcy53LT1hLnc7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPQphO3RoaXMueS09YTt0aGlzLnotPWE7dGhpcy53LT1hO3JldHVybiB0aGlzfSxzdWJWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueC1jLng7dGhpcy55PWEueS1jLnk7dGhpcy56PWEuei1jLno7dGhpcy53PWEudy1jLnc7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCo9YTt0aGlzLnkqPWE7dGhpcy56Kj1hO3RoaXMudyo9YTtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMueix0PXRoaXMudzthPWEuZWxlbWVudHM7dGhpcy54PWFbMF0qYythWzRdKmUrYVs4XSpnK2FbMTJdKnQ7dGhpcy55PWFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKnQ7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZythWzE0XSp0O3RoaXMudz1hWzNdKmMrYVs3XSplK2FbMTFdKmcrYVsxNV0qdDtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnc9MipNYXRoLmFjb3MoYS53KTt2YXIgYz1NYXRoLnNxcnQoMS1hLncqYS53KTsxRS00PmM/KHRoaXMueD0xLHRoaXMuej10aGlzLnk9MCk6KHRoaXMueD1hLngvYyx0aGlzLnk9YS55L2MsdGhpcy56PWEuei9jKTtyZXR1cm4gdGhpc30sc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt2YXIgYz1hWzBdO3ZhciBlPWFbNF07dmFyIGc9YVs4XSx0PWFbMV0sdj1hWzVdLHo9YVs5XTt2YXIgRT1hWzJdO3ZhciBGPWFbNl07dmFyIEk9YVsxMF07aWYoLjAxPk1hdGguYWJzKGUtdCkmJi4wMT5NYXRoLmFicyhnLUUpJiYuMDE+TWF0aC5hYnMoei1GKSl7aWYoLjE+TWF0aC5hYnMoZSt0KSYmLjE+TWF0aC5hYnMoZytFKSYmLjE+TWF0aC5hYnMoeitGKSYmLjE+TWF0aC5hYnMoYyt2K0ktMykpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7YT1NYXRoLlBJOwpjPShjKzEpLzI7dj0odisxKS8yO0k9KEkrMSkvMjtlPShlK3QpLzQ7Zz0oZytFKS80O3o9KHorRikvNDtjPnYmJmM+ST8uMDE+Yz8oRj0wLGU9RT0uNzA3MTA2NzgxKTooRj1NYXRoLnNxcnQoYyksRT1lL0YsZT1nL0YpOnY+ST8uMDE+dj8oRj0uNzA3MTA2NzgxLEU9MCxlPS43MDcxMDY3ODEpOihFPU1hdGguc3FydCh2KSxGPWUvRSxlPXovRSk6LjAxPkk/KEU9Rj0uNzA3MTA2NzgxLGU9MCk6KGU9TWF0aC5zcXJ0KEkpLEY9Zy9lLEU9ei9lKTt0aGlzLnNldChGLEUsZSxhKTtyZXR1cm4gdGhpc31hPU1hdGguc3FydCgoRi16KSooRi16KSsoZy1FKSooZy1FKSsodC1lKSoodC1lKSk7LjAwMT5NYXRoLmFicyhhKSYmKGE9MSk7dGhpcy54PShGLXopL2E7dGhpcy55PShnLUUpL2E7dGhpcy56PSh0LWUpL2E7dGhpcy53PU1hdGguYWNvcygoYyt2K0ktMSkvMik7cmV0dXJuIHRoaXN9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSwKYS55KTt0aGlzLno9TWF0aC5taW4odGhpcy56LGEueik7dGhpcy53PU1hdGgubWluKHRoaXMudyxhLncpO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWF4KHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYS55KTt0aGlzLno9TWF0aC5tYXgodGhpcy56LGEueik7dGhpcy53PU1hdGgubWF4KHRoaXMudyxhLncpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLncsTWF0aC5taW4oYy53LHRoaXMudykpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnopKTt0aGlzLnc9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMudykpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGV8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGEsTWF0aC5taW4oYyxlKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTt0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopO3RoaXMudz1NYXRoLmZsb29yKHRoaXMudyk7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTt0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PQpNYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3RoaXMudz1NYXRoLnJvdW5kKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7dGhpcy53PTA+dGhpcy53P01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7dGhpcy53PS10aGlzLnc7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueioKYS56K3RoaXMudyphLnd9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9LHNldExlbmd0aDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihhKX0sbGVycDpmdW5jdGlvbihhLGMpe3RoaXMueCs9KGEueC10aGlzLngpKmM7dGhpcy55Kz0oYS55LXRoaXMueSkqYzt0aGlzLnorPShhLnotCnRoaXMueikqYzt0aGlzLncrPShhLnctdGhpcy53KSpjO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhjLGEpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLng9PT10aGlzLngmJmEueT09PXRoaXMueSYmYS56PT09dGhpcy56JiZhLnc9PT10aGlzLnd9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTt0aGlzLnc9YVtjKzNdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy54O2FbYysxXT10aGlzLnk7YVtjKzJdPXRoaXMuejthW2MrM109dGhpcy53O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTsKdGhpcy54PWEuZ2V0WChjKTt0aGlzLnk9YS5nZXRZKGMpO3RoaXMuej1hLmdldFooYyk7dGhpcy53PWEuZ2V0VyhjKTtyZXR1cm4gdGhpc319KTttLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjptLGlzV2ViR0xSZW5kZXJUYXJnZXQ6ITAsc2V0U2l6ZTpmdW5jdGlvbihhLGMpe2lmKHRoaXMud2lkdGghPT1hfHx0aGlzLmhlaWdodCE9PWMpdGhpcy53aWR0aD1hLHRoaXMuaGVpZ2h0PWMsdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPWEsdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1jLHRoaXMuZGlzcG9zZSgpO3RoaXMudmlld3BvcnQuc2V0KDAsMCxhLGMpO3RoaXMuc2Npc3Nvci5zZXQoMCwwLGEsYyl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMud2lkdGg9YS53aWR0aDt0aGlzLmhlaWdodD1hLmhlaWdodDt0aGlzLnZpZXdwb3J0LmNvcHkoYS52aWV3cG9ydCk7CnRoaXMudGV4dHVyZT1hLnRleHR1cmUuY2xvbmUoKTt0aGlzLmRlcHRoQnVmZmVyPWEuZGVwdGhCdWZmZXI7dGhpcy5zdGVuY2lsQnVmZmVyPWEuc3RlbmNpbEJ1ZmZlcjt0aGlzLmRlcHRoVGV4dHVyZT1hLmRlcHRoVGV4dHVyZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtuLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpuLGlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldDohMCxjb3B5OmZ1bmN0aW9uKGEpe20ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuc2FtcGxlcz1hLnNhbXBsZXM7cmV0dXJuIHRoaXN9fSk7dmFyIHRjPW5ldyBrLFJiPW5ldyBxLFNtPW5ldyBrKDAsMCwwKSxUbT1uZXcgaygxLDEsMSksSGQ9bmV3IGssamg9bmV3IGssaWM9bmV3IGs7T2JqZWN0LmFzc2lnbihxLnByb3RvdHlwZSx7aXNNYXRyaXg0OiEwLApzZXQ6ZnVuY3Rpb24oYSxjLGUsZyx0LHYseixFLEYsSSxNLFAsUSxVLFYsZWEpe3ZhciBkYT10aGlzLmVsZW1lbnRzO2RhWzBdPWE7ZGFbNF09YztkYVs4XT1lO2RhWzEyXT1nO2RhWzFdPXQ7ZGFbNV09djtkYVs5XT16O2RhWzEzXT1FO2RhWzJdPUY7ZGFbNl09STtkYVsxMF09TTtkYVsxNF09UDtkYVszXT1RO2RhWzddPVU7ZGFbMTFdPVY7ZGFbMTVdPWVhO3JldHVybiB0aGlzfSxpZGVudGl0eTpmdW5jdGlvbigpe3RoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgcSkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMF09YVswXTtjWzFdPWFbMV07Y1syXT1hWzJdO2NbM109YVszXTtjWzRdPWFbNF07Y1s1XT1hWzVdO2NbNl09YVs2XTtjWzddPWFbN107Y1s4XT1hWzhdO2NbOV09YVs5XTtjWzEwXT0KYVsxMF07Y1sxMV09YVsxMV07Y1sxMl09YVsxMl07Y1sxM109YVsxM107Y1sxNF09YVsxNF07Y1sxNV09YVsxNV07cmV0dXJuIHRoaXN9LGNvcHlQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtyZXR1cm4gdGhpc30sZXh0cmFjdEJhc2lzOmZ1bmN0aW9uKGEsYyxlKXthLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKTtjLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKTtlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKTtyZXR1cm4gdGhpc30sbWFrZUJhc2lzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLngsYy54LGUueCwwLGEueSxjLnksZS55LDAsYS56LGMueixlLnosMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sZXh0cmFjdFJvdGF0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLmVsZW1lbnRzLGc9MS90Yy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsCjApLmxlbmd0aCgpLHQ9MS90Yy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT0xL3RjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTtjWzBdPWVbMF0qZztjWzFdPWVbMV0qZztjWzJdPWVbMl0qZztjWzNdPTA7Y1s0XT1lWzRdKnQ7Y1s1XT1lWzVdKnQ7Y1s2XT1lWzZdKnQ7Y1s3XT0wO2NbOF09ZVs4XSphO2NbOV09ZVs5XSphO2NbMTBdPWVbMTBdKmE7Y1sxMV09MDtjWzEyXT0wO2NbMTNdPTA7Y1sxNF09MDtjWzE1XT0xO3JldHVybiB0aGlzfSxtYWtlUm90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7YSYmYS5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnksdD1hLnosdj1NYXRoLmNvcyhlKTtlPU1hdGguc2luKGUpOwp2YXIgej1NYXRoLmNvcyhnKTtnPU1hdGguc2luKGcpO3ZhciBFPU1hdGguY29zKHQpO3Q9TWF0aC5zaW4odCk7aWYoIlhZWiI9PT1hLm9yZGVyKXthPXYqRTt2YXIgRj12KnQsST1lKkUsTT1lKnQ7Y1swXT16KkU7Y1s0XT0teip0O2NbOF09ZztjWzFdPUYrSSpnO2NbNV09YS1NKmc7Y1s5XT0tZSp6O2NbMl09TS1hKmc7Y1s2XT1JK0YqZztjWzEwXT12Knp9ZWxzZSJZWFoiPT09YS5vcmRlcj8oYT16KkUsRj16KnQsST1nKkUsTT1nKnQsY1swXT1hK00qZSxjWzRdPUkqZS1GLGNbOF09dipnLGNbMV09dip0LGNbNV09dipFLGNbOV09LWUsY1syXT1GKmUtSSxjWzZdPU0rYSplLGNbMTBdPXYqeik6IlpYWSI9PT1hLm9yZGVyPyhhPXoqRSxGPXoqdCxJPWcqRSxNPWcqdCxjWzBdPWEtTSplLGNbNF09LXYqdCxjWzhdPUkrRiplLGNbMV09RitJKmUsY1s1XT12KkUsY1s5XT1NLWEqZSxjWzJdPS12KmcsY1s2XT1lLGNbMTBdPXYqeik6IlpZWCI9PT1hLm9yZGVyPyhhPXYqRSxGPXYqdCxJPWUqCkUsTT1lKnQsY1swXT16KkUsY1s0XT1JKmctRixjWzhdPWEqZytNLGNbMV09eip0LGNbNV09TSpnK2EsY1s5XT1GKmctSSxjWzJdPS1nLGNbNl09ZSp6LGNbMTBdPXYqeik6IllaWCI9PT1hLm9yZGVyPyhhPXYqeixGPXYqZyxJPWUqeixNPWUqZyxjWzBdPXoqRSxjWzRdPU0tYSp0LGNbOF09SSp0K0YsY1sxXT10LGNbNV09dipFLGNbOV09LWUqRSxjWzJdPS1nKkUsY1s2XT1GKnQrSSxjWzEwXT1hLU0qdCk6IlhaWSI9PT1hLm9yZGVyJiYoYT12KnosRj12KmcsST1lKnosTT1lKmcsY1swXT16KkUsY1s0XT0tdCxjWzhdPWcqRSxjWzFdPWEqdCtNLGNbNV09dipFLGNbOV09Rip0LUksY1syXT1JKnQtRixjWzZdPWUqRSxjWzEwXT1NKnQrYSk7Y1szXT0wO2NbN109MDtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBvc2UoU20sYSxUbSl9LGxvb2tBdDpmdW5jdGlvbihhLApjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7aWMuc3ViVmVjdG9ycyhhLGMpOzA9PT1pYy5sZW5ndGhTcSgpJiYoaWMuej0xKTtpYy5ub3JtYWxpemUoKTtIZC5jcm9zc1ZlY3RvcnMoZSxpYyk7MD09PUhkLmxlbmd0aFNxKCkmJigxPT09TWF0aC5hYnMoZS56KT9pYy54Kz0xRS00OmljLnorPTFFLTQsaWMubm9ybWFsaXplKCksSGQuY3Jvc3NWZWN0b3JzKGUsaWMpKTtIZC5ub3JtYWxpemUoKTtqaC5jcm9zc1ZlY3RvcnMoaWMsSGQpO2dbMF09SGQueDtnWzRdPWpoLng7Z1s4XT1pYy54O2dbMV09SGQueTtnWzVdPWpoLnk7Z1s5XT1pYy55O2dbMl09SGQuejtnWzZdPWpoLno7Z1sxMF09aWMuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5tdWx0aXBseU1hdHJpY2VzKGEsYykpOnRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLGEpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKGEsdGhpcyl9LG11bHRpcGx5TWF0cmljZXM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmVsZW1lbnRzLGc9Yy5lbGVtZW50cztjPXRoaXMuZWxlbWVudHM7YT1lWzBdO3ZhciB0PWVbNF0sdj1lWzhdLHo9ZVsxMl0sRT1lWzFdLEY9ZVs1XSxJPWVbOV0sTT1lWzEzXSxQPWVbMl0sUT1lWzZdLFU9ZVsxMF0sVj1lWzE0XSxlYT1lWzNdLGRhPWVbN10scmE9ZVsxMV07ZT1lWzE1XTt2YXIgcGE9Z1swXSxxYT1nWzRdLHVhPWdbOF0sbmE9Z1sxMl0sdGE9Z1sxXSxCYT1nWzVdLFRhPWdbOV0sVWE9Z1sxM10sQ2E9Z1syXSxIYT1nWzZdLERhPWdbMTBdLE1hPWdbMTRdLGRiPWdbM10sdGI9Z1s3XSxLYT1nWzExXTtnPWdbMTVdO2NbMF09YSpwYSt0KnRhK3YqQ2EreipkYjtjWzRdPWEqcWErdCpCYSt2KgpIYSt6KnRiO2NbOF09YSp1YSt0KlRhK3YqRGEreipLYTtjWzEyXT1hKm5hK3QqVWErdipNYSt6Kmc7Y1sxXT1FKnBhK0YqdGErSSpDYStNKmRiO2NbNV09RSpxYStGKkJhK0kqSGErTSp0YjtjWzldPUUqdWErRipUYStJKkRhK00qS2E7Y1sxM109RSpuYStGKlVhK0kqTWErTSpnO2NbMl09UCpwYStRKnRhK1UqQ2ErVipkYjtjWzZdPVAqcWErUSpCYStVKkhhK1YqdGI7Y1sxMF09UCp1YStRKlRhK1UqRGErVipLYTtjWzE0XT1QKm5hK1EqVWErVSpNYStWKmc7Y1szXT1lYSpwYStkYSp0YStyYSpDYStlKmRiO2NbN109ZWEqcWErZGEqQmErcmEqSGErZSp0YjtjWzExXT1lYSp1YStkYSpUYStyYSpEYStlKkthO2NbMTVdPWVhKm5hK2RhKlVhK3JhKk1hK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbNF0qPWE7Y1s4XSo9YTtjWzEyXSo9YTtjWzFdKj1hO2NbNV0qPWE7Y1s5XSo9YTtjWzEzXSo9YTtjWzJdKj0KYTtjWzZdKj1hO2NbMTBdKj1hO2NbMTRdKj1hO2NbM10qPWE7Y1s3XSo9YTtjWzExXSo9YTtjWzE1XSo9YTtyZXR1cm4gdGhpc30sYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKyl0Yy54PWEuZ2V0WChjKSx0Yy55PWEuZ2V0WShjKSx0Yy56PWEuZ2V0WihjKSx0Yy5hcHBseU1hdHJpeDQodGhpcyksYS5zZXRYWVooYyx0Yy54LHRjLnksdGMueik7cmV0dXJuIGF9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cyxjPWFbMF0sZT1hWzRdLGc9YVs4XSx0PWFbMTJdLHY9YVsxXSx6PWFbNV0sRT1hWzldLEY9YVsxM10sST1hWzJdLE09YVs2XSxQPWFbMTBdLFE9YVsxNF07cmV0dXJuIGFbM10qKCt0KkUqTS1nKkYqTS10KnoqUCtlKkYqUCtnKnoqUS1lKkUqUSkrYVs3XSooK2MqRSpRLWMqRipQK3QqdipQLWcqdipRK2cqRipJLXQqRSpJKSthWzExXSooK2MqRipNLWMqeipRLXQqdipNK2UqdipRKwp0KnoqSS1lKkYqSSkrYVsxNV0qKC1nKnoqSS1jKkUqTStjKnoqUCtnKnYqTS1lKnYqUCtlKkUqSSl9LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudHM7dmFyIGM9YVsxXTthWzFdPWFbNF07YVs0XT1jO2M9YVsyXTthWzJdPWFbOF07YVs4XT1jO2M9YVs2XTthWzZdPWFbOV07YVs5XT1jO2M9YVszXTthWzNdPWFbMTJdO2FbMTJdPWM7Yz1hWzddO2FbN109YVsxM107YVsxM109YztjPWFbMTFdO2FbMTFdPWFbMTRdO2FbMTRdPWM7cmV0dXJuIHRoaXN9LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzO2EuaXNWZWN0b3IzPyhnWzEyXT1hLngsZ1sxM109YS55LGdbMTRdPWEueik6KGdbMTJdPWEsZ1sxM109YyxnWzE0XT1lKTtyZXR1cm4gdGhpc30sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHMsZz1hLmVsZW1lbnRzO2E9Z1swXTt2YXIgdD1nWzFdLHY9Z1syXSx6PWdbM10sRT1nWzRdLEY9Z1s1XSwKST1nWzZdLE09Z1s3XSxQPWdbOF0sUT1nWzldLFU9Z1sxMF0sVj1nWzExXSxlYT1nWzEyXSxkYT1nWzEzXSxyYT1nWzE0XTtnPWdbMTVdO3ZhciBwYT1RKnJhKk0tZGEqVSpNK2RhKkkqVi1GKnJhKlYtUSpJKmcrRipVKmcscWE9ZWEqVSpNLVAqcmEqTS1lYSpJKlYrRSpyYSpWK1AqSSpnLUUqVSpnLHVhPVAqZGEqTS1lYSpRKk0rZWEqRipWLUUqZGEqVi1QKkYqZytFKlEqZyxuYT1lYSpRKkktUCpkYSpJLWVhKkYqVStFKmRhKlUrUCpGKnJhLUUqUSpyYSx0YT1hKnBhK3QqcWErdip1YSt6Km5hO2lmKDA9PT10YSl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL3RhO2VbMF09CnBhKmM7ZVsxXT0oZGEqVSp6LVEqcmEqei1kYSp2KlYrdCpyYSpWK1EqdipnLXQqVSpnKSpjO2VbMl09KEYqcmEqei1kYSpJKnorZGEqdipNLXQqcmEqTS1GKnYqZyt0KkkqZykqYztlWzNdPShRKkkqei1GKlUqei1RKnYqTSt0KlUqTStGKnYqVi10KkkqVikqYztlWzRdPXFhKmM7ZVs1XT0oUCpyYSp6LWVhKlUqeitlYSp2KlYtYSpyYSpWLVAqdipnK2EqVSpnKSpjO2VbNl09KGVhKkkqei1FKnJhKnotZWEqdipNK2EqcmEqTStFKnYqZy1hKkkqZykqYztlWzddPShFKlUqei1QKkkqeitQKnYqTS1hKlUqTS1FKnYqVithKkkqVikqYztlWzhdPXVhKmM7ZVs5XT0oZWEqUSp6LVAqZGEqei1lYSp0KlYrYSpkYSpWK1AqdCpnLWEqUSpnKSpjO2VbMTBdPShFKmRhKnotZWEqRip6K2VhKnQqTS1hKmRhKk0tRSp0KmcrYSpGKmcpKmM7ZVsxMV09KFAqRip6LUUqUSp6LVAqdCpNK2EqUSpNK0UqdCpWLWEqRipWKSpjO2VbMTJdPW5hKmM7ZVsxM109KFAqZGEqdi1lYSpRKnYrZWEqdCpVLWEqZGEqVS0KUCp0KnJhK2EqUSpyYSkqYztlWzE0XT0oZWEqRip2LUUqZGEqdi1lYSp0KkkrYSpkYSpJK0UqdCpyYS1hKkYqcmEpKmM7ZVsxNV09KEUqUSp2LVAqRip2K1AqdCpJLWEqUSpJLUUqdCpVK2EqRipVKSpjO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzLGU9YS54LGc9YS55O2E9YS56O2NbMF0qPWU7Y1s0XSo9ZztjWzhdKj1hO2NbMV0qPWU7Y1s1XSo9ZztjWzldKj1hO2NbMl0qPWU7Y1s2XSo9ZztjWzEwXSo9YTtjWzNdKj1lO2NbN10qPWc7Y1sxMV0qPWE7cmV0dXJuIHRoaXN9LGdldE1heFNjYWxlT25BeGlzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cztyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGFbMF0qYVswXSthWzFdKmFbMV0rYVsyXSphWzJdLGFbNF0qYVs0XSthWzVdKmFbNV0rYVs2XSphWzZdLGFbOF0qYVs4XSthWzldKmFbOV0rYVsxMF0qYVsxMF0pKX0sbWFrZVRyYW5zbGF0aW9uOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLAowLDAsYSwwLDEsMCxjLDAsMCwxLGUsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblg6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldCgxLDAsMCwwLDAsYywtYSwwLDAsYSxjLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblk6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldChjLDAsYSwwLDAsMSwwLDAsLWEsMCxjLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblo6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldChjLC1hLDAsMCxhLGMsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkF4aXM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1NYXRoLmNvcyhjKTtjPU1hdGguc2luKGMpO3ZhciBnPTEtZSx0PWEueCx2PWEueTthPWEuejt2YXIgej1nKnQsRT1nKnY7dGhpcy5zZXQoeioKdCtlLHoqdi1jKmEseiphK2MqdiwwLHoqditjKmEsRSp2K2UsRSphLWMqdCwwLHoqYS1jKnYsRSphK2MqdCxnKmEqYStlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTY2FsZTpmdW5jdGlvbihhLGMsZSl7dGhpcy5zZXQoYSwwLDAsMCwwLGMsMCwwLDAsMCxlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTaGVhcjpmdW5jdGlvbihhLGMsZSl7dGhpcy5zZXQoMSxjLGUsMCxhLDEsZSwwLGEsYywxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNvbXBvc2U6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHMsdD1jLl94LHY9Yy5feSx6PWMuX3osRT1jLl93LEY9dCt0LEk9dit2LE09eit6O2M9dCpGO3ZhciBQPXQqSTt0Kj1NO3ZhciBRPXYqSTt2Kj1NO3oqPU07Rio9RTtJKj1FO0UqPU07TT1lLng7dmFyIFU9ZS55O2U9ZS56O2dbMF09KDEtKFEreikpKk07Z1sxXT0oUCtFKSpNO2dbMl09KHQtSSkqTTtnWzNdPTA7Z1s0XT0oUC1FKSpVO2dbNV09KDEtKGMreikpKgpVO2dbNl09KHYrRikqVTtnWzddPTA7Z1s4XT0odCtJKSplO2dbOV09KHYtRikqZTtnWzEwXT0oMS0oYytRKSkqZTtnWzExXT0wO2dbMTJdPWEueDtnWzEzXT1hLnk7Z1sxNF09YS56O2dbMTVdPTE7cmV0dXJuIHRoaXN9LGRlY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyx0PXRjLnNldChnWzBdLGdbMV0sZ1syXSkubGVuZ3RoKCksdj10Yy5zZXQoZ1s0XSxnWzVdLGdbNl0pLmxlbmd0aCgpLHo9dGMuc2V0KGdbOF0sZ1s5XSxnWzEwXSkubGVuZ3RoKCk7MD50aGlzLmRldGVybWluYW50KCkmJih0PS10KTthLng9Z1sxMl07YS55PWdbMTNdO2Euej1nWzE0XTtSYi5jb3B5KHRoaXMpO2E9MS90O2c9MS92O3ZhciBFPTEvejtSYi5lbGVtZW50c1swXSo9YTtSYi5lbGVtZW50c1sxXSo9YTtSYi5lbGVtZW50c1syXSo9YTtSYi5lbGVtZW50c1s0XSo9ZztSYi5lbGVtZW50c1s1XSo9ZztSYi5lbGVtZW50c1s2XSo9ZztSYi5lbGVtZW50c1s4XSo9RTtSYi5lbGVtZW50c1s5XSo9CkU7UmIuZWxlbWVudHNbMTBdKj1FO2Muc2V0RnJvbVJvdGF0aW9uTWF0cml4KFJiKTtlLng9dDtlLnk9djtlLno9ejtyZXR1cm4gdGhpc30sbWFrZVBlcnNwZWN0aXZlOmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXt2b2lkIDA9PT12JiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4iKTt2YXIgej10aGlzLmVsZW1lbnRzO3pbMF09Mip0LyhjLWEpO3pbNF09MDt6WzhdPShjK2EpLyhjLWEpO3pbMTJdPTA7elsxXT0wO3pbNV09Mip0LyhlLWcpO3pbOV09KGUrZykvKGUtZyk7elsxM109MDt6WzJdPTA7els2XT0wO3pbMTBdPS0odit0KS8odi10KTt6WzE0XT0tMip2KnQvKHYtdCk7elszXT0wO3pbN109MDt6WzExXT0tMTt6WzE1XT0wO3JldHVybiB0aGlzfSxtYWtlT3J0aG9ncmFwaGljOmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXt2YXIgej0KdGhpcy5lbGVtZW50cyxFPTEvKGMtYSksRj0xLyhlLWcpLEk9MS8odi10KTt6WzBdPTIqRTt6WzRdPTA7els4XT0wO3pbMTJdPS0oKGMrYSkqRSk7elsxXT0wO3pbNV09MipGO3pbOV09MDt6WzEzXT0tKChlK2cpKkYpO3pbMl09MDt6WzZdPTA7elsxMF09LTIqSTt6WzE0XT0tKCh2K3QpKkkpO3pbM109MDt6WzddPTA7elsxMV09MDt6WzE1XT0xO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7MTY+ZTtlKyspaWYoY1tlXSE9PWFbZV0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT0wOzE2PmU7ZSsrKXRoaXMuZWxlbWVudHNbZV09YVtlK2NdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO3ZhciBlPXRoaXMuZWxlbWVudHM7YVtjXT1lWzBdOwphW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTthW2MrOV09ZVs5XTthW2MrMTBdPWVbMTBdO2FbYysxMV09ZVsxMV07YVtjKzEyXT1lWzEyXTthW2MrMTNdPWVbMTNdO2FbYysxNF09ZVsxNF07YVtjKzE1XT1lWzE1XTtyZXR1cm4gYX19KTt2YXIgbGs9bmV3IHEsbWs9bmV3IGg7dS5Sb3RhdGlvbk9yZGVycz0iWFlaIFlaWCBaWFkgWFpZIFlYWiBaWVgiLnNwbGl0KCIgIik7dS5EZWZhdWx0T3JkZXI9IlhZWiI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModS5wcm90b3R5cGUse3g6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl94fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5feD1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LHk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl95fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5feT1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LAp6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSxvcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yZGVyfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fb3JkZXI9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24odS5wcm90b3R5cGUse2lzRXVsZXI6ITAsc2V0OmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuX3g9YTt0aGlzLl95PWM7dGhpcy5fej1lO3RoaXMuX29yZGVyPWd8fHRoaXMuX29yZGVyO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS5feDt0aGlzLl95PWEuX3k7dGhpcy5fej1hLl96O3RoaXMuX29yZGVyPWEuX29yZGVyOwp0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9aGIuY2xhbXAsdD1hLmVsZW1lbnRzO2E9dFswXTt2YXIgdj10WzRdLHo9dFs4XSxFPXRbMV0sRj10WzVdLEk9dFs5XSxNPXRbMl0sUD10WzZdO3Q9dFsxMF07Yz1jfHx0aGlzLl9vcmRlcjsiWFlaIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKGcoeiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoeik/KHRoaXMuX3g9TWF0aC5hdGFuMigtSSx0KSx0aGlzLl96PU1hdGguYXRhbjIoLXYsYSkpOih0aGlzLl94PU1hdGguYXRhbjIoUCxGKSx0aGlzLl96PTApKToiWVhaIj09PWM/KHRoaXMuX3g9TWF0aC5hc2luKC1nKEksLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKEkpPyh0aGlzLl95PU1hdGguYXRhbjIoeix0KSx0aGlzLl96PU1hdGguYXRhbjIoRSxGKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtTSxhKSx0aGlzLl96PTApKToiWlhZIj09PWM/KHRoaXMuX3g9Ck1hdGguYXNpbihnKFAsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFApPyh0aGlzLl95PU1hdGguYXRhbjIoLU0sdCksdGhpcy5fej1NYXRoLmF0YW4yKC12LEYpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihFLGEpKSk6IlpZWCI9PT1jPyh0aGlzLl95PU1hdGguYXNpbigtZyhNLC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyhNKT8odGhpcy5feD1NYXRoLmF0YW4yKFAsdCksdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC12LEYpKSk6IllaWCI9PT1jPyh0aGlzLl96PU1hdGguYXNpbihnKEUsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKEUpPyh0aGlzLl94PU1hdGguYXRhbjIoLUksRiksdGhpcy5feT1NYXRoLmF0YW4yKC1NLGEpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMih6LHQpKSk6IlhaWSI9PT1jPyh0aGlzLl96PU1hdGguYXNpbigtZyh2LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh2KT8odGhpcy5feD0KTWF0aC5hdGFuMihQLEYpLHRoaXMuX3k9TWF0aC5hdGFuMih6LGEpKToodGhpcy5feD1NYXRoLmF0YW4yKC1JLHQpLHRoaXMuX3k9MCkpOmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBnaXZlbiB1bnN1cHBvcnRlZCBvcmRlcjogIitjKTt0aGlzLl9vcmRlcj1jOyExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhLGMsZSl7bGsubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oYSk7cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGxrLGMsZSl9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuc2V0KGEueCxhLnksYS56LGN8fHRoaXMuX29yZGVyKX0scmVvcmRlcjpmdW5jdGlvbihhKXttay5zZXRGcm9tRXVsZXIodGhpcyk7cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24obWssYSl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PQp0aGlzLl94JiZhLl95PT09dGhpcy5feSYmYS5fej09PXRoaXMuX3omJmEuX29yZGVyPT09dGhpcy5fb3JkZXJ9LGZyb21BcnJheTpmdW5jdGlvbihhKXt0aGlzLl94PWFbMF07dGhpcy5feT1hWzFdO3RoaXMuX3o9YVsyXTt2b2lkIDAhPT1hWzNdJiYodGhpcy5fb3JkZXI9YVszXSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fb3JkZXI7cmV0dXJuIGF9LHRvVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gYT9hLnNldCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feik6bmV3IGsodGhpcy5feCx0aGlzLl95LHRoaXMuX3opfSxfb25DaGFuZ2U6ZnVuY3Rpb24oYSl7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaz1hO3JldHVybiB0aGlzfSxfb25DaGFuZ2VDYWxsYmFjazpmdW5jdGlvbigpe319KTsKT2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEpe3RoaXMubWFzaz0xPDxhfDB9LGVuYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2s9dGhpcy5tYXNrfDE8PGF8MH0sZW5hYmxlQWxsOmZ1bmN0aW9uKCl7dGhpcy5tYXNrPS0xfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrXj0xPDxhfDB9LGRpc2FibGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrJj1+KDE8PGF8MCl9LGRpc2FibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9MH0sdGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gMCE9PSh0aGlzLm1hc2smYS5tYXNrKX19KTt2YXIgaWw9MCxuaz1uZXcgayxoZj1uZXcgaCxsZD1uZXcgcSxraD1uZXcgayxsZz1uZXcgayxVbT1uZXcgayxWbT1uZXcgaCxvaz1uZXcgaygxLDAsMCkscGs9bmV3IGsoMCwxLDApLHFrPW5ldyBrKDAsMCwxKSxXbT17dHlwZToiYWRkZWQifSxYbT17dHlwZToicmVtb3ZlZCJ9O0EuRGVmYXVsdFVwPW5ldyBrKDAsMSwwKTtBLkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlPQohMDtBLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBLGlzT2JqZWN0M0Q6ITAsb25CZWZvcmVSZW5kZXI6ZnVuY3Rpb24oKXt9LG9uQWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGEpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKTt0aGlzLm1hdHJpeC5wcmVtdWx0aXBseShhKTt0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9LGFwcGx5UXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoYSk7cmV0dXJuIHRoaXN9LHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyl9LHNldFJvdGF0aW9uRnJvbUV1bGVyOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoYSwKITApfSxzZXRSb3RhdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChhKX0sc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uY29weShhKX0scm90YXRlT25BeGlzOmZ1bmN0aW9uKGEsYyl7aGYuc2V0RnJvbUF4aXNBbmdsZShhLGMpO3RoaXMucXVhdGVybmlvbi5tdWx0aXBseShoZik7cmV0dXJuIHRoaXN9LHJvdGF0ZU9uV29ybGRBeGlzOmZ1bmN0aW9uKGEsYyl7aGYuc2V0RnJvbUF4aXNBbmdsZShhLGMpO3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShoZik7cmV0dXJuIHRoaXN9LHJvdGF0ZVg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKG9rLGEpfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhwayxhKX0scm90YXRlWjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMocWssYSl9LHRyYW5zbGF0ZU9uQXhpczpmdW5jdGlvbihhLApjKXtuay5jb3B5KGEpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pO3RoaXMucG9zaXRpb24uYWRkKG5rLm11bHRpcGx5U2NhbGFyKGMpKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMob2ssYSl9LHRyYW5zbGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHBrLGEpfSx0cmFuc2xhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhxayxhKX0sbG9jYWxUb1dvcmxkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX0sd29ybGRUb0xvY2FsOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGx5TWF0cml4NChsZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpKX0sbG9va0F0OmZ1bmN0aW9uKGEsYyxlKXthLmlzVmVjdG9yMz9raC5jb3B5KGEpOmtoLnNldChhLGMsZSk7YT10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLAohMSk7bGcuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO3RoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9sZC5sb29rQXQobGcsa2gsdGhpcy51cCk6bGQubG9va0F0KGtoLGxnLHRoaXMudXApO3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgobGQpO2EmJihsZC5leHRyYWN0Um90YXRpb24oYS5tYXRyaXhXb3JsZCksaGYuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGxkKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoaGYuaW52ZXJzZSgpKSl9LGFkZDpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5hZGQoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31pZihhPT09dGhpcylyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIixhKSx0aGlzO2EmJmEuaXNPYmplY3QzRD8KKG51bGwhPT1hLnBhcmVudCYmYS5wYXJlbnQucmVtb3ZlKGEpLGEucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKGEpLGEuZGlzcGF0Y2hFdmVudChXbSkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLGEpO3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoMTxhcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tjXSk7cmV0dXJuIHRoaXN9Yz10aGlzLmNoaWxkcmVuLmluZGV4T2YoYSk7LTEhPT1jJiYoYS5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShjLDEpLGEuZGlzcGF0Y2hFdmVudChYbSkpO3JldHVybiB0aGlzfSxhdHRhY2g6ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7bGQuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKTtudWxsIT09CmEucGFyZW50JiYoYS5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGxkLm11bHRpcGx5KGEucGFyZW50Lm1hdHJpeFdvcmxkKSk7YS5hcHBseU1hdHJpeChsZCk7YS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7dGhpcy5hZGQoYSk7cmV0dXJuIHRoaXN9LGdldE9iamVjdEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLGEpfSxnZXRPYmplY3RCeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsYSl9LGdldE9iamVjdEJ5UHJvcGVydHk6ZnVuY3Rpb24oYSxjKXtpZih0aGlzW2FdPT09YylyZXR1cm4gdGhpcztmb3IodmFyIGU9MCxnPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2U8ZztlKyspe3ZhciB0PXRoaXMuY2hpbGRyZW5bZV0uZ2V0T2JqZWN0QnlQcm9wZXJ0eShhLGMpO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHR9fSxnZXRXb3JsZFBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUG9zaXRpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7cmV0dXJuIGEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfSxnZXRXb3JsZFF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFF1YXRlcm5pb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgaCk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UobGcsYSxVbSk7cmV0dXJuIGF9LGdldFdvcmxkU2NhbGU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApOwp0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZyxWbSxhKTtyZXR1cm4gYX0sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgYz10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBhLnNldChjWzhdLGNbOV0sY1sxMF0pLm5vcm1hbGl6ZSgpfSxyYXljYXN0OmZ1bmN0aW9uKCl7fSx0cmF2ZXJzZTpmdW5jdGlvbihhKXthKHRoaXMpO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS50cmF2ZXJzZShhKX0sdHJhdmVyc2VWaXNpYmxlOmZ1bmN0aW9uKGEpe2lmKCExIT09dGhpcy52aXNpYmxlKXthKHRoaXMpO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS50cmF2ZXJzZVZpc2libGUoYSl9fSwKdHJhdmVyc2VBbmNlc3RvcnM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5wYXJlbnQ7bnVsbCE9PWMmJihhKGMpLGMudHJhdmVyc2VBbmNlc3RvcnMoYSkpfSx1cGRhdGVNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH0sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO2lmKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8YSludWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSxhPSEwO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9CjAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0udXBkYXRlTWF0cml4V29ybGQoYSl9LHVwZGF0ZVdvcmxkTWF0cml4OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJlbnQ7ITA9PT1hJiZudWxsIT09ZSYmZS51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO251bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCk7aWYoITA9PT1jKWZvcihhPXRoaXMuY2hpbGRyZW4sYz0wLGU9YS5sZW5ndGg7YzxlO2MrKylhW2NdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX0sdG9KU09OOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoTSxQKXt2b2lkIDA9PT1NW1AudXVpZF0mJihNW1AudXVpZF09UC50b0pTT04oYSkpO3JldHVybiBQLnV1aWR9ZnVuY3Rpb24gZShNKXt2YXIgUD0KW10sUTtmb3IoUSBpbiBNKXt2YXIgVT1NW1FdO2RlbGV0ZSBVLm1ldGFkYXRhO1AucHVzaChVKX1yZXR1cm4gUH12YXIgZz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhLHQ9e307ZyYmKGE9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e319LHQubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7dmFyIHY9e307di51dWlkPXRoaXMudXVpZDt2LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodi5uYW1lPXRoaXMubmFtZSk7ITA9PT10aGlzLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9ITApOyEwPT09dGhpcy5yZWNlaXZlU2hhZG93JiYodi5yZWNlaXZlU2hhZG93PSEwKTshMT09PXRoaXMudmlzaWJsZSYmKHYudmlzaWJsZT0hMSk7ITE9PT10aGlzLmZydXN0dW1DdWxsZWQmJih2LmZydXN0dW1DdWxsZWQ9ITEpOzAhPT10aGlzLnJlbmRlck9yZGVyJiYKKHYucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlcik7Int9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYodi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTt2LmxheWVycz10aGlzLmxheWVycy5tYXNrO3YubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKTshMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT0hMSk7dGhpcy5pc01lc2gmJjAhPT10aGlzLmRyYXdNb2RlJiYodi5kcmF3TW9kZT10aGlzLmRyYXdNb2RlKTtpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe3YuZ2VvbWV0cnk9YyhhLmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7dmFyIHo9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PXomJnZvaWQgMCE9PXouc2hhcGVzKWlmKHo9ei5zaGFwZXMsQXJyYXkuaXNBcnJheSh6KSlmb3IodmFyIEU9MCxGPXoubGVuZ3RoO0U8RjtFKyspYyhhLnNoYXBlcyx6W0VdKTtlbHNlIGMoYS5zaGFwZXMsCnopfWlmKHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7ej1bXTtFPTA7Zm9yKEY9dGhpcy5tYXRlcmlhbC5sZW5ndGg7RTxGO0UrKyl6LnB1c2goYyhhLm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW0VdKSk7di5tYXRlcmlhbD16fWVsc2Ugdi5tYXRlcmlhbD1jKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKDA8dGhpcy5jaGlsZHJlbi5sZW5ndGgpZm9yKHYuY2hpbGRyZW49W10sRT0wO0U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7RSsrKXYuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW0VdLnRvSlNPTihhKS5vYmplY3QpO2lmKGcpe2c9ZShhLmdlb21ldHJpZXMpO0U9ZShhLm1hdGVyaWFscyk7Rj1lKGEudGV4dHVyZXMpO3ZhciBJPWUoYS5pbWFnZXMpO3o9ZShhLnNoYXBlcyk7MDxnLmxlbmd0aCYmKHQuZ2VvbWV0cmllcz1nKTswPEUubGVuZ3RoJiYodC5tYXRlcmlhbHM9RSk7MDxGLmxlbmd0aCYmKHQudGV4dHVyZXM9Rik7CjA8SS5sZW5ndGgmJih0LmltYWdlcz1JKTswPHoubGVuZ3RoJiYodC5zaGFwZXM9eil9dC5vYmplY3Q9djtyZXR1cm4gdH0sY2xvbmU6ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsYSl9LGNvcHk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0hMCk7dGhpcy5uYW1lPWEubmFtZTt0aGlzLnVwLmNvcHkoYS51cCk7dGhpcy5wb3NpdGlvbi5jb3B5KGEucG9zaXRpb24pO3RoaXMucXVhdGVybmlvbi5jb3B5KGEucXVhdGVybmlvbik7dGhpcy5zY2FsZS5jb3B5KGEuc2NhbGUpO3RoaXMubWF0cml4LmNvcHkoYS5tYXRyaXgpO3RoaXMubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9YS5tYXRyaXhBdXRvVXBkYXRlO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT1hLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7dGhpcy5sYXllcnMubWFzaz1hLmxheWVycy5tYXNrO3RoaXMudmlzaWJsZT1hLnZpc2libGU7CnRoaXMuY2FzdFNoYWRvdz1hLmNhc3RTaGFkb3c7dGhpcy5yZWNlaXZlU2hhZG93PWEucmVjZWl2ZVNoYWRvdzt0aGlzLmZydXN0dW1DdWxsZWQ9YS5mcnVzdHVtQ3VsbGVkO3RoaXMucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcjt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO2lmKCEwPT09Yylmb3IoYz0wO2M8YS5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuYWRkKGEuY2hpbGRyZW5bY10uY2xvbmUoKSk7cmV0dXJuIHRoaXN9fSk7eS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eSxpc1NjZW5lOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO251bGwhPT1hLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQ9YS5iYWNrZ3JvdW5kLmNsb25lKCkpO251bGwhPT1hLmZvZyYmKHRoaXMuZm9nPWEuZm9nLmNsb25lKCkpOwpudWxsIT09YS5vdmVycmlkZU1hdGVyaWFsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPWEub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKTt0aGlzLmF1dG9VcGRhdGU9YS5hdXRvVXBkYXRlO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO251bGwhPT10aGlzLmJhY2tncm91bmQmJihjLm9iamVjdC5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oYSkpO251bGwhPT10aGlzLmZvZyYmKGMub2JqZWN0LmZvZz10aGlzLmZvZy50b0pTT04oKSk7cmV0dXJuIGN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIG1kPVtuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcga10sWWM9bmV3IGssamY9bmV3IGssa2Y9bmV3IGssbGY9bmV3IGssCklkPW5ldyBrLEpkPW5ldyBrLGhlPW5ldyBrLG1nPW5ldyBrLGxoPW5ldyBrLG1oPW5ldyBrLE1kPW5ldyBrO09iamVjdC5hc3NpZ24oeC5wcm90b3R5cGUse2lzQm94MzohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm1pbi5jb3B5KGEpO3RoaXMubWF4LmNvcHkoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21BcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9SW5maW5pdHksZT1JbmZpbml0eSxnPUluZmluaXR5LHQ9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxGPWEubGVuZ3RoO0U8RjtFKz0zKXt2YXIgST1hW0VdLE09YVtFKzFdLFA9YVtFKzJdO0k8YyYmKGM9SSk7TTxlJiYoZT1NKTtQPGcmJihnPVApO0k+dCYmKHQ9SSk7TT52JiYodj1NKTtQPnomJih6PVApfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHQsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9SW5maW5pdHksZT1JbmZpbml0eSwKZz1JbmZpbml0eSx0PS1JbmZpbml0eSx2PS1JbmZpbml0eSx6PS1JbmZpbml0eSxFPTAsRj1hLmNvdW50O0U8RjtFKyspe3ZhciBJPWEuZ2V0WChFKSxNPWEuZ2V0WShFKSxQPWEuZ2V0WihFKTtJPGMmJihjPUkpO008ZSYmKGU9TSk7UDxnJiYoZz1QKTtJPnQmJih0PUkpO00+diYmKHY9TSk7UD56JiYoej1QKX10aGlzLm1pbi5zZXQoYyxlLGcpO3RoaXMubWF4LnNldCh0LHYseik7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspdGhpcy5leHBhbmRCeVBvaW50KGFbY10pO3JldHVybiB0aGlzfSxzZXRGcm9tQ2VudGVyQW5kU2l6ZTpmdW5jdGlvbihhLGMpe2M9WWMuY29weShjKS5tdWx0aXBseVNjYWxhciguNSk7dGhpcy5taW4uY29weShhKS5zdWIoYyk7dGhpcy5tYXguY29weShhKS5hZGQoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYSl7dGhpcy5tYWtlRW1wdHkoKTsKcmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoYSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubWluLmNvcHkoYS5taW4pO3RoaXMubWF4LmNvcHkoYS5tYXgpO3JldHVybiB0aGlzfSxtYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tSW5maW5pdHk7cmV0dXJuIHRoaXN9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPwphLnNldCgwLDAsMCk6YS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfSxleHBhbmRCeVBvaW50OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhKTt0aGlzLm1heC5tYXgoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5VmVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMubWluLnN1YihhKTt0aGlzLm1heC5hZGQoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMubWluLmFkZFNjYWxhcigtYSk7dGhpcy5tYXguYWRkU2NhbGFyKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYzthLnVwZGF0ZVdvcmxkTWF0cml4KCExLAohMSk7dmFyIGU9YS5nZW9tZXRyeTtpZih2b2lkIDAhPT1lKWlmKGUuaXNHZW9tZXRyeSl7dmFyIGc9ZS52ZXJ0aWNlcztlPTA7Zm9yKGM9Zy5sZW5ndGg7ZTxjO2UrKylZYy5jb3B5KGdbZV0pLFljLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoWWMpfWVsc2UgaWYoZS5pc0J1ZmZlckdlb21ldHJ5JiYoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24sdm9pZCAwIT09ZykpZm9yKGU9MCxjPWcuY291bnQ7ZTxjO2UrKylZYy5mcm9tQnVmZmVyQXR0cmlidXRlKGcsZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChZYyk7YT1hLmNoaWxkcmVuO2U9MDtmb3IoYz1hLmxlbmd0aDtlPGM7ZSsrKXRoaXMuZXhwYW5kQnlPYmplY3QoYVtlXSk7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueDx0aGlzLm1pbi54fHxhLng+dGhpcy5tYXgueHx8YS55PHRoaXMubWluLnl8fGEueT50aGlzLm1heC55fHwKYS56PHRoaXMubWluLnp8fGEuej50aGlzLm1heC56PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5taW4ueDw9YS5taW4ueCYmYS5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9YS5taW4ueSYmYS5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9YS5taW4ueiYmYS5tYXguejw9dGhpcy5tYXguen0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLChhLnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm1heC54PHRoaXMubWluLnh8fAphLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55fHxhLm1heC56PHRoaXMubWluLnp8fGEubWluLno+dGhpcy5tYXguej8hMTohMH0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt0aGlzLmNsYW1wUG9pbnQoYS5jZW50ZXIsWWMpO3JldHVybiBZYy5kaXN0YW5jZVRvU3F1YXJlZChhLmNlbnRlcik8PWEucmFkaXVzKmEucmFkaXVzfSxpbnRlcnNlY3RzUGxhbmU6ZnVuY3Rpb24oYSl7aWYoMDxhLm5vcm1hbC54KXt2YXIgYz1hLm5vcm1hbC54KnRoaXMubWluLng7dmFyIGU9YS5ub3JtYWwueCp0aGlzLm1heC54fWVsc2UgYz1hLm5vcm1hbC54KnRoaXMubWF4LngsZT1hLm5vcm1hbC54KnRoaXMubWluLng7MDxhLm5vcm1hbC55PyhjKz1hLm5vcm1hbC55KnRoaXMubWluLnksZSs9YS5ub3JtYWwueSp0aGlzLm1heC55KTooYys9YS5ub3JtYWwueSp0aGlzLm1heC55LGUrPWEubm9ybWFsLnkqdGhpcy5taW4ueSk7MDxhLm5vcm1hbC56PwooYys9YS5ub3JtYWwueip0aGlzLm1pbi56LGUrPWEubm9ybWFsLnoqdGhpcy5tYXgueik6KGMrPWEubm9ybWFsLnoqdGhpcy5tYXgueixlKz1hLm5vcm1hbC56KnRoaXMubWluLnopO3JldHVybiBjPD0tYS5jb25zdGFudCYmZT49LWEuY29uc3RhbnR9LGludGVyc2VjdHNUcmlhbmdsZTpmdW5jdGlvbihhKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihtZyk7bGguc3ViVmVjdG9ycyh0aGlzLm1heCxtZyk7amYuc3ViVmVjdG9ycyhhLmEsbWcpO2tmLnN1YlZlY3RvcnMoYS5iLG1nKTtsZi5zdWJWZWN0b3JzKGEuYyxtZyk7SWQuc3ViVmVjdG9ycyhrZixqZik7SmQuc3ViVmVjdG9ycyhsZixrZik7aGUuc3ViVmVjdG9ycyhqZixsZik7YT1bMCwtSWQueixJZC55LDAsLUpkLnosSmQueSwwLC1oZS56LGhlLnksSWQueiwwLC1JZC54LEpkLnosMCwtSmQueCxoZS56LDAsLWhlLngsLUlkLnksSWQueCwwLC1KZC55LEpkLngsMCwtaGUueSxoZS54LDBdO2lmKCFDKGEsCmpmLGtmLGxmLGxoKSlyZXR1cm4hMTthPVsxLDAsMCwwLDEsMCwwLDAsMV07aWYoIUMoYSxqZixrZixsZixsaCkpcmV0dXJuITE7bWguY3Jvc3NWZWN0b3JzKElkLEpkKTthPVttaC54LG1oLnksbWguel07cmV0dXJuIEMoYSxqZixrZixsZixsaCl9LGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KGEpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX0sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBZYy5jb3B5KGEpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIoYSkubGVuZ3RoKCl9LGdldEJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKTt0aGlzLmdldENlbnRlcihhLmNlbnRlcik7CmEucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShZYykubGVuZ3RoKCk7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhKXt0aGlzLm1pbi5tYXgoYS5taW4pO3RoaXMubWF4Lm1pbihhLm1heCk7dGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhLm1pbik7dGhpcy5tYXgubWF4KGEubWF4KTtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzO21kWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO21kWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO21kWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO21kWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpOwptZFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChhKTttZFs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChhKTttZFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChhKTttZFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChhKTt0aGlzLnNldEZyb21Qb2ludHMobWQpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciBZbT1uZXcgeDtPYmplY3QuYXNzaWduKEcucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLmNlbnRlci5jb3B5KGEpO3RoaXMucmFkaXVzPQpjO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5jZW50ZXI7dm9pZCAwIT09Yz9lLmNvcHkoYyk6WW0uc2V0RnJvbVBvaW50cyhhKS5nZXRDZW50ZXIoZSk7Zm9yKHZhciBnPWM9MCx0PWEubGVuZ3RoO2c8dDtnKyspYz1NYXRoLm1heChjLGUuZGlzdGFuY2VUb1NxdWFyZWQoYVtnXSkpO3RoaXMucmFkaXVzPU1hdGguc3FydChjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7dGhpcy5yYWRpdXM9YS5yYWRpdXM7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA+PXRoaXMucmFkaXVzfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS0KdGhpcy5yYWRpdXN9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yYWRpdXMrYS5yYWRpdXM7cmV0dXJuIGEuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9YypjfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNTcGhlcmUodGhpcyl9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoYS5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9LGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChhKTt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2MuY29weShhKTtlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoYy5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGMubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpOwpyZXR1cm4gY30sZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgeCk7YS5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpO2EuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpO3JldHVybiBhfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KGEpO3RoaXMucmFkaXVzKj1hLmdldE1heFNjYWxlT25BeGlzKCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmYS5yYWRpdXM9PT10aGlzLnJhZGl1c319KTt2YXIgbmQ9bmV3IGssRGk9bmV3IGssbmg9bmV3IGssS2Q9bmV3IGssRWk9bmV3IGssb2g9bmV3IGssRmk9bmV3IGs7Ck9iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMub3JpZ2luLmNvcHkoYSk7dGhpcy5kaXJlY3Rpb24uY29weShjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weShhLm9yaWdpbik7dGhpcy5kaXJlY3Rpb24uY29weShhLmRpcmVjdGlvbik7cmV0dXJuIHRoaXN9LGF0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKX0sbG9va0F0OmZ1bmN0aW9uKGEpe3RoaXMuZGlyZWN0aW9uLmNvcHkoYSkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30scmVjYXN0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmNvcHkodGhpcy5hdChhLApuZCkpO3JldHVybiB0aGlzfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtjLnN1YlZlY3RvcnMoYSx0aGlzLm9yaWdpbik7YT1jLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIDA+YT9jLmNvcHkodGhpcy5vcmlnaW4pOmMuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKX0sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludChhKSl9LGRpc3RhbmNlU3FUb1BvaW50OmZ1bmN0aW9uKGEpe3ZhciBjPW5kLnN1YlZlY3RvcnMoYSx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPmMpcmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKGEpO25kLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh0aGlzLm9yaWdpbik7CnJldHVybiBuZC5kaXN0YW5jZVRvU3F1YXJlZChhKX0sZGlzdGFuY2VTcVRvU2VnbWVudDpmdW5jdGlvbihhLGMsZSxnKXtEaS5jb3B5KGEpLmFkZChjKS5tdWx0aXBseVNjYWxhciguNSk7bmguY29weShjKS5zdWIoYSkubm9ybWFsaXplKCk7S2QuY29weSh0aGlzLm9yaWdpbikuc3ViKERpKTt2YXIgdD0uNSphLmRpc3RhbmNlVG8oYyksdj0tdGhpcy5kaXJlY3Rpb24uZG90KG5oKSx6PUtkLmRvdCh0aGlzLmRpcmVjdGlvbiksRT0tS2QuZG90KG5oKSxGPUtkLmxlbmd0aFNxKCksST1NYXRoLmFicygxLXYqdik7aWYoMDxJKXthPXYqRS16O2M9dip6LUU7dmFyIE09dCpJOzA8PWE/Yz49LU0/Yzw9TT8odD0xL0ksYSo9dCxjKj10LHY9YSooYSt2KmMrMip6KStjKih2KmErYysyKkUpK0YpOihjPXQsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0YpOihjPS10LGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStGKTpjPD0tTT8oYT1NYXRoLm1heCgwLAotKC12KnQreikpLGM9MDxhPy10Ok1hdGgubWluKE1hdGgubWF4KC10LC1FKSx0KSx2PS1hKmErYyooYysyKkUpK0YpOmM8PU0/KGE9MCxjPU1hdGgubWluKE1hdGgubWF4KC10LC1FKSx0KSx2PWMqKGMrMipFKStGKTooYT1NYXRoLm1heCgwLC0odip0K3opKSxjPTA8YT90Ok1hdGgubWluKE1hdGgubWF4KC10LC1FKSx0KSx2PS1hKmErYyooYysyKkUpK0YpfWVsc2UgYz0wPHY/LXQ6dCxhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRjtlJiZlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLm9yaWdpbik7ZyYmZy5jb3B5KG5oKS5tdWx0aXBseVNjYWxhcihjKS5hZGQoRGkpO3JldHVybiB2fSxpbnRlcnNlY3RTcGhlcmU6ZnVuY3Rpb24oYSxjKXtuZC5zdWJWZWN0b3JzKGEuY2VudGVyLHRoaXMub3JpZ2luKTt2YXIgZT1uZC5kb3QodGhpcy5kaXJlY3Rpb24pLGc9bmQuZG90KG5kKS1lKmU7YT1hLnJhZGl1cyphLnJhZGl1czsKaWYoZz5hKXJldHVybiBudWxsO2E9TWF0aC5zcXJ0KGEtZyk7Zz1lLWE7ZSs9YTtyZXR1cm4gMD5nJiYwPmU/bnVsbDowPmc/dGhpcy5hdChlLGMpOnRoaXMuYXQoZyxjKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludChhLmNlbnRlcik8PWEucmFkaXVzKmEucmFkaXVzfSxkaXN0YW5jZVRvUGxhbmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09YylyZXR1cm4gMD09PWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7YT0tKHRoaXMub3JpZ2luLmRvdChhLm5vcm1hbCkrYS5jb25zdGFudCkvYztyZXR1cm4gMDw9YT9hOm51bGx9LGludGVyc2VjdFBsYW5lOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmRpc3RhbmNlVG9QbGFuZShhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDp0aGlzLmF0KGEsYyl9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7CnJldHVybiAwPT09Y3x8MD5hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmM/ITA6ITF9LGludGVyc2VjdEJveDpmdW5jdGlvbihhLGMpe3ZhciBlPTEvdGhpcy5kaXJlY3Rpb24ueDt2YXIgZz0xL3RoaXMuZGlyZWN0aW9uLnk7dmFyIHQ9MS90aGlzLmRpcmVjdGlvbi56LHY9dGhpcy5vcmlnaW47aWYoMDw9ZSl7dmFyIHo9KGEubWluLngtdi54KSplO2UqPWEubWF4Lngtdi54fWVsc2Ugej0oYS5tYXgueC12LngpKmUsZSo9YS5taW4ueC12Lng7aWYoMDw9Zyl7dmFyIEU9KGEubWluLnktdi55KSpnO2cqPWEubWF4Lnktdi55fWVsc2UgRT0oYS5tYXgueS12LnkpKmcsZyo9YS5taW4ueS12Lnk7aWYoej5nfHxFPmUpcmV0dXJuIG51bGw7aWYoRT56fHx6IT09eil6PUU7aWYoZzxlfHxlIT09ZSllPWc7MDw9dD8oRT0oYS5taW4uei12LnopKnQsYT0oYS5tYXguei12LnopKnQpOihFPShhLm1heC56LXYueikqdCxhPShhLm1pbi56LXYueikqdCk7aWYoej5hfHxFPmUpcmV0dXJuIG51bGw7CmlmKEU+enx8eiE9PXopej1FO2lmKGE8ZXx8ZSE9PWUpZT1hO3JldHVybiAwPmU/bnVsbDp0aGlzLmF0KDA8PXo/ejplLGMpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3goYSxuZCl9LGludGVyc2VjdFRyaWFuZ2xlOmZ1bmN0aW9uKGEsYyxlLGcsdCl7RWkuc3ViVmVjdG9ycyhjLGEpO29oLnN1YlZlY3RvcnMoZSxhKTtGaS5jcm9zc1ZlY3RvcnMoRWksb2gpO2M9dGhpcy5kaXJlY3Rpb24uZG90KEZpKTtpZigwPGMpe2lmKGcpcmV0dXJuIG51bGw7Zz0xfWVsc2UgaWYoMD5jKWc9LTEsYz0tYztlbHNlIHJldHVybiBudWxsO0tkLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sYSk7YT1nKnRoaXMuZGlyZWN0aW9uLmRvdChvaC5jcm9zc1ZlY3RvcnMoS2Qsb2gpKTtpZigwPmEpcmV0dXJuIG51bGw7ZT1nKnRoaXMuZGlyZWN0aW9uLmRvdChFaS5jcm9zcyhLZCkpO2lmKDA+ZXx8YStlPmMpcmV0dXJuIG51bGw7YT0tZypLZC5kb3QoRmkpOwpyZXR1cm4gMD5hP251bGw6dGhpcy5hdChhL2MsdCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoYSk7dGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJmEuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9fSk7dmFyIEtjPW5ldyBrLG9kPW5ldyBrLEdpPW5ldyBrLHBkPW5ldyBrLG1mPW5ldyBrLG5mPW5ldyBrLHJrPW5ldyBrLEhpPW5ldyBrLElpPW5ldyBrLEppPW5ldyBrO09iamVjdC5hc3NpZ24oQix7Z2V0Tm9ybWFsOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWcmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGc9bmV3IGspO2cuc3ViVmVjdG9ycyhlLGMpO0tjLnN1YlZlY3RvcnMoYSxjKTtnLmNyb3NzKEtjKTsKYT1nLmxlbmd0aFNxKCk7cmV0dXJuIDA8YT9nLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KGEpKTpnLnNldCgwLDAsMCl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMsZSxnLHQpe0tjLnN1YlZlY3RvcnMoZyxjKTtvZC5zdWJWZWN0b3JzKGUsYyk7R2kuc3ViVmVjdG9ycyhhLGMpO2E9S2MuZG90KEtjKTtjPUtjLmRvdChvZCk7ZT1LYy5kb3QoR2kpO3ZhciB2PW9kLmRvdChvZCk7Zz1vZC5kb3QoR2kpO3ZhciB6PWEqdi1jKmM7dm9pZCAwPT09dCYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksdD1uZXcgayk7aWYoMD09PXopcmV0dXJuIHQuc2V0KC0yLC0xLC0xKTt6PTEvejt2PSh2KmUtYypnKSp6O2E9KGEqZy1jKmUpKno7cmV0dXJuIHQuc2V0KDEtdi1hLGEsdil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSxjLGUsZyl7Qi5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxwZCk7cmV0dXJuIDA8PXBkLngmJgowPD1wZC55JiYxPj1wZC54K3BkLnl9LGdldFVWOmZ1bmN0aW9uKGEsYyxlLGcsdCx2LHosRSl7dGhpcy5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxwZCk7RS5zZXQoMCwwKTtFLmFkZFNjYWxlZFZlY3Rvcih0LHBkLngpO0UuYWRkU2NhbGVkVmVjdG9yKHYscGQueSk7RS5hZGRTY2FsZWRWZWN0b3IoeixwZC56KTtyZXR1cm4gRX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhLGMsZSxnKXtLYy5zdWJWZWN0b3JzKGUsYyk7b2Quc3ViVmVjdG9ycyhhLGMpO3JldHVybiAwPktjLmNyb3NzKG9kKS5kb3QoZyk/ITA6ITF9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLmEuY29weShhKTt0aGlzLmIuY29weShjKTt0aGlzLmMuY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50c0FuZEluZGljZXM6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5hLmNvcHkoYVtjXSk7dGhpcy5iLmNvcHkoYVtlXSk7dGhpcy5jLmNvcHkoYVtnXSk7cmV0dXJuIHRoaXN9LApjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmEuY29weShhLmEpO3RoaXMuYi5jb3B5KGEuYik7dGhpcy5jLmNvcHkoYS5jKTtyZXR1cm4gdGhpc30sZ2V0QXJlYTpmdW5jdGlvbigpe0tjLnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYik7b2Quc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKTtyZXR1cm4uNSpLYy5jcm9zcyhvZCkubGVuZ3RoKCl9LGdldE1pZHBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuZ2V0TWlkcG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfSxnZXROb3JtYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxnZXRQbGFuZTpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRQbGFuZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfSxnZXRCYXJ5Y29vcmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYSx0aGlzLmEsdGhpcy5iLHRoaXMuYyxjKX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyx0KXtyZXR1cm4gQi5nZXRVVihhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMsZSxnLHQpfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBCLmNvbnRhaW5zUG9pbnQoYSx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGlzRnJvbnRGYWNpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyxhKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSwKYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3ZhciBlPXRoaXMuYSxnPXRoaXMuYix0PXRoaXMuYzttZi5zdWJWZWN0b3JzKGcsZSk7bmYuc3ViVmVjdG9ycyh0LGUpO0hpLnN1YlZlY3RvcnMoYSxlKTt2YXIgdj1tZi5kb3QoSGkpLHo9bmYuZG90KEhpKTtpZigwPj12JiYwPj16KXJldHVybiBjLmNvcHkoZSk7SWkuc3ViVmVjdG9ycyhhLGcpO3ZhciBFPW1mLmRvdChJaSksRj1uZi5kb3QoSWkpO2lmKDA8PUUmJkY8PUUpcmV0dXJuIGMuY29weShnKTt2YXIgST12KkYtRSp6O2lmKDA+PUkmJjA8PXYmJjA+PUUpcmV0dXJuIGc9di8odi1FKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKG1mLGcpO0ppLnN1YlZlY3RvcnMoYSx0KTthPW1mLmRvdChKaSk7dmFyIE09bmYuZG90KEppKTtpZigwPD1NJiZhPD1NKXJldHVybiBjLmNvcHkodCk7dj1hKnotCnYqTTtpZigwPj12JiYwPD16JiYwPj1NKXJldHVybiBJPXovKHotTSksYy5jb3B5KGUpLmFkZFNjYWxlZFZlY3RvcihuZixJKTt6PUUqTS1hKkY7aWYoMD49eiYmMDw9Ri1FJiYwPD1hLU0pcmV0dXJuIHJrLnN1YlZlY3RvcnModCxnKSxJPShGLUUpLyhGLUUrKGEtTSkpLGMuY29weShnKS5hZGRTY2FsZWRWZWN0b3IocmssSSk7dD0xLyh6K3YrSSk7Zz12KnQ7SSo9dDtyZXR1cm4gYy5jb3B5KGUpLmFkZFNjYWxlZFZlY3RvcihtZixnKS5hZGRTY2FsZWRWZWN0b3IobmYsSSl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5hLmVxdWFscyh0aGlzLmEpJiZhLmIuZXF1YWxzKHRoaXMuYikmJmEuYy5lcXVhbHModGhpcy5jKX19KTt2YXIgWm09e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsCmJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSwKZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LApsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsCm1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNiwKcmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxvYz17aDowLApzOjAsbDowfSxwaD17aDowLHM6MCxsOjB9O09iamVjdC5hc3NpZ24oSC5wcm90b3R5cGUse2lzQ29sb3I6ITAscjoxLGc6MSxiOjEsc2V0OmZ1bmN0aW9uKGEpe2EmJmEuaXNDb2xvcj90aGlzLmNvcHkoYSk6Im51bWJlciI9PT10eXBlb2YgYT90aGlzLnNldEhleChhKToic3RyaW5nIj09PXR5cGVvZiBhJiZ0aGlzLnNldFN0eWxlKGEpO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5iPXRoaXMuZz10aGlzLnI9YTtyZXR1cm4gdGhpc30sc2V0SGV4OmZ1bmN0aW9uKGEpe2E9TWF0aC5mbG9vcihhKTt0aGlzLnI9KGE+PjE2JjI1NSkvMjU1O3RoaXMuZz0oYT4+OCYyNTUpLzI1NTt0aGlzLmI9KGEmMjU1KS8yNTU7cmV0dXJuIHRoaXN9LHNldFJHQjpmdW5jdGlvbihhLGMsZSl7dGhpcy5yPWE7dGhpcy5nPWM7dGhpcy5iPWU7cmV0dXJuIHRoaXN9LHNldEhTTDpmdW5jdGlvbihhLGMsZSl7YT1oYi5ldWNsaWRlYW5Nb2R1bG8oYSwxKTtjPWhiLmNsYW1wKGMsMCwKMSk7ZT1oYi5jbGFtcChlLDAsMSk7MD09PWM/dGhpcy5yPXRoaXMuZz10aGlzLmI9ZTooYz0uNT49ZT9lKigxK2MpOmUrYy1lKmMsZT0yKmUtYyx0aGlzLnI9SyhlLGMsYSsxLzMpLHRoaXMuZz1LKGUsYyxhKSx0aGlzLmI9SyhlLGMsYS0xLzMpKTtyZXR1cm4gdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyh6KXt2b2lkIDAhPT16JiYxPnBhcnNlRmxvYXQoeikmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK2ErIiB3aWxsIGJlIGlnbm9yZWQuIil9dmFyIGU7aWYoZT0vXigoPzpyZ2J8aHNsKWE/KVwoXHMqKFteXCldKilcKS8uZXhlYyhhKSl7dmFyIGc9ZVsyXTtzd2l0Y2goZVsxXSl7Y2FzZSAicmdiIjpjYXNlICJyZ2JhIjppZihlPS9eKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGVbMV0sCjEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGVbM10sMTApKS8yNTUsYyhlWzVdKSx0aGlzO2lmKGU9L14oXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbMl0sMTApKS8xMDAsdGhpcy5iPU1hdGgubWluKDEwMCxwYXJzZUludChlWzNdLDEwKSkvMTAwLGMoZVs1XSksdGhpczticmVhaztjYXNlICJoc2wiOmNhc2UgImhzbGEiOmlmKGU9L14oWzAtOV0qXC4/WzAtOV0rKVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSl7Zz1wYXJzZUZsb2F0KGVbMV0pLzM2MDt2YXIgdD1wYXJzZUludChlWzJdLAoxMCkvMTAwLHY9cGFyc2VJbnQoZVszXSwxMCkvMTAwO2MoZVs1XSk7cmV0dXJuIHRoaXMuc2V0SFNMKGcsdCx2KX19fWVsc2UgaWYoZT0vXiMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoYSkpe2U9ZVsxXTtnPWUubGVuZ3RoO2lmKDM9PT1nKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoZS5jaGFyQXQoMCkrZS5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoZS5jaGFyQXQoMSkrZS5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoZS5jaGFyQXQoMikrZS5jaGFyQXQoMiksMTYpLzI1NSx0aGlzO2lmKDY9PT1nKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoZS5jaGFyQXQoMCkrZS5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoZS5jaGFyQXQoMikrZS5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoZS5jaGFyQXQoNCkrZS5jaGFyQXQoNSksMTYpLzI1NSx0aGlzfWEmJjA8YS5sZW5ndGgmJihlPVptW2FdLHZvaWQgMCE9PWU/dGhpcy5zZXRIZXgoZSk6CmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIithKSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnI9YS5yO3RoaXMuZz1hLmc7dGhpcy5iPWEuYjtyZXR1cm4gdGhpc30sY29weUdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0yKTt0aGlzLnI9TWF0aC5wb3coYS5yLGMpO3RoaXMuZz1NYXRoLnBvdyhhLmcsYyk7dGhpcy5iPU1hdGgucG93KGEuYixjKTtyZXR1cm4gdGhpc30sY29weUxpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0yKTtjPTA8Yz8xL2M6MTt0aGlzLnI9TWF0aC5wb3coYS5yLGMpO3RoaXMuZz1NYXRoLnBvdyhhLmcsYyk7dGhpcy5iPU1hdGgucG93KGEuYixjKTtyZXR1cm4gdGhpc30sY29udmVydEdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5jb3B5R2FtbWFUb0xpbmVhcih0aGlzLAphKTtyZXR1cm4gdGhpc30sY29udmVydExpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYSl7dGhpcy5jb3B5TGluZWFyVG9HYW1tYSh0aGlzLGEpO3JldHVybiB0aGlzfSxjb3B5U1JHQlRvTGluZWFyOmZ1bmN0aW9uKGEpe3RoaXMucj1MKGEucik7dGhpcy5nPUwoYS5nKTt0aGlzLmI9TChhLmIpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9TUkdCOmZ1bmN0aW9uKGEpe3RoaXMucj1KKGEucik7dGhpcy5nPUooYS5nKTt0aGlzLmI9SihhLmIpO3JldHVybiB0aGlzfSxjb252ZXJ0U1JHQlRvTGluZWFyOmZ1bmN0aW9uKCl7dGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9TUkdCOmZ1bmN0aW9uKCl7dGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpO3JldHVybiB0aGlzfSxnZXRIZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMjU1KnRoaXMucjw8MTZeMjU1KnRoaXMuZzw8OF4yNTUqdGhpcy5iPDwwfSxnZXRIZXhTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4oIjAwMDAwMCIrCnRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9LGdldEhTTDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogLmdldEhTTCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPXtoOjAsczowLGw6MH0pO3ZhciBjPXRoaXMucixlPXRoaXMuZyxnPXRoaXMuYix0PU1hdGgubWF4KGMsZSxnKSx2PU1hdGgubWluKGMsZSxnKSx6LEU9KHYrdCkvMjtpZih2PT09dCl2PXo9MDtlbHNle3ZhciBGPXQtdjt2PS41Pj1FP0YvKHQrdik6Ri8oMi10LXYpO3N3aXRjaCh0KXtjYXNlIGM6ej0oZS1nKS9GKyhlPGc/NjowKTticmVhaztjYXNlIGU6ej0oZy1jKS9GKzI7YnJlYWs7Y2FzZSBnOno9KGMtZSkvRis0fXovPTZ9YS5oPXo7YS5zPXY7YS5sPUU7cmV0dXJuIGF9LGdldFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJuInJnYigiKygyNTUqdGhpcy5yfDApKyIsIisoMjU1KnRoaXMuZ3wwKSsiLCIrKDI1NSp0aGlzLmJ8MCkrIikifSxvZmZzZXRIU0w6ZnVuY3Rpb24oYSwKYyxlKXt0aGlzLmdldEhTTChvYyk7b2MuaCs9YTtvYy5zKz1jO29jLmwrPWU7dGhpcy5zZXRIU0wob2MuaCxvYy5zLG9jLmwpO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSl7dGhpcy5yKz1hLnI7dGhpcy5nKz1hLmc7dGhpcy5iKz1hLmI7cmV0dXJuIHRoaXN9LGFkZENvbG9yczpmdW5jdGlvbihhLGMpe3RoaXMucj1hLnIrYy5yO3RoaXMuZz1hLmcrYy5nO3RoaXMuYj1hLmIrYy5iO3JldHVybiB0aGlzfSxhZGRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKz1hO3RoaXMuZys9YTt0aGlzLmIrPWE7cmV0dXJuIHRoaXN9LHN1YjpmdW5jdGlvbihhKXt0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItYS5yKTt0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctYS5nKTt0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItYS5iKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSl7dGhpcy5yKj1hLnI7dGhpcy5nKj1hLmc7dGhpcy5iKj1hLmI7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMucio9CmE7dGhpcy5nKj1hO3RoaXMuYio9YTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihhLGMpe3RoaXMucis9KGEuci10aGlzLnIpKmM7dGhpcy5nKz0oYS5nLXRoaXMuZykqYzt0aGlzLmIrPShhLmItdGhpcy5iKSpjO3JldHVybiB0aGlzfSxsZXJwSFNMOmZ1bmN0aW9uKGEsYyl7dGhpcy5nZXRIU0wob2MpO2EuZ2V0SFNMKHBoKTthPWhiLmxlcnAob2MuaCxwaC5oLGMpO3ZhciBlPWhiLmxlcnAob2MucyxwaC5zLGMpO2M9aGIubGVycChvYy5sLHBoLmwsYyk7dGhpcy5zZXRIU0woYSxlLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucj09PXRoaXMuciYmYS5nPT09dGhpcy5nJiZhLmI9PT10aGlzLmJ9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMucj1hW2NdO3RoaXMuZz1hW2MrMV07dGhpcy5iPWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT0KYyYmKGM9MCk7YVtjXT10aGlzLnI7YVtjKzFdPXRoaXMuZzthW2MrMl09dGhpcy5iO3JldHVybiBhfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX19KTtPYmplY3QuYXNzaWduKE8ucHJvdG90eXBlLHtjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmE9YS5hO3RoaXMuYj1hLmI7dGhpcy5jPWEuYzt0aGlzLm5vcm1hbC5jb3B5KGEubm9ybWFsKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXRlcmlhbEluZGV4PWEubWF0ZXJpYWxJbmRleDtmb3IodmFyIGM9MCxlPWEudmVydGV4Tm9ybWFscy5sZW5ndGg7YzxlO2MrKyl0aGlzLnZlcnRleE5vcm1hbHNbY109YS52ZXJ0ZXhOb3JtYWxzW2NdLmNsb25lKCk7Yz0wO2ZvcihlPWEudmVydGV4Q29sb3JzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Q29sb3JzW2NdPWEudmVydGV4Q29sb3JzW2NdLmNsb25lKCk7CnJldHVybiB0aGlzfX0pO3ZhciBqbD0wO1MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlMsaXNNYXRlcmlhbDohMCxvbkJlZm9yZUNvbXBpbGU6ZnVuY3Rpb24oKXt9LHNldFZhbHVlczpmdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKWZvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKHZvaWQgMD09PWUpY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogJyIrYysiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIpO2Vsc2UgaWYoInNoYWRpbmciPT09Yyljb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1lPyEwOiExO2Vsc2V7dmFyIGc9dGhpc1tjXTt2b2lkIDA9PT1nP2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogJyIrYysiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIpOgpnJiZnLmlzQ29sb3I/Zy5zZXQoZSk6ZyYmZy5pc1ZlY3RvcjMmJmUmJmUuaXNWZWN0b3IzP2cuY29weShlKTp0aGlzW2NdPWV9fX0sdG9KU09OOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGModCl7dmFyIHY9W10sejtmb3IoeiBpbiB0KXt2YXIgRT10W3pdO2RlbGV0ZSBFLm1ldGFkYXRhO3YucHVzaChFKX1yZXR1cm4gdn12YXIgZT12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2UmJihhPXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTt2YXIgZz17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtnLnV1aWQ9dGhpcy51dWlkO2cudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihnLm5hbWU9dGhpcy5uYW1lKTt0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihnLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMucm91Z2huZXNzJiYoZy5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpOwp2b2lkIDAhPT10aGlzLm1ldGFsbmVzcyYmKGcubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKTt0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihnLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYoZy5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KTt0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihnLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYoZy5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpO3ZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0JiYoZy5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpO3ZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiYKdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSk7dGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKGcubWFwPXRoaXMubWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYoZy5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYoZy5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKGcubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04oYSkudXVpZCk7dGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihnLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKGEpLnV1aWQsCmcuYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSk7dGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYoZy5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04oYSkudXVpZCxnLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSk7dGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKGcubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTihhKS51dWlkLGcubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsZy5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSk7dGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKGcuZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTihhKS51dWlkLGcuZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxnLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKTt0aGlzLnJvdWdobmVzc01hcCYmCnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKGcucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYoZy5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKGcuc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbnZNYXAmJnRoaXMuZW52TWFwLmlzVGV4dHVyZSYmKGcuZW52TWFwPXRoaXMuZW52TWFwLnRvSlNPTihhKS51dWlkLGcucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5LGcucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvLAp2b2lkIDAhPT10aGlzLmNvbWJpbmUmJihnLmNvbWJpbmU9dGhpcy5jb21iaW5lKSx2b2lkIDAhPT10aGlzLmVudk1hcEludGVuc2l0eSYmKGcuZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSk7dGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihnLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKGEpLnV1aWQpO3ZvaWQgMCE9PXRoaXMuc2l6ZSYmKGcuc2l6ZT10aGlzLnNpemUpO3ZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYoZy5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pOzEhPT10aGlzLmJsZW5kaW5nJiYoZy5ibGVuZGluZz10aGlzLmJsZW5kaW5nKTshMD09PXRoaXMuZmxhdFNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPXRoaXMuZmxhdFNoYWRpbmcpOzAhPT10aGlzLnNpZGUmJihnLnNpZGU9dGhpcy5zaWRlKTswIT09dGhpcy52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz0KdGhpcy52ZXJ0ZXhDb2xvcnMpOzE+dGhpcy5vcGFjaXR5JiYoZy5vcGFjaXR5PXRoaXMub3BhY2l0eSk7ITA9PT10aGlzLnRyYW5zcGFyZW50JiYoZy50cmFuc3BhcmVudD10aGlzLnRyYW5zcGFyZW50KTtnLmRlcHRoRnVuYz10aGlzLmRlcHRoRnVuYztnLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdDtnLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlO2cuc3RlbmNpbFdyaXRlPXRoaXMuc3RlbmNpbFdyaXRlO2cuc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYztnLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmO2cuc3RlbmNpbE1hc2s9dGhpcy5zdGVuY2lsTWFzaztnLnN0ZW5jaWxGYWlsPXRoaXMuc3RlbmNpbEZhaWw7Zy5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWw7Zy5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3M7dGhpcy5yb3RhdGlvbiYmMCE9PXRoaXMucm90YXRpb24mJihnLnJvdGF0aW9uPXRoaXMucm90YXRpb24pOyEwPT09dGhpcy5wb2x5Z29uT2Zmc2V0JiYKKGcucG9seWdvbk9mZnNldD0hMCk7MCE9PXRoaXMucG9seWdvbk9mZnNldEZhY3RvciYmKGcucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpOzAhPT10aGlzLnBvbHlnb25PZmZzZXRVbml0cyYmKGcucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKTt0aGlzLmxpbmV3aWR0aCYmMSE9PXRoaXMubGluZXdpZHRoJiYoZy5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpO3ZvaWQgMCE9PXRoaXMuZGFzaFNpemUmJihnLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpO3ZvaWQgMCE9PXRoaXMuZ2FwU2l6ZSYmKGcuZ2FwU2l6ZT10aGlzLmdhcFNpemUpO3ZvaWQgMCE9PXRoaXMuc2NhbGUmJihnLnNjYWxlPXRoaXMuc2NhbGUpOyEwPT09dGhpcy5kaXRoZXJpbmcmJihnLmRpdGhlcmluZz0hMCk7MDx0aGlzLmFscGhhVGVzdCYmKGcuYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KTshMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYoZy5wcmVtdWx0aXBsaWVkQWxwaGE9CnRoaXMucHJlbXVsdGlwbGllZEFscGhhKTshMD09PXRoaXMud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9dGhpcy53aXJlZnJhbWUpOzE8dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgmJihnLndpcmVmcmFtZUxpbmV3aWR0aD10aGlzLndpcmVmcmFtZUxpbmV3aWR0aCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWNhcCYmKGcud2lyZWZyYW1lTGluZWNhcD10aGlzLndpcmVmcmFtZUxpbmVjYXApOyJyb3VuZCIhPT10aGlzLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVqb2luKTshMD09PXRoaXMubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9ITApOyEwPT09dGhpcy5tb3JwaE5vcm1hbHMmJihnLm1vcnBoTm9ybWFscz0hMCk7ITA9PT10aGlzLnNraW5uaW5nJiYoZy5za2lubmluZz0hMCk7ITE9PT10aGlzLnZpc2libGUmJihnLnZpc2libGU9ITEpOyExPT09dGhpcy50b25lTWFwcGVkJiYoZy50b25lTWFwcGVkPSExKTsKInt9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYoZy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtlJiYoZT1jKGEudGV4dHVyZXMpLGE9YyhhLmltYWdlcyksMDxlLmxlbmd0aCYmKGcudGV4dHVyZXM9ZSksMDxhLmxlbmd0aCYmKGcuaW1hZ2VzPWEpKTtyZXR1cm4gZ30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmZvZz1hLmZvZzt0aGlzLmxpZ2h0cz1hLmxpZ2h0czt0aGlzLmJsZW5kaW5nPWEuYmxlbmRpbmc7dGhpcy5zaWRlPWEuc2lkZTt0aGlzLmZsYXRTaGFkaW5nPWEuZmxhdFNoYWRpbmc7dGhpcy52ZXJ0ZXhDb2xvcnM9YS52ZXJ0ZXhDb2xvcnM7dGhpcy5vcGFjaXR5PWEub3BhY2l0eTt0aGlzLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQ7dGhpcy5ibGVuZFNyYz1hLmJsZW5kU3JjO3RoaXMuYmxlbmREc3Q9YS5ibGVuZERzdDt0aGlzLmJsZW5kRXF1YXRpb249CmEuYmxlbmRFcXVhdGlvbjt0aGlzLmJsZW5kU3JjQWxwaGE9YS5ibGVuZFNyY0FscGhhO3RoaXMuYmxlbmREc3RBbHBoYT1hLmJsZW5kRHN0QWxwaGE7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9YS5ibGVuZEVxdWF0aW9uQWxwaGE7dGhpcy5kZXB0aEZ1bmM9YS5kZXB0aEZ1bmM7dGhpcy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3Q7dGhpcy5kZXB0aFdyaXRlPWEuZGVwdGhXcml0ZTt0aGlzLnN0ZW5jaWxXcml0ZT1hLnN0ZW5jaWxXcml0ZTt0aGlzLnN0ZW5jaWxGdW5jPWEuc3RlbmNpbEZ1bmM7dGhpcy5zdGVuY2lsUmVmPWEuc3RlbmNpbFJlZjt0aGlzLnN0ZW5jaWxNYXNrPWEuc3RlbmNpbE1hc2s7dGhpcy5zdGVuY2lsRmFpbD1hLnN0ZW5jaWxGYWlsO3RoaXMuc3RlbmNpbFpGYWlsPWEuc3RlbmNpbFpGYWlsO3RoaXMuc3RlbmNpbFpQYXNzPWEuc3RlbmNpbFpQYXNzO3RoaXMuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGU7dGhpcy5wcmVjaXNpb249YS5wcmVjaXNpb247dGhpcy5wb2x5Z29uT2Zmc2V0PQphLnBvbHlnb25PZmZzZXQ7dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcjt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz1hLnBvbHlnb25PZmZzZXRVbml0czt0aGlzLmRpdGhlcmluZz1hLmRpdGhlcmluZzt0aGlzLmFscGhhVGVzdD1hLmFscGhhVGVzdDt0aGlzLnByZW11bHRpcGxpZWRBbHBoYT1hLnByZW11bHRpcGxpZWRBbHBoYTt0aGlzLnZpc2libGU9YS52aXNpYmxlO3RoaXMudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQ7dGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEudXNlckRhdGEpKTt0aGlzLmNsaXBTaGFkb3dzPWEuY2xpcFNoYWRvd3M7dGhpcy5jbGlwSW50ZXJzZWN0aW9uPWEuY2xpcEludGVyc2VjdGlvbjt2YXIgYz1hLmNsaXBwaW5nUGxhbmVzLGU9bnVsbDtpZihudWxsIT09Yyl7dmFyIGc9Yy5sZW5ndGg7ZT1BcnJheShnKTtmb3IodmFyIHQ9MDt0IT09ZzsrK3QpZVt0XT1jW3RdLmNsb25lKCl9dGhpcy5jbGlwcGluZ1BsYW5lcz0KZTt0aGlzLnNoYWRvd1NpZGU9YS5zaGFkb3dTaWRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO04ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO04ucHJvdG90eXBlLmNvbnN0cnVjdG9yPU47Ti5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMDtOLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDsKdGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7cmV0dXJuIHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKFIucHJvdG90eXBlLHtpc0J1ZmZlckF0dHJpYnV0ZTohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC90aGlzLml0ZW1TaXplOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWU7dGhpcy5hcnJheT1uZXcgYS5hcnJheS5jb25zdHJ1Y3RvcihhLmFycmF5KTt0aGlzLml0ZW1TaXplPWEuaXRlbVNpemU7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMubm9ybWFsaXplZD1hLm5vcm1hbGl6ZWQ7dGhpcy5keW5hbWljPWEuZHluYW1pYztyZXR1cm4gdGhpc30sY29weUF0OmZ1bmN0aW9uKGEsYyxlKXthKj10aGlzLml0ZW1TaXplO2UqPWMuaXRlbVNpemU7Zm9yKHZhciBnPTAsdD10aGlzLml0ZW1TaXplO2c8dDtnKyspdGhpcy5hcnJheVthK2ddPWMuYXJyYXlbZStnXTtyZXR1cm4gdGhpc30sY29weUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXkuc2V0KGEpO3JldHVybiB0aGlzfSxjb3B5Q29sb3JzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPQp0aGlzLmFycmF5LGU9MCxnPTAsdD1hLmxlbmd0aDtnPHQ7ZysrKXt2YXIgdj1hW2ddO3ZvaWQgMD09PXYmJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkIixnKSx2PW5ldyBIKTtjW2UrK109di5yO2NbZSsrXT12Lmc7Y1tlKytdPXYuYn1yZXR1cm4gdGhpc30sY29weVZlY3RvcjJzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCx0PWEubGVuZ3RoO2c8dDtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGYpO2NbZSsrXT12Lng7Y1tlKytdPXYueX1yZXR1cm4gdGhpc30sY29weVZlY3RvcjNzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCx0PWEubGVuZ3RoO2c8dDtnKyspe3ZhciB2PQphW2ddO3ZvaWQgMD09PXYmJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixnKSx2PW5ldyBrKTtjW2UrK109di54O2NbZSsrXT12Lnk7Y1tlKytdPXYuen1yZXR1cm4gdGhpc30sY29weVZlY3RvcjRzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCx0PWEubGVuZ3RoO2c8dDtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IHApO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56O2NbZSsrXT12Lnd9cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSoKdGhpcy5pdGVtU2l6ZV19LHNldFg6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZV09YztyZXR1cm4gdGhpc30sZ2V0WTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMV19LHNldFk6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXT1jO3JldHVybiB0aGlzfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsyXX0sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdPWM7cmV0dXJuIHRoaXN9LGdldFc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzNdfSxzZXRXOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM109YztyZXR1cm4gdGhpc30sc2V0WFk6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVthKzBdPWM7dGhpcy5hcnJheVthKwoxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSxjLGUsZyl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09ZztyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihhLGMsZSxnLHQpe2EqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVthKzBdPWM7dGhpcy5hcnJheVthKzFdPWU7dGhpcy5hcnJheVthKzJdPWc7dGhpcy5hcnJheVthKzNdPXQ7cmV0dXJuIHRoaXN9LG9uVXBsb2FkOmZ1bmN0aW9uKGEpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1hO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KSwKbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fX0pO1gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO1gucHJvdG90eXBlLmNvbnN0cnVjdG9yPVg7YWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2FhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hYTtmYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7ZmEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZhO29hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtvYS5wcm90b3R5cGUuY29uc3RydWN0b3I9b2E7Wi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7Wi5wcm90b3R5cGUuY29uc3RydWN0b3I9WjtjYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7Y2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNhO2phLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtqYS5wcm90b3R5cGUuY29uc3RydWN0b3I9amE7CmJhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7a2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2thLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1rYTtPYmplY3QuYXNzaWduKFcucHJvdG90eXBlLHtjb21wdXRlR3JvdXBzOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGU9dm9pZCAwO2E9YS5mYWNlcztmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIHQ9YVtnXTtpZih0Lm1hdGVyaWFsSW5kZXghPT1lKXtlPXQubWF0ZXJpYWxJbmRleDt2b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3ZhciB2PXtzdGFydDozKmcsbWF0ZXJpYWxJbmRleDplfX19dm9pZCAwIT09diYmKHYuY291bnQ9MypnLXYuc3RhcnQsYy5wdXNoKHYpKTt0aGlzLmdyb3Vwcz1jfSxmcm9tR2VvbWV0cnk6ZnVuY3Rpb24oYSl7dmFyIGM9YS5mYWNlcyxlPWEudmVydGljZXMsZz1hLmZhY2VWZXJ0ZXhVdnMsCnQ9Z1swXSYmMDxnWzBdLmxlbmd0aCx2PWdbMV0mJjA8Z1sxXS5sZW5ndGgsej1hLm1vcnBoVGFyZ2V0cyxFPXoubGVuZ3RoO2lmKDA8RSl7dmFyIEY9W107Zm9yKHZhciBJPTA7STxFO0krKylGW0ldPXtuYW1lOnpbSV0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbj1GfXZhciBNPWEubW9ycGhOb3JtYWxzLFA9TS5sZW5ndGg7aWYoMDxQKXt2YXIgUT1bXTtmb3IoST0wO0k8UDtJKyspUVtJXT17bmFtZTpNW0ldLm5hbWUsZGF0YTpbXX07dGhpcy5tb3JwaFRhcmdldHMubm9ybWFsPVF9dmFyIFU9YS5za2luSW5kaWNlcyxWPWEuc2tpbldlaWdodHMsZWE9VS5sZW5ndGg9PT1lLmxlbmd0aCxkYT1WLmxlbmd0aD09PWUubGVuZ3RoOzA8ZS5sZW5ndGgmJjA9PT1jLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuRGlyZWN0R2VvbWV0cnk6IEZhY2VsZXNzIGdlb21ldHJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7Zm9yKEk9MDtJPGMubGVuZ3RoO0krKyl7dmFyIHJhPQpjW0ldO3RoaXMudmVydGljZXMucHVzaChlW3JhLmFdLGVbcmEuYl0sZVtyYS5jXSk7dmFyIHBhPXJhLnZlcnRleE5vcm1hbHM7Mz09PXBhLmxlbmd0aD90aGlzLm5vcm1hbHMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLm5vcm1hbCx0aGlzLm5vcm1hbHMucHVzaChwYSxwYSxwYSkpO3BhPXJhLnZlcnRleENvbG9yczszPT09cGEubGVuZ3RoP3RoaXMuY29sb3JzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihwYT1yYS5jb2xvcix0aGlzLmNvbG9ycy5wdXNoKHBhLHBhLHBhKSk7ITA9PT10JiYocGE9Z1swXVtJXSx2b2lkIDAhPT1wYT90aGlzLnV2cy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICIsSSksdGhpcy51dnMucHVzaChuZXcgZixuZXcgZixuZXcgZikpKTshMD09PXYmJihwYT1nWzFdW0ldLHZvaWQgMCE9PXBhP3RoaXMudXZzMi5wdXNoKHBhWzBdLApwYVsxXSxwYVsyXSk6KGNvbnNvbGUud2FybigiVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgIixJKSx0aGlzLnV2czIucHVzaChuZXcgZixuZXcgZixuZXcgZikpKTtmb3IocGE9MDtwYTxFO3BhKyspe3ZhciBxYT16W3BhXS52ZXJ0aWNlcztGW3BhXS5kYXRhLnB1c2gocWFbcmEuYV0scWFbcmEuYl0scWFbcmEuY10pfWZvcihwYT0wO3BhPFA7cGErKylxYT1NW3BhXS52ZXJ0ZXhOb3JtYWxzW0ldLFFbcGFdLmRhdGEucHVzaChxYS5hLHFhLmIscWEuYyk7ZWEmJnRoaXMuc2tpbkluZGljZXMucHVzaChVW3JhLmFdLFVbcmEuYl0sVVtyYS5jXSk7ZGEmJnRoaXMuc2tpbldlaWdodHMucHVzaChWW3JhLmFdLFZbcmEuYl0sVltyYS5jXSl9dGhpcy5jb21wdXRlR3JvdXBzKGEpO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9YS5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWEuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9YS51dnNOZWVkVXBkYXRlO3RoaXMuZ3JvdXBzTmVlZFVwZGF0ZT1hLmdyb3Vwc05lZWRVcGRhdGU7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9fSk7dmFyIGtsPTEsWmM9bmV3IHEsS2k9bmV3IEEscWg9bmV3IGssaWU9bmV3IHgsTGk9bmV3IHgsTGM9bmV3IGs7dmEucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZhLGlzQnVmZmVyR2VvbWV0cnk6ITAsZ2V0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRleH0sc2V0SW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5pbmRleD1BcnJheS5pc0FycmF5KGEpPwpuZXcgKDY1NTM1PEVhKGEpP2phOlopKGEsMSk6YX0sYWRkQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtpZighKGMmJmMuaXNCdWZmZXJBdHRyaWJ1dGV8fGMmJmMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuYWRkQXR0cmlidXRlKGEsbmV3IFIoYyxlKSk7aWYoImluZGV4Ij09PWEpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGMpLHRoaXM7dGhpcy5hdHRyaWJ1dGVzW2FdPWM7cmV0dXJuIHRoaXN9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2FdfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1thXTsKcmV0dXJuIHRoaXN9LGFkZEdyb3VwOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDphLGNvdW50OmMsbWF0ZXJpYWxJbmRleDp2b2lkIDAhPT1lP2U6MH0pfSxjbGVhckdyb3VwczpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPVtdfSxzZXREcmF3UmFuZ2U6ZnVuY3Rpb24oYSxjKXt0aGlzLmRyYXdSYW5nZS5zdGFydD1hO3RoaXMuZHJhd1JhbmdlLmNvdW50PWN9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjt2b2lkIDAhPT1jJiYoYS5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGMpLGMubmVlZHNVcGRhdGU9ITApO3ZhciBlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7dm9pZCAwIT09ZSYmKGM9KG5ldyByKS5nZXROb3JtYWxNYXRyaXgoYSksYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO2U9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7dm9pZCAwIT09ZSYmKGM9KG5ldyByKS5nZXROb3JtYWxNYXRyaXgoYSksCmMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShlKSxlLm5lZWRzVXBkYXRlPSEwKTtudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtaYy5tYWtlUm90YXRpb25YKGEpO3RoaXMuYXBwbHlNYXRyaXgoWmMpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe1pjLm1ha2VSb3RhdGlvblkoYSk7dGhpcy5hcHBseU1hdHJpeChaYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYSl7WmMubWFrZVJvdGF0aW9uWihhKTt0aGlzLmFwcGx5TWF0cml4KFpjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyxlKXtaYy5tYWtlVHJhbnNsYXRpb24oYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWmMpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGMsZSl7WmMubWFrZVNjYWxlKGEsCmMsZSk7dGhpcy5hcHBseU1hdHJpeChaYyk7cmV0dXJuIHRoaXN9LGxvb2tBdDpmdW5jdGlvbihhKXtLaS5sb29rQXQoYSk7S2kudXBkYXRlTWF0cml4KCk7dGhpcy5hcHBseU1hdHJpeChLaS5tYXRyaXgpO3JldHVybiB0aGlzfSxjZW50ZXI6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO3RoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKHFoKS5uZWdhdGUoKTt0aGlzLnRyYW5zbGF0ZShxaC54LHFoLnkscWgueik7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZW9tZXRyeTtpZihhLmlzUG9pbnRzfHxhLmlzTGluZSl7YT1uZXcgYmEoMypjLnZlcnRpY2VzLmxlbmd0aCwzKTt2YXIgZT1uZXcgYmEoMypjLmNvbG9ycy5sZW5ndGgsMyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixhLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgiY29sb3IiLGUuY29weUNvbG9yc0FycmF5KGMuY29sb3JzKSk7CmMubGluZURpc3RhbmNlcyYmYy5saW5lRGlzdGFuY2VzLmxlbmd0aD09PWMudmVydGljZXMubGVuZ3RoJiYoYT1uZXcgYmEoYy5saW5lRGlzdGFuY2VzLmxlbmd0aCwxKSx0aGlzLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixhLmNvcHlBcnJheShjLmxpbmVEaXN0YW5jZXMpKSk7bnVsbCE9PWMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWMuYm91bmRpbmdCb3guY2xvbmUoKSl9ZWxzZSBhLmlzTWVzaCYmYyYmYy5pc0dlb21ldHJ5JiZ0aGlzLmZyb21HZW9tZXRyeShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHQ9YVtlXTtjLnB1c2godC54LHQueSx0Lnp8fDApfXRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGMsMykpOwpyZXR1cm4gdGhpc30sdXBkYXRlRnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNNZXNoKXt2YXIgZT1jLl9fZGlyZWN0R2VvbWV0cnk7ITA9PT1jLmVsZW1lbnRzTmVlZFVwZGF0ZSYmKGU9dm9pZCAwLGMuZWxlbWVudHNOZWVkVXBkYXRlPSExKTtpZih2b2lkIDA9PT1lKXJldHVybiB0aGlzLmZyb21HZW9tZXRyeShjKTtlLnZlcnRpY2VzTmVlZFVwZGF0ZT1jLnZlcnRpY2VzTmVlZFVwZGF0ZTtlLm5vcm1hbHNOZWVkVXBkYXRlPWMubm9ybWFsc05lZWRVcGRhdGU7ZS5jb2xvcnNOZWVkVXBkYXRlPWMuY29sb3JzTmVlZFVwZGF0ZTtlLnV2c05lZWRVcGRhdGU9Yy51dnNOZWVkVXBkYXRlO2UuZ3JvdXBzTmVlZFVwZGF0ZT1jLmdyb3Vwc05lZWRVcGRhdGU7Yy52ZXJ0aWNlc05lZWRVcGRhdGU9ITE7Yy5ub3JtYWxzTmVlZFVwZGF0ZT0hMTtjLmNvbG9yc05lZWRVcGRhdGU9ITE7Yy51dnNOZWVkVXBkYXRlPSExO2MuZ3JvdXBzTmVlZFVwZGF0ZT0hMTsKYz1lfSEwPT09Yy52ZXJ0aWNlc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yM3NBcnJheShjLnZlcnRpY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMSk7ITA9PT1jLm5vcm1hbHNOZWVkVXBkYXRlJiYoZT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMubm9ybWFscyksZS5uZWVkc1VwZGF0ZT0hMCksYy5ub3JtYWxzTmVlZFVwZGF0ZT0hMSk7ITA9PT1jLmNvbG9yc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5jb2xvcix2b2lkIDAhPT1lJiYoZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpLGUubmVlZHNVcGRhdGU9ITApLGMuY29sb3JzTmVlZFVwZGF0ZT0hMSk7Yy51dnNOZWVkVXBkYXRlJiYoZT10aGlzLmF0dHJpYnV0ZXMudXYsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjJzQXJyYXkoYy51dnMpLGUubmVlZHNVcGRhdGU9CiEwKSxjLnV2c05lZWRVcGRhdGU9ITEpO2MubGluZURpc3RhbmNlc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2Usdm9pZCAwIT09ZSYmKGUuY29weUFycmF5KGMubGluZURpc3RhbmNlcyksZS5uZWVkc1VwZGF0ZT0hMCksYy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0hMSk7Yy5ncm91cHNOZWVkVXBkYXRlJiYoYy5jb21wdXRlR3JvdXBzKGEuZ2VvbWV0cnkpLHRoaXMuZ3JvdXBzPWMuZ3JvdXBzLGMuZ3JvdXBzTmVlZFVwZGF0ZT0hMSk7cmV0dXJuIHRoaXN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXthLl9fZGlyZWN0R2VvbWV0cnk9KG5ldyBXKS5mcm9tR2VvbWV0cnkoYSk7cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KGEuX19kaXJlY3RHZW9tZXRyeSl9LGZyb21EaXJlY3RHZW9tZXRyeTpmdW5jdGlvbihhKXt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLChuZXcgUihuZXcgRmxvYXQzMkFycmF5KDMqYS52ZXJ0aWNlcy5sZW5ndGgpLAozKSkuY29weVZlY3RvcjNzQXJyYXkoYS52ZXJ0aWNlcykpOzA8YS5ub3JtYWxzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMyphLm5vcm1hbHMubGVuZ3RoKSwzKSkuY29weVZlY3RvcjNzQXJyYXkoYS5ub3JtYWxzKSk7MDxhLmNvbG9ycy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMyphLmNvbG9ycy5sZW5ndGgpLDMpKS5jb3B5Q29sb3JzQXJyYXkoYS5jb2xvcnMpKTswPGEudXZzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmEudXZzLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzKSk7MDxhLnV2czIubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYyIiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmEudXZzMi5sZW5ndGgpLDIpKS5jb3B5VmVjdG9yMnNBcnJheShhLnV2czIpKTsKdGhpcy5ncm91cHM9YS5ncm91cHM7Zm9yKHZhciBjIGluIGEubW9ycGhUYXJnZXRzKXtmb3IodmFyIGU9W10sZz1hLm1vcnBoVGFyZ2V0c1tjXSx0PTAsdj1nLmxlbmd0aDt0PHY7dCsrKXt2YXIgej1nW3RdLEU9bmV3IGJhKDMqei5kYXRhLmxlbmd0aCwzKTtFLm5hbWU9ei5uYW1lO2UucHVzaChFLmNvcHlWZWN0b3Izc0FycmF5KHouZGF0YSkpfXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdPWV9MDxhLnNraW5JbmRpY2VzLmxlbmd0aCYmKGM9bmV3IGJhKDQqYS5za2luSW5kaWNlcy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5JbmRleCIsYy5jb3B5VmVjdG9yNHNBcnJheShhLnNraW5JbmRpY2VzKSkpOzA8YS5za2luV2VpZ2h0cy5sZW5ndGgmJihjPW5ldyBiYSg0KmEuc2tpbldlaWdodHMubGVuZ3RoLDQpLHRoaXMuYWRkQXR0cmlidXRlKCJza2luV2VpZ2h0IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbldlaWdodHMpKSk7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJgoodGhpcy5ib3VuZGluZ1NwaGVyZT1hLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpO251bGwhPT1hLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1hLmJvdW5kaW5nQm94LmNsb25lKCkpO3JldHVybiB0aGlzfSxjb21wdXRlQm91bmRpbmdCb3g6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IHgpO3ZhciBhPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixjPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHZvaWQgMCE9PWEpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSxjKXthPTA7Zm9yKHZhciBlPWMubGVuZ3RoO2E8ZTthKyspaWUuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShjW2FdKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoaWUubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoaWUubWF4KX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwooaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgRyk7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoYSl7dmFyIGU9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWUuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKTtpZihjKWZvcih2YXIgZz0wLHQ9Yy5sZW5ndGg7Zzx0O2crKyl7dmFyIHY9CmNbZ107TGkuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh2KTtpZS5leHBhbmRCeVBvaW50KExpLm1pbik7aWUuZXhwYW5kQnlQb2ludChMaS5tYXgpfWllLmdldENlbnRlcihlKTt2YXIgej0wO2c9MDtmb3IodD1hLmNvdW50O2c8dDtnKyspTGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGcpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKExjKSk7aWYoYylmb3IoZz0wLHQ9Yy5sZW5ndGg7Zzx0O2crKyl7dj1jW2ddO2E9MDtmb3IodmFyIEU9di5jb3VudDthPEU7YSsrKUxjLmZyb21CdWZmZXJBdHRyaWJ1dGUodixhKSx6PU1hdGgubWF4KHosZS5kaXN0YW5jZVRvU3F1YXJlZChMYykpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydCh6KTtpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLAp0aGlzKX19LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe30sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmluZGV4LGM9dGhpcy5hdHRyaWJ1dGVzO2lmKGMucG9zaXRpb24pe3ZhciBlPWMucG9zaXRpb24uYXJyYXk7aWYodm9pZCAwPT09Yy5ub3JtYWwpdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aCksMykpO2Vsc2UgZm9yKHZhciBnPWMubm9ybWFsLmFycmF5LHQ9MCx2PWcubGVuZ3RoO3Q8djt0KyspZ1t0XT0wO2c9Yy5ub3JtYWwuYXJyYXk7dmFyIHo9bmV3IGssRT1uZXcgayxGPW5ldyBrLEk9bmV3IGssTT1uZXcgaztpZihhKXt2YXIgUD1hLmFycmF5O3Q9MDtmb3Iodj1hLmNvdW50O3Q8djt0Kz0zKXthPTMqUFt0KzBdO3ZhciBRPTMqUFt0KzFdO3ZhciBVPTMqUFt0KzJdO3ouZnJvbUFycmF5KGUsYSk7RS5mcm9tQXJyYXkoZSxRKTtGLmZyb21BcnJheShlLFUpO0kuc3ViVmVjdG9ycyhGLApFKTtNLnN1YlZlY3RvcnMoeixFKTtJLmNyb3NzKE0pO2dbYV0rPUkueDtnW2ErMV0rPUkueTtnW2ErMl0rPUkuejtnW1FdKz1JLng7Z1tRKzFdKz1JLnk7Z1tRKzJdKz1JLno7Z1tVXSs9SS54O2dbVSsxXSs9SS55O2dbVSsyXSs9SS56fX1lbHNlIGZvcih0PTAsdj1lLmxlbmd0aDt0PHY7dCs9OSl6LmZyb21BcnJheShlLHQpLEUuZnJvbUFycmF5KGUsdCszKSxGLmZyb21BcnJheShlLHQrNiksSS5zdWJWZWN0b3JzKEYsRSksTS5zdWJWZWN0b3JzKHosRSksSS5jcm9zcyhNKSxnW3RdPUkueCxnW3QrMV09SS55LGdbdCsyXT1JLnosZ1t0KzNdPUkueCxnW3QrNF09SS55LGdbdCs1XT1JLnosZ1t0KzZdPUkueCxnW3QrN109SS55LGdbdCs4XT1JLno7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7Yy5ub3JtYWwubmVlZHNVcGRhdGU9ITB9fSxtZXJnZTpmdW5jdGlvbihhLGMpe2lmKGEmJmEuaXNCdWZmZXJHZW9tZXRyeSl7dm9pZCAwPT09YyYmKGM9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXRceDNkMC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTsKdmFyIGU9dGhpcy5hdHRyaWJ1dGVzLGc7Zm9yKGcgaW4gZSlpZih2b2lkIDAhPT1hLmF0dHJpYnV0ZXNbZ10pe3ZhciB0PWVbZ10uYXJyYXksdj1hLmF0dHJpYnV0ZXNbZ10sej12LmFycmF5LEU9di5pdGVtU2l6ZSpjO3Y9TWF0aC5taW4oei5sZW5ndGgsdC5sZW5ndGgtRSk7Zm9yKHZhciBGPTA7Rjx2O0YrKyxFKyspdFtFXT16W0ZdfXJldHVybiB0aGlzfWNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLGEpfSxub3JtYWxpemVOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsYz0wLGU9YS5jb3VudDtjPGU7YysrKUxjLng9YS5nZXRYKGMpLExjLnk9YS5nZXRZKGMpLExjLno9YS5nZXRaKGMpLExjLm5vcm1hbGl6ZSgpLGEuc2V0WFlaKGMsTGMueCxMYy55LExjLnopfSx0b05vbkluZGV4ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKE0sClApe3ZhciBRPU0uYXJyYXk7TT1NLml0ZW1TaXplO2Zvcih2YXIgVT1uZXcgUS5jb25zdHJ1Y3RvcihQLmxlbmd0aCpNKSxWLGVhPTAsZGE9MCxyYT1QLmxlbmd0aDtkYTxyYTtkYSsrKXtWPVBbZGFdKk07Zm9yKHZhciBwYT0wO3BhPE07cGErKylVW2VhKytdPVFbVisrXX1yZXR1cm4gbmV3IFIoVSxNKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO3ZhciBjPW5ldyB2YSxlPXRoaXMuaW5kZXguYXJyYXksZz10aGlzLmF0dHJpYnV0ZXMsdDtmb3IodCBpbiBnKXt2YXIgdj1nW3RdO3Y9YSh2LGUpO2MuYWRkQXR0cmlidXRlKHQsdil9dmFyIHo9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKHQgaW4geil7dmFyIEU9W10sRj16W3RdO2c9MDtmb3IodmFyIEk9Ri5sZW5ndGg7ZzxJO2crKyl2PUZbZ10sdj1hKHYsZSksRS5wdXNoKHYpOwpjLm1vcnBoQXR0cmlidXRlc1t0XT1FfWU9dGhpcy5ncm91cHM7Zz0wO2Zvcih0PWUubGVuZ3RoO2c8dDtnKyspdj1lW2ddLGMuYWRkR3JvdXAodi5zdGFydCx2LmNvdW50LHYubWF0ZXJpYWxJbmRleCk7cmV0dXJuIGN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2EudXVpZD10aGlzLnV1aWQ7YS50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGEubmFtZT10aGlzLm5hbWUpOzA8T2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoJiYoYS51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciBjPXRoaXMucGFyYW1ldGVycztmb3IoSSBpbiBjKXZvaWQgMCE9PWNbSV0mJihhW0ldPWNbSV0pO3JldHVybiBhfWEuZGF0YT17YXR0cmlidXRlczp7fX07Yz10aGlzLmluZGV4O251bGwhPT0KYyYmKGEuZGF0YS5pbmRleD17dHlwZTpjLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYy5hcnJheSl9KTt2YXIgZT10aGlzLmF0dHJpYnV0ZXM7Zm9yKEkgaW4gZSl7Yz1lW0ldO3ZhciBnPWMudG9KU09OKCk7IiIhPT1jLm5hbWUmJihnLm5hbWU9Yy5uYW1lKTthLmRhdGEuYXR0cmlidXRlc1tJXT1nfWU9e307dmFyIHQ9ITE7Zm9yKEkgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2Zvcih2YXIgdj10aGlzLm1vcnBoQXR0cmlidXRlc1tJXSx6PVtdLEU9MCxGPXYubGVuZ3RoO0U8RjtFKyspYz12W0VdLGc9Yy50b0pTT04oKSwiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpLHoucHVzaChnKTswPHoubGVuZ3RoJiYoZVtJXT16LHQ9ITApfXQmJihhLmRhdGEubW9ycGhBdHRyaWJ1dGVzPWUpO3ZhciBJPXRoaXMuZ3JvdXBzOzA8SS5sZW5ndGgmJihhLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSSkpKTtJPQp0aGlzLmJvdW5kaW5nU3BoZXJlO251bGwhPT1JJiYoYS5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6SS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpJLnJhZGl1c30pO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdmEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLm5hbWU9YS5uYW1lO3ZhciBlPWEuaW5kZXg7bnVsbCE9PWUmJnRoaXMuc2V0SW5kZXgoZS5jbG9uZSgpKTtlPWEuYXR0cmlidXRlcztmb3IoeiBpbiBlKXRoaXMuYWRkQXR0cmlidXRlKHosZVt6XS5jbG9uZSgpKTt2YXIgZz1hLm1vcnBoQXR0cmlidXRlcztmb3IoeiBpbiBnKXt2YXIgdD1bXSx2PWdbel07ZT0wO2ZvcihjPXYubGVuZ3RoO2U8YztlKyspdC5wdXNoKHZbZV0uY2xvbmUoKSk7CnRoaXMubW9ycGhBdHRyaWJ1dGVzW3pdPXR9dmFyIHo9YS5ncm91cHM7ZT0wO2ZvcihjPXoubGVuZ3RoO2U8YztlKyspZz16W2VdLHRoaXMuYWRkR3JvdXAoZy5zdGFydCxnLmNvdW50LGcubWF0ZXJpYWxJbmRleCk7ej1hLmJvdW5kaW5nQm94O251bGwhPT16JiYodGhpcy5ib3VuZGluZ0JveD16LmNsb25lKCkpO3o9YS5ib3VuZGluZ1NwaGVyZTtudWxsIT09eiYmKHRoaXMuYm91bmRpbmdTcGhlcmU9ei5jbG9uZSgpKTt0aGlzLmRyYXdSYW5nZS5zdGFydD1hLmRyYXdSYW5nZS5zdGFydDt0aGlzLmRyYXdSYW5nZS5jb3VudD1hLmRyYXdSYW5nZS5jb3VudDt0aGlzLnVzZXJEYXRhPWEudXNlckRhdGE7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIHNrPW5ldyBxLGplPW5ldyBELE1pPW5ldyBHLE5kPW5ldyBrLE9kPW5ldyBrLFBkPW5ldyBrLGlqPW5ldyBrLGpqPW5ldyBrLGtqPW5ldyBrLE5oPQpuZXcgayxPaD1uZXcgayxQaD1uZXcgayxxZT1uZXcgZixyZT1uZXcgZixzZT1uZXcgZix1Zj1uZXcgayx2Zz1uZXcgazt5YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eWEsaXNNZXNoOiEwLHNldERyYXdNb2RlOmZ1bmN0aW9uKGEpe3RoaXMuZHJhd01vZGU9YX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRyYXdNb2RlPWEuZHJhd01vZGU7dm9pZCAwIT09YS5tb3JwaFRhcmdldEluZmx1ZW5jZXMmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sYS5tb3JwaFRhcmdldERpY3Rpb25hcnkpKTtyZXR1cm4gdGhpc30sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXthPWEubW9ycGhBdHRyaWJ1dGVzO3ZhciBjPU9iamVjdC5rZXlzKGEpO2lmKDA8Yy5sZW5ndGgpe3ZhciBlPWFbY1swXV07aWYodm9pZCAwIT09ZSlmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksCmc9dGhpcy5tYXRlcmlhbCx0PXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwIT09ZyYmKG51bGw9PT1lLmJvdW5kaW5nU3BoZXJlJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLE1pLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSksTWkuYXBwbHlNYXRyaXg0KHQpLCExIT09YS5yYXkuaW50ZXJzZWN0c1NwaGVyZShNaSkmJihzay5nZXRJbnZlcnNlKHQpLGplLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChzayksbnVsbD09PWUuYm91bmRpbmdCb3h8fCExIT09amUuaW50ZXJzZWN0c0JveChlLmJvdW5kaW5nQm94KSkpKWlmKGUuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHY9ZS5pbmRleDt0PWUuYXR0cmlidXRlcy5wb3NpdGlvbjt2YXIgej1lLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixFPWUuYXR0cmlidXRlcy51dixGPWUuYXR0cmlidXRlcy51djIsST1lLmdyb3VwcyxNPWUuZHJhd1JhbmdlLFAsUTtpZihudWxsIT09dilpZihBcnJheS5pc0FycmF5KGcpKXt2YXIgVT0wO2ZvcihQPUkubGVuZ3RoO1U8ClA7VSsrKXt2YXIgVj1JW1VdO3ZhciBlYT1nW1YubWF0ZXJpYWxJbmRleF07dmFyIGRhPU1hdGgubWF4KFYuc3RhcnQsTS5zdGFydCk7Zm9yKFE9ZT1NYXRoLm1pbihWLnN0YXJ0K1YuY291bnQsTS5zdGFydCtNLmNvdW50KTtkYTxRO2RhKz0zKXtlPXYuZ2V0WChkYSk7dmFyIHJhPXYuZ2V0WChkYSsxKTt2YXIgcGE9di5nZXRYKGRhKzIpO2lmKGU9RmEodGhpcyxlYSxhLGplLHQseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihkYS8zKSxlLmZhY2UubWF0ZXJpYWxJbmRleD1WLm1hdGVyaWFsSW5kZXgsYy5wdXNoKGUpfX19ZWxzZSBmb3IoZGE9TWF0aC5tYXgoMCxNLnN0YXJ0KSxlPU1hdGgubWluKHYuY291bnQsTS5zdGFydCtNLmNvdW50KSxVPWRhLFA9ZTtVPFA7VSs9Myl7aWYoZT12LmdldFgoVSkscmE9di5nZXRYKFUrMSkscGE9di5nZXRYKFUrMiksZT1GYSh0aGlzLGcsYSxqZSx0LHosRSxGLGUscmEscGEpKWUuZmFjZUluZGV4PU1hdGguZmxvb3IoVS8zKSwKYy5wdXNoKGUpfWVsc2UgaWYodm9pZCAwIT09dClpZihBcnJheS5pc0FycmF5KGcpKWZvcihVPTAsUD1JLmxlbmd0aDtVPFA7VSsrKWZvcihWPUlbVV0sZWE9Z1tWLm1hdGVyaWFsSW5kZXhdLGRhPU1hdGgubWF4KFYuc3RhcnQsTS5zdGFydCksUT1lPU1hdGgubWluKFYuc3RhcnQrVi5jb3VudCxNLnN0YXJ0K00uY291bnQpO2RhPFE7ZGErPTMpe2lmKGU9ZGEscmE9ZGErMSxwYT1kYSsyLGU9RmEodGhpcyxlYSxhLGplLHQseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihkYS8zKSxlLmZhY2UubWF0ZXJpYWxJbmRleD1WLm1hdGVyaWFsSW5kZXgsYy5wdXNoKGUpfWVsc2UgZm9yKGRhPU1hdGgubWF4KDAsTS5zdGFydCksZT1NYXRoLm1pbih0LmNvdW50LE0uc3RhcnQrTS5jb3VudCksVT1kYSxQPWU7VTxQO1UrPTMpaWYoZT1VLHJhPVUrMSxwYT1VKzIsZT1GYSh0aGlzLGcsYSxqZSx0LHosRSxGLGUscmEscGEpKWUuZmFjZUluZGV4PU1hdGguZmxvb3IoVS8zKSxjLnB1c2goZSl9ZWxzZSBpZihlLmlzR2VvbWV0cnkpZm9yKHQ9CkFycmF5LmlzQXJyYXkoZyksej1lLnZlcnRpY2VzLEU9ZS5mYWNlcyxlPWUuZmFjZVZlcnRleFV2c1swXSwwPGUubGVuZ3RoJiYodj1lKSxVPTAsUD1FLmxlbmd0aDtVPFA7VSsrKWlmKFY9RVtVXSxlPXQ/Z1tWLm1hdGVyaWFsSW5kZXhdOmcsdm9pZCAwIT09ZSYmKEY9eltWLmFdLEk9eltWLmJdLE09eltWLmNdLGU9QWEodGhpcyxlLGEsamUsRixJLE0sdWYpKSl2JiZ2W1VdJiYoZWE9dltVXSxxZS5jb3B5KGVhWzBdKSxyZS5jb3B5KGVhWzFdKSxzZS5jb3B5KGVhWzJdKSxlLnV2PUIuZ2V0VVYodWYsRixJLE0scWUscmUsc2UsbmV3IGYpKSxlLmZhY2U9VixlLmZhY2VJbmRleD1VLGMucHVzaChlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgbGw9MCwkYz1uZXcgcSxOaT1uZXcgQSxyaD1uZXcgazt4YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnhhLGlzR2VvbWV0cnk6ITAsYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPShuZXcgcikuZ2V0Tm9ybWFsTWF0cml4KGEpLGU9MCxnPXRoaXMudmVydGljZXMubGVuZ3RoO2U8ZztlKyspdGhpcy52ZXJ0aWNlc1tlXS5hcHBseU1hdHJpeDQoYSk7ZT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2U8ZztlKyspe2E9dGhpcy5mYWNlc1tlXTthLm5vcm1hbC5hcHBseU1hdHJpeDMoYykubm9ybWFsaXplKCk7Zm9yKHZhciB0PTAsdj1hLnZlcnRleE5vcm1hbHMubGVuZ3RoO3Q8djt0KyspYS52ZXJ0ZXhOb3JtYWxzW3RdLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKX1udWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSEwO3JldHVybiB0aGlzfSwKcm90YXRlWDpmdW5jdGlvbihhKXskYy5tYWtlUm90YXRpb25YKGEpO3RoaXMuYXBwbHlNYXRyaXgoJGMpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGEpeyRjLm1ha2VSb3RhdGlvblkoYSk7dGhpcy5hcHBseU1hdHJpeCgkYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYSl7JGMubWFrZVJvdGF0aW9uWihhKTt0aGlzLmFwcGx5TWF0cml4KCRjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyxlKXskYy5tYWtlVHJhbnNsYXRpb24oYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoJGMpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGMsZSl7JGMubWFrZVNjYWxlKGEsYyxlKTt0aGlzLmFwcGx5TWF0cml4KCRjKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe05pLmxvb2tBdChhKTtOaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KE5pLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGZyb21CdWZmZXJHZW9tZXRyeTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKFUsClYsZWEsZGEpe3ZhciByYT12b2lkIDA9PT1FP1tdOltlLmNvbG9yc1tVXS5jbG9uZSgpLGUuY29sb3JzW1ZdLmNsb25lKCksZS5jb2xvcnNbZWFdLmNsb25lKCldLHBhPXZvaWQgMD09PXo/W106WyhuZXcgaykuZnJvbUFycmF5KHosMypVKSwobmV3IGspLmZyb21BcnJheSh6LDMqViksKG5ldyBrKS5mcm9tQXJyYXkoeiwzKmVhKV07ZGE9bmV3IE8oVSxWLGVhLHBhLHJhLGRhKTtlLmZhY2VzLnB1c2goZGEpO3ZvaWQgMCE9PUYmJmUuZmFjZVZlcnRleFV2c1swXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShGLDIqVSksKG5ldyBmKS5mcm9tQXJyYXkoRiwyKlYpLChuZXcgZikuZnJvbUFycmF5KEYsMiplYSldKTt2b2lkIDAhPT1JJiZlLmZhY2VWZXJ0ZXhVdnNbMV0ucHVzaChbKG5ldyBmKS5mcm9tQXJyYXkoSSwyKlUpLChuZXcgZikuZnJvbUFycmF5KEksMipWKSwobmV3IGYpLmZyb21BcnJheShJLDIqZWEpXSl9dmFyIGU9dGhpcyxnPW51bGwhPT1hLmluZGV4P2EuaW5kZXguYXJyYXk6CnZvaWQgMCx0PWEuYXR0cmlidXRlcyx2PXQucG9zaXRpb24uYXJyYXksej12b2lkIDAhPT10Lm5vcm1hbD90Lm5vcm1hbC5hcnJheTp2b2lkIDAsRT12b2lkIDAhPT10LmNvbG9yP3QuY29sb3IuYXJyYXk6dm9pZCAwLEY9dm9pZCAwIT09dC51dj90LnV2LmFycmF5OnZvaWQgMCxJPXZvaWQgMCE9PXQudXYyP3QudXYyLmFycmF5OnZvaWQgMDt2b2lkIDAhPT1JJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPVtdKTtmb3IodD0wO3Q8di5sZW5ndGg7dCs9MyllLnZlcnRpY2VzLnB1c2goKG5ldyBrKS5mcm9tQXJyYXkodix0KSksdm9pZCAwIT09RSYmZS5jb2xvcnMucHVzaCgobmV3IEgpLmZyb21BcnJheShFLHQpKTt2YXIgTT1hLmdyb3VwcztpZigwPE0ubGVuZ3RoKWZvcih0PTA7dDxNLmxlbmd0aDt0Kyspe3Y9TVt0XTt2YXIgUD12LnN0YXJ0LFE9UDtmb3IoUCs9di5jb3VudDtRPFA7USs9Myl2b2lkIDAhPT1nP2MoZ1tRXSxnW1ErMV0sZ1tRKzJdLHYubWF0ZXJpYWxJbmRleCk6YyhRLApRKzEsUSsyLHYubWF0ZXJpYWxJbmRleCl9ZWxzZSBpZih2b2lkIDAhPT1nKWZvcih0PTA7dDxnLmxlbmd0aDt0Kz0zKWMoZ1t0XSxnW3QrMV0sZ1t0KzJdKTtlbHNlIGZvcih0PTA7dDx2Lmxlbmd0aC8zO3QrPTMpYyh0LHQrMSx0KzIpO3RoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIocmgpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKHJoLngscmgueSxyaC56KTtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt2YXIgYT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlciwKYz10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztjPTA9PT1jPzE6MS9jO3ZhciBlPW5ldyBxO2Uuc2V0KGMsMCwwLC1jKmEueCwwLGMsMCwtYyphLnksMCwwLGMsLWMqYS56LDAsMCwwLDEpO3RoaXMuYXBwbHlNYXRyaXgoZSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgayxjPW5ldyBrLGU9MCxnPXRoaXMuZmFjZXMubGVuZ3RoO2U8ZztlKyspe3ZhciB0PXRoaXMuZmFjZXNbZV0sdj10aGlzLnZlcnRpY2VzW3QuYV0sej10aGlzLnZlcnRpY2VzW3QuYl07YS5zdWJWZWN0b3JzKHRoaXMudmVydGljZXNbdC5jXSx6KTtjLnN1YlZlY3RvcnModix6KTthLmNyb3NzKGMpO2Eubm9ybWFsaXplKCk7dC5ub3JtYWwuY29weShhKX19LGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSEwKTt2YXIgYzt2YXIgZT1BcnJheSh0aGlzLnZlcnRpY2VzLmxlbmd0aCk7dmFyIGc9MDtmb3IoYz10aGlzLnZlcnRpY2VzLmxlbmd0aDtnPApjO2crKyllW2ddPW5ldyBrO2lmKGEpe3ZhciB0PW5ldyBrLHY9bmV3IGs7YT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspe2M9dGhpcy5mYWNlc1thXTt2YXIgej10aGlzLnZlcnRpY2VzW2MuYV07dmFyIEU9dGhpcy52ZXJ0aWNlc1tjLmJdO3ZhciBGPXRoaXMudmVydGljZXNbYy5jXTt0LnN1YlZlY3RvcnMoRixFKTt2LnN1YlZlY3RvcnMoeixFKTt0LmNyb3NzKHYpO2VbYy5hXS5hZGQodCk7ZVtjLmJdLmFkZCh0KTtlW2MuY10uYWRkKHQpfX1lbHNlIGZvcih0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpLGE9MCxnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspYz10aGlzLmZhY2VzW2FdLGVbYy5hXS5hZGQoYy5ub3JtYWwpLGVbYy5iXS5hZGQoYy5ub3JtYWwpLGVbYy5jXS5hZGQoYy5ub3JtYWwpO2c9MDtmb3IoYz10aGlzLnZlcnRpY2VzLmxlbmd0aDtnPGM7ZysrKWVbZ10ubm9ybWFsaXplKCk7YT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspYz0KdGhpcy5mYWNlc1thXSx6PWMudmVydGV4Tm9ybWFscywzPT09ei5sZW5ndGg/KHpbMF0uY29weShlW2MuYV0pLHpbMV0uY29weShlW2MuYl0pLHpbMl0uY29weShlW2MuY10pKTooelswXT1lW2MuYV0uY2xvbmUoKSx6WzFdPWVbYy5iXS5jbG9uZSgpLHpbMl09ZVtjLmNdLmNsb25lKCkpOzA8dGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTt2YXIgYz0wO2ZvcihhPXRoaXMuZmFjZXMubGVuZ3RoO2M8YTtjKyspe3ZhciBlPXRoaXMuZmFjZXNbY107dmFyIGc9ZS52ZXJ0ZXhOb3JtYWxzOzM9PT1nLmxlbmd0aD8oZ1swXS5jb3B5KGUubm9ybWFsKSxnWzFdLmNvcHkoZS5ub3JtYWwpLGdbMl0uY29weShlLm5vcm1hbCkpOihnWzBdPWUubm9ybWFsLmNsb25lKCksZ1sxXT1lLm5vcm1hbC5jbG9uZSgpLGdbMl09ZS5ub3JtYWwuY2xvbmUoKSl9MDwKdGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZU1vcnBoTm9ybWFsczpmdW5jdGlvbigpe3ZhciBhLGM7dmFyIGU9MDtmb3IoYz10aGlzLmZhY2VzLmxlbmd0aDtlPGM7ZSsrKXt2YXIgZz10aGlzLmZhY2VzW2VdO2cuX19vcmlnaW5hbEZhY2VOb3JtYWw/Zy5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KGcubm9ybWFsKTpnLl9fb3JpZ2luYWxGYWNlTm9ybWFsPWcubm9ybWFsLmNsb25lKCk7Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc3x8KGcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHM9W10pO3ZhciB0PTA7Zm9yKGE9Zy52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt0PGE7dCsrKWcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbdF0/Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t0XS5jb3B5KGcudmVydGV4Tm9ybWFsc1t0XSk6Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t0XT1nLnZlcnRleE5vcm1hbHNbdF0uY2xvbmUoKX12YXIgdj1uZXcgeGE7CnYuZmFjZXM9dGhpcy5mYWNlczt0PTA7Zm9yKGE9dGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoO3Q8YTt0Kyspe2lmKCF0aGlzLm1vcnBoTm9ybWFsc1t0XSl7dGhpcy5tb3JwaE5vcm1hbHNbdF09e307dGhpcy5tb3JwaE5vcm1hbHNbdF0uZmFjZU5vcm1hbHM9W107dGhpcy5tb3JwaE5vcm1hbHNbdF0udmVydGV4Tm9ybWFscz1bXTtnPXRoaXMubW9ycGhOb3JtYWxzW3RdLmZhY2VOb3JtYWxzO3ZhciB6PXRoaXMubW9ycGhOb3JtYWxzW3RdLnZlcnRleE5vcm1hbHM7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBFPW5ldyBrO3ZhciBGPXthOm5ldyBrLGI6bmV3IGssYzpuZXcga307Zy5wdXNoKEUpO3oucHVzaChGKX19ej10aGlzLm1vcnBoTm9ybWFsc1t0XTt2LnZlcnRpY2VzPXRoaXMubW9ycGhUYXJnZXRzW3RdLnZlcnRpY2VzO3YuY29tcHV0ZUZhY2VOb3JtYWxzKCk7di5jb21wdXRlVmVydGV4Tm9ybWFscygpO2U9MDtmb3IoYz10aGlzLmZhY2VzLmxlbmd0aDtlPApjO2UrKylnPXRoaXMuZmFjZXNbZV0sRT16LmZhY2VOb3JtYWxzW2VdLEY9ei52ZXJ0ZXhOb3JtYWxzW2VdLEUuY29weShnLm5vcm1hbCksRi5hLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzBdKSxGLmIuY29weShnLnZlcnRleE5vcm1hbHNbMV0pLEYuYy5jb3B5KGcudmVydGV4Tm9ybWFsc1syXSl9ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspZz10aGlzLmZhY2VzW2VdLGcubm9ybWFsPWcuX19vcmlnaW5hbEZhY2VOb3JtYWwsZy52ZXJ0ZXhOb3JtYWxzPWcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgeCk7dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKHRoaXMudmVydGljZXMpfSxjb21wdXRlQm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Cm5ldyBHKTt0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LG1lcmdlOmZ1bmN0aW9uKGEsYyxlKXtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBnLHQ9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsdj10aGlzLnZlcnRpY2VzLHo9YS52ZXJ0aWNlcyxFPXRoaXMuZmFjZXMsRj1hLmZhY2VzLEk9dGhpcy5jb2xvcnMsTT1hLmNvbG9yczt2b2lkIDA9PT1lJiYoZT0wKTt2b2lkIDAhPT1jJiYoZz0obmV3IHIpLmdldE5vcm1hbE1hdHJpeChjKSk7Zm9yKHZhciBQPTAsUT16Lmxlbmd0aDtQPFE7UCsrKXt2YXIgVT16W1BdLmNsb25lKCk7dm9pZCAwIT09YyYmVS5hcHBseU1hdHJpeDQoYyk7di5wdXNoKFUpfVA9MDtmb3IoUT1NLmxlbmd0aDtQPFE7UCsrKUkucHVzaChNW1BdLmNsb25lKCkpO1A9MDtmb3IoUT1GLmxlbmd0aDtQPFE7UCsrKXt6PUZbUF07dmFyIFY9ei52ZXJ0ZXhOb3JtYWxzO009ei52ZXJ0ZXhDb2xvcnM7ST1uZXcgTyh6LmErdCx6LmIrdCx6LmMrCnQpO0kubm9ybWFsLmNvcHkoei5ub3JtYWwpO3ZvaWQgMCE9PWcmJkkubm9ybWFsLmFwcGx5TWF0cml4MyhnKS5ub3JtYWxpemUoKTtjPTA7Zm9yKHY9Vi5sZW5ndGg7Yzx2O2MrKylVPVZbY10uY2xvbmUoKSx2b2lkIDAhPT1nJiZVLmFwcGx5TWF0cml4MyhnKS5ub3JtYWxpemUoKSxJLnZlcnRleE5vcm1hbHMucHVzaChVKTtJLmNvbG9yLmNvcHkoei5jb2xvcik7Yz0wO2Zvcih2PU0ubGVuZ3RoO2M8djtjKyspVT1NW2NdLEkudmVydGV4Q29sb3JzLnB1c2goVS5jbG9uZSgpKTtJLm1hdGVyaWFsSW5kZXg9ei5tYXRlcmlhbEluZGV4K2U7RS5wdXNoKEkpfVA9MDtmb3IoUT1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO1A8UTtQKyspZm9yKGU9YS5mYWNlVmVydGV4VXZzW1BdLHZvaWQgMD09PXRoaXMuZmFjZVZlcnRleFV2c1tQXSYmKHRoaXMuZmFjZVZlcnRleFV2c1tQXT1bXSksYz0wLHY9ZS5sZW5ndGg7Yzx2O2MrKyl7Zz1lW2NdO3Q9W107RT0wO2ZvcihGPWcubGVuZ3RoO0U8RjtFKyspdC5wdXNoKGdbRV0uY2xvbmUoKSk7CnRoaXMuZmFjZVZlcnRleFV2c1tQXS5wdXNoKHQpfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4iLGEpfSxtZXJnZU1lc2g6ZnVuY3Rpb24oYSl7YSYmYS5pc01lc2g/KGEubWF0cml4QXV0b1VwZGF0ZSYmYS51cGRhdGVNYXRyaXgoKSx0aGlzLm1lcmdlKGEuZ2VvbWV0cnksYS5tYXRyaXgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4iLGEpfSxtZXJnZVZlcnRpY2VzOmZ1bmN0aW9uKCl7dmFyIGE9e30sYz1bXSxlPVtdLGc9TWF0aC5wb3coMTAsNCksdDt2YXIgdj0wO2Zvcih0PXRoaXMudmVydGljZXMubGVuZ3RoO3Y8dDt2Kyspe3ZhciB6PXRoaXMudmVydGljZXNbdl07ej1NYXRoLnJvdW5kKHoueCpnKSsiXyIrTWF0aC5yb3VuZCh6LnkqZykrIl8iK01hdGgucm91bmQoei56KgpnKTt2b2lkIDA9PT1hW3pdPyhhW3pdPXYsYy5wdXNoKHRoaXMudmVydGljZXNbdl0pLGVbdl09Yy5sZW5ndGgtMSk6ZVt2XT1lW2Fbel1dfWE9W107dj0wO2Zvcih0PXRoaXMuZmFjZXMubGVuZ3RoO3Y8dDt2KyspZm9yKGc9dGhpcy5mYWNlc1t2XSxnLmE9ZVtnLmFdLGcuYj1lW2cuYl0sZy5jPWVbZy5jXSxnPVtnLmEsZy5iLGcuY10sej0wOzM+ejt6KyspaWYoZ1t6XT09PWdbKHorMSklM10pe2EucHVzaCh2KTticmVha31mb3Iodj1hLmxlbmd0aC0xOzA8PXY7di0tKWZvcihnPWFbdl0sdGhpcy5mYWNlcy5zcGxpY2UoZywxKSxlPTAsdD10aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO2U8dDtlKyspdGhpcy5mYWNlVmVydGV4VXZzW2VdLnNwbGljZShnLDEpO3Y9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtYy5sZW5ndGg7dGhpcy52ZXJ0aWNlcz1jO3JldHVybiB2fSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMudmVydGljZXM9W107Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXt2YXIgZz0KYVtjXTt0aGlzLnZlcnRpY2VzLnB1c2gobmV3IGsoZy54LGcueSxnLnp8fDApKX1yZXR1cm4gdGhpc30sc29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZmFjZXMsYz1hLmxlbmd0aCxlPTA7ZTxjO2UrKylhW2VdLl9pZD1lO2Euc29ydChmdW5jdGlvbihGLEkpe3JldHVybiBGLm1hdGVyaWFsSW5kZXgtSS5tYXRlcmlhbEluZGV4fSk7dmFyIGc9dGhpcy5mYWNlVmVydGV4VXZzWzBdLHQ9dGhpcy5mYWNlVmVydGV4VXZzWzFdLHYsejtnJiZnLmxlbmd0aD09PWMmJih2PVtdKTt0JiZ0Lmxlbmd0aD09PWMmJih6PVtdKTtmb3IoZT0wO2U8YztlKyspe3ZhciBFPWFbZV0uX2lkO3YmJnYucHVzaChnW0VdKTt6JiZ6LnB1c2godFtFXSl9diYmKHRoaXMuZmFjZVZlcnRleFV2c1swXT12KTt6JiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPXopfSx0b0pTT046ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKG5hLHRhLEJhKXtyZXR1cm4gQmE/bmF8MTw8dGE6bmEmCn4oMTw8dGEpfWZ1bmN0aW9uIGMobmEpe3ZhciB0YT1uYS54LnRvU3RyaW5nKCkrbmEueS50b1N0cmluZygpK25hLnoudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1JW3RhXSlyZXR1cm4gSVt0YV07SVt0YV09Ri5sZW5ndGgvMztGLnB1c2gobmEueCxuYS55LG5hLnopO3JldHVybiBJW3RhXX1mdW5jdGlvbiBlKG5hKXt2YXIgdGE9bmEuci50b1N0cmluZygpK25hLmcudG9TdHJpbmcoKStuYS5iLnRvU3RyaW5nKCk7aWYodm9pZCAwIT09UFt0YV0pcmV0dXJuIFBbdGFdO1BbdGFdPU0ubGVuZ3RoO00ucHVzaChuYS5nZXRIZXgoKSk7cmV0dXJuIFBbdGFdfWZ1bmN0aW9uIGcobmEpe3ZhciB0YT1uYS54LnRvU3RyaW5nKCkrbmEueS50b1N0cmluZygpO2lmKHZvaWQgMCE9PVVbdGFdKXJldHVybiBVW3RhXTtVW3RhXT1RLmxlbmd0aC8yO1EucHVzaChuYS54LG5hLnkpO3JldHVybiBVW3RhXX12YXIgdD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ikdlb21ldHJ5IixnZW5lcmF0b3I6Ikdlb21ldHJ5LnRvSlNPTiJ9fTsKdC51dWlkPXRoaXMudXVpZDt0LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSk7aWYodm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXt2YXIgdj10aGlzLnBhcmFtZXRlcnMsejtmb3IoeiBpbiB2KXZvaWQgMCE9PXZbel0mJih0W3pdPXZbel0pO3JldHVybiB0fXY9W107Zm9yKHo9MDt6PHRoaXMudmVydGljZXMubGVuZ3RoO3orKyl7dmFyIEU9dGhpcy52ZXJ0aWNlc1t6XTt2LnB1c2goRS54LEUueSxFLnopfUU9W107dmFyIEY9W10sST17fSxNPVtdLFA9e30sUT1bXSxVPXt9O2Zvcih6PTA7ejx0aGlzLmZhY2VzLmxlbmd0aDt6Kyspe3ZhciBWPXRoaXMuZmFjZXNbel0sZWE9dm9pZCAwIT09dGhpcy5mYWNlVmVydGV4VXZzWzBdW3pdLGRhPTA8Vi5ub3JtYWwubGVuZ3RoKCkscmE9MDxWLnZlcnRleE5vcm1hbHMubGVuZ3RoLHBhPTEhPT1WLmNvbG9yLnJ8fDEhPT1WLmNvbG9yLmd8fDEhPT1WLmNvbG9yLmIscWE9MDxWLnZlcnRleENvbG9ycy5sZW5ndGgsCnVhPTA7dWE9YSh1YSwwLDApO3VhPWEodWEsMSwhMCk7dWE9YSh1YSwyLCExKTt1YT1hKHVhLDMsZWEpO3VhPWEodWEsNCxkYSk7dWE9YSh1YSw1LHJhKTt1YT1hKHVhLDYscGEpO3VhPWEodWEsNyxxYSk7RS5wdXNoKHVhKTtFLnB1c2goVi5hLFYuYixWLmMpO0UucHVzaChWLm1hdGVyaWFsSW5kZXgpO2VhJiYoZWE9dGhpcy5mYWNlVmVydGV4VXZzWzBdW3pdLEUucHVzaChnKGVhWzBdKSxnKGVhWzFdKSxnKGVhWzJdKSkpO2RhJiZFLnB1c2goYyhWLm5vcm1hbCkpO3JhJiYoZGE9Vi52ZXJ0ZXhOb3JtYWxzLEUucHVzaChjKGRhWzBdKSxjKGRhWzFdKSxjKGRhWzJdKSkpO3BhJiZFLnB1c2goZShWLmNvbG9yKSk7cWEmJihWPVYudmVydGV4Q29sb3JzLEUucHVzaChlKFZbMF0pLGUoVlsxXSksZShWWzJdKSkpfXQuZGF0YT17fTt0LmRhdGEudmVydGljZXM9djt0LmRhdGEubm9ybWFscz1GOzA8TS5sZW5ndGgmJih0LmRhdGEuY29sb3JzPU0pOzA8US5sZW5ndGgmJih0LmRhdGEudXZzPQpbUV0pO3QuZGF0YS5mYWNlcz1FO3JldHVybiB0fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgeGEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGMsZSxnO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9W107dGhpcy5mYWNlcz1bXTt0aGlzLmZhY2VWZXJ0ZXhVdnM9W1tdXTt0aGlzLm1vcnBoVGFyZ2V0cz1bXTt0aGlzLm1vcnBoTm9ybWFscz1bXTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5saW5lRGlzdGFuY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIHQ9YS52ZXJ0aWNlczt2YXIgdj0wO2ZvcihjPXQubGVuZ3RoO3Y8Yzt2KyspdGhpcy52ZXJ0aWNlcy5wdXNoKHRbdl0uY2xvbmUoKSk7dD1hLmNvbG9yczt2PTA7Zm9yKGM9dC5sZW5ndGg7djxjO3YrKyl0aGlzLmNvbG9ycy5wdXNoKHRbdl0uY2xvbmUoKSk7dD1hLmZhY2VzO3Y9MDtmb3IoYz0KdC5sZW5ndGg7djxjO3YrKyl0aGlzLmZhY2VzLnB1c2godFt2XS5jbG9uZSgpKTt2PTA7Zm9yKGM9YS5mYWNlVmVydGV4VXZzLmxlbmd0aDt2PGM7disrKXt2YXIgej1hLmZhY2VWZXJ0ZXhVdnNbdl07dm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW3ZdJiYodGhpcy5mYWNlVmVydGV4VXZzW3ZdPVtdKTt0PTA7Zm9yKGU9ei5sZW5ndGg7dDxlO3QrKyl7dmFyIEU9elt0XSxGPVtdO3ZhciBJPTA7Zm9yKGc9RS5sZW5ndGg7STxnO0krKylGLnB1c2goRVtJXS5jbG9uZSgpKTt0aGlzLmZhY2VWZXJ0ZXhVdnNbdl0ucHVzaChGKX19ST1hLm1vcnBoVGFyZ2V0czt2PTA7Zm9yKGM9SS5sZW5ndGg7djxjO3YrKyl7Zz17fTtnLm5hbWU9SVt2XS5uYW1lO2lmKHZvaWQgMCE9PUlbdl0udmVydGljZXMpZm9yKGcudmVydGljZXM9W10sdD0wLGU9SVt2XS52ZXJ0aWNlcy5sZW5ndGg7dDxlO3QrKylnLnZlcnRpY2VzLnB1c2goSVt2XS52ZXJ0aWNlc1t0XS5jbG9uZSgpKTtpZih2b2lkIDAhPT1JW3ZdLm5vcm1hbHMpZm9yKGcubm9ybWFscz0KW10sdD0wLGU9SVt2XS5ub3JtYWxzLmxlbmd0aDt0PGU7dCsrKWcubm9ybWFscy5wdXNoKElbdl0ubm9ybWFsc1t0XS5jbG9uZSgpKTt0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKGcpfUk9YS5tb3JwaE5vcm1hbHM7dj0wO2ZvcihjPUkubGVuZ3RoO3Y8Yzt2Kyspe2c9e307aWYodm9pZCAwIT09SVt2XS52ZXJ0ZXhOb3JtYWxzKWZvcihnLnZlcnRleE5vcm1hbHM9W10sdD0wLGU9SVt2XS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt0PGU7dCsrKXo9SVt2XS52ZXJ0ZXhOb3JtYWxzW3RdLEU9e30sRS5hPXouYS5jbG9uZSgpLEUuYj16LmIuY2xvbmUoKSxFLmM9ei5jLmNsb25lKCksZy52ZXJ0ZXhOb3JtYWxzLnB1c2goRSk7aWYodm9pZCAwIT09SVt2XS5mYWNlTm9ybWFscylmb3IoZy5mYWNlTm9ybWFscz1bXSx0PTAsZT1JW3ZdLmZhY2VOb3JtYWxzLmxlbmd0aDt0PGU7dCsrKWcuZmFjZU5vcm1hbHMucHVzaChJW3ZdLmZhY2VOb3JtYWxzW3RdLmNsb25lKCkpO3RoaXMubW9ycGhOb3JtYWxzLnB1c2goZyl9dD0KYS5za2luV2VpZ2h0czt2PTA7Zm9yKGM9dC5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5XZWlnaHRzLnB1c2godFt2XS5jbG9uZSgpKTt0PWEuc2tpbkluZGljZXM7dj0wO2ZvcihjPXQubGVuZ3RoO3Y8Yzt2KyspdGhpcy5za2luSW5kaWNlcy5wdXNoKHRbdl0uY2xvbmUoKSk7dD1hLmxpbmVEaXN0YW5jZXM7dj0wO2ZvcihjPXQubGVuZ3RoO3Y8Yzt2KyspdGhpcy5saW5lRGlzdGFuY2VzLnB1c2godFt2XSk7dj1hLmJvdW5kaW5nQm94O251bGwhPT12JiYodGhpcy5ib3VuZGluZ0JveD12LmNsb25lKCkpO3Y9YS5ib3VuZGluZ1NwaGVyZTtudWxsIT09diYmKHRoaXMuYm91bmRpbmdTcGhlcmU9di5jbG9uZSgpKTt0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT1hLmVsZW1lbnRzTmVlZFVwZGF0ZTt0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT1hLnZlcnRpY2VzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9YS51dnNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9YS5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWEuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPWEubGluZURpc3RhbmNlc05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtTYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TYTtYYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1hhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YYTt2YXIgJG09e2Nsb25lOnViLG1lcmdlOkJifTtxYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7cWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFiO3FiLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO3FiLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmZyYWdtZW50U2hhZGVyPWEuZnJhZ21lbnRTaGFkZXI7dGhpcy52ZXJ0ZXhTaGFkZXI9YS52ZXJ0ZXhTaGFkZXI7dGhpcy51bmlmb3Jtcz11YihhLnVuaWZvcm1zKTt0aGlzLmRlZmluZXM9T2JqZWN0LmFzc2lnbih7fSxhLmRlZmluZXMpO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuY2xpcHBpbmc9YS5jbGlwcGluZzt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7dGhpcy5leHRlbnNpb25zPWEuZXh0ZW5zaW9ucztyZXR1cm4gdGhpc307cWIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihhKXt2YXIgYz1TLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2MudW5pZm9ybXM9e307Zm9yKHZhciBlIGluIHRoaXMudW5pZm9ybXMpe3ZhciBnPQp0aGlzLnVuaWZvcm1zW2VdLnZhbHVlO2MudW5pZm9ybXNbZV09ZyYmZy5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOmcudG9KU09OKGEpLnV1aWR9OmcmJmcuaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6Zy5nZXRIZXgoKX06ZyYmZy5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTpnLnRvQXJyYXkoKX06e3ZhbHVlOmd9fTA8T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGgmJihjLmRlZmluZXM9dGhpcy5kZWZpbmVzKTtjLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcjtjLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7YT17fTtmb3IodmFyIHQgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09CnRoaXMuZXh0ZW5zaW9uc1t0XSYmKGFbdF09ITApOzA8T2JqZWN0LmtleXMoYSkubGVuZ3RoJiYoYy5leHRlbnNpb25zPWEpO3JldHVybiBjfTt6Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6emIsaXNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weShhLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoYS5wcm9qZWN0aW9uTWF0cml4KTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7cmV0dXJuIHRoaXN9LGdldFdvcmxkRGlyZWN0aW9uOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLAphPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgYz10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBhLnNldCgtY1s4XSwtY1s5XSwtY1sxMF0pLm5vcm1hbGl6ZSgpfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7dmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh6Yi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp2Yixpc1BlcnNwZWN0aXZlQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXt6Yi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLmZvdj1hLmZvdjt0aGlzLnpvb209YS56b29tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9CmEuZmFyO3RoaXMuZm9jdXM9YS5mb2N1czt0aGlzLmFzcGVjdD1hLmFzcGVjdDt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTt0aGlzLmZpbG1HYXVnZT1hLmZpbG1HYXVnZTt0aGlzLmZpbG1PZmZzZXQ9YS5maWxtT2Zmc2V0O3JldHVybiB0aGlzfSxzZXRGb2NhbExlbmd0aDpmdW5jdGlvbihhKXt0aGlzLmZvdj0yKmhiLlJBRDJERUcqTWF0aC5hdGFuKC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2EpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxnZXRGb2NhbExlbmd0aDpmdW5jdGlvbigpe3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL01hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpfSxnZXRFZmZlY3RpdmVGT1Y6ZnVuY3Rpb24oKXtyZXR1cm4gMipoYi5SQUQyREVHKk1hdGguYXRhbihNYXRoLnRhbiguNSpoYi5ERUcyUkFEKnRoaXMuZm92KS90aGlzLnpvb20pfSxnZXRGaWxtV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UqCk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfSxnZXRGaWxtSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfSxzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXt0aGlzLmFzcGVjdD1hL2M7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSk7dGhpcy52aWV3LmVuYWJsZWQ9ITA7dGhpcy52aWV3LmZ1bGxXaWR0aD1hO3RoaXMudmlldy5mdWxsSGVpZ2h0PWM7dGhpcy52aWV3Lm9mZnNldFg9ZTt0aGlzLnZpZXcub2Zmc2V0WT1nO3RoaXMudmlldy53aWR0aD10O3RoaXMudmlldy5oZWlnaHQ9djt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sY2xlYXJWaWV3T2Zmc2V0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKTt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sCnVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5lYXIsYz1hKk1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSxlPTIqYyxnPXRoaXMuYXNwZWN0KmUsdD0tLjUqZyx2PXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7dmFyIHo9di5mdWxsV2lkdGgsRT12LmZ1bGxIZWlnaHQ7dCs9di5vZmZzZXRYKmcvejtjLT12Lm9mZnNldFkqZS9FO2cqPXYud2lkdGgvejtlKj12LmhlaWdodC9FfXY9dGhpcy5maWxtT2Zmc2V0OzAhPT12JiYodCs9YSp2L3RoaXMuZ2V0RmlsbVdpZHRoKCkpO3RoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUodCx0K2csYyxjLWUsYSx0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LHRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpO2Eub2JqZWN0LmZvdj10aGlzLmZvdjthLm9iamVjdC56b29tPXRoaXMuem9vbTthLm9iamVjdC5uZWFyPXRoaXMubmVhcjthLm9iamVjdC5mYXI9dGhpcy5mYXI7YS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1czthLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3Q7bnVsbCE9PXRoaXMudmlldyYmKGEub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTthLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2U7YS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQ7cmV0dXJuIGF9fSk7R2IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO0diLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HYjtPYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSk7T2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPU9iO09iLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT0hMDtPYi5wcm90b3R5cGUuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmU9CmZ1bmN0aW9uKGEsYyl7dGhpcy50ZXh0dXJlLnR5cGU9Yy50eXBlO3RoaXMudGV4dHVyZS5mb3JtYXQ9Yy5mb3JtYXQ7dGhpcy50ZXh0dXJlLmVuY29kaW5nPWMuZW5jb2Rpbmc7dmFyIGU9bmV3IHksZz1uZXcgcWIoe3R5cGU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOnViKHt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSksdmVydGV4U2hhZGVyOiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLApmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcbn0iLHNpZGU6MSxibGVuZGluZzowfSk7Zy51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9YzsKYz1uZXcgeWEobmV3IFhhKDUsNSw1KSxnKTtlLmFkZChjKTtnPW5ldyBHYigxLDEwLDEpO2cucmVuZGVyVGFyZ2V0PXRoaXM7Zy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhVGV4dHVyZSI7Zy51cGRhdGUoYSxlKTtjLmdlb21ldHJ5LmRpc3Bvc2UoKTtjLm1hdGVyaWFsLmRpc3Bvc2UoKTtyZXR1cm4gdGhpc307QWIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0FiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYjtBYi5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDt2YXIgT2k9bmV3IGssYW49bmV3IGssYm49bmV3IHI7T2JqZWN0LmFzc2lnbihIYi5wcm90b3R5cGUse2lzUGxhbmU6ITAsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PWM7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudHM6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5ub3JtYWwuc2V0KGEsYyxlKTt0aGlzLmNvbnN0YW50PWc7cmV0dXJuIHRoaXN9LApzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDpmdW5jdGlvbihhLGMpe3RoaXMubm9ybWFsLmNvcHkoYSk7dGhpcy5jb25zdGFudD0tYy5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxzZXRGcm9tQ29wbGFuYXJQb2ludHM6ZnVuY3Rpb24oYSxjLGUpe2M9T2kuc3ViVmVjdG9ycyhlLGMpLmNyb3NzKGFuLnN1YlZlY3RvcnMoYSxjKSkubm9ybWFsaXplKCk7dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChjLGEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5vcm1hbC5jb3B5KGEubm9ybWFsKTt0aGlzLmNvbnN0YW50PWEuY29uc3RhbnQ7cmV0dXJuIHRoaXN9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoYSk7dGhpcy5jb25zdGFudCo9YTtyZXR1cm4gdGhpc30sCm5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RhbnQqPS0xO3RoaXMubm9ybWFsLm5lZ2F0ZSgpO3JldHVybiB0aGlzfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdChhKSt0aGlzLmNvbnN0YW50fSxkaXN0YW5jZVRvU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludChhLmNlbnRlciktYS5yYWRpdXN9LHByb2plY3RQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludChhKSkuYWRkKGEpfSxpbnRlcnNlY3RMaW5lOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBrKTt2YXIgZT1hLmRlbHRhKE9pKSxnPXRoaXMubm9ybWFsLmRvdChlKTtpZigwPT09Zyl7aWYoMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KGEuc3RhcnQpKXJldHVybiBjLmNvcHkoYS5zdGFydCl9ZWxzZSBpZihnPS0oYS5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL2csISgwPmd8fDE8ZykpcmV0dXJuIGMuY29weShlKS5tdWx0aXBseVNjYWxhcihnKS5hZGQoYS5zdGFydCl9LGludGVyc2VjdHNMaW5lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZGlzdGFuY2VUb1BvaW50KGEuc3RhcnQpO2E9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5lbmQpO3JldHVybiAwPmMmJjA8YXx8MD5hJiYwPGN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNQbGFuZSh0aGlzKX0sY29wbGFuYXJQb2ludDpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEsYyl7Yz1jfHxibi5nZXROb3JtYWxNYXRyaXgoYSk7YT10aGlzLmNvcGxhbmFyUG9pbnQoT2kpLmFwcGx5TWF0cml4NChhKTtjPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTt0aGlzLmNvbnN0YW50PS1hLmRvdChjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY29uc3RhbnQtPWEuZG90KHRoaXMubm9ybWFsKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZhLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH19KTt2YXIgb2Y9bmV3IEcsc2g9bmV3IGs7T2JqZWN0LmFzc2lnbihsYy5wcm90b3R5cGUsCntzZXQ6ZnVuY3Rpb24oYSxjLGUsZyx0LHYpe3ZhciB6PXRoaXMucGxhbmVzO3pbMF0uY29weShhKTt6WzFdLmNvcHkoYyk7elsyXS5jb3B5KGUpO3pbM10uY29weShnKTt6WzRdLmNvcHkodCk7els1XS5jb3B5KHYpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspY1tlXS5jb3B5KGEucGxhbmVzW2VdKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBsYW5lcyxlPWEuZWxlbWVudHM7YT1lWzBdO3ZhciBnPWVbMV0sdD1lWzJdLHY9ZVszXSx6PWVbNF0sRT1lWzVdLEY9ZVs2XSxJPWVbN10sTT1lWzhdLFA9ZVs5XSxRPWVbMTBdLFU9ZVsxMV0sVj1lWzEyXSxlYT1lWzEzXSxkYT1lWzE0XTtlPWVbMTVdO2NbMF0uc2V0Q29tcG9uZW50cyh2LWEsSS16LFUtTSxlLVYpLm5vcm1hbGl6ZSgpOwpjWzFdLnNldENvbXBvbmVudHModithLEkreixVK00sZStWKS5ub3JtYWxpemUoKTtjWzJdLnNldENvbXBvbmVudHModitnLEkrRSxVK1AsZStlYSkubm9ybWFsaXplKCk7Y1szXS5zZXRDb21wb25lbnRzKHYtZyxJLUUsVS1QLGUtZWEpLm5vcm1hbGl6ZSgpO2NbNF0uc2V0Q29tcG9uZW50cyh2LXQsSS1GLFUtUSxlLWRhKS5ub3JtYWxpemUoKTtjWzVdLnNldENvbXBvbmVudHModit0LEkrRixVK1EsZStkYSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXN9LGludGVyc2VjdHNPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZW9tZXRyeTtudWxsPT09Yy5ib3VuZGluZ1NwaGVyZSYmYy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtvZi5jb3B5KGMuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG9mKX0saW50ZXJzZWN0c1Nwcml0ZTpmdW5jdGlvbihhKXtvZi5jZW50ZXIuc2V0KDAsMCwwKTtvZi5yYWRpdXM9Ci43MDcxMDY3ODExODY1NDc2O29mLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG9mKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBsYW5lcyxlPWEuY2VudGVyO2E9LWEucmFkaXVzO2Zvcih2YXIgZz0wOzY+ZztnKyspaWYoY1tnXS5kaXN0YW5jZVRvUG9pbnQoZSk8YSlyZXR1cm4hMTtyZXR1cm4hMH0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspe3ZhciBnPWNbZV07c2gueD0wPGcubm9ybWFsLng/YS5tYXgueDphLm1pbi54O3NoLnk9MDxnLm5vcm1hbC55P2EubWF4Lnk6YS5taW4ueTtzaC56PTA8Zy5ub3JtYWwuej9hLm1heC56OmEubWluLno7aWYoMD5nLmRpc3RhbmNlVG9Qb2ludChzaCkpcmV0dXJuITF9cmV0dXJuITB9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMucGxhbmVzLGU9MDs2PmU7ZSsrKWlmKDA+CmNbZV0uZGlzdGFuY2VUb1BvaW50KGEpKXJldHVybiExO3JldHVybiEwfX0pO3ZhciByYj17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKlx4M2QgdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgXHgzYyBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uIFx4M2QgKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqXHgzZCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmFvbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGJlZ2luX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZCBceDNkIHZlYzMoIHBvc2l0aW9uICk7IixiZWdpbm5vcm1hbF92ZXJ0ZXg6InZlYzMgb2JqZWN0Tm9ybWFsIFx4M2QgdmVjMyggbm9ybWFsICk7XG4jaWZkZWYgVVNFX1RBTkdFTlRcblx0dmVjMyBvYmplY3RUYW5nZW50IFx4M2QgdmVjMyggdGFuZ2VudC54eXogKTtcbiNlbmRpZiIsYnNkZnM6InZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCB2ZWM0IGMwIFx4M2QgdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcblx0Y29uc3QgdmVjNCBjMSBceDNkIHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG5cdHZlYzQgciBceDNkIHJvdWdobmVzcyAqIGMwICsgYzE7XG5cdGZsb2F0IGEwMDQgXHgzZCBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xuXHRyZXR1cm4gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xufVxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxuXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgXHgzZCAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XG5cdGlmKCBjdXRvZmZEaXN0YW5jZSBceDNlIDAuMCApIHtcblx0XHRkaXN0YW5jZUZhbGxvZmYgKlx4M2QgcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0fVxuXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xuI2Vsc2Vcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wIFx4MjZceDI2IGRlY2F5RXhwb25lbnQgXHgzZSAwLjAgKSB7XG5cdFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xuXHR9XG5cdHJldHVybiAxLjA7XG4jZW5kaWZcbn1cbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xuXHRmbG9hdCBmcmVzbmVsIFx4M2QgZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcblx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyIFx4M2QgbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgXHgzZCBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgXHgzZCBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tIFx4M2QgcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBhbHBoYSBceDNkIHBvdzIoIHJvdWdobmVzcyApO1xuXHR2ZWMzIGhhbGZEaXIgXHgzZCBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xuXHRmbG9hdCBEIFx4M2QgRF9HR1goIGFscGhhLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgXHgzZCA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgXHgzZCAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgIFx4M2QgMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgXHgzZCB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgXHgzZCB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCBceDNkIGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCBceDNkIGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgXHgzZCBhYnMoIHggKTtcblx0ZmxvYXQgYSBceDNkIDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiBceDNkIDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiBceDNkIGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSBceDNkICggeCBceDNlIDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxIFx4M2QgcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyIFx4M2QgcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsIFx4M2QgY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIFx4M2MgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgXHgzZCBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgXHgzZCAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCBceDNkIG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0IFx4M2QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiBceDNkIGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzIFx4M2QgRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzIFx4M2QgYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgXHgzZCAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyBceDNkIHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgXHgzZCBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgK1x4M2QgRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgK1x4M2QgRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCBceDNkIERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhICBceDNkIDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggXHgzZCBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoIFx4M2QgbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCBceDNkIG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsCmJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4IFx4M2QgZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSBceDNkIGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNpZ21hWCBceDNkIHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgXHgzZCB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2TiBceDNkIHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxIFx4M2QgY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5cdFx0dmVjMyBSMiBceDNkIGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgXHgzZCBkb3QoIHZTaWdtYVgsIFIxICk7XG5cdFx0ZkRldCAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0dmVjMyB2R3JhZCBceDNkIHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyBceDNjIE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgXHgzZCB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSBceDNjIE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkIFx4M2QgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIFx4MjZceDI2IGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIiwKY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHQjaWYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmIiwKY29sb3JfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqXHgzZCB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogXHgzZCBjb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiBceDNkIHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSBceDNkIDEyLjk4OTgsIGIgXHgzZCA3OC4yMzMsIGMgXHgzZCA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCBceDNkIGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuIFx4M2QgbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgXHgzZCBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlIFx4M2QgZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdIFx4M2QgdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSBceDNkIHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyBceDNkIHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59IiwKY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiBceDNkIGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSBceDNkIC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggXHgzZSBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueCBceDNlIDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueSBceDNlIDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi56IFx4M2UgMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlIFx4M2QgZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzIFx4M2QgZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyBceDNkIGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCBceDNkIGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSBceDNkIGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCBceDNkIG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkIFx4M2QgY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsIFx4M2QgMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgXHgzZCByb3VnaG5lc3NMZXZlbCBceDNlIGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhIFx4M2QgMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCBceDNkIGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkIFx4M2QgdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgXHgzZCBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgXHgzZCByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0IFx4M2QgMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyBceDNkIG1pcExldmVsIFx4M2RceDNkIDAuMDtcblx0c2NhbGUgXHgzZCAgYlJlcyBceDI2XHgyNiAoc2NhbGUgXHgzYyBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgXHgzZCBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSBceDNkIDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSBceDNkXHgzZCAwKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSBceDNkXHgzZCAxKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDIpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDMpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDQpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyIFx4M2Qgbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCBceDNkIDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzIFx4M2QgKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSBceDNkIG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgXHgzZCByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcblx0ZmxvYXQgcjEgXHgzZCBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiBceDNkIHIxICsgMS4wO1xuXHRmbG9hdCB0IFx4M2QgZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJbmZvIFx4M2QgTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5cdGZsb2F0IHMgXHgzZCBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCBceDNkIG1pcEluZm8ueDtcblx0ZmxvYXQgbGV2ZWwxIFx4M2QgbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgXHgzZCBsZXZlbDEgXHgzZSA1LjAgPyA1LjAgOiBsZXZlbDE7XG5cdGxldmVsMCArXHgzZCBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2ZWMyIHV2XzEwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IxMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcblx0dmVjMiB1dl8yMCBceDNkIGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0IFx4M2QgbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmIiwKZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgXHgzZCBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdFRhbmdlbnQ7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50IFx4M2QgLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArXHgzZCBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLAplbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgXHgzZCBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqXHgzZCBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgXHgzZCBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCBceDNkIGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCIFx4M2QgbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNIFx4M2QgY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNIFx4M2QgY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgXHgzZCBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCBceDNkIG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gXHgzZCBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcblx0dmVjMyBYcF9ZX1hZWnAgXHgzZCBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwIFx4M2QgbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgXHgzZCBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgXHgzZCAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgXHgzZCBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56IFx4M2QgKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSBceDNkIG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgXHgzZCB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgXHgzZCBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiBceDNkIFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggXHgzZCB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiBceDNkIGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLAplbnZtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggXHgzZCBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0IFx4M2QgbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICtceDNkIGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdCNlbmRpZlxuXHRcbiNlbmRpZiIsZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVZlYywgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgXHgzZCBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSBceDNkIFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgXHgzZCBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdCAgcmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsIFx4M2QgZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdFx0dmVjMyByZWZsZWN0VmlldyBceDNkIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuI2VuZGlmIiwKZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCBceDNkIG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIixmb2dfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHRmb2dEZXB0aCBceDNkIC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiLApmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWYiLGZvZ19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2QgMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciBceDNkIHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRpZiIsZm9nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWYiLApncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVE9PTlxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCBceDNkIHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiAoIGNvb3JkLnggXHgzYyAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIiwKbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfdmVydGV4OiJ2ZWMzIGRpZmZ1c2UgXHgzZCB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiBceDNkIG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCBceDNkIC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCBceDNkIHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgXHgzZCB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayBceDNkIHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCmxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgXHgzZCBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgdHJ1ZTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0fTtcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yIFx4M2QgcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCAoIGRpcmVjdExpZ2h0LmNvbG9yICFceDNkIHZlYzMoIDAuMCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFNwb3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZsb2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlIFx4M2QgbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgXHgzZCBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgXHgzZSBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgXHgzZCBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgXHgzZCAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgXHgzZCBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoIFx4M2Qgc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsCmxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDoiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgXHgzZCBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgXHgzZCBzYXR1cmF0ZSggY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgXHgzZCBjbGFtcCggY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yIFx4M2Qgc2hlZW47XG4jZW5kaWYiLApsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsIFx4M2QgZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgXHgzZCByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoIFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciBceDNkIHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzIFx4M2QgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdIFx4M2QgbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSBceDNkIGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2IFx4M2QgTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgXHgzZCB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgXHgzZCB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiBceDNkIG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCBceDNkICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKlx4M2QgUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSBceDNkIGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfU2hlZW4oXG5cdFx0XHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcblx0XHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbixcblx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxuXHRcdCk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MpO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArXHgzZCBjbGVhcmNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIGNjRG90TlY7XG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCAwLjA7XG5cdCNlbmRpZlxuXHRmbG9hdCBjbGVhcmNvYXRJbnYgXHgzZCAxLjAgLSBjbGVhcmNvYXRESFI7XG5cdHZlYzMgc2luZ2xlU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIG11bHRpU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSBceDNkIGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xuXHRCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcblx0dmVjMyBkaWZmdXNlIFx4M2QgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdEludiAqIHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLApsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwgXHgzZCBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyBceDNlIDAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgXHgzZCBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSBceDI2XHgyNiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcblx0XHRyZWN0QXJlYUxpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodHNbIGkgXTtcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0dmVjMyBpYmxJcnJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdGlycmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyBceDNlIDAgKVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKlx4M2QgUEk7XG5cdFx0I2VuZGlmXG5cdFx0aXJyYWRpYW5jZSArXHgzZCBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aWJsSXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSBceDI2XHgyNiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUIFx4M2QgbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcbiNlbmRpZiIsCmxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggXHgzZCAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9uLnogXHgzZCBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRnbF9Qb3NpdGlvbi56ICpceDNkIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciBceDNkIHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIHRleGVsQ29sb3I7XG4jZW5kaWYiLAptYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgXHgzZCAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqXHgzZCBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yIFx4M2QgbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyBceDNkIHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICpceDNkIHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLAptZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWYiLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLAptb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggXHgzZCB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5IFx4M2QgdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50IFx4M2QgdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCBceDNkIGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgXHgzZCBub3JtYWw7IiwKbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0bm9ybWFsIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHRub3JtYWwgXHgzZCAtIG5vcm1hbDtcblx0I2VuZGlmXG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHRub3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2Qgbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbm9ybWFsU2NhbGUsIG5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsIFx4M2QgcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZiIsCm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcbiNlbmRpZlxuI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xuI2VuZGlmXG4jaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSBceDI2XHgyNiAoIGRlZmluZWQgKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgKVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIG5vcm1hbFNjYWxlLCBpbiBzYW1wbGVyMkQgbm9ybWFsTWFwICkge1xuXHRcdHZlYzMgcTAgXHgzZCB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSBceDNkIHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCBceDNkIGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxIFx4M2QgZEZkeSggdlV2LnN0ICk7XG5cdFx0ZmxvYXQgc2NhbGUgXHgzZCBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xuXHRcdHZlYzMgUyBceDNkIG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcblx0XHR2ZWMzIFQgXHgzZCBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcblx0XHR2ZWMzIE4gXHgzZCBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSAqXHgzZCBub3JtYWxTY2FsZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2ZWMzIE5mcm9tU1QgXHgzZCBjcm9zcyggUywgVCApO1xuXHRcdFx0aWYoIGRvdCggTmZyb21TVCwgTiApIFx4M2UgMC4wICkge1xuXHRcdFx0XHRTICpceDNkIC0xLjA7XG5cdFx0XHRcdFQgKlx4M2QgLTEuMDtcblx0XHRcdH1cblx0XHQjZWxzZVxuXHRcdFx0bWFwTi54eSAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0I2VuZGlmXG5cdFx0bWF0MyB0c24gXHgzZCBtYXQzKCBTLCBULCBOICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xuXHR9XG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsIFx4M2QgZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgY2xlYXJjb2F0Tm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2QgY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE5vcm1hbFNjYWxlLCBjbGVhcmNvYXROb3JtYWxNYXAgKTtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlIFx4M2QgMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlIFx4M2QgMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzIFx4M2QgdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyBceDNkIFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggXHgzZCAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByIFx4M2QgdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC1ceDNkIHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBlbmNvZGVIYWxmUkdCQSAoIHZlYzIgdiApIHtcblx0dmVjNCBlbmNvZGVkIFx4M2QgdmVjNCggMC4wICk7XG5cdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMS4wIC8gMjU1LjAsIDAuMCApO1xuXHRlbmNvZGVkLnh5IFx4M2QgdmVjMiggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnh5IFx4M2QgZW5jb2RlZC54eSAtICggZW5jb2RlZC55eSAqIG9mZnNldCApO1xuXHRlbmNvZGVkLnp3IFx4M2QgdmVjMiggdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnp3IFx4M2QgZW5jb2RlZC56dyAtICggZW5jb2RlZC53dyAqIG9mZnNldCApO1xuXHRyZXR1cm4gZW5jb2RlZDtcbn1cbnZlYzIgZGVjb2RlSGFsZlJHQkEoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IiwKcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDoiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqXHgzZCBnbF9GcmFnQ29sb3IuYTtcbiNlbmRpZiIscHJvamVjdF92ZXJ0ZXg6InZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247IixkaXRoZXJpbmdfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uIFx4M2QgcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCIFx4M2QgdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCIFx4M2QgbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIsCnJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yIFx4M2Qgcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyBceDNkIHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICpceDNkIHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHR2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHtcblx0XHRyZXR1cm4gZGVjb2RlSGFsZlJHQkEoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7XG5cdH1cblx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XG5cdFx0ZmxvYXQgb2NjbHVzaW9uIFx4M2QgMS4wO1xuXHRcdHZlYzIgZGlzdHJpYnV0aW9uIFx4M2QgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XG5cdFx0ZmxvYXQgaGFyZF9zaGFkb3cgXHgzZCBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcblx0XHRpZiAoaGFyZF9zaGFkb3cgIVx4M2QgMS4wICkge1xuXHRcdFx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggO1xuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgXHgzZCBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5IFx4M2QgdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XHRcdFx0b2NjbHVzaW9uIFx4M2QgY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XG5cdFx0fVxuXHRcdHJldHVybiBvY2NsdXNpb247XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYgXHgzZCAoIGZsb29yKCB1diAqIHNpemUgLSAwLjUgKSArIDAuNSApICogdGV4ZWxTaXplO1xuXHRcdGZsb2F0IGxiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0IFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVjMiBmIFx4M2QgZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgXHgzZCBtaXgoIGxiLCBsdCwgZi55ICk7XG5cdFx0ZmxvYXQgYiBceDNkIG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBjIFx4M2QgbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogL1x4M2Qgc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjIFx4M2QgYnZlYzQgKCBzaGFkb3dDb29yZC54IFx4M2VceDNkIDAuMCwgc2hhZG93Q29vcmQueCBceDNjXHgzZCAxLjAsIHNoYWRvd0Nvb3JkLnkgXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC55IFx4M2NceDNkIDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtIFx4M2QgYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyBceDNkIGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCBceDNkIGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyIFx4M2QgZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyIFx4M2QgZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzIFx4M2QgZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzIFx4M2QgZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyBceDNkIFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViBceDNkIGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlIFx4M2QgMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKlx4M2Qgc2NhbGVUb0N1YmU7XG5cdFx0diAqXHgzZCBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyIFx4M2Qgdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgXHgzZCAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSBceDNkIDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiBceDNlIDAuMCApXG5cdFx0XHRcdHBsYW5hci54IFx4M2QgNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCBceDNkIHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSBceDNkIHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55IFx4M2Qgdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uIFx4M2Qgc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwIFx4M2QgKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEIFx4M2Qgbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSBceDNkIHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgXHgzZCAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCBceDNkIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLApza2luYmFzZV92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBib25lTWF0WCBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XG5cdG1hdDQgYm9uZU1hdFkgXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xuXHRtYXQ0IGJvbmVNYXRaIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcblx0bWF0NCBib25lTWF0VyBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XG4jZW5kaWYiLHNraW5uaW5nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XG5cdCNpZmRlZiBCT05FX1RFWFRVUkVcblx0XHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0XHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0ZmxvYXQgaiBceDNkIGkgKiA0LjA7XG5cdFx0XHRmbG9hdCB4IFx4M2QgbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IHkgXHgzZCBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgZHggXHgzZCAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHRmbG9hdCBkeSBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdHkgXHgzZCBkeSAqICggeSArIDAuNSApO1xuXHRcdFx0dmVjNCB2MSBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MiBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MyBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2NCBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdFx0bWF0NCBib25lIFx4M2QgbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2Vsc2Vcblx0XHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBib25lTWF0cmljZXNbIGludChpKSBdO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggXHgzZCBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkIFx4M2QgKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCBceDNkIG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ICBceDNkIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCBceDNkIHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50IFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNwZWN1bGFybWFwX2ZyYWdtZW50OiJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgXHgzZCB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggXHgzZCAxLjA7XG4jZW5kaWYiLHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yIFx4M2QgbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggKCBjb2xvciAqICggMi41MSAqIGNvbG9yICsgMC4wMyApICkgLyAoIGNvbG9yICogKCAyLjQzICogY29sb3IgKyAwLjU5ICkgKyAwLjE0ICkgKTtcbn0iLAp1dl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiLHV2X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyIFx4M2QgdXYyO1xuI2VuZGlmIiwKd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gXHgzZCBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IiwKY3ViZV9mcmFnOiJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdGdsX0ZyYWdDb2xvci5hICpceDNkIG9wYWNpdHk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9zaXRpb24ueiBceDNkIGdsX1Bvc2l0aW9uLnc7XG59IiwKZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCAxLjAgKTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHRcdGRpZmZ1c2VDb2xvci5hIFx4M2Qgb3BhY2l0eTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggdmVjMyggMS4wIC0gZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XG5cdCNlbmRpZlxufSIsCmRlcHRoX3ZlcnQ6IiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG59IiwKZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdGZsb2F0IGRpc3QgXHgzZCBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCBceDNkICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0IFx4M2Qgc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IiwKZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG59IiwKZXF1aXJlY3RfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSBceDNkIGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRzYW1wbGVVVi54IFx4M2QgYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IiwKZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApIFx4M2UgZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApsaW5lZGFzaGVkX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2NhbGU7XG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHR2TGluZURpc3RhbmNlIFx4M2Qgc2NhbGUgKiBsaW5lRGlzdGFuY2U7XG5cdHZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobGFtYmVydF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hc2tfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xpZ2h0bWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkIHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2xhbWJlcnRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0dmVjMyB2aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCBceDNkIG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5IFx4M2QgY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciBceDNkIG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG59IiwKbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9lbmRceDNlXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZW52bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBUUkFOU1BBUkVOQ1lcbiNlbmRpZlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmZGVmIFRSQU5TUEFSRU5DWVxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zcGFyZW5jeTtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaWZkZWYgVFJBTlNQQVJFTkNZXG5cdFx0ZGlmZnVzZUNvbG9yLmEgKlx4M2Qgc2F0dXJhdGUoIDEuIC0gdHJhbnNwYXJlbmN5ICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZUYW5nZW50IFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHR2Qml0YW5nZW50IFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHQjZW5kaWZcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsCm5vcm1hbF92ZXJ0OiIjZGVmaW5lIE5PUk1BTFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLApwb2ludHNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0b3V0Z29pbmdMaWdodCBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKcG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9pbnRTaXplIFx4M2Qgc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICpceDNkICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCnNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLHNoYWRvd192ZXJ0OiIjaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCnNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55IFx4M2QgbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlIFx4M2QgKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSBceDNkXHgzZCAtIDEuMCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICpceDNkIC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gXHgzZCAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54IFx4M2QgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgXHgzZCBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICtceDNkIHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSJ9LApXYT17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgSCgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyByfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSwKbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBmKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyLjVFLTR9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MkUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IEgoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LApzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fSxzaGFkb3c6e30sc2hhZG93Qmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0scG9pbnRMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRlY2F5Ont9LGRpc3RhbmNlOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0sCnBvaW50U2hhZG93TWFwOnt2YWx1ZTpbXX0scG9pbnRTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxoZW1pc3BoZXJlTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sc2t5Q29sb3I6e30sZ3JvdW5kQ29sb3I6e319fSxyZWN0QXJlYUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sd2lkdGg6e30saGVpZ2h0Ont9fX19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IEgoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHJ9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBIKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgZiguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgcn19fSxPYz0Ke2Jhc2ljOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLnNwZWN1bGFybWFwLFdhLmVudm1hcCxXYS5hb21hcCxXYS5saWdodG1hcCxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmZvZyxXYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSCgwKX19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCxXYS5ncmFkaWVudG1hcCwKV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBIKDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IEgoMTExODQ4MSl9LHNoaW5pbmVzczp7dmFsdWU6MzB9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCxXYS5yb3VnaG5lc3NtYXAsV2EubWV0YWxuZXNzbWFwLFdhLmZvZyxXYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSCgwKX0scm91Z2huZXNzOnt2YWx1ZTouNX0sbWV0YWxuZXNzOnt2YWx1ZTouNX0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaHBoeXNpY2FsX2ZyYWd9LAptYXRjYXA6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpCYihbV2EucG9pbnRzLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjpyYi5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6cmIuZGVwdGhfdmVydCwKZnJhZ21lbnRTaGFkZXI6cmIuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnJiLm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOkJiKFtXYS5zcHJpdGUsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyByfSx0MkQ6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6cmIuY3ViZV92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOnJiLmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBrfSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxRTN9fV0pLHZlcnRleFNoYWRlcjpyYi5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5kaXN0YW5jZVJHQkFfZnJhZ30sc2hhZG93Ont1bmlmb3JtczpCYihbV2EubGlnaHRzLFdhLmZvZyx7Y29sb3I6e3ZhbHVlOm5ldyBIKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc2hhZG93X2ZyYWd9fTtPYy5waHlzaWNhbD0Ke3VuaWZvcm1zOkJiKFtPYy5zdGFuZGFyZC51bmlmb3Jtcyx7dHJhbnNwYXJlbmN5Ont2YWx1ZTowfSxjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzczp7dmFsdWU6MH0sc2hlZW46e3ZhbHVlOm5ldyBIKDApfSxjbGVhcmNvYXROb3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaHBoeXNpY2FsX2ZyYWd9O3VkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7dWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXVkO05jLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7TmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPU5jO2VkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtlZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWQ7ZWQucHJvdG90eXBlLmlzQ3ViZVRleHR1cmU9CiEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlZC5wcm90b3R5cGUsImltYWdlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbWFnZT1hfX0pO3RlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTt0ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9dGU7dGUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO3VlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTt1ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9dWU7dWUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUzRD0hMDt2YXIgcmo9bmV3IGwsemw9bmV3IHRlLEJsPW5ldyB1ZSxzaj1uZXcgZWQsbGo9W10sbmo9W10scWo9bmV3IEZsb2F0MzJBcnJheSgxNikscGo9bmV3IEZsb2F0MzJBcnJheSg5KSxvaj1uZXcgRmxvYXQzMkFycmF5KDQpO3RqLnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmNhY2hlO2EgaW5zdGFuY2VvZgpGbG9hdDMyQXJyYXkmJmMubGVuZ3RoIT09YS5sZW5ndGgmJih0aGlzLmNhY2hlPW5ldyBGbG9hdDMyQXJyYXkoYS5sZW5ndGgpKTtwYyhjLGEpfTt1ai5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUpe2Zvcih2YXIgZz10aGlzLnNlcSx0PTAsdj1nLmxlbmd0aDt0IT09djsrK3Qpe3ZhciB6PWdbdF07ei5zZXRWYWx1ZShhLGNbei5pZF0sZSl9fTt2YXIgUWg9LyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7eGQucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKGEsYyxlLGcpe2M9dGhpcy5tYXBbY107dm9pZCAwIT09YyYmYy5zZXRWYWx1ZShhLGUsZyl9O3hkLnByb3RvdHlwZS5zZXRPcHRpb25hbD1mdW5jdGlvbihhLGMsZSl7Yz1jW2VdO3ZvaWQgMCE9PWMmJnRoaXMuc2V0VmFsdWUoYSxlLGMpfTt4ZC51cGxvYWQ9ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciB0PTAsdj1jLmxlbmd0aDt0IT09djsrK3Qpe3ZhciB6PWNbdF0sRT1lW3ouaWRdOyExIT09RS5uZWVkc1VwZGF0ZSYmCnouc2V0VmFsdWUoYSxFLnZhbHVlLGcpfX07eGQuc2VxV2l0aFZhbHVlPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPVtdLGc9MCx0PWEubGVuZ3RoO2chPT10OysrZyl7dmFyIHY9YVtnXTt2LmlkIGluIGMmJmUucHVzaCh2KX1yZXR1cm4gZX07dmFyIGVtPTAsbm09MDt5ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7eWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXlkO3lkLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO3lkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGVwdGhQYWNraW5nPWEuZGVwdGhQYWNraW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1hcD1hLm1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KYS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3JldHVybiB0aGlzfTt6ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7emQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXpkO3pkLnByb3RvdHlwZS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPSEwO3pkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weShhLnJlZmVyZW5jZVBvc2l0aW9uKTt0aGlzLm5lYXJEaXN0YW5jZT1hLm5lYXJEaXN0YW5jZTt0aGlzLmZhckRpc3RhbmNlPWEuZmFyRGlzdGFuY2U7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9CmEuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7cmV0dXJuIHRoaXN9O3dlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp3ZSxpc0dyb3VwOiEwfSk7d2YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh2Yi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp3Zixpc0FycmF5Q2FtZXJhOiEwfSk7dmFyIEhqPW5ldyBrLElqPW5ldyBrO09iamVjdC5hc3NpZ24oU2gucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKEpqLnByb3RvdHlwZSxkLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbihDZy5wcm90b3R5cGUse2lzRm9nRXhwMjohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2codGhpcy5jb2xvciwKdGhpcy5kZW5zaXR5KX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX0pO09iamVjdC5hc3NpZ24oRGcucHJvdG90eXBlLHtpc0ZvZzohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgRGcodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nIixjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLG5lYXI6dGhpcy5uZWFyLGZhcjp0aGlzLmZhcn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFNkLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKFNkLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlcjohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC90aGlzLnN0cmlkZTowO3RoaXMuYXJyYXk9YTtyZXR1cm4gdGhpc30sc2V0RHluYW1pYzpmdW5jdGlvbihhKXt0aGlzLmR5bmFtaWM9YTtyZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbihhKXt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuY291bnQ9YS5jb3VudDt0aGlzLnN0cmlkZT1hLnN0cmlkZTt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuc3RyaWRlO2UqPWMuc3RyaWRlO2Zvcih2YXIgZz0wLHQ9dGhpcy5zdHJpZGU7Zzx0O2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxzZXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLmFycmF5LnNldChhLGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sCm9uVXBsb2FkOmZ1bmN0aW9uKGEpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1hO3JldHVybiB0aGlzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHlmLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEuY291bnR9fSxhcnJheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX19fSk7T2JqZWN0LmFzc2lnbih5Zi5wcm90b3R5cGUse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWM7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdPWM7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWM7cmV0dXJuIHRoaXN9LApzZXRXOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1jO3JldHVybiB0aGlzfSxnZXRYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX0sZ2V0WTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXX0sZ2V0WjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXX0sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX0sc2V0WFk6ZnVuY3Rpb24oYSxjLGUpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTtyZXR1cm4gdGhpc30sc2V0WFlaOmZ1bmN0aW9uKGEsCmMsZSxnKXthPWEqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDt0aGlzLmRhdGEuYXJyYXlbYSswXT1jO3RoaXMuZGF0YS5hcnJheVthKzFdPWU7dGhpcy5kYXRhLmFycmF5W2ErMl09ZztyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihhLGMsZSxnLHQpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3RoaXMuZGF0YS5hcnJheVthKzNdPXQ7cmV0dXJuIHRoaXN9fSk7RGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO0RkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZDtEZC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbD0hMDtEZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5yb3RhdGlvbj0KYS5yb3RhdGlvbjt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjtyZXR1cm4gdGhpc307dmFyIENlLG5nPW5ldyBrLHBmPW5ldyBrLHFmPW5ldyBrLERlPW5ldyBmLEFmPW5ldyBmLE9qPW5ldyBxLHRoPW5ldyBrLG9nPW5ldyBrLHVoPW5ldyBrLHRrPW5ldyBmLFBpPW5ldyBmLHVrPW5ldyBmO3pmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6Zixpc1Nwcml0ZTohMCxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7bnVsbD09PWEuY2FtZXJhJiZjb25zb2xlLmVycm9yKCdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyk7cGYuc2V0RnJvbU1hdHJpeFNjYWxlKHRoaXMubWF0cml4V29ybGQpO09qLmNvcHkoYS5jYW1lcmEubWF0cml4V29ybGQpO3RoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLAp0aGlzLm1hdHJpeFdvcmxkKTtxZi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpO2EuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJnBmLm11bHRpcGx5U2NhbGFyKC1xZi56KTt2YXIgZT10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2lmKDAhPT1lKXt2YXIgZz1NYXRoLmNvcyhlKTt2YXIgdD1NYXRoLnNpbihlKX1lPXRoaXMuY2VudGVyO0VnKHRoLnNldCgtLjUsLS41LDApLHFmLGUscGYsdCxnKTtFZyhvZy5zZXQoLjUsLS41LDApLHFmLGUscGYsdCxnKTtFZyh1aC5zZXQoLjUsLjUsMCkscWYsZSxwZix0LGcpO3RrLnNldCgwLDApO1BpLnNldCgxLDApO3VrLnNldCgxLDEpO3ZhciB2PWEucmF5LmludGVyc2VjdFRyaWFuZ2xlKHRoLG9nLHVoLCExLG5nKTtpZihudWxsPT09diYmKEVnKG9nLnNldCgtLjUsLjUsMCkscWYsZSxwZix0LGcpLFBpLnNldCgwLDEpLHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUodGgsCnVoLG9nLCExLG5nKSxudWxsPT09dikpcmV0dXJuO3Q9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8obmcpO3Q8YS5uZWFyfHx0PmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOnQscG9pbnQ6bmcuY2xvbmUoKSx1djpCLmdldFVWKG5nLHRoLG9nLHVoLHRrLFBpLHVrLG5ldyBmKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dm9pZCAwIT09YS5jZW50ZXImJnRoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3JldHVybiB0aGlzfX0pO3ZhciB2aD1uZXcgayx2az1uZXcgaztCZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6QmYsaXNMT0Q6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSwhMSk7YT1hLmxldmVscztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPWFbY107dGhpcy5hZGRMZXZlbChnLm9iamVjdC5jbG9uZSgpLGcuZGlzdGFuY2UpfXJldHVybiB0aGlzfSxhZGRMZXZlbDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2M9TWF0aC5hYnMoYyk7Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGc9MDtnPGUubGVuZ3RoJiYhKGM8ZVtnXS5kaXN0YW5jZSk7ZysrKTtlLnNwbGljZShnLDAse2Rpc3RhbmNlOmMsb2JqZWN0OmF9KTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMubGV2ZWxzLGU9MSxnPWMubGVuZ3RoO2U8ZyYmIShhPGNbZV0uZGlzdGFuY2UpO2UrKyk7cmV0dXJuIGNbZS0xXS5vYmplY3R9LHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXt2aC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShhLnJheS5vcmlnaW4uZGlzdGFuY2VUbyh2aCkpLnJheWNhc3QoYSwKYyl9LHVwZGF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmxldmVscztpZigxPGMubGVuZ3RoKXt2aC5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS5tYXRyaXhXb3JsZCk7dmsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2E9dmguZGlzdGFuY2VUbyh2ayk7Y1swXS5vYmplY3QudmlzaWJsZT0hMDtmb3IodmFyIGU9MSxnPWMubGVuZ3RoO2U8ZztlKyspaWYoYT49Y1tlXS5kaXN0YW5jZSljW2UtMV0ub2JqZWN0LnZpc2libGU9ITEsY1tlXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrO2Zvcig7ZTxnO2UrKyljW2VdLm9iamVjdC52aXNpYmxlPSExfX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC5sZXZlbHM9W107Zm9yKHZhciBjPXRoaXMubGV2ZWxzLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspe3ZhciB0PWNbZV07YS5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDp0Lm9iamVjdC51dWlkLApkaXN0YW5jZTp0LmRpc3RhbmNlfSl9cmV0dXJuIGF9fSk7Q2YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpDZixpc1NraW5uZWRNZXNoOiEwLGJpbmQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnNrZWxldG9uPWE7dm9pZCAwPT09YyYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSxjPXRoaXMubWF0cml4V29ybGQpO3RoaXMuYmluZE1hdHJpeC5jb3B5KGMpO3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZShjKX0scG9zZTpmdW5jdGlvbigpe3RoaXMuc2tlbGV0b24ucG9zZSgpfSxub3JtYWxpemVTa2luV2VpZ2h0czpmdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgcCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LGU9MCxnPWMuY291bnQ7ZTxnO2UrKyl7YS54PWMuZ2V0WChlKTthLnk9Yy5nZXRZKGUpO2Euej1jLmdldFooZSk7CmEudz1jLmdldFcoZSk7dmFyIHQ9MS9hLm1hbmhhdHRhbkxlbmd0aCgpO0luZmluaXR5IT09dD9hLm11bHRpcGx5U2NhbGFyKHQpOmEuc2V0KDEsMCwwLDApO2Muc2V0WFlaVyhlLGEueCxhLnksYS56LGEudyl9fSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt5YS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpOyJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5iaW5kTWF0cml4KTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7CnZhciB3az1uZXcgcSxjbj1uZXcgcTtPYmplY3QuYXNzaWduKEZnLnByb3RvdHlwZSx7Y2FsY3VsYXRlSW52ZXJzZXM6ZnVuY3Rpb24oKXt0aGlzLmJvbmVJbnZlcnNlcz1bXTtmb3IodmFyIGE9MCxjPXRoaXMuYm9uZXMubGVuZ3RoO2E8YzthKyspe3ZhciBlPW5ldyBxO3RoaXMuYm9uZXNbYV0mJmUuZ2V0SW52ZXJzZSh0aGlzLmJvbmVzW2FdLm1hdHJpeFdvcmxkKTt0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGUpfX0scG9zZTpmdW5jdGlvbigpe3ZhciBhLGM7dmFyIGU9MDtmb3IoYz10aGlzLmJvbmVzLmxlbmd0aDtlPGM7ZSsrKShhPXRoaXMuYm9uZXNbZV0pJiZhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodGhpcy5ib25lSW52ZXJzZXNbZV0pO2U9MDtmb3IoYz10aGlzLmJvbmVzLmxlbmd0aDtlPGM7ZSsrKWlmKGE9dGhpcy5ib25lc1tlXSlhLnBhcmVudCYmYS5wYXJlbnQuaXNCb25lPyhhLm1hdHJpeC5nZXRJbnZlcnNlKGEucGFyZW50Lm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5tdWx0aXBseShhLm1hdHJpeFdvcmxkKSk6CmEubWF0cml4LmNvcHkoYS5tYXRyaXhXb3JsZCksYS5tYXRyaXguZGVjb21wb3NlKGEucG9zaXRpb24sYS5xdWF0ZXJuaW9uLGEuc2NhbGUpfSx1cGRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ib25lcyxjPXRoaXMuYm9uZUludmVyc2VzLGU9dGhpcy5ib25lTWF0cmljZXMsZz10aGlzLmJvbmVUZXh0dXJlLHQ9MCx2PWEubGVuZ3RoO3Q8djt0Kyspd2subXVsdGlwbHlNYXRyaWNlcyhhW3RdP2FbdF0ubWF0cml4V29ybGQ6Y24sY1t0XSksd2sudG9BcnJheShlLDE2KnQpO3ZvaWQgMCE9PWcmJihnLm5lZWRzVXBkYXRlPSEwKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEZnKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfSxnZXRCb25lQnlOYW1lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9dGhpcy5ib25lcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9dGhpcy5ib25lc1tjXTtpZihnLm5hbWU9PT1hKXJldHVybiBnfX19KTtaaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOlpoLGlzQm9uZTohMH0pO0ZiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtGYi5wcm90b3R5cGUuY29uc3RydWN0b3I9RmI7RmIucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWw9ITA7RmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubGluZXdpZHRoPWEubGluZXdpZHRoO3RoaXMubGluZWNhcD1hLmxpbmVjYXA7dGhpcy5saW5lam9pbj1hLmxpbmVqb2luO3JldHVybiB0aGlzfTt2YXIgeGs9bmV3IGsseWs9bmV3IGssems9bmV3IHEsd2g9bmV3IEQscGc9bmV3IEc7WGIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlhiLGlzTGluZTohMCxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT0KYS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVswXSxnPTEsdD1jLmNvdW50O2c8dDtnKyspeGsuZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGctMSkseWsuZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLGVbZ109ZVtnLTFdLGVbZ10rPXhrLmRpc3RhbmNlVG8oeWspO2EuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBiYShlLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSBpZihhLmlzR2VvbWV0cnkpZm9yKGM9YS52ZXJ0aWNlcyxlPWEubGluZURpc3RhbmNlcyxlWzBdPTAsZz0xLHQ9Yy5sZW5ndGg7Zzx0O2crKyllW2ddPWVbZy0xXSxlW2ddKz1jW2ctMV0uZGlzdGFuY2VUbyhjW2ddKTtyZXR1cm4gdGhpc30scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEubGluZVByZWNpc2lvbiwKZz10aGlzLmdlb21ldHJ5LHQ9dGhpcy5tYXRyaXhXb3JsZDtudWxsPT09Zy5ib3VuZGluZ1NwaGVyZSYmZy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwZy5jb3B5KGcuYm91bmRpbmdTcGhlcmUpO3BnLmFwcGx5TWF0cml4NCh0KTtwZy5yYWRpdXMrPWU7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKHBnKSl7emsuZ2V0SW52ZXJzZSh0KTt3aC5jb3B5KGEucmF5KS5hcHBseU1hdHJpeDQoemspO2UvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMztlKj1lO3ZhciB2PW5ldyBrLHo9bmV3IGs7dD1uZXcgazt2YXIgRT1uZXcgayxGPXRoaXMmJnRoaXMuaXNMaW5lU2VnbWVudHM/MjoxO2lmKGcuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIEk9Zy5pbmRleCxNPWcuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09SSl7ST1JLmFycmF5O2c9MDtmb3IodmFyIFA9SS5sZW5ndGgtMTtnPFA7Zys9Ril7dmFyIFE9SVtnKzFdO3YuZnJvbUFycmF5KE0sCjMqSVtnXSk7ei5mcm9tQXJyYXkoTSwzKlEpO1E9d2guZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSx0KTtRPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxRPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFE8YS5uZWFyfHxRPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlEscG9pbnQ6dC5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDpnLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19ZWxzZSBmb3IoZz0wLFA9TS5sZW5ndGgvMy0xO2c8UDtnKz1GKXYuZnJvbUFycmF5KE0sMypnKSx6LmZyb21BcnJheShNLDMqZyszKSxRPXdoLmRpc3RhbmNlU3FUb1NlZ21lbnQodix6LEUsdCksUT5lfHwoRS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksUT1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhFKSxRPGEubmVhcnx8UT5hLmZhcnx8Yy5wdXNoKHtkaXN0YW5jZTpRLHBvaW50OnQuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksCmluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfWVsc2UgaWYoZy5pc0dlb21ldHJ5KWZvcih2PWcudmVydGljZXMsej12Lmxlbmd0aCxnPTA7Zzx6LTE7Zys9RilRPXdoLmRpc3RhbmNlU3FUb1NlZ21lbnQodltnXSx2W2crMV0sRSx0KSxRPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxRPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFE8YS5uZWFyfHxRPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlEscG9pbnQ6dC5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDpnLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7dmFyIHhoPW5ldyBrLHloPW5ldyBrO0liLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOkliLGlzTGluZVNlZ21lbnRzOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PWEuaW5kZXgpe2Zvcih2YXIgYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sZT1bXSxnPTAsdD1jLmNvdW50O2c8dDtnKz0yKXhoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKSx5aC5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZysxKSxlW2ddPTA9PT1nPzA6ZVtnLTFdLGVbZysxXT1lW2ddK3hoLmRpc3RhbmNlVG8oeWgpO2EuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBiYShlLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9CmEubGluZURpc3RhbmNlcyxnPTAsdD1jLmxlbmd0aDtnPHQ7Zys9Mil4aC5jb3B5KGNbZ10pLHloLmNvcHkoY1tnKzFdKSxlW2ddPTA9PT1nPzA6ZVtnLTFdLGVbZysxXT1lW2ddK3hoLmRpc3RhbmNlVG8oeWgpO3JldHVybiB0aGlzfX0pO0dnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6R2csaXNMaW5lTG9vcDohMH0pO0NjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtDYy5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2M7Q2MucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7Q2MucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMuc2l6ZT1hLnNpemU7dGhpcy5zaXplQXR0ZW51YXRpb249YS5zaXplQXR0ZW51YXRpb247dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7CnJldHVybiB0aGlzfTt2YXIgQWs9bmV3IHEsYWk9bmV3IEQscWc9bmV3IEcsemg9bmV3IGs7RWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkVlLGlzUG9pbnRzOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmdlb21ldHJ5LGc9dGhpcy5tYXRyaXhXb3JsZCx0PWEucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7bnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7cWcuY29weShlLmJvdW5kaW5nU3BoZXJlKTtxZy5hcHBseU1hdHJpeDQoZyk7cWcucmFkaXVzKz10O2lmKCExIT09YS5yYXkuaW50ZXJzZWN0c1NwaGVyZShxZykpaWYoQWsuZ2V0SW52ZXJzZShnKSxhaS5jb3B5KGEucmF5KS5hcHBseU1hdHJpeDQoQWspLHQvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyx0Kj10LGUuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHY9ZS5pbmRleDsKZT1lLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7aWYobnVsbCE9PXYpe3ZhciB6PXYuYXJyYXk7dj0wO2Zvcih2YXIgRT16Lmxlbmd0aDt2PEU7disrKXt2YXIgRj16W3ZdO3poLmZyb21BcnJheShlLDMqRik7JGgoemgsRix0LGcsYSxjLHRoaXMpfX1lbHNlIGZvcih2PTAsej1lLmxlbmd0aC8zO3Y8ejt2KyspemguZnJvbUFycmF5KGUsMyp2KSwkaCh6aCx2LHQsZyxhLGMsdGhpcyl9ZWxzZSBmb3IoZT1lLnZlcnRpY2VzLHY9MCx6PWUubGVuZ3RoO3Y8ejt2KyspJGgoZVt2XSx2LHQsZyxhLGMsdGhpcyl9LHVwZGF0ZU1vcnBoVGFyZ2V0czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXthPWEubW9ycGhBdHRyaWJ1dGVzO3ZhciBjPU9iamVjdC5rZXlzKGEpO2lmKDA8Yy5sZW5ndGgpe3ZhciBlPWFbY1swXV07aWYodm9pZCAwIT09ZSlmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9Cnt9LGE9MCxjPWUubGVuZ3RoO2E8YzthKyspe3ZhciBnPWVbYV0ubmFtZXx8U3RyaW5nKGEpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbZ109YX19fWVsc2UgYT1hLm1vcnBoVGFyZ2V0cyx2b2lkIDAhPT1hJiYwPGEubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5Qb2ludHMudXBkYXRlTW9ycGhUYXJnZXRzKCkgZG9lcyBub3Qgc3VwcG9ydCBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7YmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJpLGlzVmlkZW9UZXh0dXJlOiEwLHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW1hZ2U7YS5yZWFkeVN0YXRlPj0KYS5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX0pO0ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtGZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RmU7RmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmU9ITA7RGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZjtEZi5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO0VmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtFZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RWY7RWYucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO0dlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7R2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdlO0ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7RmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZmO0hlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7CkhlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZTtHZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0dmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HZjttYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO21jLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tYztIZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZjtJZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO0llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZTtJZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0lmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZjtUZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO1RkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZDtKZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0pmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KSmY7SmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKTtKZS5wcm90b3R5cGUuY29uc3RydWN0b3I9SmU7S2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtLZi5wcm90b3R5cGUuY29uc3RydWN0b3I9S2Y7S2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKTtLZS5wcm90b3R5cGUuY29uc3RydWN0b3I9S2U7TGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtMZi5wcm90b3R5cGUuY29uc3RydWN0b3I9TGY7VWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtVZC5wcm90b3R5cGUuY29uc3RydWN0b3I9VWQ7VWQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7cmV0dXJuIGF9O01mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7Ck1mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZjtMZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0xlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MZTtOZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO05mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OZjtNZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO01lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZTt2YXIgZG49e3RyaWFuZ3VsYXRlOmZ1bmN0aW9uKGEsYyxlKXtlPWV8fDI7dmFyIGc9YyYmYy5sZW5ndGgsdD1nP2NbMF0qZTphLmxlbmd0aCx2PVBqKGEsMCx0LGUsITApLHo9W107aWYoIXZ8fHYubmV4dD09PXYucHJldilyZXR1cm4gejtnJiYodj15bShhLGMsdixlKSk7aWYoYS5sZW5ndGg+ODAqZSl7dmFyIEU9Yz1hWzBdO3ZhciBGPWc9YVsxXTtmb3IodmFyIEk9ZTtJPHQ7SSs9ZSl7dmFyIE09YVtJXTt2YXIgUD1hW0krMV07TTxFJiYoRT1NKTtQPEYmJihGPVApOwpNPmMmJihjPU0pO1A+ZyYmKGc9UCl9TT1NYXRoLm1heChjLUUsZy1GKTtNPTAhPT1NPzEvTTowfVFmKHYseixlLEUsRixNKTtyZXR1cm4gen19LGdkPXthcmVhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1hLmxlbmd0aCxlPTAsZz1jLTEsdD0wO3Q8YztnPXQrKyllKz1hW2ddLngqYVt0XS55LWFbdF0ueCphW2ddLnk7cmV0dXJuLjUqZX0saXNDbG9ja1dpc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIDA+Z2QuYXJlYShhKX0sdHJpYW5ndWxhdGVTaGFwZTpmdW5jdGlvbihhLGMpe3ZhciBlPVtdLGc9W10sdD1bXTtUaihhKTtVaihlLGEpO3ZhciB2PWEubGVuZ3RoO2MuZm9yRWFjaChUaik7Zm9yKGE9MDthPGMubGVuZ3RoO2ErKylnLnB1c2godiksdis9Y1thXS5sZW5ndGgsVWooZSxjW2FdKTtjPWRuLnRyaWFuZ3VsYXRlKGUsZyk7Zm9yKGE9MDthPGMubGVuZ3RoO2ErPTMpdC5wdXNoKGMuc2xpY2UoYSxhKzMpKTtyZXR1cm4gdH19O1dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7CldkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1XZDtXZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eGEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGEpfTtUYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UYztUYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGEpfTt2YXIgR209e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oYSxjLGUsZyx0KXthPWNbMypnXTtnPWNbMypnKzFdO3ZhciB2PWNbMyp0XTt0PWNbMyp0KzFdO3JldHVybltuZXcgZihjWzMqZV0sY1szKmUrMV0pLG5ldyBmKGEsZyksbmV3IGYodix0KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihhLApjLGUsZyx0LHYpe2E9Y1szKmVdO3ZhciB6PWNbMyplKzFdO2U9Y1szKmUrMl07dmFyIEU9Y1szKmddLEY9Y1szKmcrMV07Zz1jWzMqZysyXTt2YXIgST1jWzMqdF0sTT1jWzMqdCsxXTt0PWNbMyp0KzJdO3ZhciBQPWNbMyp2XSxRPWNbMyp2KzFdO2M9Y1szKnYrMl07cmV0dXJuLjAxPk1hdGguYWJzKHotRik/W25ldyBmKGEsMS1lKSxuZXcgZihFLDEtZyksbmV3IGYoSSwxLXQpLG5ldyBmKFAsMS1jKV06W25ldyBmKHosMS1lKSxuZXcgZihGLDEtZyksbmV3IGYoTSwxLXQpLG5ldyBmKFEsMS1jKV19fTtTZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZjtPZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUYy5wcm90b3R5cGUpO09lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PZTtUZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZjtFZC5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtFZC5wcm90b3R5cGUuY29uc3RydWN0b3I9RWQ7VWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtVZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VWY7UGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtQZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UGU7VmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7UWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtRZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UWU7WGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtYZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WGQ7WGQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXhhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gV2oodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcywKYSl9O1lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7WWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVlkO1lkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIFdqKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsYSl9O1JlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJlO1pkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVpkO2hkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7aGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWhkO1dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpkLnByb3RvdHlwZSk7V2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdmO1hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhkLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpYZjtZZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1lmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZjtTZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1NlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZTt2YXIgamM9T2JqZWN0LmZyZWV6ZSh7V2lyZWZyYW1lR2VvbWV0cnk6R2UsUGFyYW1ldHJpY0dlb21ldHJ5OkZmLFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpIZSxUZXRyYWhlZHJvbkdlb21ldHJ5OkhmLFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6SWUsT2N0YWhlZHJvbkdlb21ldHJ5OklmLE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpUZCxJY29zYWhlZHJvbkdlb21ldHJ5OkpmLEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6SmUsRG9kZWNhaGVkcm9uR2VvbWV0cnk6S2YsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6S2UsUG9seWhlZHJvbkdlb21ldHJ5OkdmLFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTptYyxUdWJlR2VvbWV0cnk6TGYsClR1YmVCdWZmZXJHZW9tZXRyeTpVZCxUb3J1c0tub3RHZW9tZXRyeTpNZixUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTpMZSxUb3J1c0dlb21ldHJ5Ok5mLFRvcnVzQnVmZmVyR2VvbWV0cnk6TWUsVGV4dEdlb21ldHJ5OlNmLFRleHRCdWZmZXJHZW9tZXRyeTpPZSxTcGhlcmVHZW9tZXRyeTpUZixTcGhlcmVCdWZmZXJHZW9tZXRyeTpFZCxSaW5nR2VvbWV0cnk6VWYsUmluZ0J1ZmZlckdlb21ldHJ5OlBlLFBsYW5lR2VvbWV0cnk6dWQsUGxhbmVCdWZmZXJHZW9tZXRyeTpOYyxMYXRoZUdlb21ldHJ5OlZmLExhdGhlQnVmZmVyR2VvbWV0cnk6UWUsU2hhcGVHZW9tZXRyeTpYZCxTaGFwZUJ1ZmZlckdlb21ldHJ5OllkLEV4dHJ1ZGVHZW9tZXRyeTpXZCxFeHRydWRlQnVmZmVyR2VvbWV0cnk6VGMsRWRnZXNHZW9tZXRyeTpSZSxDb25lR2VvbWV0cnk6V2YsQ29uZUJ1ZmZlckdlb21ldHJ5OlhmLEN5bGluZGVyR2VvbWV0cnk6WmQsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpoZCxDaXJjbGVHZW9tZXRyeTpZZiwKQ2lyY2xlQnVmZmVyR2VvbWV0cnk6U2UsQm94R2VvbWV0cnk6U2EsQm94QnVmZmVyR2VvbWV0cnk6WGF9KTskZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7JGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRkOyRkLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwOyRkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTtyZXR1cm4gdGhpc307VGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocWIucHJvdG90eXBlKTtUZS5wcm90b3R5cGUuY29uc3RydWN0b3I9VGU7VGUucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7VWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO1VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYztVYy5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtVYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMucm91Z2huZXNzPWEucm91Z2huZXNzO3RoaXMubWV0YWxuZXNzPWEubWV0YWxuZXNzO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLmVtaXNzaXZlLmNvcHkoYS5lbWlzc2l2ZSk7dGhpcy5lbWlzc2l2ZU1hcD1hLmVtaXNzaXZlTWFwO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpOwp0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50Qmlhczt0aGlzLnJvdWdobmVzc01hcD1hLnJvdWdobmVzc01hcDt0aGlzLm1ldGFsbmVzc01hcD1hLm1ldGFsbmVzc01hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9YS5lbnZNYXA7dGhpcy5lbnZNYXBJbnRlbnNpdHk9YS5lbnZNYXBJbnRlbnNpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89YS5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPQphLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307YWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVWMucHJvdG90eXBlKTthZS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWU7YWUucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITA7YWUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7VWMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMuY2xlYXJjb2F0PWEuY2xlYXJjb2F0O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWEuY2xlYXJjb2F0Um91Z2huZXNzO3RoaXMuc2hlZW49YS5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IEgpLmNvcHkoYS5zaGVlbik6bnVsbDt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1hLmNsZWFyY29hdE5vcm1hbE1hcDt0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoYS5jbGVhcmNvYXROb3JtYWxTY2FsZSk7CnRoaXMudHJhbnNwYXJlbmN5PWEudHJhbnNwYXJlbmN5O3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7RGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPURjO0RjLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO0RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLnNwZWN1bGFyLmNvcHkoYS5zcGVjdWxhcik7dGhpcy5zaGluaW5lc3M9YS5zaGluaW5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KYS5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuc3BlY3VsYXJNYXA9YS5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9YS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0KYS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtiZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShEYy5wcm90b3R5cGUpO2JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZTtiZS5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsPSEwO2JlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe0RjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdyYWRpZW50TWFwPWEuZ3JhZGllbnRNYXA7cmV0dXJuIHRoaXN9O2NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtjZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2U7Y2UucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPQohMDtjZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307CmRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtkZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGU7ZGUucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDtkZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuc3BlY3VsYXJNYXA9YS5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9CmEuZW52TWFwO3RoaXMuY29tYmluZT1hLmNvbWJpbmU7dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89YS5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtlZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7ZWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWVlO2VlLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMDtlZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGNhcD1hLm1hdGNhcDt0aGlzLm1hcD1hLm1hcDt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2ZlLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZShGYi5wcm90b3R5cGUpO2ZlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mZTtmZS5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7ZmUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7RmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuc2NhbGU9YS5zY2FsZTt0aGlzLmRhc2hTaXplPWEuZGFzaFNpemU7dGhpcy5nYXBTaXplPWEuZ2FwU2l6ZTtyZXR1cm4gdGhpc307dmFyIGVuPU9iamVjdC5mcmVlemUoe1NoYWRvd01hdGVyaWFsOiRkLFNwcml0ZU1hdGVyaWFsOkRkLFJhd1NoYWRlck1hdGVyaWFsOlRlLFNoYWRlck1hdGVyaWFsOnFiLFBvaW50c01hdGVyaWFsOkNjLE1lc2hQaHlzaWNhbE1hdGVyaWFsOmFlLE1lc2hTdGFuZGFyZE1hdGVyaWFsOlVjLE1lc2hQaG9uZ01hdGVyaWFsOkRjLE1lc2hUb29uTWF0ZXJpYWw6YmUsTWVzaE5vcm1hbE1hdGVyaWFsOmNlLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ZGUsTWVzaERlcHRoTWF0ZXJpYWw6eWQsCk1lc2hEaXN0YW5jZU1hdGVyaWFsOnpkLE1lc2hCYXNpY01hdGVyaWFsOk4sTWVzaE1hdGNhcE1hdGVyaWFsOmVlLExpbmVEYXNoZWRNYXRlcmlhbDpmZSxMaW5lQmFzaWNNYXRlcmlhbDpGYixNYXRlcmlhbDpTfSksVmI9e2FycmF5U2xpY2U6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBWYi5pc1R5cGVkQXJyYXkoYSk/bmV3IGEuY29uc3RydWN0b3IoYS5zdWJhcnJheShjLHZvaWQgMCE9PWU/ZTphLmxlbmd0aCkpOmEuc2xpY2UoYyxlKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4hYXx8IWUmJmEuY29uc3RydWN0b3I9PT1jP2E6Im51bWJlciI9PT10eXBlb2YgYy5CWVRFU19QRVJfRUxFTUVOVD9uZXcgYyhhKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKX0saXNUeXBlZEFycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkmJiEoYSBpbnN0YW5jZW9mIERhdGFWaWV3KX0sZ2V0S2V5ZnJhbWVPcmRlcjpmdW5jdGlvbihhKXtmb3IodmFyIGM9CmEubGVuZ3RoLGU9QXJyYXkoYyksZz0wO2chPT1jOysrZyllW2ddPWc7ZS5zb3J0KGZ1bmN0aW9uKHQsdil7cmV0dXJuIGFbdF0tYVt2XX0pO3JldHVybiBlfSxzb3J0ZWRBcnJheTpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPWEubGVuZ3RoLHQ9bmV3IGEuY29uc3RydWN0b3IoZyksdj0wLHo9MDt6IT09ZzsrK3YpZm9yKHZhciBFPWVbdl0qYyxGPTA7RiE9PWM7KytGKXRbeisrXT1hW0UrRl07cmV0dXJuIHR9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKGEsYyxlLGcpe2Zvcih2YXIgdD0xLHY9YVswXTt2b2lkIDAhPT12JiZ2b2lkIDA9PT12W2ddOyl2PWFbdCsrXTtpZih2b2lkIDAhPT12KXt2YXIgej12W2ddO2lmKHZvaWQgMCE9PXopaWYoQXJyYXkuaXNBcnJheSh6KSl7ZG8gej12W2ddLHZvaWQgMCE9PXomJihjLnB1c2godi50aW1lKSxlLnB1c2guYXBwbHkoZSx6KSksdj1hW3QrK107d2hpbGUodm9pZCAwIT09dil9ZWxzZSBpZih2b2lkIDAhPT16LnRvQXJyYXkpe2RvIHo9dltnXSwKdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLHoudG9BcnJheShlLGUubGVuZ3RoKSksdj1hW3QrK107d2hpbGUodm9pZCAwIT09dil9ZWxzZXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaCh6KSksdj1hW3QrK107d2hpbGUodm9pZCAwIT09dil9fX19O09iamVjdC5hc3NpZ24ocmMucHJvdG90eXBlLHtldmFsdWF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxlPXRoaXMuX2NhY2hlZEluZGV4LGc9Y1tlXSx0PWNbZS0xXTthOntiOntjOntkOmlmKCEoYTxnKSl7Zm9yKHZhciB2PWUrMjs7KXtpZih2b2lkIDA9PT1nKXtpZihhPHQpYnJlYWsgZDt0aGlzLl9jYWNoZWRJbmRleD1lPWMubGVuZ3RoO3JldHVybiB0aGlzLmFmdGVyRW5kXyhlLTEsYSx0KX1pZihlPT09dilicmVhazt0PWc7Zz1jWysrZV07aWYoYTxnKWJyZWFrIGJ9Zz1jLmxlbmd0aDticmVhayBjfWlmKGE+PXQpYnJlYWsgYTtlbHNle3Y9Y1sxXTthPHYmJgooZT0yLHQ9dik7Zm9yKHY9ZS0yOzspe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxhLGcpO2lmKGU9PT12KWJyZWFrO2c9dDt0PWNbLS1lLTFdO2lmKGE+PXQpYnJlYWsgYn1nPWU7ZT0wfX1mb3IoO2U8ZzspdD1lK2c+Pj4xLGE8Y1t0XT9nPXQ6ZT10KzE7Zz1jW2VdO3Q9Y1tlLTFdO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxhLGcpO2lmKHZvaWQgMD09PWcpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGgsdGhpcy5hZnRlckVuZF8oZS0xLHQsYSl9dGhpcy5fY2FjaGVkSW5kZXg9ZTt0aGlzLmludGVydmFsQ2hhbmdlZF8oZSx0LGcpfXJldHVybiB0aGlzLmludGVycG9sYXRlXyhlLHQsYSxnKX0sc2V0dGluZ3M6bnVsbCxEZWZhdWx0U2V0dGluZ3NfOnt9LGdldFNldHRpbmdzXzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfHwKdGhpcy5EZWZhdWx0U2V0dGluZ3NffSxjb3B5U2FtcGxlVmFsdWVfOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucmVzdWx0QnVmZmVyLGU9dGhpcy5zYW1wbGVWYWx1ZXMsZz10aGlzLnZhbHVlU2l6ZTthKj1nO2Zvcih2YXIgdD0wO3QhPT1nOysrdCljW3RdPWVbYSt0XTtyZXR1cm4gY30saW50ZXJwb2xhdGVfOmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIik7fSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKCl7fX0pO09iamVjdC5hc3NpZ24ocmMucHJvdG90eXBlLHtiZWZvcmVTdGFydF86cmMucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sYWZ0ZXJFbmRfOnJjLnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVffSk7SGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShyYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIZyxEZWZhdWx0U2V0dGluZ3NfOntlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsdD1hLTIsdj1hKzEsej1nW3RdLEU9Z1t2XTtpZih2b2lkIDA9PT16KXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIDI0MDE6dD1hO3o9MipjLWU7YnJlYWs7Y2FzZSAyNDAyOnQ9Zy5sZW5ndGgtMjt6PWMrZ1t0XS1nW3QrMV07YnJlYWs7ZGVmYXVsdDp0PWEsej1lfWlmKHZvaWQgMD09PUUpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIDI0MDE6dj1hO0U9MiplLWM7YnJlYWs7Y2FzZSAyNDAyOnY9MTtFPWUrZ1sxXS1nWzBdO2JyZWFrO2RlZmF1bHQ6dj1hLTEsRT1jfWE9LjUqKGUtYyk7Zz10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWEvKGMteik7dGhpcy5fd2VpZ2h0TmV4dD1hLyhFLWUpO3RoaXMuX29mZnNldFByZXY9dCpnO3RoaXMuX29mZnNldE5leHQ9dipnfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHQ9dGhpcy5yZXN1bHRCdWZmZXIsCnY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEteixGPXRoaXMuX29mZnNldFByZXYsST10aGlzLl9vZmZzZXROZXh0LE09dGhpcy5fd2VpZ2h0UHJldixQPXRoaXMuX3dlaWdodE5leHQsUT0oZS1jKS8oZy1jKTtlPVEqUTtnPWUqUTtjPS1NKmcrMipNKmUtTSpRO009KDErTSkqZysoLTEuNS0yKk0pKmUrKC0uNStNKSpRKzE7UT0oLTEtUCkqZysoMS41K1ApKmUrLjUqUTtQPVAqZy1QKmU7Zm9yKGU9MDtlIT09ejsrK2UpdFtlXT1jKnZbRitlXStNKnZbRStlXStRKnZbYStlXStQKnZbSStlXTtyZXR1cm4gdH19KTtaZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHJjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlpmLGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLnJlc3VsdEJ1ZmZlcix2PXRoaXMuc2FtcGxlVmFsdWVzLHo9dGhpcy52YWx1ZVNpemU7YSo9ejt2YXIgRT1hLXo7Yz0oZS1jKS8oZy0KYyk7ZT0xLWM7Zm9yKGc9MDtnIT09ejsrK2cpdFtnXT12W0UrZ10qZSt2W2ErZ10qYztyZXR1cm4gdH19KTtJZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHJjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOklnLGludGVycG9sYXRlXzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGEtMSl9fSk7T2JqZWN0LmFzc2lnbihaYix7dG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPWEuY29uc3RydWN0b3I7aWYodm9pZCAwIT09Yy50b0pTT04pYz1jLnRvSlNPTihhKTtlbHNle2M9e25hbWU6YS5uYW1lLHRpbWVzOlZiLmNvbnZlcnRBcnJheShhLnRpbWVzLEFycmF5KSx2YWx1ZXM6VmIuY29udmVydEFycmF5KGEudmFsdWVzLEFycmF5KX07dmFyIGU9YS5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PWEuRGVmYXVsdEludGVycG9sYXRpb24mJihjLmludGVycG9sYXRpb249ZSl9Yy50eXBlPWEuVmFsdWVUeXBlTmFtZTtyZXR1cm4gY319KTtPYmplY3QuYXNzaWduKFpiLnByb3RvdHlwZSwKe2NvbnN0cnVjdG9yOlpiLFRpbWVCdWZmZXJUeXBlOkZsb2F0MzJBcnJheSxWYWx1ZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFpmKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSGcodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxzZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDIzMDA6dmFyIGM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKYnJlYWs7Y2FzZSAyMzAxOmM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAyMzAyOmM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09Yyl7Yz0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KWlmKGEhPT10aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKXRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTtlbHNlIHRocm93IEVycm9yKGMpO2NvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLGMpO3JldHVybiB0aGlzfXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9YztyZXR1cm4gdGhpc30sZ2V0SW50ZXJwb2xhdGlvbjpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNyZWF0ZUludGVycG9sYW50KXtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6cmV0dXJuIDIzMDA7CmNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIDIzMDE7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gMjMwMn19LGdldFZhbHVlU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9LHNoaWZ0OmZ1bmN0aW9uKGEpe2lmKDAhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKz1hO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtpZigxIT09YSlmb3IodmFyIGM9dGhpcy50aW1lcyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2UpY1tlXSo9YTtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnRpbWVzLGc9ZS5sZW5ndGgsdD0wLHY9Zy0xO3QhPT1nJiZlW3RdPGE7KSsrdDtmb3IoOy0xIT09diYmZVt2XT5jOyktLXY7Kyt2O2lmKDAhPT10fHx2IT09Zyl0Pj12JiYodj1NYXRoLm1heCh2LAoxKSx0PXYtMSksYT10aGlzLmdldFZhbHVlU2l6ZSgpLHRoaXMudGltZXM9VmIuYXJyYXlTbGljZShlLHQsdiksdGhpcy52YWx1ZXM9VmIuYXJyYXlTbGljZSh0aGlzLnZhbHVlcyx0KmEsdiphKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYT0hMCxjPXRoaXMuZ2V0VmFsdWVTaXplKCk7MCE9PWMtTWF0aC5mbG9vcihjKSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLGE9ITEpO3ZhciBlPXRoaXMudGltZXM7Yz10aGlzLnZhbHVlczt2YXIgZz1lLmxlbmd0aDswPT09ZyYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsdGhpcyksYT0hMSk7Zm9yKHZhciB0PW51bGwsdj0wO3YhPT1nO3YrKyl7dmFyIHo9ZVt2XTtpZigibnVtYmVyIj09PXR5cGVvZiB6JiZpc05hTih6KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIiwKdGhpcyx2LHopO2E9ITE7YnJlYWt9aWYobnVsbCE9PXQmJnQ+eil7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLHYseix0KTthPSExO2JyZWFrfXQ9en1pZih2b2lkIDAhPT1jJiZWYi5pc1R5cGVkQXJyYXkoYykpZm9yKHY9MCxlPWMubGVuZ3RoO3YhPT1lOysrdilpZihnPWNbdl0saXNOYU4oZykpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsdixnKTthPSExO2JyZWFrfXJldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnRpbWVzLGM9dGhpcy52YWx1ZXMsZT10aGlzLmdldFZhbHVlU2l6ZSgpLGc9MjMwMj09PXRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpLHQ9MSx2PWEubGVuZ3RoLTEsej0xO3o8djsrK3ope3ZhciBFPSExLEY9YVt6XTtpZihGIT09YVt6KzFdJiYoMSE9PXp8fEYhPT1GWzBdKSlpZihnKUU9ITA7CmVsc2V7dmFyIEk9eiplLE09SS1lLFA9SStlO2ZvcihGPTA7RiE9PWU7KytGKXt2YXIgUT1jW0krRl07aWYoUSE9PWNbTStGXXx8USE9PWNbUCtGXSl7RT0hMDticmVha319fWlmKEUpe2lmKHohPT10KWZvcihhW3RdPWFbel0sRT16KmUsST10KmUsRj0wO0YhPT1lOysrRiljW0krRl09Y1tFK0ZdOysrdH19aWYoMDx2KXthW3RdPWFbdl07RT12KmU7ST10KmU7Zm9yKEY9MDtGIT09ZTsrK0YpY1tJK0ZdPWNbRStGXTsrK3R9dCE9PWEubGVuZ3RoJiYodGhpcy50aW1lcz1WYi5hcnJheVNsaWNlKGEsMCx0KSx0aGlzLnZhbHVlcz1WYi5hcnJheVNsaWNlKGMsMCx0KmUpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1WYi5hcnJheVNsaWNlKHRoaXMudGltZXMsMCksYz1WYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLDApO2E9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLGEsYyk7YS5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50O3JldHVybiBhfX0pOwpKZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpnLFZhbHVlVHlwZU5hbWU6ImJvb2wiLFZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO0tnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6S2csVmFsdWVUeXBlTmFtZToiY29sb3IifSk7VWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShaYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpVZSxWYWx1ZVR5cGVOYW1lOiJudW1iZXIifSk7TGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShyYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMZyxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYSwKYyxlLGcpe3ZhciB0PXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O2M9KGUtYykvKGctYyk7Zm9yKGU9YSt6O2EhPT1lO2ErPTQpaC5zbGVycEZsYXQodCwwLHYsYS16LHYsYSxjKTtyZXR1cm4gdH19KTskZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRmLFZhbHVlVHlwZU5hbWU6InF1YXRlcm5pb24iLERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgTGcodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7TWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShaYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpNZyxWYWx1ZVR5cGVOYW1lOiJzdHJpbmciLApWYWx1ZUJ1ZmZlclR5cGU6QXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtWZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZlLFZhbHVlVHlwZU5hbWU6InZlY3RvciJ9KTtPYmplY3QuYXNzaWduKHZjLHtwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT1hLnRyYWNrcyxnPTEvKGEuZnBzfHwxKSx0PTAsdj1lLmxlbmd0aDt0IT09djsrK3QpYy5wdXNoKEltKGVbdF0pLnNjYWxlKGcpKTtyZXR1cm4gbmV3IHZjKGEubmFtZSxhLmR1cmF0aW9uLGMpfSx0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT1hLnRyYWNrczthPXtuYW1lOmEubmFtZSxkdXJhdGlvbjphLmR1cmF0aW9uLHRyYWNrczpjLHV1aWQ6YS51dWlkfTtmb3IodmFyIGc9MCx0PWUubGVuZ3RoO2chPT0KdDsrK2cpYy5wdXNoKFpiLnRvSlNPTihlW2ddKSk7cmV0dXJuIGF9LENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOmZ1bmN0aW9uKGEsYyxlLGcpe2Zvcih2YXIgdD1jLmxlbmd0aCx2PVtdLHo9MDt6PHQ7eisrKXt2YXIgRT1bXSxGPVtdO0UucHVzaCgoeit0LTEpJXQseiwoeisxKSV0KTtGLnB1c2goMCwxLDApO3ZhciBJPVZiLmdldEtleWZyYW1lT3JkZXIoRSk7RT1WYi5zb3J0ZWRBcnJheShFLDEsSSk7Rj1WYi5zb3J0ZWRBcnJheShGLDEsSSk7Z3x8MCE9PUVbMF18fChFLnB1c2godCksRi5wdXNoKEZbMF0pKTt2LnB1c2goKG5ldyBVZSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2Nbel0ubmFtZSsiXSIsRSxGKSkuc2NhbGUoMS9lKSl9cmV0dXJuIG5ldyB2YyhhLC0xLHYpfSxmaW5kQnlOYW1lOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YTtBcnJheS5pc0FycmF5KGEpfHwoZT1hLmdlb21ldHJ5JiZhLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGEuYW5pbWF0aW9ucyk7Zm9yKGE9CjA7YTxlLmxlbmd0aDthKyspaWYoZVthXS5uYW1lPT09YylyZXR1cm4gZVthXTtyZXR1cm4gbnVsbH0sQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6ZnVuY3Rpb24oYSxjLGUpe2Zvcih2YXIgZz17fSx0PS9eKFtcdy1dKj8pKFtcZF0rKSQvLHY9MCx6PWEubGVuZ3RoO3Y8ejt2Kyspe3ZhciBFPWFbdl0sRj1FLm5hbWUubWF0Y2godCk7aWYoRiYmMTxGLmxlbmd0aCl7dmFyIEk9RlsxXTsoRj1nW0ldKXx8KGdbSV09Rj1bXSk7Ri5wdXNoKEUpfX1hPVtdO2ZvcihJIGluIGcpYS5wdXNoKHZjLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKEksZ1tJXSxjLGUpKTtyZXR1cm4gYX0scGFyc2VBbmltYXRpb246ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKGVhLGRhLHJhLHBhLHFhKXtpZigwIT09cmEubGVuZ3RoKXt2YXIgdWE9W10sbmE9W107VmIuZmxhdHRlbkpTT04ocmEsdWEsbmEscGEpOzAhPT11YS5sZW5ndGgmJnFhLnB1c2gobmV3IGVhKGRhLHVhLG5hKSl9fQppZighYSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO3ZhciBnPVtdLHQ9YS5uYW1lfHwiZGVmYXVsdCIsdj1hLmxlbmd0aHx8LTEsej1hLmZwc3x8MzA7YT1hLmhpZXJhcmNoeXx8W107Zm9yKHZhciBFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBGPWFbRV0ua2V5cztpZihGJiYwIT09Ri5sZW5ndGgpaWYoRlswXS5tb3JwaFRhcmdldHMpe3Y9e307Zm9yKHZhciBJPTA7STxGLmxlbmd0aDtJKyspaWYoRltJXS5tb3JwaFRhcmdldHMpZm9yKHZhciBNPTA7TTxGW0ldLm1vcnBoVGFyZ2V0cy5sZW5ndGg7TSsrKXZbRltJXS5tb3JwaFRhcmdldHNbTV1dPS0xO2Zvcih2YXIgUCBpbiB2KXt2YXIgUT1bXSxVPVtdO2ZvcihNPTA7TSE9PUZbSV0ubW9ycGhUYXJnZXRzLmxlbmd0aDsrK00pe3ZhciBWPUZbSV07US5wdXNoKFYudGltZSk7VS5wdXNoKFYubW9ycGhUYXJnZXQ9PT1QPzE6MCl9Zy5wdXNoKG5ldyBVZSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIrClArIl0iLFEsVSkpfXY9di5sZW5ndGgqKHp8fDEpfWVsc2UgST0iLmJvbmVzWyIrY1tFXS5uYW1lKyJdIixlKFZlLEkrIi5wb3NpdGlvbiIsRiwicG9zIixnKSxlKCRmLEkrIi5xdWF0ZXJuaW9uIixGLCJyb3QiLGcpLGUoVmUsSSsiLnNjYWxlIixGLCJzY2wiLGcpfXJldHVybiAwPT09Zy5sZW5ndGg/bnVsbDpuZXcgdmModCx2LGcpfX0pO09iamVjdC5hc3NpZ24odmMucHJvdG90eXBlLHtyZXNldER1cmF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz0wLGU9dGhpcy50cmFja3MubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9dGhpcy50cmFja3NbY107YT1NYXRoLm1heChhLGcudGltZXNbZy50aW1lcy5sZW5ndGgtMV0pfXRoaXMuZHVyYXRpb249YTtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMCxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWE9YSYmdGhpcy50cmFja3NbY10udmFsaWRhdGUoKTtyZXR1cm4gYX0sb3B0aW1pemU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMudHJhY2tzLmxlbmd0aDthKyspdGhpcy50cmFja3NbYV0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYz0wO2M8dGhpcy50cmFja3MubGVuZ3RoO2MrKylhLnB1c2godGhpcy50cmFja3NbY10uY2xvbmUoKSk7cmV0dXJuIG5ldyB2Yyh0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbixhKX19KTt2YXIga2U9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKGEsYyl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW2FdPWMpfSxnZXQ6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbYV19LHJlbW92ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5maWxlc1thXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPQp7fX19LFhqPW5ldyBlaTtPYmplY3QuYXNzaWduKERiLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbigpe30scGFyc2U6ZnVuY3Rpb24oKXt9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKGEpe3RoaXMuY3Jvc3NPcmlnaW49YTtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihhKXt0aGlzLnBhdGg9YTtyZXR1cm4gdGhpc30sc2V0UmVzb3VyY2VQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucmVzb3VyY2VQYXRoPWE7cmV0dXJuIHRoaXN9fSk7RGIuSGFuZGxlcnM9e2hhbmRsZXJzOltdLGFkZDpmdW5jdGlvbihhLGMpe3RoaXMuaGFuZGxlcnMucHVzaChhLGMpfSxnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuaGFuZGxlcnMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrPTIpe3ZhciB0PWNbZSsxXTtpZihjW2VdLnRlc3QoYSkpcmV0dXJuIHR9cmV0dXJuIG51bGx9fTt2YXIgTWM9e307d2MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp3YywKbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2b2lkIDA9PT1hJiYoYT0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYT10aGlzLnBhdGgrYSk7YT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChhKTt2YXIgdD10aGlzLHY9a2UuZ2V0KGEpO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHQubWFuYWdlci5pdGVtU3RhcnQoYSksc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmModik7dC5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApLHY7aWYodm9pZCAwIT09TWNbYV0pTWNbYV0ucHVzaCh7b25Mb2FkOmMsb25Qcm9ncmVzczplLG9uRXJyb3I6Z30pO2Vsc2V7dmFyIHo9YS5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7aWYoeil7ZT16WzFdO3ZhciBFPSEhelsyXTt6PXpbM107ej1kZWNvZGVVUklDb21wb25lbnQoeik7RSYmKHo9YXRvYih6KSk7dHJ5e3ZhciBGPSh0aGlzLnJlc3BvbnNlVHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKEYpe2Nhc2UgImFycmF5YnVmZmVyIjpjYXNlICJibG9iIjp2YXIgST0KbmV3IFVpbnQ4QXJyYXkoei5sZW5ndGgpO2ZvcihFPTA7RTx6Lmxlbmd0aDtFKyspSVtFXT16LmNoYXJDb2RlQXQoRSk7dmFyIE09ImJsb2IiPT09Rj9uZXcgQmxvYihbSS5idWZmZXJdLHt0eXBlOmV9KTpJLmJ1ZmZlcjticmVhaztjYXNlICJkb2N1bWVudCI6TT0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHosZSk7YnJlYWs7Y2FzZSAianNvbiI6TT1KU09OLnBhcnNlKHopO2JyZWFrO2RlZmF1bHQ6TT16fXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKE0pO3QubWFuYWdlci5pdGVtRW5kKGEpfSwwKX1jYXRjaChRKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyYmZyhRKTt0Lm1hbmFnZXIuaXRlbUVycm9yKGEpO3QubWFuYWdlci5pdGVtRW5kKGEpfSwwKX19ZWxzZXtNY1thXT1bXTtNY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7dmFyIFA9bmV3IFhNTEh0dHBSZXF1ZXN0O1Aub3BlbigiR0VUIixhLCEwKTtQLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLApmdW5jdGlvbihRKXt2YXIgVT10aGlzLnJlc3BvbnNlO2tlLmFkZChhLFUpO3ZhciBWPU1jW2FdO2RlbGV0ZSBNY1thXTtpZigyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKTtmb3IodmFyIGVhPTAsZGE9Vi5sZW5ndGg7ZWE8ZGE7ZWErKyl7dmFyIHJhPVZbZWFdO2lmKHJhLm9uTG9hZClyYS5vbkxvYWQoVSl9fWVsc2V7ZWE9MDtmb3IoZGE9Vi5sZW5ndGg7ZWE8ZGE7ZWErKylpZihyYT1WW2VhXSxyYS5vbkVycm9yKXJhLm9uRXJyb3IoUSk7dC5tYW5hZ2VyLml0ZW1FcnJvcihhKX10Lm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO1AuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGZ1bmN0aW9uKFEpe2Zvcih2YXIgVT1NY1thXSxWPTAsZWE9VS5sZW5ndGg7VjxlYTtWKyspe3ZhciBkYT1VW1ZdO2lmKGRhLm9uUHJvZ3Jlc3MpZGEub25Qcm9ncmVzcyhRKX19LAohMSk7UC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oUSl7dmFyIFU9TWNbYV07ZGVsZXRlIE1jW2FdO2Zvcih2YXIgVj0wLGVhPVUubGVuZ3RoO1Y8ZWE7VisrKXt2YXIgZGE9VVtWXTtpZihkYS5vbkVycm9yKWRhLm9uRXJyb3IoUSl9dC5tYW5hZ2VyLml0ZW1FcnJvcihhKTt0Lm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO1AuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKFEpe3ZhciBVPU1jW2FdO2RlbGV0ZSBNY1thXTtmb3IodmFyIFY9MCxlYT1VLmxlbmd0aDtWPGVhO1YrKyl7dmFyIGRhPVVbVl07aWYoZGEub25FcnJvcilkYS5vbkVycm9yKFEpfXQubWFuYWdlci5pdGVtRXJyb3IoYSk7dC5tYW5hZ2VyLml0ZW1FbmQoYSl9LCExKTt2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKFAucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKTt2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKFAud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKTsKUC5vdmVycmlkZU1pbWVUeXBlJiZQLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKEUgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKVAuc2V0UmVxdWVzdEhlYWRlcihFLHRoaXMucmVxdWVzdEhlYWRlcltFXSk7UC5zZW5kKG51bGwpfXQubWFuYWdlci5pdGVtU3RhcnQoYSk7cmV0dXJuIFB9fSxzZXRSZXNwb25zZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5yZXNwb25zZVR5cGU9YTtyZXR1cm4gdGhpc30sc2V0V2l0aENyZWRlbnRpYWxzOmZ1bmN0aW9uKGEpe3RoaXMud2l0aENyZWRlbnRpYWxzPWE7cmV0dXJuIHRoaXN9LHNldE1pbWVUeXBlOmZ1bmN0aW9uKGEpe3RoaXMubWltZVR5cGU9YTtyZXR1cm4gdGhpc30sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhKXt0aGlzLnJlcXVlc3RIZWFkZXI9YTtyZXR1cm4gdGhpc319KTtmaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpmaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PXRoaXMsdj1uZXcgd2ModC5tYW5hZ2VyKTt2LnNldFBhdGgodC5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHQucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz12Yy5wYXJzZShhW2VdKTtjLnB1c2goZyl9cmV0dXJuIGN9fSk7Z2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpnaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHQoUSl7Ri5sb2FkKGFbUV0sZnVuY3Rpb24oVSl7VT12Ll9wYXJzZXIoVSwhMCk7eltRXT17d2lkdGg6VS53aWR0aCxoZWlnaHQ6VS5oZWlnaHQsZm9ybWF0OlUuZm9ybWF0LG1pcG1hcHM6VS5taXBtYXBzfTtJKz0xOzY9PT1JJiYoMT09PVUubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0KMTAwNiksRS5mb3JtYXQ9VS5mb3JtYXQsRS5uZWVkc1VwZGF0ZT0hMCxjJiZjKEUpKX0sZSxnKX12YXIgdj10aGlzLHo9W10sRT1uZXcgRmU7RS5pbWFnZT16O3ZhciBGPW5ldyB3Yyh0aGlzLm1hbmFnZXIpO0Yuc2V0UGF0aCh0aGlzLnBhdGgpO0Yuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBJPTAsTT0wLFA9YS5sZW5ndGg7TTxQOysrTSl0KE0pO2Vsc2UgRi5sb2FkKGEsZnVuY3Rpb24oUSl7UT12Ll9wYXJzZXIoUSwhMCk7aWYoUS5pc0N1YmVtYXApZm9yKHZhciBVPVEubWlwbWFwcy5sZW5ndGgvUS5taXBtYXBDb3VudCxWPTA7VjxVO1YrKyl7eltWXT17bWlwbWFwczpbXX07Zm9yKHZhciBlYT0wO2VhPFEubWlwbWFwQ291bnQ7ZWErKyl6W1ZdLm1pcG1hcHMucHVzaChRLm1pcG1hcHNbVipRLm1pcG1hcENvdW50K2VhXSkseltWXS5mb3JtYXQ9US5mb3JtYXQseltWXS53aWR0aD1RLndpZHRoLHpbVl0uaGVpZ2h0PVEuaGVpZ2h0fWVsc2UgRS5pbWFnZS53aWR0aD0KUS53aWR0aCxFLmltYWdlLmhlaWdodD1RLmhlaWdodCxFLm1pcG1hcHM9US5taXBtYXBzOzE9PT1RLm1pcG1hcENvdW50JiYoRS5taW5GaWx0ZXI9MTAwNik7RS5mb3JtYXQ9US5mb3JtYXQ7RS5uZWVkc1VwZGF0ZT0hMDtjJiZjKEUpfSxlLGcpO3JldHVybiBFfX0pO05nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TmcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLHY9bmV3IEFiLHo9bmV3IHdjKHRoaXMubWFuYWdlcik7ei5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ei5zZXRQYXRoKHRoaXMucGF0aCk7ei5sb2FkKGEsZnVuY3Rpb24oRSl7aWYoRT10Ll9wYXJzZXIoRSkpdm9pZCAwIT09RS5pbWFnZT92LmltYWdlPUUuaW1hZ2U6dm9pZCAwIT09RS5kYXRhJiYodi5pbWFnZS53aWR0aD1FLndpZHRoLHYuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LHYuaW1hZ2UuZGF0YT1FLmRhdGEpLHYud3JhcFM9CnZvaWQgMCE9PUUud3JhcFM/RS53cmFwUzoxMDAxLHYud3JhcFQ9dm9pZCAwIT09RS53cmFwVD9FLndyYXBUOjEwMDEsdi5tYWdGaWx0ZXI9dm9pZCAwIT09RS5tYWdGaWx0ZXI/RS5tYWdGaWx0ZXI6MTAwNix2Lm1pbkZpbHRlcj12b2lkIDAhPT1FLm1pbkZpbHRlcj9FLm1pbkZpbHRlcjoxMDA4LHYuYW5pc290cm9weT12b2lkIDAhPT1FLmFuaXNvdHJvcHk/RS5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09RS5mb3JtYXQmJih2LmZvcm1hdD1FLmZvcm1hdCksdm9pZCAwIT09RS50eXBlJiYodi50eXBlPUUudHlwZSksdm9pZCAwIT09RS5taXBtYXBzJiYodi5taXBtYXBzPUUubWlwbWFwcyksMT09PUUubWlwbWFwQ291bnQmJih2Lm1pbkZpbHRlcj0xMDA2KSx2Lm5lZWRzVXBkYXRlPSEwLGMmJmModixFKX0sZSxnKTtyZXR1cm4gdn19KTtXZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldlLGxvYWQ6ZnVuY3Rpb24oYSwKYyxlLGcpe2Z1bmN0aW9uIHQoKXtGLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHQsITEpO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpO2tlLmFkZChhLHRoaXMpO2MmJmModGhpcyk7ei5tYW5hZ2VyLml0ZW1FbmQoYSl9ZnVuY3Rpb24gdihJKXtGLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHQsITEpO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpO2cmJmcoSSk7ei5tYW5hZ2VyLml0ZW1FcnJvcihhKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX12b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciB6PXRoaXMsRT1rZS5nZXQoYSk7aWYodm9pZCAwIT09RSlyZXR1cm4gei5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyhFKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX0sMCksRTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAoiaW1nIik7Ri5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix0LCExKTtGLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix2LCExKTsiZGF0YToiIT09YS5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKEYuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbik7ei5tYW5hZ2VyLml0ZW1TdGFydChhKTtGLnNyYz1hO3JldHVybiBGfX0pO09nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6T2csbG9hZDpmdW5jdGlvbihhLGMsZSxnKXtmdW5jdGlvbiB0KEYpe3oubG9hZChhW0ZdLGZ1bmN0aW9uKEkpe3YuaW1hZ2VzW0ZdPUk7RSsrOzY9PT1FJiYodi5uZWVkc1VwZGF0ZT0hMCxjJiZjKHYpKX0sdm9pZCAwLGcpfXZhciB2PW5ldyBlZCx6PW5ldyBXZSh0aGlzLm1hbmFnZXIpO3ouc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7ei5zZXRQYXRoKHRoaXMucGF0aCk7dmFyIEU9MDtmb3IoZT0KMDtlPGEubGVuZ3RoOysrZSl0KGUpO3JldHVybiB2fX0pO1BnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UGcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD1uZXcgbCx2PW5ldyBXZSh0aGlzLm1hbmFnZXIpO3Yuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7dC5pbWFnZT16O3o9MDxhLnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKXx8MD09PWEuc2VhcmNoKC9eZGF0YTppbWFnZVwvanBlZy8pO3QuZm9ybWF0PXo/MTAyMjoxMDIzO3QubmVlZHNVcGRhdGU9ITA7dm9pZCAwIT09YyYmYyh0KX0sZSxnKTtyZXR1cm4gdH19KTtPYmplY3QuYXNzaWduKFphLnByb3RvdHlwZSx7Z2V0UG9pbnQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIik7cmV0dXJuIG51bGx9LApnZXRQb2ludEF0OmZ1bmN0aW9uKGEsYyl7YT10aGlzLmdldFV0b1RtYXBwaW5nKGEpO3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9LGdldFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50KGUvYSkpO3JldHVybiBjfSxnZXRTcGFjZWRQb2ludHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9NSk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludEF0KGUvYSkpO3JldHVybiBjfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sZ2V0TGVuZ3RoczpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyk7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PWErMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwp0aGlzLm5lZWRzVXBkYXRlPSExO3ZhciBjPVtdLGU9dGhpcy5nZXRQb2ludCgwKSxnLHQ9MDtjLnB1c2goMCk7Zm9yKGc9MTtnPD1hO2crKyl7dmFyIHY9dGhpcy5nZXRQb2ludChnL2EpO3QrPXYuZGlzdGFuY2VUbyhlKTtjLnB1c2godCk7ZT12fXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1jfSx1cGRhdGVBcmNMZW5ndGhzOmZ1bmN0aW9uKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdldExlbmd0aHMoKX0sZ2V0VXRvVG1hcHBpbmc6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmdldExlbmd0aHMoKSxnPWUubGVuZ3RoO2M9Yz9jOmEqZVtnLTFdO2Zvcih2YXIgdD0wLHY9Zy0xLHo7dDw9djspaWYoYT1NYXRoLmZsb29yKHQrKHYtdCkvMiksej1lW2FdLWMsMD56KXQ9YSsxO2Vsc2UgaWYoMDx6KXY9YS0xO2Vsc2V7dj1hO2JyZWFrfWE9djtpZihlW2FdPT09YylyZXR1cm4gYS8oZy0xKTt0PWVbYV07cmV0dXJuKGErKGMtdCkvKGVbYSsxXS10KSkvKGctMSl9LGdldFRhbmdlbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9CmEtMUUtNDthKz0xRS00OzA+YyYmKGM9MCk7MTxhJiYoYT0xKTtjPXRoaXMuZ2V0UG9pbnQoYyk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSkuY2xvbmUoKS5zdWIoYykubm9ybWFsaXplKCl9LGdldFRhbmdlbnRBdDpmdW5jdGlvbihhKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChhKX0sY29tcHV0ZUZyZW5ldEZyYW1lczpmdW5jdGlvbihhLGMpe3ZhciBlPW5ldyBrLGc9W10sdD1bXSx2PVtdLHo9bmV3IGssRT1uZXcgcSxGO2ZvcihGPTA7Rjw9YTtGKyspe3ZhciBJPUYvYTtnW0ZdPXRoaXMuZ2V0VGFuZ2VudEF0KEkpO2dbRl0ubm9ybWFsaXplKCl9dFswXT1uZXcgazt2WzBdPW5ldyBrO0Y9TnVtYmVyLk1BWF9WQUxVRTtJPU1hdGguYWJzKGdbMF0ueCk7dmFyIE09TWF0aC5hYnMoZ1swXS55KSxQPU1hdGguYWJzKGdbMF0ueik7STw9RiYmKEY9SSxlLnNldCgxLDAsMCkpO008PUYmJihGPU0sZS5zZXQoMCwxLDApKTtQPD1GJiZlLnNldCgwLAowLDEpO3ouY3Jvc3NWZWN0b3JzKGdbMF0sZSkubm9ybWFsaXplKCk7dFswXS5jcm9zc1ZlY3RvcnMoZ1swXSx6KTt2WzBdLmNyb3NzVmVjdG9ycyhnWzBdLHRbMF0pO2ZvcihGPTE7Rjw9YTtGKyspdFtGXT10W0YtMV0uY2xvbmUoKSx2W0ZdPXZbRi0xXS5jbG9uZSgpLHouY3Jvc3NWZWN0b3JzKGdbRi0xXSxnW0ZdKSx6Lmxlbmd0aCgpPk51bWJlci5FUFNJTE9OJiYoei5ub3JtYWxpemUoKSxlPU1hdGguYWNvcyhoYi5jbGFtcChnW0YtMV0uZG90KGdbRl0pLC0xLDEpKSx0W0ZdLmFwcGx5TWF0cml4NChFLm1ha2VSb3RhdGlvbkF4aXMoeixlKSkpLHZbRl0uY3Jvc3NWZWN0b3JzKGdbRl0sdFtGXSk7aWYoITA9PT1jKWZvcihlPU1hdGguYWNvcyhoYi5jbGFtcCh0WzBdLmRvdCh0W2FdKSwtMSwxKSksZS89YSwwPGdbMF0uZG90KHouY3Jvc3NWZWN0b3JzKHRbMF0sdFthXSkpJiYoZT0tZSksRj0xO0Y8PWE7RisrKXRbRl0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyhnW0ZdLAplKkYpKSx2W0ZdLmNyb3NzVmVjdG9ycyhnW0ZdLHRbRl0pO3JldHVybnt0YW5nZW50czpnLG5vcm1hbHM6dCxiaW5vcm1hbHM6dn19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTthLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9uczthLnR5cGU9dGhpcy50eXBlO3JldHVybiBhfSxmcm9tSlNPTjpmdW5jdGlvbihhKXt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz1hLmFyY0xlbmd0aERpdmlzaW9ucztyZXR1cm4gdGhpc319KTtzYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO3NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0Kc2M7c2MucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlPSEwO3NjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7Zm9yKHZhciBlPTIqTWF0aC5QSSxnPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGUsdD1NYXRoLmFicyhnKTxOdW1iZXIuRVBTSUxPTjswPmc7KWcrPWU7Zm9yKDtnPmU7KWctPWU7ZzxOdW1iZXIuRVBTSUxPTiYmKGc9dD8wOmUpOyEwIT09dGhpcy5hQ2xvY2t3aXNlfHx0fHwoZz1nPT09ZT8tZTpnLWUpO2U9dGhpcy5hU3RhcnRBbmdsZSthKmc7YT10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhlKTt2YXIgdj10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihlKTswIT09dGhpcy5hUm90YXRpb24mJihlPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxnPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSx0PWEtdGhpcy5hWCx2LT10aGlzLmFZLGE9dCplLXYqZyt0aGlzLmFYLHY9dCpnK3YqZSt0aGlzLmFZKTtyZXR1cm4gYy5zZXQoYSwKdil9O3NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmFYPWEuYVg7dGhpcy5hWT1hLmFZO3RoaXMueFJhZGl1cz1hLnhSYWRpdXM7dGhpcy55UmFkaXVzPWEueVJhZGl1czt0aGlzLmFTdGFydEFuZ2xlPWEuYVN0YXJ0QW5nbGU7dGhpcy5hRW5kQW5nbGU9YS5hRW5kQW5nbGU7dGhpcy5hQ2xvY2t3aXNlPWEuYUNsb2Nrd2lzZTt0aGlzLmFSb3RhdGlvbj1hLmFSb3RhdGlvbjtyZXR1cm4gdGhpc307c2MucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLmFYPXRoaXMuYVg7YS5hWT10aGlzLmFZO2EueFJhZGl1cz10aGlzLnhSYWRpdXM7YS55UmFkaXVzPXRoaXMueVJhZGl1czthLmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGU7YS5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGU7YS5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZTthLmFSb3RhdGlvbj0KdGhpcy5hUm90YXRpb247cmV0dXJuIGF9O3NjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtYZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzYy5wcm90b3R5cGUpO1hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZTtYZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZT0hMDt2YXIgQWg9bmV3IGssUWk9bmV3IGhpLFJpPW5ldyBoaSxTaT1uZXcgaGk7YmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtiYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YmM7CmJjLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTM9ITA7YmMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazt2YXIgZT10aGlzLnBvaW50cyxnPWUubGVuZ3RoO2EqPWctKHRoaXMuY2xvc2VkPzA6MSk7dmFyIHQ9TWF0aC5mbG9vcihhKTthLT10O3RoaXMuY2xvc2VkP3QrPTA8dD8wOihNYXRoLmZsb29yKE1hdGguYWJzKHQpL2cpKzEpKmc6MD09PWEmJnQ9PT1nLTEmJih0PWctMixhPTEpO2lmKHRoaXMuY2xvc2VkfHwwPHQpdmFyIHY9ZVsodC0xKSVnXTtlbHNlIEFoLnN1YlZlY3RvcnMoZVswXSxlWzFdKS5hZGQoZVswXSksdj1BaDt2YXIgej1lW3QlZ107dmFyIEU9ZVsodCsxKSVnXTt0aGlzLmNsb3NlZHx8dCsyPGc/ZT1lWyh0KzIpJWddOihBaC5zdWJWZWN0b3JzKGVbZy0xXSxlW2ctMl0pLmFkZChlW2ctMV0pLGU9QWgpO2lmKCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe3ZhciBGPQoiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZT8uNTouMjU7Zz1NYXRoLnBvdyh2LmRpc3RhbmNlVG9TcXVhcmVkKHopLEYpO3Q9TWF0aC5wb3coei5kaXN0YW5jZVRvU3F1YXJlZChFKSxGKTtGPU1hdGgucG93KEUuZGlzdGFuY2VUb1NxdWFyZWQoZSksRik7MUUtND50JiYodD0xKTsxRS00PmcmJihnPXQpOzFFLTQ+RiYmKEY9dCk7UWkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueCx6LngsRS54LGUueCxnLHQsRik7UmkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueSx6LnksRS55LGUueSxnLHQsRik7U2kuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueix6LnosRS56LGUueixnLHQsRil9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYoUWkuaW5pdENhdG11bGxSb20odi54LHoueCxFLngsZS54LHRoaXMudGVuc2lvbiksUmkuaW5pdENhdG11bGxSb20odi55LHoueSxFLnksZS55LHRoaXMudGVuc2lvbiksU2kuaW5pdENhdG11bGxSb20odi56LHoueixFLnosCmUueix0aGlzLnRlbnNpb24pKTtjLnNldChRaS5jYWxjKGEpLFJpLmNhbGMoYSksU2kuY2FsYyhhKSk7cmV0dXJuIGN9O2JjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXRoaXMucG9pbnRzLnB1c2goYS5wb2ludHNbY10uY2xvbmUoKSk7dGhpcy5jbG9zZWQ9YS5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9YS5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWEudGVuc2lvbjtyZXR1cm4gdGhpc307YmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPXRoaXMucG9pbnRzLmxlbmd0aDtjPGU7YysrKWEucG9pbnRzLnB1c2godGhpcy5wb2ludHNbY10udG9BcnJheSgpKTthLmNsb3NlZD10aGlzLmNsb3NlZDthLmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZTsKYS50ZW5zaW9uPXRoaXMudGVuc2lvbjtyZXR1cm4gYX07YmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5wb2ludHNbY107dGhpcy5wb2ludHMucHVzaCgobmV3IGspLmZyb21BcnJheShnKSl9dGhpcy5jbG9zZWQ9YS5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9YS5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWEudGVuc2lvbjtyZXR1cm4gdGhpc307RWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtFYy5wcm90b3R5cGUuY29uc3RydWN0b3I9RWM7RWMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMDtFYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHQ9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYmcoYSwKZS54LGcueCx0Lngsdi54KSxiZyhhLGUueSxnLnksdC55LHYueSkpO3JldHVybiBjfTtFYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO2EudjM9dGhpcy52My50b0FycmF5KCk7cmV0dXJuIGF9O0VjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpOwp0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307VmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtWYy5wcm90b3R5cGUuY29uc3RydWN0b3I9VmM7VmMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITA7VmMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazt2YXIgZT10aGlzLnYwLGc9dGhpcy52MSx0PXRoaXMudjIsdj10aGlzLnYzO2Muc2V0KGJnKGEsZS54LGcueCx0Lngsdi54KSxiZyhhLGUueSxnLnksdC55LHYueSksYmcoYSxlLnosZy56LHQueix2LnopKTtyZXR1cm4gY307VmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3RoaXMudjMuY29weShhLnYzKTtyZXR1cm4gdGhpc307VmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPQpaYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07VmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7dGhpcy52My5mcm9tQXJyYXkoYS52Myk7cmV0dXJuIHRoaXN9O25jLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7bmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPW5jO25jLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZT0hMDtuYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmOzE9PT1hP2MuY29weSh0aGlzLnYyKTooYy5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSwKYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtuYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O25jLnByb3RvdHlwZS5nZXRUYW5nZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudjIuY2xvbmUoKS5zdWIodGhpcy52MSkubm9ybWFsaXplKCl9O25jLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtuYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYX07bmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7CnRoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0ZjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYztGYy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzPSEwO0ZjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGs7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLGMubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMudjEpKTtyZXR1cm4gY307RmMucHJvdG90eXBlLmdldFBvaW50QXQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRQb2ludChhLGMpfTtGYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTtyZXR1cm4gdGhpc307RmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTsKYS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtGYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTtyZXR1cm4gdGhpc307R2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtHYy5wcm90b3R5cGUuY29uc3RydWN0b3I9R2M7R2MucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITA7R2MucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjt2YXIgZT10aGlzLnYwLGc9dGhpcy52MSx0PXRoaXMudjI7Yy5zZXQoYWcoYSxlLngsZy54LHQueCksYWcoYSxlLnksZy55LHQueSkpO3JldHVybiBjfTtHYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApOwp0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtHYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtHYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTtyZXR1cm4gdGhpc307V2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtXYy5wcm90b3R5cGUuY29uc3RydWN0b3I9V2M7V2MucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO1djLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8Cm5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHQ9dGhpcy52MjtjLnNldChhZyhhLGUueCxnLngsdC54KSxhZyhhLGUueSxnLnksdC55KSxhZyhhLGUueixnLnosdC56KSk7cmV0dXJuIGN9O1djLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTtyZXR1cm4gdGhpc307V2MucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYX07V2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7CnRoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtIYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0hjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IYztIYy5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZT0hMDtIYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMucG9pbnRzLGc9KGUubGVuZ3RoLTEpKmE7YT1NYXRoLmZsb29yKGcpO2ctPWE7dmFyIHQ9ZVswPT09YT9hOmEtMV0sdj1lW2FdLHo9ZVthPmUubGVuZ3RoLTI/ZS5sZW5ndGgtMTphKzFdO2U9ZVthPmUubGVuZ3RoLTM/ZS5sZW5ndGgtMTphKzJdO2Muc2V0KFlqKGcsdC54LHYueCx6LngsZS54KSxZaihnLHQueSx2Lnksei55LGUueSkpO3JldHVybiBjfTtIYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzwKZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc307SGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPXRoaXMucG9pbnRzLmxlbmd0aDtjPGU7YysrKWEucG9pbnRzLnB1c2godGhpcy5wb2ludHNbY10udG9BcnJheSgpKTtyZXR1cm4gYX07SGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5wb2ludHNbY107dGhpcy5wb2ludHMucHVzaCgobmV3IGYpLmZyb21BcnJheShnKSl9cmV0dXJuIHRoaXN9O3ZhciBUaT1PYmplY3QuZnJlZXplKHtBcmNDdXJ2ZTpYZSxDYXRtdWxsUm9tQ3VydmUzOmJjLEN1YmljQmV6aWVyQ3VydmU6RWMsQ3ViaWNCZXppZXJDdXJ2ZTM6VmMsCkVsbGlwc2VDdXJ2ZTpzYyxMaW5lQ3VydmU6bmMsTGluZUN1cnZlMzpGYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpHYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6V2MsU3BsaW5lQ3VydmU6SGN9KTtpZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmlkLGFkZDpmdW5jdGlvbihhKXt0aGlzLmN1cnZlcy5wdXNoKGEpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxjPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTthLmVxdWFscyhjKXx8dGhpcy5jdXJ2ZXMucHVzaChuZXcgbmMoYyxhKSl9LGdldFBvaW50OmZ1bmN0aW9uKGEpe3ZhciBjPWEqdGhpcy5nZXRMZW5ndGgoKSxlPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7Zm9yKGE9MDthPGUubGVuZ3RoOyl7aWYoZVthXT49YylyZXR1cm4gYz1lW2FdLWMsYT10aGlzLmN1cnZlc1thXSxlPQphLmdldExlbmd0aCgpLGEuZ2V0UG9pbnRBdCgwPT09ZT8wOjEtYy9lKTthKyt9cmV0dXJuIG51bGx9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGFbYS5sZW5ndGgtMV19LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuY2FjaGVMZW5ndGhzPW51bGw7dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX0sZ2V0Q3VydmVMZW5ndGhzOmZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Zm9yKHZhciBhPVtdLGM9MCxlPTAsZz10aGlzLmN1cnZlcy5sZW5ndGg7ZTxnO2UrKyljKz10aGlzLmN1cnZlc1tlXS5nZXRMZW5ndGgoKSxhLnB1c2goYyk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPWF9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGE9NDApO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7dGhpcy5hdXRvQ2xvc2UmJmMucHVzaChjWzBdKTtyZXR1cm4gY30sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe2E9YXx8MTI7Zm9yKHZhciBjPVtdLGUsZz0wLHQ9dGhpcy5jdXJ2ZXM7Zzx0Lmxlbmd0aDtnKyspe3ZhciB2PXRbZ107dj12LmdldFBvaW50cyh2JiZ2LmlzRWxsaXBzZUN1cnZlPzIqYTp2JiYodi5pc0xpbmVDdXJ2ZXx8di5pc0xpbmVDdXJ2ZTMpPzE6diYmdi5pc1NwbGluZUN1cnZlP2Eqdi5wb2ludHMubGVuZ3RoOmEpO2Zvcih2YXIgej0wO3o8di5sZW5ndGg7eisrKXt2YXIgRT12W3pdO2UmJmUuZXF1YWxzKEUpfHwoYy5wdXNoKEUpLGU9RSl9fXRoaXMuYXV0b0Nsb3NlJiYxPGMubGVuZ3RoJiYhY1tjLmxlbmd0aC0xXS5lcXVhbHMoY1swXSkmJmMucHVzaChjWzBdKTtyZXR1cm4gY30sY29weTpmdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuY3VydmVzPVtdO2Zvcih2YXIgYz0wLGU9YS5jdXJ2ZXMubGVuZ3RoO2M8ZTtjKyspdGhpcy5jdXJ2ZXMucHVzaChhLmN1cnZlc1tjXS5jbG9uZSgpKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlO2EuY3VydmVzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5jdXJ2ZXMubGVuZ3RoO2M8ZTtjKyspYS5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tjXS50b0pTT04oKSk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hdXRvQ2xvc2U9YS5hdXRvQ2xvc2U7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5jdXJ2ZXNbY107dGhpcy5jdXJ2ZXMucHVzaCgobmV3IFRpW2cudHlwZV0pLmZyb21KU09OKGcpKX1yZXR1cm4gdGhpc319KTsKSWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShpZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpJYyxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubW92ZVRvKGFbMF0ueCxhWzBdLnkpO2Zvcih2YXIgYz0xLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmxpbmVUbyhhW2NdLngsYVtjXS55KX0sbW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3ZhciBlPW5ldyBuYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYykpO3RoaXMuY3VydmVzLnB1c2goZSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7YT1uZXcgR2ModGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgZihhLGMpLG5ldyBmKGUsZykpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGUsZyl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYSwKYyxlLGcsdCx2KXthPW5ldyBFYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSxuZXcgZih0LHYpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO3RoaXMuY3VycmVudFBvaW50LnNldCh0LHYpfSxzcGxpbmVUaHJ1OmZ1bmN0aW9uKGEpe3ZhciBjPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQoYSk7Yz1uZXcgSGMoYyk7dGhpcy5jdXJ2ZXMucHVzaChjKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGFbYS5sZW5ndGgtMV0pfSxhcmM6ZnVuY3Rpb24oYSxjLGUsZyx0LHYpe3RoaXMuYWJzYXJjKGErdGhpcy5jdXJyZW50UG9pbnQueCxjK3RoaXMuY3VycmVudFBvaW50LnksZSxnLHQsdil9LGFic2FyYzpmdW5jdGlvbihhLGMsZSxnLHQsdil7dGhpcy5hYnNlbGxpcHNlKGEsYyxlLGUsZyx0LHYpfSxlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcsdCx2LHosRSl7dGhpcy5hYnNlbGxpcHNlKGErdGhpcy5jdXJyZW50UG9pbnQueCxjK3RoaXMuY3VycmVudFBvaW50LnksCmUsZyx0LHYseixFKX0sYWJzZWxsaXBzZTpmdW5jdGlvbihhLGMsZSxnLHQsdix6LEUpe2E9bmV3IHNjKGEsYyxlLGcsdCx2LHosRSk7MDx0aGlzLmN1cnZlcy5sZW5ndGgmJihjPWEuZ2V0UG9pbnQoMCksYy5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyhjLngsYy55KSk7dGhpcy5jdXJ2ZXMucHVzaChhKTthPWEuZ2V0UG9pbnQoMSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShhKX0sY29weTpmdW5jdGlvbihhKXtpZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShhLmN1cnJlbnRQb2ludCk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPWlkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe2lkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGEuY3VycmVudFBvaW50KTsKcmV0dXJuIHRoaXN9fSk7RmQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShJYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGZCxnZXRQb2ludHNIb2xlczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wLGc9dGhpcy5ob2xlcy5sZW5ndGg7ZTxnO2UrKyljW2VdPXRoaXMuaG9sZXNbZV0uZ2V0UG9pbnRzKGEpO3JldHVybiBjfSxleHRyYWN0UG9pbnRzOmZ1bmN0aW9uKGEpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhhKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGEpfX0sY29weTpmdW5jdGlvbihhKXtJYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5ob2xlcz1bXTtmb3IodmFyIGM9MCxlPWEuaG9sZXMubGVuZ3RoO2M8ZTtjKyspdGhpcy5ob2xlcy5wdXNoKGEuaG9sZXNbY10uY2xvbmUoKSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPUljLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnV1aWQ9dGhpcy51dWlkOwphLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5ob2xlcy5sZW5ndGg7YzxlO2MrKylhLmhvbGVzLnB1c2godGhpcy5ob2xlc1tjXS50b0pTT04oKSk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe0ljLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy51dWlkPWEudXVpZDt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5ob2xlc1tjXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBJYykuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pO0tiLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpLYixpc0xpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7YT0KQS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpO2Eub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eTt2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoYS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGEub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpO3ZvaWQgMCE9PXRoaXMuYW5nbGUmJihhLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKTt2b2lkIDAhPT10aGlzLmRlY2F5JiYoYS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSk7dm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGEub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpO3ZvaWQgMCE9PXRoaXMuc2hhZG93JiYoYS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKTtyZXR1cm4gYX19KTtRZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpRZyxpc0hlbWlzcGhlcmVMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0tiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdyb3VuZENvbG9yLmNvcHkoYS5ncm91bmRDb2xvcik7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihYYy5wcm90b3R5cGUse19wcm9qU2NyZWVuTWF0cml4Om5ldyBxLF9saWdodFBvc2l0aW9uV29ybGQ6bmV3IGssX2xvb2tUYXJnZXQ6bmV3IGssZ2V0Vmlld3BvcnRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fSxnZXRGcnVzdHVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19LHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FtZXJhLGU9dGhpcy5tYXRyaXgsZz10aGlzLl9wcm9qU2NyZWVuTWF0cml4LHQ9dGhpcy5fbG9va1RhcmdldCx2PXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZDt2LnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTsKYy5wb3NpdGlvbi5jb3B5KHYpO3Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEudGFyZ2V0Lm1hdHJpeFdvcmxkKTtjLmxvb2tBdCh0KTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tdWx0aXBseU1hdHJpY2VzKGMucHJvamVjdGlvbk1hdHJpeCxjLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5fZnJ1c3R1bS5zZXRGcm9tTWF0cml4KGcpO2Uuc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpO2UubXVsdGlwbHkoYy5wcm9qZWN0aW9uTWF0cml4KTtlLm11bHRpcGx5KGMubWF0cml4V29ybGRJbnZlcnNlKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1thXX0sZ2V0RnJhbWVFeHRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50c30sY29weTpmdW5jdGlvbihhKXt0aGlzLmNhbWVyYT1hLmNhbWVyYS5jbG9uZSgpO3RoaXMuYmlhcz1hLmJpYXM7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy5tYXBTaXplLmNvcHkoYS5tYXBTaXplKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT17fTswIT09dGhpcy5iaWFzJiYoYS5iaWFzPXRoaXMuYmlhcyk7MSE9PXRoaXMucmFkaXVzJiYoYS5yYWRpdXM9dGhpcy5yYWRpdXMpO2lmKDUxMiE9PXRoaXMubWFwU2l6ZS54fHw1MTIhPT10aGlzLm1hcFNpemUueSlhLm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKTthLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdDtkZWxldGUgYS5jYW1lcmEubWF0cml4O3JldHVybiBhfX0pO1JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UmcsaXNTcG90TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuY2FtZXJhLHQ9MipoYi5SQUQyREVHKmEuYW5nbGUsdj10aGlzLm1hcFNpemUud2lkdGgvCnRoaXMubWFwU2l6ZS5oZWlnaHQsej1hLmRpc3RhbmNlfHxnLmZhcjtpZih0IT09Zy5mb3Z8fHYhPT1nLmFzcGVjdHx8eiE9PWcuZmFyKWcuZm92PXQsZy5hc3BlY3Q9dixnLmZhcj16LGcudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1hjLnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKHRoaXMsYSxjLGUpfX0pO1NnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6U2csaXNTcG90TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtLYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuYW5nbGU9YS5hbmdsZTt0aGlzLnBlbnVtYnJhPWEucGVudW1icmE7dGhpcy5kZWNheT1hLmRlY2F5O3RoaXMudGFyZ2V0PWEudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtpaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhjLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjppaSxpc1BvaW50TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSxjLGUpe2M9dGhpcy5jYW1lcmE7dmFyIGc9dGhpcy5tYXRyaXgsdD10aGlzLl9saWdodFBvc2l0aW9uV29ybGQsdj10aGlzLl9sb29rVGFyZ2V0LHo9dGhpcy5fcHJvalNjcmVlbk1hdHJpeDt0LnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTtjLnBvc2l0aW9uLmNvcHkodCk7di5jb3B5KGMucG9zaXRpb24pO3YuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKTtjLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSk7Yy5sb29rQXQodik7Yy51cGRhdGVNYXRyaXhXb3JsZCgpO2cubWFrZVRyYW5zbGF0aW9uKC10LngsLXQueSwtdC56KTt6Lm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoeil9fSk7VGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VGcsaXNQb2ludExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7S2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGlzdGFuY2U9YS5kaXN0YW5jZTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtjZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmNnLGlzT3J0aG9ncmFwaGljQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXt6Yi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLmxlZnQ9YS5sZWZ0O3RoaXMucmlnaHQ9YS5yaWdodDt0aGlzLnRvcD1hLnRvcDt0aGlzLmJvdHRvbT1hLmJvdHRvbTt0aGlzLm5lYXI9YS5uZWFyO3RoaXMuZmFyPWEuZmFyO3RoaXMuem9vbT1hLnpvb207dGhpcy52aWV3PW51bGw9PT1hLnZpZXc/bnVsbDpPYmplY3QuYXNzaWduKHt9LGEudmlldyk7cmV0dXJuIHRoaXN9LApzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXtudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXQ7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSx1cGRhdGVQcm9qZWN0aW9uTWF0cml4OmZ1bmN0aW9uKCl7dmFyIGE9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS8oMip0aGlzLnpvb20pLGM9KHRoaXMudG9wLQp0aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixnPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMix0PWUtYTtlKz1hO2E9ZytjO2M9Zy1jO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtlPXRoaXMuem9vbS8odGhpcy52aWV3LndpZHRoL3RoaXMudmlldy5mdWxsV2lkdGgpO2M9dGhpcy56b29tLyh0aGlzLnZpZXcuaGVpZ2h0L3RoaXMudmlldy5mdWxsSGVpZ2h0KTt2YXIgdj0odGhpcy5yaWdodC10aGlzLmxlZnQpL3RoaXMudmlldy53aWR0aDtnPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmhlaWdodDt0Kz10aGlzLnZpZXcub2Zmc2V0WC9lKnY7ZT10K3RoaXMudmlldy53aWR0aC9lKnY7YS09dGhpcy52aWV3Lm9mZnNldFkvYypnO2M9YS10aGlzLnZpZXcuaGVpZ2h0L2MqZ310aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyh0LGUsYSxjLHRoaXMubmVhcix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LAp0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0O2Eub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQ7YS5vYmplY3QudG9wPXRoaXMudG9wO2Eub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbTthLm9iamVjdC5uZWFyPXRoaXMubmVhcjthLm9iamVjdC5mYXI9dGhpcy5mYXI7bnVsbCE9PXRoaXMudmlldyYmKGEub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtyZXR1cm4gYX19KTtVZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVnLGlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7WGMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7VmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VmcsaXNEaXJlY3Rpb25hbExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7S2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudGFyZ2V0PWEudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtXZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldnLGlzQW1iaWVudExpZ2h0OiEwfSk7WGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYZyxpc1JlY3RBcmVhTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtLYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7YT1LYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC53aWR0aD0KdGhpcy53aWR0aDthLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7cmV0dXJuIGF9fSk7WWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpZZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PXRoaXMsdj1uZXcgd2ModC5tYW5hZ2VyKTt2LnNldFBhdGgodC5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHQucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKEUpe3ZvaWQgMD09PWVbRV0mJmNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixFKTtyZXR1cm4gZVtFXX12YXIgZT10aGlzLnRleHR1cmVzLGc9bmV3IGVuW2EudHlwZV07dm9pZCAwIT09YS51dWlkJiYoZy51dWlkPWEudXVpZCk7dm9pZCAwIT09YS5uYW1lJiYoZy5uYW1lPWEubmFtZSk7dm9pZCAwIT09YS5jb2xvciYmZy5jb2xvci5zZXRIZXgoYS5jb2xvcik7CnZvaWQgMCE9PWEucm91Z2huZXNzJiYoZy5yb3VnaG5lc3M9YS5yb3VnaG5lc3MpO3ZvaWQgMCE9PWEubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9YS5tZXRhbG5lc3MpO3ZvaWQgMCE9PWEuZW1pc3NpdmUmJmcuZW1pc3NpdmUuc2V0SGV4KGEuZW1pc3NpdmUpO3ZvaWQgMCE9PWEuc3BlY3VsYXImJmcuc3BlY3VsYXIuc2V0SGV4KGEuc3BlY3VsYXIpO3ZvaWQgMCE9PWEuc2hpbmluZXNzJiYoZy5zaGluaW5lc3M9YS5zaGluaW5lc3MpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0JiYoZy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Um91Z2huZXNzJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3MpO3ZvaWQgMCE9PWEudmVydGV4Q29sb3JzJiYoZy52ZXJ0ZXhDb2xvcnM9YS52ZXJ0ZXhDb2xvcnMpO3ZvaWQgMCE9PWEuZm9nJiYoZy5mb2c9YS5mb2cpO3ZvaWQgMCE9PWEuZmxhdFNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPWEuZmxhdFNoYWRpbmcpOwp2b2lkIDAhPT1hLmJsZW5kaW5nJiYoZy5ibGVuZGluZz1hLmJsZW5kaW5nKTt2b2lkIDAhPT1hLmNvbWJpbmUmJihnLmNvbWJpbmU9YS5jb21iaW5lKTt2b2lkIDAhPT1hLnNpZGUmJihnLnNpZGU9YS5zaWRlKTt2b2lkIDAhPT1hLm9wYWNpdHkmJihnLm9wYWNpdHk9YS5vcGFjaXR5KTt2b2lkIDAhPT1hLnRyYW5zcGFyZW50JiYoZy50cmFuc3BhcmVudD1hLnRyYW5zcGFyZW50KTt2b2lkIDAhPT1hLmFscGhhVGVzdCYmKGcuYWxwaGFUZXN0PWEuYWxwaGFUZXN0KTt2b2lkIDAhPT1hLmRlcHRoVGVzdCYmKGcuZGVwdGhUZXN0PWEuZGVwdGhUZXN0KTt2b2lkIDAhPT1hLmRlcHRoV3JpdGUmJihnLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlKTt2b2lkIDAhPT1hLmNvbG9yV3JpdGUmJihnLmNvbG9yV3JpdGU9YS5jb2xvcldyaXRlKTt2b2lkIDAhPT1hLndpcmVmcmFtZSYmKGcud2lyZWZyYW1lPWEud2lyZWZyYW1lKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aCk7dm9pZCAwIT09YS53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcCk7dm9pZCAwIT09YS53aXJlZnJhbWVMaW5lam9pbiYmKGcud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbik7dm9pZCAwIT09YS5yb3RhdGlvbiYmKGcucm90YXRpb249YS5yb3RhdGlvbik7MSE9PWEubGluZXdpZHRoJiYoZy5saW5ld2lkdGg9YS5saW5ld2lkdGgpO3ZvaWQgMCE9PWEuZGFzaFNpemUmJihnLmRhc2hTaXplPWEuZGFzaFNpemUpO3ZvaWQgMCE9PWEuZ2FwU2l6ZSYmKGcuZ2FwU2l6ZT1hLmdhcFNpemUpO3ZvaWQgMCE9PWEuc2NhbGUmJihnLnNjYWxlPWEuc2NhbGUpO3ZvaWQgMCE9PWEucG9seWdvbk9mZnNldCYmKGcucG9seWdvbk9mZnNldD1hLnBvbHlnb25PZmZzZXQpO3ZvaWQgMCE9PWEucG9seWdvbk9mZnNldEZhY3RvciYmKGcucG9seWdvbk9mZnNldEZhY3Rvcj1hLnBvbHlnb25PZmZzZXRGYWN0b3IpOwp2b2lkIDAhPT1hLnBvbHlnb25PZmZzZXRVbml0cyYmKGcucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzKTt2b2lkIDAhPT1hLnNraW5uaW5nJiYoZy5za2lubmluZz1hLnNraW5uaW5nKTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0cyYmKGcubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzKTt2b2lkIDAhPT1hLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzKTt2b2lkIDAhPT1hLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPWEuZGl0aGVyaW5nKTt2b2lkIDAhPT1hLnZpc2libGUmJihnLnZpc2libGU9YS52aXNpYmxlKTt2b2lkIDAhPT1hLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9YS50b25lTWFwcGVkKTt2b2lkIDAhPT1hLnVzZXJEYXRhJiYoZy51c2VyRGF0YT1hLnVzZXJEYXRhKTtpZih2b2lkIDAhPT1hLnVuaWZvcm1zKWZvcih2YXIgdCBpbiBhLnVuaWZvcm1zKXt2YXIgdj1hLnVuaWZvcm1zW3RdO2cudW5pZm9ybXNbdF09Cnt9O3N3aXRjaCh2LnR5cGUpe2Nhc2UgInQiOmcudW5pZm9ybXNbdF0udmFsdWU9Yyh2LnZhbHVlKTticmVhaztjYXNlICJjIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgSCkuc2V0SGV4KHYudmFsdWUpO2JyZWFrO2Nhc2UgInYyIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgZikuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgInYzIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgaykuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgInY0IjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgcCkuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgIm0zIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgcikuZnJvbUFycmF5KHYudmFsdWUpO2Nhc2UgIm00IjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgcSkuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2RlZmF1bHQ6Zy51bmlmb3Jtc1t0XS52YWx1ZT12LnZhbHVlfX12b2lkIDAhPT1hLmRlZmluZXMmJihnLmRlZmluZXM9YS5kZWZpbmVzKTsKdm9pZCAwIT09YS52ZXJ0ZXhTaGFkZXImJihnLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcik7dm9pZCAwIT09YS5mcmFnbWVudFNoYWRlciYmKGcuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcik7aWYodm9pZCAwIT09YS5leHRlbnNpb25zKWZvcih2YXIgeiBpbiBhLmV4dGVuc2lvbnMpZy5leHRlbnNpb25zW3pdPWEuZXh0ZW5zaW9uc1t6XTt2b2lkIDAhPT1hLnNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPTE9PT1hLnNoYWRpbmcpO3ZvaWQgMCE9PWEuc2l6ZSYmKGcuc2l6ZT1hLnNpemUpO3ZvaWQgMCE9PWEuc2l6ZUF0dGVudWF0aW9uJiYoZy5zaXplQXR0ZW51YXRpb249YS5zaXplQXR0ZW51YXRpb24pO3ZvaWQgMCE9PWEubWFwJiYoZy5tYXA9YyhhLm1hcCkpO3ZvaWQgMCE9PWEubWF0Y2FwJiYoZy5tYXRjYXA9YyhhLm1hdGNhcCkpO3ZvaWQgMCE9PWEuYWxwaGFNYXAmJihnLmFscGhhTWFwPWMoYS5hbHBoYU1hcCksZy50cmFuc3BhcmVudD0hMCk7dm9pZCAwIT09CmEuYnVtcE1hcCYmKGcuYnVtcE1hcD1jKGEuYnVtcE1hcCkpO3ZvaWQgMCE9PWEuYnVtcFNjYWxlJiYoZy5idW1wU2NhbGU9YS5idW1wU2NhbGUpO3ZvaWQgMCE9PWEubm9ybWFsTWFwJiYoZy5ub3JtYWxNYXA9YyhhLm5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEubm9ybWFsTWFwVHlwZSYmKGcubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGUpO3ZvaWQgMCE9PWEubm9ybWFsU2NhbGUmJih0PWEubm9ybWFsU2NhbGUsITE9PT1BcnJheS5pc0FycmF5KHQpJiYodD1bdCx0XSksZy5ub3JtYWxTY2FsZT0obmV3IGYpLmZyb21BcnJheSh0KSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRNYXAmJihnLmRpc3BsYWNlbWVudE1hcD1jKGEuZGlzcGxhY2VtZW50TWFwKSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRTY2FsZSYmKGcuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRCaWFzJiYoZy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50Qmlhcyk7CnZvaWQgMCE9PWEucm91Z2huZXNzTWFwJiYoZy5yb3VnaG5lc3NNYXA9YyhhLnJvdWdobmVzc01hcCkpO3ZvaWQgMCE9PWEubWV0YWxuZXNzTWFwJiYoZy5tZXRhbG5lc3NNYXA9YyhhLm1ldGFsbmVzc01hcCkpO3ZvaWQgMCE9PWEuZW1pc3NpdmVNYXAmJihnLmVtaXNzaXZlTWFwPWMoYS5lbWlzc2l2ZU1hcCkpO3ZvaWQgMCE9PWEuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuc3BlY3VsYXJNYXAmJihnLnNwZWN1bGFyTWFwPWMoYS5zcGVjdWxhck1hcCkpO3ZvaWQgMCE9PWEuZW52TWFwJiYoZy5lbnZNYXA9YyhhLmVudk1hcCkpO3ZvaWQgMCE9PWEuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9YS5lbnZNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEucmVmbGVjdGl2aXR5JiYoZy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHkpO3ZvaWQgMCE9PWEucmVmcmFjdGlvblJhdGlvJiYoZy5yZWZyYWN0aW9uUmF0aW89CmEucmVmcmFjdGlvblJhdGlvKTt2b2lkIDAhPT1hLmxpZ2h0TWFwJiYoZy5saWdodE1hcD1jKGEubGlnaHRNYXApKTt2b2lkIDAhPT1hLmxpZ2h0TWFwSW50ZW5zaXR5JiYoZy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1hLmFvTWFwJiYoZy5hb01hcD1jKGEuYW9NYXApKTt2b2lkIDAhPT1hLmFvTWFwSW50ZW5zaXR5JiYoZy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1hLmdyYWRpZW50TWFwJiYoZy5ncmFkaWVudE1hcD1jKGEuZ3JhZGllbnRNYXApKTt2b2lkIDAhPT1hLmNsZWFyY29hdE5vcm1hbE1hcCYmKGcuY2xlYXJjb2F0Tm9ybWFsTWFwPWMoYS5jbGVhcmNvYXROb3JtYWxNYXApKTt2b2lkIDAhPT1hLmNsZWFyY29hdE5vcm1hbFNjYWxlJiYoZy5jbGVhcmNvYXROb3JtYWxTY2FsZT0obmV3IGYpLmZyb21BcnJheShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSk7cmV0dXJuIGd9LHNldFRleHR1cmVzOmZ1bmN0aW9uKGEpe3RoaXMudGV4dHVyZXM9CmE7cmV0dXJuIHRoaXN9fSk7dmFyIFVpPXtkZWNvZGVUZXh0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShhKTtmb3IodmFyIGM9IiIsZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGFbZV0pO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShjKSl9Y2F0Y2godCl7cmV0dXJuIGN9fSxleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1jPyIuLyI6YS5zdWJzdHIoMCxjKzEpfX07WmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpaZyxpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiEwLGNvcHk6ZnVuY3Rpb24oYSl7dmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWF4SW5zdGFuY2VkQ291bnQ9CmEubWF4SW5zdGFuY2VkQ291bnQ7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5tYXhJbnN0YW5jZWRDb3VudD10aGlzLm1heEluc3RhbmNlZENvdW50O2EuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMDtyZXR1cm4gYX19KTskZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6JGcsaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6ITAsY29weTpmdW5jdGlvbihhKXtSLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9YS5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1SLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1lc2hQZXJBdHRyaWJ1dGU9CnRoaXMubWVzaFBlckF0dHJpYnV0ZTthLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwO3JldHVybiBhfX0pO2FoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YWgsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLHY9bmV3IHdjKHQubWFuYWdlcik7di5zZXRQYXRoKHQucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7Yyh0LnBhcnNlKEpTT04ucGFyc2UoeikpKX0sZSxnKX0scGFyc2U6ZnVuY3Rpb24oYSl7dmFyIGM9YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBaZzpuZXcgdmEsZT1hLmRhdGEuaW5kZXg7aWYodm9pZCAwIT09ZSl7dmFyIGc9bmV3IFZpW2UudHlwZV0oZS5hcnJheSk7Yy5zZXRJbmRleChuZXcgUihnLDEpKX1lPWEuZGF0YS5hdHRyaWJ1dGVzO2Zvcih2YXIgdCBpbiBlKXt2YXIgdj1lW3RdO2c9bmV3IFZpW3YudHlwZV0odi5hcnJheSk7Zz1uZXcgKHYuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/CiRnOlIpKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpO3ZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpO2MuYWRkQXR0cmlidXRlKHQsZyl9dmFyIHo9YS5kYXRhLm1vcnBoQXR0cmlidXRlcztpZih6KWZvcih0IGluIHope3ZhciBFPXpbdF0sRj1bXTtlPTA7Zm9yKHZhciBJPUUubGVuZ3RoO2U8STtlKyspdj1FW2VdLGc9bmV3IFZpW3YudHlwZV0odi5hcnJheSksZz1uZXcgUihnLHYuaXRlbVNpemUsdi5ub3JtYWxpemVkKSx2b2lkIDAhPT12Lm5hbWUmJihnLm5hbWU9di5uYW1lKSxGLnB1c2goZyk7Yy5tb3JwaEF0dHJpYnV0ZXNbdF09Rn10PWEuZGF0YS5ncm91cHN8fGEuZGF0YS5kcmF3Y2FsbHN8fGEuZGF0YS5vZmZzZXRzO2lmKHZvaWQgMCE9PXQpZm9yKGU9MCx2PXQubGVuZ3RoO2UhPT12OysrZSlnPXRbZV0sYy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTtlPWEuZGF0YS5ib3VuZGluZ1NwaGVyZTt2b2lkIDAhPT1lJiYodD1uZXcgaywKdm9pZCAwIT09ZS5jZW50ZXImJnQuZnJvbUFycmF5KGUuY2VudGVyKSxjLmJvdW5kaW5nU3BoZXJlPW5ldyBHKHQsZS5yYWRpdXMpKTthLm5hbWUmJihjLm5hbWU9YS5uYW1lKTthLnVzZXJEYXRhJiYoYy51c2VyRGF0YT1hLnVzZXJEYXRhKTtyZXR1cm4gY319KTt2YXIgVmk9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OiJ1bmRlZmluZWQiIT09dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P1VpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXl9O2JoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YmgsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLHY9IiI9PT10aGlzLnBhdGg/VWkuZXh0cmFjdFVybEJhc2UoYSk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPQp0aGlzLnJlc291cmNlUGF0aHx8djt2PW5ldyB3Yyh0Lm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3ZhciBFPW51bGw7dHJ5e0U9SlNPTi5wYXJzZSh6KX1jYXRjaChGKXt2b2lkIDAhPT1nJiZnKEYpO2NvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIithKyIuIixGLm1lc3NhZ2UpO3JldHVybn16PUUubWV0YWRhdGE7dm9pZCAwPT09enx8dm9pZCAwPT09ei50eXBlfHwiZ2VvbWV0cnkiPT09ei50eXBlLnRvTG93ZXJDYXNlKCk/Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrYSk6dC5wYXJzZShFLGMpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMucGFyc2VTaGFwZShhLnNoYXBlcyk7ZT10aGlzLnBhcnNlR2VvbWV0cmllcyhhLmdlb21ldHJpZXMsZSk7dmFyIGc9dGhpcy5wYXJzZUltYWdlcyhhLmltYWdlcyxmdW5jdGlvbigpe3ZvaWQgMCE9PQpjJiZjKHQpfSk7Zz10aGlzLnBhcnNlVGV4dHVyZXMoYS50ZXh0dXJlcyxnKTtnPXRoaXMucGFyc2VNYXRlcmlhbHMoYS5tYXRlcmlhbHMsZyk7dmFyIHQ9dGhpcy5wYXJzZU9iamVjdChhLm9iamVjdCxlLGcpO2EuYW5pbWF0aW9ucyYmKHQuYW5pbWF0aW9ucz10aGlzLnBhcnNlQW5pbWF0aW9ucyhhLmFuaW1hdGlvbnMpKTt2b2lkIDAhPT1hLmltYWdlcyYmMCE9PWEuaW1hZ2VzLmxlbmd0aHx8dm9pZCAwPT09Y3x8Yyh0KTtyZXR1cm4gdH0scGFyc2VTaGFwZTpmdW5jdGlvbihhKXt2YXIgYz17fTtpZih2b2lkIDAhPT1hKWZvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHQ9KG5ldyBGZCkuZnJvbUpTT04oYVtlXSk7Y1t0LnV1aWRdPXR9cmV0dXJuIGN9LHBhcnNlR2VvbWV0cmllczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBnPW5ldyBhaCx0PTAsdj1hLmxlbmd0aDt0PHY7dCsrKXt2YXIgej1hW3RdO3N3aXRjaCh6LnR5cGUpe2Nhc2UgIlBsYW5lR2VvbWV0cnkiOmNhc2UgIlBsYW5lQnVmZmVyR2VvbWV0cnkiOnZhciBFPQpuZXcgamNbei50eXBlXSh6LndpZHRoLHouaGVpZ2h0LHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzKTticmVhaztjYXNlICJCb3hHZW9tZXRyeSI6Y2FzZSAiQm94QnVmZmVyR2VvbWV0cnkiOmNhc2UgIkN1YmVHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LndpZHRoLHouaGVpZ2h0LHouZGVwdGgsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5kZXB0aFNlZ21lbnRzKTticmVhaztjYXNlICJDaXJjbGVHZW9tZXRyeSI6Y2FzZSAiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5yYWRpdXMsei5zZWdtZW50cyx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiQ3lsaW5kZXJHZW9tZXRyeSI6Y2FzZSAiQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnJhZGl1c1RvcCx6LnJhZGl1c0JvdHRvbSx6LmhlaWdodCx6LnJhZGlhbFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5vcGVuRW5kZWQsCnoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDb25lR2VvbWV0cnkiOmNhc2UgIkNvbmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnJhZGl1cyx6LmhlaWdodCx6LnJhZGlhbFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5vcGVuRW5kZWQsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlNwaGVyZUdlb21ldHJ5IjpjYXNlICJTcGhlcmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnJhZGl1cyx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LnBoaVN0YXJ0LHoucGhpTGVuZ3RoLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJEb2RlY2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIk9jdGFoZWRyb25HZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPQpuZXcgamNbei50eXBlXSh6LnJhZGl1cyx6LmRldGFpbCk7YnJlYWs7Y2FzZSAiUmluZ0dlb21ldHJ5IjpjYXNlICJSaW5nQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5pbm5lclJhZGl1cyx6Lm91dGVyUmFkaXVzLHoudGhldGFTZWdtZW50cyx6LnBoaVNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJUb3J1c0dlb21ldHJ5IjpjYXNlICJUb3J1c0J1ZmZlckdlb21ldHJ5IjpFPW5ldyBqY1t6LnR5cGVdKHoucmFkaXVzLHoudHViZSx6LnJhZGlhbFNlZ21lbnRzLHoudHVidWxhclNlZ21lbnRzLHouYXJjKTticmVhaztjYXNlICJUb3J1c0tub3RHZW9tZXRyeSI6Y2FzZSAiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoudHVidWxhclNlZ21lbnRzLHoucmFkaWFsU2VnbWVudHMsei5wLHoucSk7YnJlYWs7Y2FzZSAiVHViZUdlb21ldHJ5IjpjYXNlICJUdWJlQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBqY1t6LnR5cGVdKChuZXcgVGlbei5wYXRoLnR5cGVdKS5mcm9tSlNPTih6LnBhdGgpLHoudHVidWxhclNlZ21lbnRzLHoucmFkaXVzLHoucmFkaWFsU2VnbWVudHMsei5jbG9zZWQpO2JyZWFrO2Nhc2UgIkxhdGhlR2VvbWV0cnkiOmNhc2UgIkxhdGhlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5wb2ludHMsei5zZWdtZW50cyx6LnBoaVN0YXJ0LHoucGhpTGVuZ3RoKTticmVhaztjYXNlICJQb2x5aGVkcm9uR2VvbWV0cnkiOmNhc2UgIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnZlcnRpY2VzLHouaW5kaWNlcyx6LnJhZGl1cyx6LmRldGFpbHMpO2JyZWFrO2Nhc2UgIlNoYXBlR2VvbWV0cnkiOmNhc2UgIlNoYXBlQnVmZmVyR2VvbWV0cnkiOkU9W107Zm9yKHZhciBGPTAsST16LnNoYXBlcy5sZW5ndGg7RjxJO0YrKyl7dmFyIE09Y1t6LnNoYXBlc1tGXV07RS5wdXNoKE0pfUU9bmV3IGpjW3oudHlwZV0oRSx6LmN1cnZlU2VnbWVudHMpOwpicmVhaztjYXNlICJFeHRydWRlR2VvbWV0cnkiOmNhc2UgIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtGPTA7Zm9yKEk9ei5zaGFwZXMubGVuZ3RoO0Y8STtGKyspTT1jW3ouc2hhcGVzW0ZdXSxFLnB1c2goTSk7Rj16Lm9wdGlvbnMuZXh0cnVkZVBhdGg7dm9pZCAwIT09RiYmKHoub3B0aW9ucy5leHRydWRlUGF0aD0obmV3IFRpW0YudHlwZV0pLmZyb21KU09OKEYpKTtFPW5ldyBqY1t6LnR5cGVdKEUsei5vcHRpb25zKTticmVhaztjYXNlICJCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOkU9Zy5wYXJzZSh6KTticmVhaztjYXNlICJHZW9tZXRyeSI6IlRIUkVFImluIHdpbmRvdyYmIkxlZ2FjeUpTT05Mb2FkZXIiaW4gVEhSRUU/RT0obmV3IFRIUkVFLkxlZ2FjeUpTT05Mb2FkZXIpLnBhcnNlKHosdGhpcy5yZXNvdXJjZVBhdGgpLmdlb21ldHJ5OmNvbnNvbGUuZXJyb3IoJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nKTsKYnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJyt6LnR5cGUrJyInKTtjb250aW51ZX1FLnV1aWQ9ei51dWlkO3ZvaWQgMCE9PXoubmFtZSYmKEUubmFtZT16Lm5hbWUpOyEwPT09RS5pc0J1ZmZlckdlb21ldHJ5JiZ2b2lkIDAhPT16LnVzZXJEYXRhJiYoRS51c2VyRGF0YT16LnVzZXJEYXRhKTtlW3oudXVpZF09RX1yZXR1cm4gZX0scGFyc2VNYXRlcmlhbHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT17fSxnPXt9O2lmKHZvaWQgMCE9PWEpe3ZhciB0PW5ldyBZZzt0LnNldFRleHR1cmVzKGMpO2M9MDtmb3IodmFyIHY9YS5sZW5ndGg7Yzx2O2MrKyl7dmFyIHo9YVtjXTtpZigiTXVsdGlNYXRlcmlhbCI9PT16LnR5cGUpe2Zvcih2YXIgRT1bXSxGPTA7Rjx6Lm1hdGVyaWFscy5sZW5ndGg7RisrKXt2YXIgST16Lm1hdGVyaWFsc1tGXTt2b2lkIDA9PT1lW0kudXVpZF0mJihlW0kudXVpZF09dC5wYXJzZShJKSk7CkUucHVzaChlW0kudXVpZF0pfWdbei51dWlkXT1FfWVsc2Ugdm9pZCAwPT09ZVt6LnV1aWRdJiYoZVt6LnV1aWRdPXQucGFyc2UoeikpLGdbei51dWlkXT1lW3oudXVpZF19fXJldHVybiBnfSxwYXJzZUFuaW1hdGlvbnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGc9YVtlXSx0PXZjLnBhcnNlKGcpO3ZvaWQgMCE9PWcudXVpZCYmKHQudXVpZD1nLnV1aWQpO2MucHVzaCh0KX1yZXR1cm4gY30scGFyc2VJbWFnZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKFEpe2cubWFuYWdlci5pdGVtU3RhcnQoUSk7cmV0dXJuIHYubG9hZChRLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FbmQoUSl9LHZvaWQgMCxmdW5jdGlvbigpe2cubWFuYWdlci5pdGVtRXJyb3IoUSk7Zy5tYW5hZ2VyLml0ZW1FbmQoUSl9KX12YXIgZz10aGlzLHQ9e307aWYodm9pZCAwIT09YSYmMDxhLmxlbmd0aCl7Yz1uZXcgZWkoYyk7dmFyIHY9bmV3IFdlKGMpO3Yuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CmM9MDtmb3IodmFyIHo9YS5sZW5ndGg7Yzx6O2MrKyl7dmFyIEU9YVtjXSxGPUUudXJsO2lmKEFycmF5LmlzQXJyYXkoRikpe3RbRS51dWlkXT1bXTtmb3IodmFyIEk9MCxNPUYubGVuZ3RoO0k8TTtJKyspe3ZhciBQPUZbSV07UD0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChQKT9QOmcucmVzb3VyY2VQYXRoK1A7dFtFLnV1aWRdLnB1c2goZShQKSl9fWVsc2UgUD0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChFLnVybCk/RS51cmw6Zy5yZXNvdXJjZVBhdGgrRS51cmwsdFtFLnV1aWRdPWUoUCl9fXJldHVybiB0fSxwYXJzZVRleHR1cmVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShGLEkpe2lmKCJudW1iZXIiPT09dHlwZW9mIEYpcmV0dXJuIEY7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsRik7cmV0dXJuIElbRl19dmFyIGc9e307aWYodm9pZCAwIT09CmEpZm9yKHZhciB0PTAsdj1hLmxlbmd0aDt0PHY7dCsrKXt2YXIgej1hW3RdO3ZvaWQgMD09PXouaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLHoudXVpZCk7dm9pZCAwPT09Y1t6LmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsei5pbWFnZSk7dmFyIEU9QXJyYXkuaXNBcnJheShjW3ouaW1hZ2VdKT9uZXcgZWQoY1t6LmltYWdlXSk6bmV3IGwoY1t6LmltYWdlXSk7RS5uZWVkc1VwZGF0ZT0hMDtFLnV1aWQ9ei51dWlkO3ZvaWQgMCE9PXoubmFtZSYmKEUubmFtZT16Lm5hbWUpO3ZvaWQgMCE9PXoubWFwcGluZyYmKEUubWFwcGluZz1lKHoubWFwcGluZyxmbikpO3ZvaWQgMCE9PXoub2Zmc2V0JiZFLm9mZnNldC5mcm9tQXJyYXkoei5vZmZzZXQpO3ZvaWQgMCE9PXoucmVwZWF0JiZFLnJlcGVhdC5mcm9tQXJyYXkoei5yZXBlYXQpO3ZvaWQgMCE9PXouY2VudGVyJiYKRS5jZW50ZXIuZnJvbUFycmF5KHouY2VudGVyKTt2b2lkIDAhPT16LnJvdGF0aW9uJiYoRS5yb3RhdGlvbj16LnJvdGF0aW9uKTt2b2lkIDAhPT16LndyYXAmJihFLndyYXBTPWUoei53cmFwWzBdLEJrKSxFLndyYXBUPWUoei53cmFwWzFdLEJrKSk7dm9pZCAwIT09ei5mb3JtYXQmJihFLmZvcm1hdD16LmZvcm1hdCk7dm9pZCAwIT09ei50eXBlJiYoRS50eXBlPXoudHlwZSk7dm9pZCAwIT09ei5lbmNvZGluZyYmKEUuZW5jb2Rpbmc9ei5lbmNvZGluZyk7dm9pZCAwIT09ei5taW5GaWx0ZXImJihFLm1pbkZpbHRlcj1lKHoubWluRmlsdGVyLENrKSk7dm9pZCAwIT09ei5tYWdGaWx0ZXImJihFLm1hZ0ZpbHRlcj1lKHoubWFnRmlsdGVyLENrKSk7dm9pZCAwIT09ei5hbmlzb3Ryb3B5JiYoRS5hbmlzb3Ryb3B5PXouYW5pc290cm9weSk7dm9pZCAwIT09ei5mbGlwWSYmKEUuZmxpcFk9ei5mbGlwWSk7dm9pZCAwIT09ei5wcmVtdWx0aXBseUFscGhhJiYoRS5wcmVtdWx0aXBseUFscGhhPQp6LnByZW11bHRpcGx5QWxwaGEpO3ZvaWQgMCE9PXoudW5wYWNrQWxpZ25tZW50JiYoRS51bnBhY2tBbGlnbm1lbnQ9ei51bnBhY2tBbGlnbm1lbnQpO2dbei51dWlkXT1FfXJldHVybiBnfSxwYXJzZU9iamVjdDpmdW5jdGlvbihhLGMsZSl7ZnVuY3Rpb24gZyhJKXt2b2lkIDA9PT1jW0ldJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixJKTtyZXR1cm4gY1tJXX1mdW5jdGlvbiB0KEkpe2lmKHZvaWQgMCE9PUkpe2lmKEFycmF5LmlzQXJyYXkoSSkpe2Zvcih2YXIgTT1bXSxQPTAsUT1JLmxlbmd0aDtQPFE7UCsrKXt2YXIgVT1JW1BdO3ZvaWQgMD09PWVbVV0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLFUpO00ucHVzaChlW1VdKX1yZXR1cm4gTX12b2lkIDA9PT1lW0ldJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixJKTtyZXR1cm4gZVtJXX19CnN3aXRjaChhLnR5cGUpe2Nhc2UgIlNjZW5lIjp2YXIgdj1uZXcgeTt2b2lkIDAhPT1hLmJhY2tncm91bmQmJk51bWJlci5pc0ludGVnZXIoYS5iYWNrZ3JvdW5kKSYmKHYuYmFja2dyb3VuZD1uZXcgSChhLmJhY2tncm91bmQpKTt2b2lkIDAhPT1hLmZvZyYmKCJGb2ciPT09YS5mb2cudHlwZT92LmZvZz1uZXcgRGcoYS5mb2cuY29sb3IsYS5mb2cubmVhcixhLmZvZy5mYXIpOiJGb2dFeHAyIj09PWEuZm9nLnR5cGUmJih2LmZvZz1uZXcgQ2coYS5mb2cuY29sb3IsYS5mb2cuZGVuc2l0eSkpKTticmVhaztjYXNlICJQZXJzcGVjdGl2ZUNhbWVyYSI6dj1uZXcgdmIoYS5mb3YsYS5hc3BlY3QsYS5uZWFyLGEuZmFyKTt2b2lkIDAhPT1hLmZvY3VzJiYodi5mb2N1cz1hLmZvY3VzKTt2b2lkIDAhPT1hLnpvb20mJih2Lnpvb209YS56b29tKTt2b2lkIDAhPT1hLmZpbG1HYXVnZSYmKHYuZmlsbUdhdWdlPWEuZmlsbUdhdWdlKTt2b2lkIDAhPT1hLmZpbG1PZmZzZXQmJih2LmZpbG1PZmZzZXQ9CmEuZmlsbU9mZnNldCk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiT3J0aG9ncmFwaGljQ2FtZXJhIjp2PW5ldyBjZyhhLmxlZnQsYS5yaWdodCxhLnRvcCxhLmJvdHRvbSxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEudmlldyYmKHYudmlldz1PYmplY3QuYXNzaWduKHt9LGEudmlldykpO2JyZWFrO2Nhc2UgIkFtYmllbnRMaWdodCI6dj1uZXcgV2coYS5jb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dj1uZXcgVmcoYS5jb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiUG9pbnRMaWdodCI6dj1uZXcgVGcoYS5jb2xvcixhLmludGVuc2l0eSxhLmRpc3RhbmNlLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIlJlY3RBcmVhTGlnaHQiOnY9bmV3IFhnKGEuY29sb3IsYS5pbnRlbnNpdHksYS53aWR0aCxhLmhlaWdodCk7YnJlYWs7CmNhc2UgIlNwb3RMaWdodCI6dj1uZXcgU2coYS5jb2xvcixhLmludGVuc2l0eSxhLmRpc3RhbmNlLGEuYW5nbGUsYS5wZW51bWJyYSxhLmRlY2F5KTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOnY9bmV3IFFnKGEuY29sb3IsYS5ncm91bmRDb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiU2tpbm5lZE1lc2giOmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuIik7Y2FzZSAiTWVzaCI6dj1nKGEuZ2VvbWV0cnkpO3ZhciB6PXQoYS5tYXRlcmlhbCk7dj12LmJvbmVzJiYwPHYuYm9uZXMubGVuZ3RoP25ldyBDZih2LHopOm5ldyB5YSh2LHopO3ZvaWQgMCE9PWEuZHJhd01vZGUmJnYuc2V0RHJhd01vZGUoYS5kcmF3TW9kZSk7YnJlYWs7Y2FzZSAiTE9EIjp2PW5ldyBCZjticmVhaztjYXNlICJMaW5lIjp2PW5ldyBYYihnKGEuZ2VvbWV0cnkpLHQoYS5tYXRlcmlhbCksYS5tb2RlKTsKYnJlYWs7Y2FzZSAiTGluZUxvb3AiOnY9bmV3IEdnKGcoYS5nZW9tZXRyeSksdChhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiTGluZVNlZ21lbnRzIjp2PW5ldyBJYihnKGEuZ2VvbWV0cnkpLHQoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlBvaW50Q2xvdWQiOmNhc2UgIlBvaW50cyI6dj1uZXcgRWUoZyhhLmdlb21ldHJ5KSx0KGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJTcHJpdGUiOnY9bmV3IHpmKHQoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIkdyb3VwIjp2PW5ldyB3ZTticmVhaztkZWZhdWx0OnY9bmV3IEF9di51dWlkPWEudXVpZDt2b2lkIDAhPT1hLm5hbWUmJih2Lm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLm1hdHJpeD8odi5tYXRyaXguZnJvbUFycmF5KGEubWF0cml4KSx2b2lkIDAhPT1hLm1hdHJpeEF1dG9VcGRhdGUmJih2Lm1hdHJpeEF1dG9VcGRhdGU9YS5tYXRyaXhBdXRvVXBkYXRlKSx2Lm1hdHJpeEF1dG9VcGRhdGUmJnYubWF0cml4LmRlY29tcG9zZSh2LnBvc2l0aW9uLAp2LnF1YXRlcm5pb24sdi5zY2FsZSkpOih2b2lkIDAhPT1hLnBvc2l0aW9uJiZ2LnBvc2l0aW9uLmZyb21BcnJheShhLnBvc2l0aW9uKSx2b2lkIDAhPT1hLnJvdGF0aW9uJiZ2LnJvdGF0aW9uLmZyb21BcnJheShhLnJvdGF0aW9uKSx2b2lkIDAhPT1hLnF1YXRlcm5pb24mJnYucXVhdGVybmlvbi5mcm9tQXJyYXkoYS5xdWF0ZXJuaW9uKSx2b2lkIDAhPT1hLnNjYWxlJiZ2LnNjYWxlLmZyb21BcnJheShhLnNjYWxlKSk7dm9pZCAwIT09YS5jYXN0U2hhZG93JiYodi5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdyk7dm9pZCAwIT09YS5yZWNlaXZlU2hhZG93JiYodi5yZWNlaXZlU2hhZG93PWEucmVjZWl2ZVNoYWRvdyk7YS5zaGFkb3cmJih2b2lkIDAhPT1hLnNoYWRvdy5iaWFzJiYodi5zaGFkb3cuYmlhcz1hLnNoYWRvdy5iaWFzKSx2b2lkIDAhPT1hLnNoYWRvdy5yYWRpdXMmJih2LnNoYWRvdy5yYWRpdXM9YS5zaGFkb3cucmFkaXVzKSx2b2lkIDAhPT1hLnNoYWRvdy5tYXBTaXplJiYKdi5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoYS5zaGFkb3cubWFwU2l6ZSksdm9pZCAwIT09YS5zaGFkb3cuY2FtZXJhJiYodi5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QoYS5zaGFkb3cuY2FtZXJhKSkpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKHYudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQpO3ZvaWQgMCE9PWEucmVuZGVyT3JkZXImJih2LnJlbmRlck9yZGVyPWEucmVuZGVyT3JkZXIpO3ZvaWQgMCE9PWEudXNlckRhdGEmJih2LnVzZXJEYXRhPWEudXNlckRhdGEpO3ZvaWQgMCE9PWEubGF5ZXJzJiYodi5sYXllcnMubWFzaz1hLmxheWVycyk7aWYodm9pZCAwIT09YS5jaGlsZHJlbil7ej1hLmNoaWxkcmVuO2Zvcih2YXIgRT0wO0U8ei5sZW5ndGg7RSsrKXYuYWRkKHRoaXMucGFyc2VPYmplY3QoeltFXSxjLGUpKX1pZigiTE9EIj09PWEudHlwZSlmb3IoYT1hLmxldmVscyx6PQowO3o8YS5sZW5ndGg7eisrKXtFPWFbel07dmFyIEY9di5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixFLm9iamVjdCk7dm9pZCAwIT09RiYmdi5hZGRMZXZlbChGLEUuZGlzdGFuY2UpfXJldHVybiB2fX0pO3ZhciBmbj17VVZNYXBwaW5nOjMwMCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6MzAxLEN1YmVSZWZyYWN0aW9uTWFwcGluZzozMDIsRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6MzAzLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOjMwNCxTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzozMDUsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6MzA2LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOjMwN30sQms9e1JlcGVhdFdyYXBwaW5nOjFFMyxDbGFtcFRvRWRnZVdyYXBwaW5nOjEwMDEsTWlycm9yZWRSZXBlYXRXcmFwcGluZzoxMDAyfSxDaz17TmVhcmVzdEZpbHRlcjoxMDAzLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDQsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjoxMDA1LApMaW5lYXJGaWx0ZXI6MTAwNixMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDcsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOjEwMDh9O2ppLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6amksc2V0T3B0aW9uczpmdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9YTtyZXR1cm4gdGhpc30sbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2b2lkIDA9PT1hJiYoYT0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYT10aGlzLnBhdGgrYSk7YT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChhKTt2YXIgdD10aGlzLHY9a2UuZ2V0KGEpO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHQubWFuYWdlci5pdGVtU3RhcnQoYSksc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmModik7dC5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApLHY7ZmV0Y2goYSkudGhlbihmdW5jdGlvbih6KXtyZXR1cm4gei5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB2b2lkIDA9PT0KdC5vcHRpb25zP2NyZWF0ZUltYWdlQml0bWFwKHopOmNyZWF0ZUltYWdlQml0bWFwKHosdC5vcHRpb25zKX0pLnRoZW4oZnVuY3Rpb24oeil7a2UuYWRkKGEseik7YyYmYyh6KTt0Lm1hbmFnZXIuaXRlbUVuZChhKX0pLmNhdGNoKGZ1bmN0aW9uKHope2cmJmcoeik7dC5tYW5hZ2VyLml0ZW1FcnJvcihhKTt0Lm1hbmFnZXIuaXRlbUVuZChhKX0pO3QubWFuYWdlci5pdGVtU3RhcnQoYSl9fSk7T2JqZWN0LmFzc2lnbihraS5wcm90b3R5cGUse21vdmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGg9bmV3IEljO3RoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKTt0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhhLGMpfSxsaW5lVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyhhLGMpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyhhLGMsZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyx0LHYpe3RoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyhhLGMsZSxnLHQsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KGEpfSx0b1NoYXBlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoZGEpe2Zvcih2YXIgcmE9W10scGE9MCxxYT1kYS5sZW5ndGg7cGE8cWE7cGErKyl7dmFyIHVhPWRhW3BhXSxuYT1uZXcgRmQ7bmEuY3VydmVzPXVhLmN1cnZlcztyYS5wdXNoKG5hKX1yZXR1cm4gcmF9ZnVuY3Rpb24gZyhkYSxyYSl7Zm9yKHZhciBwYT1yYS5sZW5ndGgscWE9ITEsdWE9cGEtMSxuYT0wO25hPHBhO3VhPW5hKyspe3ZhciB0YT1yYVt1YV0sQmE9cmFbbmFdLFRhPUJhLngtdGEueCxVYT1CYS55LXRhLnk7aWYoTWF0aC5hYnMoVWEpPk51bWJlci5FUFNJTE9OKXtpZigwPlVhJiYodGE9cmFbbmFdLFRhPS1UYSxCYT1yYVt1YV0sVWE9LVVhKSwhKGRhLnk8dGEueXx8ZGEueT5CYS55KSlpZihkYS55PT09dGEueSl7aWYoZGEueD09PQp0YS54KXJldHVybiEwfWVsc2V7dWE9VWEqKGRhLngtdGEueCktVGEqKGRhLnktdGEueSk7aWYoMD09PXVhKXJldHVybiEwOzA+dWF8fChxYT0hcWEpfX1lbHNlIGlmKGRhLnk9PT10YS55JiYoQmEueDw9ZGEueCYmZGEueDw9dGEueHx8dGEueDw9ZGEueCYmZGEueDw9QmEueCkpcmV0dXJuITB9cmV0dXJuIHFhfXZhciB0PWdkLmlzQ2xvY2tXaXNlLHY9dGhpcy5zdWJQYXRocztpZigwPT09di5sZW5ndGgpcmV0dXJuW107aWYoITA9PT1jKXJldHVybiBlKHYpO2M9W107aWYoMT09PXYubGVuZ3RoKXt2YXIgej12WzBdO3ZhciBFPW5ldyBGZDtFLmN1cnZlcz16LmN1cnZlcztjLnB1c2goRSk7cmV0dXJuIGN9dmFyIEY9IXQodlswXS5nZXRQb2ludHMoKSk7Rj1hPyFGOkY7RT1bXTt2YXIgST1bXSxNPVtdLFA9MDtJW1BdPXZvaWQgMDtNW1BdPVtdO2Zvcih2YXIgUT0wLFU9di5sZW5ndGg7UTxVO1ErKyl7ej12W1FdO3ZhciBWPXouZ2V0UG9pbnRzKCk7dmFyIGVhPXQoVik7KGVhPWE/IWVhOgplYSk/KCFGJiZJW1BdJiZQKyssSVtQXT17czpuZXcgRmQscDpWfSxJW1BdLnMuY3VydmVzPXouY3VydmVzLEYmJlArKyxNW1BdPVtdKTpNW1BdLnB1c2goe2g6eixwOlZbMF19KX1pZighSVswXSlyZXR1cm4gZSh2KTtpZigxPEkubGVuZ3RoKXtRPSExO2E9W107dD0wO2Zvcih2PUkubGVuZ3RoO3Q8djt0KyspRVt0XT1bXTt0PTA7Zm9yKHY9SS5sZW5ndGg7dDx2O3QrKylmb3Ioej1NW3RdLGVhPTA7ZWE8ei5sZW5ndGg7ZWErKyl7Rj16W2VhXTtQPSEwO2ZvcihWPTA7VjxJLmxlbmd0aDtWKyspZyhGLnAsSVtWXS5wKSYmKHQhPT1WJiZhLnB1c2goe2Zyb21zOnQsdG9zOlYsaG9sZTplYX0pLFA/KFA9ITEsRVtWXS5wdXNoKEYpKTpRPSEwKTtQJiZFW3RdLnB1c2goRil9MDxhLmxlbmd0aCYmKFF8fChNPUUpKX1RPTA7Zm9yKHQ9SS5sZW5ndGg7UTx0O1ErKylmb3IoRT1JW1FdLnMsYy5wdXNoKEUpLGE9TVtRXSx2PTAsej1hLmxlbmd0aDt2PHo7disrKUUuaG9sZXMucHVzaChhW3ZdLmgpOwpyZXR1cm4gY319KTtPYmplY3QuYXNzaWduKGxpLnByb3RvdHlwZSx7aXNGb250OiEwLGdlbmVyYXRlU2hhcGVzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MTAwKTt2YXIgZT1bXTthPVFtKGEsYyx0aGlzLmRhdGEpO2M9MDtmb3IodmFyIGc9YS5sZW5ndGg7YzxnO2MrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlLGFbY10udG9TaGFwZXMoKSk7cmV0dXJuIGV9fSk7bWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjptaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PXRoaXMsdj1uZXcgd2ModGhpcy5tYW5hZ2VyKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXt0cnl7dmFyIEU9SlNPTi5wYXJzZSh6KX1jYXRjaChGKXtjb25zb2xlLndhcm4oIlRIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4iKSwKRT1KU09OLnBhcnNlKHouc3Vic3RyaW5nKDY1LHoubGVuZ3RoLTIpKX16PXQucGFyc2UoRSk7YyYmYyh6KX0sZSxnKX0scGFyc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBsaShhKX19KTt2YXIgQmgscmk9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2b2lkIDA9PT1CaCYmKEJoPW5ldyAod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpO3JldHVybiBCaH0sc2V0Q29udGV4dDpmdW5jdGlvbihhKXtCaD1hfX07Y2gucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjaCxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PW5ldyB3Yyh0aGlzLm1hbmFnZXIpO3Quc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO3Quc2V0UGF0aCh0aGlzLnBhdGgpO3QubG9hZChhLGZ1bmN0aW9uKHYpe3Y9di5zbGljZSgwKTtyaS5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKHYsZnVuY3Rpb24oeil7Yyh6KX0pfSwKZSxnKX19KTtPYmplY3QuYXNzaWduKGRoLnByb3RvdHlwZSx7aXNTcGhlcmljYWxIYXJtb25pY3MzOiEwLHNldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmNvcHkoYVtjXSk7cmV0dXJuIHRoaXN9LHplcm86ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDs5PmE7YSsrKXRoaXMuY29lZmZpY2llbnRzW2FdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9LGdldEF0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciB0PXRoaXMuY29lZmZpY2llbnRzO2MuY29weSh0WzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KTtjLmFkZFNjYWxlKHRbMV0sLjQ4ODYwMypnKTtjLmFkZFNjYWxlKHRbMl0sLjQ4ODYwMyphKTtjLmFkZFNjYWxlKHRbM10sLjQ4ODYwMyplKTtjLmFkZFNjYWxlKHRbNF0sMS4wOTI1NDgqZSpnKTtjLmFkZFNjYWxlKHRbNV0sMS4wOTI1NDgqZyphKTtjLmFkZFNjYWxlKHRbNl0sLjMxNTM5MiooMyphKmEtMSkpOwpjLmFkZFNjYWxlKHRbN10sMS4wOTI1NDgqZSphKTtjLmFkZFNjYWxlKHRbOF0sLjU0NjI3NCooZSplLWcqZykpO3JldHVybiBjfSxnZXRJcnJhZGlhbmNlQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHQ9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHRbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpO2MuYWRkU2NhbGUodFsxXSwxLjAyMzMyOCpnKTtjLmFkZFNjYWxlKHRbMl0sMS4wMjMzMjgqYSk7Yy5hZGRTY2FsZSh0WzNdLDEuMDIzMzI4KmUpO2MuYWRkU2NhbGUodFs0XSwuODU4MDg2KmUqZyk7Yy5hZGRTY2FsZSh0WzVdLC44NTgwODYqZyphKTtjLmFkZFNjYWxlKHRbNl0sLjc0MzEyNSphKmEtLjI0NzcwOCk7Yy5hZGRTY2FsZSh0WzddLC44NTgwODYqZSphKTtjLmFkZFNjYWxlKHRbOF0sLjQyOTA0MyooZSplLWcqZykpO3JldHVybiBjfSxhZGQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKyl0aGlzLmNvZWZmaWNpZW50c1tjXS5hZGQoYS5jb2VmZmljaWVudHNbY10pOwpyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKyl0aGlzLmNvZWZmaWNpZW50c1tjXS5tdWx0aXBseVNjYWxhcihhKTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubGVycChhLmNvZWZmaWNpZW50c1tlXSxjKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2NdLmVxdWFscyhhLmNvZWZmaWNpZW50c1tjXSkpcmV0dXJuITE7cmV0dXJuITB9LGNvcHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0KGEuY29lZmZpY2llbnRzKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT10aGlzLmNvZWZmaWNpZW50cyxnPTA7OT5nO2crKyllW2ddLmZyb21BcnJheShhLApjKzMqZyk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10udG9BcnJheShhLGMrMypnKTtyZXR1cm4gYX19KTtPYmplY3QuYXNzaWduKGRoLHtnZXRCYXNpc0F0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O2NbMF09LjI4MjA5NTtjWzFdPS40ODg2MDMqZztjWzJdPS40ODg2MDMqYTtjWzNdPS40ODg2MDMqZTtjWzRdPTEuMDkyNTQ4KmUqZztjWzVdPTEuMDkyNTQ4KmcqYTtjWzZdPS4zMTUzOTIqKDMqYSphLTEpO2NbN109MS4wOTI1NDgqZSphO2NbOF09LjU0NjI3NCooZSplLWcqZyl9fSk7SmMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpKYyxpc0xpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtLYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuc2guY29weShhLnNoKTt0aGlzLmludGVuc2l0eT1hLmludGVuc2l0eTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBLYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtuaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm5pLGlzSGVtaXNwaGVyZUxpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtKYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSmMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSl9fSk7b2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpvaSxpc0FtYmllbnRMaWdodFByb2JlOiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEpjLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLAphKX19KTt2YXIgRGs9bmV3IHEsRWs9bmV3IHE7T2JqZWN0LmFzc2lnbihaai5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9jYWNoZTtpZihjLmZvY3VzIT09YS5mb2N1c3x8Yy5mb3YhPT1hLmZvdnx8Yy5hc3BlY3QhPT1hLmFzcGVjdCp0aGlzLmFzcGVjdHx8Yy5uZWFyIT09YS5uZWFyfHxjLmZhciE9PWEuZmFyfHxjLnpvb20hPT1hLnpvb218fGMuZXllU2VwIT09dGhpcy5leWVTZXApe2MuZm9jdXM9YS5mb2N1cztjLmZvdj1hLmZvdjtjLmFzcGVjdD1hLmFzcGVjdCp0aGlzLmFzcGVjdDtjLm5lYXI9YS5uZWFyO2MuZmFyPWEuZmFyO2Muem9vbT1hLnpvb207Yy5leWVTZXA9dGhpcy5leWVTZXA7dmFyIGU9YS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCksZz1jLmV5ZVNlcC8yLHQ9ZypjLm5lYXIvYy5mb2N1cyx2PWMubmVhcipNYXRoLnRhbihoYi5ERUcyUkFEKmMuZm92Ki41KS9jLnpvb207RWsuZWxlbWVudHNbMTJdPS1nO0RrLmVsZW1lbnRzWzEyXT0KZztnPS12KmMuYXNwZWN0K3Q7dmFyIHo9dipjLmFzcGVjdCt0O2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpO2c9LXYqYy5hc3BlY3QtdDt6PXYqYy5hc3BlY3QtdDtlLmVsZW1lbnRzWzBdPTIqYy5uZWFyLyh6LWcpO2UuZWxlbWVudHNbOF09KHorZykvKHotZyk7dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShlKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseShFayk7dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoYS5tYXRyaXhXb3JsZCkubXVsdGlwbHkoRGspfX0pO09iamVjdC5hc3NpZ24ocGkucHJvdG90eXBlLHtzdGFydDpmdW5jdGlvbigpe3RoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0oInVuZGVmaW5lZCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCk7CnRoaXMuZWxhcHNlZFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITB9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmdldEVsYXBzZWRUaW1lKCk7dGhpcy5hdXRvU3RhcnQ9dGhpcy5ydW5uaW5nPSExfSxnZXRFbGFwc2VkVGltZTpmdW5jdGlvbigpe3RoaXMuZ2V0RGVsdGEoKTtyZXR1cm4gdGhpcy5lbGFwc2VkVGltZX0sZ2V0RGVsdGE6ZnVuY3Rpb24oKXt2YXIgYT0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe3ZhciBjPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTthPShjLXRoaXMub2xkVGltZSkvMUUzO3RoaXMub2xkVGltZT1jO3RoaXMuZWxhcHNlZFRpbWUrPWF9cmV0dXJuIGF9fSk7dmFyIGxlPW5ldyBrLEZrPW5ldyBoLGduPW5ldyBrLG1lPW5ldyBrO3FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6cWksZ2V0SW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxyZW1vdmVGaWx0ZXI6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5maWx0ZXImJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcn0sc2V0RmlsdGVyOmZ1bmN0aW9uKGEpe251bGwhPT10aGlzLmZpbHRlcj8odGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSk6dGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTt0aGlzLmZpbHRlcj1hO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZmlsdGVyKTsKdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3JldHVybiB0aGlzfSxnZXRNYXN0ZXJWb2x1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9LHNldE1hc3RlclZvbHVtZTpmdW5jdGlvbihhKXt0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoYSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKTtyZXR1cm4gdGhpc30sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpO2E9dGhpcy5jb250ZXh0Lmxpc3RlbmVyO3ZhciBjPXRoaXMudXA7dGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZSxGayxnbik7bWUuc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKEZrKTtpZihhLnBvc2l0aW9uWCl7dmFyIGU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhOwphLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS54LGUpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnksZSk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueixlKTthLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLngsZSk7YS5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS55LGUpO2EuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueixlKTthLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLngsZSk7YS51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy55LGUpO2EudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueixlKX1lbHNlIGEuc2V0UG9zaXRpb24obGUueCxsZS55LGxlLnopLGEuc2V0T3JpZW50YXRpb24obWUueCxtZS55LG1lLnosYy54LGMueSxjLnopfX0pO1llLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6WWUsZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbn0sc2V0Tm9kZVNvdXJjZTpmdW5jdGlvbihhKXt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMTt0aGlzLnNvdXJjZVR5cGU9ImF1ZGlvTm9kZSI7dGhpcy5zb3VyY2U9YTt0aGlzLmNvbm5lY3QoKTtyZXR1cm4gdGhpc30sc2V0TWVkaWFFbGVtZW50U291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIjt0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKGEpO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRCdWZmZXI6ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXI9YTt0aGlzLnNvdXJjZVR5cGU9ImJ1ZmZlciI7dGhpcy5hdXRvcGxheSYmdGhpcy5wbGF5KCk7cmV0dXJuIHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtpZighMD09PXRoaXMuaXNQbGF5aW5nKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTsKZWxzZSBpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZXt2YXIgYT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7YS5idWZmZXI9dGhpcy5idWZmZXI7YS5sb29wPXRoaXMubG9vcDthLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyk7dGhpcy5zdGFydFRpbWU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO2Euc3RhcnQodGhpcy5zdGFydFRpbWUsdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbik7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5zb3VyY2U9YTt0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSk7dGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpO3JldHVybiB0aGlzLmNvbm5lY3QoKX19LHBhdXNlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0Kz0odGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLXRoaXMuc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmlzUGxheWluZz0hMSksdGhpc30sc3RvcDpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNlIHJldHVybiB0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0PTAsdGhpcy5pc1BsYXlpbmc9ITEsdGhpc30sY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLQoxXS5jb25uZWN0KHRoaXMuZmlsdGVyc1thXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtpZigwPHRoaXMuZmlsdGVycy5sZW5ndGgpe3RoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IodmFyIGE9MSxjPXRoaXMuZmlsdGVycy5sZW5ndGg7YTxjO2ErKyl0aGlzLmZpbHRlcnNbYS0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1thXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJzfSxzZXRGaWx0ZXJzOmZ1bmN0aW9uKGEpe2F8fAooYT1bXSk7ITA9PT10aGlzLmlzUGxheWluZz8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWEsdGhpcy5jb25uZWN0KCkpOnRoaXMuZmlsdGVycz1hO3JldHVybiB0aGlzfSxzZXREZXR1bmU6ZnVuY3Rpb24oYSl7dGhpcy5kZXR1bmU9YTtpZih2b2lkIDAhPT10aGlzLnNvdXJjZS5kZXR1bmUpcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXREZXR1bmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXR1bmV9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX0sc2V0RmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoYT9bYV06W10pfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZT1hLCEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5wbGF5YmFja1JhdGUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc30sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfSxvbkVuZGVkOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITF9LGdldExvb3A6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9LHNldExvb3A6ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMubG9vcD0KYSwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9LGdldFZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0Vm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfX0pO3ZhciBuZT1uZXcgayxHaz1uZXcgaCxobj1uZXcgayxvZT1uZXcgaztzaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFllLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnNpLGdldE91dHB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lcn0sZ2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9LHNldFJlZkRpc3RhbmNlOmZ1bmN0aW9uKGEpe3RoaXMucGFubmVyLnJlZkRpc3RhbmNlPWE7cmV0dXJuIHRoaXN9LGdldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcn0sCnNldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj1hO3JldHVybiB0aGlzfSxnZXREaXN0YW5jZU1vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWx9LHNldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbD1hO3JldHVybiB0aGlzfSxnZXRNYXhEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX0sc2V0TWF4RGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sc2V0RGlyZWN0aW9uYWxDb25lOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZT1hO3RoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlPWM7dGhpcy5wYW5uZXIuY29uZU91dGVyR2Fpbj1lO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsCmEpO2lmKCEwIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2x8fCExIT09dGhpcy5pc1BsYXlpbmcpaWYodGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UobmUsR2ssaG4pLG9lLnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKEdrKSxhPXRoaXMucGFubmVyLGEucG9zaXRpb25YKXt2YXIgYz10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7YS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobmUueCxjKTthLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuZS55LGMpO2EucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG5lLnosYyk7YS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUob2UueCxjKTthLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShvZS55LGMpO2Eub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG9lLnosYyl9ZWxzZSBhLnNldFBvc2l0aW9uKG5lLngsCm5lLnksbmUueiksYS5zZXRPcmllbnRhdGlvbihvZS54LG9lLnksb2Uueil9fSk7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUse2dldEZyZXF1ZW5jeURhdGE6ZnVuY3Rpb24oKXt0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuZGF0YX0sZ2V0QXZlcmFnZUZyZXF1ZW5jeTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCksZT0wO2U8Yy5sZW5ndGg7ZSsrKWErPWNbZV07cmV0dXJuIGEvYy5sZW5ndGh9fSk7T2JqZWN0LmFzc2lnbih1aS5wcm90b3R5cGUse2FjY3VtdWxhdGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmJ1ZmZlcixnPXRoaXMudmFsdWVTaXplO2E9YSpnK2c7dmFyIHQ9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT10KXtmb3IodD0wO3QhPT1nOysrdCllW2ErdF09ZVt0XTt0PWN9ZWxzZSB0Kz1jLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihlLGEsMCxjL3QsZyk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PQp0fSxhcHBseTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZhbHVlU2l6ZSxlPXRoaXMuYnVmZmVyO2E9YSpjK2M7dmFyIGc9dGhpcy5jdW11bGF0aXZlV2VpZ2h0LHQ9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wOzE+ZyYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwzKmMsMS1nLGMpO2c9Yztmb3IodmFyIHY9YytjO2chPT12OysrZylpZihlW2ddIT09ZVtnK2NdKXt0LnNldFZhbHVlKGUsYSk7YnJlYWt9fSxzYXZlT3JpZ2luYWxTdGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYnVmZmVyLGM9dGhpcy52YWx1ZVNpemUsZT0zKmM7dGhpcy5iaW5kaW5nLmdldFZhbHVlKGEsZSk7Zm9yKHZhciBnPWM7ZyE9PWU7KytnKWFbZ109YVtlK2clY107dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9LHJlc3RvcmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfSxfc2VsZWN0OmZ1bmN0aW9uKGEsCmMsZSxnLHQpe2lmKC41PD1nKWZvcihnPTA7ZyE9PXQ7KytnKWFbYytnXT1hW2UrZ119LF9zbGVycDpmdW5jdGlvbihhLGMsZSxnKXtoLnNsZXJwRmxhdChhLGMsYSxjLGEsZSxnKX0sX2xlcnA6ZnVuY3Rpb24oYSxjLGUsZyx0KXtmb3IodmFyIHY9MS1nLHo9MDt6IT09dDsrK3ope3ZhciBFPWMrejthW0VdPWFbRV0qdithW2Urel0qZ319fSk7dmFyIGpuPS9bXFtcXVwuOlwvXS9nLGtuPSJbXiIrIlxcW1xcXVxcLjpcXC8iLnJlcGxhY2UoIlxcLiIsIiIpKyJdIixsbj0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksbW49LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsa24pLG5uPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksb249L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIikscG49Cm5ldyBSZWdFeHAoIl4iK2xuK21uK25uK29uKyIkIikscW49WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07T2JqZWN0LmFzc2lnbihhay5wcm90b3R5cGUse2dldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dmFyIGU9dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1lJiZlLmdldFZhbHVlKGEsYyl9LHNldFZhbHVlOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMuX2JpbmRpbmdzLGc9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHQ9ZS5sZW5ndGg7ZyE9PXQ7KytnKWVbZ10uc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9iaW5kaW5ncyxjPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxlPWEubGVuZ3RoO2MhPT1lOysrYylhW2NdLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLAplPWEubGVuZ3RoO2MhPT1lOysrYylhW2NdLnVuYmluZCgpfX0pO09iamVjdC5hc3NpZ24oY2Mse0NvbXBvc2l0ZTphayxjcmVhdGU6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhJiZhLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IGNjLkNvbXBvc2l0ZShhLGMsZSk6bmV3IGNjKGEsYyxlKX0sc2FuaXRpemVOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShqbiwiIil9LHBhcnNlVHJhY2tOYW1lOmZ1bmN0aW9uKGEpe3ZhciBjPXBuLmV4ZWMoYSk7aWYoIWMpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIithKTtjPXtub2RlTmFtZTpjWzJdLG9iamVjdE5hbWU6Y1szXSxvYmplY3RJbmRleDpjWzRdLHByb3BlcnR5TmFtZTpjWzVdLHByb3BlcnR5SW5kZXg6Y1s2XX07dmFyIGU9Yy5ub2RlTmFtZSYmYy5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWUmJi0xIT09CmUpe3ZhciBnPWMubm9kZU5hbWUuc3Vic3RyaW5nKGUrMSk7LTEhPT1xbi5pbmRleE9mKGcpJiYoYy5ub2RlTmFtZT1jLm5vZGVOYW1lLnN1YnN0cmluZygwLGUpLGMub2JqZWN0TmFtZT1nKX1pZihudWxsPT09Yy5wcm9wZXJ0eU5hbWV8fDA9PT1jLnByb3BlcnR5TmFtZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrYSk7cmV0dXJuIGN9LGZpbmROb2RlOmZ1bmN0aW9uKGEsYyl7aWYoIWN8fCIiPT09Y3x8InJvb3QiPT09Y3x8Ii4iPT09Y3x8LTE9PT1jfHxjPT09YS5uYW1lfHxjPT09YS51dWlkKXJldHVybiBhO2lmKGEuc2tlbGV0b24pe3ZhciBlPWEuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShjKTtpZih2b2lkIDAhPT1lKXJldHVybiBlfWlmKGEuY2hpbGRyZW4pe3ZhciBnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgdj0wO3Y8dC5sZW5ndGg7disrKXt2YXIgej10W3ZdO2lmKHoubmFtZT09PQpjfHx6LnV1aWQ9PT1jKXJldHVybiB6O2lmKHo9Zyh6LmNoaWxkcmVuKSlyZXR1cm4gen1yZXR1cm4gbnVsbH07aWYoYT1nKGEuY2hpbGRyZW4pKXJldHVybiBhfXJldHVybiBudWxsfX0pO09iamVjdC5hc3NpZ24oY2MucHJvdG90eXBlLHtfZ2V0VmFsdWVfdW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt9LF9zZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sQmluZGluZ1R5cGU6e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sVmVyc2lvbmluZzp7Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxHZXR0ZXJCeUJpbmRpbmdUeXBlOltmdW5jdGlvbihhLGMpe2FbY109dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCx0PWUubGVuZ3RoO2chPT10OysrZylhW2MrK109ZVtnXX0sZnVuY3Rpb24oYSxjKXthW2NdPQp0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheShhLGMpfV0sU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6W1tmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdfSxmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCx0PWUubGVuZ3RoO2chPT10OysrZyllW2ddPWFbYysrXX0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LApnPTAsdD1lLmxlbmd0aDtnIT09dDsrK2cpZVtnXT1hW2MrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxnPTAsdD1lLmxlbmd0aDtnIT09dDsrK2cpZVtnXT1hW2MrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGEsCmMpfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGEsYyk7dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dXSxnZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt0aGlzLnNldFZhbHVlKGEsYyl9LGJpbmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5vZGUsYz10aGlzLnBhcnNlZFBhdGgsZT1jLm9iamVjdE5hbWUsZz1jLnByb3BlcnR5TmFtZSx0PWMucHJvcGVydHlJbmRleDthfHwodGhpcy5ub2RlPWE9Y2MuZmluZE5vZGUodGhpcy5yb290Tm9kZSxjLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSk7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtpZihhKXtpZihlKXt2YXIgdj1jLm9iamVjdEluZGV4O3N3aXRjaChlKXtjYXNlICJtYXRlcmlhbHMiOmlmKCFhLm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighYS5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59YT1hLm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlICJib25lcyI6aWYoIWEuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsCnRoaXMpO3JldHVybn1hPWEuc2tlbGV0b24uYm9uZXM7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKylpZihhW2VdLm5hbWU9PT12KXt2PWU7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT1hW2VdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWE9YVtlXX1pZih2b2lkIDAhPT12KXtpZih2b2lkIDA9PT1hW3ZdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGEpO3JldHVybn1hPWFbdl19fXY9YVtnXTtpZih2b2lkIDA9PT12KWNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrYy5ub2RlTmFtZSsiLiIrZysiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIiwKYSk7ZWxzZXtjPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PWE7dm9pZCAwIT09YS5uZWVkc1VwZGF0ZT9jPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT1hLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihjPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtlPXRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O2lmKHZvaWQgMCE9PXQpe2lmKCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiPT09Zyl7aWYoIWEuZ2VvbWV0cnkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7cmV0dXJufWlmKGEuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSl7aWYoIWEuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIiwKdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bZV0ubmFtZT09PXQpe3Q9ZTticmVha319ZWxzZXtpZighYS5nZW9tZXRyeS5tb3JwaFRhcmdldHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4iLHRoaXMpO3JldHVybn1mb3IoZT0wO2U8dGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7ZSsrKWlmKGEuZ2VvbWV0cnkubW9ycGhUYXJnZXRzW2VdLm5hbWU9PT10KXt0PWU7YnJlYWt9fX1lPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O3RoaXMucmVzb2x2ZWRQcm9wZXJ0eT12O3RoaXMucHJvcGVydHlJbmRleD10fWVsc2Ugdm9pZCAwIT09CnYuZnJvbUFycmF5JiZ2b2lkIDAhPT12LnRvQXJyYXk/KGU9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9dik6QXJyYXkuaXNBcnJheSh2KT8oZT10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTp0aGlzLnByb3BlcnR5TmFtZT1nO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW2VdO3RoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1tlXVtjXX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKX0sdW5iaW5kOmZ1bmN0aW9uKCl7dGhpcy5ub2RlPW51bGw7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kO3RoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19KTsKT2JqZWN0LmFzc2lnbihjYy5wcm90b3R5cGUse19nZXRWYWx1ZV91bmJvdW5kOmNjLnByb3RvdHlwZS5nZXRWYWx1ZSxfc2V0VmFsdWVfdW5ib3VuZDpjYy5wcm90b3R5cGUuc2V0VmFsdWV9KTtPYmplY3QuYXNzaWduKGJrLnByb3RvdHlwZSx7aXNBbmltYXRpb25PYmplY3RHcm91cDohMCxhZGQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb2JqZWN0cyxjPWEubGVuZ3RoLGU9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZz10aGlzLl9pbmRpY2VzQnlVVUlELHQ9dGhpcy5fcGF0aHMsdj10aGlzLl9wYXJzZWRQYXRocyx6PXRoaXMuX2JpbmRpbmdzLEU9ei5sZW5ndGgsRj12b2lkIDAsST0wLE09YXJndW1lbnRzLmxlbmd0aDtJIT09TTsrK0kpe3ZhciBQPWFyZ3VtZW50c1tJXSxRPVAudXVpZCxVPWdbUV07aWYodm9pZCAwPT09VSl7VT1jKys7Z1tRXT1VO2EucHVzaChQKTtRPTA7Zm9yKHZhciBWPUU7USE9PVY7KytRKXpbUV0ucHVzaChuZXcgY2MoUCx0W1FdLHZbUV0pKX1lbHNlIGlmKFU8CmUpe0Y9YVtVXTt2YXIgZWE9LS1lO1Y9YVtlYV07Z1tWLnV1aWRdPVU7YVtVXT1WO2dbUV09ZWE7YVtlYV09UDtRPTA7Zm9yKFY9RTtRIT09VjsrK1Epe3ZhciBkYT16W1FdLHJhPWRhW1VdO2RhW1VdPWRhW2VhXTt2b2lkIDA9PT1yYSYmKHJhPW5ldyBjYyhQLHRbUV0sdltRXSkpO2RhW2VhXT1yYX19ZWxzZSBhW1VdIT09RiYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxyZW1vdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb2JqZWN0cyxjPXRoaXMubkNhY2hlZE9iamVjdHNfLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxnPXRoaXMuX2JpbmRpbmdzLHQ9Zy5sZW5ndGgsdj0wLHo9YXJndW1lbnRzLmxlbmd0aDt2IT09Cno7Kyt2KXt2YXIgRT1hcmd1bWVudHNbdl0sRj1FLnV1aWQsST1lW0ZdO2lmKHZvaWQgMCE9PUkmJkk+PWMpe3ZhciBNPWMrKyxQPWFbTV07ZVtQLnV1aWRdPUk7YVtJXT1QO2VbRl09TTthW01dPUU7RT0wO2ZvcihGPXQ7RSE9PUY7KytFKXtQPWdbRV07dmFyIFE9UFtJXTtQW0ldPVBbTV07UFtNXT1RfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189Y30sdW5jYWNoZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQsdD10aGlzLl9iaW5kaW5ncyx2PXQubGVuZ3RoLHo9MCxFPWFyZ3VtZW50cy5sZW5ndGg7eiE9PUU7Kyt6KXt2YXIgRj1hcmd1bWVudHNbel0udXVpZCxJPWdbRl07aWYodm9pZCAwIT09SSlpZihkZWxldGUgZ1tGXSxJPGUpe0Y9LS1lO3ZhciBNPWFbRl0sUD0tLWMsUT1hW1BdO2dbTS51dWlkXT1JO2FbSV09TTtnW1EudXVpZF09RjthW0ZdPVE7YS5wb3AoKTtNPQowO2ZvcihRPXY7TSE9PVE7KytNKXt2YXIgVT10W01dLFY9VVtQXTtVW0ldPVVbRl07VVtGXT1WO1UucG9wKCl9fWVsc2UgZm9yKFA9LS1jLFE9YVtQXSxnW1EudXVpZF09SSxhW0ldPVEsYS5wb3AoKSxNPTAsUT12O00hPT1ROysrTSlVPXRbTV0sVVtJXT1VW1BdLFUucG9wKCl9dGhpcy5uQ2FjaGVkT2JqZWN0c189ZX0sc3Vic2NyaWJlXzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxnPWVbYV0sdD10aGlzLl9iaW5kaW5ncztpZih2b2lkIDAhPT1nKXJldHVybiB0W2ddO3ZhciB2PXRoaXMuX3BhdGhzLHo9dGhpcy5fcGFyc2VkUGF0aHMsRT10aGlzLl9vYmplY3RzLEY9dGhpcy5uQ2FjaGVkT2JqZWN0c18sST1BcnJheShFLmxlbmd0aCk7Zz10Lmxlbmd0aDtlW2FdPWc7di5wdXNoKGEpO3oucHVzaChjKTt0LnB1c2goSSk7ZT1GO2ZvcihnPUUubGVuZ3RoO2UhPT1nOysrZSlJW2VdPW5ldyBjYyhFW2VdLGEsYyk7cmV0dXJuIEl9LHVuc3Vic2NyaWJlXzpmdW5jdGlvbihhKXt2YXIgYz0KdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGU9Y1thXTtpZih2b2lkIDAhPT1lKXt2YXIgZz10aGlzLl9wYXRocyx0PXRoaXMuX3BhcnNlZFBhdGhzLHY9dGhpcy5fYmluZGluZ3Msej12Lmxlbmd0aC0xLEU9dlt6XTtjW2Fbel1dPWU7dltlXT1FO3YucG9wKCk7dFtlXT10W3pdO3QucG9wKCk7Z1tlXT1nW3pdO2cucG9wKCl9fX0pO09iamVjdC5hc3NpZ24oY2sucHJvdG90eXBlLHtwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpO3JldHVybiB0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50aW1lPTA7dGhpcy5fbG9vcENvdW50PS0xO3RoaXMuX3N0YXJ0VGltZT1udWxsO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfSxpc1J1bm5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYKIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0saXNTY2hlZHVsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxzdGFydEF0OmZ1bmN0aW9uKGEpe3RoaXMuX3N0YXJ0VGltZT1hO3JldHVybiB0aGlzfSxzZXRMb29wOmZ1bmN0aW9uKGEsYyl7dGhpcy5sb29wPWE7dGhpcy5yZXBldGl0aW9ucz1jO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVXZWlnaHQ6ZnVuY3Rpb24oYSl7dGhpcy53ZWlnaHQ9YTt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP2E6MDtyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCl9LGdldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9LGZhZGVJbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoYSwwLDEpfSxmYWRlT3V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLAoxLDApfSxjcm9zc0ZhZGVGcm9tOmZ1bmN0aW9uKGEsYyxlKXthLmZhZGVPdXQoYyk7dGhpcy5mYWRlSW4oYyk7aWYoZSl7ZT10aGlzLl9jbGlwLmR1cmF0aW9uO3ZhciBnPWEuX2NsaXAuZHVyYXRpb24sdD1lL2c7YS53YXJwKDEsZy9lLGMpO3RoaXMud2FycCh0LDEsYyl9cmV0dXJuIHRoaXN9LGNyb3NzRmFkZVRvOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gYS5jcm9zc0ZhZGVGcm9tKHRoaXMsYyxlKX0sc3RvcEZhZGluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVUaW1lU2NhbGU6ZnVuY3Rpb24oYSl7dGhpcy50aW1lU2NhbGU9YTt0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDphO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGdldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9LApzZXREdXJhdGlvbjpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL2E7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sc3luY1dpdGg6ZnVuY3Rpb24oYSl7dGhpcy50aW1lPWEudGltZTt0aGlzLnRpbWVTY2FsZT1hLnRpbWVTY2FsZTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxoYWx0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsYSl9LHdhcnA6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHQ9Zy50aW1lLHY9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsej10aGlzLnRpbWVTY2FsZTtudWxsPT09diYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXY9Zy5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpKTtnPXYucGFyYW1ldGVyUG9zaXRpb25zO3Y9di5zYW1wbGVWYWx1ZXM7Z1swXT10O2dbMV09dCtlO3ZbMF09YS96O3ZbMV09Yy96O3JldHVybiB0aGlzfSxzdG9wV2FycGluZzpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtudWxsIT09YSYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGEpKTtyZXR1cm4gdGhpc30sZ2V0TWl4ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9LGdldENsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcH0sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fSxfdXBkYXRlOmZ1bmN0aW9uKGEsYyxlLGcpe2lmKHRoaXMuZW5hYmxlZCl7dmFyIHQ9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT10KXtjPShhLXQpKmU7aWYoMD5jfHwwPT09ZSlyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGw7Yyo9ZX1jKj10aGlzLl91cGRhdGVUaW1lU2NhbGUoYSk7ZT10aGlzLl91cGRhdGVUaW1lKGMpO2E9dGhpcy5fdXBkYXRlV2VpZ2h0KGEpO2lmKDA8YSl7Yz10aGlzLl9pbnRlcnBvbGFudHM7CnQ9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIHY9MCx6PWMubGVuZ3RoO3YhPT16OysrdiljW3ZdLmV2YWx1YXRlKGUpLHRbdl0uYWNjdW11bGF0ZShnLGEpfX1lbHNlIHRoaXMuX3VwZGF0ZVdlaWdodChhKX0sX3VwZGF0ZVdlaWdodDpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKHRoaXMuZW5hYmxlZCl7Yz10aGlzLndlaWdodDt2YXIgZT10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTtjKj1nO2E+ZS5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09ZyYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWN9LF91cGRhdGVUaW1lU2NhbGU6ZnVuY3Rpb24oYSl7dmFyIGM9MDtpZighdGhpcy5wYXVzZWQpe2M9dGhpcy50aW1lU2NhbGU7dmFyIGU9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7aWYobnVsbCE9PWUpe3ZhciBnPWUuZXZhbHVhdGUoYSlbMF07CmMqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSwwPT09Yz90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT1jKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT1jfSxfdXBkYXRlVGltZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnRpbWUrYSxlPXRoaXMuX2NsaXAuZHVyYXRpb24sZz10aGlzLmxvb3AsdD10aGlzLl9sb29wQ291bnQsdj0yMjAyPT09ZztpZigwPT09YSlyZXR1cm4tMT09PXQ/Yzp2JiYxPT09KHQmMSk/ZS1jOmM7aWYoMjIwMD09PWcpYTp7aWYoLTE9PT10JiYodGhpcy5fbG9vcENvdW50PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwhMCwhMSkpLGM+PWUpYz1lO2Vsc2UgaWYoMD5jKWM9MDtlbHNle3RoaXMudGltZT1jO2JyZWFrIGF9dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITE7dGhpcy50aW1lPWM7dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLAphY3Rpb246dGhpcyxkaXJlY3Rpb246MD5hPy0xOjF9KX1lbHNley0xPT09dCYmKDA8PWE/KHQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLDA9PT10aGlzLnJlcGV0aXRpb25zLHYpKTp0aGlzLl9zZXRFbmRpbmdzKDA9PT10aGlzLnJlcGV0aXRpb25zLCEwLHYpKTtpZihjPj1lfHwwPmMpe2c9TWF0aC5mbG9vcihjL2UpO2MtPWUqZzt0Kz1NYXRoLmFicyhnKTt2YXIgej10aGlzLnJlcGV0aXRpb25zLXQ7MD49ej8odGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsdGhpcy50aW1lPWM9MDxhP2U6MCx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOjA8YT8xOi0xfSkpOigxPT09ej8oYT0wPmEsdGhpcy5fc2V0RW5kaW5ncyhhLCFhLHYpKTp0aGlzLl9zZXRFbmRpbmdzKCExLCExLHYpLHRoaXMuX2xvb3BDb3VudD10LHRoaXMudGltZT1jLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLAphY3Rpb246dGhpcyxsb29wRGVsdGE6Z30pKX1lbHNlIHRoaXMudGltZT1jO2lmKHYmJjE9PT0odCYxKSlyZXR1cm4gZS1jfXJldHVybiBjfSxfc2V0RW5kaW5nczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztlPyhnLmVuZGluZ1N0YXJ0PTI0MDEsZy5lbmRpbmdFbmQ9MjQwMSk6KGcuZW5kaW5nU3RhcnQ9YT90aGlzLnplcm9TbG9wZUF0U3RhcnQ/MjQwMToyNDAwOjI0MDIsZy5lbmRpbmdFbmQ9Yz90aGlzLnplcm9TbG9wZUF0RW5kPzI0MDE6MjQwMDoyNDAyKX0sX3NjaGVkdWxlRmFkaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9taXhlcix0PWcudGltZSx2PXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGw9PT12JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXQ7dlswXT1jO2dbMV09dCthO3ZbMV09CmU7cmV0dXJuIHRoaXN9fSk7dmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZpLF9iaW5kQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5fbG9jYWxSb290fHx0aGlzLl9yb290LGc9YS5fY2xpcC50cmFja3MsdD1nLmxlbmd0aCx2PWEuX3Byb3BlcnR5QmluZGluZ3M7YT1hLl9pbnRlcnBvbGFudHM7dmFyIHo9ZS51dWlkLEU9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLEY9RVt6XTt2b2lkIDA9PT1GJiYoRj17fSxFW3pdPUYpO2ZvcihFPTA7RSE9PXQ7KytFKXt2YXIgST1nW0VdLE09SS5uYW1lLFA9RltNXTtpZih2b2lkIDA9PT1QKXtQPXZbRV07aWYodm9pZCAwIT09UCl7bnVsbD09PVAuX2NhY2hlSW5kZXgmJigrK1AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFAseixNKSk7Y29udGludWV9UD1uZXcgdWkoY2MuY3JlYXRlKGUsTSxjJiZjLl9wcm9wZXJ0eUJpbmRpbmdzW0VdLmJpbmRpbmcucGFyc2VkUGF0aCksCkkuVmFsdWVUeXBlTmFtZSxJLmdldFZhbHVlU2l6ZSgpKTsrK1AucmVmZXJlbmNlQ291bnQ7dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFAseixNKX12W0VdPVA7YVtFXS5yZXN1bHRCdWZmZXI9UC5idWZmZXJ9fSxfYWN0aXZhdGVBY3Rpb246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtpZihudWxsPT09YS5fY2FjaGVJbmRleCl7dmFyIGM9KGEuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxlPWEuX2NsaXAudXVpZCxnPXRoaXMuX2FjdGlvbnNCeUNsaXBbZV07dGhpcy5fYmluZEFjdGlvbihhLGcmJmcua25vd25BY3Rpb25zWzBdKTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihhLGUsYyl9Yz1hLl9wcm9wZXJ0eUJpbmRpbmdzO2U9MDtmb3IoZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciB0PWNbZV07MD09PXQudXNlQ291bnQrKyYmKHRoaXMuX2xlbmRCaW5kaW5nKHQpLHQuc2F2ZU9yaWdpbmFsU3RhdGUoKSl9dGhpcy5fbGVuZEFjdGlvbihhKX19LApfZGVhY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbihhKSl7Zm9yKHZhciBjPWEuX3Byb3BlcnR5QmluZGluZ3MsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKXt2YXIgdD1jW2VdOzA9PT0tLXQudXNlQ291bnQmJih0LnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKHQpKX10aGlzLl90YWtlQmFja0FjdGlvbihhKX19LF9pbml0TWVtb3J5TWFuYWdlcjpmdW5jdGlvbigpe3RoaXMuX2FjdGlvbnM9W107dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDt0aGlzLl9hY3Rpb25zQnlDbGlwPXt9O3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX25BY3RpdmVCaW5kaW5ncz0wO3RoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fTt0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdO3RoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7dmFyIGE9dGhpczt0aGlzLnN0YXRzPXthY3Rpb25zOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYWN0aW9ucy5sZW5ndGh9LApnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGEuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGEuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fSxfaXNBY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7YT1hLl9jYWNoZUluZGV4O3JldHVybiBudWxsIT09YSYmYTx0aGlzLl9uQWN0aXZlQWN0aW9uc30sX2FkZEluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9hY3Rpb25zLHQ9dGhpcy5fYWN0aW9uc0J5Q2xpcCx2PXRbY107dm9pZCAwPT09dj8odj17a25vd25BY3Rpb25zOlthXSxhY3Rpb25CeVJvb3Q6e319LGEuX2J5Q2xpcENhY2hlSW5kZXg9MCx0W2NdPXYpOihjPQp2Lmtub3duQWN0aW9ucyxhLl9ieUNsaXBDYWNoZUluZGV4PWMubGVuZ3RoLGMucHVzaChhKSk7YS5fY2FjaGVJbmRleD1nLmxlbmd0aDtnLnB1c2goYSk7di5hY3Rpb25CeVJvb3RbZV09YX0sX3JlbW92ZUluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1jW2MubGVuZ3RoLTFdLGc9YS5fY2FjaGVJbmRleDtlLl9jYWNoZUluZGV4PWc7Y1tnXT1lO2MucG9wKCk7YS5fY2FjaGVJbmRleD1udWxsO2M9YS5fY2xpcC51dWlkO2U9dGhpcy5fYWN0aW9uc0J5Q2xpcDtnPWVbY107dmFyIHQ9Zy5rbm93bkFjdGlvbnMsdj10W3QubGVuZ3RoLTFdLHo9YS5fYnlDbGlwQ2FjaGVJbmRleDt2Ll9ieUNsaXBDYWNoZUluZGV4PXo7dFt6XT12O3QucG9wKCk7YS5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO2RlbGV0ZSBnLmFjdGlvbkJ5Um9vdFsoYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkXTswPT09dC5sZW5ndGgmJmRlbGV0ZSBlW2NdO3RoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oYSl9LApfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjpmdW5jdGlvbihhKXthPWEuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjIT09ZTsrK2Mpe3ZhciBnPWFbY107MD09PS0tZy5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGcpfX0sX2xlbmRBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQWN0aW9ucysrLHQ9Y1tnXTthLl9jYWNoZUluZGV4PWc7Y1tnXT1hO3QuX2NhY2hlSW5kZXg9ZTtjW2VdPXR9LF90YWtlQmFja0FjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMsdD1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7dC5fY2FjaGVJbmRleD1lO2NbZV09dH0sX2FkZEluYWN0aXZlQmluZGluZzpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAp0PWdbY10sdj10aGlzLl9iaW5kaW5nczt2b2lkIDA9PT10JiYodD17fSxnW2NdPXQpO3RbZV09YTthLl9jYWNoZUluZGV4PXYubGVuZ3RoO3YucHVzaChhKX0sX3JlbW92ZUluYWN0aXZlQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuYmluZGluZyxnPWUucm9vdE5vZGUudXVpZDtlPWUucGF0aDt2YXIgdD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsdj10W2ddLHo9Y1tjLmxlbmd0aC0xXTthPWEuX2NhY2hlSW5kZXg7ei5fY2FjaGVJbmRleD1hO2NbYV09ejtjLnBvcCgpO2RlbGV0ZSB2W2VdOzA9PT1PYmplY3Qua2V5cyh2KS5sZW5ndGgmJmRlbGV0ZSB0W2ddfSxfbGVuZEJpbmRpbmc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYmluZGluZ3MsZT1hLl9jYWNoZUluZGV4LGc9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzKyssdD1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7dC5fY2FjaGVJbmRleD1lO2NbZV09dH0sX3Rha2VCYWNrQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz0KdGhpcy5fYmluZGluZ3MsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQmluZGluZ3MsdD1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7dC5fY2FjaGVJbmRleD1lO2NbZV09dH0sX2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGM9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKyxlPWFbY107dm9pZCAwPT09ZSYmKGU9bmV3IFpmKG5ldyBGbG9hdDMyQXJyYXkoMiksbmV3IEZsb2F0MzJBcnJheSgyKSwxLHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIpLGUuX19jYWNoZUluZGV4PWMsYVtjXT1lKTtyZXR1cm4gZX0sX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT1hLl9fY2FjaGVJbmRleCxnPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsdD1jW2ddO2EuX19jYWNoZUluZGV4PQpnO2NbZ109YTt0Ll9fY2FjaGVJbmRleD1lO2NbZV09dH0sX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6bmV3IEZsb2F0MzJBcnJheSgxKSxjbGlwQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9Y3x8dGhpcy5fcm9vdCxnPWUudXVpZDtlPSJzdHJpbmciPT09dHlwZW9mIGE/dmMuZmluZEJ5TmFtZShlLGEpOmE7YT1udWxsIT09ZT9lLnV1aWQ6YTt2YXIgdD10aGlzLl9hY3Rpb25zQnlDbGlwW2FdLHY9bnVsbDtpZih2b2lkIDAhPT10KXt2PXQuYWN0aW9uQnlSb290W2ddO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7dj10Lmtub3duQWN0aW9uc1swXTtudWxsPT09ZSYmKGU9di5fY2xpcCl9aWYobnVsbD09PWUpcmV0dXJuIG51bGw7Yz1uZXcgY2sodGhpcyxlLGMpO3RoaXMuX2JpbmRBY3Rpb24oYyx2KTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLGEsZyk7cmV0dXJuIGN9LGV4aXN0aW5nQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9Y3x8dGhpcy5fcm9vdDtjPWUudXVpZDsKZT0ic3RyaW5nIj09PXR5cGVvZiBhP3ZjLmZpbmRCeU5hbWUoZSxhKTphO2E9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlP2UudXVpZDphXTtyZXR1cm4gdm9pZCAwIT09YT9hLmFjdGlvbkJ5Um9vdFtjXXx8bnVsbDpudWxsfSxzdG9wQWxsQWN0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2FjdGlvbnMsYz10aGlzLl9uQWN0aXZlQWN0aW9ucyxlPXRoaXMuX2JpbmRpbmdzLGc9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHQ9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPXRoaXMuX25BY3RpdmVBY3Rpb25zPTA7dCE9PWM7Kyt0KWFbdF0ucmVzZXQoKTtmb3IodD0wO3QhPT1nOysrdCllW3RdLnVzZUNvdW50PTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXthKj10aGlzLnRpbWVTY2FsZTtmb3IodmFyIGM9dGhpcy5fYWN0aW9ucyxlPXRoaXMuX25BY3RpdmVBY3Rpb25zLGc9dGhpcy50aW1lKz1hLHQ9TWF0aC5zaWduKGEpLHY9dGhpcy5fYWNjdUluZGV4Xj0xLHo9MDt6IT09ZTsrK3opY1t6XS5fdXBkYXRlKGcsCmEsdCx2KTthPXRoaXMuX2JpbmRpbmdzO2M9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2Zvcih6PTA7eiE9PWM7Kyt6KWFbel0uYXBwbHkodik7cmV0dXJuIHRoaXN9LGdldFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdW5jYWNoZUNsaXA6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9uczthPWEudXVpZDt2YXIgZT10aGlzLl9hY3Rpb25zQnlDbGlwLGc9ZVthXTtpZih2b2lkIDAhPT1nKXtnPWcua25vd25BY3Rpb25zO2Zvcih2YXIgdD0wLHY9Zy5sZW5ndGg7dCE9PXY7Kyt0KXt2YXIgej1nW3RdO3RoaXMuX2RlYWN0aXZhdGVBY3Rpb24oeik7dmFyIEU9ei5fY2FjaGVJbmRleCxGPWNbYy5sZW5ndGgtMV07ei5fY2FjaGVJbmRleD1udWxsO3ouX2J5Q2xpcENhY2hlSW5kZXg9bnVsbDtGLl9jYWNoZUluZGV4PUU7Y1tFXT1GO2MucG9wKCk7dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih6KX1kZWxldGUgZVthXX19LHVuY2FjaGVSb290OmZ1bmN0aW9uKGEpe2E9CmEudXVpZDt2YXIgYz10aGlzLl9hY3Rpb25zQnlDbGlwO2ZvcihnIGluIGMpe3ZhciBlPWNbZ10uYWN0aW9uQnlSb290W2FdO3ZvaWQgMCE9PWUmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGUpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGUpKX12YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWVbYV07aWYodm9pZCAwIT09Zylmb3IodmFyIHQgaW4gZylhPWdbdF0sYS5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhhKX0sdW5jYWNoZUFjdGlvbjpmdW5jdGlvbihhLGMpe2E9dGhpcy5leGlzdGluZ0FjdGlvbihhLGMpO251bGwhPT1hJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihhKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihhKSl9fSk7ZWgucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlaCh2b2lkIDA9PT10aGlzLnZhbHVlLmNsb25lP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX07d2kucHJvdG90eXBlPQpPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoU2QucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6d2ksaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjohMCxjb3B5OmZ1bmN0aW9uKGEpe1NkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9YS5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oZGsucHJvdG90eXBlLHtsaW5lUHJlY2lzaW9uOjEsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5yYXkuc2V0KGEsYyl9LHNldEZyb21DYW1lcmE6ZnVuY3Rpb24oYSxjKXtjJiZjLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oYy5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChhLngsYS55LC41KS51bnByb2plY3QoYykuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9Yyk6YyYmYy5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHRoaXMucmF5Lm9yaWdpbi5zZXQoYS54LGEueSwoYy5uZWFyK2MuZmFyKS8oYy5uZWFyLWMuZmFyKSkudW5wcm9qZWN0KGMpLHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oYy5tYXRyaXhXb3JsZCksdGhpcy5jYW1lcmE9Yyk6Y29uc29sZS5lcnJvcigiVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4iKX0saW50ZXJzZWN0T2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtlPWV8fFtdO3hpKGEsdGhpcyxlLGMpO2Uuc29ydChlayk7cmV0dXJuIGV9LGludGVyc2VjdE9iamVjdHM6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107aWYoITE9PT1BcnJheS5pc0FycmF5KGEpKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4iKSxlO2Zvcih2YXIgZz0wLHQ9YS5sZW5ndGg7Zzx0O2crKyl4aShhW2ddLHRoaXMsZSxjKTtlLnNvcnQoZWspO3JldHVybiBlfX0pOwpPYmplY3QuYXNzaWduKGZrLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMucGhpPWM7dGhpcy50aGV0YT1lO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLnBoaT1hLnBoaTt0aGlzLnRoZXRhPWEudGhldGE7cmV0dXJuIHRoaXN9LG1ha2VTYWZlOmZ1bmN0aW9uKCl7dGhpcy5waGk9TWF0aC5tYXgoMUUtNixNYXRoLm1pbihNYXRoLlBJLTFFLTYsdGhpcy5waGkpKTtyZXR1cm4gdGhpc30sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhhLngsYS55LGEueil9LHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPU1hdGguc3FydChhKmErYypjK2UqZSk7MD09PXRoaXMucmFkaXVzP3RoaXMucGhpPQp0aGlzLnRoZXRhPTA6KHRoaXMudGhldGE9TWF0aC5hdGFuMihhLGUpLHRoaXMucGhpPU1hdGguYWNvcyhoYi5jbGFtcChjL3RoaXMucmFkaXVzLC0xLDEpKSk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihnay5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9YTt0aGlzLnRoZXRhPWM7dGhpcy55PWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMudGhldGE9YS50aGV0YTt0aGlzLnk9YS55O3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStlKmUpO3RoaXMudGhldGE9TWF0aC5hdGFuMihhLAplKTt0aGlzLnk9YztyZXR1cm4gdGhpc319KTt2YXIgSGs9bmV3IGY7T2JqZWN0LmFzc2lnbih5aS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz1Iay5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LAptYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9SW5maW5pdHk7dGhpcy5tYXgueD10aGlzLm1heC55PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgZik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCk6YS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgZik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCk6YS5zdWJWZWN0b3JzKHRoaXMubWF4LAp0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueDx0aGlzLm1pbi54fHxhLng+dGhpcy5tYXgueHx8YS55PHRoaXMubWluLnl8fGEueT50aGlzLm1heC55PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5taW4ueDw9YS5taW4ueCYmYS5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9YS5taW4ueSYmYS5tYXgueTw9dGhpcy5tYXgueX0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKYz1uZXcgZik7cmV0dXJuIGMuc2V0KChhLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGEueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8YS5taW4ueD50aGlzLm1heC54fHxhLm1heC55PHRoaXMubWluLnl8fGEubWluLnk+dGhpcy5tYXgueT8hMTohMH0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGYpO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEhrLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7CnRoaXMubWF4Lm1pbihhLm1heCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhLm1pbik7dGhpcy5tYXgubWF4KGEubWF4KTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMubWluLmFkZChhKTt0aGlzLm1heC5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5taW4uZXF1YWxzKHRoaXMubWluKSYmYS5tYXguZXF1YWxzKHRoaXMubWF4KX19KTt2YXIgSWs9bmV3IGssQ2g9bmV3IGs7T2JqZWN0LmFzc2lnbih6aS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuc3RhcnQuY29weShhKTt0aGlzLmVuZC5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnN0YXJ0LmNvcHkoYS5zdGFydCk7dGhpcy5lbmQuY29weShhLmVuZCk7cmV0dXJuIHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9LGRlbHRhOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX0sZGlzdGFuY2VTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX0sZGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX0sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9Cm5ldyBrKTtyZXR1cm4gdGhpcy5kZWx0YShjKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5zdGFydCl9LGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXtJay5zdWJWZWN0b3JzKGEsdGhpcy5zdGFydCk7Q2guc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTthPUNoLmRvdChJaykvQ2guZG90KENoKTtjJiYoYT1oYi5jbGFtcChhLDAsMSkpO3JldHVybiBhfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGEsYyxlKXthPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcihhLGMpO3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBrKTtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5zdGFydCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NChhKTsKdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZhLmVuZC5lcXVhbHModGhpcy5lbmQpfX0pO2RnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtkZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGc7ZGcucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PSEwO3ZhciBhZD1uZXcgayxxZD1uZXcgayxXaT1uZXcgcixybj1bImEiLCJiIiwiYyJdO2VnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZWcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWVnO2VnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCghMCk7V2kuZ2V0Tm9ybWFsTWF0cml4KHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkKTt2YXIgYT10aGlzLm9iamVjdC5tYXRyaXhXb3JsZCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbiwKZT10aGlzLm9iamVjdC5nZW9tZXRyeTtpZihlJiZlLmlzR2VvbWV0cnkpZm9yKHZhciBnPWUudmVydGljZXMsdD1lLmZhY2VzLHY9ZT0wLHo9dC5sZW5ndGg7djx6O3YrKylmb3IodmFyIEU9dFt2XSxGPTAsST1FLnZlcnRleE5vcm1hbHMubGVuZ3RoO0Y8STtGKyspe3ZhciBNPUUudmVydGV4Tm9ybWFsc1tGXTthZC5jb3B5KGdbRVtybltGXV1dKS5hcHBseU1hdHJpeDQoYSk7cWQuY29weShNKS5hcHBseU1hdHJpeDMoV2kpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKGFkKTtjLnNldFhZWihlLGFkLngsYWQueSxhZC56KTtlKz0xO2Muc2V0WFlaKGUscWQueCxxZC55LHFkLnopO2UrPTF9ZWxzZSBpZihlJiZlLmlzQnVmZmVyR2VvbWV0cnkpZm9yKGc9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHQ9ZS5hdHRyaWJ1dGVzLm5vcm1hbCxGPWU9MCxJPWcuY291bnQ7RjxJO0YrKylhZC5zZXQoZy5nZXRYKEYpLGcuZ2V0WShGKSxnLmdldFooRikpLmFwcGx5TWF0cml4NChhKSwKcWQuc2V0KHQuZ2V0WChGKSx0LmdldFkoRiksdC5nZXRaKEYpKSxxZC5hcHBseU1hdHJpeDMoV2kpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKGFkKSxjLnNldFhZWihlLGFkLngsYWQueSxhZC56KSxlKz0xLGMuc2V0WFlaKGUscWQueCxxZC55LHFkLnopLGUrPTE7Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEprPW5ldyBrO1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtaZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WmU7WmUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9O1plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIGE9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFFMyxjPWEqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7CnRoaXMuY29uZS5zY2FsZS5zZXQoYyxjLGEpO0prLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7dGhpcy5jb25lLmxvb2tBdChKayk7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTt2YXIgTGQ9bmV3IGssRGg9bmV3IHEsWGk9bmV3IHE7JGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTskZS5wcm90b3R5cGUuY29uc3RydWN0b3I9JGU7JGUucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYm9uZXMsZT10aGlzLmdlb21ldHJ5LGc9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7WGkuZ2V0SW52ZXJzZSh0aGlzLnJvb3QubWF0cml4V29ybGQpO2Zvcih2YXIgdD0wLHY9MDt0PGMubGVuZ3RoO3QrKyl7dmFyIHo9Y1t0XTt6LnBhcmVudCYmCnoucGFyZW50LmlzQm9uZSYmKERoLm11bHRpcGx5TWF0cmljZXMoWGksei5tYXRyaXhXb3JsZCksTGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKERoKSxnLnNldFhZWih2LExkLngsTGQueSxMZC56KSxEaC5tdWx0aXBseU1hdHJpY2VzKFhpLHoucGFyZW50Lm1hdHJpeFdvcmxkKSxMZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oRGgpLGcuc2V0WFlaKHYrMSxMZC54LExkLnksTGQueiksdis9Mil9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITA7QS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpfTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO2FmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZjthZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTthZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jb2xvcj8KdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTtiZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpO2JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZjtiZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5saWdodC53aWR0aCwuNSp0aGlzLmxpZ2h0LmhlaWdodCwxKTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpO2Vsc2V7dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLm11bHRpcGx5U2NhbGFyKHRoaXMubGlnaHQuaW50ZW5zaXR5KTt2YXIgYT10aGlzLm1hdGVyaWFsLmNvbG9yLGM9TWF0aC5tYXgoYS5yLGEuZyxhLmIpOzE8YyYmYS5tdWx0aXBseVNjYWxhcigxLwpjKTt0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5tYXRlcmlhbC5jb2xvcil9fTtiZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTt2YXIgc249bmV3IGssS2s9bmV3IEgsTGs9bmV3IEg7Y2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZjtjZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTtjZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGlsZHJlblswXTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwplbHNle3ZhciBjPWEuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO0trLmNvcHkodGhpcy5saWdodC5jb2xvcik7TGsuY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IodmFyIGU9MCxnPWMuY291bnQ7ZTxnO2UrKyl7dmFyIHQ9ZTxnLzI/S2s6TGs7Yy5zZXRYWVooZSx0LnIsdC5nLHQuYil9Yy5uZWVkc1VwZGF0ZT0hMH1hLmxvb2tBdChzbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCkubmVnYXRlKCkpfTtkZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO2RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1kZjtkZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTtkZi5wcm90b3R5cGUub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uLmNvcHkodGhpcy5saWdodFByb2JlLnBvc2l0aW9uKTt0aGlzLnNjYWxlLnNldCgxLAoxLDEpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSk7dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5pbnRlbnNpdHkudmFsdWU9dGhpcy5saWdodFByb2JlLmludGVuc2l0eX07ZmgucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpmaCxjb3B5OmZ1bmN0aW9uKGEpe0liLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdlb21ldHJ5LmNvcHkoYS5nZW9tZXRyeSk7dGhpcy5tYXRlcmlhbC5jb3B5KGEubWF0ZXJpYWwpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTtnaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2doLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1naDtlZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpO2VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lZjtlZi5wcm90b3R5cGUudXBkYXRlPQpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoVixlYSxkYSxyYSl7ZGE9KGVhLVYpL2RhO1Uuc2V0WFlaKEYsMCwwLDApO0krKztmb3IoTT1WO008ZWE7TSs9ZGEpUD1GK0ksVS5zZXRYWVooUCxNYXRoLnNpbihNKSplLDAsTWF0aC5jb3MoTSkqZSksVS5zZXRYWVooUCsxLE1hdGguc2luKE1hdGgubWluKE0rZGEsZWEpKSplLDAsTWF0aC5jb3MoTWF0aC5taW4oTStkYSxlYSkpKmUpLFUuc2V0WFlaKFArMiwwLDAsMCksSSs9MztRLmFkZEdyb3VwKEYsSSxyYSk7Ris9STtJPTB9dmFyIGM9dGhpcy5hdWRpbyxlPXRoaXMucmFuZ2UsZz10aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUsdD10aGlzLmRpdmlzaW9uc091dGVyQW5nbGUsdj1oYi5kZWdUb1JhZChjLnBhbm5lci5jb25lSW5uZXJBbmdsZSk7Yz1oYi5kZWdUb1JhZChjLnBhbm5lci5jb25lT3V0ZXJBbmdsZSk7dmFyIHo9di8yLEU9Yy8yLEY9MCxJPTAsTSxQLFE9dGhpcy5nZW9tZXRyeSxVPVEuYXR0cmlidXRlcy5wb3NpdGlvbjtRLmNsZWFyR3JvdXBzKCk7CmEoLUUsLXosdCwwKTthKC16LHosZywxKTthKHosRSx0LDApO1UubmVlZHNVcGRhdGU9ITA7dj09PWMmJih0aGlzLm1hdGVyaWFsWzBdLnZpc2libGU9ITEpfTtlZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMF0uZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMV0uZGlzcG9zZSgpfTt2YXIgcmc9bmV3IGssRWg9bmV3IGssTWs9bmV3IHI7ZmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtmZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zmc7ZmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtNay5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5vYmplY3QuZ2VvbWV0cnksZz0KZS52ZXJ0aWNlcztlPWUuZmFjZXM7Zm9yKHZhciB0PTAsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9ZVt2XSxGPUUubm9ybWFsO3JnLmNvcHkoZ1tFLmFdKS5hZGQoZ1tFLmJdKS5hZGQoZ1tFLmNdKS5kaXZpZGVTY2FsYXIoMykuYXBwbHlNYXRyaXg0KGEpO0VoLmNvcHkoRikuYXBwbHlNYXRyaXgzKE1rKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpLmFkZChyZyk7Yy5zZXRYWVoodCxyZy54LHJnLnkscmcueik7dCs9MTtjLnNldFhZWih0LEVoLngsRWgueSxFaC56KTt0Kz0xfWMubmVlZHNVcGRhdGU9ITB9O3ZhciBOaz1uZXcgayxGaD1uZXcgayxPaz1uZXcgaztmZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7ZmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZmO2ZmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTt0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwp0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCl9O2ZmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtOay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCk7Rmguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTtPay5zdWJWZWN0b3JzKEZoLE5rKTt0aGlzLmxpZ2h0UGxhbmUubG9va0F0KEZoKTt2b2lkIDAhPT10aGlzLmNvbG9yPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSk7dGhpcy50YXJnZXRMaW5lLmxvb2tBdChGaCk7CnRoaXMudGFyZ2V0TGluZS5zY2FsZS56PU9rLmxlbmd0aCgpfTt2YXIgaGg9bmV3IGssUGI9bmV3IHpiO2dnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7Z2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWdnO2dnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5LGM9dGhpcy5wb2ludE1hcDtQYi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtRYigiYyIsYyxhLFBiLDAsMCwtMSk7UWIoInQiLGMsYSxQYiwwLDAsMSk7UWIoIm4xIixjLGEsUGIsLTEsLTEsLTEpO1FiKCJuMiIsYyxhLFBiLDEsLTEsLTEpO1FiKCJuMyIsYyxhLFBiLC0xLDEsLTEpO1FiKCJuNCIsYyxhLFBiLDEsMSwtMSk7UWIoImYxIixjLGEsUGIsLTEsLTEsMSk7UWIoImYyIixjLGEsUGIsMSwtMSwxKTtRYigiZjMiLGMsYSxQYiwtMSwxLDEpO1FiKCJmNCIsYyxhLFBiLDEsMSwxKTtRYigidTEiLApjLGEsUGIsLjcsMS4xLC0xKTtRYigidTIiLGMsYSxQYiwtLjcsMS4xLC0xKTtRYigidTMiLGMsYSxQYiwwLDIsLTEpO1FiKCJjZjEiLGMsYSxQYiwtMSwwLDEpO1FiKCJjZjIiLGMsYSxQYiwxLDAsMSk7UWIoImNmMyIsYyxhLFBiLDAsLTEsMSk7UWIoImNmNCIsYyxhLFBiLDAsMSwxKTtRYigiY24xIixjLGEsUGIsLTEsMCwtMSk7UWIoImNuMiIsYyxhLFBiLDEsMCwtMSk7UWIoImNuMyIsYyxhLFBiLDAsLTEsLTEpO1FiKCJjbjQiLGMsYSxQYiwwLDEsLTEpO2EuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfTt2YXIgR2g9bmV3IHg7amQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtqZC5wcm90b3R5cGUuY29uc3RydWN0b3I9amQ7amQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt2b2lkIDAhPT1hJiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpO3ZvaWQgMCE9PQp0aGlzLm9iamVjdCYmR2guc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCk7aWYoIUdoLmlzRW1wdHkoKSl7YT1HaC5taW47dmFyIGM9R2gubWF4LGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGc9ZS5hcnJheTtnWzBdPWMueDtnWzFdPWMueTtnWzJdPWMuejtnWzNdPWEueDtnWzRdPWMueTtnWzVdPWMuejtnWzZdPWEueDtnWzddPWEueTtnWzhdPWMuejtnWzldPWMueDtnWzEwXT1hLnk7Z1sxMV09Yy56O2dbMTJdPWMueDtnWzEzXT1jLnk7Z1sxNF09YS56O2dbMTVdPWEueDtnWzE2XT1jLnk7Z1sxN109YS56O2dbMThdPWEueDtnWzE5XT1hLnk7Z1syMF09YS56O2dbMjFdPWMueDtnWzIyXT1hLnk7Z1syM109YS56O2UubmVlZHNVcGRhdGU9ITA7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX19O2pkLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0PWZ1bmN0aW9uKGEpe3RoaXMub2JqZWN0PWE7dGhpcy51cGRhdGUoKTtyZXR1cm4gdGhpc307amQucHJvdG90eXBlLmNvcHk9CmZ1bmN0aW9uKGEpe0liLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm9iamVjdD1hLm9iamVjdDtyZXR1cm4gdGhpc307amQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTtoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2hnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZztoZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib3g7Yy5pc0VtcHR5KCl8fChjLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxjLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSksQS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpKX07aWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKTtpZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aWc7aWcucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPQpmdW5jdGlvbihhKXt2YXIgYz0tdGhpcy5wbGFuZS5jb25zdGFudDsxRS04Pk1hdGguYWJzKGMpJiYoYz0xRS04KTt0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT0wPmM/MTowO3RoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKTtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O3ZhciBQaz1uZXcgayxpaCxBaTtrZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7a2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPWtkO2tkLnByb3RvdHlwZS5zZXREaXJlY3Rpb249ZnVuY3Rpb24oYSl7Ljk5OTk5PGEueT90aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpOi0uOTk5OTk+YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk6KFBrLnNldChhLnosMCwtYS54KS5ub3JtYWxpemUoKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShQayxNYXRoLmFjb3MoYS55KSkpfTsKa2QucHJvdG90eXBlLnNldExlbmd0aD1mdW5jdGlvbihhLGMsZSl7dm9pZCAwPT09YyYmKGM9LjIqYSk7dm9pZCAwPT09ZSYmKGU9LjIqYyk7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDAsYS1jKSwxKTt0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7dGhpcy5jb25lLnNjYWxlLnNldChlLGMsZSk7dGhpcy5jb25lLnBvc2l0aW9uLnk9YTt0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9O2tkLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbihhKXt0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGEpO3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoYSl9O2tkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsITEpO3RoaXMubGluZS5jb3B5KGEubGluZSk7dGhpcy5jb25lLmNvcHkoYS5jb25lKTtyZXR1cm4gdGhpc307a2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTsKamcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtqZy5wcm90b3R5cGUuY29uc3RydWN0b3I9amc7WmEuY3JlYXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLnByb3RvdHlwZS5nZXRQb2ludD1jO3JldHVybiBhfTtPYmplY3QuYXNzaWduKGlkLnByb3RvdHlwZSx7Y3JlYXRlUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2E9dGhpcy5nZXRQb2ludHMoYSk7cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoYSl9LGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4iKTsKYT10aGlzLmdldFNwYWNlZFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2Zvcih2YXIgYz1uZXcgeGEsZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHQ9YVtlXTtjLnZlcnRpY2VzLnB1c2gobmV3IGsodC54LHQueSx0Lnp8fDApKX1yZXR1cm4gY319KTtPYmplY3QuYXNzaWduKEljLnByb3RvdHlwZSx7ZnJvbVBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLiIpO3RoaXMuc2V0RnJvbVBvaW50cyhhKX19KTtpay5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYy5wcm90b3R5cGUpOwpqay5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYy5wcm90b3R5cGUpO0JpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJjLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbihCaS5wcm90b3R5cGUse2luaXRGcm9tQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sZ2V0Q29udHJvbFBvaW50c0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtmaC5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfTsKJGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfTtPYmplY3QuYXNzaWduKERiLnByb3RvdHlwZSx7ZXh0cmFjdFVybEJhc2U6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIik7cmV0dXJuIFVpLmV4dHJhY3RVcmxCYXNlKGEpfX0pO09iamVjdC5hc3NpZ24oYmgucHJvdG90eXBlLHtzZXRUZXh0dXJlUGF0aDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogLnNldFRleHR1cmVQYXRoKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0UmVzb3VyY2VQYXRoKCkuIik7cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKGEpfX0pO09iamVjdC5hc3NpZ24oeWkucHJvdG90eXBlLAp7Y2VudGVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihhKX0sZW1wdHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCl9LGlzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LHNpemU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGEpfX0pO09iamVjdC5hc3NpZ24oeC5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShhKX0sCnNpemU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGEpfX0pO3ppLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihhKX07T2JqZWN0LmFzc2lnbihoYix7cmFuZG9tMTY6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuIik7cmV0dXJuIE1hdGgucmFuZG9tKCl9LG5lYXJlc3RQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuIik7CnJldHVybiBoYi5mbG9vclBvd2VyT2ZUd28oYSl9LG5leHRQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4iKTtyZXR1cm4gaGIuY2VpbFBvd2VyT2ZUd28oYSl9fSk7T2JqZWN0LmFzc2lnbihyLnByb3RvdHlwZSx7ZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShhLGMpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXgzKHRoaXMpfSwKbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtleHRyYWN0UG9zaXRpb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLmNvcHlQb3NpdGlvbihhKX0sZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShhLGMpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybihuZXcgaykuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpOwpyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKX0sbXVsdGlwbHlUb0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbXVsdGlwbHlWZWN0b3IzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3I0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKcm90YXRlQXhpczpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO2EudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxjcm9zc1ZlY3RvcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVaOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVCeUF4aXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYSl9LGFwcGx5VG9WZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG1ha2VGcnVzdHVtOmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuIik7CnJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZShhLGMsZyxlLHQsdil9fSk7SGIucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZShhKX07aC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlRdWF0ZXJuaW9uKHRoaXMpfTtPYmplY3QuYXNzaWduKEQucHJvdG90eXBlLHtpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpOwpyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZShhKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfX0pO09iamVjdC5hc3NpZ24oQi5wcm90b3R5cGUse2FyZWE6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKTtyZXR1cm4gdGhpcy5nZXRBcmVhKCl9LGJhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihhLApjKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIik7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGEsYyl9LG1pZHBvaW50OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIik7cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoYSl9LG5vcm1hbDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIik7cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKGEpfSxwbGFuZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpO3JldHVybiB0aGlzLmdldFBsYW5lKGEpfX0pO09iamVjdC5hc3NpZ24oQiwKe2Jhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihhLGMsZSxnLHQpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYSxjLGUsZyx0KX0sbm9ybWFsOmZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gQi5nZXROb3JtYWwoYSxjLGUsZyl9fSk7T2JqZWN0LmFzc2lnbihGZC5wcm90b3R5cGUse2V4dHJhY3RBbGxQb2ludHM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoYSl9LGV4dHJ1ZGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBXZCh0aGlzLGEpfSxtYWtlR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFhkKHRoaXMsYSl9fSk7T2JqZWN0LmFzc2lnbihmLnByb3RvdHlwZSx7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LApsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKGsucHJvdG90eXBlLHtzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxzZXRFdWxlckZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxnZXRQb3NpdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbihhKX0sZ2V0U2NhbGVGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpO3JldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZShhKX0sZ2V0Q29sdW1uRnJvbU1hdHJpeDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihjLGEpfSxhcHBseVByb2plY3Rpb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhKX0sCmZyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGMsZSl9LGRpc3RhbmNlVG9NYW5oYXR0YW46ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKGEpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9fSk7T2JqZWN0LmFzc2lnbih4YS5wcm90b3R5cGUse2NvbXB1dGVUYW5nZW50czpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLHtnZXRDaGlsZEJ5TmFtZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKTtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoYSl9LHJlbmRlckRlcHRoOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhjLGEpfSxnZXRXb3JsZFJvdGF0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4iKX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQS5wcm90b3R5cGUse2V1bGVyT3JkZXI6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLiIpO3RoaXMucm90YXRpb24ub3JkZXI9YX19LHVzZVF1YXRlcm5pb246e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCZi5wcm90b3R5cGUse29iamVjdHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuIik7cmV0dXJuIHRoaXMubGV2ZWxzfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRmcucHJvdG90eXBlLCJ1c2VWZXJ0ZXhUZXh0dXJlIix7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7Q2YucHJvdG90eXBlLmluaXRCb25lcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWmEucHJvdG90eXBlLAoiX19hcmNMZW5ndGhEaXZpc2lvbnMiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLiIpO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWF9fSk7dmIucHJvdG90eXBlLnNldExlbnM9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIik7dm9pZCAwIT09YyYmKHRoaXMuZmlsbUdhdWdlPWMpO3RoaXMuc2V0Rm9jYWxMZW5ndGgoYSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEtiLnByb3RvdHlwZSwKe29ubHlTaGFkb3c6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dDYW1lcmFGb3Y6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmZvdj1hfX0sc2hhZG93Q2FtZXJhTGVmdDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LiIpO3RoaXMuc2hhZG93LmNhbWVyYS5sZWZ0PWF9fSxzaGFkb3dDYW1lcmFSaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0PWF9fSxzaGFkb3dDYW1lcmFUb3A6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuIik7CnRoaXMuc2hhZG93LmNhbWVyYS50b3A9YX19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPWF9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIik7dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9YX19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPWF9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSwKc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIik7dGhpcy5zaGFkb3cuYmlhcz1hfX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKTt0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPWF9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpO3RoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PWF9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFIucHJvdG90eXBlLAp7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RofX0sY29weUluZGljZXNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24odmEucHJvdG90eXBlLHthZGRJbmRleDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpO3RoaXMuc2V0SW5kZXgoYSl9LGFkZERyYXdDYWxsOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIik7CmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4iKTt0aGlzLmFkZEdyb3VwKGEsYyl9LGNsZWFyRHJhd0NhbGxzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpO3RoaXMuY2xlYXJHcm91cHMoKX0sY29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGNvbXB1dGVPZmZzZXRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2YS5wcm90b3R5cGUse2RyYXdjYWxsczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpOwpyZXR1cm4gdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7cmV0dXJuIHRoaXMuZ3JvdXBzfX19KTtPYmplY3QuYXNzaWduKFRjLnByb3RvdHlwZSx7Z2V0QXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGVMaXN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZWgucHJvdG90eXBlLAp7ZHluYW1pYzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKX19LG9uVXBkYXRlOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuIik7cmV0dXJuIHRoaXN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFMucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9fSx3cmFwUkdCOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpO3JldHVybiBuZXcgSH19LHNoYWRpbmc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpO3RoaXMuZmxhdFNoYWRpbmc9MT09PWF9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERjLnByb3RvdHlwZSx7bWV0YWw6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4iKTsKcmV0dXJuITF9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhxYi5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPWF9fX0pO09iamVjdC5hc3NpZ24oVGgucHJvdG90eXBlLAp7Y2xlYXJUYXJnZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpO3RoaXMuc2V0UmVuZGVyVGFyZ2V0KGEpO3RoaXMuY2xlYXIoYyxlLGcpfSxhbmltYXRlOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4iKTt0aGlzLnNldEFuaW1hdGlvbkxvb3AoYSl9LGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4iKTtyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKX0sZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCl9LGdldFByZWNpc2lvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4iKTtyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9ufSxyZXNldEdMU3RhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuIik7cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKX0sc3VwcG9ydHNGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpfSwKc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKS4iKTsKcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfSxzdXBwb3J0c0JsZW5kTWluTWF4OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iil9LHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlc30sc3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIil9LGVuYWJsZVNjaXNzb3JUZXN0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpO3RoaXMuc2V0U2Npc3NvclRlc3QoYSl9LGluaXRNYXRlcmlhbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFkZFByZVBsdWdpbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LAphZGRQb3N0UGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHVwZGF0ZVNoYWRvd01hcDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldEZhY2VDdWxsaW5nOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhbGxvY1RleHR1cmVVbml0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWxsb2NUZXh0dXJlVW5pdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldFRleHR1cmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTJEOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnNldFRleHR1cmVDdWJlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRBY3RpdmVNaXBNYXBMZXZlbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLiIpO3JldHVybiB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGgucHJvdG90eXBlLHtzaGFkb3dNYXBFbmFibGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZH0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4iKTt0aGlzLnNoYWRvd01hcC5lbmFibGVkPWF9fSxzaGFkb3dNYXBUeXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZX0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuIik7dGhpcy5zaGFkb3dNYXAudHlwZT1hfX0sc2hhZG93TWFwQ3VsbEZhY2U6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxjb250ZXh0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jb250ZXh0IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZ2V0Q29udGV4dCgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpfX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRWoucHJvdG90eXBlLHtjdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyUmV2ZXJzZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LApyZW5kZXJTaW5nbGVTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPYi5wcm90b3R5cGUse2FjdGl2ZUN1YmVGYWNlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLiIpfX0sCmFjdGl2ZU1pcE1hcExldmVsOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZU1pcE1hcExldmVsIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG0ucHJvdG90eXBlLHt3cmFwUzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTt0aGlzLnRleHR1cmUud3JhcFM9YX19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpOwpyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKTt0aGlzLnRleHR1cmUud3JhcFQ9YX19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5tYWdGaWx0ZXI9YX19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKTt0aGlzLnRleHR1cmUubWluRmlsdGVyPWF9fSxhbmlzb3Ryb3B5OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHl9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTt0aGlzLnRleHR1cmUuYW5pc290cm9weT1hfX0sb2Zmc2V0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXR9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LiIpO3RoaXMudGV4dHVyZS5vZmZzZXQ9YX19LHJlcGVhdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUucmVwZWF0fSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3RoaXMudGV4dHVyZS5yZXBlYXQ9YX19LGZvcm1hdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0fSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpOwp0aGlzLnRleHR1cmUuZm9ybWF0PWF9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTt0aGlzLnRleHR1cmUudHlwZT1hfX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7CnRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2gucHJvdG90eXBlLHtzdGFuZGluZzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC5zdGFuZGluZyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sdXNlckhlaWdodDp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC51c2VySGVpZ2h0IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pO1llLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLiIpO3ZhciBjPXRoaXM7KG5ldyBjaCkubG9hZChhLGZ1bmN0aW9uKGUpe2Muc2V0QnVmZmVyKGUpfSk7cmV0dXJuIHRoaXN9O3RpLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLiIpOwpyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9O0diLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuIik7cmV0dXJuIHRoaXMudXBkYXRlKGEsYyl9O0dkLmNyb3NzT3JpZ2luPXZvaWQgMDtHZC5sb2FkVGV4dHVyZT1mdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO3ZhciB0PW5ldyBQZzt0LnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2E9dC5sb2FkKGEsZSx2b2lkIDAsZyk7YyYmKGEubWFwcGluZz1jKTtyZXR1cm4gYX07R2QubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTsKdmFyIHQ9bmV3IE9nO3Quc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT10LmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtHZC5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O0dkLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfTtiLkFDRVNGaWxtaWNUb25lTWFwcGluZz01O2IuQWRkRXF1YXRpb249MTAwO2IuQWRkT3BlcmF0aW9uPTI7Yi5BZGRpdGl2ZUJsZW5kaW5nPTI7Yi5BbHBoYUZvcm1hdD0xMDIxO2IuQWx3YXlzRGVwdGg9CjE7Yi5BbHdheXNTdGVuY2lsRnVuYz01MTk7Yi5BbWJpZW50TGlnaHQ9V2c7Yi5BbWJpZW50TGlnaHRQcm9iZT1vaTtiLkFuaW1hdGlvbkNsaXA9dmM7Yi5BbmltYXRpb25Mb2FkZXI9Zmk7Yi5BbmltYXRpb25NaXhlcj12aTtiLkFuaW1hdGlvbk9iamVjdEdyb3VwPWJrO2IuQW5pbWF0aW9uVXRpbHM9VmI7Yi5BcmNDdXJ2ZT1YZTtiLkFycmF5Q2FtZXJhPXdmO2IuQXJyb3dIZWxwZXI9a2Q7Yi5BdWRpbz1ZZTtiLkF1ZGlvQW5hbHlzZXI9dGk7Yi5BdWRpb0NvbnRleHQ9cmk7Yi5BdWRpb0xpc3RlbmVyPXFpO2IuQXVkaW9Mb2FkZXI9Y2g7Yi5BeGVzSGVscGVyPWpnO2IuQXhpc0hlbHBlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLiIpO3JldHVybiBuZXcgamcoYSl9O2IuQmFja1NpZGU9MTtiLkJhc2ljRGVwdGhQYWNraW5nPTMyMDA7Yi5CYXNpY1NoYWRvd01hcD0wO2IuQmluYXJ5VGV4dHVyZUxvYWRlcj0KZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIik7cmV0dXJuIG5ldyBOZyhhKX07Yi5Cb25lPVpoO2IuQm9vbGVhbktleWZyYW1lVHJhY2s9Smc7Yi5Cb3VuZGluZ0JveEhlbHBlcj1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGpkKGEsYyl9O2IuQm94Mj15aTtiLkJveDM9eDtiLkJveDNIZWxwZXI9aGc7Yi5Cb3hCdWZmZXJHZW9tZXRyeT1YYTtiLkJveEdlb21ldHJ5PVNhO2IuQm94SGVscGVyPWpkO2IuQnVmZmVyQXR0cmlidXRlPVI7Yi5CdWZmZXJHZW9tZXRyeT12YTtiLkJ1ZmZlckdlb21ldHJ5TG9hZGVyPWFoO2IuQnl0ZVR5cGU9MTAxMDtiLkNhY2hlPWtlO2IuQ2FtZXJhPXpiO2IuQ2FtZXJhSGVscGVyPQpnZztiLkNhbnZhc1JlbmRlcmVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfTtiLkNhbnZhc1RleHR1cmU9RGY7Yi5DYXRtdWxsUm9tQ3VydmUzPWJjO2IuQ2luZW9uVG9uZU1hcHBpbmc9NDtiLkNpcmNsZUJ1ZmZlckdlb21ldHJ5PVNlO2IuQ2lyY2xlR2VvbWV0cnk9WWY7Yi5DbGFtcFRvRWRnZVdyYXBwaW5nPTEwMDE7Yi5DbG9jaz1waTtiLkNsb3NlZFNwbGluZUN1cnZlMz1paztiLkNvbG9yPUg7Yi5Db2xvcktleWZyYW1lVHJhY2s9S2c7Yi5Db21wcmVzc2VkVGV4dHVyZT1GZTtiLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyPWdpO2IuQ29uZUJ1ZmZlckdlb21ldHJ5PVhmO2IuQ29uZUdlb21ldHJ5PVdmO2IuQ3ViZUNhbWVyYT1HYjtiLkN1YmVHZW9tZXRyeT1TYTtiLkN1YmVSZWZsZWN0aW9uTWFwcGluZz0zMDE7Yi5DdWJlUmVmcmFjdGlvbk1hcHBpbmc9MzAyO2IuQ3ViZVRleHR1cmU9ZWQ7Yi5DdWJlVGV4dHVyZUxvYWRlcj0KT2c7Yi5DdWJlVVZSZWZsZWN0aW9uTWFwcGluZz0zMDY7Yi5DdWJlVVZSZWZyYWN0aW9uTWFwcGluZz0zMDc7Yi5DdWJpY0JlemllckN1cnZlPUVjO2IuQ3ViaWNCZXppZXJDdXJ2ZTM9VmM7Yi5DdWJpY0ludGVycG9sYW50PUhnO2IuQ3VsbEZhY2VCYWNrPTE7Yi5DdWxsRmFjZUZyb250PTI7Yi5DdWxsRmFjZUZyb250QmFjaz0zO2IuQ3VsbEZhY2VOb25lPTA7Yi5DdXJ2ZT1aYTtiLkN1cnZlUGF0aD1pZDtiLkN1c3RvbUJsZW5kaW5nPTU7Yi5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5PWhkO2IuQ3lsaW5kZXJHZW9tZXRyeT1aZDtiLkN5bGluZHJpY2FsPWdrO2IuRGF0YVRleHR1cmU9QWI7Yi5EYXRhVGV4dHVyZTJEQXJyYXk9dGU7Yi5EYXRhVGV4dHVyZTNEPXVlO2IuRGF0YVRleHR1cmVMb2FkZXI9Tmc7Yi5EZWNyZW1lbnRTdGVuY2lsT3A9NzY4MztiLkRlY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTY7Yi5EZWZhdWx0TG9hZGluZ01hbmFnZXI9WGo7Yi5EZXB0aEZvcm1hdD0xMDI2OwpiLkRlcHRoU3RlbmNpbEZvcm1hdD0xMDI3O2IuRGVwdGhUZXh0dXJlPUVmO2IuRGlyZWN0aW9uYWxMaWdodD1WZztiLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXI9ZmY7Yi5EaXJlY3Rpb25hbExpZ2h0U2hhZG93PVVnO2IuRGlzY3JldGVJbnRlcnBvbGFudD1JZztiLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PUtlO2IuRG9kZWNhaGVkcm9uR2VvbWV0cnk9S2Y7Yi5Eb3VibGVTaWRlPTI7Yi5Ec3RBbHBoYUZhY3Rvcj0yMDY7Yi5Ec3RDb2xvckZhY3Rvcj0yMDg7Yi5EeW5hbWljQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBSKGEsYykpLnNldER5bmFtaWMoITApfTtiLkVkZ2VzR2VvbWV0cnk9UmU7Yi5FZGdlc0hlbHBlcj1mdW5jdGlvbihhLApjKXtjb25zb2xlLndhcm4oIlRIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgUmUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuRWxsaXBzZUN1cnZlPXNjO2IuRXF1YWxEZXB0aD00O2IuRXF1YWxTdGVuY2lsRnVuYz01MTQ7Yi5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz0zMDM7Yi5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZz0zMDQ7Yi5FdWxlcj11O2IuRXZlbnREaXNwYXRjaGVyPWQ7Yi5FeHRydWRlQnVmZmVyR2VvbWV0cnk9VGM7Yi5FeHRydWRlR2VvbWV0cnk9V2Q7Yi5GYWNlMz1PO2IuRmFjZTQ9ZnVuY3Rpb24oYSxjLGUsZyx0LHYseil7Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLiIpO3JldHVybiBuZXcgTyhhLApjLGUsdCx2LHopfTtiLkZhY2VDb2xvcnM9MTtiLkZhY2VOb3JtYWxzSGVscGVyPWZnO2IuRmlsZUxvYWRlcj13YztiLkZsYXRTaGFkaW5nPTE7Yi5GbG9hdDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBiYShhLGMpfTtiLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU9YmE7Yi5GbG9hdDY0QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBrYShhLGMpfTtiLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9a2E7Yi5GbG9hdFR5cGU9MTAxNTtiLkZvZz1EZztiLkZvZ0V4cDI9Q2c7Yi5Gb250PWxpOwpiLkZvbnRMb2FkZXI9bWk7Yi5Gcm9udEZhY2VEaXJlY3Rpb25DQ1c9MTtiLkZyb250RmFjZURpcmVjdGlvbkNXPTA7Yi5Gcm9udFNpZGU9MDtiLkZydXN0dW09bGM7Yi5HYW1tYUVuY29kaW5nPTMwMDc7Yi5HZW9tZXRyeT14YTtiLkdlb21ldHJ5VXRpbHM9e21lcmdlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4iKTtpZihjLmlzTWVzaCl7Yy5tYXRyaXhBdXRvVXBkYXRlJiZjLnVwZGF0ZU1hdHJpeCgpO3ZhciBnPWMubWF0cml4O2M9Yy5nZW9tZXRyeX1hLm1lcmdlKGMsZyxlKX0sY2VudGVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4iKTsKcmV0dXJuIGEuY2VudGVyKCl9fTtiLkdyZWF0ZXJEZXB0aD02O2IuR3JlYXRlckVxdWFsRGVwdGg9NTtiLkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jPTUxODtiLkdyZWF0ZXJTdGVuY2lsRnVuYz01MTY7Yi5HcmlkSGVscGVyPWZoO2IuR3JvdXA9d2U7Yi5IYWxmRmxvYXRUeXBlPTEwMTY7Yi5IZW1pc3BoZXJlTGlnaHQ9UWc7Yi5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9Y2Y7Yi5IZW1pc3BoZXJlTGlnaHRQcm9iZT1uaTtiLkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SmU7Yi5JY29zYWhlZHJvbkdlb21ldHJ5PUpmO2IuSW1hZ2VCaXRtYXBMb2FkZXI9amk7Yi5JbWFnZUxvYWRlcj1XZTtiLkltYWdlVXRpbHM9R2Q7Yi5JbW1lZGlhdGVSZW5kZXJPYmplY3Q9ZGc7Yi5JbmNyZW1lbnRTdGVuY2lsT3A9NzY4MjtiLkluY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTU7Yi5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9JGc7Yi5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT1aZztiLkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPQp3aTtiLkludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IG9hKGEsYyl9O2IuSW50MTZCdWZmZXJBdHRyaWJ1dGU9b2E7Yi5JbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBjYShhLGMpfTtiLkludDMyQnVmZmVyQXR0cmlidXRlPWNhO2IuSW50OEF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWChhLApjKX07Yi5JbnQ4QnVmZmVyQXR0cmlidXRlPVg7Yi5JbnRUeXBlPTEwMTM7Yi5JbnRlcmxlYXZlZEJ1ZmZlcj1TZDtiLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlPXlmO2IuSW50ZXJwb2xhbnQ9cmM7Yi5JbnRlcnBvbGF0ZURpc2NyZXRlPTIzMDA7Yi5JbnRlcnBvbGF0ZUxpbmVhcj0yMzAxO2IuSW50ZXJwb2xhdGVTbW9vdGg9MjMwMjtiLkludmVydFN0ZW5jaWxPcD01Mzg2O2IuSlNPTkxvYWRlcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX07Yi5LZWVwU3RlbmNpbE9wPTc2ODA7Yi5LZXlmcmFtZVRyYWNrPVpiO2IuTE9EPUJmO2IuTGF0aGVCdWZmZXJHZW9tZXRyeT1RZTtiLkxhdGhlR2VvbWV0cnk9VmY7Yi5MYXllcnM9dztiLkxlbnNGbGFyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMiKX07CmIuTGVzc0RlcHRoPTI7Yi5MZXNzRXF1YWxEZXB0aD0zO2IuTGVzc0VxdWFsU3RlbmNpbEZ1bmM9NTE1O2IuTGVzc1N0ZW5jaWxGdW5jPTUxMztiLkxpZ2h0PUtiO2IuTGlnaHRQcm9iZT1KYztiLkxpZ2h0UHJvYmVIZWxwZXI9ZGY7Yi5MaWdodFNoYWRvdz1YYztiLkxpbmU9WGI7Yi5MaW5lMz16aTtiLkxpbmVCYXNpY01hdGVyaWFsPUZiO2IuTGluZUN1cnZlPW5jO2IuTGluZUN1cnZlMz1GYztiLkxpbmVEYXNoZWRNYXRlcmlhbD1mZTtiLkxpbmVMb29wPUdnO2IuTGluZVBpZWNlcz0xO2IuTGluZVNlZ21lbnRzPUliO2IuTGluZVN0cmlwPTA7Yi5MaW5lYXJFbmNvZGluZz0zRTM7Yi5MaW5lYXJGaWx0ZXI9MTAwNjtiLkxpbmVhckludGVycG9sYW50PVpmO2IuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDg7Yi5MaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDc7Yi5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNzsKYi5MaW5lYXJUb25lTWFwcGluZz0xO2IuTG9hZGVyPURiO2IuTG9hZGVyVXRpbHM9VWk7Yi5Mb2FkaW5nTWFuYWdlcj1laTtiLkxvZ0x1dkVuY29kaW5nPTMwMDM7Yi5Mb29wT25jZT0yMjAwO2IuTG9vcFBpbmdQb25nPTIyMDI7Yi5Mb29wUmVwZWF0PTIyMDE7Yi5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1O2IuTHVtaW5hbmNlRm9ybWF0PTEwMjQ7Yi5NT1VTRT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn07Yi5NYXRlcmlhbD1TO2IuTWF0ZXJpYWxMb2FkZXI9WWc7Yi5NYXRoPWhiO2IuTWF0cml4Mz1yO2IuTWF0cml4ND1xO2IuTWF4RXF1YXRpb249MTA0O2IuTWVzaD15YTtiLk1lc2hCYXNpY01hdGVyaWFsPU47Yi5NZXNoRGVwdGhNYXRlcmlhbD15ZDtiLk1lc2hEaXN0YW5jZU1hdGVyaWFsPXpkO2IuTWVzaEZhY2VNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7CnJldHVybiBhfTtiLk1lc2hMYW1iZXJ0TWF0ZXJpYWw9ZGU7Yi5NZXNoTWF0Y2FwTWF0ZXJpYWw9ZWU7Yi5NZXNoTm9ybWFsTWF0ZXJpYWw9Y2U7Yi5NZXNoUGhvbmdNYXRlcmlhbD1EYztiLk1lc2hQaHlzaWNhbE1hdGVyaWFsPWFlO2IuTWVzaFN0YW5kYXJkTWF0ZXJpYWw9VWM7Yi5NZXNoVG9vbk1hdGVyaWFsPWJlO2IuTWluRXF1YXRpb249MTAzO2IuTWlycm9yZWRSZXBlYXRXcmFwcGluZz0xMDAyO2IuTWl4T3BlcmF0aW9uPTE7Yi5NdWx0aU1hdGVyaWFsPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtjb25zb2xlLndhcm4oIlRIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7YS5pc011bHRpTWF0ZXJpYWw9ITA7YS5tYXRlcmlhbHM9YTthLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuc2xpY2UoKX07cmV0dXJuIGF9O2IuTXVsdGlwbHlCbGVuZGluZz00O2IuTXVsdGlwbHlPcGVyYXRpb249MDtiLk5lYXJlc3RGaWx0ZXI9CjEwMDM7Yi5OZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcj0xMDA1O2IuTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNDtiLk5ldmVyRGVwdGg9MDtiLk5ldmVyU3RlbmNpbEZ1bmM9NTEyO2IuTm9CbGVuZGluZz0wO2IuTm9Db2xvcnM9MDtiLk5vVG9uZU1hcHBpbmc9MDtiLk5vcm1hbEJsZW5kaW5nPTE7Yi5Ob3RFcXVhbERlcHRoPTc7Yi5Ob3RFcXVhbFN0ZW5jaWxGdW5jPTUxNztiLk51bWJlcktleWZyYW1lVHJhY2s9VWU7Yi5PYmplY3QzRD1BO2IuT2JqZWN0TG9hZGVyPWJoO2IuT2JqZWN0U3BhY2VOb3JtYWxNYXA9MTtiLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeT1UZDtiLk9jdGFoZWRyb25HZW9tZXRyeT1JZjtiLk9uZUZhY3Rvcj0yMDE7Yi5PbmVNaW51c0RzdEFscGhhRmFjdG9yPTIwNztiLk9uZU1pbnVzRHN0Q29sb3JGYWN0b3I9MjA5O2IuT25lTWludXNTcmNBbHBoYUZhY3Rvcj0KMjA1O2IuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDM7Yi5PcnRob2dyYXBoaWNDYW1lcmE9Y2c7Yi5QQ0ZTaGFkb3dNYXA9MTtiLlBDRlNvZnRTaGFkb3dNYXA9MjtiLlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeT1IZTtiLlBhcmFtZXRyaWNHZW9tZXRyeT1GZjtiLlBhcnRpY2xlPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIik7cmV0dXJuIG5ldyB6ZihhKX07Yi5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IENjKGEpfTtiLlBhcnRpY2xlU3lzdGVtPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKTtyZXR1cm4gbmV3IEVlKGEsCmMpfTtiLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIik7cmV0dXJuIG5ldyBDYyhhKX07Yi5QYXRoPUljO2IuUGVyc3BlY3RpdmVDYW1lcmE9dmI7Yi5QbGFuZT1IYjtiLlBsYW5lQnVmZmVyR2VvbWV0cnk9TmM7Yi5QbGFuZUdlb21ldHJ5PXVkO2IuUGxhbmVIZWxwZXI9aWc7Yi5Qb2ludENsb3VkPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgRWUoYSxjKX07Yi5Qb2ludENsb3VkTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IENjKGEpfTtiLlBvaW50TGlnaHQ9ClRnO2IuUG9pbnRMaWdodEhlbHBlcj1hZjtiLlBvaW50cz1FZTtiLlBvaW50c01hdGVyaWFsPUNjO2IuUG9sYXJHcmlkSGVscGVyPWdoO2IuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5PW1jO2IuUG9seWhlZHJvbkdlb21ldHJ5PUdmO2IuUG9zaXRpb25hbEF1ZGlvPXNpO2IuUG9zaXRpb25hbEF1ZGlvSGVscGVyPWVmO2IuUHJvcGVydHlCaW5kaW5nPWNjO2IuUHJvcGVydHlNaXhlcj11aTtiLlF1YWRyYXRpY0JlemllckN1cnZlPUdjO2IuUXVhZHJhdGljQmV6aWVyQ3VydmUzPVdjO2IuUXVhdGVybmlvbj1oO2IuUXVhdGVybmlvbktleWZyYW1lVHJhY2s9JGY7Yi5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ9TGc7Yi5SRVZJU0lPTj0iMTA4IjtiLlJHQkFEZXB0aFBhY2tpbmc9MzIwMTtiLlJHQkFGb3JtYXQ9MTAyMztiLlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9Mzc4MTk7Yi5SR0JBX0FTVENfMTB4NV9Gb3JtYXQ9Mzc4MTY7Yi5SR0JBX0FTVENfMTB4Nl9Gb3JtYXQ9Mzc4MTc7Yi5SR0JBX0FTVENfMTB4OF9Gb3JtYXQ9CjM3ODE4O2IuUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdD0zNzgyMDtiLlJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ9Mzc4MjE7Yi5SR0JBX0FTVENfNHg0X0Zvcm1hdD0zNzgwODtiLlJHQkFfQVNUQ181eDRfRm9ybWF0PTM3ODA5O2IuUkdCQV9BU1RDXzV4NV9Gb3JtYXQ9Mzc4MTA7Yi5SR0JBX0FTVENfNng1X0Zvcm1hdD0zNzgxMTtiLlJHQkFfQVNUQ182eDZfRm9ybWF0PTM3ODEyO2IuUkdCQV9BU1RDXzh4NV9Gb3JtYXQ9Mzc4MTM7Yi5SR0JBX0FTVENfOHg2X0Zvcm1hdD0zNzgxNDtiLlJHQkFfQVNUQ184eDhfRm9ybWF0PTM3ODE1O2IuUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQzO2IuUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQyO2IuUkdCQV9TM1RDX0RYVDFfRm9ybWF0PTMzNzc3O2IuUkdCQV9TM1RDX0RYVDNfRm9ybWF0PTMzNzc4O2IuUkdCQV9TM1RDX0RYVDVfRm9ybWF0PTMzNzc5O2IuUkdCREVuY29kaW5nPTMwMDY7Yi5SR0JFRW5jb2Rpbmc9MzAwMjtiLlJHQkVGb3JtYXQ9CjEwMjM7Yi5SR0JGb3JtYXQ9MTAyMjtiLlJHQk0xNkVuY29kaW5nPTMwMDU7Yi5SR0JNN0VuY29kaW5nPTMwMDQ7Yi5SR0JfRVRDMV9Gb3JtYXQ9MzYxOTY7Yi5SR0JfUFZSVENfMkJQUFYxX0Zvcm1hdD0zNTg0MTtiLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQwO2IuUkdCX1MzVENfRFhUMV9Gb3JtYXQ9MzM3NzY7Yi5SYXdTaGFkZXJNYXRlcmlhbD1UZTtiLlJheT1EO2IuUmF5Y2FzdGVyPWRrO2IuUmVjdEFyZWFMaWdodD1YZztiLlJlY3RBcmVhTGlnaHRIZWxwZXI9YmY7Yi5SZWRGb3JtYXQ9MTAyODtiLlJlaW5oYXJkVG9uZU1hcHBpbmc9MjtiLlJlcGVhdFdyYXBwaW5nPTFFMztiLlJlcGxhY2VTdGVuY2lsT3A9NzY4MTtiLlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uPTEwMjtiLlJpbmdCdWZmZXJHZW9tZXRyeT1QZTtiLlJpbmdHZW9tZXRyeT1VZjtiLlNjZW5lPXk7Yi5TY2VuZVV0aWxzPXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSwKZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSxhdHRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9fTtiLlNoYWRlckNodW5rPXJiO2IuU2hhZGVyTGliPU9jO2IuU2hhZGVyTWF0ZXJpYWw9cWI7Yi5TaGFkb3dNYXRlcmlhbD0kZDtiLlNoYXBlPUZkO2IuU2hhcGVCdWZmZXJHZW9tZXRyeT1ZZDtiLlNoYXBlR2VvbWV0cnk9WGQ7Yi5TaGFwZVBhdGg9a2k7Yi5TaGFwZVV0aWxzPWdkO2IuU2hvcnRUeXBlPTEwMTE7Yi5Ta2VsZXRvbj1GZztiLlNrZWxldG9uSGVscGVyPSRlO2IuU2tpbm5lZE1lc2g9Q2Y7Yi5TbW9vdGhTaGFkaW5nPTI7Yi5TcGhlcmU9RztiLlNwaGVyZUJ1ZmZlckdlb21ldHJ5PUVkO2IuU3BoZXJlR2VvbWV0cnk9ClRmO2IuU3BoZXJpY2FsPWZrO2IuU3BoZXJpY2FsSGFybW9uaWNzMz1kaDtiLlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nPTMwNTtiLlNwbGluZT1CaTtiLlNwbGluZUN1cnZlPUhjO2IuU3BsaW5lQ3VydmUzPWprO2IuU3BvdExpZ2h0PVNnO2IuU3BvdExpZ2h0SGVscGVyPVplO2IuU3BvdExpZ2h0U2hhZG93PVJnO2IuU3ByaXRlPXpmO2IuU3ByaXRlTWF0ZXJpYWw9RGQ7Yi5TcmNBbHBoYUZhY3Rvcj0yMDQ7Yi5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yPTIxMDtiLlNyY0NvbG9yRmFjdG9yPTIwMjtiLlN0ZXJlb0NhbWVyYT1aajtiLlN0cmluZ0tleWZyYW1lVHJhY2s9TWc7Yi5TdWJ0cmFjdEVxdWF0aW9uPTEwMTtiLlN1YnRyYWN0aXZlQmxlbmRpbmc9MztiLlRPVUNIPXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M307Yi5UYW5nZW50U3BhY2VOb3JtYWxNYXA9MDtiLlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SWU7Yi5UZXRyYWhlZHJvbkdlb21ldHJ5PQpIZjtiLlRleHRCdWZmZXJHZW9tZXRyeT1PZTtiLlRleHRHZW9tZXRyeT1TZjtiLlRleHR1cmU9bDtiLlRleHR1cmVMb2FkZXI9UGc7Yi5Ub3J1c0J1ZmZlckdlb21ldHJ5PU1lO2IuVG9ydXNHZW9tZXRyeT1OZjtiLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5PUxlO2IuVG9ydXNLbm90R2VvbWV0cnk9TWY7Yi5UcmlhbmdsZT1CO2IuVHJpYW5nbGVGYW5EcmF3TW9kZT0yO2IuVHJpYW5nbGVTdHJpcERyYXdNb2RlPTE7Yi5UcmlhbmdsZXNEcmF3TW9kZT0wO2IuVHViZUJ1ZmZlckdlb21ldHJ5PVVkO2IuVHViZUdlb21ldHJ5PUxmO2IuVVZNYXBwaW5nPTMwMDtiLlVpbnQxNkF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFooYSxjKX07Yi5VaW50MTZCdWZmZXJBdHRyaWJ1dGU9WjtiLlVpbnQzMkF0dHJpYnV0ZT0KZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBqYShhLGMpfTtiLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZT1qYTtiLlVpbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGFhKGEsYyl9O2IuVWludDhCdWZmZXJBdHRyaWJ1dGU9YWE7Yi5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBmYShhLApjKX07Yi5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9ZmE7Yi5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MztiLlVuaWZvcm09ZWg7Yi5Vbmlmb3Jtc0xpYj1XYTtiLlVuaWZvcm1zVXRpbHM9JG07Yi5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7Yi5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDtiLlVuc2lnbmVkSW50VHlwZT0xMDE0O2IuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7Yi5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODtiLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7Yi5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2IuVlNNU2hhZG93TWFwPTM7Yi5WZWN0b3IyPWY7Yi5WZWN0b3IzPWs7Yi5WZWN0b3I0PXA7Yi5WZWN0b3JLZXlmcmFtZVRyYWNrPVZlO2IuVmVydGV4PWZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgayhhLGMsZSl9O2IuVmVydGV4Q29sb3JzPQoyO2IuVmVydGV4Tm9ybWFsc0hlbHBlcj1lZztiLlZpZGVvVGV4dHVyZT1iaTtiLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9bjtiLldlYkdMUmVuZGVyVGFyZ2V0PW07Yi5XZWJHTFJlbmRlclRhcmdldEN1YmU9T2I7Yi5XZWJHTFJlbmRlcmVyPVRoO2IuV2ViR0xVdGlscz1GajtiLldpcmVmcmFtZUdlb21ldHJ5PUdlO2IuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgR2UoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2IuWEhSTG9hZGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyB3YyhhKX07Yi5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7Yi5aZXJvRmFjdG9yPTIwMDtiLlplcm9TbG9wZUVuZGluZz0yNDAxO2IuWmVyb1N0ZW5jaWxPcD0wO2Iuc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBmKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpXLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBoKCl7cmV0dXJuIE1hdGgucG93KC45NSxXLnpvb21TcGVlZCl9ZnVuY3Rpb24gayhzYSl7WGEudGhldGEtPXNhfWZ1bmN0aW9uIHIoc2Epe1hhLnBoaS09c2F9ZnVuY3Rpb24gbChzYSl7Vy5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT91Yi89c2E6Vy5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFcub2JqZWN0Lnpvb209TWF0aC5tYXgoVy5taW5ab29tLE1hdGgubWluKFcubWF4Wm9vbSxXLm9iamVjdC56b29tKnNhKSksVy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHFiPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFcuZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChzYSl7Vy5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KdWIqPXNhOlcub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhXLm9iamVjdC56b29tPU1hdGgubWF4KFcubWluWm9vbSxNYXRoLm1pbihXLm1heFpvb20sVy5vYmplY3Quem9vbS9zYSkpLFcub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxXLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIG0oc2Epe3piLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIG4oc2Epe2xjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHEoc2Epe09iLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHUoc2Epe3ZiLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO0diLnN1YlZlY3RvcnModmIsemIpLm11bHRpcGx5U2NhbGFyKFcucm90YXRlU3BlZWQpO3NhPQpXLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9XLmRvbUVsZW1lbnQuYm9keTpXLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3IoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKTtXLnVwZGF0ZSgpfWZ1bmN0aW9uIHcoc2Epe2VjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO1FkLnN1YlZlY3RvcnMoZWMsbGMpOzA8UWQueT9sKGgoKSk6MD5RZC55JiZwKGgoKSk7bGMuY29weShlYyk7Vy51cGRhdGUoKX1mdW5jdGlvbiBBKHNhKXtBYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtIYi5zdWJWZWN0b3JzKEFiLE9iKS5tdWx0aXBseVNjYWxhcihXLnBhblNwZWVkKTt2ZChIYi54LEhiLnkpO09iLmNvcHkoQWIpO1cudXBkYXRlKCl9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB4KHNhKXswPnNhLmRlbHRhWT9wKGgoKSk6MDxzYS5kZWx0YVkmJmwoaCgpKTtXLnVwZGF0ZSgpfWZ1bmN0aW9uIEMoc2Epe3ZhciBOYj0hMTtzd2l0Y2goc2Eua2V5Q29kZSl7Y2FzZSBXLmtleXMuVVA6dmQoMCwKVy5rZXlQYW5TcGVlZCk7TmI9ITA7YnJlYWs7Y2FzZSBXLmtleXMuQk9UVE9NOnZkKDAsLVcua2V5UGFuU3BlZWQpO05iPSEwO2JyZWFrO2Nhc2UgVy5rZXlzLkxFRlQ6dmQoVy5rZXlQYW5TcGVlZCwwKTtOYj0hMDticmVhaztjYXNlIFcua2V5cy5SSUdIVDp2ZCgtVy5rZXlQYW5TcGVlZCwwKSxOYj0hMH1OYiYmKHNhLnByZXZlbnREZWZhdWx0KCksVy51cGRhdGUoKSl9ZnVuY3Rpb24gRyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/emIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6emIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9PYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpPYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrCnNhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHNhKXt2YXIgTmI9c2EudG91Y2hlc1swXS5wYWdlWC1zYS50b3VjaGVzWzFdLnBhZ2VYO3NhPXNhLnRvdWNoZXNbMF0ucGFnZVktc2EudG91Y2hlc1sxXS5wYWdlWTtsYy5zZXQoMCxNYXRoLnNxcnQoTmIqTmIrc2Eqc2EpKX1mdW5jdGlvbiBIKHNhKXtXLmVuYWJsZVpvb20mJkIoc2EpO1cuZW5hYmxlUGFuJiZEKHNhKX1mdW5jdGlvbiBLKHNhKXtXLmVuYWJsZVpvb20mJkIoc2EpO1cuZW5hYmxlUm90YXRlJiZHKHNhKX1mdW5jdGlvbiBMKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD92Yi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTp2Yi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0diLnN1YlZlY3RvcnModmIsCnpiKS5tdWx0aXBseVNjYWxhcihXLnJvdGF0ZVNwZWVkKTtzYT1XLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9XLmRvbUVsZW1lbnQuYm9keTpXLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3IoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKX1mdW5jdGlvbiBKKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9BYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0hiLnN1YlZlY3RvcnMoQWIsT2IpLm11bHRpcGx5U2NhbGFyKFcucGFuU3BlZWQpO3ZkKEhiLngsSGIueSk7T2IuY29weShBYil9ZnVuY3Rpb24gTyhzYSl7dmFyIE5iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLQpzYS50b3VjaGVzWzFdLnBhZ2VZO2VjLnNldCgwLE1hdGguc3FydChOYipOYitzYSpzYSkpO1FkLnNldCgwLE1hdGgucG93KGVjLnkvbGMueSxXLnpvb21TcGVlZCkpO2woUWQueSk7bGMuY29weShlYyl9ZnVuY3Rpb24gUyhzYSl7Vy5lbmFibGVab29tJiZPKHNhKTtXLmVuYWJsZVBhbiYmSihzYSl9ZnVuY3Rpb24gTihzYSl7Vy5lbmFibGVab29tJiZPKHNhKTtXLmVuYWJsZVJvdGF0ZSYmTChzYSl9ZnVuY3Rpb24gUigpe31mdW5jdGlvbiBYKHNhKXtpZighMSE9PVcuZW5hYmxlZCl7c2EucHJldmVudERlZmF1bHQoKTtXLmRvbUVsZW1lbnQuZm9jdXM/Vy5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHNhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChXLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9CkFhLlBBTn1lbHNle2lmKCExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1XLmVuYWJsZVJvdGF0ZSlyZXR1cm47bShzYSk7RmE9QWEuUk9UQVRFfWVsc2V7aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFcubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVcuZW5hYmxlWm9vbSlyZXR1cm47bihzYSk7RmE9QWEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goVy5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19RmEhPT1BYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhYSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZmEsITEpLFcuZGlzcGF0Y2hFdmVudCh2YSkpfX1mdW5jdGlvbiBhYShzYSl7aWYoITEhPT1XLmVuYWJsZWQpc3dpdGNoKHNhLnByZXZlbnREZWZhdWx0KCksRmEpe2Nhc2UgQWEuUk9UQVRFOmlmKCExPT09Vy5lbmFibGVSb3RhdGUpYnJlYWs7dShzYSk7YnJlYWs7Y2FzZSBBYS5ET0xMWTppZighMT09PVcuZW5hYmxlWm9vbSlicmVhazt3KHNhKTticmVhaztjYXNlIEFhLlBBTjohMSE9PVcuZW5hYmxlUGFuJiZBKHNhKX19ZnVuY3Rpb24gZmEoc2EpeyExIT09Vy5lbmFibGVkJiYoeShzYSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwKYWEsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZhLCExKSxXLmRpc3BhdGNoRXZlbnQoeWEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIG9hKHNhKXshMT09PVcuZW5hYmxlZHx8ITE9PT1XLmVuYWJsZVpvb218fEZhIT09QWEuTk9ORSYmRmEhPT1BYS5ST1RBVEV8fChzYS5wcmV2ZW50RGVmYXVsdCgpLHNhLnN0b3BQcm9wYWdhdGlvbigpLFcuZGlzcGF0Y2hFdmVudCh2YSkseChzYSksVy5kaXNwYXRjaEV2ZW50KHlhKSl9ZnVuY3Rpb24gWihzYSl7ITEhPT1XLmVuYWJsZWQmJiExIT09Vy5lbmFibGVLZXlzJiYhMSE9PVcuZW5hYmxlUGFuJiZDKHNhKX1mdW5jdGlvbiBjYShzYSl7aWYoITEhPT1XLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKHNhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKFcudG91Y2hlcy5PTkUpe2Nhc2UgVEhSRUUuVE9VQ0guUk9UQVRFOmlmKCExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO0coc2EpO0ZhPQpBYS5UT1VDSF9ST1RBVEU7YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5QQU46aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47RChzYSk7RmE9QWEuVE9VQ0hfUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFcudG91Y2hlcy5UV08pe2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUEFOOmlmKCExPT09Vy5lbmFibGVab29tJiYhMT09PVcuZW5hYmxlUGFuKXJldHVybjtIKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9QQU47YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5ET0xMWV9ST1RBVEU6aWYoITE9PT1XLmVuYWJsZVpvb20mJiExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO0soc2EpO0ZhPUFhLlRPVUNIX0RPTExZX1JPVEFURTticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfUZhIT09QWEuTk9ORSYmVy5kaXNwYXRjaEV2ZW50KHZhKX19ZnVuY3Rpb24gamEoc2Epe2lmKCExIT09Vy5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLApzYS5zdG9wUHJvcGFnYXRpb24oKSxGYSl7Y2FzZSBBYS5UT1VDSF9ST1RBVEU6aWYoITE9PT1XLmVuYWJsZVJvdGF0ZSlicmVhaztMKHNhKTtXLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfUEFOOmlmKCExPT09Vy5lbmFibGVQYW4pYnJlYWs7SihzYSk7Vy51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1BBTjppZighMT09PVcuZW5hYmxlWm9vbSYmITE9PT1XLmVuYWJsZVBhbilicmVhaztTKHNhKTtXLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfRE9MTFlfUk9UQVRFOmlmKCExPT09Vy5lbmFibGVab29tJiYhMT09PVcuZW5hYmxlUm90YXRlKWJyZWFrO04oc2EpO1cudXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfX1mdW5jdGlvbiBiYShzYSl7ITEhPT1XLmVuYWJsZWQmJihSKHNhKSxXLmRpc3BhdGNoRXZlbnQoeWEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGthKHNhKXshMSE9PVcuZW5hYmxlZCYmc2EucHJldmVudERlZmF1bHQoKX10aGlzLm9iamVjdD0KYjt0aGlzLmRvbUVsZW1lbnQ9dm9pZCAwIT09ZD9kOmRvY3VtZW50O3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRhcmdldD1uZXcgVEhSRUUuVmVjdG9yMzt0aGlzLm1pbkRpc3RhbmNlPTA7dGhpcy5tYXhEaXN0YW5jZT1JbmZpbml0eTt0aGlzLm1pblpvb209MDt0aGlzLm1heFpvb209SW5maW5pdHk7dGhpcy5taW5Qb2xhckFuZ2xlPTA7dGhpcy5tYXhQb2xhckFuZ2xlPU1hdGguUEk7dGhpcy5taW5BemltdXRoQW5nbGU9LUluZmluaXR5O3RoaXMubWF4QXppbXV0aEFuZ2xlPUluZmluaXR5O3RoaXMuZW5hYmxlRGFtcGluZz0hMTt0aGlzLmRhbXBpbmdGYWN0b3I9LjA1O3RoaXMuZW5hYmxlWm9vbT0hMDt0aGlzLnpvb21TcGVlZD0xO3RoaXMuZW5hYmxlUm90YXRlPSEwO3RoaXMucm90YXRlU3BlZWQ9MTt0aGlzLmVuYWJsZVBhbj0hMDt0aGlzLnBhblNwZWVkPTE7dGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITE7dGhpcy5rZXlQYW5TcGVlZD03O3RoaXMuYXV0b1JvdGF0ZT0hMTt0aGlzLmF1dG9Sb3RhdGVTcGVlZD0KMjt0aGlzLmVuYWJsZUtleXM9ITA7dGhpcy5rZXlzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LEJPVFRPTTo0MH07dGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6VEhSRUUuTU9VU0UuUk9UQVRFLE1JRERMRTpUSFJFRS5NT1VTRS5ET0xMWSxSSUdIVDpUSFJFRS5NT1VTRS5QQU59O3RoaXMudG91Y2hlcz17T05FOlRIUkVFLlRPVUNILlJPVEFURSxUV086VEhSRUUuVE9VQ0guRE9MTFlfUEFOfTt0aGlzLnRhcmdldDA9dGhpcy50YXJnZXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uMD10aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO3RoaXMuem9vbTA9dGhpcy5vYmplY3Quem9vbTt0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gU2EucGhpfTt0aGlzLmdldEF6aW11dGhhbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnRoZXRhfTt0aGlzLnNhdmVTdGF0ZT1mdW5jdGlvbigpe1cudGFyZ2V0MC5jb3B5KFcudGFyZ2V0KTtXLnBvc2l0aW9uMC5jb3B5KFcub2JqZWN0LnBvc2l0aW9uKTsKVy56b29tMD1XLm9iamVjdC56b29tfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7Vy50YXJnZXQuY29weShXLnRhcmdldDApO1cub2JqZWN0LnBvc2l0aW9uLmNvcHkoVy5wb3NpdGlvbjApO1cub2JqZWN0Lnpvb209Vy56b29tMDtXLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7Vy5kaXNwYXRjaEV2ZW50KEVhKTtXLnVwZGF0ZSgpO0ZhPUFhLk5PTkV9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzLE5iPShuZXcgVEhSRUUuUXVhdGVybmlvbikuc2V0RnJvbVVuaXRWZWN0b3JzKGIudXAsbmV3IFRIUkVFLlZlY3RvcjMoMCwxLDApKSx5Yz1OYi5jbG9uZSgpLmludmVyc2UoKSxkZD1uZXcgVEhSRUUuVmVjdG9yMyx3ZD1uZXcgVEhSRUUuUXVhdGVybmlvbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgd2c9Vy5vYmplY3QucG9zaXRpb247c2EuY29weSh3Zykuc3ViKFcudGFyZ2V0KTtzYS5hcHBseVF1YXRlcm5pb24oTmIpO1NhLnNldEZyb21WZWN0b3IzKHNhKTsKVy5hdXRvUm90YXRlJiZGYT09PUFhLk5PTkUmJmsoZigpKTtXLmVuYWJsZURhbXBpbmc/KFNhLnRoZXRhKz1YYS50aGV0YSpXLmRhbXBpbmdGYWN0b3IsU2EucGhpKz1YYS5waGkqVy5kYW1waW5nRmFjdG9yKTooU2EudGhldGErPVhhLnRoZXRhLFNhLnBoaSs9WGEucGhpKTtTYS50aGV0YT1NYXRoLm1heChXLm1pbkF6aW11dGhBbmdsZSxNYXRoLm1pbihXLm1heEF6aW11dGhBbmdsZSxTYS50aGV0YSkpO1NhLnBoaT1NYXRoLm1heChXLm1pblBvbGFyQW5nbGUsTWF0aC5taW4oVy5tYXhQb2xhckFuZ2xlLFNhLnBoaSkpO1NhLm1ha2VTYWZlKCk7U2EucmFkaXVzKj11YjtTYS5yYWRpdXM9TWF0aC5tYXgoVy5taW5EaXN0YW5jZSxNYXRoLm1pbihXLm1heERpc3RhbmNlLFNhLnJhZGl1cykpOyEwPT09Vy5lbmFibGVEYW1waW5nP1cudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihCYixXLmRhbXBpbmdGYWN0b3IpOlcudGFyZ2V0LmFkZChCYik7c2Euc2V0RnJvbVNwaGVyaWNhbChTYSk7c2EuYXBwbHlRdWF0ZXJuaW9uKHljKTsKd2cuY29weShXLnRhcmdldCkuYWRkKHNhKTtXLm9iamVjdC5sb29rQXQoVy50YXJnZXQpOyEwPT09Vy5lbmFibGVEYW1waW5nPyhYYS50aGV0YSo9MS1XLmRhbXBpbmdGYWN0b3IsWGEucGhpKj0xLVcuZGFtcGluZ0ZhY3RvcixCYi5tdWx0aXBseVNjYWxhcigxLVcuZGFtcGluZ0ZhY3RvcikpOihYYS5zZXQoMCwwLDApLEJiLnNldCgwLDAsMCkpO3ViPTE7cmV0dXJuIHFifHxkZC5kaXN0YW5jZVRvU3F1YXJlZChXLm9iamVjdC5wb3NpdGlvbik+eGF8fDgqKDEtd2QuZG90KFcub2JqZWN0LnF1YXRlcm5pb24pKT54YT8oVy5kaXNwYXRjaEV2ZW50KEVhKSxkZC5jb3B5KFcub2JqZWN0LnBvc2l0aW9uKSx3ZC5jb3B5KFcub2JqZWN0LnF1YXRlcm5pb24pLHFiPSExLCEwKTohMX19KCk7dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixrYSwhMSk7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsClgsITEpO1cuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsb2EsITEpO1cuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjYSwhMSk7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixiYSwhMSk7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsamEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYWEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZhLCExKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSl9O3ZhciBXPXRoaXMsRWE9e3R5cGU6ImNoYW5nZSJ9LHZhPXt0eXBlOiJzdGFydCJ9LHlhPXt0eXBlOiJlbmQifSxBYT17Tk9ORTotMSxST1RBVEU6MCxET0xMWToxLFBBTjoyLFRPVUNIX1JPVEFURTozLFRPVUNIX1BBTjo0LFRPVUNIX0RPTExZX1BBTjo1LFRPVUNIX0RPTExZX1JPVEFURTo2fSwKRmE9QWEuTk9ORSx4YT0xRS02LFNhPW5ldyBUSFJFRS5TcGhlcmljYWwsWGE9bmV3IFRIUkVFLlNwaGVyaWNhbCx1Yj0xLEJiPW5ldyBUSFJFRS5WZWN0b3IzLHFiPSExLHpiPW5ldyBUSFJFRS5WZWN0b3IyLHZiPW5ldyBUSFJFRS5WZWN0b3IyLEdiPW5ldyBUSFJFRS5WZWN0b3IyLE9iPW5ldyBUSFJFRS5WZWN0b3IyLEFiPW5ldyBUSFJFRS5WZWN0b3IyLEhiPW5ldyBUSFJFRS5WZWN0b3IyLGxjPW5ldyBUSFJFRS5WZWN0b3IyLGVjPW5ldyBUSFJFRS5WZWN0b3IyLFFkPW5ldyBUSFJFRS5WZWN0b3IyLHVkPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihOYix5Yyl7c2Euc2V0RnJvbU1hdHJpeENvbHVtbih5YywwKTtzYS5tdWx0aXBseVNjYWxhcigtTmIpO0JiLmFkZChzYSl9fSgpLE5jPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihOYix5Yyl7ITA9PT1XLnNjcmVlblNwYWNlUGFubmluZz8Kc2Euc2V0RnJvbU1hdHJpeENvbHVtbih5YywxKTooc2Euc2V0RnJvbU1hdHJpeENvbHVtbih5YywwKSxzYS5jcm9zc1ZlY3RvcnMoVy5vYmplY3QudXAsc2EpKTtzYS5tdWx0aXBseVNjYWxhcihOYik7QmIuYWRkKHNhKX19KCksdmQ9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE5iLHljKXt2YXIgZGQ9Vy5kb21FbGVtZW50PT09ZG9jdW1lbnQ/Vy5kb21FbGVtZW50LmJvZHk6Vy5kb21FbGVtZW50O2lmKFcub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe3NhLmNvcHkoVy5vYmplY3QucG9zaXRpb24pLnN1YihXLnRhcmdldCk7dmFyIHdkPXNhLmxlbmd0aCgpO3dkKj1NYXRoLnRhbihXLm9iamVjdC5mb3YvMipNYXRoLlBJLzE4MCk7dWQoMipOYip3ZC9kZC5jbGllbnRIZWlnaHQsVy5vYmplY3QubWF0cml4KTtOYygyKnljKndkL2RkLmNsaWVudEhlaWdodCxXLm9iamVjdC5tYXRyaXgpfWVsc2UgVy5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/Cih1ZChOYiooVy5vYmplY3QucmlnaHQtVy5vYmplY3QubGVmdCkvVy5vYmplY3Quem9vbS9kZC5jbGllbnRXaWR0aCxXLm9iamVjdC5tYXRyaXgpLE5jKHljKihXLm9iamVjdC50b3AtVy5vYmplY3QuYm90dG9tKS9XLm9iamVjdC56b29tL2RkLmNsaWVudEhlaWdodCxXLm9iamVjdC5tYXRyaXgpKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBwYW4gZGlzYWJsZWQuIiksVy5lbmFibGVQYW49ITEpfX0oKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGthLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixYLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLG9hLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsY2EsITEpO1cuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCmJhLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixqYSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFosITEpO3RoaXMudXBkYXRlKCl9O1RIUkVFLk9yYml0Q29udHJvbHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSk7VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuT3JiaXRDb250cm9scztUSFJFRS5NYXBDb250cm9scz1mdW5jdGlvbihiLGQpe1RIUkVFLk9yYml0Q29udHJvbHMuY2FsbCh0aGlzLGIsZCk7dGhpcy5tb3VzZUJ1dHRvbnMuTEVGVD1USFJFRS5NT1VTRS5QQU47dGhpcy5tb3VzZUJ1dHRvbnMuUklHSFQ9VEhSRUUuTU9VU0UuUk9UQVRFO3RoaXMudG91Y2hlcy5PTkU9VEhSRUUuVE9VQ0guUEFOO3RoaXMudG91Y2hlcy5UV089VEhSRUUuVE9VQ0guRE9MTFlfUk9UQVRFfTsKVEhSRUUuTWFwQ29udHJvbHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSk7VEhSRUUuTWFwQ29udHJvbHMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVRIUkVFLk1hcENvbnRyb2xzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvYXJyYXktYnVmZmVyLWRhdGEtcHJvdmlkZXIuanMKdmFyIGZsOwooZnVuY3Rpb24oYil7Yi5FcnJvckNvZGVzPXtDQU5DRUxMRUQ6MX07Y29uc3QgZD17VkVSVEVYOjEsRkFDRToyLENPTE9SOjN9LGY9e1ZFUlRFWDoiZmxvYXQzMiIsRkFDRToiaW50MzIiLENPTE9SOiJ1aW50OCJ9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayl7dGhpcy5fcmVxdWVzdE1hbmFnZXI9azt0aGlzLl9jYW5jZWxsZXI9bmV3IGRjLkNhbmNlbGxlcn1yZWxvYWQoayxyLGwpe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTtyZXR1cm4gdGhpcy5fZmV0Y2hNZXRhZGF0YShrLHIsbCl9X2ZldGNoRGF0YUJ5U3RlcChrLHIsbCxwLG0sbil7ZnVuY3Rpb24gcSh1KXtsZXQgdz1bXTtmb3IobGV0IEE9MDtBPHUubGVuZ3RoLzM7QSsrKXtsZXQgeT1bXTtmb3IobGV0IHg9MDszPng7eCsrKXkucHVzaCh1WzMqQSt4XSk7dy5wdXNoKHkpfXJldHVybiB3fWs9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnIscnVuOmssCmNvbnRlbnRfdHlwZTpsLHNhbXBsZTpwLHN0ZXA6bX0pKTtyPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSh1PT57aWYodS5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTt1PXUudmFsdWU7c3dpdGNoKGwpe2Nhc2UgIlZFUlRFWCI6bi52ZXJ0aWNlcz1xKG5ldyBGbG9hdDMyQXJyYXkodSkpO2JyZWFrO2Nhc2UgIkZBQ0UiOm4uZmFjZXM9cShuZXcgSW50MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiQ09MT1IiOm4uY29sb3JzPXEobmV3IFVpbnQ4QXJyYXkodSkpfXJldHVybiBufSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGssbnVsbCwiYXJyYXlidWZmZXIiLGZbbF0pLnRoZW4odT0+dS5hcnJheUJ1ZmZlcigpKS50aGVuKHIpfWZldGNoRGF0YShrLHIsbCxwKXtsZXQgbT1bXSxuPW5ldyBNYXA7T2JqZWN0LmtleXMoZCkuZm9yRWFjaChxPT4Ke2suY29tcG9uZW50cyYxPDxkW3FdJiZtLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKHIsbCxxLHAsay5zdGVwLG4pKX0pO3JldHVybiBQcm9taXNlLmFsbChtKX1fZmV0Y2hNZXRhZGF0YShrLHIsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2s9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvbWVzaGVzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6cixydW46ayxzYW1wbGU6bH0pKTtyPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShwPT5wLmNhbmNlbGxlZD9Qcm9taXNlLnJlamVjdCh7Y29kZTpiLkVycm9yQ29kZXMuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk6cC52YWx1ZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGspLnRoZW4ocD0+cC5qc29uKCkpLnRoZW4ocikudGhlbih0aGlzLl9wcm9jZXNzTWV0YWRhdGEuYmluZCh0aGlzKSl9X3Byb2Nlc3NNZXRhZGF0YShrKXtpZihrKXt2YXIgcj0KbmV3IE1hcDtmb3IobGV0IHA9MDtwPGsubGVuZ3RoO3ArKyl7bGV0IG09a1twXTtyLmhhcyhtLnN0ZXApfHxyLnNldChtLnN0ZXAsW10pO3IuZ2V0KG0uc3RlcCkucHVzaChtKX12YXIgbD1bXTtyLmZvckVhY2gocD0+e3A9dGhpcy5fY3JlYXRlU3RlcERhdHVtKHBbMF0pO2wucHVzaChwKX0pO3JldHVybiBsfX1fY3JlYXRlU3RlcERhdHVtKGspe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmsud2FsbF90aW1lKSxzdGVwOmsuc3RlcCxjb25maWc6ay5jb25maWcsY29udGVudF90eXBlOmsuY29udGVudF90eXBlLGNvbXBvbmVudHM6ay5jb21wb25lbnRzfX19Yi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcj1ofSkoZmx8fChmbD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvbWVzaC12aWV3ZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXJ7Y29uc3RydWN0b3IoZil7c3VwZXIoKTt0aGlzLl9sYXN0TWVzaD1udWxsO3RoaXMuX2Nsb2NrPW5ldyBUSFJFRS5DbG9jazt0aGlzLl9jYW52YXNTaXplPW51bGw7dGhpcy5fcnVuQ29sb3I9Zn1faXNPYmplY3QoZil7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBmJiZudWxsIT1mJiYhQXJyYXkuaXNBcnJheShmKX1fYXBwbHlEZWZhdWx0cyhmLGgpe2xldCBrPXt9O2Y9W2YsaF07Zm9yKGg9MDtoPGYubGVuZ3RoO2grKyl7Y29uc3Qgcj1mW2hdO2ZvcihsZXQgbCBpbiByKXtjb25zdCBwPWwgaW4gazt0aGlzLl9pc09iamVjdChyW2xdKT9rW2xdPXRoaXMuX2FwcGx5RGVmYXVsdHMoa1tsXXx8e30scltsXSk6cHx8KGtbbF09cltsXSl9fXJldHVybiBrfV9jcmVhdGVXb3JsZChmLGgpe3RoaXMuaXNSZWFkeSgpfHwodGhpcy5fc2NlbmU9bmV3IFRIUkVFLlNjZW5lLHRoaXMuX2NhbWVyYT1mPW5ldyBUSFJFRVtmLmNhbWVyYS5jbHNdKGYuY2FtZXJhLmZvdiwKdGhpcy5fY2FudmFzU2l6ZS53aWR0aC90aGlzLl9jYW52YXNTaXplLmhlaWdodCxmLmNhbWVyYS5uZWFyLGYuY2FtZXJhLmZhciksaD1uZXcgVEhSRUUuT3JiaXRDb250cm9scyhmLGgpLGgubG9va1NwZWVkPS40LGgubW92ZW1lbnRTcGVlZD0yMCxoLm5vRmx5PSEwLGgubG9va1ZlcnRpY2FsPSEwLGguY29uc3RyYWluVmVydGljYWw9ITAsaC52ZXJ0aWNhbE1pbj0xLGgudmVydGljYWxNYXg9MixoLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9jYW1lcmFDb250cm9scz1oLHRoaXMuX3JlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6ITB9KSx0aGlzLl9yZW5kZXJlci5zZXRQaXhlbFJhdGlvKCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LAoxKSl9X2NsZWFyU2NlbmUoKXtmb3IoOzA8dGhpcy5fc2NlbmUuY2hpbGRyZW4ubGVuZ3RoOyl0aGlzLl9zY2VuZS5yZW1vdmUodGhpcy5fc2NlbmUuY2hpbGRyZW5bMF0pfWdldFJlbmRlcmVyKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyfWdldENhbWVyYUNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuX2NhbWVyYUNvbnRyb2xzfWlzUmVhZHkoKXtyZXR1cm4hIXRoaXMuX2NhbWVyYSYmISF0aGlzLl9jYW1lcmFDb250cm9sc31nZXRDYW1lcmFQb3NpdGlvbigpe3JldHVybntmYXI6dGhpcy5fY2FtZXJhLmZhcixwb3NpdGlvbjp0aGlzLl9jYW1lcmEucG9zaXRpb24uY2xvbmUoKSx0YXJnZXQ6dGhpcy5fY2FtZXJhQ29udHJvbHMudGFyZ2V0LmNsb25lKCl9fXNldENhbnZhc1NpemUoZil7dGhpcy5fY2FudmFzU2l6ZT1mfWRyYXcoKXt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4JiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KTt0aGlzLl9jYW1lcmEuYXNwZWN0PQp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0O3RoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCBmPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoaCk7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZik7dGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7ZigpfXVwZGF0ZVNjZW5lKGYsaCl7bGV0IGs9e307ImNvbmZpZyJpbiBmJiZmLmNvbmZpZyYmKGs9SlNPTi5wYXJzZShmLmNvbmZpZykpO3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSk7az10aGlzLl9hcHBseURlZmF1bHRzKGsse2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsCmZvdjo3NSxuZWFyOi4xLGZhcjoxRTN9LGxpZ2h0czpbe2NsczoiQW1iaWVudExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NX0se2NsczoiRGlyZWN0aW9uYWxMaWdodCIsY29sb3I6IiNmZmZmZmYiLGludGVuc2l0eTouNzUscG9zaXRpb246WzAsLTEsMl19XX0pO3RoaXMuX2NyZWF0ZVdvcmxkKGssaCk7dGhpcy5fY2xlYXJTY2VuZSgpO3RoaXMuX2NyZWF0ZUxpZ2h0cyh0aGlzLl9zY2VuZSxrKTt0aGlzLl9jcmVhdGVHZW9tZXRyeShmLGspO3RoaXMuZHJhdygpfXJlc2V0Vmlldygpe2lmKHRoaXMuaXNSZWFkeSgpKXt0aGlzLl9jYW1lcmFDb250cm9scy5yZXNldCgpO2lmKCFmJiZ0aGlzLl9sYXN0TWVzaCl2YXIgZj10aGlzLl9sYXN0TWVzaDtmJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChmKSx0aGlzLl9sYXN0TWVzaD1mKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX19X2NyZWF0ZUdlb21ldHJ5KGYsaCl7Zj1mLm1lc2g7Zi52ZXJ0aWNlcyYmZi5mYWNlcyYmCmYuZmFjZXMubGVuZ3RoP3RoaXMuX2NyZWF0ZU1lc2goZixoKTp0aGlzLl9jcmVhdGVQb2ludENsb3VkKGYsaCl9X2NyZWF0ZVBvaW50Q2xvdWQoZixoKXt2YXIgaz1mLnZlcnRpY2VzO2Y9Zi5jb2xvcnM7bGV0IHI9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtmJiZmLmxlbmd0aD09ay5sZW5ndGg/ci5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9VEhSRUUuVmVydGV4Q29sb3JzOnIubWF0ZXJpYWwuY29sb3I9dGhpcy5fcnVuQ29sb3I7aD10aGlzLl9hcHBseURlZmF1bHRzKGgscik7dmFyIGw9bmV3IFRIUkVFLkdlb21ldHJ5O2suZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgbT1uZXcgVEhSRUUuVmVjdG9yMyhwWzBdLHBbMV0scFsyXSk7bS54PTEqcFswXTttLnk9MSpwWzFdO20uej0xKnBbMl07bC52ZXJ0aWNlcy5wdXNoKG0pfSk7ZiYmZi5sZW5ndGg9PWsubGVuZ3RoJiZmLmZvckVhY2goZnVuY3Rpb24ocCl7cD1uZXcgVEhSRUUuQ29sb3IocFswXS8yNTUsCnBbMV0vMjU1LHBbMl0vMjU1KTtsLmNvbG9ycy5wdXNoKHApfSk7az1uZXcgVEhSRUVbaC5tYXRlcmlhbC5jbHNdKGgubWF0ZXJpYWwpO2s9bmV3IFRIUkVFLlBvaW50cyhsLGspO3RoaXMuX3NjZW5lLmFkZChrKTt0aGlzLl9sYXN0TWVzaD1rfXNldENhbWVyYVZpZXdwb2ludChmLGgsayl7dGhpcy5fc2lsZW50PSEwO3RoaXMuX2NhbWVyYS5mYXI9aDt0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KGYueCxmLnksZi56KTt0aGlzLl9jYW1lcmEubG9va0F0KGsuY2xvbmUoKSk7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9ay5jbG9uZSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpO3RoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZShmKXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OmZ9KX1fZml0T2JqZWN0VG9WaWV3cG9ydChmKXt2YXIgaD0KbmV3IFRIUkVFLkJveDM7aC5zZXRGcm9tT2JqZWN0KGYpO2Y9aC5jZW50ZXIoKTt2YXIgaz1oLnNpemUoKTtrPTEuMjUqTWF0aC5hYnMoTWF0aC5tYXgoay54LGsueSxrLnopLygyKk1hdGgudGFuKE1hdGguUEkvMTgwKnRoaXMuX2NhbWVyYS5mb3YvMikpKTtoPWgubWluLno7dGhpcy5zZXRDYW1lcmFWaWV3cG9pbnQoe3g6Zi54LHk6Zi55LHo6a30sMyooMD5oPy1oK2s6ay1oKSxmKX1fY3JlYXRlTWVzaChmLGgpe3ZhciBrPWYudmVydGljZXM7Y29uc3Qgcj1mLmZhY2VzLGw9Zi5jb2xvcnM7Zj10aGlzLl9hcHBseURlZmF1bHRzKGgse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSk7bGV0IHA9bmV3IFRIUkVFLkdlb21ldHJ5O2suZm9yRWFjaChmdW5jdGlvbihtKXtsZXQgbj1uZXcgVEhSRUUuVmVjdG9yMyhtWzBdLG1bMV0sbVsyXSk7bi54PTEqbVswXTtuLnk9MSptWzFdO24uej0xKm1bMl07CnAudmVydGljZXMucHVzaChuKX0pO3IuZm9yRWFjaChmdW5jdGlvbihtKXtsZXQgbj1uZXcgVEhSRUUuRmFjZTMobVswXSxtWzFdLG1bMl0pO2lmKGwmJmwubGVuZ3RoKXttPVtsW21bMF1dLGxbbVsxXV0sbFttWzJdXV07Zm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1Kyspe3ZhciBxPW1bdV07cT1uZXcgVEhSRUUuQ29sb3IocVswXS8yNTUscVsxXS8yNTUscVsyXS8yNTUpO24udmVydGV4Q29sb3JzLnB1c2gocSl9fXAuZmFjZXMucHVzaChuKX0pO2wmJmwubGVuZ3RoJiYoZi5tYXRlcmlhbD1mLm1hdGVyaWFsfHx7fSxmLm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnMpO3AuY2VudGVyKCk7cC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7az1uZXcgVEhSRUVbZi5tYXRlcmlhbC5jbHNdKGYubWF0ZXJpYWwpO2s9bmV3IFRIUkVFLk1lc2gocCxrKTtrLmNhc3RTaGFkb3c9ITA7ay5yZWNlaXZlU2hhZG93PSEwO3RoaXMuX3NjZW5lLmFkZChrKTsKdGhpcy5fbGFzdE1lc2g9a31fY3JlYXRlTGlnaHRzKGYsaCl7Zm9yKGxldCBrPTA7azxoLmxpZ2h0cy5sZW5ndGg7aysrKXtjb25zdCByPWgubGlnaHRzW2tdO2xldCBsPW5ldyBUSFJFRVtyLmNsc10oci5jb2xvcixyLmludGVuc2l0eSk7ci5wb3NpdGlvbiYmbC5wb3NpdGlvbi5zZXQoci5wb3NpdGlvblswXSxyLnBvc2l0aW9uWzFdLHIucG9zaXRpb25bMl0pO2YuYWRkKGwpfX19Yi5NZXNoVmlld2VyPWR9KShmbHx8KGZsPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvbWVzc2FnZS5qcwpKaD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYixkLGYsaCl7cmV0dXJuIG5ldyAoZnx8KGY9UHJvbWlzZSkpKGZ1bmN0aW9uKGsscil7ZnVuY3Rpb24gbChuKXt0cnl7bShoLm5leHQobikpfWNhdGNoKHEpe3IocSl9fWZ1bmN0aW9uIHAobil7dHJ5e20oaFsidGhyb3ciXShuKSl9Y2F0Y2gocSl7cihxKX19ZnVuY3Rpb24gbShuKXtuLmRvbmU/ayhuLnZhbHVlKToobmV3IGYoZnVuY3Rpb24ocSl7cShuLnZhbHVlKX0pKS50aGVuKGwscCl9bSgoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9O3ZhciBnbDsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLnBvcnQ9azt0aGlzLmlkPTA7dGhpcy5yZXNwb25zZVdhaXRzPW5ldyBNYXA7dGhpcy5saXN0ZW5lcnM9bmV3IE1hcDt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscj0+dGhpcy5vbk1lc3NhZ2UocikpfWxpc3RlbihrLHIpe3RoaXMubGlzdGVuZXJzLnNldChrLHIpfXVubGlzdGVuKGspe3RoaXMubGlzdGVuZXJzLmRlbGV0ZShrKX1vbk1lc3NhZ2Uoayl7cmV0dXJuIEpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt2YXIgcj1KU09OLnBhcnNlKGsuZGF0YSk7Y29uc3QgbD1yLnR5cGUscD1yLmlkLG09ci5wYXlsb2FkO3ZhciBuPXIuZXJyb3I7aWYoci5pc1JlcGx5KXtpZih0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKHApKXt2YXIge3Jlc29sdmU6cSxyZWplY3Q6dX09dGhpcy5yZXNwb25zZVdhaXRzLmdldChwKTt0aGlzLnJlc3BvbnNlV2FpdHMuZGVsZXRlKHApOwpuP3UoRXJyb3IobikpOnEobSl9fWVsc2V7bj1yPW51bGw7aWYodGhpcy5saXN0ZW5lcnMuaGFzKGwpKXtjb25zdCB3PXRoaXMubGlzdGVuZXJzLmdldChsKTt0cnl7cj15aWVsZCB3KG0pfWNhdGNoKEEpe249QX19dGhpcy5wb3N0TWVzc2FnZSh7WyJ0eXBlIl06bCxbImlkIl06cCxbInBheWxvYWQiXTpyLFsiZXJyb3IiXTpuLFsiaXNSZXBseSJdOiEwfSl9fSl9cG9zdE1lc3NhZ2Uoayl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGspKX1zZW5kTWVzc2FnZShrKXtjb25zdCByPXRoaXMuaWQrKzt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLGlkOnIscGF5bG9hZDprLGVycm9yOm51bGwsaXNSZXBseTohMX0pO3JldHVybiBuZXcgUHJvbWlzZSgobCxwKT0+e3RoaXMucmVzcG9uc2VXYWl0cy5zZXQocix7cmVzb2x2ZTpsLHJlamVjdDpwfSl9KX19Zi5JUEM9aH0pKGQuRE9fTk9UX1VTRV9JTlRFUk5BTHx8KGQuRE9fTk9UX1VTRV9JTlRFUk5BTD0Ke30pKX0pKGIubGlifHwoYi5saWI9e30pKX0pKGdsfHwoZ2w9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9wbHVnaW4taG9zdC1pcGMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKG0sbil7Y29uc3QgcT1uZXcgYi5saWIuRE9fTk9UX1VTRV9JTlRFUk5BTC5JUEMobSk7ci5hZGQocSk7cC5zZXQocSxuKTttLnN0YXJ0KCk7Zm9yKGNvbnN0IFt1LHddb2YgbCltPWgodyxxKSxxLmxpc3Rlbih1LG0pfWZ1bmN0aW9uIGgobSxuKXtyZXR1cm4gcT0+e3ZhciB1PXAuZ2V0KG4pO3U9ay5nZXQodSl8fG51bGw7cmV0dXJuIG0odSxxKX19ZC5yZWdpc3RlclBsdWdpbklmcmFtZT1mdW5jdGlvbihtLG4pe2suc2V0KG0se3BsdWdpbk5hbWU6bn0pfTtjb25zdCBrPW5ldyBXZWFrTWFwLHI9bmV3IFNldCxsPW5ldyBNYXAscD1uZXcgTWFwO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixtPT57aWYoImV4cGVyaW1lbnRhbC5ib290c3RyYXAiPT09bS5kYXRhKXt2YXIgbj1tLnBvcnRzWzBdO24mJihtPW0uc291cmNlP20uc291cmNlLmZyYW1lRWxlbWVudDpudWxsKSYmZihuLG0pfX0pO2QuYnJvYWRjYXN0PQpmdW5jdGlvbigpe3ZhciBtPWRjLnJ1bnNTdG9yZS5nZXRSdW5zKCk7Zm9yKHZhciBuIG9mIHIpcC5nZXQobikuaXNDb25uZWN0ZWR8fChyLmRlbGV0ZShuKSxwLmRlbGV0ZShuKSk7bj1bLi4ucl0ubWFwKHE9PnEuc2VuZE1lc3NhZ2UobSkpO3JldHVybiBQcm9taXNlLmFsbChuKX07ZC5saXN0ZW49ZnVuY3Rpb24obSxuKXtsLnNldChtLG4pO2Zvcihjb25zdCBxIG9mIHIpe2NvbnN0IHU9aChuLHEpO3EubGlzdGVuKG0sdSl9fTtkLnVubGlzdGVuPWZ1bmN0aW9uKG0pe2wuZGVsZXRlKG0pO2Zvcihjb25zdCBuIG9mIHIpbi51bmxpc3RlbihtKX19KShiLmhvc3R8fChiLmhvc3Q9e30pKX0pKGdsfHwoZ2w9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9jb3JlLWhvc3QtaW1wbC5qcwpnbC5ob3N0Lmxpc3RlbigiZXhwZXJpbWVudGFsLkdldFVSTFBsdWdpbkRhdGEiLGI9PntpZihiKXtiPWBwLiR7Yi5wbHVnaW5OYW1lfS5gO3ZhciBkPXt9O2ZvcihsZXQgZiBpbiBiZC51cmxEaWN0KWYuc3RhcnRzV2l0aChiKSYmKGRbZi5zdWJzdHJpbmcoYi5sZW5ndGgpXT1iZC51cmxEaWN0W2ZdKTtyZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9ydW5zLWhvc3QtaW1wbC5qcwpnbC5ob3N0Lmxpc3RlbigiZXhwZXJpbWVudGFsLkdldFJ1bnMiLCgpPT5kYy5ydW5zU3RvcmUuZ2V0UnVucygpKTtkYy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9PmdsLmhvc3QuYnJvYWRjYXN0KCkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3BsdWdpbi1ob3N0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWV4cGVyaW1lbnRhbC1wbHVnaW4taG9zdC1saWIiLF90ZW1wbGF0ZTpudWxsLHJlZ2lzdGVyUGx1Z2luSWZyYW1lOmdsLmhvc3QucmVnaXN0ZXJQbHVnaW5JZnJhbWV9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yaXBwbGUvcGFwZXItcmlwcGxlLmh0bWwuanMKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihoKXt0aGlzLmVsZW1lbnQ9aDt0aGlzLndpZHRoPXRoaXMuYm91bmRpbmdSZWN0LndpZHRoO3RoaXMuaGVpZ2h0PXRoaXMuYm91bmRpbmdSZWN0LmhlaWdodDt0aGlzLnNpemU9TWF0aC5tYXgodGhpcy53aWR0aCx0aGlzLmhlaWdodCl9ZnVuY3Rpb24gZChoKXt0aGlzLmVsZW1lbnQ9aDt0aGlzLmNvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGgpLmNvbG9yO3RoaXMud2F2ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmVDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmNvbG9yO3RoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCJ3YXZlIik7dGhpcy53YXZlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndhdmUtY29udGFpbmVyIik7UG9seW1lci5kb20odGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCl9CnZhciBmPXtkaXN0YW5jZTpmdW5jdGlvbihoLGsscixsKXtoLT1yO2stPWw7cmV0dXJuIE1hdGguc3FydChoKmgrayprKX0sbm93OndpbmRvdy5wZXJmb3JtYW5jZSYmd2luZG93LnBlcmZvcm1hbmNlLm5vdz93aW5kb3cucGVyZm9ybWFuY2Uubm93LmJpbmQod2luZG93LnBlcmZvcm1hbmNlKTpEYXRlLm5vd307Yi5wcm90b3R5cGU9e2dldCBib3VuZGluZ1JlY3QoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxmdXJ0aGVzdENvcm5lckRpc3RhbmNlRnJvbTpmdW5jdGlvbihoLGspe3ZhciByPWYuZGlzdGFuY2UoaCxrLDAsMCksbD1mLmRpc3RhbmNlKGgsayx0aGlzLndpZHRoLDApLHA9Zi5kaXN0YW5jZShoLGssMCx0aGlzLmhlaWdodCk7aD1mLmRpc3RhbmNlKGgsayx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtyZXR1cm4gTWF0aC5tYXgocixsLHAsaCl9fTtkLk1BWF9SQURJVVM9MzAwO2QucHJvdG90eXBlPXtnZXQgcmVjZW50ZXJzKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5yZWNlbnRlcnN9LApnZXQgY2VudGVyKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jZW50ZXJ9LGdldCBtb3VzZURvd25FbGFwc2VkKCl7aWYoIXRoaXMubW91c2VEb3duU3RhcnQpcmV0dXJuIDA7dmFyIGg9Zi5ub3coKS10aGlzLm1vdXNlRG93blN0YXJ0O3RoaXMubW91c2VVcFN0YXJ0JiYoaC09dGhpcy5tb3VzZVVwRWxhcHNlZCk7cmV0dXJuIGh9LGdldCBtb3VzZVVwRWxhcHNlZCgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9mLm5vdygpLXRoaXMubW91c2VVcFN0YXJ0OjB9LGdldCBtb3VzZURvd25FbGFwc2VkU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWQvMUUzfSxnZXQgbW91c2VVcEVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VVcEVsYXBzZWQvMUUzfSxnZXQgbW91c2VJbnRlcmFjdGlvblNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkU2Vjb25kcyt0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kc30sZ2V0IGluaXRpYWxPcGFjaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5pbml0aWFsT3BhY2l0eX0sCmdldCBvcGFjaXR5RGVjYXlWZWxvY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQub3BhY2l0eURlY2F5VmVsb2NpdHl9LGdldCByYWRpdXMoKXt2YXIgaD0xLjEqTWF0aC5taW4oTWF0aC5zcXJ0KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgrdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCp0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KSxkLk1BWF9SQURJVVMpKzU7cmV0dXJuIE1hdGguYWJzKGgqKDEtTWF0aC5wb3coODAsLSh0aGlzLm1vdXNlSW50ZXJhY3Rpb25TZWNvbmRzLygxLjEtaC9kLk1BWF9SQURJVVMqLjIpKSkpKX0sZ2V0IG9wYWNpdHkoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/TWF0aC5tYXgoMCx0aGlzLmluaXRpYWxPcGFjaXR5LXRoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzKnRoaXMub3BhY2l0eURlY2F5VmVsb2NpdHkpOnRoaXMuaW5pdGlhbE9wYWNpdHl9LGdldCBvdXRlck9wYWNpdHkoKXtyZXR1cm4gTWF0aC5tYXgoMCwKTWF0aC5taW4oLjMqdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMsdGhpcy5vcGFjaXR5KSl9LGdldCBpc09wYWNpdHlGdWxseURlY2F5ZWQoKXtyZXR1cm4uMDE+dGhpcy5vcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzUmVzdGluZ0F0TWF4UmFkaXVzKCl7cmV0dXJuIHRoaXMub3BhY2l0eT49dGhpcy5pbml0aWFsT3BhY2l0eSYmdGhpcy5yYWRpdXM+PU1hdGgubWluKHRoaXMubWF4UmFkaXVzLGQuTUFYX1JBRElVUyl9LGdldCBpc0FuaW1hdGlvbkNvbXBsZXRlKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P3RoaXMuaXNPcGFjaXR5RnVsbHlEZWNheWVkOnRoaXMuaXNSZXN0aW5nQXRNYXhSYWRpdXN9LGdldCB0cmFuc2xhdGlvbkZyYWN0aW9uKCl7cmV0dXJuIE1hdGgubWluKDEsdGhpcy5yYWRpdXMvdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUqMi9NYXRoLnNxcnQoMikpfSxnZXQgeE5vdygpe3JldHVybiB0aGlzLnhFbmQ/CnRoaXMueFN0YXJ0K3RoaXMudHJhbnNsYXRpb25GcmFjdGlvbioodGhpcy54RW5kLXRoaXMueFN0YXJ0KTp0aGlzLnhTdGFydH0sZ2V0IHlOb3coKXtyZXR1cm4gdGhpcy55RW5kP3RoaXMueVN0YXJ0K3RoaXMudHJhbnNsYXRpb25GcmFjdGlvbioodGhpcy55RW5kLXRoaXMueVN0YXJ0KTp0aGlzLnlTdGFydH0sZ2V0IGlzTW91c2VEb3duKCl7cmV0dXJuIHRoaXMubW91c2VEb3duU3RhcnQmJiF0aGlzLm1vdXNlVXBTdGFydH0scmVzZXRJbnRlcmFjdGlvblN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZURpc3RhbmNlPXRoaXMueUVuZD10aGlzLnhFbmQ9dGhpcy55U3RhcnQ9dGhpcy54U3RhcnQ9dGhpcy5tb3VzZVVwU3RhcnQ9dGhpcy5tb3VzZURvd25TdGFydD10aGlzLm1heFJhZGl1cz0wO3RoaXMuY29udGFpbmVyTWV0cmljcz1uZXcgYih0aGlzLmVsZW1lbnQpfSxkcmF3OmZ1bmN0aW9uKCl7dGhpcy53YXZlLnN0eWxlLm9wYWNpdHk9dGhpcy5vcGFjaXR5O3ZhciBoPXRoaXMucmFkaXVzLwoodGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUvMik7dmFyIGs9dGhpcy54Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yO3ZhciByPXRoaXMueU5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LzI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIraysicHgsICIrcisicHgpIjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgiK2srInB4LCAiK3IrInB4LCAwKSI7dGhpcy53YXZlLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ic2NhbGUoIitoKyIsIitoKyIpIjt0aGlzLndhdmUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZTNkKCIraCsiLCIraCsiLDEpIn0sZG93bkFjdGlvbjpmdW5jdGlvbihoKXt2YXIgaz10aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMixyPXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLnJlc2V0SW50ZXJhY3Rpb25TdGF0ZSgpO3RoaXMubW91c2VEb3duU3RhcnQ9CmYubm93KCk7dGhpcy5jZW50ZXI/KHRoaXMueFN0YXJ0PWssdGhpcy55U3RhcnQ9cix0aGlzLnNsaWRlRGlzdGFuY2U9Zi5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk6KHRoaXMueFN0YXJ0PWg/aC5kZXRhaWwueC10aGlzLmNvbnRhaW5lck1ldHJpY3MuYm91bmRpbmdSZWN0LmxlZnQ6dGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzIsdGhpcy55U3RhcnQ9aD9oLmRldGFpbC55LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QudG9wOnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMik7dGhpcy5yZWNlbnRlcnMmJih0aGlzLnhFbmQ9ayx0aGlzLnlFbmQ9cix0aGlzLnNsaWRlRGlzdGFuY2U9Zi5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk7dGhpcy5tYXhSYWRpdXM9dGhpcy5jb250YWluZXJNZXRyaWNzLmZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tKHRoaXMueFN0YXJ0LAp0aGlzLnlTdGFydCk7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRvcD0odGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0PSh0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgtdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUpLzIrInB4Ijt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2lkdGg9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4Ijt0aGlzLndhdmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKyJweCJ9LHVwQWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc01vdXNlRG93biYmKHRoaXMubW91c2VVcFN0YXJ0PWYubm93KCkpfSxyZW1vdmU6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcy53YXZlQ29udGFpbmVyKX19O1BvbHltZXIoe2lzOiJwYXBlci1yaXBwbGUiLApiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3JdLHByb3BlcnRpZXM6e2luaXRpYWxPcGFjaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouMjV9LG9wYWNpdHlEZWNheVZlbG9jaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouOH0scmVjZW50ZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNlbnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyaXBwbGVzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxhbmltYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGhvbGREb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob2xkRG93bkNoYW5nZWQifSxub2luazp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYW5pbWF0aW5nOnt0eXBlOkJvb2xlYW59LF9ib3VuZEFuaW1hdGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmltYXRlLmJpbmQodGhpcyl9fX0sCmdldCB0YXJnZXQoKXtyZXR1cm4gdGhpcy5rZXlFdmVudFRhcmdldH0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX29uRW50ZXJLZXlkb3duIiwic3BhY2U6a2V5ZG93biI6Il9vblNwYWNlS2V5ZG93biIsInNwYWNlOmtleXVwIjoiX29uU3BhY2VLZXl1cCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5rZXlFdmVudFRhcmdldD0xMT09dGhpcy5wYXJlbnROb2RlLm5vZGVUeXBlP1BvbHltZXIuZG9tKHRoaXMpLmdldE93bmVyUm9vdCgpLmhvc3Q6dGhpcy5wYXJlbnROb2RlO3RoaXMubGlzdGVuKGgsInVwIiwidWlVcEFjdGlvbiIpO3RoaXMubGlzdGVuKGgsImRvd24iLCJ1aURvd25BY3Rpb24iKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsInVwIiwidWlVcEFjdGlvbiIpO3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwiZG93biIsInVpRG93bkFjdGlvbiIpO3RoaXMua2V5RXZlbnRUYXJnZXQ9Cm51bGx9LGdldCBzaG91bGRLZWVwQW5pbWF0aW5nKCl7Zm9yKHZhciBoPTA7aDx0aGlzLnJpcHBsZXMubGVuZ3RoOysraClpZighdGhpcy5yaXBwbGVzW2hdLmlzQW5pbWF0aW9uQ29tcGxldGUpcmV0dXJuITA7cmV0dXJuITF9LHNpbXVsYXRlZFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZG93bkFjdGlvbihudWxsKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy51cEFjdGlvbigpfSwxKX0sdWlEb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMubm9pbmt8fHRoaXMuZG93bkFjdGlvbihoKX0sZG93bkFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3duJiYwPHRoaXMucmlwcGxlcy5sZW5ndGh8fCh0aGlzLmFkZFJpcHBsZSgpLmRvd25BY3Rpb24oaCksdGhpcy5fYW5pbWF0aW5nfHwodGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKSl9LHVpVXBBY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy51cEFjdGlvbihoKX0sdXBBY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ob2xkRG93bnx8Cih0aGlzLnJpcHBsZXMuZm9yRWFjaChmdW5jdGlvbihrKXtrLnVwQWN0aW9uKGgpfSksdGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKX0sb25BbmltYXRpb25Db21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZz0hMTt0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bnVsbDt0aGlzLmZpcmUoInRyYW5zaXRpb25lbmQiKX0sYWRkUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIGg9bmV3IGQodGhpcyk7UG9seW1lci5kb20odGhpcy4kLndhdmVzKS5hcHBlbmRDaGlsZChoLndhdmVDb250YWluZXIpO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1oLmNvbG9yO3RoaXMucmlwcGxlcy5wdXNoKGgpO3RoaXMuX3NldEFuaW1hdGluZyghMCk7cmV0dXJuIGh9LHJlbW92ZVJpcHBsZTpmdW5jdGlvbihoKXt2YXIgaz10aGlzLnJpcHBsZXMuaW5kZXhPZihoKTswPmt8fCh0aGlzLnJpcHBsZXMuc3BsaWNlKGssMSksaC5yZW1vdmUoKSwKdGhpcy5yaXBwbGVzLmxlbmd0aHx8dGhpcy5fc2V0QW5pbWF0aW5nKCExKSl9LGFuaW1hdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9hbmltYXRpbmcpe3ZhciBoO2ZvcihoPTA7aDx0aGlzLnJpcHBsZXMubGVuZ3RoOysraCl7dmFyIGs9dGhpcy5yaXBwbGVzW2hdO2suZHJhdygpO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLm9wYWNpdHk9ay5vdXRlck9wYWNpdHk7ay5pc09wYWNpdHlGdWxseURlY2F5ZWQmJiFrLmlzUmVzdGluZ0F0TWF4UmFkaXVzJiZ0aGlzLnJlbW92ZVJpcHBsZShrKX1pZih0aGlzLnNob3VsZEtlZXBBbmltYXRpbmd8fDAhPT10aGlzLnJpcHBsZXMubGVuZ3RoKXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fYm91bmRBbmltYXRlKTtlbHNlIHRoaXMub25BbmltYXRpb25Db21wbGV0ZSgpfX0sX29uRW50ZXJLZXlkb3duOmZ1bmN0aW9uKCl7dGhpcy51aURvd25BY3Rpb24oKTt0aGlzLmFzeW5jKHRoaXMudWlVcEFjdGlvbiwxKX0sX29uU3BhY2VLZXlkb3duOmZ1bmN0aW9uKCl7dGhpcy51aURvd25BY3Rpb24oKX0sCl9vblNwYWNlS2V5dXA6ZnVuY3Rpb24oKXt0aGlzLnVpVXBBY3Rpb24oKX0sX2hvbGREb3duQ2hhbmdlZDpmdW5jdGlvbihoLGspe3ZvaWQgMCE9PWsmJihoP3RoaXMuZG93bkFjdGlvbigpOnRoaXMudXBBY3Rpb24oKSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJ1dHRvbi9wYXBlci1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvcl0scHJvcGVydGllczp7cmFpc2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExLG9ic2VydmVyOiJfY2FsY3VsYXRlRWxldmF0aW9uIn19LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt0aGlzLnJhaXNlZD9Qb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsLl9jYWxjdWxhdGVFbGV2YXRpb24uYXBwbHkodGhpcyk6dGhpcy5fc2V0RWxldmF0aW9uKDApfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWNoZWNrYm94L3BhcGVyLWNoZWNrYm94Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWNoZWNrYm94IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToiY2hlY2tib3giLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSIpLnRyaW0oKSxkPSJweCIsZj1iLm1hdGNoKC9bQS1aYS16XSskLyk7bnVsbCE9PWYmJihkPWZbMF0pO2I9cGFyc2VGbG9hdChiKTsKZj04LzMqYjsicHgiPT09ZCYmKGY9TWF0aC5mbG9vcihmKSxmJTIhPT1iJTImJmYrKyk7dGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWluay1zaXplIjpmK2R9KX19KX0sX2NvbXB1dGVDaGVja2JveENsYXNzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9IiI7YiYmKGYrPSJjaGVja2VkICIpO2QmJihmKz0iaW52YWxpZCIpO3JldHVybiBmfSxfY29tcHV0ZUNoZWNrbWFya0NsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiPyIiOiJoaWRkZW4ifSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5jaGVja2JveENvbnRhaW5lcjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1pY29uL2lyb24taWNvbi5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb24iLHByb3BlcnRpZXM6e2ljb246e3R5cGU6U3RyaW5nfSx0aGVtZTp7dHlwZTpTdHJpbmd9LHNyYzp7dHlwZTpTdHJpbmd9LF9tZXRhOnt2YWx1ZTpQb2x5bWVyLkJhc2UuY3JlYXRlKCJpcm9uLW1ldGEiLHt0eXBlOiJpY29uc2V0In0pfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUljb24oX21ldGEsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZUljb24odGhlbWUsIGlzQXR0YWNoZWQpIiwiX3NyY0NoYW5nZWQoc3JjLCBpc0F0dGFjaGVkKSIsIl9pY29uQ2hhbmdlZChpY29uLCBpc0F0dGFjaGVkKSJdLF9ERUZBVUxUX0lDT05TRVQ6Imljb25zIixfaWNvbkNoYW5nZWQ6ZnVuY3Rpb24oYil7Yj0oYnx8IiIpLnNwbGl0KCI6Iik7dGhpcy5faWNvbk5hbWU9Yi5wb3AoKTt0aGlzLl9pY29uc2V0TmFtZT1iLnBvcCgpfHx0aGlzLl9ERUZBVUxUX0lDT05TRVQ7dGhpcy5fdXBkYXRlSWNvbigpfSxfc3JjQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUljb24oKX0sCl91c2VzSWNvbnNldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmljb258fCF0aGlzLnNyY30sX3VwZGF0ZUljb246ZnVuY3Rpb24oKXt0aGlzLl91c2VzSWNvbnNldCgpPyh0aGlzLl9pbWcmJnRoaXMuX2ltZy5wYXJlbnROb2RlJiZQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX2ltZyksIiI9PT10aGlzLl9pY29uTmFtZT90aGlzLl9pY29uc2V0JiZ0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyk6dGhpcy5faWNvbnNldE5hbWUmJnRoaXMuX21ldGEmJigodGhpcy5faWNvbnNldD10aGlzLl9tZXRhLmJ5S2V5KHRoaXMuX2ljb25zZXROYW1lKSk/KHRoaXMuX2ljb25zZXQuYXBwbHlJY29uKHRoaXMsdGhpcy5faWNvbk5hbWUsdGhpcy50aGVtZSksdGhpcy51bmxpc3Rlbih3aW5kb3csImlyb24taWNvbnNldC1hZGRlZCIsIl91cGRhdGVJY29uIikpOnRoaXMubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSkpOih0aGlzLl9pY29uc2V0JiYKdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpLHRoaXMuX2ltZ3x8KHRoaXMuX2ltZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSx0aGlzLl9pbWcuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuX2ltZy5kcmFnZ2FibGU9ITEpLHRoaXMuX2ltZy5zcmM9dGhpcy5zcmMsUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZCh0aGlzLl9pbWcpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWExMXktYW5ub3VuY2VyL2lyb24tYTExeS1hbm5vdW5jZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyPVBvbHltZXIoe2lzOiJpcm9uLWExMXktYW5ub3VuY2VyIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToicG9saXRlIn0sX3RleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sY3JlYXRlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2V8fChQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPXRoaXMpO2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1hbm5vdW5jZSIsdGhpcy5fb25Jcm9uQW5ub3VuY2UuYmluZCh0aGlzKSl9LGFubm91bmNlOmZ1bmN0aW9uKGIpe3RoaXMuX3RleHQ9IiI7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX3RleHQ9Yn0sMTAwKX0sX29uSXJvbkFubm91bmNlOmZ1bmN0aW9uKGIpe2IuZGV0YWlsJiZiLmRldGFpbC50ZXh0JiZ0aGlzLmFubm91bmNlKGIuZGV0YWlsLnRleHQpfX0pOwpQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPW51bGw7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5PWZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1hMTF5LWFubm91bmNlciIpKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2UpfX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1pbnB1dC9pcm9uLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YmluZFZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVZhbHVlKGJpbmRWYWx1ZSkifSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRFbGVtZW50Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2JpbmRWYWx1ZUNoYW5nZWQoYmluZFZhbHVlLCBfaW5wdXRFbGVtZW50KSJdLGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0IixrZXlwcmVzczoiX29uS2V5cHJlc3MifSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCk7dGhpcy5fcHJldmlvdXNWYWxpZElucHV0PSIiO3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj0KUG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGZ1bmN0aW9uKCl7dGhpcy5faW5pdFNsb3R0ZWRJbnB1dCgpfS5iaW5kKHRoaXMpKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmKFBvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKSx0aGlzLl9vYnNlcnZlcj1udWxsKX0sZ2V0IGlucHV0RWxlbWVudCgpe3JldHVybiB0aGlzLl9pbnB1dEVsZW1lbnR9LF9pbml0U2xvdHRlZElucHV0OmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRFbGVtZW50PXRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKVswXTt0aGlzLmlucHV0RWxlbWVudCYmdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUmJih0aGlzLmJpbmRWYWx1ZT10aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7dGhpcy5maXJlKCJpcm9uLWlucHV0LXJlYWR5Iil9LGdldCBfcGF0dGVyblJlZ0V4cCgpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm4pdmFyIGI9bmV3IFJlZ0V4cCh0aGlzLmFsbG93ZWRQYXR0ZXJuKTsKZWxzZSBzd2l0Y2godGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7Y2FzZSAibnVtYmVyIjpiPS9bMC05LixlLV0vfXJldHVybiBifSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJih2b2lkIDA9PT1iP2QudmFsdWU9bnVsbDpiIT09ZC52YWx1ZSYmKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlPWIpLHRoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTpifSkpfSxfb25JbnB1dDpmdW5jdGlvbigpeyF0aGlzLmFsbG93ZWRQYXR0ZXJufHx0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWR8fHRoaXMuX2NoZWNrUGF0dGVyblZhbGlkaXR5KCl8fCh0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgc3RyaW5nIG9mIGNoYXJhY3RlcnMgbm90IGVudGVyZWQuIiksdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0KTt0aGlzLmJpbmRWYWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9CnRoaXMuaW5wdXRFbGVtZW50LnZhbHVlO3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sX2lzUHJpbnRhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPTE5PT1iLmtleUNvZGV8fDIwPT1iLmtleUNvZGV8fDQ1PT1iLmtleUNvZGV8fDQ2PT1iLmtleUNvZGV8fDE0ND09Yi5rZXlDb2RlfHwxNDU9PWIua2V5Q29kZXx8MzI8Yi5rZXlDb2RlJiY0MT5iLmtleUNvZGV8fDExMTxiLmtleUNvZGUmJjEyND5iLmtleUNvZGU7cmV0dXJuISg4PT1iLmtleUNvZGV8fDk9PWIua2V5Q29kZXx8MTM9PWIua2V5Q29kZXx8Mjc9PWIua2V5Q29kZSkmJiEoMD09Yi5jaGFyQ29kZSYmZCl9LF9vbktleXByZXNzOmZ1bmN0aW9uKGIpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm58fCJudW1iZXIiPT09dGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7dmFyIGQ9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZihkJiYhKGIubWV0YUtleXx8Yi5jdHJsS2V5fHxiLmFsdEtleSkpe3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0KITA7dmFyIGY9U3RyaW5nLmZyb21DaGFyQ29kZShiLmNoYXJDb2RlKTt0aGlzLl9pc1ByaW50YWJsZShiKSYmIWQudGVzdChmKSYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgY2hhcmFjdGVyICIrZisiIG5vdCBlbnRlcmVkLiIpKX19fSxfY2hlY2tQYXR0ZXJuVmFsaWRpdHk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKCFiKXJldHVybiEwO2Zvcih2YXIgZD0wO2Q8dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoO2QrKylpZighYi50ZXN0KHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5pbnB1dEVsZW1lbnQpcmV0dXJuIHRoaXMuaW52YWxpZD0hMSwhMDt2YXIgYj10aGlzLmlucHV0RWxlbWVudC5jaGVja1ZhbGlkaXR5KCk7YiYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy5iaW5kVmFsdWU/Yj0hMToKdGhpcy5oYXNWYWxpZGF0b3IoKSYmKGI9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy5iaW5kVmFsdWUpKSk7dGhpcy5pbnZhbGlkPSFiO3RoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpO3JldHVybiBifSxfYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6Yn0pfSxfY29tcHV0ZVZhbHVlOmZ1bmN0aW9uKGIpe3JldHVybiBifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWNoYXItY291bnRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7X2NoYXJDb3VudGVyU3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiMCJ9fSx1cGRhdGU6ZnVuY3Rpb24oYil7aWYoYi5pbnB1dEVsZW1lbnQpe2IudmFsdWU9Yi52YWx1ZXx8IiI7dmFyIGQ9Yi52YWx1ZS50b1N0cmluZygpLmxlbmd0aC50b1N0cmluZygpO2IuaW5wdXRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibWF4bGVuZ3RoIikmJihkKz0iLyIrYi5pbnB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKSk7dGhpcy5fY2hhckNvdW50ZXJTdHI9ZH19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY29udGFpbmVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNvbnRhaW5lciIscHJvcGVydGllczp7bm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXR0ckZvclZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiYmluZC12YWx1ZSJ9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOntvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZvY3VzZWQ6e3JlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9hZGRvbnM6e3R5cGU6QXJyYXl9LF9pbnB1dEhhc0NvbnRlbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0U2VsZWN0b3I6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbnB1dCxpcm9uLWlucHV0LHRleHRhcmVhLC5wYXBlci1pbnB1dC1pbnB1dCJ9LF9ib3VuZE9uRm9jdXM6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpfX0sCl9ib3VuZE9uQmx1cjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkJsdXIuYmluZCh0aGlzKX19LF9ib3VuZE9uSW5wdXQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25JbnB1dC5iaW5kKHRoaXMpfX0sX2JvdW5kVmFsdWVDaGFuZ2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uVmFsdWVDaGFuZ2VkLmJpbmQodGhpcyl9fX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIiwiaXJvbi1pbnB1dC12YWxpZGF0ZSI6Il9vbklyb25JbnB1dFZhbGlkYXRlIn0sZ2V0IF92YWx1ZUNoYW5nZWRFdmVudCgpe3JldHVybiB0aGlzLmF0dHJGb3JWYWx1ZSsiLWNoYW5nZWQifSxnZXQgX3Byb3BlcnR5Rm9yVmFsdWUoKXtyZXR1cm4gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZSh0aGlzLmF0dHJGb3JWYWx1ZSl9LGdldCBfaW5wdXRFbGVtZW50KCl7cmV0dXJuIFBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IodGhpcy5faW5wdXRTZWxlY3Rvcil9LApnZXQgX2lucHV0RWxlbWVudFZhbHVlKCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudFt0aGlzLl9wcm9wZXJ0eUZvclZhbHVlXXx8dGhpcy5faW5wdXRFbGVtZW50LnZhbHVlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITA7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9ib3VuZE9uRm9jdXMsITApO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fYm91bmRPbkJsdXIsITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXR0ckZvclZhbHVlP3RoaXMuX2lucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3ZhbHVlQ2hhbmdlZEV2ZW50LHRoaXMuX2JvdW5kVmFsdWVDaGFuZ2VkKTp0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iix0aGlzLl9vbklucHV0KTt0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSYmIiIhPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlPwp0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpOnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCl9LF9vbkFkZG9uQXR0YWNoZWQ6ZnVuY3Rpb24oYil7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTtiPWIudGFyZ2V0Oy0xPT09dGhpcy5fYWRkb25zLmluZGV4T2YoYikmJih0aGlzLl9hZGRvbnMucHVzaChiKSx0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCkpfSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3NldEZvY3VzZWQoITApfSxfb25CbHVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMSk7dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O2lmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGUmJih0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlPSExLHZvaWQgMD09PWQudmFsdWV8fCIiPT09ZC52YWx1ZSkpcmV0dXJuO3RoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKGIudGFyZ2V0KX0sX2hhbmRsZVZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlO2R8fDA9PT1kfHwibnVtYmVyIj09PWIudHlwZSYmIWIuY2hlY2tWYWxpZGl0eSgpP3RoaXMuX2lucHV0SGFzQ29udGVudD0hMDp0aGlzLl9pbnB1dEhhc0NvbnRlbnQ9ITE7dGhpcy51cGRhdGVBZGRvbnMoe2lucHV0RWxlbWVudDpiLHZhbHVlOmQsaW52YWxpZDp0aGlzLmludmFsaWR9KX0sX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuYXV0b1ZhbGlkYXRlJiZiJiYodGhpcy5pbnZhbGlkPSEoYi52YWxpZGF0ZT9iLnZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudFZhbHVlKTpiLmNoZWNrVmFsaWRpdHkoKSkpOwp0aGlzLl9oYW5kbGVWYWx1ZShiKX0sX29uSXJvbklucHV0VmFsaWRhdGU6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ9dGhpcy5faW5wdXRFbGVtZW50LmludmFsaWR9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2FkZG9ucyYmdGhpcy51cGRhdGVBZGRvbnMoe2ludmFsaWQ6dGhpcy5pbnZhbGlkfSl9LHVwZGF0ZUFkZG9uczpmdW5jdGlvbihiKXtmb3IodmFyIGQsZj0wO2Q9dGhpcy5fYWRkb25zW2ZdO2YrKylkLnVwZGF0ZShiKX0sX2NvbXB1dGVJbnB1dENvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQsZixoLGspe3ZhciByPSJpbnB1dC1jb250ZW50IjtiPyhrJiYocis9IiBsYWJlbC1pcy1oaWRkZW4iKSxoJiYocis9IiBpcy1pbnZhbGlkIikpOihiPXRoaXMucXVlcnlTZWxlY3RvcigibGFiZWwiKSxkfHxrPyhyKz0iIGxhYmVsLWlzLWZsb2F0aW5nIix0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0ic3RhdGljIixoP3IrPSIgaXMtaW52YWxpZCI6CmYmJihyKz0iIGxhYmVsLWlzLWhpZ2hsaWdodGVkIikpOihiJiYodGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaCYmKHIrPSIgaXMtaW52YWxpZCIpKSk7ZiYmKHIrPSIgZm9jdXNlZCIpO3JldHVybiByfSxfY29tcHV0ZVVuZGVybGluZUNsYXNzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9InVuZGVybGluZSI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9LF9jb21wdXRlQWRkT25Db250ZW50Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iYWRkLW9uLWNvbnRlbnQiO2Q/Zis9IiBpcy1pbnZhbGlkIjpiJiYoZis9IiBpcy1oaWdobGlnaHRlZCIpO3JldHVybiBmfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWVycm9yLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWVycm9yIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEFkZG9uQmVoYXZpb3JdLHByb3BlcnRpZXM6e2ludmFsaWQ6e3JlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW59fSx1cGRhdGU6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW52YWxpZChiLmludmFsaWQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOlN0cmluZ319LGJlZm9yZVJlZ2lzdGVyOmZ1bmN0aW9uKCl7dmFyIGI9ImZ1bmN0aW9uIj09dHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24taW5wdXQiKS5faW5pdFNsb3R0ZWRJbnB1dD8idjEiOiJ2MCIsZD1Qb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoInBhcGVyLWlucHV0IiwidGVtcGxhdGUiKTtiPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSMiK2IpOyhkPWQuY29udGVudC5xdWVyeVNlbGVjdG9yKCIjdGVtcGxhdGUtcGxhY2Vob2xkZXIiKSkmJmQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYi5jb250ZW50LGQpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5FbGVtZW50P3RoaXMuaW5wdXRFbGVtZW50Ll9pbnB1dEVsZW1lbnQ6CnRoaXMuaW5wdXRFbGVtZW50fSxsaXN0ZW5lcnM6eyJpcm9uLWlucHV0LXJlYWR5IjoiX29uSXJvbklucHV0UmVhZHkifSxfb25Jcm9uSW5wdXRSZWFkeTpmdW5jdGlvbigpe3RoaXMuJC5uYXRpdmVJbnB1dHx8KHRoaXMuJC5uYXRpdmVJbnB1dD10aGlzLiQkKCJpbnB1dCIpKTt0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuJC5uYXRpdmVJbnB1dC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCk7dGhpcy5pbnB1dEVsZW1lbnQuYmluZFZhbHVlJiZ0aGlzLiQuY29udGFpbmVyLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLmlucHV0RWxlbWVudCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYil7YiYmYi50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5wcmVwYXJlKCk6KGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWIudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1iLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1kcm9wZG93bi9pcm9uLWRyb3Bkb3duLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Imlyb24tZHJvcGRvd24iLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sb3BlbkFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3R9LGNsb3NlQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZm9jdXNUYXJnZXQ6e3R5cGU6T2JqZWN0fSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkIn19LApsaXN0ZW5lcnM6eyJuZW9uLWFuaW1hdGlvbi1maW5pc2giOiJfb25OZW9uQW5pbWF0aW9uRmluaXNoIn0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU92ZXJsYXlQb3NpdGlvbihwb3NpdGlvblRhcmdldCwgdmVydGljYWxBbGlnbiwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldCkiXSxnZXQgY29udGFpbmVkRWxlbWVudCgpe2Zvcih2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYltkXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBiW2RdfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsQWN0aW9ufHwodGhpcy5zY3JvbGxBY3Rpb249dGhpcy5hbGxvd091dHNpZGVTY3JvbGw/InJlZml0IjoibG9jayIpO3RoaXMuX3JlYWRpZWQ9ITB9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zaXppbmdUYXJnZXQmJnRoaXMuc2l6aW5nVGFyZ2V0IT09CnRoaXN8fCh0aGlzLnNpemluZ1RhcmdldD10aGlzLmNvbnRhaW5lZEVsZW1lbnR8fHRoaXMpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuZGlzYWJsZWQ/dGhpcy5jYW5jZWwoKToodGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLl91cGRhdGVBbmltYXRpb25Db25maWcoKSxQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLm9wZW4/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oIm9wZW4iKSk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fcmVuZGVyT3BlbmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sCl9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLmNsb3NlPyh0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgiYW5pbWF0aW5nIiksdGhpcy5wbGF5QW5pbWF0aW9uKCJjbG9zZSIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJDbG9zZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGluZyIpO3RoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfdXBkYXRlQW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuY29udGFpbmVkRWxlbWVudCxkPVtdLmNvbmNhdCh0aGlzLm9wZW5BbmltYXRpb25Db25maWd8fFtdKS5jb25jYXQodGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ3x8CltdKSxmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5ub2RlPWI7dGhpcy5hbmltYXRpb25Db25maWc9e29wZW46dGhpcy5vcGVuQW5pbWF0aW9uQ29uZmlnLGNsb3NlOnRoaXMuY2xvc2VBbmltYXRpb25Db25maWd9fSxfdXBkYXRlT3ZlcmxheVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLm5vdGlmeVJlc2l6ZSgpfSxfYWxsb3dPdXRzaWRlU2Nyb2xsQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9yZWFkaWVkJiYoYj90aGlzLnNjcm9sbEFjdGlvbiYmImxvY2siIT09dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj0icmVmaXQiKTp0aGlzLnNjcm9sbEFjdGlvbj0ibG9jayIpfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZm9jdXNUYXJnZXR8fHRoaXMuY29udGFpbmVkRWxlbWVudDtiJiZ0aGlzLm9wZW5lZCYmIXRoaXMubm9BdXRvRm9jdXM/Yi5mb2N1cygpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX2FwcGx5Rm9jdXMuYXBwbHkodGhpcywKYXJndW1lbnRzKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbWVudS1idXR0b24vcGFwZXItbWVudS1idXR0b24uaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17QU5JTUFUSU9OX0NVQklDX0JFWklFUjoiY3ViaWMtYmV6aWVyKC4zLC45NSwuNSwxKSIsTUFYX0FOSU1BVElPTl9USU1FX01TOjQwMH07UG9seW1lci5QYXBlck1lbnVCdXR0b249ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5yZWdpc3RlcmVkPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuYWRkT3duS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlbW92ZU93bktleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NvbGxlY3RLZXlCaW5kaW5ncz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9wcmVwS2V5QmluZGluZ3M9CmZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2FkZEtleUJpbmRpbmc9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fcmVzZXRLZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX29uS2V5QmluZGluZ0V2ZW50PWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3RyaWdnZXJLZXlIYW5kbGVyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2ZvY3VzQmx1ckhhbmRsZXI9ZnVuY3Rpb24oZCl7aWYoUG9seW1lci5FbGVtZW50KXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PQpkLnR5cGUpO2Vsc2UgaWYoZC50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWQudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGY9UG9seW1lci5kb20oZCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChmKXx8dGhpcy5maXJlKGQudHlwZSx7c291cmNlRXZlbnQ6ZH0se25vZGU6dGhpcyxidWJibGVzOmQuYnViYmxlcyxjYW5jZWxhYmxlOmQuY2FuY2VsYWJsZX0pfX07UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9jaGFuZ2VkQ29udHJvbFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3NldEZvY3VzZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uPVBvbHltZXIoe2lzOiJwYXBlci1tZW51LWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLApQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e29wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saWdub3JlU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NlT25BY3RpdmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoyMDB9fSx7bmFtZToicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246MTUwLGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjI3NSxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX1dfX0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MTUwfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246NTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LAp7bmFtZToicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoyMDAsZWFzaW5nOiJlYXNlLWluIn19XX19LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kcm9wZG93bkNvbnRlbnQ6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxsaXN0ZW5lcnM6eyJpcm9uLWFjdGl2YXRlIjoiX29uSXJvbkFjdGl2YXRlIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0In0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBkPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZj0wLGg9ZC5sZW5ndGg7ZjxoO2YrKylpZihkW2ZdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGRbZl19LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPwp0aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHx0aGlzLiQuZHJvcGRvd24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5kcm9wZG93bi5jbG9zZSgpfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVTZWxlY3R8fHRoaXMuY2xvc2UoKX0sX29uSXJvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZU9uQWN0aXZhdGUmJnRoaXMuY2xvc2UoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtkPyh0aGlzLl9kcm9wZG93bkNvbnRlbnQ9dGhpcy5jb250ZW50RWxlbWVudCx0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLW9wZW4iKSk6bnVsbCE9ZiYmdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1jbG9zZSIpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZS5fZGlzYWJsZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkJiZ0aGlzLm9wZW5lZCYmCnRoaXMuY2xvc2UoKX0sX19vbklyb25PdmVybGF5Q2FuY2VsZWQ6ZnVuY3Rpb24oZCl7dmFyIGY9dGhpcy4kLnRyaWdnZXI7LTE8UG9seW1lci5kb20oZC5kZXRhaWwpLnBhdGguaW5kZXhPZihmKSYmZC5wcmV2ZW50RGVmYXVsdCgpfX0pO09iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oZCl7UG9seW1lci5QYXBlck1lbnVCdXR0b25bZF09YltkXX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kcm9wZG93bi1tZW51L3BhcGVyLWRyb3Bkb3duLW1lbnUuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicGFwZXItZHJvcGRvd24tbWVudSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzZWxlY3RlZEl0ZW1MYWJlbDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxzZWxlY3RlZEl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sbGFiZWw6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sCnZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToicmlnaHQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToidG9wIn0sdmVydGljYWxPZmZzZXQ6TnVtYmVyLGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3RhcDoiX29uVGFwIn0sa2V5QmluZGluZ3M6eyJ1cCBkb3duIjoib3BlbiIsZXNjOiJjbG9zZSJ9LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjb21ib2JveCIsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsImFyaWEtaGFzcG9wdXAiOiJ0cnVlIn0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtKSJdLGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuY29udGVudEVsZW1lbnQ7YiYmYi5zZWxlY3RlZEl0ZW0mJnRoaXMuX3NldFNlbGVjdGVkSXRlbShiLnNlbGVjdGVkSXRlbSl9LGdldCBjb250ZW50RWxlbWVudCgpe2Zvcih2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYltkXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBiW2RdfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5tZW51QnV0dG9uLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuZGV0YWlsLml0ZW0pfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCl9LF9vblRhcDpmdW5jdGlvbihiKXtQb2x5bWVyLkdlc3R1cmVzLmZpbmRPcmlnaW5hbFRhcmdldChiKT09PXRoaXMmJgp0aGlzLm9wZW4oKX0sX3NlbGVjdGVkSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1iPWI/Yi5sYWJlbHx8Yi5nZXRBdHRyaWJ1dGUoImxhYmVsIil8fGIudGV4dENvbnRlbnQudHJpbSgpOiIiO3RoaXMuX3NldFNlbGVjdGVkSXRlbUxhYmVsKGIpfSxfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldDpmdW5jdGlvbihiLGQpe3JldHVybiBkP2Q6Yj8tNDo4fSxfZ2V0VmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMucmVxdWlyZWQmJiEhdGhpcy52YWx1ZX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wZW5lZD8idHJ1ZSI6ImZhbHNlIixkPXRoaXMuY29udGVudEVsZW1lbnQ7ZCYmZC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLGIpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1saXN0Ym94L3BhcGVyLWxpc3Rib3guaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicGFwZXItbGlzdGJveCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJsaXN0Ym94In19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWl0ZW0iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3RmLWJhY2tlbmQtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWJhY2tlbmQiLF90ZW1wbGF0ZTpudWxsLHRmX2JhY2tlbmQ6Yn0pfSkoZGN8fChkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvdGYtc3RvcmFnZS1wb2x5bWVyLmpzCihmdW5jdGlvbihiKXtQb2x5bWVyKHtpczoidGYtc3RvcmFnZSIsX3RlbXBsYXRlOm51bGwsdGZfc3RvcmFnZTpifSl9KShiZHx8KGJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvdGYtdGFnLWZpbHRlcmVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRhZy1maWx0ZXJlciIscHJvcGVydGllczp7dGFnRmlsdGVyOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKF90YWdGaWx0ZXIpIn0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6YmQuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifX0sX3RhZ0ZpbHRlck9ic2VydmVyOmJkLmdldFN0cmluZ09ic2VydmVyKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KSxfY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kYXNoYm9hcmQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRhc2hib2FyZC1sYXlvdXQifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmxpc3RlbihiLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZElkPWIuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2ImJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxiLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY29sbGFwc2UvaXJvbi1jb2xsYXBzZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoKIm1heC1oZWlnaHQifSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhpZGRlbiI6InRydWUifSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9vblRyYW5zaXRpb25FbmQifSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0saGlkZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSExfSx1cGRhdGVTaXplOmZ1bmN0aW9uKGIsZCl7Yj0iYXV0byI9PT1iPyIiOmI7ZD1kJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PWI7dGhpcy5fZGVzaXJlZFNpemU9Yjt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTtkJiYoZD10aGlzLl9jYWxjU2l6ZSgpLCIiPT09YiYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIixiPXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1kLHRoaXMuc2Nyb2xsVG9wPQp0aGlzLnNjcm9sbFRvcCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCEwKSxkPWIhPT1kKTt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09YjtkfHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24oYil7UG9seW1lci5CYXNlLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpO3RoaXMubm9BbmltYXRpb249IWJ9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWImJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzczt0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiI7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPwoiYXV0byI6IjBweCIsITEpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsIXRoaXMub3BlbmVkKTt0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCEwKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsITEpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIiwhMSk7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMCk7dGhpcy5vcGVuZWQmJnRoaXMuZm9jdXMoKX0sX3RyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dGhpcy5fZGVzaXJlZFNpemU7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCF0aGlzLm9wZW5lZCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLHRoaXMub3BlbmVkKTt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTt0aGlzLm5vdGlmeVJlc2l6ZSgpOwp0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyIscHJvcGVydGllczp7Y2F0ZWdvcnk6T2JqZWN0LGluaXRpYWxPcGVuZWQ6Qm9vbGVhbixvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udGVudEFjdGl2ZShvcGVuZWQpIn0sZGlzYWJsZVBhZ2luYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvdW50Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9LF9oYXNNdWx0aXBsZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlKF9jb3VudCkifSxfcGFuZVJlbmRlcmVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KSIsb2JzZXJ2ZXI6Il9vblBhbmVSZW5kZXJlZENoYW5nZWQifSxfaXRlbXNSZW5kZXJlZDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVJdGVtc1JlbmRlcmVkKG9wZW5lZCwgX3BhbmVSZW5kZXJlZCkifSxfaXNTZWFyY2hSZXN1bHRzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUpIn0sX2lzSW52YWxpZFNlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LF9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSxnZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PkpTT04uc3RyaW5naWZ5KGIpLG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9LF9saW1pdDp7dHlwZTpOdW1iZXIsdmFsdWU6MTIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSwKX2FjdGl2ZUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRQYWdlKF9saW1pdCwgX2FjdGl2ZUluZGV4KSJ9LF9wYWdlQ291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0sX211bHRpcGxlUGFnZXNFeGlzdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChfcGFnZUNvdW50LCBkaXNhYmxlUGFnaW5hdGlvbikifSxfaGFzUHJldmlvdXNQYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzUHJldmlvdXNQYWdlKF9jdXJyZW50UGFnZSkifSxfaGFzTmV4dFBhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNOZXh0UGFnZShfY3VycmVudFBhZ2UsIF9wYWdlQ291bnQpIn0sX2lucHV0V2lkdGg6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUlucHV0V2lkdGgoX3BhZ2VDb3VudCkiLApvYnNlcnZlcjoiX3VwZGF0ZUlucHV0V2lkdGgifSxfcGFnZUlucHV0VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSxfcGFnZUlucHV0UmF3VmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcGFnZUlucHV0Rm9jdXNlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX2NsYW1wQWN0aXZlSW5kZXgoY2F0ZWdvcnkuaXRlbXMuKikiLCJfdXBkYXRlUmVuZGVyZWRJdGVtcyhfaXRlbXNSZW5kZXJlZCwgY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0LCBfYWN0aXZlSW5kZXgsIF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJdLGJlaGF2aW9yczpbcmQuVGZEb21SZXBlYXRCZWhhdmlvcl0sX2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH0sCl9jb21wdXRlSGFzTXVsdGlwbGUoKXtyZXR1cm4gMTx0aGlzLl9jb3VudH0sX3RvZ2dsZVBhbmUoKXt0aGlzLl9zZXRPcGVuZWQoIXRoaXMub3BlbmVkKX0sX2NvbXB1dGVDb250ZW50QWN0aXZlKCl7cmV0dXJuIHRoaXMub3BlbmVkfSxfb25QYW5lUmVuZGVyZWRDaGFuZ2VkKGIsZCl7YiYmYiE9PWQmJnRoaXMuJC5pZlJlbmRlcmVkLnJlbmRlcigpfSxfY29tcHV0ZVBhbmVSZW5kZXJlZChiKXtyZXR1cm4hKGIubWV0YWRhdGEudHlwZT09PWtjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmIiI9PT1iLm5hbWUpfSxfY29tcHV0ZUl0ZW1zUmVuZGVyZWQoKXtyZXR1cm4gdGhpcy5fcGFuZVJlbmRlcmVkJiZ0aGlzLm9wZW5lZH0sX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoYil7cmV0dXJuIGI9PT1rYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LF9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYi50eXBlPT09a2MuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYKIWIudmFsaWRSZWdleH0sX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGIpe3JldHVybiBiLnR5cGU9PT1rYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJmIudW5pdmVyc2FsUmVnZXh9LF9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0IGI9dGhpcy5jYXRlZ29yeS5tZXRhZGF0YS50eXBlO3JldHVybiB0aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLmNvbXBvc2l0ZVNlYXJjaCYmYj09PWtjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30scmVhZHkoKXt0aGlzLl9zZXRPcGVuZWQobnVsbD09dGhpcy5pbml0aWFsT3BlbmVkPyEwOnRoaXMuaW5pdGlhbE9wZW5lZCk7dGhpcy5fbGltaXRMaXN0ZW5lcj0oKT0+e3RoaXMuc2V0KCJfbGltaXQiLHNkLmdldExpbWl0KCkpfTtzZC5hZGRMaW1pdExpc3RlbmVyKHRoaXMuX2xpbWl0TGlzdGVuZXIpO3RoaXMuX2xpbWl0TGlzdGVuZXIoKX0sZGV0YWNoZWQoKXtzZC5yZW1vdmVMaW1pdExpc3RlbmVyKHRoaXMuX2xpbWl0TGlzdGVuZXIpfSwKX3VwZGF0ZVJlbmRlcmVkSXRlbXMoYixkLGYsaCxrLHIpe2ImJihiPU1hdGguZmxvb3IoaC9mKSxkPXRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdLHRoaXMudXBkYXRlRG9tKHI/ZDpkLnNsaWNlKGIqZiwoYisxKSpmKSx0aGlzLmdldENhdGVnb3J5SXRlbUtleSkpfSxfbGltaXRDaGFuZ2VkKGIpe3RoaXMuc2V0Q2FjaGVTaXplKDIqYil9LF9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkKCl7dGhpcy5zZXRHZXRJdGVtS2V5KHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KX0sX2NvbXB1dGVDdXJyZW50UGFnZShiLGQpe3JldHVybiBNYXRoLmZsb29yKGQvYikrMX0sX2NvbXB1dGVQYWdlQ291bnQoYixkKXtyZXR1cm4gdGhpcy5jYXRlZ29yeT9NYXRoLmNlaWwodGhpcy5jYXRlZ29yeS5pdGVtcy5sZW5ndGgvZCk6MH0sX2NvbXB1dGVNdWx0aXBsZVBhZ2VzRXhpc3QoYixkKXtyZXR1cm4hZCYmMTxifSxfY29tcHV0ZUhhc1ByZXZpb3VzUGFnZShiKXtyZXR1cm4gMTxifSxfY29tcHV0ZUhhc05leHRQYWdlKGIsCmQpe3JldHVybiBiPGR9LF9jb21wdXRlSW5wdXRXaWR0aChiKXtyZXR1cm5gY2FsYygke2IudG9TdHJpbmcoKS5sZW5ndGh9ZW0gKyAyMHB4KWB9LF9zZXRBY3RpdmVJbmRleChiKXtjb25zdCBkPSh0aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSkubGVuZ3RoLTE7Yj5kJiYoYj1kKTswPmImJihiPTApO3RoaXMuc2V0KCJfYWN0aXZlSW5kZXgiLGIpfSxfY2xhbXBBY3RpdmVJbmRleCgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4KX0sX3BlcmZvcm1QcmV2aW91c1BhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleC10aGlzLl9saW1pdCl9LF9wZXJmb3JtTmV4dFBhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCt0aGlzLl9saW1pdCl9LF9jb21wdXRlUGFnZUlucHV0VmFsdWUoYixkLGYpe3JldHVybiBiP2Q6Zi50b1N0cmluZygpfSxfaGFuZGxlUGFnZUlucHV0RXZlbnQoYil7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsCmIudGFyZ2V0LnZhbHVlKTtiPU51bWJlcihiLnRhcmdldC52YWx1ZXx8TmFOKTtpc05hTihiKXx8dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fbGltaXQqKE1hdGgubWF4KDEsTWF0aC5taW4oYix0aGlzLl9wYWdlQ291bnQpKS0xKSl9LF9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9jdXJyZW50UGFnZS50b1N0cmluZygpKX0sX2hhbmRsZVBhZ2VGb2N1c0V2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsdGhpcy5fcGFnZUlucHV0VmFsdWUpO3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITApfSxfaGFuZGxlUGFnZUJsdXJFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITEpfSxfdXBkYXRlUGFnZUlucHV0VmFsdWUoYil7Y29uc3QgZD10aGlzLiQkKCIjcGFnZS1pbnB1dCBpbnB1dCIpO2QmJihkLnZhbHVlPWIpfSxfdXBkYXRlSW5wdXRXaWR0aCgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoIjp0aGlzLl9pbnB1dFdpZHRofSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nL3BhcGVyLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1kaWFsb2ciLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJuZW9uLWFuaW1hdGlvbi1maW5pc2giOiJfb25OZW9uQW5pbWF0aW9uRmluaXNoIn0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJlbnRyeSIpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKTt0aGlzLnBsYXlBbmltYXRpb24oImV4aXQiKX0sX29uTmVvbkFuaW1hdGlvbkZpbmlzaDpmdW5jdGlvbigpe3RoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciB0ZDsKKGZ1bmN0aW9uKGIpe2IucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTtiLnN0YW5kYXJkPWIucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkodGR8fCh0ZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCxrKXtmdW5jdGlvbiByKCl7bC5zZXREb21haW4oaygpKX1jb25zdCBsPW5ldyBmO2guYWRkTGlzdGVuZXIocik7cigpO3JldHVybiBwPT5sLmdldENvbG9yKHApfWNsYXNzIGZ7Y29uc3RydWN0b3IoaD1iLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9aDt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihoKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2guZm9yRWFjaCgoayxyKT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGssdGhpcy5wYWxldHRlW3IldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoaCl7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGgpKXRocm93IEVycm9yKGBTdHJpbmcgJHtofSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGgpfX1iLkNvbG9yU2NhbGU9ZjtiLnJ1bnNDb2xvclNjYWxlPWQoZGMucnVuc1N0b3JlLCgpPT5kYy5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYi5leHBlcmltZW50c0NvbG9yU2NhbGU9ZChkYy5leHBlcmltZW50c1N0b3JlLCgpPT5kYy5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpofSk9PmgpKX0pKHRkfHwodGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtmJiZkIT1mfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9Xy5kZWJvdW5jZShkPT57dGhpcy5yZWdleD1kfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZD90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1kfSwzMCk6YihkKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihiKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYil9Y2F0Y2goZCl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZWxlY3Rpb25TdGF0ZSxkPV8uZmlsdGVyKF8udmFsdWVzKGIpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaWNvbj0KMT09PWQmJmJbZi5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLl9yZWdleDtyZXR1cm4gYj90aGlzLm5hbWVzLmZpbHRlcihkPT5iLnRlc3QoZCkpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGY9Pm51bGw9PWJbZl0/ZDpiW2ZdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTsKYi51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmR9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTtiLnN0eWxlLmNvbG9yPWR9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQubmFtZSxmPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihoKXtmW2hdPWg9PWR9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWZ9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihiKXtiPQpQb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDtjb25zdCBkPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7ZFtiLm5hbWVdPWIuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYil7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihiKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGY9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZikpLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGY9PntkW2ZdPSFifSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfX0pfSkoY2R8fChjZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXdici1zdHJpbmcvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsZGVsaW1pdGVyUGF0dGVybjpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlLCBkZWxpbWl0ZXJQYXR0ZXJuKSJ9fSxfY29tcHV0ZVBhcnRzKGIsZCl7Y29uc3QgZj1bXTtmb3IoOzspe2NvbnN0IGg9bmV3IFJlZ0V4cChkLCJnIik7aC50ZXN0KGIpO2lmKDA9PT1oLmxhc3RJbmRleCl7Zi5wdXNoKGIpO2JyZWFrfWVsc2UgZi5wdXNoKGIuc2xpY2UoMCxoLmxhc3RJbmRleCkpLGI9Yi5zbGljZShoLmxhc3RJbmRleCl9cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcnVucy1zZWxlY3Rvci90Zi1ydW5zLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXJ1bnMtc2VsZWN0b3IiLHByb3BlcnRpZXM6e3J1blNlbGVjdGlvblN0YXRlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGUiLHZhbHVlOmJkLmdldE9iamVjdEluaXRpYWxpemVyKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pfSxyZWdleElucHV0Ont0eXBlOlN0cmluZyx2YWx1ZTpiZC5nZXRTdHJpbmdJbml0aWFsaXplcigicmVnZXhJbnB1dCIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJfcmVnZXhPYnNlcnZlciJ9LHNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHJ1bnM6QXJyYXksZGF0YUxvY2F0aW9uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jbGlwcGVkRGF0YUxvY2F0aW9uOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldENsaXBwZWREYXRhTG9jYXRpb24oZGF0YUxvY2F0aW9uLCBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCkifSxfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aDp7dHlwZTpOdW1iZXIsCnZhbHVlOjI1MCxyZWFkT25seTohMH0sX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm46e3R5cGU6U3RyaW5nLHZhbHVlOiJbL1x4M2RfLC1dIixyZWFkT25seTohMH0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjp0ZC5ydW5zQ29sb3JTY2FsZX19fSxhdHRhY2hlZCgpe3RoaXMuX3J1blN0b3JlTGlzdGVuZXI9ZGMucnVuc1N0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoInJ1bnMiLGRjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpfSk7dGhpcy5zZXQoInJ1bnMiLGRjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3RoaXMuX2VudlN0b3JlTGlzdGVuZXI9ZGMuZW52aXJvbm1lbnRTdG9yZS5hZGRMaXN0ZW5lcigoKT0+e3RoaXMuc2V0KCJkYXRhTG9jYXRpb24iLGRjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCkpfSk7dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsZGMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9LGRldGFjaGVkKCl7ZGMucnVuc1N0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fcnVuU3RvcmVMaXN0ZW5lcik7CmRjLmVudmlyb25tZW50U3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9lbnZTdG9yZUxpc3RlbmVyKX0sX3RvZ2dsZUFsbDpmdW5jdGlvbigpe3RoaXMuJC5tdWx0aUNoZWNrYm94LnRvZ2dsZUFsbCgpfSxfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbjpmdW5jdGlvbihiLGQpe2lmKHZvaWQgMCE9PWIpcmV0dXJuIGIubGVuZ3RoPmQ/Yi5zdWJzdHJpbmcoMCxkKTpifSxfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZzpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy4kJCgiI2RhdGEtbG9jYXRpb24tZGlhbG9nIikub3BlbigpfSxfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihiLGQpe3JldHVybiBiJiZiLmxlbmd0aD5kfSxfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZTpiZC5nZXRPYmplY3RPYnNlcnZlcigicnVuU2VsZWN0aW9uU3RhdGUiLHtkZWZhdWx0VmFsdWU6e319KSxfcmVnZXhPYnNlcnZlcjpiZC5nZXRTdHJpbmdPYnNlcnZlcigicmVnZXhJbnB1dCIsCntkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1saXRlLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNwaW5uZXItbGl0ZSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyU3Bpbm5lckJlaGF2aW9yXX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvdnotY2hhcnQtdG9vbHRpcC5qcwp2YXIgc2c7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aC5BVVRPPSJhdXRvIjtoLkJPVFRPTT0iYm90dG9tIjtoLlJJR0hUPSJyaWdodCJ9KShkPWIuVG9vbHRpcFBvc2l0aW9ufHwoYi5Ub29sdGlwUG9zaXRpb249e30pKTtjb25zdCBmPXtib3hTaGFkb3c6IjAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIC4zKSIsb3BhY2l0eTowLHBvc2l0aW9uOiJmaXhlZCIsd2lsbENoYW5nZToidHJhbnNmb3JtIix6SW5kZXg6NX07UG9seW1lcih7aXM6InZ6LWNoYXJ0LXRvb2x0aXAiLF90ZW1wbGF0ZTpudWxsLHByb3BlcnRpZXM6e2NvbnRlbnRDb21wb25lbnROYW1lOlN0cmluZyxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ZC5BVVRPfSxtaW5EaXN0RnJvbUVkZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjE1fX0scmVhZHkoKXt0aGlzLl90dW5uZWw9dGhpcy5fcmFmPXRoaXMuX3N0eWxlQ2FjaGU9bnVsbH0sYXR0YWNoZWQoKXt0aGlzLl90dW5uZWw9dGhpcy5fY3JlYXRlVHVubmVsKCk7dGhpcy5faGlkZU9uQmx1cj0KKCk9Pntkb2N1bWVudC5oaWRkZW4mJnRoaXMuaGlkZSgpfTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGRldGFjaGVkKCl7dGhpcy5oaWRlKCk7dGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCk7dGhpcy5fdHVubmVsPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfSxjb250ZW50KCl7cmV0dXJuIHRoaXMuX3R1bm5lbC5zaGFkb3dSb290fSxoaWRlKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fc3R5bGVDYWNoZT1udWxsO3RoaXMuX3R1bm5lbC5zdHlsZS5vcGFjaXR5PTB9LHVwZGF0ZUFuZFBvc2l0aW9uKGgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO3RoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9yZXBvc2l0aW9uSW1wbChoKX0pfSwKX3JlcG9zaXRpb25JbXBsKGgpe2NvbnN0IGs9dGhpcy5fdHVubmVsO2g9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCByPWsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD13aW5kb3cuaW5uZXJIZWlnaHQscD1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLG09aC50b3Asbj1tK2guaGVpZ2h0LHE9ci5oZWlnaHQrc2YuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDtsZXQgdT1udWxsLHc9TWF0aC5tYXgodGhpcy5taW5EaXN0RnJvbUVkZ2UsaC5sZWZ0KSxBPW51bGwseT1tO3RoaXMucG9zaXRpb249PWQuUklHSFQ/dz1oLnJpZ2h0Oih5PW4rc2YuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCxwPHcrci53aWR0aCt0aGlzLm1pbkRpc3RGcm9tRWRnZSYmKHc9bnVsbCxBPXRoaXMubWluRGlzdEZyb21FZGdlKSk7dGhpcy5wb3NpdGlvbj09ZC5BVVRPJiYwPGgudG9wLXEmJmw8aC50b3AraC5oZWlnaHQrcSYmKHk9bnVsbCx1PWwtbStzZi5UT09MVElQX1lfUElYRUxfT0ZGU0VUKTtoPXtjb250YWluOiJjb250ZW50IiwKb3BhY2l0eToxLGxlZnQ6dz9gJHt3fXB4YDpudWxsLHJpZ2h0OkE/YCR7QX1weGA6bnVsbCx0b3A6eT9gJHt5fXB4YDpudWxsLGJvdHRvbTp1P2Ake3V9cHhgOm51bGx9O18uaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLGgpfHwoT2JqZWN0LmFzc2lnbihrLnN0eWxlLGgpLHRoaXMuX3N0eWxlQ2FjaGU9aCl9LF9jcmVhdGVUdW5uZWwoKXtpZighdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmVxdWlyZSBgY29udGVudENvbXBvbmVudE5hbWVgIHRvIGJlIGEgbmFtZSBvZiBhIFBvbHltZXIgY29tcG9uZW50Iik7Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuY29udGVudENvbXBvbmVudE5hbWUpO09iamVjdC5hc3NpZ24oaC5zdHlsZSxmKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3JldHVybiBofSxfcmVtb3ZlVHVubmVsKGgpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaCl9fSl9KShzZ3x8KHNnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdGYtc2NhbGUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuUXVhbnRpdGF0aXZlU2NhbGV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2lnbm9yZU91dGxpZXI9ITF9c2V0VmFsdWVQcm92aWRlckZvckRvbWFpbihmKXt0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPWZ9aWdub3JlT3V0bGllcihmKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBmPyh0aGlzLl9pZ25vcmVPdXRsaWVyPWYsdGhpcyk6dGhpcy5faWdub3JlT3V0bGllcn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtjb25zdCBmPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGYpfX1iLlRmU2NhbGU9ZH0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lYXItc2NhbGUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5faWdub3JlT3V0bGllcj0hMTt0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZil7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1mfV9uaWNlRG9tYWluKGYsaCl7Y29uc3QgW2sscl09ZixsPXItaztmPTA9PT1sPzEuMSpNYXRoLmFicyhrKSsxLjE6bCp0aGlzLnBhZFByb3BvcnRpb24oKTtyZXR1cm4gc3VwZXIuX25pY2VEb21haW4oWzA8PWsmJms8bD8tLjEqcjprLWYscitmXSxoKX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGYpe2Y9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoZik7bGV0IGg9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1mLmxlbmd0aCYmKGY9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihmLGhbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChmLGhbMV0pXSxoPXRoaXMuX25pY2VEb21haW4oZikpOwpyZXR1cm4gaH1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtjb25zdCBmPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGYpfWV4dGVudE9mVmFsdWVzKGYpe3ZhciBoPWY9Zi5maWx0ZXIoaz0+UGxvdHRhYmxlLlV0aWxzLk1hdGguaXNWYWxpZE51bWJlcihrKSk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2g9Zi5zb3J0KChsLHApPT5sLXApO2NvbnN0IGs9ZDMucXVhbnRpbGUoaCwuMDUpLHI9ZDMucXVhbnRpbGUoaCwuOTUpO2g9Zi5maWx0ZXIobD0+bD49ayYmbDw9cil9Zj1kMy5leHRlbnQoaCk7cmV0dXJuIG51bGw9PWZbMF18fG51bGw9PWZbMV0/W106Zn1pZ25vcmVPdXRsaWVyKGYpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGY/KHRoaXMuX2lnbm9yZU91dGxpZXI9Zix0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfX1iLkxpbmVhclNjYWxlPWR9KSh1Z3x8KHVnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvbG9nLXNjYWxlLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGspe3JldHVybiBNYXRoLmxvZzEwKGspfWZ1bmN0aW9uIGYoayl7cmV0dXJuIE1hdGgucG93KDEwLGspfWIuTUlOX1BPU0lUSVZFX1ZBTFVFPU1hdGgucG93KDIsLTEwNzQpO2NsYXNzIGggZXh0ZW5kcyBiLlRmU2NhbGV7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2QzTG9nU2NhbGU9ZDMuc2NhbGVMb2coKTt0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNjYWxlKGspe3JldHVybiAwPj1rP05hTjp0aGlzLl9kM0xvZ1NjYWxlKGspfWludmVydChrKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS5pbnZlcnQoayl9c2NhbGVUcmFuc2Zvcm1hdGlvbihrKXtyZXR1cm4gdGhpcy5zY2FsZShrKX1pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKGspe3JldHVybiB0aGlzLmludmVydChrKX1nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpe3JldHVybiB0aGlzLmRvbWFpbigpfXNldFRyYW5zZm9ybWF0aW9uRG9tYWluKGspe3RoaXMuZG9tYWluKGspfWdldFRyYW5zZm9ybWF0aW9uRXh0ZW50KCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4oayl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj0Kaztjb25zdCBbcixsXT1rO3N1cGVyLl9zZXREb21haW4oW01hdGgubWF4KGIuTUlOX1BPU0lUSVZFX1ZBTFVFLHIpLGxdKX1fbmljZURvbWFpbihrKXtjb25zdCBbcixsXT1rO2s9TWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksZChyKSk7Y29uc3QgcD1kKGwpO3ZhciBtPXAtazttPW0/bSp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltmKE1hdGgubWF4KGQoYi5NSU5fUE9TSVRJVkVfVkFMVUUpLGstbSkpLGYocCttKV19X2dldFVuYm91bmRlZEV4dGVudChrKXtrPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGspO2xldCByPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09ay5sZW5ndGgmJihrPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oayxyWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoayxyWzFdKV0scj10aGlzLl9uaWNlRG9tYWluKGspKTtyZXR1cm4gcn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtyZXR1cm4gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkubWFwKGs9PgowPGs/azpiLk1JTl9QT1NJVElWRV9WQUxVRSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzTG9nU2NhbGUuZG9tYWluKGspO3JldHVybiB0aGlzfV9nZXRSYW5nZSgpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKCl9X3NldFJhbmdlKGspe3RoaXMuX2QzTG9nU2NhbGUucmFuZ2Uoayl9ZGVmYXVsdFRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXMoayl7bGV0IHI9az1rLmZpbHRlcihsPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGwpJiYwPGwpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtrPWsubWFwKGQpLnNvcnQoKG0sbik9Pm0tbik7Y29uc3QgbD1kMy5xdWFudGlsZShrLC4wNSkscD1kMy5xdWFudGlsZShrLAouOTUpO3I9ay5maWx0ZXIobT0+bT49bCYmbTw9cCkubWFwKGYpfWs9ZDMuZXh0ZW50KHIpO3JldHVybiBudWxsPT1rWzBdfHxudWxsPT1rWzFdP1tdOmt9fWIuTG9nU2NhbGU9aH0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oayl7a1trLlRFWFQ9MF09IlRFWFQiO2tbay5ET009MV09IkRPTSJ9KShkfHwoZD17fSkpO2xldCBmOyhmdW5jdGlvbihrKXtrLkxPRz0ibG9nIjtrLkxJTkVBUj0ibGluZWFyIn0pKGZ8fChmPXt9KSk7Y2xhc3MgaHtjb25zdHJ1Y3RvcihrLHIsbCxwLG0sbixxLHUsdyxBLHkpe3RoaXMuZGlydHlEYXRhc2V0cz1uZXcgU2V0O3RoaXMuc2VyaWVzTmFtZXM9W107dGhpcy5uYW1lMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1wO3RoaXMudG9vbHRpcD1tO3RoaXMuZGF0YXNldHM9W107dGhpcy5faWdub3JlWU91dGxpZXJzPSExO3RoaXMubGFzdFBvaW50c0RhdGFzZXQ9bmV3IFBsb3R0YWJsZS5EYXRhc2V0O3RoaXMubmFuRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy55VmFsdWVBY2Nlc3Nvcj1yO3RoaXMuc3ltYm9sRnVuY3Rpb249QTt0aGlzLl9kZWZhdWx0WFJhbmdlPXU7dGhpcy5fZGVmYXVsdFlSYW5nZT13Owp0aGlzLnRvb2x0aXBDb2x1bW5zPW47dGhpcy5idWlsZENoYXJ0KGssbCxxLHkpfWJ1aWxkQ2hhcnQoayxyLGwscCl7dGhpcy5kZXN0cm95KCk7az1rKCk7dGhpcy54QWNjZXNzb3I9ay5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1rLnNjYWxlO3RoaXMueEF4aXM9ay5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7cCYmdGhpcy54QXhpcy5mb3JtYXR0ZXIocCk7dGhpcy55U2NhbGU9aC5nZXRZU2NhbGVGcm9tVHlwZShyKTt0aGlzLnlTY2FsZS5zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKCgpPT50aGlzLmdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpKTt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7cD1zZi5tdWx0aXNjYWxlRm9ybWF0dGVyKHNmLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihwKTsKdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO3RoaXMuZmlsbEFyZWE9bDtwPW5ldyBiLlBhblpvb21EcmFnTGF5ZXIodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsKCk9PnRoaXMucmVzZXREb21haW4oKSk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb249dGhpcy5jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24ocCk7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50PW5ldyBQbG90dGFibGUuQ29tcG9uZW50O2w9dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsbCk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7az1udWxsO3IhPT1mLkxPRyYmKGs9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJob3Jpem9udGFsIiksay5zY2FsZSh0aGlzLnlTY2FsZSkudmFsdWUoMCkpO3I9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJ2ZXJ0aWNhbCIpOwpyLnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKTt0aGlzLmNlbnRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW3RoaXMuZ3JpZGxpbmVzLGsscixsLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudCxwXSk7dGhpcy5jZW50ZXIuYWRkQ2xhc3MoIm1haW4iKTt0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KGsscixsKXtsJiYodGhpcy5tYXJnaW5BcmVhUGxvdD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLGspLHRoaXMubWFyZ2luQXJlYVBsb3QueShsLmhpZ2hlckFjY2Vzc29yLHIpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAobC5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLChxLHUsdyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh3Lm1ldGFkYXRhKCkubmFtZSkpLAp0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLHRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigic3Ryb2tlLXdpZHRoIiwwKSk7dGhpcy5zbW9vdGhlZEFjY2Vzc29yPXE9PnEuc21vb3RoZWQ7bD1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7bC54KHRoaXMueEFjY2Vzc29yLGspO2wueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHIpO2wuYXR0cigic3Ryb2tlIiwocSx1LHcpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUody5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLmxpbmVQbG90PWw7dGhpcy5zZXR1cFRvb2x0aXBzKGwpO2xldCBwPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtwLngodGhpcy54QWNjZXNzb3Isayk7cC55KHRoaXMuc21vb3RoZWRBY2Nlc3NvcixyKTtwLmF0dHIoInN0cm9rZSIsKHEsdSx3KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHcubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5zbW9vdGhMaW5lUGxvdD1wO2lmKHRoaXMuc3ltYm9sRnVuY3Rpb24pe3ZhciBtPQpuZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bS54KHRoaXMueEFjY2Vzc29yLGspO20ueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHIpO20uYXR0cigiZmlsbCIsKHEsdSx3KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHcubWV0YWRhdGEoKS5uYW1lKSk7bS5hdHRyKCJvcGFjaXR5IiwxKTttLnNpemUoMipzZi5UT09MVElQX0NJUkNMRV9TSVpFKTttLnN5bWJvbCgocSx1LHcpPT50aGlzLnN5bWJvbEZ1bmN0aW9uKHcubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9bX1tPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjttLngodGhpcy54QWNjZXNzb3Isayk7bS55KHRoaXMueVZhbHVlQWNjZXNzb3Iscik7bS5hdHRyKCJmaWxsIixxPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUocS5uYW1lKSk7bS5hdHRyKCJvcGFjaXR5IiwxKTttLnNpemUoMipzZi5UT09MVElQX0NJUkNMRV9TSVpFKTttLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSk7dGhpcy5zY2F0dGVyUGxvdD0KbTtsZXQgbj1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bi54KHRoaXMueEFjY2Vzc29yLGspO24ueShxPT5xLmRpc3BsYXlZLHIpO24uYXR0cigiZmlsbCIscT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHEubmFtZSkpO24uYXR0cigib3BhY2l0eSIsMSk7bi5zaXplKDIqc2YuTkFOX1NZTUJPTF9TSVpFKTtuLmRhdGFzZXRzKFt0aGlzLm5hbkRhdGFzZXRdKTtuLnN5bWJvbChQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlKTt0aGlzLm5hbkRpc3BsYXk9bjtrPVtuLG0scCxsXTt0aGlzLm1hcmdpbkFyZWFQbG90JiZrLnB1c2godGhpcy5tYXJnaW5BcmVhUGxvdCk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJmsucHVzaCh0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCk7cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChrKX1pZ25vcmVZT3V0bGllcnMoayl7ayE9PXRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz1rLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksCnRoaXMueVNjYWxlLmlnbm9yZU91dGxpZXIoayksdGhpcy5yZXNldFlEb21haW4oKSl9Z2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCl7Y29uc3Qgaz10aGlzLmdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpO3JldHVybiBfLmZsYXR0ZW5EZWVwKHRoaXMuZGF0YXNldHMubWFwKHI9PmsubWFwKGw9PnIuZGF0YSgpLm1hcChwPT5sKHAsLTEscikpKSkpLmZpbHRlcihpc0Zpbml0ZSl9dXBkYXRlU3BlY2lhbERhdGFzZXRzKCl7Y29uc3Qgaz10aGlzLmdldFlBeGlzQWNjZXNzb3IoKTt2YXIgcj10aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLmZpbHRlcihuPT4haXNOYU4oayhuLC0xLGwpKSk7MDxtLmxlbmd0aCYmKHA9bVttLmxlbmd0aC0xXSxwLm5hbWU9bC5tZXRhZGF0YSgpLm5hbWUscC5yZWxhdGl2ZT1zZi5yZWxhdGl2ZUFjY2Vzc29yKHAsLTEsbCkpO3JldHVybiBwfSkuZmlsdGVyKGw9Pm51bGwhPWwpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YShyKTsKdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMubWFwKHRoaXMuY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKSk7cj1fLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAobD0+e2xldCBwPW51bGwsbT1sLmRhdGEoKSxuPTA7Zm9yKDtuPG0ubGVuZ3RoJiZudWxsPT1wOylpc05hTihrKG1bbl0sLTEsbCkpfHwocD1rKG1bbl0sLTEsbCkpLG4rKztudWxsPT1wJiYocD0wKTtsZXQgcT1bXTtmb3Iobj0wO248bS5sZW5ndGg7bisrKWlzTmFOKGsobVtuXSwtMSxsKSk/KG1bbl0ubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxtW25dLmRpc3BsYXlZPXAsbVtuXS5yZWxhdGl2ZT1zZi5yZWxhdGl2ZUFjY2Vzc29yKG1bbl0sLTEsbCkscS5wdXNoKG1bbl0pKTpwPWsobVtuXSwtMSxsKTtyZXR1cm4gcX0pKTt0aGlzLm5hbkRhdGFzZXQuZGF0YShyKX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCk7dGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtpZihudWxsIT0KdGhpcy5fZGVmYXVsdFhSYW5nZSl2YXIgaz10aGlzLl9kZWZhdWx0WFJhbmdlO2Vsc2Ugaz10aGlzLnhTY2FsZSxrLl9kb21haW5NaW49bnVsbCxrLl9kb21haW5NYXg9bnVsbCxrPWsuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlLmRvbWFpbihrKX1yZXNldFlEb21haW4oKXtudWxsIT10aGlzLl9kZWZhdWx0WVJhbmdlP3RoaXMueVNjYWxlLmRvbWFpbih0aGlzLl9kZWZhdWx0WVJhbmdlKToodGhpcy55U2NhbGUuYXV0b0RvbWFpbigpLHRoaXMueVNjYWxlLmRvbWFpbih0aGlzLnlTY2FsZS5kb21haW4oKSkpfWdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpe2NvbnN0IGs9W3RoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpXTt0aGlzLmZpbGxBcmVhJiZrLnB1c2godGhpcy5maWxsQXJlYS5sb3dlckFjY2Vzc29yLHRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpO3JldHVybiBrfWdldFlBeGlzQWNjZXNzb3IoKXtyZXR1cm4gdGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcjoKdGhpcy55VmFsdWVBY2Nlc3Nvcn1jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24oayl7Y29uc3Qgcj1uZXcgc2YuUG9pbnRlckludGVyYWN0aW9uLGw9KCk9PntyLmVuYWJsZWQoITEpO3RoaXMuaGlkZVRvb2x0aXBzKCl9LHA9KCk9PnIuZW5hYmxlZCghMCk7ay5vblBhblN0YXJ0KGwpO2sub25EcmFnWm9vbVN0YXJ0KGwpO2sub25QYW5FbmQocCk7ay5vbkRyYWdab29tRW5kKHApO2sub25TY3JvbGxab29tKCgpPT50aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9uKSk7ci5vblBvaW50ZXJNb3ZlKG09Pnt0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj1tO3RoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQobSl9KTtyLm9uUG9pbnRlckV4aXQoKCk9PnRoaXMuaGlkZVRvb2x0aXBzKCkpO3JldHVybiByfXVwZGF0ZVRvb2x0aXBDb250ZW50KGspe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSwKdGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntsZXQgcj17eDprLngseTprLnksZGF0dW06bnVsbCxkYXRhc2V0Om51bGx9LGw9dGhpcy5ncmlkbGluZXMuY29udGVudCgpLm5vZGUoKS5nZXRCQm94KCk7dmFyIHA9dGhpcy5saW5lUGxvdC5kYXRhc2V0cygpLm1hcCh1PT50aGlzLmZpbmRDbG9zZXN0UG9pbnQocix1KSkuZmlsdGVyKEJvb2xlYW4pO2xldCBtPVBsb3R0YWJsZS5VdGlscy5ET00uaW50ZXJzZWN0c0JCb3gsbj1wLmZpbHRlcih1PT5tKHUueCx1LnksbCl8fGlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwwLHUuZGF0YXNldCkpKSxxPW4uZmlsdGVyKHU9PiFpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHUuZGF0dW0sMCx1LmRhdGFzZXQpKSk7MCE9PXAubGVuZ3RoPyh0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIikscD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShxLAp1PT51LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSxwLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJwb2ludCIsITApLHAuYXR0cigiciIsc2YuVE9PTFRJUF9DSVJDTEVfU0laRSkuYXR0cigiY3giLHU9PnUueCkuYXR0cigiY3kiLHU9PnUueSkuc3R5bGUoInN0cm9rZSIsIm5vbmUiKS5hdHRyKCJmaWxsIix1PT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpLHAuZXhpdCgpLnJlbW92ZSgpLHRoaXMuZHJhd1Rvb2x0aXBzKG4scix0aGlzLnRvb2x0aXBDb2x1bW5zKSk6dGhpcy5oaWRlVG9vbHRpcHMoKX0pKX1oaWRlVG9vbHRpcHMoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKTt0aGlzLnRvb2x0aXAuaGlkZSgpO3RoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIik7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHMoayl7ay5vbkRldGFjaCgoKT0+Cnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMSl9KTtrLm9uQW5jaG9yKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uYXR0YWNoVG8oayk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMCl9KX1kcmF3VG9vbHRpcHMoayxyLGwpe2lmKGsubGVuZ3RoKXt2YXIgcD10aGlzLmNvbG9yU2NhbGU7bD1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpkLkRPTSxldmFsdWF0ZSh5KXtkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJzcGFuIikuc3R5bGUoImJhY2tncm91bmQtY29sb3IiLCgpPT5wLnNjYWxlKHkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKTtyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+cC5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwKLi4ubF07dmFyIG09eT0+TWF0aC5wb3coeS54LXIueCwyKStNYXRoLnBvdyh5Lnktci55LDIpLG49Xy5taW4oay5tYXAobSkpLHE9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO2s9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP18uc29ydEJ5KGsseT0+cSh5LmRhdHVtLC0xLHkuZGF0YXNldCkpOiJkZXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSkucmV2ZXJzZSgpOiJuZWFyZXN0Ij09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoayxtKTprLnNsaWNlKDApLnJldmVyc2UoKTt2YXIgdT10aGlzLHc9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXcuc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGwseT0+eS50aXRsZSk7CkEuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCh5PT55LnRpdGxlKS5ub2RlcygpO0EuZXhpdCgpLnJlbW92ZSgpO2s9dy5zZWxlY3QoInRib2R5Iikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoayx5PT55LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKTtrLmNsYXNzZWQoImRpc3RhbnQiLHk9Pnt2YXIgeD15LmRhdGFzZXQuZGF0YSgpWzBdLEM9Xy5sYXN0KHkuZGF0YXNldC5kYXRhKCkpO3g9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoeCwwLHkuZGF0YXNldCkpO0M9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoQywwLHkuZGF0YXNldCkpO3k9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3kuZGF0dW0uc21vb3RoZWQ6dGhpcy55VmFsdWVBY2Nlc3Nvcih5LmRhdHVtLDAseS5kYXRhc2V0KTtyZXR1cm4gci54PHh8fHIueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9Pm0oeSk9PT1uKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcywKbCx5KX0pLm9yZGVyKCk7ay5leGl0KCkucmVtb3ZlKCk7ay5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkubm9kZXMoKTt0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKX1lbHNlIHRoaXMudG9vbHRpcC5oaWRlKCl9ZHJhd1Rvb2x0aXBSb3coayxyLGwpe2NvbnN0IHA9dGhpcztrPWQzLnNlbGVjdChrKS5zZWxlY3RBbGwoInRkIikuZGF0YShyKTtrLmVhY2goZnVuY3Rpb24obSl7bS5zdGF0aWN8fHAuZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChwLHRoaXMsbSxsKX0pO2suZXhpdCgpLnJlbW92ZSgpO2suZW50ZXIoKS5hcHBlbmQoInRkIikuZWFjaChmdW5jdGlvbihtKXttLmVudGVyJiZtLmVudGVyLmNhbGwodGhpcyxsKTtwLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwocCx0aGlzLG0sbCl9KX1kcmF3VG9vbHRpcENvbHVtbihrLHIsbCl7Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ7CnIuZXZhbFR5cGU9PWQuRE9NP3IuZXZhbHVhdGUuY2FsbChrLGwse3Ntb290aGluZ0VuYWJsZWQ6cH0pOmQzLnNlbGVjdChrKS50ZXh0KHIuZXZhbHVhdGUuY2FsbChrLGwse3Ntb290aGluZ0VuYWJsZWQ6cH0pKX1maW5kQ2xvc2VzdFBvaW50KGsscil7Y29uc3QgbD1yLmRhdGEoKS5tYXAoKG4scSk9PnRoaXMueFNjYWxlLnNjYWxlKHRoaXMueEFjY2Vzc29yKG4scSxyKSkpO2xldCBwPV8uc29ydGVkSW5kZXgobCxrLngpO2lmKDA9PWwubGVuZ3RoKXJldHVybiBudWxsO3A9PT1sLmxlbmd0aD8tLXA6MCE9PXAmJihwPU1hdGguYWJzKGxbcC0xXS1rLngpPE1hdGguYWJzKGxbcF0tay54KT9wLTE6cCk7az1yLmRhdGEoKVtwXTtjb25zdCBtPXRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3IoayxwLHIpOnRoaXMueVZhbHVlQWNjZXNzb3IoayxwLHIpO3JldHVybnt4OmxbcF0seTp0aGlzLnlTY2FsZS5zY2FsZShtKSxkYXR1bTprLGRhdGFzZXQ6cn19cmVzbW9vdGhEYXRhc2V0KGspe2xldCByPQprLmRhdGEoKTtjb25zdCBsPXRoaXMuc21vb3RoaW5nV2VpZ2h0O2xldCBwPTA8ci5sZW5ndGg/MDpOYU4sbT0wO2NvbnN0IG49ci5tYXAoKHUsdyk9PnRoaXMueVZhbHVlQWNjZXNzb3IodSx3LGspKSxxPW4uZXZlcnkodT0+dT09blswXSk7ci5mb3JFYWNoKCh1LHcpPT57dz1uW3ddO3F8fCFOdW1iZXIuaXNGaW5pdGUodyk/dS5zbW9vdGhlZD13OihwPXAqbCsoMS1sKSp3LG0rKyx3PTEsMSE9PWwmJih3PTEtTWF0aC5wb3cobCxtKSksdS5zbW9vdGhlZD1wL3cpfSl9Z2V0RGF0YXNldChrKXt2b2lkIDA9PT10aGlzLm5hbWUyZGF0YXNldHNba10mJih0aGlzLm5hbWUyZGF0YXNldHNba109bmV3IFBsb3R0YWJsZS5EYXRhc2V0KFtdLHtuYW1lOmssbWV0YTpudWxsfSkpO3JldHVybiB0aGlzLm5hbWUyZGF0YXNldHNba119c3RhdGljIGdldFlTY2FsZUZyb21UeXBlKGspe2lmKGs9PT1mLkxPRylyZXR1cm4gbmV3IGIuTG9nU2NhbGU7aWYoaz09PWYuTElORUFSKXJldHVybiBuZXcgYi5MaW5lYXJTY2FsZTsKdGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCB5U2NhbGUgdHlwZSAiK2spO31zZXRWaXNpYmxlU2VyaWVzKGspe3RoaXMuZGlzYWJsZUNoYW5nZXMoKTtrPWsuc29ydCgpO2sucmV2ZXJzZSgpO3RoaXMuc2VyaWVzTmFtZXM9a31kaXNhYmxlQ2hhbmdlcygpe3RoaXMuZGlydHlEYXRhc2V0cy5zaXplfHwodGhpcy5saW5lUGxvdC5kYXRhc2V0cyhbXSksdGhpcy5zbW9vdGhMaW5lUGxvdCYmdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyhbXSksdGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyhbXSkpfWNvbW1pdENoYW5nZXMoKXt0aGlzLmRhdGFzZXRzPXRoaXMuc2VyaWVzTmFtZXMubWFwKGs9PnRoaXMuZ2V0RGF0YXNldChrKSk7Wy4uLnRoaXMuZGlydHlEYXRhc2V0c10uZm9yRWFjaChrPT57dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldCh0aGlzLmdldERhdGFzZXQoaykpfSk7dGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKTsKdGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKTt0aGlzLmRpcnR5RGF0YXNldHMuY2xlYXIoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoayl7Y29uc3Qgcj1rLmRhdGEoKTtpZigyMD49ci5sZW5ndGgpcmV0dXJuIGs7Y29uc3QgbD1NYXRoLmNlaWwoci5sZW5ndGgvMjApLHA9QXJyYXkoTWF0aC5mbG9vcihyLmxlbmd0aC9sKSk7Zm9yKGxldCBtPTAsbj0wO208cC5sZW5ndGg7bSsrLG4rPWwpcFttXT1yW25dO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQocCxrLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoayxyKXt0aGlzLmRpc2FibGVDaGFuZ2VzKCk7CnRoaXMuZ2V0RGF0YXNldChrKS5kYXRhKHIpO3RoaXMuZGlydHlEYXRhc2V0cy5hZGQoayl9c2V0U2VyaWVzTWV0YWRhdGEoayxyKXt0aGlzLmRpc2FibGVDaGFuZ2VzKCk7dGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKE9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKCkse21ldGE6cn0pKTt0aGlzLmRpcnR5RGF0YXNldHMuYWRkKGspfXNtb290aGluZ1VwZGF0ZShrKXt0aGlzLnNtb290aGluZ1dlaWdodD1rO3RoaXMuZGF0YXNldHMuZm9yRWFjaChyPT50aGlzLnJlc21vb3RoRGF0YXNldChyKSk7dGhpcy5zbW9vdGhpbmdFbmFibGVkfHwodGhpcy5saW5lUGxvdC5hZGRDbGFzcygiZ2hvc3QiKSx0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITAsdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJgp0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITEsdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpfXNldENvbG9yU2NhbGUoayl7dGhpcy5jb2xvclNjYWxlPWt9c2V0VG9vbHRpcENvbHVtbnMoayl7dGhpcy50b29sdGlwQ29sdW1ucz1rfXNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKGspe3RoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q9Cmt9cmVuZGVyVG8oayl7dGhpcy50YXJnZXRTVkc9azt0aGlzLm91dGVyLnJlbmRlclRvKGspO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTt0aGlzLm91dGVyLnJlZHJhdygpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pgp7dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IGs9dGhpcy5fbGFzdERyYXdCQm94LndpZHRoLHt3aWR0aDpyfT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09ayYmazxyJiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpO3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKX1vbkFuY2hvcihrKXtpZih0aGlzLm91dGVyKXRoaXMub3V0ZXIub25BbmNob3Ioayl9aXNEYXRhRml0VG9Eb21haW4oKXtmdW5jdGlvbiBrKHIpe2NvbnN0IGw9CnIuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyPXIuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQoKTtyZXR1cm4gclswXT09PWxbMF0mJnJbMV09PT1sWzFdfXJldHVybiBrKHRoaXMueEF4aXMuZ2V0U2NhbGUoKSkmJmsodGhpcy55QXhpcy5nZXRTY2FsZSgpKX19Yi5MaW5lQ2hhcnQ9aH0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi92ei1saW5lLWNoYXJ0Mi5qcwooZnVuY3Rpb24oYil7Y29uc3QgZD1zZi5tdWx0aXNjYWxlRm9ybWF0dGVyKHNmLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxmPWg9PmlzTmFOKGgpPyJOYU4iOmQoaCk7Yi5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpoPT5oLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlNtb290aGVkIixldmFsdWF0ZShoLGspe3JldHVybiBmKGsuc21vb3RoaW5nRW5hYmxlZD9oLmRhdHVtLnNtb290aGVkOmguZGF0dW0uc2NhbGFyKX19LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmg9PmYoaC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmg9PnNmLnN0ZXBGb3JtYXR0ZXIoaC5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIixldmFsdWF0ZTpoPT5zZi50aW1lRm9ybWF0dGVyKGguZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6aD0+c2YucmVsYXRpdmVGb3JtYXR0ZXIoc2YucmVsYXRpdmVBY2Nlc3NvcihoLmRhdHVtLAotMSxoLmRhdGFzZXQpKX1dO1BvbHltZXIoe2lzOiJ2ei1saW5lLWNoYXJ0MiIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sc3ltYm9sRnVuY3Rpb246T2JqZWN0LHNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNtb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6LjZ9LHhUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LHhBeGlzRm9ybWF0dGVyOk9iamVjdCx5VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pmg9Pmguc2NhbGFyfSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+Yi5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OU30sZmlsbEFyZWE6T2JqZWN0LApkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXkseVNjYWxlVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImxpbmVhciJ9LGlnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0b29sdGlwU29ydGluZ01ldGhvZDp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSx0b29sdGlwUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOnNnLlRvb2x0aXBQb3NpdGlvbi5CT1RUT019LF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfc2VyaWVzTWV0YWRhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6Il9tYWtlQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeFR5cGUsIHlWYWx1ZUFjY2Vzc29yLCB5U2NhbGVUeXBlLCBpc0F0dGFjaGVkKTtfY29sb3JTY2FsZUNoYW5nZWQoY29sb3JTY2FsZSk7X3Rvb2x0aXBDb2x1bW5zQ2hhbmdlZCh0b29sdGlwQ29sdW1ucyk7X3JlbG9hZEZyb21DYWNoZShfY2hhcnQsIF92aXNpYmxlU2VyaWVzQ2FjaGUpO19zbW9vdGhpbmdDaGFuZ2VkKHNtb290aGluZ0VuYWJsZWQsIHNtb290aGluZ1dlaWdodCwgX2NoYXJ0KTtfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkKHRvb2x0aXBTb3J0aW5nTWV0aG9kLCBfY2hhcnQpO19vdXRsaWVyc0NoYW5nZWQoaWdub3JlWU91dGxpZXJzLCBfY2hhcnQpIi5zcGxpdCgiOyIpLApyZWFkeSgpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LGF0dGFjaGVkKCl7Y29uc3QgaD17Y2FwdHVyZTohMCxwYXNzaXZlOiEwfTt0aGlzLl9saXN0ZW4odGhpcywibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bi5iaW5kKHRoaXMpLGgpO3RoaXMuX2xpc3Rlbih0aGlzLCJtb3VzZXVwIix0aGlzLl9vbk1vdXNlVXAuYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4od2luZG93LCJrZXlkb3duIix0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4od2luZG93LCJrZXl1cCIsdGhpcy5fb25LZXlVcC5iaW5kKHRoaXMpLGgpfSxkZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LmRlc3Ryb3koKSx0aGlzLl9jaGFydD12b2lkIDApO3RoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCh7bm9kZTpoLGV2ZW50TmFtZTprLApmdW5jOnIsb3B0aW9uOmx9KT0+e2gucmVtb3ZlRXZlbnRMaXN0ZW5lcihrLHIsbCl9KSx0aGlzLl9saXN0ZW5lcnMuY2xlYXIoKSl9LF9saXN0ZW4oaCxrLHIsbD17fSl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBTZXQpO3RoaXMuX2xpc3RlbmVycy5hZGQoe25vZGU6aCxldmVudE5hbWU6ayxmdW5jOnIsb3B0aW9uOmx9KTtoLmFkZEV2ZW50TGlzdGVuZXIoayxyLGwpfSxfb25LZXlEb3duKGgpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsYi5QYW5ab29tRHJhZ0xheWVyLmlzUGFuS2V5KGgpKX0sX29uS2V5VXAoaCl7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixiLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoaCkpfSxfb25Nb3VzZURvd24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCEwKX0sX29uTW91c2VVcCgpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITEpfSxpc0RhdGFGaXRUb0RvbWFpbigpe3JldHVybiB0aGlzLl9jaGFydD8KdGhpcy5fY2hhcnQuaXNEYXRhRml0VG9Eb21haW4oKTohMH0sc2V0VmlzaWJsZVNlcmllczpmdW5jdGlvbihoKXtfLmlzRXF1YWwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLGgpfHwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWgpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGgsayl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2hdPWs7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoaCxrKX0sc2V0U2VyaWVzTWV0YWRhdGEoaCxrKXt0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdPWs7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKGgsayl9LGNvbW1pdENoYW5nZXMoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuY29tbWl0Q2hhbmdlcygpfSxyZXNldERvbWFpbjpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZXNldERvbWFpbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVkcmF3KCl9LApfbWFrZUNoYXJ0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDt2YXIgaD10aGlzLnhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q7dGhpcy54VHlwZXx8aD90aGlzLnhUeXBlJiYoaD0oKT0+c2YuZ2V0WENvbXBvbmVudHModGhpcy54VHlwZSkpOmg9c2Yuc3RlcFg7aWYoaCYmdGhpcy55VmFsdWVBY2Nlc3NvciYmdGhpcy50b29sdGlwQ29sdW1ucyl7aD1uZXcgYi5MaW5lQ2hhcnQoaCx0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlVHlwZSx0aGlzLmNvbG9yU2NhbGUsdGhpcy4kLnRvb2x0aXAsdGhpcy50b29sdGlwQ29sdW1ucywKdGhpcy5maWxsQXJlYSx0aGlzLmRlZmF1bHRYUmFuZ2UsdGhpcy5kZWZhdWx0WVJhbmdlLHRoaXMuc3ltYm9sRnVuY3Rpb24sdGhpcy54QXhpc0Zvcm1hdHRlcik7dmFyIGs9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7aC5yZW5kZXJUbyhrKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2NoYXJ0PWg7dGhpcy5fY2hhcnQub25BbmNob3IoKCk9PnRoaXMuZmlyZSgiY2hhcnQtYXR0YWNoZWQiKSl9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXXx8W10pfSksdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZpbHRlcihoPT50aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKS5mb3JFYWNoKGg9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF0pfSksCnRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSx0aGlzLl9jaGFydC5jb21taXRDaGFuZ2VzKCkpfSxfc21vb3RoaW5nQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX0sX291dGxpZXJzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5pZ25vcmVZT3V0bGllcnModGhpcy5pZ25vcmVZT3V0bGllcnMpfSxfY29sb3JTY2FsZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldENvbG9yU2NhbGUodGhpcy5jb2xvclNjYWxlKSx0aGlzLl9jaGFydC5yZWRyYXcoKSl9LF90b29sdGlwQ29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcENvbHVtbnModGhpcy50b29sdGlwQ29sdW1ucyl9LApfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QpfSxnZXRFeHBvcnRlcigpe3JldHVybiBuZXcgYi5MaW5lQ2hhcnRFeHBvcnRlcih0aGlzLiQuY2hhcnRkaXYpfX0pfSkodWd8fCh1Zz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCJ9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LWV4cG9ydGVyLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oayl7ay5HUk9VUD0iRyI7ay5ESVY9IkRJViI7ay5TVkc9IlNWRyI7ay5URVhUPSJURVhUIn0pKGR8fChkPXt9KSk7Y2xhc3MgZntjb25zdHJ1Y3RvcihrKXt0aGlzLnVuaXF1ZUlkPTA7dGhpcy5yb290PWt9ZXhwb3J0QXNTdHJpbmcoKXtjb25zdCBrPXRoaXMuY29udmVydCh0aGlzLnJvb3QpO2lmKCFrKXJldHVybiIiO2NvbnN0IHI9dGhpcy5jcmVhdGVSb290U3ZnKCk7ci5hcHBlbmRDaGlsZChrKTtyZXR1cm4gci5vdXRlckhUTUx9Y3JlYXRlVW5pcXVlSWQoKXtyZXR1cm5gJHsiY2xpcCJ9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIikscj10aGlzLmdldFNpemUoKTtrLnNldEF0dHJpYnV0ZU5TKCJzdmciLCJ2aWV3Qm94IixgMCAwICR7ci53aWR0aH0gJHtyLmhlaWdodH1gKTsKay5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKTtyZXR1cm4ga31jb252ZXJ0KGspe2xldCByPW51bGw7dmFyIGw9ay5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGsubm9kZVR5cGUhPU5vZGUuRUxFTUVOVF9OT0RFfHxsIT1kLkRJViYmbCE9ZC5TVkcpcj1rLmNsb25lTm9kZSgpO2Vsc2V7cj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGQuR1JPVVApO3ZhciBwPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGspLG09cGFyc2VJbnQocC5sZWZ0LDEwKSxuPXBhcnNlSW50KHAudG9wLDEwKTtpZihtfHxuKWw9dGhpcy5jcmVhdGVVbmlxdWVJZCgpLHIuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHttfSwgJHtufSlgKSxyLnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIixgdXJsKCMke2x9KWApLG49cGFyc2VJbnQocC5oZWlnaHQsMTApLG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpLG0uc2V0QXR0cmlidXRlKCJ3aWR0aCIsClN0cmluZyhwYXJzZUludChwLndpZHRoLDEwKSkpLG0uc2V0QXR0cmlidXRlKCJoZWlnaHQiLFN0cmluZyhuKSkscD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoInN2ZyIsImNsaXBQYXRoIikscC5pZD1sLHAuYXBwZW5kQ2hpbGQobSksci5hcHBlbmRDaGlsZChwKX1BcnJheS5mcm9tKGsuY2hpbGROb2RlcykubWFwKHE9PnRoaXMuY29udmVydChxKSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2gocT0+ci5hcHBlbmRDaGlsZChxKSk7cmV0dXJuIHIubm9kZU5hbWUudG9VcHBlckNhc2UoKT09ZC5HUk9VUCYmIXIuaGFzQ2hpbGROb2RlcygpfHx0aGlzLnNob3VsZE9taXROb2RlKGspP251bGw6dGhpcy5zdHJpcENsYXNzKHRoaXMudHJhbnNmZXJTdHlsZShrLHIpKX1zdHJpcENsYXNzKGspe2subm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZrLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtyZXR1cm4ga310cmFuc2ZlclN0eWxlKGsscil7aWYoci5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHI7CmNvbnN0IGw9ci5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2s9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayk7bD09ZC5URVhUJiZPYmplY3QuYXNzaWduKHIuc3R5bGUse2ZvbnRGYW1pbHk6ay5mb250RmFtaWx5LGZvbnRTaXplOmsuZm9udFNpemUsZm9udFdlaWdodDprLmZvbnRXZWlnaHR9KTtsIT1kLkdST1VQJiYoci5zZXRBdHRyaWJ1dGUoImZpbGwiLGsuZmlsbCksci5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsay5zdHJva2UpLHIuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLGsuc3Ryb2tlV2lkdGgpKTsiMSIhPWsub3BhY2l0eSYmci5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLGsub3BhY2l0eSk7cmV0dXJuIHJ9c2hvdWxkT21pdE5vZGUoKXtyZXR1cm4hMX19Yi5QbG90dGFibGVFeHBvcnRlcj1mO2NsYXNzIGggZXh0ZW5kcyBme3Nob3VsZE9taXROb2RlKGspe3JldHVybiBrLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERT9rLmNsYXNzTGlzdC5jb250YWlucygic2NhdHRlci1wbG90Iik6CiExfX1iLkxpbmVDaGFydEV4cG9ydGVyPWh9KSh1Z3x8KHVnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj1bXSxkPWZ1bmN0aW9uKCl7cmV0dXJuIF8udGhyb3R0bGUoZnVuY3Rpb24gaCgpe2lmKDAhPWIubGVuZ3RoKXt2YXIgaz1iLnNoaWZ0KCk7ay5hY3RpdmUmJihrLnJlZHJhdygpLGsuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExKTt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoMCk7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShoKX19LDEwMCl9KCk7UG9seW1lcih7aXM6InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiLHByb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0sZGF0YVNlcmllczpBcnJheSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsbG9nU2NhbGVBY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvZ1NjYWxlQ2hhbmdlZCJ9LHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6T2JqZWN0LHhUeXBlOlN0cmluZyx5VmFsdWVBY2Nlc3NvcjpPYmplY3QsZmlsbEFyZWE6T2JqZWN0LApzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0b29sdGlwQ29sdW1uczpBcnJheSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsdG9vbHRpcFBvc2l0aW9uOlN0cmluZyxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXksc3ltYm9sRnVuY3Rpb246T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnRkLnJ1bnNDb2xvclNjYWxlfSl9LF9yZXNldERvbWFpbk9uTmV4dExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOltjZC5EYXRhTG9hZGVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9kYXRhU2VyaWVzQ2hhbmdlZChkYXRhU2VyaWVzLiopIiwiX2xvYWRLZXlDaGFuZ2VkKGxvYWRLZXkpIl0sb25Mb2FkRmluaXNoKCl7MDwKdGhpcy5kYXRhVG9Mb2FkLmxlbmd0aCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuJC5jaGFydC5yZXNldERvbWFpbigpKTt0aGlzLnJlZHJhdygpfSxkZXRhY2hlZCgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZil9LGV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuJC5jaGFydC5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9LHJlc2V0RG9tYWluKCl7dGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCl9LHNldFNlcmllc0RhdGEoZixoKXt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShmLGgpfSxzZXRTZXJpZXNNZXRhZGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShmLGgpfSxjb21taXRDaGFuZ2VzKCl7dGhpcy4kLmNoYXJ0LmNvbW1pdENoYW5nZXMoKX0scmVkcmF3KCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9CndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmFjdGl2ZT90aGlzLiQuY2hhcnQucmVkcmF3KCk6dGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITB9KX0sX2xvYWRLZXlDaGFuZ2VkKCl7dGhpcy5yZXNldCgpO3RoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZD0hMH0sX2RhdGFTZXJpZXNDaGFuZ2VkKCl7dGhpcy4kLmNoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5kYXRhU2VyaWVzKX0sX2xvZ1NjYWxlQ2hhbmdlZChmKXt0aGlzLiQuY2hhcnQueVNjYWxlVHlwZT1mPyJsb2ciOiJsaW5lYXIiO3RoaXMucmVkcmF3KCl9LF9maXhCYWRTdGF0ZVdoZW5BY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUmJihiLnB1c2godGhpcyksZCgpKX0sX29uQ2hhcnRBdHRhY2hlZCgpe3RoaXMuYWN0aXZlfHwodGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITApfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZS9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSIscHJvcGVydGllczp7ZGlhbG9nRWxlbWVudDp7dHlwZTpPYmplY3R9fSxnZXQgc2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5zY3JvbGxhYmxlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpO3RoaXMuY2xhc3NMaXN0LmFkZCgibm8tcGFkZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpO3JlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlLmJpbmQodGhpcykpfSx1cGRhdGVTY3JvbGxTdGF0ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ2xhc3MoImlzLXNjcm9sbGVkIiwwPHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCk7dGhpcy50b2dnbGVDbGFzcygiY2FuLXNjcm9sbCIsdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0PHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCk7dGhpcy50b2dnbGVDbGFzcygic2Nyb2xsZWQtdG8tYm90dG9tIiwKdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wK3RoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodD49dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KX0sX2Vuc3VyZVRhcmdldDpmdW5jdGlvbigpeyh0aGlzLmRpYWxvZ0VsZW1lbnQ9dGhpcy5kaWFsb2dFbGVtZW50fHx0aGlzLnBhcmVudEVsZW1lbnQpJiZ0aGlzLmRpYWxvZ0VsZW1lbnQuYmVoYXZpb3JzJiYwPD10aGlzLmRpYWxvZ0VsZW1lbnQuYmVoYXZpb3JzLmluZGV4T2YoUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbCk/KHRoaXMuZGlhbG9nRWxlbWVudC5zaXppbmdUYXJnZXQ9dGhpcy5zY3JvbGxUYXJnZXQsdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgiZml0IikpOnRoaXMuZGlhbG9nRWxlbWVudCYmdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LmFkZCgiZml0Iil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWFya2Rvd24tdmlldy90Zi1tYXJrZG93bi12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLW1hcmtkb3duLXZpZXciLHByb3BlcnRpZXM6e2h0bWw6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sYXR0YWNoZWQoKXt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLm1hcmtkb3duLCEwKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhcmQtaGVhZGluZy90Zi1jYXJkLWhlYWRpbmcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY2FyZC1oZWFkaW5nIixwcm9wZXJ0aWVzOntkaXNwbGF5TmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGFnOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxydW46e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlc2NyaXB0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3J1bkJhY2tncm91bmQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9uYW1lTGFiZWw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZU5hbWVMYWJlbChkaXNwbGF5TmFtZSwgdGFnKSJ9LF90YWdMYWJlbDp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfY29tcHV0ZVRhZ0xhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn19LF91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfSxfY29tcHV0ZVJ1bkJhY2tncm91bmQoYil7cmV0dXJuIGJ8fCJub25lIn0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gSGgucGlja1RleHRDb2xvcihiKX0sX2NvbXB1dGVOYW1lTGFiZWwoYixkKXtyZXR1cm4gYnx8ZHx8IiJ9LF9jb21wdXRlVGFnTGFiZWwoYixkKXtyZXR1cm4gZCYmZCE9PWI/ZDoiIn0sX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nKGIpe3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy5wb3NpdGlvblRhcmdldD1iLnRhcmdldDt0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2cudG9nZ2xlKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kb3dubG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRvd25sb2FkZXIiLHByb3BlcnRpZXM6e19ydW46e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxydW5zOkFycmF5LHRhZzpTdHJpbmcsdXJsRm46RnVuY3Rpb259LF9jc3ZVcmwoYixkLGYpe3JldHVybiBkP2RjLmFkZFBhcmFtcyhmKGIsZCkse2Zvcm1hdDoiY3N2In0pOiIifSxfanNvblVybChiLGQsZil7cmV0dXJuIGQ/ZihiLGQpOiIifSxfY3N2TmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5jc3ZgOiIifSxfanNvbk5hbWUoYixkKXtyZXR1cm4gZD9gcnVuLSR7ZH0tdGFnLSR7Yn0uanNvbmA6IiJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zY2FsYXItY2FyZCIscHJvcGVydGllczp7dGFnOlN0cmluZyxkYXRhVG9Mb2FkOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6Qm9vbGVhbixpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25MaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2xvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2Y9Zi5tYXAoaz0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmtbMF0pLHN0ZXA6a1sxXSxzY2FsYXI6a1syXX0pKTtjb25zdCBoPXRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oZCk7Yi5zZXRTZXJpZXNNZXRhZGF0YShoLGQpO2Iuc2V0U2VyaWVzRGF0YShoLApmKTtiLmNvbW1pdENoYW5nZXMoKX19LHJlYWRPbmx5OiEwfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybih7dGFnOmIscnVuOmR9KT0+ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmIscnVuOmR9KSl9fSxfZG93bmxvYWRVcmxGbjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQpPT50aGlzLmdldERhdGFMb2FkVXJsKHt0YWc6YixydW46ZH0pfX0scmVxdWVzdERhdGE6RnVuY3Rpb24sX2dldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGIpfX0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksCnZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYj11Zy5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUy5zbGljZSgpLGQ9Yi5maW5kSW5kZXgoZj0+Ik5hbWUiPT1mLnRpdGxlKTtiLnNwbGljZShkLDEse3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmPT57Zj1mLmRhdGFzZXQubWV0YWRhdGEoKS5tZXRhO3JldHVybiB0aGlzLl9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bShmKX19KTtyZXR1cm4gYn19fSxyZWxvYWQoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTsKYiYmYi5yZXNldERvbWFpbigpfSxfdXBkYXRlRG93bmxvYWRMaW5rKCl7Y29uc3QgYj10aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLiQkKCIjc3ZnTGluayIpLmhyZWY9YGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtidG9hKGIpfWB9LF9ydW5zRnJvbURhdGEoYil7cmV0dXJuIGIubWFwKGQ9PmQucnVuKX0sX2dldERhdGFTZXJpZXMoKXtyZXR1cm4gdGhpcy5kYXRhVG9Mb2FkLm1hcChiPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGIpKX0sX2dldFNlcmllc05hbWVGcm9tRGF0dW0oe3J1bjpiLGV4cGVyaW1lbnQ6ZD17bmFtZToiX2RlZmF1bHQifX0pe3JldHVybiBKU09OLnN0cmluZ2lmeShbZC5uYW1lLGJdKX0sX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGIpe3JldHVybiBiLnJ1bn0sX2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6CntzY2FsZTpiPT57WyxiXT1KU09OLnBhcnNlKGIpO3JldHVybiB0ZC5ydW5zQ29sb3JTY2FsZShiKX19fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXByb2dyZXNzL3BhcGVyLXByb2dyZXNzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWNvbmRhcnlSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdG9nZ2xlSW5kZXRlcm1pbmF0ZSJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIn19LG9ic2VydmVyczpbIl9wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkiXSxob3N0QXR0cmlidXRlczp7cm9sZToicHJvZ3Jlc3NiYXIifSxfdG9nZ2xlSW5kZXRlcm1pbmF0ZTpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZUNsYXNzKCJpbmRldGVybWluYXRlIiwKYix0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS50cmFuc2Zvcm09Yi5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2QvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxiKX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbihiLGQsZixoLGspe2I9dGhpcy5fY2xhbXBWYWx1ZShiKTtkPXRoaXMuX2NsYW1wVmFsdWUoZCk7dmFyIHI9MTAwKnRoaXMuX2NhbGNSYXRpbyhiKSxsPTEwMCp0aGlzLl9jYWxjUmF0aW8oZCk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8ocik7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLHIpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz1iO2s/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKToKdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixmKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zbGlkZXIvcGFwZXItc2xpZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNsaWRlciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yLFBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NuYXBzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwaW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZCJ9LGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltbWVkaWF0ZVZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sbWF4TWFya2Vyczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGV4cGFuZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfSwKaWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24oYixkLGYpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGIpO3RoaXMuX3Bvc2l0aW9uS25vYigxMDAqdGhpcy5fY2FsY1JhdGlvKGIpKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgidmFsdWUtY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZHJhZ2dpbmc/CnRoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpO3RoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihiKSkpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpO3RoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSI7dGhpcy5kcmFnZ2luZyYmCih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKmIvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpO3N3aXRjaChiLmRldGFpbC5zdGF0ZSl7Y2FzZSAic3RhcnQiOnRoaXMuX3RyYWNrU3RhcnQoYik7YnJlYWs7Y2FzZSAidHJhY2siOnRoaXMuX3RyYWNrWChiKTticmVhaztjYXNlICJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt0aGlzLl9rbm9ic3RhcnR4PXRoaXMuX3N0YXJ0eD10aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDA7dGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4O3RoaXMuX21heHg9CnRoaXMuX3ctdGhpcy5fc3RhcnR4O3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7dGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKGIpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQoYik7dGhpcy5feD10aGlzLl9zdGFydHgrTWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LGIuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odGhpcy5feC90aGlzLl93KjEwMCkpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSp0aGlzLl93LXRoaXMuX2tub2JzdGFydHgrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwp0aGlzLl9zZXREcmFnZ2luZyghMSk7dGhpcy5fcmVzZXRLbm9iKCk7dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlO2IudHJhbnNmb3JtPWIud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2tub2Jkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2V4cGFuZEtub2IoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFydHJhY2s6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dCYXJFdmVudChiKSYmdGhpcy5fb25UcmFjayhiKX0sX2JhcmNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt2YXIgZD10aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9KGIuZGV0YWlsLngtZC5sZWZ0KS90aGlzLl93KjEwMDt0aGlzLl9pc1JUTCYmKGQ9MTAwLWQpO3ZhciBmPXRoaXMucmF0aW87dGhpcy5fc2V0VHJhbnNpdGluZyghMCk7dGhpcy5fcG9zaXRpb25Lbm9iKGQpOwpmPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSk7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0pO2IucHJldmVudERlZmF1bHQoKTt0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayhiKSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24oYixkLGYsaCl7aHx8dGhpcy5fc2V0TWFya2VycyhbXSk7ZD1NYXRoLnJvdW5kKChmLWQpL3RoaXMuc3RlcCk7ZD5iJiYoZD1iKTtpZigwPmR8fCFpc0Zpbml0ZShkKSlkPTA7dGhpcy5fc2V0TWFya2VycyhBcnJheShkKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24oYil7cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gYltkXX0pLmpvaW4oIiAiKX0sCl9nZXRDbGFzc05hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7ZGlzYWJsZWQ6dGhpcy5kaXNhYmxlZCxwaW46dGhpcy5waW4sc25hcHM6dGhpcy5zbmFwcyxyaW5nOnRoaXMuaW1tZWRpYXRlVmFsdWU8PXRoaXMubWluLGV4cGFuZDp0aGlzLmV4cGFuZCxkcmFnZ2luZzp0aGlzLmRyYWdnaW5nLHRyYW5zaXRpbmc6dGhpcy50cmFuc2l0aW5nLGVkaXRhYmxlOnRoaXMuZWRpdGFibGV9KX0sX2FsbG93QmFyRXZlbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMuaWdub3JlQmFyVG91Y2h8fGIuZGV0YWlsLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudH0sZ2V0IF9pc1JUTCgpe3ZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7cmV0dXJuIHRoaXMuX19pc1JUTH0sX2xlZnRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5faW5jcmVtZW50S2V5KGIpOgp0aGlzLl9kZWNyZW1lbnRLZXkoYil9LF9yaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkoYik6dGhpcy5faW5jcmVtZW50S2V5KGIpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PWIuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yi50YXJnZXQudmFsdWU7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKGIpe2Iuc3RvcFByb3BhZ2F0aW9uKCl9LApfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj1iKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNtb290aGluZy1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zbW9vdGhpbmctaW5wdXQiLHByb3BlcnRpZXM6e3N0ZXA6TnVtYmVyLG1heDpOdW1iZXIsbWluOk51bWJlcix3ZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42LG5vdGlmeTohMH0sX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkIn19LF91cGRhdGVXZWlnaHQ6Xy5kZWJvdW5jZShmdW5jdGlvbihiKXt0aGlzLndlaWdodD1ifSwyNTApLF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKTsKdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkOmZ1bmN0aW9uKCl7MD4rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0P3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMCI6MTwrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0JiYodGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIxIik7dmFyIGI9K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDtpc05hTihiKXx8dGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7cmVsb2FkT25SZWFkeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfc2hvd0Rvd25sb2FkTGlua3M6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6YmQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0sX3Ntb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOmJkLmdldE51bWJlckluaXRpYWxpemVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9LF9zbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChfc21vb3RoaW5nV2VpZ2h0KSJ9LF9pZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6YmQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSxfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOnNmLlhUeXBlLlNURVB9LF9zZWxlY3RlZFJ1bnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9nZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PmIudGFnfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgZGMuUmVxdWVzdE1hbmFnZXIoNTApfX0sYmVoYXZpb3JzOltjZC5BcnJheVVwZGF0ZUhlbHBlcl0sCm9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6YmQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksX3Ntb290aGluZ1dlaWdodE9ic2VydmVyOmJkLmdldE51bWJlck9ic2VydmVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyOmJkLmdldEJvb2xlYW5PYnNlcnZlcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoYil7cmV0dXJuIDA8Yn0sX2dldENhdGVnb3J5S2V5KGIpe3JldHVybiBiLm1ldGFkYXRhLnR5cGU9PWtjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUz8KIiI6Yi5uYW1lfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVhZHkoKXt0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDaGFydHMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9ZGMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+CntiLnJlbG9hZCgpfSl9LF91cGRhdGVDYXRlZ29yaWVzKGIsZCxmKXtiPV8ubWFwVmFsdWVzKGIsaD0+T2JqZWN0LmtleXMoaCkpO2Q9a2MuY2F0ZWdvcml6ZVRhZ3MoYixkLGYpO2QuZm9yRWFjaChoPT57aC5pdGVtcz1oLml0ZW1zLm1hcChrPT4oe3RhZzprLnRhZyxzZXJpZXM6ay5ydW5zLm1hcChyPT4oe3J1bjpyLHRhZzprLnRhZ30pKX0pKX0pO3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfY2F0ZWdvcmllcyIsZCx0aGlzLl9nZXRDYXRlZ29yeUtleSl9LF90YWdNZXRhZGF0YShiLGQsZil7Y29uc3QgaD1mLnRhZyxrPXt9O2Yuc2VyaWVzLmZvckVhY2goKHtydW46cH0pPT57a1twXT1kW3BdW2hdfSk7Zj1oLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0IHtkZXNjcmlwdGlvbjpyLGRpc3BsYXlOYW1lOmx9PXJmLmFnZ3JlZ2F0ZVRhZ0luZm8oayxmKTtiLm1ldGFkYXRhLnR5cGU9PWtjLkNhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAmJmwuc3RhcnRzV2l0aChiLm5hbWUrCiIvIikmJihsPWwuc2xpY2UoYi5uYW1lLmxlbmd0aCsxKSk7cmV0dXJue2Rlc2NyaXB0aW9uOnIsZGlzcGxheU5hbWU6bH19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sdGl0bGU6U3RyaW5nLG1hcmdpbkNoYXJ0U2VyaWVzOkFycmF5LGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bmxvYWRMaW5rczpCb29sZWFuLHRhZ01ldGFkYXRhOk9iamVjdCx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm5ldyBJaC5EYXRhU2VyaWVzQ29sb3JTY2FsZSh7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKG1hcmdpbkNoYXJ0U2VyaWVzKSJ9LF90YWdGaWx0ZXJJbnZhbGlkOkJvb2xlYW4sX25hbWVUb0RhdGFTZXJpZXM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+KHt9KX0sX3Nlcmllc05hbWVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXJpZXNOYW1lcyhfbmFtZVRvRGF0YVNlcmllcywgcnVucykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9Pntjb25zdCBkPXRoaXMuX3RhZ0ZpbHRlcjtyZXR1cm4gZGMuYWRkUGFyYW1zKGRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIikse3RhZzpkLHJ1bjpifSl9fX0sX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX21hdGNoZXNMaXN0T3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF90aXRsZURpc3BsYXlTdHJpbmc6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyh0aXRsZSkifSwKX2ZpbGxBcmVhOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTp7bG93ZXJBY2Nlc3NvcjpiPT5iLmxvd2VyLGhpZ2hlckFjY2Vzc29yOmI9PmIudXBwZXJ9fSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBiPXNmLm11bHRpc2NhbGVGb3JtYXR0ZXIoc2YuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGQ9Zj0+aXNOYU4oZik/Ik5hTiI6YihmKTtyZXR1cm5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmPT5mLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0uc2NhbGFyKX0se3RpdGxlOiJMb3dlciBNYXJnaW4iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5sb3dlcil9LHt0aXRsZToiVXBwZXIgTWFyZ2luIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0udXBwZXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmY9PnNmLnN0ZXBGb3JtYXR0ZXIoZi5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIiwKZXZhbHVhdGU6Zj0+c2YudGltZUZvcm1hdHRlcihmLmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOmY9PnNmLnJlbGF0aXZlRm9ybWF0dGVyKHNmLnJlbGF0aXZlQWNjZXNzb3IoZi5kYXR1bSwtMSxmLmRhdGFzZXQpKX1dfX0sX21pc3NpbmdUYWdzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcHNNaXNtYXRjaDpPYmplY3R9LG9ic2VydmVyczpbIl91cGRhdGVDaGFydChfbmFtZVRvRGF0YVNlcmllcykiLCJfcmVmcmVzaERhdGFTZXJpZXMoX3RhZ0ZpbHRlcikiXSxyZWxvYWQoKXt0aGlzLiQubG9hZGVyLnJlbG9hZCgpfSxyZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLAohdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJC5sb2FkZXI7YiYmYi5yZXNldERvbWFpbigpfSxfY3N2VXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gZGMuYWRkUGFyYW1zKGIse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIGRjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6Impzb24ifSl9LF9kb3dubG9hZERhdGFVcmwoYixkKXtiPWJbZF07Yj17dGFnOmIuZ2V0VGFnKCkscnVuOmIuZ2V0UnVuKCl9O3JldHVybiBkYy5hZGRQYXJhbXMoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2Rvd25sb2FkX2RhdGEiKSxiKX0sX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oYil7cmV0dXJuKGQsZixoKT0+e2lmKGgucmVnZXhfdmFsaWQpe3ZhciBrPV8uY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyksCnI9W107Xy5mb3JFYWNoKGIsbD0+e3ZhciBwPSExLG09aC50YWdfdG9fZXZlbnRzW2wudmFsdWVdO2NvbnN0IG49aC50YWdfdG9fZXZlbnRzW2wubG93ZXJdLHE9aC50YWdfdG9fZXZlbnRzW2wudXBwZXJdO18uaXNVbmRlZmluZWQobSkmJihyLnB1c2gobC52YWx1ZSkscD0hMCk7Xy5pc1VuZGVmaW5lZChuKSYmKHIucHVzaChsLmxvd2VyKSxwPSEwKTtfLmlzVW5kZWZpbmVkKHEpJiYoci5wdXNoKGwudXBwZXIpLHA9ITApO2lmKCFwKXt2YXIgdT15PT55WzFdO2lmKHA9dGhpcy5fZmluZFN0ZXBNaXNtYXRjaChsLG0ubWFwKHUpLG4ubWFwKHUpLHEubWFwKHUpKSl0aGlzLnNldCgiX3N0ZXBzTWlzbWF0Y2giLHApO2Vsc2V7dmFyIHc9eT0+eVsyXTtwPW0ubWFwKCh5LHgpPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqeVswXSksc3RlcDp1KHkpLHNjYWxhcjp3KHkpLGxvd2VyOncoblt4XSksdXBwZXI6dyhxW3hdKX0pKTttPUloLmdlbmVyYXRlRGF0YVNlcmllc05hbWUoZixsLnZhbHVlKTsKdmFyIEE9a1ttXTtBP0Euc2V0RGF0YShwKToobD10aGlzLl9jcmVhdGVOZXdEYXRhU2VyaWVzKGYsbC52YWx1ZSxtLHApLGtbbV09bCl9fX0pO3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsayk7ZD1fLmZpbmRJbmRleCh0aGlzLl9taXNzaW5nVGFncyxsPT5sLnJ1bj09PWYpO2lmKHIubGVuZ3RoJiYzIT1yLmxlbmd0aCl7Y29uc3QgbD17cnVuOmYsdGFnczpyfTswPD1kP3RoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGQsMSxsKTp0aGlzLnB1c2goIl9taXNzaW5nVGFncyIsbCl9ZWxzZSAwPD1kJiZ0aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixkLDEpfWVsc2UgdGhpcy5zZXQoIl90YWdGaWx0ZXJJbnZhbGlkIiwhMCl9fSxfZmluZFN0ZXBNaXNtYXRjaChiLGQsZixoKXtyZXR1cm4gXy5pc0VxdWFsKGYsZCkmJl8uaXNFcXVhbChoLGQpP251bGw6e3Nlcmllc09iamVjdDpiLHZhbHVlU3RlcHM6ZCxsb3dlclN0ZXBzOmYsdXBwZXJTdGVwczpofX0sX2NyZWF0ZU5ld0RhdGFTZXJpZXMoYiwKZCxmLGgpe3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdfD0wO2Q9bmV3IEloLkRhdGFTZXJpZXMoYixkLGYsaCxzZi5TWU1CT0xTX0xJU1RbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl1dKTt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl0rMSklc2YuU1lNQk9MU19MSVNULmxlbmd0aDtyZXR1cm4gZH0sX3VwZGF0ZUNoYXJ0KGIpe18uZm9yT3duKGIsZD0+e3RoaXMuJC5sb2FkZXIuc2V0U2VyaWVzRGF0YShkLmdldE5hbWUoKSxkLmdldERhdGEoKSl9KTt0aGlzLiQubG9hZGVyLmNvbW1pdENoYW5nZXMoKX0sX2NvbXB1dGVTZXJpZXNOYW1lcygpe2NvbnN0IGI9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKFssZF0pPT5iLmhhcyhkLnJ1bikpLm1hcCgoW2RdKT0+CmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sX3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9LF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW2JdLmdldFN5bWJvbCgpLm1ldGhvZCgpfSxfZGV0ZXJtaW5lU3ltYm9sKGIsZCl7cmV0dXJuIGJbZF0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfSxfY29tcHV0ZVRhZ0ZpbHRlcihiKXtyZXR1cm4gXy5mbGF0dGVuKGIubWFwKGQ9PltkLnZhbHVlLGQubG93ZXIsZC51cHBlcl0pKS5tYXAoZD0+IigiK3RoaXMuX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyhkKSsiKSIpLmpvaW4oInwiKX0sX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyhiKXtyZXR1cm4gYi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkXHgyNiIpfSxfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sCl90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9LF9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKGIpe3JldHVybiBifHwidW50aXRsZWQifSxfc2VwYXJhdGVXaXRoQ29tbWFzKGIpe3JldHVybiBiLmpvaW4oIiwgIil9LF90b2dnbGVNaXNzaW5nVGFnc0NvbGxhcHNpYmxlT3Blbigpe3RoaXMuc2V0KCJfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCIsIXRoaXMuX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQpfSxfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQoKXtjb25zdCBiPXRoaXMuJCQoIiNtYXRjaC1saXN0LXJlcGVhdCIpO2ImJnRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWF0Y2gtbGlzdC1lbnRyeSIpLmZvckVhY2goZD0+e2NvbnN0IGY9Yi5pdGVtRm9yRWxlbWVudChkKTtkLnN0eWxlLmNvbG9yPXRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsZil9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx4VHlwZTpTdHJpbmcsYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHRpdGxlOlN0cmluZyx0YWdSZWdleGVzOkFycmF5LGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bmxvYWRMaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm5ldyBJaC5EYXRhU2VyaWVzQ29sb3JTY2FsZSh7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKHRhZ1JlZ2V4ZXMpIn0sX25hbWVUb0RhdGFTZXJpZXM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+KHt9KX0sX3Nlcmllc05hbWVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXJpZXNOYW1lcyhfbmFtZVRvRGF0YVNlcmllcywgcnVucykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9Pntjb25zdCBkPXRoaXMuX3RhZ0ZpbHRlcjtyZXR1cm4gZGMuYWRkUGFyYW1zKGRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIikse3RhZzpkLHJ1bjpifSl9fX0sX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX21hdGNoZXNMaXN0T3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF90aXRsZURpc3BsYXlTdHJpbmc6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyh0aXRsZSkifX0sCm9ic2VydmVyczpbIl91cGRhdGVDaGFydChfbmFtZVRvRGF0YVNlcmllcykiLCJfcmVmcmVzaERhdGFTZXJpZXMoX3RhZ0ZpbHRlcikiXSxyZWxvYWQoKXt0aGlzLiQubG9hZGVyLnJlbG9hZCgpfSxyZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kLmxvYWRlcjtiJiZiLnJlc2V0RG9tYWluKCl9LF9jc3ZVcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiBkYy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJjc3YifSl9LF9qc29uVXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gZGMuYWRkUGFyYW1zKGIsCntmb3JtYXQ6Impzb24ifSl9LF9kb3dubG9hZERhdGFVcmwoYixkKXtiPWJbZF07Yj17dGFnOmIuZ2V0VGFnKCkscnVuOmIuZ2V0UnVuKCl9O3JldHVybiBkYy5hZGRQYXJhbXMoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2Rvd25sb2FkX2RhdGEiKSxiKX0sX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57aWYoZi5yZWdleF92YWxpZCl7Y29uc3QgaD1fLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpO18uZm9yT3duKGYudGFnX3RvX2V2ZW50cywoayxyKT0+e2NvbnN0IGw9ay5tYXAobT0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKm1bMF0pLHN0ZXA6bVsxXSxzY2FsYXI6bVsyXX0pKTtrPUloLmdlbmVyYXRlRGF0YVNlcmllc05hbWUoZCxyKTtjb25zdCBwPWhba107cD9wLnNldERhdGEobCk6KF8uaXNVbmRlZmluZWQodGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF0pJiYodGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF09CjApLHI9bmV3IEloLkRhdGFTZXJpZXMoZCxyLGssbCxzZi5TWU1CT0xTX0xJU1RbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF1dKSxoW2tdPXIsdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdKzEpJXNmLlNZTUJPTFNfTElTVC5sZW5ndGgpfSk7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIixoKX19fSxfdXBkYXRlQ2hhcnQoYil7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2QsZl0pPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKGQsZi5nZXREYXRhKCkpfSk7dGhpcy4kLmxvYWRlci5jb21taXRDaGFuZ2VzKCl9LF9jb21wdXRlU2VsZWN0ZWRSdW5zU2V0KGIpe2NvbnN0IGQ9e307Xy5mb3JFYWNoKGIsZj0+e2RbZl09MX0pO3JldHVybiBkfSxfY29tcHV0ZVNlcmllc05hbWVzKCl7Y29uc3QgYj1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoWywKZF0pPT5iLmhhcyhkLnJ1bikpLm1hcCgoW2RdKT0+ZCl9LF9kZXRlcm1pbmVDb2xvcihiLGQpe3JldHVybiBiLnNjYWxlKGQpfSxfcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX0sX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbYl0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9LF9kZXRlcm1pbmVTeW1ib2woYixkKXtyZXR1cm4gYltkXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9LF9jb21wdXRlVGFnRmlsdGVyKGIpe3JldHVybiAxPT09Yi5sZW5ndGg/YlswXTpiLm1hcChkPT4iKCIrZCsiKSIpLmpvaW4oInwiKX0sX2dldFRvZ2dsZU1hdGNoZXNJY29uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3RvZ2dsZU1hdGNoZXNPcGVuKCl7dGhpcy5zZXQoIl9tYXRjaGVzTGlzdE9wZW5lZCIsIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX0sX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcoYil7cmV0dXJuIGJ8fAoidW50aXRsZWQifSxfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQoKXtjb25zdCBiPXRoaXMuJCQoIiNtYXRjaC1saXN0LXJlcGVhdCIpO2ImJnRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWF0Y2gtbGlzdC1lbnRyeSIpLmZvckVhY2goZD0+e2NvbnN0IGY9Yi5pdGVtRm9yRWxlbWVudChkKTtkLnN0eWxlLmNvbG9yPXRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsZil9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyKDUwKX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3Nob3dEb3dubG9hZExpbmtzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOmJkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9LF9zbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChfc21vb3RoaW5nV2VpZ2h0KSJ9LF9zbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTpiZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3Ntb290aGluZ1dlaWdodCIsCntkZWZhdWx0VmFsdWU6LjZ9KSxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0sX2lnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOmJkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0sX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9sYXlvdXQ6T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9sYXlvdXQpIn0sX29wZW5lZENhdGVnb3JpZXM6e3R5cGU6T2JqZWN0fSxfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHJlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSwKcmVsb2FkKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpLGQ9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntmLmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhZi52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9LF9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT4Ke2YuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLGYudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpiZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6YmQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6YmQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfbWFrZUNhdGVnb3JpZXMoYil7aWYoIWIuY2F0ZWdvcnkpcmV0dXJuW107CmxldCBkPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChkPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiBiLmNhdGVnb3J5Lm1hcChmPT57ZCYmIWYuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXT0hMCk7cmV0dXJue25hbWU6Zi50aXRsZSxpdGVtczpmLmNoYXJ0LG1ldGFkYXRhOntvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2YudGl0bGVdfX19KX0sX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChiKXtiPWIudGFyZ2V0O2Iub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tiLmNhdGVnb3J5Lm5hbWVdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltYWdlLWRhc2hib2FyZC90Zi1pbWFnZS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaW1hZ2UtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxhY3R1YWxTaXplOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxicmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6LjV9LGNvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9pbWFnZUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLApub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSwKX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpIn0sX2lzSW1hZ2VMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIiwiX3VwZGF0ZUltYWdlVXJsKF9jdXJyZW50U3RlcCwgYnJpZ2h0bmVzc0FkanVzdG1lbnQsIGNvbnRyYXN0UGVyY2VudGFnZSkiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0ZC5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXAoYixkKXtyZXR1cm4gYltkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWUoYil7cmV0dXJuIGI/Yi5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lKGIpe3JldHVybiBiPwpIaC5mb3JtYXREYXRlKGIud2FsbF90aW1lKToiIn0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYil7cmV0dXJuIGIubGVuZ3RoLTF9LF9jb21wdXRlU2FtcGxlVGV4dChiKXtyZXR1cm5gJHtiKzF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sX2dldEFyaWFFeHBhbmRlZCgpe3JldHVybiB0aGlzLmFjdHVhbFNpemU/InRydWUiOiJmYWxzZSJ9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPWRjLmFkZFBhcmFtcyhkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2ltYWdlcyIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksCnRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7bGV0IGQ9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtkPWRjLmFkZFBhcmFtcyhkLHt0czpiLndhbGxfdGltZX0pO2QrPSJceDI2IitiLnF1ZXJ5O3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSxzdGVwOmIuc3RlcCx1cmw6ZH19LF91cGRhdGVJbWFnZVVybChiLGQsZil7aWYoYil7dmFyIGg9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2gub25sb2FkPWgub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpLGsuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGgpLAp0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMSkpfSkuYmluZCh0aGlzKTtoLnN0eWxlLmZpbHRlcj1gY29udHJhc3QoJHtmfSUpIGA7aC5zdHlsZS5maWx0ZXIrPWBicmlnaHRuZXNzKCR7ZH0pYDt0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMCk7aC5zcmM9Yi51cmx9fSxfaGFuZGxlVGFwKCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfSxfdG9Mb2NhbGVTdHJpbmcoYil7cmV0dXJuIGIudG9Mb2NhbGVTdHJpbmcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWRhc2hib2FyZCIscHJvcGVydGllczp7cmVsb2FkT25SZWFkeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfYWN0dWFsU2l6ZTpCb29sZWFuLF9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjEscmVhZE9ubHk6ITB9LF9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDAscmVhZE9ubHk6ITB9LF9icmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2NvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwfSxfdGFnRmlsdGVyOlN0cmluZyxfYnJpZ2h0bmVzc0lzRGVmYXVsdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoX2JyaWdodG5lc3NBZGp1c3RtZW50KSJ9LF9jb250cmFzdElzRGVmYXVsdDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChfY29udHJhc3RQZXJjZW50YWdlKSJ9LF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRJbWFnZXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Cl8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9ZGMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEltYWdlcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1pbWFnZS1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfcmVzZXRCcmlnaHRuZXNzKCl7dGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9dGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50fSxfcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSxfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoYil7cmV0dXJuIGI9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LApfY29tcHV0ZUNvbnRyYXN0SXNEZWZhdWx0KGIpe3JldHVybiBiPT09dGhpcy5fZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtmdW5jdGlvbiBoKHIpe2NvbnN0IGw9YltyLnJ1bl1bci50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UobCkubWFwKHA9Pk9iamVjdC5hc3NpZ24oe30scix7c2FtcGxlOnAsb2ZTYW1wbGVzOmx9KSl9Y29uc3Qgaz1fLm1hcFZhbHVlcyhiLHI9Pk9iamVjdC5rZXlzKHIpKTtyZXR1cm4ga2MuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhrLGQsZikubWFwKHI9Pk9iamVjdC5hc3NpZ24oe30scix7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHIuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsdG90YWxTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zdGVwSW5kZXg6TnVtYmVyLF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9jdXJyZW50RGF0dW06e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnREYXR1bShfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChfc3RlcHMpIn0sX3NhbXBsZVRleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVNhbXBsZVRleHQoc2FtcGxlKSJ9LF9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXModG90YWxTYW1wbGVzKSJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gdGQucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYil7cmV0dXJuISFiJiYwPGIubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYil7cmV0dXJuISFiJiYxPGIubGVuZ3RofSxfY29tcHV0ZU1heFN0ZXBJbmRleChiKXtyZXR1cm4gYi5sZW5ndGgtMX0sX2NvbXB1dGVDdXJyZW50RGF0dW0oYixkKXtyZXR1cm4gYltkXX0sX2NvbXB1dGVTYW1wbGVUZXh0KGIpe3JldHVybmAke2IrCjF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2F1ZGlvIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pKSxkPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntmLmNhbmNlbGxlZHx8KGY9Zi52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLHRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7dmFyIGQ9Cm5ldyBVUkxTZWFyY2hQYXJhbXMoYi5xdWVyeSk7ZC5hcHBlbmQoInRzIixiLndhbGxfdGltZSk7ZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvaW5kaXZpZHVhbEF1ZGlvIixkKTtyZXR1cm57d2FsbF90aW1lOkhoLmZvcm1hdERhdGUobmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSksc3RlcDpiLnN0ZXAsbGFiZWw6Yi5sYWJlbCxjb250ZW50VHlwZTpiLmNvbnRlbnRUeXBlLHVybDpkfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWRhc2hib2FyZCIscHJvcGVydGllczp7cmVsb2FkT25SZWFkeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkQXVkaW8oKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvdGFncyIpOwpyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj1kYy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZEF1ZGlvKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWF1ZGlvLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7ZnVuY3Rpb24gaChyKXtjb25zdCBsPWJbci5ydW5dW3IudGFnXS5zYW1wbGVzO3JldHVybiBfLnJhbmdlKGwpLm1hcChwPT5PYmplY3QuYXNzaWduKHt9LHIse3NhbXBsZTpwLHRvdGFsU2FtcGxlczpsfSkpfWNvbnN0IGs9Xy5tYXBWYWx1ZXMoYixyPT5PYmplY3Qua2V5cyhyKSk7CnJldHVybiBrYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAocj0+T2JqZWN0LmFzc2lnbih7fSxyLHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sci5pdGVtcy5tYXAoaCkpfSkpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYXV0b2dyb3ctdGV4dGFyZWEvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWF1dG9ncm93LXRleHRhcmVhIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlXSxwcm9wZXJ0aWVzOnt2YWx1ZTp7b2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQiLHR5cGU6U3RyaW5nLG5vdGlmeTohMH0sYmluZFZhbHVlOntvYnNlcnZlcjoiX2JpbmRWYWx1ZUNoYW5nZWQiLHR5cGU6U3RyaW5nLG5vdGlmeTohMH0scm93czp7dHlwZTpOdW1iZXIsdmFsdWU6MSxvYnNlcnZlcjoiX3VwZGF0ZUNhY2hlZCJ9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvZm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nfSxyZWFkb25seTp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW59LAptaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxsYWJlbDp7dHlwZTpTdHJpbmd9fSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCJ9LGdldCB0ZXh0YXJlYSgpe3JldHVybiB0aGlzLiQudGV4dGFyZWF9LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvblN0YXJ0KGIpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD1ifSxzZXQgc2VsZWN0aW9uRW5kKGIpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9Yn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OltvYV1kfGhvbmUpLykmJih0aGlzLiQudGV4dGFyZWEuc3R5bGUubWFyZ2luTGVmdD0iLTNweCIpfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJC50ZXh0YXJlYS52YWxpZGl0eS52YWxpZDsKYiYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy52YWx1ZT9iPSExOnRoaXMuaGFzVmFsaWRhdG9yKCkmJihiPVBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IudmFsaWRhdGUuY2FsbCh0aGlzLHRoaXMudmFsdWUpKSk7dGhpcy5pbnZhbGlkPSFiO3RoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpO3JldHVybiBifSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWJ9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy50ZXh0YXJlYTtkJiYoZC52YWx1ZSE9PWImJihkLnZhbHVlPWJ8fDA9PT1iP2I6IiIpLHRoaXMuYmluZFZhbHVlPWIsdGhpcy4kLm1pcnJvci5pbm5lckhUTUw9dGhpcy5fdmFsdWVGb3JNaXJyb3IoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnRoaXMuYmluZFZhbHVlfSkpfSxfb25JbnB1dDpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXRoO3RoaXMudmFsdWU9ZD9kWzBdLnZhbHVlOgpiLnRhcmdldC52YWx1ZX0sX2NvbnN0cmFpbjpmdW5jdGlvbihiKXtiPWJ8fFsiIl07Zm9yKGI9MDx0aGlzLm1heFJvd3MmJmIubGVuZ3RoPnRoaXMubWF4Um93cz9iLnNsaWNlKDAsdGhpcy5tYXhSb3dzKTpiLnNsaWNlKDApOzA8dGhpcy5yb3dzJiZiLmxlbmd0aDx0aGlzLnJvd3M7KWIucHVzaCgiIik7cmV0dXJuIGIuam9pbigiXHgzY2JyL1x4M2UiKSsiXHgyNiMxNjA7In0sX3ZhbHVlRm9yTWlycm9yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy50ZXh0YXJlYTtpZihiKXJldHVybiB0aGlzLnRva2Vucz1iJiZiLnZhbHVlP2IudmFsdWUucmVwbGFjZSgvJi9nbSwiXHgyNmFtcDsiKS5yZXBsYWNlKC8iL2dtLCJceDI2cXVvdDsiKS5yZXBsYWNlKC8nL2dtLCJceDI2IzM5OyIpLnJlcGxhY2UoLzwvZ20sIlx4MjZsdDsiKS5yZXBsYWNlKC8+L2dtLCJceDI2Z3Q7Iikuc3BsaXQoIlxuIik6WyIiXSx0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfSxfdXBkYXRlQ2FjaGVkOmZ1bmN0aW9uKCl7dGhpcy4kLm1pcnJvci5pbm5lckhUTUw9CnRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItdGV4dGFyZWEuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGV4dGFyZWEiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7X2FyaWFMYWJlbGxlZEJ5OntvYnNlcnZlcjoiX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZCIsdHlwZTpTdHJpbmd9LF9hcmlhRGVzY3JpYmVkQnk6e29ic2VydmVyOiJfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZCIsdHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZ30scm93czp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sbWF4Um93czp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LHNldCBzZWxlY3Rpb25TdGFydChiKXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9Yn0sZ2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kfSwKc2V0IHNlbGVjdGlvbkVuZChiKXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPWJ9LF9hcmlhTGFiZWxsZWRCeUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYil9LF9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixiKX0sZ2V0IF9mb2N1c2FibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnRleHRhcmVhfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvYXN0L3BhcGVyLXRvYXN0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9bnVsbDtQb2x5bWVyKHtpczoicGFwZXItdG9hc3QiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3csb2JzZXJ2ZXI6Il9vbkZpdEludG9DaGFuZ2VkIn0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToibGVmdCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsdmFsdWU6M0UzfSx0ZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbm9DYW5jZWxPbk91dHNpZGVDbGljazp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfX29uVHJhbnNpdGlvbkVuZCJ9LGdldCB2aXNpYmxlKCl7UG9seW1lci5CYXNlLl93YXJuKCJgdmlzaWJsZWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBvcGVuZWRgIGluc3RlYWQiKTsKcmV0dXJuIHRoaXMub3BlbmVkfSxnZXQgX2NhbkF1dG9DbG9zZSgpe3JldHVybiAwPHRoaXMuZHVyYXRpb24mJkluZmluaXR5IT09dGhpcy5kdXJhdGlvbn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2F1dG9DbG9zZT1udWxsO1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxzaG93OmZ1bmN0aW9uKGQpeyJzdHJpbmciPT10eXBlb2YgZCYmKGQ9e3RleHQ6ZH0pO2Zvcih2YXIgZiBpbiBkKTA9PT1mLmluZGV4T2YoIl8iKT9Qb2x5bWVyLkJhc2UuX3dhcm4oJ1RoZSBwcm9wZXJ0eSAiJytmKyciIGlzIHByaXZhdGUgYW5kIHdhcyBub3Qgc2V0LicpOmYgaW4gdGhpcz90aGlzW2ZdPWRbZl06UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZisnIiBpcyBub3QgdmFsaWQuJyk7dGhpcy5vcGVuKCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlKCl9LF9fb25UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKGQpe2QmJmQudGFyZ2V0PT09CnRoaXMmJiJvcGFjaXR5Ij09PWQucHJvcGVydHlOYW1lJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe251bGwhPT10aGlzLl9hdXRvQ2xvc2UmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2F1dG9DbG9zZSksdGhpcy5fYXV0b0Nsb3NlPW51bGwpO3RoaXMub3BlbmVkPyhiJiZiIT09dGhpcyYmYi5jbG9zZSgpLGI9dGhpcyx0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OnRoaXMudGV4dH0pLHRoaXMuX2NhbkF1dG9DbG9zZSYmKHRoaXMuX2F1dG9DbG9zZT10aGlzLmFzeW5jKHRoaXMuY2xvc2UsdGhpcy5kdXJhdGlvbikpKTpiPT09dGhpcyYmKGI9bnVsbCk7UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fb3BlbmVkQ2hhbmdlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInBhcGVyLXRvYXN0LW9wZW4iKX0sCl9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInBhcGVyLXRvYXN0LW9wZW4iKX0sX29uRml0SW50b0NoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5wb3NpdGlvblRhcmdldD1kfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b2dnbGUtYnV0dG9uL3BhcGVyLXRvZ2dsZS1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9nZ2xlLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsImFyaWEtcHJlc3NlZCI6ImZhbHNlIix0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnt9LGxpc3RlbmVyczp7dHJhY2s6Il9vbnRyYWNrIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe1BvbHltZXIuR2VzdHVyZXMuc2V0VG91Y2hBY3Rpb24odGhpcywicGFuLXkiKX0pfSxfb250cmFjazpmdW5jdGlvbihiKXtiPWIuZGV0YWlsOyJzdGFydCI9PT1iLnN0YXRlP3RoaXMuX3RyYWNrU3RhcnQoYik6InRyYWNrIj09PWIuc3RhdGU/dGhpcy5fdHJhY2tNb3ZlKGIpOiJlbmQiPT09Yi5zdGF0ZSYmdGhpcy5fdHJhY2tFbmQoYil9LF90cmFja1N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fd2lkdGg9dGhpcy4kLnRvZ2dsZUJhci5vZmZzZXRXaWR0aC8KMjt0aGlzLl90cmFja0NoZWNrZWQ9dGhpcy5jaGVja2VkO3RoaXMuJC50b2dnbGVCdXR0b24uY2xhc3NMaXN0LmFkZCgiZHJhZ2dpbmciKX0sX3RyYWNrTW92ZTpmdW5jdGlvbihiKXtiPWIuZHg7dGhpcy5feD1NYXRoLm1pbih0aGlzLl93aWR0aCxNYXRoLm1heCgwLHRoaXMuX3RyYWNrQ2hlY2tlZD90aGlzLl93aWR0aCtiOmIpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX3grInB4IiwwLDAsdGhpcy4kLnRvZ2dsZUJ1dHRvbik7dGhpcy5fdXNlckFjdGl2YXRlKHRoaXMuX3g+dGhpcy5fd2lkdGgvMil9LF90cmFja0VuZDpmdW5jdGlvbigpe3RoaXMuJC50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTt0aGlzLnRyYW5zZm9ybSgiIix0aGlzLiQudG9nZ2xlQnV0dG9uKX0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQudG9nZ2xlQnV0dG9uO3ZhciBiPVBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fY3JlYXRlUmlwcGxlKCk7CmIuaWQ9ImluayI7Yi5zZXRBdHRyaWJ1dGUoInJlY2VudGVycyIsIiIpO2IuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIiwidG9nZ2xlLWluayIpO3JldHVybiBifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLW1pbmltYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtbWluaW1hcCIsaW5pdDpmdW5jdGlvbihiLGQsZixoLGspe3JldHVybiBuZXcgdGYuc2NlbmUuTWluaW1hcChiLGQsZix0aGlzLGgsayl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtc2NlbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtc2NlbmUiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsbmFtZTpTdHJpbmcsY29sb3JCeTpTdHJpbmcsdHJhY2VJbnB1dHM6Qm9vbGVhbixfaGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U6Qm9vbGVhbixfaXNBdHRhY2hlZDpCb29sZWFuLF96b29tOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0saGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdCxfem9vbWVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIix2YWx1ZTohMX0sX3pvb21TdGFydENvb3Jkczp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3pvb21UcmFuc2Zvcm06e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9tYXhab29tRGlzdGFuY2VGb3JDbGljazp7dHlwZTpOdW1iZXIsCnZhbHVlOjIwfSx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9uLG1pbmltYXA6T2JqZWN0LF9ub2RlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9hbm5vdGF0aW9uR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9lZGdlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LG1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6OX0sbWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo2fSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Ont0eXBlOk51bWJlcix2YWx1ZToxMX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MTh9LHByb2dyZXNzOk9iamVjdCxub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCwKaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXJ9LG9ic2VydmVyczpbIl9jb2xvckJ5Q2hhbmdlZChjb2xvckJ5KSIsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkiLCJfYW5pbWF0ZUFuZEZpdChfaXNBdHRhY2hlZCwgcmVuZGVySGllcmFyY2h5KSIsIl91cGRhdGVIZWFsdGhQaWxscyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4KSIsIl91cGRhdGVJbnB1dFRyYWNlKHRyYWNlSW5wdXRzLCBzZWxlY3RlZE5vZGUpIl0sZ2V0Tm9kZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKX0saXNOb2RlRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZXhwYW5kZWR9LHNldE5vZGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9LHBhblRvTm9kZShiKXt0Zi5ncmFwaC5zY2VuZS5wYW5Ub05vZGUoYiwKdGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9LGdldEdyYXBoU3ZnUm9vdCgpe3JldHVybiB0aGlzLiQuc3ZnfSxnZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e307dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e307dGhpcy5fZWRnZUdyb3VwSW5kZXg9e307dGhpcy5fdXBkYXRlTGFiZWxzKCExKTtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0KCIjcm9vdCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3RmLmdyYXBoLnNjZW5lLm5vZGUucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKX0sX2J1aWxkOmZ1bmN0aW9uKGIpe3RoaXMudGVtcGxhdGVJbmRleD1iLmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGgubGF5b3V0LmxheW91dFNjZW5lKGIucm9vdCwKdGhpcyl9LmJpbmQodGhpcykpO3RmLmdyYXBoLnV0aWwudGltZSgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUuYnVpbGRHcm91cChkMy5zZWxlY3QodGhpcy4kLnJvb3QpLGIucm9vdCx0aGlzKTt0Zi5ncmFwaC5zY2VuZS5hZGRHcmFwaENsaWNrTGlzdGVuZXIodGhpcy4kLnN2Zyx0aGlzKTt0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcykpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFsdGhQaWxscyh0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4KTt0aGlzLm1pbmltYXAudXBkYXRlKCl9LmJpbmQodGhpcyksdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3pvb209ZDMuem9vbSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LQp0aGlzLl96b29tVHJhbnNmb3JtLngsMikrTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLnktdGhpcy5fem9vbVRyYW5zZm9ybS55LDIpKTx0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaz90aGlzLl9maXJlRW5hYmxlQ2xpY2soKTpzZXRUaW1lb3V0KHRoaXMuX2ZpcmVFbmFibGVDbGljay5iaW5kKHRoaXMpLDUwKSk7dGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGx9LmJpbmQodGhpcykpLm9uKCJ6b29tIixmdW5jdGlvbigpe3RoaXMuX3pvb21UcmFuc2Zvcm09ZDMuZXZlbnQudHJhbnNmb3JtO3RoaXMuX3pvb21TdGFydENvb3Jkc3x8KHRoaXMuX3pvb21TdGFydENvb3Jkcz10aGlzLl96b29tVHJhbnNmb3JtLHRoaXMuZmlyZSgiZGlzYWJsZS1jbGljayIpKTt0aGlzLl96b29tZWQ9ITA7ZDMuc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLGQzLmV2ZW50LnRyYW5zZm9ybSk7dGhpcy5taW5pbWFwLnpvb20oZDMuZXZlbnQudHJhbnNmb3JtKX0uYmluZCh0aGlzKSk7CmQzLnNlbGVjdCh0aGlzLiQuc3ZnKS5jYWxsKHRoaXMuX3pvb20pLm9uKCJkYmxjbGljay56b29tIixudWxsKTtkMy5zZWxlY3Qod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpO3RoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLm1pbmltYXAuc2l6ZSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMTt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fYnVpbGQoYil9LF9hbmltYXRlQW5kRml0OmZ1bmN0aW9uKGIpeyF0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSYmCmImJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LF91cGRhdGVMYWJlbHM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy4kJCgiLnRpdGxlIiksZj1kLnN0eWxlLGg9dGhpcy4kJCgiLmF1eFRpdGxlIiksaz1oLnN0eWxlLHI9dGhpcy4kJCgiLmZ1bmN0aW9uTGlicmFyeVRpdGxlIikuc3R5bGU7Y29uc3QgbD1kMy5zZWxlY3QodGhpcy4kLnN2Zyk7dmFyIHA9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuQ09SRSkubm9kZSgpO2lmKGImJnAmJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe2I9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGwuc2VsZWN0KCIuIisKdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCk7dmFyIG09cC5nZXRDVE0oKS5lO3A9Yj9iLmdldENUTSgpLmU6bnVsbDtmLmRpc3BsYXk9ImlubGluZSI7Zi5sZWZ0PW0rInB4IjtudWxsIT09cCYmcCE9PW0/KGsuZGlzcGxheT0iaW5saW5lIixwPU1hdGgubWF4KG0rZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxwKSxrLmxlZnQ9cCsicHgiKTprLmRpc3BsYXk9Im5vbmUiO2Q9KGQ9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpKT9kLmdldENUTSgpLmU6bnVsbDtudWxsIT09ZCYmZCE9PXA/KHIuZGlzcGxheT0iaW5saW5lIixkPU1hdGgubWF4KHAraC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxkKSxyLmxlZnQ9ZCsicHgiKToKci5kaXNwbGF5PSJub25lIn1lbHNlIGYuZGlzcGxheT0ibm9uZSIsay5kaXNwbGF5PSJub25lIixyLmRpc3BsYXk9Im5vbmUifSxfY29sb3JCeUNoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKF8uZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoYixkKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKX0pLHRoaXMubWluaW1hcC51cGRhdGUoKSl9LGZpdDpmdW5jdGlvbigpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwO3RmLmdyYXBoLnNjZW5lLmZpdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sZnVuY3Rpb24oKXt0aGlzLl96b29tZWQ9ITF9LmJpbmQodGhpcykpfSxpc05vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRoaXMuc2VsZWN0ZWROb2RlfSxpc05vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRoaXMuaGlnaGxpZ2h0ZWROb2RlfSxhZGRBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYiwKZCxmKXtiPWIubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfHx7fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtiXVtkLm5vZGUubmFtZV09Zn0sZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtiXX0scmVtb3ZlQW5ub3RhdGlvbkdyb3VwOmZ1bmN0aW9uKGIsZCl7ZGVsZXRlIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2Iubm9kZS5uYW1lXVtkLm5vZGUubmFtZV19LGFkZE5vZGVHcm91cDpmdW5jdGlvbihiLGQpe3RoaXMuX25vZGVHcm91cEluZGV4W2JdPWR9LGdldE5vZGVHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbYl19LHJlbW92ZU5vZGVHcm91cDpmdW5jdGlvbihiKXtkZWxldGUgdGhpcy5fbm9kZUdyb3VwSW5kZXhbYl19LGFkZEVkZ2VHcm91cDpmdW5jdGlvbihiLGQpe3RoaXMuX2VkZ2VHcm91cEluZGV4W2JdPQpkfSxnZXRFZGdlR3JvdXA6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2JdfSxfdXBkYXRlSGVhbHRoUGlsbHM6ZnVuY3Rpb24oYixkKXt0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxscyh0aGlzLiQuc3ZnLGIsZCl9LF91cGRhdGVOb2RlU3RhdGU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5nZXROb2RlKGIpLGY9dGhpcy5nZXROb2RlR3JvdXAoYik7ZiYmdGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGYsZCx0aGlzKTtkLm5vZGUudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24mJiFkLmlzTGlicmFyeUZ1bmN0aW9uJiYoZj1kMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lXHgzZCInKyh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKwpkLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSx0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpKTtfLmVhY2godGhpcy5nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYiksaD0+e3RmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShoLGQsdGhpcyx0Zi5ncmFwaC5zY2VuZS5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpfSl9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiE9PWQmJihkJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZCksYikpe3RoaXMubWluaW1hcC51cGRhdGUoKTtkPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKGIpO2Zvcih2YXIgZj1bXTtudWxsIT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5uYW1lIT10Zi5ncmFwaC5ST09UX05BTUU7KWQ9ZC5wYXJlbnROb2RlLGYucHVzaChkLm5hbWUpO3ZhciBoO18uZm9yRWFjaFJpZ2h0KGYsaz0+e3RoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGspOwprPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoayk7ay5ub2RlLmlzR3JvdXBOb2RlJiYhay5leHBhbmRlZCYmKGsuZXhwYW5kZWQ9ITAsaHx8KGg9aykpfSk7aCYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKGgpLHRoaXMuX3pvb21lZD0hMCk7YiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnBhblRvTm9kZShiKX0sdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfX0sX2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtiIT09ZCYmKGImJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShiKSxkJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZCkpfSxfb25ab29tQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0sX2ZpcmVFbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9LF91cGRhdGVJbnB1dFRyYWNlOmZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUubm9kZS51cGRhdGVJbnB1dFRyYWNlKHRoaXMuZ2V0R3JhcGhTdmdSb290KCksCnRoaXMucmVuZGVySGllcmFyY2h5LHRoaXMuc2VsZWN0ZWROb2RlLHRoaXMudHJhY2VJbnB1dHMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZ3JhcGhDaGFuZ2VkIn0sYmFzaWNHcmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LGRldmljZXNGb3JTdGF0czpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx0aXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkRWRnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfbGFzdFNlbGVjdGVkRWRnZUdyb3VwOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sdHJhY2VJbnB1dHM6Qm9vbGVhbiwKbm9kZUNvbnRleHRNZW51SXRlbXM6QXJyYXksX3JlbmRlckRlcHRoOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfYWxsb3dHcmFwaFNlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixlZGdlV2lkdGhGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGhhbmRsZU5vZGVTZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGVkZ2VMYWJlbEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlRWRnZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn19LG9ic2VydmVyczpbIl9zdGF0c0NoYW5nZWQoc3RhdHMsIGRldmljZXNGb3JTdGF0cykiLCJfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoZ3JhcGhIaWVyYXJjaHksIGVkZ2VXaWR0aEZ1bmN0aW9uLCBoYW5kbGVOb2RlU2VsZWN0ZWQsIGVkZ2VMYWJlbEZ1bmN0aW9uLCBoYW5kbGVFZGdlU2VsZWN0ZWQpIiwiX3NlbGVjdGVkTm9kZUNoYW5nZWQoc2VsZWN0ZWROb2RlKSIsCiJfc2VsZWN0ZWRFZGdlQ2hhbmdlZChzZWxlY3RlZEVkZ2UpIl0scGFuVG9Ob2RlKGIpe3RoaXMuJCQoInRmLWdyYXBoLXNjZW5lIikucGFuVG9Ob2RlKGIpfSxfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoYil7YiYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkoYil9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYoYiYmZCYmKHRmLmdyYXBoLmpvaW5TdGF0c0luZm9XaXRoR3JhcGgodGhpcy5iYXNpY0dyYXBoLGIsZCksdGYuZ3JhcGguaGllcmFyY2h5LmpvaW5BbmRBZ2dyZWdhdGVTdGF0cyh0aGlzLmdyYXBoSGllcmFyY2h5KSksdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSkpfSxfYnVpbGRSZW5kZXJIaWVyYXJjaHk6ZnVuY3Rpb24oYil7dGYuZ3JhcGgudXRpbC50aW1lKCJuZXcgdGYuZ3JhcGgucmVuZGVyLkhpZXJhcmNoeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKGgpe3JldHVybnttaW5WYWx1ZTpoLmRvbWFpbigpWzBdLAptYXhWYWx1ZTpoLmRvbWFpbigpWzFdLHN0YXJ0Q29sb3I6aC5yYW5nZSgpWzBdLGVuZENvbG9yOmgucmFuZ2UoKVsxXX19aWYoYi5yb290LnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBKXt2YXIgZj1uZXcgdGYuZ3JhcGgucmVuZGVyLlJlbmRlckdyYXBoSW5mbyhiLCEhdGhpcy5zdGF0cyk7Zi5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uO2YuZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbjt0aGlzLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6ZChmLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTpkKGYubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOl8ubWFwKGYuZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oaCl7cmV0dXJue2RldmljZTpoLGNvbG9yOmYuZGV2aWNlQ29sb3JNYXAoaCl9fSkseGxhX2NsdXN0ZXI6Xy5tYXAoZi54bGFDbHVzdGVyQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oaCl7cmV0dXJue3hsYV9jbHVzdGVyOmgsCmNvbG9yOmYueGxhQ2x1c3RlckNvbG9yTWFwKGgpfX0pfSk7dGhpcy5fc2V0UmVuZGVySGllcmFyY2h5KGYpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoInJlbmRlcmVkIil9KX19LmJpbmQodGhpcykpfSxfZ2V0VmlzaWJsZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKGIpOmJ9LGxpc3RlbmVyczp7ImdyYXBoLXNlbGVjdCI6Il9ncmFwaFNlbGVjdGVkIiwiZGlzYWJsZS1jbGljayI6Il9kaXNhYmxlQ2xpY2siLCJlbmFibGUtY2xpY2siOiJfZW5hYmxlQ2xpY2siLCJub2RlLXRvZ2dsZS1leHBhbmQiOiJfbm9kZVRvZ2dsZUV4cGFuZCIsIm5vZGUtc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsIm5vZGUtaGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsIm5vZGUtdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQiLCJub2RlLXRvZ2dsZS1leHRyYWN0IjoiX25vZGVUb2dnbGVFeHRyYWN0IiwKIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIjoiX25vZGVUb2dnbGVTZXJpZXNHcm91cCIsImVkZ2Utc2VsZWN0IjoiX2VkZ2VTZWxlY3RlZCIsImFubm90YXRpb24tc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsImFubm90YXRpb24taGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsImFubm90YXRpb24tdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQifSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuZml0KCl9LF9ncmFwaENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImdyYXBoLXNlbGVjdCIpfSxfZ3JhcGhTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgic2VsZWN0ZWROb2RlIixudWxsKSx0aGlzLnNldCgic2VsZWN0ZWRFZGdlIixudWxsKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2Rpc2FibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITF9LF9lbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9CiEwfSxfc2VsZWN0ZWROb2RlQ2hhbmdlZChiKXt0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCYmdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQoYil9LF9zZWxlY3RlZEVkZ2VDaGFuZ2VkKGIpe3RoaXMuX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCk7YiYmKHRoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITApLHRoaXMuX3VwZGF0ZU1hcmtlck9mU2VsZWN0ZWRFZGdlKGIpKTt0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCYmdGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQoYil9LF9ub2RlU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmdGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5kZXRhaWwubmFtZSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2VkZ2VTZWxlY3RlZChiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLGIuZGV0YWlsLmVkZ2VHcm91cCksCnRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLGIuZGV0YWlsLmVkZ2VEYXRhKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX25vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihiKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixiLmRldGFpbC5uYW1lKX0sX25vZGVVbmhpZ2hsaWdodGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsbnVsbCl9LF9ub2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKGIpe3RoaXMuX25vZGVTZWxlY3RlZChiKTtiPWIuZGV0YWlsLm5hbWU7dmFyIGQ9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtkLm5vZGUudHlwZSE9PXRmLmdyYXBoLk5vZGVUeXBlLk9QJiYodGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoYiksZC5leHBhbmRlZD0hZC5leHBhbmRlZCx0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy4kLnNjZW5lLnNldE5vZGVFeHBhbmRlZChkKX0sNzUpKX0sX25vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApub2RlVG9nZ2xlRXh0cmFjdDpmdW5jdGlvbihiKXtiPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoYik7Yi5ub2RlLmluY2x1ZGU9Yi5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU6Yi5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU6dGhpcy5yZW5kZXJIaWVyYXJjaHkuaXNOb2RlQXV4aWxpYXJ5KGIpP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSl9LF9ub2RlVG9nZ2xlU2VyaWVzR3JvdXA6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LG5vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0Zi5ncmFwaC50b2dnbGVOb2RlU2VyaWVzR3JvdXAodGhpcy5oaWVyYXJjaHlQYXJhbXMuc2VyaWVzTWFwLApiKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3RmLmdyYXBoLmhpZXJhcmNoeS5idWlsZCh0aGlzLmJhc2ljR3JhcGgsdGhpcy5oaWVyYXJjaHlQYXJhbXMsdGYuZ3JhcGgudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcih0Zi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksMTAwLCJOYW1lc3BhY2UgaGllcmFyY2h5IikpLnRoZW4oZnVuY3Rpb24oZCl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5IixkKTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9LF9kZXNlbGVjdFByZXZpb3VzRWRnZSgpe2QzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCkuY2xhc3NlZCh0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVELCExKS5lYWNoKGI9PntpZihiLmxhYmVsKXtjb25zdCBkPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKTtiLmxhYmVsLnN0YXJ0TWFya2VySWQmJgpkLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7Yi5sYWJlbC5zdGFydE1hcmtlcklkfSlgKTtiLmxhYmVsLmVuZE1hcmtlcklkJiZkLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke2IubGFiZWwuZW5kTWFya2VySWR9KWApfX0pfSxfdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYil7aWYoYi5sYWJlbCl7dmFyIGQ9Yi5sYWJlbC5zdGFydE1hcmtlcklkfHxiLmxhYmVsLmVuZE1hcmtlcklkO2lmKGQpe2NvbnN0IGY9ZC5yZXBsYWNlKCJkYXRhZmxvdy0iLCJzZWxlY3RlZC0iKTtsZXQgaD10aGlzLiQkKCIjIitmKTtofHwoZD10aGlzLiQuc2NlbmUucXVlcnlTZWxlY3RvcigiIyIrZCksaD1kLmNsb25lTm9kZSghMCksaC5zZXRBdHRyaWJ1dGUoImlkIixmKSxoLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkLWFycm93aGVhZCIpLGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChoKSk7Yj1iLmxhYmVsLnN0YXJ0TWFya2VySWQ/Im1hcmtlci1zdGFydCI6Im1hcmtlci1lbmQiO3RoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKS5zdHlsZShiLApgdXJsKCMke2Z9KWApfX19LG5vdDpmdW5jdGlvbihiKXtyZXR1cm4hYn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyIscHJvcGVydGllczp7Y29udGludWVOdW06e3R5cGU6TnVtYmVyLHZhbHVlOjV9LHNlc3Npb25SdW5HbzpGdW5jdGlvbix0ZW5zb3JDb25kaXRpb25HbzpGdW5jdGlvbixmb3JjZUNvbnRpbnVhdGlvblN0b3A6RnVuY3Rpb24sX2NvbnRpbnVlQnV0dG9uVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIn0sX2NvbnRpbnVlQnV0dG9uQ29udGludWVUZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ29udGludWUuLi4iLHJlYWRvbmx5OiEwfSxfY29udGludWVCdXR0b25TdG9wVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IlN0b3AgQ29udGludWF0aW9uIixyZWFkb25seTohMH0sX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uOlN0cmluZyxfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxfaXNSZWZWYWx1ZUlucHV0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAsCm5vdGlmeTohMH19LG9ic2VydmVyczpbIl9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pIl0sbm90aWZ5Q29udGludWF0aW9uU3RvcCgpe3RoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCExKX0sX29wZW5EaWFsb2coKXt0aGlzLiQuY29udGludWVEaWFsb2cub3BlbigpfSxfY2xvc2VEaWFsb2coKXt0aGlzLiQuY29udGludWVEaWFsb2cuY2xvc2UoKX0sX2NvbnRpbnVlQnV0dG9uQ2FsbGJhY2soKXt0aGlzLl9jb250aW51ZUJ1dHRvblRleHQ9PT10aGlzLl9jb250aW51ZUJ1dHRvblN0b3BUZXh0P3RoaXMuZm9yY2VDb250aW51YXRpb25TdG9wKCk6dGhpcy5fb3BlbkRpYWxvZygpfSx1cGRhdGVDb250aW51ZUJ1dHRvblRleHQoYil7dGhpcy5zZXQoIl9jb250aW51ZUJ1dHRvblRleHQiLGI/dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dDp0aGlzLl9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dCl9LF9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjaygpezA8CnRoaXMuY29udGludWVOdW0/KHRoaXMuc2Vzc2lvblJ1bkdvKHRoaXMuY29udGludWVOdW0pLHRoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKSx0aGlzLl9jbG9zZURpYWxvZygpKTp0aGlzLnNldCgiY29udGludWVOdW0iLDEpfSxfdGVuc29yQ29udGludWVHb0J1dHRvbkNhbGxiYWNrKCl7aWYobnVsbCE9dGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pe3ZhciBiPUtoLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleSh0aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbik7bnVsbD09YiYmY29uc29sZS5lcnJvcigiSW52YWxpZCBUZW5zb3IgQ29uZGl0aW9uIG5hbWU6Iit0aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbik7dmFyIGQ9TnVtYmVyKHRoaXMuX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlKTtOdW1iZXIuaXNGaW5pdGUoZCk/KHRoaXMudGVuc29yQ29uZGl0aW9uR28oYixkKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6CnRoaXMuc2V0KCJfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWUiLDApfX0sX29uU2VsZWN0ZWRUZW5zb3JDb25kaXRpb25DaGFuZ2VkKGIpe2I9S2gudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5KGIpO3RoaXMuc2V0KCJfaXNSZWZWYWx1ZUlucHV0SGlkZGVuIiwtMSE9PVsiSU5GX09SX05BTiIsIklORiIsIk5BTiJdLmluZGV4T2YoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZyIscHJvcGVydGllczp7X3RpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY3VzdG9tTWVzc2FnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2hhc0N1c3RvbU1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKF9jdXN0b21NZXNzYWdlKSJ9LF9ob3N0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29wZW46e3R5cGU6Qm9vbGVhbn0sX2hpZGRlbjp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhpZGRlbihfb3BlbikiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LG9wZW5EaWFsb2coYixkKXt0aGlzLnNldCgiX3RpdGxlIiwiRGVidWdnZXIgaXMgd2FpdGluZyBmb3IgU2Vzc2lvbi5ydW4oKSBjb25uZWN0aW9ucy4uLiIpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsbnVsbCk7dGhpcy4kLmRpYWxvZy5vcGVuKCk7Cm51bGwhPWImJm51bGwhPWQmJih0aGlzLnNldCgiX2hvc3QiLGIpLHRoaXMuc2V0KCJfcG9ydCIsZCkpfSxjbG9zZURpYWxvZygpe3RoaXMuJC5kaWFsb2cuY2xvc2UoKX0sb3BlbkRpc2FibGVkRGlhbG9nKCl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIG5vdCBlbmFibGVkIGluIHRoaXMgVGVuc29yQm9hcmQgaW5zdGFuY2UiKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLCJUbyBlbmFibGUgdGhlIGRlYnVnZ2VyIGluIFRlbnNvckJvYXJkLCB1c2UgdGhlIGZsYWc6IC0tZGVidWdnZXJfcG9ydCBceDNjcG9ydF9udW1iZXJceDNlIik7dGhpcy4kLmRpYWxvZy5vcGVuKCl9LF9jb21wdXRlSGlkZGVuKGIpe3JldHVybiFifSxfY29tcHV0ZUhhc0N1c3RvbU1lc3NhZ2UoYil7cmV0dXJuIV8uaXNFbXB0eShiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItcmVzaXplci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1yZXNpemVyIixwcm9wZXJ0aWVzOntjdXJyZW50TGVuZ3RoOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LG1pbkxlbmd0aDpOdW1iZXIsbWF4TGVuZ3RoOk51bWJlcixpc0hvcml6b250YWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yZXNpemVySWRlbnRpZmllcjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2lzVmVydGljYWw6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1ZlcnRpY2FsKGlzSG9yaXpvbnRhbCkiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH0sX2RyYWdTdGFydFBvc2l0aW9uOk51bWJlcixfZHJhZ1N0YXJ0TGVuZ3RoOk51bWJlcixfcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjazpPYmplY3QsX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrOk9iamVjdH0sbGlzdGVuZXJzOnttb3VzZWRvd246Il9oYW5kbGVNb3VzZURvd24ifSwKX2hhbmRsZU1vdXNlRG93bihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZW5kRHJhZygpO3RoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s9ZD0+e2QucHJldmVudERlZmF1bHQoKTtkPXRoaXMuX2RyYWdTdGFydExlbmd0aCsodGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoZCktdGhpcy5fZHJhZ1N0YXJ0UG9zaXRpb24pO2Q9TWF0aC5tYXgoZCx0aGlzLm1pbkxlbmd0aCk7ZD1NYXRoLm1pbihkLHRoaXMubWF4TGVuZ3RoKTt0aGlzLnNldCgiY3VycmVudExlbmd0aCIsZCl9O3RoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrPWQ9PntkLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZW5kRHJhZygpfTt0aGlzLnNldCgiX2RyYWdTdGFydFBvc2l0aW9uIix0aGlzLl9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChiKSk7dGhpcy5zZXQoIl9kcmFnU3RhcnRMZW5ndGgiLHRoaXMuY3VycmVudExlbmd0aCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLAp0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSl9LF9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChiKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWw/Yi5jbGllbnRZOmIuY2xpZW50WH0sX2VuZERyYWcoKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrLCExKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrLCExKTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1udWxsfSxfY29tcHV0ZUlzVmVydGljYWwoYil7cmV0dXJuIWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3NlbGVjdGlvbi10cmVlLW5vZGUuanMKKGZ1bmN0aW9uKGIpe2IuTk9ERV9OQU1FX1NFUEFSQVRPUj0iLyI7Yi5ERVZJQ0VfTkFNRV9QQVRURVJOPS9eXC9qb2I6W0EtWmEtejAtOV9dK1wvcmVwbGljYTpbMC05X10rXC90YXNrOlswLTldK1wvZGV2aWNlOltBLVphLXowLTlfXSs6WzAtOV0rLztsZXQgZDsoZnVuY3Rpb24oayl7a1trLkVNUFRZPTBdPSJFTVBUWSI7a1trLkNIRUNLRUQ9MV09IkNIRUNLRUQiO2tbay5QQVJUSUFMPTJdPSJQQVJUSUFMIn0pKGQ9Yi5DaGVja2JveFN0YXRlfHwoYi5DaGVja2JveFN0YXRlPXt9KSk7Yi5zcGxpdE5vZGVOYW1lPWZ1bmN0aW9uKGspe2xldCByPVtdO2NvbnN0IGw9ay5tYXRjaChiLkRFVklDRV9OQU1FX1BBVFRFUk4pO251bGwhPWwmJihyLnB1c2gobFswXSksIi8iIT09a1tsWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGspLGs9ay5zbGljZShsWzBdLmxlbmd0aCsxKSk7cmV0dXJuIHIuY29uY2F0KGsuc3BsaXQoYi5OT0RFX05BTUVfU0VQQVJBVE9SKSl9OwpiLmdldENsZWFuTm9kZU5hbWU9ZnVuY3Rpb24oayl7bGV0IHI9aztjb25zdCBsPWsubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1sPyhyLmxlbmd0aD5sWzBdLmxlbmd0aCYmIi8iIT1yW2xbMF0ubGVuZ3RoXSYmY29uc29sZS5lcnJvcignTm8gc2xhc2ggKCIvIikgYWZ0ZXIgZGV2aWNlIG5hbWUgaW4gbm9kZSBuYW1lOicsaykscj1yLnNsaWNlKGxbMF0ubGVuZ3RoKzEpKToiLyI9PT1yWzBdJiYocj1yLnNsaWNlKDEpKTtyLmluZGV4T2YoIikiKT09PXIubGVuZ3RoLTEmJihyPXIuc2xpY2UoMCxyLmluZGV4T2YoIi8oIikpKTtyZXR1cm4gcn07Yi5zb3J0QW5kQmFzZUV4cGFuZERlYnVnV2F0Y2hlcz1mdW5jdGlvbihrKXtrLnNvcnQoKGwscCk9Pmwubm9kZV9uYW1lPHAubm9kZV9uYW1lPy0xOmwubm9kZV9uYW1lPnAubm9kZV9uYW1lPzE6bC5vdXRwdXRfc2xvdC1wLm91dHB1dF9zbG90KTtmb3IobGV0IGw9MDtsPGsubGVuZ3RoOysrbCl7dmFyIHI9a1tsXS5ub2RlX25hbWUrCiIvIjtsZXQgcD0hMTtmb3IobGV0IG09bCsxO208ay5sZW5ndGg7KyttKWlmKDA9PT1rW21dLm5vZGVfbmFtZS5pbmRleE9mKHIpKXtwPSEwO2JyZWFrfXAmJihyPWtbbF0ubm9kZV9uYW1lLnNwbGl0KCIvIiksa1tsXS5ub2RlX25hbWUrPSIvKCIrcltyLmxlbmd0aC0xXSsiKSIpfX07Yi5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb249ZnVuY3Rpb24oayl7cmV0dXJuIGsuZW5kc1dpdGgoIikiKT9rLnNsaWNlKDAsay5sYXN0SW5kZXhPZigiLygiKSk6a307Yi5hc3NlbWJsZURldmljZUFuZE5vZGVOYW1lcz1mdW5jdGlvbihrKXtjb25zdCByPVtudWxsLG51bGxdO2lmKGtbMF0ubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKSl7bGV0IGw9a1swXTsiLyI9PT1sW2wubGVuZ3RoLTFdJiYobD1sLnNsaWNlKDAsbC5sZW5ndGgtMSkpO3JbMF09bDtyWzFdPWsuc2xpY2UoMSkuam9pbigiLyIpfWVsc2UgclsxXT1rLmpvaW4oIi8iKTtyZXR1cm4gcn07bGV0IGY7KGZ1bmN0aW9uKGspe2tbay5Ob2RlTmFtZT0KMF09Ik5vZGVOYW1lIjtrW2suT3BUeXBlPTFdPSJPcFR5cGUifSkoZj1iLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlfHwoYi5EZWJ1Z1dhdGNoRmlsdGVyTW9kZT17fSkpO2IuZmlsdGVyRGVidWdXYXRjaGVzPWZ1bmN0aW9uKGsscixsKXtpZihyPT09Zi5Ob2RlTmFtZSlyZXR1cm4gay5maWx0ZXIocD0+cC5ub2RlX25hbWUubWF0Y2gobCkpO2lmKHI9PT1mLk9wVHlwZSlyZXR1cm4gay5maWx0ZXIocD0+cC5vcF90eXBlLm1hdGNoKGwpKX07Y2xhc3MgaHtjb25zdHJ1Y3RvcihrLHIsbCxwKXt0aGlzLmRlYnVnV2F0Y2hDaGFuZ2U9cjt0aGlzLmRlYnVnV2F0Y2g9cDt0aGlzLm5hbWU9azt0aGlzLmRlYnVnV2F0Y2g9cDt0aGlzLmNoZWNrYm94U3RhdGU9ZC5FTVBUWTt0aGlzLnBhcmVudD1sO3RoaXMuY2hpbGRyZW49e307dGhpcy5jaGVja2JveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1jaGVja2JveCIpO3RoaXMuY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwoKT0+Cnt0aGlzLl9oYW5kbGVDaGFuZ2UoKX0sITEpfV9oYW5kbGVDaGFuZ2UoKXtpZih0aGlzLmF2b2lkUHJvcGFnYXRpb24pdGhpcy5kZWJ1Z1dhdGNoJiZ0aGlzLmRlYnVnV2F0Y2hDaGFuZ2UodGhpcy5kZWJ1Z1dhdGNoLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSk7ZWxzZSBpZih0aGlzLmRlYnVnV2F0Y2gpdGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9kLkNIRUNLRUQ6ZC5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP3RoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpOnRoaXMuc2V0Tm9kZXNBYm92ZVRvRW1wdHkoKSx0aGlzLmRlYnVnV2F0Y2hDaGFuZ2UodGhpcy5kZWJ1Z1dhdGNoLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSk7ZWxzZSBpZih0aGlzLnNldENoZWNrYm94U3RhdGUodGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP2QuQ0hFQ0tFRDpkLkVNUFRZLCEwKSx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpe2NvbnN0IHI9Xy52YWx1ZXModGhpcy5jaGlsZHJlbik7CmZvcig7ci5sZW5ndGg7KXt2YXIgaz1yLnBvcCgpO18uZm9yRWFjaChrLmNoaWxkcmVuLGw9PnIucHVzaChsKSk7ay5zZXRDaGVja2JveFN0YXRlKGQuQ0hFQ0tFRCwhMCl9dGhpcy5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl9ZWxzZXtjb25zdCByPV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pO2Zvcig7ci5sZW5ndGg7KWs9ci5wb3AoKSxfLmZvckVhY2goay5jaGlsZHJlbixsPT5yLnB1c2gobCkpLGsuc2V0Q2hlY2tib3hTdGF0ZShkLkVNUFRZLCEwKTt0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCl9fWlzTGVhZigpe3JldHVybiEhdGhpcy5kZWJ1Z1dhdGNofXNldFRvQWxsQ2hlY2tlZEV4dGVybmFsbHkoKXt0aGlzLnNldENoZWNrYm94U3RhdGUoZC5DSEVDS0VEKTt0aGlzLl9oYW5kbGVDaGFuZ2UoKX1zZXRDaGVja2JveFN0YXRlKGsscil7dGhpcy5hdm9pZFByb3BhZ2F0aW9uPXI7dGhpcy5jaGVja2JveFN0YXRlPWs7dGhpcy5jaGVja2JveC5jbGFzc0xpc3QudG9nZ2xlKCJwYXJ0aWFsLWNoZWNrYm94IiwKaz09PWQuUEFSVElBTCk7az09PWQuQ0hFQ0tFRD90aGlzLmNoZWNrYm94LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTp0aGlzLmNoZWNrYm94LnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpO3RoaXMuYXZvaWRQcm9wYWdhdGlvbj0hMX1pc0NoZWNrYm94Q2hlY2tlZCgpe3JldHVybiB0aGlzLmNoZWNrYm94Lmhhc0F0dHJpYnV0ZSgiY2hlY2tlZCIpfXNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKXtsZXQgaz10aGlzLnBhcmVudCxyPSExO2Zvcig7azspcj9rLnNldENoZWNrYm94U3RhdGUoZC5QQVJUSUFMLCEwKToocj0tMSE9PV8uZmluZEluZGV4KF8udmFsdWVzKGsuY2hpbGRyZW4pLGw9PmwuY2hlY2tib3hTdGF0ZSE9PWQuQ0hFQ0tFRCksay5zZXRDaGVja2JveFN0YXRlKHI/ZC5QQVJUSUFMOmQuQ0hFQ0tFRCwhMCkpLGs9ay5wYXJlbnR9c2V0Tm9kZXNBYm92ZVRvRW1wdHkoKXtsZXQgaz10aGlzLnBhcmVudCxyPSExO2Zvcig7azspcj9rLnNldENoZWNrYm94U3RhdGUoZC5QQVJUSUFMLAohMCk6KHI9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhrLmNoaWxkcmVuKSxsPT5sLmNoZWNrYm94U3RhdGUhPT1kLkVNUFRZKSxrLnNldENoZWNrYm94U3RhdGUocj9kLlBBUlRJQUw6ZC5FTVBUWSwhMCkpLGs9ay5wYXJlbnR9c2V0TGV2ZWxEb20oayl7dGhpcy5sZXZlbERvbT1rfX1iLlNlbGVjdGlvblRyZWVOb2RlPWh9KShLaHx8KEtoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLW9wLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntkZWJ1Z1dhdGNoZXM6QXJyYXksZGVidWdXYXRjaENoYW5nZTpPYmplY3Qsbm9kZUNsaWNrZWQ6RnVuY3Rpb24sZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmb3JjZUV4cGFuZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9sZXZlbE5hbWUyQ29udGFpbmVyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbGV2ZWxOYW1lMk5vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF93YXRjaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoZGVidWdXYXRjaGVzLCBkZWJ1Z1dhdGNoQ2hhbmdlLCBfZmlsdGVyTW9kZSwgX2ZpbHRlcklucHV0KSJ9LF9maWx0ZXJNb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToiTm9kZSBOYW1lIiwKbm90aWZ5OiEwfSxfZmlsdGVySW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sX2lzTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaGlnaGxpZ2h0ZWRMZXZlbERvbTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9yZW5kZXJIaWVyYXJjaHlXaXRoVGltZW91dChfd2F0Y2hIaWVyYXJjaHksIGRlYnVnV2F0Y2hDaGFuZ2UpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSkiLCJfaGFuZGxlRm9yY2VOb2RlRXhwYW5kKGZvcmNlRXhwYW5kTm9kZU5hbWUpIl0sX2NvbXB1dGVXYXRjaEhpZXJhcmNoeShiLGQsZixoKXtoPWgudHJpbSgpO2xldCBrPWI7bnVsbCE9ZiYmMDxoLmxlbmd0aCYmKGs9S2guZmlsdGVyRGVidWdXYXRjaGVzKGIsS2guRGVidWdXYXRjaEZpbHRlck1vZGVbZi5yZXBsYWNlKC9ccy9nLCIiKV0sbmV3IFJlZ0V4cChoKSkpO2NvbnN0IHI9bmV3IEtoLlNlbGVjdGlvblRyZWVOb2RlKCIiLApkKTtyLmlzUm9vdD0hMDtfLmZvckVhY2goayxsPT57Y29uc3QgcD1LaC5zcGxpdE5vZGVOYW1lKGwuZGV2aWNlX25hbWUrIi8iK2wubm9kZV9uYW1lKTtsZXQgbT1yO18uZm9yRWFjaChwLChuLHEpPT57cT09PXAubGVuZ3RoLTE/KHE9bmV3IEtoLlNlbGVjdGlvblRyZWVOb2RlKG4sZCxtLGwpLG0uY2hpbGRyZW5bbl09cSk6KG0uY2hpbGRyZW5bbl18fChtLmNoaWxkcmVuW25dPW5ldyBLaC5TZWxlY3Rpb25UcmVlTm9kZShuLGQsbSkpLG09bS5jaGlsZHJlbltuXSl9KX0pO3JldHVybiByfSxfY2xlYXJTZWxlY3RvckhpZXJhcmNoeSgpe2NvbnN0IGI9dGhpcy4kJCgiI3NlbGVjdG9yLWhpZXJhcmNoeSIpO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9LF9yZW5kZXJIaWVyYXJjaHlXaXRoVGltZW91dChiLGQsZixoKXt0aGlzLl9pc0xvYWRpbmd8fCh0aGlzLnNldCgiX2lzTG9hZGluZyIsITApLHRoaXMuX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKSwKc2V0VGltZW91dCgoKT0+e3RoaXMuX3JlbmRlckhpZXJhcmNoeShiLGQsZixoKX0sMTApKX0sX3JlbmRlckhpZXJhcmNoeShiLGQpe3RoaXMuc2V0KCJfbGV2ZWxOYW1lMkNvbnRhaW5lciIse30pO3RoaXMuc2V0KCJfbGV2ZWxOYW1lMk5vZGUiLHt9KTtiPXRoaXMuX3JlbmRlckxldmVsKG51bGwsbnVsbCxiLGQpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKSkuYXBwZW5kQ2hpbGQoYik7dGhpcy5zZXQoIl9pc0xvYWRpbmciLCExKX0sX3JlbmRlckxldmVsKGIsZCxmLGgpe2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bnVsbCE9YiYmay5zZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiLGIpO2xldCByO3I9bnVsbD09ZD9iOmQrIi8iK2I7UG9seW1lci5kb20oaykuY2xhc3NMaXN0LmFkZCgibGV2ZWwtY29udGFpbmVyIik7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWNvbGxhcHNlIik7aWYoYil7dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltyXT0KbDtsLnJlbW92ZUF0dHJpYnV0ZSgib3BlbmVkIik7UG9seW1lci5kb20oaykuY2xhc3NMaXN0LmFkZCgiaW5kZW50ZWQtbGV2ZWwtY29udGFpbmVyIik7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJsZXZlbC10aXRsZSIpO2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtQb2x5bWVyLmRvbShuKS5jbGFzc0xpc3QuYWRkKCJub2RlLWV4cGFuZC1idXR0b24iKTtjb25zdCBxPSgpPT57bi5zZXRBdHRyaWJ1dGUoImljb24iLGwuaGFzQXR0cmlidXRlKCJvcGVuZWQiKT8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSIpfTtuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2wuaGFzQXR0cmlidXRlKCJvcGVuZWQiKT9sLnJlbW92ZUF0dHJpYnV0ZSgib3BlbmVkIik6bC5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApO3EoKX0sITEpO3EoKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChuKTsKUG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoZi5jaGVja2JveCk7Zi5zZXRMZXZlbERvbShkKTtjb25zdCB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtQb2x5bWVyLmRvbSh1KS5jbGFzc0xpc3QuYWRkKCJsZXZlbC10aXRsZS10ZXh0Iik7dS50ZXh0Q29udGVudD1iO1BvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKHUpO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGQpOyhiLm1hdGNoKEtoLkRFVklDRV9OQU1FX1BBVFRFUk4pfHwxPT09T2JqZWN0LmtleXMoZi5jaGlsZHJlbikubGVuZ3RoKSYmbC5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApfWVsc2UgbC5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApO2NvbnN0IHA9W10sbT1bXTtQb2x5bWVyLmRvbShsKS5jbGFzc0xpc3QuYWRkKCJjb250ZW50LWNvbnRhaW5lciIpO18uZm9yRWFjaChmLmNoaWxkcmVuLChuLHEpPT57Y29uc3QgdT1uLmRlYnVnV2F0Y2g7dmFyIHc9cjtudWxsPT1yJiYodz0iIik7dys9Ii8iK3E7CnRoaXMuX2xldmVsTmFtZTJOb2RlW3ddPW47bnVsbCE9dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1t3XSYmKG4uc2V0Q2hlY2tib3hTdGF0ZShLaC5DaGVja2JveFN0YXRlLkNIRUNLRUQpLG4uc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpKTtpZih1KXt3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1BvbHltZXIuZG9tKHcpLmNsYXNzTGlzdC5hZGQoIm9wLWRlc2NyaXB0aW9uIik7bi5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGgsdSx5LnRhcmdldC5jaGVja2VkKX0sITEpO1BvbHltZXIuZG9tKHcpLmFwcGVuZENoaWxkKG4uY2hlY2tib3gpO24uc2V0TGV2ZWxEb20odyk7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0EudGV4dENvbnRlbnQ9IlsiK3Uub3BfdHlwZSsiXSI7QS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3AtdHlwZSIpO1BvbHltZXIuZG9tKHcpLmFwcGVuZENoaWxkKEEpOwpBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PXE7QS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3AtdGl0bGUtbGVhZiIpO0EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57Y29uc3QgeT10aGlzLl9nZXREZXZpY2VBbmROb2RlTmFtZXMocSxrKTt0aGlzLm5vZGVDbGlja2VkKHlbMF0seVsxXSl9LCExKTtQb2x5bWVyLmRvbSh3KS5hcHBlbmRDaGlsZChBKTttLnB1c2godyl9ZWxzZSBuLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIseT0+e3RoaXMuX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKG4saCx5LnRhcmdldC5jaGVja2VkKX0pLHAucHVzaCh0aGlzLl9yZW5kZXJMZXZlbChxLHIsbixoKSl9KTtiPW49PntQb2x5bWVyLmRvbShsKS5hcHBlbmRDaGlsZChuKX07Xy5mb3JFYWNoKG0sYik7Xy5mb3JFYWNoKHAsYik7UG9seW1lci5kb20oaykuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIGt9LF9nZXRMZWFmRGVidWdXYXRjaGVzKGIsZCl7Yi5kZWJ1Z1dhdGNoPwpkLnB1c2goYi5kZWJ1Z1dhdGNoKTpfLmZvckVhY2goYi5jaGlsZHJlbixmPT57dGhpcy5fZ2V0TGVhZkRlYnVnV2F0Y2hlcyhmLGQpfSl9LF9nZXREZXZpY2VBbmROb2RlTmFtZXMoYixkKXtmb3IoYj1bYl07Oyl7Y29uc3QgZj1kLmdldEF0dHJpYnV0ZSgibGV2ZWwtbmFtZSIpO2lmKG51bGw9PWYpYnJlYWs7ZWxzZSBiLnB1c2goZik7ZD1Qb2x5bWVyLmRvbShkKS5wYXJlbnROb2RlLnBhcmVudE5vZGV9Yi5yZXZlcnNlKCk7cmV0dXJuIEtoLmFzc2VtYmxlRGV2aWNlQW5kTm9kZU5hbWVzKGIpfSxfaGFuZGxlTWV0YU5vZGVDaGFuZ2UoYixkLGYpe2xldCBoPVtdO3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoYixoKTtfLmZvckVhY2goaCxrPT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChkLGssZil9KX0sX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoYixkLGYpe2NvbnN0IGg9ZC5kZXZpY2VfbmFtZSsiLyIrZC5ub2RlX25hbWU7Zj90aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2hdPQpkOmRlbGV0ZSB0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2hdO2IoZCxmKX0sX2hhbmRsZUZvcmNlTm9kZShiLGQpe3RoaXMuc2V0KCJfZmlsdGVySW5wdXQiLCIiKTtzZXRUaW1lb3V0KCgpPT57aWYobnVsbCE9YiYmbnVsbCE9dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcil7dmFyIGY9S2guc3BsaXROb2RlTmFtZShiKTtmb3IobGV0IGs9MTtrPD1mLmxlbmd0aDsrK2spe3ZhciBoPWYuc2xpY2UoMCxrKS5qb2luKCIvIik7Y29uc3Qgcj10aGlzLl9sZXZlbE5hbWUyTm9kZVtoXTtudWxsIT1yJiZudWxsIT1yLmxldmVsRG9tJiZyLmxldmVsRG9tLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTtrPGYubGVuZ3RoP251bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXJbaF0mJnRoaXMuX2xldmVsTmFtZTJDb250YWluZXJbaF0uc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTooci5kZWJ1Z1dhdGNofHx0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShyLApyLmRlYnVnV2F0Y2hDaGFuZ2UsITApLGQmJihyLnNldFRvQWxsQ2hlY2tlZEV4dGVybmFsbHkoKSwoaD1yLmRlYnVnV2F0Y2gpJiZudWxsPT10aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2gubm9kZV9uYW1lXSYmKHRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbYl09aCkpLG51bGwhPXRoaXMuX2hpZ2hsaWdodGVkTGV2ZWxEb20mJnRoaXMuX2hpZ2hsaWdodGVkTGV2ZWxEb20uY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSxyLmxldmVsRG9tLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksdGhpcy5zZXQoIl9oaWdobGlnaHRlZExldmVsRG9tIixyLmxldmVsRG9tKSl9fX0sMjApfSxfaGFuZGxlRm9yY2VOb2RlRXhwYW5kQW5kQ2hlY2soYil7dGhpcy5faGFuZGxlRm9yY2VOb2RlKGIsITApfSxfaGFuZGxlRm9yY2VOb2RlRXhwYW5kKGIpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShiLCExKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtc2Vzc2lvbi1ydW5zLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2Vzc2lvbi1ydW5zLXZpZXciLHByb3BlcnRpZXM6e2xhdGVzdFNlc3Npb25SdW46T2JqZWN0LHNlc3Npb25SdW5LZXlUb0RldmljZU5hbWVzOk9iamVjdCxzb2xlQWN0aXZlOkJvb2xlYW4sbm9kZU9yVGVuc29yQ2xpY2tlZDpGdW5jdGlvbixfcnVuS2V5MkNvdW50Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3J1bktleTJOdW1EZXZpY2VzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVJ1bktleTpTdHJpbmd9LG9ic2VydmVyczpbInJlbmRlckxhdGVzdChsYXRlc3RTZXNzaW9uUnVuKSIsInNldFNvbGVBY3RpdmVTdGF0dXMoc29sZUFjdGl2ZSkiXSxyZW5kZXJMYXRlc3QoYil7Yj1KU09OLnN0cmluZ2lmeShiKTt0aGlzLl9ydW5LZXkyQ291bnRbYl09dm9pZCAwPT09dGhpcy5fcnVuS2V5MkNvdW50W2JdPzE6dGhpcy5fcnVuS2V5MkNvdW50W2JdKzE7dm9pZCAwPT09dGhpcy5fcnVuS2V5Mk51bURldmljZXNbYl0mJih0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1tiXT0KMCk7dGhpcy5fYWN0aXZlUnVuS2V5PWI7dGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl9LHVwZGF0ZU51bURldmljZXMoYil7bnVsbCE9dGhpcy5fYWN0aXZlUnVuS2V5JiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbdGhpcy5fYWN0aXZlUnVuS2V5XT1iLHRoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpKX0sc2V0U29sZUFjdGl2ZVN0YXR1cygpe3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSxfcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl7dGhpcy5fY2xlYXJUYWJsZSgpO3RoaXMuX3JlbmRlckhlYWRlcigpO2xldCBiO2Zvcihjb25zdCBmIGluIHRoaXMuX3J1bktleTJDb3VudClpZih0aGlzLl9ydW5LZXkyQ291bnQuaGFzT3duUHJvcGVydHkoZikpe3ZhciBkPUpTT04ucGFyc2UoZik7KGQ9dGhpcy5fcmVuZGVyUm93KGQsdGhpcy5fcnVuS2V5Mk51bURldmljZXNbZl0sdGhpcy5fcnVuS2V5MkNvdW50W2ZdLHRoaXMuX2FjdGl2ZVJ1bktleT09PWYsdGhpcy5zb2xlQWN0aXZlKSkmJgooYj1kKX1iJiYoUG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5wYXJlbnROb2RlLnBhcmVudE5vZGUuc2Nyb2xsVG9wPWIub2Zmc2V0VG9wKX0sX2NsZWFyVGFibGUoKXtjb25zdCBiPXRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGVhZGVyKCl7Y29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtkLnRleHRDb250ZW50PSJGZWVkcyI7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2YudGV4dENvbnRlbnQ9IkZldGNoZXMiO2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtoLnRleHRDb250ZW50PSJUYXJnZXRzIjtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ay50ZXh0Q29udGVudD0iIyhEZXZpY2VzKSI7Y29uc3Qgcj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtyLnRleHRDb250ZW50PSJDb3VudCI7Yi5hcHBlbmRDaGlsZChkKTtiLmFwcGVuZENoaWxkKGYpO2IuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChrKTtiLmFwcGVuZENoaWxkKHIpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkuYXBwZW5kQ2hpbGQoYil9LF9yZW5kZXJSb3coYixkLGYsaCxrKXtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksbD10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGIuZmVlZHMpLHA9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLmZldGNoZXMpO2I9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLnRhcmdldHMpO2NvbnN0IG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTttLnRleHRDb250ZW50PWQ7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2QudGV4dENvbnRlbnQ9ZjtyLmFwcGVuZENoaWxkKGwpO3IuYXBwZW5kQ2hpbGQocCk7CnIuYXBwZW5kQ2hpbGQoYik7ci5hcHBlbmRDaGlsZChtKTtyLmFwcGVuZENoaWxkKGQpO2gmJihrP3Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsInNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIik6ci5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYWN0aXZlLXNlc3Npb24tcnVuIikpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkuYXBwZW5kQ2hpbGQocik7aWYoaClyZXR1cm4gcn0sX3JlbmRlckdyYXBoRWxlbWVudHMoYil7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO18uZm9yRWFjaChiLGY9Pntjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2gudGV4dENvbnRlbnQ9ZjtoLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJub2RlLW9yLXRlbnNvci1lbGVtZW50Iik7aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pnt0aGlzLm5vZGVPclRlbnNvckNsaWNrZWQoZil9KTtkLmFwcGVuZENoaWxkKGgpfSk7cmV0dXJuIGR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNvdXJjZS1jb2RlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc291cmNlLWNvZGUtdmlldyIscHJvcGVydGllczp7cmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGZvY3VzTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vbGRGb2N1c05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxkZWJ1Z1dhdGNoZXM6e3R5cGU6QXJyYXksdmFsdWU6W119LG5vZGVDbGlja2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LGNvbnRpbnVlVG9Ob2RlOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LF9oaWdobGlnaHRlZEVsZW1lbnRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfZmlsZVBhdGhTZWxlY3RlZDpOdW1iZXIsX2Z1bGxGaWxlUGF0aHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX3Nob3J0RmlsZVBhdGhzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9maWxlTGluZXM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX25vZGVOYW1lMkRldmljZU5hbWU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LApfbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJOb2RlRWxlbWVudHM6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfZnVsbFN0YWNrU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2Z1bGxTdGFja05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcmVuZGVyRGVsYXlNaWxsaXM6e3R5cGU6TnVtYmVyLHZhbHVlOjUwLHJlYWRvbmx5OiEwfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckZpbGUoX2ZpbGVQYXRoU2VsZWN0ZWQpIiwiX2ZvY3VzT25Ob2RlKGZvY3VzTm9kZU5hbWUpIl0scmVuZGVyKGIpe251bGwhPWImJnRoaXMuc2V0KCJfZGVidWdXYXRjaGVzIixiKTt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToicGF0aHMifSkudGhlbihkPT4Ke3RoaXMuc2V0KCJfZnVsbEZpbGVQYXRocyIsZC5wYXRocyk7Y29uc3QgZj1kLnBhdGhzLm1hcChoPT4oe2lkOmgsbmFtZTp0aGlzLl9zaG9ydGVuUGF0aChoLGQucGF0aHMpfSkpO3RoaXMuc2V0KCJfc2hvcnRGaWxlUGF0aHMiLGYpOzA8Zi5sZW5ndGgmJnRoaXMuc2V0KCJfZmlsZVBhdGhTZWxlY3RlZCIsMCl9KX0sX3Nob3J0ZW5QYXRoKGIpe2I9Yi5yZXBsYWNlKC9cXC9nLCIvIik7Yj1iLnNwbGl0KCIvIik7cmV0dXJuIGJbYi5sZW5ndGgtMV19LF9yZW5kZXJGaWxlKGIpe2lmKG51bGwhPWIpe3ZhciBkPXRoaXMuX3Nob3J0RmlsZVBhdGhzW2JdLmlkO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJjb250ZW50IixmaWxlX3BhdGg6ZH0pLnRoZW4oZj0+e2NvbnN0IGg9W10saz1mLmNvbnRlbnRbZF0scj1mLmxpbmVub190b19vcF9uYW1lX2FuZF9zdGFja19wb3M7Zj17fTtmb3IodmFyIGwgaW4gcilyLmhhc093blByb3BlcnR5KGwpJiYoZltsXT1yW2xdLmxlbmd0aCk7CnRoaXMuX2ZpbHRlckZpbGVUcmFjZWJhY2tzQnlEZWJ1Z1dhdGNoZXMocik7Zm9yKGw9MDtsPGsubGVuZ3RoOysrbCl7Y29uc3QgbT1sKzE7aC5wdXNoKHtsaW5lbm86bSxudW1Ob2RlczpudWxsIT1yW21dP1N0cmluZyhyW21dLmxlbmd0aCkrIi8iK1N0cmluZyhmW21dKSsiIFx1MjViYyI6IiIsdGV4dDp0aGlzLl9odG1sRXNjYXBlKGtbbF0pfSl9dGhpcy5zZXQoIl9maWxlTGluZXMiLGgpO2NvbnN0IHA9dGhpcztzZXRUaW1lb3V0KCgpPT57Y29uc3QgbT17fSxuPXt9O2Zvcihjb25zdCB1IGluIHIpe2lmKCFyLmhhc093blByb3BlcnR5KHUpKWNvbnRpbnVlO2Zvcih2YXIgcT1wLiQkKCIjc291cmNlLWxpbmUtbm9kZXMtIit1KTtxLmZpcnN0Q2hpbGQ7KXEucmVtb3ZlQ2hpbGQocS5maXJzdENoaWxkKTtjb25zdCB3PXJbdV07dy5zb3J0KGZ1bmN0aW9uKEEseSl7cmV0dXJuIEFbMF08eVswXT8tMTpBWzBdPnlbMF0/MTowfSk7Zm9yKGxldCBBPTA7QTx3Lmxlbmd0aDsrK0Epe2NvbnN0IHk9CndbQV1bMF0seD13W0FdWzFdLEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ry5zZXRBdHRyaWJ1dGUoImNsYXNzIiwic291cmNlLWxpbmUtbm9kZS1lbnR0cnkiKTtHLnNldEF0dHJpYnV0ZSgic291cmNlTGluZW5vIix1KTtHLnRleHRDb250ZW50PXk7Ry5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5ub2RlQ2xpY2tlZCh0aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLHRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3ldLCEwKX0pO2NvbnN0IEQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtELnNldEF0dHJpYnV0ZSgiaWNvbiIsImZpbHRlci1saXN0Iik7RC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiU2hvdyBzdGFjayIpO0QuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyh5KTt0aGlzLnNldCgiX2Z1bGxTdGFja05vZGVOYW1lIiwKeSk7dGhpcy5zZXQoIl9mdWxsU3RhY2tTaG93biIsITApO3RoaXMuX3BvcHVsYXRlRnVsbFN0YWNrKHksdGhpcy5fZnVsbEZpbGVQYXRoc1t0aGlzLl9maWxlUGF0aFNlbGVjdGVkXSxOdW1iZXIodSkpfSk7Y29uc3QgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO0Iuc2V0QXR0cmlidXRlKCJpY29uIiwiZm9yd2FyZCIpO0Iuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIkNvbnRpbnVlIHRvIik7Qi5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5ub2RlQ2xpY2tlZCh0aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLHRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3ldLCEwKTtjb25zdCBIPXRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbeV0sSz10aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XTt0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsRyk7dGhpcy5jb250aW51ZVRvTm9kZShILApLKX0pO0MuYXBwZW5kQ2hpbGQoRCk7Qy5hcHBlbmRDaGlsZChCKTtDLmFwcGVuZENoaWxkKEcpO3EuYXBwZW5kQ2hpbGQoQyk7bS5oYXNPd25Qcm9wZXJ0eSh5KXx8KG1beV09W10pO21beV0ucHVzaChHKTtuLmhhc093blByb3BlcnR5KHkpfHwoblt5XT1bRyx4XSk7eD5uW3ldWzFdJiYoblt5XT1bRyx4XSl9cS5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsITApO3E9cC4kJCgiI3NvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLSIrdSk7bnVsbD09cS5nZXRBdHRyaWJ1dGUoInRhcENhbGxiYWNrU2V0IikmJihxLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9PntwLl90b2dnbGVMaW5lTm9kZXMoTnVtYmVyKHUpKX0pLHEuc2V0QXR0cmlidXRlKCJ0YXBDYWxsYmFja1NldCIsITApKX1wLnNldCgiX25vZGVOYW1lMk5vZGVFbGVtZW50cyIsbSk7Zm9yKGNvbnN0IHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYoblt1XT1uW3VdWzBdKTtwLnNldCgiX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnQiLApuKX0sdGhpcy5fcmVuZGVyRGVsYXlNaWxsaXMpfSl9fSxfdG9nZ2xlTGluZU5vZGVzKGIsZD0hMSl7Yj10aGlzLiQkKCIjc291cmNlLWxpbmUtbm9kZXMtIitiKTtudWxsPT1iLmdldEF0dHJpYnV0ZSgiaGlkZGVuIikmJiEwIT09ZD9iLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk6Yi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpfSxfZmlsdGVyRmlsZVRyYWNlYmFja3NCeURlYnVnV2F0Y2hlcyhiKXtjb25zdCBkPXRoaXMuZGVidWdXYXRjaGVzLm1hcChrPT5LaC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oay5ub2RlX25hbWUpKSxmPXt9LGg9e307Zm9yKGNvbnN0IGsgb2YgdGhpcy5kZWJ1Z1dhdGNoZXMpe2NvbnN0IHI9S2gucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGsubm9kZV9uYW1lKTtmW3JdPWsuZGV2aWNlX25hbWU7aFtyXT1rLm5vZGVfbmFtZX10aGlzLnNldCgiX25vZGVOYW1lMkRldmljZU5hbWUiLGYpO3RoaXMuc2V0KCJfbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWUiLApoKTtmb3IoY29uc3QgayBpbiBiKWIuaGFzT3duUHJvcGVydHkoaykmJihiW2tdPWJba10uZmlsdGVyKHI9Pl8uaW5jbHVkZXMoZCxyWzBdKSkpfSxfcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoYil7Y29uc3QgZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvc291cmNlX2NvZGUiKTtiPWRjLmFkZFBhcmFtcyhkLGIpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYil9LF9odG1sRXNjYXBlKGIpe3JldHVybiBiLnJlcGxhY2UoLyAvZywiXHUwMGEwIil9LF9mb2N1c09uTm9kZShiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLl9zaG9ydEZpbGVQYXRoc1t0aGlzLl9maWxlUGF0aFNlbGVjdGVkXS5pZCxmPXRoaXM7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6Im9wX3RyYWNlYmFjayIsb3BfbmFtZTpifSkudGhlbihoPT57Y29uc3Qgaz1oLm9wX3RyYWNlYmFja1tiXTtoPVtdO2ZvcihsZXQgbD0wO2w8ay5sZW5ndGg7KytsKXtjb25zdCBwPQprW2xdWzFdO2tbbF1bMF09PT1kJiZoLnB1c2gocCl9Zm9yKHZhciByIG9mIGYuX2hpZ2hsaWdodGVkRWxlbWVudHMpci5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZC1zb3VyY2UtbGluZSIpO3I9W107Zm9yKGNvbnN0IGwgb2YgaCloPXRoaXMuJCQoIiNzb3VyY2UtbGluZS0iK2wpLHIucHVzaChoKSxoLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIiksZi5fdG9nZ2xlTGluZU5vZGVzKGwsITApO2Yuc2V0KCJfaGlnaGxpZ2h0ZWRFbGVtZW50cyIscik7dGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKGIpfSl9fSxfaGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKGIpe2lmKG51bGwhPXRoaXMuX29sZEZvY3VzTm9kZU5hbWUpZm9yKGNvbnN0IGQgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW3RoaXMuX29sZEZvY3VzTm9kZU5hbWVdKWQuc3R5bGVbImZvbnQtd2VpZ2h0Il09Im5vcm1hbCI7Zm9yKGNvbnN0IGQgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW2JdKWQuc3R5bGVbImZvbnQtd2VpZ2h0Il09CiJib2xkIjtudWxsPT10aGlzLl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQ/dGhpcy5fbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudFtiXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSk6dGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLG51bGwpO3RoaXMuc2V0KCJfb2xkRm9jdXNOb2RlTmFtZSIsYil9LF9wb3B1bGF0ZUZ1bGxTdGFjayhiLGQsZil7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6Im9wX3RyYWNlYmFjayIsb3BfbmFtZTpifSkudGhlbihoPT57Y29uc3Qgaz10aGlzLiQkKCIjZnVsbC1zdGFjay1jb250ZW50Iik7Zm9yKDtrLmZpcnN0Q2hpbGQ7KWsucmVtb3ZlQ2hpbGQoay5maXJzdENoaWxkKTtmb3IoY29uc3QgciBvZiBoLm9wX3RyYWNlYmFja1tiXSl7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpLHA9clswXSxtPU51bWJlcihyWzFdKTtsLnRleHRDb250ZW50PQpwKyI6ICIrU3RyaW5nKG0pO18uaW5jbHVkZXModGhpcy5fZnVsbEZpbGVQYXRocyxwKT8obC5jbGFzc0xpc3QuYWRkKCJzdGFjay1mcmFtZS1jbGlja2FibGUiKSxsLnN0eWxlLmNvbG9yPSJibHVlIixsLnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIscD09PWQmJm09PT1mJiYobC5zdHlsZVsiZm9udC13ZWlnaHQiXT0iYm9sZCIpLGwuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMuc2V0KCJfZmlsZVBhdGhTZWxlY3RlZCIsdGhpcy5fZnVsbEZpbGVQYXRocy5pbmRleE9mKHApKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5fdG9nZ2xlTGluZU5vZGVzKG0sITApO2Zvcihjb25zdCBuIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1tiXSlOdW1iZXIobi5nZXRBdHRyaWJ1dGUoInNvdXJjZUxpbmVubyIpKT09PU51bWJlcihtKSYmKG4uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pLAp0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsbCksdGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKGIpLGQ9PT1wJiZmPT09bXx8dGhpcy5fcG9wdWxhdGVGdWxsU3RhY2soYixwLG0pKX0sMip0aGlzLl9yZW5kZXJEZWxheU1pbGxpcyl9KSk6KGwuY2xhc3NMaXN0LmFkZCgic3RhY2stZnJhbWUtbm9uY2xpY2thYmxlIiksbC5zdHlsZS5jb2xvcj0iIzU1NSIpO2suYXBwZW5kQ2hpbGQobCl9fSl9LF9jbG9zZUZ1bGxTdGFja0RpYWxvZygpe3RoaXMuc2V0KCJfZnVsbFN0YWNrU2hvd24iLCExKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtdGVuc29yLWRhdGEtc3VtbWFyeS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Iixwcm9wZXJ0aWVzOntsYXRlc3RUZW5zb3JEYXRhOk9iamVjdCxleHBhbmRIYW5kbGVyOk9iamVjdCxjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24saGlnaGxpZ2h0ZWROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGVuc29yTmFtZUNsaWNrZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaGVhbHRoUGlsbHNFbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAsbm90aWZ5OiEwfSxfd2F0Y2hLZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfd2F0Y2hLZXkyRGF0YTp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJFeHBhbmRIYW5kbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MlZhbHVlU2hvcnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyUm93Ont0eXBlOk9iamVjdCwKdmFsdWU6e319LF9hY3RpdmVXYXRjaEtleTpTdHJpbmcsX2hlYWx0aFBpbGxXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRvbmx5OiEwfSxfaGVhbHRoUGlsbEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MzIscmVhZG9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfcmVuZGVyTGF0ZXN0KGxhdGVzdFRlbnNvckRhdGEsIGV4cGFuZEhhbmRsZXIpIiwiX2hpZ2hsaWdodChoaWdobGlnaHRlZE5vZGVOYW1lKSJdLGxpc3RlbmVyczp7InNob3ctaGVhbHRoLXBpbGxzLmNoYW5nZSI6Il9zaG93SGVhbHRoUGlsbHNDaGFuZ2VkIn0scmVhZHkoKXt0aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCl9LGVuYWJsZUhlYWx0aFBpbGxzKCl7dGhpcy5zZXQoIl9oZWFsdGhQaWxsc0VuYWJsZWQiLCEwKTt0aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCl9LF9zaG93SGVhbHRoUGlsbHNDaGFuZ2VkKCl7dGhpcy5faGVhbHRoUGlsbHNFbmFibGVkP3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKToKdGhpcy5fY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCk7dGhpcy5fcmVuZGVyQWxsKCl9LF9yZW5kZXJBbGwoKXt0aGlzLl9jbGVhclRlbnNvckRhdGFUYWJsZSgpO2Zvcihjb25zdCBiIG9mIHRoaXMuX3dhdGNoS2V5cyl0aGlzLl9yZW5kZXJMYXRlc3QodGhpcy5fd2F0Y2hLZXkyRGF0YVtiXSx0aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2JdKX0sX3RlbnNvckRhdGEyV2F0Y2hLZXkoYil7cmV0dXJuIGIuZGV2aWNlTmFtZSsiLyIrYi50ZW5zb3JOYW1lKyI6IitiLmRlYnVnT3B9LF9yZW5kZXJMYXRlc3QoYixkKXtpZihiKXt2YXIgZj10aGlzLl90ZW5zb3JEYXRhMldhdGNoS2V5KGIpLGg9bnVsbDsiVW5pbml0aWFsaXplZCIhPT1iLmR0eXBlJiYiVW5zdXBwb3J0ZWQiIT09Yi5kdHlwZSYmKGg9KCk9PmQoYikpO3ZhciBrPW51bGwhPWIudmFsdWU/SlNPTi5zdHJpbmdpZnkoYi52YWx1ZSwocixsKT0+bC50b0ZpeGVkP051bWJlcihsLnRvRml4ZWQoMykpOmwpOiIoQ2xpY2sgdG8gdmlldykiOwp0aGlzLl93YXRjaEtleTJEYXRhW2ZdPWI7LTE9PT10aGlzLl93YXRjaEtleXMuaW5kZXhPZihmKT8odGhpcy5fd2F0Y2hLZXlzLnB1c2goZiksdGhpcy5fd2F0Y2hLZXkyQ291bnRbZl09MSk6dGhpcy5fd2F0Y2hLZXkyQ291bnRbZl0rPTE7dGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltmXT1oO3RoaXMuX3dhdGNoS2V5MlZhbHVlU2hvcnRbZl09azt0aGlzLl9hY3RpdmVXYXRjaEtleT1mO3RoaXMuX3JlbW92ZUFjdGl2ZVN0YXR1c0Zyb21BbGxSb3dzKCk7dGhpcy5fcmVuZGVyUm93KGYpfX0sX2NsZWFyVGVuc29yRGF0YVRhYmxlKCl7Zm9yKGNvbnN0IGIgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShiKSYmKHRoaXMuX3dhdGNoS2V5MlJvd1tiXS5yZW1vdmUoKSxkZWxldGUgdGhpcy5fd2F0Y2hLZXkyUm93W2JdKX0sX2NsZWFyVGVuc29yRGF0YVJvdyhiKXtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSwKX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpe2NvbnN0IGI9dGhpcy4kJCgiI2hlYWx0aC1waWxsLWxlZ2VuZCIpO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9LF9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCl7dGhpcy5fY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCk7Y29uc3QgYj10aGlzLiQkKCIjaGVhbHRoLXBpbGwtbGVnZW5kIik7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC50ZXh0Q29udGVudD0iTGVnZW5kOiI7Yi5hcHBlbmRDaGlsZChkKTtkLnN0eWxlWyJtYXJnaW4tcmlnaHQiXT0iMC41ZW0iO2Quc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjtmb3IoZD0wO2Q8dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXMubGVuZ3RoOysrZCl7Y29uc3QgZj10Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllc1tkXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjsKaC5zdHlsZVsibWFyZ2luLXJpZ2h0Il09IjAuMjVlbSI7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ay50ZXh0Q29udGVudD0iXHUyNWEwIjtrLnN0eWxlLmNvbG9yPWYuYmFja2dyb3VuZF9jb2xvcjtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLnRleHRDb250ZW50PWYubGFiZWw7ci5zdHlsZS5jb2xvcj1mLmJhY2tncm91bmRfY29sb3I7aC5hcHBlbmRDaGlsZChrKTtoLmFwcGVuZENoaWxkKHIpO2IuYXBwZW5kQ2hpbGQoaCl9fSxfcmVtb3ZlQWN0aXZlU3RhdHVzRnJvbUFsbFJvd3MoKXtmb3IoY29uc3QgYiBpbiB0aGlzLl93YXRjaEtleTJSb3cpe2lmKCF0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoYikpY29udGludWU7Y29uc3QgZD10aGlzLl93YXRjaEtleTJSb3dbYl07UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlLXRlbnNvciIpO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIil9fSwKX3JlbmRlclJvdyhiKXtsZXQgZCxmPSExO251bGwhPXRoaXMuX3dhdGNoS2V5MlJvd1tiXT8oZD10aGlzLl93YXRjaEtleTJSb3dbYl0sdGhpcy5fY2xlYXJUZW5zb3JEYXRhUm93KGQpLGY9ITEpOihkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksZj0hMCk7Y29uc3QgaD10aGlzLl93YXRjaEtleTJEYXRhW2JdLmRldmljZU5hbWUsaz10aGlzLl93YXRjaEtleTJEYXRhW2JdLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUscj1oKyIvIitrO3ZhciBsPXRoaXMuX3dhdGNoS2V5MkNvdW50W2JdLHA9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS50ZW5zb3JOYW1lLG09dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kZWJ1Z09wLG49dGhpcy5fd2F0Y2hLZXkyVmFsdWVTaG9ydFtiXTtjb25zdCBxPXRoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbYl0sdT1iPT09dGhpcy5fYWN0aXZlV2F0Y2hLZXksdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKHcpLmNsYXNzTGlzdC5hZGQoInRlbnNvci1uYW1lIik7Cncuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiO3cuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt3LnRleHRDb250ZW50PXA7dy5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57bnVsbCE9dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZCYmdGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChoLGspfSk7Y29uc3QgQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO0EudGV4dENvbnRlbnQ9bDtjb25zdCB5PXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZHR5cGU7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2NvbnN0IHg9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5zaGFwZTtsLnRleHRDb250ZW50PXk7Y29uc3QgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO0MudGV4dENvbnRlbnQ9SlNPTi5zdHJpbmdpZnkoeCk7Y29uc3QgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO0cudGV4dENvbnRlbnQ9bjtQb2x5bWVyLmRvbShHKS5jbGFzc0xpc3QuYWRkKCJ2YWx1ZS1leHBhbnNpb24tbGluayIpOwpudWxsIT1xJiYoRy5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHEsITEpLEcuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiLEcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bj1udWxsO249dGhpcy5faGVhbHRoUGlsbHNFbmFibGVkP3RoaXMuX3JlbmRlckhlYWx0aFBpbGwocCsiOiIrbSx7ZGV2aWNlX25hbWU6aCxub2RlX25hbWU6ayxkdHlwZTp5LHNoYXBlOngsdmFsdWU6bnVsbH0scSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO20uc2V0QXR0cmlidXRlKCJpY29uIiwiZm9yd2FyZCIpO20uc2V0QXR0cmlidXRlKCJ0aXRsZSIsIkNvbnRpbnVlIHRvIik7bS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pnt0aGlzLmNvbnRpbnVlVG9DYWxsYmFjayhoLGspfSk7cC5hcHBlbmRDaGlsZChtKTtkLmFwcGVuZENoaWxkKHcpOwpkLmFwcGVuZENoaWxkKEEpO2QuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChDKTtkLmFwcGVuZENoaWxkKEcpO2QuYXBwZW5kQ2hpbGQobik7ZC5hcHBlbmRDaGlsZChwKTtkLnNldEF0dHJpYnV0ZSgibm9kZU5hbWVXaXRoRGV2aWNlIixyKTt1JiYoUG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlLXRlbnNvciIpLFBvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIikpO3RoaXMuX3dhdGNoS2V5MlJvd1tiXT1kO2YmJlBvbHltZXIuZG9tKHRoaXMuJCQoIiN0ZW5zb3ItZGF0YS10YWJsZSB0Ym9keSIpKS5hcHBlbmRDaGlsZChkKTtkLnNjcm9sbEludG9WaWV3KHtibG9jazoiZW5kIixpbmxpbmU6Im5lYXJlc3QiLGJlaGF2aW91cjoic21vb3RoIn0pfSxfcmVuZGVySGVhbHRoUGlsbChiLGQsZil7Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKGgpLmNsYXNzTGlzdC5hZGQoImhlYWx0aC1waWxsIik7Cm51bGwhPWYmJmguYWRkRXZlbnRMaXN0ZW5lcigidGFwIixmLCExKTtmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0Zi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLCJzdmciKTtmLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2hlYWx0aFBpbGxXaWR0aCk7Zi5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5faGVhbHRoUGlsbEhlaWdodCk7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGYuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwiZyIpO2YuYXBwZW5kQ2hpbGQoayk7aC5hcHBlbmRDaGlsZChmKTtjb25zdCByPSJ0ZHAvIitiO3RoaXMuZ2V0SGVhbHRoUGlsbChiLGQuZGV2aWNlX25hbWUsZC5ub2RlX25hbWUsbD0+e251bGw9PWw/KGgudGV4dENvbnRlbnQ9Ik4vQSIsaC5zdHlsZS5jb2xvcj0iZ3JheSIpOihkLnZhbHVlPWwsdGYuZ3JhcGguc2NlbmUuYWRkSGVhbHRoUGlsbChrLGQsbnVsbCxyLHRoaXMuX2hlYWx0aFBpbGxXaWR0aCx0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0LwoyLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQvMiwwKSl9KTtyZXR1cm4gaH0sX2hpZ2hsaWdodChiKXtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGVuc29yLWRhdGEtdGFibGUiKSk7Y29uc3QgZD1bXTtmb3IoY29uc3QgZiBpbiB0aGlzLl93YXRjaEtleTJSb3cpe2lmKCF0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoZikpY29udGludWU7Y29uc3QgaD10aGlzLl93YXRjaEtleTJSb3dbZl07bnVsbCE9aC5nZXRBdHRyaWJ1dGUmJihoLmdldEF0dHJpYnV0ZSgibm9kZU5hbWVXaXRoRGV2aWNlIik9PT1iP2QucHVzaChoKTpQb2x5bWVyLmRvbShoKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpKX1pZihudWxsIT1iKWZvcihiPTA7YjxkLmxlbmd0aDsrK2IpUG9seW1lci5kb20oZFtiXSkuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSxkW2JdLnNjcm9sbEludG9WaWV3KHtibG9jazoiZW5kIixpbmxpbmU6Im5lYXJlc3QiLGJlaGF2aW91cjoic21vb3RoIn0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9kZWZhdWx0U2VyaWVzTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6Il9fZGVidWdnZXJfZGF0YV9fIixyZWFkb25seTohMH0sX2xpbmVDaGFydFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5zdGVwfX19LF9saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIuc2NhbGFyfSxfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Plt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmI9Pgoic3RlcFx4M2QiK2IuZGF0dW0uc3RlcCsiOyBzY2FsYXJceDNkICIrYi5kYXR1bS5zY2FsYXJ9XX0sX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbmRlcihkYXRhKSJdLHJlbmRlcihiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLiQkKCJ2ei1saW5lLWNoYXJ0MiIpO2Quc2V0VmlzaWJsZVNlcmllcyhbdGhpcy5fZGVmYXVsdFNlcmllc05hbWVdKTt2YXIgZj1bXSxoPWIueDtiPWIueTtmb3IobGV0IGs9MDtrPGgubGVuZ3RoOysraylmLnB1c2goe3N0ZXA6aFtrXSxzY2FsYXI6YltrXX0pO2Quc2V0U2VyaWVzRGF0YSh0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZSxmKTtkLmNvbW1pdENoYW5nZXMoKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS12aWV3Iixwcm9wZXJ0aWVzOnt2aWV3SWQ6U3RyaW5nLHRlbnNvck5hbWU6U3RyaW5nLGRlYnVnT3A6U3RyaW5nLGRldmljZU5hbWU6U3RyaW5nLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6U3RyaW5nLHNsaWNpbmc6U3RyaW5nLHRpbWVJbmRpY2VzOlN0cmluZyxkdHlwZTpTdHJpbmcsc2hhcGU6QXJyYXksY29udGludWVUb0J1dHRvbkNhbGxiYWNrOk9iamVjdCxjbG9zZUJ1dHRvbkNhbGxiYWNrOk9iamVjdCx0ZW5zb3JOYW1lQ2FsbGJhY2s6T2JqZWN0LHRlbnNvcldpZGdldDpPYmplY3QsZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaXNUZW5zb3JWYWx1ZVNjYWxhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUxpbmVDaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kYXRhU2NhbGFyOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfSwKX2xpbmVDaGFydERhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2RhdGFJbWFnZVNyYzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyKDEwKX19LG9ic2VydmVyczpbIl91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZSh0aW1lSW5kaWNlcykiXSxyZW5kZXJUZW5zb3JWYWx1ZSgpe2lmKHRoaXMudGVuc29yTmFtZSlpZihudWxsPT10aGlzLnNsaWNpbmcpe3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMCk7Y29uc3QgZD17c3BlYzp7ZHR5cGU6dGhpcy5kdHlwZSxzaGFwZTp0aGlzLnNoYXBlfSxnZXQ6KCk9Pnt0aHJvdyBFcnJvcigidGVuc29yVmlldy5nZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpO30sdmlldzpmPT57Y29uc3QgaD10aGlzO3JldHVybiBXYihmdW5jdGlvbiooKXtjb25zdCBrPWguc2hhcGUubGVuZ3RoLHI9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09PgptLmRpbSksbD1mLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAobT0+bS5pbmRleCk7bGV0IHA9IlsiO2ZvcihsZXQgbT0wO208azsrK20pLTEhPT1yLmluZGV4T2YobSk/cCs9YCR7bFtyLmluZGV4T2YobSldfWA6Zi52aWV3aW5nRGltc1swXT09PW0/cCs9YCR7Zi52ZXJ0aWNhbFJhbmdlWzBdfToke2YudmVydGljYWxSYW5nZVsxXX1gOmYudmlld2luZ0RpbXNbMV09PT1tJiYocCs9YCR7Zi5ob3Jpem9udGFsUmFuZ2VbMF19OiR7Zi5ob3Jpem9udGFsUmFuZ2VbMV19YCksbTxrLTEmJihwKz0iLCIpO3ArPSJdIjtyZXR1cm4gbmV3IFByb21pc2UoKG0sbik9Pntjb25zdCBxPWguX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTpoLnRlbnNvck5hbWUrIjoiK2guZGVidWdPcCxzbGljaW5nOnAsdGltZV9pbmRpY2VzOmgudGltZUluZGljZXMsbWFwcGluZzoibm9uZSJ9KTtoLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHEpLnRoZW4odT0+e251bGw9PXUuZXJyb3I/bSh1LnRlbnNvcl9kYXRhW3UudGVuc29yX2RhdGEubGVuZ3RoLQoxXSk6bih1LmVycm9yKX0pLmNhdGNoKHU9Pm4odSkpfSl9KX0sZ2V0TnVtZXJpY1N1bW1hcnk6KCk9Pntjb25zdCBmPXRoaXM7cmV0dXJuIFdiKGZ1bmN0aW9uKigpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxrKT0+e2NvbnN0IHI9Zi50ZW5zb3JOYW1lKyI6IitmLmRlYnVnT3A7Zi5nZXRIZWFsdGhQaWxsKHIsZi5kZXZpY2VOYW1lLGYubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPT57bnVsbD09bD9rKGBGYWlsZWQgdG8gZ2V0IGhlYWx0aCBwaWxsIGZvciB3YXRjaCBrZXkgJHtyfWApOmgoe2VsZW1lbnRDb3VudDpsWzFdLG1pbmltdW06bFs4XSxtYXhpbXVtOmxbOV19KX0pfSl9KX19O3NldFRpbWVvdXQoKCk9PntudWxsPT10aGlzLnRlbnNvcldpZGdldCYmKHRoaXMudGVuc29yV2lkZ2V0PXRlbnNvcl93aWRnZXQudGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksZCx7d2hlZWxab29tS2V5OiJhbHQifSkpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwKMTApfWVsc2V7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCExKTt2YXIgYj10aGlzLl9yYW5rRnJvbVNsaWNpbmcodGhpcy5zbGljaW5nLnRyaW0oKSk7Y29uc3QgZD10aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcCh0aGlzLnRpbWVJbmRpY2VzKTtsZXQgZj1iO2lmKCFkKXtpZigxPGIpe3RoaXMuX3Nob3dUb2FzdCgiSGlzdG9yeSBmb3IgdGVuc29ycyBceDNlIDFEIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpO3JldHVybn1mKz0xfWI9dGhpcy5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OnRoaXMudGVuc29yTmFtZSsiOiIrdGhpcy5kZWJ1Z09wLHNsaWNpbmc6dGhpcy5zbGljaW5nLHRpbWVfaW5kaWNlczp0aGlzLnRpbWVJbmRpY2VzLG1hcHBpbmc6Mjw9Zj8iaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaD0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTsKaWYobnVsbCE9aC5lcnJvcil0aGlzLl9zaG93VG9hc3QoaC5lcnJvci50eXBlKyI6ICIraC5lcnJvci5tZXNzYWdlKTtlbHNlIGlmKGg9ZD9oLnRlbnNvcl9kYXRhWzBdOmgudGVuc29yX2RhdGEsMD09PWYpdGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoInNjYWxhciIpLHRoaXMuc2V0KCJfZGF0YVNjYWxhciIsaCk7ZWxzZSBpZigxPT09Zil7dGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImxpbmVDaGFydCIpO2xldCBrPXt4OltdLHk6aH07Zm9yKGxldCByPTA7cjxoLmxlbmd0aDsrK3Ipay54LnB1c2gocisxKTt0aGlzLnNldCgiX2xpbmVDaGFydERhdGEiLGspfWVsc2UgMjw9Zj8odGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImltYWdlIiksdGhpcy5zZXQoIl9kYXRhSW1hZ2VTcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitoKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitmKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0sCnJlZnJlc2goKXt0aGlzLnRlbnNvck5hbWUudHJpbSgpJiZ0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF9nZXRUZW5zb3JEYXRhVVJMKGIpe2NvbnN0IGQ9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3RlbnNvcl9kYXRhIik7cmV0dXJuIGRjLmFkZFBhcmFtcyhkLGIpfSxfcmFua0Zyb21TbGljaW5nKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gMDt7Yj1iLnNwbGl0KCIsIik7bGV0IGQ9Yi5sZW5ndGg7Zm9yKGNvbnN0IGYgb2YgYilpc05hTihOdW1iZXIoZikpfHxkLS07cmV0dXJuIGR9fSxfc2V0VmlzdWFsaXphdGlvblR5cGUoYil7InNjYWxhciI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToiaW1hZ2UiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCEwKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCB2aXN1YWxpemF0aW9uVHlwZToiLGIpfSxfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjaygpeyJmdWxsIGhpc3RvcnkiPT09UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk/dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiOiIpOnRoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYil7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYik/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PQoiRnVsbCBIaXN0b3J5IjpQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9IkxhdGVzdCBUaW1lIFBvaW50In0sX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO3JldHVybiFpc05hTihOdW1iZXIoYikpfSxfY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpe3JldHVybiJEZWJ1Z0lkZW50aXR5Ij09PXRoaXMuZGVidWdPcD8iIjp0aGlzLmRlYnVnT3B9LF9zaG93VG9hc3QoYil7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5vcGVuKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Iixwcm9wZXJ0aWVzOntjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24sdGVuc29yTmFtZUNsaWNrZWQ6RnVuY3Rpb24sX3RlbnNvclZpZXdDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9ufSxhZGRWaWV3KGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtdGVuc29yLXZhbHVlLXZpZXciKTtmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJkZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2Yudmlld0lkPWIudmlld0lkO2YudGVuc29yTmFtZT1iLnRlbnNvck5hbWU7Zi5kZWJ1Z09wPWIuZGVidWdPcDtmLmRldmljZU5hbWU9Yi5kZXZpY2VOYW1lO2YubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZT1iLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU7Zi5kdHlwZT1iLmR0eXBlO2Yuc2hhcGU9Yi5zaGFwZTsKZi5zbGljaW5nPWIuc2xpY2luZztmLnRpbWVJbmRpY2VzPWIudGltZUluZGljZXM7Zi5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYi52aWV3SWQpO2YuY29udGludWVUb0J1dHRvbkNhbGxiYWNrPSgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YudGVuc29yTmFtZUNhbGxiYWNrPSgpPT57dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChiLmRldmljZU5hbWUsYi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07Zi5nZXRIZWFsdGhQaWxsPXRoaXMuZ2V0SGVhbHRoUGlsbDtkLmFwcGVuZENoaWxkKGYpO2YucmVmcmVzaCgpfSxnZXRWaWV3cygpe2NvbnN0IGI9W107Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yi5wdXNoKHt2aWV3SWQ6ZC52aWV3SWQsdGVuc29yTmFtZTpkLnRlbnNvck5hbWUsCmRlYnVnT3A6ZC5kZWJ1Z09wLHNsaWNpbmc6ZC5zbGljaW5nLHRpbWVJbmRpY2VzOmQudGltZUluZGljZXN9KX0pO3JldHVybiBifSxyZW5kZXJUZW5zb3JWYWx1ZXMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGI9PntiLnJlbmRlclRlbnNvclZhbHVlKCl9KX0sX3JlZHJhd1ZpZXdzKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZj0+e2QucmVtb3ZlQ2hpbGQoZil9KTtfLmZvckVhY2goYixmPT57dGhpcy5hZGRWaWV3KGYpfSl9LF9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIpe3JldHVybigpPT57Y29uc3QgZD1bXSxmPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKTtmb3IobGV0IGg9MDtoPGYubGVuZ3RoOysraCl7Y29uc3Qgaz0KZltoXTtrLnZpZXdJZCE9PWImJmQucHVzaCh7dmlld0lkOmsudmlld0lkLHRlbnNvck5hbWU6ay50ZW5zb3JOYW1lLGRlYnVnT3A6ay5kZWJ1Z09wLGR0eXBlOmsuZHR5cGUsc2hhcGU6ay5zaGFwZSxzbGljaW5nOmsuc2xpY2luZyx0aW1lSW5kaWNlczprLnRpbWVJbmRpY2VzfSl9dGhpcy5fcmVkcmF3Vmlld3MoZCl9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90ZW5zb3Itc2hhcGUtaGVscGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIGY8PWg/Ijo6IjoiOjoiK01hdGguY2VpbChmL2gpfWIuZ2V0RGVmYXVsdFNsaWNpbmc9ZnVuY3Rpb24oZil7cmV0dXJuIDA9PT1mLmxlbmd0aD8iIjoxPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwxRTMpKyJdIjoyPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwyNTApKyIsICIrZChmWzFdLDI1MCkrIl0iOm51bGx9O2IucmFua0Zyb21TbGljaW5nPWZ1bmN0aW9uKGYpe2Yuc3RhcnRzV2l0aCgiWyIpJiYoZj1mLnNsaWNlKDEsZi5sZW5ndGgtMSkpO2lmKDA9PT1mLmxlbmd0aClyZXR1cm4gMDt7Zj1mLnNwbGl0KCIsIik7bGV0IGg9Zi5sZW5ndGg7Zm9yKGNvbnN0IGsgb2YgZilpc05hTihOdW1iZXIoaykpfHxoLS07cmV0dXJuIGh9fX0pKEtofHwoS2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgYWw9KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsYmw9KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsY2w9KGFsKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyBkYy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpiZC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpiZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOmNsfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0LHJlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LG9ic2VydmVyczpbIl9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUpIiwiX3NpemVEYXNoYm9hcmRSZWdpb25zKF9sZWZ0UGFuZVdpZHRoLCBfdG9wUmlnaHRRdWFkcmFudEhlaWdodCwgX3dpbmRvd1dpZHRoKSIsCiJfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoX2dyYXBoUHJvZ3Jlc3MpIl0scmVhZHkoKXt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxsb25nX3BvbGwoKXtjb25zdCBiPXtwb3M6Kyt0aGlzLl9sb25nUG9sbENvdW50fTtsZXQgZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvY29tbSIpO2Q9ZGMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9Pntjb25zdCBoPWYudHlwZTtmPWYuZGF0YTtpZigibWV0YSI9PT1oKXt2YXIgaz1mLnJ1bl9rZXkscj1rWzBdLnNwbGl0KCIsIiksbD1rWzFdLnNwbGl0KCIsIik7Y29uc3QgbT1rWzJdLnNwbGl0KCIsIik7dmFyIHA9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5LZXkiLAprKTt0aGlzLnNldCgiX2xhdGVzdFNlc3Npb25SdW4iLHtmZWVkczpyLGZldGNoZXM6bCx0YXJnZXRzOm19KTt0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMCk7dm9pZCAwPT09dGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXT8odGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXT1bXSx0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIixbXSkpOnRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNba10pO3RoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbz1yPSJGZWVkczogIityKyI7IEZldGNoZXM6ICIrbCsiOyBUYXJnZXRzOiAiK207dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzLmhhc093blByb3BlcnR5KHIpP3RoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1tyXSs9MTp0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnNbcl09MTt0aGlzLl9zZXNzaW9uUnVuVG90YWxDb3VudGVyKys7CnRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCk7dGhpcy5fY29udGludWVUb1R5cGUmJl8uaXNFcXVhbChwLGspfHwodGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGssITEpLHRoaXMuX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpKX1lbHNlInRlbnNvciI9PT1oPyhrPWYuZGV2aWNlX25hbWUscD1mLm5vZGVfbmFtZSxyPWYubWF5YmVfYmFzZV9leHBhbmRlZF9ub2RlX25hbWUsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9az90aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGspOiF0aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJih0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGssciksdGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixrKyIvIityKSksdGhpcy5zZXQoIl9zZXNzaW9uUnVuU29sZUFjdGl2ZSIsITEpLGw9cCsiOiIrZi5vdXRwdXRfc2xvdCx0aGlzLnNldCgiX2xhdGVzdFRlbnNvckRhdGEiLAp7ZGV2aWNlTmFtZTprLHRlbnNvck5hbWU6bCxub2RlTmFtZTpwLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6cixkZWJ1Z09wOmYuZGVidWdfb3AsZHR5cGU6Zi5kdHlwZSxzaGFwZTpmLnNoYXBlLHZhbHVlOmYudmFsdWVzfSksdGhpcy5fbWF5YmVVcGRhdGVUZW5zb3JWYWx1ZVZpZXdzKGwsZi5kZWJ1Z19vcCksdGhpcy5zZXQoIl9idXN5IiwhMSkpOmNvbnNvbGUuZXJyb3IoIkludmFsaWQgbG9uZy1wb2xsaW5nIHJlc3BvbnNlIHR5cGU6ICIsaCk7bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJnRoaXMuX3Byb2Nlc3NDb250aW51ZVRvKGgsZik7dGhpcy5sb25nX3BvbGwoKX0pfSxfcHJvY2Vzc0NvbnRpbnVlVG8oYixkKXt0aGlzLl9jb250aW51ZVN0b3A/dGhpcy5fY2xlYXJDb250aW51ZVRvKCk6IlNlc3Npb25SdW4iPT09dGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKCJtZXRhIj09PWIpOiJUZW5zb3JDb25kaXRpb24iPT09CnRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3N0ZXAoKToib3AiPT09dGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG9PcCgibWV0YSI9PT1iLGQpOm51bGwhPXRoaXMuX2NvbnRpbnVlVG9UeXBlJiYiIiE9PXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZjb25zb2xlLmVycm9yKCJJbnZhbGlkIF9jb250aW51ZVRvVHlwZToiLHRoaXMuX2NvbnRpbnVlVG9UeXBlKX0sX3Byb2Nlc3NDb250aW51ZVRvU2Vzc2lvblJ1bihiKXtiJiZ0aGlzLnNldCgiX2NvbnRpbnVlVG9Db3VudGVyIix0aGlzLl9jb250aW51ZVRvQ291bnRlcisxKTt0aGlzLl9jb250aW51ZVRvQ291bnRlcjx0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD90aGlzLl9zdGVwKCk6dGhpcy5fY2xlYXJDb250aW51ZVRvKCl9LF9wcm9jZXNzQ29udGludWVUb09wKGIsZCl7YiYmdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCk7Yj1kLmRldmljZV9uYW1lO2Q9ZC5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZTsKY29uc3QgZj1udWxsPT1kP251bGw6S2gucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpO2IrIi8iK2Q9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0fHxiKyIvIitmPT09dGhpcy5fY29udGludWVUb1RhcmdldD8odGhpcy5fY2xlYXJDb250aW51ZVRvKCksdGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGYpKTp0aGlzLl9zdGVwKCl9LF9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MoYixkKXtjb25zdCBmPXRoaXMuJCQoIiN0ZW5zb3JWYWx1ZU11bHRpVmlldyIpO2lmKG51bGwhPWYpe3ZhciBoPSExO18uZm9yRWFjaChmLmdldFZpZXdzKCksaz0+e2lmKGsudGVuc29yTmFtZT09PWImJmsuZGVidWdPcD09PWQpcmV0dXJuIGg9ITAsITF9KTtoJiZmLnJlbmRlclRlbnNvclZhbHVlcygpfX0scmVsb2FkKCl7aWYoIXRoaXMuYWxyZWFkeVN0YXJ0ZWQpe3RoaXMuc2V0KCJhbHJlYWR5U3RhcnRlZCIsITApO3ZhciBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsCiIvZGVidWdnZXJfZ3JwY19ob3N0X3BvcnQiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+ezA8ZC5wb3J0Pyh0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuRGlhbG9nKGQuaG9zdCxkLnBvcnQpLHRoaXMubG9uZ19wb2xsKCkpOnRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaXNhYmxlZERpYWxvZygpfSl9fSxfc2hvd1NvdXJjZUNvZGVDaGFuZ2VkKCl7dGhpcy5fc291cmNlQ29kZVNob3duPyh0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI0MCUiLHRoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoKSk6dGhpcy4kJCgiI25vZGUtZW50cmllcyIpLnN0eWxlLmhlaWdodD0iODAlIn0sX3Nob3dUb2FzdChiKXt0aGlzLiQudG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudG9hc3Qub3BlbigpfSxfYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCl7dGhpcy5fc2hvd1RvYXN0KCJTZXNzaW9uLnJ1bigpICMiK3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrCiIgaXMgc3RhcnRpbmcuIil9LF9kaXNwbGF5R3JhcGgoYixkKXtiPXtydW5fa2V5OkpTT04uc3RyaW5naWZ5KGIpLGRldmljZV9uYW1lOmR9O2I9ZGMuYWRkUGFyYW1zKCIvZGF0YS9wbHVnaW4vZGVidWdnZXIvZGVidWdnZXJfZ3JhcGgiLGIpO3RoaXMuJC5sb2FkZXIuZGF0YXNldHM9W3tuYW1lOiIvZGVidWdnZXJfZ3JhcGgiLHBhdGg6Yn1dO3RoaXMuJC5sb2FkZXIuc2V0KCJzZWxlY3RlZERhdGFzZXQiLDApfSxfcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGIsZCl7ZD9jb25zb2xlLmxvZygiUG9sbGluZyBmb3IgZmlyc3QgR3JhcGhEZWYgZm9yIHJ1biBrZXk6IixiKTp0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLG51bGwpO3ZhciBmPXttb2RlOiJyZXRyaWV2ZV9hbGwiLHJ1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYil9O2NvbnN0IGg9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTtmPWRjLmFkZFBhcmFtcyhoLApmKTtsZXQgaz1bXTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4ocj0+e2lmKDA9PXIuZGV2aWNlX25hbWVzLmxlbmd0aClkfHx0aGlzLl9zdGVwKCksdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGIsITApO2Vsc2V7dmFyIGw9bnVsbDtmb3IoY29uc3QgcCBpbiByLmdhdGVkX2dycGNfdGVuc29ycylpZihyLmdhdGVkX2dycGNfdGVuc29ycy5oYXNPd25Qcm9wZXJ0eShwKSl7LTE9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLmluZGV4T2YocCkmJih0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnB1c2gocCksdGhpcy4kLnNlc3Npb25SdW5zVmlldy51cGRhdGVOdW1EZXZpY2VzKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ubGVuZ3RoKSk7dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5zbGljZSgpKTtsPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzW3RoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aC0KMV07Y29uc3QgbT1yLmdhdGVkX2dycGNfdGVuc29yc1twXTtmb3IobGV0IG49MDtuPG0ubGVuZ3RoOysrbilrLnB1c2goe2RldmljZV9uYW1lOnAsbm9kZV9uYW1lOm1bbl1bMF0sb3BfdHlwZTptW25dWzFdLG91dHB1dF9zbG90Om1bbl1bMl0sZGVidWdfb3A6bVtuXVszXX0pfW51bGwhPWwmJih0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGwpLHI9UG9seW1lci5kb20odGhpcy4kJCgiI2FjdGl2ZS1ydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIikpLG51bGwhPXImJnIuc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsbCkpO0toLnNvcnRBbmRCYXNlRXhwYW5kRGVidWdXYXRjaGVzKGspO3RoaXMuc2V0KCJfZGVidWdXYXRjaGVzIixrKTt0aGlzLiQuc291cmNlQ29kZVZpZXcucmVuZGVyKGspfX0pfSxfY3JlYXRlRGVidWdXYXRjaENoYW5nZUhhbmRsZXIoKXtyZXR1cm4oYixkKT0+e2Q9ZD8iYnJlYWsiOiJkaXNhYmxlIjt0aGlzLl9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKEtoLmdldENsZWFuTm9kZU5hbWUoYi5kZXZpY2VfbmFtZSsKIi8iK2Iubm9kZV9uYW1lKSxiLm91dHB1dF9zbG90LGIuZGVidWdfb3AsZCl9fSxfZm9jdXNPbkdyYXBoTm9kZShiLGQpe251bGwhPWImJnRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUhPT1iJiZ0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGIpO3RoaXMuX3NldFRvcFJpZ2h0UnVudGltZUdyYXBoc1RvQWN0aXZlKCk7Y29uc3QgZj10aGlzLiQkKCIjZ3JhcGgiKTtpZihmLnNlbGVjdGVkTm9kZT09PWQpZi5wYW5Ub05vZGUoZCk7ZWxzZXtjb25zdCBoPWYuZ2V0KCJyZW5kZXJIaWVyYXJjaHkiKS5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO251bGw9PWhbZF0mJihkPUtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSk7bnVsbCE9aFtkXSYmZi5zZXQoInNlbGVjdGVkTm9kZSIsZCl9dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsYisiLyIrZCl9LF9jcmVhdGVOb2RlQ2xpY2tlZEhhbmRsZXIoKXtyZXR1cm4oYixkLGYpPT57dGhpcy5fc291cmNlQ29kZVNob3duJiYKITAhPT1mJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLEtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLGQpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYisiLyIrZCl9fSxfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKXtyZXR1cm4gYj0+e2xldCBkPWI7LTEhPT1kLmluZGV4T2YoIjoiKSYmKGQ9ZC5zbGljZSgwLGQuaW5kZXhPZigiOiIpKSk7Yj1fLmZpbmQodGhpcy5fZGVidWdXYXRjaGVzLGY9PmYubm9kZV9uYW1lPT09ZHx8MD09PWYubm9kZV9uYW1lLmluZGV4T2YoZCkmJiIoIj09PWYubm9kZV9uYW1lW2QubGVuZ3RoXSk7bnVsbD09Yj90aGlzLl9zaG93VG9hc3QoIk5vZGUgJyIrZCsiJyBpcyBub3QgaW4gdGhlIHJ1bnRpbWUgZ3JhcGggb2YgdGhlIGN1cnJlbnQgU2Vzc2lvbi5ydW4gb3IgZG9lcyBub3QgaGF2ZSBhIGRlYnVnIG9wIGF0dGFjaGVkLiIpOnRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYi5kZXZpY2VfbmFtZSwKZCl9fSxfY3JlYXRlVGVuc29yRGF0YUV4cGFuZEhhbmRsZXIoKXtyZXR1cm4gYj0+e3RoaXMuX3NldFRvcFJpZ2h0VGVuc29yVmFsdWVzVG9BY3RpdmUoKTtzZXRUaW1lb3V0KCgpPT57dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3IikuYWRkVmlldyh7dmlld0lkOnRoaXMuX2NyZWF0ZVRlbnNvclZpZXdJZCgpLGRldmljZU5hbWU6Yi5kZXZpY2VOYW1lLHRlbnNvck5hbWU6Yi50ZW5zb3JOYW1lLG5vZGVOYW1lOmIubm9kZU5hbWUsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTpiLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUsZGVidWdPcDpiLmRlYnVnT3AsZHR5cGU6Yi5kdHlwZSxzaGFwZTpiLnNoYXBlLHNsaWNpbmc6S2guZ2V0RGVmYXVsdFNsaWNpbmcoYi5zaGFwZSksdGltZUluZGljZXM6Ii0xIn0pfSwxMCl9fSxfY3JlYXRlVGVuc29yVmlld0lkKCl7Y29uc3QgYj0iZGVidWdnZXItdGVuc29yLXZpZXctIit0aGlzLl90ZW5zb3JWaWV3SWRDb3VudGVyO3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXIrKzsKcmV0dXJuIGJ9LF9jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpe3JldHVyblt7dGl0bGU6KCk9PiJFeHBhbmQgYW5kIGhpZ2hsaWdodCIsYWN0aW9uOmI9Pntjb25zdCBkPUtoLmdldENsZWFuTm9kZU5hbWUoYi5ub2RlLm5hbWUpO2I9dGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsiLyIrYi5ub2RlLm5hbWU7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKTt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsS2gucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkFkZCBicmVha3BvaW50IixhY3Rpb246Yj0+e2NvbnN0IGQ9S2guZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUiLHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUrCiIvIitiLm5vZGUubmFtZSk7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLEtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSl9fSx7dGl0bGU6KCk9PiJDb250aW51ZSB0byIsYWN0aW9uOmI9PnstMSE9PVsiX0FyZyIsIl9SZXR2YWwiXS5pbmRleE9mKGIubm9kZS5vcCk/dGhpcy5fc2hvd1RvYXN0KCdDYW5ub3QgY29udGludWUgdG8gbm9kZSAiJytiLm5vZGUubmFtZSsnIiwgZHVlIHRvIG9wIHR5cGUgIicrYi5ub2RlLm9wKyciLicpOnRoaXMuX2NvbnRpbnVlVG9Ob2RlKHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUsYi5ub2RlLm5hbWUpfX1dfSxfY3JlYXRlR2V0SGVhbHRoUGlsbCgpe3JldHVybihiLGQsZixoKT0+e3ZhciBrPXt3YXRjaF9rZXk6Yix0aW1lX2luZGljZXM6Ii0xIixtYXBwaW5nOiJoZWFsdGgtcGlsbCJ9O2NvbnN0IHI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi90ZW5zb3JfZGF0YSIpO2s9ZGMuYWRkUGFyYW1zKHIsayk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChrKS50aGVuKGw9PntsPWwudGVuc29yX2RhdGFbMF07aChsKTt0aGlzLl9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGwpfSl9fSxfY29uZGl0aW9uYWxIZWFsdGhQaWxsU3RvcChiLGQsZixoKXtpZigiVGVuc29yQ29uZGl0aW9uIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZLaC5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5KHRoaXMuX2NvbnRpbnVlVG9UYXJnZXQsaCx0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldCkpe3RoaXMuc2V0KCJfY29udGludWVTdG9wIiwhMCk7aD1LaC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZik7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGgpO3RoaXMuX2ZvY3VzT25HcmFwaE5vZGUoZCxmKTtjb25zdCBrPWQrIi8iK2Y7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIiwKayk7c2V0VGltZW91dCgoKT0+e3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLG51bGwpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGspfSwxMDApO3RoaXMuX3Nob3dUb2FzdCgnVGVuc29yIGNvbmRpdGlvbiAiJyt0aGlzLl9jb250aW51ZVRvVGFyZ2V0KyciIGlzIG1ldCBieSB3YXRjaCBrZXk6ICInK2IrJyIuXG5TdG9wcGluZyBjb250aW51YXRpb24uJyl9fSxfY29udGludWVUb05vZGUoYixkKXtjb25zdCBmPUtoLmdldENsZWFuTm9kZU5hbWUoZCk7Yj1iKyIvIitkO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoZiwwLCJEZWJ1Z0lkZW50aXR5IiwiYnJlYWsiKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsYik7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLEtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKSk7dGhpcy5fc2V0Q29udGludWVUbygib3AiLGIpOwp0aGlzLiQuY29udGludWVEaWFsb2cudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKTt0aGlzLl9zdGVwKCl9LF9jcmVhdGVDb250aW51ZVRvTm9kZUhhbmRsZXIoKXtyZXR1cm4oYixkKT0+e3RoaXMuX2NvbnRpbnVlVG9Ob2RlKGIsZCl9fSxfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKGIpe2NvbnN0IGQ9UG9seW1lci5kb20odGhpcy4kJCgiI3J1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSk7aWYoMDx0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgpe2xldCBmO2Y9YisoIiAoZGV2aWNlICIrKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmluZGV4T2YoYikrMSkrIiBvZiAiK3RoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCsiKSIpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZudWxsIT1kJiYoZC50ZXh0Q29udGVudD1mKX1lbHNlIHRoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiYKbnVsbCE9ZCYmKGQudGV4dENvbnRlbnQ9IldhaXRpbmcgZm9yIGRldmljZS4uLiIpO251bGwhPWImJnRoaXMuX2Rpc3BsYXlHcmFwaCh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5LGIpfSxfc3RlcCgpe2lmKG51bGwhPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXkpe3RoaXMuc2V0KCJfYnVzeSIsITApO3ZhciBiPXttb2RlOiJyZXRyaWV2ZV9kZXZpY2VfbmFtZXMiLHJ1bl9rZXk6SlNPTi5zdHJpbmdpZnkodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl9LGQ9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTtiPWRjLmFkZFBhcmFtcyhkLGIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihmPT57bGV0IGg9ITE7Zm9yKGxldCBrPTA7azxmLmRldmljZV9uYW1lcy5sZW5ndGg7KytrKWlmKC0xPT09dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihmLmRldmljZV9uYW1lc1trXSkpe2g9ITA7YnJlYWt9Zj0KZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2FjayIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbigoKT0+e2gmJnRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5LCExKX0pfSl9fSxfY3JlYXRlU2Vzc2lvblJ1bkdvKCl7cmV0dXJuIGI9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJTZXNzaW9uUnVuIix0aGlzLl9jdXJyZW50U2Vzc2lvblJ1bkluZm8sYik7dGhpcy5fc3RlcCgpfX0sX2NyZWF0ZVRlbnNvckNvbmRpdGlvbkdvKCl7cmV0dXJuKGIsZCk9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJUZW5zb3JDb25kaXRpb24iLGIsZCk7dGhpcy4kLnRlbnNvckRhdGFTdW1tYXJ5LmVuYWJsZUhlYWx0aFBpbGxzKCk7dGhpcy5fc3RlcCgpfX0sX2NyZWF0ZUZvcmNlQ29udGludWF0aW9uU3RvcCgpe3JldHVybigpPT57dGhpcy5fc2hvd1RvYXN0KCdDb250aW51YXRpb24gb2YgdHlwZSAiJyt0aGlzLl9jb250aW51ZVRvVHlwZSsKJyIgd2FzIGludGVycnVwdGVkIGJ5IHVzZXIuJyk7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKX19LF9zZXRDb250aW51ZVRvKGIsZCxmPS0xKXt0aGlzLl9jb250aW51ZVRvVHlwZT1iO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9ZDt0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD1mO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPTA7dGhpcy5fY29udGludWVTdG9wPSExfSxfY2xlYXJDb250aW51ZVRvKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKTt0aGlzLl9jb250aW51ZVRvVGFyZ2V0PXRoaXMuX2NvbnRpbnVlVG9UeXBlPSIiO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PS0xO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPTA7dGhpcy5fY29udGludWVTdG9wPSExO3RoaXMuc2V0KCJfYnVzeSIsITEpfSxfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCl7cmV0dXJuKGIsZCk9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYisiLyIrCmQpO3RoaXMuX3N0ZXAoKTt0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmdGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLGQpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYisiLyIrZCl9fSxfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQoYil7Yj10aGlzLl90b3BSaWdodFRhYnNbYl0uaWQ7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsInRhYi1ydW50aW1lLWdyYXBocyI9PT1iKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCJ0YWItdGVuc29yLXZhbHVlcyI9PT1iKX0sX3NldFRvcFJpZ2h0UnVudGltZUdyYXBoc1RvQWN0aXZlKCl7dGhpcy5zZXQoIl90b3BSaWdodFNlbGVjdGVkIiwiMCIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCEwKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCExKX0sX3NldFRvcFJpZ2h0VGVuc29yVmFsdWVzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLAoiMSIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCExKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCEwKX0sX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoYixkLGYsaCl7Yj17bW9kZToic2V0X3N0YXRlIixub2RlX25hbWU6YixvdXRwdXRfc2xvdDpkLGRlYnVnX29wOmYsc3RhdGU6aH07ZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9ZGMuYWRkUGFyYW1zKGQsYik7dGhpcy5zZXQoIl9idXN5IiwhMCk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGs9Pnt0aGlzLnNldCgiX2J1c3kiLCExKTtjb25zb2xlLmxvZygiQnJlYWtwb2ludCBzZXRfc3RhdGUgcmVzcG9uc2U6ICIsayl9KX0sX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI3RvcC1yaWdodC1wcm9ncmVzcy1iYXIiKTtudWxsPT10aGlzLl9sYXRlc3RTZXNzaW9uUnVuPwooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwwKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6KGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsYi52YWx1ZSksdGhpcy5zZXQoIl9idXN5IiwxMDA+Yi52YWx1ZSkpfSxfaGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5zZXQoIl93aW5kb3dXaWR0aCIsYmwoKSk7dGhpcy5zZXQoIl93aW5kb3dIZWlnaHQiLGFsKCkpO3RoaXMuX3NpemVEYXNoYm9hcmRSZWdpb25zKHRoaXMuX2xlZnRQYW5lV2lkdGgsdGhpcy5fdG9wUmlnaHRRdWFkcmFudEhlaWdodCx0aGlzLl93aW5kb3dXaWR0aCl9LF9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChiLGQsZil7cmV0dXJuIGItZC1mfSxfY29tcHV0ZU1heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHQoYixkKXtyZXR1cm4gYi1kLTcwfSxfc2l6ZURhc2hib2FyZFJlZ2lvbnMoYixkLGYpe3RoaXMuJCQoIiNsZWZ0LXBhbmUiKS5zdHlsZS53aWR0aD1iKyJweCI7Yj1mLWItdGhpcy5fcmVzaXplcldpZHRoLTg7dGhpcy4kJCgiI2NlbnRlci1jb250ZW50Iikuc3R5bGUud2lkdGg9CmIrInB4IjtiPWQtdGhpcy5fcmVzaXplcldpZHRoO3RoaXMuJCQoIiN0b3AtcmlnaHQtcXVhZHJhbnQiKS5zdHlsZS5oZWlnaHQ9YisicHgiO3RoaXMuJCQoIiN0ZW5zb3ItZGF0YSIpLnN0eWxlLnRvcD1kKyJweCJ9LF9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXI6YmQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9sZWZ0UGFuZVdpZHRoIix7ZGVmYXVsdFZhbHVlOjQ1MH0pLF90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXI6YmQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl90b3BSaWdodFF1YWRyYW50SGVpZ2h0Iix7ZGVmYXVsdFZhbHVlOmNsfSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tYXRlcmlhbC9wYXBlci1tYXRlcmlhbC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1tYXRlcmlhbCIscHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6MX0sYW5pbWF0ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LGRlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlSW5jbHVkZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxhcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixoZWFsdGhQaWxsRW50cmllczp7dHlwZTpBcnJheSx2YWx1ZTp0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcyxyZWFkT25seTohMH0saGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZTp7dHlwZTpBcnJheSwKY29tcHV0ZWQ6Il9jb21wdXRlSGVhbHRoUGlsbEZvck5vZGUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgc2VsZWN0ZWROb2RlLCBhbGxTdGVwc01vZGVFbmFibGVkLCBhcmVIZWFsdGhQaWxsc0xvYWRpbmcpIn0sYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMH0sX2JpZ2dlc3RTdGVwRXZlclNlZW46e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUJpZ2dlc3RTdGVwRXZlclNlZW4obm9kZU5hbWVzVG9IZWFsdGhQaWxscykifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgobm9kZU5hbWVzVG9IZWFsdGhQaWxscykifSxfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwRGlzcGxheVZhbHVlKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifX0sCm9ic2VydmVyczpbIl91cGRhdGVBbGVydHNMaXN0KGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cykiXSxyZWFkeTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluQ29udGFpbmVyIiksZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1kYXNoYm9hcmQtbGF5b3V0IC5zY3JvbGxiYXIiKTtiJiZkJiYoYi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKX0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGImJmR9LF9jb21wdXRlVGVuc29yQ291bnRTdHJpbmc6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj9iW2RdLnRvRml4ZWQoMCk6IiJ9LF9jb21wdXRlSGVhbHRoUGlsbEZvck5vZGU6ZnVuY3Rpb24oYixkLGYsaCxrKXtpZihrfHwhZilyZXR1cm4gbnVsbDtiPWJbZl07cmV0dXJuIGI/KGQ9YltoPzA6ZF0pP2QudmFsdWUuc2xpY2UoMiw4KTpudWxsOm51bGx9LF9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWU6ZnVuY3Rpb24oYiwKZCxmLGgsayl7aWYoZilyZXR1cm4gaC50b0ZpeGVkKDApO2lmKGspcmV0dXJuIDA7Zm9yKGxldCByIGluIGIpcmV0dXJuIGJbcl1bZF0uc3RlcC50b0ZpeGVkKDApO3JldHVybiAwfSxfY29tcHV0ZUJpZ2dlc3RTdGVwRXZlclNlZW46ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGI9YltkXSxNYXRoLm1heCh0aGlzLl9iaWdnZXN0U3RlcEV2ZXJTZWVuLGJbYi5sZW5ndGgtMV0uc3RlcCk7cmV0dXJuIHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW58fDB9LF9jb21wdXRlTWF4U3RlcEluZGV4OmZ1bmN0aW9uKGIpe2ZvcihsZXQgZCBpbiBiKXJldHVybiBiW2RdLmxlbmd0aC0xO3JldHVybiAwfSxfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmxlbmd0aH0sX3VwZGF0ZUFsZXJ0c0xpc3Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy4kJCgiI251bWVyaWMtYWxlcnRzLWJvZHkiKTtpZihkKXtkLmlubmVyVGV4dD0iIjtmb3IodmFyIGY9CjA7ZjxiLmxlbmd0aDtmKyspe3ZhciBoPWJbZl0saz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtyLmlubmVyVGV4dD10Zi5ncmFwaC51dGlsLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZShoLmZpcnN0X3RpbWVzdGFtcCk7ci5jbGFzc0xpc3QuYWRkKCJmaXJzdC1vZmZlbnNlLXRkIik7ay5hcHBlbmRDaGlsZChyKTtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7ci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItZGV2aWNlLXRkIik7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUiKTtsLmlubmVyVGV4dD1oLnRlbnNvcl9uYW1lO3RoaXMuX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXIobCxoLnRlbnNvcl9uYW1lKTtyLmFwcGVuZENoaWxkKGwpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJkZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUiKTsKbC5pbm5lclRleHQ9IigiK2guZGV2aWNlX25hbWUrIikiO3IuYXBwZW5kQ2hpbGQobCk7ay5hcHBlbmRDaGlsZChyKTtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3IuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbCIpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtsLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwtdGQiKTtsLmFwcGVuZENoaWxkKHIpO2suYXBwZW5kQ2hpbGQobCk7aC5uZWdfaW5mX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLmNsYXNzTGlzdC5hZGQoIm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVyVGV4dD1oLm5lZ19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLm5lZ19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCAtXHUyMjFlIiksci5hcHBlbmRDaGlsZChsKSk7aC5wb3NfaW5mX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKbC5jbGFzc0xpc3QuYWRkKCJwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksbC5pbm5lclRleHQ9aC5wb3NfaW5mX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5wb3NfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggK1x1MjIxZSIpLHIuYXBwZW5kQ2hpbGQobCkpO2gubmFuX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLmNsYXNzTGlzdC5hZGQoIm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVyVGV4dD1oLm5hbl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmFuX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggTmFOIiksci5hcHBlbmRDaGlsZChsKSk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoayl9fX0sX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3ZhciBmPXRmLmdyYXBoLnJlbmRlci5leHBhbmRVbnRpbE5vZGVJc1Nob3duKHRoaXMucmVuZGVySGllcmFyY2h5LApkKSxoLGs9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZ3JhcGgtaW5mbyNncmFwaC1pbmZvIik7ayYmKGg9ay5zY3JvbGxIZWlnaHQtay5zY3JvbGxUb3ApO3ZhciByPXRoaXMuc2VsZWN0ZWROb2RlO3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGYpO2Y9KCk9PntrLnNjcm9sbFRvcD1rLnNjcm9sbEhlaWdodC1ofTtrJiYocj9mKCk6d2luZG93LnNldFRpbWVvdXQoZiwyMCkpfSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXSxmPW51bGwhPVBvbHltZXIuZmx1c2gsaD1mP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxrPWY/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEscj1mP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgbD10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsbC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQobCl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihsLT1sJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9bH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQobCl7bCU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmwmJihsPXRoaXMuX3BoeXNpY2FsQ291bnQrbCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1sfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChsKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWx9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7dmFyIHA9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pOwppZihwPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om47aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4pcmV0dXJuIG4tbiV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7aWYodGhpcy5ncmlkKWw9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXtwPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGw9bik7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1sfXJldHVybiBsfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsaCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihsKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWw9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9bD09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGxbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09bC5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxwPWwtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbT0wPD1wO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWw7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKHApPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KHAtPXRoaXMuX3Njcm9sbE9mZnNldCxtPU1hdGgucm91bmQocC8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxTdGFydCs9bSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihsPXRoaXMuX2dldFJldXNhYmxlcyhtKSxtPyh0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWwuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShsLmluZGV4ZXMsbT9udWxsOmwuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSxyKSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24obCl7dmFyIHA9W10sbT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxuPXRoaXMuX3ZpcnR1YWxTdGFydCxxPXRoaXMuX3ZpcnR1YWxFbmQsdT10aGlzLl9waHlzaWNhbENvdW50LHc9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3AseD10aGlzLl9zY3JvbGxCb3R0b207aWYobCl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXktd31lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09eDtmb3IoOzspe3ZhciBHPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1HO2lmKHAubGVuZ3RoPj11fHxBPD1tKWJyZWFrO2lmKGwpe2lmKHErcC5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih3K0c+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3AucHVzaChDKTt3Kz1HO0M9KEMrMSkldX1lbHNle2lmKDA+PW4tcC5sZW5ndGgpYnJlYWs7aWYodyt0aGlzLl9waHlzaWNhbFNpemUtRzw9eClicmVhaztwLnB1c2goQyk7dy09RztDPTA9PT1DP3UtMTpDLTF9fXJldHVybntpbmRleGVzOnAscGh5c2ljYWxUb3A6dy10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGwscCl7aWYoIShsJiYwPT09bC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMobCk7dGhpcy5fdXBkYXRlTWV0cmljcyhsKTtpZihwKWZvcig7cC5sZW5ndGg7KWw9cC5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGwpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGwpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBwLG09QXJyYXkobCk7Zm9yKHA9MDtwPGw7cCsrKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO21bcF09bi5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChuLnJvb3QpfXJldHVybiBtfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihsKXtsPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrbCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2w9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhsKTtpZih0aGlzLmdyaWQpe3ZhciBwPWwldGhpcy5faXRlbXNQZXJSb3c7cCYmbC1wPD10aGlzLl9waHlzaWNhbENvdW50JiYobCs9dGhpcy5faXRlbXNQZXJSb3cpOwpsLT1wfWwtPXRoaXMuX3BoeXNpY2FsQ291bnQ7cD1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5sKSl7aWYoMDxsKXtwPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChsKSk7Zm9yKHZhciBtPTA7bTxsO20rKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9bDt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1wKS9sO3A9TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1wfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHApKSxrKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMscCkscikpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgbD10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWwucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0KbC5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShsLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBsPXtfX2tleV9fOiEwfTtsW3RoaXMuYXNdPSEwO2xbdGhpcy5pbmRleEFzXT0hMDtsW3RoaXMuc2VsZWN0ZWRBc109ITA7bC50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQpsO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24obCxwKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBwJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGwmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGwpe2lmKCJpdGVtcyI9PT1sLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09bC5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgobC52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYobC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gMDxtLmFkZGVkQ291bnR8fDA8bS5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgcD0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMocCkmJnAuYmx1cigpfWw9bC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gbS5pbmRleCttLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmbS5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFsfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWwucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGwucGF0aCxsLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihsLHApe2w9bC5zbGljZSg2KTt2YXIgbT1sLmluZGV4T2YoIi4iKTstMT09PW0mJihtPWwubGVuZ3RoKTt2YXIgbixxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihmKXt2YXIgdT1wYXJzZUludChsLnN1YnN0cmluZygwLG0pLDEwKTtpZihuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh1KSl7dmFyIHc9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodSk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t3XSl9ZWxzZSBxJiYoQT1xKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dSlyZXR1cm59ZWxzZSBpZih1PWwuc3Vic3RyaW5nKDAsbSkscSYmcS5fX2tleV9fPT09dSlBPXE7ZWxzZSBpZih3PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdV0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3ddKSwhQXx8QS5fX2tleV9fIT09dSlyZXR1cm47bD1sLnN1YnN0cmluZyhtKzEpO2w9dGhpcy5hcysobD8iLiIrbDoiIik7Zj9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobCxwLCExLCEwKTpBLm5vdGlmeVBhdGgobCxwLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7biYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3ddKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihsKXtsLmZvckVhY2goZnVuY3Rpb24ocCl7cC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTtwLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKHA9TWF0aC5tYXgocC5hZGRlZENvdW50LXAucmVtb3ZlZC5sZW5ndGgscC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9cCwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9cCkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24obCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGwpO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1sJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGwscCl7dmFyIG0sbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmcClmb3Iobj0KMDtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTt2YXIgdT10aGlzLl9jb21wdXRlVmlkeChxKTtpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX1lbHNle3E9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodT10aGlzLl92aXJ0dWFsU3RhcnQ7cTx0aGlzLl9waHlzaWNhbENvdW50O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG07Zm9yKHE9MDtxPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cSsrLHUrKylpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGwtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2x9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24obCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAsCm0pe3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0scT10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW21dO2lmKG51bGwhPXEpe3ZhciB1PXRoaXMubW9kZWxGb3JFbGVtZW50KG4pO3UuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHEpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5hcyxxKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocSkpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuaW5kZXhBcyxtKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1tPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdS5fX2tleV9fXT1wO3UuX2ZsdXNoUHJvcGVydGllcyYmdS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxsKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24obCl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgcD0wLG09MCxuPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih1KXttKz10aGlzLl9waHlzaWNhbFNpemVzW3VdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdV09dGhpcy5fcGh5c2ljYWxJdGVtc1t1XS5vZmZzZXRIZWlnaHQ7cCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XT8xOjB9LGwpO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG09MT09PXRoaXMuX2l0ZW1zUGVyUm93P206Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStwLW0sdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1uJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHEqbitwKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgbD10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBwPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXt2YXIgcT1NYXRoLmZsb29yKG4ldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK3ApO3RoaXMuX2lzUlRMJiYocSo9LTEpO3RoaXMudHJhbnNsYXRlM2QocSsicHgiLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cobikmJihsKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSl7dGhpcy50cmFuc2xhdGUzZCgwLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO2wrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChsKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1tsXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24obCl7cmV0dXJuIGwldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1sKXt0aGlzLl9waHlzaWNhbFRvcC09bDt2YXIgcD10aGlzLl9zY3JvbGxUb3A7IWQmJjA8cCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihwLWwpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24obCl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1sJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWwpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGwpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChsPShsPShsPWx8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihsKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGx8fDA+bHx8bD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtsPXRoaXMuX2NsYW1wKGwsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8bD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/bC0yKnRoaXMuX2l0ZW1zUGVyUm93OmwtMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIHA9dGhpcy5fcGh5c2ljYWxTdGFydCxtPXRoaXMuX3ZpcnR1YWxTdGFydCxuPTAscT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTttPGwmJm48PXE7KW4rPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwKSxwPShwKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbSsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K24pO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGgpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQobCkpe3ZhciBwPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTtwJiYocFt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1tsXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpezA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2xdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24obCl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChsKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2xdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGwpOnRoaXMuc2VsZWN0SW5kZXgobCl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGwpe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbbF0pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihsKXsobD90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7dmFyIHA9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO2lmKHApe3ZhciBtPVBvbHltZXIuZG9tKGwpLnBhdGhbMF07bD10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHBbdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1tLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1tLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1tLmxvY2FsTmFtZSl7bT1wLnRhYkluZGV4O3AudGFiSW5kZXg9LTEwMDt2YXIgcT1sP2wudGFiSW5kZXg6LTE7cC50YWJJbmRleD1tO2wmJm4hPT1sJiZuLmNvbnRhaW5zKGwpJiYtMTAwIT09cXx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKHBbdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGwpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9bH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihsKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9bCYmbDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGwpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihsKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChsL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzpsfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGwpe3JldHVybiBsPj10aGlzLl92aXJ0dWFsU3RhcnQmJmw8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmbDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihsKXtyZXR1cm4gZj8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGwtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNbbF0pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGwpfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24obCl7aWYoISgwPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8dGhpcy5zY3JvbGxUb0luZGV4KGwpO3ZhciBwPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0sbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuO20udGFiSW5kZXg9LTEwMDstMTAwPT09cC50YWJJbmRleCYmKG49cCk7bnx8KG49UG9seW1lci5kb20ocCkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7Cm0udGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWw7biYmbi5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIHA9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KcC5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChwLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1tsXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1sO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCnA9dGhpcy5fcGh5c2ljYWxJdGVtc1tsXTtpZihwKXt2YXIgbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTttW3RoaXMuYXNdPT09blt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09cCxtLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGwpe2w9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxtPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKbj10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2wmJihwPT09bD90aGlzLl9pc0luZGV4VmlzaWJsZShuKXx8dGhpcy5zY3JvbGxUb0luZGV4KG4pOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxwJiYocC50YWJJbmRleD0tMSksbC50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9bj1sW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChuKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxtJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihsKXtzd2l0Y2gobC5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmwucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGwpfX0sX2NsYW1wOmZ1bmN0aW9uKGwsCnAsbSl7cmV0dXJuIE1hdGgubWluKG0sTWF0aC5tYXgocCxsKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihsLHAsbSl7Zj8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2xdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbbF0sbSxwLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2xdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UobCxwKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24obCxwLG0pe2Y/bC5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsbSk6bFtwXT1tfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJnRoaXMubW9kZWxGb3JFbGVtZW50KG0pLmZvcndhcmRIb3N0UHJvcChsLApwKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihsLHAsbSl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxwKSYmKGw9bFt0aGlzLmluZGV4QXNdLHA9PXRoaXMuYXMmJih0aGlzLml0ZW1zW2xdPW0pLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrbCxwKSxtKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24obCxwLG0pezA9PT1wLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIrbC5fX2tleV9fKyIuIitwLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLG0pfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJgp0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5ub3RpZnlQYXRoKGwscCwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJih0aGlzLm1vZGVsRm9yRWxlbWVudChtKVtsXT1wKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShsP2wucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJvZHkuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbS1ib2R5In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihrKXtrLkNPTlNUPSJDT05TVCI7ay5NRVRBPSJNRVRBIjtrLk9QPSJPUCI7ay5TRVJJRVM9IlNFUklFUyI7ay5TVU1NQVJZPSJTVU1NQVJZIn0pKGg9Zi5HcmFwaEljb25UeXBlfHwoZi5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoayxyKXtpZihudWxsIT1yKXJldHVybiByO3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgaC5TRVJJRVM6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShrLHIpe2lmKG51bGwhPXIpcmV0dXJuIHI7c3dpdGNoKGspe2Nhc2UgaC5NRVRBOnJldHVybiBiLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGsscil7cmV0dXJuIGs9PT1yfSxfZmFkZWRDbGFzczpmdW5jdGlvbihrLHIpe3JldHVybiBrPyJmYWRlZC0iK3I6IiJ9fSl9KShkLmljb258fChkLmljb249e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIGImJmQmJmYmJmg/KGI9dGYuZ3JhcGguc2NlbmUubm9kZSxiLmdldEZpbGxGb3JOb2RlKGgsYi5Db2xvckJ5W2YudG9VcHBlckNhc2UoKV0sZCwhMSkpOmt9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYik6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYixkLGYsaCl7Y29uc3Qgaz10Zi5ncmFwaC5pY29uLkdyYXBoSWNvblR5cGU7aWYoYilzd2l0Y2goYi50eXBlKXtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk9QOnJldHVybiBiPWIub3AsInN0cmluZyIhPT10eXBlb2YgYj9rLk9QOiJDb25zdCI9PT1ifHxmP2suQ09OU1Q6Yi5lbmRzV2l0aCgiU3VtbWFyeSIpfHxkP2suU1VNTUFSWTprLk9QO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuTUVUQTpyZXR1cm4gay5NRVRBO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuU0VSSUVTOnJldHVybiBrLlNFUklFU31yZXR1cm4gaH0sCl9pc1ZlcnRpY2FsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/Yi5oYXNOb25Db250cm9sRWRnZXM6ISFkfSxfZ2V0RmFkZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dH0sX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChiLGQpe2NvbnN0IGY9dGhpcy5ub2RlLGg9dGhpcy5yZW5kZXJJbmZvLGs9dGhpcy5jb2xvckJ5LHI9dGhpcy50ZW1wbGF0ZUluZGV4LGw9dGYuZ3JhcGguc2NlbmUubm9kZTtiIT09ZCYmbC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZiYmaCYmayYmciYmbC5nZXRGaWxsRm9yTm9kZShyLGwuQ29sb3JCeVtrLnRvVXBwZXJDYXNlKCldLGgsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYi50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXRSZW5kZXJJbmZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoYil9LF90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/CiJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX2dldEluY29tcGF0aWJsZU9wTm9kZXM6ZnVuY3Rpb24oYixkKXtpZihiJiZiLnJvb3QpcmV0dXJuIHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNpbmNvbXBhdGlibGVPcHNMaXN0IikpLHRmLmdyYXBoLmhpZXJhcmNoeS5nZXRJbmNvbXBhdGlibGVPcHMoYixkKX0sX2NvbXB1dGVPcENvbXBhdFNjb3JlOmZ1bmN0aW9uKGIpe2lmKGImJmIucm9vdCl7dmFyIGQ9Yi5yb290O2I9ZC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7ZD1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlO3JldHVybiAwPT1iJiYwPT1kPzA6TWF0aC5mbG9vcigxMDAqYi8oYitkKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGIpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGIpfSwKX2dldFRvdGFsSW5jb21wYXRpYmxlT3BzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLnJvb3Q/Yi5yb290LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOjB9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtbm9kZS1saXN0LWl0ZW0uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1saXN0LWl0ZW0iLHByb3BlcnRpZXM6e2NhcmROb2RlOk9iamVjdCxpdGVtTm9kZTpPYmplY3QsZWRnZUxhYmVsOlN0cmluZyxpdGVtUmVuZGVySW5mbzpPYmplY3QsbmFtZTpTdHJpbmcsaXRlbVR5cGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaXRlbVR5cGVDaGFuZ2VkIn0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczpPYmplY3QsdGVtcGxhdGVJbmRleDpGdW5jdGlvbn0sX2l0ZW1UeXBlQ2hhbmdlZDpmdW5jdGlvbigpeyJzdWJub2RlIiE9PXRoaXMuaXRlbVR5cGU/dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QuYWRkKCJjbGlja2FibGUiKTp0aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5yZW1vdmUoImNsaWNrYWJsZSIpfSxfbm9kZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIitiLnR5cGUse2NhcmROb2RlOnRoaXMuY2FyZE5vZGUubmFtZSxub2RlTmFtZTp0aGlzLm5hbWUsCnR5cGU6dGhpcy5pdGVtVHlwZX0pfSxfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtbm9kZS1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW5vZGUtaW5mbyIscHJvcGVydGllczp7Z3JhcGhOb2RlTmFtZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3QsY29sb3JCeTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9ub2RlOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGUoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpIixvYnNlcnZlcjoiX3Jlc2V0U3RhdGUifSxfbm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGVTdGF0cyhncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9oYXNEaXNwbGF5YWJsZU5vZGVTdGF0czp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRIYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlczp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMoX25vZGVTdGF0cykifSxfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUoX25vZGVTdGF0cykifSxfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplcyhfbm9kZVN0YXRzKSJ9LG5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixvYnNlcnZlcjoiX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkIn0sX2F0dHJpYnV0ZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRBdHRyaWJ1dGVzKF9ub2RlKSJ9LF9kZXZpY2U6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0RGV2aWNlKF9ub2RlKSJ9LF9zdWNjZXNzb3JzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldFN1Y2Nlc3NvcnMoX25vZGUsIGdyYXBoSGllcmFyY2h5KSJ9LApfcHJlZGVjZXNzb3JzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldFByZWRlY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX2Z1bmN0aW9uVXNhZ2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0RnVuY3Rpb25Vc2FnZXMoX25vZGUsIGdyYXBoSGllcmFyY2h5KSJ9LF9zdWJub2Rlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldFN1Ym5vZGVzKF9ub2RlKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfdG90YWxQcmVkZWNlc3NvcnM6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfZ2V0VG90YWxQcmVkKF9wcmVkZWNlc3NvcnMpIn0sX3RvdGFsU3VjY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFN1Y2MoX3N1Y2Nlc3NvcnMpIn0sX29wZW5lZENvbnRyb2xQcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcGVuZWRDb250cm9sU3VjYzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYXV4QnV0dG9uVGV4dDpTdHJpbmcsX2dyb3VwQnV0dG9uVGV4dDpTdHJpbmd9LApleHBhbmROb2RlOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJfbm9kZS5leHBhbmQiLHRoaXMubm9kZSl9LF9nZXRUZW1wbGF0ZUluZGV4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldFRlbXBsYXRlSW5kZXgoKX0sX2dldE5vZGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gZC5ub2RlKGIpfSxfZ2V0Tm9kZVN0YXRzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuKGI9dGhpcy5fZ2V0Tm9kZShiLGQpKT9iLnN0YXRzOm51bGx9LF9nZXRUb3RhbE1pY3JvczpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmdldFRvdGFsTWljcm9zKCk6MH0sX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC51dGlsLmhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKGIpfSxfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXM6ZnVuY3Rpb24oYil7aWYoYiYmYi50b3RhbEJ5dGVzKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLnRvdGFsQnl0ZXMsdGYuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpfSwKX2dldE5vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lOmZ1bmN0aW9uKGIpe2lmKGImJmIuZ2V0VG90YWxNaWNyb3MoKSlyZXR1cm4gdGYuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoYi5nZXRUb3RhbE1pY3JvcygpLHRmLmdyYXBoLnV0aWwuVElNRV9VTklUUyl9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczpmdW5jdGlvbihiKXtpZihiJiZiLm91dHB1dFNpemUmJmIub3V0cHV0U2l6ZS5sZW5ndGgpcmV0dXJuIF8ubWFwKGIub3V0cHV0U2l6ZSxmdW5jdGlvbihkKXtyZXR1cm4gMD09PWQubGVuZ3RoPyJzY2FsYXIiOiJbIitkLmpvaW4oIiwgIikrIl0ifSl9LF9nZXRSZW5kZXJJbmZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoYil9LF9nZXRBdHRyaWJ1dGVzOmZ1bmN0aW9uKGIpe3RoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNhdHRyaWJ1dGVzTGlzdCIpKTsKaWYoIWJ8fCFiLmF0dHIpcmV0dXJuW107dmFyIGQ9W107Xy5lYWNoKGIuYXR0cixmdW5jdGlvbihmKXtmLmtleT09PXRmLmdyYXBoLkxBUkdFX0FUVFJTX0tFWT9kPWQuY29uY2F0KGYudmFsdWUubGlzdC5zLm1hcChmdW5jdGlvbihoKXtyZXR1cm57a2V5OmgsdmFsdWU6IlRvbyBsYXJnZSB0byBzaG93Li4uIn19KSk6ZC5wdXNoKHtrZXk6Zi5rZXksdmFsdWU6SlNPTi5zdHJpbmdpZnkoZi52YWx1ZSl9KX0pO3JldHVybiBkfSxfZ2V0RGV2aWNlOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IuZGV2aWNlOm51bGx9LF9nZXRTdWNjZXNzb3JzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiaW5wdXRzTGlzdCIpO3JldHVybiBiP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGQuZ2V0U3VjY2Vzc29ycyhiLm5hbWUpLCExLGIuaXNHcm91cE5vZGUpOntyZWd1bGFyOltdLGNvbnRyb2w6W119fSxfZ2V0UHJlZGVjZXNzb3JzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgib3V0cHV0c0xpc3QiKTsKcmV0dXJuIGI/dGhpcy5fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QoZC5nZXRQcmVkZWNlc3NvcnMoYi5uYW1lKSwhMCxiLmlzR3JvdXBOb2RlKTp7cmVndWxhcjpbXSxjb250cm9sOltdfX0sX2dldEZ1bmN0aW9uVXNhZ2VzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiZnVuY3Rpb25Vc2FnZXNMaXN0Iik7cmV0dXJuIGImJmIudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEE/KGI9ZC5saWJyYXJ5RnVuY3Rpb25zW2IuYXNzb2NpYXRlZEZ1bmN0aW9uXSk/Yi51c2FnZXM6W106W119LF9yZWZyZXNoTm9kZUl0ZW1MaXN0KGIpe3RoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsYCMke2J9YCkpfSxfY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3Q6ZnVuY3Rpb24oYixkLGYpe3ZhciBoPXI9Pl8ubWFwKHIuYmFzZUVkZ2VMaXN0LGw9Pnt2YXIgcD1kP2wudjpsLnc7cmV0dXJue25hbWU6cCxub2RlOnRoaXMuX2dldE5vZGUocCx0aGlzLmdyYXBoSGllcmFyY2h5KSwKZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JCYXNlRWRnZShsLHRoaXMucmVuZGVySGllcmFyY2h5KSxyZW5kZXJJbmZvOnRoaXMuX2dldFJlbmRlckluZm8ocCx0aGlzLnJlbmRlckhpZXJhcmNoeSl9fSksaz1mdW5jdGlvbihyKXt2YXIgbD1bXTtfLmVhY2gocixwPT57dmFyIG09ZD9wLnY6cC53O2YmJjEhPXAuYmFzZUVkZ2VMaXN0Lmxlbmd0aD9sLnB1c2goe25hbWU6bSxub2RlOnRoaXMuX2dldE5vZGUobSx0aGlzLmdyYXBoSGllcmFyY2h5KSxlZGdlTGFiZWw6dGYuZ3JhcGguc2NlbmUuZWRnZS5nZXRMYWJlbEZvckVkZ2UocCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKG0sdGhpcy5yZW5kZXJIaWVyYXJjaHkpfSk6bD1sLmNvbmNhdChoKHApKX0pO3JldHVybiBsfS5iaW5kKHRoaXMpO3JldHVybntyZWd1bGFyOmsoYi5yZWd1bGFyKSxjb250cm9sOmsoYi5jb250cm9sKX19LF9nZXRTdWJub2RlczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmCmIubWV0YWdyYXBoP2IubWV0YWdyYXBoLm5vZGVzKCk6bnVsbH0sX2dldFRvdGFsUHJlZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZWd1bGFyLmxlbmd0aCtiLmNvbnRyb2wubGVuZ3RofSxfZ2V0VG90YWxTdWNjOmZ1bmN0aW9uKGIpe3JldHVybiBiLnJlZ3VsYXIubGVuZ3RoK2IuY29udHJvbC5sZW5ndGh9LF90b2dnbGVDb250cm9sUHJlZDpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xQcmVkPSF0aGlzLl9vcGVuZWRDb250cm9sUHJlZH0sX3RvZ2dsZUNvbnRyb2xTdWNjOmZ1bmN0aW9uKCl7dGhpcy5fb3BlbmVkQ29udHJvbFN1Y2M9IXRoaXMuX29wZW5lZENvbnRyb2xTdWNjfSxfdG9nZ2xlRXhwYW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLl9leHBhbmRlZD0hdGhpcy5fZXhwYW5kZWR9LF9nZXRUb2dnbGVJY29uOmZ1bmN0aW9uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0KdGhpcy5fb3BlbmVkQ29udHJvbFByZWQ9ITE7dGhpcy5zZXQoIl9ncm91cEJ1dHRvblRleHQiLHRmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0R3JvdXBTZXR0aW5nTGFiZWwodGhpcy5fbm9kZSkpfSxfcmVzaXplTGlzdDpmdW5jdGlvbihiKXsoYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGIpKSYmYi5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfdG9nZ2xlSW5jbHVkZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgibm9kZS10b2dnbGUtaW5jbHVzaW9uIix7bmFtZTp0aGlzLmdyYXBoTm9kZU5hbWV9KX0sX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdGYuZ3JhcGguZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYikpfSxfdG9nZ2xlR3JvdXA6ZnVuY3Rpb24oKXt2YXIgYj10Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFNlcmllc05hbWUodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6Yn0pfSwKX2lzTGlicmFyeUZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm5hbWUuc3RhcnRzV2l0aCh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKX0sX2lzSW5TZXJpZXM6ZnVuY3Rpb24oYil7cmV0dXJuIHRmLmdyYXBoLnNjZW5lLm5vZGUuY2FuQmVJblNlcmllcyhiKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ncmFwaC1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWluZm8iLHByb3BlcnRpZXM6e3RpdGxlOlN0cmluZyxncmFwaEhpZXJhcmNoeTpPYmplY3QsZ3JhcGg6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3Qsbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxjb2xvckJ5OlN0cmluZyxjb21wYXROb2RlVGl0bGU6U3RyaW5nLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlSW5jbHVkZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxkZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW59LGxpc3RlbmVyczp7Im5vZGUtbGlzdC1pdGVtLWNsaWNrIjoiX25vZGVMaXN0SXRlbUNsaWNrZWQiLCJub2RlLWxpc3QtaXRlbS1tb3VzZW92ZXIiOiJfbm9kZUxpc3RJdGVtTW91c2VvdmVyIiwibm9kZS1saXN0LWl0ZW0tbW91c2VvdXQiOiJfbm9kZUxpc3RJdGVtTW91c2VvdXQifSwKX25vZGVMaXN0SXRlbUNsaWNrZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZE5vZGU9Yi5kZXRhaWwubm9kZU5hbWV9LF9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXI6ZnVuY3Rpb24oYil7dGhpcy5oaWdobGlnaHRlZE5vZGU9Yi5kZXRhaWwubm9kZU5hbWV9LF9ub2RlTGlzdEl0ZW1Nb3VzZW91dDpmdW5jdGlvbigpe3RoaXMuaGlnaGxpZ2h0ZWROb2RlPW51bGx9LF9oZWFsdGhQaWxsc0F2YWlsYWJsZTpmdW5jdGlvbihiLGQpe3JldHVybiBiJiZkJiYwPE9iamVjdC5rZXlzKGQpLmxlbmd0aH0sX2VxdWFsczpmdW5jdGlvbihiLGQpe3JldHVybiBiPT09ZH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtYm9hcmQvdGYtZ3JhcGgtYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtYm9hcmQiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LHByb2dyZXNzOk9iamVjdCx0cmFjZUlucHV0czpCb29sZWFuLGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixkZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6MH0saGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXIsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZywKbm90aWZ5OiEwfSxjb21wYXROb2RlVGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJUUFUgQ29tcGF0aWJpbGl0eSJ9LGVkZ2VXaWR0aEZ1bmN0aW9uOk9iamVjdCxfc2VsZWN0ZWROb2RlSW5jbHVkZTpOdW1iZXIsX2hpZ2hsaWdodGVkTm9kZTpTdHJpbmcsaGFuZGxlTm9kZVNlbGVjdGVkOk9iamVjdCxlZGdlTGFiZWxGdW5jdGlvbjpPYmplY3QsaGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU5vZGVJbmNsdWRlKHNlbGVjdGVkTm9kZSwgcmVuZGVySGllcmFyY2h5KSJdLGZpdDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaC5maXQoKX0sX2lzTm90Q29tcGxldGU6ZnVuY3Rpb24oYil7cmV0dXJuIDEwMD5iLnZhbHVlfSxfZ2V0Q29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oYil7dmFyIGQ9ImNvbnRhaW5lciI7Yi5lcnJvciYmKGQrPSIgZXJyb3IiKTt0aGlzLl9pc05vdENvbXBsZXRlKGIpJiYoZCs9IiBsb2FkaW5nIik7cmV0dXJuIGR9LF9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkKGIpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlRXh0cmFjdChiLmRldGFpbC5uYW1lKX0sCl9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQoYil7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVTZXJpZXNHcm91cChiLmRldGFpbC5uYW1lKX0sX3VwZGF0ZU5vZGVJbmNsdWRlKCl7Y29uc3QgYj10aGlzLnJlbmRlckhpZXJhcmNoeT90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROb2RlQnlOYW1lKHRoaXMuc2VsZWN0ZWROb2RlKTpudWxsO3RoaXMuX3NlbGVjdGVkTm9kZUluY2x1ZGU9Yj9iLmluY2x1ZGU6dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1idXR0b24vcGFwZXItcmFkaW8tYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgYj1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLApkPU1hdGguZmxvb3IoMypiKTtkJTIhPT1iJTImJmQrKzt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIjpkKyJweCJ9KX19KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1ncm91cC9wYXBlci1yYWRpby1ncm91cC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1yYWRpby1ncm91cCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJyYWRpb2dyb3VwIn0scHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToibmFtZSJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiY2hlY2tlZCJ9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci1yYWRpby1idXR0b24ifSxhbGxvd0VtcHR5U2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxzZWxlY3Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fdmFsdWVUb0l0ZW0oYik7aWYoIWR8fCFkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7aWYodGhpcy5zZWxlY3RlZCl7ZD10aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTtpZih0aGlzLnNlbGVjdGVkPT1iKWlmKHRoaXMuYWxsb3dFbXB0eVNlbGVjdGlvbiliPSIiO2Vsc2V7ZCYmCihkLmNoZWNrZWQ9ITApO3JldHVybn1kJiYoZC5jaGVja2VkPSExKX1Qb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3Iuc2VsZWN0LmFwcGx5KHRoaXMsW2JdKTt0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNQcmV2aW91cygpO2IucHJldmVudERlZmF1bHQoKTt0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNOZXh0KCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsLl9vbkxlZnRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uUmlnaHRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sdGlwL3BhcGVyLXRvb2x0aXAuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbHRpcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2x0aXAiLHRhYmluZGV4Oi0xfSxwcm9wZXJ0aWVzOntmb3I6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfZmluZFRhcmdldCJ9LG1hbnVhbE1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX21hbnVhbE1vZGVDaGFuZ2VkIn0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxmaXRUb1Zpc2libGVCb3VuZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sb2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZToxNH0sbWFyZ2luVG9wOnt0eXBlOk51bWJlcix2YWx1ZToxNH0sYW5pbWF0aW9uRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxvYnNlcnZlcjoiX2RlbGF5Q2hhbmdlIn0sYW5pbWF0aW9uRW50cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25FeGl0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlLGQ9UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP1BvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTpiLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/ZC5ob3N0OmJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LApwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGIpeyJlbnRyeSI9PT1iP3RoaXMuc2hvdygpOiJleGl0Ij09PWImJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1Qb2x5bWVyLmRvbSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgYj0hMCxkPVBvbHltZXIuZG9tKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxmPTA7ZjxkLmxlbmd0aDtmKyspaWYoIiIhPT1kW2ZdLnRleHRDb250ZW50LnRyaW0oKSl7Yj0hMTticmVha31pZihiKXJldHVybn10aGlzLl9zaG93aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSk7CnRoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSl9fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmc/KHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCkpOih0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCkpfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciBiPXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYoYj10aGlzLm1hcmdpblRvcCk7dmFyIGQ9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmg9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxrPShmLndpZHRoLWgud2lkdGgpLzIscj0oZi5oZWlnaHQtaC5oZWlnaHQpLzIsbD1mLmxlZnQtZC5sZWZ0LHA9Zi50b3AtZC50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UgInRvcCI6dmFyIG09bCtrO3ZhciBuPXAtaC5oZWlnaHQtYjticmVhaztjYXNlICJib3R0b20iOm09bCtrO249cCtmLmhlaWdodCtiO2JyZWFrO2Nhc2UgImxlZnQiOm09bC1oLndpZHRoLWI7bj1wK3I7YnJlYWs7Y2FzZSAicmlnaHQiOm09bCtmLndpZHRoK2Isbj1wK3J9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGQubGVmdCttK2gud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLG0pKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGQudG9wK24raC5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT0KZC5oZWlnaHQrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtZC50b3AsbikrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PW0rInB4Iix0aGlzLnN0eWxlLnRvcD1uKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKTt0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSwKX2ZpbmRUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO3RoaXMuX3RhcmdldD10aGlzLnRhcmdldDt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX2FkZExpc3RlbmVycygpfSxfZGVsYXlDaGFuZ2U6ZnVuY3Rpb24oYil7NTAwIT09YiYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmIrIm1zIn0pfSxfbWFudWFsTW9kZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGU/dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk6dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9jYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIik7CnRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMTt0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24oYil7aWYoImVudHJ5Ij09PWImJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTsKaWYoImV4aXQiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0ubmFtZSl7aWYodGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcuZGVsYXkmJjAhPT10aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcuZGVsYXkpe3ZhciBkPXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheTsiZW50cnkiPT09Yj90aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6ZCsibXMifSk6ImV4aXQiPT09YiYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0IjpkKyJtcyJ9KX1yZXR1cm4gdGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0ubmFtZX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl90YXJnZXQmJgoodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ub2RlLXNlYXJjaC90Zi1ncmFwaC1ub2RlLXNlYXJjaC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3Jhd1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUmVnZXhJbnB1dChyZW5kZXJIaWVyYXJjaHksIF9yYXdSZWdleElucHV0KSJ9LF9wcmV2aW91c1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfc2VhcmNoVGltZW91dERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZToxNTAscmVhZE9ubHk6ITB9LF9zZWFyY2hQZW5kaW5nOkJvb2xlYW4sX21heFJlZ2V4UmVzdWx0czp7dHlwZTpOdW1iZXIsdmFsdWU6NDJ9LF9yZWdleE1hdGNoZXM6QXJyYXl9LG9ic2VydmVyczpbIl9yZWdleElucHV0Q2hhbmdlZChfcmVnZXhJbnB1dCkiXSxfY29tcHV0ZVJlZ2V4SW5wdXQoYixkKXtyZXR1cm4gZC50cmltKCl9LApfcmVnZXhJbnB1dENoYW5nZWQoKXt0aGlzLl9yZXF1ZXN0U2VhcmNoKCl9LF9jbGVhclNlYXJjaFJlc3VsdHMoKXt0aGlzLnNldCgiX3JlZ2V4TWF0Y2hlcyIsW10pfSxfcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0PT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0P3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE6KHRoaXMuX3NlYXJjaFBlbmRpbmc9ITAsdGhpcy5fZXhlY3V0ZVNlYXJjaCgpLHRoaXMuYXN5bmMoKCk9Pnt0aGlzLl9zZWFyY2hQZW5kaW5nPSExO3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSkpfSxfZXhlY3V0ZVNlYXJjaCgpe2lmKHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD10aGlzLl9yZWdleElucHV0KXt0cnl7dmFyIGI9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaChmKXt0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTtyZXR1cm59dmFyIGQ9W107Xy5lYWNoKHRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXROb2RlTWFwKCksCihmLGgpPT57aWYoZC5sZW5ndGg+PXRoaXMuX21heFJlZ2V4UmVzdWx0cylyZXR1cm4hMTtiLnRlc3QoaCkmJmQucHVzaChoKX0pO3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixkKX1lbHNlIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpfSxfbWF0Y2hDbGlja2VkKGIpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGIubW9kZWwuaXRlbSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29udHJvbHMvdGYtZ3JhcGgtY29udHJvbHMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y29uc3QgaD0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8saz1be3JlZ2V4Omh9XSxyPVtdO2xldCBsOyhmdW5jdGlvbihtKXttLkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIjttLk1FTU9SWT0ibWVtb3J5IjttLlNUUlVDVFVSRT0ic3RydWN0dXJlIjttLlhMQV9DTFVTVEVSPSJ4bGFfY2x1c3RlciI7bS5PUF9DT01QQVRJQklMSVRZPSJvcF9jb21wYXRpYmlsaXR5In0pKGw9Zi5Db2xvckJ5fHwoZi5Db2xvckJ5PXt9KSk7Y29uc3QgcD1uZXcgU2V0KFtsLkNPTVBVVEVfVElNRSxsLk1FTU9SWV0pO1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1jb250cm9scyIscHJvcGVydGllczp7c3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zdGF0c0NoYW5nZWQifSxkZXZpY2VzRm9yU3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRvbmx5OiEwfSxjb2xvckJ5Ont0eXBlOlN0cmluZywKdmFsdWU6bC5TVFJVQ1RVUkUsbm90aWZ5OiEwfSxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGRhdGFzZXRzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIix2YWx1ZTooKT0+W119LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3R9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0sc2VsZWN0ZWRGaWxlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9zZWxlY3RlZFJ1bkluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQifSx0cmFjZUlucHV0czp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX3NlbGVjdGVkVGFnSW5kZXg6e3R5cGU6TnVtYmVyLAp2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSxfc2VsZWN0ZWRHcmFwaFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jdXJyZW50RGV2aWNlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VzKGRldmljZXNGb3JTdGF0cykifSxfY3VycmVudERldmljZVBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VQYXJhbXMoY29sb3JCeVBhcmFtcykifSxfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50R3JhZGllbnRQYXJhbXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zKGNvbG9yQnlQYXJhbXMsIGNvbG9yQnkpIn0sCnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LHNob3dVcGxvYWRCdXR0b246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZDpCb29sZWFuLGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGVnZW5kT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxfeGxhQ2x1c3RlcnNQcm92aWRlZDpmdW5jdGlvbihtKXtyZXR1cm4gbSYmbS5oaWVyYXJjaHkmJjA8bS5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RofSxfc3RhdHNDaGFuZ2VkOmZ1bmN0aW9uKG0pe2lmKG51bGwhPW0pe3ZhciBuPXt9O18uZWFjaChtLmRldl9zdGF0cyxmdW5jdGlvbihxKXt2YXIgdT1fLnNvbWUoayxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pLHc9Xy5zb21lKHIsZnVuY3Rpb24oQSl7cmV0dXJuIEEucmVnZXgudGVzdChxLmRldmljZSl9KTt1JiYhdyYmKG5bcS5kZXZpY2VdPQohMCl9KTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX19LF9nZXRDdXJyZW50RGV2aWNlczpmdW5jdGlvbihtKXt2YXIgbj10aGlzLnN0YXRzO249KG4/bi5kZXZfc3RhdHM6W10pLm1hcCh1PT51LmRldmljZSkuZmlsdGVyKHU9Pmsuc29tZSh3PT53LnJlZ2V4LnRlc3QodSkpKTtjb25zdCBxPWIuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgobik7aWYoMT09cS5sZW5ndGgpe2NvbnN0IHU9cVswXS5tYXRjaChoKTt1JiYocVswXT11WzFdKX1yZXR1cm4gbi5tYXAoKHUsdyk9PntsZXQgQT1udWxsO3IuZm9yRWFjaCh5PT57eS5yZWdleC50ZXN0KHUpJiYoQT15Lm1zZyl9KTtyZXR1cm57ZGV2aWNlOnUsc3VmZml4OnFbd10sdXNlZDptW3VdLGlnbm9yZWRNc2c6QX19KX0sX2RldmljZUNoZWNrYm94Q2xpY2tlZDpmdW5jdGlvbihtKXttPW0udGFyZ2V0O2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSx0aGlzLmRldmljZXNGb3JTdGF0cykscT1tLnZhbHVlO20uY2hlY2tlZD8KbltxXT0hMDpkZWxldGUgbltxXTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX0sX251bVRhZ3M6ZnVuY3Rpb24obSxuKXtyZXR1cm4gdGhpcy5fZ2V0VGFncyhtLG4pLmxlbmd0aH0sX2dldFRhZ3M6ZnVuY3Rpb24obSxuKXtyZXR1cm4gbSYmbVtuXT9tW25dLnRhZ3M6W119LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImZpdC10YXAiKX0sX2lzR3JhZGllbnRDb2xvcmluZzpmdW5jdGlvbihtLG4pe3JldHVybiBwLmhhcyhuKSYmbnVsbCE9bX0sX2VxdWFsczpmdW5jdGlvbihtLG4pe3JldHVybiBtPT09bn0sX2dldEN1cnJlbnREZXZpY2VQYXJhbXM6ZnVuY3Rpb24obSl7bT1tLmRldmljZS5maWx0ZXIodT0+ay5zb21lKHc9PncucmVnZXgudGVzdCh1LmRldmljZSkpKTtjb25zdCBuPWIuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgobS5tYXAodT0+dS5kZXZpY2UpKTtpZigxPT1uLmxlbmd0aCl7dmFyIHE9blswXS5tYXRjaChoKTtxJiYoblswXT1xWzFdKX1yZXR1cm4gbS5tYXAoKHUsCncpPT4oe2RldmljZTpuW3ddLGNvbG9yOnUuY29sb3J9KSl9LF9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtczpmdW5jdGlvbihtKXtyZXR1cm4gbS54bGFfY2x1c3Rlcn0sX2dldEN1cnJlbnRHcmFkaWVudFBhcmFtczpmdW5jdGlvbihtLG4pe2lmKHRoaXMuX2lzR3JhZGllbnRDb2xvcmluZyh0aGlzLnN0YXRzLG4pKXttPW1bbl07dmFyIHE9bS5taW5WYWx1ZSx1PW0ubWF4VmFsdWU7bj09PWwuTUVNT1JZPyhxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSx1PWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUodSxiLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSk6bj09PWwuQ09NUFVURV9USU1FJiYocT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHEsYi5ncmFwaC51dGlsLlRJTUVfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LApiLmdyYXBoLnV0aWwuVElNRV9VTklUUykpO3JldHVybnttaW5WYWx1ZTpxLG1heFZhbHVlOnUsc3RhcnRDb2xvcjptLnN0YXJ0Q29sb3IsZW5kQ29sb3I6bS5lbmRDb2xvcn19fSxkb3dubG9hZDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaGRvd25sb2FkLmNsaWNrKCl9LF91cGRhdGVGaWxlSW5wdXQ6ZnVuY3Rpb24obSl7dmFyIG49bS50YXJnZXQuZmlsZXNbMF07aWYobil7bj1uLm5hbWU7dmFyIHE9bi5sYXN0SW5kZXhPZigiLiIpOzA8PXEmJihuPW4uc3Vic3RyaW5nKDAscSkpO3E9bi5sYXN0SW5kZXhPZigiLyIpOzA8PXEmJihuPW4uc3Vic3RyaW5nKHErMSkpO3RoaXMuX3NldERvd25sb2FkRmlsZW5hbWUobik7dGhpcy5zZXQoInNlbGVjdGVkRmlsZSIsbSl9fSxfZGF0YXNldHNDaGFuZ2VkOmZ1bmN0aW9uKG0sbil7bnVsbCE9biYmKHRoaXMuX3NlbGVjdGVkUnVuSW5kZXg9MCl9LF9jb21wdXRlU2VsZWN0aW9uOmZ1bmN0aW9uKG0sbixxLHUpe3JldHVybiBtW25dJiZtW25dLnRhZ3NbcV0/CntydW46bVtuXS5uYW1lLHRhZzptW25dLnRhZ3NbcV0udGFnLHR5cGU6dX06bnVsbH0sX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKG0pe3RoaXMuZGF0YXNldHMmJih0aGlzLmNvbG9yQnk9bC5TVFJVQ1RVUkUsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCksdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKHRoaXMuZGF0YXNldHNbbV0/dGhpcy5kYXRhc2V0c1ttXS5uYW1lOiIiKSl9LF9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9LF9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpe2NvbnN0IG09dGhpcy5kYXRhc2V0cyxuPXRoaXMuX3NlbGVjdGVkUnVuSW5kZXgscT10aGlzLl9zZWxlY3RlZFRhZ0luZGV4O3JldHVybiBtJiZtW25dJiZtW25dLnRhZ3NbcV0mJgohbVtuXS50YWdzW3FdLm9wR3JhcGg/bVtuXS50YWdzW3FdLnByb2ZpbGU/Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6bVtuXS50YWdzW3FdLmNvbmNlcHR1YWxHcmFwaD9iLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxfZ2V0RmlsZTpmdW5jdGlvbigpe3RoaXMuJCQoIiNmaWxlIikuY2xpY2soKX0sX3NldERvd25sb2FkRmlsZW5hbWU6ZnVuY3Rpb24obSl7dGhpcy4kLmdyYXBoZG93bmxvYWQuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsbSsiLnBuZyIpfSxfc3RhdHNOb3ROdWxsOmZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT09bX0sX3RvZ2dsZUxlZ2VuZE9wZW4oKXt0aGlzLnNldCgiX2xlZ2VuZE9wZW5lZCIsIXRoaXMuX2xlZ2VuZE9wZW5lZCl9LF9nZXRUb2dnbGVUZXh0KG0pe3JldHVybiBtPyJDbG9zZSBsZWdlbmQuIjoiRXhwYW5kIGxlZ2VuZC4ifSwKX2dldFRvZ2dsZUxlZ2VuZEljb24obSl7cmV0dXJuIG0/ImV4cGFuZC1tb3JlIjoiZXhwYW5kLWxlc3MifSxfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKG0sbixxKXtyZXR1cm4hbVtuXXx8IW1bbl0udGFnc1txXXx8IW1bbl0udGFnc1txXS5vcEdyYXBofSxfZ2V0U2VsZWN0aW9uUHJvZmlsZURpc2FibGVkKG0sbixxKXtyZXR1cm4hbVtuXXx8IW1bbl0udGFnc1txXXx8IW1bbl0udGFnc1txXS5wcm9maWxlfSxfZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLmNvbmNlcHR1YWxHcmFwaH19KX0pKGQuY29udHJvbHN8fChkLmNvbnRyb2xzPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWRhc2hib2FyZC90Zi1ncmFwaC1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfZGF0YXNldHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZGF0YXNldHNGZXRjaGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zZWxlY3RlZERhdGFzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9yZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9kZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYWxsU3RlcHNNb2RlRW5hYmxlZDpCb29sZWFuLHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQifSwKc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pc0F0dGFjaGVkOkJvb2xlYW4sX2luaXRpYWxpemVkOkJvb2xlYW4sX2FyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLF9kZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxfbm9kZU5hbWVzVG9IZWFsdGhQaWxsczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9oZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixfaGVhbHRoUGlsbFJlcXVlc3RJZDp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ6TnVtYmVyLF9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5Ont0eXBlOk51bWJlcix2YWx1ZTo1MDAscmVhZE9ubHk6ITB9LHJ1bnM6QXJyYXkscnVuOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6YmQuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInJ1biIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITF9KSxvYnNlcnZlcjoiX3J1bk9ic2VydmVyIn0sCl9zZWxlY3Rpb246e3R5cGU6T2JqZWN0fSxfY29tcGF0aWJpbGl0eVByb3ZpZGVyOk9iamVjdCxfdHJhY2VJbnB1dHM6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS10b2dnbGUtZXhwYW5kIjoiX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQifSxvYnNlcnZlcnM6WyJfbWF5YmVGZXRjaEhlYWx0aFBpbGxzKF9kZWJ1Z2dlckRhdGFFbmFibGVkLCBhbGxTdGVwc01vZGVFbmFibGVkLCBzcGVjaWZpY0hlYWx0aFBpbGxTdGVwLCBfc2VsZWN0ZWROb2RlKSIsIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQoX2lzQXR0YWNoZWQpIiwiX2RldGVybWluZVNlbGVjdGVkRGF0YXNldChfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsIHJ1bikiLCJfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsIF9zZWxlY3RlZERhdGFzZXQpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLAohMSl9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWR8fHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZGMuZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoYj0+e2IuY2FuY2VsbGVkfHxiLnZhbHVlWyJkZWJ1Z2dlciJdJiZ0aGlzLnNldCgiX2RlYnVnZ2VyRGF0YUVuYWJsZWQiLCEwKX0pKTt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuJCQoIiNncmFwaGJvYXJkIikuZml0KCl9LF9ydW5PYnNlcnZlcjpiZC5nZXRTdHJpbmdPYnNlcnZlcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHBvbHltZXJQcm9wZXJ0eToicnVuIix1c2VMb2NhbFN0b3JhZ2U6ITF9KSxfZmV0Y2hEYXRhc2V0KCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9pbmZvIikpfSxfZmV0Y2hIZWFsdGhQaWxscyhiLApkKXtiPXtub2RlX25hbWVzOkpTT04uc3RyaW5naWZ5KGIpLHJ1bjoiX19kZWJ1Z2dlcl9kYXRhX18ifTt2b2lkIDAhPT1kJiYoYi5zdGVwPWQpO2Q9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2hlYWx0aF9waWxscyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQsYil9LF9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvbnVtZXJpY3NfYWxlcnRfcmVwb3J0IikpfSxfZ3JhcGhVcmwoYixkLGYpe3JldHVybiBkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixuZXcgVVJMU2VhcmNoUGFyYW1zKHtydW46YixsaW1pdF9hdHRyX3NpemU6ZCxsYXJnZV9hdHRyc19rZXk6Zn0pKX0sX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxsczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z2dlckRhdGFFbmFibGVkJiYKdGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmdGhpcy5fcmVuZGVySGllcmFyY2h5JiZ0aGlzLl9kYXRhc2V0c1N0YXRlKHRoaXMuX2RhdGFzZXRzRmV0Y2hlZCx0aGlzLl9kYXRhc2V0cywiUFJFU0VOVCIpfSxfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkOmZ1bmN0aW9uKGIpeyF0aGlzLl9pbml0aWFsaXplZCYmYiYmKHRoaXMuc2V0KCJfY29tcGF0aWJpbGl0eVByb3ZpZGVyIixuZXcgdGYuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyKSx0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9mZXRjaERhdGFzZXQoKS50aGVuKGQ9Pnt0aGlzLl9kYXRhc2V0cz1PYmplY3Qua2V5cyhkKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcykubWFwKGY9Pntjb25zdCBoPWRbZl07dmFyIGs9T2JqZWN0LmtleXMoaC50YWdzKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcykubWFwKHI9PmgudGFnc1tyXSkubWFwKCh7dGFnOnIsY29uY2VwdHVhbF9ncmFwaDpsLG9wX2dyYXBoOnAscHJvZmlsZTptfSk9Pgooe3RhZzpyLGRpc3BsYXlOYW1lOnIsY29uY2VwdHVhbEdyYXBoOmwsb3BHcmFwaDpwLHByb2ZpbGU6bX0pKTtrPWgucnVuX2dyYXBoP1t7dGFnOm51bGwsZGlzcGxheU5hbWU6IkRlZmF1bHQiLGNvbmNlcHR1YWxHcmFwaDohMSxvcEdyYXBoOiEwLHByb2ZpbGU6ITF9LC4uLmtdOms7cmV0dXJue25hbWU6Zix0YWdzOmt9fSk7dGhpcy5fZGF0YXNldHNGZXRjaGVkPSEwfSkpfSxfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KGIsZCxmKXtmPyhkPWQuZmluZEluZGV4KGg9PmgubmFtZT09PWYpLC0xPT09ZD9iJiYoYj10aGlzLiQkKCIjZXJyb3ItZGlhbG9nIiksYi50ZXh0Q29udGVudD1gTm8gZGF0YXNldCBuYW1lZCAiJHtmfSIgY291bGQgYmUgZm91bmQuYCxiLm9wZW4oKSk6dGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLGQpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsMCl9LF91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKGIsZCxmKXtiJiYoZC5sZW5ndGg8PWZ8fHRoaXMuc2V0KCJydW4iLApkW2ZdLm5hbWUpKX0sX3JlcXVlc3RIZWFsdGhQaWxsczpmdW5jdGlvbigpe3RoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMCk7dmFyIGI9Kyt0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkO251bGwhPT10aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGwpO3RoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGw7dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfS5iaW5kKHRoaXMpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXkpOnRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhiKX0sCl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHM6ZnVuY3Rpb24oYil7aWYodGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZD09PWIpe3ZhciBkPXRoaXMuX2ZldGNoSGVhbHRoUGlsbHModGhpcy5fcmVuZGVySGllcmFyY2h5LmdldE5hbWVzT2ZSZW5kZXJlZE9wcygpLHRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6dm9pZCAwKSxmPXRoaXMuX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpO1Byb21pc2UuYWxsKFtkLGZdKS50aGVuKGZ1bmN0aW9uKGgpe3ZhciBrPWhbMF07aD1oWzFdO2lmKHRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJmI9PT10aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkKXtmb3IodmFyIHIgaW4gayl7dGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcEluZGV4IixrW3JdLmxlbmd0aC0xKTticmVha310aGlzLnNldCgiX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsaCk7dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwKayk7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCExKTt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQiLG51bGwpfX0uYmluZCh0aGlzKSl9fSxfZGF0YXNldHNTdGF0ZTpmdW5jdGlvbihiLGQsZil7cmV0dXJuIGI/ZCYmZC5sZW5ndGg/IlBSRVNFTlQiPT09ZjoiRU1QVFkiPT09ZjoiTk9UX0xPQURFRCI9PT1mfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbigpe3RoaXMucmVsb2FkKCl9LF9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9LF9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQ6ZnVuY3Rpb24oYil7Yj90aGlzLnJlbG9hZCgpOnRoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIse30pfSxfbWF5YmVGZXRjaEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzKCkmJnRoaXMuX3JlcXVlc3RIZWFsdGhQaWxscygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC92ei1kaXN0cmlidXRpb24tY2hhcnQuanMKdmFyIGRsOwooZnVuY3Rpb24oYil7Y2xhc3MgZHtjb25zdHJ1Y3RvcihmLGgpe3RoaXMucnVuMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1oO3RoaXMuYnVpbGRDaGFydChmKX1nZXREYXRhc2V0KGYpe3ZvaWQgMD09PXRoaXMucnVuMmRhdGFzZXRzW2ZdJiYodGhpcy5ydW4yZGF0YXNldHNbZl09bmV3IFBsb3R0YWJsZS5EYXRhc2V0KFtdLHtydW46Zn0pKTtyZXR1cm4gdGhpcy5ydW4yZGF0YXNldHNbZl19YnVpbGRDaGFydChmKXt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKTtmPXNmLmdldFhDb21wb25lbnRzKGYpO3RoaXMueEFjY2Vzc29yPWYuYWNjZXNzb3I7dGhpcy54U2NhbGU9Zi5zY2FsZTt0aGlzLnhBeGlzPWYuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3RoaXMueVNjYWxlPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7Zj0Kc2YubXVsdGlzY2FsZUZvcm1hdHRlcihzZi5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoZik7dGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO2Y9dGhpcy5idWlsZFBsb3QodGhpcy54QWNjZXNzb3IsdGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO3RoaXMuY2VudGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsZl0pO3RoaXMub3V0ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbdGhpcy55QXhpcyx0aGlzLmNlbnRlcl0sW251bGwsdGhpcy54QXhpc11dKX1idWlsZFBsb3QoZixoLGspe2xldCByPVswLDIyOCwxNTg3LDMwODUsNUUzLDY5MTUsODQxMyw5NzcyLDFFNF0sbD1fLnJhbmdlKHIubGVuZ3RoLQoxKS5tYXAodT0+KHJbdSsxXS1yW3VdKS8yNTAwKSxwPXIubWFwKCh1LHcpPT5BPT5BW3ddWzFdKSxtPXBbNF0sbj1fLnJhbmdlKHAubGVuZ3RoLTEpLm1hcCh1PT57bGV0IHc9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhO3cueChmLGgpO2xldCBBPTQ8dT9wW3VdOnBbdSsxXTt3LnkoNDx1P3BbdSsxXTpwW3VdLGspO3cueTAoQSk7dy5hdHRyKCJmaWxsIiwoeSx4LEMpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoQy5tZXRhZGF0YSgpLnJ1bikpO3cuYXR0cigic3Ryb2tlIiwoeSx4LEMpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoQy5tZXRhZGF0YSgpLnJ1bikpO3cuYXR0cigic3Ryb2tlLXdlaWdodCIsKCk9PiIwLjVweCIpO3cuYXR0cigic3Ryb2tlLW9wYWNpdHkiLCgpPT5sW3VdKTt3LmF0dHIoImZpbGwtb3BhY2l0eSIsKCk9PmxbdV0pO3JldHVybiB3fSkscT1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cS54KGYsaCk7cS55KG0sayk7cS5hdHRyKCJzdHJva2UiLCh1LHcsQSk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShBLnJ1bikpOwp0aGlzLnBsb3RzPW47cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChuKX1zZXRWaXNpYmxlU2VyaWVzKGYpe3RoaXMucnVucz1mO2xldCBoPWYubWFwKGs9PnRoaXMuZ2V0RGF0YXNldChrKSk7dGhpcy5wbG90cy5mb3JFYWNoKGs9PmsuZGF0YXNldHMoaCkpfXNldFNlcmllc0RhdGEoZixoKXt0aGlzLmdldERhdGFzZXQoZikuZGF0YShoKX1yZW5kZXJUbyhmKXt0aGlzLnRhcmdldFNWRz1mO3RoaXMub3V0ZXIucmVuZGVyVG8oZil9cmVkcmF3KCl7dGhpcy5vdXRlci5yZWRyYXcoKX1kZXN0cm95KCl7dGhpcy5vdXRlci5kZXN0cm95KCl9fWIuRGlzdHJpYnV0aW9uQ2hhcnQ9ZDtQb2x5bWVyKHtpczoidnotZGlzdHJpYnV0aW9uLWNoYXJ0Iixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSx4VHlwZTp7dHlwZTpTdHJpbmcsCnZhbHVlOiJzdGVwIn0sX2F0dGFjaGVkOkJvb2xlYW4sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfc2VyaWVzRGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeFR5cGUsIGNvbG9yU2NhbGUsIF9hdHRhY2hlZCkiLCJfcmVsb2FkRnJvbUNhY2hlKF9jaGFydCkiXSxzZXRWaXNpYmxlU2VyaWVzOmZ1bmN0aW9uKGYpe3RoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1mO3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhmKSx0aGlzLnJlZHJhdygpKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihmLGgpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXT1oO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGYsCmgpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydC5yZWRyYXcoKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGYsaCxrKXtudWxsPT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiZ0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDtpZihrKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3ZhciByPW5ldyBkKGYsaCksbD1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTtyLnJlbmRlclRvKGwpO3RoaXMuX2NoYXJ0PXJ9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSksCnRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZix0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl18fFtdKX0uYmluZCh0aGlzKSkpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSEwfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSExfX0pfSkoZGx8fChkbD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHhUeXBlOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PmRjLmFkZFBhcmFtcyhkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsIi9kaXN0cmlidXRpb25zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1mLm1hcChoPT57Y29uc3QgW2sscixsXT1oO2wud2FsbF90aW1lPW5ldyBEYXRlKDFFMyprKTtsLnN0ZXA9cjtyZXR1cm4gbH0pOwpkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYik7dGhpcy4kLmNoYXJ0LnNldFZpc2libGVTZXJpZXMoW2RdKX19fSxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sYmVoYXZpb3JzOltjZC5EYXRhTG9hZGVyQmVoYXZpb3JdLF9jb21wdXRlRGF0YVRvTG9hZChiLGQpe3JldHVyblt7cnVuOmIsdGFnOmR9XX0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5zY2FsZShiKX0sCnJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntyZWxvYWRPblJlYWR5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgZGMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+Cnt0aGlzLl9yZWxvYWREaXN0cmlidXRpb25zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGs9Pk9iamVjdC5rZXlzKGspKSxoPWRjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1oLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZik7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWREaXN0cmlidXRpb25zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj0KYn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4ga2MuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9LF90YWdNZXRhZGF0YShiLGQsZil7cmV0dXJuIGJbZF1bZl19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSx0aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sYmluczp7dHlwZTpTdHJpbmcsdmFsdWU6ImJpbnMifSx4Ont0eXBlOlN0cmluZyx2YWx1ZToieCJ9LGR4Ont0eXBlOlN0cmluZyx2YWx1ZToiZHgifSx5Ont0eXBlOlN0cmluZyx2YWx1ZToieSJ9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKX19LG1vZGVUcmFuc2l0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sX2F0dGFjaGVkOkJvb2xlYW4sX25hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9kYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJyZWRyYXcodGltZVByb3BlcnR5LCBjb2xvclNjYWxlLCBfYXR0YWNoZWQpIiwKIl9tb2RlUmVkcmF3KG1vZGUpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihiLGQpe3RoaXMuX25hbWU9Yjt0aGlzLl9kYXRhPWQ7dGhpcy5yZWRyYXcoKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdygwKX0sX21vZGVSZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9kcmF3KHRoaXMubW9kZVRyYW5zaXRpb25EdXJhdGlvbil9LF9kcmF3OmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2F0dGFjaGVkJiZ0aGlzLl9kYXRhKXtpZih2b2lkIDA9PT1iKXRocm93IEVycm9yKCJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBfZHJhdyBuZWVkcyBkdXJhdGlvbiIpO2lmKDA+PXRoaXMuX2RhdGEubGVuZ3RoKXRocm93IEVycm9yKCJOb3QgZW5vdWdoIHN0ZXBzIGluIHRoZSBkYXRhIik7CmlmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrdGhpcy5iaW5zKyInIGluIGRhdGEiKTtpZigwPj10aGlzLl9kYXRhWzBdW3RoaXMuYmluc10ubGVuZ3RoKXRocm93IEVycm9yKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueCkpdGhyb3cgRXJyb3IoIk5vIHggcHJvcGVydHkgJyIrdGhpcy54KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy5keCkpdGhyb3cgRXJyb3IoIk5vIGR4IHByb3BlcnR5ICciK3RoaXMuZHgrIicgb24gYmlucyBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLnkpKXRocm93IEVycm9yKCJObyB5IHByb3BlcnR5ICciKwp0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGQ9dGhpcy50aW1lUHJvcGVydHksZj10aGlzLngsaD10aGlzLmJpbnMsaz10aGlzLmR4LHI9dGhpcy55LGw9dGhpcy5fZGF0YSxwPXRoaXMubW9kZSxtPWQzLmhjbCh0aGlzLmNvbG9yU2NhbGUodGhpcy5fbmFtZSkpLG49ZDMuc2VsZWN0KHRoaXMuJC50b29sdGlwKSxxPWZ1bmN0aW9uKHhhKXtyZXR1cm4geGFbZl19LHU9ZnVuY3Rpb24oeGEpe3JldHVybiB4YVtyXX0sdz1mdW5jdGlvbih4YSl7cmV0dXJuIHhhW2ZdK3hhW2tdfSxBPWZ1bmN0aW9uKHhhKXtyZXR1cm4geGFbZF19OyJyZWxhdGl2ZSI9PT1kJiYoQT1mdW5jdGlvbih4YSl7cmV0dXJuIHhhLndhbGxfdGltZS1sWzBdLndhbGxfdGltZX0pO3ZhciB5PXRoaXMuJC5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseD15LndpZHRoLEM9eS5oZWlnaHQsRz01O2lmKCJvZmZzZXQiPT09cCl7dmFyIEQ9Qy8yLjU7Rz1EKzV9ZWxzZSBEPUMtRy0yMDt2YXIgQj14LTI0LTYwLEg9CkMtRy0yMDtkMy5taW4obCxxKTtkMy5tYXgobCx3KTt2YXIgSz1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PWQ/eT1kMy50aW1lRm9ybWF0KCIlbS8lZCAlWCIpOiJyZWxhdGl2ZSI9PT1kJiYoeT1mdW5jdGlvbih4YSl7cmV0dXJuIGQzLmZvcm1hdCgiLjFyIikoeGEvMzZFNSkrImgifSk7dmFyIEw9bC5tYXAoZnVuY3Rpb24oeGEpe3JldHVybltkMy5taW4oeGFbaF0scSksZDMubWF4KHhhW2hdLHcpXX0pLEo9bC5tYXAoZnVuY3Rpb24oeGEpe3JldHVybiBkMy5leHRlbnQoeGFbaF0sdSl9KSxPPWQzLmV4dGVudChsLEEpLFM9KCJ3YWxsX3RpbWUiPT09ZD9kMy5zY2FsZVRpbWUoKTpkMy5zY2FsZUxpbmVhcigpKS5kb21haW4oTykucmFuZ2UoWzAsIm9mZnNldCI9PT1wP0g6MF0pLE49ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsZDMubWF4KGwsZnVuY3Rpb24oeGEsU2Epe3JldHVybiBKW1NhXVsxXX0pXSkucmFuZ2UoW0QsMF0pLFI9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oTi5kb21haW4oKSkucmFuZ2UoWzUwMCwKMF0pLFg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihsLGZ1bmN0aW9uKHhhLFNhKXtyZXR1cm4gTFtTYV1bMF19KSxkMy5tYXgobCxmdW5jdGlvbih4YSxTYSl7cmV0dXJuIExbU2FdWzFdfSldKS5uaWNlKCkucmFuZ2UoWzAsQl0pLGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFguZG9tYWluKCkpLnJhbmdlKFswLDUwMF0pLGZhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGQzLmV4dGVudChsLEEpKS5yYW5nZShbbS5kYXJrZXIoKSxtLmJyaWdodGVyKCldKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUhjbCk7bT1kMy5heGlzQm90dG9tKFgpLnRpY2tzKCk7dmFyIG9hPWQzLmF4aXNSaWdodChTKS50aWNrcygpLnRpY2tGb3JtYXQoeSksWj1kMy5heGlzUmlnaHQoTikudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoSyksY2E9ZnVuY3Rpb24oeGEpe3JldHVybiB4YVtmXSt4YVtrXS8yfSxqYT1kMy5saW5lKCkueChmdW5jdGlvbih4YSl7cmV0dXJuIGFhKGNhKHhhKSl9KS55KGZ1bmN0aW9uKHhhKXtyZXR1cm4gUih4YVtyXSl9KSwKYmE9ZnVuY3Rpb24oeGEpe3JldHVybiJNIithYShjYSh4YVswXSkpKyIsIitSKDApKyJMIitqYSh4YSkuc2xpY2UoMSkrIkwiK2FhKGNhKHhhW3hhLmxlbmd0aC0xXSkpKyIsIitSKDApfSxrYT10aGlzLiQuc3ZnO3k9ZDMuc2VsZWN0KGthKTtiPXkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGIpO3k9eS5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTtiPWIuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRysiKSIpO3ZhciBXPWQzLmJpc2VjdG9yKHcpLmxlZnQ7Tz15LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMSk7eWEuc3R5bGUoIm9wYWNpdHkiLDEpO0FhLnN0eWxlKCJvcGFjaXR5IiwKMSk7RmEuc3R5bGUoIm9wYWNpdHkiLDEpO24uc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt5YS5zdHlsZSgib3BhY2l0eSIsMCk7QWEuc3R5bGUoIm9wYWNpdHkiLDApO0ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt2YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO24uc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB4YShBYil7cmV0dXJuIE1hdGgubWluKEFiW2hdLmxlbmd0aC0xLFcoQWJbaF0sWGEpKX12YXIgU2E9ZDMubW91c2UodGhpcyksWGE9WC5pbnZlcnQoU2FbMF0pO1MuaW52ZXJ0KFNhWzFdKTt2YXIgdWIsQmI9SW5maW5pdHkscWI7dmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihBYil7dmFyIEhiPXhhKEFiKTtxYj1BYjt2YXIgbGM9WChBYltoXVtIYl1bZl0rQWJbaF1bSGJdW2tdLzIpOwpIYj1OKEFiW2hdW0hiXVtyXSk7dmFyIGVjPSJvZmZzZXQiPT09cD9TKEEoQWIpKS0oRC1IYik6SGI7ZWM9TWF0aC5hYnMoU2FbMV0tZWMpO2VjPEJiJiYoQmI9ZWMsdWI9QWIpO3JldHVybiJ0cmFuc2xhdGUoIitsYysiLCIrSGIrIikifSk7dmEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihBYil7dmFyIEhiPXhhKEFiKTtyZXR1cm4gQWJbaF1bSGJdW3JdfSk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7dmFyIHpiPXhhKHFiKTt5YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1gocWJbaF1bemJdW2ZdK3FiW2hdW3piXVtrXS8yKSsiLCAiK0grIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBLKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMil9KTsKdmFyIHZiPW9hLnRpY2tGb3JtYXQoKTtBYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wP1MoQSh1YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXA/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIHZiKEEodWIpKX0pO3ZhciBHYj1aLnRpY2tGb3JtYXQoKTtGYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6Tih1YltoXVt6Yl1bcl0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBHYih1YltoXVt6Yl1bcl0pfSk7dmFyIE9iPWQzLm1vdXNlKGthKTtuLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoT2JbMF0rMTUpKyJweCwiKyhPYlsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT0KcD9HYih1YltoXVt6Yl1bcl0pOigic3RlcCI9PT1kPyJzdGVwICI6IiIpK3ZiKEEodWIpKSl9KTtPLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUcrIikiKS5hdHRyKCJ3aWR0aCIseCkuYXR0cigiaGVpZ2h0IixDKTtDPU8uc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShsKTtDLmV4aXQoKS5yZW1vdmUoKTt4PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9eC5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKHhhLFNhKXtyZXR1cm4gQSh4YSktQShTYSl9KTtHPWIuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih4YSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PXA/UyhBKHhhKSktRDowKSsiKSJ9KTt4LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtHLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IiwKZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PXA/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3guYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEVhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbih4YSl7cmV0dXJuIGJhKHhhW2hdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0cuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKHhhKXtyZXR1cm4ib2Zmc2V0Ij09PXA/IndoaXRlIjpmYShBKHhhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09cD8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oeGEpe3JldHVybiBmYShBKHhhKSl9KTt4PXguYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLAoiaG92ZXIiKTt2YXIgdmE9Qy5zZWxlY3QoIi5ob3ZlciIpLnN0eWxlKCJmaWxsIixmdW5jdGlvbih4YSl7cmV0dXJuIGZhKEEoeGEpKX0pO3guYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt4LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt4PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHlhPXgubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3g9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEFhPXgubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7eD15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBGYT15Lm1lcmdlKHgpO3guYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7eC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3guYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTtiLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wPy1EOjApKyIpIikuY2FsbChaKTtiLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK0grIikiKS5jYWxsKG0pO2Iuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6SCkrIikiKS5jYWxsKG9hKTtiLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7Yi5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmJ9KT0+Yn0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmIscnVuOmR9KT0+ZGMuYWRkUGFyYW1zKGRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL2hpc3RvZ3JhbXMiKSx7dGFnOmIscnVuOmR9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQsZik9PntiPWVsLmJhY2tlbmRUb1Z6KGYpO2Q9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxiKX19fSx0YWdNZXRhZGF0YTpPYmplY3QsdGltZVByb3BlcnR5OlN0cmluZywKaGlzdG9ncmFtTW9kZTpTdHJpbmcsX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PnRkLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIHJlcXVlc3RNYW5hZ2VyKSJdLGJlaGF2aW9yczpbY2QuRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYixkKXtyZXR1cm5be3J1bjpiLHRhZzpkfV19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihiKX0scmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e3JlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2hpc3RvZ3JhbU1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSxfdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX3Jlc3RhbXA6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn19LApsaXN0ZW5lcnM6eyJjb250ZW50LXZpc2liaWxpdHktY2hhbmdlZCI6Il9yZWRyYXdDYXRlZ29yeVBhbmUifSxfcmVkcmF3Q2F0ZWdvcnlQYW5lKGIsZCl7ZCYmYi50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goZj0+Zi5yZWRyYXcoKSl9LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkSGlzdG9ncmFtcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD1kYy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwKMD09PWgubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixmKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuIGtjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3RleHRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9fSxvYnNlcnZlcnM6WyJfY2hhbmdlUnVuQ29sb3IoX3J1bkNvbG9yKSJdLF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRkLnJ1bnNDb2xvclNjYWxlKGIpfSxfY2hhbmdlUnVuQ29sb3IoYil7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRiLXRleHQtbG9hZGVyLW91dGxpbmUiOmJ9KX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPWRjLmFkZFBhcmFtcyhkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsCiIvdGV4dCIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVufSksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcChoPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqaC53YWxsX3RpbWUpLHN0ZXA6aC5zdGVwLHRleHQ6aC50ZXh0fSkpLHRoaXMuc2V0KCJfdGV4dHMiLGYuc2xpY2UoKS5yZXZlcnNlKCkpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2Zvcm1hdFN0ZXAoYil7cmV0dXJuIGQzLmZvcm1hdCgiLCIpKGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntyZWxvYWRPblJlYWR5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkVGV4dHMoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX2ZldGNoVGFncygpe2NvbnN0IGI9CmRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWcpKXt2YXIgZj1kYy5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRUZXh0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi10ZXh0LWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4ga2MuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx0YWc6U3RyaW5nLHRhZ01ldGFkYXRhOk9iamVjdCxydW5Ub1N0ZXBDYXA6T2JqZWN0LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxhY3RpdmU6Qm9vbGVhbixfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9ydW5Ub1ByQ3VydmVFbnRyeTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1bnNXaXRoU3RlcEF2YWlsYWJsZTp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSdW5zV2l0aFN0ZXBBdmFpbGFibGUocnVucywgX3J1blRvUHJDdXJ2ZUVudHJ5KSJ9LF9zZXRPZlJlbGV2YW50UnVuczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2V0T2ZSZWxldmFudFJ1bnMoX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSkifSxfcnVuVG9EYXRhT3ZlclRpbWU6T2JqZWN0LApvbkRhdGFDaGFuZ2U6RnVuY3Rpb24sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9hdHRhY2hlZDpCb29sZWFuLF94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+KCk9Pntjb25zdCBiPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6YixheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGIsImJvdHRvbSIpLGFjY2Vzc29yOmQ9PmQucmVjYWxsfX19LF95VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIucHJlY2lzaW9ufSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Pntjb25zdCBiPXNmLm11bHRpc2NhbGVGb3JtYXR0ZXIoc2YuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLApkPWY9PmlzTmFOKGYpPyJOYU4iOmIoZik7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTpmPT5mLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOmY9PmYuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOmY9PmYuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19fSxfc2VyaWVzRGF0YUZpZWxkczp7dHlwZTpBcnJheSx2YWx1ZToidGhyZXNob2xkcyBwcmVjaXNpb24gcmVjYWxsIHRydWVfcG9zaXRpdmVzIGZhbHNlX3Bvc2l0aXZlcyB0cnVlX25lZ2F0aXZlcyBmYWxzZV9uZWdhdGl2ZXMiLnNwbGl0KCIgIiksCnJlYWRPbmx5OiEwfSxfZGVmYXVsdFhSYW5nZTp7dHlwZTpBcnJheSx2YWx1ZTpbLS4wNSwxLjA1XSxyZWFkT25seTohMH0sX2RlZmF1bHRZUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9Pntjb25zdCBkPXRoaXMudGFnO3JldHVybiBkYy5hZGRQYXJhbXMoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9wcl9jdXJ2ZXMiKSx7dGFnOmQscnVuOmJ9KX19fSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1bnMsIHRhZykiLCJfc2V0Q2hhcnREYXRhKF9ydW5Ub1ByQ3VydmVFbnRyeSwgX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnksIF9zZXRPZlJlbGV2YW50UnVucykiLCJfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoX3J1blRvRGF0YU92ZXJUaW1lLCBydW5Ub1N0ZXBDYXApIiwKIl9ub3RpZnlEYXRhQ2hhbmdlKF9ydW5Ub0RhdGFPdmVyVGltZSkiXSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9Pnt0aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLGYpKX19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbi5zY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDA9PT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KTp0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCkpfSxfc2V0Q2hhcnREYXRhKGIsZCxmKXtfLmZvck93bihiLChoLGspPT57Y29uc3Qgcj1kW2tdO3ImJmJba10uc3RlcD09PXIuc3RlcHx8KGZba10/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihrLApoKTp0aGlzLl9jbGVhclNlcmllc0RhdGEoaykpfSl9LF91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGIsZCl7dmFyIGY9Xy5yZWR1Y2UodGhpcy5fc2VyaWVzRGF0YUZpZWxkcywoayxyKT0+e2tbcl09ZFtyXS5zbGljZSgpLnJldmVyc2UoKTtyZXR1cm4ga30se30pO2NvbnN0IGg9QXJyYXkoZlt0aGlzLl9zZXJpZXNEYXRhRmllbGRzWzBdXS5sZW5ndGgpO2ZvcihsZXQgaz0wO2s8aC5sZW5ndGg7aysrKWhba109Xy5tYXBWYWx1ZXMoZixyPT5yW2tdKTtmPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTtmLnNldFNlcmllc0RhdGEoYixoKTtmLmNvbW1pdENoYW5nZXMoKX0sX2NsZWFyU2VyaWVzRGF0YShiKXtjb25zdCBkPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTtkLnNldFNlcmllc0RhdGEoYixbXSk7ZC5jb21taXRDaGFuZ2VzKCl9LF91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oYiwoaCxrKT0+e2gmJgpoLmxlbmd0aCYmKGZba109dGhpcy5fY29tcHV0ZUVudHJ5Q2xvc2VzdE9yRXF1YWxUb1N0ZXBDYXAoZFtrXSxoKSl9KTt0aGlzLnNldCgiX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkiLHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KTt0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixmKX0sX25vdGlmeURhdGFDaGFuZ2UoYil7aWYodGhpcy5vbkRhdGFDaGFuZ2UpdGhpcy5vbkRhdGFDaGFuZ2UoYil9LF9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChiLGQpe2I9TWF0aC5taW4oXy5zb3J0ZWRJbmRleChkLm1hcChmPT5mLnN0ZXApLGIpLGQubGVuZ3RoLTEpO3JldHVybiBkW2JdfSxfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShiLGQpe3JldHVybiBfLmZpbHRlcihiLGY9PmRbZl0pLnNvcnQoKX0sX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPSEwfSk7cmV0dXJuIGR9LF9jb21wdXRlQ3VycmVudFN0ZXBGb3JSdW4oYiwKZCl7cmV0dXJuKGI9YltkXSk/Yi5zdGVwOm51bGx9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lRm9yUnVuKGIsZCl7cmV0dXJuKGI9YltkXSk/KG5ldyBEYXRlKDFFMypiLndhbGxfdGltZSkpLnRvU3RyaW5nKCk6bnVsbH0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfcmVzZXREb21haW4oKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVzZXREb21haW4oKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuczpBcnJheSxydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOk9iamVjdCxydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVSdW5Ub1N0ZXAocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4KSJ9LHRpbWVEaXNwbGF5VHlwZTpTdHJpbmcsX3J1blRvU3RlcEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1bnNXaXRoU2xpZGVyczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMocnVucywgcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcykifX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJdLF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHRkLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVRpbWVUZXh0Rm9yUnVuKGIsCmQsZixoKXtkPWRbZl07aWYoIV8uaXNOdW1iZXIoZCkpcmV0dXJuIiI7Yj1iW2ZdO2lmKCFiKXJldHVybiIiO2I9YltkXVtoXTtpZigic3RlcCI9PT1oKXJldHVybmBzdGVwICR7Yn1gO2lmKCJyZWxhdGl2ZSI9PT1oKXJldHVybiAxPmI/YCR7KDFFMypiKS50b0ZpeGVkKDIpfSBtc2A6YCR7Yi50b0ZpeGVkKDIpfSBzYDtpZigid2FsbF90aW1lIj09PWgpcmV0dXJuKG5ldyBEYXRlKDFFMypiKSkudG9TdHJpbmcoKTt0aHJvdyBFcnJvcihgVGhlIGRpc3BsYXkgdHlwZSBvZiAke2h9IGlzIG5vdCByZWNvZ25pemVkLmApO30sX3NsaWRlclZhbHVlQ2hhbmdlZChiKXtjb25zdCBkPWIudGFyZ2V0LmRhdGFzZXQucnVuLGY9Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWUsaD1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtpc05hTihmKT9kZWxldGUgaFtkXTpoW2RdPWIudGFyZ2V0LmltbWVkaWF0ZVZhbHVlO3RoaXMuX3J1blRvU3RlcEluZGV4PWh9LF9jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKGIsCmQpe3JldHVybihiPWJbZF0pJiZiLmxlbmd0aD9iLmxlbmd0aC0xOjB9LF91cGRhdGVTdGVwc0Zvck5ld1J1bnMoYil7Y29uc3QgZD1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtfLmZvck93bihiLChmLGgpPT57Xy5pc051bWJlcihkW2hdKXx8KGRbaF09Zi5sZW5ndGgtMSl9KTt0aGlzLl9ydW5Ub1N0ZXBJbmRleD1kfSxfZ2V0U3RlcChiLGQpe3JldHVybiB0aGlzLl9ydW5Ub1N0ZXBJbmRleD90aGlzLl9ydW5Ub1N0ZXBJbmRleFtkXTowfSxfY29tcHV0ZVJ1blRvU3RlcChiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oZCwoaCxrKT0+e2NvbnN0IHI9YltrXTtyJiYoZltrXT1yW2hdLnN0ZXApfSk7cmV0dXJuIGZ9LF9jb21wdXRlUnVuc1dpdGhTbGlkZXJzKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntyZWxvYWRPblJlYWR5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90aW1lRGlzcGxheVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyhfdGFnVG9SdW5Ub0RhdGEpIn0sX3RhZ1RvUnVuVG9EYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3JlbGV2YW50U2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKF9zZWxlY3RlZFJ1bnMsIF9ydW5Ub1RhZ0luZm8pIn0sX3J1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSwKX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+Yi50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn0sX3N0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9LHJlbG9hZCgpe1Byb21pc2UuYWxsKFt0aGlzLl9mZXRjaFRhZ3MoKV0pLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDYXJkcygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj0KZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+Xy5rZXlzKGgpKTtmPWRjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRDYXJkcygpe18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtcHItY3VydmUtY2FyZCIpLGI9PntiLnJlbG9hZCgpfSl9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTtyZXR1cm4ga2MuY2F0ZWdvcml6ZVRhZ3MoYixkLGYpfSxfY29tcHV0ZUNvbG9yRm9yUnVuKGIpe3JldHVybiB0ZC5ydW5zQ29sb3JTY2FsZShiKX0sCl9jb21wdXRlUmVsZXZhbnRTZWxlY3RlZFJ1bnMoYixkKXtyZXR1cm4gYi5maWx0ZXIoZj0+ZFtmXSl9LF90YWdNZXRhZGF0YShiLGQsZil7Y29uc3QgaD17fTtkLmZvckVhY2goaz0+e2hba109YltrXVtmXX0pO2Q9Zi5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCIiKTtyZXR1cm4gcmYuYWdncmVnYXRlVGFnSW5mbyhoLGQpfSxfY3JlYXRlRGF0YUNoYW5nZUNhbGxiYWNrKGIpe3JldHVybiBkPT57dGhpcy5zZXQoIl90YWdUb1J1blRvRGF0YSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl90YWdUb1J1blRvRGF0YSx7W2JdOmR9KSl9fSxfY29tcHV0ZVJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMoYil7Y29uc3QgZD17fTtmb3IodmFyIGYgb2YgT2JqZWN0LmVudHJpZXMoYikpe2NvbnN0IFtoLGtdPWY7Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmVudHJpZXMoaykpe2NvbnN0IFtsXT1yO2lmKG51bGw9PWRbbF18fGg8ZFtsXSlkW2xdPWh9fWY9e307Zm9yKGNvbnN0IGggb2YgT2JqZWN0LmVudHJpZXMoZCkpe2NvbnN0IFtrLApyXT1oO3tjb25zdCBsPWJbcl1ba107ZltrXT1sLm1hcChwPT4oe3N0ZXA6cC5zdGVwLHdhbGxfdGltZTpwLndhbGxfdGltZSxyZWxhdGl2ZTpwLndhbGxfdGltZS1sWzBdLndhbGxfdGltZX0pKX19cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQvdGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19pbnN0YWxsQ29tbWFuZDp7dHlwZTpTdHJpbmcscmVhZE9ubHk6ITAsdmFsdWU6InBpcCBpbnN0YWxsIC1VIHRlbnNvcmJvYXJkLXBsdWdpbi1wcm9maWxlIn19LF9jb3B5SW5zdGFsbENvbW1hbmQoKXtjb25zdCBiPXRoaXM7cmV0dXJuIFdiKGZ1bmN0aW9uKigpe2NvbnN0IGQ9KCk9PldiKGZ1bmN0aW9uKigpe2IuJC5jb21tYW5kVGV4dGFyZWEuc2VsZWN0KCk7dHJ5e3lpZWxkIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGIuX2luc3RhbGxDb21tYW5kKX1jYXRjaChmKXtpZighZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QoKX19KTt0cnl7eWllbGQgZCgpLGIuJC5jb3BpZWRNZXNzYWdlLmlubmVyVGV4dD0iQ29waWVkLiJ9Y2F0Y2goZil7Yi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJGYWlsZWQgdG8gY29weSB0byBjbGlwYm9hcmQuIn19KX0sCl9yZW1vdmVDb3BpZWRNZXNzYWdlKCl7dGhpcy4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSIifX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9wbHVnaW4tZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBsdWdpbi1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF91c2VOYXRpdmVCYWNrZHJvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb3Blbk5vVGVuc29yRmxvd0RpYWxvZygpe3RoaXMub3BlbkRpYWxvZygiVGhpcyBwbHVnaW4gaXMgZGlzYWJsZWQgd2l0aG91dCBUZW5zb3JGbG93IiwnVG8gZW5hYmxlIHRoaXMgcGx1Z2luIGluIFRlbnNvckJvYXJkLCBpbnN0YWxsIFRlbnNvckZsb3cgd2l0aCAicGlwIGluc3RhbGwgdGVuc29yZmxvdyIgb3IgZXF1aXZhbGVudC4nKX0sb3Blbk9sZFRlbnNvckZsb3dEaWFsb2coYil7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3cgIisKYiwiVG8gZW5hYmxlIHRoaXMgcGx1Z2luIGluIFRlbnNvckJvYXJkLCBpbnN0YWxsIFRlbnNvckZsb3cgIitiKycgb3IgZ3JlYXRlciB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsYik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIixkKTt0aGlzLiQuZGlhbG9nLm9wZW4oKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LF9jb21wdXRlSGlkZGVuKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci12aWRlby5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImJlaG9sZGVyIiwiL2JlaG9sZGVyLWZyYW1lIiksZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvcGluZyIpO1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci12aWRlbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSxwaW5nU2xlZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjFFM30seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MjUwMH0sX2ltYWdlVVJMOnt0eXBlOlN0cmluZyx2YWx1ZToiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCJ9LF94aHI6T2JqZWN0LF90aW1lcjpOdW1iZXIsX2lzRGVhZDpCb29sZWFufSxhdHRhY2hlZCgpe3RoaXMuc2V0KCJfaW1hZ2VVUkwiLGIpO3RoaXMuX3BpbmcoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpOwp0aGlzLnNldCgiX2ltYWdlVVJMIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCIpfSxfcGluZygpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixkLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vblBpbmdMb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9dGhpcy5fb25QaW5nLmJpbmQodGhpcywhMSx0aGlzLnBpbmdTbGVlcCk7dGhpcy5feGhyLm9udGltZW91dD10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25QaW5nTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZj1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO3RoaXMuX29uUGluZygiYWxpdmUiPT1mLnN0YXR1cyx0aGlzLnBpbmdTbGVlcCl9ZWxzZSB0aGlzLl9vblBpbmcoITEsCnRoaXMucGluZ1NsZWVwKX0sX29uUGluZyhmLGgpe2YmJnRoaXMuX2lzRGVhZCYmdGhpcy5zZXQoIl9pbWFnZVVSTCIsYisiP3RceDNkIisobmV3IERhdGUpLmdldFRpbWUoKSk7dGhpcy5faXNEZWFkPSFmO3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9waW5nKCksaCl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYodGhpcy5feGhyLnJlYWR5U3RhdGU8WE1MSHR0cFJlcXVlc3QuRE9ORSYmdGhpcy5feGhyLmFib3J0KCksdGhpcy5feGhyPW51bGwpfSxfZnBzQ2hhbmdlZChmLGgpezA9PWY/dGhpcy5fY2xlYXIoKTowPT1oJiZ0aGlzLl9waW5nKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvc2VjdGlvbi1pbmZvIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWluZm8iLHByb3BlcnRpZXM6e2Zwczp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il9mcHNDaGFuZ2VkIn0seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MUU0fSxfaXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7bmFtZToiTG9hZGluZy4uLiJ9XX0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcn0sYXR0YWNoZWQoKXt0aGlzLl9sb2FkKCl9LGRldGFjaGVkKCl7dGhpcy5fY2xlYXIoKX0sX2xvYWQoKXt0aGlzLl9jbGVhcigpO3RoaXMuX3hocj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy5feGhyLm9wZW4oIkdFVCIsYiwhMCk7dGhpcy5feGhyLnRpbWVvdXQ9dGhpcy54aHJUaW1lb3V0O3RoaXMuX3hoci5vbmxvYWQ9dGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9CnRoaXMuX3JldHJ5LmJpbmQodGhpcyx0aGlzLl9nZXRTbGVlcCgpKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX3JldHJ5LmJpbmQodGhpcywxKTt0aGlzLl94aHIuc2VuZChudWxsKX0sX29uTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZD1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO2NvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZCksIkV4cGVjdGVkIHJlc3BvbnNlIHRvIGJlIGluIGFuIGFycmF5Iik7dGhpcy5faXRlbXM9ZH10aGlzLl9yZXRyeSh0aGlzLl9nZXRTbGVlcCgpKX0sX3JldHJ5KGQpe3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2xvYWQuYmluZCh0aGlzKSxkKX0sX2dldFNsZWVwKCl7cmV0dXJuIDFFMy8oMD09PXRoaXMuZnBzPzE6dGhpcy5mcHMpfSxfY2xlYXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpO3RoaXMuX3hociYmCih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGQsZil7MD09ZD90aGlzLl9jbGVhcigpOjA9PWYmJnRoaXMuX2xvYWQoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e3JlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLAp2YWx1ZToxMCxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGIpe3JldHVybiJmcmFtZXMiIT09Yn0sX3ZhcmlhbmNlU2VsZWN0ZWQoYil7cmV0dXJuInZhcmlhbmNlIj09PWJ9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYKIXRoaXMuX2NvbnRyb2xzX2Rpc2FibGVkKXt2YXIgYj1bdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxkO2ZvcihkIG9mIGIpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZHx8IiI9PT1kKXJldHVybjtiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PQp0aGlzLl9yZWNvcmRUZXh0Pyh0aGlzLnNldCgiX3JlY29yZFRleHQiLCJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkYy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGI9PnsiYmVob2xkZXIiaW4gYj8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX0sCnJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9pcy1hY3RpdmUiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e3RoaXMuc2V0KCJfaXNfYWN0aXZlIixkLmlzX2FjdGl2ZSk7dGhpcy5zZXQoIl9jb250cm9sc19kaXNhYmxlZCIsIWQuaXNfY29uZmlnX3dyaXRhYmxlKX0pfX19KTtwZS5yZWdpc3RlckRhc2hib2FyZCgpfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tc3BsaXQtbGF5b3V0L3ZhYWRpbi1zcGxpdC1sYXlvdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLXNwbGl0LWxheW91dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7dmVydGljYWw6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LF9wcmV2aW91c1ByaW1hcnlQb2ludGVyRXZlbnRzOlN0cmluZyxfcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzOlN0cmluZ30sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXModGhpcy5fcHJvY2Vzc0NoaWxkcmVuKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcil9LF9wcm9jZXNzQ2hpbGRyZW46ZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiLmNsYXNzTGlzdC5jb250YWlucygic3BsaXR0ZXItaGFuZGxlIik/CihQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJoYW5kbGUiKSwhMSk6ITB9KS5mb3JFYWNoKGZ1bmN0aW9uKGIsZCl7MD09PWQ/KHRoaXMuX3ByaW1hcnlDaGlsZD1iLFBvbHltZXIuZG9tKGIpLnNldEF0dHJpYnV0ZSgic2xvdCIsInByaW1hcnkiKSk6MT09ZD8odGhpcy5fc2Vjb25kYXJ5Q2hpbGQ9YixQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJzZWNvbmRhcnkiKSk6UG9seW1lci5kb20oYikucmVtb3ZlQXR0cmlidXRlKCJzbG90Iil9LmJpbmQodGhpcykpfSxfc2V0RmxleEJhc2lzOmZ1bmN0aW9uKGIsZCxmKXtkPU1hdGgubWF4KDAsTWF0aC5taW4oZCxmKSk7MD09PWQmJihkPTFFLTYpO2Iuc3R5bGUuZmxleD0iMSAxICIrZCsicHgifSxfb25IYW5kbGVUcmFjazpmdW5jdGlvbihiKXtpZih0aGlzLl9wcmltYXJ5Q2hpbGQmJnRoaXMuX3NlY29uZGFyeUNoaWxkKXt2YXIgZD10aGlzLnZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCI7InN0YXJ0Ij09PQpiLmRldGFpbC5zdGF0ZT8odGhpcy5fc3RhcnRTaXplPXtjb250YWluZXI6dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXS10aGlzLiQuc3BsaXR0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0scHJpbWFyeTp0aGlzLl9wcmltYXJ5Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0sc2Vjb25kYXJ5OnRoaXMuX3NlY29uZGFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdfSx0aGlzLl9wcmV2aW91c1ByaW1hcnlQb2ludGVyRXZlbnRzPXRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzLHRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzLHRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIix0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIik6KGQ9dGhpcy52ZXJ0aWNhbD9iLmRldGFpbC5keToKYi5kZXRhaWwuZHgsdGhpcy5fc2V0RmxleEJhc2lzKHRoaXMuX3ByaW1hcnlDaGlsZCx0aGlzLl9zdGFydFNpemUucHJpbWFyeStkLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9zZWNvbmRhcnlDaGlsZCx0aGlzLl9zdGFydFNpemUuc2Vjb25kYXJ5LWQsdGhpcy5fc3RhcnRTaXplLmNvbnRhaW5lciksdGhpcy5ub3RpZnlSZXNpemUoKSwiZW5kIj09PWIuZGV0YWlsLnN0YXRlJiYoZGVsZXRlIHRoaXMuX3N0YXJ0U2l6ZSx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz10aGlzLl9wcmV2aW91c1ByaW1hcnlQb2ludGVyRXZlbnRzLHRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzKSl9fSxfcHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcXVlcnktcGFuZS90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1xdWVyeS1wYW5lIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NoZW1hOntocGFyYW1Db2x1bW5zOltdLG1ldHJpY0NvbHVtbnM6W119LGNvbHVtbnNWaXNpYmlsaXR5OltdLHZpc2libGVTY2hlbWE6e2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfX0pLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sc2Vzc2lvbkdyb3Vwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10scmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9leHBlcmltZW50Ok9iamVjdCxfaHBhcmFtczpBcnJheSxfbWV0cmljczpBcnJheSxfc3RhdHVzZXM6e3R5cGU6QXJyYXksCnZhbHVlOigpPT5be3ZhbHVlOiJTVEFUVVNfVU5LTk9XTiIsZGlzcGxheU5hbWU6IlVua25vd24iLGFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX1NVQ0NFU1MiLGRpc3BsYXlOYW1lOiJTdWNjZXNzIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XX0sX2dldEV4cGVyaW1lbnRSZXNvbHZlZDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoYj0+e3RoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50PWJ9KX19LF9yZXNvbHZlR2V0RXhwZXJpbWVudDpGdW5jdGlvbixfbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgZGMuQ2FuY2VsbGVyfSxfc29ydEJ5SW5kZXg6TnVtYmVyLF9zb3J0RGlyZWN0aW9uOk51bWJlcixfcGFnZVNpemVJbnB1dDp7dHlwZTpPYmplY3QsCnZhbHVlOnt2YWx1ZToiMTAwIixpbnZhbGlkOiExfX0sX3BhZ2VOdW1iZXJJbnB1dDp7dHlwZTpPYmplY3QsdmFsdWU6e3ZhbHVlOiIxIixpbnZhbGlkOiExfX0sX3BhZ2VDb3VudFN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ij8ifSxfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHI6U3RyaW5nLF9zZXNzaW9uR3JvdXBzUmVxdWVzdDpPYmplY3R9LG9ic2VydmVyczpbIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyhiYWNrZW5kLCBleHBlcmltZW50TmFtZSkiLCJfdXBkYXRlQ29uZmlndXJhdGlvbihfaHBhcmFtcy4qLCBfbWV0cmljcy4qKSJdLHJlbG9hZCgpe3RoaXMuX3F1ZXJ5U2VydmVyKCl9LF9jc3ZVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwiY3N2Iil9LF9qc29uVXJsKGIsZCl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQsImpzb24iKX0sX2xhdGV4VXJsKGIsZCl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChiLApkLCJsYXRleCIpfSxfZG93bmxvYWREYXRhVXJsKGIsZCxmKXtyZXR1cm4gdGhpcy5iYWNrZW5kLmdldERvd25sb2FkVXJsKGYsYixkLmNvbHVtbnNWaXNpYmlsaXR5KX0sX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKCl7Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzO2IuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5iYWNrZW5kKXx8Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmV4cGVyaW1lbnROYW1lKXx8dGhpcy5iYWNrZW5kLmdldEV4cGVyaW1lbnQoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWV9KS50aGVuKGQ9PntfLmlzRXF1YWwoZCx0aGlzLl9leHBlcmltZW50KXx8KHRoaXMuc2V0KCJfZXhwZXJpbWVudCIsZCksdGhpcy5fY29tcHV0ZUhQYXJhbXMoKSx0aGlzLl9jb21wdXRlTWV0cmljcygpLHRoaXMuX3F1ZXJ5U2VydmVyKCksdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKSl9KS5maW5hbGx5KCgpPT57dGhpcy5fY29tcHV0ZURhdGFGb3VuZCgpfSl9LApfY29tcHV0ZURhdGFGb3VuZCgpe2NvbnN0IGI9ISEodGhpcy5fZXhwZXJpbWVudCYmdGhpcy5fZXhwZXJpbWVudC5ocGFyYW1JbmZvcyYmMDx0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmxlbmd0aCYmdGhpcy5fZXhwZXJpbWVudC5tZXRyaWNJbmZvcyYmMDx0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmxlbmd0aCk7dGhpcy5zZXQoImRhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zIixiKTt0aGlzLnNldCgiZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMiLCFiKX0sX2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgYj1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKGQsZik9Pntjb25zdCBoPXtpbmZvOmQsZGlzcGxheWVkOjU+ZixmaWx0ZXI6e319O2guaW5mby5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluRGlzY3JldGUiKT8oaC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10saC5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goaz0+e2guZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmssCmNoZWNrZWQ6ITB9KX0pKToiREFUQV9UWVBFX0JPT0wiPT09aC5pbmZvLnR5cGU/aC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W3t2YWx1ZTohMSxjaGVja2VkOiEwfSx7dmFsdWU6ITAsY2hlY2tlZDohMH1dOiJEQVRBX1RZUEVfRkxPQVQ2NCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5pbnRlcnZhbD17bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixoLmluZm8udHlwZSk7Yi5wdXNoKGgpfSk7dGhpcy5zZXQoIl9ocGFyYW1zIixiKX0sX2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgYj1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKGQsZik9PntiLnB1c2goe2luZm86ZCxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LAptYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fX0sZGlzcGxheWVkOjU+Zn0pfSk7dGhpcy5zZXQoIl9tZXRyaWNzIixiKX0sX2NvbXB1dGVTY2hlbWEoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz97aHBhcmFtQ29sdW1uczp0aGlzLl9ocGFyYW1zLm1hcChiPT4oe2hwYXJhbUluZm86Yi5pbmZvfSkpLG1ldHJpY0NvbHVtbnM6dGhpcy5fbWV0cmljcy5tYXAoYj0+KHttZXRyaWNJbmZvOmIuaW5mb30pKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19LF91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgpPT57dGhpcy5fc2V0Q29uZmlndXJhdGlvbih7c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJgp0aGlzLl9tZXRyaWNzP3RoaXMuX2hwYXJhbXMubWFwKGI9PmIuZGlzcGxheWVkKS5jb25jYXQodGhpcy5fbWV0cmljcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpKTpbXX0sX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl7aWYoIXRoaXMuX2hwYXJhbXN8fCF0aGlzLl9tZXRyaWNzKXJldHVybntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX07Y29uc3QgYj10aGlzLl9ocGFyYW1zLmZpbHRlcihmPT5mLmRpc3BsYXllZCkubWFwKGY9PmYuaW5mbyksZD10aGlzLl9tZXRyaWNzLmZpbHRlcihmPT5mLmRpc3BsYXllZCkubWFwKGY9PmYuaW5mbyk7cmV0dXJue2hwYXJhbUluZm9zOmIsbWV0cmljSW5mb3M6ZH19LF9xdWVyeVNlcnZlcigpe3RoaXMuZGVib3VuY2UoInF1ZXJ5U2VydmVyIiwoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe2lmKHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3MpcmV0dXJuIHRoaXMuX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKS50aGVuKHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7dmFsdWU6YiwKY2FuY2VsbGVkOmR9KT0+e2R8fCgwPD1iLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYi50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsYi50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSksdGYuaHBhcmFtcy51dGlscy5zZXRBcnJheU9ic2VydmFibHkodGhpcyxiLnNlc3Npb25Hcm91cHMpKX0pKX0sX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtjb25zdCBiPXRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7aWYobnVsbCE9PWIpcmV0dXJuIHRoaXMuc2V0KCJfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QiLGIpLHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbEFsbCgpLHRoaXMuYmFja2VuZC5saXN0U2Vzc2lvbkdyb3VwcyhiKX0sCl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGIobSl7dmFyIG49Zi5nZXQobSsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249IiI9PT1uPyItSW5maW5pdHkiOituO2Yuc2V0KG0rIi5taW4uaW52YWxpZCIsaXNOYU4obikpO2g9aCYmIWlzTmFOKG4pO3ZhciBxPWYuZ2V0KG0rIi5tYXgudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPSIiPT09cT8iSW5maW5pdHkiOitxO2Yuc2V0KG0rIi5tYXguaW52YWxpZCIsaXNOYU4ocSkpO2g9aCYmIWlzTmFOKHEpO3JldHVybiBpc05hTihuKXx8aXNOYU4ocSk/bnVsbDp7bWluVmFsdWU6bixtYXhWYWx1ZTpxfX1mdW5jdGlvbiBkKG0pe3ZhciBuPWYuZ2V0KG0rIi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249K247Y29uc3QgcT1OdW1iZXIuaXNJbnRlZ2VyKG4pJiYwPG47Zi5zZXQobSsiLmludmFsaWQiLCFxKTtoPWgmJnE7cmV0dXJuIHE/bjpudWxsfQpjb25zdCBmPXRoaXM7bGV0IGg9ITA7Y29uc3Qgaz10aGlzLl9zdGF0dXNlcy5maWx0ZXIobT0+bS5hbGxvd2VkKS5tYXAobT0+bS52YWx1ZSk7bGV0IHI9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChtLG4pPT57bGV0IHE9e2hwYXJhbTptLmluZm8ubmFtZX07aWYobS5maWx0ZXIuZG9tYWluRGlzY3JldGUpcS5maWx0ZXJEaXNjcmV0ZT1bXSxtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKHU9Pnt1LmNoZWNrZWQmJnEuZmlsdGVyRGlzY3JldGUucHVzaCh1LnZhbHVlKX0pO2Vsc2UgaWYobS5maWx0ZXIuaW50ZXJ2YWwpcS5maWx0ZXJJbnRlcnZhbD1iKCJfaHBhcmFtcy4iK24rIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNlIGlmKG0uZmlsdGVyLnJlZ2V4cClxLmZpbHRlclJlZ2V4cD1tLmZpbHRlci5yZWdleHA7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiaHBhcmFtLmZpbHRlciB3aXRoIG5vIGRvbWFpbkRpc2NyZXRlLCBpbnRlcnZhbCBvciByZWdleHAgcHJvcGVydGllcyBzZXQ6ICVzIiwKbSksbnVsbDtyLnB1c2gocSl9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKG0sbik9PnttPXttZXRyaWM6bS5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YigiX21ldHJpY3MuIituKyIuZmlsdGVyLmludGVydmFsIil9O3IucHVzaChtKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluIHIpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDtyW3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoiT1JERVJfREVTQyJ9Y29uc3QgbD1kKCJfcGFnZU51bWJlcklucHV0IikscD1kKCJfcGFnZVNpemVJbnB1dCIpO3JldHVybiBoP3tleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLGFsbG93ZWRTdGF0dXNlczprLApjb2xQYXJhbXM6cixzdGFydEluZGV4OnAqKGwtMSksc2xpY2VTaXplOnB9Om51bGx9LF9tZXRyaWNTb3J0QnlJbmRleChiKXtyZXR1cm4gYit0aGlzLl9ocGFyYW1zLmxlbmd0aH0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfcHJldHR5UHJpbnQ6dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtzY3JvbGw6ITB9LGQ9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxmPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oaCxrKXtrPWRba107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1rP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWt8fGg/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oaCl7dmFyIGs9e307ay5mbGV4PSJjb3ZlciIhPT1oO3JldHVybiBPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuIGtbcl19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dmFyIHI9dGhpcy5oZWFkZXI7ciYmKGZba10mJiFmW2hdPyhyLmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7ci5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGZbaF0scikpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5zY3JvbGxlcixrPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1oLnNjcm9sbFRvcCk7ayYmdGhpcy50YWxsQ2xhc3MmJmZbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxrLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmguc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGspfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGgpe3JldHVybiBiW2hdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYiYmISFiLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGIpe2lmKHRoaXMubGluayl7dmFyIGQ9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmQmJmIudGFyZ2V0IT09ZCYmZC5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGI/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihiKXtiLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYixkLGYpe3JldHVybiFkfHxmPyJoaWRkZW4iOmI/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/InNjcm9sbGFibGUiKyhkPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj8iaGlkZGVuIjpkPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX3RhYkNoYW5nZWQoYi5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9Yi5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYixkKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09Yjt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGQpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDtiLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGIsZCl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZCYmLWQuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYil7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YjtiPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09Yjt0aGlzLl9yaWdodEhpZGRlbj1iPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2lmKGIpe3ZhciBmPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD1mLndpZHRoLGs9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmPWsubGVmdC1mLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChrLndpZHRoLGgpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZixoKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1kKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgcj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9dGhpcy5pdGVtcy5pbmRleE9mKGQpO2I9dGhpcy5pdGVtcy5pbmRleE9mKGIpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7Yj1kPGI7dGhpcy5faXNSVEwmJihiPSFiKTtiP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGsubGVmdCtrLndpZHRoLQpyLmxlZnQsaCktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudChyLmxlZnQrci53aWR0aC1rLmxlZnQsaCktNSx0aGlzLl9jYWxjUGVyY2VudChmLGgpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGsud2lkdGgsZil9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihiLGQpe2QtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5kP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQ6KGQrPWItdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxkJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9ZCkpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYiwKZCl7cmV0dXJuIDEwMCpiL2R9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihiLGQpe2I9Ynx8MDtkPWR8fDA7dGhpcy5fd2lkdGg9Yjt0aGlzLl9sZWZ0PWQ7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitkKyIlKSBzY2FsZVgoIitiLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDtiLmNvbnRhaW5zKCJleHBhbmQiKT8oYi5yZW1vdmUoImV4cGFuZCIpLGIuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmIuY29udGFpbnMoImNvbnRyYWN0IikmJmIucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2xiYXIvcGFwZXItdG9vbGJhci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sYmFyIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbGJhciJ9LHByb3BlcnRpZXM6e2JvdHRvbUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxqdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbWlkZGxlSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxyZWFkeTpmdW5jdGlvbigpe2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlKHRoaXMpO3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKX0sX29ic2VydmU6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfS5iaW5kKHRoaXMpKTsKZC5vYnNlcnZlKGIse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7cmV0dXJuIGR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zm9yKHZhciBiPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGYsaD0wO2Y9ZFtoXTtoKyspe2Y9UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2Zvcih2YXIgayxyPTA7az1mW3JdO3IrKylpZihrLmNsYXNzTGlzdCYmay5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoay5pZCliLnB1c2goay5pZCk7ZWxzZXt2YXIgbD0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMUU0Kk1hdGgucmFuZG9tKCkpO2suaWQ9bDtiLnB1c2gobCl9fTA8CmIubGVuZ3RoJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IrKCJqdXN0aWZpZWQiPT09Yj8iIjoiLWp1c3RpZmllZCIpOiIifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZ3VyYXRpb24uKikiLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyhzZXNzaW9uR3JvdXBzLiopIl0sX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCl7Y29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSxkPXRoaXMuY29uZmlndXJhdGlvbi5zY2hlbWEsZj17Y29sdW1uczpiLmhwYXJhbUluZm9zLm1hcCgoaCxrKT0+KHtuYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oayk/CiJMSU5FQVIiOiJOT05fTlVNRVJJQyJ9KSkuY29uY2F0KGIubWV0cmljSW5mb3MubWFwKChoLGspPT57ays9Yi5ocGFyYW1JbmZvcy5sZW5ndGg7cmV0dXJue3NjYWxlOiJMSU5FQVIiLG5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGgpLGluZGV4OmssYWJzb2x1dGVJbmRleDp0Zi5ocGFyYW1zLnV0aWxzLmdldEFic29sdXRlQ29sdW1uSW5kZXgoZCxiLGspfX0pKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsZik7UG9seW1lci5kb20uZmx1c2goKTt0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9LF91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzKCl7bnVsbCE9PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChiPT57Y29uc3QgZD0ib3B0aW9ucy5jb2x1bW5zLiIrCmIuaW5kZXg7dGhpcy5fYWxsb3dMb2dTY2FsZShiKXx8IkxPRyIhPT1iLnNjYWxlfHx0aGlzLnNldChkKyIuc2NhbGUiLCJMSU5FQVIiKX0pfSxfYWxsb3dMb2dTY2FsZShiKXtpZighdGhpcy5faXNOdW1lcmljQ29sdW1uKGIuaW5kZXgpfHwhdGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiExO2NvbnN0IFtkLGZdPXRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIuaW5kZXgpO3JldHVybiAwPGR8fDA+Zn0sX2lzTnVtZXJpY0NvbHVtbihiKXtyZXR1cm4gYj49dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RofHwiREFUQV9UWVBFX0ZMT0FUNjQiPT09dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NbYl0udHlwZX0sX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKXtpZigwPHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwpjb25zdCBiPXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleChkPT4iREFUQV9UWVBFX0ZMT0FUNjQiPT09ZC50eXBlKTtpZigtMSE9PWIpcmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1kP2Q6bnVsbDtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuX3VwZGF0ZUl0ZW0oYixiLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7X3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlvczp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLykscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmaXhlZFNlY3Rpb25zOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLGNvbXB1dGVkOiJfaGFzRml4ZWRTZWN0aW9ucyhzY3JvbGxiYXJXaWR0aCkifSxfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNjcm9sbGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy4kLnRhYmxlfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsCiJfb25XaGVlbCIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwiX29uV2hlZWwiKX0sc2Nyb2xsVG9TY2FsZWRJbmRleDpmdW5jdGlvbihiKXt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1udWxsO3RoaXMuJC5pdGVtcy5zdHlsZS5ib3JkZXJUb3BXaWR0aHx8KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PWIpO2I9TWF0aC5taW4oTWF0aC5tYXgoYiwwKSx0aGlzLnNpemUtMSk7dGhpcy4kLnRhYmxlLnNjcm9sbFRvcD1iL3RoaXMuc2l6ZSp0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0O3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLnNjcm9sbFRvSW5kZXgoYi10aGlzLl92aWR4T2Zmc2V0KTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFBvc2l0aW9uKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5fdmlkeE9mZnNldCt0aGlzLmxhc3RWaXNpYmxlSW5kZXg9PT10aGlzLnNpemUtCjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQtdGhpcy4kLnRhYmxlLm9mZnNldEhlaWdodCx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpfSxfaGFzRml4ZWRTZWN0aW9uczpmdW5jdGlvbihiKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZS8pJiYwPT09Yn0sX29uV2hlZWw6ZnVuY3Rpb24oYil7aWYoIWIuY3RybEtleSYmIXRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi50YXJnZXQsYi5kZWx0YVgsYi5kZWx0YVkpKXt2YXIgZD10aGlzLiQudGFibGUsZj1iLmRlbHRhWTsxPT09Yi5kZWx0YU1vZGUmJihmKj1ncmlkLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSk7dmFyIGg9TWF0aC5hYnMoYi5kZWx0YVgpK01hdGguYWJzKGYpO3RoaXMuX2NhblNjcm9sbChkLGIuZGVsdGFYLGYpPyhiLnByZXZlbnREZWZhdWx0KCksZC5zY3JvbGxUb3ArPWYsZC5zY3JvbGxMZWZ0Kz1iLmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksCnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITAsdGhpcy5faWdub3JlTmV3V2hlZWw9dGhpcy5kZWJvdW5jZSgiaWdub3JlLW5ldy13aGVlbCIsZnVuY3Rpb24oKXt0aGlzLl9pZ25vcmVOZXdXaGVlbD1udWxsfSw1MDApKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZoPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD9iLnByZXZlbnREZWZhdWx0KCk6aD50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSk7dGhpcy5fcHJldmlvdXNNb21lbnR1bT1ofX0sX2hhc1Njcm9sbGVkQW5jZXN0b3I6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuX2NhblNjcm9sbChiLGQsZikpcmV0dXJuITA7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1iLmxvY2FsTmFtZSYmYiE9PXRoaXMmJmIucGFyZW50RWxlbWVudClyZXR1cm4gdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihiLnBhcmVudEVsZW1lbnQsZCxmKX0sCl9jYW5TY3JvbGw6ZnVuY3Rpb24oYixkLGYpe3JldHVybiAwPGYmJmIuc2Nyb2xsVG9wPGIuc2Nyb2xsSGVpZ2h0LWIub2Zmc2V0SGVpZ2h0fHwwPmYmJjA8Yi5zY3JvbGxUb3B8fDA8ZCYmYi5zY3JvbGxMZWZ0PGIuc2Nyb2xsV2lkdGgtYi5vZmZzZXRXaWR0aHx8MD5kJiYwPGIuc2Nyb2xsTGVmdH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxkPWItdGhpcy5fc2Nyb2xsUG9zaXRpb24sZj10aGlzLl9yYXRpbyxoPTAsaz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSxyPWYsbD1bXTt0aGlzLl9zY3JvbGxQb3NpdGlvbj1iO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt2YXIgcD10aGlzLl9zY3JvbGxCb3R0b207dmFyIG09dGhpcy5fcGh5c2ljYWxCb3R0b207aWYoTWF0aC5hYnMoZCk+dGhpcy5fcGh5c2ljYWxTaXplKXRoaXMuX3BoeXNpY2FsVG9wKz0KZCxoPU1hdGgucm91bmQoZC90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO2Vsc2UgaWYoMD5kKXt2YXIgbj1iLXRoaXMuX3BoeXNpY2FsVG9wO2w9dGhpcy5fdmlydHVhbFN0YXJ0O3ZhciBxPVtdO3ZhciB1PXRoaXMuX3BoeXNpY2FsRW5kO2ZvcihyPW4vaztyPGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmMDxsLWgmJm0tdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpPnA7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHIrPW4vayxtLT1uLHEucHVzaCh1KSxoKyssdT0wPT09dT90aGlzLl9waHlzaWNhbENvdW50LTE6dS0xO2w9cTtoPS1ofWVsc2UgaWYoMDxkKXt2YXIgdz10aGlzLl92aXJ0dWFsRW5kLEE9dGhpcy5fdmlydHVhbENvdW50LTE7cT1bXTt1PXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHI9KG0tcCkvaztyPGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmdytoPEEmJnRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KTwKYjspbj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSkscis9bi9rLHRoaXMuX3BoeXNpY2FsVG9wKz1uLHEucHVzaCh1KSxoKyssdT0odSsxKSV0aGlzLl9waHlzaWNhbENvdW50fXRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLnNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkKTswPT09aD8obTxwfHx0aGlzLl9waHlzaWNhbFRvcD5iKSYmdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKToodGhpcy5fdmlydHVhbFN0YXJ0Kz1oLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWgsdGhpcy5fdXBkYXRlKHEsbCkpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpO3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIil8fCh0aGlzLnNjcm9sbGluZz0hMCk7dGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtc2Nyb2xsaW5nIixmdW5jdGlvbigpe3RoaXMuc2Nyb2xsaW5nPSExO3RoaXMuX3Jlb3JkZXJSb3dzKCl9LDEwMCl9LF9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQ6ZnVuY3Rpb24oYil7aWYoMUU0PApNYXRoLmFicyhiKSl0aGlzLl9ub1NjYWxlP3RoaXMuX25vU2NhbGU9ITE6KGI9TWF0aC5yb3VuZCh0aGlzLl9zY3JvbGxQb3NpdGlvbi90aGlzLl9zY3JvbGxIZWlnaHQqMUUzKS8xRTMsdGhpcy5fdmlkeE9mZnNldD1NYXRoLnJvdW5kKGIqdGhpcy5zaXplLWIqdGhpcy5fdmlydHVhbENvdW50KSwwPT09dGhpcy5fc2Nyb2xsVG9wJiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpO2Vsc2V7Yj10aGlzLl92aWR4T2Zmc2V0fHwwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCxiIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKToxRTM+dGhpcy5maXJzdFZpc2libGVJbmRleCYmMDx0aGlzLl92aWR4T2Zmc2V0JiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KyhiLXRoaXMuX3ZpZHhPZmZzZXQpKzEpLHRoaXMuX25vU2NhbGU9CiEwKTt2YXIgZD10aGlzLnNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PWQsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpKTp0aGlzLmZpcnN0VmlzaWJsZUluZGV4PnRoaXMuX3ZpcnR1YWxDb3VudC0xRTMmJnRoaXMuX3ZpZHhPZmZzZXQ8ZCYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGQtdGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LWIpKSx0aGlzLl9ub1NjYWxlPSEwKX19LF9yZW9yZGVyUm93czpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcyksZD1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3ciKSxmPWQubGVuZ3RoLShkWzBdLmluZGV4LSh0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fdmlkeE9mZnNldCkpOwppZihmPGQubGVuZ3RoLzIpZm9yKHZhciBoPTA7aDxmO2grKyliLmFwcGVuZENoaWxkKGRbaF0pO2Vsc2UgZm9yKDtmPGQubGVuZ3RoO2YrKyliLmluc2VydEJlZm9yZShkW2ZdLGRbMF0pfSxfZnJvemVuQ2VsbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiY2FjaGUtZWxlbWVudHMiLGZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIikuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0eWxlLnRyYW5zZm9ybT0iIn0pO3RoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX0sX3VwZGF0ZUxhc3RGcm96ZW46ZnVuY3Rpb24oKXtpZih0aGlzLmNvbHVtblRyZWUpe3ZhciBiPQp0aGlzLmNvbHVtblRyZWVbdGhpcy5jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZi5fb3JkZXItaC5fb3JkZXJ9KTt2YXIgZD1iLnJlZHVjZShmdW5jdGlvbihmLGgsayl7aC5fbGFzdEZyb3plbj0hMTtyZXR1cm4gaC5mcm96ZW4mJiFoLmhpZGRlbj9rOmZ9LHZvaWQgMCk7dm9pZCAwIT09ZCYmKGJbZF0uX2xhc3RGcm96ZW49ITApfX0sX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuZml4ZWRTZWN0aW9ucz8odGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsLXRoaXMuX3Njcm9sbFRvcHx8MCksdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLDApKTp0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT0KdGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsdGhpcy5fc2Nyb2xsVG9wKTtmb3IodmFyIGI9dGhpcy5fZ2V0VHJhbnNsYXRlKHRoaXMuX3Njcm9sbExlZnQsMCksZD0wO2Q8dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoO2QrKyl0aGlzLl9mcm96ZW5DZWxsc1tkXS5zdHlsZS50cmFuc2Zvcm09Yn0sX2dldFRyYW5zbGF0ZTpmdW5jdGlvbihiLGQpe3JldHVybiJ0cmFuc2xhdGUoIitiKyJweCwiK2QrInB4KSJ9fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9yPVtQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtY2VsbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW46T2JqZWN0LGV4cGFuZGVkOkJvb2xlYW4sZmxleEdyb3c6TnVtYmVyLGNvbFNwYW46TnVtYmVyLGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGZyb3plbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saGlkZGVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpbnN0YW5jZTpPYmplY3QsaW5kZXg6TnVtYmVyLGl0ZW06T2JqZWN0LHNlbGVjdGVkOkJvb2xlYW4sdGVtcGxhdGU6T2JqZWN0LHRhcmdldDpPYmplY3Qsd2lkdGg6U3RyaW5nLG9yZGVyOk51bWJlcixyZW9yZGVyU3RhdHVzOnt0eXBlOlN0cmluZyxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9jaGlsZENvbHVtbnM6QXJyYXksX2NlbGxDb250ZW50Ok9iamVjdCxfaW5zZXJ0aW9uUG9pbnQ6T2JqZWN0LApfdGVtcGxhdGl6ZXI6T2JqZWN0fSxvYnNlcnZlcnM6Il9jb2x1bW5DaGFuZ2VkKGNvbHVtbik7X2NlbGxBdHRhY2hlZChjb2x1bW4sIGlzQXR0YWNoZWQpO19leHBhbmRlZENoYW5nZWQoZXhwYW5kZWQsIGluc3RhbmNlKTtfZmxleEdyb3dDaGFuZ2VkKGZsZXhHcm93KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBpbnN0YW5jZSk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGluc3RhbmNlKTtfaW5zdGFuY2VDaGFuZ2VkKGluc3RhbmNlLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGluc3RhbmNlKTtfdG9nZ2xlQ29udGVudChpc0F0dGFjaGVkLCBfY2VsbENvbnRlbnQsIF9pbnNlcnRpb25Qb2ludCk7X3RvZ2dsZUluc3RhbmNlKGlzQXR0YWNoZWQsIF90ZW1wbGF0aXplciwgaW5zdGFuY2UpO193aWR0aENoYW5nZWQod2lkdGgpO19vcmRlckNoYW5nZWQob3JkZXIpO192aXNpYmxlQ2hpbGRDb2x1bW5zQ2hhbmdlZChfdmlzaWJsZUNoaWxkQ29sdW1ucyk7X2NoaWxkQ29sdW1uc0NoYW5nZWQoX2NoaWxkQ29sdW1ucykiLnNwbGl0KCI7IiksCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1jZWxsIik7ITE9PT1Qb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyYmKHRoaXMuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSx0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkIikpfSxfY29sdW1uQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmZsZXhHcm93PWQuZmxleEdyb3c7dGhpcy5mcm96ZW49ZC5mcm96ZW47dGhpcy5sYXN0RnJvemVuPWQuX2xhc3RGcm96ZW47dGhpcy5oZWFkZXJUZW1wbGF0ZT1kLmhlYWRlclRlbXBsYXRlO3RoaXMuZm9vdGVyVGVtcGxhdGU9ZC5mb290ZXJUZW1wbGF0ZTt0aGlzLnRlbXBsYXRlPWQudGVtcGxhdGU7dGhpcy53aWR0aD1kLndpZHRoO3RoaXMuaGlkZGVuPWQuaGlkZGVuO3RoaXMucmVzaXphYmxlPWQucmVzaXphYmxlO3RoaXMuX2NoaWxkQ29sdW1ucz1kLl9jaGlsZENvbHVtbnM7dGhpcy5vcmRlcj1kLl9vcmRlcjtkLmNvbFNwYW4mJih0aGlzLmNvbFNwYW49CmQuY29sU3Bhbik7dGhpcy5saXN0ZW4oZCwicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpfSxfY2VsbEF0dGFjaGVkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGY/dGhpcy5saXN0ZW4oZCwicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fHRoaXMudW5saXN0ZW4oZCwicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpfSkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oZCl7ZC50YXJnZXQ9PXRoaXMuY29sdW1uJiYodGhpc1tkLmRldGFpbC5wYXRoXT1kLmRldGFpbC52YWx1ZSl9LF9leHBhbmRlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5fX2V4cGFuZGVkX189ZCxmLmV4cGFuZGVkPWQpfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUuZmxleEdyb3c9CmR9LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5pbmRleD1kKX0sX2l0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuaXRlbT1kKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLl9fc2VsZWN0ZWRfXz1kLGYuc2VsZWN0ZWQ9ZCl9LF9jaGlsZENvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuY29sU3Bhbj1kLmxlbmd0aH0sX3RvZ2dsZUNvbnRlbnQ6ZnVuY3Rpb24oZCxmLGgpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJnZvaWQgMCE9PWgmJihkPyhQb2x5bWVyLmRvbShmKS5wYXJlbnROb2RlIT09dGhpcy50YXJnZXQmJlBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5hcHBlbmRDaGlsZChmKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChoKSk6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZHx8UG9seW1lci5kb20oZikucGFyZW50Tm9kZSE9PQp0aGlzLnRhcmdldHx8UG9seW1lci5kb20odGhpcy50YXJnZXQpLnJlbW92ZUNoaWxkKGYpfSkpfSxfdG9nZ2xlSW5zdGFuY2U6ZnVuY3Rpb24oZCxmLGgpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJnZvaWQgMCE9PWgmJihkP2YuYWRkSW5zdGFuY2UoaCk6Zi5yZW1vdmVJbnN0YW5jZShoKSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5zdHlsZS53aWR0aD1kfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUub3JkZXI9ZH0sX3RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmluc3RhbmNlPWQudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKTt0aGlzLl90ZW1wbGF0aXplcj1kLnRlbXBsYXRpemVyfSxfaW5zdGFuY2VDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKHRoaXMuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuX2NlbGxDb250ZW50PXRoaXMuX2NlbGxDb250ZW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiKSwKZD0idmFhZGluLWdyaWQtY2VsbC1jb250ZW50LSIrKHZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXg9dmFhZGluLmVsZW1lbnRzLmdyaWQuX2NvbnRlbnRJbmRleCsxfHwwKSx0aGlzLl9jZWxsQ29udGVudC5pbm5lckhUTUw9IiIsUG9seW1lci5kb20odGhpcy5fY2VsbENvbnRlbnQpLmFwcGVuZENoaWxkKHRoaXMuaW5zdGFuY2Uucm9vdCksdGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJpZCIsZCksUG9seW1lci5FbGVtZW50Pyh0aGlzLl9jZWxsQ29udGVudC5zZXRBdHRyaWJ1dGUoInNsb3QiLGQpLHRoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2luc2VydGlvblBvaW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzbG90IiksdGhpcy5faW5zZXJ0aW9uUG9pbnQuc2V0QXR0cmlidXRlKCJuYW1lIixkKSk6KHRoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2luc2VydGlvblBvaW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjb250ZW50IiksdGhpcy5faW5zZXJ0aW9uUG9pbnQuc2V0QXR0cmlidXRlKCJzZWxlY3QiLAoiIyIrZCkpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl90ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpIl0sX2NlbGxDbGljazpmdW5jdGlvbihkKXtkLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuZmlyZSgiY2VsbC1hY3RpdmF0ZSIse21vZGVsOnRoaXMuaW5zdGFuY2V9KX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiLHByb3BlcnRpZXM6e2hlYWRlclRlbXBsYXRlOk9iamVjdCxyZXNpemFibGU6Qm9vbGVhbixjb2x1bW5SZXNpemluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2hlYWRlclRlbXBsYXRlQ2hhbmdlZChoZWFkZXJUZW1wbGF0ZSkiLCJfaXNFbXB0eUNoYW5nZWQoX2lzRW1wdHksIGlzQXR0YWNoZWQpIiwKIl9yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiXSxsaXN0ZW5lcnM6e21vdXNlZG93bjoiX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplIixtb3VzZW1vdmU6Il9lbmFibGVEcmFnIixtb3VzZW91dDoiX2Rpc2FibGVEcmFnIix0b3VjaHN0YXJ0OiJfb25Ub3VjaFN0YXJ0Iix0b3VjaG1vdmU6Il9vblRvdWNoTW92ZSIsdG91Y2hlbmQ6Il9vblRvdWNoRW5kIixjb250ZXh0bWVudToiX29uQ29udGV4dE1lbnUifSxfb25Db250ZXh0TWVudTpmdW5jdGlvbihkKXt0aGlzLl9yZW9yZGVyR2hvc3QmJmQucHJldmVudERlZmF1bHQoKX0sX29uVG91Y2hTdGFydDpmdW5jdGlvbihkKXtkLnRhcmdldCE9PXRoaXMuX3Jlc2l6ZUhhbmRsZSYmdGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJih0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyLmJpbmQodGhpcyxkKSwxMDApKX0sX3N0YXJ0UmVvcmRlcjpmdW5jdGlvbihkKXt0aGlzLl9yZW9yZGVyR2hvc3Q9CnRoaXMuX2dldEdob3N0KCk7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO3ZhciBmPW5ldyBDdXN0b21FdmVudCgiZHJhZ3N0YXJ0Iix7YnViYmxlczohMH0pO3RoaXMuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQoZik7dGhpcy5fcmVvcmRlclhZPXt4OmQudG91Y2hlc1swXS5jbGllbnRYLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCx5OmQudG91Y2hlc1swXS5jbGllbnRZLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfTt0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGQudG91Y2hlc1swXS5jbGllbnRYLGQudG91Y2hlc1swXS5jbGllbnRZKX0sX29uVG91Y2hNb3ZlOmZ1bmN0aW9uKGQpe2lmKHRoaXMuX3Jlb3JkZXJHaG9zdCl7ZC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBmPW5ldyBDdXN0b21FdmVudCgiZHJhZ292ZXIiLHtidWJibGVzOiEwfSk7Zi5jbGllbnRYPWQudG91Y2hlc1swXS5jbGllbnRYO2YuY2xpZW50WT0KZC50b3VjaGVzWzBdLmNsaWVudFk7dmFyIGg9dGhpcy5fY29udGVudEZyb21Qb2ludChmLmNsaWVudFgsZi5jbGllbnRZKTtoJiZoLmRpc3BhdGNoRXZlbnQoZik7dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihkLnRvdWNoZXNbMF0uY2xpZW50WCxkLnRvdWNoZXNbMF0uY2xpZW50WSl9ZWxzZSBjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCl9LF91cGRhdGVHaG9zdFBvc2l0aW9uOmZ1bmN0aW9uKGQsZil7ZC09dGhpcy5fcmVvcmRlclhZLng7Zj1mLXRoaXMuX3Jlb3JkZXJYWS55LTUwO3ZhciBoPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS5sZWZ0fHwwKSxrPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50b3B8fDApLHI9dGhpcy5fcmVvcmRlckdob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS5sZWZ0PWgtKHIubGVmdC1kKSsicHgiO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50b3A9CmstKHIudG9wLWYpKyJweCJ9LF9vblRvdWNoRW5kOmZ1bmN0aW9uKGQpe2NsZWFyVGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0KTt0aGlzLl9yZW9yZGVyR2hvc3QmJihkLnByZXZlbnREZWZhdWx0KCksZD1uZXcgQ3VzdG9tRXZlbnQoImRyYWdlbmQiLHtidWJibGVzOiEwfSksdGhpcy5kaXNwYXRjaEV2ZW50KGQpLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuX3Jlb3JkZXJHaG9zdD1udWxsKX0sX2NvbnRlbnRGcm9tUG9pbnQ6ZnVuY3Rpb24oZCxmKXtpZihQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyl7dmFyIGg9dGhpcy50YXJnZXQuJC5zY3JvbGxlcjtoLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITApO2Q9dGhpcy5kb21Ib3N0LnJvb3QuZWxlbWVudEZyb21Qb2ludChkLGYpO2gudG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMSk7aWYoZCYmZC5nZXRDb250ZW50Q2hpbGRyZW4pcmV0dXJuIGQuZ2V0Q29udGVudENoaWxkcmVuKFBvbHltZXIuRWxlbWVudD8KInNsb3QiOiJjb250ZW50IilbMF19ZWxzZSByZXR1cm4gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChkLGYpfSxfZ2V0R2hvc3Q6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLnRhcmdldC4kLnNjcm9sbGVyLiQucmVvcmRlcmdob3N0O2QuaW5uZXJUZXh0PXRoaXMuX2NlbGxDb250ZW50LmlubmVyVGV4dDt2YXIgZj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9jZWxsQ29udGVudCk7ImJveFNpemluZyBkaXNwbGF5IHdpZHRoIGhlaWdodCBiYWNrZ3JvdW5kIGFsaWduSXRlbXMgcGFkZGluZyBib3JkZXIgZmxleC1kaXJlY3Rpb24gb3ZlcmZsb3ciLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihoKXtkLnN0eWxlW2hdPWZbaF19LHRoaXMpO3JldHVybiBkfSxfZW5hYmxlRHJhZzpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50LmRyYWdnYWJsZT10aGlzLnRhcmdldC5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCYmIXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpfSxfZGlzYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9CiExfSxfY2FuY2VsTW91c2VEb3duT25SZXNpemU6ZnVuY3Rpb24oZCl7ZC50YXJnZXQ9PT10aGlzLl9yZXNpemVIYW5kbGUmJmQucHJldmVudERlZmF1bHQoKX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7ZD8odGhpcy5fcmVzaXplSGFuZGxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuX3Jlc2l6ZUhhbmRsZS5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSIpLHRoaXMubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpOnRoaXMuX3Jlc2l6ZUhhbmRsZSYmKHRoaXMudW5saXN0ZW4odGhpcy5fcmVzaXplSGFuZGxlLCJ0cmFjayIsIl9vblRyYWNrIiksUG9seW1lci5kb20odGhpcykucmVtb3ZlQ2hpbGQodGhpcy5fcmVzaXplSGFuZGxlKSl9LF9vblRyYWNrOmZ1bmN0aW9uKGQpe3RoaXMuY29sdW1uUmVzaXppbmc9CiEwO3ZhciBmPXRoaXMuY29sdW1uOyJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09Zi5sb2NhbE5hbWUmJihmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGYuX2NoaWxkQ29sdW1ucywwKS5zb3J0KGZ1bmN0aW9uKHIsbCl7cmV0dXJuIHIuX29yZGVyLWwuX29yZGVyfSkuZmlsdGVyKGZ1bmN0aW9uKHIpe3JldHVybiFyLmhpZGRlbn0pLnBvcCgpKTt2YXIgaD10aGlzLl9nZXRIZWFkZXJDZWxsQnlDb2x1bW4oZik7aWYoaC5vZmZzZXRXaWR0aCl7dmFyIGs9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaC5fY2VsbENvbnRlbnQpO2Yud2lkdGg9TWF0aC5tYXgoMTArcGFyc2VJbnQoay5wYWRkaW5nTGVmdCkrcGFyc2VJbnQoay5wYWRkaW5nUmlnaHQpLGgub2Zmc2V0V2lkdGgrZC5kZXRhaWwueC1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSsicHgiO2YuZmxleEdyb3c9MH1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIikpLnNvcnQoZnVuY3Rpb24ociwKbCl7cmV0dXJuIHIuY29sdW1uLl9vcmRlci1sLmNvbHVtbi5fb3JkZXJ9KS5mb3JFYWNoKGZ1bmN0aW9uKHIsbCxwKXtsPHAuaW5kZXhPZihoKSYmKHIuY29sdW1uLndpZHRoPXIub2Zmc2V0V2lkdGgrInB4IixyLmNvbHVtbi5mbGV4R3Jvdz0wKX0pO3RoaXMuY29sdW1uUmVzaXppbmcmJiJlbmQiPT09ZC5kZXRhaWwuc3RhdGUmJih0aGlzLmNvbHVtblJlc2l6aW5nPSExKTt0aGlzLmZpcmUoImNvbHVtbi1yZXNpemluZyIpfSxfZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uOmZ1bmN0aW9uKGQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGYpe3JldHVybiBmLmNvbHVtbj09PWR9KVswXX0sX2hlYWRlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihkKXt2b2lkIDAhPT0KZCYmKG51bGw9PT1kfHwhdGhpcy5faXNDb2x1bW5Sb3cmJiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiIT09dGhpcy5jb2x1bW4ubG9jYWxOYW1lPyh0aGlzLmluc3RhbmNlPXtyb290OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSx0aGlzLl9pc0VtcHR5PSEwKToodGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCksdGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcix0aGlzLl9pc0VtcHR5PSExKSl9LF9pc0VtcHR5Q2hhbmdlZDpmdW5jdGlvbihkLGYpe2YmJnRoaXMuZmlyZSgiY2VsbC1lbXB0eS1jaGFuZ2VkIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIixwcm9wZXJ0aWVzOntmb290ZXJUZW1wbGF0ZTpPYmplY3R9LGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZChmb290ZXJUZW1wbGF0ZSkiLAoiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSJdLF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dm9pZCAwIT09ZCYmKG51bGw9PT1kfHwhdGhpcy5faXNDb2x1bW5Sb3cmJiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiIT09dGhpcy5jb2x1bW4ubG9jYWxOYW1lPyh0aGlzLmluc3RhbmNlPXtyb290OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSx0aGlzLl9pc0VtcHR5PSEwKToodGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCksdGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcix0aGlzLl9pc0VtcHR5PSExKSl9LF9pc0VtcHR5Q2hhbmdlZDpmdW5jdGlvbihkLGYpe2YmJnRoaXMuZmlyZSgiY2VsbC1lbXB0eS1jaGFuZ2VkIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyLWNlbGwiLGJlaGF2aW9yczpbYl19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtc2l6ZXIiLHByb3BlcnRpZXM6e2NvbHVtblRyZWU6QXJyYXksdG9wOk51bWJlcixfY29sdW1uczpBcnJheX0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUpIiwiX3RvcENoYW5nZWQodG9wKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9jb2x1bW5zPWJbYi5sZW5ndGgtMV19LF90b3BDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudG9wPWIrInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1vdXRlci1zY3JvbGxlci5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1vdXRlci1zY3JvbGxlciIscHJvcGVydGllczp7c2Nyb2xsVGFyZ2V0Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3Njcm9sbFRhcmdldENoYW5nZWQifSxwYXNzdGhyb3VnaDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMH19LGxpc3RlbmVyczp7c2Nyb2xsOiJfc3luY1Njcm9sbFRhcmdldCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKTt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPSJ0b3VjaCJ9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLmRvbUhvc3QsIm1vdXNlbW92ZSIsIl9vbk1vdXNlTW92ZSIpfSxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJnRoaXMudW5saXN0ZW4oZCwic2Nyb2xsIiwiX3N5bmNPdXRlclNjcm9sbGVyIik7dGhpcy5saXN0ZW4oYiwKInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24oYil7dGhpcy5wYXNzdGhyb3VnaD1iLm9mZnNldFk8PXRoaXMuY2xpZW50SGVpZ2h0JiZiLm9mZnNldFg8PXRoaXMuY2xpZW50V2lkdGh9LF9zeW5jT3V0ZXJTY3JvbGxlcjpmdW5jdGlvbigpe3RoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXR8fCh0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcj0hMCx0aGlzLnNjcm9sbFRvcD10aGlzLmRvbUhvc3QuX3Njcm9sbFRvcCx0aGlzLnNjcm9sbExlZnQ9dGhpcy5kb21Ib3N0Ll9zY3JvbGxMZWZ0KTt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0PSExfSxfc3luY1Njcm9sbFRhcmdldDpmdW5jdGlvbigpe3RoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyfHwodGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMCx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD10aGlzLnNjcm9sbExlZnQsCnRoaXMuZG9tSG9zdC5fc2Nyb2xsSGFuZGxlcigpKTt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcj0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAiLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJncmlkY2VsbCJ9LHByb3BlcnRpZXM6e2FjdGl2ZVRhcmdldDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hY3RpdmVUYXJnZXRDaGFuZ2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcHJpbWFyeT1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5wcmltYXJ5Iik7dGhpcy5fc2Vjb25kYXJ5PVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigiLnNlY29uZGFyeSIpO2lmKFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdylQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9zZWNvbmRhcnkpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3ByaW1hcnkpfSxmb2N1czpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQhPT10aGlzLl9wcmltYXJ5P3RoaXMuX3ByaW1hcnkuZm9jdXMoKToKdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCl9LF9vbkJhaXRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2VkPWIudGFyZ2V0O3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseXx8KHRoaXMuZmlyZSgiZm9jdXMtZ2FpbmVkIiksdGhpcy5fcHJpbWFyeS50YWJJbmRleD0tMSl9LF9vbkJhaXRCbHVyOmZ1bmN0aW9uKCl7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5fHwodGhpcy5maXJlKCJmb2N1cy1sb3N0IiksdGhpcy5fcHJpbWFyeS50YWJJbmRleD0wKX0sX2FjdGl2ZVRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSEwO3RoaXMuX2ZvY3VzZWQ9PT10aGlzLl9wcmltYXJ5Pyh0aGlzLl9zZWNvbmRhcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpLHRoaXMuX3NlY29uZGFyeS5mb2N1cygpKToodGhpcy5fcHJpbWFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYiksdGhpcy5fcHJpbWFyeS5mb2N1cygpKTsKdGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSExfSxfcmVhbm5vdW5jZTpmdW5jdGlvbigpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMDt0aGlzLl9mb2N1c2VkPT09dGhpcy5fcHJpbWFyeT8odGhpcy5fc2Vjb25kYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5Iix0aGlzLmFjdGl2ZVRhcmdldCksdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCkpOih0aGlzLl9wcmltYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5Iix0aGlzLmFjdGl2ZVRhcmdldCksdGhpcy5fcHJpbWFyeS5mb2N1cygpKTt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtcm93Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sY29sdW1uczpBcnJheSxpbmRleDpOdW1iZXIsY2VsbHM6e3ZhbHVlOltdfSx0YXJnZXQ6T2JqZWN0LGV4cGFuZGVkOnt2YWx1ZTohMX0sZm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saXRlbTpPYmplY3Qsc2VsZWN0ZWQ6e3JlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3Jvd0RldGFpbHNDZWxsOk9iamVjdCxyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0fSxvYnNlcnZlcnM6Il9jb2x1bW5zQ2hhbmdlZChjb2x1bW5zLCB0YXJnZXQpO19pbmRleENoYW5nZWQoaW5kZXgsIGNlbGxzKTtfaXRlbUNoYW5nZWQoaXRlbSwgY2VsbHMpO19pdGVtQ2hhbmdlZEZvckRldGFpbHMoaXRlbSwgX3Jvd0RldGFpbHNDZWxsKTtfcm93RGV0YWlsc0NoYW5nZWQoZXhwYW5kZWQsIHJvd0RldGFpbHNUZW1wbGF0ZSwgdGFyZ2V0KTtfcm93RGV0YWlsc0NlbGxJbmRleENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCBpbmRleCk7X3Jvd0RldGFpbHNDZWxsQ2hhbmdlZChfcm93RGV0YWlsc0NlbGwsIHRhcmdldCk7X3NlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZCwgY2VsbHMpO19zZWxlY3RlZENoYW5nZWRGb3JEZXRhaWxzKHNlbGVjdGVkLCBfcm93RGV0YWlsc0NlbGwpIi5zcGxpdCgiOyIpLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtcm93Iik7ITE9PT1Qb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyYmKHRoaXMuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSx0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkIikpfSxpdGVyYXRlQ2VsbHM6ZnVuY3Rpb24oZCl7dGhpcy5jZWxscy5mb3JFYWNoKGQpO3RoaXMuX3Jvd0RldGFpbHNDZWxsJiZkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKX0sX3Jvd0RldGFpbHNDaGFuZ2VkOmZ1bmN0aW9uKGQsZixoKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oKXtpZihkKXt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIik7ay5zZXRBdHRyaWJ1dGUoImRldGFpbHNjZWxsIiwhMCk7ay5mcm96ZW49ITA7ay50YXJnZXQ9aDtrLnRlbXBsYXRlPWY7ay50b2dnbGVBdHRyaWJ1dGUoImxhc3Rjb2x1bW4iLCEwKTtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKGspOwpQb2x5bWVyLmRvbS5mbHVzaCgpO3RoaXMuX3Jvd0RldGFpbHNDZWxsPWt9ZWxzZSB0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKFBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5fcm93RGV0YWlsc0NlbGwpLHRoaXMuX3Jvd0RldGFpbHNDZWxsPW51bGwpO3RoaXMuaXRlcmF0ZUNlbGxzKGZ1bmN0aW9uKHIpe3IuZXhwYW5kZWQ9ZH0pO3RoaXMudGFyZ2V0LiQuc2Nyb2xsZXIuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpfX0sX3VwZGF0ZVJvd1Zpc2liaWxpdHk6ZnVuY3Rpb24oKXt0aGlzLmhpZGRlbj10aGlzLmNlbGxzLmV2ZXJ5KGZ1bmN0aW9uKGQpe3JldHVybiBkLl9pc0VtcHR5fSl9LF9yb3dEZXRhaWxzQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLiQuc2Nyb2xsZXIuX3VwZGF0ZSgpfSxfcm93RGV0YWlsc0NlbGxJbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZD8oZC5pbmRleD0KZixQb2x5bWVyLmRvbS5mbHVzaCgpLHRoaXMudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCkpOnRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT0iIil9LHVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljczpmdW5jdGlvbigpe3RoaXMuX3Jvd0RldGFpbHNDZWxsJiYodGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0Ll9vYnNlcnZlciYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoJiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXIuZmx1c2goKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9IiIsdGhpcy5zdHlsZS5wYWRkaW5nQm90dG9tPXRoaXMuX3Jvd0RldGFpbHNDZWxsLnN0eWxlLmhlaWdodD10aGlzLl9yb3dEZXRhaWxzQ2VsbC5jbGllbnRIZWlnaHQrInB4Iil9LF9jb2x1bW5zQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0iIjt2YXIgaD1bXTtkLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHI9CiJfIit0aGlzLmlzLnJlcGxhY2UoLy0vZywiXyIpKyJfY2VsbHMiO3I9a1tyXT1rW3JdfHxbXTt2YXIgbD1yLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4hUG9seW1lci5kb20obSkucGFyZW50Tm9kZX0pWzBdO2lmKCFsKXtsPXRoaXMuX2NyZWF0ZUNlbGwoKTt2YXIgcD1BcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKHRoaXMudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoImRvbS1yZXBlYXQiKSxmdW5jdGlvbihtKXtyZXR1cm4hbS5yZXN0YW1wfSk7KHA9cHx8InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciPT09dGhpcy5pc3x8InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciPT09dGhpcy5pcyl8fHIucHVzaChsKX1sLmluZGV4PXRoaXMuaW5kZXg7bC50YXJnZXQ9dGhpcy50YXJnZXQ7bC5faXNDb2x1bW5Sb3c9dGhpcy5faXNDb2x1bW5Sb3c7bC5jb2x1bW49aztsLmV4cGFuZGVkPXRoaXMuZXhwYW5kZWQ7UG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQobCk7aC5wdXNoKGwpfS5iaW5kKHRoaXMpKTsKdGhpcy5jZWxscz1ofX0sX2luZGV4Q2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLmluZGV4PWR9KX0sX2l0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi5mb3JFYWNoKGZ1bmN0aW9uKGgpe2guaXRlbT1kfSl9LF9pdGVtQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmJiYoZi5pdGVtPWQpfSxfc2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi5mb3JFYWNoKGZ1bmN0aW9uKGgpe2guc2VsZWN0ZWQ9ZH0pfSxfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlsczpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYmJihmLnNlbGVjdGVkPWQpfSx1cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7dGhpcy5jZWxscy5zbGljZSgwKS5zb3J0KGZ1bmN0aW9uKGQsCmYpe3JldHVybiBkLmNvbHVtbi5fb3JkZXItZi5jb2x1bW4uX29yZGVyfSkuZm9yRWFjaChmdW5jdGlvbihkLGYsaCl7ZC50b2dnbGVBdHRyaWJ1dGUoImxhc3Rjb2x1bW4iLGY9PT1oLmxlbmd0aC0xKX0pfX07UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLXJvdyIsYmVoYXZpb3JzOltiXSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciLGJlaGF2aW9yczpbYl0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVJvd1Zpc2liaWxpdHkoY29sdW1ucykiXSxsaXN0ZW5lcnM6eyJjZWxsLWVtcHR5LWNoYW5nZWQiOiJfdXBkYXRlUm93VmlzaWJpbGl0eSJ9LF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1jZWxsIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciLApiZWhhdmlvcnM6W2JdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItY2VsbCIpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Sb3dEZXRhaWxzQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2V4cGFuZGVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxsaXN0ZW5lcnM6eyJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIjoiX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkRXhwYW5kZWQifSxvYnNlcnZlcnM6WyJfZXhwYW5kZWRJdGVtc0NoYW5nZWQoZXhwYW5kZWRJdGVtcy4qLCBkYXRhUHJvdmlkZXIpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQoX3Jvd0RldGFpbHNUZW1wbGF0ZSkiXSxfZXhwYW5kZWRJdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fZmx1c2hJdGVtc0RlYm91bmNlcigpLHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcyYmdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZil7Zi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGYuaXRlbSl9LmJpbmQodGhpcykpKX0sCl9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtkLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7ZC5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH07UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChkKTtkLnRlbXBsYXRlPWI7Yi50ZW1wbGF0aXplcj1kfSxfaXNFeHBhbmRlZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5leHBhbmRlZEl0ZW1zJiYtMSE9PXRoaXMuZXhwYW5kZWRJdGVtcy5pbmRleE9mKGIpfSxleHBhbmRJdGVtOmZ1bmN0aW9uKGIpe3RoaXMuX2lzRXhwYW5kZWQoYil8fHRoaXMucHVzaCgiZXhwYW5kZWRJdGVtcyIsYil9LGNvbGxhcHNlSXRlbTpmdW5jdGlvbihiKXt0aGlzLl9pc0V4cGFuZGVkKGIpJiZ0aGlzLnNwbGljZSgiZXhwYW5kZWRJdGVtcyIsdGhpcy5leHBhbmRlZEl0ZW1zLmluZGV4T2YoYiksMSl9LApfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRFeHBhbmRlZDpmdW5jdGlvbihiKXsiZXhwYW5kZWQiPT09Yi5kZXRhaWwucHJvcCYmKGIuZGV0YWlsLnZhbHVlP3RoaXMuZXhwYW5kSXRlbShiLmRldGFpbC5pbnN0Lml0ZW0pOnRoaXMuY29sbGFwc2VJdGVtKGIuZGV0YWlsLmluc3QuaXRlbSksYi5zdG9wUHJvcGFnYXRpb24oKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkRhdGFQcm92aWRlckJlaGF2aW9yPXtsaXN0ZW5lcnM6eyJpdGVtLWNoYW5nZWQiOiJfdGVtcGxhdGVJdGVtQ2hhbmdlZCJ9LHByb3BlcnRpZXM6e3BhZ2VTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxvYnNlcnZlcjoiX3BhZ2VTaXplQ2hhbmdlZCJ9LGRhdGFQcm92aWRlcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YVByb3ZpZGVyQ2hhbmdlZCJ9LF9sb2FkaW5nOkJvb2xlYW4sX2NhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX3BlbmRpbmdSZXF1ZXN0czp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19fSxfdGVtcGxhdGVJdGVtQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5pdGVtO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5jaGlsZHJlbixmdW5jdGlvbihmKXtmLml0ZW09PT1kJiZmLml0ZXJhdGVDZWxscyhmdW5jdGlvbihoKXtoLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9CiEwO2guaW5zdGFuY2Uubm90aWZ5UGF0aCgiaXRlbS4iK2IuZGV0YWlsLnBhdGgsYi5kZXRhaWwudmFsdWUpO2guX3RlbXBsYXRpemVyLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudD0hMX0pfSl9LF9nZXRDYWNoZWRJdGVtOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2dldFBhZ2VGb3JJbmRleChiKSxmPXRoaXMuX2NhY2hlJiZ0aGlzLl9jYWNoZVtkXTtyZXR1cm4gZj9mW2ItZCp0aGlzLnBhZ2VTaXplXTpudWxsfSxfZ2V0SXRlbTpmdW5jdGlvbihiLGQpe3RoaXMuX3VwZGF0ZUl0ZW0oZCx0aGlzLl9nZXRDYWNoZWRJdGVtKGIpKTt0aGlzLl9lYWdlcmx5TG9hZFBhZ2VzKCk7dmFyIGY9dGhpcy5fdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXMoKTswPGYubGVuZ3RoJiYodGhpcy5fbG9hZGluZz0hMCx0aGlzLmRlYm91bmNlKCJsb2FkIixmdW5jdGlvbigpe2YuZm9yRWFjaChmdW5jdGlvbihoKXt0aGlzLl9sb2FkUGFnZShoKX0uYmluZCh0aGlzKSl9LDEwMCkpfSxfY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwIT09CnRoaXMuX2NhY2hlJiZ2b2lkIDAhPT10aGlzLl9jYWNoZVtiXX0uYmluZCh0aGlzKSl9LF91bmNhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX2NhY2hlJiZ2b2lkIDA9PT10aGlzLl9jYWNoZVtiXX0uYmluZCh0aGlzKSl9LF9lYWdlcmx5TG9hZFBhZ2VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuc2xpY2UoMCk7aWYoMDxiLmxlbmd0aCl7Yi5zb3J0KGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY+aH0pO3ZhciBkPU1hdGgubWluKGJbYi5sZW5ndGgtMV0rMSxNYXRoLm1heCgwLE1hdGguZmxvb3IodGhpcy5zaXplL3RoaXMucGFnZVNpemUpLTEpKTt0aGlzLl9sb2FkUGFnZShNYXRoLm1heCgwLGJbMF0tMSkpO3RoaXMuX2xvYWRQYWdlKGQpfX0sX3BhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVyblt0aGlzLl9nZXRQYWdlRm9ySW5kZXgodGhpcy4kLnNjcm9sbGVyLmZpcnN0VmlzaWJsZUluZGV4Kwp0aGlzLiQuc2Nyb2xsZXIuX3ZpZHhPZmZzZXQpXS5jb25jYXQodGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5pbmRleH0pLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZ2V0UGFnZUZvckluZGV4KGIuaW5kZXgpfS5iaW5kKHRoaXMpKSkucmVkdWNlKGZ1bmN0aW9uKGIsZCl7LTE9PT1iLmluZGV4T2YoZCkmJmIucHVzaChkKTtyZXR1cm4gYn0sW10pfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oYixkKXtmb3IodmFyIGY9MDtmPHRoaXMucGFnZVNpemU7ZisrKXt2YXIgaD10aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxJbmRleFRvSXRlbVtiKnRoaXMucGFnZVNpemUrZl07aCYmKHRoaXMuX3VwZGF0ZUl0ZW0oaCxkW2ZdKSx0aGlzLmRlYm91bmNlKCJ1cGRhdGUtaGVpZ2h0cyIsZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3VwZGF0ZU1ldHJpY3MoKTt0aGlzLiQuc2Nyb2xsZXIuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLiQuc2Nyb2xsZXIuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpfSwKMSkpfX0sX2xvYWRQYWdlOmZ1bmN0aW9uKGIsZCl7ZD1kfHx0aGlzLl91cGRhdGVJdGVtcy5iaW5kKHRoaXMpO2lmKCF0aGlzLl9jYWNoZVtiXSYmIXRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXSYmdGhpcy5kYXRhUHJvdmlkZXIpe3RoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXT0hMDt2YXIgZj17cGFnZTpiLHBhZ2VTaXplOnRoaXMucGFnZVNpemUsc29ydE9yZGVyczp0aGlzLl9tYXBTb3J0ZXJzKCksZmlsdGVyczp0aGlzLl9tYXBGaWx0ZXJzKCl9O3RoaXMuZGF0YVByb3ZpZGVyKGYsZnVuY3Rpb24oaCl7dGhpcy5fY2FjaGVbYl09aDtkZWxldGUgdGhpcy5fcGVuZGluZ1JlcXVlc3RzW2JdO2QoYixoKTt0aGlzLl9sb2FkaW5nPTA8dGhpcy5fcGVuZGluZ1JlcXVlc3RzLmxlbmd0aDt0aGlzLmRlYm91bmNlKCJjaGVjay1zaXplIix0aGlzLl9jaGVja1NpemUsMkUzKX0uYmluZCh0aGlzKSl9fSxfZ2V0UGFnZUZvckluZGV4OmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmZsb29yKGIvdGhpcy5wYWdlU2l6ZSl9LApjbGVhckNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2FjaGU9e307dGhpcy5fcGVuZGluZ1JlcXVlc3RzPXt9O3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhJiZ0aGlzLiQuc2Nyb2xsZXIuX3VwZGF0ZSgpO3RoaXMuX2ZsdXNoSXRlbXNEZWJvdW5jZXIoKX0sX2ZsdXNoSXRlbXNEZWJvdW5jZXI6ZnVuY3Rpb24oKXt0aGlzLmZsdXNoRGVib3VuY2VyKCJsb2FkIil9LF9wYWdlU2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1kJiZiIT09ZCYmdGhpcy5jbGVhckNhY2hlKCl9LF9jaGVja1NpemU6ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLnNpemUmJmNvbnNvbGUud2FybignVGhlIFx4M2N2YWFkaW4tZ3JpZFx4M2UgbmVlZHMgYSB2YWx1ZSBmb3IgInNpemUiIHByb3BlcnR5IGluIG9yZGVyIHRvIGRpc3BsYXkgcm93cy4nKX0sX2RhdGFQcm92aWRlckNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1kJiZ0aGlzLmNsZWFyQ2FjaGUoKTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YXx8Cih0aGlzLl9sb2FkaW5nPSEwLHRoaXMuX2xvYWRQYWdlKDAsZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YT0hMH0uYmluZCh0aGlzKSkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQta2V5Ym9hcmQtbmF2aWdhdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiYXBwbGljYXRpb24iLHRhYmluZGV4OjB9LGtleUJpbmRpbmdzOnsiY3RybCtob21lIjoiX29uQ3RybEhvbWUiLCJjdHJsK2VuZCI6Il9vbkN0cmxFbmQiLGRvd246Il9vbkFycm93RG93biIsZW5kOiJfb25FbmQiLGVudGVyOiJfb25FbnRlciIsZXNjOiJfb25Fc2NhcGUiLGYyOiJfb25GMiIsaG9tZToiX29uSG9tZSIsbGVmdDoiX29uQXJyb3dMZWZ0IixwYWdlZG93bjoiX29uUGFnZURvd24iLHBhZ2V1cDoiX29uUGFnZVVwIixyaWdodDoiX29uQXJyb3dSaWdodCIsc3BhY2U6Il9vblNwYWNlIix0YWI6Il9vblRhYiIsdXA6Il9vbkFycm93VXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxwcm9wZXJ0aWVzOntfdmlydHVhbEZvY3VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3ZpcnR1YWxGb2N1c0NoYW5nZWQifSwKaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LG5hdmlnYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsImNlbGwtZm9jdXMiOiJfb25DZWxsRm9jdXMiLCJjZWxsLWNvbnRlbnQtZm9jdXMiOiJfb25DZWxsQ29udGVudEZvY3VzIn0scmVhZHk6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihiKXs5PT09Yi5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSEwKTs5PT09Yi5rZXlDb2RlJiZiLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9ITApfS5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMSk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPQohMSl9LmJpbmQodGhpcyksITApfSxfaXNGb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kLmZvb3Rlci5fcm93cy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIWIuaGlkZGVufSkubGVuZ3RofSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3RhYmJlZCYmIXRoaXMuX3NoaWZ0VGFiYmVkJiZ0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKX0sX2FjdGl2YXRlTmF2aWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKX0sX29uRm9jdXNvdXQ6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nPXRoaXMubmF2aWdhdGluZz0hMX0sX29uRm9vdGVyRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLm5hdmlnYXRpbmc9ITA7dGhpcy5pbnRlcmFjdGluZz0hMTt0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy5fdmlydHVhbEZvY3VzfHwodGhpcy5fc2hpZnRUYWJiZWQ/dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/dGhpcy4kLmZvb3Rlcjp0aGlzLiQuaXRlbXM6CnRoaXMuJC5oZWFkZXIpfSxfdmlydHVhbEZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihkLmZvY3VzZWQ9ITEpO2ImJihiLl9mb2N1c2VkQ2VsbEluZGV4PWIuX2ZvY3VzZWRDZWxsSW5kZXh8fDAsYi5fZm9jdXNlZFJvd0luZGV4PWIuX2ZvY3VzZWRSb3dJbmRleHx8MCxiLmZvY3VzZWQ9ITAsYj09PXRoaXMuJC5pdGVtcyYmdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uVGFiOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmludGVyYWN0aW5nJiZ0aGlzLl92aXJ0dWFsRm9jdXMpaWYodGhpcy5uYXZpZ2F0aW5nKWlmKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQuc2hpZnRLZXkpc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7Yi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaGVhZGVyO2IucHJldmVudERlZmF1bHQoKTsKYnJlYWs7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuZm9jdXMoKSx0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl9pc0Zvb3RlclZpc2libGUoKT8odGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5mb290ZXIsYi5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9LDEpO2JyZWFrO2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKX0sX2lzQWJvdmVWaWV3cG9ydDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5maXJzdFZpc2libGVJbmRleD5ifSxfb25BcnJvd0Rvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8CihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0Rvd24oKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfc2Nyb2xsUGFnZURvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlRG93bjpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGI9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsdGhpcy5fc2Nyb2xsUGFnZURvd24oKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCs9CnRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LWJ8fHRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZURvd24oKSl9LF9zY3JvbGxQYWdlVXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3AtPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlVXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LAp0aGlzLl9zY3JvbGxQYWdlVXAoKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleC09Yi10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleHx8dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlVXAoKSl9LF9vbkFycm93VXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzVXAoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25BcnJvd1JpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1JpZ2h0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sCl9vbkFycm93TGVmdDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMZWZ0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uSG9tZTpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNIb21lKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0VuZCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQ7CihiPWIucXVlcnlTZWxlY3RvcigiW2ZvY3VzLXRhcmdldF0iKXx8Yi5maXJzdEVsZW1lbnRDaGlsZCkmJmIuZm9jdXMoKX0sX29uRW50ZXI6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz8iaW5wdXQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQubG9jYWxOYW1lJiYidGV4dCI9PT1iLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC50eXBlJiZ0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6KGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCkpfSxfb25Fc2NhcGU6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLm5hdmlnYXRpbmcmJih0aGlzLm5hdmlnYXRpbmc9ITEpfSxfb25GMjpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpfSwKX29uQ3RybEhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRmlyc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25DdHJsRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xhc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25TcGFjZTpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyl7Yi5wcmV2ZW50RGVmYXVsdCgpO2I9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbDt2YXIgZD1iLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/InNsb3QiOiJjb250ZW50IilbMF0uZmlyc3RFbGVtZW50Q2hpbGQ7ZD9kLmNsaWNrKCk6dGhpcy5uYXZpZ2F0aW5nJiYKdGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6Yi5pbnN0YW5jZX0pfX0sX29uQ2VsbENvbnRlbnRGb2N1czpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nPSEwO3RoaXMuX29uQ2VsbEZvY3VzKGIpfSxfb25DZWxsRm9jdXM6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5jZWxsO3ZhciBkPWIucGFyZW50RWxlbWVudCxmPWQucGFyZW50RWxlbWVudCxoPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZikuY2hpbGRyZW4sZCk7Zj09PXRoaXMuJC5pdGVtcyYmKGg9ZC5pbmRleCk7Zi5fZm9jdXNlZFJvd0luZGV4PWg7Zi5fZm9jdXNlZENlbGxJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGIpO3RoaXMuX3ZpcnR1YWxGb2N1cz1mO2IuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpJiYoZi5fZm9jdXNlZENlbGxJbmRleD0wLGYuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LF9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCt0aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxTdGFydCxkPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4O3RoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyYmKGQ8Ynx8ZD5iK3RoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxDb3VudCkmJih0aGlzLiQuc2Nyb2xsZXIuc2Nyb2xsVG9TY2FsZWRJbmRleChkKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsQ2hhbmdlZChkLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxJbmRleCkpO3RoaXMuX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0KHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwpfSxfZW5zdXJlRWxlbWVudEluVmlld3BvcnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMpe3ZhciBmPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLApoPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO2QuYm90dG9tPmY/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLmJvdHRvbS1mOmQudG9wPGgmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWgpfWlmKCFiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7Yj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtmPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7aWYoaD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3cucXVlcnlTZWxlY3RvcigiW2xhc3QtZnJvemVuXSIpKWY9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtkLnJpZ2h0PmI/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9ZC5yaWdodC1iOmQubGVmdDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9CmQubGVmdC1mKX19fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGwsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFFN319LGxpc3RlbmVyczp7ZHJhZ3N0YXJ0OiJfb25EcmFnU3RhcnQiLGRyYWdvdmVyOiJfb25EcmFnT3ZlciIsZHJhZ2VuZDoiX29uRHJhZ0VuZCJ9LG9ic2VydmVyczpbIl91cGRhdGVPcmRlcnMoY29sdW1uVHJlZSwgY29sdW1uVHJlZS4qKSJdLF91cGRhdGVPcmRlcnM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZiWzBdLmZvckVhY2goZnVuY3Rpb24oZixoKXtmLl9vcmRlcj0oaCsxKSp0aGlzLl9vcmRlckJhc2VTY29wZX0sdGhpcyl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbihiKXtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWIudGFyZ2V0LmxvY2FsTmFtZSl7dmFyIGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoYi50YXJnZXQpO2QmJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsCiEwKSx0aGlzLl9kcmFnZ2VkQ29sdW1uPWQuY29sdW1uLHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLGIuZGF0YVRyYW5zZmVyJiYoYi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsIiIpLGIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiKSx0aGlzLl9hdXRvU2Nyb2xsZXIoKSl9fSxfc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzOmZ1bmN0aW9uKGIsZCl7QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGUpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe3JldHVybi9jb2x1bW4vLnRlc3QoZi5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGYsYil9LHRoaXMpLmZvckVhY2goZnVuY3Rpb24oZil7Zi5fcmVvcmRlclN0YXR1cz1kfSl9LF9vbkRyYWdPdmVyOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2RyYWdnZWRDb2x1bW4pe3ZhciBkPQooUG9seW1lci5FbGVtZW50P2IuY29tcG9zZWRQYXRoKCk6UG9seW1lci5kb20oYikucGF0aCkuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09Zi5sb2NhbE5hbWV9KVswXTtkJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoZCksKGQ9dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGQsdGhpcy5fZHJhZ2dlZENvbHVtbikpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCkmJnRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbihkLGIuY2xpZW50WCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixkKSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9Yi5jbGllbnRYKX19LF9hdXRvU2Nyb2xsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe3ZhciBiPXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Kwo1MCxkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC10aGlzLl9sYXN0RHJhZ0NsaWVudFgrNTA7MDxiP3RoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1iLzEwOjA8ZCYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0LT1kLzEwKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCl9dGhpcy5fZHJhZ2dlZENvbHVtbiYmdGhpcy5hc3luYyh0aGlzLl9hdXRvU2Nyb2xsZXIsMTApfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMudG9nZ2xlQXR0cmlidXRlKCJyZW9yZGVyaW5nIiwhMSksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fbGFzdERyYWdDbGllbnRYPXRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCl9LF9pc1N3YXBBbGxvd2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7dmFyIGY9Yi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50LApoPWIuZnJvemVuPT09ZC5mcm96ZW47cmV0dXJuIGIhPT1kJiZmJiZofX0sX2lzU3dhcHBhYmxlQnlQb3NpdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyKS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGspe3JldHVybiBrLmNvbHVtbj09PWJ9KVswXSxoPXRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW3Jlb3JkZXItc3RhdHVzXHgzZGRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ+aC5sZWZ0P2Q+Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodC1oLndpZHRoOmQ8Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2gud2lkdGh9LF9nZXRDZWxsQnlDZWxsQ29udGVudDpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpcmV0dXJuIGIuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7CmI9UG9seW1lci5kb20oYikuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKVswXTtyZXR1cm4gUG9seW1lci5kb20oYikucGFyZW50Tm9kZX0sX3N3YXBDb2x1bW5PcmRlcnM6ZnVuY3Rpb24oYixkKXt2YXIgZj1iLl9vcmRlcjtiLl9vcmRlcj1kLl9vcmRlcjtkLl9vcmRlcj1mO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTt0aGlzLl91cGRhdGVMYXN0Q29sdW1uKCl9LF9nZXRUYXJnZXRDb2x1bW46ZnVuY3Rpb24oYixkKXtpZihiJiZkKXtmb3IodmFyIGY9Yi5jb2x1bW47Zi5wYXJlbnRFbGVtZW50IT09ZC5wYXJlbnRFbGVtZW50JiZmIT09dGhpcy50YXJnZXQ7KWY9Zi5wYXJlbnRFbGVtZW50O3JldHVybiBmLnBhcmVudEVsZW1lbnQ9PT1kLnBhcmVudEVsZW1lbnQ/ZjpiLmNvbHVtbn19fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVDb2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7c2l6ZTpOdW1iZXIsY29sdW1uVHJlZTpBcnJheSxiaW5kRGF0YTpGdW5jdGlvbixyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0LGNvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxzYWZhcmk6e3R5cGU6Qm9vbGVhbix2YWx1ZTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxzY3JvbGxiYXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYi5zdHlsZS53aWR0aD0iMTAwcHgiO2Iuc3R5bGUuaGVpZ2h0PSIxMDBweCI7Yi5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9Ii05OTk5cHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9Yi5vZmZzZXRXaWR0aC1iLmNsaWVudFdpZHRoO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGR9fSx0YXJnZXQ6T2JqZWN0LGhhc0RhdGE6Qm9vbGVhbn0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiLCJfc2l6ZUNoYW5nZWQoc2l6ZSwgYmluZERhdGEsIGhhc0RhdGEpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQocm93RGV0YWlsc1RlbXBsYXRlLCBfcGh5c2ljYWxJdGVtcywgX3BoeXNpY2FsQ291bnRWYWwpIl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsCmFuaW1hdGlvbmVuZDoiX29uQW5pbWF0aW9uRW5kIiwiY29sdW1uLXJlc2l6aW5nIjoiX29uQ29sdW1uUmVzaXplIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLiQ9dGhpcy4kfHx7fTt0aGlzLiQuaGVhZGVyPXRoaXMuZG9tSG9zdC4kLmhlYWRlcjt0aGlzLiQuaXRlbXM9dGhpcy5kb21Ib3N0LiQuaXRlbXM7dGhpcy4kLmZvb3Rlcj10aGlzLmRvbUhvc3QuJC5mb290ZXJ9LF9vbkNvbHVtblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW2NvbHVtbi1yZXNpemluZ10iKSk7dGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKGIpey9hcHBlYXIvLnRlc3QoYi5hbmltYXRpb25OYW1lKSYmKHRoaXMuX3JlbmRlcigpLHRoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKSxiLnN0b3BQcm9wYWdhdGlvbigpKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJoZWFkZXJUZW1wbGF0ZSI9PT0KYi5kZXRhaWwucGF0aCYmdGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLCEwLHRoaXMuJC5oZWFkZXIpOyJmb290ZXJUZW1wbGF0ZSI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmZvb3Rlcik7L2Zyb3plbnxoaWRkZW4vLnRlc3QoYi5kZXRhaWwucGF0aCkmJnRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOyJoaWRkZW4iPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX2hpZGVPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIDA9PT1iJiYhZH0sX2hpZGVUYWJsZU92ZXJmbG93OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIDA9PT1iJiZkfSxfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09YiYmZCYmdm9pZCAwIT09ZiYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLGZ1bmN0aW9uKGgpe2gucm93RGV0YWlsc1RlbXBsYXRlPQpifSl9LF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09YiYmZCYmdm9pZCAwIT09ZiYmKFBvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLHRoaXMuX3VwZGF0ZSksdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCksdGhpcy5faGFzVGVtcGxhdGVzQ2hhbmdlZChiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5jb2x1bW5zPWJbYi5sZW5ndGgtMV19KSx0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpLFBvbHltZXIuZG9tLmZsdXNoKHRoaXMpLHRoaXMuX3VwZGF0ZUxhc3RDb2x1bW4oKSl9LF91cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdyIpLGZ1bmN0aW9uKGIpe2IudXBkYXRlTGFzdENvbHVtbigpfSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxTaXplcyYmClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcy4kLmhlYWRlcixmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3NTeW5jKCk7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXgmJnRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCl9LmJpbmQodGhpcykpfSxfdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodCsicHgiLGQ9dGhpcy4kLmZvb3Rlci5jbGllbnRIZWlnaHQrInB4IjtbdGhpcy4kLm91dGVyc2l6ZXIsdGhpcy4kLmZpeGVkc2l6ZXIsdGhpcy4kLml0ZW1zXS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yuc3R5bGUuYm9yZGVyVG9wV2lkdGg9YjtmLnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoPQpkfSl9LF9oYXNUZW1wbGF0ZXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPSExLGY9ITE7Yi5mb3JFYWNoKGZ1bmN0aW9uKGgpe3JldHVybiBoLmZvckVhY2goZnVuY3Rpb24oayl7ZD1kfHxrLmhlYWRlclRlbXBsYXRlO2Y9Znx8ay5mb290ZXJUZW1wbGF0ZX0pfSk7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGQsdGhpcy4kLmhlYWRlcik7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGYsdGhpcy4kLmZvb3Rlcil9LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD1BcnJheShiKSxmPTA7ZjxiO2YrKyl7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtcm93Iik7aC50YXJnZXQ9dGhpcy5kb21Ib3N0O2RbZl09aDtoLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwiIik7UG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5hcHBlbmRDaGlsZChoKX1yZXR1cm4gZH0sX3NpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsCmQsZil7aWYodm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdm9pZCAwIT09Zil7dmFyIGg9dGhpcy5fc2Nyb2xsVG9wLGs9dGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl92aWR4T2Zmc2V0O3RoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbihiLDFFNSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy5fdmlkeE9mZnNldD0wO3RoaXMuX3BoeXNpY2FsSXRlbXN8fCh0aGlzLl9waHlzaWNhbENvdW50PU1hdGgubWF4KDEsTWF0aC5taW4oMjUsdGhpcy5fdmlydHVhbENvdW50KSksdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9jcmVhdGVQb29sKHRoaXMuX3BoeXNpY2FsQ291bnQpLHRoaXMuX3BoeXNpY2FsU2l6ZXM9QXJyYXkodGhpcy5fcGh5c2ljYWxDb3VudCkpO3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy5fZGVib3VuY2VUZW1wbGF0ZShmdW5jdGlvbigpe3RoaXMuX3JlbmRlcigpOwp0aGlzLl92aWV3cG9ydEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleChNYXRoLm1pbihrLHRoaXMuc2l6ZSkpLHRoaXMuX3Njcm9sbFRvcD1oLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLmZsdXNoRGVib3VuY2VyKCJ2YWFkaW4tZ3JpZC1zY3JvbGxpbmciKSl9KX19LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24oYil7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtPXRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbXx8e307dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGQsZil7ZD10aGlzLl9waHlzaWNhbEl0ZW1zW2RdO2QuaW5kZXgmJmRlbGV0ZSB0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF07ZC5pbmRleD1mK3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtW2QuaW5kZXhdPWQ7ZC50b2dnbGVBdHRyaWJ1dGUoIm9kZCIsZC5pbmRleCUyKTtkLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdHJvdyIsZC5pbmRleD09PXRoaXMuc2l6ZS0xKTtkLnRvZ2dsZUF0dHJpYnV0ZSgiaGlkZGVuIiwKZC5pbmRleD49dGhpcy5zaXplKTt0aGlzLmJpbmREYXRhKGQuaW5kZXgsZCl9LGIpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxTaXplcyYmKHRoaXMuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpfSksdGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtcmVzaXppbmciLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCl9LmJpbmQodGhpcyksMSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLTIuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLWNvbHVtbiIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZCIscHJvcGVydGllczp7X2NvbHVtblRyZWU6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxzaXplOk51bWJlcixfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxfYmluZERhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEl0ZW0uYmluZCh0aGlzKX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EeW5hbWljQ29sdW1uc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3IsCnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5GaWx0ZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwiaXJvbi1yZXNpemUiOiJfZ3JpZFJlc2l6ZUhhbmRsZXIifSxfdXBkYXRlSXRlbTpmdW5jdGlvbihiLGQpe2Iuc3R5bGUubWluSGVpZ2h0PWQ/IiI6dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UrInB4IjtiLml0ZW09ZDtiLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZCk7Yi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGQpO2IuYWN0aXZlPW51bGwhPT1kJiZkPT10aGlzLmFjdGl2ZUl0ZW07Yi5mb2N1c2VkPWIuaW5kZXg9PT10aGlzLiQuaXRlbXMuX2ZvY3VzZWRSb3dJbmRleH0sX2dldENvbnRlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO3RoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZS5yb3ctZGV0YWlscyIpfHx2b2lkIDA7dGhpcy4kLnNjcm9sbGVyLnRhcmdldD10aGlzO251bGw9PT1kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oJ1x4M2N2YWFkaW4tZ3JpZFx4M2UgcmVxdWlyZXMgdGhlICJzdGFuZGFyZHMgbW9kZSIgZGVjbGFyYXRpb24uIFBsZWFzZSBhZGQgXHgzYyFET0NUWVBFIGh0bWxceDNlIHRvIHRoZSBIVE1MIGRvY3VtZW50LicpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7Il9jaGlsZENvbHVtbnMiPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpzZi5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzpiLHJ1bjpkfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6ZCxtZXRyaWNOYW1lOmJ9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTpiPT57Yj1KU09OLnBhcnNlKGIpWzFdOwpiPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChiKTtjb25zdCBkPXRkLnN0YW5kYXJkO3JldHVybiBkWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtiKSVkLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9PmIucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYixkKT0+W2IubmFtZSxkXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2NvbnN0IGQ9Yi5nZXQoInRhZyIpO2Iuc2V0KCJ0YWciLCIiKTtiLnNldCgidGFnIixkKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhiLGQpe3JldHVybiBudWxsPT09Ynx8bnVsbD09PWQ/W106Yi5zZXNzaW9ucy5maWx0ZXIoZj0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShmLm1ldHJpY1ZhbHVlcywKZC5uYW1lKSkubWFwKGY9Pih7dGFnOmQubmFtZSxydW46Zi5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGIpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYiksZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbnx8IiJ9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdGFibGUtdmlldy90Zi1ocGFyYW1zLXRhYmxlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy10YWJsZS12aWV3Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LGVuYWJsZVNob3dNZXRyaWNzOkJvb2xlYW4sYmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nfSxvYnNlcnZlcnM6WyJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodmlzaWJsZVNjaGVtYS4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7Y29uc3QgYj10aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgiZXhwYW5kZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIixbXSk7UG9seW1lci5kb20uZmx1c2goKTtjb25zdCBkPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goZj0+e2Quc2V0KGYubmFtZSxmKX0pO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIiwKYi5tYXAoZj0+ZC5nZXQoZi5uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKX0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfc2Vzc2lvbkdyb3VwSFBhcmFtKGIsZCl7cmV0dXJuIG51bGwhPWImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLmhwYXJhbXMsZCk/dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChiLmhwYXJhbXNbZF0pOiIifSxfc2Vzc2lvbkdyb3VwTWV0cmljKGIsZCl7aWYobnVsbD09YilyZXR1cm4gbnVsbDtmb3IobGV0IGY9MDtmPGIubWV0cmljVmFsdWVzLmxlbmd0aDsrK2Ype2xldCBoPWIubWV0cmljVmFsdWVzW2ZdO2lmKGgubmFtZS5ncm91cD09PWQuZ3JvdXAmJmgubmFtZS50YWc9PWQudGFnKXJldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGgudmFsdWUpfXJldHVybiIifSxfcm93TnVtYmVyKGIpe3JldHVybiBiKzF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sdmlzaWJsZVNjaGVtYTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LF9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHZvaWQgMCE9PWImJm51bGwhPT1iJiZ2b2lkIDAhPT1kJiZudWxsIT09ZH0sX3NpbmdsZXRvblNlc3Npb25Hcm91cHM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PT1ifHx2b2lkIDA9PT1iP1tdOltiXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2F4ZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxKXtyZXR1cm4gbnVsbCE9PXEuc291cmNlRXZlbnR9bGV0IGs7KGZ1bmN0aW9uKHEpe3EuTElORUFSPSJMSU5FQVIiO3EuTE9HPSJMT0ciO3EuUVVBTlRJTEU9IlFVQU5USUxFIjtxLk5PTl9OVU1FUklDPSJOT05fTlVNRVJJQyJ9KShrPWYuU2NhbGVUeXBlfHwoZi5TY2FsZVR5cGU9e30pKTtjbGFzcyBye2lzUGFzc2luZygpe3JldHVybiEwfX1jbGFzcyBse2NvbnN0cnVjdG9yKHEsdSx3LEEpe3RoaXMuX2xvd2VyPXE7dGhpcy5fdXBwZXI9dTt0aGlzLl9sb3dlck9wZW49dzt0aGlzLl91cHBlck9wZW49QX1pc1Bhc3NpbmcocSl7cmV0dXJuIHRoaXMuX2JlZm9yZSh0aGlzLl9sb3dlcixxLCF0aGlzLl9sb3dlck9wZW4pJiZ0aGlzLl9iZWZvcmUocSx0aGlzLl91cHBlciwhdGhpcy5fdXBwZXJPcGVuKX1fYmVmb3JlKHEsdSx3KXtyZXR1cm4gdz9xPD11OnE8dX19Y2xhc3MgcHtjb25zdHJ1Y3RvcihxKXt0aGlzLl9kb21haW5TZXQ9CnF9aXNQYXNzaW5nKHEpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCh1PT51PT09cSl9fWNsYXNzIG17Y29uc3RydWN0b3IocSx1LHcsQSl7dGhpcy5fc3ZnUHJvcHM9cTt0aGlzLl9zY2hlbWE9dTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9dzt0aGlzLl9jb2xJbmRleD1BO3RoaXMuX2lzRGlzcGxheWVkPSExO3RoaXMuX3NjYWxlVHlwZT10aGlzLl95U2NhbGU9bnVsbDt0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbihxKXt0aGlzLl9icnVzaFNlbGVjdGlvbj1xO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLAp0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfXNldERvbWFpbkFuZFNjYWxlKHEsdSl7dGhpcy5fc2NhbGVUeXBlPXU7dGhpcy5feVNjYWxlPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5jcmVhdGVBeGlzU2NhbGUocS5zbGljZSgpLHRoaXMuX3N2Z1Byb3BzLmhlaWdodCx0aGlzLnNjYWxlVHlwZSgpKTt0aGlzLl9icnVzaEZpbHRlcj10aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSx0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfWJydXNoRmlsdGVyKCl7cmV0dXJuIHRoaXMuX2JydXNoRmlsdGVyfXVwZGF0ZURPTShxKXt2YXIgdT1kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSgpKTt0aGlzLnNjYWxlVHlwZSgpPT09ay5RVUFOVElMRSYmKHU9dS50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjZnIikpKTt2YXIgdz1kMy5zZWxlY3QocSk7dy5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsKdy5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzIiwhMCkuY2FsbCh1KS5hcHBlbmQoInRleHQiKS5jbGFzc2VkKCJheGlzLXRpdGxlIiwhMCkuc3R5bGUoImN1cnNvciIsIm1vdmUiKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ5IiwtOSkudGV4dChBPT5iLmhwYXJhbXMudXRpbHMuc2NoZW1hQ29sdW1uTmFtZSh0aGlzLl9zY2hlbWEsQSkpO3cuY2FsbChkMy5kcmFnKCkub24oInN0YXJ0IiwoKT0+e3Euc2V0QXR0cmlidXRlKCJpcy1kcmFnZ2luZyIsIiIpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdTdGFydCh0aGlzLmNvbEluZGV4KCkpfSkub24oImRyYWciLCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKGQzLmV2ZW50LngpKS5vbigiZW5kIiwoKT0+e3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdFbmQoKTtxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciKX0pKTt1PWQzLmJydXNoWSgpLmV4dGVudChbWy04LDBdLApbOCx0aGlzLl9zdmdQcm9wcy5oZWlnaHQrMV1dKS5vbigic3RhcnQiLCgpPT57aChkMy5ldmVudCkmJihxLnNldEF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSl9KS5vbigiYnJ1c2giLCgpPT57aWYoaChkMy5ldmVudCkpdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZW5kIiwoKT0+e2goZDMuZXZlbnQpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSkscS5yZW1vdmVBdHRyaWJ1dGUoImlzLWJydXNoaW5nIikpfSk7dz1kMy5zZWxlY3QocSkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYnJ1c2giLCEwKTt3LmNhbGwodSk7dS5tb3ZlKHcsdGhpcy5icnVzaFNlbGVjdGlvbigpKX1zZXREaXNwbGF5ZWQocSl7dGhpcy5faXNEaXNwbGF5ZWQ9cX1fYnVpbGRCcnVzaEZpbHRlcihxLAp1LHcpe2lmKG51bGw9PT1xKXJldHVybiBuZXcgcjtpZihudWxsPT09dSlyZXR1cm4gY29uc29sZS5lcnJvcigiU2NhbGUgdHlwZSBpcyBudWxsLCBidXQgYnJ1c2hTZWxlY3Rpb24gaXNuJ3Q6ICIscSksbmV3IHI7c3dpdGNoKHUpe2Nhc2Ugay5MSU5FQVI6Y2FzZSBrLkxPRzp7Y29uc3QgW0EseV09Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZSh3LHFbMF0scVsxXSk7cmV0dXJuIG5ldyBsKEEseSwhMSwhMSl9Y2FzZSBrLlFVQU5USUxFOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZSh3LHFbMF0scVsxXSk7cmV0dXJuIG5ldyBsKEEseSwhMSwhMCl9Y2FzZSBrLk5PTl9OVU1FUklDOnJldHVybiBuZXcgcChiLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucG9pbnRTY2FsZUludmVyc2VJbWFnZSh3LHFbMF0scVsxXSkpfWNvbnNvbGUuZXJyb3IoIlVua25vd24gc2NhbGUgdHlwZTogIiwKdSk7cmV0dXJuIG5ldyByfX1mLkF4aXM9bTtjbGFzcyBue2NvbnN0cnVjdG9yKHEsdSx3KXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2F4ZXM9dGhpcy5fY3JlYXRlQXhlcyh3KTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucz1kMy5zY2FsZVBvaW50KCkucmFuZ2UoWzEsdGhpcy5fc3ZnUHJvcHMud2lkdGgtMV0pLnBhZGRpbmcoLjUpO3RoaXMuX2RyYWdnZWRBeGlzPW51bGw7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuYXhpcy1wYXJlbnQiKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCIuYXhpcy1wYXJlbnQiKX11cGRhdGVBeGVzKHEsdSl7Y29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7Y29uc3Qgdz1uZXcgU2V0O3EuY29sdW1ucy5mb3JFYWNoKHk9Pntjb25zdCB4PXkuYWJzb2x1dGVJbmRleDtsZXQgQz10aGlzLl9heGVzW3hdO0Muc2V0RGlzcGxheWVkKCEwKTsKY29uc3QgRz11Lm1hcChEPT5iLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxELHgpKTtDLnNldERvbWFpbkFuZFNjYWxlKEcseS5zY2FsZSk7dy5hZGQoeCl9KTt0aGlzLl9heGVzLmZvckVhY2goeT0+e3cuaGFzKHkuY29sSW5kZXgoKSl8fHkuc2V0RGlzcGxheWVkKCExKX0pO3RoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHcpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20odykseT0+eSk7dGhpcy5fcGFyZW50c1NlbC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYXhpcy1wYXJlbnQiLCEwKS5tZXJnZSh0aGlzLl9wYXJlbnRzU2VsKTtjb25zdCBBPXRoaXM7dGhpcy5fcGFyZW50c1NlbC5jYWxsKHk9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh5KSkuZWFjaChmdW5jdGlvbih5KXtBLl9heGVzW3ldLnVwZGF0ZURPTSh0aGlzKX0pfW1hcFZpc2libGVBeGVzKHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAodT0+CnEodGhpcy5nZXRBeGlzUG9zaXRpb24odSksdGhpcy5fYXhlc1t1XSkpfWFsbFZpc2libGVBeGVzU2F0aXNmeShxKXtyZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZXZlcnkodT0+cSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHEpe3JldHVybiB0aGlzLl9heGVzW3FdfWRyYWdTdGFydChxKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3FdLmlzRGlzcGxheWVkKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbcV07dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhxKX1kcmFnKHEpe3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249cT1NYXRoLm1pbihNYXRoLm1heChxLDApLHRoaXMuX3N2Z1Byb3BzLndpZHRoKTtxPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpOwpxLnNvcnQoKHUsdyk9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHcpKTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4ocSk7dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwpfWRyYWdFbmQoKXtjb25zb2xlLmFzc2VydCh0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249bnVsbDt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKSl9aXNBeGlzRHJhZ2dpbmcoKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzfWdldEF4aXNQb3NpdGlvbihxKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzJiZ0aGlzLl9kcmFnZ2VkQXhpcy5jb2xJbmRleCgpPT09cT90aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uOnRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfV91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhxKXt2YXIgdT0KdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKHc9PnEuaGFzKHcpKTt1PUFycmF5LmZyb20obmV3IFNldChbLi4udSwuLi5BcnJheS5mcm9tKHEpXSkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbih1KX1fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHEpe3EuYXR0cigidHJhbnNmb3JtIix1PT5iLmhwYXJhbXMudXRpbHMudHJhbnNsYXRlU3RyKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpKSl9X2NyZWF0ZUF4ZXMocSl7cmV0dXJuIGQzLnJhbmdlKGIuaHBhcmFtcy51dGlscy5udW1Db2x1bW5zKHRoaXMuX3NjaGVtYSkpLm1hcCh1PT5uZXcgbSh0aGlzLl9zdmdQcm9wcyx0aGlzLl9zY2hlbWEscSx1KSl9fWYuQXhlc0NvbGxlY3Rpb249bn0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2xpbmVzLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihsKXtsW2wuRk9SRUdST1VORD0wXT0iRk9SRUdST1VORCI7bFtsLkJBQ0tHUk9VTkQ9MV09IkJBQ0tHUk9VTkQifSkoaD1mLkxpbmVUeXBlfHwoZi5MaW5lVHlwZT17fSkpO2NsYXNzIGt7Y29uc3RydWN0b3IobCl7dm9pZCAwPT09bCYmKGw9ZDMuc2VsZWN0QWxsKG51bGwpKTtjb25zb2xlLmFzc2VydCgxPj1sLnNpemUoKSk7dGhpcy5fc2Vzc2lvbkdyb3VwU2VsPWx9c2Vzc2lvbkdyb3VwKCl7cmV0dXJuIDE9PT10aGlzLl9zZXNzaW9uR3JvdXBTZWwuc2l6ZSgpP3RoaXMuX3Nlc3Npb25Hcm91cFNlbC5kYXR1bSgpOm51bGx9aXNOdWxsKCl7cmV0dXJuIG51bGw9PT10aGlzLnNlc3Npb25Hcm91cCgpfXNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uR3JvdXBTZWx9ZXF1YWxzVG8obCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/bC5pc051bGwoKTpsLmlzTnVsbCgpPyExOmwuc2Vzc2lvbkdyb3VwKCkubmFtZT09CnRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19Zi5TZXNzaW9uR3JvdXBIYW5kbGU9aztjbGFzcyBye2NvbnN0cnVjdG9yKGwscCxtKXt0aGlzLl9zdmdQcm9wcz1sO3RoaXMuX3NjaGVtYT1wO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW07dGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIik7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT0KbmV3IGs7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9bmV3IGs7dGhpcy5fZDNsaW5lPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcil9Z2V0U2Vzc2lvbkdyb3VwSGFuZGxlKGwpe3JldHVybiBudWxsPT09bHx8dm9pZCAwPT09bD9uZXcgazpuZXcgayh0aGlzLl9mZ1BhdGhzU2VsLmZpbHRlcihwPT5wLm5hbWU9PT1sLm5hbWUpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKGwscD0wKXsobD09PWguRk9SRUdST1VORD8KdGhpcy5fZmdQYXRoc1NlbDp0aGlzLl9iZ1BhdGhzU2VsKS50cmFuc2l0aW9uKCkuZHVyYXRpb24ocCkuYXR0cigiZCIsbT0+dGhpcy5fcGF0aERBdHRyaWJ1dGUobSkpO2w9PT1oLkZPUkVHUk9VTkQmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT57Y29uc3QgbT10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaChmdW5jdGlvbihuKXttLl9zZXRDb250cm9sUG9pbnRzUHJvcGVydHkodGhpcyxuKX0pfSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLGw9PiF0aGlzLl9heGVzQ29sbGVjdGlvbi5hbGxWaXNpYmxlQXhlc1NhdGlzZnkoKHAsbSk9Pm0uYnJ1c2hGaWx0ZXIoKS5pc1Bhc3NpbmcoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKSkpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IobCwKcCxtKXtsPXRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGwscCxtKTt0aGlzLl9mZ1BhdGhzU2VsLmF0dHIoInN0cm9rZSIsbCl9cmVkcmF3KGwscCxtLG4pe2NvbnN0IHE9dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpLHU9dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCk7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1sO3RoaXMuX2ZnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9mZ1BhdGhzU2VsKTt0aGlzLl9iZ1BhdGhzU2VsPXRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fYmdQYXRoc1NlbCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHUpO3RoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkZPUkVHUk9VTkQpOwp0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoaC5CQUNLR1JPVU5EKTt0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTt0aGlzLnNldEZvcmVncm91bmRMaW5lc0NvbG9yKHAsbSxuKX11cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAobCl7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMCl9Y2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKXt0aGlzLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXcgayl9dXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobCl7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPQpsO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChsLHApe2NvbnN0IG09dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMobj0+bik7bD1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuZmluZENsb3Nlc3RQYXRoKHRoaXMuX3Zpc2libGVGZ1BhdGhzU2VsLm5vZGVzKCksbSxbbCxwXSk7cmV0dXJuIG51bGw9PT1sP25ldyBrOm5ldyBrKGQzLnNlbGVjdChsKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGwscCxtKXtpZihudWxsPT09bClyZXR1cm4oKT0+InJlZCI7Y29uc3Qgbj1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihiLmhwYXJhbXMudXRpbHMubnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3VwcyxsKSkucmFuZ2UoW3AsbV0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKTtyZXR1cm4gcT0+Cm4oYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEscSxsKSl9X3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24obCl7bD1sLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcyxwPT5wLm5hbWUpO2wuZXhpdCgpLnJlbW92ZSgpO3JldHVybiBsLmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2UobCl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShsLHApe2wuY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhwKX1fY29tcHV0ZUNvbnRyb2xQb2ludHMobCl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKChwLG0pPT5bcCxtLnlTY2FsZSgpKGIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLGwsbS5jb2xJbmRleCgpKSldKX1fcGF0aERBdHRyaWJ1dGUobCl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhsKSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9CnRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19Zi5MaW5lc0NvbGxlY3Rpb249cn0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2ludGVyYWN0aW9uX21hbmFnZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtjb25zdHJ1Y3RvcihyLGwpe3RoaXMuc3ZnPWQzLnNlbGVjdChyKTtyPTEwMCpsKzIwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHtyfSAkezI0MH1gKTt0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKTt0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixyKyJweCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKTt0aGlzLndpZHRoPXItMTAtMTA7dGhpcy5oZWlnaHQ9MjAwO3RoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLGIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIoMTAsMzApKX19Zi5TVkdQcm9wZXJ0aWVzPWg7Y2xhc3Mga3tjb25zdHJ1Y3RvcihyLGwscCxtKXt0aGlzLl9zdmdQcm9wcz1yO3RoaXMuX3NjaGVtYT1sO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1wO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPQptO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBmLkF4ZXNDb2xsZWN0aW9uKHIsbCx0aGlzKTt0aGlzLl9saW5lc0NvbGxlY3Rpb249bmV3IGYuTGluZXNDb2xsZWN0aW9uKHIsbCx0aGlzLl9heGVzQ29sbGVjdGlvbik7dGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCk9PnRoaXMub25DbGljaygpKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLCgpPT57Y29uc3QgW24scV09ZDMubW91c2UodGhpcy5fc3ZnUHJvcHMuc3ZnRy5ub2RlKCkpO3RoaXMub25Nb3VzZU1vdmVkKG4scSl9KS5vbigibW91c2VsZWF2ZSIsKCk9PnRoaXMub25Nb3VzZUxlYXZlKCkpfW9uRHJhZ1N0YXJ0KHIpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdTdGFydChyKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uaGlkZUJhY2tncm91bmRMaW5lcygpfW9uRHJhZyhyKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnKHIpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCl9b25EcmFnRW5kKCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ0VuZCgpOwp0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhmLkxpbmVUeXBlLkZPUkVHUk9VTkQsNTAwKTt3aW5kb3cuc2V0VGltZW91dCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuQkFDS0dST1VORCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnNob3dCYWNrZ3JvdW5kTGluZXMoKX0sNTAwKX1vbkJydXNoQ2hhbmdlZChyKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5nZXRBeGlzRm9yQ29sSW5kZXgocikuc2V0QnJ1c2hTZWxlY3Rpb24oZDMuZXZlbnQuc2VsZWN0aW9uKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZChyLGwpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHIsbCkpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8Cih0aGlzLl9saW5lc0NvbGxlY3Rpb24uY2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IobnVsbCkpfW9uQ2xpY2soKXt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCk9PT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT90aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobmV3IGYuU2Vzc2lvbkdyb3VwSGFuZGxlKTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKTt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChyLApsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi51cGRhdGVBeGVzKHIsbCk7Y29uc3QgcD10aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCksbT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVkcmF3KGwsdm9pZCAwIT09ci5jb2xvckJ5Q29sdW1uSW5kZXg/ci5jb2x1bW5zW3IuY29sb3JCeUNvbHVtbkluZGV4XS5hYnNvbHV0ZUluZGV4Om51bGwsci5taW5Db2xvcixyLm1heENvbG9yKTtwLmVxdWFsc1RvKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpO20uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpfHwKdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfXNjaGVtYSgpe3JldHVybiB0aGlzLl9zY2hlbWF9fWYuSW50ZXJhY3Rpb25NYW5hZ2VyPWt9KShkLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoZC5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0scmVkcmF3Q291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF92YWxpZFNlc3Npb25Hcm91cHM6QXJyYXksX2ludGVyYWN0aW9uTWFuYWdlcjpPYmplY3R9LG9ic2VydmVyczpbIl9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChvcHRpb25zLiosIHNlc3Npb25Hcm91cHMuKikiXSxfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtpZih0aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8CiFfLmlzRXF1YWwodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLnNjaGVtYSgpLGIuc2NoZW1hKSl7ZDMuc2VsZWN0KHRoaXMuJC5zdmcpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2NvbnN0IGQ9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuU1ZHUHJvcGVydGllcyh0aGlzLiQuc3ZnLHRmLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyhiLnNjaGVtYSkpO3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5JbnRlcmFjdGlvbk1hbmFnZXIoZCxiLnNjaGVtYSxmPT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpLGY9PnRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLAp0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpO3RoaXMucmVkcmF3Q291bnQrK319LGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGIpe3RoaXMuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoYil9LHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChiKX0sX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDA7ZWxzZXt2YXIgZD10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7dGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoZj0+e2ZvcihsZXQgaD0wO2g8Yi5udW1Db2x1bW5zKGQpOysraClpZih0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtoXSYmdm9pZCAwPT09Yi5jb2x1bW5WYWx1ZUJ5SW5kZXgoZCwKZixoKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCpiLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYi5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGIoa2Epe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZChrYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZihrYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitrYX1mdW5jdGlvbiBoKGthKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKa2F9ZnVuY3Rpb24gayhrYSxXLEVhLHZhLHlhKXtFYT1NYXRoLmZsb29yKEVhL3ZhKTt2YT1XLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXlhKXtsZXQgQWE9dmEucXVhbnRpbGVzKCk7QWE9ZDMucmFuZ2UoMCxBYS5sZW5ndGgsTWF0aC5jZWlsKEFhLmxlbmd0aC9FYSkpLm1hcChGYT0+QWFbRmFdKTtXLnRpY2tWYWx1ZXMoQWEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09eWEmJiJMT0ciIT09eWF8fFcudGlja3MoRWEpO2thLmNhbGwoVyk7a2Euc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCk7a2Euc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfWZ1bmN0aW9uIHIoa2EsVyl7cmV0dXJuIExbV10oeC5fY29sVmFsdWUoa2EsVykpfWZ1bmN0aW9uIGwoa2EsVyl7cmV0dXJuIEpbV10oeC5fbWV0cmljVmFsdWUoa2EsVykpfWZ1bmN0aW9uIHAoa2EsVyl7Y29uc3QgRWE9W107WFtrYV1bV10uZWFjaChmdW5jdGlvbigpe0VhLnB1c2godGhpcyl9KTsKcmV0dXJuIGQzLnF1YWR0cmVlKCkueCh2YT0+ZDMuc2VsZWN0KHZhKS5kYXR1bSgpLngpLnkodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS55KS5hZGRBbGwoRWEpfWZ1bmN0aW9uIG0oKXtsZXQga2E9bmV3IFNldChSLm5vZGVzKCkpO3coKXx8KGthPW4oeC5fYnJ1c2hlZENlbGxJbmRleCx4Ll9icnVzaFNlbGVjdGlvbikpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHkuZmlsdGVyU2V0KGthLFc9PiFaLmhhcyhXKSkpKS5hdHRyKCJmaWxsIixOKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChaLFc9PiFrYS5oYXMoVykpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTtaPWthfWZ1bmN0aW9uIG4oa2EsVyl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWthKTtjb25zb2xlLmFzc2VydChudWxsIT09Vyk7Y29uc3QgW0VhLHZhXT1rYSx5YT1uZXcgU2V0O3kucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChmYVtFYV1bdmFdLFdbMF1bMF0sV1swXVsxXSxXWzFdWzBdLFdbMV1bMV0sCkFhPT57ZDMuc2VsZWN0KEFhKS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaChGYT0+e3lhLmFkZChGYSl9KX0pO3JldHVybiB5YX1mdW5jdGlvbiBxKGthKXtjb25zdCBXPWQzLmJydXNoU2VsZWN0aW9uKGthKTshdSgpJiZudWxsPT09V3x8dSgpJiZrYT09PW9hLm5vZGUoKSYmXy5pc0VxdWFsKFcseC5fYnJ1c2hTZWxlY3Rpb24pfHwoeC5fYnJ1c2hTZWxlY3Rpb249VyxudWxsIT09Vz8ob2E9ZDMuc2VsZWN0KGthKSx4Ll9icnVzaGVkQ2VsbEluZGV4PW9hLmRhdHVtKCkpOihvYT1udWxsLHguX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksbSgpKX1mdW5jdGlvbiB1KCl7cmV0dXJuIG51bGwhPT14Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09eC5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24gdygpe3JldHVybiF1KCl8fHguX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09eC5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHguX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09eC5fYnJ1c2hTZWxlY3Rpb25bMV1bMV19CmZ1bmN0aW9uIEEoa2EsVyxFYSx2YSx5YSl7bGV0IEFhPUluZmluaXR5LEZhPW51bGw7eS5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKGZhW2thXVtXXSxFYSx2YSx5YSwoeGEsU2EpPT57Wi5oYXMoeGEpJiZTYTxBYSYmKHhhPWQzLnNlbGVjdCh4YSkuZGF0dW0oKSxBYT1TYSxGYT14YS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1GYT9udWxsOmQzLnNlbGVjdEFsbChhYS5nZXQoRmEpKX1jb25zdCB5PXRmLmhwYXJhbXMudXRpbHMseD10aGlzO2lmKHRoaXMuc2Vzc2lvbkdyb3VwcyYmMCE9dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aCYmdGhpcy52aXNpYmxlU2NoZW1hJiYwIT10aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoKXt2YXIgQz1kMy5yYW5nZSh5Lm51bVZpc2libGVDb2x1bW5zKHgudmlzaWJsZVNjaGVtYSkpLEc9ZDMucmFuZ2UoeS5udW1WaXNpYmxlTWV0cmljcyh4LnZpc2libGVTY2hlbWEpKSxEPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihDKS5yYW5nZShbODUsCnRoaXMud2lkdGgtMS01XSkucGFkZGluZ0lubmVyKC4xKSxCPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihHKS5yYW5nZShbdGhpcy5oZWlnaHQtMS01LTUwLDVdKS5wYWRkaW5nSW5uZXIoLjEpLEg9RC5iYW5kd2lkdGgoKSxLPUIuYmFuZHdpZHRoKCksTD1DLm1hcChrYT0+eC5fY2VsbFNjYWxlKGthLFswLEgtMV0pKSxKPUcubWFwKGthPT54Ll9jZWxsU2NhbGUoa2EreS5udW1WaXNpYmxlSFBhcmFtcyh4LnZpc2libGVTY2hlbWEpLFtLLTEsMF0pKSxPPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKEMpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixrYT0+eS50cmFuc2xhdGVTdHIoRChrYSksMCkpO08uYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixiKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLEgrMTApLmF0dHIoImhlaWdodCIseC5oZWlnaHQtMjUpOwpPLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIseC5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixIKS5hdHRyKCJoZWlnaHQiLDI1KTtPLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrYihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNCb3R0b20oTFtrYV0pLnRpY2tTaXplKHguaGVpZ2h0LTUwKSxILDQwLHgub3B0aW9ucy5jb2x1bW5zW2thXS5zY2FsZSl9KTtPLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrZChrYSkrIikiKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLEgvMikuYXR0cigieSIseC5oZWlnaHQtMS0xMi41KS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHgudmlzaWJsZVNjaGVtYSwKa2EpKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSh4LnZpc2libGVTY2hlbWEsa2EpKTtPPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi55LWF4aXMiKS5kYXRhKEcpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixrYT0+eS50cmFuc2xhdGVTdHIoeC53aWR0aC0xLEIoa2EpKSk7Ty5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGYpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0oeC53aWR0aC00MC0xKSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIix4LndpZHRoLTQwKS5hdHRyKCJoZWlnaHQiLEsrMTApO08uYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKHgud2lkdGgtMSkpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IixLKTtPLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrCmYoa2EpKyIpIikuZWFjaChmdW5jdGlvbihrYSl7ZDMuc2VsZWN0KHRoaXMpLmNhbGwoayxkMy5heGlzTGVmdChKW2thXSkudGlja1NpemUoeC53aWR0aC04MCksSywyMCx4Lm9wdGlvbnMuY29sdW1uc1trYSt5Lm51bVZpc2libGVIUGFyYW1zKHgudmlzaWJsZVNjaGVtYSldLnNjYWxlKX0pO08uYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitoKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsLSh4LndpZHRoLTIwLTEpKS5hdHRyKCJ5IixLLzIpLmF0dHIoInRyYW5zZm9ybSIseS5yb3RhdGVTdHIoLSh4LndpZHRoLTIwLTEpLEsvMikpLnRleHQoa2E9PnkubWV0cmljTmFtZSh4LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3Nba2FdKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQoa2E9PnkubWV0cmljTmFtZSh4LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3Nba2FdKSk7Ck89dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKGQzLmNyb3NzKEMsRykpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiY2VsbCIsITApLmF0dHIoInRyYW5zZm9ybSIsKFtrYSxXXSk9PnkudHJhbnNsYXRlU3RyKEQoa2EpLEIoVykpKTtPLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZyYW1lIiwhMCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsSCsxMCkuYXR0cigiaGVpZ2h0IixLKzEwKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIFM9bnVsbDt2b2lkIDAhPT14Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4JiYoUz1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbih0aGlzLl9jb2xFeHRlbnQodGhpcy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLnJhbmdlKFt0aGlzLm9wdGlvbnMubWluQ29sb3IsdGhpcy5vcHRpb25zLm1heENvbG9yXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpKTsKdmFyIE49dm9pZCAwPT09eC5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleD8oKT0+InJlZCI6KHtzZXNzaW9uR3JvdXA6a2F9KT0+Uyh0aGlzLl9jb2xWYWx1ZShrYSx4Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSksW1IsWCxhYV09ZnVuY3Rpb24oa2EsVyl7Y29uc3QgRWE9a2Euc2VsZWN0QWxsKCIuZGF0YS1tYXJrZXIiKS5kYXRhKChbeWEsQWFdKT0+eC5zZXNzaW9uR3JvdXBzLmZpbHRlcihGYT0+dm9pZCAwIT09eC5fY29sVmFsdWUoRmEseWEpJiZ2b2lkIDAhPT14Ll9tZXRyaWNWYWx1ZShGYSxBYSkpLm1hcChGYT0+KHtjb2w6eWEsbWV0cmljOkFhLHNlc3Npb25Hcm91cDpGYSx4OnIoRmEseWEpLHk6bChGYSxBYSksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKS5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgiZGF0YS1tYXJrZXIiLCEwKS5hdHRyKCJjeCIsKHt4OnlhfSk9PnlhKS5hdHRyKCJjeSIsKHt5OnlhfSk9PnlhKS5hdHRyKCJyIiwyKS5hdHRyKCJmaWxsIiwKVyksdmE9bmV3IE1hcDt4LnNlc3Npb25Hcm91cHMuZm9yRWFjaCh5YT0+e3ZhLnNldCh5YSxbXSl9KTtFYS5lYWNoKGZ1bmN0aW9uKHlhKXt2YS5nZXQoeWEuc2Vzc2lvbkdyb3VwKS5wdXNoKHRoaXMpfSk7RWEuZWFjaCh5YT0+e2NvbnN0IEFhPXZhLmdldCh5YS5zZXNzaW9uR3JvdXApO3lhLnNlc3Npb25Hcm91cE1hcmtlcnM9bmV3IFNldChBYSl9KTtrYT1DLm1hcCh5YT0+Ry5tYXAoQWE9PkVhLmZpbHRlcihGYT0+RmEuY29sPT15YSYmRmEubWV0cmljPT1BYSkpKTtyZXR1cm5bRWEsa2EsdmFdfShPLmFwcGVuZCgiZyIpLE4pLGZhPUMubWFwKGthPT5HLm1hcChXPT5wKGthLFcpKSksb2E9bnVsbDt1KCkmJihvYT1PLmZpbHRlcihrYT0+Xy5pc0VxdWFsKGthLHguX2JydXNoZWRDZWxsSW5kZXgpKSxjb25zb2xlLmFzc2VydCgxPT1vYS5zaXplKCksb2EpKTt2YXIgWj1uZXcgU2V0KFIubm9kZXMoKSk7bSgpO3ZhciBjYT1kMy5icnVzaCgpLmV4dGVudChbWy00LC00XSxbSC0xKzUtCjEsSy0xKzUtMV1dKS5vbigic3RhcnQiLGZ1bmN0aW9uKCl7dSgpJiZvYS5ub2RlKCkhPXRoaXMmJmNhLm1vdmUob2EsbnVsbCk7cSh0aGlzKX0pLm9uKCJicnVzaCIsZnVuY3Rpb24oKXtxKHRoaXMpfSkub24oImVuZCIsZnVuY3Rpb24oKXtxKHRoaXMpfSk7Ty5jYWxsKGNhKTt1KCkmJmNhLm1vdmUob2EseC5fYnJ1c2hTZWxlY3Rpb24pO3ZhciBqYT1udWxsLGJhPW51bGw7bnVsbCE9PXRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAmJihiYT1kMy5zZWxlY3RBbGwoYWEuZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Ty5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPWphPT09YmE/bnVsbDpqYTtrYSE9PWJhJiYobnVsbCE9PWJhJiZiYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxiYT1rYSxudWxsIT09YmEmJmJhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGthPW51bGw9PT1iYT9udWxsOmJhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp4Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChrYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihba2EsV10pe2NvbnN0IFtFYSx2YV09ZDMubW91c2UodGhpcyk7a2E9QShrYSxXLEVhLHZhLDIwKTtqYSE9PWthJiYobnVsbCE9PWphJiZqYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGphPWthLG51bGwhPT1qYT8oamEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx4Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGphLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6eC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09amEmJihqYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGphPW51bGwseC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGIsZCl7dmFyIGY9dGhpcy5fY29sRXh0ZW50KGIpO2NvbnN0IGg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gaDtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiAwPj1mWzBdJiYwPD1mWzFdP2g6ZDMuc2NhbGVMb2coKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXtjb25zdCBrPShkWzFdLWRbMF0pLzE5O2Y9ZDMucmFuZ2UoMjApLm1hcChyPT5kWzBdK2sqcik7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAocj0+dGhpcy5fY29sVmFsdWUocixiKSkpKS5yYW5nZShmKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoaz0+CnRoaXMuX2NvbFZhbHVlKGssYikpLnNvcnQoKSkpLnJhbmdlKGQpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIitiKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX21ldHJpY1ZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX2NvbEV4dGVudChiKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIG51bGwhPT1iP2I6ZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtbWFpbi90Zi1ocGFyYW1zLW1haW4uaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1tYWluIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxfY29uZmlndXJhdGlvbjpPYmplY3QsX3Nlc3Npb25Hcm91cHM6QXJyYXksX2RhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zOkJvb2xlYW4sX2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zOkJvb2xlYW59LHJlbG9hZCgpe3RoaXMuJFsicXVlcnktcGFuZSJdLnJlbG9hZCgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZGFzaGJvYXJkL3RmLWhwYXJhbXMtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfYmFja2VuZDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB0Zi5ocGFyYW1zLkJhY2tlbmQoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhwYXJhbXMiLCIiKSxuZXcgZGMuUmVxdWVzdE1hbmFnZXIsISEod2luZG93LlRFTlNPUkJPQVJEX0VOVnx8e30pLklOX0NPTEFCKX19LHJlbG9hZCgpe3RoaXMuJFsiaHBhcmFtcy1tYWluIl0ucmVsb2FkKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1lc2gtZGFzaGJvYXJkL21lc2gtbG9hZGVyLmpzCihmdW5jdGlvbihiKXtQb2x5bWVyKHtpczoidGYtbWVzaC1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxzYW1wbGU6TnVtYmVyLG9mU2FtcGxlczpOdW1iZXIsc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyx2YWx1ZToiYWxsIn0sYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfbWVzaFZpZXdlcjp7dHlwZTpPYmplY3R9LF9kYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0fSxfY29sb3JTY2FsZUZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+dGQucnVuc0NvbG9yU2NhbGV9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sbm90aWZ5OiEwfSxfc3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LApfbWVzaFZpZXdlckF0dGFjaGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfaXNNZXNoTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnLCBhY3RpdmUsIF9kYXRhUHJvdmlkZXIsIF9tZXNoVmlld2VyKSIsIl91cGRhdGVTY2VuZShfY3VycmVudFN0ZXAuKiwgX21lc2hWaWV3ZXIpIiwiX2RlYm91bmNlZEZldGNoTWVzaChfY3VycmVudFN0ZXApIiwiX3VwZGF0ZVZpZXcoc2VsZWN0ZWRWaWV3KSJdLF9jb21wdXRlUnVuQ29sb3I6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihkKX0sCmF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZGF0YVByb3ZpZGVyPW5ldyBiLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyKHRoaXMucmVxdWVzdE1hbmFnZXIpO2NvbnN0IGQ9bmV3IGIuTWVzaFZpZXdlcih0aGlzLl9ydW5Db2xvcik7ZC5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmVVcGRhdGVTY2VuZSIsdGhpcy5fdXBkYXRlQ2FudmFzU2l6ZS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNhbWVyYVBvc2l0aW9uQ2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpO3RoaXMuX21lc2hWaWV3ZXI9ZH0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2RhdGFQcm92aWRlciYmKHRoaXMuc2V0KCJfaXNNZXNoTG9hZGluZyIsITApLHRoaXMuX2RhdGFQcm92aWRlci5yZWxvYWQodGhpcy5ydW4sdGhpcy50YWcsdGhpcy5zYW1wbGUpLnRoZW4oZD0+e2QmJih0aGlzLnNldCgiX3N0ZXBzIixkKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsCmQubGVuZ3RoLTEpKX0pLmNhdGNoKGQ9PntpZighZHx8IWQuY29kZXx8ZC5jb2RlIT1iLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IEVycm9yKGR8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iKTt9KSl9LF91cGRhdGVTY2VuZTpmdW5jdGlvbigpe2NvbnN0IGQ9dGhpcy5fY3VycmVudFN0ZXA7ZCYmZC5tZXNoJiYodGhpcy5fbWVzaFZpZXdlci51cGRhdGVTY2VuZShkLHRoaXMpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWR8fCh0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ9ITApLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZHx8KHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLl9tZXNoVmlld2VyLmdldFJlbmRlcmVyKCkuZG9tRWxlbWVudCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkPSEwKSl9LF9kZWJvdW5jZWRGZXRjaE1lc2goKXt0aGlzLmRlYm91bmNlKCJmZXRjaE1lc2giLCgpPT50aGlzLl9tYXliZUZldGNoTWVzaCgpLAoxMDApfSxfbWF5YmVGZXRjaE1lc2goKXtjb25zdCBkPXRoaXM7cmV0dXJuIFdiKGZ1bmN0aW9uKigpe2NvbnN0IGY9ZC5fY3VycmVudFN0ZXA7aWYoZiYmIWYubWVzaCYmIWYubWVzaEZldGNoaW5nKXtmLm1lc2hGZXRjaGluZz0hMDtkLl9pc01lc2hMb2FkaW5nPSEwO3RyeXtjb25zdCBoPXlpZWxkIGQuX2RhdGFQcm92aWRlci5mZXRjaERhdGEoZixkLnJ1bixkLnRhZyxkLnNhbXBsZSk7Zi5tZXNoPWhbMF07ZC5ub3RpZnlQYXRoKCJfY3VycmVudFN0ZXAubWVzaCIpfWNhdGNoKGgpe2lmKCFofHwhaC5jb2RlfHxoLmNvZGUhPWIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQpdGhyb3cgaD1ofHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIixFcnJvcihoKTt9ZmluYWxseXtkLl9pc01lc2hMb2FkaW5nPSExLGYubWVzaEZldGNoaW5nPSExfX19KX0sX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2U6ZnVuY3Rpb24oKXtpZih0aGlzLl9tZXNoVmlld2VyLmlzUmVhZHkoKSl7dmFyIGQ9bmV3IEN1c3RvbUV2ZW50KCJjYW1lcmEtcG9zaXRpb24tY2hhbmdlIiwKe2RldGFpbDp0aGlzLl9tZXNoVmlld2VyLmdldENhbWVyYVBvc2l0aW9uKCl9KTt0aGlzLmRpc3BhdGNoRXZlbnQoZCl9fSxzZXRDYW1lcmFWaWV3cG9pbnQ6ZnVuY3Rpb24oZCxmLGgpe3RoaXMuX21lc2hWaWV3ZXIuc2V0Q2FtZXJhVmlld3BvaW50KGQsZixoKX0sX3VwZGF0ZUNhbnZhc1NpemU6ZnVuY3Rpb24oKXtjb25zdCBkPXRoaXMub2Zmc2V0V2lkdGgsZj10aGlzLiQkKCIudGYtbWVzaC1sb2FkZXItaGVhZGVyIikub2Zmc2V0SGVpZ2h0O3RoaXMuX21lc2hWaWV3ZXIuc2V0Q2FudmFzU2l6ZSh7d2lkdGg6ZCxoZWlnaHQ6ZC1mfSl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUNhbnZhc1NpemUoKTt0aGlzLmlzQ29ubmVjdGVkJiZ0aGlzLl9tZXNoVmlld2VyLmRyYXcoKX0sX2hhc0F0TGVhc3RPbmVTdGVwOmZ1bmN0aW9uKGQpe3JldHVybiEhZCYmMDxkLmxlbmd0aH0sX2hhc011bHRpcGxlU3RlcHM6ZnVuY3Rpb24oZCl7cmV0dXJuISFkJiYxPGQubGVuZ3RofSxfY29tcHV0ZUN1cnJlbnRTdGVwOmZ1bmN0aW9uKGQsCmYpe3JldHVybiBkW2ZdfHxudWxsfSxfY29tcHV0ZVN0ZXBWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gZD9kLnN0ZXA6MH0sX2NvbXB1dGVDdXJyZW50V2FsbFRpbWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/SGguZm9ybWF0RGF0ZShkLndhbGxfdGltZSk6IiJ9LF9nZXRNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oZCl7cmV0dXJuIGQubGVuZ3RoLTF9LF9nZXRTYW1wbGVUZXh0OmZ1bmN0aW9uKGQpe3JldHVybiBTdHJpbmcoZCsxKX0sX2hhc011bHRpcGxlU2FtcGxlczpmdW5jdGlvbihkKXtyZXR1cm4gMTxkfSxfdXBkYXRlVmlldzpmdW5jdGlvbihkKXt0aGlzLl9tZXNoVmlld2VyJiYiYWxsIj09ZCYmdGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKX0sdG9Mb2NhbGVTdHJpbmdfOmZ1bmN0aW9uKGQpe3JldHVybiBkLnRvTG9jYWxlU3RyaW5nKCl9fSl9KShmbHx8KGZsPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWVzaC1kYXNoYm9hcmQvdGYtbWVzaC1kYXNoYm9hcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoibWVzaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e3JlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6Ii4qIn0sX3NlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiJhbGwifSxfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSwKX2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1tZXNoLWxvYWRlciIpfSxfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYil7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goZD0+e2IudGFyZ2V0IT1kJiZkLnNldENhbWVyYVZpZXdwb2ludChiLmRldGFpbC5wb3NpdGlvbixiLmRldGFpbC5mYXIsYi5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+CntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj1kYy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgocil7Y29uc3QgbD1iW3IucnVuXVtyLnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSxyLHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIscj0+T2JqZWN0LmtleXMocikpO3JldHVybiBrYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAocj0+T2JqZWN0LmFzc2lnbih7fSxyLHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sCnIuaXRlbXMubWFwKGgpKX0pKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9Yi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjtiLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWZ8fG51bGw9PWZ9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sX21pc3NlZEF1dG9SZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kSGFuZGxlVmlzaWJpbGl0eUNoYW5nZTp7dHlwZTpPYmplY3R9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLAp2YWx1ZTozMH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRIYW5kbGVWaXNpYmlsaXR5Q2hhbmdlPXRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6CndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2lzRG9jdW1lbnRWaXNpYmxlKCk/dGhpcy5fZG9SZWxvYWQoKTp0aGlzLl9taXNzZWRBdXRvUmVsb2FkPSEwO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9LF9kb1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0RvY3VtZW50VmlzaWJsZSgpJiZ0aGlzLl9taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5fbWlzc2VkQXV0b1JlbG9hZD0hMSx0aGlzLl9kb1JlbG9hZCgpKX0sX2lzRG9jdW1lbnRWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuInZpc2libGUiPT09CmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZX19fSkocGV8fChwZT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3RmLXRlbnNvcmJvYXJkLmh0bWwuanMKY29uc3QgdG49e2dldExvY2F0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbn19OwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbcGUuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSxob21lUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9ob21lUGF0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9zYW5pdGl6ZUhvbWVQYXRoKGhvbWVQYXRoKSJ9LHRpdGxlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3VwZGF0ZVRpdGxlIn0scm91dGVyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVJvdXRlciJ9LGRlbW9EaXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHVzZUhhc2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZWREYXNoYm9hcmRzOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2Rhc2hib2FyZERhdGE6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkRGF0YShfZGFzaGJvYXJkUmVnaXN0cnkpIn0sX2Rhc2hib2FyZFJlZ2lzdHJ5Ont0eXBlOk9iamVjdCwKY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9hY3RpdmVEYXNoYm9hcmRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZChfZGFzaGJvYXJkRGF0YSwgX3BsdWdpbnNMaXN0aW5nKSJ9LF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpwZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sCl9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkifSxfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3NlbGVjdGVkRGFzaGJvYXJkOnt0eXBlOlN0cmluZyx2YWx1ZTpiZC5nZXRTdHJpbmcoYmQuVEFCKXx8bnVsbCxvYnNlcnZlcjoiX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZCJ9LApfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xhc3RSZWxvYWRUaW1lOnt0eXBlOlN0cmluZyx2YWx1ZToibm90IHlldCBsb2FkZWQifSxfbGFzdFJlbG9hZFRpbWVTaG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vdCB5ZXQgbG9hZGVkIn0sX2RhdGFMb2NhdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLkNhbmNlbGxlcn0sX3JlZnJlc2hpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLAoiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSxfc2FuaXRpemVIb21lUGF0aChiKXtpZighYilyZXR1cm4iIjtjb25zdCBkPXRuLmdldExvY2F0aW9uKCksZj1uZXcgVVJMKGIsZC5ocmVmKSxoPSJodHRwOiI9PT1mLnByb3RvY29sfHwiaHR0cHM6Ij09PWYucHJvdG9jb2wsaz1mLm9yaWdpbj09PWQub3JpZ2luO2lmKCFoKXRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3QgJ2hvbWVQYXRoJyB0byBiZSBvZiBodHRwOiBvciBodHRwczouICR7Yn1gKTtpZighayl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgYmUgYSBwYXRoIG9yIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiAke2J9IHZzLiAke2Qub3JpZ2lufWApO3JldHVybiBoJiZrP2YudG9TdHJpbmcoKToiIn0sX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSwKX2lzRGFzaGJvYXJkQWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pfHwhKGR8fFtdKS5pbmNsdWRlcyhmLnBsdWdpbik/ITE6ITB9LF9pc0Rhc2hib2FyZEluYWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pPyExOihkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoYixkLGYpe2lmKCFmKXJldHVybiExO2NvbnN0IGg9bmV3IFNldDtiLmZvckVhY2goaz0+e2guYWRkKGsucGx1Z2luKX0pOyhkfHwiIikuc3BsaXQoIiwiKS5mb3JFYWNoKGs9PntoLmRlbGV0ZShrLnBsdWdpbil9KTtmLmZvckVhY2goaz0+e2guZGVsZXRlKGspfSk7cmV0dXJuIDA8aC5zaXplfSxfZ2V0RGFzaGJvYXJkRnJvbUluZGV4KGIsZCl7cmV0dXJuIGJbZF19LF9zZWxlY3RlZFN0YXR1cyhiLGQpe3JldHVybiBiPT09ZH0sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChiKXtiPQpifHwiIjtiZC5zZXRTdHJpbmcoYmQuVEFCLGIpO2xldCBkPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtkKz1kLmVuZHNXaXRoKCIvIik/YjoiLyIrYjtnYSgic2V0IiwicGFnZSIsZCk7Z2EoInNlbmQiLCJwYWdldmlldyIpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKGIsZCl7ZCYmbnVsbD09YiYmKGI9ZFswXXx8bnVsbCxudWxsIT1iJiYoYmQuc2V0U3RyaW5nKGJkLlRBQixiLHt1c2VMb2NhdGlvblJlcGxhY2U6ITB9KSx0aGlzLl9zZWxlY3RlZERhc2hib2FyZD1iKSl9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl7Y29uc3QgYj1iZC5nZXRTdHJpbmcoYmQuVEFCKTt0aGlzLnNldCgiX3NlbGVjdGVkRGFzaGJvYXJkIixifHxudWxsKX0sX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChiLGQsZixoKXtpZihmJiZoJiZkW2hdJiYoZD10aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlLHRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9CmgsZCYmZCE9aCYmYltkXS5yZW1vdmVEb20mJihkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7ZH1dYCksZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQucmVtb3ZlKCkpLGQ9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtofV1gKSkpe2I9YltoXTtpZigwPT09ZC5jaGlsZHJlbi5sZW5ndGgpc3dpdGNoKGY9Yi5sb2FkaW5nTWVjaGFuaXNtLGYudHlwZSl7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmLmVsZW1lbnROYW1lKTtoLmlkPSJkYXNoYm9hcmQiO2QuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7Y2FzZSAiSUZSQU1FIjp0aGlzLl9yZW5kZXJQbHVnaW5JZnJhbWUoZCxoLGYpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJJbnZhcmlhbnQgdmlvbGF0aW9uOiIsZil9dGhpcy5zZXQoIl9pc1JlbG9hZERpc2FibGVkIixiLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShiLApkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2YuaWQ9ImRhc2hib2FyZCI7Z2wuaG9zdC5yZWdpc3RlclBsdWdpbklmcmFtZShmLGQpO2NvbnN0IGg9bmV3IFVSTCgiZGF0YS9wbHVnaW5fZW50cnkuaHRtbCIsd2luZG93LmxvY2F0aW9uLmhyZWYpO2guc2VhcmNoUGFyYW1zLnNldCgibmFtZSIsZCk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsaC50b1N0cmluZygpKTtiLmFwcGVuZENoaWxkKGYpfSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXt4Yy5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sCiExKTtkYy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5fZGF0YUxvY2F0aW9uPWRjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCk7Y29uc3QgYj1kYy5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YiYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1iKX0pO2JkLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGI9PmIucGx1Z2luKS5maWx0ZXIoYj0+e2I9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYl07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGI/YjpiJiZiLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYj17fTtmb3IoY29uc3QgZCBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSliW2QuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1ifSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGIpe2NvbnN0IGQ9e307Zm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMocGUuZGFzaGJvYXJkUmVnaXN0cnkpKWRbaF09e3BsdWdpbjprLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5lbGVtZW50TmFtZX0sdGFiTmFtZTprLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmsucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9Yilmb3IoY29uc3QgW2gsa11vZiBPYmplY3QuZW50cmllcyhiKSlpZigiYm9vbGVhbiIhPT10eXBlb2Ygayl7c3dpdGNoKGsubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09ZFtoXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApoKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGY9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTprLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpmPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6ay5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGgsay5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZiYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGYsaCk7ZFtoXT17cGx1Z2luOmgsbG9hZGluZ01lY2hhbmlzbTpmLHRhYk5hbWU6ay50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6ay5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206ay5yZW1vdmVfZG9tfX1mPXt9Owpmb3IoY29uc3QgaCBvZiBPYmplY3Qua2V5cyhiKSlkW2hdJiYoZltoXT1kW2hdKTtPYmplY3QuYXNzaWduKGYsZCk7cmV0dXJuIGZ9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShiKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhiKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9ZC52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXBlLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGRjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYiwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1wZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KcGUuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYil7cmV0dXJuIGI9PT1wZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChiKXtyZXR1cm4gYj09PXBlLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYil7cmV0dXJuIGI9PT1wZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJjA9PT1kLmxlbmd0aCYmbnVsbD09Zn0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJiEhZiYmCm51bGw9PWRbZl19LF91cGRhdGVSb3V0ZXIoYil7ZGMuc2V0Um91dGVyKGIpfSxfdXBkYXRlVGl0bGUoYil7YiYmdGhpcy5zZXQoImJyYW5kIixiKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYj10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2ImJmIucmVsb2FkJiZiLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLGRjLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLGRjLnJ1bnNTdG9yZS5yZWZyZXNoKCksZGMuZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1zZC5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYil7Yi50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYil7Yj1OdW1iZXIucGFyc2VJbnQoYi50YXJnZXQudmFsdWUsMTApO2I9PT0rYiYmMDxiJiZzZC5zZXRMaW1pdChiKX19KTsKLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjMuNiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy4KICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UsIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKICovCi8vTm90IHVzaW5nIHN0cmljdDogdW5ldmVuIHN0cmljdCBzdXBwb3J0IGluIGJyb3dzZXJzLCAjMzkyLCBhbmQgY2F1c2VzCi8vcHJvYmxlbXMgd2l0aCByZXF1aXJlanMuZXhlYygpL3RyYW5zcGlsZXIgcGx1Z2lucyB0aGF0IG1heSBub3QgYmUgc3RyaWN0LgovKmpzbGludCByZWdleHA6IHRydWUsIG5vbWVuOiB0cnVlLCBzbG9wcHk6IHRydWUgKi8KLypnbG9iYWwgd2luZG93LCBuYXZpZ2F0b3IsIGRvY3VtZW50LCBpbXBvcnRTY3JpcHRzLCBzZXRUaW1lb3V0LCBvcGVyYSAqLwoKdmFyIHJlcXVpcmVqcywgcmVxdWlyZSwgZGVmaW5lOwooZnVuY3Rpb24gKGdsb2JhbCwgc2V0VGltZW91dCkgewogICAgdmFyIHJlcSwgcywgaGVhZCwgYmFzZUVsZW1lbnQsIGRhdGFNYWluLCBzcmMsCiAgICAgICAgaW50ZXJhY3RpdmVTY3JpcHQsIGN1cnJlbnRseUFkZGluZ1NjcmlwdCwgbWFpblNjcmlwdCwgc3ViUGF0aCwKICAgICAgICB2ZXJzaW9uID0gJzIuMy42JywKICAgICAgICBjb21tZW50UmVnRXhwID0gL1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIC8vQ291bGQgbWF0Y2ggc29tZXRoaW5nIGxpa2UgJykvL2NvbW1lbnQnLCBkbyBub3QgbG9zZSB0aGUgcHJlZml4IHRvIGNvbW1lbnQuCiAgICBmdW5jdGlvbiBjb21tZW50UmVwbGFjZShtYXRjaCwgc2luZ2xlUHJlZml4KSB7CiAgICAgICAgcmV0dXJuIHNpbmdsZVByZWZpeCB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CiAgICB9CgogICAgZnVuY3Rpb24gaXNBcnJheShpdCkgewogICAgICAgIHJldHVybiBvc3RyaW5nLmNhbGwoaXQpID09PSAnW29iamVjdCBBcnJheV0nOwogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheS4gSWYgdGhlIGZ1bmMgcmV0dXJucwogICAgICogYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaChhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGJhY2t3YXJkcy4gSWYgdGhlIGZ1bmMKICAgICAqIHJldHVybnMgYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFJldmVyc2UoYXJ5LCBmdW5jKSB7CiAgICAgICAgaWYgKGFyeSkgewogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpID0gYXJ5Lmxlbmd0aCAtIDE7IGkgPiAtMTsgaSAtPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGFzUHJvcChvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBwcm9wKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRPd24ob2JqLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGhhc1Byb3Aob2JqLCBwcm9wKSAmJiBvYmpbcHJvcF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDeWNsZXMgb3ZlciBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhbmQgY2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaAogICAgICogcHJvcGVydHkgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLCB0aGVuIHRoZQogICAgICogaXRlcmF0aW9uIGlzIHN0b3BwZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2hQcm9wKG9iaiwgZnVuYykgewogICAgICAgIHZhciBwcm9wOwogICAgICAgIGZvciAocHJvcCBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKGhhc1Byb3Aob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgaWYgKGZ1bmMob2JqW3Byb3BdLCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2ltcGxlIGZ1bmN0aW9uIHRvIG1peCBpbiBwcm9wZXJ0aWVzIGZyb20gc291cmNlIGludG8gdGFyZ2V0LAogICAgICogYnV0IG9ubHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluKHRhcmdldCwgc291cmNlLCBmb3JjZSwgZGVlcFN0cmluZ01peGluKSB7CiAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICBlYWNoUHJvcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGZvcmNlIHx8ICFoYXNQcm9wKHRhcmdldCwgcHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcFN0cmluZ01peGluICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmICFpc0Z1bmN0aW9uKHZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHRhcmdldFtwcm9wXSwgdmFsdWUsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgLy9TaW1pbGFyIHRvIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBidXQgdGhlICd0aGlzJyBvYmplY3QgaXMgc3BlY2lmaWVkCiAgICAvL2ZpcnN0LCBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gcmVhZC9maWd1cmUgb3V0IHdoYXQgJ3RoaXMnIHdpbGwgYmUuCiAgICBmdW5jdGlvbiBiaW5kKG9iaiwgZm4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2NyaXB0cygpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGVycikgewogICAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICAvL0FsbG93IGdldHRpbmcgYSBnbG9iYWwgdGhhdCBpcyBleHByZXNzZWQgaW4KICAgIC8vZG90IG5vdGF0aW9uLCBsaWtlICdhLmIuYycuCiAgICBmdW5jdGlvbiBnZXRHbG9iYWwodmFsdWUpIHsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGcgPSBnbG9iYWw7CiAgICAgICAgZWFjaCh2YWx1ZS5zcGxpdCgnLicpLCBmdW5jdGlvbiAocGFydCkgewogICAgICAgICAgICBnID0gZ1twYXJ0XTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gZXJyb3Igd2l0aCBhIHBvaW50ZXIgdG8gYW4gVVJMIHdpdGggbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgZXJyb3IgSUQgdGhhdCBtYXBzIHRvIGFuIElEIG9uIGEgd2ViIHBhZ2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBodW1hbiByZWFkYWJsZSBlcnJvci4KICAgICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdIHRoZSBvcmlnaW5hbCBlcnJvciwgaWYgdGhlcmUgaXMgb25lLgogICAgICoKICAgICAqIEByZXR1cm5zIHtFcnJvcn0KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUVycm9yKGlkLCBtc2csIGVyciwgcmVxdWlyZU1vZHVsZXMpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cgKyAnXG5odHRwczovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCMnICsgaWQpOwogICAgICAgIGUucmVxdWlyZVR5cGUgPSBpZDsKICAgICAgICBlLnJlcXVpcmVNb2R1bGVzID0gcmVxdWlyZU1vZHVsZXM7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICBlLm9yaWdpbmFsRXJyb3IgPSBlcnI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vSWYgYSBkZWZpbmUgaXMgYWxyZWFkeSBpbiBwbGF5IHZpYSBhbm90aGVyIEFNRCBsb2FkZXIsCiAgICAgICAgLy9kbyBub3Qgb3ZlcndyaXRlLgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXF1aXJlanMpKSB7CiAgICAgICAgICAgIC8vRG8gbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyByZXF1aXJlanMgaW5zdGFuY2UuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2ZnID0gcmVxdWlyZWpzOwogICAgICAgIHJlcXVpcmVqcyA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICAvL0FsbG93IGZvciBhIHJlcXVpcmUgY29uZmlnIG9iamVjdAogICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNGdW5jdGlvbihyZXF1aXJlKSkgewogICAgICAgIC8vYXNzdW1lIGl0IGlzIGEgY29uZmlnIG9iamVjdC4KICAgICAgICBjZmcgPSByZXF1aXJlOwogICAgICAgIHJlcXVpcmUgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3Q29udGV4dChjb250ZXh0TmFtZSkgewogICAgICAgIHZhciBpbkNoZWNrTG9hZGVkLCBNb2R1bGUsIGNvbnRleHQsIGhhbmRsZXJzLAogICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCwKICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgLy9EZWZhdWx0cy4gRG8gbm90IHNldCBhIGRlZmF1bHQgZm9yIG1hcAogICAgICAgICAgICAgICAgLy9jb25maWcgdG8gc3BlZWQgdXAgbm9ybWFsaXplKCksIHdoaWNoCiAgICAgICAgICAgICAgICAvL3dpbGwgcnVuIGZhc3RlciBpZiB0aGVyZSBpcyBubyBkZWZhdWx0LgogICAgICAgICAgICAgICAgd2FpdFNlY29uZHM6IDcsCiAgICAgICAgICAgICAgICBiYXNlVXJsOiAnLi8nLAogICAgICAgICAgICAgICAgcGF0aHM6IHt9LAogICAgICAgICAgICAgICAgYnVuZGxlczoge30sCiAgICAgICAgICAgICAgICBwa2dzOiB7fSwKICAgICAgICAgICAgICAgIHNoaW06IHt9LAogICAgICAgICAgICAgICAgY29uZmlnOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdpc3RyeSA9IHt9LAogICAgICAgICAgICAvL3JlZ2lzdHJ5IG9mIGp1c3QgZW5hYmxlZCBtb2R1bGVzLCB0byBzcGVlZAogICAgICAgICAgICAvL2N5Y2xlIGJyZWFraW5nIGNvZGUgd2hlbiBsb3RzIG9mIG1vZHVsZXMKICAgICAgICAgICAgLy9hcmUgcmVnaXN0ZXJlZCwgYnV0IG5vdCBhY3RpdmF0ZWQuCiAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeSA9IHt9LAogICAgICAgICAgICB1bmRlZkV2ZW50cyA9IHt9LAogICAgICAgICAgICBkZWZRdWV1ZSA9IFtdLAogICAgICAgICAgICBkZWZpbmVkID0ge30sCiAgICAgICAgICAgIHVybEZldGNoZWQgPSB7fSwKICAgICAgICAgICAgYnVuZGxlc01hcCA9IHt9LAogICAgICAgICAgICByZXF1aXJlQ291bnRlciA9IDEsCiAgICAgICAgICAgIHVubm9ybWFsaXplZENvdW50ZXIgPSAxOwoKICAgICAgICAvKioKICAgICAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLgogICAgICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWUKICAgICAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcywKICAgICAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LAogICAgICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuCiAgICAgICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHsKICAgICAgICAgICAgdmFyIGksIHBhcnQ7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07CiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdCB0aGUgc3RhcnQsIG9yIHByZXZpb3VzIHZhbHVlIGlzIHN0aWxsIC4uLAogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlbSBzbyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCBpdCBtYXkKICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3b3JrIHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCwgZXZlbiB0aG91Z2gKICAgICAgICAgICAgICAgICAgICAvLyBhcyBhbiBJRCBpdCBpcyBsZXNzIHRoYW4gaWRlYWwuIEluIGxhcmdlciBwb2ludAogICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VzLCBtYXkgYmUgYmV0dGVyIHRvIGp1c3Qga2ljayBvdXQgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgKGkgPT09IDEgJiYgYXJ5WzJdID09PSAnLi4nKSB8fCBhcnlbaSAtIDFdID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpIC0gMSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGEgcmVsYXRpdmUgbW9kdWxlIG5hbWUsIGxpa2UgLi9zb21ldGhpbmcsIG5vcm1hbGl6ZSBpdCB0bwogICAgICAgICAqIGEgcmVhbCBuYW1lIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIHBhdGguCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHJlbGF0aXZlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZU5hbWUgYSByZWFsIG5hbWUgdGhhdCB0aGUgbmFtZSBhcmcgaXMgcmVsYXRpdmUKICAgICAgICAgKiB0by4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwIGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSB2YWx1ZS4gU2hvdWxkCiAgICAgICAgICogb25seSBiZSBkb25lIGlmIHRoaXMgbm9ybWFsaXphdGlvbiBpcyBmb3IgYSBkZXBlbmRlbmN5IElELgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG5vcm1hbGl6ZWQgbmFtZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSwgYXBwbHlNYXApIHsKICAgICAgICAgICAgdmFyIHBrZ01haW4sIG1hcFZhbHVlLCBuYW1lUGFydHMsIGksIGosIG5hbWVTZWdtZW50LCBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICBmb3VuZE1hcCwgZm91bmRJLCBmb3VuZFN0YXJNYXAsIHN0YXJJLCBub3JtYWxpemVkQmFzZVBhcnRzLAogICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gKGJhc2VOYW1lICYmIGJhc2VOYW1lLnNwbGl0KCcvJykpLAogICAgICAgICAgICAgICAgbWFwID0gY29uZmlnLm1hcCwKICAgICAgICAgICAgICAgIHN0YXJNYXAgPSBtYXAgJiYgbWFwWycqJ107CgogICAgICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbmFtZS5sZW5ndGggLSAxOwoKICAgICAgICAgICAgICAgIC8vIElmIHdhbnRpbmcgbm9kZSBJRCBjb21wYXRpYmlsaXR5LCBzdHJpcCAuanMgZnJvbSBlbmQKICAgICAgICAgICAgICAgIC8vIG9mIElEcy4gSGF2ZSB0byBkbyB0aGlzIGhlcmUsIGFuZCBub3QgaW4gbmFtZVRvVXJsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG5vZGUgYWxsb3dzIGVpdGhlciAuanMgb3Igbm9uIC5qcyB0byBtYXAKICAgICAgICAgICAgICAgIC8vIHRvIHNhbWUgZmlsZS4KICAgICAgICAgICAgICAgIGlmIChjb25maWcubm9kZUlkQ29tcGF0ICYmIGpzU3VmZml4UmVnRXhwLnRlc3QobmFtZVtsYXN0SW5kZXhdKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVbbGFzdEluZGV4XSA9IG5hbWVbbGFzdEluZGV4XS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCAnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gU3RhcnRzIHdpdGggYSAnLicgc28gbmVlZCB0aGUgYmFzZU5hbWUKICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdLmNoYXJBdCgwKSA9PT0gJy4nICYmIGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgIC8vQ29udmVydCBiYXNlTmFtZSB0byBhcnJheSwgYW5kIGxvcCBvZmYgdGhlIGxhc3QgcGFydCwKICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgLiBtYXRjaGVzIHRoYXQgJ2RpcmVjdG9yeScgYW5kIG5vdCBuYW1lIG9mIHRoZSBiYXNlTmFtZSdzCiAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUuIEZvciBpbnN0YW5jZSwgYmFzZU5hbWUgb2YgJ29uZS90d28vdGhyZWUnLCBtYXBzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8nb25lL3R3by90aHJlZS5qcycsIGJ1dCB3ZSB3YW50IHRoZSBkaXJlY3RvcnksICdvbmUvdHdvJyBmb3IKICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbm9ybWFsaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkQmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZEJhc2VQYXJ0cy5jb25jYXQobmFtZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJpbURvdHMobmFtZSk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5qb2luKCcvJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vQXBwbHkgbWFwIGNvbmZpZyBpZiBhdmFpbGFibGUuCiAgICAgICAgICAgIGlmIChhcHBseU1hcCAmJiBtYXAgJiYgKGJhc2VQYXJ0cyB8fCBzdGFyTWFwKSkgewogICAgICAgICAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLycpOwoKICAgICAgICAgICAgICAgIG91dGVyTG9vcDogZm9yIChpID0gbmFtZVBhcnRzLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVTZWdtZW50ID0gbmFtZVBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGxvbmdlc3QgYmFzZU5hbWUgc2VnbWVudCBtYXRjaCBpbiB0aGUgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAvL1NvLCBkbyBqb2lucyBvbiB0aGUgYmlnZ2VzdCB0byBzbWFsbGVzdCBsZW5ndGhzIG9mIGJhc2VQYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmFzZVBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwLCBiYXNlUGFydHMuc2xpY2UoMCwgaikuam9pbignLycpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Jhc2VOYW1lIHNlZ21lbnQgaGFzIGNvbmZpZywgZmluZCBpZiBpdCBoYXMgb25lIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZSA9IGdldE93bihtYXBWYWx1ZSwgbmFtZVNlZ21lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hdGNoLCB1cGRhdGUgbmFtZSB0byB0aGUgbmV3IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IG1hcFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlckxvb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBhIHN0YXIgbWFwIG1hdGNoLCBidXQganVzdCBob2xkIG9uIHRvIGl0LAogICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBzaG9ydGVyIHNlZ21lbnQgbWF0Y2ggbGF0ZXIgaW4gYSBtYXRjaGluZwogICAgICAgICAgICAgICAgICAgIC8vY29uZmlnLCB0aGVuIGZhdm9yIG92ZXIgdGhpcyBzdGFyIG1hcC4KICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU3Rhck1hcCAmJiBzdGFyTWFwICYmIGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdGFyTWFwID0gZ2V0T3duKHN0YXJNYXAsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhckkgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTWFwICYmIGZvdW5kU3Rhck1hcCkgewogICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwID0gZm91bmRTdGFyTWFwOwogICAgICAgICAgICAgICAgICAgIGZvdW5kSSA9IHN0YXJJOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hcCkgewogICAgICAgICAgICAgICAgICAgIG5hbWVQYXJ0cy5zcGxpY2UoMCwgZm91bmRJLCBmb3VuZE1hcCk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIHBvaW50cyB0byBhIHBhY2thZ2UncyBuYW1lLCB1c2UKICAgICAgICAgICAgLy8gdGhlIHBhY2thZ2UgbWFpbiBpbnN0ZWFkLgogICAgICAgICAgICBwa2dNYWluID0gZ2V0T3duKGNvbmZpZy5wa2dzLCBuYW1lKTsKCiAgICAgICAgICAgIHJldHVybiBwa2dNYWluID8gcGtnTWFpbiA6IG5hbWU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVTY3JpcHQobmFtZSkgewogICAgICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICBlYWNoKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpID09PSBuYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpID09PSBjb250ZXh0LmNvbnRleHROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhc1BhdGhGYWxsYmFjayhpZCkgewogICAgICAgICAgICB2YXIgcGF0aENvbmZpZyA9IGdldE93bihjb25maWcucGF0aHMsIGlkKTsKICAgICAgICAgICAgaWYgKHBhdGhDb25maWcgJiYgaXNBcnJheShwYXRoQ29uZmlnKSAmJiBwYXRoQ29uZmlnLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vUG9wIG9mZiB0aGUgZmlyc3QgYXJyYXkgdmFsdWUsIHNpbmNlIGl0IGZhaWxlZCwgYW5kCiAgICAgICAgICAgICAgICAvL3JldHJ5CiAgICAgICAgICAgICAgICBwYXRoQ29uZmlnLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUudW5kZWYoaWQpOwoKICAgICAgICAgICAgICAgIC8vQ3VzdG9tIHJlcXVpcmUgdGhhdCBkb2VzIG5vdCBkbyBtYXAgdHJhbnNsYXRpb24sIHNpbmNlCiAgICAgICAgICAgICAgICAvL0lEIGlzICJhYnNvbHV0ZSIsIGFscmVhZHkgbWFwcGVkL3Jlc29sdmVkLgogICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZShudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgc2tpcE1hcDogdHJ1ZQogICAgICAgICAgICAgICAgfSkoW2lkXSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vVHVybnMgYSBwbHVnaW4hcmVzb3VyY2UgdG8gW3BsdWdpbiwgcmVzb3VyY2VdCiAgICAgICAgLy93aXRoIHRoZSBwbHVnaW4gYmVpbmcgdW5kZWZpbmVkIGlmIHRoZSBuYW1lCiAgICAgICAgLy9kaWQgbm90IGhhdmUgYSBwbHVnaW4gcHJlZml4LgogICAgICAgIGZ1bmN0aW9uIHNwbGl0UHJlZml4KG5hbWUpIHsKICAgICAgICAgICAgdmFyIHByZWZpeCwKICAgICAgICAgICAgICAgIGluZGV4ID0gbmFtZSA/IG5hbWUuaW5kZXhPZignIScpIDogLTE7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG1vZHVsZSBtYXBwaW5nIHRoYXQgaW5jbHVkZXMgcGx1Z2luIHByZWZpeCwgbW9kdWxlCiAgICAgICAgICogbmFtZSwgYW5kIHBhdGguIElmIHBhcmVudE1vZHVsZU1hcCBpcyBwcm92aWRlZCBpdCB3aWxsCiAgICAgICAgICogYWxzbyBub3JtYWxpemUgdGhlIG5hbWUgdmlhIHJlcXVpcmUubm9ybWFsaXplKCkKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyZW50TW9kdWxlTWFwXSBwYXJlbnQgbW9kdWxlIG1hcAogICAgICAgICAqIGZvciB0aGUgbW9kdWxlIG5hbWUsIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBuYW1lcy4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTm9ybWFsaXplZDogaXMgdGhlIElEIGFscmVhZHkgbm9ybWFsaXplZC4KICAgICAgICAgKiBUaGlzIGlzIHRydWUgaWYgdGhpcyBjYWxsIGlzIGRvbmUgZm9yIGEgZGVmaW5lKCkgbW9kdWxlIElELgogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXBwbHlNYXA6IGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSBJRC4KICAgICAgICAgKiBTaG91bGQgb25seSBiZSB0cnVlIGlmIHRoaXMgbWFwIGlzIGZvciBhIGRlcGVuZGVuY3kuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1ha2VNb2R1bGVNYXAobmFtZSwgcGFyZW50TW9kdWxlTWFwLCBpc05vcm1hbGl6ZWQsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciB1cmwsIHBsdWdpbk1vZHVsZSwgc3VmZml4LCBuYW1lUGFydHMsCiAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsLAogICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE1vZHVsZU1hcCA/IHBhcmVudE1vZHVsZU1hcC5uYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZSA9IG5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZSA9IHRydWUsCiAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9ICcnOwoKICAgICAgICAgICAgLy9JZiBubyBuYW1lLCB0aGVuIGl0IG1lYW5zIGl0IGlzIGEgcmVxdWlyZSBjYWxsLCBnZW5lcmF0ZSBhbgogICAgICAgICAgICAvL2ludGVybmFsIG5hbWUuCiAgICAgICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG5hbWUgPSAnX0ByJyArIChyZXF1aXJlQ291bnRlciArPSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmFtZVBhcnRzID0gc3BsaXRQcmVmaXgobmFtZSk7CiAgICAgICAgICAgIHByZWZpeCA9IG5hbWVQYXJ0c1swXTsKICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKCiAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHByZWZpeCA9IG5vcm1hbGl6ZShwcmVmaXgsIHBhcmVudE5hbWUsIGFwcGx5TWFwKTsKICAgICAgICAgICAgICAgIHBsdWdpbk1vZHVsZSA9IGdldE93bihkZWZpbmVkLCBwcmVmaXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FjY291bnQgZm9yIHJlbGF0aXZlIHBhdGhzIGlmIHRoZXJlIGlzIGEgYmFzZSBuYW1lLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWZpeCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoYXQgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci4gSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb25seSBkbyBpdCBmb3IgZGVmaW5lKCknZCAgbW9kdWxlcy4gcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlaXIgY2FsbGJhY2tzICgjNjk5KS4gSG93ZXZlciBpZiBhIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbkVycm9yIGlzIHNldCwgdXNlIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZXZlbnRzLmVycm9yICYmIHRoaXMubWFwLmlzRGVmaW5lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGNvbnRleHQuZXhlY0NiKGlkLCBmYWN0b3J5LCBkZXBFeHBvcnRzLCBleHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXF1aXJlTWFwID0gdGhpcy5tYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gdGhpcy5tYXAuaXNEZWZpbmUgPyBbdGhpcy5tYXAuaWRdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKCh0aGlzLmVycm9yID0gZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgbGl0ZXJhbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGZhY3Rvcnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0cyA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuaXNEZWZpbmUgJiYgIXRoaXMuaWdub3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkW2lkXSA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5vblJlc291cmNlTG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNMb2FkTWFwcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xvYWRNYXBzLnB1c2goZGVwTWFwLm5vcm1hbGl6ZWRNYXAgfHwgZGVwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25SZXNvdXJjZUxvYWQoY29udGV4dCwgdGhpcy5tYXAsIHJlc0xvYWRNYXBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiB1cAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0ZpbmlzaGVkIHRoZSBkZWZpbmUgc3RhZ2UuIEFsbG93IGNhbGxpbmcgY2hlY2sgYWdhaW4KICAgICAgICAgICAgICAgICAgICAvL3RvIGFsbG93IGRlZmluZSBub3RpZmljYXRpb25zIGJlbG93IGluIHRoZSBjYXNlIG9mIGEKICAgICAgICAgICAgICAgICAgICAvL2N5Y2xlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmaW5lZCAmJiAhdGhpcy5kZWZpbmVFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVmaW5lZCcsIHRoaXMuZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdENvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2FsbFBsdWdpbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwLAogICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkLAogICAgICAgICAgICAgICAgICAgIC8vTWFwIGFscmVhZHkgbm9ybWFsaXplZCB0aGUgcHJlZml4LgogICAgICAgICAgICAgICAgICAgIHBsdWdpbk1hcCA9IG1ha2VNb2R1bGVNYXAobWFwLnByZWZpeCk7CgogICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGlzIHBsdWdpbiwgc28gaXQKICAgICAgICAgICAgICAgIC8vY2FuIGJlIHRyYWNlZCBmb3IgY3ljbGVzLgogICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gocGx1Z2luTWFwKTsKCiAgICAgICAgICAgICAgICBvbihwbHVnaW5NYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWQsIG5vcm1hbGl6ZWRNYXAsIG5vcm1hbGl6ZWRNb2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUlkID0gZ2V0T3duKGJ1bmRsZXNNYXAsIHRoaXMubWFwLmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMubWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSB0aGlzLm1hcC5wYXJlbnRNYXAgPyB0aGlzLm1hcC5wYXJlbnRNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobWFwLnBhcmVudE1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnVpbGRDYWxsYmFjazogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9JZiBjdXJyZW50IG1hcCBpcyBub3Qgbm9ybWFsaXplZCwgd2FpdCBmb3IgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplZCBuYW1lIHRvIGxvYWQgaW5zdGVhZCBvZiBjb250aW51aW5nLgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC51bm5vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIGlmIHRoZSBwbHVnaW4gYWxsb3dzIGl0LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLm5vcm1hbGl6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5ub3JtYWxpemUobmFtZSwgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlZml4IGFuZCBuYW1lIHNob3VsZCBhbHJlYWR5IGJlIG5vcm1hbGl6ZWQsIG5vIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgYXBwbHlpbmcgbWFwIGNvbmZpZyBhZ2FpbiBlaXRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXggKyAnIScgKyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5wYXJlbnRNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBvbihub3JtYWxpemVkTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLm5vcm1hbGl6ZWRNYXAgPSBub3JtYWxpemVkTWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBub3JtYWxpemVkTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRNb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKG5vcm1hbGl6ZWRNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2Qub24oJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2QuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSWYgYSBwYXRocyBjb25maWcsIHRoZW4ganVzdCBsb2FkIHRoYXQgZmlsZSBpbnN0ZWFkIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZXNvbHZlIHRoZSBwbHVnaW4sIGFzIGl0IGlzIGJ1aWx0IGludG8gdGhhdCBwYXRocyBsYXllci4KICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAudXJsID0gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGJpbmQodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGxvYWQuZXJyb3IgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGVtcCB1bm5vcm1hbGl6ZWQgbW9kdWxlcyBmb3IgdGhpcyBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHJlc29sdmVkIG90aGVyd2lzZSBub3cuCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLm1hcC5pZC5pbmRleE9mKGlkICsgJ191bm5vcm1hbGl6ZWQnKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuUmVnaXN0cnkobW9kLm1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL0FsbG93IHBsdWdpbnMgdG8gbG9hZCBvdGhlciBjb2RlIHdpdGhvdXQgaGF2aW5nIHRvIGtub3cgdGhlCiAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0IG9yIGhvdyB0byAnY29tcGxldGUnIHRoZSBsb2FkLgogICAgICAgICAgICAgICAgICAgIGxvYWQuZnJvbVRleHQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh0ZXh0LCB0ZXh0QWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtYXAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1hcCA9IG1ha2VNb2R1bGVNYXAobW9kdWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnRlcmFjdGl2ZSA9IHVzZUludGVyYWN0aXZlOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9BcyBvZiAyLjEuMCwgc3VwcG9ydCBqdXN0IHBhc3NpbmcgdGhlIHRleHQsIHRvIHJlaW5mb3JjZQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zyb21UZXh0IG9ubHkgYmVpbmcgY2FsbGVkIG9uY2UgcGVyIHJlc291cmNlLiBTdGlsbAogICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgb2xkIHN0eWxlIG9mIHBhc3NpbmcgbW9kdWxlTmFtZSBidXQgZGlzY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAvL3RoYXQgbW9kdWxlTmFtZSBpbiBmYXZvciBvZiB0aGUgaW50ZXJuYWwgcmVmLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRBbHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vVHVybiBvZmYgaW50ZXJhY3RpdmUgc2NyaXB0IG1hdGNoaW5nIGZvciBJRSBmb3IgYW55IGRlZmluZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGxzIGluIHRoZSB0ZXh0LCB0aGVuIHR1cm4gaXQgYmFjayBvbiBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJpbWUgdGhlIHN5c3RlbSBieSBjcmVhdGluZyBhIG1vZHVsZSBpbnN0YW5jZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy9pdC4KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1vZHVsZU1hcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1RyYW5zZmVyIGFueSBjb25maWcgdG8gdGhpcyBvdGhlciBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wKGNvbmZpZy5jb25maWcsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbmZpZ1ttb2R1bGVOYW1lXSA9IGNvbmZpZy5jb25maWdbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmV4ZWModGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignZnJvbXRleHRldmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21UZXh0IGV2YWwgZm9yICcgKyBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBmYWlsZWQ6ICcgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwb3J0IGFub255bW91cyBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCB0aGUgdmFsdWUgb2YgdGhhdCBtb2R1bGUgdG8gdGhlIHZhbHVlIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZShbbW9kdWxlTmFtZV0sIGxvYWQpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL1VzZSBwYXJlbnROYW1lIGhlcmUgc2luY2UgdGhlIHBsdWdpbidzIG5hbWUgaXMgbm90IHJlbGlhYmxlLAogICAgICAgICAgICAgICAgICAgIC8vY291bGQgYmUgc29tZSB3ZWlyZCBzdHJpbmcgd2l0aCBubyBwYXRoIHRoYXQgYWN0dWFsbHkgd2FudHMgdG8KICAgICAgICAgICAgICAgICAgICAvL3JlZmVyZW5jZSB0aGUgcGFyZW50TmFtZSdzIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQobWFwLm5hbWUsIGxvY2FsUmVxdWlyZSwgbG9hZCwgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXBzW3BsdWdpbk1hcC5pZF0gPSBwbHVnaW5NYXA7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeVt0aGlzLm1hcC5pZF0gPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL1NldCBmbGFnIG1lbnRpb25pbmcgdGhhdCB0aGUgbW9kdWxlIGlzIGVuYWJsaW5nLAogICAgICAgICAgICAgICAgLy9zbyB0aGF0IGltbWVkaWF0ZSBjYWxscyB0byB0aGUgZGVmaW5lZCBjYWxsYmFja3MKICAgICAgICAgICAgICAgIC8vZm9yIGRlcGVuZGVuY2llcyBkbyBub3QgdHJpZ2dlciBpbmFkdmVydGVudCBsb2FkCiAgICAgICAgICAgICAgICAvL3dpdGggdGhlIGRlcENvdW50IHN0aWxsIGJlaW5nIHplcm8uCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1vZCwgaGFuZGxlcjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBNYXAgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVwZW5kZW5jeSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBkZXBNYXAKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgd2lyZWQgdXAgdG8gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1hcC5pc0RlZmluZSA/IHRoaXMubWFwIDogdGhpcy5tYXAucGFyZW50TWFwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5za2lwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzW2ldID0gZGVwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldE93bihoYW5kbGVycywgZGVwTWFwLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBoYW5kbGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcENvdW50ICs9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwRXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudW5kZWZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRGVwKGksIGRlcEV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lcnJiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgdGhpcy5lcnJiYWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdCBlcnJiYWNrIG9uIHRoaXMgbW9kdWxlLCBidXQgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGlzIGxpc3RlbmluZyBmb3IgZXJyb3JzLCBzbyBiZSBzdXJlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uKGRlcE1hcCwgJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWQgPSBkZXBNYXAuaWQ7CiAgICAgICAgICAgICAgICAgICAgbW9kID0gcmVnaXN0cnlbaWRdOwoKICAgICAgICAgICAgICAgICAgICAvL1NraXAgc3BlY2lhbCBtb2R1bGVzIGxpa2UgJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnCiAgICAgICAgICAgICAgICAgICAgLy9BbHNvLCBkb24ndCBjYWxsIGVuYWJsZSBpZiBpdCBpcyBhbHJlYWR5IGVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjYXNlcy4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoaGFuZGxlcnMsIGlkKSAmJiBtb2QgJiYgIW1vZC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5hYmxlKGRlcE1hcCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIC8vRW5hYmxlIGVhY2ggcGx1Z2luIHRoYXQgaXMgdXNlZCBpbgogICAgICAgICAgICAgICAgLy9hIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2hQcm9wKHRoaXMucGx1Z2luTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgcGx1Z2luTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgb246IGZ1bmN0aW9uIChuYW1lLCBjYikgewogICAgICAgICAgICAgICAgdmFyIGNicyA9IHRoaXMuZXZlbnRzW25hbWVdOwogICAgICAgICAgICAgICAgaWYgKCFjYnMpIHsKICAgICAgICAgICAgICAgICAgICBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2JzLnB1c2goY2IpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKG5hbWUsIGV2dCkgewogICAgICAgICAgICAgICAgZWFjaCh0aGlzLmV2ZW50c1tuYW1lXSwgZnVuY3Rpb24gKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoZXZ0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAvL05vdyB0aGF0IHRoZSBlcnJvciBoYW5kbGVyIHdhcyB0cmlnZ2VyZWQsIHJlbW92ZQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGxpc3RlbmVycywgc2luY2UgdGhpcyBicm9rZW4gTW9kdWxlIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgLy9jYW4gc3RheSBhcm91bmQgZm9yIGEgd2hpbGUgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNhbGxHZXRNb2R1bGUoYXJncykgewogICAgICAgICAgICAvL1NraXAgbW9kdWxlcyBhbHJlYWR5IGRlZmluZWQuCiAgICAgICAgICAgIGlmICghaGFzUHJvcChkZWZpbmVkLCBhcmdzWzBdKSkgewogICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAoYXJnc1swXSwgbnVsbCwgdHJ1ZSkpLmluaXQoYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGZ1bmMsIG5hbWUsIGllTmFtZSkgewogICAgICAgICAgICAvL0Zhdm9yIGRldGFjaEV2ZW50IGJlY2F1c2Ugb2YgSUU5CiAgICAgICAgICAgIC8vaXNzdWUsIHNlZSBhdHRhY2hFdmVudC9hZGRFdmVudExpc3RlbmVyIGNvbW1lbnQgZWxzZXdoZXJlCiAgICAgICAgICAgIC8vaW4gdGhpcyBmaWxlLgogICAgICAgICAgICBpZiAobm9kZS5kZXRhY2hFdmVudCAmJiAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IsIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgICAgIC8vdXNlZnVsIHRvIGtub3cuCiAgICAgICAgICAgICAgICBpZiAoaWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXRhY2hFdmVudChpZU5hbWUsIGZ1bmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYW4gZXZlbnQgZnJvbSBhIHNjcmlwdCBub2RlLCBnZXQgdGhlIHJlcXVpcmVqcyBpbmZvIGZyb20gaXQsCiAgICAgICAgICogYW5kIHRoZW4gcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBub2RlLgogICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dAogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2NyaXB0RGF0YShldnQpIHsKICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAvL2FsbCBvbGQgYnJvd3NlcnMgd2lsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG9uZSB3YXMgZWFzeSBlbm91Z2gKICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgdmFyIG5vZGUgPSBldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudDsKCiAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb25jZSBoZXJlLgogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgJ2xvYWQnLCAnb25yZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNvbnRleHQub25TY3JpcHRFcnJvciwgJ2Vycm9yJyk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgICAgIGlkOiBub2RlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW50YWtlRGVmaW5lcygpIHsKICAgICAgICAgICAgdmFyIGFyZ3M7CgogICAgICAgICAgICAvL0FueSBkZWZpbmVkIG1vZHVsZXMgaW4gdGhlIGdsb2JhbCBxdWV1ZSwgaW50YWtlIHRoZW0gbm93LgogICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgIC8vTWFrZSBzdXJlIGFueSByZW1haW5pbmcgZGVmUXVldWUgaXRlbXMgZ2V0IHByb3Blcmx5IHByb2Nlc3NlZC4KICAgICAgICAgICAgd2hpbGUgKGRlZlF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignbWlzbWF0Y2gnLCAnTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vYXJncyBhcmUgaWQsIGRlcHMsIGZhY3RvcnkuIFNob3VsZCBiZSBub3JtYWxpemVkIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lKCkgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwID0ge307CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0ID0gewogICAgICAgICAgICBjb25maWc6IGNvbmZpZywKICAgICAgICAgICAgY29udGV4dE5hbWU6IGNvbnRleHROYW1lLAogICAgICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksCiAgICAgICAgICAgIGRlZmluZWQ6IGRlZmluZWQsCiAgICAgICAgICAgIHVybEZldGNoZWQ6IHVybEZldGNoZWQsCiAgICAgICAgICAgIGRlZlF1ZXVlOiBkZWZRdWV1ZSwKICAgICAgICAgICAgZGVmUXVldWVNYXA6IHt9LAogICAgICAgICAgICBNb2R1bGU6IE1vZHVsZSwKICAgICAgICAgICAgbWFrZU1vZHVsZU1hcDogbWFrZU1vZHVsZU1hcCwKICAgICAgICAgICAgbmV4dFRpY2s6IHJlcS5uZXh0VGljaywKICAgICAgICAgICAgb25FcnJvcjogb25FcnJvciwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGV4dC4KICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWcgb2JqZWN0IHRvIGludGVncmF0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24gKGNmZykgewogICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhlIGJhc2VVcmwgZW5kcyBpbiBhIHNsYXNoLgogICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsLmNoYXJBdChjZmcuYmFzZVVybC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsICs9ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ29udmVydCBvbGQgc3R5bGUgdXJsQXJncyBzdHJpbmcgdG8gYSBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2ZnLnVybEFyZ3MgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybEFyZ3MgPSBjZmcudXJsQXJnczsKICAgICAgICAgICAgICAgICAgICBjZmcudXJsQXJncyA9IGZ1bmN0aW9uKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9TYXZlIG9mZiB0aGUgcGF0aHMgc2luY2UgdGhleSByZXF1aXJlIHNwZWNpYWwgcHJvY2Vzc2luZywKICAgICAgICAgICAgICAgIC8vdGhleSBhcmUgYWRkaXRpdmUuCiAgICAgICAgICAgICAgICB2YXIgc2hpbSA9IGNvbmZpZy5zaGltLAogICAgICAgICAgICAgICAgICAgIG9ianMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2Jqc1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4oY29uZmlnW3Byb3BdLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9SZXZlcnNlIG1hcCB0aGUgYnVuZGxlcwogICAgICAgICAgICAgICAgaWYgKGNmZy5idW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLmJ1bmRsZXMsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzTWFwW3ZdID0gcHJvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9NZXJnZSBzaGltCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnNoaW0pIHsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChjZmcuc2hpbSwgZnVuY3Rpb24gKHZhbHVlLCBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSB0aGUgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZS5leHBvcnRzIHx8IHZhbHVlLmluaXQpICYmICF2YWx1ZS5leHBvcnRzRm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cG9ydHNGbiA9IGNvbnRleHQubWFrZVNoaW1FeHBvcnRzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzaGltW2lkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaGltID0gc2hpbTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0FkanVzdCBwYWNrYWdlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaChjZmcucGFja2FnZXMsIGZ1bmN0aW9uIChwa2dPYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uLCBuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGtnT2JqID0gdHlwZW9mIHBrZ09iaiA9PT0gJ3N0cmluZycgPyB7bmFtZTogcGtnT2JqfSA6IHBrZ09iajsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwa2dPYmoubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBwa2dPYmoubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW25hbWVdID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1NhdmUgcG9pbnRlciB0byBtYWluIG1vZHVsZSBJRCBmb3IgcGtnIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIGxlYWRpbmcgZG90IGluIG1haW4sIHNvIG1haW4gcGF0aHMgYXJlIG5vcm1hbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHJlbW92ZSBhbnkgdHJhaWxpbmcgLmpzLCBzaW5jZSBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAvL2VudnMgaGF2ZSBkaWZmZXJlbnQgY29udmVudGlvbnM6IHNvbWUgdXNlIGEgbW9kdWxlIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc29tZSB1c2UgYSBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wa2dzW25hbWVdID0gcGtnT2JqLm5hbWUgKyAnLycgKyAocGtnT2JqLm1haW4gfHwgJ21haW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgYXJlIGFueSAid2FpdGluZyB0byBleGVjdXRlIiBtb2R1bGVzIGluIHRoZSByZWdpc3RyeSwKICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBtYXBzIGZvciB0aGVtLCBzaW5jZSB0aGVpciBpbmZvLCBsaWtlIFVSTHMgdG8gbG9hZCwKICAgICAgICAgICAgICAgIC8vbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kLCBpZCkgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbW9kdWxlIGFscmVhZHkgaGFzIGluaXQgY2FsbGVkLCBzaW5jZSBpdCBpcyB0b28KICAgICAgICAgICAgICAgICAgICAvL2xhdGUgdG8gbW9kaWZ5IHRoZW0sIGFuZCBpZ25vcmUgdW5ub3JtYWxpemVkIG9uZXMKICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgYXJlIHRyYW5zaWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZC5pbml0ZWQgJiYgIW1vZC5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5tYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL0lmIGEgZGVwcyBhcnJheSBvciBhIGNvbmZpZyBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHRoZW4gY2FsbAogICAgICAgICAgICAgICAgLy9yZXF1aXJlIHdpdGggdGhvc2UgYXJncy4gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXF1aXJlIGlzIGRlZmluZWQgYXMgYQogICAgICAgICAgICAgICAgLy9jb25maWcgb2JqZWN0IGJlZm9yZSByZXF1aXJlLmpzIGlzIGxvYWRlZC4KICAgICAgICAgICAgICAgIGlmIChjZmcuZGVwcyB8fCBjZmcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUoY2ZnLmRlcHMgfHwgW10sIGNmZy5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBtYWtlU2hpbUV4cG9ydHM6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gZm4oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldDsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5pdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB2YWx1ZS5pbml0LmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCB8fCAodmFsdWUuZXhwb3J0cyAmJiBnZXRHbG9iYWwodmFsdWUuZXhwb3J0cykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVJlcXVpcmU6IGZ1bmN0aW9uIChyZWxNYXAsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxvY2FsUmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCwgbWFwLCByZXF1aXJlTW9kOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVCdWlsZENhbGxiYWNrICYmIGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLl9fcmVxdWlyZUpzQnVpbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3JlcXVpcmVhcmdzJywgJ0ludmFsaWQgcmVxdWlyZSBjYWxsJyksIGVycmJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHJlcXVpcmV8ZXhwb3J0c3xtb2R1bGUgYXJlIHJlcXVlc3RlZCwgZ2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlIGZvciB0aGVtIGZyb20gdGhlIHNwZWNpYWwgaGFuZGxlcnMuIENhdmVhdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG9ubHkgd29ya3Mgd2hpbGUgbW9kdWxlIGlzIGJlaW5nIGRlZmluZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxNYXAgJiYgaGFzUHJvcChoYW5kbGVycywgZGVwcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyc1tkZXBzXShyZWdpc3RyeVtyZWxNYXAuaWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TeW5jaHJvbm91cyBhY2Nlc3MgdG8gb25lIG1vZHVsZS4gSWYgcmVxdWlyZS5nZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy9hdmFpbGFibGUgKGFzIGluIHRoZSBOb2RlIGFkYXB0ZXIpLCBwcmVmZXIgdGhhdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5nZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXEuZ2V0KGNvbnRleHQsIGRlcHMsIHJlbE1hcCwgbG9jYWxSZXF1aXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgbW9kdWxlIG5hbWUsIGlmIGl0IGNvbnRhaW5zIC4gb3IgLi4KICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbWFrZU1vZHVsZU1hcChkZXBzLCByZWxNYXAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vdGxvYWRlZCcsICdNb2R1bGUgbmFtZSAiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCBmb3IgY29udGV4dDogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsTWFwID8gJycgOiAnLiBVc2UgcmVxdWlyZShbXSknKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vR3JhYiBkZWZpbmVzIHdhaXRpbmcgaW4gdGhlIGdsb2JhbCBxdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vTWFyayBhbGwgdGhlIGRlcGVuZGVuY2llcyBhcyBuZWVkaW5nIHRvIGJlIGxvYWRlZC4KICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Tb21lIGRlZmluZXMgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCwgY29sbGVjdCB0aGVtLgogICAgICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kID0gZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAobnVsbCwgcmVsTWFwKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1N0b3JlIGlmIG1hcCBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyByZXF1aXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsbCBmb3IgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLnNraXBNYXAgPSBvcHRpb25zLnNraXBNYXA7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLmluaXQoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxSZXF1aXJlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1peGluKGxvY2FsUmVxdWlyZSwgewogICAgICAgICAgICAgICAgICAgIGlzQnJvd3NlcjogaXNCcm93c2VyLAoKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0cyBhIG1vZHVsZSBuYW1lICsgLmV4dGVuc2lvbiBpbnRvIGFuIFVSTCBwYXRoLgogICAgICAgICAgICAgICAgICAgICAqICpSZXF1aXJlcyogdGhlIHVzZSBvZiBhIG1vZHVsZSBuYW1lLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgICAgICAgICAgICogcGxhaW4gVVJMcyBsaWtlIG5hbWVUb1VybC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0b1VybDogZnVuY3Rpb24gKG1vZHVsZU5hbWVQbHVzRXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1vZHVsZU5hbWVQbHVzRXh0Lmxhc3RJbmRleE9mKCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3BsaXQoJy8nKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVsYXRpdmUgPSBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudCA9PT0gJy4uJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSGF2ZSBhIGZpbGUgZXh0ZW5zaW9uIGFsaWFzLCBhbmQgaXQgaXMgbm90IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL2RvdHMgZnJvbSBhIHJlbGF0aXZlIHBhdGguCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgKCFpc1JlbGF0aXZlIHx8IGluZGV4ID4gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZyhpbmRleCwgbW9kdWxlTmFtZVBsdXNFeHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVQbHVzRXh0ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZShtb2R1bGVOYW1lUGx1c0V4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsTWFwICYmIHJlbE1hcC5pZCwgdHJ1ZSksIGV4dCwgIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIGRlZmluZWQ6IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJvcChkZWZpbmVkLCBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgaWQpIHx8IGhhc1Byb3AocmVnaXN0cnksIGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL09ubHkgYWxsb3cgdW5kZWYgb24gdG9wIGxldmVsIHJlcXVpcmUgY2FsbHMKICAgICAgICAgICAgICAgIGlmICghcmVsTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXF1aXJlLnVuZGVmID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCBhbnkgd2FpdGluZyBkZWZpbmUoKSBjYWxscyB0byB0aGlzIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZml4IGZvciAjNDA4CiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1ha2VNb2R1bGVNYXAoaWQsIHJlbE1hcCwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC51bmRlZmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2NyaXB0KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHVybEZldGNoZWRbbWFwLnVybF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1bmRlZkV2ZW50c1tpZF07CgogICAgICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHF1ZXVlZCBkZWZpbmVzIHRvby4gR28gYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaW4gYXJyYXkgc28gdGhhdCB0aGUgc3BsaWNlcyBkbyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy9tZXNzIHVwIHRoZSBpdGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hSZXZlcnNlKGRlZlF1ZXVlLCBmdW5jdGlvbihhcmdzLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hvbGQgb24gdG8gbGlzdGVuZXJzIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21vZHVsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSByZWxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBhIGRpZmZlcmVudCBjb25maWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZFdmVudHNbaWRdID0gbW9kLmV2ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgdG8gZW5hYmxlIGEgbW9kdWxlIGlmIGl0IGlzIHN0aWxsIGluIHRoZSByZWdpc3RyeQogICAgICAgICAgICAgKiBhd2FpdGluZyBlbmFibGVtZW50LiBBIHNlY29uZCBhcmcsIHBhcmVudCwgdGhlIHBhcmVudCBtb2R1bGUsCiAgICAgICAgICAgICAqIGlzIHBhc3NlZCBpbiBmb3IgY29udGV4dCwgd2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5CiAgICAgICAgICAgICAqIHRoZSBvcHRpbWl6ZXIuIE5vdCBzaG93biBoZXJlIHRvIGtlZXAgY29kZSBjb21wYWN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBkZXBNYXAuaWQpOwogICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShkZXBNYXApLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGVudmlyb25tZW50IGFkYXB0ZXJzIHRvIGNvbXBsZXRlIGEgbG9hZCBldmVudC4KICAgICAgICAgICAgICogQSBsb2FkIGV2ZW50IGNvdWxkIGJlIGEgc2NyaXB0IGxvYWQgb3IganVzdCBhIGxvYWQgcGFzcyBmcm9tIGEgc3luY2hyb25vdXMKICAgICAgICAgICAgICogbG9hZCBjYWxsLgogICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHBvdGVudGlhbGx5IGNvbXBsZXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29tcGxldGVMb2FkOiBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgdmFyIGZvdW5kLCBhcmdzLCBtb2QsCiAgICAgICAgICAgICAgICAgICAgc2hpbSA9IGdldE93bihjb25maWcuc2hpbSwgbW9kdWxlTmFtZSkgfHwge30sCiAgICAgICAgICAgICAgICAgICAgc2hFeHBvcnRzID0gc2hpbS5leHBvcnRzOwoKICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBhcmdzID0gZGVmUXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gbW9kdWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbHJlYWR5IGZvdW5kIGFuIGFub255bW91cyBtb2R1bGUgYW5kIGJvdW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gdGhpcyBuYW1lLCB0aGVuIHRoaXMgaXMgc29tZSBvdGhlciBhbm9uIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAvL3dhaXRpbmcgZm9yIGl0cyBjb21wbGV0ZUxvYWQgdG8gZmlyZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzWzBdID09PSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRm91bmQgbWF0Y2hpbmcgZGVmaW5lIGNhbGwgZm9yIHRoaXMgc2NyaXB0IQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsR2V0TW9kdWxlKGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vRG8gdGhpcyBhZnRlciB0aGUgY3ljbGUgb2YgY2FsbEdldE1vZHVsZSBpbiBjYXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgIC8vb2YgdGhvc2UgY2FsbHMvaW5pdCBjYWxscyBjaGFuZ2VzIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiAhaGFzUHJvcChkZWZpbmVkLCBtb2R1bGVOYW1lKSAmJiBtb2QgJiYgIW1vZC5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmVuZm9yY2VEZWZpbmUgJiYgKCFzaEV4cG9ydHMgfHwgIWdldEdsb2JhbChzaEV4cG9ydHMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGF0aEZhbGxiYWNrKG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vZGVmaW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGRlZmluZSBjYWxsIGZvciAnICsgbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL0Egc2NyaXB0IHRoYXQgZG9lcyBub3QgY2FsbCBkZWZpbmUoKSwgc28ganVzdCBzaW11bGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBjYWxsIGZvciBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShbbW9kdWxlTmFtZSwgKHNoaW0uZGVwcyB8fCBbXSksIHNoaW0uZXhwb3J0c0ZuXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSB0byBhIGZpbGUgcGF0aC4gU3VwcG9ydHMgY2FzZXMgd2hlcmUKICAgICAgICAgICAgICogbW9kdWxlTmFtZSBtYXkgYWN0dWFsbHkgYmUganVzdCBhbiBVUkwuCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCBpdCAqKmRvZXMgbm90KiogY2FsbCBub3JtYWxpemUgb24gdGhlIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAqIGl0IGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gbm9ybWFsaXplZC4gVGhpcyBpcyBhbgogICAgICAgICAgICAgKiBpbnRlcm5hbCBBUEksIG5vdCBhIHB1YmxpYyBvbmUuIFVzZSB0b1VybCBmb3IgdGhlIHB1YmxpYyBBUEkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuYW1lVG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCBleHQsIHNraXBFeHQpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRocywgc3ltcywgaSwgcGFyZW50TW9kdWxlLCB1cmwsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCwgYnVuZGxlSWQsCiAgICAgICAgICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKHBrZ01haW4pIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gcGtnTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCBtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQsIGV4dCwgc2tpcEV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9JZiBhIGNvbG9uIGlzIGluIHRoZSBVUkwsIGl0IGluZGljYXRlcyBhIHByb3RvY29sIGlzIHVzZWQgYW5kIGl0IGlzIGp1c3QKICAgICAgICAgICAgICAgIC8vYW4gVVJMIHRvIGEgZmlsZSwgb3IgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCwgY29udGFpbnMgYSBxdWVyeSBhcmcgKGkuZS4gPykKICAgICAgICAgICAgICAgIC8vb3IgZW5kcyB3aXRoIC5qcywgdGhlbiBhc3N1bWUgdGhlIHVzZXIgbWVhbnQgdG8gdXNlIGFuIHVybCBhbmQgbm90IGEgbW9kdWxlIGlkLgogICAgICAgICAgICAgICAgLy9UaGUgc2xhc2ggaXMgaW1wb3J0YW50IGZvciBwcm90b2NvbC1sZXNzIFVSTHMgYXMgd2VsbCBhcyBmdWxsIHBhdGhzLgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgcGxhaW4gcGF0aCwgbm90IG1vZHVsZSBuYW1lIGxvb2t1cCwgc28ganVzdCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgLy9BZGQgZXh0ZW5zaW9uIGlmIGl0IGlzIGluY2x1ZGVkLiBUaGlzIGlzIGEgYml0IHdvbmt5LCBvbmx5IG5vbi0uanMgdGhpbmdzIHBhc3MKICAgICAgICAgICAgICAgICAgICAvL2FuIGV4dGVuc2lvbiwgdGhpcyBtZXRob2QgcHJvYmFibHkgbmVlZHMgdG8gYmUgcmV3b3JrZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gbW9kdWxlTmFtZSArIChleHQgfHwgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0EgbW9kdWxlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aC4KICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGNvbmZpZy5wYXRoczsKCiAgICAgICAgICAgICAgICAgICAgc3ltcyA9IG1vZHVsZU5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAvL0ZvciBlYWNoIG1vZHVsZSBuYW1lIHNlZ21lbnQsIHNlZSBpZiB0aGVyZSBpcyBhIHBhdGgKICAgICAgICAgICAgICAgICAgICAvL3JlZ2lzdGVyZWQgZm9yIGl0LiBTdGFydCB3aXRoIG1vc3Qgc3BlY2lmaWMgbmFtZQogICAgICAgICAgICAgICAgICAgIC8vYW5kIHdvcmsgdXAgZnJvbSBpdC4KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzeW1zLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2R1bGUgPSBzeW1zLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBnZXRPd24ocGF0aHMsIHBhcmVudE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGFuIGFycmF5LCBpdCBtZWFucyB0aGVyZSBhcmUgYSBmZXcgY2hvaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hvb3NlIHRoZSBvbmUgdGhhdCBpcyBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShwYXJlbnRQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXJlbnRQYXRoWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5zcGxpY2UoMCwgaSwgcGFyZW50UGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9Kb2luIHRoZSBwYXRoIHBhcnRzIHRvZ2V0aGVyLCB0aGVuIGZpZ3VyZSBvdXQgaWYgYmFzZVVybCBpcyBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gc3ltcy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdXJsICs9IChleHQgfHwgKC9eZGF0YVw6fF5ibG9iXDp8XD8vLnRlc3QodXJsKSB8fCBza2lwRXh0ID8gJycgOiAnLmpzJykpOwogICAgICAgICAgICAgICAgICAgIHVybCA9ICh1cmwuY2hhckF0KDApID09PSAnLycgfHwgdXJsLm1hdGNoKC9eW1x3XCtcLlwtXSs6LykgPyAnJyA6IGNvbmZpZy5iYXNlVXJsKSArIHVybDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLnVybEFyZ3MgJiYgIS9eYmxvYlw6Ly50ZXN0KHVybCkgPwogICAgICAgICAgICAgICAgICAgICAgIHVybCArIGNvbmZpZy51cmxBcmdzKG1vZHVsZU5hbWUsIHVybCkgOiB1cmw7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0RlbGVnYXRlcyB0byByZXEubG9hZC4gQnJva2VuIG91dCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAgIC8vYWxsb3cgb3ZlcnJpZGluZyBpbiB0aGUgb3B0aW1pemVyLgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoaWQsIHVybCkgewogICAgICAgICAgICAgICAgcmVxLmxvYWQoY29udGV4dCwgaWQsIHVybCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXhlY3V0ZXMgYSBtb2R1bGUgY2FsbGJhY2sgZnVuY3Rpb24uIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgKiBzb2xlbHkgdG8gYWxsb3cgdGhlIGJ1aWxkIHN5c3RlbSB0byBzZXF1ZW5jZSB0aGUgZmlsZXMgaW4gdGhlIGJ1aWx0CiAgICAgICAgICAgICAqIGxheWVyIGluIHRoZSByaWdodCBzZXF1ZW5jZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV4ZWNDYjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBhcmdzLCBleHBvcnRzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoZXhwb3J0cywgYXJncyk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogY2FsbGJhY2sgZm9yIHNjcmlwdCBsb2FkcywgdXNlZCB0byBjaGVjayBzdGF0dXMgb2YgbG9hZGluZy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZ0IHRoZSBldmVudCBmcm9tIHRoZSBicm93c2VyIGZvciB0aGUgc2NyaXB0CiAgICAgICAgICAgICAqIHRoYXQgd2FzIGxvYWRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0TG9hZDogZnVuY3Rpb24gKGV2dCkgewogICAgICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgICAgICAvL3RvIHN1cHBvcnQgYW5kIHN0aWxsIG1ha2VzIHNlbnNlLgogICAgICAgICAgICAgICAgaWYgKGV2dC50eXBlID09PSAnbG9hZCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWR5UmVnRXhwLnRlc3QoKGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50KS5yZWFkeVN0YXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAvL1Jlc2V0IGludGVyYWN0aXZlIHNjcmlwdCBzbyBhIHNjcmlwdCBub2RlIGlzIG5vdCBoZWxkIG9udG8gZm9yCiAgICAgICAgICAgICAgICAgICAgLy90byBsb25nLgogICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlU2NyaXB0ID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG91dCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChkYXRhLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igc2NyaXB0IGVycm9ycy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0RXJyb3I6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZ2V0U2NyaXB0RGF0YShldnQpOwogICAgICAgICAgICAgICAgaWYgKCFoYXNQYXRoRmFsbGJhY2soZGF0YS5pZCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX0ByJykgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godmFsdWUuZGVwTWFwcywgZnVuY3Rpb24oZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcE1hcC5pZCA9PT0gZGF0YS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVpcmVqcy9yZXF1aXJlanMvaXNzdWVzLzE4NwogICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgY2FuIE5PVCBmaW5kIFtuYXRpdmUgY29kZV0gdGhlbiBpdCBtdXN0IE5PVCBuYXRpdmVseSBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgLy9pbiBJRTgsIG5vZGUuYXR0YWNoRXZlbnQgZG9lcyBub3QgaGF2ZSB0b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgLy9Ob3RlIHRoZSB0ZXN0IGZvciAiW25hdGl2ZSBjb2RlIiB3aXRoIG5vIGNsb3NpbmcgYnJhY2UsIHNlZToKICAgICAgICAgICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2lzc3Vlcy8yNzMKICAgICAgICAgICAgICAgICAgICAhKG5vZGUuYXR0YWNoRXZlbnQudG9TdHJpbmcgJiYgbm9kZS5hdHRhY2hFdmVudC50b1N0cmluZygpLmluZGV4T2YoJ1tuYXRpdmUgY29kZScpIDwgMCkgJiYKICAgICAgICAgICAgICAgICAgICAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSUUgKGF0IGxlYXN0IDYtOCkgZG8gbm90IGZpcmUKICAgICAgICAgICAgICAgIC8vc2NyaXB0IG9ubG9hZCByaWdodCBhZnRlciBleGVjdXRpbmcgdGhlIHNjcmlwdCwgc28KICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IHRpZSB0aGUgYW5vbnltb3VzIGRlZmluZSBjYWxsIHRvIGEgbmFtZS4KICAgICAgICAgICAgICAgIC8vSG93ZXZlciwgSUUgcmVwb3J0cyB0aGUgc2NyaXB0IGFzIGJlaW5nIGluICdpbnRlcmFjdGl2ZScKICAgICAgICAgICAgICAgIC8vcmVhZHlTdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgZGVmaW5lIGNhbGwuCiAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IHRydWU7CgogICAgICAgICAgICAgICAgbm9kZS5hdHRhY2hFdmVudCgnb25yZWFkeXN0YXRlY2hhbmdlJywgY29udGV4dC5vblNjcmlwdExvYWQpOwogICAgICAgICAgICAgICAgLy9JdCB3b3VsZCBiZSBncmVhdCB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciBoZXJlIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAvLzQwNHMgaW4gSUU5Ky4gSG93ZXZlciwgb25yZWFkeXN0YXRlY2hhbmdlIHdpbGwgZmlyZSBiZWZvcmUKICAgICAgICAgICAgICAgIC8vdGhlIGVycm9yIGhhbmRsZXIsIHNvIHRoYXQgZG9lcyBub3QgaGVscC4gSWYgYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgLy9pcyB1c2VkLCB0aGVuIElFIHdpbGwgZmlyZSBlcnJvciBiZWZvcmUgbG9hZCwgYnV0IHdlIGNhbm5vdAogICAgICAgICAgICAgICAgLy91c2UgdGhhdCBwYXRod2F5IGdpdmVuIHRoZSBjb25uZWN0Lm1pY3Jvc29mdC5jb20gaXNzdWUKICAgICAgICAgICAgICAgIC8vbWVudGlvbmVkIGFib3ZlIGFib3V0IG5vdCBkb2luZyB0aGUgJ3NjcmlwdCBleGVjdXRlLAogICAgICAgICAgICAgICAgLy90aGVuIGZpcmUgdGhlIHNjcmlwdCBsb2FkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBleGVjdXRlCiAgICAgICAgICAgICAgICAvL25leHQgc2NyaXB0JyB0aGF0IG90aGVyIGJyb3dzZXJzIGRvLgogICAgICAgICAgICAgICAgLy9CZXN0IGhvcGU6IElFMTAgZml4ZXMgdGhlIGlzc3VlcywKICAgICAgICAgICAgICAgIC8vYW5kIHRoZW4gZGVzdHJveXMgYWxsIGluc3RhbGxzIG9mIElFIDYtOS4KICAgICAgICAgICAgICAgIC8vbm9kZS5hdHRhY2hFdmVudCgnb25lcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvciwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc3JjID0gdXJsOwoKICAgICAgICAgICAgLy9DYWxsaW5nIG9uTm9kZUNyZWF0ZWQgYWZ0ZXIgYWxsIHByb3BlcnRpZXMgb24gdGhlIG5vZGUgaGF2ZSBiZWVuCiAgICAgICAgICAgIC8vc2V0LCBidXQgYmVmb3JlIGl0IGlzIHBsYWNlZCBpbiB0aGUgRE9NLgogICAgICAgICAgICBpZiAoY29uZmlnLm9uTm9kZUNyZWF0ZWQpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5vbk5vZGVDcmVhdGVkKG5vZGUsIGNvbmZpZywgbW9kdWxlTmFtZSwgdXJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Gb3Igc29tZSBjYWNoZSBjYXNlcyBpbiBJRSA2LTgsIHRoZSBzY3JpcHQgZXhlY3V0ZXMgYmVmb3JlIHRoZSBlbmQKICAgICAgICAgICAgLy9vZiB0aGUgYXBwZW5kQ2hpbGQgZXhlY3V0aW9uLCBzbyB0byB0aWUgYW4gYW5vbnltb3VzIGRlZmluZQogICAgICAgICAgICAvL2NhbGwgdG8gdGhlIG1vZHVsZSBuYW1lICh3aGljaCBpcyBzdG9yZWQgb24gdGhlIG5vZGUpLCBob2xkIG9uCiAgICAgICAgICAgIC8vdG8gYSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLCBidXQgY2xlYXIgYWZ0ZXIgdGhlIERPTSBpbnNlcnRpb24uCiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUobm9kZSwgYmFzZUVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50bHlBZGRpbmdTY3JpcHQgPSBudWxsOwoKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChpc1dlYldvcmtlcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy9JbiBhIHdlYiB3b3JrZXIsIHVzZSBpbXBvcnRTY3JpcHRzLiBUaGlzIGlzIG5vdCBhIHZlcnkKICAgICAgICAgICAgICAgIC8vZWZmaWNpZW50IHVzZSBvZiBpbXBvcnRTY3JpcHRzLCBpbXBvcnRTY3JpcHRzIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICAgICAgICAgIC8vaXRzIHNjcmlwdCBpcyBkb3dubG9hZGVkIGFuZCBldmFsdWF0ZWQuIEhvd2V2ZXIsIGlmIHdlYiB3b3JrZXJzCiAgICAgICAgICAgICAgICAvL2FyZSBpbiBwbGF5LCB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIGJ1aWxkIGhhcyBiZWVuIGRvbmUgc28KICAgICAgICAgICAgICAgIC8vdGhhdCBvbmx5IG9uZSBzY3JpcHQgbmVlZHMgdG8gYmUgbG9hZGVkIGFueXdheS4gVGhpcyBtYXkgbmVlZAogICAgICAgICAgICAgICAgLy90byBiZSByZWV2YWx1YXRlZCBpZiBvdGhlciB1c2UgY2FzZXMgYmVjb21lIGNvbW1vbi4KCiAgICAgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgZXZlbnQgbG9vcCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBXZWJLaXQKICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSB3b3JrZXIgZ2V0cyBnYXJiYWdlLWNvbGxlY3RlZCBhZnRlciBjYWxsaW5nCiAgICAgICAgICAgICAgICAvLyBpbXBvcnRTY3JpcHRzKCk6IGh0dHBzOi8vd2Via2l0Lm9yZy9iLzE1MzMxNwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHt9LCAwKTsKICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHModXJsKTsKCiAgICAgICAgICAgICAgICAvL0FjY291bnQgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKG1ha2VFcnJvcignaW1wb3J0c2NyaXB0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydFNjcmlwdHMgZmFpbGVkIGZvciAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSArICcgYXQgJyArIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpIHsKICAgICAgICBpZiAoaW50ZXJhY3RpdmVTY3JpcHQgJiYgaW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgICByZXR1cm4gaW50ZXJhY3RpdmVTY3JpcHQ7CiAgICAgICAgfQoKICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGludGVyYWN0aXZlU2NyaXB0ID0gc2NyaXB0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgIH0KCiAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIHNjcmlwdCBhdHRyaWJ1dGUsIHdoaWNoIGNvdWxkIGFsc28gYWRqdXN0IHRoZSBiYXNlVXJsLgogICAgaWYgKGlzQnJvd3NlciAmJiAhY2ZnLnNraXBEYXRhTWFpbikgewogICAgICAgIC8vRmlndXJlIG91dCBiYXNlVXJsLiBHZXQgaXQgZnJvbSB0aGUgc2NyaXB0IHRhZyB3aXRoIHJlcXVpcmUuanMgaW4gaXQuCiAgICAgICAgZWFjaFJldmVyc2Uoc2NyaXB0cygpLCBmdW5jdGlvbiAoc2NyaXB0KSB7CiAgICAgICAgICAgIC8vU2V0IHRoZSAnaGVhZCcgd2hlcmUgd2UgY2FuIGFwcGVuZCBjaGlsZHJlbiBieQogICAgICAgICAgICAvL3VzaW5nIHRoZSBzY3JpcHQncyBwYXJlbnQuCiAgICAgICAgICAgIGlmICghaGVhZCkgewogICAgICAgICAgICAgICAgaGVhZCA9IHNjcmlwdC5wYXJlbnROb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIGF0dHJpYnV0ZSB0byBzZXQgbWFpbiBzY3JpcHQgZm9yIHRoZSBwYWdlCiAgICAgICAgICAgIC8vdG8gbG9hZC4gSWYgaXQgaXMgdGhlcmUsIHRoZSBwYXRoIHRvIGRhdGEgbWFpbiBiZWNvbWVzIHRoZQogICAgICAgICAgICAvL2Jhc2VVcmwsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAgICAgZGF0YU1haW4gPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCdkYXRhLW1haW4nKTsKICAgICAgICAgICAgaWYgKGRhdGFNYWluKSB7CiAgICAgICAgICAgICAgICAvL1ByZXNlcnZlIGRhdGFNYWluIGluIGNhc2UgaXQgaXMgYSBwYXRoIChpLmUuIGNvbnRhaW5zICc/JykKICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKCiAgICAgICAgICAgICAgICAvL1NldCBmaW5hbCBiYXNlVXJsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGFuIGV4cGxpY2l0IG9uZSwKICAgICAgICAgICAgICAgIC8vYnV0IG9ubHkgZG8gc28gaWYgdGhlIGRhdGEtbWFpbiB2YWx1ZSBpcyBub3QgYSBsb2FkZXIgcGx1Z2luCiAgICAgICAgICAgICAgICAvL21vZHVsZSBJRC4KICAgICAgICAgICAgICAgIGlmICghY2ZnLmJhc2VVcmwgJiYgbWFpblNjcmlwdC5pbmRleE9mKCchJykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG9mZiB0aGUgZGlyZWN0b3J5IG9mIGRhdGEtbWFpbiBmb3IgdXNlIGFzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vYmFzZVVybC4KICAgICAgICAgICAgICAgICAgICBzcmMgPSBtYWluU2NyaXB0LnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IHNyYy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gc3JjLmxlbmd0aCA/IHNyYy5qb2luKCcvJykgICsgJy8nIDogJy4vJzsKCiAgICAgICAgICAgICAgICAgICAgY2ZnLmJhc2VVcmwgPSBzdWJQYXRoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU3RyaXAgb2ZmIGFueSB0cmFpbGluZyAuanMgc2luY2UgbWFpblNjcmlwdCBpcyBub3cKICAgICAgICAgICAgICAgIC8vbGlrZSBhIG1vZHVsZSBuYW1lLgogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IG1haW5TY3JpcHQucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwoKICAgICAgICAgICAgICAgIC8vSWYgbWFpblNjcmlwdCBpcyBzdGlsbCBhIHBhdGgsIGZhbGwgYmFjayB0byBkYXRhTWFpbgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1haW5TY3JpcHQpKSB7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vUHV0IHRoZSBkYXRhLW1haW4gc2NyaXB0IGluIHRoZSBmaWxlcyB0byBsb2FkLgogICAgICAgICAgICAgICAgY2ZnLmRlcHMgPSBjZmcuZGVwcyA/IGNmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KSA6IFttYWluU2NyaXB0XTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBkZWZpbml0aW9ucyBvZiBtb2R1bGVzLiBEaWZmZXJzIGZyb20KICAgICAqIHJlcXVpcmUoKSBpbiB0aGF0IGEgc3RyaW5nIGZvciB0aGUgbW9kdWxlIHNob3VsZCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsCiAgICAgKiBhbmQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQgc2hvdWxkCiAgICAgKiByZXR1cm4gYSB2YWx1ZSB0byBkZWZpbmUgdGhlIG1vZHVsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBhcmd1bWVudCdzCiAgICAgKiBuYW1lLgogICAgICovCiAgICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJhY2spIHsKICAgICAgICB2YXIgbm9kZSwgY29udGV4dDsKCiAgICAgICAgLy9BbGxvdyBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vQWRqdXN0IGFyZ3MgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBuYW1lOwogICAgICAgICAgICBuYW1lID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vVGhpcyBtb2R1bGUgbWF5IG5vdCBoYXZlIGRlcGVuZGVuY2llcwogICAgICAgIGlmICghaXNBcnJheShkZXBzKSkgewogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBuYW1lLCBhbmQgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiwgdGhlbiBmaWd1cmUgb3V0IGlmIGl0IGEKICAgICAgICAvL0NvbW1vbkpTIHRoaW5nIHdpdGggZGVwZW5kZW5jaWVzLgogICAgICAgIGlmICghZGVwcyAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIC8vUmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIHN0cmluZywKICAgICAgICAgICAgLy9sb29rIGZvciByZXF1aXJlIGNhbGxzLCBhbmQgcHVsbCB0aGVtIGludG8gdGhlIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgLy9idXQgb25seSBpZiB0aGVyZSBhcmUgZnVuY3Rpb24gYXJncy4KICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbW1lbnRSZWdFeHAsIGNvbW1lbnRSZXBsYWNlKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsIGZ1bmN0aW9uIChtYXRjaCwgZGVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXApOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgQ29tbW9uSlMgdGhpbmcgZXZlbiB3aXRob3V0IHJlcXVpcmUgY2FsbHMsIGJ1dCBzdGlsbAogICAgICAgICAgICAgICAgLy9jb3VsZCB1c2UgZXhwb3J0cywgYW5kIG1vZHVsZS4gQXZvaWQgZG9pbmcgZXhwb3J0cyBhbmQgbW9kdWxlCiAgICAgICAgICAgICAgICAvL3dvcmsgdGhvdWdoIGlmIGl0IGp1c3QgbmVlZHMgcmVxdWlyZS4KICAgICAgICAgICAgICAgIC8vUkVRVUlSRVMgdGhlIGZ1bmN0aW9uIHRvIGV4cGVjdCB0aGUgQ29tbW9uSlMgdmFyaWFibGVzIGluIHRoZQogICAgICAgICAgICAgICAgLy9vcmRlciBsaXN0ZWQgYmVsb3cuCiAgICAgICAgICAgICAgICBkZXBzID0gKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IFsncmVxdWlyZSddIDogWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ10pLmNvbmNhdChkZXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9JZiBpbiBJRSA2LTggYW5kIGhpdCBhbiBhbm9ueW1vdXMgZGVmaW5lKCkgY2FsbCwgZG8gdGhlIGludGVyYWN0aXZlCiAgICAgICAgLy93b3JrLgogICAgICAgIGlmICh1c2VJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICBub2RlID0gY3VycmVudGx5QWRkaW5nU2NyaXB0IHx8IGdldEludGVyYWN0aXZlU2NyaXB0KCk7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW25vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVjb250ZXh0JyldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL0Fsd2F5cyBzYXZlIG9mZiBldmFsdWF0aW5nIHRoZSBkZWYgY2FsbCB1bnRpbCB0aGUgc2NyaXB0IG9ubG9hZCBoYW5kbGVyLgogICAgICAgIC8vVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9kdWxlcyB0byBiZSBpbiBhIGZpbGUgd2l0aG91dCBwcmVtYXR1cmVseQogICAgICAgIC8vdHJhY2luZyBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvd3MgZm9yIGFub255bW91cyBtb2R1bGUgc3VwcG9ydCwKICAgICAgICAvL3doZXJlIHRoZSBtb2R1bGUgbmFtZSBpcyBub3Qga25vd24gdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgZXZlbnQKICAgICAgICAvL29jY3Vycy4gSWYgbm8gY29udGV4dCwgdXNlIHRoZSBnbG9iYWwgcXVldWUsIGFuZCBnZXQgaXQgcHJvY2Vzc2VkCiAgICAgICAgLy9pbiB0aGUgb25zY3JpcHQgbG9hZCBjYWxsYmFjay4KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXBbbmFtZV0gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBkZWZpbmUuYW1kID0gewogICAgICAgIGpRdWVyeTogdHJ1ZQogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGVzIHRoZSB0ZXh0LiBOb3JtYWxseSBqdXN0IHVzZXMgZXZhbCwgYnV0IGNhbiBiZSBtb2RpZmllZAogICAgICogdG8gdXNlIGEgYmV0dGVyLCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjYWxsLiBPbmx5IHVzZWQgZm9yIHRyYW5zcGlsaW5nCiAgICAgKiBsb2FkZXIgcGx1Z2lucywgbm90IGZvciBwbGFpbiBKUyBtb2R1bGVzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIHRleHQgdG8gZXhlY3V0ZS9ldmFsdWF0ZS4KICAgICAqLwogICAgcmVxLmV4ZWMgPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICByZXR1cm4gZXZhbCh0ZXh0KTsKICAgIH07CgogICAgLy9TZXQgdXAgd2l0aCBjb25maWcgaW5mby4KICAgIHJlcShjZmcpOwp9KHRoaXMsICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBzZXRUaW1lb3V0KSkpOwoKZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7CiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7Cn0KCmxldCBfZW5hYmxlX3N1cGVyX2dyb3NzX21vZGVfdGhhdF93aWxsX2NhdXNlX2JhZF90aGluZ3MgPSBmYWxzZTsKY29uc3QgY29uZmlnID0gewogICAgUHJvbWlzZTogdW5kZWZpbmVkLAogICAgc2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcodmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdERVBSRUNBVEVEISBSeEpTIHdhcyBzZXQgdG8gdXNlIGRlcHJlY2F0ZWQgc3luY2hyb25vdXMgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IgYnkgY29kZSBhdDogXG4nICsgZXJyb3Iuc3RhY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChfZW5hYmxlX3N1cGVyX2dyb3NzX21vZGVfdGhhdF93aWxsX2NhdXNlX2JhZF90aGluZ3MpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1J4SlM6IEJhY2sgdG8gYSBiZXR0ZXIgZXJyb3IgYmVoYXZpb3IuIFRoYW5rIHlvdS4gPDMnKTsKICAgICAgICB9CiAgICAgICAgX2VuYWJsZV9zdXBlcl9ncm9zc19tb2RlX3RoYXRfd2lsbF9jYXVzZV9iYWRfdGhpbmdzID0gdmFsdWU7CiAgICB9LAogICAgZ2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcoKSB7CiAgICAgICAgcmV0dXJuIF9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5nczsKICAgIH0sCn07CgpmdW5jdGlvbiBob3N0UmVwb3J0RXJyb3IoZXJyKSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhyb3cgZXJyOyB9LCAwKTsKfQoKY29uc3QgZW1wdHkgPSB7CiAgICBjbG9zZWQ6IHRydWUsCiAgICBuZXh0KHZhbHVlKSB7IH0sCiAgICBlcnJvcihlcnIpIHsKICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7CiAgICAgICAgfQogICAgfSwKICAgIGNvbXBsZXRlKCkgeyB9Cn07Cgpjb25zdCBpc0FycmF5ID0gKCgpID0+IEFycmF5LmlzQXJyYXkgfHwgKCh4KSA9PiB4ICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gJ251bWJlcicpKSgpOwoKZnVuY3Rpb24gaXNPYmplY3QoeCkgewogICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09ICdvYmplY3QnOwp9Cgpjb25zdCBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbCA9ICgoKSA9PiB7CiAgICBmdW5jdGlvbiBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbChlcnJvcnMpIHsKICAgICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9ycyA/CiAgICAgICAgICAgIGAke2Vycm9ycy5sZW5ndGh9IGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246CiR7ZXJyb3JzLm1hcCgoZXJyLCBpKSA9PiBgJHtpICsgMX0pICR7ZXJyLnRvU3RyaW5nKCl9YCkuam9pbignXG4gICcpfWAgOiAnJzsKICAgICAgICB0aGlzLm5hbWUgPSAnVW5zdWJzY3JpcHRpb25FcnJvcic7CiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICByZXR1cm4gVW5zdWJzY3JpcHRpb25FcnJvckltcGw7Cn0pKCk7CmNvbnN0IFVuc3Vic2NyaXB0aW9uRXJyb3IgPSBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbDsKCmNsYXNzIFN1YnNjcmlwdGlvbiB7CiAgICBjb25zdHJ1Y3Rvcih1bnN1YnNjcmliZSkgewogICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fcGFyZW50T3JQYXJlbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gbnVsbDsKICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHsKICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTsKICAgICAgICB9CiAgICB9CiAgICB1bnN1YnNjcmliZSgpIHsKICAgICAgICBsZXQgZXJyb3JzOwogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCB7IF9wYXJlbnRPclBhcmVudHMsIF91bnN1YnNjcmliZSwgX3N1YnNjcmlwdGlvbnMgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX3BhcmVudE9yUGFyZW50cyA9IG51bGw7CiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG51bGw7CiAgICAgICAgaWYgKF9wYXJlbnRPclBhcmVudHMgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgX3BhcmVudE9yUGFyZW50cy5yZW1vdmUodGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKF9wYXJlbnRPclBhcmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IF9wYXJlbnRPclBhcmVudHMubGVuZ3RoOyArK2luZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBfcGFyZW50T3JQYXJlbnRzW2luZGV4XTsKICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmUodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzRnVuY3Rpb24oX3Vuc3Vic2NyaWJlKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgX3Vuc3Vic2NyaWJlLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGVycm9ycyA9IGUgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yID8gZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGUuZXJyb3JzKSA6IFtlXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNBcnJheShfc3Vic2NyaXB0aW9ucykpIHsKICAgICAgICAgICAgbGV0IGluZGV4ID0gLTE7CiAgICAgICAgICAgIGxldCBsZW4gPSBfc3Vic2NyaXB0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdWIgPSBfc3Vic2NyaXB0aW9uc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3Qoc3ViKSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChmbGF0dGVuVW5zdWJzY3JpcHRpb25FcnJvcnMoZS5lcnJvcnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlcnJvcnMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3Vic2NyaXB0aW9uRXJyb3IoZXJyb3JzKTsKICAgICAgICB9CiAgICB9CiAgICBhZGQodGVhcmRvd24pIHsKICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGVhcmRvd247CiAgICAgICAgaWYgKCF0ZWFyZG93bikgewogICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHR5cGVvZiB0ZWFyZG93bikgewogICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKHRlYXJkb3duKTsKICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT09IHRoaXMgfHwgc3Vic2NyaXB0aW9uLmNsb3NlZCB8fCB0eXBlb2Ygc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEoc3Vic2NyaXB0aW9uIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLl9zdWJzY3JpcHRpb25zID0gW3RtcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgdGVhcmRvd24gJyArIHRlYXJkb3duICsgJyBhZGRlZCB0byBTdWJzY3JpcHRpb24uJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHsgX3BhcmVudE9yUGFyZW50cyB9ID0gc3Vic2NyaXB0aW9uOwogICAgICAgIGlmIChfcGFyZW50T3JQYXJlbnRzID09PSBudWxsKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5fcGFyZW50T3JQYXJlbnRzID0gdGhpczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX3BhcmVudE9yUGFyZW50cyBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICBpZiAoX3BhcmVudE9yUGFyZW50cyA9PT0gdGhpcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJzY3JpcHRpb24uX3BhcmVudE9yUGFyZW50cyA9IFtfcGFyZW50T3JQYXJlbnRzLCB0aGlzXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX3BhcmVudE9yUGFyZW50cy5pbmRleE9mKHRoaXMpID09PSAtMSkgewogICAgICAgICAgICBfcGFyZW50T3JQYXJlbnRzLnB1c2godGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uczsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gW3N1YnNjcmlwdGlvbl07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgIH0KICAgIHJlbW92ZShzdWJzY3JpcHRpb24pIHsKICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uczsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykgewogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25JbmRleCA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihzdWJzY3JpcHRpb24pOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uSW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnNwbGljZShzdWJzY3JpcHRpb25JbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KU3Vic2NyaXB0aW9uLkVNUFRZID0gKGZ1bmN0aW9uIChlbXB0eSkgewogICAgZW1wdHkuY2xvc2VkID0gdHJ1ZTsKICAgIHJldHVybiBlbXB0eTsKfShuZXcgU3Vic2NyaXB0aW9uKCkpKTsKZnVuY3Rpb24gZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGVycm9ycykgewogICAgcmV0dXJuIGVycm9ycy5yZWR1Y2UoKGVycnMsIGVycikgPT4gZXJycy5jb25jYXQoKGVyciBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3IpID8gZXJyLmVycm9ycyA6IGVyciksIFtdKTsKfQoKY29uc3QgcnhTdWJzY3JpYmVyID0gKCgpID0+IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicKICAgID8gU3ltYm9sKCdyeFN1YnNjcmliZXInKQogICAgOiAnQEByeFN1YnNjcmliZXJfJyArIE1hdGgucmFuZG9tKCkpKCk7CgpjbGFzcyBTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuc3luY0Vycm9yVmFsdWUgPSBudWxsOwogICAgICAgIHRoaXMuc3luY0Vycm9yVGhyb3duID0gZmFsc2U7CiAgICAgICAgdGhpcy5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZW1wdHk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbk9yTmV4dCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBlbXB0eTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25Pck5leHQgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IGRlc3RpbmF0aW9uT3JOZXh0LnN5bmNFcnJvclRocm93YWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uT3JOZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbk9yTmV4dC5hZGQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIodGhpcywgZGVzdGluYXRpb25Pck5leHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRoaXMuc3luY0Vycm9yVGhyb3dhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIodGhpcywgZGVzdGluYXRpb25Pck5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBbcnhTdWJzY3JpYmVyXSgpIHsgcmV0dXJuIHRoaXM7IH0KICAgIHN0YXRpYyBjcmVhdGUobmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBTdWJzY3JpYmVyKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgc3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjsKICAgIH0KICAgIG5leHQodmFsdWUpIHsKICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIHRoaXMuX25leHQodmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGVycm9yKGVycikgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9lcnJvcihlcnIpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICBzdXBlci51bnN1YnNjcmliZSgpOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgIH0KICAgIF91bnN1YnNjcmliZUFuZFJlY3ljbGUoKSB7CiAgICAgICAgY29uc3QgeyBfcGFyZW50T3JQYXJlbnRzIH0gPSB0aGlzOwogICAgICAgIHRoaXMuX3BhcmVudE9yUGFyZW50cyA9IG51bGw7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9wYXJlbnRPclBhcmVudHMgPSBfcGFyZW50T3JQYXJlbnRzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQp9CmNsYXNzIFNhZmVTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihfcGFyZW50U3Vic2NyaWJlciwgb2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGFyZW50U3Vic2NyaWJlciA9IF9wYXJlbnRTdWJzY3JpYmVyOwogICAgICAgIGxldCBuZXh0OwogICAgICAgIGxldCBjb250ZXh0ID0gdGhpczsKICAgICAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkpIHsKICAgICAgICAgICAgbmV4dCA9IG9ic2VydmVyT3JOZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYnNlcnZlck9yTmV4dCkgewogICAgICAgICAgICBuZXh0ID0gb2JzZXJ2ZXJPck5leHQubmV4dDsKICAgICAgICAgICAgZXJyb3IgPSBvYnNlcnZlck9yTmV4dC5lcnJvcjsKICAgICAgICAgICAgY29tcGxldGUgPSBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZTsKICAgICAgICAgICAgaWYgKG9ic2VydmVyT3JOZXh0ICE9PSBlbXB0eSkgewogICAgICAgICAgICAgICAgY29udGV4dCA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpOwogICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dC51bnN1YnNjcmliZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZChjb250ZXh0LnVuc3Vic2NyaWJlLmJpbmQoY29udGV4dCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC51bnN1YnNjcmliZSA9IHRoaXMudW5zdWJzY3JpYmUuYmluZCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgICAgICB0aGlzLl9uZXh0ID0gbmV4dDsKICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yOwogICAgICAgIHRoaXMuX2NvbXBsZXRlID0gY29tcGxldGU7CiAgICB9CiAgICBuZXh0KHZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCAmJiB0aGlzLl9uZXh0KSB7CiAgICAgICAgICAgIGNvbnN0IHsgX3BhcmVudFN1YnNjcmliZXIgfSA9IHRoaXM7CiAgICAgICAgICAgIGlmICghY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgfHwgIV9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93YWJsZSkgewogICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIodGhpcy5fbmV4dCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX190cnlPclNldEVycm9yKF9wYXJlbnRTdWJzY3JpYmVyLCB0aGlzLl9uZXh0LCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVycm9yKGVycikgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgY29uc3QgeyBfcGFyZW50U3Vic2NyaWJlciB9ID0gdGhpczsKICAgICAgICAgICAgY29uc3QgeyB1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nIH0gPSBjb25maWc7CiAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcikgewogICAgICAgICAgICAgICAgaWYgKCF1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nIHx8ICFfcGFyZW50U3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JVbnN1Yih0aGlzLl9lcnJvciwgZXJyKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgdGhpcy5fZXJyb3IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFfcGFyZW50U3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUpIHsKICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIGlmICh1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgICAgIF9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclZhbHVlID0gZXJyOwogICAgICAgICAgICAgICAgICAgIF9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93biA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBob3N0UmVwb3J0RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgY29uc3QgeyBfcGFyZW50U3Vic2NyaWJlciB9ID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkQ29tcGxldGUgPSAoKSA9PiB0aGlzLl9jb21wbGV0ZS5jYWxsKHRoaXMuX2NvbnRleHQpOwogICAgICAgICAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyB8fCAhX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIod3JhcHBlZENvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgd3JhcHBlZENvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBfX3RyeU9yVW5zdWIoZm4sIHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm4uY2FsbCh0aGlzLl9jb250ZXh0LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvc3RSZXBvcnRFcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgX190cnlPclNldEVycm9yKHBhcmVudCwgZm4sIHZhbHVlKSB7CiAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBjYWxsJyk7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZuLmNhbGwodGhpcy5fY29udGV4dCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgcGFyZW50LnN5bmNFcnJvclZhbHVlID0gZXJyOwogICAgICAgICAgICAgICAgcGFyZW50LnN5bmNFcnJvclRocm93biA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvc3RSZXBvcnRFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IHsgX3BhcmVudFN1YnNjcmliZXIgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7CiAgICAgICAgdGhpcy5fcGFyZW50U3Vic2NyaWJlciA9IG51bGw7CiAgICAgICAgX3BhcmVudFN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgIH0KfQoKZnVuY3Rpb24gY2FuUmVwb3J0RXJyb3Iob2JzZXJ2ZXIpIHsKICAgIHdoaWxlIChvYnNlcnZlcikgewogICAgICAgIGNvbnN0IHsgY2xvc2VkLCBkZXN0aW5hdGlvbiwgaXNTdG9wcGVkIH0gPSBvYnNlcnZlcjsKICAgICAgICBpZiAoY2xvc2VkIHx8IGlzU3RvcHBlZCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgU3Vic2NyaWJlcikgewogICAgICAgICAgICBvYnNlcnZlciA9IGRlc3RpbmF0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiB0b1N1YnNjcmliZXIobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgaWYgKG5leHRPck9ic2VydmVyKSB7CiAgICAgICAgaWYgKG5leHRPck9ic2VydmVyIGluc3RhbmNlb2YgU3Vic2NyaWJlcikgewogICAgICAgICAgICByZXR1cm4gbmV4dE9yT2JzZXJ2ZXI7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0T3JPYnNlcnZlcltyeFN1YnNjcmliZXJdKSB7CiAgICAgICAgICAgIHJldHVybiBuZXh0T3JPYnNlcnZlcltyeFN1YnNjcmliZXJdKCk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCFuZXh0T3JPYnNlcnZlciAmJiAhZXJyb3IgJiYgIWNvbXBsZXRlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpYmVyKGVtcHR5KTsKICAgIH0KICAgIHJldHVybiBuZXcgU3Vic2NyaWJlcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKTsKfQoKY29uc3Qgb2JzZXJ2YWJsZSA9ICgoKSA9PiB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8ICdAQG9ic2VydmFibGUnKSgpOwoKZnVuY3Rpb24gaWRlbnRpdHkoeCkgewogICAgcmV0dXJuIHg7Cn0KCmZ1bmN0aW9uIHBpcGVGcm9tQXJyYXkoZm5zKSB7CiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBpZGVudGl0eTsKICAgIH0KICAgIGlmIChmbnMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgcmV0dXJuIGZuc1swXTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkgewogICAgICAgIHJldHVybiBmbnMucmVkdWNlKChwcmV2LCBmbikgPT4gZm4ocHJldiksIGlucHV0KTsKICAgIH07Cn0KCmNsYXNzIE9ic2VydmFibGUgewogICAgY29uc3RydWN0b3Ioc3Vic2NyaWJlKSB7CiAgICAgICAgdGhpcy5faXNTY2FsYXIgPSBmYWxzZTsKICAgICAgICBpZiAoc3Vic2NyaWJlKSB7CiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTsKICAgICAgICB9CiAgICB9CiAgICBsaWZ0KG9wZXJhdG9yKSB7CiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCk7CiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzOwogICAgICAgIG9ic2VydmFibGUub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTsKICAgIH0KICAgIHN1YnNjcmliZShvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgY29uc3QgeyBvcGVyYXRvciB9ID0gdGhpczsKICAgICAgICBjb25zdCBzaW5rID0gdG9TdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpOwogICAgICAgIGlmIChvcGVyYXRvcikgewogICAgICAgICAgICBzaW5rLmFkZChvcGVyYXRvci5jYWxsKHNpbmssIHRoaXMuc291cmNlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzaW5rLmFkZCh0aGlzLnNvdXJjZSB8fCAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgIXNpbmsuc3luY0Vycm9yVGhyb3dhYmxlKSA/CiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUoc2luaykgOgogICAgICAgICAgICAgICAgdGhpcy5fdHJ5U3Vic2NyaWJlKHNpbmspKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICAgICAgICAgIGlmIChzaW5rLnN5bmNFcnJvclRocm93YWJsZSkgewogICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChzaW5rLnN5bmNFcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgIHRocm93IHNpbmsuc3luY0Vycm9yVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNpbms7CiAgICB9CiAgICBfdHJ5U3Vic2NyaWJlKHNpbmspIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHNpbmspOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JUaHJvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JWYWx1ZSA9IGVycjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2FuUmVwb3J0RXJyb3Ioc2luaykpIHsKICAgICAgICAgICAgICAgIHNpbmsuZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yRWFjaChuZXh0LCBwcm9taXNlQ3RvcikgewogICAgICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpOwogICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9uOwogICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSgodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHJlamVjdCwgcmVzb2x2ZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICBjb25zdCB7IHNvdXJjZSB9ID0gdGhpczsKICAgICAgICByZXR1cm4gc291cmNlICYmIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICBbb2JzZXJ2YWJsZV0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBwaXBlKC4uLm9wZXJhdGlvbnMpIHsKICAgICAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpOwogICAgfQogICAgdG9Qcm9taXNlKHByb21pc2VDdG9yKSB7CiAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7CiAgICAgICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGxldCB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoKHgpID0+IHZhbHVlID0geCwgKGVycikgPT4gcmVqZWN0KGVyciksICgpID0+IHJlc29sdmUodmFsdWUpKTsKICAgICAgICB9KTsKICAgIH0KfQpPYnNlcnZhYmxlLmNyZWF0ZSA9IChzdWJzY3JpYmUpID0+IHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmUpOwp9OwpmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogICAgaWYgKCFwcm9taXNlQ3RvcikgewogICAgICAgIHByb21pc2VDdG9yID0gIFByb21pc2U7CiAgICB9CiAgICBpZiAoIXByb21pc2VDdG9yKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBQcm9taXNlIGltcGwgZm91bmQnKTsKICAgIH0KICAgIHJldHVybiBwcm9taXNlQ3RvcjsKfQoKY29uc3QgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsID0gKCgpID0+IHsKICAgIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHsKICAgICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICdvYmplY3QgdW5zdWJzY3JpYmVkJzsKICAgICAgICB0aGlzLm5hbWUgPSAnT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3InOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgIHJldHVybiBPYmplY3RVbnN1YnNjcmliZWRFcnJvckltcGw7Cn0pKCk7CmNvbnN0IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsOwoKY2xhc3MgU3ViamVjdFN1YnNjcmlwdGlvbiBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzdWJqZWN0LCBzdWJzY3JpYmVyKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwogICAgICAgIHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7CiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0OwogICAgICAgIGNvbnN0IG9ic2VydmVycyA9IHN1YmplY3Qub2JzZXJ2ZXJzOwogICAgICAgIHRoaXMuc3ViamVjdCA9IG51bGw7CiAgICAgICAgaWYgKCFvYnNlcnZlcnMgfHwgb2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCB8fCBzdWJqZWN0LmlzU3RvcHBlZCB8fCBzdWJqZWN0LmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnNjcmliZXJJbmRleCA9IG9ic2VydmVycy5pbmRleE9mKHRoaXMuc3Vic2NyaWJlcik7CiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgb2JzZXJ2ZXJzLnNwbGljZShzdWJzY3JpYmVySW5kZXgsIDEpOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgU3ViamVjdFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgIH0KfQpjbGFzcyBTdWJqZWN0IGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107CiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICB0aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgIH0KICAgIFtyeFN1YnNjcmliZXJdKCkgewogICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmliZXIodGhpcyk7CiAgICB9CiAgICBsaWZ0KG9wZXJhdG9yKSB7CiAgICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpOwogICAgICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gc3ViamVjdDsKICAgIH0KICAgIG5leHQodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG9ic2VydmVycy5sZW5ndGg7CiAgICAgICAgICAgIGNvbnN0IGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgY29weVtpXS5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVycm9yKGVycikgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgdGhpcy50aHJvd25FcnJvciA9IGVycjsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgbGVuID0gb2JzZXJ2ZXJzLmxlbmd0aDsKICAgICAgICBjb25zdCBjb3B5ID0gb2JzZXJ2ZXJzLnNsaWNlKCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBjb3B5W2ldLmVycm9yKGVycik7CiAgICAgICAgfQogICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7CiAgICB9CiAgICBjb21wbGV0ZSgpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICBjb25zdCB7IG9ic2VydmVycyB9ID0gdGhpczsKICAgICAgICBjb25zdCBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvcHlbaV0uY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDsKICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBudWxsOwogICAgfQogICAgX3RyeVN1YnNjcmliZShzdWJzY3JpYmVyKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLl90cnlTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfQogICAgfQogICAgX3N1YnNjcmliZShzdWJzY3JpYmVyKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmhhc0Vycm9yKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhpcy50aHJvd25FcnJvcik7CiAgICAgICAgICAgIHJldHVybiBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7CiAgICAgICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmlwdGlvbih0aGlzLCBzdWJzY3JpYmVyKTsKICAgICAgICB9CiAgICB9CiAgICBhc09ic2VydmFibGUoKSB7CiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCk7CiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzOwogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfQp9ClN1YmplY3QuY3JlYXRlID0gKGRlc3RpbmF0aW9uLCBzb3VyY2UpID0+IHsKICAgIHJldHVybiBuZXcgQW5vbnltb3VzU3ViamVjdChkZXN0aW5hdGlvbiwgc291cmNlKTsKfTsKY2xhc3MgQW5vbnltb3VzU3ViamVjdCBleHRlbmRzIFN1YmplY3QgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNvdXJjZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgfQogICAgbmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IHsgZGVzdGluYXRpb24gfSA9IHRoaXM7CiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLm5leHQpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgZXJyb3IoZXJyKSB7CiAgICAgICAgY29uc3QgeyBkZXN0aW5hdGlvbiB9ID0gdGhpczsKICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIGNvbnN0IHsgZGVzdGluYXRpb24gfSA9IHRoaXM7CiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLmNvbXBsZXRlKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICBjb25zdCB7IHNvdXJjZSB9ID0gdGhpczsKICAgICAgICBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gcmVmQ291bnQoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVmQ291bnRPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgUmVmQ291bnRPcGVyYXRvcihzb3VyY2UpKTsKICAgIH07Cn0KY2xhc3MgUmVmQ291bnRPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0YWJsZSkgewogICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgY29uc3QgeyBjb25uZWN0YWJsZSB9ID0gdGhpczsKICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQrKzsKICAgICAgICBjb25zdCByZWZDb3VudGVyID0gbmV3IFJlZkNvdW50U3Vic2NyaWJlcihzdWJzY3JpYmVyLCBjb25uZWN0YWJsZSk7CiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShyZWZDb3VudGVyKTsKICAgICAgICBpZiAoIXJlZkNvdW50ZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIHJlZkNvdW50ZXIuY29ubmVjdGlvbiA9IGNvbm5lY3RhYmxlLmNvbm5lY3QoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgIH0KfQpjbGFzcyBSZWZDb3VudFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gY29ubmVjdGFibGU7CiAgICB9CiAgICBfdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgY29uc3QgeyBjb25uZWN0YWJsZSB9ID0gdGhpczsKICAgICAgICBpZiAoIWNvbm5lY3RhYmxlKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7CiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBjb25uZWN0YWJsZS5fcmVmQ291bnQ7CiAgICAgICAgaWYgKHJlZkNvdW50IDw9IDApIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQgPSByZWZDb3VudCAtIDE7CiAgICAgICAgaWYgKHJlZkNvdW50ID4gMSkgewogICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgY29ubmVjdGlvbiB9ID0gdGhpczsKICAgICAgICBjb25zdCBzaGFyZWRDb25uZWN0aW9uID0gY29ubmVjdGFibGUuX2Nvbm5lY3Rpb247CiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICBpZiAoc2hhcmVkQ29ubmVjdGlvbiAmJiAoIWNvbm5lY3Rpb24gfHwgc2hhcmVkQ29ubmVjdGlvbiA9PT0gY29ubmVjdGlvbikpIHsKICAgICAgICAgICAgc2hhcmVkQ29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgQ29ubmVjdGFibGVPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHN1YmplY3RGYWN0b3J5KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICB0aGlzLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7CiAgICAgICAgdGhpcy5fcmVmQ291bnQgPSAwOwogICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSBmYWxzZTsKICAgIH0KICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgIHJldHVybiB0aGlzLmdldFN1YmplY3QoKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICBnZXRTdWJqZWN0KCkgewogICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0OwogICAgICAgIGlmICghc3ViamVjdCB8fCBzdWJqZWN0LmlzU3RvcHBlZCkgewogICAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdGhpcy5zdWJqZWN0RmFjdG9yeSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fc3ViamVjdDsKICAgIH0KICAgIGNvbm5lY3QoKSB7CiAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uOwogICAgICAgIGlmICghY29ubmVjdGlvbikgewogICAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICBjb25uZWN0aW9uLmFkZCh0aGlzLnNvdXJjZQogICAgICAgICAgICAgICAgLnN1YnNjcmliZShuZXcgQ29ubmVjdGFibGVTdWJzY3JpYmVyKHRoaXMuZ2V0U3ViamVjdCgpLCB0aGlzKSkpOwogICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgIH0KICAgIHJlZkNvdW50KCkgewogICAgICAgIHJldHVybiByZWZDb3VudCgpKHRoaXMpOwogICAgfQp9CmNvbnN0IGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IgPSAoKCkgPT4gewogICAgY29uc3QgY29ubmVjdGFibGVQcm90byA9IENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGU7CiAgICByZXR1cm4gewogICAgICAgIG9wZXJhdG9yOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgX3JlZkNvdW50OiB7IHZhbHVlOiAwLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIF9zdWJqZWN0OiB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIF9jb25uZWN0aW9uOiB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIF9zdWJzY3JpYmU6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uX3N1YnNjcmliZSB9LAogICAgICAgIF9pc0NvbXBsZXRlOiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLl9pc0NvbXBsZXRlLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIGdldFN1YmplY3Q6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uZ2V0U3ViamVjdCB9LAogICAgICAgIGNvbm5lY3Q6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uY29ubmVjdCB9LAogICAgICAgIHJlZkNvdW50OiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLnJlZkNvdW50IH0KICAgIH07Cn0pKCk7CmNsYXNzIENvbm5lY3RhYmxlU3Vic2NyaWJlciBleHRlbmRzIFN1YmplY3RTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gY29ubmVjdGFibGU7CiAgICB9CiAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTsKICAgICAgICBzdXBlci5fZXJyb3IoZXJyKTsKICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmNvbm5lY3RhYmxlLl9pc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpOwogICAgICAgIHN1cGVyLl9jb21wbGV0ZSgpOwogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlID0gdGhpcy5jb25uZWN0YWJsZTsKICAgICAgICBpZiAoY29ubmVjdGFibGUpIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5fY29ubmVjdGlvbjsKICAgICAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50ID0gMDsKICAgICAgICAgICAgY29ubmVjdGFibGUuX3N1YmplY3QgPSBudWxsOwogICAgICAgICAgICBjb25uZWN0YWJsZS5fY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdyb3VwQnkoa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IEdyb3VwQnlPcGVyYXRvcihrZXlTZWxlY3RvciwgZWxlbWVudFNlbGVjdG9yLCBkdXJhdGlvblNlbGVjdG9yLCBzdWJqZWN0U2VsZWN0b3IpKTsKfQpjbGFzcyBHcm91cEJ5T3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICAgICAgdGhpcy5rZXlTZWxlY3RvciA9IGtleVNlbGVjdG9yOwogICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdG9yID0gZWxlbWVudFNlbGVjdG9yOwogICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgdGhpcy5zdWJqZWN0U2VsZWN0b3IgPSBzdWJqZWN0U2VsZWN0b3I7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBHcm91cEJ5U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmtleVNlbGVjdG9yLCB0aGlzLmVsZW1lbnRTZWxlY3RvciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yLCB0aGlzLnN1YmplY3RTZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIEdyb3VwQnlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwga2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjsKICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RvciA9IGVsZW1lbnRTZWxlY3RvcjsKICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgICAgIHRoaXMuc3ViamVjdFNlbGVjdG9yID0gc3ViamVjdFNlbGVjdG9yOwogICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDsKICAgICAgICB0aGlzLmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUgPSBmYWxzZTsKICAgICAgICB0aGlzLmNvdW50ID0gMDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IGtleTsKICAgICAgICB0cnkgewogICAgICAgICAgICBrZXkgPSB0aGlzLmtleVNlbGVjdG9yKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZ3JvdXAodmFsdWUsIGtleSk7CiAgICB9CiAgICBfZ3JvdXAodmFsdWUsIGtleSkgewogICAgICAgIGxldCBncm91cHMgPSB0aGlzLmdyb3VwczsKICAgICAgICBpZiAoIWdyb3VwcykgewogICAgICAgICAgICBncm91cHMgPSB0aGlzLmdyb3VwcyA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgbGV0IGdyb3VwID0gZ3JvdXBzLmdldChrZXkpOwogICAgICAgIGxldCBlbGVtZW50OwogICAgICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RvcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudFNlbGVjdG9yKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFncm91cCkgewogICAgICAgICAgICBncm91cCA9ICh0aGlzLnN1YmplY3RTZWxlY3RvciA/IHRoaXMuc3ViamVjdFNlbGVjdG9yKCkgOiBuZXcgU3ViamVjdCgpKTsKICAgICAgICAgICAgZ3JvdXBzLnNldChrZXksIGdyb3VwKTsKICAgICAgICAgICAgY29uc3QgZ3JvdXBlZE9ic2VydmFibGUgPSBuZXcgR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cCwgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChncm91cGVkT2JzZXJ2YWJsZSk7CiAgICAgICAgICAgIGlmICh0aGlzLmR1cmF0aW9uU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbjsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uU2VsZWN0b3IobmV3IEdyb3VwZWRPYnNlcnZhYmxlKGtleSwgZ3JvdXApKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5hZGQoZHVyYXRpb24uc3Vic2NyaWJlKG5ldyBHcm91cER1cmF0aW9uU3Vic2NyaWJlcihrZXksIGdyb3VwLCB0aGlzKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZ3JvdXAuY2xvc2VkKSB7CiAgICAgICAgICAgIGdyb3VwLm5leHQoZWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzOwogICAgICAgIGlmIChncm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgIGdyb3VwLmVycm9yKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgfQogICAgX2NvbXBsZXRlKCkgewogICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzOwogICAgICAgIGlmIChncm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgIGdyb3VwLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQogICAgcmVtb3ZlR3JvdXAoa2V5KSB7CiAgICAgICAgdGhpcy5ncm91cHMuZGVsZXRlKGtleSk7CiAgICB9CiAgICB1bnN1YnNjcmliZSgpIHsKICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRoaXMuYXR0ZW1wdGVkVG9VbnN1YnNjcmliZSA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICBzdXBlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmNsYXNzIEdyb3VwRHVyYXRpb25TdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihrZXksIGdyb3VwLCBwYXJlbnQpIHsKICAgICAgICBzdXBlcihncm91cCk7CiAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwogICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICB9CiAgICBfdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgY29uc3QgeyBwYXJlbnQsIGtleSB9ID0gdGhpczsKICAgICAgICB0aGlzLmtleSA9IHRoaXMucGFyZW50ID0gbnVsbDsKICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVHcm91cChrZXkpOwogICAgICAgIH0KICAgIH0KfQpjbGFzcyBHcm91cGVkT2JzZXJ2YWJsZSBleHRlbmRzIE9ic2VydmFibGUgewogICAgY29uc3RydWN0b3Ioa2V5LCBncm91cFN1YmplY3QsIHJlZkNvdW50U3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmtleSA9IGtleTsKICAgICAgICB0aGlzLmdyb3VwU3ViamVjdCA9IGdyb3VwU3ViamVjdDsKICAgICAgICB0aGlzLnJlZkNvdW50U3Vic2NyaXB0aW9uID0gcmVmQ291bnRTdWJzY3JpcHRpb247CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgY29uc3QgeyByZWZDb3VudFN1YnNjcmlwdGlvbiwgZ3JvdXBTdWJqZWN0IH0gPSB0aGlzOwogICAgICAgIGlmIChyZWZDb3VudFN1YnNjcmlwdGlvbiAmJiAhcmVmQ291bnRTdWJzY3JpcHRpb24uY2xvc2VkKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQobmV3IElubmVyUmVmQ291bnRTdWJzY3JpcHRpb24ocmVmQ291bnRTdWJzY3JpcHRpb24pKTsKICAgICAgICB9CiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChncm91cFN1YmplY3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpKTsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgfQp9CmNsYXNzIElubmVyUmVmQ291bnRTdWJzY3JpcHRpb24gZXh0ZW5kcyBTdWJzY3JpcHRpb24gewogICAgY29uc3RydWN0b3IocGFyZW50KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICBwYXJlbnQuY291bnQrKzsKICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgICAgIGlmICghcGFyZW50LmNsb3NlZCAmJiAhdGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgc3VwZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgcGFyZW50LmNvdW50IC09IDE7CiAgICAgICAgICAgIGlmIChwYXJlbnQuY291bnQgPT09IDAgJiYgcGFyZW50LmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUpIHsKICAgICAgICAgICAgICAgIHBhcmVudC51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpjbGFzcyBCZWhhdmlvclN1YmplY3QgZXh0ZW5kcyBTdWJqZWN0IHsKICAgIGNvbnN0cnVjdG9yKF92YWx1ZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTsKICAgIH0KICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1cGVyLl9zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodGhpcy5fdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgdGhpcy50aHJvd25FcnJvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgbmV4dCh2YWx1ZSkgewogICAgICAgIHN1cGVyLm5leHQodGhpcy5fdmFsdWUgPSB2YWx1ZSk7CiAgICB9Cn0KCmNsYXNzIEFjdGlvbiBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICBzdXBlcigpOwogICAgfQogICAgc2NoZWR1bGUoc3RhdGUsIGRlbGF5ID0gMCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfQp9CgpjbGFzcyBBc3luY0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICBzdXBlcihzY2hlZHVsZXIsIHdvcmspOwogICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIHRoaXMud29yayA9IHdvcms7CiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICB9CiAgICBzY2hlZHVsZShzdGF0ZSwgZGVsYXkgPSAwKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmlkOwogICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CiAgICAgICAgdGhpcy5pZCA9IHRoaXMuaWQgfHwgdGhpcy5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIHRoaXMuaWQsIGRlbGF5KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgIHJldHVybiBzZXRJbnRlcnZhbChzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHRoaXMpLCBkZWxheSk7CiAgICB9CiAgICByZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICBpZiAoZGVsYXkgIT09IG51bGwgJiYgdGhpcy5kZWxheSA9PT0gZGVsYXkgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpOwogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBleGVjdXRlKHN0YXRlLCBkZWxheSkgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkpOwogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHRoaXMuc2NoZWR1bGVyLCB0aGlzLmlkLCBudWxsKTsKICAgICAgICB9CiAgICB9CiAgICBfZXhlY3V0ZShzdGF0ZSwgZGVsYXkpIHsKICAgICAgICBsZXQgZXJyb3JlZCA9IGZhbHNlOwogICAgICAgIGxldCBlcnJvclZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMud29yayhzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGVycm9yZWQgPSB0cnVlOwogICAgICAgICAgICBlcnJvclZhbHVlID0gISFlICYmIGUgfHwgbmV3IEVycm9yKGUpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3JlZCkgewogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHJldHVybiBlcnJvclZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIF91bnN1YnNjcmliZSgpIHsKICAgICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7CiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zOwogICAgICAgIGNvbnN0IGluZGV4ID0gYWN0aW9ucy5pbmRleE9mKHRoaXMpOwogICAgICAgIHRoaXMud29yayA9IG51bGw7CiAgICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBudWxsOwogICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIH0KICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZWxheSA9IG51bGw7CiAgICB9Cn0KCmNsYXNzIFF1ZXVlQWN0aW9uIGV4dGVuZHMgQXN5bmNBY3Rpb24gewogICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgc3VwZXIoc2NoZWR1bGVyLCB3b3JrKTsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICB0aGlzLndvcmsgPSB3b3JrOwogICAgfQogICAgc2NoZWR1bGUoc3RhdGUsIGRlbGF5ID0gMCkgewogICAgICAgIGlmIChkZWxheSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBleGVjdXRlKHN0YXRlLCBkZWxheSkgewogICAgICAgIHJldHVybiAoZGVsYXkgPiAwIHx8IHRoaXMuY2xvc2VkKSA/CiAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGUoc3RhdGUsIGRlbGF5KSA6CiAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTsKICAgIH0KICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgIGlmICgoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB8fCAoZGVsYXkgPT09IG51bGwgJiYgdGhpcy5kZWxheSA+IDApKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICB9Cn0KCmNsYXNzIFNjaGVkdWxlciB7CiAgICBjb25zdHJ1Y3RvcihTY2hlZHVsZXJBY3Rpb24sIG5vdyA9IFNjaGVkdWxlci5ub3cpIHsKICAgICAgICB0aGlzLlNjaGVkdWxlckFjdGlvbiA9IFNjaGVkdWxlckFjdGlvbjsKICAgICAgICB0aGlzLm5vdyA9IG5vdzsKICAgIH0KICAgIHNjaGVkdWxlKHdvcmssIGRlbGF5ID0gMCwgc3RhdGUpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuU2NoZWR1bGVyQWN0aW9uKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7CiAgICB9Cn0KU2NoZWR1bGVyLm5vdyA9ICgpID0+IERhdGUubm93KCk7CgpjbGFzcyBBc3luY1NjaGVkdWxlciBleHRlbmRzIFNjaGVkdWxlciB7CiAgICBjb25zdHJ1Y3RvcihTY2hlZHVsZXJBY3Rpb24sIG5vdyA9IFNjaGVkdWxlci5ub3cpIHsKICAgICAgICBzdXBlcihTY2hlZHVsZXJBY3Rpb24sICgpID0+IHsKICAgICAgICAgICAgaWYgKEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICYmIEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICE9PSB0aGlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXIuZGVsZWdhdGUubm93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbm93KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTsKICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwogICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgfQogICAgc2NoZWR1bGUod29yaywgZGVsYXkgPSAwLCBzdGF0ZSkgewogICAgICAgIGlmIChBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAmJiBBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAhPT0gdGhpcykgewogICAgICAgICAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXIuZGVsZWdhdGUuc2NoZWR1bGUod29yaywgZGVsYXksIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5zY2hlZHVsZSh3b3JrLCBkZWxheSwgc3RhdGUpOwogICAgICAgIH0KICAgIH0KICAgIGZsdXNoKGFjdGlvbikgewogICAgICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpczsKICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHsKICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IGVycm9yOwogICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpOwogICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgUXVldWVTY2hlZHVsZXIgZXh0ZW5kcyBBc3luY1NjaGVkdWxlciB7Cn0KCmNvbnN0IHF1ZXVlID0gbmV3IFF1ZXVlU2NoZWR1bGVyKFF1ZXVlQWN0aW9uKTsKCmNvbnN0IEVNUFRZID0gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpOwpmdW5jdGlvbiBlbXB0eSQxKHNjaGVkdWxlcikgewogICAgcmV0dXJuIHNjaGVkdWxlciA/IGVtcHR5U2NoZWR1bGVkKHNjaGVkdWxlcikgOiBFTVBUWTsKfQpmdW5jdGlvbiBlbXB0eVNjaGVkdWxlZChzY2hlZHVsZXIpIHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpKTsKfQoKZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc2NoZWR1bGUgPT09ICdmdW5jdGlvbic7Cn0KCmNvbnN0IHN1YnNjcmliZVRvQXJyYXkgPSAoYXJyYXkpID0+IChzdWJzY3JpYmVyKSA9PiB7CiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSsrKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2ldKTsKICAgIH0KICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKfTsKCmZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gewogICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaSA9PT0gaW5wdXQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlucHV0W2krK10pOwogICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICBzdWIuYWRkKHRoaXMuc2NoZWR1bGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHN1YjsKICAgIH0pOwp9CgpmdW5jdGlvbiBmcm9tQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogICAgaWYgKCFzY2hlZHVsZXIpIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlVG9BcnJheShpbnB1dCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9Cn0KCmZ1bmN0aW9uIG9mKC4uLmFyZ3MpIHsKICAgIGxldCBzY2hlZHVsZXIgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CiAgICBpZiAoaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSkgewogICAgICAgIGFyZ3MucG9wKCk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoYXJncywgc2NoZWR1bGVyKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBmcm9tQXJyYXkoYXJncyk7CiAgICB9Cn0KCmZ1bmN0aW9uIHRocm93RXJyb3IoZXJyb3IsIHNjaGVkdWxlcikgewogICAgaWYgKCFzY2hlZHVsZXIpIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiBzdWJzY3JpYmVyLmVycm9yKGVycm9yKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiBzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2gsIDAsIHsgZXJyb3IsIHN1YnNjcmliZXIgfSkpOwogICAgfQp9CmZ1bmN0aW9uIGRpc3BhdGNoKHsgZXJyb3IsIHN1YnNjcmliZXIgfSkgewogICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7Cn0KCnZhciBOb3RpZmljYXRpb25LaW5kOwooZnVuY3Rpb24gKE5vdGlmaWNhdGlvbktpbmQpIHsKICAgIE5vdGlmaWNhdGlvbktpbmRbIk5FWFQiXSA9ICJOIjsKICAgIE5vdGlmaWNhdGlvbktpbmRbIkVSUk9SIl0gPSAiRSI7CiAgICBOb3RpZmljYXRpb25LaW5kWyJDT01QTEVURSJdID0gIkMiOwp9KShOb3RpZmljYXRpb25LaW5kIHx8IChOb3RpZmljYXRpb25LaW5kID0ge30pKTsKY2xhc3MgTm90aWZpY2F0aW9uIHsKICAgIGNvbnN0cnVjdG9yKGtpbmQsIHZhbHVlLCBlcnJvcikgewogICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0ga2luZCA9PT0gJ04nOwogICAgfQogICAgb2JzZXJ2ZShvYnNlcnZlcikgewogICAgICAgIHN3aXRjaCAodGhpcy5raW5kKSB7CiAgICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQgJiYgb2JzZXJ2ZXIubmV4dCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IgJiYgb2JzZXJ2ZXIuZXJyb3IodGhpcy5lcnJvcik7CiAgICAgICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlICYmIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgZG8obmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgY29uc3Qga2luZCA9IHRoaXMua2luZDsKICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICAgICAgY2FzZSAnTic6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCAmJiBuZXh0KHRoaXMudmFsdWUpOwogICAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciAmJiBlcnJvcih0aGlzLmVycm9yKTsKICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxldGUgJiYgY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBhY2NlcHQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciAmJiB0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIubmV4dCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlKG5leHRPck9ic2VydmVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpOwogICAgICAgIH0KICAgIH0KICAgIHRvT2JzZXJ2YWJsZSgpIHsKICAgICAgICBjb25zdCBraW5kID0gdGhpcy5raW5kOwogICAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnZhbHVlKTsKICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVycm9yKTsKICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkkMSgpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgbm90aWZpY2F0aW9uIGtpbmQgdmFsdWUnKTsKICAgIH0KICAgIHN0YXRpYyBjcmVhdGVOZXh0KHZhbHVlKSB7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24oJ04nLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOb3RpZmljYXRpb24udW5kZWZpbmVkVmFsdWVOb3RpZmljYXRpb247CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlRXJyb3IoZXJyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24oJ0UnLCB1bmRlZmluZWQsIGVycik7CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlQ29tcGxldGUoKSB7CiAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbi5jb21wbGV0ZU5vdGlmaWNhdGlvbjsKICAgIH0KfQpOb3RpZmljYXRpb24uY29tcGxldGVOb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCdDJyk7Ck5vdGlmaWNhdGlvbi51bmRlZmluZWRWYWx1ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oJ04nLCB1bmRlZmluZWQpOwoKZnVuY3Rpb24gb2JzZXJ2ZU9uKHNjaGVkdWxlciwgZGVsYXkgPSAwKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gb2JzZXJ2ZU9uT3BlcmF0b3JGdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IE9ic2VydmVPbk9wZXJhdG9yKHNjaGVkdWxlciwgZGVsYXkpKTsKICAgIH07Cn0KY2xhc3MgT2JzZXJ2ZU9uT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCBkZWxheSA9IDApIHsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBPYnNlcnZlT25TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuc2NoZWR1bGVyLCB0aGlzLmRlbGF5KSk7CiAgICB9Cn0KY2xhc3MgT2JzZXJ2ZU9uU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNjaGVkdWxlciwgZGVsYXkgPSAwKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgIH0KICAgIHN0YXRpYyBkaXNwYXRjaChhcmcpIHsKICAgICAgICBjb25zdCB7IG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24gfSA9IGFyZzsKICAgICAgICBub3RpZmljYXRpb24ub2JzZXJ2ZShkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogICAgc2NoZWR1bGVNZXNzYWdlKG5vdGlmaWNhdGlvbikgewogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQodGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoT2JzZXJ2ZU9uU3Vic2NyaWJlci5kaXNwYXRjaCwgdGhpcy5kZWxheSwgbmV3IE9ic2VydmVPbk1lc3NhZ2Uobm90aWZpY2F0aW9uLCB0aGlzLmRlc3RpbmF0aW9uKSkpOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpOwogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIHRoaXMuc2NoZWR1bGVNZXNzYWdlKE5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvcihlcnIpKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5zY2hlZHVsZU1lc3NhZ2UoTm90aWZpY2F0aW9uLmNyZWF0ZUNvbXBsZXRlKCkpOwogICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgIH0KfQpjbGFzcyBPYnNlcnZlT25NZXNzYWdlIHsKICAgIGNvbnN0cnVjdG9yKG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24pIHsKICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CiAgICB9Cn0KCmNsYXNzIFJlcGxheVN1YmplY3QgZXh0ZW5kcyBTdWJqZWN0IHsKICAgIGNvbnN0cnVjdG9yKGJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHdpbmRvd1RpbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHNjaGVkdWxlcikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107CiAgICAgICAgdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemUgPCAxID8gMSA6IGJ1ZmZlclNpemU7CiAgICAgICAgdGhpcy5fd2luZG93VGltZSA9IHdpbmRvd1RpbWUgPCAxID8gMSA6IHdpbmRvd1RpbWU7CiAgICAgICAgaWYgKHdpbmRvd1RpbWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgICAgICB0aGlzLl9pbmZpbml0ZVRpbWVXaW5kb3cgPSB0cnVlOwogICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLm5leHRJbmZpbml0ZVRpbWVXaW5kb3c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLm5leHRUaW1lV2luZG93OwogICAgICAgIH0KICAgIH0KICAgIG5leHRJbmZpbml0ZVRpbWVXaW5kb3codmFsdWUpIHsKICAgICAgICBjb25zdCBfZXZlbnRzID0gdGhpcy5fZXZlbnRzOwogICAgICAgIF9ldmVudHMucHVzaCh2YWx1ZSk7CiAgICAgICAgaWYgKF9ldmVudHMubGVuZ3RoID4gdGhpcy5fYnVmZmVyU2l6ZSkgewogICAgICAgICAgICBfZXZlbnRzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHN1cGVyLm5leHQodmFsdWUpOwogICAgfQogICAgbmV4dFRpbWVXaW5kb3codmFsdWUpIHsKICAgICAgICB0aGlzLl9ldmVudHMucHVzaChuZXcgUmVwbGF5RXZlbnQodGhpcy5fZ2V0Tm93KCksIHZhbHVlKSk7CiAgICAgICAgdGhpcy5fdHJpbUJ1ZmZlclRoZW5HZXRFdmVudHMoKTsKICAgICAgICBzdXBlci5uZXh0KHZhbHVlKTsKICAgIH0KICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgIGNvbnN0IF9pbmZpbml0ZVRpbWVXaW5kb3cgPSB0aGlzLl9pbmZpbml0ZVRpbWVXaW5kb3c7CiAgICAgICAgY29uc3QgX2V2ZW50cyA9IF9pbmZpbml0ZVRpbWVXaW5kb3cgPyB0aGlzLl9ldmVudHMgOiB0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpOwogICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgIGNvbnN0IGxlbiA9IF9ldmVudHMubGVuZ3RoOwogICAgICAgIGxldCBzdWJzY3JpcHRpb247CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmhhc0Vycm9yKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJqZWN0U3Vic2NyaXB0aW9uKHRoaXMsIHN1YnNjcmliZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoc2NoZWR1bGVyKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHN1YnNjcmliZXIgPSBuZXcgT2JzZXJ2ZU9uU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzY2hlZHVsZXIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9pbmZpbml0ZVRpbWVXaW5kb3cpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikgewogICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRoaXMudGhyb3duRXJyb3IpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICB9CiAgICBfZ2V0Tm93KCkgewogICAgICAgIHJldHVybiAodGhpcy5zY2hlZHVsZXIgfHwgcXVldWUpLm5vdygpOwogICAgfQogICAgX3RyaW1CdWZmZXJUaGVuR2V0RXZlbnRzKCkgewogICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX2dldE5vdygpOwogICAgICAgIGNvbnN0IF9idWZmZXJTaXplID0gdGhpcy5fYnVmZmVyU2l6ZTsKICAgICAgICBjb25zdCBfd2luZG93VGltZSA9IHRoaXMuX3dpbmRvd1RpbWU7CiAgICAgICAgY29uc3QgX2V2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICBjb25zdCBldmVudHNDb3VudCA9IF9ldmVudHMubGVuZ3RoOwogICAgICAgIGxldCBzcGxpY2VDb3VudCA9IDA7CiAgICAgICAgd2hpbGUgKHNwbGljZUNvdW50IDwgZXZlbnRzQ291bnQpIHsKICAgICAgICAgICAgaWYgKChub3cgLSBfZXZlbnRzW3NwbGljZUNvdW50XS50aW1lKSA8IF93aW5kb3dUaW1lKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzcGxpY2VDb3VudCsrOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnRzQ291bnQgPiBfYnVmZmVyU2l6ZSkgewogICAgICAgICAgICBzcGxpY2VDb3VudCA9IE1hdGgubWF4KHNwbGljZUNvdW50LCBldmVudHNDb3VudCAtIF9idWZmZXJTaXplKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNwbGljZUNvdW50ID4gMCkgewogICAgICAgICAgICBfZXZlbnRzLnNwbGljZSgwLCBzcGxpY2VDb3VudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfZXZlbnRzOwogICAgfQp9CmNsYXNzIFJlcGxheUV2ZW50IHsKICAgIGNvbnN0cnVjdG9yKHRpbWUsIHZhbHVlKSB7CiAgICAgICAgdGhpcy50aW1lID0gdGltZTsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICB9Cn0KCmxldCBuZXh0SGFuZGxlID0gMTsKY29uc3QgUkVTT0xWRUQgPSAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpKCk7CmNvbnN0IGFjdGl2ZUhhbmRsZXMgPSB7fTsKZnVuY3Rpb24gZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSkgewogICAgaWYgKGhhbmRsZSBpbiBhY3RpdmVIYW5kbGVzKSB7CiAgICAgICAgZGVsZXRlIGFjdGl2ZUhhbmRsZXNbaGFuZGxlXTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQpjb25zdCBJbW1lZGlhdGUgPSB7CiAgICBzZXRJbW1lZGlhdGUoY2IpIHsKICAgICAgICBjb25zdCBoYW5kbGUgPSBuZXh0SGFuZGxlKys7CiAgICAgICAgYWN0aXZlSGFuZGxlc1toYW5kbGVdID0gdHJ1ZTsKICAgICAgICBSRVNPTFZFRC50aGVuKCgpID0+IGZpbmRBbmRDbGVhckhhbmRsZShoYW5kbGUpICYmIGNiKCkpOwogICAgICAgIHJldHVybiBoYW5kbGU7CiAgICB9LAogICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7CiAgICAgICAgZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSk7CiAgICB9LAp9OwoKY2xhc3MgQXNhcEFjdGlvbiBleHRlbmRzIEFzeW5jQWN0aW9uIHsKICAgIGNvbnN0cnVjdG9yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHN1cGVyKHNjaGVkdWxlciwgd29yayk7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgdGhpcy53b3JrID0gd29yazsKICAgIH0KICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgIGlmIChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGVyLmFjdGlvbnMucHVzaCh0aGlzKTsKICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlZCB8fCAoc2NoZWR1bGVyLnNjaGVkdWxlZCA9IEltbWVkaWF0ZS5zZXRJbW1lZGlhdGUoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCBudWxsKSkpOwogICAgfQogICAgcmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkgPSAwKSB7CiAgICAgICAgaWYgKChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHx8IChkZWxheSA9PT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkpIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVkdWxlci5hY3Rpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBJbW1lZGlhdGUuY2xlYXJJbW1lZGlhdGUoaWQpOwogICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQp9CgpjbGFzcyBBc2FwU2NoZWR1bGVyIGV4dGVuZHMgQXN5bmNTY2hlZHVsZXIgewogICAgZmx1c2goYWN0aW9uKSB7CiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlOwogICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpczsKICAgICAgICBsZXQgZXJyb3I7CiAgICAgICAgbGV0IGluZGV4ID0gLTE7CiAgICAgICAgbGV0IGNvdW50ID0gYWN0aW9ucy5sZW5ndGg7CiAgICAgICAgYWN0aW9uID0gYWN0aW9uIHx8IGFjdGlvbnMuc2hpZnQoKTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpOwogICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpIHsKICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgIH0KfQoKY29uc3QgYXNhcCA9IG5ldyBBc2FwU2NoZWR1bGVyKEFzYXBBY3Rpb24pOwoKY29uc3QgYXN5bmMgPSBuZXcgQXN5bmNTY2hlZHVsZXIoQXN5bmNBY3Rpb24pOwoKY2xhc3MgQW5pbWF0aW9uRnJhbWVBY3Rpb24gZXh0ZW5kcyBBc3luY0FjdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICBzdXBlcihzY2hlZHVsZXIsIHdvcmspOwogICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIHRoaXMud29yayA9IHdvcms7CiAgICB9CiAgICByZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICBpZiAoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZWQgfHwgKHNjaGVkdWxlci5zY2hlZHVsZWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gc2NoZWR1bGVyLmZsdXNoKG51bGwpKSk7CiAgICB9CiAgICByZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICBpZiAoKGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ID4gMCkgfHwgKGRlbGF5ID09PSBudWxsICYmIHRoaXMuZGVsYXkgPiAwKSkgewogICAgICAgICAgICByZXR1cm4gc3VwZXIucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICBpZiAoc2NoZWR1bGVyLmFjdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KfQoKY2xhc3MgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgZXh0ZW5kcyBBc3luY1NjaGVkdWxlciB7CiAgICBmbHVzaChhY3Rpb24pIHsKICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgICAgICAgdGhpcy5zY2hlZHVsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzOwogICAgICAgIGxldCBlcnJvcjsKICAgICAgICBsZXQgaW5kZXggPSAtMTsKICAgICAgICBsZXQgY291bnQgPSBhY3Rpb25zLmxlbmd0aDsKICAgICAgICBhY3Rpb24gPSBhY3Rpb24gfHwgYWN0aW9ucy5zaGlmdCgpOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCsraW5kZXggPCBjb3VudCAmJiAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSk7CiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBjb3VudCAmJiAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSkgewogICAgICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgfQp9Cgpjb25zdCBhbmltYXRpb25GcmFtZSA9IG5ldyBBbmltYXRpb25GcmFtZVNjaGVkdWxlcihBbmltYXRpb25GcmFtZUFjdGlvbik7CgpmdW5jdGlvbiBub29wKCkgeyB9CgpmdW5jdGlvbiBpc09ic2VydmFibGUob2JqKSB7CiAgICByZXR1cm4gISFvYmogJiYgKG9iaiBpbnN0YW5jZW9mIE9ic2VydmFibGUgfHwgKHR5cGVvZiBvYmoubGlmdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykpOwp9Cgpjb25zdCBBcmd1bWVudE91dE9mUmFuZ2VFcnJvckltcGwgPSAoKCkgPT4gewogICAgZnVuY3Rpb24gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsKCkgewogICAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gJ2FyZ3VtZW50IG91dCBvZiByYW5nZSc7CiAgICAgICAgdGhpcy5uYW1lID0gJ0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yJzsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICByZXR1cm4gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsOwp9KSgpOwpjb25zdCBBcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbDsKCmZ1bmN0aW9uIG1hcChwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWFwT3BlcmF0aW9uKHNvdXJjZSkgewogICAgICAgIGlmICh0eXBlb2YgcHJvamVjdCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbi4gQXJlIHlvdSBsb29raW5nIGZvciBgbWFwVG8oKWA/Jyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTWFwT3BlcmF0b3IocHJvamVjdCwgdGhpc0FyZykpOwogICAgfTsKfQpjbGFzcyBNYXBPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgTWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMudGhpc0FyZykpOwogICAgfQp9CmNsYXNzIE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZyB8fCB0aGlzOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdC5jYWxsKHRoaXMudGhpc0FyZywgdmFsdWUsIHRoaXMuY291bnQrKyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChyZXN1bHQpOwogICAgfQp9CgpjbGFzcyBPdXRlclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7CiAgICB9CiAgICBub3RpZnlFcnJvcihlcnJvciwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycm9yKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQp9CgpjbGFzcyBJbm5lclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5vdXRlclZhbHVlID0gb3V0ZXJWYWx1ZTsKICAgICAgICB0aGlzLm91dGVySW5kZXggPSBvdXRlckluZGV4OwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlOZXh0KHRoaXMub3V0ZXJWYWx1ZSwgdmFsdWUsIHRoaXMub3V0ZXJJbmRleCwgdGhpcy5pbmRleCsrLCB0aGlzKTsKICAgIH0KICAgIF9lcnJvcihlcnJvcikgewogICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUVycm9yKGVycm9yLCB0aGlzKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5wYXJlbnQubm90aWZ5Q29tcGxldGUodGhpcyk7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQp9Cgpjb25zdCBzdWJzY3JpYmVUb1Byb21pc2UgPSAocHJvbWlzZSkgPT4gKHN1YnNjcmliZXIpID0+IHsKICAgIHByb21pc2UudGhlbigodmFsdWUpID0+IHsKICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9LCAoZXJyKSA9PiBzdWJzY3JpYmVyLmVycm9yKGVycikpCiAgICAgICAgLnRoZW4obnVsbCwgaG9zdFJlcG9ydEVycm9yKTsKICAgIHJldHVybiBzdWJzY3JpYmVyOwp9OwoKZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7CiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCAhU3ltYm9sLml0ZXJhdG9yKSB7CiAgICAgICAgcmV0dXJuICdAQGl0ZXJhdG9yJzsKICAgIH0KICAgIHJldHVybiBTeW1ib2wuaXRlcmF0b3I7Cn0KY29uc3QgaXRlcmF0b3IgPSBnZXRTeW1ib2xJdGVyYXRvcigpOwoKY29uc3Qgc3Vic2NyaWJlVG9JdGVyYWJsZSA9IChpdGVyYWJsZSkgPT4gKHN1YnNjcmliZXIpID0+IHsKICAgIGNvbnN0IGl0ZXJhdG9yJDEgPSBpdGVyYWJsZVtpdGVyYXRvcl0oKTsKICAgIGRvIHsKICAgICAgICBjb25zdCBpdGVtID0gaXRlcmF0b3IkMS5uZXh0KCk7CiAgICAgICAgaWYgKGl0ZW0uZG9uZSkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpYmVyLm5leHQoaXRlbS52YWx1ZSk7CiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0gd2hpbGUgKHRydWUpOwogICAgaWYgKHR5cGVvZiBpdGVyYXRvciQxLnJldHVybiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHN1YnNjcmliZXIuYWRkKCgpID0+IHsKICAgICAgICAgICAgaWYgKGl0ZXJhdG9yJDEucmV0dXJuKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvciQxLnJldHVybigpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc3Vic2NyaWJlcjsKfTsKCmNvbnN0IHN1YnNjcmliZVRvT2JzZXJ2YWJsZSA9IChvYmopID0+IChzdWJzY3JpYmVyKSA9PiB7CiAgICBjb25zdCBvYnMgPSBvYmpbb2JzZXJ2YWJsZV0oKTsKICAgIGlmICh0eXBlb2Ygb2JzLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gb2JzLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0KfTsKCmNvbnN0IGlzQXJyYXlMaWtlID0gKCh4KSA9PiB4ICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHggIT09ICdmdW5jdGlvbicpOwoKZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7CiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nOwp9Cgpjb25zdCBzdWJzY3JpYmVUbyA9IChyZXN1bHQpID0+IHsKICAgIGlmICghIXJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0W29ic2VydmFibGVdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvT2JzZXJ2YWJsZShyZXN1bHQpOwogICAgfQogICAgZWxzZSBpZiAoaXNBcnJheUxpa2UocmVzdWx0KSkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVUb0FycmF5KHJlc3VsdCk7CiAgICB9CiAgICBlbHNlIGlmIChpc1Byb21pc2UocmVzdWx0KSkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVUb1Byb21pc2UocmVzdWx0KTsKICAgIH0KICAgIGVsc2UgaWYgKCEhcmVzdWx0ICYmIHR5cGVvZiByZXN1bHRbaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvSXRlcmFibGUocmVzdWx0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGNvbnN0IHZhbHVlID0gaXNPYmplY3QocmVzdWx0KSA/ICdhbiBpbnZhbGlkIG9iamVjdCcgOiBgJyR7cmVzdWx0fSdgOwogICAgICAgIGNvbnN0IG1zZyA9IGBZb3UgcHJvdmlkZWQgJHt2YWx1ZX0gd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLmAKICAgICAgICAgICAgKyAnIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBBcnJheSwgb3IgSXRlcmFibGUuJzsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZyk7CiAgICB9Cn07CgpmdW5jdGlvbiBzdWJzY3JpYmVUb1Jlc3VsdChvdXRlclN1YnNjcmliZXIsIHJlc3VsdCwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcihvdXRlclN1YnNjcmliZXIsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpKSB7CiAgICBpZiAoaW5uZXJTdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkgewogICAgICAgIHJldHVybiByZXN1bHQuc3Vic2NyaWJlKGlubmVyU3Vic2NyaWJlcik7CiAgICB9CiAgICByZXR1cm4gc3Vic2NyaWJlVG8ocmVzdWx0KShpbm5lclN1YnNjcmliZXIpOwp9Cgpjb25zdCBOT05FID0ge307CmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoLi4ub2JzZXJ2YWJsZXMpIHsKICAgIGxldCByZXN1bHRTZWxlY3RvciA9IG51bGw7CiAgICBsZXQgc2NoZWR1bGVyID0gbnVsbDsKICAgIGlmIChpc1NjaGVkdWxlcihvYnNlcnZhYmxlc1tvYnNlcnZhYmxlcy5sZW5ndGggLSAxXSkpIHsKICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXN1bHRTZWxlY3RvciA9IG9ic2VydmFibGVzLnBvcCgpOwogICAgfQogICAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG9ic2VydmFibGVzWzBdKSkgewogICAgICAgIG9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXNbMF07CiAgICB9CiAgICByZXR1cm4gZnJvbUFycmF5KG9ic2VydmFibGVzLCBzY2hlZHVsZXIpLmxpZnQobmV3IENvbWJpbmVMYXRlc3RPcGVyYXRvcihyZXN1bHRTZWxlY3RvcikpOwp9CmNsYXNzIENvbWJpbmVMYXRlc3RPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihyZXN1bHRTZWxlY3RvcikgewogICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucmVzdWx0U2VsZWN0b3IpKTsKICAgIH0KfQpjbGFzcyBDb21iaW5lTGF0ZXN0U3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yOwogICAgICAgIHRoaXMuYWN0aXZlID0gMDsKICAgICAgICB0aGlzLnZhbHVlcyA9IFtdOwogICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSBbXTsKICAgIH0KICAgIF9uZXh0KG9ic2VydmFibGUpIHsKICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKE5PTkUpOwogICAgICAgIHRoaXMub2JzZXJ2YWJsZXMucHVzaChvYnNlcnZhYmxlKTsKICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IHRoaXMub2JzZXJ2YWJsZXM7CiAgICAgICAgY29uc3QgbGVuID0gb2JzZXJ2YWJsZXMubGVuZ3RoOwogICAgICAgIGlmIChsZW4gPT09IDApIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBsZW47CiAgICAgICAgICAgIHRoaXMudG9SZXNwb25kID0gbGVuOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXNbaV07CiAgICAgICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBvYnNlcnZhYmxlLCBvYnNlcnZhYmxlLCBpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSh1bnVzZWQpIHsKICAgICAgICBpZiAoKHRoaXMuYWN0aXZlIC09IDEpID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy52YWx1ZXM7CiAgICAgICAgY29uc3Qgb2xkVmFsID0gdmFsdWVzW291dGVySW5kZXhdOwogICAgICAgIGNvbnN0IHRvUmVzcG9uZCA9ICF0aGlzLnRvUmVzcG9uZAogICAgICAgICAgICA/IDAKICAgICAgICAgICAgOiBvbGRWYWwgPT09IE5PTkUgPyAtLXRoaXMudG9SZXNwb25kIDogdGhpcy50b1Jlc3BvbmQ7CiAgICAgICAgdmFsdWVzW291dGVySW5kZXhdID0gaW5uZXJWYWx1ZTsKICAgICAgICBpZiAodG9SZXNwb25kID09PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cnlSZXN1bHRTZWxlY3Rvcih2YWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlcy5zbGljZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIF90cnlSZXN1bHRTZWxlY3Rvcih2YWx1ZXMpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucmVzdWx0U2VsZWN0b3IuYXBwbHkodGhpcywgdmFsdWVzKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7CiAgICB9Cn0KCmZ1bmN0aW9uIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHsKICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQxID0gaW5wdXRbb2JzZXJ2YWJsZV0oKTsKICAgICAgICAgICAgc3ViLmFkZChvYnNlcnZhYmxlJDEuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQodmFsdWUpIHsgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKSkpOyB9LAogICAgICAgICAgICAgICAgZXJyb3IoZXJyKSB7IHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSkpOyB9LAogICAgICAgICAgICAgICAgY29tcGxldGUoKSB7IHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuY29tcGxldGUoKSkpOyB9LAogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBzdWI7CiAgICB9KTsKfQoKZnVuY3Rpb24gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gaW5wdXQudGhlbih2YWx1ZSA9PiB7CiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIGVyciA9PiB7CiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSkpOwogICAgICAgIH0pKSk7CiAgICAgICAgcmV0dXJuIHN1YjsKICAgIH0pOwp9CgpmdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgIGlmICghaW5wdXQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsJyk7CiAgICB9CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgIGxldCBpdGVyYXRvciQxOwogICAgICAgIHN1Yi5hZGQoKCkgPT4gewogICAgICAgICAgICBpZiAoaXRlcmF0b3IkMSAmJiB0eXBlb2YgaXRlcmF0b3IkMS5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yJDEucmV0dXJuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiB7CiAgICAgICAgICAgIGl0ZXJhdG9yJDEgPSBpbnB1dFtpdGVyYXRvcl0oKTsKICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHZhbHVlOwogICAgICAgICAgICAgICAgbGV0IGRvbmU7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXJhdG9yJDEubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGRvbmUgPSByZXN1bHQuZG9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gc3ViOwogICAgfSk7Cn0KCmZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHsKICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbb2JzZXJ2YWJsZV0gPT09ICdmdW5jdGlvbic7Cn0KCmZ1bmN0aW9uIGlzSXRlcmFibGUoaW5wdXQpIHsKICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nOwp9CgpmdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikgewogICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNQcm9taXNlKGlucHV0KSkgewogICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZShpbnB1dCkpIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzSXRlcmFibGUoaW5wdXQpIHx8IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigoaW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGlucHV0IHx8IGlucHV0KSArICcgaXMgbm90IG9ic2VydmFibGUnKTsKfQoKZnVuY3Rpb24gZnJvbShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICBpZiAoIXNjaGVkdWxlcikgewogICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlVG8oaW5wdXQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9Cn0KCmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5waXBlKG1lcmdlTWFwKChhLCBpKSA9PiBmcm9tKHByb2plY3QoYSwgaSkpLnBpcGUobWFwKChiLCBpaSkgPT4gcmVzdWx0U2VsZWN0b3IoYSwgYiwgaSwgaWkpKSksIGNvbmN1cnJlbnQpKTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ251bWJlcicpIHsKICAgICAgICBjb25jdXJyZW50ID0gcmVzdWx0U2VsZWN0b3I7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IE1lcmdlTWFwT3BlcmF0b3IocHJvamVjdCwgY29uY3VycmVudCkpOwp9CmNsYXNzIE1lcmdlTWFwT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IocHJvamVjdCwgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDsKICAgIH0KICAgIGNhbGwob2JzZXJ2ZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZU1hcFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJvamVjdCwgdGhpcy5jb25jdXJyZW50KSk7CiAgICB9Cn0KY2xhc3MgTWVyZ2VNYXBTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwcm9qZWN0LCBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDsKICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuYnVmZmVyID0gW107CiAgICAgICAgdGhpcy5hY3RpdmUgPSAwOwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5hY3RpdmUgPCB0aGlzLmNvbmN1cnJlbnQpIHsKICAgICAgICAgICAgdGhpcy5fdHJ5TmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBfdHJ5TmV4dCh2YWx1ZSkgewogICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4Kys7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcm9qZWN0KHZhbHVlLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuYWN0aXZlKys7CiAgICAgICAgdGhpcy5faW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpOwogICAgfQogICAgX2lubmVyU3ViKGlzaCwgdmFsdWUsIGluZGV4KSB7CiAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcih0aGlzLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQoaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICBjb25zdCBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGlzaCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgaWYgKGlubmVyU3Vic2NyaXB0aW9uICE9PSBpbm5lclN1YnNjcmliZXIpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGlubmVyU3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGlubmVyVmFsdWUpOwogICAgfQogICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgICAgICB0aGlzLnJlbW92ZShpbm5lclN1Yik7CiAgICAgICAgdGhpcy5hY3RpdmUtLTsKICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpcy5fbmV4dChidWZmZXIuc2hpZnQoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aXZlID09PSAwICYmIHRoaXMuaGFzQ29tcGxldGVkKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIG1lcmdlQWxsKGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHsKICAgIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7Cn0KCmZ1bmN0aW9uIGNvbmNhdEFsbCgpIHsKICAgIHJldHVybiBtZXJnZUFsbCgxKTsKfQoKZnVuY3Rpb24gY29uY2F0KC4uLm9ic2VydmFibGVzKSB7CiAgICByZXR1cm4gY29uY2F0QWxsKCkob2YoLi4ub2JzZXJ2YWJsZXMpKTsKfQoKZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBsZXQgaW5wdXQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaW5wdXQgPSBvYnNlcnZhYmxlRmFjdG9yeSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc291cmNlID0gaW5wdXQgPyBmcm9tKGlucHV0KSA6IGVtcHR5JDEoKTsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBmb3JrSm9pbiguLi5zb3VyY2VzKSB7CiAgICBpZiAoc291cmNlcy5sZW5ndGggPT09IDEpIHsKICAgICAgICBjb25zdCBmaXJzdCA9IHNvdXJjZXNbMF07CiAgICAgICAgaWYgKGlzQXJyYXkoZmlyc3QpKSB7CiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKGZpcnN0LCBudWxsKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzT2JqZWN0KGZpcnN0KSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZmlyc3QpID09PSBPYmplY3QucHJvdG90eXBlKSB7CiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaXJzdCk7CiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKGtleXMubWFwKGtleSA9PiBmaXJzdFtrZXldKSwga2V5cyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBzb3VyY2VzW3NvdXJjZXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBjb25zdCByZXN1bHRTZWxlY3RvciA9IHNvdXJjZXMucG9wKCk7CiAgICAgICAgc291cmNlcyA9IChzb3VyY2VzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KHNvdXJjZXNbMF0pKSA/IHNvdXJjZXNbMF0gOiBzb3VyY2VzOwogICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKHNvdXJjZXMsIG51bGwpLnBpcGUobWFwKChhcmdzKSA9PiByZXN1bHRTZWxlY3RvciguLi5hcmdzKSkpOwogICAgfQogICAgcmV0dXJuIGZvcmtKb2luSW50ZXJuYWwoc291cmNlcywgbnVsbCk7Cn0KZnVuY3Rpb24gZm9ya0pvaW5JbnRlcm5hbChzb3VyY2VzLCBrZXlzKSB7CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3QgbGVuID0gc291cmNlcy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEFycmF5KGxlbik7CiAgICAgICAgbGV0IGNvbXBsZXRlZCA9IDA7CiAgICAgICAgbGV0IGVtaXR0ZWQgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnJvbShzb3VyY2VzW2ldKTsKICAgICAgICAgICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHNvdXJjZS5zdWJzY3JpYmUoewogICAgICAgICAgICAgICAgbmV4dDogdmFsdWUgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghaGFzVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVkKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4gc3Vic2NyaWJlci5lcnJvcihlcnIpLAogICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID09PSBsZW4gfHwgIWhhc1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0dGVkID09PSBsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChrZXlzID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXksIGkpID0+IChyZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0KSwge30pIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3RvcikgewogICAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucykpIHsKICAgICAgICByZXN1bHRTZWxlY3RvciA9IG9wdGlvbnM7CiAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGlmIChyZXN1bHRTZWxlY3RvcikgewogICAgICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwKGFyZ3MgPT4gaXNBcnJheShhcmdzKSA/IHJlc3VsdFNlbGVjdG9yKC4uLmFyZ3MpIDogcmVzdWx0U2VsZWN0b3IoYXJncykpKTsKICAgIH0KICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKGUpIHsKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0dXBTdWJzY3JpcHRpb24odGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0dXBTdWJzY3JpcHRpb24oc291cmNlT2JqLCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpIHsKICAgIGxldCB1bnN1YnNjcmliZTsKICAgIGlmIChpc0V2ZW50VGFyZ2V0KHNvdXJjZU9iaikpIHsKICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VPYmo7CiAgICAgICAgc291cmNlT2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTsKICAgICAgICB1bnN1YnNjcmliZSA9ICgpID0+IHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucyk7CiAgICB9CiAgICBlbHNlIGlmIChpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHNvdXJjZU9iaikpIHsKICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VPYmo7CiAgICAgICAgc291cmNlT2JqLm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgdW5zdWJzY3JpYmUgPSAoKSA9PiBzb3VyY2Uub2ZmKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9CiAgICBlbHNlIGlmIChpc05vZGVTdHlsZUV2ZW50RW1pdHRlcihzb3VyY2VPYmopKSB7CiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlT2JqOwogICAgICAgIHNvdXJjZU9iai5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4gc291cmNlLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9CiAgICBlbHNlIGlmIChzb3VyY2VPYmogJiYgc291cmNlT2JqLmxlbmd0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzb3VyY2VPYmoubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgc2V0dXBTdWJzY3JpcHRpb24oc291cmNlT2JqW2ldLCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZXZlbnQgdGFyZ2V0Jyk7CiAgICB9CiAgICBzdWJzY3JpYmVyLmFkZCh1bnN1YnNjcmliZSk7Cn0KZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIoc291cmNlT2JqKSB7CiAgICByZXR1cm4gc291cmNlT2JqICYmIHR5cGVvZiBzb3VyY2VPYmouYWRkTGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNvdXJjZU9iai5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJzsKfQpmdW5jdGlvbiBpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHNvdXJjZU9iaikgewogICAgcmV0dXJuIHNvdXJjZU9iaiAmJiB0eXBlb2Ygc291cmNlT2JqLm9uID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzb3VyY2VPYmoub2ZmID09PSAnZnVuY3Rpb24nOwp9CmZ1bmN0aW9uIGlzRXZlbnRUYXJnZXQoc291cmNlT2JqKSB7CiAgICByZXR1cm4gc291cmNlT2JqICYmIHR5cGVvZiBzb3VyY2VPYmouYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbic7Cn0KCmZ1bmN0aW9uIGlzTnVtZXJpYyh2YWwpIHsKICAgIHJldHVybiAhaXNBcnJheSh2YWwpICYmICh2YWwgLSBwYXJzZUZsb2F0KHZhbCkgKyAxKSA+PSAwOwp9CgpmdW5jdGlvbiBpbnRlcnZhbChwZXJpb2QgPSAwLCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgaWYgKCFpc051bWVyaWMocGVyaW9kKSB8fCBwZXJpb2QgPCAwKSB7CiAgICAgICAgcGVyaW9kID0gMDsKICAgIH0KICAgIGlmICghc2NoZWR1bGVyIHx8IHR5cGVvZiBzY2hlZHVsZXIuc2NoZWR1bGUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBzY2hlZHVsZXIgPSBhc3luYzsKICAgIH0KICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBzdWJzY3JpYmVyLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2gkMSwgcGVyaW9kLCB7IHN1YnNjcmliZXIsIGNvdW50ZXI6IDAsIHBlcmlvZCB9KSk7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7CiAgICB9KTsKfQpmdW5jdGlvbiBkaXNwYXRjaCQxKHN0YXRlKSB7CiAgICBjb25zdCB7IHN1YnNjcmliZXIsIGNvdW50ZXIsIHBlcmlvZCB9ID0gc3RhdGU7CiAgICBzdWJzY3JpYmVyLm5leHQoY291bnRlcik7CiAgICB0aGlzLnNjaGVkdWxlKHsgc3Vic2NyaWJlciwgY291bnRlcjogY291bnRlciArIDEsIHBlcmlvZCB9LCBwZXJpb2QpOwp9CgpmdW5jdGlvbiBtZXJnZSguLi5vYnNlcnZhYmxlcykgewogICAgbGV0IGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgc2NoZWR1bGVyID0gbnVsbDsKICAgIGxldCBsYXN0ID0gb2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV07CiAgICBpZiAoaXNTY2hlZHVsZXIobGFzdCkpIHsKICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICBpZiAob2JzZXJ2YWJsZXMubGVuZ3RoID4gMSAmJiB0eXBlb2Ygb2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV0gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGNvbmN1cnJlbnQgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YgbGFzdCA9PT0gJ251bWJlcicpIHsKICAgICAgICBjb25jdXJyZW50ID0gb2JzZXJ2YWJsZXMucG9wKCk7CiAgICB9CiAgICBpZiAoc2NoZWR1bGVyID09PSBudWxsICYmIG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSAmJiBvYnNlcnZhYmxlc1swXSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZXNbMF07CiAgICB9CiAgICByZXR1cm4gbWVyZ2VBbGwoY29uY3VycmVudCkoZnJvbUFycmF5KG9ic2VydmFibGVzLCBzY2hlZHVsZXIpKTsKfQoKZnVuY3Rpb24gZmlsdGVyKHByZWRpY2F0ZSwgdGhpc0FyZykgewogICAgcmV0dXJuIGZ1bmN0aW9uIGZpbHRlck9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBGaWx0ZXJPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXNBcmcpKTsKICAgIH07Cn0KY2xhc3MgRmlsdGVyT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZzsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEZpbHRlclN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcmVkaWNhdGUsIHRoaXMudGhpc0FyZykpOwogICAgfQp9CmNsYXNzIEZpbHRlclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwcmVkaWNhdGUsIHRoaXNBcmcpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZzsKICAgICAgICB0aGlzLmNvdW50ID0gMDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZWRpY2F0ZS5jYWxsKHRoaXMudGhpc0FyZywgdmFsdWUsIHRoaXMuY291bnQrKyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIHRpbWVyKGR1ZVRpbWUgPSAwLCBwZXJpb2RPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7CiAgICBsZXQgcGVyaW9kID0gLTE7CiAgICBpZiAoaXNOdW1lcmljKHBlcmlvZE9yU2NoZWR1bGVyKSkgewogICAgICAgIHBlcmlvZCA9IE51bWJlcihwZXJpb2RPclNjaGVkdWxlcikgPCAxICYmIDEgfHwgTnVtYmVyKHBlcmlvZE9yU2NoZWR1bGVyKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzU2NoZWR1bGVyKHBlcmlvZE9yU2NoZWR1bGVyKSkgewogICAgICAgIHNjaGVkdWxlciA9IHBlcmlvZE9yU2NoZWR1bGVyOwogICAgfQogICAgaWYgKCFpc1NjaGVkdWxlcihzY2hlZHVsZXIpKSB7CiAgICAgICAgc2NoZWR1bGVyID0gYXN5bmM7CiAgICB9CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3QgZHVlID0gaXNOdW1lcmljKGR1ZVRpbWUpCiAgICAgICAgICAgID8gZHVlVGltZQogICAgICAgICAgICA6ICgrZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaCQyLCBkdWUsIHsKICAgICAgICAgICAgaW5kZXg6IDAsIHBlcmlvZCwgc3Vic2NyaWJlcgogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gZGlzcGF0Y2gkMihzdGF0ZSkgewogICAgY29uc3QgeyBpbmRleCwgcGVyaW9kLCBzdWJzY3JpYmVyIH0gPSBzdGF0ZTsKICAgIHN1YnNjcmliZXIubmV4dChpbmRleCk7CiAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIGlmIChwZXJpb2QgPT09IC0xKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0KICAgIHN0YXRlLmluZGV4ID0gaW5kZXggKyAxOwogICAgdGhpcy5zY2hlZHVsZShzdGF0ZSwgcGVyaW9kKTsKfQoKZnVuY3Rpb24gemlwKC4uLm9ic2VydmFibGVzKSB7CiAgICBjb25zdCByZXN1bHRTZWxlY3RvciA9IG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdOwogICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG9ic2VydmFibGVzLnBvcCgpOwogICAgfQogICAgcmV0dXJuIGZyb21BcnJheShvYnNlcnZhYmxlcywgdW5kZWZpbmVkKS5saWZ0KG5ldyBaaXBPcGVyYXRvcihyZXN1bHRTZWxlY3RvcikpOwp9CmNsYXNzIFppcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgWmlwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnJlc3VsdFNlbGVjdG9yKSk7CiAgICB9Cn0KY2xhc3MgWmlwU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHJlc3VsdFNlbGVjdG9yLCB2YWx1ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuaXRlcmF0b3JzID0gW107CiAgICAgICAgdGhpcy5hY3RpdmUgPSAwOwogICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSA/IHJlc3VsdFNlbGVjdG9yIDogbnVsbDsKICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgY29uc3QgaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7CiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGl0ZXJhdG9ycy5wdXNoKG5ldyBTdGF0aWNBcnJheUl0ZXJhdG9yKHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZVtpdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgaXRlcmF0b3JzLnB1c2gobmV3IFN0YXRpY0l0ZXJhdG9yKHZhbHVlW2l0ZXJhdG9yXSgpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpdGVyYXRvcnMucHVzaChuZXcgWmlwQnVmZmVySXRlcmF0b3IodGhpcy5kZXN0aW5hdGlvbiwgdGhpcywgdmFsdWUpKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgY29uc3QgaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7CiAgICAgICAgY29uc3QgbGVuID0gaXRlcmF0b3JzLmxlbmd0aDsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5hY3RpdmUgPSBsZW47CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBsZXQgaXRlcmF0b3IgPSBpdGVyYXRvcnNbaV07CiAgICAgICAgICAgIGlmIChpdGVyYXRvci5zdGlsbFVuc3Vic2NyaWJlZCkgewogICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGl0ZXJhdG9yLnN1YnNjcmliZShpdGVyYXRvciwgaSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUtLTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG5vdGlmeUluYWN0aXZlKCkgewogICAgICAgIHRoaXMuYWN0aXZlLS07CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBjaGVja0l0ZXJhdG9ycygpIHsKICAgICAgICBjb25zdCBpdGVyYXRvcnMgPSB0aGlzLml0ZXJhdG9yczsKICAgICAgICBjb25zdCBsZW4gPSBpdGVyYXRvcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGxldCBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvci5oYXNWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXRlcmF0b3IuaGFzVmFsdWUoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBzaG91bGRDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIGNvbnN0IGFyZ3MgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGxldCBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc0NvbXBsZXRlZCgpKSB7CiAgICAgICAgICAgICAgICBzaG91bGRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yZXN1bHRTZWxlY3RvcikgewogICAgICAgICAgICB0aGlzLl90cnlyZXN1bHRTZWxlY3RvcihhcmdzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoYXJncyk7CiAgICAgICAgfQogICAgICAgIGlmIChzaG91bGRDb21wbGV0ZSkgewogICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIF90cnlyZXN1bHRTZWxlY3RvcihhcmdzKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnJlc3VsdFNlbGVjdG9yLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTsKICAgIH0KfQpjbGFzcyBTdGF0aWNJdGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihpdGVyYXRvcikgewogICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKICAgICAgICB0aGlzLm5leHRSZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICB9CiAgICBoYXNWYWx1ZSgpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uZXh0UmVzdWx0OwogICAgICAgIHRoaXMubmV4dFJlc3VsdCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgY29uc3QgbmV4dFJlc3VsdCA9IHRoaXMubmV4dFJlc3VsdDsKICAgICAgICByZXR1cm4gbmV4dFJlc3VsdCAmJiBuZXh0UmVzdWx0LmRvbmU7CiAgICB9Cn0KY2xhc3MgU3RhdGljQXJyYXlJdGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihhcnJheSkgewogICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5sZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICB9CiAgICBbaXRlcmF0b3JdKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IGkgPSB0aGlzLmluZGV4Kys7CiAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLmFycmF5OwogICAgICAgIHJldHVybiBpIDwgdGhpcy5sZW5ndGggPyB7IHZhbHVlOiBhcnJheVtpXSwgZG9uZTogZmFsc2UgfSA6IHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTsKICAgIH0KICAgIGhhc1ZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aCA+IHRoaXMuaW5kZXg7CiAgICB9CiAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoID09PSB0aGlzLmluZGV4OwogICAgfQp9CmNsYXNzIFppcEJ1ZmZlckl0ZXJhdG9yIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwYXJlbnQsIG9ic2VydmFibGUpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTsKICAgICAgICB0aGlzLnN0aWxsVW5zdWJzY3JpYmVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdOwogICAgICAgIHRoaXMuaXNDb21wbGV0ZSA9IGZhbHNlOwogICAgfQogICAgW2l0ZXJhdG9yXSgpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0NvbXBsZXRlKSB7CiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogYnVmZmVyLnNoaWZ0KCksIGRvbmU6IGZhbHNlIH07CiAgICAgICAgfQogICAgfQogICAgaGFzVmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCA+IDA7CiAgICB9CiAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlzQ29tcGxldGU7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0aGlzLmlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlJbmFjdGl2ZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKGlubmVyVmFsdWUpOwogICAgICAgIHRoaXMucGFyZW50LmNoZWNrSXRlcmF0b3JzKCk7CiAgICB9CiAgICBzdWJzY3JpYmUodmFsdWUsIGluZGV4KSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHRoaXMub2JzZXJ2YWJsZSwgdGhpcywgaW5kZXgpOwogICAgfQp9CgpmdW5jdGlvbiBhdWRpdChkdXJhdGlvblNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gYXVkaXRPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgQXVkaXRPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9Owp9CmNsYXNzIEF1ZGl0T3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBBdWRpdFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9Cn0KY2xhc3MgQXVkaXRTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBkdXJhdGlvblNlbGVjdG9yKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGZhbHNlOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgaWYgKCF0aGlzLnRocm90dGxlZCkgewogICAgICAgICAgICBsZXQgZHVyYXRpb247CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IGR1cmF0aW9uU2VsZWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGR1cmF0aW9uU2VsZWN0b3IodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbik7CiAgICAgICAgICAgIGlmICghaW5uZXJTdWJzY3JpcHRpb24gfHwgaW5uZXJTdWJzY3JpcHRpb24uY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGhyb3R0bGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMudGhyb3R0bGVkID0gaW5uZXJTdWJzY3JpcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xlYXJUaHJvdHRsZSgpIHsKICAgICAgICBjb25zdCB7IHZhbHVlLCBoYXNWYWx1ZSwgdGhyb3R0bGVkIH0gPSB0aGlzOwogICAgICAgIGlmICh0aHJvdHRsZWQpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhyb3R0bGVkKTsKICAgICAgICAgICAgdGhpcy50aHJvdHRsZWQgPSBudWxsOwogICAgICAgICAgICB0aHJvdHRsZWQudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KSB7CiAgICAgICAgdGhpcy5jbGVhclRocm90dGxlKCk7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmNsZWFyVGhyb3R0bGUoKTsKICAgIH0KfQoKZnVuY3Rpb24gYXVkaXRUaW1lKGR1cmF0aW9uLCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgcmV0dXJuIGF1ZGl0KCgpID0+IHRpbWVyKGR1cmF0aW9uLCBzY2hlZHVsZXIpKTsKfQoKZnVuY3Rpb24gY2F0Y2hFcnJvcihzZWxlY3RvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uIGNhdGNoRXJyb3JPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIGNvbnN0IG9wZXJhdG9yID0gbmV3IENhdGNoT3BlcmF0b3Ioc2VsZWN0b3IpOwogICAgICAgIGNvbnN0IGNhdWdodCA9IHNvdXJjZS5saWZ0KG9wZXJhdG9yKTsKICAgICAgICByZXR1cm4gKG9wZXJhdG9yLmNhdWdodCA9IGNhdWdodCk7CiAgICB9Owp9CmNsYXNzIENhdGNoT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioc2VsZWN0b3IpIHsKICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBDYXRjaFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5zZWxlY3RvciwgdGhpcy5jYXVnaHQpKTsKICAgIH0KfQpjbGFzcyBDYXRjaFN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNlbGVjdG9yLCBjYXVnaHQpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwogICAgICAgIHRoaXMuY2F1Z2h0ID0gY2F1Z2h0OwogICAgfQogICAgZXJyb3IoZXJyKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zZWxlY3RvcihlcnIsIHRoaXMuY2F1Z2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyMikgewogICAgICAgICAgICAgICAgc3VwZXIuZXJyb3IoZXJyMik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlKCk7CiAgICAgICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaWJlciA9IG5ldyBJbm5lclN1YnNjcmliZXIodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQpOwogICAgICAgICAgICB0aGlzLmFkZChpbm5lclN1YnNjcmliZXIpOwogICAgICAgICAgICBjb25zdCBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJlc3VsdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZChpbm5lclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikgewogICAgcmV0dXJuIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCAxKTsKfQoKZnVuY3Rpb24gZGVib3VuY2UoZHVyYXRpb25TZWxlY3RvcikgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBEZWJvdW5jZU9wZXJhdG9yKGR1cmF0aW9uU2VsZWN0b3IpKTsKfQpjbGFzcyBEZWJvdW5jZU9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGR1cmF0aW9uU2VsZWN0b3IpIHsKICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVib3VuY2VTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuZHVyYXRpb25TZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIERlYm91bmNlU3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kdXJhdGlvblNlbGVjdG9yLmNhbGwodGhpcywgdmFsdWUpOwogICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cnlOZXh0KHZhbHVlLCByZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0KICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmVtaXRWYWx1ZSgpOwogICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgIH0KICAgIF90cnlOZXh0KHZhbHVlLCBkdXJhdGlvbikgewogICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uOwogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLnJlbW92ZShzdWJzY3JpcHRpb24pOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbik7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5lbWl0VmFsdWUoKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKCkgewogICAgICAgIHRoaXMuZW1pdFZhbHVlKCk7CiAgICB9CiAgICBlbWl0VmFsdWUoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICBzdXBlci5fbmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBkZWJvdW5jZVRpbWUoZHVlVGltZSwgc2NoZWR1bGVyID0gYXN5bmMpIHsKICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRGVib3VuY2VUaW1lT3BlcmF0b3IoZHVlVGltZSwgc2NoZWR1bGVyKSk7Cn0KY2xhc3MgRGVib3VuY2VUaW1lT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZHVlVGltZSwgc2NoZWR1bGVyKSB7CiAgICAgICAgdGhpcy5kdWVUaW1lID0gZHVlVGltZTsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IERlYm91bmNlVGltZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdWVUaW1lLCB0aGlzLnNjaGVkdWxlcikpOwogICAgfQp9CmNsYXNzIERlYm91bmNlVGltZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBkdWVUaW1lLCBzY2hlZHVsZXIpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5kdWVUaW1lID0gZHVlVGltZTsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICB0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsOwogICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgdGhpcy5jbGVhckRlYm91bmNlKCk7CiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICB0aGlzLmFkZCh0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTmV4dCwgdGhpcy5kdWVUaW1lLCB0aGlzKSk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5kZWJvdW5jZWROZXh0KCk7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQogICAgZGVib3VuY2VkTmV4dCgpIHsKICAgICAgICB0aGlzLmNsZWFyRGVib3VuY2UoKTsKICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZSkgewogICAgICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChsYXN0VmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGNsZWFyRGVib3VuY2UoKSB7CiAgICAgICAgY29uc3QgZGVib3VuY2VkU3Vic2NyaXB0aW9uID0gdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb247CiAgICAgICAgaWYgKGRlYm91bmNlZFN1YnNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZShkZWJvdW5jZWRTdWJzY3JpcHRpb24pOwogICAgICAgICAgICBkZWJvdW5jZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgIH0KICAgIH0KfQpmdW5jdGlvbiBkaXNwYXRjaE5leHQoc3Vic2NyaWJlcikgewogICAgc3Vic2NyaWJlci5kZWJvdW5jZWROZXh0KCk7Cn0KCmZ1bmN0aW9uIGRlbGF5V2hlbihkZWxheUR1cmF0aW9uU2VsZWN0b3IsIHN1YnNjcmlwdGlvbkRlbGF5KSB7CiAgICBpZiAoc3Vic2NyaXB0aW9uRGVsYXkpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gbmV3IFN1YnNjcmlwdGlvbkRlbGF5T2JzZXJ2YWJsZShzb3VyY2UsIHN1YnNjcmlwdGlvbkRlbGF5KQogICAgICAgICAgICAubGlmdChuZXcgRGVsYXlXaGVuT3BlcmF0b3IoZGVsYXlEdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IERlbGF5V2hlbk9wZXJhdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikpOwp9CmNsYXNzIERlbGF5V2hlbk9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHRoaXMuZGVsYXlEdXJhdGlvblNlbGVjdG9yID0gZGVsYXlEdXJhdGlvblNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVsYXlXaGVuU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmRlbGF5RHVyYXRpb25TZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIERlbGF5V2hlblN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIGRlbGF5RHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmRlbGF5RHVyYXRpb25TZWxlY3RvciA9IGRlbGF5RHVyYXRpb25TZWxlY3RvcjsKICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMgPSBbXTsKICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgIH0KICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQob3V0ZXJWYWx1ZSk7CiAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oaW5uZXJTdWIpOwogICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgIH0KICAgIG5vdGlmeUVycm9yKGVycm9yLCBpbm5lclN1YikgewogICAgICAgIHRoaXMuX2Vycm9yKGVycm9yKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihpbm5lclN1Yik7CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4Kys7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGVsYXlOb3RpZmllciA9IHRoaXMuZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCk7CiAgICAgICAgICAgIGlmIChkZWxheU5vdGlmaWVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRyeURlbGF5KGRlbGF5Tm90aWZpZXIsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICByZW1vdmVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uSWR4ID0gdGhpcy5kZWxheU5vdGlmaWVyU3Vic2NyaXB0aW9ucy5pbmRleE9mKHN1YnNjcmlwdGlvbik7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbklkeCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5kZWxheU5vdGlmaWVyU3Vic2NyaXB0aW9ucy5zcGxpY2Uoc3Vic2NyaXB0aW9uSWR4LCAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5vdXRlclZhbHVlOwogICAgfQogICAgdHJ5RGVsYXkoZGVsYXlOb3RpZmllciwgdmFsdWUpIHsKICAgICAgICBjb25zdCBub3RpZmllclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGRlbGF5Tm90aWZpZXIsIHZhbHVlKTsKICAgICAgICBpZiAobm90aWZpZXJTdWJzY3JpcHRpb24gJiYgIW5vdGlmaWVyU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChub3RpZmllclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMucHVzaChub3RpZmllclN1YnNjcmlwdGlvbik7CiAgICAgICAgfQogICAgfQogICAgdHJ5Q29tcGxldGUoKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGxldGVkICYmIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9Cn0KY2xhc3MgU3Vic2NyaXB0aW9uRGVsYXlPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHN1YnNjcmlwdGlvbkRlbGF5KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkRlbGF5ID0gc3Vic2NyaXB0aW9uRGVsYXk7CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkRlbGF5LnN1YnNjcmliZShuZXcgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuc291cmNlKSk7CiAgICB9Cn0KY2xhc3MgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHNvdXJjZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpYmVkID0gZmFsc2U7CiAgICB9CiAgICBfbmV4dCh1bnVzZWQpIHsKICAgICAgICB0aGlzLnN1YnNjcmliZVRvU291cmNlKCk7CiAgICB9CiAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMucGFyZW50LmVycm9yKGVycik7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuc3Vic2NyaWJlVG9Tb3VyY2UoKTsKICAgIH0KICAgIHN1YnNjcmliZVRvU291cmNlKCkgewogICAgICAgIGlmICghdGhpcy5zb3VyY2VTdWJzY3JpYmVkKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlU3Vic2NyaWJlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKHRoaXMucGFyZW50KTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGRlbWF0ZXJpYWxpemUoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gZGVtYXRlcmlhbGl6ZU9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBEZU1hdGVyaWFsaXplT3BlcmF0b3IoKSk7CiAgICB9Owp9CmNsYXNzIERlTWF0ZXJpYWxpemVPcGVyYXRvciB7CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZU1hdGVyaWFsaXplU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7CiAgICB9Cn0KY2xhc3MgRGVNYXRlcmlhbGl6ZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB2YWx1ZS5vYnNlcnZlKHRoaXMuZGVzdGluYXRpb24pOwogICAgfQp9CgpmdW5jdGlvbiBkaXN0aW5jdFVudGlsQ2hhbmdlZChjb21wYXJlLCBrZXlTZWxlY3RvcikgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9wZXJhdG9yKGNvbXBhcmUsIGtleVNlbGVjdG9yKSk7Cn0KY2xhc3MgRGlzdGluY3RVbnRpbENoYW5nZWRPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3Rvcihjb21wYXJlLCBrZXlTZWxlY3RvcikgewogICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7CiAgICAgICAgdGhpcy5rZXlTZWxlY3RvciA9IGtleVNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGlzdGluY3RVbnRpbENoYW5nZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY29tcGFyZSwgdGhpcy5rZXlTZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIERpc3RpbmN0VW50aWxDaGFuZ2VkU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIGNvbXBhcmUsIGtleVNlbGVjdG9yKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjsKICAgICAgICB0aGlzLmhhc0tleSA9IGZhbHNlOwogICAgICAgIGlmICh0eXBlb2YgY29tcGFyZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBhcmUoeCwgeSkgewogICAgICAgIHJldHVybiB4ID09PSB5OwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBsZXQga2V5OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHsga2V5U2VsZWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICAgIGtleSA9IGtleVNlbGVjdG9yID8ga2V5U2VsZWN0b3IodmFsdWUpIDogdmFsdWU7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLmhhc0tleSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgeyBjb21wYXJlIH0gPSB0aGlzOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZSh0aGlzLmtleSwga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmhhc0tleSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gdGFrZShjb3VudCkgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHsKICAgICAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGVtcHR5JDEoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgVGFrZU9wZXJhdG9yKGNvdW50KSk7CiAgICAgICAgfQogICAgfTsKfQpjbGFzcyBUYWtlT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IodG90YWwpIHsKICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICAgICAgaWYgKHRoaXMudG90YWwgPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcjsKICAgICAgICB9CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnRvdGFsKSk7CiAgICB9Cn0KY2xhc3MgVGFrZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCB0b3RhbCkgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICB9CiAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbDsKICAgICAgICBjb25zdCBjb3VudCA9ICsrdGhpcy5jb3VudDsKICAgICAgICBpZiAoY291bnQgPD0gdG90YWwpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgaWYgKGNvdW50ID09PSB0b3RhbCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBleGhhdXN0TWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICBpZiAocmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLnBpcGUoZXhoYXVzdE1hcCgoYSwgaSkgPT4gZnJvbShwcm9qZWN0KGEsIGkpKS5waXBlKG1hcCgoYiwgaWkpID0+IHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKSkpKSk7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IEV4aGF1c3RNYXBPcGVyYXRvcihwcm9qZWN0KSk7Cn0KY2xhc3MgRXhoYXVzdE1hcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKHByb2plY3QpIHsKICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRXhoYXVzdE1hcFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcm9qZWN0KSk7CiAgICB9Cn0KY2xhc3MgRXhoYXVzdE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHByb2plY3QpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICB0aGlzLmhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlOwogICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5pbmRleCA9IDA7CiAgICB9CiAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy50cnlOZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICB0cnlOZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QodmFsdWUsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5oYXNTdWJzY3JpcHRpb24gPSB0cnVlOwogICAgICAgIHRoaXMuX2lubmVyU3ViKHJlc3VsdCwgdmFsdWUsIGluZGV4KTsKICAgIH0KICAgIF9pbm5lclN1YihyZXN1bHQsIHZhbHVlLCBpbmRleCkgewogICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaWJlciA9IG5ldyBJbm5lclN1YnNjcmliZXIodGhpcywgdmFsdWUsIGluZGV4KTsKICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgZGVzdGluYXRpb24uYWRkKGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXN1bHQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpbm5lclN1YnNjcmliZXIpOwogICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChpbm5lclN1YnNjcmlwdGlvbik7CiAgICAgICAgfQogICAgfQogICAgX2NvbXBsZXRlKCkgewogICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTsKICAgIH0KICAgIG5vdGlmeUVycm9yKGVycikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgIGRlc3RpbmF0aW9uLnJlbW92ZShpbm5lclN1Yik7CiAgICAgICAgdGhpcy5oYXNTdWJzY3JpcHRpb24gPSBmYWxzZTsKICAgICAgICBpZiAodGhpcy5oYXNDb21wbGV0ZWQpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gZmluYWxpemUoY2FsbGJhY2spIHsKICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRmluYWxseU9wZXJhdG9yKGNhbGxiYWNrKSk7Cn0KY2xhc3MgRmluYWxseU9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRmluYWxseVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5jYWxsYmFjaykpOwogICAgfQp9CmNsYXNzIEZpbmFsbHlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgY2FsbGJhY2spIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5hZGQobmV3IFN1YnNjcmlwdGlvbihjYWxsYmFjaykpOwogICAgfQp9CgpmdW5jdGlvbiBpZ25vcmVFbGVtZW50cygpIHsKICAgIHJldHVybiBmdW5jdGlvbiBpZ25vcmVFbGVtZW50c09wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBJZ25vcmVFbGVtZW50c09wZXJhdG9yKCkpOwogICAgfTsKfQpjbGFzcyBJZ25vcmVFbGVtZW50c09wZXJhdG9yIHsKICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IElnbm9yZUVsZW1lbnRzU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7CiAgICB9Cn0KY2xhc3MgSWdub3JlRWxlbWVudHNTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBfbmV4dCh1bnVzZWQpIHsKICAgIH0KfQoKZnVuY3Rpb24gbWF0ZXJpYWxpemUoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWF0ZXJpYWxpemVPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTWF0ZXJpYWxpemVPcGVyYXRvcigpKTsKICAgIH07Cn0KY2xhc3MgTWF0ZXJpYWxpemVPcGVyYXRvciB7CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBNYXRlcmlhbGl6ZVN1YnNjcmliZXIoc3Vic2NyaWJlcikpOwogICAgfQp9CmNsYXNzIE1hdGVyaWFsaXplU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24pIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICB9CiAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpOwogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KE5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvcihlcnIpKTsKICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQogICAgX2NvbXBsZXRlKCkgewogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KE5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSgpKTsKICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQp9CgpmdW5jdGlvbiBzY2FuKGFjY3VtdWxhdG9yLCBzZWVkKSB7CiAgICBsZXQgaGFzU2VlZCA9IGZhbHNlOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgIGhhc1NlZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIHNjYW5PcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgU2Nhbk9wZXJhdG9yKGFjY3VtdWxhdG9yLCBzZWVkLCBoYXNTZWVkKSk7CiAgICB9Owp9CmNsYXNzIFNjYW5PcGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihhY2N1bXVsYXRvciwgc2VlZCwgaGFzU2VlZCA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yOwogICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7CiAgICAgICAgdGhpcy5oYXNTZWVkID0gaGFzU2VlZDsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNjYW5TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuYWNjdW11bGF0b3IsIHRoaXMuc2VlZCwgdGhpcy5oYXNTZWVkKSk7CiAgICB9Cn0KY2xhc3MgU2NhblN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBhY2N1bXVsYXRvciwgX3NlZWQsIGhhc1NlZWQpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yOwogICAgICAgIHRoaXMuX3NlZWQgPSBfc2VlZDsKICAgICAgICB0aGlzLmhhc1NlZWQgPSBoYXNTZWVkOwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgfQogICAgZ2V0IHNlZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlZWQ7CiAgICB9CiAgICBzZXQgc2VlZCh2YWx1ZSkgewogICAgICAgIHRoaXMuaGFzU2VlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fc2VlZCA9IHZhbHVlOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBpZiAoIXRoaXMuaGFzU2VlZCkgewogICAgICAgICAgICB0aGlzLnNlZWQgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnlOZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBfdHJ5TmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCsrOwogICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5hY2N1bXVsYXRvcih0aGlzLnNlZWQsIHZhbHVlLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlZWQgPSByZXN1bHQ7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7CiAgICB9Cn0KCmZ1bmN0aW9uIG11bHRpY2FzdChzdWJqZWN0T3JTdWJqZWN0RmFjdG9yeSwgc2VsZWN0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbiBtdWx0aWNhc3RPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIGxldCBzdWJqZWN0RmFjdG9yeTsKICAgICAgICBpZiAodHlwZW9mIHN1YmplY3RPclN1YmplY3RGYWN0b3J5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHN1YmplY3RGYWN0b3J5ID0gc3ViamVjdE9yU3ViamVjdEZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdWJqZWN0RmFjdG9yeSA9IGZ1bmN0aW9uIHN1YmplY3RGYWN0b3J5KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YmplY3RPclN1YmplY3RGYWN0b3J5OwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTXVsdGljYXN0T3BlcmF0b3Ioc3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlID0gT2JqZWN0LmNyZWF0ZShzb3VyY2UsIGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IpOwogICAgICAgIGNvbm5lY3RhYmxlLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICBjb25uZWN0YWJsZS5zdWJqZWN0RmFjdG9yeSA9IHN1YmplY3RGYWN0b3J5OwogICAgICAgIHJldHVybiBjb25uZWN0YWJsZTsKICAgIH07Cn0KY2xhc3MgTXVsdGljYXN0T3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioc3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSB7CiAgICAgICAgdGhpcy5zdWJqZWN0RmFjdG9yeSA9IHN1YmplY3RGYWN0b3J5OwogICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgY29uc3QgeyBzZWxlY3RvciB9ID0gdGhpczsKICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0RmFjdG9yeSgpOwogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNlbGVjdG9yKHN1YmplY3QpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHNvdXJjZS5zdWJzY3JpYmUoc3ViamVjdCkpOwogICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICB9Cn0KCmZ1bmN0aW9uIHBhaXJ3aXNlKCkgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBQYWlyd2lzZU9wZXJhdG9yKCkpOwp9CmNsYXNzIFBhaXJ3aXNlT3BlcmF0b3IgewogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUGFpcndpc2VTdWJzY3JpYmVyKHN1YnNjcmliZXIpKTsKICAgIH0KfQpjbGFzcyBQYWlyd2lzZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuaGFzUHJldiA9IGZhbHNlOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBsZXQgcGFpcjsKICAgICAgICBpZiAodGhpcy5oYXNQcmV2KSB7CiAgICAgICAgICAgIHBhaXIgPSBbdGhpcy5wcmV2LCB2YWx1ZV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmhhc1ByZXYgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLnByZXYgPSB2YWx1ZTsKICAgICAgICBpZiAocGFpcikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocGFpcik7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBwbHVjayguLi5wcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBsZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpc3Qgb2YgcHJvcGVydGllcyBjYW5ub3QgYmUgZW1wdHkuJyk7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gbWFwKHBsdWNrZXIocHJvcGVydGllcywgbGVuZ3RoKSkoc291cmNlKTsKfQpmdW5jdGlvbiBwbHVja2VyKHByb3BzLCBsZW5ndGgpIHsKICAgIGNvbnN0IG1hcHBlciA9ICh4KSA9PiB7CiAgICAgICAgbGV0IGN1cnJlbnRQcm9wID0geDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHAgPSBjdXJyZW50UHJvcFtwcm9wc1tpXV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wID0gcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9wOwogICAgfTsKICAgIHJldHVybiBtYXBwZXI7Cn0KCmZ1bmN0aW9uIHJlcGVhdFdoZW4obm90aWZpZXIpIHsKICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgUmVwZWF0V2hlbk9wZXJhdG9yKG5vdGlmaWVyKSk7Cn0KY2xhc3MgUmVwZWF0V2hlbk9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKG5vdGlmaWVyKSB7CiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmVwZWF0V2hlblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllciwgc291cmNlKSk7CiAgICB9Cn0KY2xhc3MgUmVwZWF0V2hlblN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG5vdGlmaWVyLCBzb3VyY2UpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwogICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgIHRoaXMuc291cmNlSXNCZWluZ1N1YnNjcmliZWRUbyA9IHRydWU7CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5zb3VyY2VJc0JlaW5nU3Vic2NyaWJlZFRvID0gdHJ1ZTsKICAgICAgICB0aGlzLnNvdXJjZS5zdWJzY3JpYmUodGhpcyk7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZShpbm5lclN1YikgewogICAgICAgIGlmICh0aGlzLnNvdXJjZUlzQmVpbmdTdWJzY3JpYmVkVG8gPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIHRoaXMuc291cmNlSXNCZWluZ1N1YnNjcmliZWRUbyA9IGZhbHNlOwogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnJldHJpZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9SZXRyaWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gfHwgdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlKCk7CiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5uZXh0KCk7CiAgICAgICAgfQogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IHsgbm90aWZpY2F0aW9ucywgcmV0cmllc1N1YnNjcmlwdGlvbiB9ID0gdGhpczsKICAgICAgICBpZiAobm90aWZpY2F0aW9ucykgewogICAgICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChyZXRyaWVzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHJldHJpZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXRyaWVzID0gbnVsbDsKICAgIH0KICAgIF91bnN1YnNjcmliZUFuZFJlY3ljbGUoKSB7CiAgICAgICAgY29uc3QgeyBfdW5zdWJzY3JpYmUgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBudWxsOwogICAgICAgIHN1cGVyLl91bnN1YnNjcmliZUFuZFJlY3ljbGUoKTsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IF91bnN1YnNjcmliZTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN1YnNjcmliZVRvUmV0cmllcygpIHsKICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBuZXcgU3ViamVjdCgpOwogICAgICAgIGxldCByZXRyaWVzOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHsgbm90aWZpZXIgfSA9IHRoaXM7CiAgICAgICAgICAgIHJldHJpZXMgPSBub3RpZmllcih0aGlzLm5vdGlmaWNhdGlvbnMpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXRyaWVzID0gcmV0cmllczsKICAgICAgICB0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXRyaWVzKTsKICAgIH0KfQoKZnVuY3Rpb24gc2hhcmVTdWJqZWN0RmFjdG9yeSgpIHsKICAgIHJldHVybiBuZXcgU3ViamVjdCgpOwp9CmZ1bmN0aW9uIHNoYXJlKCkgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHJlZkNvdW50KCkobXVsdGljYXN0KHNoYXJlU3ViamVjdEZhY3RvcnkpKHNvdXJjZSkpOwp9CgpmdW5jdGlvbiBzaGFyZVJlcGxheShjb25maWdPckJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNjaGVkdWxlcikgewogICAgbGV0IGNvbmZpZzsKICAgIGlmIChjb25maWdPckJ1ZmZlclNpemUgJiYgdHlwZW9mIGNvbmZpZ09yQnVmZmVyU2l6ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICBjb25maWcgPSBjb25maWdPckJ1ZmZlclNpemU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25maWcgPSB7CiAgICAgICAgICAgIGJ1ZmZlclNpemU6IGNvbmZpZ09yQnVmZmVyU2l6ZSwKICAgICAgICAgICAgd2luZG93VGltZSwKICAgICAgICAgICAgcmVmQ291bnQ6IGZhbHNlLAogICAgICAgICAgICBzY2hlZHVsZXIKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KHNoYXJlUmVwbGF5T3BlcmF0b3IoY29uZmlnKSk7Cn0KZnVuY3Rpb24gc2hhcmVSZXBsYXlPcGVyYXRvcih7IGJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHdpbmRvd1RpbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHJlZkNvdW50OiB1c2VSZWZDb3VudCwgc2NoZWR1bGVyIH0pIHsKICAgIGxldCBzdWJqZWN0OwogICAgbGV0IHJlZkNvdW50ID0gMDsKICAgIGxldCBzdWJzY3JpcHRpb247CiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTsKICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7CiAgICByZXR1cm4gZnVuY3Rpb24gc2hhcmVSZXBsYXlPcGVyYXRpb24oc291cmNlKSB7CiAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICBpZiAoIXN1YmplY3QgfHwgaGFzRXJyb3IpIHsKICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNjaGVkdWxlcik7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHNvdXJjZS5zdWJzY3JpYmUoewogICAgICAgICAgICAgICAgbmV4dCh2YWx1ZSkgeyBzdWJqZWN0Lm5leHQodmFsdWUpOyB9LAogICAgICAgICAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb21wbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlubmVyU3ViID0gc3ViamVjdC5zdWJzY3JpYmUodGhpcyk7CiAgICAgICAgdGhpcy5hZGQoKCkgPT4gewogICAgICAgICAgICByZWZDb3VudC0tOwogICAgICAgICAgICBpbm5lclN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uICYmICFpc0NvbXBsZXRlICYmIHVzZVJlZkNvdW50ICYmIHJlZkNvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHN1YmplY3QgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07Cn0KCmZ1bmN0aW9uIHN0YXJ0V2l0aCguLi5hcnJheSkgewogICAgY29uc3Qgc2NoZWR1bGVyID0gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07CiAgICBpZiAoaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSkgewogICAgICAgIGFycmF5LnBvcCgpOwogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBjb25jYXQoYXJyYXksIHNvdXJjZSwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBjb25jYXQoYXJyYXksIHNvdXJjZSk7CiAgICB9Cn0KCmZ1bmN0aW9uIHN3aXRjaE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikgewogICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UucGlwZShzd2l0Y2hNYXAoKGEsIGkpID0+IGZyb20ocHJvamVjdChhLCBpKSkucGlwZShtYXAoKGIsIGlpKSA9PiByZXN1bHRTZWxlY3RvcihhLCBiLCBpLCBpaSkpKSkpOwogICAgfQogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBTd2l0Y2hNYXBPcGVyYXRvcihwcm9qZWN0KSk7Cn0KY2xhc3MgU3dpdGNoTWFwT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IocHJvamVjdCkgewogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBTd2l0Y2hNYXBTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucHJvamVjdCkpOwogICAgfQp9CmNsYXNzIFN3aXRjaE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHByb2plY3QpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QodmFsdWUsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyb3IpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lubmVyU3ViKHJlc3VsdCwgdmFsdWUsIGluZGV4KTsKICAgIH0KICAgIF9pbm5lclN1YihyZXN1bHQsIHZhbHVlLCBpbmRleCkgewogICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaXB0aW9uID0gdGhpcy5pbm5lclN1YnNjcmlwdGlvbjsKICAgICAgICBpZiAoaW5uZXJTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgaW5uZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcih0aGlzLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQoaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgcmVzdWx0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICBpZiAodGhpcy5pbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZCh0aGlzLmlubmVyU3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgY29uc3QgeyBpbm5lclN1YnNjcmlwdGlvbiB9ID0gdGhpczsKICAgICAgICBpZiAoIWlubmVyU3Vic2NyaXB0aW9uIHx8IGlubmVyU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICBzdXBlci5fY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIHRoaXMuaW5uZXJTdWJzY3JpcHRpb24gPSBudWxsOwogICAgfQogICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgZGVzdGluYXRpb24ucmVtb3ZlKGlubmVyU3ViKTsKICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgc3VwZXIuX2NvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTsKICAgIH0KfQoKZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IFRha2VVbnRpbE9wZXJhdG9yKG5vdGlmaWVyKSk7Cn0KY2xhc3MgVGFrZVVudGlsT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Iobm90aWZpZXIpIHsKICAgICAgICB0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIGNvbnN0IHRha2VVbnRpbFN1YnNjcmliZXIgPSBuZXcgVGFrZVVudGlsU3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKICAgICAgICBjb25zdCBub3RpZmllclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRha2VVbnRpbFN1YnNjcmliZXIsIHRoaXMubm90aWZpZXIpOwogICAgICAgIGlmIChub3RpZmllclN1YnNjcmlwdGlvbiAmJiAhdGFrZVVudGlsU3Vic2NyaWJlci5zZWVuVmFsdWUpIHsKICAgICAgICAgICAgdGFrZVVudGlsU3Vic2NyaWJlci5hZGQobm90aWZpZXJTdWJzY3JpcHRpb24pOwogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZSh0YWtlVW50aWxTdWJzY3JpYmVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRha2VVbnRpbFN1YnNjcmliZXI7CiAgICB9Cn0KY2xhc3MgVGFrZVVudGlsU3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbikgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLnNlZW5WYWx1ZSA9IGZhbHNlOwogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgIHRoaXMuc2VlblZhbHVlID0gdHJ1ZTsKICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgIH0KfQoKZnVuY3Rpb24gdGFwKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpIHsKICAgIHJldHVybiBmdW5jdGlvbiB0YXBPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgRG9PcGVyYXRvcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSk7CiAgICB9Owp9CmNsYXNzIERvT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHRoaXMubmV4dE9yT2JzZXJ2ZXIgPSBuZXh0T3JPYnNlcnZlcjsKICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm5leHRPck9ic2VydmVyLCB0aGlzLmVycm9yLCB0aGlzLmNvbXBsZXRlKSk7CiAgICB9Cn0KY2xhc3MgVGFwU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5fdGFwTmV4dCA9IG5vb3A7CiAgICAgICAgdGhpcy5fdGFwRXJyb3IgPSBub29wOwogICAgICAgIHRoaXMuX3RhcENvbXBsZXRlID0gbm9vcDsKICAgICAgICB0aGlzLl90YXBFcnJvciA9IGVycm9yIHx8IG5vb3A7CiAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUgPSBjb21wbGV0ZSB8fCBub29wOwogICAgICAgIGlmIChpc0Z1bmN0aW9uKG9ic2VydmVyT3JOZXh0KSkgewogICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fdGFwTmV4dCA9IG9ic2VydmVyT3JOZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYnNlcnZlck9yTmV4dCkgewogICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gb2JzZXJ2ZXJPck5leHQ7CiAgICAgICAgICAgIHRoaXMuX3RhcE5leHQgPSBvYnNlcnZlck9yTmV4dC5uZXh0IHx8IG5vb3A7CiAgICAgICAgICAgIHRoaXMuX3RhcEVycm9yID0gb2JzZXJ2ZXJPck5leHQuZXJyb3IgfHwgbm9vcDsKICAgICAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUgPSBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSB8fCBub29wOwogICAgICAgIH0KICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5fdGFwTmV4dC5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgIH0KICAgIF9lcnJvcihlcnIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLl90YXBFcnJvci5jYWxsKHRoaXMuX2NvbnRleHQsIGVycik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLl90YXBDb21wbGV0ZS5jYWxsKHRoaXMuX2NvbnRleHQpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQp9CgpmdW5jdGlvbiB3aXRoTGF0ZXN0RnJvbSguLi5hcmdzKSB7CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gewogICAgICAgIGxldCBwcm9qZWN0OwogICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHByb2plY3QgPSBhcmdzLnBvcCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IGFyZ3M7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBXaXRoTGF0ZXN0RnJvbU9wZXJhdG9yKG9ic2VydmFibGVzLCBwcm9qZWN0KSk7CiAgICB9Owp9CmNsYXNzIFdpdGhMYXRlc3RGcm9tT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Iob2JzZXJ2YWJsZXMsIHByb2plY3QpIHsKICAgICAgICB0aGlzLm9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXM7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFdpdGhMYXRlc3RGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm9ic2VydmFibGVzLCB0aGlzLnByb2plY3QpKTsKICAgIH0KfQpjbGFzcyBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG9ic2VydmFibGVzLCBwcm9qZWN0KSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSBvYnNlcnZhYmxlczsKICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgICAgIHRoaXMudG9SZXNwb25kID0gW107CiAgICAgICAgY29uc3QgbGVuID0gb2JzZXJ2YWJsZXMubGVuZ3RoOwogICAgICAgIHRoaXMudmFsdWVzID0gbmV3IEFycmF5KGxlbik7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICB0aGlzLnRvUmVzcG9uZC5wdXNoKGkpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGxldCBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXNbaV07CiAgICAgICAgICAgIHRoaXMuYWRkKHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIG9ic2VydmFibGUsIG9ic2VydmFibGUsIGkpKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy52YWx1ZXNbb3V0ZXJJbmRleF0gPSBpbm5lclZhbHVlOwogICAgICAgIGNvbnN0IHRvUmVzcG9uZCA9IHRoaXMudG9SZXNwb25kOwogICAgICAgIGlmICh0b1Jlc3BvbmQubGVuZ3RoID4gMCkgewogICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRvUmVzcG9uZC5pbmRleE9mKG91dGVySW5kZXgpOwogICAgICAgICAgICBpZiAoZm91bmQgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB0b1Jlc3BvbmQuc3BsaWNlKGZvdW5kLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKCkgewogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy50b1Jlc3BvbmQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBbdmFsdWUsIC4uLnRoaXMudmFsdWVzXTsKICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdCkgewogICAgICAgICAgICAgICAgdGhpcy5fdHJ5UHJvamVjdChhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIF90cnlQcm9qZWN0KGFyZ3MpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdC5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7CiAgICB9Cn0KCi8qKgogKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMgogKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICogTGljZW5zZTogTUlUCiAqLwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogQ29udmluY2UgY2xvc3VyZSBjb21waWxlciB0aGF0IHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGhhcyBubyBzaWRlLWVmZmVjdHMuCiAqCiAqIENsb3N1cmUgY29tcGlsZXIgYWx3YXlzIGFzc3VtZXMgdGhhdCBgdG9TdHJpbmdgIGhhcyBubyBzaWRlLWVmZmVjdHMuIFdlIHVzZSB0aGlzIHF1aXJrIHRvCiAqIGFsbG93IHVzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBidXQgaGF2ZSBjbG9zdXJlIGNvbXBpbGVyIG1hcmsgdGhlIGNhbGwgYXMgbm8tc2lkZS1lZmZlY3RzLgogKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgYG5vU2lkZUVmZmVjdHNgIGZ1bmN0aW9uIGJlIGFzc2lnbmVkCiAqIHRvIHNvbWV0aGluZyB3aGljaCBpcyByZXRhaW5lZCBvdGhlcndpc2UgdGhlIGNhbGwgdG8gYG5vU2lkZUVmZmVjdHNgIHdpbGwgYmUgcmVtb3ZlZCBieSBjbG9zdXJlCiAqIGNvbXBpbGVyLgogKi8KZnVuY3Rpb24gbm9TaWRlRWZmZWN0cyhmbikgewogICAgcmV0dXJuIHsgdG9TdHJpbmc6IGZuIH0udG9TdHJpbmcoKTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpjb25zdCBBTk5PVEFUSU9OUyA9ICdfX2Fubm90YXRpb25zX18nOwpjb25zdCBQQVJBTUVURVJTID0gJ19fcGFyYW1ldGVyc19fJzsKY29uc3QgUFJPUF9NRVRBREFUQSA9ICdfX3Byb3BfX21ldGFkYXRhX18nOwovKioKICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfQogKi8KZnVuY3Rpb24gbWFrZURlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGFkZGl0aW9uYWxQcm9jZXNzaW5nLCB0eXBlRm4pIHsKICAgIHJldHVybiBub1NpZGVFZmZlY3RzKCgpID0+IHsKICAgICAgICBjb25zdCBtZXRhQ3RvciA9IG1ha2VNZXRhZGF0YUN0b3IocHJvcHMpOwogICAgICAgIGZ1bmN0aW9uIERlY29yYXRvckZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERlY29yYXRvckZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIG1ldGFDdG9yLmNhbGwodGhpcywgLi4uYXJncyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVEZWNvcmF0b3IoY2xzKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZUZuKQogICAgICAgICAgICAgICAgICAgIHR5cGVGbihjbHMsIC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgLy8gVXNlIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBpbXBvcnRhbnQgc2luY2UgaXQgY3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB3aGljaAogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgdGhlIHByb3BlcnR5IGlzIGNvcGllZCBkdXJpbmcgc3ViY2xhc3NpbmcuCiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGNscy5oYXNPd25Qcm9wZXJ0eShBTk5PVEFUSU9OUykgPwogICAgICAgICAgICAgICAgICAgIGNsc1tBTk5PVEFUSU9OU10gOgogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHMsIEFOTk9UQVRJT05TLCB7IHZhbHVlOiBbXSB9KVtBTk5PVEFUSU9OU107CiAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7CiAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFByb2Nlc3NpbmcpCiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb2Nlc3NpbmcoY2xzKTsKICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnRDbGFzcykgewogICAgICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTsKICAgICAgICB9CiAgICAgICAgRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWUgPSBuYW1lOwogICAgICAgIERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IERlY29yYXRvckZhY3Rvcnk7CiAgICAgICAgcmV0dXJuIERlY29yYXRvckZhY3Rvcnk7CiAgICB9KTsKfQpmdW5jdGlvbiBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gY3RvciguLi5hcmdzKSB7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKC4uLmFyZ3MpOwogICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIHZhbHVlcykgewogICAgICAgICAgICAgICAgdGhpc1twcm9wTmFtZV0gPSB2YWx1ZXNbcHJvcE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKfQpmdW5jdGlvbiBtYWtlUGFyYW1EZWNvcmF0b3IobmFtZSwgcHJvcHMsIHBhcmVudENsYXNzKSB7CiAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoKSA9PiB7CiAgICAgICAgY29uc3QgbWV0YUN0b3IgPSBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKTsKICAgICAgICBmdW5jdGlvbiBQYXJhbURlY29yYXRvckZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkgewogICAgICAgICAgICAgICAgbWV0YUN0b3IuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgUGFyYW1EZWNvcmF0b3JGYWN0b3J5KC4uLmFyZ3MpOwogICAgICAgICAgICBQYXJhbURlY29yYXRvci5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbkluc3RhbmNlOwogICAgICAgICAgICByZXR1cm4gUGFyYW1EZWNvcmF0b3I7CiAgICAgICAgICAgIGZ1bmN0aW9uIFBhcmFtRGVjb3JhdG9yKGNscywgdW51c2VkS2V5LCBpbmRleCkgewogICAgICAgICAgICAgICAgLy8gVXNlIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBpbXBvcnRhbnQgc2luY2UgaXQgY3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB3aGljaAogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgdGhlIHByb3BlcnR5IGlzIGNvcGllZCBkdXJpbmcgc3ViY2xhc3NpbmcuCiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gY2xzLmhhc093blByb3BlcnR5KFBBUkFNRVRFUlMpID8KICAgICAgICAgICAgICAgICAgICBjbHNbUEFSQU1FVEVSU10gOgogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHMsIFBBUkFNRVRFUlMsIHsgdmFsdWU6IFtdIH0pW1BBUkFNRVRFUlNdOwogICAgICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgZ2FwcyBpZiBzb21lIGluIGJldHdlZW4gcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBhbm5vdGF0aW9ucy4KICAgICAgICAgICAgICAgIC8vIHdlIHBhZCB3aXRoIG51bGxzLgogICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtZXRlcnMubGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKHBhcmFtZXRlcnNbaW5kZXhdID0gcGFyYW1ldGVyc1tpbmRleF0gfHwgW10pLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudENsYXNzKSB7CiAgICAgICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWUgPSBuYW1lOwogICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5hbm5vdGF0aW9uQ2xzID0gUGFyYW1EZWNvcmF0b3JGYWN0b3J5OwogICAgICAgIHJldHVybiBQYXJhbURlY29yYXRvckZhY3Rvcnk7CiAgICB9KTsKfQpmdW5jdGlvbiBtYWtlUHJvcERlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGFkZGl0aW9uYWxQcm9jZXNzaW5nKSB7CiAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoKSA9PiB7CiAgICAgICAgY29uc3QgbWV0YUN0b3IgPSBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKTsKICAgICAgICBmdW5jdGlvbiBQcm9wRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvcERlY29yYXRvckZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIG1ldGFDdG9yLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ySW5zdGFuY2UgPSBuZXcgUHJvcERlY29yYXRvckZhY3RvcnkoLi4uYXJncyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIFByb3BEZWNvcmF0b3IodGFyZ2V0LCBuYW1lKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRhcmdldC5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgIC8vIFVzZSBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgaW1wb3J0YW50IHNpbmNlIGl0IGNyZWF0ZXMgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgd2hpY2gKICAgICAgICAgICAgICAgIC8vIHByZXZlbnRzIHRoZSBwcm9wZXJ0eSBpcyBjb3BpZWQgZHVyaW5nIHN1YmNsYXNzaW5nLgogICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KFBST1BfTUVUQURBVEEpID8KICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcltQUk9QX01FVEFEQVRBXSA6CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCBQUk9QX01FVEFEQVRBLCB7IHZhbHVlOiB7fSB9KVtQUk9QX01FVEFEQVRBXTsKICAgICAgICAgICAgICAgIG1ldGFbbmFtZV0gPSBtZXRhLmhhc093blByb3BlcnR5KG5hbWUpICYmIG1ldGFbbmFtZV0gfHwgW107CiAgICAgICAgICAgICAgICBtZXRhW25hbWVdLnVuc2hpZnQoZGVjb3JhdG9ySW5zdGFuY2UpOwogICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9jZXNzaW5nKQogICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9jZXNzaW5nKHRhcmdldCwgbmFtZSwgLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFByb3BEZWNvcmF0b3I7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnRDbGFzcykgewogICAgICAgICAgICBQcm9wRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICAgIFByb3BEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZSA9IG5hbWU7CiAgICAgICAgUHJvcERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IFByb3BEZWNvcmF0b3JGYWN0b3J5OwogICAgICAgIHJldHVybiBQcm9wRGVjb3JhdG9yRmFjdG9yeTsKICAgIH0pOwp9Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKY29uc3QgybUwID0gLyoqCiAqIEBwYXJhbSB7P30gdG9rZW4KICogQHJldHVybiB7P30KICovCih0b2tlbikgPT4gKHsgdG9rZW4gfSk7Ci8qKgogKiBJbmplY3QgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSW5qZWN0ID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdJbmplY3QnLCAoybUwKSk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKLyoqCiAqIE9wdGlvbmFsIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IE9wdGlvbmFsID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdPcHRpb25hbCcpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0Ci8qKgogKiBTZWxmIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFNlbGYgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ1NlbGYnKTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAovKioKICogU2tpcFNlbGYgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgU2tpcFNlbGYgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ1NraXBTZWxmJyk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKLyoqCiAqIEhvc3QgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSG9zdCA9IG1ha2VQYXJhbURlY29yYXRvcignSG9zdCcpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1MSA9IC8qKgogKiBAcGFyYW0gez89fSBhdHRyaWJ1dGVOYW1lCiAqIEByZXR1cm4gez99CiAqLwooYXR0cmlidXRlTmFtZSkgPT4gKHsgYXR0cmlidXRlTmFtZSB9KTsKLyoqCiAqIEF0dHJpYnV0ZSBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogKgogKiBcQEFubm90YXRpb24KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBdHRyaWJ1dGUgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ0F0dHJpYnV0ZScsICjJtTEpKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIEluamVjdGlvbiBmbGFncyBmb3IgREkuCiAqCiAqIEBwdWJsaWNBcGkKICovCnZhciBJbmplY3RGbGFnczsKKGZ1bmN0aW9uIChJbmplY3RGbGFncykgewogICAgLy8gVE9ETyhhbHhodWIpOiBtYWtlIHRoaXMgJ2NvbnN0JyB3aGVuIG5nYyBubyBsb25nZXIgd3JpdGVzIGV4cG9ydHMgb2YgaXQgaW50byBuZ2ZhY3RvcnkgZmlsZXMuCiAgICAvKiogQ2hlY2sgc2VsZiBhbmQgY2hlY2sgcGFyZW50IGluamVjdG9yIGlmIG5lZWRlZCAqLwogICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIkRlZmF1bHQiXSA9IDBdID0gIkRlZmF1bHQiOwogICAgLyoqCiAgICAgKiBTcGVjaWZpZXMgdGhhdCBhbiBpbmplY3RvciBzaG91bGQgcmV0cmlldmUgYSBkZXBlbmRlbmN5IGZyb20gYW55IGluamVjdG9yIHVudGlsIHJlYWNoaW5nIHRoZQogICAgICogaG9zdCBlbGVtZW50IG9mIHRoZSBjdXJyZW50IGNvbXBvbmVudC4gKE9ubHkgdXNlZCB3aXRoIEVsZW1lbnQgSW5qZWN0b3IpCiAgICAgKi8KICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJIb3N0Il0gPSAxXSA9ICJIb3N0IjsKICAgIC8qKiBEb24ndCBhc2NlbmQgdG8gYW5jZXN0b3JzIG9mIHRoZSBub2RlIHJlcXVlc3RpbmcgaW5qZWN0aW9uLiAqLwogICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIlNlbGYiXSA9IDJdID0gIlNlbGYiOwogICAgLyoqIFNraXAgdGhlIG5vZGUgdGhhdCBpcyByZXF1ZXN0aW5nIGluamVjdGlvbi4gKi8KICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJTa2lwU2VsZiJdID0gNF0gPSAiU2tpcFNlbGYiOwogICAgLyoqIEluamVjdCBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkIGlmIHRva2VuIG5vdCBmb3VuZC4gKi8KICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJPcHRpb25hbCJdID0gOF0gPSAiT3B0aW9uYWwiOwp9KShJbmplY3RGbGFncyB8fCAoSW5qZWN0RmxhZ3MgPSB7fSkpOwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KG9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCkgewogICAgZm9yIChsZXQga2V5IGluIG9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCkgewogICAgICAgIGlmIChvYmpXaXRoUHJvcGVydHlUb0V4dHJhY3Rba2V5XSA9PT0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSkgewogICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgIH0KICAgIH0KICAgIHRocm93IEVycm9yKCdDb3VsZCBub3QgZmluZCByZW5hbWVkIHByb3BlcnR5IG9uIHRhcmdldCBvYmplY3QuJyk7Cn0KLyoqCiAqIFNldHMgcHJvcGVydGllcyBvbiBhIHRhcmdldCBvYmplY3QgZnJvbSBhIHNvdXJjZSBvYmplY3QsIGJ1dCBvbmx5IGlmCiAqIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhlIHRhcmdldCBvYmplY3QuCiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBzZXQgcHJvcGVydGllcyBvbgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHByb3BlcnR5IGtleXMgYW5kIHZhbHVlcyB0byBzZXQKICovCmZ1bmN0aW9uIGZpbGxQcm9wZXJ0aWVzKHRhcmdldCwgc291cmNlKSB7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHsKICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBDb25zdHJ1Y3QgYW4gYEluamVjdGFibGVEZWZgIHdoaWNoIGRlZmluZXMgaG93IGEgdG9rZW4gd2lsbCBiZSBjb25zdHJ1Y3RlZCBieSB0aGUgREkgc3lzdGVtLCBhbmQKICogaW4gd2hpY2ggaW5qZWN0b3JzIChpZiBhbnkpIGl0IHdpbGwgYmUgYXZhaWxhYmxlLgogKgogKiBUaGlzIHNob3VsZCBiZSBhc3NpZ25lZCB0byBhIHN0YXRpYyBgybVwcm92YCBmaWVsZCBvbiBhIHR5cGUsIHdoaWNoIHdpbGwgdGhlbiBiZSBhbgogKiBgSW5qZWN0YWJsZVR5cGVgLgogKgogKiBPcHRpb25zOgogKiAqIGBwcm92aWRlZEluYCBkZXRlcm1pbmVzIHdoaWNoIGluamVjdG9ycyB3aWxsIGluY2x1ZGUgdGhlIGluamVjdGFibGUsIGJ5IGVpdGhlciBhc3NvY2lhdGluZyBpdAogKiAgIHdpdGggYW4gYEBOZ01vZHVsZWAgb3Igb3RoZXIgYEluamVjdG9yVHlwZWAsIG9yIGJ5IHNwZWNpZnlpbmcgdGhhdCB0aGlzIGluamVjdGFibGUgc2hvdWxkIGJlCiAqICAgcHJvdmlkZWQgaW4gdGhlIGAncm9vdCdgIGluamVjdG9yLCB3aGljaCB3aWxsIGJlIHRoZSBhcHBsaWNhdGlvbi1sZXZlbCBpbmplY3RvciBpbiBtb3N0IGFwcHMuCiAqICogYGZhY3RvcnlgIGdpdmVzIHRoZSB6ZXJvIGFyZ3VtZW50IGZ1bmN0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBpbmplY3RhYmxlLgogKiAgIFRoZSBmYWN0b3J5IGNhbiBjYWxsIGBpbmplY3RgIHRvIGFjY2VzcyB0aGUgYEluamVjdG9yYCBhbmQgcmVxdWVzdCBpbmplY3Rpb24gb2YgZGVwZW5kZW5jaWVzLgogKgogKiBAY29kZUdlbkFwaQogKi8KZnVuY3Rpb24gybXJtWRlZmluZUluamVjdGFibGUob3B0cykgewogICAgcmV0dXJuIHsKICAgICAgICB0b2tlbjogb3B0cy50b2tlbiwKICAgICAgICBwcm92aWRlZEluOiBvcHRzLnByb3ZpZGVkSW4gfHwgbnVsbCwKICAgICAgICBmYWN0b3J5OiBvcHRzLmZhY3RvcnksCiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgIH07Cn0KLyoqCiAqIENvbnN0cnVjdCBhbiBgSW5qZWN0b3JEZWZgIHdoaWNoIGNvbmZpZ3VyZXMgYW4gaW5qZWN0b3IuCiAqCiAqIFRoaXMgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGEgc3RhdGljIGluamVjdG9yIGRlZiAoYMm1aW5qYCkgZmllbGQgb24gYSB0eXBlLCB3aGljaCB3aWxsIHRoZW4gYmUgYW4KICogYEluamVjdG9yVHlwZWAuCiAqCiAqIE9wdGlvbnM6CiAqCiAqICogYGZhY3RvcnlgOiBhbiBgSW5qZWN0b3JUeXBlYCBpcyBhbiBpbnN0YW50aWFibGUgdHlwZSwgc28gYSB6ZXJvIGFyZ3VtZW50IGBmYWN0b3J5YCBmdW5jdGlvbiB0bwogKiAgIGNyZWF0ZSB0aGUgdHlwZSBtdXN0IGJlIHByb3ZpZGVkLiBJZiB0aGF0IGZhY3RvcnkgZnVuY3Rpb24gbmVlZHMgdG8gaW5qZWN0IGFyZ3VtZW50cywgaXQgY2FuCiAqICAgdXNlIHRoZSBgaW5qZWN0YCBmdW5jdGlvbi4KICogKiBgcHJvdmlkZXJzYDogYW4gb3B0aW9uYWwgYXJyYXkgb2YgcHJvdmlkZXJzIHRvIGFkZCB0byB0aGUgaW5qZWN0b3IuIEVhY2ggcHJvdmlkZXIgbXVzdAogKiAgIGVpdGhlciBoYXZlIGEgZmFjdG9yeSBvciBwb2ludCB0byBhIHR5cGUgd2hpY2ggaGFzIGEgYMm1cHJvdmAgc3RhdGljIHByb3BlcnR5ICh0aGUKICogICB0eXBlIG11c3QgYmUgYW4gYEluamVjdGFibGVUeXBlYCkuCiAqICogYGltcG9ydHNgOiBhbiBvcHRpb25hbCBhcnJheSBvZiBpbXBvcnRzIG9mIG90aGVyIGBJbmplY3RvclR5cGVgcyBvciBgSW5qZWN0b3JUeXBlV2l0aE1vZHVsZWBzCiAqICAgd2hvc2UgcHJvdmlkZXJzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgaW5qZWN0b3IuIExvY2FsbHkgcHJvdmlkZWQgdHlwZXMgd2lsbCBvdmVycmlkZQogKiAgIHByb3ZpZGVycyBmcm9tIGltcG9ydHMuCiAqCiAqIEBwdWJsaWNBcGkKICovCmZ1bmN0aW9uIMm1ybVkZWZpbmVJbmplY3RvcihvcHRpb25zKSB7CiAgICByZXR1cm4gewogICAgICAgIGZhY3Rvcnk6IG9wdGlvbnMuZmFjdG9yeSwKICAgICAgICBwcm92aWRlcnM6IG9wdGlvbnMucHJvdmlkZXJzIHx8IFtdLAogICAgICAgIGltcG9ydHM6IG9wdGlvbnMuaW1wb3J0cyB8fCBbXSwKICAgIH07Cn0KLyoqCiAqIFJlYWQgdGhlIGluamVjdGFibGUgZGVmIChgybVwcm92YCkgZm9yIGB0eXBlYCBpbiBhIHdheSB3aGljaCBpcyBpbW11bmUgdG8gYWNjaWRlbnRhbGx5IHJlYWRpbmcKICogaW5oZXJpdGVkIHZhbHVlLgogKgogKiBAcGFyYW0gdHlwZSBBIHR5cGUgd2hpY2ggbWF5IGhhdmUgaXRzIG93biAobm9uLWluaGVyaXRlZCkgYMm1cHJvdmAuCiAqLwpmdW5jdGlvbiBnZXRJbmplY3RhYmxlRGVmKHR5cGUpIHsKICAgIHJldHVybiBnZXRPd25EZWZpbml0aW9uKHR5cGUsIHR5cGVbTkdfUFJPVl9ERUZdKSB8fAogICAgICAgIGdldE93bkRlZmluaXRpb24odHlwZSwgdHlwZVtOR19JTkpFQ1RBQkxFX0RFRl0pOwp9Ci8qKgogKiBSZXR1cm4gYGRlZmAgb25seSBpZiBpdCBpcyBkZWZpbmVkIGRpcmVjdGx5IG9uIGB0eXBlYCBhbmQgaXMgbm90IGluaGVyaXRlZCBmcm9tIGEgYmFzZQogKiBjbGFzcyBvZiBgdHlwZWAuCiAqCiAqIFRoZSBmdW5jdGlvbiBgT2JqZWN0Lmhhc093blByb3BlcnR5YCBpcyBub3Qgc3VmZmljaWVudCB0byBkaXN0aW5ndWlzaCB0aGlzIGNhc2UgYmVjYXVzZSBpbiBvbGRlcgogKiBicm93c2VycyAoZS5nLiBJRTEwKSBzdGF0aWMgcHJvcGVydHkgaW5oZXJpdGFuY2UgaXMgaW1wbGVtZW50ZWQgYnkgY29weWluZyB0aGUgcHJvcGVydGllcy4KICoKICogSW5zdGVhZCwgdGhlIGRlZmluaXRpb24ncyBgdG9rZW5gIGlzIGNvbXBhcmVkIHRvIHRoZSBgdHlwZWAsIGFuZCBpZiB0aGV5IGRvbid0IG1hdGNoIHRoZW4gdGhlCiAqIHByb3BlcnR5IHdhcyBub3QgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCB3YXMgbGlrZWx5IGluaGVyaXRlZC4gVGhlIGRlZmluaXRpb24KICogaXMgb25seSByZXR1cm5lZCBpZiB0aGUgYHR5cGVgIG1hdGNoZXMgdGhlIGBkZWYudG9rZW5gLgogKi8KZnVuY3Rpb24gZ2V0T3duRGVmaW5pdGlvbih0eXBlLCBkZWYpIHsKICAgIHJldHVybiBkZWYgJiYgZGVmLnRva2VuID09PSB0eXBlID8gZGVmIDogbnVsbDsKfQovKioKICogUmVhZCB0aGUgaW5qZWN0YWJsZSBkZWYgKGDJtXByb3ZgKSBmb3IgYHR5cGVgIG9yIHJlYWQgdGhlIGDJtXByb3ZgIGZyb20gb25lIG9mIGl0cyBhbmNlc3RvcnMuCiAqCiAqIEBwYXJhbSB0eXBlIEEgdHlwZSB3aGljaCBtYXkgaGF2ZSBgybVwcm92YCwgdmlhIGluaGVyaXRhbmNlLgogKgogKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gdjEwLCB3aGVyZSBhbiBlcnJvciB3aWxsIG9jY3VyIGluIHRoZSBzY2VuYXJpbyBpZiB3ZSBmaW5kIHRoZQogKiBgybVwcm92YCBvbiBhbiBhbmNlc3RvciBvbmx5LgogKi8KZnVuY3Rpb24gZ2V0SW5oZXJpdGVkSW5qZWN0YWJsZURlZih0eXBlKSB7CiAgICAvLyBTZWUgYGppdC9pbmplY3RhYmxlLnRzI2NvbXBpbGVJbmplY3RhYmxlYCBmb3IgY29udGV4dCBvbiBOR19QUk9WX0RFRl9GQUxMQkFDSy4KICAgIGNvbnN0IGRlZiA9IHR5cGUgJiYKICAgICAgICAodHlwZVtOR19QUk9WX0RFRl0gfHwgdHlwZVtOR19JTkpFQ1RBQkxFX0RFRl0gfHwKICAgICAgICAgICAgKHR5cGVbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdICYmIHR5cGVbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdKCkpKTsKICAgIGlmIChkZWYpIHsKICAgICAgICBjb25zdCB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHR5cGUpOwogICAgICAgIC8vIFRPRE8oRlctMTMwNyk6IFJlLWFkZCBuZ0Rldk1vZGUgd2hlbiBjbG9zdXJlIGNhbiBoYW5kbGUgaXQKICAgICAgICAvLyBuZ0Rldk1vZGUgJiYKICAgICAgICBjb25zb2xlLndhcm4oYERFUFJFQ0FURUQ6IERJIGlzIGluc3RhbnRpYXRpbmcgYSB0b2tlbiAiJHt0eXBlTmFtZX0iIHRoYXQgaW5oZXJpdHMgaXRzIEBJbmplY3RhYmxlIGRlY29yYXRvciBidXQgZG9lcyBub3QgcHJvdmlkZSBvbmUgaXRzZWxmLlxuYCArCiAgICAgICAgICAgIGBUaGlzIHdpbGwgYmVjb21lIGFuIGVycm9yIGluIHYxMC4gUGxlYXNlIGFkZCBASW5qZWN0YWJsZSgpIHRvIHRoZSAiJHt0eXBlTmFtZX0iIGNsYXNzLmApOwogICAgICAgIHJldHVybiBkZWY7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovKiogR2V0cyB0aGUgbmFtZSBvZiBhIHR5cGUsIGFjY291bnRpbmcgZm9yIHNvbWUgY3Jvc3MtYnJvd3NlciBkaWZmZXJlbmNlcy4gKi8KZnVuY3Rpb24gZ2V0VHlwZU5hbWUodHlwZSkgewogICAgLy8gYEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lYCBiZWhhdmVzIGRpZmZlcmVudGx5IGJldHdlZW4gSUUgYW5kIG90aGVyIGJyb3dzZXJzLiBJbiBtb3N0IGJyb3dzZXJzCiAgICAvLyBpdCdsbCBhbHdheXMgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpdHNlbGYsIG5vIG1hdHRlciBob3cgbWFueSBvdGhlciBmdW5jdGlvbnMgaXQKICAgIC8vIGluaGVyaXRzIGZyb20uIE9uIElFIHRoZSBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgaXRzIG93biBgbmFtZWAgcHJvcGVydHksIGJ1dCBpdCB0YWtlcyBpdCBmcm9tCiAgICAvLyB0aGUgbG93ZXN0IGxldmVsIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uIEUuZy4gaWYgd2UgaGF2ZSBgY2xhc3MgRm9vIGV4dGVuZHMgUGFyZW50YCBtb3N0CiAgICAvLyBicm93c2VycyB3aWxsIGV2YWx1YXRlIGBGb28ubmFtZWAgdG8gYEZvb2Agd2hpbGUgSUUgd2lsbCByZXR1cm4gYFBhcmVudGAuIFdlIHdvcmsgYXJvdW5kCiAgICAvLyB0aGUgaXNzdWUgYnkgY29udmVydGluZyB0aGUgZnVuY3Rpb24gdG8gYSBzdHJpbmcgYW5kIHBhcnNpbmcgaXRzIG5hbWUgb3V0IHRoYXQgd2F5IHZpYSBhIHJlZ2V4LgogICAgaWYgKHR5cGUuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkgewogICAgICAgIHJldHVybiB0eXBlLm5hbWU7CiAgICB9CiAgICBjb25zdCBtYXRjaCA9ICgnJyArIHR5cGUpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKTsKICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/ICcnIDogbWF0Y2hbMV07Cn0KLyoqCiAqIFJlYWQgdGhlIGluamVjdG9yIGRlZiB0eXBlIGluIGEgd2F5IHdoaWNoIGlzIGltbXVuZSB0byBhY2NpZGVudGFsbHkgcmVhZGluZyBpbmhlcml0ZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB0eXBlIHR5cGUgd2hpY2ggbWF5IGhhdmUgYW4gaW5qZWN0b3IgZGVmIChgybVpbmpgKQogKi8KZnVuY3Rpb24gZ2V0SW5qZWN0b3JEZWYodHlwZSkgewogICAgcmV0dXJuIHR5cGUgJiYgKHR5cGUuaGFzT3duUHJvcGVydHkoTkdfSU5KX0RFRikgfHwgdHlwZS5oYXNPd25Qcm9wZXJ0eShOR19JTkpFQ1RPUl9ERUYpKSA/CiAgICAgICAgdHlwZVtOR19JTkpfREVGXSA6CiAgICAgICAgbnVsbDsKfQpjb25zdCBOR19QUk9WX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtXByb3Y6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CmNvbnN0IE5HX0lOSl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVpbmo6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8vIE9uIElFMTAgcHJvcGVydGllcyBkZWZpbmVkIHZpYSBgZGVmaW5lUHJvcGVydHlgIHdvbid0IGJlIGluaGVyaXRlZCBieSBjaGlsZCBjbGFzc2VzLAovLyB3aGljaCB3aWxsIGJyZWFrIGluaGVyaXRpbmcgdGhlIGluamVjdGFibGUgZGVmaW5pdGlvbiBmcm9tIGEgZ3JhbmRwYXJlbnQgdGhyb3VnaCBhbgovLyB1bmRlY29yYXRlZCBwYXJlbnQgY2xhc3MuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IGRlZmluaW5nIGEgZmFsbGJhY2sgbWV0aG9kIHdoaWNoIHdpbGwgYmUKLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSBhIHByb2JsZW0gaW4gSklUIG1vZGUsIGJlY2F1c2UgaW4KLy8gQU9UIFR5cGVTY3JpcHQgc2VlbXMgdG8gaGF2ZSBhIHdvcmthcm91bmQgZm9yIHN0YXRpYyBwcm9wZXJ0aWVzLiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhbgovLyB1bmRlY29yYXRlZCBwYXJlbnQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiB2MTAsIHRoaXMgY2FuIHNhZmVseSBiZSByZW1vdmVkLgpjb25zdCBOR19QUk9WX0RFRl9GQUxMQkFDSyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtXByb3ZGYWxsYmFjazogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKLy8gV2UgbmVlZCB0byBrZWVwIHRoZXNlIGFyb3VuZCBzbyB3ZSBjYW4gcmVhZCBvZmYgb2xkIGRlZnMgaWYgbmV3IGRlZnMgYXJlIHVuYXZhaWxhYmxlCmNvbnN0IE5HX0lOSkVDVEFCTEVfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nSW5qZWN0YWJsZURlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKY29uc3QgTkdfSU5KRUNUT1JfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nSW5qZWN0b3JEZWY6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCmZ1bmN0aW9uIHN0cmluZ2lmeSh0b2tlbikgewogICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHsKICAgICAgICByZXR1cm4gJ1snICsgdG9rZW4ubWFwKHN0cmluZ2lmeSkuam9pbignLCAnKSArICddJzsKICAgIH0KICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuICcnICsgdG9rZW47CiAgICB9CiAgICBpZiAodG9rZW4ub3ZlcnJpZGRlbk5hbWUpIHsKICAgICAgICByZXR1cm4gYCR7dG9rZW4ub3ZlcnJpZGRlbk5hbWV9YDsKICAgIH0KICAgIGlmICh0b2tlbi5uYW1lKSB7CiAgICAgICAgcmV0dXJuIGAke3Rva2VuLm5hbWV9YDsKICAgIH0KICAgIGNvbnN0IHJlcyA9IHRva2VuLnRvU3RyaW5nKCk7CiAgICBpZiAocmVzID09IG51bGwpIHsKICAgICAgICByZXR1cm4gJycgKyByZXM7CiAgICB9CiAgICBjb25zdCBuZXdMaW5lSW5kZXggPSByZXMuaW5kZXhPZignXG4nKTsKICAgIHJldHVybiBuZXdMaW5lSW5kZXggPT09IC0xID8gcmVzIDogcmVzLnN1YnN0cmluZygwLCBuZXdMaW5lSW5kZXgpOwp9Ci8qKgogKiBDb25jYXRlbmF0ZXMgdHdvIHN0cmluZ3Mgd2l0aCBzZXBhcmF0b3IsIGFsbG9jYXRpbmcgbmV3IHN0cmluZ3Mgb25seSB3aGVuIG5lY2Vzc2FyeS4KICoKICogQHBhcmFtIGJlZm9yZSBiZWZvcmUgc3RyaW5nLgogKiBAcGFyYW0gc2VwYXJhdG9yIHNlcGFyYXRvciBzdHJpbmcuCiAqIEBwYXJhbSBhZnRlciBhZnRlciBzdHJpbmcuCiAqIEByZXR1cm5zIGNvbmNhdGVuYXRlZCBzdHJpbmcuCiAqLwpmdW5jdGlvbiBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKGJlZm9yZSwgYWZ0ZXIpIHsKICAgIHJldHVybiAoYmVmb3JlID09IG51bGwgfHwgYmVmb3JlID09PSAnJykgPwogICAgICAgIChhZnRlciA9PT0gbnVsbCA/ICcnIDogYWZ0ZXIpIDoKICAgICAgICAoKGFmdGVyID09IG51bGwgfHwgYWZ0ZXIgPT09ICcnKSA/IGJlZm9yZSA6IGJlZm9yZSArICcgJyArIGFmdGVyKTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9fZm9yd2FyZF9yZWZfXyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBfX2ZvcndhcmRfcmVmX186IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8qKgogKiBBbGxvd3MgdG8gcmVmZXIgdG8gcmVmZXJlbmNlcyB3aGljaCBhcmUgbm90IHlldCBkZWZpbmVkLgogKgogKiBGb3IgaW5zdGFuY2UsIGBmb3J3YXJkUmVmYCBpcyB1c2VkIHdoZW4gdGhlIGB0b2tlbmAgd2hpY2ggd2UgbmVlZCB0byByZWZlciB0byBmb3IgdGhlIHB1cnBvc2VzIG9mCiAqIERJIGlzIGRlY2xhcmVkLCBidXQgbm90IHlldCBkZWZpbmVkLiBJdCBpcyBhbHNvIHVzZWQgd2hlbiB0aGUgYHRva2VuYCB3aGljaCB3ZSB1c2Ugd2hlbiBjcmVhdGluZwogKiBhIHF1ZXJ5IGlzIG5vdCB5ZXQgZGVmaW5lZC4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqIHtcQGV4YW1wbGUgY29yZS9kaS90cy9mb3J3YXJkX3JlZi9mb3J3YXJkX3JlZl9zcGVjLnRzIHJlZ2lvbj0nZm9yd2FyZF9yZWYnfQogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGZvcndhcmRSZWZGbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZm9yd2FyZFJlZihmb3J3YXJkUmVmRm4pIHsKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZm9yd2FyZFJlZkZuKSkpLl9fZm9yd2FyZF9yZWZfXyA9IGZvcndhcmRSZWY7CiAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGZvcndhcmRSZWZGbikpKS50b1N0cmluZyA9ICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gc3RyaW5naWZ5KHRoaXMoKSk7CiAgICB9KTsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChmb3J3YXJkUmVmRm4pKSkpKTsKfQovKioKICogTGF6aWx5IHJldHJpZXZlcyB0aGUgcmVmZXJlbmNlIHZhbHVlIGZyb20gYSBmb3J3YXJkUmVmLgogKgogKiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiB3aGVuIGdpdmVuIGEgbm9uLWZvcndhcmQtcmVmIHZhbHVlLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2ZvcndhcmRfcmVmL2ZvcndhcmRfcmVmX3NwZWMudHMgcmVnaW9uPSdyZXNvbHZlX2ZvcndhcmRfcmVmJ30KICoKICogQHNlZSBgZm9yd2FyZFJlZmAKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZih0eXBlKSB7CiAgICByZXR1cm4gaXNGb3J3YXJkUmVmKHR5cGUpID8gdHlwZSgpIDogdHlwZTsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyB3cmFwcGVkIGJ5IGEgYGZvcndhcmRSZWZgLgogKiBAcGFyYW0gez99IGZuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0ZvcndhcmRSZWYoZm4pIHsKICAgIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgZm4uaGFzT3duUHJvcGVydHkoX19mb3J3YXJkX3JlZl9fKSAmJgogICAgICAgIGZuLl9fZm9yd2FyZF9yZWZfXyA9PT0gZm9yd2FyZFJlZjsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpjb25zdCBfX2dsb2JhbFRoaXMgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpczsKY29uc3QgX193aW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c7CmNvbnN0IF9fc2VsZiA9IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmCiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiYgc2VsZjsKY29uc3QgX19nbG9iYWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWw7Ci8vIEFsd2F5cyB1c2UgX19nbG9iYWxUaGlzIGlmIGF2YWlsYWJsZSwgd2hpY2ggaXMgdGhlIHNwZWMtZGVmaW5lZCBnbG9iYWwgdmFyaWFibGUgYWNyb3NzIGFsbAovLyBlbnZpcm9ubWVudHMsIHRoZW4gZmFsbGJhY2sgdG8gX19nbG9iYWwgZmlyc3QsIGJlY2F1c2UgaW4gTm9kZSB0ZXN0cyBib3RoIF9fZ2xvYmFsIGFuZAovLyBfX3dpbmRvdyBtYXkgYmUgZGVmaW5lZCBhbmQgX2dsb2JhbCBzaG91bGQgYmUgX19nbG9iYWwgaW4gdGhhdCBjYXNlLgpjb25zdCBfZ2xvYmFsID0gX19nbG9iYWxUaGlzIHx8IF9fZ2xvYmFsIHx8IF9fd2luZG93IHx8IF9fc2VsZjsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KdmFyIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZTsKKGZ1bmN0aW9uIChSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUpIHsKICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbIlRva2VuIl0gPSAwXSA9ICJUb2tlbiI7CiAgICBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlWyJBdHRyaWJ1dGUiXSA9IDFdID0gIkF0dHJpYnV0ZSI7CiAgICBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlWyJDaGFuZ2VEZXRlY3RvclJlZiJdID0gMl0gPSAiQ2hhbmdlRGV0ZWN0b3JSZWYiOwogICAgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlW1IzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVsiSW52YWxpZCJdID0gM10gPSAiSW52YWxpZCI7Cn0pKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSB8fCAoUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlID0ge30pKTsKdmFyIFIzRmFjdG9yeVRhcmdldDsKKGZ1bmN0aW9uIChSM0ZhY3RvcnlUYXJnZXQpIHsKICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkRpcmVjdGl2ZSJdID0gMF0gPSAiRGlyZWN0aXZlIjsKICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkNvbXBvbmVudCJdID0gMV0gPSAiQ29tcG9uZW50IjsKICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkluamVjdGFibGUiXSA9IDJdID0gIkluamVjdGFibGUiOwogICAgUjNGYWN0b3J5VGFyZ2V0W1IzRmFjdG9yeVRhcmdldFsiUGlwZSJdID0gM10gPSAiUGlwZSI7CiAgICBSM0ZhY3RvcnlUYXJnZXRbUjNGYWN0b3J5VGFyZ2V0WyJOZ01vZHVsZSJdID0gNF0gPSAiTmdNb2R1bGUiOwp9KShSM0ZhY3RvcnlUYXJnZXQgfHwgKFIzRmFjdG9yeVRhcmdldCA9IHt9KSk7CnZhciBWaWV3RW5jYXBzdWxhdGlvbjsKKGZ1bmN0aW9uIChWaWV3RW5jYXBzdWxhdGlvbikgewogICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIkVtdWxhdGVkIl0gPSAwXSA9ICJFbXVsYXRlZCI7CiAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvblsiTmF0aXZlIl0gPSAxXSA9ICJOYXRpdmUiOwogICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIk5vbmUiXSA9IDJdID0gIk5vbmUiOwogICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIlNoYWRvd0RvbSJdID0gM10gPSAiU2hhZG93RG9tIjsKfSkoVmlld0VuY2Fwc3VsYXRpb24gfHwgKFZpZXdFbmNhcHN1bGF0aW9uID0ge30pKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KZnVuY3Rpb24gZ2V0Q29tcGlsZXJGYWNhZGUoKSB7CiAgICBjb25zdCBnbG9iYWxOZyA9IF9nbG9iYWxbJ25nJ107CiAgICBpZiAoIWdsb2JhbE5nIHx8ICFnbG9iYWxOZy7JtWNvbXBpbGVyRmFjYWRlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmd1bGFyIEpJVCBjb21waWxhdGlvbiBmYWlsZWQ6ICdAYW5ndWxhci9jb21waWxlcicgbm90IGxvYWRlZCFcbmAgKwogICAgICAgICAgICBgICAtIEpJVCBjb21waWxhdGlvbiBpcyBkaXNjb3VyYWdlZCBmb3IgcHJvZHVjdGlvbiB1c2UtY2FzZXMhIENvbnNpZGVyIEFPVCBtb2RlIGluc3RlYWQuXG5gICsKICAgICAgICAgICAgYCAgLSBEaWQgeW91IGJvb3RzdHJhcCB1c2luZyAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJyBvciAnQGFuZ3VsYXIvcGxhdGZvcm0tc2VydmVyJz9cbmAgKwogICAgICAgICAgICBgICAtIEFsdGVybmF0aXZlbHkgcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCAnaW1wb3J0ICJAYW5ndWxhci9jb21waWxlciI7JyBiZWZvcmUgYm9vdHN0cmFwcGluZy5gKTsKICAgIH0KICAgIHJldHVybiBnbG9iYWxOZy7JtWNvbXBpbGVyRmFjYWRlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ZpZWxkcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX0NPTVBfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IMm1Y21wOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX0RJUl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVkaXI6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfUElQRV9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVwaXBlOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX01PRF9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVtb2Q6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfTE9DX0lEX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWxvYzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOR19GQUNUT1JZX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWZhYzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKLy8gVE9ETyhtaXNrbyk6IFRoaXMgaXMgd3JvbmcuIFRoZSBOR19FTEVNRU5UX0lEIHNob3VsZCBuZXZlciBiZSBtaW5pZmllZC4KLyoqCiAqIElmIGEgZGlyZWN0aXZlIGlzIGRpUHVibGljLCBibG9vbUFkZCBzZXRzIGEgcHJvcGVydHkgb24gdGhlIHR5cGUgd2l0aCB0aGlzIGNvbnN0YW50IGFzCiAqIHRoZSBrZXkgYW5kIHRoZSBkaXJlY3RpdmUncyB1bmlxdWUgSUQgYXMgdGhlIHZhbHVlLiBUaGlzIGFsbG93cyB1cyB0byBtYXAgZGlyZWN0aXZlcyB0byB0aGVpcgogKiBibG9vbSBmaWx0ZXIgYml0IGZvciBESS4KICogQHR5cGUgez99CiAqLwpjb25zdCBOR19FTEVNRU5UX0lEID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IF9fTkdfRUxFTUVOVF9JRF9fOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBuZ0Rldk1vZGVSZXNldFBlcmZDb3VudGVycygpIHsKICAgIGNvbnN0IGxvY2F0aW9uU3RyaW5nID0gdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyA/IGxvY2F0aW9uLnRvU3RyaW5nKCkgOiAnJzsKICAgIGNvbnN0IG5ld0NvdW50ZXJzID0gewogICAgICAgIG5hbWVkQ29uc3RydWN0b3JzOiBsb2NhdGlvblN0cmluZy5pbmRleE9mKCduZ0Rldk1vZGU9bmFtZWRDb25zdHJ1Y3RvcnMnKSAhPSAtMSwKICAgICAgICBmaXJzdENyZWF0ZVBhc3M6IDAsCiAgICAgICAgdE5vZGU6IDAsCiAgICAgICAgdFZpZXc6IDAsCiAgICAgICAgcmVuZGVyZXJDcmVhdGVUZXh0Tm9kZTogMCwKICAgICAgICByZW5kZXJlclNldFRleHQ6IDAsCiAgICAgICAgcmVuZGVyZXJDcmVhdGVFbGVtZW50OiAwLAogICAgICAgIHJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcjogMCwKICAgICAgICByZW5kZXJlclNldEF0dHJpYnV0ZTogMCwKICAgICAgICByZW5kZXJlclJlbW92ZUF0dHJpYnV0ZTogMCwKICAgICAgICByZW5kZXJlclNldFByb3BlcnR5OiAwLAogICAgICAgIHJlbmRlcmVyU2V0Q2xhc3NOYW1lOiAwLAogICAgICAgIHJlbmRlcmVyQWRkQ2xhc3M6IDAsCiAgICAgICAgcmVuZGVyZXJSZW1vdmVDbGFzczogMCwKICAgICAgICByZW5kZXJlclNldFN0eWxlOiAwLAogICAgICAgIHJlbmRlcmVyUmVtb3ZlU3R5bGU6IDAsCiAgICAgICAgcmVuZGVyZXJEZXN0cm95OiAwLAogICAgICAgIHJlbmRlcmVyRGVzdHJveU5vZGU6IDAsCiAgICAgICAgcmVuZGVyZXJNb3ZlTm9kZTogMCwKICAgICAgICByZW5kZXJlclJlbW92ZU5vZGU6IDAsCiAgICAgICAgcmVuZGVyZXJBcHBlbmRDaGlsZDogMCwKICAgICAgICByZW5kZXJlckluc2VydEJlZm9yZTogMCwKICAgICAgICByZW5kZXJlckNyZWF0ZUNvbW1lbnQ6IDAsCiAgICB9OwogICAgLy8gTWFrZSBzdXJlIHRvIHJlZmVyIHRvIG5nRGV2TW9kZSBhcyBbJ25nRGV2TW9kZSddIGZvciBjbG9zdXJlLgogICAgY29uc3QgYWxsb3dOZ0Rldk1vZGVUcnVlID0gbG9jYXRpb25TdHJpbmcuaW5kZXhPZignbmdEZXZNb2RlPWZhbHNlJykgPT09IC0xOwogICAgX2dsb2JhbFsnbmdEZXZNb2RlJ10gPSBhbGxvd05nRGV2TW9kZVRydWUgJiYgbmV3Q291bnRlcnM7CiAgICByZXR1cm4gbmV3Q291bnRlcnM7Cn0KLyoqCiAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgYG5nRGV2TW9kZWAgaGFzIGJlZW4gc2V0LiBJZiB5ZXMsCiAqIHRoZW4gd2UgaG9ub3IgaXQsIG90aGVyd2lzZSB3ZSBkZWZhdWx0IHRvIGRldiBtb2RlIHdpdGggYWRkaXRpb25hbCBjaGVja3MuCiAqCiAqIFRoZSBpZGVhIGlzIHRoYXQgdW5sZXNzIHdlIGFyZSBkb2luZyBwcm9kdWN0aW9uIGJ1aWxkIHdoZXJlIHdlIGV4cGxpY2l0bHkKICogc2V0IGBuZ0Rldk1vZGUgPT0gZmFsc2VgIHdlIHNob3VsZCBiZSBoZWxwaW5nIHRoZSBkZXZlbG9wZXIgYnkgcHJvdmlkaW5nCiAqIGFzIG11Y2ggZWFybHkgd2FybmluZyBhbmQgZXJyb3JzIGFzIHBvc3NpYmxlLgogKgogKiBgybXJtWRlZmluZUNvbXBvbmVudGAgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZSBhbnkgY29tcG9uZW50IHRlbXBsYXRlIGZ1bmN0aW9ucwogKiAoYW5kIHRodXMgSXZ5IGluc3RydWN0aW9ucyksIHNvIGEgc2luZ2xlIGluaXRpYWxpemF0aW9uIHRoZXJlIGlzIHN1ZmZpY2llbnQgdG8gZW5zdXJlIG5nRGV2TW9kZQogKiBpcyBkZWZpbmVkIGZvciB0aGUgZW50aXJlIGluc3RydWN0aW9uIHNldC4KICoKICogV2hlbiB1c2luZyBjaGVja2luZyBgbmdEZXZNb2RlYCBvbiB0b3BsZXZlbCwgYWx3YXlzIGluaXQgaXQgYmVmb3JlIHJlZmVyZW5jaW5nIGl0CiAqIChlLmcuIGAoKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgJiYgaW5pdE5nRGV2TW9kZSgpKWApLCBvdGhlcndpc2UgeW91IGNhbgogKiAgZ2V0IGEgYFJlZmVyZW5jZUVycm9yYCBsaWtlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzMxNTk1LgogKgogKiBEZXRhaWxzIG9uIHBvc3NpYmxlIHZhbHVlcyBmb3IgYG5nRGV2TW9kZWAgY2FuIGJlIGZvdW5kIG9uIGl0cyBkb2NzdHJpbmcuCiAqCiAqIE5PVEU6CiAqIC0gY2hhbmdlcyB0byB0aGUgYG5nRGV2TW9kZWAgbmFtZSBtdXN0IGJlIHN5bmNlZCB3aXRoIGBjb21waWxlci1jbGkvc3JjL3Rvb2xpbmcudHNgLgogKi8KZnVuY3Rpb24gaW5pdE5nRGV2TW9kZSgpIHsKICAgIC8vIFRoZSBiZWxvdyBjaGVja3MgYXJlIHRvIGVuc3VyZSB0aGF0IGNhbGxpbmcgYGluaXROZ0Rldk1vZGVgIG11bHRpcGxlIHRpbWVzIGRvZXMgbm90CiAgICAvLyByZXNldCB0aGUgY291bnRlcnMuCiAgICAvLyBJZiB0aGUgYG5nRGV2TW9kZWAgaXMgbm90IGFuIG9iamVjdCwgdGhlbiBpdCBtZWFucyB3ZSBoYXZlIG5vdCBjcmVhdGVkIHRoZSBwZXJmIGNvdW50ZXJzCiAgICAvLyB5ZXQuCiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgIT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZVJlc2V0UGVyZkNvdW50ZXJzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhIW5nRGV2TW9kZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaW5qZWN0aW9uX3Rva2VuLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBDcmVhdGVzIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIERJIFByb3ZpZGVyLgogKgogKiBVc2UgYW4gYEluamVjdGlvblRva2VuYCB3aGVuZXZlciB0aGUgdHlwZSB5b3UgYXJlIGluamVjdGluZyBpcyBub3QgcmVpZmllZCAoZG9lcyBub3QgaGF2ZSBhCiAqIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24pIHN1Y2ggYXMgd2hlbiBpbmplY3RpbmcgYW4gaW50ZXJmYWNlLCBjYWxsYWJsZSB0eXBlLCBhcnJheSBvcgogKiBwYXJhbWV0ZXJpemVkIHR5cGUuCiAqCiAqIGBJbmplY3Rpb25Ub2tlbmAgaXMgcGFyYW1ldGVyaXplZCBvbiBgVGAgd2hpY2ggaXMgdGhlIHR5cGUgb2Ygb2JqZWN0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgYnkKICogdGhlIGBJbmplY3RvcmAuIFRoaXMgcHJvdmlkZXMgYWRkaXRpb25hbCBsZXZlbCBvZiB0eXBlIHNhZmV0eS4KICoKICogYGBgCiAqIGludGVyZmFjZSBNeUludGVyZmFjZSB7Li4ufQogKiB2YXIgbXlJbnRlcmZhY2UgPSBpbmplY3Rvci5nZXQobmV3IEluamVjdGlvblRva2VuPE15SW50ZXJmYWNlPignU29tZVRva2VuJykpOwogKiAvLyBteUludGVyZmFjZSBpcyBpbmZlcnJlZCB0byBiZSBNeUludGVyZmFjZS4KICogYGBgCiAqCiAqIFdoZW4gY3JlYXRpbmcgYW4gYEluamVjdGlvblRva2VuYCwgeW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIHJldHVybnMKICogKHBvc3NpYmx5IGJ5IGNyZWF0aW5nKSBhIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBgVGAuIFRoaXMgc2V0cyB1cCB0aGUKICogYEluamVjdGlvblRva2VuYCB1c2luZyB0aGlzIGZhY3RvcnkgYXMgYSBwcm92aWRlciBhcyBpZiBpdCB3YXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZQogKiBhcHBsaWNhdGlvbidzIHJvb3QgaW5qZWN0b3IuIElmIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLCB3aGljaCB0YWtlcyB6ZXJvIGFyZ3VtZW50cywgbmVlZHMgdG8gaW5qZWN0CiAqIGRlcGVuZGVuY2llcywgaXQgY2FuIGRvIHNvIHVzaW5nIHRoZSBgaW5qZWN0YCBmdW5jdGlvbi4gU2VlIGJlbG93IGZvciBhbiBleGFtcGxlLgogKgogKiBBZGRpdGlvbmFsbHksIGlmIGEgYGZhY3RvcnlgIGlzIHNwZWNpZmllZCB5b3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgYHByb3ZpZGVkSW5gIG9wdGlvbiwgd2hpY2gKICogb3ZlcnJpZGVzIHRoZSBhYm92ZSBiZWhhdmlvciBhbmQgbWFya3MgdGhlIHRva2VuIGFzIGJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIgYFxATmdNb2R1bGVgLiBBcwogKiBtZW50aW9uZWQgYWJvdmUsIGAncm9vdCdgIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBgcHJvdmlkZWRJbmAuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgQmFzaWMgRXhhbXBsZQogKgogKiAjIyMgUGxhaW4gSW5qZWN0aW9uVG9rZW4KICoKICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdJbmplY3Rpb25Ub2tlbid9CiAqCiAqICMjIyBUcmVlLXNoYWthYmxlIEluamVjdGlvblRva2VuCiAqCiAqIHtcQGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0nU2hha2FibGVJbmplY3Rpb25Ub2tlbid9CiAqCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBJbmplY3Rpb25Ub2tlbiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2Rlc2MKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqLwogICAgY29uc3RydWN0b3IoX2Rlc2MsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLl9kZXNjID0gX2Rlc2M7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMubmdNZXRhZGF0YU5hbWUgPSAnSW5qZWN0aW9uVG9rZW4nOwogICAgICAgIHRoaXMuybVwcm92ID0gdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBoYWNrIHRvIGFzc2lnbiBfX05HX0VMRU1FTlRfSURfXyB0byB0aGlzIGluc3RhbmNlLgogICAgICAgICAgICAvLyBfX05HX0VMRU1FTlRfSURfXyBpcyBVc2VkIGJ5IEl2eSB0byBkZXRlcm1pbmUgYmxvb20gZmlsdGVyIGlkLgogICAgICAgICAgICAvLyBXZSBhcmUgdXNpbmcgaXQgdG8gYXNzaWduIGAtMWAgd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBgSW5qZWN0b3JgLgogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuX19OR19FTEVNRU5UX0lEX18gPSBvcHRpb25zOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdGhpcy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7CiAgICAgICAgICAgICAgICB0b2tlbjogdGhpcywKICAgICAgICAgICAgICAgIHByb3ZpZGVkSW46IG9wdGlvbnMucHJvdmlkZWRJbiB8fCAncm9vdCcsCiAgICAgICAgICAgICAgICBmYWN0b3J5OiBvcHRpb25zLmZhY3RvcnksCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIGBJbmplY3Rpb25Ub2tlbiAke3RoaXMuX2Rlc2N9YDsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaW5qZWN0b3JfY29tcGF0aWJpbGl0eS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gSW5qZWN0aW9uVG9rZW4gdGhhdCBnZXRzIHRoZSBjdXJyZW50IGBJbmplY3RvcmAgZm9yIGBjcmVhdGVJbmplY3RvcigpYC1zdHlsZSBpbmplY3RvcnMuCiAqCiAqIFJlcXVlc3RpbmcgdGhpcyB0b2tlbiBpbnN0ZWFkIG9mIGBJbmplY3RvcmAgYWxsb3dzIGBTdGF0aWNJbmplY3RvcmAgdG8gYmUgdHJlZS1zaGFrZW4gZnJvbSBhCiAqIHByb2plY3QuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSU5KRUNUT1IgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0lOSkVDVE9SJywgKC8qKiBAdHlwZSB7P30gKi8gKC0xKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IF9USFJPV19JRl9OT1RfRk9VTkQgPSB7fTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBUSFJPV19JRl9OT1RfRk9VTkQgPSBfVEhST1dfSUZfTk9UX0ZPVU5EOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX1RFTVBfVE9LRU5fUEFUSCA9ICduZ1RlbXBUb2tlblBhdGgnOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX1RPS0VOX1BBVEggPSAnbmdUb2tlblBhdGgnOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5FV19MSU5FID0gL1xuL2dtOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5PX05FV19MSU5FID0gJ8m1JzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTT1VSQ0UgPSAnX19zb3VyY2UnOwpjb25zdCDJtTAkMSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVVNFX1ZBTFVFID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IHByb3ZpZGU6IFN0cmluZywgdXNlVmFsdWU6IMm1MCQxIH0pOwovKioKICogQ3VycmVudCBpbmplY3RvciB2YWx1ZSB1c2VkIGJ5IGBpbmplY3RgLgogKiAtIGB1bmRlZmluZWRgOiBpdCBpcyBhbiBlcnJvciB0byBjYWxsIGBpbmplY3RgCiAqIC0gYG51bGxgOiBgaW5qZWN0YCBjYW4gYmUgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbmplY3RvciAobGltcC1tb2RlKS4KICogLSBJbmplY3RvciBpbnN0YW5jZTogVXNlIHRoZSBpbmplY3RvciBmb3IgcmVzb2x1dGlvbi4KICogQHR5cGUgez99CiAqLwpsZXQgX2N1cnJlbnRJbmplY3RvciA9IHVuZGVmaW5lZDsKLyoqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldEN1cnJlbnRJbmplY3RvcihpbmplY3RvcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybWVyID0gX2N1cnJlbnRJbmplY3RvcjsKICAgIF9jdXJyZW50SW5qZWN0b3IgPSBpbmplY3RvcjsKICAgIHJldHVybiBmb3JtZXI7Cn0KLyoqCiAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0LgogKgogKiBCeSBkZWZhdWx0LCBpdCBpcyBgaW5qZWN0SW5qZWN0b3JPbmx5YCwgd2hpY2ggbWFrZXMgaXQgYEluamVjdG9yYC1vbmx5IGF3YXJlLiBJdCBjYW4gYmUgY2hhbmdlZAogKiB0byBgZGlyZWN0aXZlSW5qZWN0YCwgd2hpY2ggYnJpbmdzIGluIHRoZSBgTm9kZUluamVjdG9yYCBzeXN0ZW0gb2YgaXZ5LiBJdCBpcyBkZXNpZ25lZCB0aGlzCiAqIHdheSBmb3IgdHdvIHJlYXNvbnM6CiAqICAxLiBgSW5qZWN0b3JgIHNob3VsZCBub3QgZGVwZW5kIG9uIGl2eSBsb2dpYy4KICogIDIuIFRvIG1haW50YWluIHRyZWUgc2hha2UtYWJpbGl0eSB3ZSBkb24ndCB3YW50IHRvIGJyaW5nIGluIHVubmVjZXNzYXJ5IGNvZGUuCiAqIEB0eXBlIHs/fQogKi8KbGV0IF9pbmplY3RJbXBsZW1lbnRhdGlvbjsKLyoqCiAqIFNldHMgdGhlIGN1cnJlbnQgaW5qZWN0IGltcGxlbWVudGF0aW9uLgogKiBAcGFyYW0gez99IGltcGwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldEluamVjdEltcGxlbWVudGF0aW9uKGltcGwpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzID0gX2luamVjdEltcGxlbWVudGF0aW9uOwogICAgX2luamVjdEltcGxlbWVudGF0aW9uID0gaW1wbDsKICAgIHJldHVybiBwcmV2aW91czsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcGFyYW0gez89fSBmbGFncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5qZWN0SW5qZWN0b3JPbmx5KHRva2VuLCBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQpIHsKICAgIGlmIChfY3VycmVudEluamVjdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdCgpIG11c3QgYmUgY2FsbGVkIGZyb20gYW4gaW5qZWN0aW9uIGNvbnRleHRgKTsKICAgIH0KICAgIGVsc2UgaWYgKF9jdXJyZW50SW5qZWN0b3IgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gaW5qZWN0Um9vdExpbXBNb2RlKHRva2VuLCB1bmRlZmluZWQsIGZsYWdzKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBfY3VycmVudEluamVjdG9yLmdldCh0b2tlbiwgZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCA/IG51bGwgOiB1bmRlZmluZWQsIGZsYWdzKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcGFyYW0gez89fSBmbGFncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWluamVjdCh0b2tlbiwgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICByZXR1cm4gKF9pbmplY3RJbXBsZW1lbnRhdGlvbiB8fCBpbmplY3RJbmplY3Rvck9ubHkpKHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKSwgZmxhZ3MpOwp9Ci8qKgogKiBUaHJvd3MgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IGEgZmFjdG9yeSBmdW5jdGlvbiBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgYQogKiBwYXJ0aWN1bGFyIGNsYXNzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFsbG93cyB0aGUgYWN0dWFsIGVycm9yIG1lc3NhZ2UgdG8gYmUgb3B0aW1pemVkIGF3YXkgd2hlbiBuZ0Rldk1vZGUgaXMgdHVybmVkCiAqIG9mZiwgc2F2aW5nIGJ5dGVzIG9mIGdlbmVyYXRlZCBjb2RlIHdoaWxlIHN0aWxsIHByb3ZpZGluZyBhIGdvb2QgZXhwZXJpZW5jZSBpbiBkZXYgbW9kZS4KICoKICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdCBtZW50aW9uZWQgaGVyZSwgYnV0IHdpbGwgYmUgaW4gdGhlIGdlbmVyYXRlZCBmYWN0b3J5IGZ1bmN0aW9uIG5hbWUKICogYW5kIHRodXMgaW4gdGhlIHN0YWNrIHRyYWNlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWludmFsaWRGYWN0b3J5RGVwKGluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtc2cgPSBuZ0Rldk1vZGUgPwogICAgICAgIGBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQW5ndWxhciBEZXBlbmRlbmN5IEluamVjdGlvbiBiZWNhdXNlIGl0cyBkZXBlbmRlbmN5IGF0IGluZGV4ICR7aW5kZXh9IG9mIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBpbnZhbGlkLgpUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGRlcGVuZGVuY3kgdHlwZSBpcyBhIHByaW1pdGl2ZSBsaWtlIGEgc3RyaW5nIG9yIGlmIGFuIGFuY2VzdG9yIG9mIHRoaXMgY2xhc3MgaXMgbWlzc2luZyBhbiBBbmd1bGFyIGRlY29yYXRvci4KClBsZWFzZSBjaGVjayB0aGF0IDEpIHRoZSB0eXBlIGZvciB0aGUgcGFyYW1ldGVyIGF0IGluZGV4ICR7aW5kZXh9IGlzIGNvcnJlY3QgYW5kIDIpIHRoZSBjb3JyZWN0IEFuZ3VsYXIgZGVjb3JhdG9ycyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBjbGFzcyBhbmQgaXRzIGFuY2VzdG9ycy5gIDoKICAgICAgICAnaW52YWxpZCc7CiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQovKioKICogSW5qZWN0cyBhIHRva2VuIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5qZWN0b3IuCiAqCiAqIE11c3QgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIGZhY3RvcnkgZnVuY3Rpb24gc3VjaCBhcyBvbmUgZGVmaW5lZCBmb3IgYW4KICogYEluamVjdGlvblRva2VuYC4gVGhyb3dzIGFuIGVycm9yIGlmIG5vdCBjYWxsZWQgZnJvbSBzdWNoIGEgY29udGV4dC4KICoKICogV2l0aGluIHN1Y2ggYSBmYWN0b3J5IGZ1bmN0aW9uLCB1c2luZyB0aGlzIGZ1bmN0aW9uIHRvIHJlcXVlc3QgaW5qZWN0aW9uIG9mIGEgZGVwZW5kZW5jeQogKiBpcyBmYXN0ZXIgYW5kIG1vcmUgdHlwZS1zYWZlIHRoYW4gcHJvdmlkaW5nIGFuIGFkZGl0aW9uYWwgYXJyYXkgb2YgZGVwZW5kZW5jaWVzCiAqIChhcyBoYXMgYmVlbiBjb21tb24gd2l0aCBgdXNlRmFjdG9yeWAgcHJvdmlkZXJzKS4KICoKICogXEBwYXJhbSB0b2tlbiBUaGUgaW5qZWN0aW9uIHRva2VuIGZvciB0aGUgZGVwZW5kZW5jeSB0byBiZSBpbmplY3RlZC4KICogXEBwYXJhbSBmbGFncyBPcHRpb25hbCBmbGFncyB0aGF0IGNvbnRyb2wgaG93IGluamVjdGlvbiBpcyBleGVjdXRlZC4KICogVGhlIGZsYWdzIGNvcnJlc3BvbmQgdG8gaW5qZWN0aW9uIHN0cmF0ZWdpZXMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHdpdGgKICogcGFyYW1ldGVyIGRlY29yYXRvcnMgYFxASG9zdGAsIGBcQFNlbGZgLCBgXEBTa2lwU2VmYCwgYW5kIGBcQE9wdGlvbmFsYC4KICogXEByZXR1cm4gVHJ1ZSBpZiBpbmplY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgbnVsbCBvdGhlcndpc2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgRXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J1NoYWthYmxlSW5qZWN0aW9uVG9rZW4nfQogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IGluamVjdCA9IMm1ybVpbmplY3Q7Ci8qKgogKiBJbmplY3RzIGByb290YCB0b2tlbnMgaW4gbGltcCBtb2RlLgogKgogKiBJZiBubyBpbmplY3RvciBleGlzdHMsIHdlIGNhbiBzdGlsbCBpbmplY3QgdHJlZS1zaGFrYWJsZSBwcm92aWRlcnMgd2hpY2ggaGF2ZSBgcHJvdmlkZWRJbmAgc2V0IHRvCiAqIGAicm9vdCJgLiBUaGlzIGlzIGtub3duIGFzIHRoZSBsaW1wIG1vZGUgaW5qZWN0aW9uLiBJbiBzdWNoIGNhc2UgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUKICogYEluamVjdGFibGVEZWZgLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRva2VuCiAqIEBwYXJhbSB7P30gbm90Rm91bmRWYWx1ZQogKiBAcGFyYW0gez99IGZsYWdzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3RSb290TGltcE1vZGUodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmplY3RhYmxlRGVmID0gZ2V0SW5qZWN0YWJsZURlZih0b2tlbik7CiAgICBpZiAoaW5qZWN0YWJsZURlZiAmJiBpbmplY3RhYmxlRGVmLnByb3ZpZGVkSW4gPT0gJ3Jvb3QnKSB7CiAgICAgICAgcmV0dXJuIGluamVjdGFibGVEZWYudmFsdWUgPT09IHVuZGVmaW5lZCA/IGluamVjdGFibGVEZWYudmFsdWUgPSBpbmplY3RhYmxlRGVmLmZhY3RvcnkoKSA6CiAgICAgICAgICAgIGluamVjdGFibGVEZWYudmFsdWU7CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGlmIChub3RGb3VuZFZhbHVlICE9PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEluamVjdG9yOiBOT1RfRk9VTkQgWyR7c3RyaW5naWZ5KHRva2VuKX1dYCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluamVjdEFyZ3ModHlwZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFyZ3MgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXJnID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZXNbaV0pOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHsKICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnRzIGFycmF5IG11c3QgaGF2ZSBhcmd1bWVudHMuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHlwZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0OwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyZy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGFyZ1tqXTsKICAgICAgICAgICAgICAgIGlmIChtZXRhIGluc3RhbmNlb2YgT3B0aW9uYWwgfHwgbWV0YS5uZ01ldGFkYXRhTmFtZSA9PT0gJ09wdGlvbmFsJyB8fCBtZXRhID09PSBPcHRpb25hbCkgewogICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEluamVjdEZsYWdzLk9wdGlvbmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YSBpbnN0YW5jZW9mIFNraXBTZWxmIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdTa2lwU2VsZicgfHwgbWV0YSA9PT0gU2tpcFNlbGYpIHsKICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBJbmplY3RGbGFncy5Ta2lwU2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBTZWxmIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdTZWxmJyB8fCBtZXRhID09PSBTZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSW5qZWN0RmxhZ3MuU2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBJbmplY3QgfHwgbWV0YSA9PT0gSW5qZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IG1ldGEudG9rZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gbWV0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzLnB1c2goybXJtWluamVjdCgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBmbGFncykpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYXJncy5wdXNoKMm1ybVpbmplY3QoYXJnKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGFyZ3M7Cn0KY2xhc3MgTnVsbEluamVjdG9yIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlID0gVEhST1dfSUZfTk9UX0ZPVU5EKSB7CiAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgPT09IFRIUk9XX0lGX05PVF9GT1VORCkgewogICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgYmVoaW5kOiBXaXRoIGRldiB0b29scyBvcGVuIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaGVyZS4gVGhlcmUgaXMgbm8KICAgICAgICAgICAgLy8gcmVhc29uIHdoeSBjb3JyZWN0bHkgd3JpdHRlbiBhcHBsaWNhdGlvbiBzaG91bGQgY2F1c2UgdGhpcyBleGNlcHRpb24uCiAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSBvbmNlIGBuZ0Rldk1vZGVgIHdvcmtzIHdpdGggY2xvc3VyZS4KICAgICAgICAgICAgLy8gaWYgKG5nRGV2TW9kZSkgZGVidWdnZXI7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYE51bGxJbmplY3RvckVycm9yOiBObyBwcm92aWRlciBmb3IgJHtzdHJpbmdpZnkodG9rZW4pfSFgKTsKICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdOdWxsSW5qZWN0b3JFcnJvcic7CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBlCiAqIEBwYXJhbSB7P30gdG9rZW4KICogQHBhcmFtIHs/fSBpbmplY3RvckVycm9yTmFtZQogKiBAcGFyYW0gez99IHNvdXJjZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2F0Y2hJbmplY3RvckVycm9yKGUsIHRva2VuLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0b2tlblBhdGggPSBlW05HX1RFTVBfVE9LRU5fUEFUSF07CiAgICBpZiAodG9rZW5bU09VUkNFXSkgewogICAgICAgIHRva2VuUGF0aC51bnNoaWZ0KHRva2VuW1NPVVJDRV0pOwogICAgfQogICAgZS5tZXNzYWdlID0gZm9ybWF0RXJyb3IoJ1xuJyArIGUubWVzc2FnZSwgdG9rZW5QYXRoLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKTsKICAgIGVbTkdfVE9LRU5fUEFUSF0gPSB0b2tlblBhdGg7CiAgICBlW05HX1RFTVBfVE9LRU5fUEFUSF0gPSBudWxsOwogICAgdGhyb3cgZTsKfQovKioKICogQHBhcmFtIHs/fSB0ZXh0CiAqIEBwYXJhbSB7P30gb2JqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3JFcnJvck5hbWUKICogQHBhcmFtIHs/PX0gc291cmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmb3JtYXRFcnJvcih0ZXh0LCBvYmosIGluamVjdG9yRXJyb3JOYW1lLCBzb3VyY2UgPSBudWxsKSB7CiAgICB0ZXh0ID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PT0gJ1xuJyAmJiB0ZXh0LmNoYXJBdCgxKSA9PSBOT19ORVdfTElORSA/IHRleHQuc3Vic3RyKDIpIDogdGV4dDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjb250ZXh0ID0gc3RyaW5naWZ5KG9iaik7CiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CiAgICAgICAgY29udGV4dCA9IG9iai5tYXAoc3RyaW5naWZ5KS5qb2luKCcgLT4gJyk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFydHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKTsKICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7CiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW2tleV07CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGtleSArICc6JyArICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogc3RyaW5naWZ5KHZhbHVlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnRleHQgPSBgeyR7cGFydHMuam9pbignLCAnKX19YDsKICAgIH0KICAgIHJldHVybiBgJHtpbmplY3RvckVycm9yTmFtZX0ke3NvdXJjZSA/ICcoJyArIHNvdXJjZSArICcpJyA6ICcnfVske2NvbnRleHR9XTogJHt0ZXh0LnJlcGxhY2UoTkVXX0xJTkUsICdcbiAgJyl9YDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaml0L2Vudmlyb25tZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIG1hcHBpbmcgb2YgdGhlIFxAYW5ndWxhci9jb3JlIEFQSSBzdXJmYWNlIHVzZWQgaW4gZ2VuZXJhdGVkIGV4cHJlc3Npb25zIHRvIHRoZSBhY3R1YWwgc3ltYm9scy4KICoKICogVGhpcyBzaG91bGQgYmUga2VwdCB1cCB0byBkYXRlIHdpdGggdGhlIHB1YmxpYyBleHBvcnRzIG9mIFxAYW5ndWxhci9jb3JlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IGFuZ3VsYXJDb3JlRGlFbnYgPSB7CiAgICAnybXJtWRlZmluZUluamVjdGFibGUnOiDJtcm1ZGVmaW5lSW5qZWN0YWJsZSwKICAgICfJtcm1ZGVmaW5lSW5qZWN0b3InOiDJtcm1ZGVmaW5lSW5qZWN0b3IsCiAgICAnybXJtWluamVjdCc6IMm1ybVpbmplY3QsCiAgICAnybXJtWdldEZhY3RvcnlPZic6IGdldEZhY3RvcnlPZiwKICAgICfJtcm1aW52YWxpZEZhY3RvcnlEZXAnOiDJtcm1aW52YWxpZEZhY3RvcnlEZXAsCn07Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEZhY3RvcnlPZih0eXBlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0eXBlQW55ID0gKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKTsKICAgIGlmIChpc0ZvcndhcmRSZWYodHlwZSkpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IGdldEZhY3RvcnlPZihyZXNvbHZlRm9yd2FyZFJlZih0eXBlQW55KSk7CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5ID8gZmFjdG9yeSgpIDogbnVsbDsKICAgICAgICB9KSkpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlZiA9IGdldEluamVjdGFibGVEZWYodHlwZUFueSkgfHwgZ2V0SW5qZWN0b3JEZWYodHlwZUFueSk7CiAgICBpZiAoIWRlZiB8fCBkZWYuZmFjdG9yeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZGVmLmZhY3Rvcnk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGFuIE5nTW9kdWxlIGNyZWF0ZWQgdmlhIGEge1xAbGluayBOZ01vZHVsZUZhY3Rvcnl9LgogKgogKiBgTmdNb2R1bGVSZWZgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmdNb2R1bGUgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpcwogKiBOZ01vZHVsZSBJbnN0YW5jZS4KICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBOZ01vZHVsZVJlZiB7Cn0KLyoqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgTmdNb2R1bGVGYWN0b3J5IHsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBhc3NlcnROdW1iZXIoYWN0dWFsLCBtc2cpIHsKICAgIGlmICghKHR5cGVvZiBhY3R1YWwgPT09ICdudW1iZXInKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIHR5cGVvZiBhY3R1YWwsICdudW1iZXInLCAnPT09Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0TnVtYmVySW5SYW5nZShhY3R1YWwsIG1pbkluY2x1c2l2ZSwgbWF4SW5jbHVzaXZlKSB7CiAgICBhc3NlcnROdW1iZXIoYWN0dWFsLCAnRXhwZWN0ZWQgYSBudW1iZXInKTsKICAgIGFzc2VydExlc3NUaGFuT3JFcXVhbChhY3R1YWwsIG1heEluY2x1c2l2ZSwgJ0V4cGVjdGVkIG51bWJlciB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8nKTsKICAgIGFzc2VydEdyZWF0ZXJUaGFuT3JFcXVhbChhY3R1YWwsIG1pbkluY2x1c2l2ZSwgJ0V4cGVjdGVkIG51bWJlciB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8nKTsKfQpmdW5jdGlvbiBhc3NlcnRTdHJpbmcoYWN0dWFsLCBtc2cpIHsKICAgIGlmICghKHR5cGVvZiBhY3R1YWwgPT09ICdzdHJpbmcnKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhY3R1YWwsICdzdHJpbmcnLCAnPT09Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgPT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz09Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgIT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJyE9Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0U2FtZShhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgIGlmICghKGFjdHVhbCA9PT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz09PScpOwogICAgfQp9CmZ1bmN0aW9uIGFzc2VydE5vdFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgIT09IGV4cGVjdGVkKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICchPT0nKTsKICAgIH0KfQpmdW5jdGlvbiBhc3NlcnRMZXNzVGhhbihhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgIGlmICghKGFjdHVhbCA8IGV4cGVjdGVkKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICc8Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0TGVzc1RoYW5PckVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykgewogICAgaWYgKCEoYWN0dWFsIDw9IGV4cGVjdGVkKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICc8PScpOwogICAgfQp9CmZ1bmN0aW9uIGFzc2VydEdyZWF0ZXJUaGFuKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykgewogICAgaWYgKCEoYWN0dWFsID4gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz4nKTsKICAgIH0KfQpmdW5jdGlvbiBhc3NlcnRHcmVhdGVyVGhhbk9yRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgPj0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz49Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0RGVmaW5lZChhY3R1YWwsIG1zZykgewogICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBudWxsLCAnIT0nKTsKICAgIH0KfQpmdW5jdGlvbiB0aHJvd0Vycm9yJDEobXNnLCBhY3R1YWwsIGV4cGVjdGVkLCBjb21wYXJpc29uKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEFTU0VSVElPTiBFUlJPUjogJHttc2d9YCArCiAgICAgICAgKGNvbXBhcmlzb24gPT0gbnVsbCA/ICcnIDogYCBbRXhwZWN0ZWQ9PiAke2V4cGVjdGVkfSAke2NvbXBhcmlzb259ICR7YWN0dWFsfSA8PUFjdHVhbF1gKSk7Cn0KZnVuY3Rpb24gYXNzZXJ0RG9tTm9kZShub2RlKSB7CiAgICAvLyBJZiB3ZSdyZSBpbiBhIHdvcmtlciwgYE5vZGVgIHdpbGwgbm90IGJlIGRlZmluZWQuCiAgICBhc3NlcnRFcXVhbCgodHlwZW9mIE5vZGUgIT09ICd1bmRlZmluZWQnICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB8fAogICAgICAgICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPSBudWxsICYmCiAgICAgICAgICAgIG5vZGUuY29uc3RydWN0b3IubmFtZSA9PT0gJ1dlYldvcmtlclJlbmRlck5vZGUnKSwgdHJ1ZSwgYFRoZSBwcm92aWRlZCB2YWx1ZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgRE9NIE5vZGUgYnV0IGdvdCAke3N0cmluZ2lmeShub2RlKX1gKTsKfQpmdW5jdGlvbiBhc3NlcnREYXRhSW5SYW5nZShhcnIsIGluZGV4KSB7CiAgICBjb25zdCBtYXhMZW4gPSBhcnIgPyBhcnIubGVuZ3RoIDogMDsKICAgIGFzc2VydExlc3NUaGFuKGluZGV4LCBtYXhMZW4sIGBJbmRleCBleHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gJHttYXhMZW59IGJ1dCBnb3QgJHtpbmRleH1gKTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogRXF1aXZhbGVudCB0byBFUzYgc3ByZWFkLCBhZGQgZWFjaCBpdGVtIHRvIGFuIGFycmF5LgogKgogKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGFkZAogKiBAcGFyYW0gYXJyIFRoZSBhcnJheSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgdGhlIGl0ZW1zCiAqLwpmdW5jdGlvbiBhZGRBbGxUb0FycmF5KGl0ZW1zLCBhcnIpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcnIucHVzaChpdGVtc1tpXSk7CiAgICB9Cn0KLyoqCiAqIEZsYXR0ZW5zIGFuIGFycmF5LgogKi8KZnVuY3Rpb24gZmxhdHRlbihsaXN0LCBkc3QpIHsKICAgIGlmIChkc3QgPT09IHVuZGVmaW5lZCkKICAgICAgICBkc3QgPSBsaXN0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7CiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW5saW5lIGl0LgogICAgICAgICAgICBpZiAoZHN0ID09PSBsaXN0KSB7CiAgICAgICAgICAgICAgICAvLyBPdXIgYXNzdW1wdGlvbiB0aGF0IHRoZSBsaXN0IHdhcyBhbHJlYWR5IGZsYXQgd2FzIHdyb25nIGFuZAogICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjbG9uZSBmbGF0IHNpbmNlIHdlIG5lZWQgdG8gd3JpdGUgdG8gaXQuCiAgICAgICAgICAgICAgICBkc3QgPSBsaXN0LnNsaWNlKDAsIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsYXR0ZW4oaXRlbSwgZHN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZHN0ICE9PSBsaXN0KSB7CiAgICAgICAgICAgIGRzdC5wdXNoKGl0ZW0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBkc3Q7Cn0KZnVuY3Rpb24gZGVlcEZvckVhY2goaW5wdXQsIGZuKSB7CiAgICBpbnB1dC5mb3JFYWNoKHZhbHVlID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gZGVlcEZvckVhY2godmFsdWUsIGZuKSA6IGZuKHZhbHVlKSk7Cn0KZnVuY3Rpb24gYWRkVG9BcnJheShhcnIsIGluZGV4LCB2YWx1ZSkgewogICAgLy8gcGVyZjogYXJyYXkucHVzaCBpcyBmYXN0ZXIgdGhhbiBhcnJheS5zcGxpY2UhCiAgICBpZiAoaW5kZXggPj0gYXJyLmxlbmd0aCkgewogICAgICAgIGFyci5wdXNoKHZhbHVlKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIHZhbHVlKTsKICAgIH0KfQpmdW5jdGlvbiByZW1vdmVGcm9tQXJyYXkoYXJyLCBpbmRleCkgewogICAgLy8gcGVyZjogYXJyYXkucG9wIGlzIGZhc3RlciB0aGFuIGFycmF5LnNwbGljZSEKICAgIGlmIChpbmRleCA+PSBhcnIubGVuZ3RoIC0gMSkgewogICAgICAgIHJldHVybiBhcnIucG9wKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSlbMF07CiAgICB9Cn0KZnVuY3Rpb24gbmV3QXJyYXkoc2l6ZSwgdmFsdWUpIHsKICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgbGlzdC5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBsaXN0Owp9Ci8qKgogKiBTYW1lIGFzIGBBcnJheS5zcGxpY2UyKGluZGV4LCAwLCB2YWx1ZTEsIHZhbHVlMilgIGJ1dCBmYXN0ZXIuCiAqCiAqIGBBcnJheS5zcGxpY2UoKWAgaXMgbm90IGZhc3QgYmVjYXVzZSBpdCBoYXMgdG8gYWxsb2NhdGUgYW4gYXJyYXkgZm9yIHRoZSBlbGVtZW50cyB3aGljaCB3ZXJlCiAqIHJlbW92ZWQuIFRoaXMgY2F1c2VzIG1lbW9yeSBwcmVzc3VyZSBhbmQgc2xvd3MgZG93biBjb2RlIHdoZW4gbW9zdCBvZiB0aGUgdGltZSB3ZSBkb24ndAogKiBjYXJlIGFib3V0IHRoZSBkZWxldGVkIGl0ZW1zIGFycmF5LgogKgogKiBAcGFyYW0gYXJyYXkgQXJyYXkgdG8gc3BsaWNlLgogKiBAcGFyYW0gaW5kZXggSW5kZXggaW4gYXJyYXkgd2hlcmUgdGhlIGB2YWx1ZWAgc2hvdWxkIGJlIGFkZGVkLgogKiBAcGFyYW0gdmFsdWUxIFZhbHVlIHRvIGFkZCB0byBhcnJheS4KICogQHBhcmFtIHZhbHVlMiBWYWx1ZSB0byBhZGQgdG8gYXJyYXkuCiAqLwpmdW5jdGlvbiBhcnJheUluc2VydDIoYXJyYXksIGluZGV4LCB2YWx1ZTEsIHZhbHVlMikgewogICAgbmdEZXZNb2RlICYmIGFzc2VydExlc3NUaGFuT3JFcXVhbChpbmRleCwgYXJyYXkubGVuZ3RoLCAnQ2FuXCd0IGluc2VydCBwYXN0IGFycmF5IGVuZC4nKTsKICAgIGxldCBlbmQgPSBhcnJheS5sZW5ndGg7CiAgICBpZiAoZW5kID09IGluZGV4KSB7CiAgICAgICAgLy8gaW5zZXJ0aW5nIGF0IHRoZSBlbmQuCiAgICAgICAgYXJyYXkucHVzaCh2YWx1ZTEsIHZhbHVlMik7CiAgICB9CiAgICBlbHNlIGlmIChlbmQgPT09IDEpIHsKICAgICAgICAvLyBjb3JuZXIgY2FzZSB3aGVuIHdlIGhhdmUgbGVzcyBpdGVtcyBpbiBhcnJheSB0aGFuIHdlIGhhdmUgaXRlbXMgdG8gaW5zZXJ0LgogICAgICAgIGFycmF5LnB1c2godmFsdWUyLCBhcnJheVswXSk7CiAgICAgICAgYXJyYXlbMF0gPSB2YWx1ZTE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBlbmQtLTsKICAgICAgICBhcnJheS5wdXNoKGFycmF5W2VuZCAtIDFdLCBhcnJheVtlbmRdKTsKICAgICAgICB3aGlsZSAoZW5kID4gaW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbmQgPSBlbmQgLSAyOwogICAgICAgICAgICBhcnJheVtlbmRdID0gYXJyYXlbcHJldmlvdXNFbmRdOwogICAgICAgICAgICBlbmQtLTsKICAgICAgICB9CiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWUxOwogICAgICAgIGFycmF5W2luZGV4ICsgMV0gPSB2YWx1ZTI7CiAgICB9Cn0KLyoqCiAqIFNldCBhIGB2YWx1ZWAgZm9yIGEgYGtleWAuCiAqCiAqIEBwYXJhbSBrZXlWYWx1ZUFycmF5IHRvIG1vZGlmeS4KICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvY2F0ZSBvciBjcmVhdGUuCiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IGZvciBhIGBrZXlgLgogKiBAcmV0dXJucyBpbmRleCAoYWx3YXlzIGV2ZW4pIG9mIHdoZXJlIHRoZSB2YWx1ZSB2YXMgc2V0LgogKi8KZnVuY3Rpb24ga2V5VmFsdWVBcnJheVNldChrZXlWYWx1ZUFycmF5LCBrZXksIHZhbHVlKSB7CiAgICBsZXQgaW5kZXggPSBrZXlWYWx1ZUFycmF5SW5kZXhPZihrZXlWYWx1ZUFycmF5LCBrZXkpOwogICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAvLyBpZiB3ZSBmb3VuZCBpdCBzZXQgaXQuCiAgICAgICAga2V5VmFsdWVBcnJheVtpbmRleCB8IDFdID0gdmFsdWU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpbmRleCA9IH5pbmRleDsKICAgICAgICBhcnJheUluc2VydDIoa2V5VmFsdWVBcnJheSwgaW5kZXgsIGtleSwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGluZGV4Owp9Ci8qKgogKiBSZXRyaWV2ZSBhIGB2YWx1ZWAgZm9yIGEgYGtleWAgKG9uIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4pCiAqCiAqIEBwYXJhbSBrZXlWYWx1ZUFycmF5IHRvIHNlYXJjaC4KICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvY2F0ZS4KICogQHJldHVybiBUaGUgYHZhbHVlYCBzdG9yZWQgYXQgdGhlIGBrZXlgIGxvY2F0aW9uIG9yIGB1bmRlZmluZWQgaWYgbm90IGZvdW5kLgogKi8KZnVuY3Rpb24ga2V5VmFsdWVBcnJheUdldChrZXlWYWx1ZUFycmF5LCBrZXkpIHsKICAgIGNvbnN0IGluZGV4ID0ga2V5VmFsdWVBcnJheUluZGV4T2Yoa2V5VmFsdWVBcnJheSwga2V5KTsKICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgLy8gaWYgd2UgZm91bmQgaXQgcmV0cmlldmUgaXQuCiAgICAgICAgcmV0dXJuIGtleVZhbHVlQXJyYXlbaW5kZXggfCAxXTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7Cn0KLyoqCiAqIFJldHJpZXZlIGEgYGtleWAgaW5kZXggdmFsdWUgaW4gdGhlIGFycmF5IG9yIGAtMWAgaWYgbm90IGZvdW5kLgogKgogKiBAcGFyYW0ga2V5VmFsdWVBcnJheSB0byBzZWFyY2guCiAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb2NhdGUuCiAqIEByZXR1cm5zIGluZGV4IG9mIHdoZXJlIHRoZSBrZXkgaXMgKG9yIHNob3VsZCBoYXZlIGJlZW4uKQogKiAgIC0gcG9zaXRpdmUgKGV2ZW4pIGluZGV4IGlmIGtleSBmb3VuZC4KICogICAtIG5lZ2F0aXZlIGluZGV4IGlmIGtleSBub3QgZm91bmQuIChgfmluZGV4YCAoZXZlbikgdG8gZ2V0IHRoZSBpbmRleCB3aGVyZSBpdCBzaG91bGQgaGF2ZQogKiAgICAgYmVlbiBpbnNlcnRlZC4pCiAqLwpmdW5jdGlvbiBrZXlWYWx1ZUFycmF5SW5kZXhPZihrZXlWYWx1ZUFycmF5LCBrZXkpIHsKICAgIHJldHVybiBfYXJyYXlJbmRleE9mU29ydGVkKGtleVZhbHVlQXJyYXksIGtleSwgMSk7Cn0KLyoqCiAqIElOVEVSTkFMOiBHZXQgYW4gaW5kZXggb2YgYW4gYHZhbHVlYCBpbiBhIHNvcnRlZCBgYXJyYXlgIGJ5IGdyb3VwaW5nIHNlYXJjaCBieSBgc2hpZnRgLgogKgogKiBOT1RFOgogKiAtIFRoaXMgdXNlcyBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobSBmb3IgZmFzdCByZW1vdmFscy4KICoKICogQHBhcmFtIGFycmF5IEEgc29ydGVkIGFycmF5IHRvIGJpbmFyeSBzZWFyY2guCiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gbG9vayBmb3IuCiAqIEBwYXJhbSBzaGlmdCBncm91cGluZyBzaGlmdC4KICogICAtIGAwYCBtZWFucyBsb29rIGF0IGV2ZXJ5IGxvY2F0aW9uCiAqICAgLSBgMWAgbWVhbnMgb25seSBsb29rIGF0IGV2ZXJ5IG90aGVyIChldmVuKSBsb2NhdGlvbiAodGhlIG9kZCBsb2NhdGlvbnMgYXJlIHRvIGJlIGlnbm9yZWQgYXMKICogICAgICAgICB0aGV5IGFyZSB2YWx1ZXMuKQogKiBAcmV0dXJucyBpbmRleCBvZiB0aGUgdmFsdWUuCiAqICAgLSBwb3NpdGl2ZSBpbmRleCBpZiB2YWx1ZSBmb3VuZC4KICogICAtIG5lZ2F0aXZlIGluZGV4IGlmIHZhbHVlIG5vdCBmb3VuZC4gKGB+aW5kZXhgIHRvIGdldCB0aGUgdmFsdWUgd2hlcmUgaXQgc2hvdWxkIGhhdmUgYmVlbgogKiBpbnNlcnRlZCkKICovCmZ1bmN0aW9uIF9hcnJheUluZGV4T2ZTb3J0ZWQoYXJyYXksIHZhbHVlLCBzaGlmdCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKEFycmF5LmlzQXJyYXkoYXJyYXkpLCB0cnVlLCAnRXhwZWN0aW5nIGFuIGFycmF5Jyk7CiAgICBsZXQgc3RhcnQgPSAwOwogICAgbGV0IGVuZCA9IGFycmF5Lmxlbmd0aCA+PiBzaGlmdDsKICAgIHdoaWxlIChlbmQgIT09IHN0YXJ0KSB7CiAgICAgICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyAoKGVuZCAtIHN0YXJ0KSA+PiAxKTsgLy8gZmluZCB0aGUgbWlkZGxlLgogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJheVttaWRkbGUgPDwgc2hpZnRdOwogICAgICAgIGlmICh2YWx1ZSA9PT0gY3VycmVudCkgewogICAgICAgICAgICByZXR1cm4gKG1pZGRsZSA8PCBzaGlmdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPiB2YWx1ZSkgewogICAgICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdGFydCA9IG1pZGRsZSArIDE7IC8vIFdlIGFscmVhZHkgc2VhcmNoZWQgbWlkZGxlIHNvIG1ha2UgaXQgbm9uLWluY2x1c2l2ZSBieSBhZGRpbmcgMQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB+KGVuZCA8PCBzaGlmdCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24vY29uc3RhbnRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IENoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gewogICAgLyoqCiAgICAgKiBVc2UgdGhlIGBDaGVja09uY2VgIHN0cmF0ZWd5LCBtZWFuaW5nIHRoYXQgYXV0b21hdGljIGNoYW5nZSBkZXRlY3Rpb24gaXMgZGVhY3RpdmF0ZWQKICAgICAqIHVudGlsIHJlYWN0aXZhdGVkIGJ5IHNldHRpbmcgdGhlIHN0cmF0ZWd5IHRvIGBEZWZhdWx0YCAoYENoZWNrQWx3YXlzYCkuCiAgICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNhbiBzdGlsbCBiZSBleHBsaWNpdGx5IGludm9rZWQuCiAgICAgKiBUaGlzIHN0cmF0ZWd5IGFwcGxpZXMgdG8gYWxsIGNoaWxkIGRpcmVjdGl2ZXMgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuLgogICAgICovCiAgICBPblB1c2g6IDAsCiAgICAvKioKICAgICAqIFVzZSB0aGUgZGVmYXVsdCBgQ2hlY2tBbHdheXNgIHN0cmF0ZWd5LCBpbiB3aGljaCBjaGFuZ2UgZGV0ZWN0aW9uIGlzIGF1dG9tYXRpYyB1bnRpbAogICAgICogZXhwbGljaXRseSBkZWFjdGl2YXRlZC4KICAgICAqLwogICAgRGVmYXVsdDogMSwKfTsKQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXSA9ICdPblB1c2gnOwpDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XSA9ICdEZWZhdWx0JzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL21ldGFkYXRhL3ZpZXcudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgVmlld0VuY2Fwc3VsYXRpb24kMSA9IHsKICAgIC8qKgogICAgICogRW11bGF0ZSBgTmF0aXZlYCBzY29waW5nIG9mIHN0eWxlcyBieSBhZGRpbmcgYW4gYXR0cmlidXRlIGNvbnRhaW5pbmcgc3Vycm9nYXRlIGlkIHRvIHRoZSBIb3N0CiAgICAgKiBFbGVtZW50IGFuZCBwcmUtcHJvY2Vzc2luZyB0aGUgc3R5bGUgcnVsZXMgcHJvdmlkZWQgdmlhIHtAbGluayBDb21wb25lbnQjc3R5bGVzIHN0eWxlc30gb3IKICAgICAqIHtAbGluayBDb21wb25lbnQjc3R5bGVVcmxzIHN0eWxlVXJsc30sIGFuZCBhZGRpbmcgdGhlIG5ldyBIb3N0IEVsZW1lbnQgYXR0cmlidXRlIHRvIGFsbAogICAgICogc2VsZWN0b3JzLgogICAgICoKICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uLgogICAgICovCiAgICBFbXVsYXRlZDogMCwKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgdjYuMS4wIC0gdXNlIHtWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb219IGluc3RlYWQuCiAgICAgKiBVc2UgdGhlIG5hdGl2ZSBlbmNhcHN1bGF0aW9uIG1lY2hhbmlzbSBvZiB0aGUgcmVuZGVyZXIuCiAgICAgKgogICAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyB0aGUgZGVwcmVjYXRlZCBbU2hhZG93IERPTQogICAgICogdjBdKGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvc2hhZG93LykgYW5kCiAgICAgKiBjcmVhdGluZyBhIFNoYWRvd1Jvb3QgZm9yIENvbXBvbmVudCdzIEhvc3QgRWxlbWVudC4KICAgICAqLwogICAgTmF0aXZlOiAxLAogICAgLyoqCiAgICAgKiBEb24ndCBwcm92aWRlIGFueSB0ZW1wbGF0ZSBvciBzdHlsZSBlbmNhcHN1bGF0aW9uLgogICAgICovCiAgICBOb25lOiAyLAogICAgLyoqCiAgICAgKiBVc2UgU2hhZG93IERPTSB0byBlbmNhcHN1bGF0ZSBzdHlsZXMuCiAgICAgKgogICAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyBtb2Rlcm4gW1NoYWRvdwogICAgICogRE9NXShodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL3NoYWRvdy8pIGFuZAogICAgICogY3JlYXRpbmcgYSBTaGFkb3dSb290IGZvciBDb21wb25lbnQncyBIb3N0IEVsZW1lbnQuCiAgICAgKi8KICAgIFNoYWRvd0RvbTogMywKfTsKVmlld0VuY2Fwc3VsYXRpb24kMVtWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkXSA9ICdFbXVsYXRlZCc7ClZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5OYXRpdmVdID0gJ05hdGl2ZSc7ClZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5Ob25lXSA9ICdOb25lJzsKVmlld0VuY2Fwc3VsYXRpb24kMVtWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbV0gPSAnU2hhZG93RG9tJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZW1wdHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRoaXMgZmlsZSBjb250YWlucyByZXVzZWFibGUgImVtcHR5IiBzeW1ib2xzIHRoYXQgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdCByZXR1cm4gdmFsdWVzCiAqIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgcmVuZGVyaW5nIGNvZGUuIEJlY2F1c2UgdGhlIHNhbWUgc3ltYm9scyBhcmUgcmV0dXJuZWQsIHRoaXMKICogYWxsb3dzIGZvciBpZGVudGl0eSBjaGVja3MgYWdhaW5zdCB0aGVzZSB2YWx1ZXMgdG8gYmUgY29uc2lzdGVudGx5IHVzZWQgYnkgdGhlIGZyYW1ld29yawogKiBjb2RlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVNUFRZX09CSiA9IHt9OwovKiogQHR5cGUgez99ICovCmNvbnN0IEVNUFRZX0FSUkFZID0gW107Ci8vIGZyZWV6aW5nIHRoZSB2YWx1ZXMgcHJldmVudHMgYW55IGNvZGUgZnJvbSBhY2NpZGVudGFsbHkgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMgaW4KaWYgKCh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSkgewogICAgLy8gVGhlc2UgcHJvcGVydHkgYWNjZXNzZXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSBuZ0Rldk1vZGUgd2lsbCBiZSBzZXQgdG8gZmFsc2UKICAgIC8vIHdoZW4gb3B0aW1pemluZyBjb2RlIGFuZCB0aGUgd2hvbGUgaWYgc3RhdGVtZW50IHdpbGwgYmUgZHJvcHBlZC4KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIE9iamVjdC5mcmVlemUoRU1QVFlfT0JKKTsKICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIE9iamVjdC5mcmVlemUoRU1QVFlfQVJSQVkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2RlZmluaXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgX3JlbmRlckNvbXBDb3VudCA9IDA7Ci8qKgogKiBDcmVhdGUgYSBjb21wb25lbnQgZGVmaW5pdGlvbiBvYmplY3QuCiAqCiAqCiAqICMgRXhhbXBsZQogKiBgYGAKICogY2xhc3MgTXlEaXJlY3RpdmUgewogKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyCiAqICAgLy8gW1N5bWJvbF0gc3ludGF4IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBieSBUeXBlU2NyaXB0IHVudGlsIHYyLjcKICogICBzdGF0aWMgybVjbXAgPSBkZWZpbmVDb21wb25lbnQoewogKiAgICAgLi4uCiAqICAgfSk7CiAqIH0KICogYGBgCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGNvbXBvbmVudERlZmluaXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVkZWZpbmVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbikgewogICAgcmV0dXJuIG5vU2lkZUVmZmVjdHMoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gewogICAgICAgIC8vIEluaXRpYWxpemUgbmdEZXZNb2RlLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiDJtcm1ZGVmaW5lQ29tcG9uZW50LgogICAgICAgIC8vIFNlZSB0aGUgYGluaXROZ0Rldk1vZGVgIGRvY3N0cmluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHR5cGUgPSBjb21wb25lbnREZWZpbml0aW9uLnR5cGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHR5cGVQcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVjbGFyZWRJbnB1dHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gewogICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICBwcm92aWRlcnNSZXNvbHZlcjogbnVsbCwKICAgICAgICAgICAgZGVjbHM6IGNvbXBvbmVudERlZmluaXRpb24uZGVjbHMsCiAgICAgICAgICAgIHZhcnM6IGNvbXBvbmVudERlZmluaXRpb24udmFycywKICAgICAgICAgICAgZmFjdG9yeTogbnVsbCwKICAgICAgICAgICAgdGVtcGxhdGU6IGNvbXBvbmVudERlZmluaXRpb24udGVtcGxhdGUgfHwgKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgY29uc3RzOiBjb21wb25lbnREZWZpbml0aW9uLmNvbnN0cyB8fCBudWxsLAogICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IGNvbXBvbmVudERlZmluaXRpb24ubmdDb250ZW50U2VsZWN0b3JzLAogICAgICAgICAgICBob3N0QmluZGluZ3M6IGNvbXBvbmVudERlZmluaXRpb24uaG9zdEJpbmRpbmdzIHx8IG51bGwsCiAgICAgICAgICAgIGhvc3RWYXJzOiBjb21wb25lbnREZWZpbml0aW9uLmhvc3RWYXJzIHx8IDAsCiAgICAgICAgICAgIGhvc3RBdHRyczogY29tcG9uZW50RGVmaW5pdGlvbi5ob3N0QXR0cnMgfHwgbnVsbCwKICAgICAgICAgICAgY29udGVudFF1ZXJpZXM6IGNvbXBvbmVudERlZmluaXRpb24uY29udGVudFF1ZXJpZXMgfHwgbnVsbCwKICAgICAgICAgICAgZGVjbGFyZWRJbnB1dHM6IGRlY2xhcmVkSW5wdXRzLAogICAgICAgICAgICBpbnB1dHM6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgIC8vIGFzc2lnbmVkIGluIG5vU2lkZUVmZmVjdHMKICAgICAgICAgICAgb3V0cHV0czogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgLy8gYXNzaWduZWQgaW4gbm9TaWRlRWZmZWN0cwogICAgICAgICAgICBleHBvcnRBczogY29tcG9uZW50RGVmaW5pdGlvbi5leHBvcnRBcyB8fCBudWxsLAogICAgICAgICAgICBvbkNoYW5nZXM6IG51bGwsCiAgICAgICAgICAgIG9uSW5pdDogdHlwZVByb3RvdHlwZS5uZ09uSW5pdCB8fCBudWxsLAogICAgICAgICAgICBkb0NoZWNrOiB0eXBlUHJvdG90eXBlLm5nRG9DaGVjayB8fCBudWxsLAogICAgICAgICAgICBhZnRlckNvbnRlbnRJbml0OiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50SW5pdCB8fCBudWxsLAogICAgICAgICAgICBhZnRlckNvbnRlbnRDaGVja2VkOiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCB8fCBudWxsLAogICAgICAgICAgICBhZnRlclZpZXdJbml0OiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJWaWV3SW5pdCB8fCBudWxsLAogICAgICAgICAgICBhZnRlclZpZXdDaGVja2VkOiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJWaWV3Q2hlY2tlZCB8fCBudWxsLAogICAgICAgICAgICBvbkRlc3Ryb3k6IHR5cGVQcm90b3R5cGUubmdPbkRlc3Ryb3kgfHwgbnVsbCwKICAgICAgICAgICAgb25QdXNoOiBjb21wb25lbnREZWZpbml0aW9uLmNoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICBkaXJlY3RpdmVEZWZzOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLyBhc3NpZ25lZCBpbiBub1NpZGVFZmZlY3RzCiAgICAgICAgICAgIHBpcGVEZWZzOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLyBhc3NpZ25lZCBpbiBub1NpZGVFZmZlY3RzCiAgICAgICAgICAgIHNlbGVjdG9yczogY29tcG9uZW50RGVmaW5pdGlvbi5zZWxlY3RvcnMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgICAgIHZpZXdRdWVyeTogY29tcG9uZW50RGVmaW5pdGlvbi52aWV3UXVlcnkgfHwgbnVsbCwKICAgICAgICAgICAgZmVhdHVyZXM6ICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnREZWZpbml0aW9uLmZlYXR1cmVzKSkgfHwgbnVsbCwKICAgICAgICAgICAgZGF0YTogY29tcG9uZW50RGVmaW5pdGlvbi5kYXRhIHx8IHt9LAogICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogY29udmVydCBWaWV3RW5jYXBzdWxhdGlvbiBpbnRvIGNvbnN0IGVudW0gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbgogICAgICAgICAgICAvLyB0aGUgbmV4dCBsaW5lLiBBbHNvIGBOb25lYCBzaG91bGQgYmUgMCBub3QgMi4KICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogY29tcG9uZW50RGVmaW5pdGlvbi5lbmNhcHN1bGF0aW9uIHx8IFZpZXdFbmNhcHN1bGF0aW9uJDEuRW11bGF0ZWQsCiAgICAgICAgICAgIGlkOiAnYycsCiAgICAgICAgICAgIHN0eWxlczogY29tcG9uZW50RGVmaW5pdGlvbi5zdHlsZXMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgICAgIF86ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgIHNldElucHV0OiBudWxsLAogICAgICAgICAgICBzY2hlbWFzOiBjb21wb25lbnREZWZpbml0aW9uLnNjaGVtYXMgfHwgbnVsbCwKICAgICAgICAgICAgdFZpZXc6IG51bGwsCiAgICAgICAgfTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlVHlwZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50RGVmaW5pdGlvbi5kaXJlY3RpdmVzKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjb21wb25lbnREZWZpbml0aW9uLmZlYXR1cmVzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwaXBlVHlwZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50RGVmaW5pdGlvbi5waXBlcykpOwogICAgICAgIGRlZi5pZCArPSBfcmVuZGVyQ29tcENvdW50Kys7CiAgICAgICAgZGVmLmlucHV0cyA9IGludmVydE9iamVjdChjb21wb25lbnREZWZpbml0aW9uLmlucHV0cywgZGVjbGFyZWRJbnB1dHMpLAogICAgICAgICAgICBkZWYub3V0cHV0cyA9IGludmVydE9iamVjdChjb21wb25lbnREZWZpbml0aW9uLm91dHB1dHMpLAogICAgICAgICAgICBmZWF0dXJlICYmIGZlYXR1cmUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChmbikgPT4gZm4oZGVmKSkpOwogICAgICAgIGRlZi5kaXJlY3RpdmVEZWZzID0gZGlyZWN0aXZlVHlwZXMgPwogICAgICAgICAgICAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAodHlwZW9mIGRpcmVjdGl2ZVR5cGVzID09PSAnZnVuY3Rpb24nID8gZGlyZWN0aXZlVHlwZXMoKSA6IGRpcmVjdGl2ZVR5cGVzKQogICAgICAgICAgICAgICAgLm1hcChleHRyYWN0RGlyZWN0aXZlRGVmKSkgOgogICAgICAgICAgICBudWxsOwogICAgICAgIGRlZi5waXBlRGVmcyA9IHBpcGVUeXBlcyA/CiAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+ICh0eXBlb2YgcGlwZVR5cGVzID09PSAnZnVuY3Rpb24nID8gcGlwZVR5cGVzKCkgOiBwaXBlVHlwZXMpLm1hcChleHRyYWN0UGlwZURlZikpIDoKICAgICAgICAgICAgbnVsbDsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpOwogICAgfSkpOwp9Ci8qKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlcwogKiBAcGFyYW0gez99IHBpcGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c2V0Q29tcG9uZW50U2NvcGUodHlwZSwgZGlyZWN0aXZlcywgcGlwZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlZiA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZS7JtWNtcCkpKTsKICAgIGRlZi5kaXJlY3RpdmVEZWZzID0gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gZGlyZWN0aXZlcy5tYXAoZXh0cmFjdERpcmVjdGl2ZURlZikpOwogICAgZGVmLnBpcGVEZWZzID0gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gcGlwZXMubWFwKGV4dHJhY3RQaXBlRGVmKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXh0cmFjdERpcmVjdGl2ZURlZih0eXBlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWYgPSBnZXRDb21wb25lbnREZWYodHlwZSkgfHwgZ2V0RGlyZWN0aXZlRGVmKHR5cGUpOwogICAgaWYgKG5nRGV2TW9kZSAmJiAhZGVmKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHt0eXBlLm5hbWV9JyBpcyBuZWl0aGVyICdDb21wb25lbnRUeXBlJyBvciAnRGlyZWN0aXZlVHlwZScuYCk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4dHJhY3RQaXBlRGVmKHR5cGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlZiA9IGdldFBpcGVEZWYodHlwZSk7CiAgICBpZiAobmdEZXZNb2RlICYmICFkZWYpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3R5cGUubmFtZX0nIGlzIG5vdCBhICdQaXBlVHlwZScuYCk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgYXV0b1JlZ2lzdGVyTW9kdWxlQnlJZCA9IHt9OwovKioKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZGVmCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1ZGVmaW5lTmdNb2R1bGUoZGVmKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXMgPSB7CiAgICAgICAgdHlwZTogZGVmLnR5cGUsCiAgICAgICAgYm9vdHN0cmFwOiBkZWYuYm9vdHN0cmFwIHx8IEVNUFRZX0FSUkFZLAogICAgICAgIGRlY2xhcmF0aW9uczogZGVmLmRlY2xhcmF0aW9ucyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICBpbXBvcnRzOiBkZWYuaW1wb3J0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICBleHBvcnRzOiBkZWYuZXhwb3J0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICB0cmFuc2l0aXZlQ29tcGlsZVNjb3BlczogbnVsbCwKICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLAogICAgICAgIGlkOiBkZWYuaWQgfHwgbnVsbCwKICAgIH07CiAgICBpZiAoZGVmLmlkICE9IG51bGwpIHsKICAgICAgICBub1NpZGVFZmZlY3RzKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgYXV0b1JlZ2lzdGVyTW9kdWxlQnlJZFsoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLmlkKSldID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChkZWYudHlwZSkpKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyZXMpKTsKfQovKioKICogQWRkcyB0aGUgbW9kdWxlIG1ldGFkYXRhIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXB1dGUgdGhlIG1vZHVsZSdzIHRyYW5zaXRpdmUgc2NvcGUgdG8gYW4KICogZXhpc3RpbmcgbW9kdWxlIGRlZmluaXRpb24uCiAqCiAqIFNjb3BlIG1ldGFkYXRhIG9mIG1vZHVsZXMgaXMgbm90IHVzZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMsIHNvIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlCiAqIG1hcmtlZCBwdXJlIHRvIHRyZWUtc2hha2UgaXQgZnJvbSB0aGUgYnVuZGxlLCBhbGxvd2luZyBmb3IgYWxsIHJlZmVyZW5jZWQgZGVjbGFyYXRpb25zCiAqIHRvIGJlY29tZSBlbGlnaWJsZSBmb3IgdHJlZS1zaGFraW5nIGFzIHdlbGwuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBzY29wZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXNldE5nTW9kdWxlU2NvcGUodHlwZSwgc2NvcGUpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobm9TaWRlRWZmZWN0cygoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYodHlwZSwgdHJ1ZSk7CiAgICAgICAgbmdNb2R1bGVEZWYuZGVjbGFyYXRpb25zID0gc2NvcGUuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZOwogICAgICAgIG5nTW9kdWxlRGVmLmltcG9ydHMgPSBzY29wZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZOwogICAgICAgIG5nTW9kdWxlRGVmLmV4cG9ydHMgPSBzY29wZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZOwogICAgfSkpKSk7Cn0KLyoqCiAqIEludmVydHMgYW4gaW5wdXRzIG9yIG91dHB1dHMgbG9va3VwIHN1Y2ggdGhhdCB0aGUga2V5cywgd2hpY2ggd2VyZSB0aGUKICogbWluaWZpZWQga2V5cywgYXJlIHBhcnQgb2YgdGhlIHZhbHVlcywgYW5kIHRoZSB2YWx1ZXMgYXJlIHBhcnNlZCBzbyB0aGF0CiAqIHRoZSBwdWJsaWNOYW1lIG9mIHRoZSBwcm9wZXJ0eSBpcyB0aGUgbmV3IGtleQogKgogKiBlLmcuIGZvcgogKgogKiBgYGAKICogY2xhc3MgQ29tcCB7CiAqIFxASW5wdXQoKQogKiAgIHByb3BOYW1lMTogc3RyaW5nOwogKgogKiBcQElucHV0KCdwdWJsaWNOYW1lMicpCiAqICAgZGVjbGFyZWRQcm9wTmFtZTI6IG51bWJlcjsKICogfQogKiBgYGAKICoKICogd2lsbCBiZSBzZXJpYWxpemVkIGFzCiAqCiAqIGBgYAogKiB7CiAqICAgcHJvcE5hbWUxOiAncHJvcE5hbWUxJywKICogICBkZWNsYXJlZFByb3BOYW1lMjogWydwdWJsaWNOYW1lMicsICdkZWNsYXJlZFByb3BOYW1lMiddLAogKiB9CiAqIGBgYAogKgogKiB3aGljaCBpcyB0aGFuIHRyYW5zbGF0ZWQgYnkgdGhlIG1pbmlmaWVyIGFzOgogKgogKiBgYGAKICogewogKiAgIG1pbmlmaWVkUHJvcE5hbWUxOiAncHJvcE5hbWUxJywKICogICBtaW5pZmllZFByb3BOYW1lMjogWydwdWJsaWNOYW1lMicsICdkZWNsYXJlZFByb3BOYW1lMiddLAogKiB9CiAqIGBgYAogKgogKiBiZWNvbWVzOiAocHVibGljIG5hbWUgPT4gbWluaWZpZWROYW1lKQogKgogKiBgYGAKICogewogKiAgJ3Byb3BOYW1lMSc6ICdtaW5pZmllZFByb3BOYW1lMScsCiAqICAncHVibGljTmFtZTInOiAnbWluaWZpZWRQcm9wTmFtZTInLAogKiB9CiAqIGBgYAogKgogKiBPcHRpb25hbGx5IHRoZSBmdW5jdGlvbiBjYW4gdGFrZSBgc2Vjb25kYXJ5YCB3aGljaCB3aWxsIHJlc3VsdCBpbjogKHB1YmxpYyBuYW1lID0+IGRlY2xhcmVkIG5hbWUpCiAqCiAqIGBgYAogKiB7CiAqICAncHJvcE5hbWUxJzogJ3Byb3BOYW1lMScsCiAqICAncHVibGljTmFtZTInOiAnZGVjbGFyZWRQcm9wTmFtZTInLAogKiB9CiAqIGBgYAogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez89fSBvYmoKICogQHBhcmFtIHs/PX0gc2Vjb25kYXJ5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnZlcnRPYmplY3Qob2JqLCBzZWNvbmRhcnkpIHsKICAgIGlmIChvYmogPT0gbnVsbCkKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKEVNUFRZX09CSikpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV3TG9va3VwID0ge307CiAgICBmb3IgKGNvbnN0IG1pbmlmaWVkS2V5IGluIG9iaikgewogICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobWluaWZpZWRLZXkpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHB1YmxpY05hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAob2JqW21pbmlmaWVkS2V5XSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZWNsYXJlZE5hbWUgPSBwdWJsaWNOYW1lOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwdWJsaWNOYW1lKSkgewogICAgICAgICAgICAgICAgZGVjbGFyZWROYW1lID0gcHVibGljTmFtZVsxXTsKICAgICAgICAgICAgICAgIHB1YmxpY05hbWUgPSBwdWJsaWNOYW1lWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ld0xvb2t1cFtwdWJsaWNOYW1lXSA9IG1pbmlmaWVkS2V5OwogICAgICAgICAgICBpZiAoc2Vjb25kYXJ5KSB7CiAgICAgICAgICAgICAgICAoc2Vjb25kYXJ5W3B1YmxpY05hbWVdID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmVkTmFtZSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdMb29rdXA7Cn0KLyoqCiAqIENyZWF0ZSBhIGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdC4KICoKICogIyBFeGFtcGxlCiAqIGBgYHRzCiAqIGNsYXNzIE15RGlyZWN0aXZlIHsKICogICAvLyBHZW5lcmF0ZWQgYnkgQW5ndWxhciBUZW1wbGF0ZSBDb21waWxlcgogKiAgIC8vIFtTeW1ib2xdIHN5bnRheCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYnkgVHlwZVNjcmlwdCB1bnRpbCB2Mi43CiAqICAgc3RhdGljIMm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7CiAqICAgICAuLi4KICogICB9KTsKICogfQogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgybXJtWRlZmluZURpcmVjdGl2ZSA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoybXJtWRlZmluZUNvbXBvbmVudCkpKSk7Ci8qKgogKiBDcmVhdGUgYSBwaXBlIGRlZmluaXRpb24gb2JqZWN0LgogKgogKiAjIEV4YW1wbGUKICogYGBgCiAqIGNsYXNzIE15UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0gewogKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyCiAqICAgc3RhdGljIMm1cGlwZSA9IGRlZmluZVBpcGUoewogKiAgICAgLi4uCiAqICAgfSk7CiAqIH0KICogYGBgCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHBpcGVEZWYgUGlwZSBkZWZpbml0aW9uIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIKICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVkZWZpbmVQaXBlKHBpcGVEZWYpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgdHlwZTogcGlwZURlZi50eXBlLAogICAgICAgIG5hbWU6IHBpcGVEZWYubmFtZSwKICAgICAgICBmYWN0b3J5OiBudWxsLAogICAgICAgIHB1cmU6IHBpcGVEZWYucHVyZSAhPT0gZmFsc2UsCiAgICAgICAgb25EZXN0cm95OiBwaXBlRGVmLnR5cGUucHJvdG90eXBlLm5nT25EZXN0cm95IHx8IG51bGwKICAgIH0pKSkpKTsKfQovKioKICogVGhlIGZvbGxvd2luZyBnZXR0ZXIgbWV0aG9kcyByZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBmb3JtIHRoZSB0eXBlLiBDdXJyZW50bHkgdGhlIHJldHJpZXZhbAogKiBob25vcnMgaW5oZXJpdGFuY2UsIGJ1dCBpbiB0aGUgZnV0dXJlIHdlIG1heSBjaGFuZ2UgdGhlIHJ1bGUgdG8gcmVxdWlyZSB0aGF0IGRlZmluaXRpb25zIGFyZQogKiBleHBsaWNpdC4gVGhpcyB3b3VsZCByZXF1aXJlIHNvbWUgc29ydCBvZiBtaWdyYXRpb24gc3RyYXRlZ3kuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHsKICAgIHJldHVybiB0eXBlW05HX0NPTVBfREVGXSB8fCBudWxsOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERpcmVjdGl2ZURlZih0eXBlKSB7CiAgICByZXR1cm4gdHlwZVtOR19ESVJfREVGXSB8fCBudWxsOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBpcGVEZWYodHlwZSkgewogICAgcmV0dXJuIHR5cGVbTkdfUElQRV9ERUZdIHx8IG51bGw7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez89fSB0aHJvd05vdEZvdW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRGYWN0b3J5RGVmKHR5cGUsIHRocm93Tm90Rm91bmQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGhhc0ZhY3RvcnlEZWYgPSB0eXBlLmhhc093blByb3BlcnR5KE5HX0ZBQ1RPUllfREVGKTsKICAgIGlmICghaGFzRmFjdG9yeURlZiAmJiB0aHJvd05vdEZvdW5kID09PSB0cnVlICYmIG5nRGV2TW9kZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3N0cmluZ2lmeSh0eXBlKX0gZG9lcyBub3QgaGF2ZSAnybVmYWMnIHByb3BlcnR5LmApOwogICAgfQogICAgcmV0dXJuIGhhc0ZhY3RvcnlEZWYgPyB0eXBlW05HX0ZBQ1RPUllfREVGXSA6IG51bGw7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez89fSB0aHJvd05vdEZvdW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROZ01vZHVsZURlZih0eXBlLCB0aHJvd05vdEZvdW5kKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZ01vZHVsZURlZiA9IHR5cGVbTkdfTU9EX0RFRl0gfHwgbnVsbDsKICAgIGlmICghbmdNb2R1bGVEZWYgJiYgdGhyb3dOb3RGb3VuZCA9PT0gdHJ1ZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3N0cmluZ2lmeSh0eXBlKX0gZG9lcyBub3QgaGF2ZSAnybVtb2QnIHByb3BlcnR5LmApOwogICAgfQogICAgcmV0dXJuIG5nTW9kdWxlRGVmOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE5nTG9jYWxlSWREZWYodHlwZSkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpKVtOR19MT0NfSURfREVGXSB8fCBudWxsOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvdmlldy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8vIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExWaWV3IGluZGljZXMgdG8gaGVscCB1cyBsb29rIHVwIExWaWV3IG1lbWJlcnMKLy8gd2l0aG91dCBoYXZpbmcgdG8gcmVtZW1iZXIgdGhlIHNwZWNpZmljIGluZGljZXMuCi8vIFVnbGlmeSB3aWxsIGlubGluZSB0aGVzZSB3aGVuIG1pbmlmeWluZyBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYSBjb3N0LgovKiogQHR5cGUgez99ICovCmNvbnN0IEhPU1QgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRWSUVXID0gMTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBGTEFHUyA9IDI7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUEFSRU5UID0gMzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBORVhUID0gNDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBRVUVSSUVTID0gNTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBUX0hPU1QgPSA2OwovKiogQHR5cGUgez99ICovCmNvbnN0IENMRUFOVVAgPSA3OwovKiogQHR5cGUgez99ICovCmNvbnN0IENPTlRFWFQgPSA4OwovKiogQHR5cGUgez99ICovCmNvbnN0IElOSkVDVE9SJDEgPSA5OwovKiogQHR5cGUgez99ICovCmNvbnN0IFJFTkRFUkVSX0ZBQ1RPUlkgPSAxMDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBSRU5ERVJFUiA9IDExOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNBTklUSVpFUiA9IDEyOwovKiogQHR5cGUgez99ICovCmNvbnN0IENISUxEX0hFQUQgPSAxMzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDSElMRF9UQUlMID0gMTQ7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVDTEFSQVRJT05fVklFVyA9IDE1OwovKiogQHR5cGUgez99ICovCmNvbnN0IERFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXID0gMTY7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVDTEFSQVRJT05fTENPTlRBSU5FUiA9IDE3OwovKiogQHR5cGUgez99ICovCmNvbnN0IFBSRU9SREVSX0hPT0tfRkxBR1MgPSAxODsKLyoqCiAqIFNpemUgb2YgTFZpZXcncyBoZWFkZXIuIE5lY2Vzc2FyeSB0byBhZGp1c3QgZm9yIGl0IHdoZW4gc2V0dGluZyBzbG90cy4KICogQHR5cGUgez99CiAqLwpjb25zdCBIRUFERVJfT0ZGU0VUID0gMTk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBTcGVjaWFsIGxvY2F0aW9uIHdoaWNoIGFsbG93cyBlYXN5IGlkZW50aWZpY2F0aW9uIG9mIHR5cGUuIElmIHdlIGhhdmUgYW4gYXJyYXkgd2hpY2ggd2FzCiAqIHJldHJpZXZlZCBmcm9tIHRoZSBgTFZpZXdgIGFuZCB0aGF0IGFycmF5IGhhcyBgdHJ1ZWAgYXQgYFRZUEVgIGxvY2F0aW9uLCB3ZSBrbm93IGl0IGlzCiAqIGBMQ29udGFpbmVyYC4KICogQHR5cGUgez99CiAqLwpjb25zdCBUWVBFID0gMTsKLyoqCiAqIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExDb250YWluZXIgaW5kaWNlcyB0byBoZWxwIHVzIGxvb2sgdXAgTENvbnRhaW5lciBtZW1iZXJzCiAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlbWVtYmVyIHRoZSBzcGVjaWZpYyBpbmRpY2VzLgogKiBVZ2xpZnkgd2lsbCBpbmxpbmUgdGhlc2Ugd2hlbiBtaW5pZnlpbmcgc28gdGhlcmUgc2hvdWxkbid0IGJlIGEgY29zdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBBQ1RJVkVfSU5ERVggPSAyOwovLyBQQVJFTlQgYW5kIE5FWFQgYXJlIGluZGljZXMgMyBhbmQgNAovLyBBcyB3ZSBhbHJlYWR5IGhhdmUgdGhlc2UgY29uc3RhbnRzIGluIExWaWV3LCB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSB0aGVtLgovKiogQHR5cGUgez99ICovCmNvbnN0IE1PVkVEX1ZJRVdTID0gNTsKLy8gVF9IT1NUIGlzIGluZGV4IDYKLy8gV2UgYWxyZWFkeSBoYXZlIHRoaXMgY29uc3RhbnRzIGluIExWaWV3LCB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSBpdC4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOQVRJVkUgPSA3OwovKiogQHR5cGUgez99ICovCmNvbnN0IFZJRVdfUkVGUyA9IDg7Ci8qKgogKiBTaXplIG9mIExDb250YWluZXIncyBoZWFkZXIuIFJlcHJlc2VudHMgdGhlIGluZGV4IGFmdGVyIHdoaWNoIGFsbCB2aWV3cyBpbiB0aGUKICogY29udGFpbmVyIHdpbGwgYmUgaW5zZXJ0ZWQuIFdlIG5lZWQgdG8ga2VlcCBhIHJlY29yZCBvZiBjdXJyZW50IHZpZXdzIHNvIHdlIGtub3cKICogd2hpY2ggdmlld3MgYXJlIGFscmVhZHkgaW4gdGhlIERPTSAoYW5kIGRvbid0IG5lZWQgdG8gYmUgcmUtYWRkZWQpIGFuZCBzbyB3ZSBjYW4KICogcmVtb3ZlIHZpZXdzIGZyb20gdGhlIERPTSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciByZXF1aXJlZC4KICogQHR5cGUgez99CiAqLwpjb25zdCBDT05UQUlORVJfSEVBREVSX09GRlNFVCA9IDk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvdHlwZV9jaGVja3MudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRydWUgaWYgYHZhbHVlYCBpcyBgTFZpZXdgLgogKiBAcGFyYW0gez99IHZhbHVlIHdyYXBwZWQgdmFsdWUgb2YgYFJOb2RlYCwgYExWaWV3YCwgYExDb250YWluZXJgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0xWaWV3KHZhbHVlKSB7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlW1RZUEVdID09PSAnb2JqZWN0JzsKfQovKioKICogVHJ1ZSBpZiBgdmFsdWVgIGlzIGBMQ29udGFpbmVyYC4KICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNMQ29udGFpbmVyKHZhbHVlKSB7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbVFlQRV0gPT09IHRydWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ29udGVudFF1ZXJ5SG9zdCh0Tm9kZSkgewogICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDggLyogaGFzQ29udGVudFF1ZXJ5ICovKSAhPT0gMDsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNDb21wb25lbnRIb3N0KHROb2RlKSB7CiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8pID09PSAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLzsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNEaXJlY3RpdmVIb3N0KHROb2RlKSB7CiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMSAvKiBpc0RpcmVjdGl2ZUhvc3QgKi8pID09PSAxIC8qIGlzRGlyZWN0aXZlSG9zdCAqLzsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBkZWYKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ29tcG9uZW50RGVmKGRlZikgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSkpLnRlbXBsYXRlICE9PSBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNSb290Vmlldyh0YXJnZXQpIHsKICAgIHJldHVybiAodGFyZ2V0W0ZMQUdTXSAmIDUxMiAvKiBJc1Jvb3QgKi8pICE9PSAwOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2Fzc2VydC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBbQXNzZXJ0IGZ1bmN0aW9ucyBkbyBub3QgY29uc3RyYWludCB0eXBlIHdoZW4gdGhleSBhcmUgZ3VhcmRlZCBieSBhIHRydXRoeQovLyBleHByZXNzaW9uLl0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNzI5NSkKLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0VE5vZGVGb3JMVmlldyh0Tm9kZSwgbFZpZXcpIHsKICAgIHROb2RlLmhhc093blByb3BlcnR5KCd0Vmlld18nKSAmJgogICAgICAgIGFzc2VydEVxdWFsKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSkpKSkudFZpZXdfLCBsVmlld1tUVklFV10sICdUaGlzIFROb2RlIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIExWaWV3LicpOwp9Ci8qKgogKiBAcGFyYW0gez99IGFjdHVhbAogKiBAcGFyYW0gez89fSBtc2cKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFzc2VydENvbXBvbmVudFR5cGUoYWN0dWFsLCBtc2cgPSAnVHlwZSBwYXNzZWQgaW4gaXMgbm90IENvbXBvbmVudFR5cGUsIGl0IGRvZXMgbm90IGhhdmUgXCfJtWNtcFwnIHByb3BlcnR5LicpIHsKICAgIGlmICghZ2V0Q29tcG9uZW50RGVmKGFjdHVhbCkpIHsKICAgICAgICB0aHJvd0Vycm9yJDEobXNnKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBhY3R1YWwKICogQHBhcmFtIHs/PX0gbXNnCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnROZ01vZHVsZVR5cGUoYWN0dWFsLCBtc2cgPSAnVHlwZSBwYXNzZWQgaW4gaXMgbm90IE5nTW9kdWxlVHlwZSwgaXQgZG9lcyBub3QgaGF2ZSBcJ8m1bW9kXCcgcHJvcGVydHkuJykgewogICAgaWYgKCFnZXROZ01vZHVsZURlZihhY3R1YWwpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZyk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFzc2VydEhhc1BhcmVudCh0Tm9kZSkgewogICAgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ3ByZXZpb3VzT3JQYXJlbnRUTm9kZSBzaG91bGQgZXhpc3QhJyk7CiAgICBhc3NlcnREZWZpbmVkKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLnBhcmVudCwgJ3ByZXZpb3VzT3JQYXJlbnRUTm9kZSBzaG91bGQgaGF2ZSBhIHBhcmVudCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMQ29udGFpbmVyT3JVbmRlZmluZWQodmFsdWUpIHsKICAgIHZhbHVlICYmIGFzc2VydEVxdWFsKGlzTENvbnRhaW5lcih2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTENvbnRhaW5lciBvciB1bmRlZmluZWQgb3IgbnVsbCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMQ29udGFpbmVyKHZhbHVlKSB7CiAgICBhc3NlcnREZWZpbmVkKHZhbHVlLCAnTENvbnRhaW5lciBtdXN0IGJlIGRlZmluZWQnKTsKICAgIGFzc2VydEVxdWFsKGlzTENvbnRhaW5lcih2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTENvbnRhaW5lcicpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMVmlld09yVW5kZWZpbmVkKHZhbHVlKSB7CiAgICB2YWx1ZSAmJiBhc3NlcnRFcXVhbChpc0xWaWV3KHZhbHVlKSwgdHJ1ZSwgJ0V4cGVjdGluZyBMVmlldyBvciB1bmRlZmluZWQgb3IgbnVsbCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMVmlldyh2YWx1ZSkgewogICAgYXNzZXJ0RGVmaW5lZCh2YWx1ZSwgJ0xWaWV3IG11c3QgYmUgZGVmaW5lZCcpOwogICAgYXNzZXJ0RXF1YWwoaXNMVmlldyh2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTFZpZXcnKTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez89fSBlcnJNZXNzYWdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcsIGVyck1lc3NhZ2UpIHsKICAgIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcywgdHJ1ZSwgZXJyTWVzc2FnZSB8fCAnU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGZpcnN0IGNyZWF0ZSBwYXNzLicpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7Pz19IGVyck1lc3NhZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFzc2VydEZpcnN0VXBkYXRlUGFzcyh0VmlldywgZXJyTWVzc2FnZSkgewogICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RVcGRhdGVQYXNzLCB0cnVlLCBlcnJNZXNzYWdlIHx8ICdTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gZmlyc3QgdXBkYXRlIHBhc3MuJyk7Cn0KLyoqCiAqIFRoaXMgaXMgYSBiYXNpYyBzYW5pdHkgY2hlY2sgdGhhdCBhbiBvYmplY3QgaXMgcHJvYmFibHkgYSBkaXJlY3RpdmUgZGVmLiBEaXJlY3RpdmVEZWYgaXMKICogYW4gaW50ZXJmYWNlLCBzbyB3ZSBjYW4ndCBkbyBhIGRpcmVjdCBpbnN0YW5jZW9mIGNoZWNrLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IG9iagogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0RGlyZWN0aXZlRGVmKG9iaikgewogICAgaWYgKG9iai50eXBlID09PSB1bmRlZmluZWQgfHwgb2JqLnNlbGVjdG9ycyA9PSB1bmRlZmluZWQgfHwgb2JqLmlucHV0cyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKGBFeHBlY3RlZCBhIERpcmVjdGl2ZURlZi9Db21wb25lbnREZWYgYW5kIHRoaXMgb2JqZWN0IGRvZXMgbm90IHNlZW0gdG8gaGF2ZSB0aGUgZXhwZWN0ZWQgc2hhcGUuYCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvbmFtZXNwYWNlcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTUFUSF9NTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoTUwvJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9jb250ZXh0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoaXMgcHJvcGVydHkgd2lsbCBiZSBtb25rZXktcGF0Y2hlZCBvbiBlbGVtZW50cywgY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcwogKiBAdHlwZSB7P30KICovCmNvbnN0IE1PTktFWV9QQVRDSF9LRVlfTkFNRSA9ICdfX25nQ29udGV4dF9fJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9kb2N1bWVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBNb3N0IG9mIHRoZSB1c2Ugb2YgYGRvY3VtZW50YCBpbiBBbmd1bGFyIGlzIGZyb20gd2l0aGluIHRoZSBESSBzeXN0ZW0gc28gaXQgaXMgcG9zc2libGUgdG8gc2ltcGx5CiAqIGluamVjdCB0aGUgYERPQ1VNRU5UYCB0b2tlbiBhbmQgYXJlIGRvbmUuCiAqCiAqIEl2eSBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZG9lcyBub3QgcmVseSB1cG9uIHRoZSBESSBhbmQgbXVzdCBnZXQgaG9sZCBvZiB0aGUgZG9jdW1lbnQgc29tZSBvdGhlcgogKiB3YXkuCiAqCiAqIFRoZSBzb2x1dGlvbiBpcyB0byBkZWZpbmUgYGdldERvY3VtZW50KClgIGFuZCBgc2V0RG9jdW1lbnQoKWAgdG9wLWxldmVsIGZ1bmN0aW9ucyBmb3IgaXZ5LgogKiBXaGVyZXZlciBpdnkgbmVlZHMgdGhlIGdsb2JhbCBkb2N1bWVudCwgaXQgY2FsbHMgYGdldERvY3VtZW50KClgIGluc3RlYWQuCiAqCiAqIFdoZW4gcnVubmluZyBpdnkgb3V0c2lkZSBvZiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIGBzZXREb2N1bWVudCgpYCB0bwogKiB0ZWxsIGl2eSB3aGF0IHRoZSBnbG9iYWwgYGRvY3VtZW50YCBpcy4KICoKICogQW5ndWxhciBkb2VzIHRoaXMgZm9yIHVzIGluIGVhY2ggb2YgdGhlIHN0YW5kYXJkIHBsYXRmb3JtcyAoYEJyb3dzZXJgLCBgU2VydmVyYCwgYW5kIGBXZWJXb3JrZXJgKQogKiBieSBjYWxsaW5nIGBzZXREb2N1bWVudCgpYCB3aGVuIHByb3ZpZGluZyB0aGUgYERPQ1VNRU5UYCB0b2tlbi4KICogQHR5cGUgez99CiAqLwpsZXQgRE9DVU1FTlQgPSB1bmRlZmluZWQ7Ci8qKgogKiBUZWxsIGl2eSB3aGF0IHRoZSBgZG9jdW1lbnRgIGlzIGZvciB0aGlzIHBsYXRmb3JtLgogKgogKiBJdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgbm90IGEgYnJvd3Nlci4KICoKICogQHBhcmFtIHs/fSBkb2N1bWVudCBUaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2xvYmFsIGBkb2N1bWVudGAgaW4gdGhpcyBlbnZpcm9ubWVudC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldERvY3VtZW50KGRvY3VtZW50KSB7CiAgICBET0NVTUVOVCA9IGRvY3VtZW50Owp9Ci8qKgogKiBBY2Nlc3MgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGBkb2N1bWVudGAgZm9yIHRoaXMgcGxhdGZvcm0uCiAqCiAqIEl2eSBjYWxscyB0aGlzIHdoZW5ldmVyIGl0IG5lZWRzIHRvIGFjY2VzcyB0aGUgYGRvY3VtZW50YCBvYmplY3QuCiAqIEZvciBleGFtcGxlIHRvIGNyZWF0ZSB0aGUgcmVuZGVyZXIgb3IgdG8gZG8gc2FuaXRpemF0aW9uLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7CiAgICBpZiAoRE9DVU1FTlQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBET0NVTUVOVDsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CiAgICB9CiAgICAvLyBObyAiZG9jdW1lbnQiIGNhbiBiZSBmb3VuZC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgd2UgYXJlIHJ1bm5pbmcgaXZ5IG91dHNpZGUgQW5ndWxhciBhbmQKICAgIC8vIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIG5vdCBhIGJyb3dzZXIuIFNpbmNlIHRoaXMgaXMgbm90IGEgc3VwcG9ydGVkIHNjZW5hcmlvIGF0IHRoZSBtb21lbnQKICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gQW5ndWxhciBhcHBzLgogICAgLy8gT25jZSB3ZSBzdXBwb3J0IHJ1bm5pbmcgaXZ5IG91dHNpZGUgb2YgQW5ndWxhciB3ZSB3aWxsIG5lZWQgdG8gcHVibGlzaCBgc2V0RG9jdW1lbnQoKWAgYXMgYQogICAgLy8gcHVibGljIEFQSS4gTWVhbndoaWxlIHdlIGp1c3QgcmV0dXJuIGB1bmRlZmluZWRgIGFuZCBsZXQgdGhlIGFwcGxpY2F0aW9uIGZhaWwuCiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHVuZGVmaW5lZCkpOwp9Ci8qKgogKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGByZW5kZXJlcmAgaXMgYSBgUHJvY2VkdXJhbFJlbmRlcmVyM2AKICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpIHsKICAgIHJldHVybiAhISgoKC8qKiBAdHlwZSB7P30gKi8gKHJlbmRlcmVyKSkpLmxpc3Rlbik7Cn0KY29uc3QgybUwJDIgPSAvKioKICogQHBhcmFtIHs/fSBob3N0RWxlbWVudAogKiBAcGFyYW0gez99IHJlbmRlcmVyVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KKGhvc3RFbGVtZW50LCByZW5kZXJlclR5cGUpID0+IHsKICAgIHJldHVybiBnZXREb2N1bWVudCgpOwp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IGRvbVJlbmRlcmVyRmFjdG9yeTMgPSB7CiAgICBjcmVhdGVSZW5kZXJlcjogKMm1MCQyKQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL3ZpZXdfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEZvciBlZmZpY2llbmN5IHJlYXNvbnMgd2Ugb2Z0ZW4gcHV0IHNldmVyYWwgZGlmZmVyZW50IGRhdGEgdHlwZXMgKGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYCkKICogaW4gc2FtZSBsb2NhdGlvbiBpbiBgTFZpZXdgLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmUtYWxsb2NhdGUgc3BhY2UgZm9yIGl0CiAqIGJlY2F1c2UgdGhlIHN0b3JhZ2UgaXMgc3BhcnNlLiBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggc3VjaCBkYXRhIHR5cGVzLgogKgogKiBIb3cgZG8gd2Uga25vdyB3aGF0IGlzIHN0b3JlZCBhdCBhIGdpdmVuIGxvY2F0aW9uIGluIGBMVmlld2AuCiAqIC0gYEFycmF5LmlzQXJyYXkodmFsdWUpID09PSBmYWxzZWAgPT4gYFJOb2RlYCAoVGhlIG5vcm1hbCBzdG9yYWdlIHZhbHVlKQogKiAtIGBBcnJheS5pc0FycmF5KHZhbHVlKSA9PT0gdHJ1ZWAgPT4gdGhlbiB0aGUgYHZhbHVlWzBdYCByZXByZXNlbnRzIHRoZSB3cmFwcGVkIHZhbHVlLgogKiAgIC0gYHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gJ29iamVjdCdgID0+IGBMVmlld2AKICogICAgICAtIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYSBjb21wb25lbnQgYXQgYSBnaXZlbiBsb2NhdGlvbgogKiAgIC0gYHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gdHJ1ZWAgPT4gYExDb250YWluZXJgCiAqICAgICAgLSBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGBMQ29udGFpbmVyYCBiaW5kaW5nIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCiAqCiAqCiAqIE5PVEU6IGl0IGlzIGFzc3VtZWQgdGhhdCBgQXJyYXkuaXNBcnJheWAgYW5kIGB0eXBlb2ZgIG9wZXJhdGlvbnMgYXJlIHZlcnkgZWZmaWNpZW50LgogKi8KLyoqCiAqIFJldHVybnMgYFJOb2RlYC4KICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdW53cmFwUk5vZGUodmFsdWUpIHsKICAgIHdoaWxlIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIHZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlW0hPU1RdKSk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7Cn0KLyoqCiAqIFJldHVybnMgYExWaWV3YCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLgogKiBAcGFyYW0gez99IHZhbHVlIHdyYXBwZWQgdmFsdWUgb2YgYFJOb2RlYCwgYExWaWV3YCwgYExDb250YWluZXJgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1bndyYXBMVmlldyh2YWx1ZSkgewogICAgd2hpbGUgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBzYW1lIGFzIGBpc0xWaWV3KClgIGJ1dCB3ZSBkb24ndCBjYWxsIGF0IGFzIHdlIGRvbid0IHdhbnQgdG8gY2FsbAogICAgICAgIC8vIGBBcnJheS5pc0FycmF5KClgIHR3aWNlIGFuZCBnaXZlIEpJVGVyIG1vcmUgd29yayBmb3IgaW5saW5pbmcuCiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gJ29iamVjdCcpCiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICB2YWx1ZSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZVtIT1NUXSkpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIFJldHJpZXZlcyBhbiBlbGVtZW50IHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGB2aWV3RGF0YWAsIGJ5IHVud3JhcHBpbmcKICogZnJvbSBhbnkgY29udGFpbmVycywgY29tcG9uZW50IHZpZXdzLCBvciBzdHlsZSBjb250ZXh0cy4KICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldykgewogICAgcmV0dXJuIHVud3JhcFJOb2RlKGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF0pOwp9Ci8qKgogKiBSZXRyaWV2ZSBhbiBgUk5vZGVgIGZvciBhIGdpdmVuIGBUTm9kZWAgYW5kIGBMVmlld2AuCiAqCiAqIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyBpbiBkZXYgbW9kZSB0byByZXRyaWV2ZSBhIG5vbi1udWxsIGBSTm9kZWAuCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIHROb2RlLmluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGUgPSB1bndyYXBSTm9kZShsVmlld1t0Tm9kZS5pbmRleF0pOwogICAgbmdEZXZNb2RlICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihsVmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobm9kZSk7CiAgICByZXR1cm4gbm9kZTsKfQovKioKICogUmV0cmlldmUgYW4gYFJOb2RlYCBvciBgbnVsbGAgZm9yIGEgZ2l2ZW4gYFROb2RlYCBhbmQgYExWaWV3YC4KICoKICogU29tZSBgVE5vZGVgcyBkb24ndCBoYXZlIGFzc29jaWF0ZWQgYFJOb2RlYHMuIEZvciBleGFtcGxlIGBQcm9qZWN0aW9uYAogKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE5hdGl2ZUJ5VE5vZGVPck51bGwodE5vZGUsIGxWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleCA9IHROb2RlLmluZGV4OwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGUgPSB1bndyYXBSTm9kZShsVmlld1tpbmRleF0pOwogICAgICAgIG5nRGV2TW9kZSAmJiBub2RlICE9PSBudWxsICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihsVmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobm9kZSk7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUTm9kZSh0VmlldywgaW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRHcmVhdGVyVGhhbihpbmRleCwgLTEsICd3cm9uZyBpbmRleCBmb3IgVE5vZGUnKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMZXNzVGhhbihpbmRleCwgdFZpZXcuZGF0YS5sZW5ndGgsICd3cm9uZyBpbmRleCBmb3IgVE5vZGUnKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdKSk7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gYW55IGBMVmlld2Agb3IgYFREYXRhYC4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB2aWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGxvYWQodmlldywgaW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZSh2aWV3LCBpbmRleCArIEhFQURFUl9PRkZTRVQpOwogICAgcmV0dXJuIHZpZXdbaW5kZXggKyBIRUFERVJfT0ZGU0VUXTsKfQovKioKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHBhcmFtIHs/fSBob3N0VmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KG5vZGVJbmRleCwgaG9zdFZpZXcpIHsKICAgIC8vIENvdWxkIGJlIGFuIExWaWV3IG9yIGFuIExDb250YWluZXIuIElmIExDb250YWluZXIsIHVud3JhcCB0byBmaW5kIExWaWV3LgogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGhvc3RWaWV3LCBub2RlSW5kZXgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2xvdFZhbHVlID0gaG9zdFZpZXdbbm9kZUluZGV4XTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gaXNMVmlldyhzbG90VmFsdWUpID8gc2xvdFZhbHVlIDogc2xvdFZhbHVlW0hPU1RdOwogICAgcmV0dXJuIGxWaWV3Owp9Ci8qKgogKiBSZXR1cm5zIHRoZSBtb25rZXktcGF0Y2ggdmFsdWUgZGF0YSBwcmVzZW50IG9uIHRoZSB0YXJnZXQgKHdoaWNoIGNvdWxkIGJlCiAqIGEgY29tcG9uZW50LCBkaXJlY3RpdmUgb3IgYSBET00gbm9kZSkuCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWFkUGF0Y2hlZERhdGEodGFyZ2V0KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0YXJnZXQsICdUYXJnZXQgZXhwZWN0ZWQnKTsKICAgIHJldHVybiB0YXJnZXRbTU9OS0VZX1BBVENIX0tFWV9OQU1FXSB8fCBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVhZFBhdGNoZWRMVmlldyh0YXJnZXQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZhbHVlID0gcmVhZFBhdGNoZWREYXRhKHRhcmdldCk7CiAgICBpZiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6ICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkubFZpZXc7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiB2aWV3IGlzIGluIGNyZWF0aW9uIG1vZGUKICogQHBhcmFtIHs/fSB2aWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0NyZWF0aW9uTW9kZSh2aWV3KSB7CiAgICByZXR1cm4gKHZpZXdbRkxBR1NdICYgNCAvKiBDcmVhdGlvbk1vZGUgKi8pID09PSA0IC8qIENyZWF0aW9uTW9kZSAqLzsKfQovKioKICogUmV0dXJucyBhIGJvb2xlYW4gZm9yIHdoZXRoZXIgdGhlIHZpZXcgaXMgYXR0YWNoZWQgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS4KICoKICogTm90ZTogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2aWV3IHNob3VsZCBiZSBjaGVja2VkLCBub3Qgd2hldGhlciBpdCdzIGluc2VydGVkCiAqIGludG8gYSBjb250YWluZXIuIEZvciB0aGF0LCB5b3UnbGwgd2FudCBgdmlld0F0dGFjaGVkVG9Db250YWluZXJgIGJlbG93LgogKiBAcGFyYW0gez99IHZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZpZXdBdHRhY2hlZFRvQ2hhbmdlRGV0ZWN0b3IodmlldykgewogICAgcmV0dXJuICh2aWV3W0ZMQUdTXSAmIDEyOCAvKiBBdHRhY2hlZCAqLykgPT09IDEyOCAvKiBBdHRhY2hlZCAqLzsKfQovKioKICogUmV0dXJucyBhIGJvb2xlYW4gZm9yIHdoZXRoZXIgdGhlIHZpZXcgaXMgYXR0YWNoZWQgdG8gYSBjb250YWluZXIuCiAqIEBwYXJhbSB7P30gdmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdmlld0F0dGFjaGVkVG9Db250YWluZXIodmlldykgewogICAgcmV0dXJuIGlzTENvbnRhaW5lcih2aWV3W1BBUkVOVF0pOwp9Ci8qKgogKiBSZXR1cm5zIGEgY29uc3RhbnQgZnJvbSBgVENvbnN0YW50c2AgaW5zdGFuY2UuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gY29uc3RzCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbnN0YW50KGNvbnN0cywgaW5kZXgpIHsKICAgIHJldHVybiBjb25zdHMgPT09IG51bGwgfHwgaW5kZXggPT0gbnVsbCA/IG51bGwgOiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnN0c1tpbmRleF0pKSkpOwp9Ci8qKgogKiBSZXNldHMgdGhlIHByZS1vcmRlciBob29rIGZsYWdzIG9mIHRoZSB2aWV3LgogKiBAcGFyYW0gez99IGxWaWV3IHRoZSBMVmlldyBvbiB3aGljaCB0aGUgZmxhZ3MgYXJlIHJlc2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KSB7CiAgICBsVmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSA9IDA7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TENvbnRhaW5lckFjdGl2ZUluZGV4KGxDb250YWluZXIpIHsKICAgIHJldHVybiBsQ29udGFpbmVyW0FDVElWRV9JTkRFWF0gPj4gMSAvKiBTSElGVCAqLzsKfQovKioKICogQHBhcmFtIHs/fSBsQ29udGFpbmVyCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldExDb250YWluZXJBY3RpdmVJbmRleChsQ29udGFpbmVyLCBpbmRleCkgewogICAgbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdID0gaW5kZXggPDwgMSAvKiBTSElGVCAqLzsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IGluc3RydWN0aW9uU3RhdGUgPSB7CiAgICBsRnJhbWU6IGNyZWF0ZUxGcmFtZShudWxsKSwKICAgIGJpbmRpbmdzRW5hYmxlZDogdHJ1ZSwKICAgIGNoZWNrTm9DaGFuZ2VzTW9kZTogZmFsc2UsCn07Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RWxlbWVudERlcHRoQ291bnQoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuZWxlbWVudERlcHRoQ291bnQ7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmNyZWFzZUVsZW1lbnREZXB0aENvdW50KCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuZWxlbWVudERlcHRoQ291bnQrKzsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKSB7CiAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5lbGVtZW50RGVwdGhDb3VudC0tOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmluZGluZ3NFbmFibGVkKCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUuYmluZGluZ3NFbmFibGVkOwp9Ci8qKgogKiBFbmFibGVzIGRpcmVjdGl2ZSBtYXRjaGluZyBvbiBlbGVtZW50cy4KICoKICogICogRXhhbXBsZToKICogYGBgCiAqIDxteS1jb21wIG15LWRpcmVjdGl2ZT4KICogICBTaG91bGQgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlLgogKiA8L215LWNvbXA+CiAqIDxkaXYgbmdOb25CaW5kYWJsZT4KICogICA8IS0tIMm1ybVkaXNhYmxlQmluZGluZ3MoKSAtLT4KICogICA8bXktY29tcCBteS1kaXJlY3RpdmU+CiAqICAgICBTaG91bGQgbm90IG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZSBiZWNhdXNlIHdlIGFyZSBpbiBuZ05vbkJpbmRhYmxlLgogKiAgIDwvbXktY29tcD4KICogICA8IS0tIMm1ybVlbmFibGVCaW5kaW5ncygpIC0tPgogKiA8L2Rpdj4KICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWVuYWJsZUJpbmRpbmdzKCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5iaW5kaW5nc0VuYWJsZWQgPSB0cnVlOwp9Ci8qKgogKiBEaXNhYmxlcyBkaXJlY3RpdmUgbWF0Y2hpbmcgb24gZWxlbWVudC4KICoKICogICogRXhhbXBsZToKICogYGBgCiAqIDxteS1jb21wIG15LWRpcmVjdGl2ZT4KICogICBTaG91bGQgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlLgogKiA8L215LWNvbXA+CiAqIDxkaXYgbmdOb25CaW5kYWJsZT4KICogICA8IS0tIMm1ybVkaXNhYmxlQmluZGluZ3MoKSAtLT4KICogICA8bXktY29tcCBteS1kaXJlY3RpdmU+CiAqICAgICBTaG91bGQgbm90IG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZSBiZWNhdXNlIHdlIGFyZSBpbiBuZ05vbkJpbmRhYmxlLgogKiAgIDwvbXktY29tcD4KICogICA8IS0tIMm1ybVlbmFibGVCaW5kaW5ncygpIC0tPgogKiA8L2Rpdj4KICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWRpc2FibGVCaW5kaW5ncygpIHsKICAgIGluc3RydWN0aW9uU3RhdGUuYmluZGluZ3NFbmFibGVkID0gZmFsc2U7Cn0KLyoqCiAqIFJldHVybiB0aGUgY3VycmVudCBgTFZpZXdgLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TFZpZXcoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUubFZpZXc7Cn0KLyoqCiAqIFJldHVybiB0aGUgY3VycmVudCBgVFZpZXdgLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VFZpZXcoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUudFZpZXc7Cn0KLyoqCiAqIFJlc3RvcmVzIGBjb250ZXh0Vmlld0RhdGFgIHRvIHRoZSBnaXZlbiBPcGFxdWVWaWV3U3RhdGUgaW5zdGFuY2UuCiAqCiAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZ2V0Q3VycmVudFZpZXcoKSBpbnN0cnVjdGlvbiB0byBzYXZlIGEgc25hcHNob3QKICogb2YgdGhlIGN1cnJlbnQgdmlldyBhbmQgcmVzdG9yZSBpdCB3aGVuIGxpc3RlbmVycyBhcmUgaW52b2tlZC4gVGhpcyBhbGxvd3MKICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gdmlld1RvUmVzdG9yZSBUaGUgT3BhcXVlVmlld1N0YXRlIGluc3RhbmNlIHRvIHJlc3RvcmUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cmVzdG9yZVZpZXcodmlld1RvUmVzdG9yZSkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY29udGV4dExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh2aWV3VG9SZXN0b3JlKSkpKTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5wcmV2aW91c09yUGFyZW50VE5vZGU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBpc1BhcmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHROb2RlLCBpc1BhcmVudCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUucHJldmlvdXNPclBhcmVudFROb2RlID0gdE5vZGU7CiAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5pc1BhcmVudCA9IGlzUGFyZW50Owp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0SXNQYXJlbnQoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuaXNQYXJlbnQ7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRJc05vdFBhcmVudCgpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmlzUGFyZW50ID0gZmFsc2U7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRJc1BhcmVudCgpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmlzUGFyZW50ID0gdHJ1ZTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbnRleHRMVmlldygpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jb250ZXh0TFZpZXc7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRDaGVja05vQ2hhbmdlc01vZGUoKSB7CiAgICAvLyBUT0RPKG1pc2tvKTogcmVtb3ZlIHRoaXMgZnJvbSB0aGUgTFZpZXcgc2luY2UgaXQgaXMgbmdEZXZNb2RlPXRydWUgbW9kZSBvbmx5LgogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUuY2hlY2tOb0NoYW5nZXNNb2RlOwp9Ci8qKgogKiBAcGFyYW0gez99IG1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldENoZWNrTm9DaGFuZ2VzTW9kZShtb2RlKSB7CiAgICBpbnN0cnVjdGlvblN0YXRlLmNoZWNrTm9DaGFuZ2VzTW9kZSA9IG1vZGU7Cn0KLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEJpbmRpbmdSb290KCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5kZXggPSBsRnJhbWUuYmluZGluZ1Jvb3RJbmRleDsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICBpbmRleCA9IGxGcmFtZS5iaW5kaW5nUm9vdEluZGV4ID0gbEZyYW1lLnRWaWV3LmJpbmRpbmdTdGFydEluZGV4OwogICAgfQogICAgcmV0dXJuIGluZGV4Owp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmluZGluZ0luZGV4KCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmJpbmRpbmdJbmRleDsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0QmluZGluZ0luZGV4KHZhbHVlKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuYmluZGluZ0luZGV4ID0gdmFsdWU7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBuZXh0QmluZGluZ0luZGV4KCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmJpbmRpbmdJbmRleCsrOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvdW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoY291bnQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXggPSBsRnJhbWUuYmluZGluZ0luZGV4OwogICAgbEZyYW1lLmJpbmRpbmdJbmRleCA9IGxGcmFtZS5iaW5kaW5nSW5kZXggKyBjb3VudDsKICAgIHJldHVybiBpbmRleDsKfQovKioKICogU2V0IGEgbmV3IGJpbmRpbmcgcm9vdCBpbmRleCBzbyB0aGF0IGhvc3QgdGVtcGxhdGUgZnVuY3Rpb25zIGNhbiBleGVjdXRlLgogKgogKiBCaW5kaW5ncyBpbnNpZGUgdGhlIGhvc3QgdGVtcGxhdGUgYXJlIDAgaW5kZXguIEJ1dCBiZWNhdXNlIHdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZQogKiBob3cgbWFueSBob3N0IGJpbmRpbmdzIHdlIGhhdmUgd2UgY2FuJ3QgcHJlLWNvbXB1dGUgdGhlbS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGFsbAogKiAwIGluZGV4IGFuZCB3ZSBqdXN0IHNoaWZ0IHRoZSByb290IHNvIHRoYXQgdGhleSBtYXRjaCBuZXh0IGF2YWlsYWJsZSBsb2NhdGlvbiBpbiB0aGUgTFZpZXcuCiAqCiAqIEBwYXJhbSB7P30gYmluZGluZ1Jvb3RJbmRleCBSb290IGluZGV4IGZvciBgaG9zdEJpbmRpbmdzYAogKiBAcGFyYW0gez99IGN1cnJlbnREaXJlY3RpdmVJbmRleCBgVERhdGFbY3VycmVudERpcmVjdGl2ZUluZGV4XWAgd2lsbCBwb2ludCB0byB0aGUgY3VycmVudCBkaXJlY3RpdmUKICogICAgICAgIHdob3NlIGBob3N0QmluZGluZ3NgIGFyZSBiZWluZyBwcm9jZXNzZWQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRCaW5kaW5nUm9vdEZvckhvc3RCaW5kaW5ncyhiaW5kaW5nUm9vdEluZGV4LCBjdXJyZW50RGlyZWN0aXZlSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgbEZyYW1lLmJpbmRpbmdJbmRleCA9IGxGcmFtZS5iaW5kaW5nUm9vdEluZGV4ID0gYmluZGluZ1Jvb3RJbmRleDsKICAgIGxGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXggPSBjdXJyZW50RGlyZWN0aXZlSW5kZXg7Cn0KLyoqCiAqIFdoZW4gaG9zdCBiaW5kaW5nIGlzIGV4ZWN1dGluZyB0aGlzIHBvaW50cyB0byB0aGUgZGlyZWN0aXZlIGluZGV4LgogKiBgVFZpZXcuZGF0YVtnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKV1gIGlzIGBEaXJlY3RpdmVEZWZgCiAqIGBMVmlld1tnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKV1gIGlzIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEN1cnJlbnREaXJlY3RpdmVJbmRleCgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXg7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRDdXJyZW50UXVlcnlJbmRleCgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50UXVlcnlJbmRleDsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0Q3VycmVudFF1ZXJ5SW5kZXgodmFsdWUpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnRRdWVyeUluZGV4ID0gdmFsdWU7Cn0KLyoqCiAqIFRoaXMgaXMgYSBsaWdodCB3ZWlnaHQgdmVyc2lvbiBvZiB0aGUgYGVudGVyVmlld2Agd2hpY2ggaXMgbmVlZGVkIGJ5IHRoZSBESSBzeXN0ZW0uCiAqIEBwYXJhbSB7P30gbmV3VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbnRlckRJKG5ld1ZpZXcsIHROb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXdPclVuZGVmaW5lZChuZXdWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld0xGcmFtZSA9IGFsbG9jTEZyYW1lKCk7CiAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZSA9IG5ld0xGcmFtZTsKICAgIG5ld0xGcmFtZS5wcmV2aW91c09yUGFyZW50VE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKTsKICAgIG5ld0xGcmFtZS5sVmlldyA9IG5ld1ZpZXc7Cn0KLyoqCiAqIFN3YXAgdGhlIGN1cnJlbnQgbFZpZXcgd2l0aCBhIG5ldyBsVmlldy4KICoKICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2Ugc3RvcmUgdGhlIGxWaWV3IGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZHVsZS4KICogVGhpcyB3YXkgd2UgbWluaW1pemUgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRvIHJlYWQuIFdoZW5ldmVyIGEgbmV3IHZpZXcKICogaXMgZW50ZXJlZCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBsVmlldyBmb3IgbGF0ZXIsIGFuZCB3aGVuIHRoZSB2aWV3IGlzCiAqIGV4aXRlZCB0aGUgc3RhdGUgaGFzIHRvIGJlIHJlc3RvcmVkCiAqCiAqIEBwYXJhbSB7P30gbmV3VmlldyBOZXcgbFZpZXcgdG8gYmVjb21lIGFjdGl2ZQogKiBAcGFyYW0gez99IHROb2RlIEVsZW1lbnQgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYSBjaGlsZCBvZgogKiBAcmV0dXJuIHs/fSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbFZpZXc7CiAqLwpmdW5jdGlvbiBlbnRlclZpZXcobmV3VmlldywgdE5vZGUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMVmlld09yVW5kZWZpbmVkKG5ld1ZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV3TEZyYW1lID0gYWxsb2NMRnJhbWUoKTsKICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuaXNQYXJlbnQsIHRydWUsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUubFZpZXcsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUudFZpZXcsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuc2VsZWN0ZWRJbmRleCwgMCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5lbGVtZW50RGVwdGhDb3VudCwgMCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXgsIC0xLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgYXNzZXJ0RXF1YWwobmV3TEZyYW1lLmN1cnJlbnROYW1lc3BhY2UsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuY3VycmVudFNhbml0aXplciwgbnVsbCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5iaW5kaW5nUm9vdEluZGV4LCAtMSwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50UXVlcnlJbmRleCwgMCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBuZXdWaWV3W1RWSUVXXTsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lID0gbmV3TEZyYW1lOwogICAgbmV3TEZyYW1lLnByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwogICAgbmV3TEZyYW1lLmxWaWV3ID0gbmV3VmlldzsKICAgIG5ld0xGcmFtZS50VmlldyA9IHRWaWV3OwogICAgbmV3TEZyYW1lLmNvbnRleHRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChuZXdWaWV3KSk7CiAgICBuZXdMRnJhbWUuYmluZGluZ0luZGV4ID0gdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXg7Cn0KLyoqCiAqIEFsbG9jYXRlcyBuZXh0IGZyZWUgTEZyYW1lLiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJldXNlIHRoZSBgTEZyYW1lYHMgdG8gbG93ZXIgbWVtb3J5IHByZXNzdXJlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb2NMRnJhbWUoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjdXJyZW50TEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjaGlsZExGcmFtZSA9IGN1cnJlbnRMRnJhbWUgPT09IG51bGwgPyBudWxsIDogY3VycmVudExGcmFtZS5jaGlsZDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld0xGcmFtZSA9IGNoaWxkTEZyYW1lID09PSBudWxsID8gY3JlYXRlTEZyYW1lKGN1cnJlbnRMRnJhbWUpIDogY2hpbGRMRnJhbWU7CiAgICByZXR1cm4gbmV3TEZyYW1lOwp9Ci8qKgogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlTEZyYW1lKHBhcmVudCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbEZyYW1lID0gewogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZTogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAvLwogICAgICAgIGlzUGFyZW50OiB0cnVlLAogICAgICAgIC8vCiAgICAgICAgbFZpZXc6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgLy8KICAgICAgICB0VmlldzogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAvLwogICAgICAgIHNlbGVjdGVkSW5kZXg6IDAsCiAgICAgICAgLy8KICAgICAgICBjb250ZXh0TFZpZXc6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgLy8KICAgICAgICBlbGVtZW50RGVwdGhDb3VudDogMCwKICAgICAgICAvLwogICAgICAgIGN1cnJlbnROYW1lc3BhY2U6IG51bGwsCiAgICAgICAgLy8KICAgICAgICBjdXJyZW50U2FuaXRpemVyOiBudWxsLAogICAgICAgIC8vCiAgICAgICAgY3VycmVudERpcmVjdGl2ZUluZGV4OiAtMSwKICAgICAgICAvLwogICAgICAgIGJpbmRpbmdSb290SW5kZXg6IC0xLAogICAgICAgIC8vCiAgICAgICAgYmluZGluZ0luZGV4OiAtMSwKICAgICAgICAvLwogICAgICAgIGN1cnJlbnRRdWVyeUluZGV4OiAwLAogICAgICAgIC8vCiAgICAgICAgcGFyZW50OiAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50KSksCiAgICAgICAgLy8KICAgICAgICBjaGlsZDogbnVsbCwKICAgIH07CiAgICBwYXJlbnQgIT09IG51bGwgJiYgKHBhcmVudC5jaGlsZCA9IGxGcmFtZSk7IC8vIGxpbmsgdGhlIG5ldyBMRnJhbWUgZm9yIHJldXNlLgogICAgcmV0dXJuIGxGcmFtZTsKfQovKioKICogQSBsaWdodHdlaWdodCB2ZXJzaW9uIG9mIGxlYXZlIHdoaWNoIGlzIHVzZWQgd2l0aCBESS4KICoKICogVGhpcyBmdW5jdGlvbiBvbmx5IHJlc2V0cyBgcHJldmlvdXNPclBhcmVudFROb2RlYCBhbmQgYExWaWV3YCBhcyB0aG9zZSBhcmUgdGhlIG9ubHkgcHJvcGVydGllcwogKiB1c2VkIHdpdGggREkgKGBlbnRlckRJKClgKS4KICoKICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyByZWV4cG9ydGVkIGFzIGBsZWF2ZURJYC4gSG93ZXZlciBgbGVhdmVESWAgaGFzIHJldHVybiB0eXBlIG9mIGB2b2lkYCB3aGVyZQogKiBhcyBgbGVhdmVWaWV3TGlnaHRgIGhhcyBgTEZyYW1lYC4gVGhpcyBpcyBzbyB0aGF0IGBsZWF2ZVZpZXdMaWdodGAgY2FuIGJlIHVzZWQgaW4gYGxlYXZlVmlld2AuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBsZWF2ZVZpZXdMaWdodCgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG9sZExGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUgPSBvbGRMRnJhbWUucGFyZW50OwogICAgb2xkTEZyYW1lLnByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICBvbGRMRnJhbWUubFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgcmV0dXJuIG9sZExGcmFtZTsKfQovKioKICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gb2YgdGhlIGBsZWF2ZVZpZXdgIHdoaWNoIGlzIG5lZWRlZCBieSB0aGUgREkgc3lzdGVtLgogKgogKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIGFuIGFsaWFzIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gdG8gaGF2ZSBgdm9pZGAKICogcmV0dXJuIHR5cGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgbGVhdmVESSA9IGxlYXZlVmlld0xpZ2h0OwovKioKICogTGVhdmUgdGhlIGN1cnJlbnQgYExWaWV3YAogKgogKiBUaGlzIHBvcHMgdGhlIGBMRnJhbWVgIHdpdGggdGhlIGFzc29jaWF0ZWQgYExWaWV3YCBmcm9tIHRoZSBzdGFjay4KICoKICogSU1QT1JUQU5UOiBXZSBtdXN0IHplcm8gb3V0IHRoZSBgTEZyYW1lYCB2YWx1ZXMgaGVyZSBvdGhlcndpc2UgdGhleSB3aWxsIGJlIHJldGFpbmVkLiBUaGlzIGlzCiAqIGJlY2F1c2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2UgZG9uJ3QgcmVsZWFzZSBgTEZyYW1lYCBidXQgcmF0aGVyIGtlZXAgaXQgZm9yIG5leHQgdXNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbGVhdmVWaWV3KCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb2xkTEZyYW1lID0gbGVhdmVWaWV3TGlnaHQoKTsKICAgIG9sZExGcmFtZS5pc1BhcmVudCA9IHRydWU7CiAgICBvbGRMRnJhbWUudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgb2xkTEZyYW1lLnNlbGVjdGVkSW5kZXggPSAwOwogICAgb2xkTEZyYW1lLmNvbnRleHRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICBvbGRMRnJhbWUuZWxlbWVudERlcHRoQ291bnQgPSAwOwogICAgb2xkTEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleCA9IC0xOwogICAgb2xkTEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBudWxsOwogICAgb2xkTEZyYW1lLmN1cnJlbnRTYW5pdGl6ZXIgPSBudWxsOwogICAgb2xkTEZyYW1lLmJpbmRpbmdSb290SW5kZXggPSAtMTsKICAgIG9sZExGcmFtZS5iaW5kaW5nSW5kZXggPSAtMTsKICAgIG9sZExGcmFtZS5jdXJyZW50UXVlcnlJbmRleCA9IDA7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbGV2ZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5leHRDb250ZXh0SW1wbChsZXZlbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dExWaWV3ID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY29udGV4dExWaWV3ID0KICAgICAgICB3YWxrVXBWaWV3cyhsZXZlbCwgKC8qKiBAdHlwZSB7P30gKi8gKGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmNvbnRleHRMVmlldykpKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoY29udGV4dExWaWV3W0NPTlRFWFRdKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbmVzdGluZ0xldmVsCiAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdhbGtVcFZpZXdzKG5lc3RpbmdMZXZlbCwgY3VycmVudFZpZXcpIHsKICAgIHdoaWxlIChuZXN0aW5nTGV2ZWwgPiAwKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydERlZmluZWQoY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV10sICdEZWNsYXJhdGlvbiB2aWV3IHNob3VsZCBiZSBkZWZpbmVkIGlmIG5lc3RpbmcgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIDAuJyk7CiAgICAgICAgY3VycmVudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV10pKTsKICAgICAgICBuZXN0aW5nTGV2ZWwtLTsKICAgIH0KICAgIHJldHVybiBjdXJyZW50VmlldzsKfQovKioKICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQgaW5kZXguCiAqCiAqIFVzZWQgd2l0aCB7XEBsaW5rIHByb3BlcnR5fSBpbnN0cnVjdGlvbiAoYW5kIG1vcmUgaW4gdGhlIGZ1dHVyZSkgdG8gaWRlbnRpZnkgdGhlIGluZGV4IGluIHRoZQogKiBjdXJyZW50IGBMVmlld2AgdG8gYWN0IG9uLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0U2VsZWN0ZWRJbmRleCgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5zZWxlY3RlZEluZGV4Owp9Ci8qKgogKiBTZXRzIHRoZSBtb3N0IHJlY2VudCBpbmRleCBwYXNzZWQgdG8ge1xAbGluayBzZWxlY3R9CiAqCiAqIFVzZWQgd2l0aCB7XEBsaW5rIHByb3BlcnR5fSBpbnN0cnVjdGlvbiAoYW5kIG1vcmUgaW4gdGhlIGZ1dHVyZSkgdG8gaWRlbnRpZnkgdGhlIGluZGV4IGluIHRoZQogKiBjdXJyZW50IGBMVmlld2AgdG8gYWN0IG9uLgogKgogKiAoTm90ZSB0aGF0IGlmIGFuICJleGl0IGZ1bmN0aW9uIiB3YXMgc2V0IGVhcmxpZXIgKHZpYSBgc2V0RWxlbWVudEV4aXRGbigpYCkgdGhlbiB0aGF0IHdpbGwgYmUKICogcnVuIGlmIGFuZCB3aGVuIHRoZSBwcm92aWRlZCBgaW5kZXhgIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGluZGV4IHZhbHVlLikKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0U2VsZWN0ZWRJbmRleChpbmRleCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuc2VsZWN0ZWRJbmRleCA9IGluZGV4Owp9Ci8qKgogKiBHZXRzIHRoZSBgdE5vZGVgIHRoYXQgcmVwcmVzZW50cyBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFNlbGVjdGVkVE5vZGUoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsRnJhbWUgPSBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZTsKICAgIHJldHVybiBnZXRUTm9kZShsRnJhbWUudFZpZXcsIGxGcmFtZS5zZWxlY3RlZEluZGV4KTsKfQovKioKICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnYCBpbiBnbG9iYWwgc3RhdGUuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtW5hbWVzcGFjZVNWRygpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBTVkdfTkFNRVNQQUNFOwp9Ci8qKgogKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgdG8gYCdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8nYCBpbiBnbG9iYWwgc3RhdGUuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtW5hbWVzcGFjZU1hdGhNTCgpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBNQVRIX01MX05BTUVTUEFDRTsKfQovKioKICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGBudWxsYCwgd2hpY2ggZm9yY2VzIGVsZW1lbnQgY3JlYXRpb24gdG8gdXNlCiAqIGBjcmVhdGVFbGVtZW50YCByYXRoZXIgdGhhbiBgY3JlYXRlRWxlbWVudE5TYC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1bmFtZXNwYWNlSFRNTCgpIHsKICAgIG5hbWVzcGFjZUhUTUxJbnRlcm5hbCgpOwp9Ci8qKgogKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgdG8gYG51bGxgLCB3aGljaCBmb3JjZXMgZWxlbWVudCBjcmVhdGlvbiB0byB1c2UKICogYGNyZWF0ZUVsZW1lbnRgIHJhdGhlciB0aGFuIGBjcmVhdGVFbGVtZW50TlNgLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmFtZXNwYWNlSFRNTEludGVybmFsKCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudE5hbWVzcGFjZSA9IG51bGw7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROYW1lc3BhY2UoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudE5hbWVzcGFjZTsKfQovKioKICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldEN1cnJlbnRTdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnRTYW5pdGl6ZXIgPSBzYW5pdGl6ZXI7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVTYW5pdGl6ZXIoKSB7CiAgICAvLyBUT0RPKG1pc2tvKTogVGhpcyBzaG91bGQgdGhyb3cgd2hlbiB0aGVyZSBpcyBubyBMVmlldywgYnV0IGl0IHR1cm5zIG91dCB3ZSBjYW4gZ2V0IGhlcmUgZnJvbQogICAgLy8gYE5vZGVTdHlsZURlYnVnYCBoZW5jZSB3ZSByZXR1cm4gYG51bGxgLiBUaGlzIHNob3VsZCBiZSBmaXhlZAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICByZXR1cm4gbEZyYW1lID09PSBudWxsID8gbnVsbCA6IGxGcmFtZS5jdXJyZW50U2FuaXRpemVyOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2hvb2tzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBZGRzIGFsbCBkaXJlY3RpdmUgbGlmZWN5Y2xlIGhvb2tzIGZyb20gdGhlIGdpdmVuIGBEaXJlY3RpdmVEZWZgIHRvIHRoZSBnaXZlbiBgVFZpZXdgLgogKgogKiBNdXN0IGJlIHJ1biAqb25seSogb24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MuCiAqCiAqIFNldHMgdXAgdGhlIHByZS1vcmRlciBob29rcyBvbiB0aGUgcHJvdmlkZWQgYHRWaWV3YCwKICogc2VlIHtcQGxpbmsgSG9va0RhdGF9IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZS4KICoKICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleCBUaGUgaW5kZXggb2YgdGhlIGRpcmVjdGl2ZSBpbiBMVmlldwogKiBAcGFyYW0gez99IGRpcmVjdGl2ZURlZiBUaGUgZGVmaW5pdGlvbiBjb250YWluaW5nIHRoZSBob29rcyB0byBzZXR1cCBpbiB0VmlldwogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBjdXJyZW50IFRWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWdpc3RlclByZU9yZGVySG9va3MoZGlyZWN0aXZlSW5kZXgsIGRpcmVjdGl2ZURlZiwgdFZpZXcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcpOwogICAgY29uc3QgeyBvbkNoYW5nZXMsIG9uSW5pdCwgZG9DaGVjayB9ID0gZGlyZWN0aXZlRGVmOwogICAgaWYgKG9uQ2hhbmdlcykgewogICAgICAgICh0Vmlldy5wcmVPcmRlckhvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckhvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBvbkNoYW5nZXMpOwogICAgICAgICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgfHwgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyA9IFtdKSkucHVzaChkaXJlY3RpdmVJbmRleCwgb25DaGFuZ2VzKTsKICAgIH0KICAgIGlmIChvbkluaXQpIHsKICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaCgtZGlyZWN0aXZlSW5kZXgsIG9uSW5pdCk7CiAgICB9CiAgICBpZiAoZG9DaGVjaykgewogICAgICAgICh0Vmlldy5wcmVPcmRlckhvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckhvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBkb0NoZWNrKTsKICAgICAgICAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgPSBbXSkpLnB1c2goZGlyZWN0aXZlSW5kZXgsIGRvQ2hlY2spOwogICAgfQp9Ci8qKgogKgogKiBMb29wcyB0aHJvdWdoIHRoZSBkaXJlY3RpdmVzIG9uIHRoZSBwcm92aWRlZCBgdE5vZGVgIGFuZCBxdWV1ZXMgaG9va3MgdG8gYmUKICogcnVuIHRoYXQgYXJlIG5vdCBpbml0aWFsaXphdGlvbiBob29rcy4KICoKICogU2hvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBgZWxlbWVudEVuZCgpYCBhbmQgc2ltaWxhciB0bwogKiBwcmVzZXJ2ZSBob29rIGV4ZWN1dGlvbiBvcmRlci4gQ29udGVudCwgdmlldywgYW5kIGRlc3Ryb3kgaG9va3MgZm9yIHByb2plY3RlZAogKiBjb21wb25lbnRzIGFuZCBkaXJlY3RpdmVzIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHRoZWlyIGhvc3RzLgogKgogKiBTZXRzIHVwIHRoZSBjb250ZW50LCB2aWV3LCBhbmQgZGVzdHJveSBob29rcyBvbiB0aGUgcHJvdmlkZWQgYHRWaWV3YCwKICogc2VlIHtcQGxpbmsgSG9va0RhdGF9IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZS4KICoKICogTk9URTogVGhpcyBkb2VzIG5vdCBzZXQgdXAgYG9uQ2hhbmdlc2AsIGBvbkluaXRgIG9yIGBkb0NoZWNrYCwgdGhvc2UgYXJlIHNldCB1cAogKiBzZXBhcmF0ZWx5IGF0IGBlbGVtZW50U3RhcnRgLgogKgogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBjdXJyZW50IFRWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIFROb2RlIHdob3NlIGRpcmVjdGl2ZXMgYXJlIHRvIGJlIHNlYXJjaGVkIGZvciBob29rcyB0byBxdWV1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgdE5vZGUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcpOwogICAgLy8gSXQncyBuZWNlc3NhcnkgdG8gbG9vcCB0aHJvdWdoIHRoZSBkaXJlY3RpdmVzIGF0IGVsZW1lbnRFbmQoKSAocmF0aGVyIHRoYW4gcHJvY2Vzc2luZyBpbgogICAgLy8gZGlyZWN0aXZlQ3JlYXRlKSBzbyB3ZSBjYW4gcHJlc2VydmUgdGhlIGN1cnJlbnQgaG9vayBvcmRlci4gQ29udGVudCwgdmlldywgYW5kIGRlc3Ryb3kKICAgIC8vIGhvb2tzIGZvciBwcm9qZWN0ZWQgY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiB0aGVpciBob3N0cy4KICAgIGZvciAobGV0IGkgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydCwgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaV0pKTsKICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudEluaXQpIHsKICAgICAgICAgICAgKHRWaWV3LmNvbnRlbnRIb29rcyB8fCAodFZpZXcuY29udGVudEhvb2tzID0gW10pKS5wdXNoKC1pLCBkaXJlY3RpdmVEZWYuYWZ0ZXJDb250ZW50SW5pdCk7CiAgICAgICAgfQogICAgICAgIGlmIChkaXJlY3RpdmVEZWYuYWZ0ZXJDb250ZW50Q2hlY2tlZCkgewogICAgICAgICAgICAodFZpZXcuY29udGVudEhvb2tzIHx8ICh0Vmlldy5jb250ZW50SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpOwogICAgICAgICAgICAodFZpZXcuY29udGVudENoZWNrSG9va3MgfHwgKHRWaWV3LmNvbnRlbnRDaGVja0hvb2tzID0gW10pKQogICAgICAgICAgICAgICAgLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpOwogICAgICAgIH0KICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyVmlld0luaXQpIHsKICAgICAgICAgICAgKHRWaWV3LnZpZXdIb29rcyB8fCAodFZpZXcudmlld0hvb2tzID0gW10pKS5wdXNoKC1pLCBkaXJlY3RpdmVEZWYuYWZ0ZXJWaWV3SW5pdCk7CiAgICAgICAgfQogICAgICAgIGlmIChkaXJlY3RpdmVEZWYuYWZ0ZXJWaWV3Q2hlY2tlZCkgewogICAgICAgICAgICAodFZpZXcudmlld0hvb2tzIHx8ICh0Vmlldy52aWV3SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyVmlld0NoZWNrZWQpOwogICAgICAgICAgICAodFZpZXcudmlld0NoZWNrSG9va3MgfHwgKHRWaWV3LnZpZXdDaGVja0hvb2tzID0gW10pKS5wdXNoKGksIGRpcmVjdGl2ZURlZi5hZnRlclZpZXdDaGVja2VkKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRpcmVjdGl2ZURlZi5vbkRlc3Ryb3kgIT0gbnVsbCkgewogICAgICAgICAgICAodFZpZXcuZGVzdHJveUhvb2tzIHx8ICh0Vmlldy5kZXN0cm95SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLm9uRGVzdHJveSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBFeGVjdXRpbmcgaG9va3MgcmVxdWlyZXMgY29tcGxleCBsb2dpYyBhcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aCAyIGNvbnN0cmFpbnRzLgogKgogKiAxLiBJbml0IGhvb2tzIChuZ09uSW5pdCwgbmdBZnRlckNvbnRlbnRJbml0LCBuZ0FmdGVyVmlld0luaXQpIG11c3QgYWxsIGJlIGV4ZWN1dGVkIG9uY2UgYW5kIG9ubHkKICogb25jZSwgYWNyb3NzIG1hbnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuIFRoaXMgbXVzdCBiZSB0cnVlIGV2ZW4gaWYgc29tZSBob29rcyB0aHJvdywgb3IgaWYKICogc29tZSByZWN1cnNpdmVseSB0cmlnZ2VyIGEgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS4KICogVG8gc29sdmUgdGhhdCwgaXQgaXMgcmVxdWlyZWQgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBleGVjdXRpb24gb2YgdGhlc2UgaW5pdCBob29rcy4KICogVGhpcyBpcyBkb25lIGJ5IHN0b3JpbmcgYW5kIG1haW50YWluaW5nIGZsYWdzIGluIHRoZSB2aWV3OiB0aGUge0BsaW5rIEluaXRQaGFzZVN0YXRlfSwKICogYW5kIHRoZSBpbmRleCB3aXRoaW4gdGhhdCBwaGFzZS4gVGhleSBjYW4gYmUgc2VlbiBhcyBhIGN1cnNvciBpbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKICogW1tvbkluaXQxLCBvbkluaXQyXSwgW2FmdGVyQ29udGVudEluaXQxXSwgW2FmdGVyVmlld0luaXQxLCBhZnRlclZpZXdJbml0MiwgYWZ0ZXJWaWV3SW5pdDNdXQogKiBUaGV5IGFyZSBhcmUgc3RvcmVkIGFzIGZsYWdzIGluIExWaWV3W0ZMQUdTXS4KICoKICogMi4gUHJlLW9yZGVyIGhvb2tzIGNhbiBiZSBleGVjdXRlZCBpbiBiYXRjaGVzLCBiZWNhdXNlIG9mIHRoZSBzZWxlY3QgaW5zdHJ1Y3Rpb24uCiAqIFRvIGJlIGFibGUgdG8gcGF1c2UgYW5kIHJlc3VtZSB0aGVpciBleGVjdXRpb24sIHdlIGFsc28gbmVlZCBzb21lIHN0YXRlIGFib3V0IHRoZSBob29rJ3MgYXJyYXkKICogdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQ6CiAqIC0gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGhvb2sgdG8gYmUgZXhlY3V0ZWQKICogLSB0aGUgbnVtYmVyIG9mIGluaXQgaG9va3MgYWxyZWFkeSBmb3VuZCBpbiB0aGUgcHJvY2Vzc2VkIHBhcnQgb2YgdGhlICBhcnJheQogKiBUaGV5IGFyZSBhcmUgc3RvcmVkIGFzIGZsYWdzIGluIExWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdLgogKi8KLyoqCiAqIEV4ZWN1dGVzIHByZS1vcmRlciBjaGVjayBob29rcyAoIE9uQ2hhbmdlcywgRG9DaGFuZ2VzKSBnaXZlbiBhIHZpZXcgd2hlcmUgYWxsIHRoZSBpbml0IGhvb2tzIHdlcmUKICogZXhlY3V0ZWQgb25jZS4gVGhpcyBpcyBhIGxpZ2h0IHZlcnNpb24gb2YgZXhlY3V0ZUluaXRBbmRDaGVja1ByZU9yZGVySG9va3Mgd2hlcmUgd2UgY2FuIHNraXAgcmVhZAogKiAvIHdyaXRlIG9mIHRoZSBpbml0LWhvb2tzIHJlbGF0ZWQgZmxhZ3MuCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIExWaWV3IHdoZXJlIGhvb2tzIGFyZSBkZWZpbmVkCiAqIEBwYXJhbSB7P30gaG9va3MgSG9va3MgdG8gYmUgcnVuCiAqIEBwYXJhbSB7Pz19IG5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWU6CiAqIC0gdW5kZWZpbmVkOiBhbGwgaG9va3MgZnJvbSB0aGUgYXJyYXkgc2hvdWxkIGJlIGV4ZWN1dGVkIChwb3N0LW9yZGVyIGNhc2UpCiAqIC0gbnVsbDogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5IChwcmUtb3JkZXIgY2FzZSwgd2hlbgogKiBmbHVzaGluZyB0aGUgcmVtYWluaW5nIGhvb2tzKQogKiAtIG51bWJlcjogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoYXQgbm9kZSBpbmRleCBleGNsdXNpdmUgKHByZS1vcmRlcgogKiBjYXNlLCB3aGVuIGV4ZWN1dGluZyBzZWxlY3QobnVtYmVyKSkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBob29rcywgbm9kZUluZGV4KSB7CiAgICBjYWxsSG9va3MobFZpZXcsIGhvb2tzLCAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLywgbm9kZUluZGV4KTsKfQovKioKICogRXhlY3V0ZXMgcG9zdC1vcmRlciBpbml0IGFuZCBjaGVjayBob29rcyAob25lIG9mIEFmdGVyQ29udGVudEluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsCiAqIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQpIGdpdmVuIGEgdmlldyB3aGVyZSB0aGVyZSBhcmUgcGVuZGluZyBpbml0IGhvb2tzIHRvIGJlIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB3aGVyZSBob29rcyBhcmUgZGVmaW5lZAogKiBAcGFyYW0gez99IGhvb2tzIEhvb2tzIHRvIGJlIHJ1bgogKiBAcGFyYW0gez99IGluaXRQaGFzZSBBIHBoYXNlIGZvciB3aGljaCBob29rcyBzaG91bGQgYmUgcnVuCiAqIEBwYXJhbSB7Pz19IG5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWU6CiAqIC0gdW5kZWZpbmVkOiBhbGwgaG9va3MgZnJvbSB0aGUgYXJyYXkgc2hvdWxkIGJlIGV4ZWN1dGVkIChwb3N0LW9yZGVyIGNhc2UpCiAqIC0gbnVsbDogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5IChwcmUtb3JkZXIgY2FzZSwgd2hlbgogKiBmbHVzaGluZyB0aGUgcmVtYWluaW5nIGhvb2tzKQogKiAtIG51bWJlcjogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoYXQgbm9kZSBpbmRleCBleGNsdXNpdmUgKHByZS1vcmRlcgogKiBjYXNlLCB3aGVuIGV4ZWN1dGluZyBzZWxlY3QobnVtYmVyKSkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVJbml0QW5kQ2hlY2tIb29rcyhsVmlldywgaG9va3MsIGluaXRQaGFzZSwgbm9kZUluZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RFcXVhbChpbml0UGhhc2UsIDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovLCAnSW5pdCBwcmUtb3JkZXIgaG9va3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UnKTsKICAgIGlmICgobFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSBpbml0UGhhc2UpIHsKICAgICAgICBjYWxsSG9va3MobFZpZXcsIGhvb2tzLCBpbml0UGhhc2UsIG5vZGVJbmRleCk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbml0UGhhc2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluY3JlbWVudEluaXRQaGFzZUZsYWdzKGxWaWV3LCBpbml0UGhhc2UpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vdEVxdWFsKGluaXRQaGFzZSwgMyAvKiBJbml0UGhhc2VDb21wbGV0ZWQgKi8sICdJbml0IGhvb2tzIHBoYXNlIHNob3VsZCBub3QgYmUgaW5jcmVtZW50ZWQgYWZ0ZXIgYWxsIGluaXQgaG9va3MgaGF2ZSBiZWVuIHJ1bi4nKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBmbGFncyA9IGxWaWV3W0ZMQUdTXTsKICAgIGlmICgoZmxhZ3MgJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IGluaXRQaGFzZSkgewogICAgICAgIGZsYWdzICY9IDEwMjMgLyogSW5kZXhXaXRoaW5Jbml0UGhhc2VSZXNldCAqLzsKICAgICAgICBmbGFncyArPSAxIC8qIEluaXRQaGFzZVN0YXRlSW5jcmVtZW50ZXIgKi87CiAgICAgICAgbFZpZXdbRkxBR1NdID0gZmxhZ3M7CiAgICB9Cn0KLyoqCiAqIENhbGxzIGxpZmVjeWNsZSBob29rcyB3aXRoIHRoZWlyIGNvbnRleHRzLCBza2lwcGluZyBpbml0IGhvb2tzIGlmIGl0J3Mgbm90CiAqIHRoZSBmaXJzdCBMVmlldyBwYXNzCiAqCiAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcgVGhlIGN1cnJlbnQgdmlldwogKiBAcGFyYW0gez99IGFyciBUaGUgYXJyYXkgaW4gd2hpY2ggdGhlIGhvb2tzIGFyZSBmb3VuZAogKiBAcGFyYW0gez99IGluaXRQaGFzZQogKiBAcGFyYW0gez99IGN1cnJlbnROb2RlSW5kZXggMyBjYXNlcyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlOgogKiAtIHVuZGVmaW5lZDogYWxsIGhvb2tzIGZyb20gdGhlIGFycmF5IHNob3VsZCBiZSBleGVjdXRlZCAocG9zdC1vcmRlciBjYXNlKQogKiAtIG51bGw6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheSAocHJlLW9yZGVyIGNhc2UsIHdoZW4KICogZmx1c2hpbmcgdGhlIHJlbWFpbmluZyBob29rcykKICogLSBudW1iZXI6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGF0IG5vZGUgaW5kZXggZXhjbHVzaXZlIChwcmUtb3JkZXIKICogY2FzZSwgd2hlbiBleGVjdXRpbmcgc2VsZWN0KG51bWJlcikpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjYWxsSG9va3MoY3VycmVudFZpZXcsIGFyciwgaW5pdFBoYXNlLCBjdXJyZW50Tm9kZUluZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbChnZXRDaGVja05vQ2hhbmdlc01vZGUoKSwgZmFsc2UsICdIb29rcyBzaG91bGQgbmV2ZXIgYmUgcnVuIGluIHRoZSBjaGVjayBubyBjaGFuZ2VzIG1vZGUuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudE5vZGVJbmRleCAhPT0gdW5kZWZpbmVkID8KICAgICAgICAoY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gJiA2NTUzNSAvKiBJbmRleE9mVGhlTmV4dFByZU9yZGVySG9va01hc2tNYXNrICovKSA6CiAgICAgICAgMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVJbmRleExpbWl0ID0gY3VycmVudE5vZGVJbmRleCAhPSBudWxsID8gY3VycmVudE5vZGVJbmRleCA6IC0xOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGxhc3ROb2RlSW5kZXhGb3VuZCA9IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob29rID0gKC8qKiBAdHlwZSB7P30gKi8gKGFycltpICsgMV0pKTsKICAgICAgICBpZiAodHlwZW9mIGhvb2sgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGxhc3ROb2RlSW5kZXhGb3VuZCA9ICgvKiogQHR5cGUgez99ICovIChhcnJbaV0pKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlSW5kZXggIT0gbnVsbCAmJiBsYXN0Tm9kZUluZGV4Rm91bmQgPj0gY3VycmVudE5vZGVJbmRleCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNJbml0SG9vayA9IGFycltpXSA8IDA7CiAgICAgICAgICAgIGlmIChpc0luaXRIb29rKQogICAgICAgICAgICAgICAgY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gKz0gNjU1MzYgLyogTnVtYmVyT2ZJbml0SG9va3NDYWxsZWRJbmNyZW1lbnRlciAqLzsKICAgICAgICAgICAgaWYgKGxhc3ROb2RlSW5kZXhGb3VuZCA8IG5vZGVJbmRleExpbWl0IHx8IG5vZGVJbmRleExpbWl0ID09IC0xKSB7CiAgICAgICAgICAgICAgICBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpOwogICAgICAgICAgICAgICAgY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gPQogICAgICAgICAgICAgICAgICAgIChjdXJyZW50Vmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSAmIDQyOTQ5MDE3NjAgLyogTnVtYmVyT2ZJbml0SG9va3NDYWxsZWRNYXNrICovKSArIGkgKwogICAgICAgICAgICAgICAgICAgICAgICAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEV4ZWN1dGUgb25lIGhvb2sgYWdhaW5zdCB0aGUgY3VycmVudCBgTFZpZXdgLgogKgogKiBAcGFyYW0gez99IGN1cnJlbnRWaWV3IFRoZSBjdXJyZW50IHZpZXcKICogQHBhcmFtIHs/fSBpbml0UGhhc2UKICogQHBhcmFtIHs/fSBhcnIgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBob29rcyBhcmUgZm91bmQKICogQHBhcmFtIHs/fSBpIFRoZSBjdXJyZW50IGluZGV4IHdpdGhpbiB0aGUgaG9vayBkYXRhIGFycmF5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzSW5pdEhvb2sgPSBhcnJbaV0gPCAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaG9vayA9ICgvKiogQHR5cGUgez99ICovIChhcnJbaSArIDFdKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaXJlY3RpdmVJbmRleCA9IGlzSW5pdEhvb2sgPyAtYXJyW2ldIDogKC8qKiBAdHlwZSB7P30gKi8gKGFycltpXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlyZWN0aXZlID0gY3VycmVudFZpZXdbZGlyZWN0aXZlSW5kZXhdOwogICAgaWYgKGlzSW5pdEhvb2spIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXhXaXRoaW50SW5pdFBoYXNlID0gY3VycmVudFZpZXdbRkxBR1NdID4+IDEwIC8qIEluZGV4V2l0aGluSW5pdFBoYXNlU2hpZnQgKi87CiAgICAgICAgLy8gVGhlIGluaXQgcGhhc2Ugc3RhdGUgbXVzdCBiZSBhbHdheXMgY2hlY2tlZCBoZXJlIGFzIGl0IG1heSBoYXZlIGJlZW4gcmVjdXJzaXZlbHkKICAgICAgICAvLyB1cGRhdGVkCiAgICAgICAgaWYgKGluZGV4V2l0aGludEluaXRQaGFzZSA8CiAgICAgICAgICAgIChjdXJyZW50Vmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSA+PiAxNiAvKiBOdW1iZXJPZkluaXRIb29rc0NhbGxlZFNoaWZ0ICovKSAmJgogICAgICAgICAgICAoY3VycmVudFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSBpbml0UGhhc2UpIHsKICAgICAgICAgICAgY3VycmVudFZpZXdbRkxBR1NdICs9IDEwMjQgLyogSW5kZXhXaXRoaW5Jbml0UGhhc2VJbmNyZW1lbnRlciAqLzsKICAgICAgICAgICAgaG9vay5jYWxsKGRpcmVjdGl2ZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaG9vay5jYWxsKGRpcmVjdGl2ZSk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9pbmplY3Rvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgVE5PREUgPSA4OwovKiogQHR5cGUgez99ICovCmNvbnN0IFBBUkVOVF9JTkpFQ1RPUiA9IDg7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSU5KRUNUT1JfQkxPT01fUEFSRU5UX1NJWkUgPSA5OwovKiogQHR5cGUgez99ICovCmNvbnN0IE5PX1BBUkVOVF9JTkpFQ1RPUiA9ICgvKiogQHR5cGUgez99ICovICgtMSkpOwovKioKICogRWFjaCBpbmplY3RvciBpcyBzYXZlZCBpbiA5IGNvbnRpZ3VvdXMgc2xvdHMgaW4gYExWaWV3YCBhbmQgOSBjb250aWd1b3VzIHNsb3RzIGluCiAqIGBUVmlldy5kYXRhYC4gVGhpcyBhbGxvd3MgdXMgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbm9kZSdzIHRva2VucyAod2hpY2gKICogY2FuIGJlIHNoYXJlZCBpbiBgVFZpZXdgKSBhcyB3ZWxsIGFzIHRoZSB0b2tlbnMgb2YgaXRzIGFuY2VzdG9yIG5vZGVzICh3aGljaCBjYW5ub3QgYmUKICogc2hhcmVkLCBzbyB0aGV5IGxpdmUgaW4gYExWaWV3YCkuCiAqCiAqIEVhY2ggb2YgdGhlc2Ugc2xvdHMgKGFzaWRlIGZyb20gdGhlIGxhc3Qgc2xvdCkgY29udGFpbnMgYSBibG9vbSBmaWx0ZXIuIFRoaXMgYmxvb20gZmlsdGVyCiAqIGRldGVybWluZXMgd2hldGhlciBhIGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUgb24gdGhlIGFzc29jaWF0ZWQgbm9kZSBvciBub3QuIFRoaXMgcHJldmVudHMgdXMKICogZnJvbSBzZWFyY2hpbmcgdGhlIGRpcmVjdGl2ZXMgYXJyYXkgYXQgdGhpcyBsZXZlbCB1bmxlc3MgaXQncyBwcm9iYWJsZSB0aGUgZGlyZWN0aXZlIGlzIGluIGl0LgogKgogKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jsb29tX2ZpbHRlciBmb3IgbW9yZSBhYm91dCBibG9vbSBmaWx0ZXJzLgogKgogKiBCZWNhdXNlIGFsbCBpbmplY3RvcnMgaGF2ZSBiZWVuIGZsYXR0ZW5lZCBpbnRvIGBMVmlld2AgYW5kIGBUVmlld0RhdGFgLCB0aGV5IGNhbm5vdCB0eXBlZAogKiB1c2luZyBpbnRlcmZhY2VzIGFzIHRoZXkgd2VyZSBwcmV2aW91c2x5LiBUaGUgc3RhcnQgaW5kZXggb2YgZWFjaCBgTEluamVjdG9yYCBhbmQgYFRJbmplY3RvcmAKICogd2lsbCBkaWZmZXIgYmFzZWQgb24gd2hlcmUgaXQgaXMgZmxhdHRlbmVkIGludG8gdGhlIG1haW4gYXJyYXksIHNvIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGtub3cKICogdGhlIGluZGljZXMgYWhlYWQgb2YgdGltZSBhbmQgc2F2ZSB0aGVpciB0eXBlcyBoZXJlLiBUaGUgaW50ZXJmYWNlcyBhcmUgc3RpbGwgaW5jbHVkZWQgaGVyZQogKiBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KICoKICogZXhwb3J0IGludGVyZmFjZSBMSW5qZWN0b3IgZXh0ZW5kcyBBcnJheTxhbnk+IHsKICoKICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAwLTMxICAoSURzIGFyZSAlIEJMT09NX1NJWkUpCiAqICAgIFswXTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDMyLTYzCiAqICAgIFsxXTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDY0LTk1CiAqICAgIFsyXTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDk2LTEyNwogKiAgICBbM106IG51bWJlcjsKICoKICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAxMjgtMTU5CiAqICAgIFs0XTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDE2MCAtIDE5MQogKiAgICBbNV06IG51bWJlcjsKICoKICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAxOTIgLSAyMjMKICogICAgWzZdOiBudW1iZXI7CiAqCiAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMjI0IC0gMjU1CiAqICAgIFs3XTogbnVtYmVyOwogKgogKiAgICAvLyBXZSBuZWVkIHRvIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmplY3RvcidzIHBhcmVudCBzbyBESSBjYW4ga2VlcCBsb29raW5nIHVwCiAqICAgIC8vIHRoZSBpbmplY3RvciB0cmVlIHVudGlsIGl0IGZpbmRzIHRoZSBkZXBlbmRlbmN5IGl0J3MgbG9va2luZyBmb3IuCiAqICAgIFtQQVJFTlRfSU5KRUNUT1JdOiBudW1iZXI7CiAqIH0KICoKICogZXhwb3J0IGludGVyZmFjZSBUSW5qZWN0b3IgZXh0ZW5kcyBBcnJheTxhbnk+IHsKICoKICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMC0zMSAgKElEcyBhcmUgJSBCTE9PTV9TSVpFKQogKiAgICBbMF06IG51bWJlcjsKICoKICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMzItNjMKICogICAgWzFdOiBudW1iZXI7CiAqCiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDY0LTk1CiAqICAgIFsyXTogbnVtYmVyOwogKgogKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyA5Ni0xMjcKICogICAgWzNdOiBudW1iZXI7CiAqCiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDEyOC0xNTkKICogICAgWzRdOiBudW1iZXI7CiAqCiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDE2MCAtIDE5MQogKiAgICBbNV06IG51bWJlcjsKICoKICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTkyIC0gMjIzCiAqICAgIFs2XTogbnVtYmVyOwogKgogKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAyMjQgLSAyNTUKICogICAgWzddOiBudW1iZXI7CiAqCiAqICAgIC8vIE5lY2Vzc2FyeSB0byBmaW5kIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBhIHBhcnRpY3VsYXIgbm9kZS4KICogICAgW1ROT0RFXTogVEVsZW1lbnROb2RlfFRFbGVtZW50Q29udGFpbmVyTm9kZXxUQ29udGFpbmVyTm9kZTsKICogIH0KICovCi8qKgogKiBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgaW5qZWN0b3JzIGluIHRoZSBOb2RlSW5qZWN0b3IuCiAqCiAqIFRoaXMgZmFjdG9yeSBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGNhbiByZXNvbHZlIGBtdWx0aWAgZmFjdG9yaWVzIGFzIHdlbGwuCiAqCiAqIE5PVEU6IFNvbWUgb2YgdGhlIGZpZWxkcyBhcmUgb3B0aW9uYWwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIGNsYXNzIGhhcyB0d28gaGlkZGVuIGNsYXNzZXMuCiAqIC0gT25lIHdpdGhvdXQgYG11bHRpYCBzdXBwb3J0IChtb3N0IGNvbW1vbikKICogLSBPbmUgd2l0aCBgbXVsdGlgIHZhbHVlcywgKHJhcmUpLgogKgogKiBTaW5jZSBWTXMgY2FuIGNhY2hlIHVwIHRvIDQgaW5saW5lIGhpZGRlbiBjbGFzc2VzIHRoaXMgaXMgT0suCiAqCiAqIC0gU2luZ2xlIGZhY3Rvcnk6IE9ubHkgYHJlc29sdmluZ2AgYW5kIGBmYWN0b3J5YCBpcyBkZWZpbmVkLgogKiAtIGBwcm92aWRlcnNgIGZhY3Rvcnk6IGBjb21wb25lbnRQcm92aWRlcnNgIGlzIGEgbnVtYmVyIGFuZCBgaW5kZXggPSAtMWAuCiAqIC0gYHZpZXdQcm92aWRlcnNgIGZhY3Rvcnk6IGBjb21wb25lbnRQcm92aWRlcnNgIGlzIGEgbnVtYmVyIGFuZCBgaW5kZXhgIHBvaW50cyB0byBgcHJvdmlkZXJzYC4KICovCmNsYXNzIE5vZGVJbmplY3RvckZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0SW1wbGVtZW50YXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IoZmFjdG9yeSwgCiAgICAvKioKICAgICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIHRva2VuIGlzIGRlY2xhcmVkIGluIGB2aWV3UHJvdmlkZXJzYCAob3IgaWYgaXQgaXMgY29tcG9uZW50KS4KICAgICAqLwogICAgaXNWaWV3UHJvdmlkZXIsIGluamVjdEltcGxlbWVudGF0aW9uKSB7CiAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAvKioKICAgICAgICAgKiBNYXJrZXIgc2V0IHRvIHRydWUgZHVyaW5nIGZhY3RvcnkgaW52b2NhdGlvbiB0byBzZWUgaWYgd2UgZ2V0IGludG8gcmVjdXJzaXZlIGxvb3AuCiAgICAgICAgICogUmVjdXJzaXZlIGxvb3AgY2F1c2VzIGFuIGVycm9yIHRvIGJlIGRpc3BsYXllZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlc29sdmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuY2FuU2VlVmlld1Byb3ZpZGVycyA9IGlzVmlld1Byb3ZpZGVyOwogICAgICAgIHRoaXMuaW5qZWN0SW1wbCA9IGluamVjdEltcGxlbWVudGF0aW9uOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG9iagogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNGYWN0b3J5KG9iaikgewogICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE5vZGVJbmplY3RvckZhY3Rvcnk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvbm9kZV9hc3NlcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnROb2RlVHlwZSh0Tm9kZSwgdHlwZSkgewogICAgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ3Nob3VsZCBiZSBjYWxsZWQgd2l0aCBhIFROb2RlJyk7CiAgICBhc3NlcnRFcXVhbCh0Tm9kZS50eXBlLCB0eXBlLCBgc2hvdWxkIGJlIGEgJHt0eXBlTmFtZSh0eXBlKX1gKTsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gey4uLj99IHR5cGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAuLi50eXBlcykgewogICAgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ3Nob3VsZCBiZSBjYWxsZWQgd2l0aCBhIFROb2RlJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb3VuZCA9IHR5cGVzLnNvbWUoKC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0eXBlID0+IHROb2RlLnR5cGUgPT09IHR5cGUpKTsKICAgIGFzc2VydEVxdWFsKGZvdW5kLCB0cnVlLCBgU2hvdWxkIGJlIG9uZSBvZiAke3R5cGVzLm1hcCh0eXBlTmFtZSkuam9pbignLCAnKX0gYnV0IGdvdCAke3R5cGVOYW1lKHROb2RlLnR5cGUpfWApOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHR5cGVOYW1lKHR5cGUpIHsKICAgIGlmICh0eXBlID09IDEgLyogUHJvamVjdGlvbiAqLykKICAgICAgICByZXR1cm4gJ1Byb2plY3Rpb24nOwogICAgaWYgKHR5cGUgPT0gMCAvKiBDb250YWluZXIgKi8pCiAgICAgICAgcmV0dXJuICdDb250YWluZXInOwogICAgaWYgKHR5cGUgPT0gNSAvKiBJY3VDb250YWluZXIgKi8pCiAgICAgICAgcmV0dXJuICdJY3VDb250YWluZXInOwogICAgaWYgKHR5cGUgPT0gMiAvKiBWaWV3ICovKQogICAgICAgIHJldHVybiAnVmlldyc7CiAgICBpZiAodHlwZSA9PSAzIC8qIEVsZW1lbnQgKi8pCiAgICAgICAgcmV0dXJuICdFbGVtZW50JzsKICAgIGlmICh0eXBlID09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykKICAgICAgICByZXR1cm4gJ0VsZW1lbnRDb250YWluZXInOwogICAgcmV0dXJuICc8dW5rbm93bj4nOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3V0aWwvYXR0cnNfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFzc2lnbnMgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gdGhlIHByb3ZpZGVkIGVsZW1lbnQgdmlhIHRoZSBpbmZlcnJlZCByZW5kZXJlci4KICoKICogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHR3byBmb3JtcyBvZiBhdHRyaWJ1dGUgZW50cmllczoKICoKICogZGVmYXVsdDogKGtleSwgdmFsdWUpOgogKiAgYXR0cnMgPSBba2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTJdCiAqCiAqIG5hbWVzcGFjZWQ6IChOQU1FU1BBQ0VfTUFSS0VSLCB1cmksIG5hbWUsIHZhbHVlKQogKiAgYXR0cnMgPSBbTkFNRVNQQUNFX01BUktFUiwgdXJpLCBuYW1lLCB2YWx1ZSwgTkFNRVNQQUNFX01BUktFUiwgdXJpLCBuYW1lLCB2YWx1ZV0KICoKICogVGhlIGBhdHRyc2AgYXJyYXkgY2FuIGNvbnRhaW4gYSBtaXggb2YgYm90aCB0aGUgZGVmYXVsdCBhbmQgbmFtZXNwYWNlZCBlbnRyaWVzLgogKiBUaGUgImRlZmF1bHQiIHZhbHVlcyBhcmUgc2V0IHdpdGhvdXQgYSBtYXJrZXIsIGJ1dCBpZiB0aGUgZnVuY3Rpb24gY29tZXMgYWNyb3NzCiAqIGEgbWFya2VyIHZhbHVlIHRoZW4gaXQgd2lsbCBhdHRlbXB0IHRvIHNldCBhIG5hbWVzcGFjZWQgdmFsdWUuIElmIHRoZSBtYXJrZXIgaXMKICogbm90IG9mIGEgbmFtZXNwYWNlZCB2YWx1ZSB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHF1aXQgYW5kIHJldHVybiB0aGUgaW5kZXggdmFsdWUKICogd2hlcmUgaXQgc3RvcHBlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiBvZiB0aGUgYXR0cnMgYXJyYXkuCiAqCiAqIFNlZSBbQXR0cmlidXRlTWFya2VyXSB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIG5hbWVzcGFjZSBtYXJrZXIgdmFsdWUgaXMuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXNzaWduaW5nIHN0eWxlIGFuZCBjbGFzcyB2YWx1ZXMgdG8KICogYW4gZWxlbWVudC4gU2VlIGBlbGVtZW50U3RhcnRgIGFuZCBgZWxlbWVudEhvc3RBdHRyc2AgdG8gbGVhcm4gaG93IHN0eWxpbmcgdmFsdWVzCiAqIGFyZSBhcHBsaWVkIHRvIGFuIGVsZW1lbnQuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIgVGhlIHJlbmRlcmVyIHRvIGJlIHVzZWQKICogQHBhcmFtIHs/fSBuYXRpdmUgVGhlIGVsZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGFzc2lnbmVkIHRvCiAqIEBwYXJhbSB7P30gYXR0cnMgVGhlIGF0dHJpYnV0ZSBhcnJheSBvZiB2YWx1ZXMgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50CiAqIEByZXR1cm4gez99IHRoZSBpbmRleCB2YWx1ZSB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkIGluIHRoZSBhdHRyaWJ1dGVzIGFycmF5CiAqLwpmdW5jdGlvbiBzZXRVcEF0dHJpYnV0ZXMocmVuZGVyZXIsIG5hdGl2ZSwgYXR0cnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzUHJvYyA9IGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMDsKICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgLy8gb25seSBuYW1lc3BhY2VzIGFyZSBzdXBwb3J0ZWQuIE90aGVyIHZhbHVlIHR5cGVzIChzdWNoIGFzIHN0eWxlL2NsYXNzCiAgICAgICAgICAgIC8vIGVudHJpZXMpIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHdlIGp1c3QgbGFuZGVkIG9uIHRoZSBtYXJrZXIgdmFsdWUgLi4uIHRoZXJlZm9yZQogICAgICAgICAgICAvLyB3ZSBzaG91bGQgc2tpcCB0byB0aGUgbmV4dCBlbnRyeQogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlVVJJID0gKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJzW2krK10pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1tpKytdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0clZhbCA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1tpKytdKSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKzsKICAgICAgICAgICAgaXNQcm9jID8KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0QXR0cmlidXRlKG5hdGl2ZSwgYXR0ck5hbWUsIGF0dHJWYWwsIG5hbWVzcGFjZVVSSSkgOgogICAgICAgICAgICAgICAgbmF0aXZlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gYXR0ck5hbWUgaXMgc3RyaW5nOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0clZhbCA9IGF0dHJzWysraV07CiAgICAgICAgICAgIC8vIFN0YW5kYXJkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldEF0dHJpYnV0ZSsrOwogICAgICAgICAgICBpZiAoaXNBbmltYXRpb25Qcm9wKGF0dHJOYW1lKSkgewogICAgICAgICAgICAgICAgaWYgKGlzUHJvYykgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0UHJvcGVydHkobmF0aXZlLCBhdHRyTmFtZSwgYXR0clZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpc1Byb2MgPwogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0QXR0cmlidXRlKG5hdGl2ZSwgYXR0ck5hbWUsICgvKiogQHR5cGUgez99ICovIChhdHRyVmFsKSkpIDoKICAgICAgICAgICAgICAgICAgICBuYXRpdmUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0clZhbCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfQogICAgLy8gYW5vdGhlciBwaWVjZSBvZiBjb2RlIG1heSBpdGVyYXRlIG92ZXIgdGhlIHNhbWUgYXR0cmlidXRlcyBhcnJheS4gVGhlcmVmb3JlCiAgICAvLyBpdCBtYXkgYmUgaGVscGZ1bCB0byByZXR1cm4gdGhlIGV4YWN0IHNwb3Qgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgYXJyYXkgZXhpdGVkCiAgICAvLyB3aGV0aGVyIGJ5IHJ1bm5pbmcgaW50byBhbiB1bnN1cHBvcnRlZCBtYXJrZXIgb3IgaWYgYWxsIHRoZSBzdGF0aWMgdmFsdWVzIHdlcmUKICAgIC8vIGl0ZXJhdGVkIG92ZXIuCiAgICByZXR1cm4gaTsKfQovKioKICogVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIG1hcmtlciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcKICogYXR0cmlidXRlIHZhbHVlcyBpbiBhIGBUQXR0cmlidXRlc2AgYXJyYXkgYXJlIG9ubHkgdGhlIG5hbWVzIG9mIGF0dHJpYnV0ZXMsCiAqIGFuZCBub3QgbmFtZS12YWx1ZSBwYWlycy4KICogQHBhcmFtIHs/fSBtYXJrZXIgVGhlIGF0dHJpYnV0ZSBtYXJrZXIgdG8gdGVzdC4KICogQHJldHVybiB7P30gdHJ1ZSBpZiB0aGUgbWFya2VyIGlzIGEgIm5hbWUtb25seSIgbWFya2VyIChlLmcuIGBCaW5kaW5nc2AsIGBUZW1wbGF0ZWAgb3IgYEkxOG5gKS4KICovCmZ1bmN0aW9uIGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobWFya2VyKSB7CiAgICByZXR1cm4gbWFya2VyID09PSAzIC8qIEJpbmRpbmdzICovIHx8IG1hcmtlciA9PT0gNCAvKiBUZW1wbGF0ZSAqLyB8fAogICAgICAgIG1hcmtlciA9PT0gNiAvKiBJMThuICovOwp9Ci8qKgogKiBAcGFyYW0gez99IG5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQW5pbWF0aW9uUHJvcChuYW1lKSB7CiAgICAvLyBQZXJmIG5vdGU6IGFjY2Vzc2luZyBjaGFyQ29kZUF0IHRvIGNoZWNrIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgc3RyaW5nIGlzIGZhc3RlciBhcwogICAgLy8gY29tcGFyZWQgdG8gYWNjZXNzaW5nIGEgY2hhcmFjdGVyIGF0IGluZGV4IDAgKGV4LiBuYW1lWzBdKS4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgIC8vIGNoYXJDb2RlQXQgZG9lc24ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gcmV0dXJuIGEgc3Vic3RyaW5nLgogICAgcmV0dXJuIG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gNjQgLyogQVRfU0lHTiAqLzsKfQovKioKICogTWVyZ2VzIGBzcmNgIGBUQXR0cmlidXRlc2AgaW50byBgZHN0YCBgVEF0dHJpYnV0ZXNgIHJlbW92aW5nIGFueSBkdXBsaWNhdGVzIGluIHRoZSBwcm9jZXNzLgogKgogKiBUaGlzIG1lcmdlIGZ1bmN0aW9uIGtlZXBzIHRoZSBvcmRlciBvZiBhdHRycyBzYW1lLgogKgogKiBAcGFyYW0gez99IGRzdCBMb2NhdGlvbiBvZiB3aGVyZSB0aGUgbWVyZ2VkIGBUQXR0cmlidXRlc2Agc2hvdWxkIGVuZCB1cC4KICogQHBhcmFtIHs/fSBzcmMgYFRBdHRyaWJ1dGVzYCB3aGljaCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gYGRzdGAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1lcmdlSG9zdEF0dHJzKGRzdCwgc3JjKSB7CiAgICBpZiAoc3JjID09PSBudWxsIHx8IHNyYy5sZW5ndGggPT09IDApIDsKICAgIGVsc2UgaWYgKGRzdCA9PT0gbnVsbCB8fCBkc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBzb3VyY2UsIGJ1dCBkc3QgaXMgZW1wdHksIGp1c3QgbWFrZSBhIGNvcHkuCiAgICAgICAgZHN0ID0gc3JjLnNsaWNlKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNyY01hcmtlciA9IC0xIC8qIEltcGxpY2l0QXR0cmlidXRlcyAqLzsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzcmNbaV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIHNyY01hcmtlciA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3JjTWFya2VyID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjTWFya2VyID09PSAtMSAvKiBJbXBsaWNpdEF0dHJpYnV0ZXMgKi8gfHwKICAgICAgICAgICAgICAgICAgICBzcmNNYXJrZXIgPT09IDIgLyogU3R5bGVzICovKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGNvbnN1bWUgYGtleTFgIGFuZCBgdmFsdWVgIG9ubHkuCiAgICAgICAgICAgICAgICAgICAgbWVyZ2VIb3N0QXR0cmlidXRlKGRzdCwgc3JjTWFya2VyLCAoLyoqIEB0eXBlIHs/fSAqLyAoaXRlbSkpLCBudWxsLCAoLyoqIEB0eXBlIHs/fSAqLyAoc3JjWysraV0pKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBDYXNlIHdoZXJlIHdlIGhhdmUgdG8gY29uc3VtZSBga2V5MWAgb25seS4KICAgICAgICAgICAgICAgICAgICBtZXJnZUhvc3RBdHRyaWJ1dGUoZHN0LCBzcmNNYXJrZXIsICgvKiogQHR5cGUgez99ICovIChpdGVtKSksIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGRzdDsKfQovKioKICogQXBwZW5kIGBrZXlgL2B2YWx1ZWAgdG8gZXhpc3RpbmcgYFRBdHRyaWJ1dGVzYCB0YWtpbmcgcmVnaW9uIG1hcmtlciBhbmQgZHVwbGljYXRlcyBpbnRvIGFjY291bnQuCiAqCiAqIEBwYXJhbSB7P30gZHN0IGBUQXR0cmlidXRlc2AgdG8gYXBwZW5kIHRvLgogKiBAcGFyYW0gez99IG1hcmtlciBSZWdpb24gd2hlcmUgdGhlIGBrZXlgL2B2YWx1ZWAgc2hvdWxkIGJlIGFkZGVkLgogKiBAcGFyYW0gez99IGtleTEgS2V5IHRvIGFkZCB0byBgVEF0dHJpYnV0ZXNgCiAqIEBwYXJhbSB7P30ga2V5MiBLZXkgdG8gYWRkIHRvIGBUQXR0cmlidXRlc2AgKGluIGNhc2Ugb2YgYEF0dHJpYnV0ZU1hcmtlci5OYW1lc3BhY2VVUklgKQogKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIHRvIGFkZCBvciB0byBvdmVyd3JpdGUgdG8gYFRBdHRyaWJ1dGVzYCBPbmx5IHVzZWQgaWYgYG1hcmtlcmAgaXMgbm90IENsYXNzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWVyZ2VIb3N0QXR0cmlidXRlKGRzdCwgbWFya2VyLCBrZXkxLCBrZXkyLCB2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSAwOwogICAgLy8gQXNzdW1lIHRoYXQgbmV3IG1hcmtlcnMgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hcmtlckluc2VydFBvc2l0aW9uID0gZHN0Lmxlbmd0aDsKICAgIC8vIHNjYW4gdW50aWwgY29ycmVjdCB0eXBlLgogICAgaWYgKG1hcmtlciA9PT0gLTEgLyogSW1wbGljaXRBdHRyaWJ1dGVzICovKSB7CiAgICAgICAgbWFya2VySW5zZXJ0UG9zaXRpb24gPSAtMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHdoaWxlIChpIDwgZHN0Lmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRzdFZhbHVlID0gZHN0W2krK107CiAgICAgICAgICAgIGlmICh0eXBlb2YgZHN0VmFsdWUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBpZiAoZHN0VmFsdWUgPT09IG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlckluc2VydFBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RWYWx1ZSA+IG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2F2ZSB0aGlzIGFzIHdlIHdhbnQgdGhlIG1hcmtlcnMgdG8gYmUgaW5zZXJ0ZWQgaW4gc3BlY2lmaWMgb3JkZXIuCiAgICAgICAgICAgICAgICAgICAgbWFya2VySW5zZXJ0UG9zaXRpb24gPSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIHNlYXJjaCB1bnRpbCB5b3UgZmluZCBwbGFjZSBvZiBpbnNlcnRpb24KICAgIHdoaWxlIChpIDwgZHN0Lmxlbmd0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtID0gZHN0W2ldOwogICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgLy8gc2luY2UgYGlgIHN0YXJ0ZWQgYXMgdGhlIGluZGV4IGFmdGVyIHRoZSBtYXJrZXIsIHdlIGRpZCBub3QgZmluZCBpdCBpZiB3ZSBhcmUgYXQgdGhlIG5leHQKICAgICAgICAgICAgLy8gbWFya2VyCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpdGVtID09PSBrZXkxKSB7CiAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBzYW1lIHRva2VuCiAgICAgICAgICAgIGlmIChrZXkyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBkc3RbaSArIDFdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2V5MiA9PT0gZHN0W2kgKyAxXSkgewogICAgICAgICAgICAgICAgZHN0W2kgKyAyXSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEluY3JlbWVudCBjb3VudGVyLgogICAgICAgIGkrKzsKICAgICAgICBpZiAoa2V5MiAhPT0gbnVsbCkKICAgICAgICAgICAgaSsrOwogICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgaSsrOwogICAgfQogICAgLy8gaW5zZXJ0IGF0IGxvY2F0aW9uLgogICAgaWYgKG1hcmtlckluc2VydFBvc2l0aW9uICE9PSAtMSkgewogICAgICAgIGRzdC5zcGxpY2UobWFya2VySW5zZXJ0UG9zaXRpb24sIDAsIG1hcmtlcik7CiAgICAgICAgaSA9IG1hcmtlckluc2VydFBvc2l0aW9uICsgMTsKICAgIH0KICAgIGRzdC5zcGxpY2UoaSsrLCAwLCBrZXkxKTsKICAgIGlmIChrZXkyICE9PSBudWxsKSB7CiAgICAgICAgZHN0LnNwbGljZShpKyssIDAsIGtleTIpOwogICAgfQogICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgZHN0LnNwbGljZShpKyssIDAsIHZhbHVlKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2luamVjdG9yX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vLyBQYXJlbnQgSW5qZWN0b3IgVXRpbHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8qKgogKiBAcGFyYW0gez99IHBhcmVudExvY2F0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBoYXNQYXJlbnRJbmplY3RvcihwYXJlbnRMb2NhdGlvbikgewogICAgcmV0dXJuIHBhcmVudExvY2F0aW9uICE9PSBOT19QQVJFTlRfSU5KRUNUT1I7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGFyZW50TG9jYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9ySW5kZXgocGFyZW50TG9jYXRpb24pIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChwYXJlbnRMb2NhdGlvbikpKSkpICYgMzI3NjcgLyogSW5qZWN0b3JJbmRleE1hc2sgKi87Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGFyZW50TG9jYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChwYXJlbnRMb2NhdGlvbikgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudExvY2F0aW9uKSkpKSkgPj4gMTYgLyogVmlld09mZnNldFNoaWZ0ICovOwp9Ci8qKgogKiBVbndyYXBzIGEgcGFyZW50IGluamVjdG9yIGxvY2F0aW9uIG51bWJlciB0byBmaW5kIHRoZSB2aWV3IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGluamVjdG9yLAogKiB0aGVuIHdhbGtzIHVwIHRoZSBkZWNsYXJhdGlvbiB2aWV3IHRyZWUgdW50aWwgdGhlIHZpZXcgaXMgZm91bmQgdGhhdCBjb250YWlucyB0aGUgcGFyZW50CiAqIGluamVjdG9yLgogKgogKiBAcGFyYW0gez99IGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGluamVjdG9yLCB3aGljaCBjb250YWlucyB0aGUgdmlldyBvZmZzZXQKICogQHBhcmFtIHs/fSBzdGFydFZpZXcgVGhlIExWaWV3IGluc3RhbmNlIGZyb20gd2hpY2ggdG8gc3RhcnQgd2Fsa2luZyB1cCB0aGUgdmlldyB0cmVlCiAqIEByZXR1cm4gez99IFRoZSBMVmlldyBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXJlbnQgaW5qZWN0b3IKICovCmZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9yVmlldyhsb2NhdGlvbiwgc3RhcnRWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdmlld09mZnNldCA9IGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChsb2NhdGlvbik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcGFyZW50VmlldyA9IHN0YXJ0VmlldzsKICAgIC8vIEZvciBtb3N0IGNhc2VzLCB0aGUgcGFyZW50IGluamVjdG9yIGNhbiBiZSBmb3VuZCBvbiB0aGUgaG9zdCBub2RlIChlLmcuIGZvciBjb21wb25lbnQKICAgIC8vIG9yIGNvbnRhaW5lciksIGJ1dCB3ZSBtdXN0IGtlZXAgdGhlIGxvb3AgaGVyZSB0byBzdXBwb3J0IHRoZSByYXJlciBjYXNlIG9mIGRlZXBseSBuZXN0ZWQKICAgIC8vIDxuZy10ZW1wbGF0ZT4gdGFncyBvciBpbmxpbmUgdmlld3MsIHdoZXJlIHRoZSBwYXJlbnQgaW5qZWN0b3IgbWlnaHQgbGl2ZSBtYW55IHZpZXdzCiAgICAvLyBhYm92ZSB0aGUgY2hpbGQgaW5qZWN0b3IuCiAgICB3aGlsZSAodmlld09mZnNldCA+IDApIHsKICAgICAgICBwYXJlbnRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudFZpZXdbREVDTEFSQVRJT05fVklFV10pKTsKICAgICAgICB2aWV3T2Zmc2V0LS07CiAgICB9CiAgICByZXR1cm4gcGFyZW50VmlldzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL21pc2NfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFVzZWQgZm9yIHN0cmluZ2lmeSByZW5kZXIgb3V0cHV0IGluIEl2eS4KICogSW1wb3J0YW50ISBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGFuZCB3ZSBzaG91bGQKICogYmUgZXh0cmEgY2FyZWZ1bCBub3QgdG8gaW50cm9kdWNlIG1lZ2Ftb3JwaGljIHJlYWRzIGluIGl0LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW5kZXJTdHJpbmdpZnkodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgIHJldHVybiAnJzsKICAgIHJldHVybiAnJyArIHZhbHVlOwp9Ci8qKgogKiBVc2VkIHRvIHN0cmluZ2lmeSBhIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBpbiBhbiBlcnJvciBtZXNzYWdlLgogKiBJbXBvcnRhbnQhIFRoaXMgZnVuY3Rpb24gY29udGFpbnMgYSBtZWdhbW9ycGhpYyByZWFkIGFuZCBzaG91bGQgb25seSBiZQogKiB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3RyaW5naWZ5Rm9yRXJyb3IodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpCiAgICAgICAgcmV0dXJuIHZhbHVlLm5hbWUgfHwgdmFsdWUudG9TdHJpbmcoKTsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnR5cGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXR1cm4gdmFsdWUudHlwZS5uYW1lIHx8IHZhbHVlLnR5cGUudG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiByZW5kZXJTdHJpbmdpZnkodmFsdWUpOwp9CmNvbnN0IMm1MCQzID0gLyoqCiAqIEByZXR1cm4gez99CiAqLwooKSA9PiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAvLyBicm93c2VyIG9ubHkKICAgIHNldFRpbWVvdXQgLy8gZXZlcnl0aGluZyBlbHNlCikKICAgIC5iaW5kKF9nbG9iYWwpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGRlZmF1bHRTY2hlZHVsZXIgPSAoKMm1MCQzKSkoKTsKLyoqCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVyZXNvbHZlV2luZG93KGVsZW1lbnQpIHsKICAgIHJldHVybiB7IG5hbWU6ICd3aW5kb3cnLCB0YXJnZXQ6IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB9Owp9Ci8qKgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cmVzb2x2ZURvY3VtZW50KGVsZW1lbnQpIHsKICAgIHJldHVybiB7IG5hbWU6ICdkb2N1bWVudCcsIHRhcmdldDogZWxlbWVudC5vd25lckRvY3VtZW50IH07Cn0KLyoqCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVyZXNvbHZlQm9keShlbGVtZW50KSB7CiAgICByZXR1cm4geyBuYW1lOiAnYm9keScsIHRhcmdldDogZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkgfTsKfQovKioKICogVGhlIHNwZWNpYWwgZGVsaW1pdGVyIHdlIHVzZSB0byBzZXBhcmF0ZSBwcm9wZXJ0eSBuYW1lcywgcHJlZml4ZXMsIGFuZCBzdWZmaXhlcwogKiBpbiBwcm9wZXJ0eSBiaW5kaW5nIG1ldGFkYXRhLiBTZWUgc3RvcmVCaW5kaW5nTWV0YWRhdGEoKS4KICoKICogV2UgaW50ZW50aW9uYWxseSB1c2UgdGhlIFVuaWNvZGUgIlJFUExBQ0VNRU5UIENIQVJBQ1RFUiIgKFUrRkZGRCkgYXMgYSBkZWxpbWl0ZXIKICogYmVjYXVzZSBpdCBpcyBhIHZlcnkgdW5jb21tb24gY2hhcmFjdGVyIHRoYXQgaXMgdW5saWtlbHkgdG8gYmUgcGFydCBvZiBhIHVzZXIncwogKiBwcm9wZXJ0eSBuYW1lcyBvciBpbnRlcnBvbGF0aW9uIHN0cmluZ3MuIElmIGl0IGlzIGluIGZhY3QgdXNlZCBpbiBhIHByb3BlcnR5CiAqIGJpbmRpbmcsIERlYnVnRWxlbWVudC5wcm9wZXJ0aWVzIHdpbGwgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhhdAogKiBiaW5kaW5nLiBIb3dldmVyLCB0aGVyZSBzaG91bGQgYmUgbm8gcnVudGltZSBlZmZlY3QgZm9yIHJlYWwgYXBwbGljYXRpb25zLgogKgogKiBUaGlzIGNoYXJhY3RlciBpcyB0eXBpY2FsbHkgcmVuZGVyZWQgYXMgYSBxdWVzdGlvbiBtYXJrIGluc2lkZSBvZiBhIGRpYW1vbmQuCiAqIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGVjaWFsc18oVW5pY29kZV9ibG9jaykKICoKICogQHR5cGUgez99CiAqLwpjb25zdCBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiA9IGDvv71gOwovKioKICogVW53cmFwIGEgdmFsdWUgd2hpY2ggbWlnaHQgYmUgYmVoaW5kIGEgY2xvc3VyZSAoZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gcmVhc29ucykuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1heWJlVW53cmFwRm4odmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZGkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERlZmluZXMgaWYgdGhlIGNhbGwgdG8gYGluamVjdGAgc2hvdWxkIGluY2x1ZGUgYHZpZXdQcm92aWRlcnNgIGluIGl0cyByZXNvbHV0aW9uLgogKgogKiBUaGlzIGlzIHNldCB0byB0cnVlIHdoZW4gd2UgdHJ5IHRvIGluc3RhbnRpYXRlIGEgY29tcG9uZW50LiBUaGlzIHZhbHVlIGlzIHJlc2V0IGluCiAqIGBnZXROb2RlSW5qZWN0YWJsZWAgdG8gYSB2YWx1ZSB3aGljaCBtYXRjaGVzIHRoZSBkZWNsYXJhdGlvbiBsb2NhdGlvbiBvZiB0aGUgdG9rZW4gYWJvdXQgdG8gYmUKICogaW5zdGFudGlhdGVkLiBUaGlzIGlzIGRvbmUgc28gdGhhdCBpZiB3ZSBhcmUgaW5qZWN0aW5nIGEgdG9rZW4gd2hpY2ggd2FzIGRlY2xhcmVkIG91dHNpZGUgb2YKICogYHZpZXdQcm92aWRlcnNgIHdlIGRvbid0IGFjY2lkZW50YWxseSBwdWxsIGB2aWV3UHJvdmlkZXJzYCBpbi4KICoKICogRXhhbXBsZToKICoKICogYGBgCiAqIFxASW5qZWN0YWJsZSgpCiAqIGNsYXNzIE15U2VydmljZSB7CiAqICAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBTdHJpbmcpIHt9CiAqIH0KICoKICogXEBDb21wb25lbnQoewogKiAgIHByb3ZpZGVyczogWwogKiAgICAgTXlTZXJ2aWNlLAogKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICdwcm92aWRlcnMnIH0KICogICBdCiAqICAgdmlld1Byb3ZpZGVyczogWwogKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICd2aWV3UHJvdmlkZXJzJ30KICogICBdCiAqIH0pCiAqIGNsYXNzIE15Q29tcG9uZW50IHsKICogICBjb25zdHJ1Y3RvcihteVNlcnZpY2U6IE15U2VydmljZSwgdmFsdWU6IFN0cmluZykgewogKiAgICAgLy8gV2UgZXhwZWN0IHRoYXQgQ29tcG9uZW50IGNhbiBzZWUgaW50byBgdmlld1Byb3ZpZGVyc2AuCiAqICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ3ZpZXdQcm92aWRlcnMnKTsKICogICAgIC8vIGBNeVNlcnZpY2VgIHdhcyBub3QgZGVjbGFyZWQgaW4gYHZpZXdQcm92aWRlcnNgIGhlbmNlIGl0IGNhbid0IHNlZSBpdC4KICogICAgIGV4cGVjdChteVNlcnZpY2UudmFsdWUpLnRvRXF1YWwoJ3Byb3ZpZGVycycpOwogKiAgIH0KICogfQogKgogKiBgYGAKICogQHR5cGUgez99CiAqLwpsZXQgaW5jbHVkZVZpZXdQcm92aWRlcnMgPSB0cnVlOwovKioKICogQHBhcmFtIHs/fSB2CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRJbmNsdWRlVmlld1Byb3ZpZGVycyh2KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvbGRWYWx1ZSA9IGluY2x1ZGVWaWV3UHJvdmlkZXJzOwogICAgaW5jbHVkZVZpZXdQcm92aWRlcnMgPSB2OwogICAgcmV0dXJuIG9sZFZhbHVlOwp9Ci8qKgogKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIGVhY2ggYmxvb20gZmlsdGVyICh1c2VkIGJ5IERJKS4gVGhlIGxhcmdlciB0aGlzIG51bWJlciwgdGhlIGZld2VyCiAqIGRpcmVjdGl2ZXMgdGhhdCB3aWxsIHNoYXJlIHNsb3RzLCBhbmQgdGh1cywgdGhlIGZld2VyIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGNoZWNraW5nIGZvcgogKiB0aGUgZXhpc3RlbmNlIG9mIGEgZGlyZWN0aXZlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEJMT09NX1NJWkUgPSAyNTY7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQkxPT01fTUFTSyA9IEJMT09NX1NJWkUgLSAxOwovKioKICogQ291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgZm9yIGRpcmVjdGl2ZXMuCiAqIEB0eXBlIHs/fQogKi8KbGV0IG5leHROZ0VsZW1lbnRJZCA9IDA7Ci8qKgogKiBSZWdpc3RlcnMgdGhpcyBkaXJlY3RpdmUgYXMgcHJlc2VudCBpbiBpdHMgbm9kZSdzIGluamVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBkaXJlY3RpdmUncwogKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgaW5qZWN0b3IncyBibG9vbSBmaWx0ZXIuCiAqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3JJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgaW5qZWN0b3Igd2hlcmUgdGhpcyB0b2tlbiBzaG91bGQgYmUgcmVnaXN0ZXJlZAogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBUVmlldyBmb3IgdGhlIGluamVjdG9yJ3MgYmxvb20gZmlsdGVycwogKiBAcGFyYW0gez99IHR5cGUgVGhlIGRpcmVjdGl2ZSB0b2tlbiB0byByZWdpc3RlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmxvb21BZGQoaW5qZWN0b3JJbmRleCwgdFZpZXcsIHR5cGUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbCh0Vmlldy5maXJzdENyZWF0ZVBhc3MsIHRydWUsICdleHBlY3RlZCBmaXJzdENyZWF0ZVBhc3MgdG8gYmUgdHJ1ZScpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlkID0gdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnID8gKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpW05HX0VMRU1FTlRfSURdIDogdHlwZS5jaGFyQ29kZUF0KDApIHx8IDA7CiAgICAvLyBTZXQgYSB1bmlxdWUgSUQgb24gdGhlIGRpcmVjdGl2ZSB0eXBlLCBzbyBpZiBzb21ldGhpbmcgdHJpZXMgdG8gaW5qZWN0IHRoZSBkaXJlY3RpdmUsCiAgICAvLyB3ZSBjYW4gZWFzaWx5IHJldHJpZXZlIHRoZSBJRCBhbmQgaGFzaCBpdCBpbnRvIHRoZSBibG9vbSBiaXQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4KICAgIGlmIChpZCA9PSBudWxsKSB7CiAgICAgICAgaWQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSlbTkdfRUxFTUVOVF9JRF0gPSBuZXh0TmdFbGVtZW50SWQrKzsKICAgIH0KICAgIC8vIFdlIG9ubHkgaGF2ZSBCTE9PTV9TSVpFICgyNTYpIHNsb3RzIGluIG91ciBibG9vbSBmaWx0ZXIgKDggYnVja2V0cyAqIDMyIGJpdHMgZWFjaCksCiAgICAvLyBzbyBhbGwgdW5pcXVlIElEcyBtdXN0IGJlIG1vZHVsby1lZCBpbnRvIGEgbnVtYmVyIGZyb20gMCAtIDI1NSB0byBmaXQgaW50byB0aGUgZmlsdGVyLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmxvb21CaXQgPSBpZCAmIEJMT09NX01BU0s7CiAgICAvLyBDcmVhdGUgYSBtYXNrIHRoYXQgdGFyZ2V0cyB0aGUgc3BlY2lmaWMgYml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgogICAgLy8gSlMgYml0IG9wZXJhdGlvbnMgYXJlIDMyIGJpdHMsIHNvIHRoaXMgd2lsbCBiZSBhIG51bWJlciBiZXR3ZWVuIDJeMCBhbmQgMl4zMSwgY29ycmVzcG9uZGluZwogICAgLy8gdG8gYml0IHBvc2l0aW9ucyAwIC0gMzEgaW4gYSAzMiBiaXQgaW50ZWdlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1hc2sgPSAxIDw8IGJsb29tQml0OwogICAgLy8gVXNlIHRoZSByYXcgYmxvb21CaXQgbnVtYmVyIHRvIGRldGVybWluZSB3aGljaCBibG9vbSBmaWx0ZXIgYnVja2V0IHdlIHNob3VsZCBjaGVjawogICAgLy8gZS5nOiBiZjAgPSBbMCAtIDMxXSwgYmYxID0gWzMyIC0gNjNdLCBiZjIgPSBbNjQgLSA5NV0sIGJmMyA9IFs5NiAtIDEyN10sIGV0YwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYjcgPSBibG9vbUJpdCAmIDB4ODA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiNiA9IGJsb29tQml0ICYgMHg0MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI1ID0gYmxvb21CaXQgJiAweDIwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YSkpOwogICAgaWYgKGI3KSB7CiAgICAgICAgYjYgPyAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDddIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyA2XSB8PSBtYXNrKSkgOgogICAgICAgICAgICAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDVdIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyA0XSB8PSBtYXNrKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBiNiA/IChiNSA/ICh0RGF0YVtpbmplY3RvckluZGV4ICsgM10gfD0gbWFzaykgOiAodERhdGFbaW5qZWN0b3JJbmRleCArIDJdIHw9IG1hc2spKSA6CiAgICAgICAgICAgIChiNSA/ICh0RGF0YVtpbmplY3RvckluZGV4ICsgMV0gfD0gbWFzaykgOiAodERhdGFbaW5qZWN0b3JJbmRleF0gfD0gbWFzaykpOwogICAgfQp9Ci8qKgogKiBDcmVhdGVzIChvciBnZXRzIGFuIGV4aXN0aW5nKSBpbmplY3RvciBmb3IgYSBnaXZlbiBlbGVtZW50IG9yIGNvbnRhaW5lci4KICoKICogQHBhcmFtIHs/fSB0Tm9kZSBmb3Igd2hpY2ggYW4gaW5qZWN0b3Igc2hvdWxkIGJlIHJldHJpZXZlZCAvIGNyZWF0ZWQuCiAqIEBwYXJhbSB7P30gaG9zdFZpZXcgVmlldyB3aGVyZSB0aGUgbm9kZSBpcyBzdG9yZWQKICogQHJldHVybiB7P30gTm9kZSBpbmplY3RvcgogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCBob3N0VmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXhpc3RpbmdJbmplY3RvckluZGV4ID0gZ2V0SW5qZWN0b3JJbmRleCh0Tm9kZSwgaG9zdFZpZXcpOwogICAgaWYgKGV4aXN0aW5nSW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICByZXR1cm4gZXhpc3RpbmdJbmplY3RvckluZGV4OwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBob3N0Vmlld1tUVklFV107CiAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgdE5vZGUuaW5qZWN0b3JJbmRleCA9IGhvc3RWaWV3Lmxlbmd0aDsKICAgICAgICBpbnNlcnRCbG9vbSh0Vmlldy5kYXRhLCB0Tm9kZSk7IC8vIGZvdW5kYXRpb24gZm9yIG5vZGUgYmxvb20KICAgICAgICBpbnNlcnRCbG9vbShob3N0VmlldywgbnVsbCk7IC8vIGZvdW5kYXRpb24gZm9yIGN1bXVsYXRpdmUgYmxvb20KICAgICAgICBpbnNlcnRCbG9vbSh0Vmlldy5ibHVlcHJpbnQsIG51bGwpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50TG9jID0gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0Tm9kZSwgaG9zdFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0b3JJbmRleCA9IHROb2RlLmluamVjdG9ySW5kZXg7CiAgICAvLyBJZiBhIHBhcmVudCBpbmplY3RvciBjYW4ndCBiZSBmb3VuZCwgaXRzIGxvY2F0aW9uIGlzIHNldCB0byAtMS4KICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgYSBjdW11bGF0aXZlIGJsb29tCiAgICBpZiAoaGFzUGFyZW50SW5qZWN0b3IocGFyZW50TG9jKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IGdldFBhcmVudEluamVjdG9ySW5kZXgocGFyZW50TG9jKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50TFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jLCBob3N0Vmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50TFZpZXdbVFZJRVddLmRhdGEpKTsKICAgICAgICAvLyBDcmVhdGVzIGEgY3VtdWxhdGl2ZSBibG9vbSBmaWx0ZXIgdGhhdCBtZXJnZXMgdGhlIHBhcmVudCdzIGJsb29tIGZpbHRlcgogICAgICAgIC8vIGFuZCBpdHMgb3duIGN1bXVsYXRpdmUgYmxvb20gKHdoaWNoIGNvbnRhaW5zIHRva2VucyBmb3IgYWxsIGFuY2VzdG9ycykKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICAgICBob3N0Vmlld1tpbmplY3RvckluZGV4ICsgaV0gPSBwYXJlbnRMVmlld1twYXJlbnRJbmRleCArIGldIHwgcGFyZW50RGF0YVtwYXJlbnRJbmRleCArIGldOwogICAgICAgIH0KICAgIH0KICAgIGhvc3RWaWV3W2luamVjdG9ySW5kZXggKyBQQVJFTlRfSU5KRUNUT1JdID0gcGFyZW50TG9jOwogICAgcmV0dXJuIGluamVjdG9ySW5kZXg7Cn0KLyoqCiAqIEBwYXJhbSB7P30gYXJyCiAqIEBwYXJhbSB7P30gZm9vdGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnNlcnRCbG9vbShhcnIsIGZvb3RlcikgewogICAgYXJyLnB1c2goMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZm9vdGVyKTsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGhvc3RWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRJbmplY3RvckluZGV4KHROb2RlLCBob3N0VmlldykgewogICAgaWYgKHROb2RlLmluamVjdG9ySW5kZXggPT09IC0xIHx8CiAgICAgICAgLy8gSWYgdGhlIGluamVjdG9yIGluZGV4IGlzIHRoZSBzYW1lIGFzIGl0cyBwYXJlbnQncyBpbmplY3RvciBpbmRleCwgdGhlbiB0aGUgaW5kZXggaGFzIGJlZW4KICAgICAgICAvLyBjb3BpZWQgZG93biBmcm9tIHRoZSBwYXJlbnQgbm9kZS4gTm8gaW5qZWN0b3IgaGFzIGJlZW4gY3JlYXRlZCB5ZXQgb24gdGhpcyBub2RlLgogICAgICAgICh0Tm9kZS5wYXJlbnQgJiYgdE5vZGUucGFyZW50LmluamVjdG9ySW5kZXggPT09IHROb2RlLmluamVjdG9ySW5kZXgpIHx8CiAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHRoZSBpbmplY3RvciBpbmRleCBtaWdodCBleGlzdCBidXQgdGhlIHBhcmVudCB2YWx1ZXMKICAgICAgICAvLyBtaWdodCBub3QgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgeWV0IGZvciB0aGlzIGluc3RhbmNlCiAgICAgICAgaG9zdFZpZXdbdE5vZGUuaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl0gPT0gbnVsbCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0Tm9kZS5pbmplY3RvckluZGV4OwogICAgfQp9Ci8qKgogKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIHBhcmVudCBpbmplY3Rvciwgd2l0aCBhIHZpZXcgb2Zmc2V0IGlmIGFwcGxpY2FibGUuIFVzZWQgdG8gc2V0IHRoZQogKiBwYXJlbnQgaW5qZWN0b3IgaW5pdGlhbGx5LgogKgogKiBSZXR1cm5zIGEgY29tYmluYXRpb24gb2YgbnVtYmVyIG9mIGBWaWV3RGF0YWAgd2UgaGF2ZSB0byBnbyB1cCBhbmQgaW5kZXggaW4gdGhhdCBgVmlld2RhdGFgCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSB2aWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRQYXJlbnRJbmplY3RvckxvY2F0aW9uKHROb2RlLCB2aWV3KSB7CiAgICBpZiAodE5vZGUucGFyZW50ICYmIHROb2RlLnBhcmVudC5pbmplY3RvckluZGV4ICE9PSAtMSkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUucGFyZW50LmluamVjdG9ySW5kZXgpKTsgLy8gVmlld09mZnNldCBpcyAwCiAgICB9CiAgICAvLyBGb3IgbW9zdCBjYXNlcywgdGhlIHBhcmVudCBpbmplY3RvciBpbmRleCBjYW4gYmUgZm91bmQgb24gdGhlIGhvc3Qgbm9kZSAoZS5nLiBmb3IgY29tcG9uZW50CiAgICAvLyBvciBjb250YWluZXIpLCBzbyB0aGlzIGxvb3Agd2lsbCBiZSBza2lwcGVkLCBidXQgd2UgbXVzdCBrZWVwIHRoZSBsb29wIGhlcmUgdG8gc3VwcG9ydAogICAgLy8gdGhlIHJhcmVyIGNhc2Ugb2YgZGVlcGx5IG5lc3RlZCA8bmctdGVtcGxhdGU+IHRhZ3Mgb3IgaW5saW5lIHZpZXdzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGhvc3RUTm9kZSA9IHZpZXdbVF9IT1NUXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aWV3T2Zmc2V0ID0gMTsKICAgIHdoaWxlIChob3N0VE5vZGUgJiYgaG9zdFROb2RlLmluamVjdG9ySW5kZXggPT09IC0xKSB7CiAgICAgICAgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh2aWV3W0RFQ0xBUkFUSU9OX1ZJRVddKSk7CiAgICAgICAgaG9zdFROb2RlID0gdmlldyA/IHZpZXdbVF9IT1NUXSA6IG51bGw7CiAgICAgICAgdmlld09mZnNldCsrOwogICAgfQogICAgcmV0dXJuIGhvc3RUTm9kZSA/CiAgICAgICAgaG9zdFROb2RlLmluamVjdG9ySW5kZXggfCAodmlld09mZnNldCA8PCAxNiAvKiBWaWV3T2Zmc2V0U2hpZnQgKi8pIDoKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoLTEpKTsKfQovKioKICogTWFrZXMgYSB0eXBlIG9yIGFuIGluamVjdGlvbiB0b2tlbiBwdWJsaWMgdG8gdGhlIERJIHN5c3RlbSBieSBhZGRpbmcgaXQgdG8gYW4KICogaW5qZWN0b3IncyBibG9vbSBmaWx0ZXIuCiAqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3JJbmRleAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gdG9rZW4gVGhlIHR5cGUgb3IgdGhlIGluamVjdGlvbiB0b2tlbiB0byBiZSBtYWRlIHB1YmxpYwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGlQdWJsaWNJbkluamVjdG9yKGluamVjdG9ySW5kZXgsIHRWaWV3LCB0b2tlbikgewogICAgYmxvb21BZGQoaW5qZWN0b3JJbmRleCwgdFZpZXcsIHRva2VuKTsKfQovKioKICogSW5qZWN0IHN0YXRpYyBhdHRyaWJ1dGUgdmFsdWUgaW50byBkaXJlY3RpdmUgY29uc3RydWN0b3IuCiAqCiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2l0aCBgZmFjdG9yeWAgZnVuY3Rpb25zIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZgogKiBgZGVmaW5lRGlyZWN0aXZlYCBvciBgZGVmaW5lQ29tcG9uZW50YC4gVGhlIG1ldGhvZCByZXRyaWV2ZXMgdGhlIHN0YXRpYyB2YWx1ZQogKiBvZiBhbiBhdHRyaWJ1dGUuIChEeW5hbWljIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgc2luY2UgdGhleSBhcmUgbm90IHJlc29sdmVkCiAqICBhdCB0aGUgdGltZSBvZiBpbmplY3Rpb24gYW5kIGNhbiBjaGFuZ2Ugb3ZlciB0aW1lLikKICoKICogIyBFeGFtcGxlCiAqIEdpdmVuOgogKiBgYGAKICogXEBDb21wb25lbnQoLi4uKQogKiBjbGFzcyBNeUNvbXBvbmVudCB7CiAqICAgY29uc3RydWN0b3IoXEBBdHRyaWJ1dGUoJ3RpdGxlJykgdGl0bGU6IHN0cmluZykgeyAuLi4gfQogKiB9CiAqIGBgYAogKiBXaGVuIGluc3RhbnRpYXRlZCB3aXRoCiAqIGBgYAogKiA8bXktY29tcG9uZW50IHRpdGxlPSJIZWxsbyI+PC9teS1jb21wb25lbnQ+CiAqIGBgYAogKgogKiBUaGVuIGZhY3RvcnkgbWV0aG9kIGdlbmVyYXRlZCBpczoKICogYGBgCiAqIE15Q29tcG9uZW50Lsm1Y21wID0gZGVmaW5lQ29tcG9uZW50KHsKICogICBmYWN0b3J5OiAoKSA9PiBuZXcgTXlDb21wb25lbnQoaW5qZWN0QXR0cmlidXRlKCd0aXRsZScpKQogKiAgIC4uLgogKiB9KQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGF0dHJOYW1lVG9JbmplY3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluamVjdEF0dHJpYnV0ZUltcGwodE5vZGUsIGF0dHJOYW1lVG9JbmplY3QpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ2V4cGVjdGluZyB0Tm9kZScpOwogICAgaWYgKGF0dHJOYW1lVG9JbmplY3QgPT09ICdjbGFzcycpIHsKICAgICAgICByZXR1cm4gdE5vZGUuY2xhc3NlczsKICAgIH0KICAgIGlmIChhdHRyTmFtZVRvSW5qZWN0ID09PSAnc3R5bGUnKSB7CiAgICAgICAgcmV0dXJuIHROb2RlLnN0eWxlczsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGF0dHJzID0gdE5vZGUuYXR0cnM7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0cnNMZW5ndGggPSBhdHRycy5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IGF0dHJzTGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyc1tpXTsKICAgICAgICAgICAgLy8gSWYgd2UgaGl0IGEgYEJpbmRpbmdzYCBvciBgVGVtcGxhdGVgIG1hcmtlciB0aGVuIHdlIGFyZSBkb25lLgogICAgICAgICAgICBpZiAoaXNOYW1lT25seUF0dHJpYnV0ZU1hcmtlcih2YWx1ZSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gU2tpcCBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgewogICAgICAgICAgICAgICAgLy8gd2Ugc2tpcCB0aGUgbmV4dCB0d28gdmFsdWVzCiAgICAgICAgICAgICAgICAvLyBhcyBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMgbG9va3MgbGlrZQogICAgICAgICAgICAgICAgLy8gWy4uLiwgQXR0cmlidXRlTWFya2VyLk5hbWVzcGFjZVVSSSwgJ2h0dHA6Ly9zb21ldXJpLmNvbS90ZXN0JywgJ3Rlc3Q6ZXhpc3QnLAogICAgICAgICAgICAgICAgLy8gJ2V4aXN0VmFsdWUnLCAuLi5dCiAgICAgICAgICAgICAgICBpID0gaSArIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIG1hcmtlZCBhdHRyaWJ1dGUuCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGF0dHJzTGVuZ3RoICYmIHR5cGVvZiBhdHRyc1tpXSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IGF0dHJOYW1lVG9JbmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaSArIDFdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpID0gaSArIDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gdG9rZW4gZnJvbSB0aGUgTm9kZUluamVjdG9ycyA9PiBNb2R1bGVJbmplY3Rvci4KICoKICogTG9vayBmb3IgdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgdG9rZW4gYnkgd2Fsa2luZyB1cCB0aGUgbm9kZSBpbmplY3RvciB0cmVlIGFuZCB0aGVuCiAqIHRoZSBtb2R1bGUgaW5qZWN0b3IgdHJlZS4KICoKICogVGhpcyBmdW5jdGlvbiBwYXRjaGVzIGB0b2tlbmAgd2l0aCBgX19OR19FTEVNRU5UX0lEX19gIHdoaWNoIGNvbnRhaW5zIHRoZSBpZCBmb3IgdGhlIGJsb29tCiAqIGZpbHRlci4gTmVnYXRpdmUgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBvYmplY3RzLgogKiAgIC0gYC0xYCBpcyByZXNlcnZlZCBmb3IgaW5qZWN0aW5nIGBJbmplY3RvcmAgKGltcGxlbWVudGVkIGJ5IGBOb2RlSW5qZWN0b3JgKQogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHROb2RlIFRoZSBOb2RlIHdoZXJlIHRoZSBzZWFyY2ggZm9yIHRoZSBpbmplY3RvciBzaG91bGQgc3RhcnQKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgYExWaWV3YCB0aGF0IGNvbnRhaW5zIHRoZSBgdE5vZGVgCiAqIEBwYXJhbSB7P30gdG9rZW4gVGhlIHRva2VuIHRvIGxvb2sgZm9yCiAqIEBwYXJhbSB7Pz19IGZsYWdzIEluamVjdGlvbiBmbGFncwogKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gd2hlbiB0aGUgaW5qZWN0aW9uIGZsYWdzIGlzIGBJbmplY3RGbGFncy5PcHRpb25hbGAKICogQHJldHVybiB7P30gdGhlIHZhbHVlIGZyb20gdGhlIGluamVjdG9yLCBgbnVsbGAgd2hlbiBub3QgZm91bmQsIG9yIGBub3RGb3VuZFZhbHVlYCBpZiBwcm92aWRlZAogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVJbmplY3RhYmxlKHROb2RlLCBsVmlldywgdG9rZW4sIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCwgbm90Rm91bmRWYWx1ZSkgewogICAgaWYgKHROb2RlICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJsb29tSGFzaCA9IGJsb29tSGFzaEJpdE9yRmFjdG9yeSh0b2tlbik7CiAgICAgICAgLy8gSWYgdGhlIElEIHN0b3JlZCBoZXJlIGlzIGEgZnVuY3Rpb24sIHRoaXMgaXMgYSBzcGVjaWFsIG9iamVjdCBsaWtlIEVsZW1lbnRSZWYgb3IgVGVtcGxhdGVSZWYKICAgICAgICAvLyBzbyBqdXN0IGNhbGwgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGl0LgogICAgICAgIGlmICh0eXBlb2YgYmxvb21IYXNoID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIGVudGVyREkobFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYmxvb21IYXNoKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhKGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwcm92aWRlciBmb3IgJHtzdHJpbmdpZnlGb3JFcnJvcih0b2tlbil9IWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgbGVhdmVESSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBibG9vbUhhc2ggPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgaWYgKGJsb29tSGFzaCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIGAtMWAgaXMgYSBzcGVjaWFsIHZhbHVlIHVzZWQgdG8gaWRlbnRpZnkgYEluamVjdG9yYCB0eXBlcy4KICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobmV3IE5vZGVJbmplY3Rvcih0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIHRva2VuIGhhcyBhIGJsb29tIGhhc2gsIHRoZW4gaXQgaXMgYSB0b2tlbiB3aGljaCBjb3VsZCBiZSBpbiBOb2RlSW5qZWN0b3IuCiAgICAgICAgICAgIC8vIEEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBpbmplY3RvciBUVmlldyB0aGF0IHdhcyBmb3VuZCB3aGlsZSBjbGltYmluZyB0aGUgZWxlbWVudAogICAgICAgICAgICAvLyBpbmplY3RvciB0cmVlLiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB2aWV3UHJvdmlkZXJzIGNhbiBiZSBhY2Nlc3NlZCBvbiB0aGUgY3VycmVudAogICAgICAgICAgICAvLyBpbmplY3Rvci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJldmlvdXNUVmlldyA9IG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGluamVjdG9ySW5kZXggPSBnZXRJbmplY3RvckluZGV4KHROb2RlLCBsVmlldyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcmVudExvY2F0aW9uID0gTk9fUEFSRU5UX0lOSkVDVE9SOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBob3N0VEVsZW1lbnROb2RlID0gZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0ID8gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddW1RfSE9TVF0gOiBudWxsOwogICAgICAgICAgICAvLyBJZiB3ZSBzaG91bGQgc2tpcCB0aGlzIGluamVjdG9yLCBvciBpZiB0aGVyZSBpcyBubyBpbmplY3RvciBvbiB0aGlzIG5vZGUsIHN0YXJ0IGJ5CiAgICAgICAgICAgIC8vIHNlYXJjaGluZwogICAgICAgICAgICAvLyB0aGUgcGFyZW50IGluamVjdG9yLgogICAgICAgICAgICBpZiAoaW5qZWN0b3JJbmRleCA9PT0gLTEgfHwgZmxhZ3MgJiBJbmplY3RGbGFncy5Ta2lwU2VsZikgewogICAgICAgICAgICAgICAgcGFyZW50TG9jYXRpb24gPSBpbmplY3RvckluZGV4ID09PSAtMSA/IGdldFBhcmVudEluamVjdG9yTG9jYXRpb24odE5vZGUsIGxWaWV3KSA6CiAgICAgICAgICAgICAgICAgICAgbFZpZXdbaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl07CiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNlYXJjaFBhcmVudChmbGFncywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5qZWN0b3JJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUVmlldyA9IGxWaWV3W1RWSUVXXTsKICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gZ2V0UGFyZW50SW5qZWN0b3JJbmRleChwYXJlbnRMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgbFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jYXRpb24sIGxWaWV3KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgaW5qZWN0b3IgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgcG90ZW50aWFsIG1hdGNoIG9yIHVudGlsIHdlIGtub3cgdGhlcmUKICAgICAgICAgICAgLy8gKmlzbid0KiBhIG1hdGNoLgogICAgICAgICAgICB3aGlsZSAoaW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBhcmVudExvY2F0aW9uID0gbFZpZXdbaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl07CiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBpbmplY3Rvci4gSWYgaXQgbWF0Y2hlcywgc2VlIGlmIGl0IGNvbnRhaW5zIHRva2VuLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBpZiAoYmxvb21IYXNUb2tlbihibG9vbUhhc2gsIGluamVjdG9ySW5kZXgsIHRWaWV3LmRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbiBpbmplY3RvciB3aGljaCAqbWF5KiBjb250YWluIHRoZSB0b2tlbiwgc28gd2Ugc3RlcCB0aHJvdWdoCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3ZpZGVycyBhbmQgZGlyZWN0aXZlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGluamVjdG9yJ3MgY29ycmVzcG9uZGluZyBub2RlIHRvIGdldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnN0YW5jZS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBzZWFyY2hUb2tlbnNPbkluamVjdG9yKGluamVjdG9ySW5kZXgsIGxWaWV3LCB0b2tlbiwgcHJldmlvdXNUVmlldywgZmxhZ3MsIGhvc3RURWxlbWVudE5vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSAhPT0gTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2VhcmNoUGFyZW50KGZsYWdzLCBsVmlld1tUVklFV10uZGF0YVtpbmplY3RvckluZGV4ICsgVE5PREVdID09PSBob3N0VEVsZW1lbnROb2RlKSAmJgogICAgICAgICAgICAgICAgICAgIGJsb29tSGFzVG9rZW4oYmxvb21IYXNoLCBpbmplY3RvckluZGV4LCBsVmlldykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmIHdhc24ndCBmb3VuZCBhbnl3aGVyZSBvbiB0aGlzIG5vZGUsIHNvIGl0IHdhcyBhIGZhbHNlIHBvc2l0aXZlLgogICAgICAgICAgICAgICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSB0cmVlIGFuZCBjb250aW51ZSBzZWFyY2hpbmcuCiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUVmlldyA9IHRWaWV3OwogICAgICAgICAgICAgICAgICAgIGluamVjdG9ySW5kZXggPSBnZXRQYXJlbnRJbmplY3RvckluZGV4KHBhcmVudExvY2F0aW9uKTsKICAgICAgICAgICAgICAgICAgICBsVmlldyA9IGdldFBhcmVudEluamVjdG9yVmlldyhwYXJlbnRMb2NhdGlvbiwgbFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc2hvdWxkIG5vdCBzZWFyY2ggcGFyZW50IE9SIElmIHRoZSBhbmNlc3RvciBibG9vbSBmaWx0ZXIgdmFsdWUgZG9lcyBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0aXZlIHdlIGNhbiBnaXZlIHVwIG9uIHRyYXZlcnNpbmcgdXAgdG8gZmluZCB0aGUgc3BlY2lmaWMKICAgICAgICAgICAgICAgICAgICAvLyBpbmplY3Rvci4KICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCAmJiBub3RGb3VuZFZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBUaGlzIG11c3QgYmUgc2V0IG9yIHRoZSBOdWxsSW5qZWN0b3Igd2lsbCB0aHJvdyBmb3Igb3B0aW9uYWwgZGVwcwogICAgICAgIG5vdEZvdW5kVmFsdWUgPSBudWxsOwogICAgfQogICAgaWYgKChmbGFncyAmIChJbmplY3RGbGFncy5TZWxmIHwgSW5qZWN0RmxhZ3MuSG9zdCkpID09PSAwKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1vZHVsZUluamVjdG9yID0gbFZpZXdbSU5KRUNUT1IkMV07CiAgICAgICAgLy8gc3dpdGNoIHRvIGBpbmplY3RJbmplY3Rvck9ubHlgIGltcGxlbWVudGF0aW9uIGZvciBtb2R1bGUgaW5qZWN0b3IsIHNpbmNlIG1vZHVsZSBpbmplY3RvcgogICAgICAgIC8vIHNob3VsZCBub3QgaGF2ZSBhY2Nlc3MgdG8gQ29tcG9uZW50L0RpcmVjdGl2ZSBESSBzY29wZSAodGhhdCBtYXkgaGFwcGVuIHRocm91Z2gKICAgICAgICAvLyBgZGlyZWN0aXZlSW5qZWN0YCBpbXBsZW1lbnRhdGlvbikKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmplY3RJbXBsZW1lbnRhdGlvbiA9IHNldEluamVjdEltcGxlbWVudGF0aW9uKHVuZGVmaW5lZCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKG1vZHVsZUluamVjdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlSW5qZWN0b3IuZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlLCBmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbmplY3RSb290TGltcE1vZGUodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkgewogICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlSW5qZWN0b3I6IE5PVF9GT1VORCBbJHtzdHJpbmdpZnlGb3JFcnJvcih0b2tlbil9XWApOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTk9UX0ZPVU5EID0ge307Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGluamVjdG9ySW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRva2VuCiAqIEBwYXJhbSB7P30gcHJldmlvdXNUVmlldwogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gaG9zdFRFbGVtZW50Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2VhcmNoVG9rZW5zT25JbmplY3RvcihpbmplY3RvckluZGV4LCBsVmlldywgdG9rZW4sIHByZXZpb3VzVFZpZXcsIGZsYWdzLCBob3N0VEVsZW1lbnROb2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjdXJyZW50VFZpZXcgPSBsVmlld1tUVklFV107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50VFZpZXcuZGF0YVtpbmplY3RvckluZGV4ICsgVE5PREVdKSk7CiAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdmlldyBwcm92aWRlcnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSBzdGFydGluZyBlbGVtZW50LgogICAgLy8gVGhlcmUgYXJlIHR3byBwb3NzaWJpdGllcwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2FuQWNjZXNzVmlld1Byb3ZpZGVycyA9IHByZXZpb3VzVFZpZXcgPT0gbnVsbCA/CiAgICAgICAgLy8gMSkgVGhpcyBpcyB0aGUgZmlyc3QgaW52b2NhdGlvbiBgcHJldmlvdXNUVmlldyA9PSBudWxsYCB3aGljaCBtZWFucyB0aGF0IHdlIGFyZSBhdCB0aGUKICAgICAgICAvLyBgVE5vZGVgIG9mIHdoZXJlIGluamVjdG9yIGlzIHN0YXJ0aW5nIHRvIGxvb2suIEluIHN1Y2ggYSBjYXNlIHRoZSBvbmx5IHRpbWUgd2UgYXJlIGFsbG93ZWQKICAgICAgICAvLyB0byBsb29rIGludG8gdGhlIFZpZXdQcm92aWRlcnMgaXMgaWY6CiAgICAgICAgLy8gLSB3ZSBhcmUgb24gYSBjb21wb25lbnQKICAgICAgICAvLyAtIEFORCB0aGUgaW5qZWN0b3Igc2V0IGBpbmNsdWRlVmlld1Byb3ZpZGVyc2AgdG8gdHJ1ZSAoaW1wbHlpbmcgdGhhdCB0aGUgdG9rZW4gY2FuIHNlZQogICAgICAgIC8vIFZpZXdQcm92aWRlcnMgYmVjYXVzZSBpdCBpcyB0aGUgQ29tcG9uZW50IG9yIGEgU2VydmljZSB3aGljaCBpdHNlbGYgd2FzIGRlY2xhcmVkIGluCiAgICAgICAgLy8gVmlld1Byb3ZpZGVycykKICAgICAgICAoaXNDb21wb25lbnRIb3N0KHROb2RlKSAmJiBpbmNsdWRlVmlld1Byb3ZpZGVycykgOgogICAgICAgIC8vIDIpIGBwcmV2aW91c1RWaWV3ICE9IG51bGxgIHdoaWNoIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB3YWxraW5nIGFjcm9zcyB0aGUgcGFyZW50IG5vZGVzLgogICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIHdlIGFyZSBvbmx5IGFsbG93ZWQgdG8gbG9vayBpbnRvIHRoZSBWaWV3UHJvdmlkZXJzIGlmOgogICAgICAgIC8vIC0gV2UganVzdCBjcm9zc2VkIGZyb20gY2hpbGQgVmlldyB0byBQYXJlbnQgVmlldyBgcHJldmlvdXNUVmlldyAhPSBjdXJyZW50VFZpZXdgCiAgICAgICAgLy8gLSBBTkQgdGhlIHBhcmVudCBUTm9kZSBpcyBhbiBFbGVtZW50LgogICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBqdXN0IGNhbWUgZnJvbSB0aGUgQ29tcG9uZW50J3MgVmlldyBhbmQgdGhlcmVmb3JlIGFyZSBhbGxvd2VkIHRvIHNlZQogICAgICAgIC8vIGludG8gdGhlIFZpZXdQcm92aWRlcnMuCiAgICAgICAgKHByZXZpb3VzVFZpZXcgIT0gY3VycmVudFRWaWV3ICYmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pKTsKICAgIC8vIFRoaXMgc3BlY2lhbCBjYXNlIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhIEBob3N0IG9uIHRoZSBpbmplY3QgYW5kIHdoZW4gd2UgYXJlIHNlYXJjaGluZwogICAgLy8gb24gdGhlIGhvc3QgZWxlbWVudCBub2RlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaXNIb3N0U3BlY2lhbENhc2UgPSAoZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0KSAmJiBob3N0VEVsZW1lbnROb2RlID09PSB0Tm9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluamVjdGFibGVJZHggPSBsb2NhdGVEaXJlY3RpdmVPclByb3ZpZGVyKHROb2RlLCBjdXJyZW50VFZpZXcsIHRva2VuLCBjYW5BY2Nlc3NWaWV3UHJvdmlkZXJzLCBpc0hvc3RTcGVjaWFsQ2FzZSk7CiAgICBpZiAoaW5qZWN0YWJsZUlkeCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgY3VycmVudFRWaWV3LCBpbmplY3RhYmxlSWR4LCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gTk9UX0ZPVU5EOwogICAgfQp9Ci8qKgogKiBTZWFyY2hlcyBmb3IgdGhlIGdpdmVuIHRva2VuIGFtb25nIHRoZSBub2RlJ3MgZGlyZWN0aXZlcyBhbmQgcHJvdmlkZXJzLgogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHROb2RlIFROb2RlIG9uIHdoaWNoIGRpcmVjdGl2ZXMgYXJlIHByZXNlbnQuCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIHRWaWV3IHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZwogKiBAcGFyYW0gez99IHRva2VuIFByb3ZpZGVyIHRva2VuIG9yIHR5cGUgb2YgYSBkaXJlY3RpdmUgdG8gbG9vayBmb3IuCiAqIEBwYXJhbSB7P30gY2FuQWNjZXNzVmlld1Byb3ZpZGVycyBXaGV0aGVyIHZpZXcgcHJvdmlkZXJzIHNob3VsZCBiZSBjb25zaWRlcmVkLgogKiBAcGFyYW0gez99IGlzSG9zdFNwZWNpYWxDYXNlIFdoZXRoZXIgdGhlIGhvc3Qgc3BlY2lhbCBjYXNlIGFwcGxpZXMuCiAqIEByZXR1cm4gez99IEluZGV4IG9mIGEgZm91bmQgZGlyZWN0aXZlIG9yIHByb3ZpZGVyLCBvciBudWxsIHdoZW4gbm9uZSBmb3VuZC4KICovCmZ1bmN0aW9uIGxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIodE5vZGUsIHRWaWV3LCB0b2tlbiwgY2FuQWNjZXNzVmlld1Byb3ZpZGVycywgaXNIb3N0U3BlY2lhbENhc2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVQcm92aWRlckluZGV4ZXMgPSB0Tm9kZS5wcm92aWRlckluZGV4ZXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0SW5qZWN0YWJsZXMgPSB0Vmlldy5kYXRhOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0YWJsZXNTdGFydCA9IG5vZGVQcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZXNTdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlyZWN0aXZlRW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3B0Vmlld1Byb3ZpZGVyc0NvdW50ID0gbm9kZVByb3ZpZGVySW5kZXhlcyA+PiAxNiAvKiBDcHRWaWV3UHJvdmlkZXJzQ291bnRTaGlmdCAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0aW5nSW5kZXggPSBjYW5BY2Nlc3NWaWV3UHJvdmlkZXJzID8gaW5qZWN0YWJsZXNTdGFydCA6IGluamVjdGFibGVzU3RhcnQgKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQ7CiAgICAvLyBXaGVuIHRoZSBob3N0IHNwZWNpYWwgY2FzZSBhcHBsaWVzLCBvbmx5IHRoZSB2aWV3UHJvdmlkZXJzIGFuZCB0aGUgY29tcG9uZW50IGFyZSB2aXNpYmxlCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmRJbmRleCA9IGlzSG9zdFNwZWNpYWxDYXNlID8gaW5qZWN0YWJsZXNTdGFydCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCA6IGRpcmVjdGl2ZUVuZDsKICAgIGZvciAobGV0IGkgPSBzdGFydGluZ0luZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm92aWRlclRva2VuT3JEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodEluamVjdGFibGVzW2ldKSk7CiAgICAgICAgaWYgKGkgPCBkaXJlY3RpdmVzU3RhcnQgJiYgdG9rZW4gPT09IHByb3ZpZGVyVG9rZW5PckRlZiB8fAogICAgICAgICAgICBpID49IGRpcmVjdGl2ZXNTdGFydCAmJiAoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyVG9rZW5PckRlZikpKS50eXBlID09PSB0b2tlbikgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXNIb3N0U3BlY2lhbENhc2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRJbmplY3RhYmxlc1tkaXJlY3RpdmVzU3RhcnRdKSk7CiAgICAgICAgaWYgKGRpckRlZiAmJiBpc0NvbXBvbmVudERlZihkaXJEZWYpICYmIGRpckRlZi50eXBlID09PSB0b2tlbikgewogICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlc1N0YXJ0OwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBSZXRyaWV2ZSBvciBpbnN0YW50aWF0ZSB0aGUgaW5qZWN0YWJsZSBmcm9tIHRoZSBgTFZpZXdgIGF0IHBhcnRpY3VsYXIgYGluZGV4YC4KICoKICogVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbnRpYXRlZCBhbmQgaWYgc28gcmV0dXJucyB0aGUKICogY2FjaGVkIGBpbmplY3RhYmxlYC4gT3RoZXJ3aXNlIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgdmFsdWUgaXMgc3RpbGwgYSBmYWN0b3J5IGl0CiAqIGluc3RhbnRpYXRlcyB0aGUgYGluamVjdGFibGVgIGFuZCBjYWNoZXMgdGhlIHZhbHVlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgdFZpZXcsIGluZGV4LCB0Tm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHZhbHVlID0gbFZpZXdbaW5kZXhdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdERhdGEgPSB0Vmlldy5kYXRhOwogICAgaWYgKGlzRmFjdG9yeSh2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHZhbHVlOwogICAgICAgIGlmIChmYWN0b3J5LnJlc29sdmluZykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENpcmN1bGFyIGRlcCBmb3IgJHtzdHJpbmdpZnlGb3JFcnJvcih0RGF0YVtpbmRleF0pfWApOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmNsdWRlVmlld1Byb3ZpZGVycyA9IHNldEluY2x1ZGVWaWV3UHJvdmlkZXJzKGZhY3RvcnkuY2FuU2VlVmlld1Byb3ZpZGVycyk7CiAgICAgICAgZmFjdG9yeS5yZXNvbHZpbmcgPSB0cnVlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcHJldmlvdXNJbmplY3RJbXBsZW1lbnRhdGlvbjsKICAgICAgICBpZiAoZmFjdG9yeS5pbmplY3RJbXBsKSB7CiAgICAgICAgICAgIHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihmYWN0b3J5LmluamVjdEltcGwpOwogICAgICAgIH0KICAgICAgICBlbnRlckRJKGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFsdWUgPSBsVmlld1tpbmRleF0gPSBmYWN0b3J5LmZhY3RvcnkodW5kZWZpbmVkLCB0RGF0YSwgbFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgLy8gVGhpcyBjb2RlIHBhdGggaXMgaGl0IGZvciBib3RoIGRpcmVjdGl2ZXMgYW5kIHByb3ZpZGVycy4KICAgICAgICAgICAgLy8gRm9yIHBlcmYgcmVhc29ucywgd2Ugd2FudCB0byBhdm9pZCBzZWFyY2hpbmcgZm9yIGhvb2tzIG9uIHByb3ZpZGVycy4KICAgICAgICAgICAgLy8gSXQgZG9lcyBubyBoYXJtIHRvIHRyeSAodGhlIGhvb2tzIGp1c3Qgd29uJ3QgZXhpc3QpLCBidXQgdGhlIGV4dHJhCiAgICAgICAgICAgIC8vIGNoZWNrcyBhcmUgdW5uZWNlc3NhcnkgYW5kIHRoaXMgaXMgYSBob3QgcGF0aC4gU28gd2UgY2hlY2sgdG8gc2VlCiAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRleCBvZiB0aGUgZGVwZW5kZW5jeSBpcyBpbiB0aGUgZGlyZWN0aXZlIHJhbmdlIGZvciB0aGlzCiAgICAgICAgICAgIC8vIHROb2RlLiBJZiBpdCdzIG5vdCwgd2Uga25vdyBpdCdzIGEgcHJvdmlkZXIgYW5kIHNraXAgaG9vayByZWdpc3RyYXRpb24uCiAgICAgICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYgaW5kZXggPj0gdE5vZGUuZGlyZWN0aXZlU3RhcnQpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREaXJlY3RpdmVEZWYodERhdGFbaW5kZXhdKTsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlT3JkZXJIb29rcyhpbmRleCwgKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4XSkpLCB0Vmlldyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChmYWN0b3J5LmluamVjdEltcGwpCiAgICAgICAgICAgICAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgICAgICAgICAgc2V0SW5jbHVkZVZpZXdQcm92aWRlcnMocHJldmlvdXNJbmNsdWRlVmlld1Byb3ZpZGVycyk7CiAgICAgICAgICAgIGZhY3RvcnkucmVzb2x2aW5nID0gZmFsc2U7CiAgICAgICAgICAgIGxlYXZlREkoKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KLyoqCiAqIFJldHVybnMgdGhlIGJpdCBpbiBhbiBpbmplY3RvcidzIGJsb29tIGZpbHRlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdAogKiB0aGUgZGlyZWN0aXZlIG1pZ2h0IGJlIHByb3ZpZGVkIGJ5IHRoZSBpbmplY3Rvci4KICoKICogV2hlbiBhIGRpcmVjdGl2ZSBpcyBwdWJsaWMsIGl0IGlzIGFkZGVkIHRvIHRoZSBibG9vbSBmaWx0ZXIgYW5kIGdpdmVuIGEgdW5pcXVlIElEIHRoYXQgY2FuIGJlCiAqIHJldHJpZXZlZCBvbiB0aGUgVHlwZS4gV2hlbiB0aGUgZGlyZWN0aXZlIGlzbid0IHB1YmxpYyBvciB0aGUgdG9rZW4gaXMgbm90IGEgZGlyZWN0aXZlIGBudWxsYAogKiBpcyByZXR1cm5lZCBhcyB0aGUgbm9kZSBpbmplY3RvciBjYW4gbm90IHBvc3NpYmx5IHByb3ZpZGUgdGhhdCB0b2tlbi4KICoKICogQHBhcmFtIHs/fSB0b2tlbiB0aGUgaW5qZWN0aW9uIHRva2VuCiAqIEByZXR1cm4gez99IHRoZSBtYXRjaGluZyBiaXQgdG8gY2hlY2sgaW4gdGhlIGJsb29tIGZpbHRlciBvciBgbnVsbGAgaWYgdGhlIHRva2VuIGlzIG5vdCBrbm93bi4KICogICBXaGVuIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBuZWdhdGl2ZSB0aGVuIGl0IHJlcHJlc2VudHMgc3BlY2lhbCB2YWx1ZXMgc3VjaCBhcyBgSW5qZWN0b3JgLgogKi8KZnVuY3Rpb24gYmxvb21IYXNoQml0T3JGYWN0b3J5KHRva2VuKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0b2tlbiwgJ3Rva2VuIG11c3QgYmUgZGVmaW5lZCcpOwogICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gdG9rZW4uY2hhckNvZGVBdCgwKSB8fCAwOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdG9rZW5JZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodG9rZW4pKSlbTkdfRUxFTUVOVF9JRF07CiAgICAvLyBOZWdhdGl2ZSB0b2tlbiBJRHMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgb2JqZWN0cyBzdWNoIGFzIGBJbmplY3RvcmAKICAgIHJldHVybiAodHlwZW9mIHRva2VuSWQgPT09ICdudW1iZXInICYmIHRva2VuSWQgPiAwKSA/IHRva2VuSWQgJiBCTE9PTV9NQVNLIDogdG9rZW5JZDsKfQovKioKICogQHBhcmFtIHs/fSBibG9vbUhhc2gKICogQHBhcmFtIHs/fSBpbmplY3RvckluZGV4CiAqIEBwYXJhbSB7P30gaW5qZWN0b3JWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBibG9vbUhhc1Rva2VuKGJsb29tSGFzaCwgaW5qZWN0b3JJbmRleCwgaW5qZWN0b3JWaWV3KSB7CiAgICAvLyBDcmVhdGUgYSBtYXNrIHRoYXQgdGFyZ2V0cyB0aGUgc3BlY2lmaWMgYml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlIHdlJ3JlIGxvb2tpbmcgZm9yLgogICAgLy8gSlMgYml0IG9wZXJhdGlvbnMgYXJlIDMyIGJpdHMsIHNvIHRoaXMgd2lsbCBiZSBhIG51bWJlciBiZXR3ZWVuIDJeMCBhbmQgMl4zMSwgY29ycmVzcG9uZGluZwogICAgLy8gdG8gYml0IHBvc2l0aW9ucyAwIC0gMzEgaW4gYSAzMiBiaXQgaW50ZWdlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1hc2sgPSAxIDw8IGJsb29tSGFzaDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI3ID0gYmxvb21IYXNoICYgMHg4MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI2ID0gYmxvb21IYXNoICYgMHg0MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI1ID0gYmxvb21IYXNoICYgMHgyMDsKICAgIC8vIE91ciBibG9vbSBmaWx0ZXIgc2l6ZSBpcyAyNTYgYml0cywgd2hpY2ggaXMgZWlnaHQgMzItYml0IGJsb29tIGZpbHRlciBidWNrZXRzOgogICAgLy8gYmYwID0gWzAgLSAzMV0sIGJmMSA9IFszMiAtIDYzXSwgYmYyID0gWzY0IC0gOTVdLCBiZjMgPSBbOTYgLSAxMjddLCBldGMuCiAgICAvLyBHZXQgdGhlIGJsb29tIGZpbHRlciB2YWx1ZSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBidWNrZXQgYmFzZWQgb24gdGhlIGRpcmVjdGl2ZSdzIGJsb29tQml0LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHZhbHVlOwogICAgaWYgKGI3KSB7CiAgICAgICAgdmFsdWUgPSBiNiA/IChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgN10gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDZdKSA6CiAgICAgICAgICAgIChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgNV0gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDRdKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHZhbHVlID0gYjYgPyAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDNdIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXggKyAyXSkgOgogICAgICAgICAgICAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDFdIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXhdKTsKICAgIH0KICAgIC8vIElmIHRoZSBibG9vbSBmaWx0ZXIgdmFsdWUgaGFzIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0aXZlJ3MgYmxvb21CaXQgZmxpcHBlZCBvbiwKICAgIC8vIHRoaXMgaW5qZWN0b3IgaXMgYSBwb3RlbnRpYWwgbWF0Y2guCiAgICByZXR1cm4gISEodmFsdWUgJiBtYXNrKTsKfQovKioKICogUmV0dXJucyB0cnVlIGlmIGZsYWdzIHByZXZlbnQgcGFyZW50IGluamVjdG9yIGZyb20gYmVpbmcgc2VhcmNoZWQgZm9yIHRva2VucwogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gaXNGaXJzdEhvc3RUTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2hvdWxkU2VhcmNoUGFyZW50KGZsYWdzLCBpc0ZpcnN0SG9zdFROb2RlKSB7CiAgICByZXR1cm4gIShmbGFncyAmIEluamVjdEZsYWdzLlNlbGYpICYmICEoZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0ICYmIGlzRmlyc3RIb3N0VE5vZGUpOwp9CmNsYXNzIE5vZGVJbmplY3RvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ROb2RlCiAgICAgKiBAcGFyYW0gez99IF9sVmlldwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfdE5vZGUsIF9sVmlldykgewogICAgICAgIHRoaXMuX3ROb2RlID0gX3ROb2RlOwogICAgICAgIHRoaXMuX2xWaWV3ID0gX2xWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICByZXR1cm4gZ2V0T3JDcmVhdGVJbmplY3RhYmxlKHRoaXMuX3ROb2RlLCB0aGlzLl9sVmlldywgdG9rZW4sIHVuZGVmaW5lZCwgbm90Rm91bmRWYWx1ZSk7CiAgICB9Cn0KLyoqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVnZXRGYWN0b3J5T2YodHlwZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdHlwZUFueSA9ICgvKiogQHR5cGUgez99ICovICh0eXBlKSk7CiAgICBpZiAoaXNGb3J3YXJkUmVmKHR5cGUpKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSDJtcm1Z2V0RmFjdG9yeU9mKHJlc29sdmVGb3J3YXJkUmVmKHR5cGVBbnkpKTsKICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkgPyBmYWN0b3J5KCkgOiBudWxsOwogICAgICAgIH0pKSkpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZhY3RvcnkgPSBnZXRGYWN0b3J5RGVmKHR5cGVBbnkpOwogICAgaWYgKGZhY3RvcnkgPT09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5qZWN0b3JEZWYgPSBnZXRJbmplY3RvckRlZih0eXBlQW55KTsKICAgICAgICBmYWN0b3J5ID0gaW5qZWN0b3JEZWYgJiYgaW5qZWN0b3JEZWYuZmFjdG9yeTsKICAgIH0KICAgIHJldHVybiBmYWN0b3J5IHx8IG51bGw7Cn0KLyoqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KHR5cGUpIHsKICAgIHJldHVybiBub1NpZGVFZmZlY3RzKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHR5cGUucHJvdG90eXBlKS5jb25zdHJ1Y3RvcikpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmYWN0b3J5ID0gKCgvKiogQHR5cGUgez99ICovIChwcm90bykpKVtOR19GQUNUT1JZX0RFRl0gfHwgybXJtWdldEZhY3RvcnlPZihwcm90byk7CiAgICAgICAgaWYgKGZhY3RvcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBmYWN0b3J5IGRlZmluZWQuIEVpdGhlciB0aGlzIHdhcyBpbXByb3BlciB1c2FnZSBvZiBpbmhlcml0YW5jZQogICAgICAgICAgICAvLyAobm8gQW5ndWxhciBkZWNvcmF0b3Igb24gdGhlIHN1cGVyY2xhc3MpIG9yIHRoZXJlIGlzIG5vIGNvbnN0cnVjdG9yIGF0IGFsbAogICAgICAgICAgICAvLyBpbiB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uIFNpbmNlIHRoZSB0d28gY2FzZXMgY2Fubm90IGJlIGRpc3Rpbmd1aXNoZWQsIHRoZQogICAgICAgICAgICAvLyBsYXR0ZXIgaGFzIHRvIGJlIGFzc3VtZWQuCiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHQpID0+IG5ldyB0KCkpOwogICAgICAgIH0KICAgIH0pKTsKfQpjb25zdCBFUlJPUl9ERUJVR19DT05URVhUID0gJ25nRGVidWdDb250ZXh0JzsKY29uc3QgRVJST1JfT1JJR0lOQUxfRVJST1IgPSAnbmdPcmlnaW5hbEVycm9yJzsKY29uc3QgRVJST1JfTE9HR0VSID0gJ25nRXJyb3JMb2dnZXInOwpmdW5jdGlvbiB3cmFwcGVkRXJyb3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikgewogICAgY29uc3QgbXNnID0gYCR7bWVzc2FnZX0gY2F1c2VkIGJ5OiAke29yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IG9yaWdpbmFsRXJyb3IubWVzc2FnZSA6IG9yaWdpbmFsRXJyb3J9YDsKICAgIGNvbnN0IGVycm9yID0gRXJyb3IobXNnKTsKICAgIGVycm9yW0VSUk9SX09SSUdJTkFMX0VSUk9SXSA9IG9yaWdpbmFsRXJyb3I7CiAgICByZXR1cm4gZXJyb3I7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXJyb3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERlYnVnQ29udGV4dChlcnJvcikgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoZXJyb3IpKSlbRVJST1JfREVCVUdfQ09OVEVYVF07Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXJyb3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE9yaWdpbmFsRXJyb3IoZXJyb3IpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX09SSUdJTkFMX0VSUk9SXTsKfQovKioKICogQHBhcmFtIHs/fSBlcnJvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RXJyb3JMb2dnZXIoZXJyb3IpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX0xPR0dFUl0gfHwgZGVmYXVsdEVycm9yTG9nZ2VyOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbnNvbGUKICogQHBhcmFtIHsuLi4/fSB2YWx1ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlZmF1bHRFcnJvckxvZ2dlcihjb25zb2xlLCAuLi52YWx1ZXMpIHsKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS5lcnJvcikpKSguLi52YWx1ZXMpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9lcnJvcl9oYW5kbGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBQcm92aWRlcyBhIGhvb2sgZm9yIGNlbnRyYWxpemVkIGV4Y2VwdGlvbiBoYW5kbGluZy4KICoKICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYEVycm9ySGFuZGxlcmAgcHJpbnRzIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBgY29uc29sZWAuIFRvCiAqIGludGVyY2VwdCBlcnJvciBoYW5kbGluZywgd3JpdGUgYSBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCByZXBsYWNlcyB0aGlzIGRlZmF1bHQgYXMKICogYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgCiAqIGNsYXNzIE15RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKICogICBoYW5kbGVFcnJvcihlcnJvcikgewogKiAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIGV4Y2VwdGlvbgogKiAgIH0KICogfQogKgogKiBcQE5nTW9kdWxlKHsKICogICBwcm92aWRlcnM6IFt7cHJvdmlkZTogRXJyb3JIYW5kbGVyLCB1c2VDbGFzczogTXlFcnJvckhhbmRsZXJ9XQogKiB9KQogKiBjbGFzcyBNeU1vZHVsZSB7fQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEVycm9ySGFuZGxlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fY29uc29sZSA9IGNvbnNvbGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhbmRsZUVycm9yKGVycm9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSB0aGlzLl9maW5kT3JpZ2luYWxFcnJvcihlcnJvcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9maW5kQ29udGV4dChlcnJvcik7CiAgICAgICAgLy8gTm90ZTogQnJvd3NlciBjb25zb2xlcyBzaG93IHRoZSBwbGFjZSBmcm9tIHdoZXJlIGNvbnNvbGUuZXJyb3Igd2FzIGNhbGxlZC4KICAgICAgICAvLyBXZSBjYW4gdXNlIHRoaXMgdG8gZ2l2ZSB1c2VycyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb3JMb2dnZXIgPSBnZXRFcnJvckxvZ2dlcihlcnJvcik7CiAgICAgICAgZXJyb3JMb2dnZXIodGhpcy5fY29uc29sZSwgYEVSUk9SYCwgZXJyb3IpOwogICAgICAgIGlmIChvcmlnaW5hbEVycm9yKSB7CiAgICAgICAgICAgIGVycm9yTG9nZ2VyKHRoaXMuX2NvbnNvbGUsIGBPUklHSU5BTCBFUlJPUmAsIG9yaWdpbmFsRXJyb3IpOwogICAgICAgIH0KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBlcnJvckxvZ2dlcih0aGlzLl9jb25zb2xlLCAnRVJST1IgQ09OVEVYVCcsIGNvbnRleHQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2ZpbmRDb250ZXh0KGVycm9yKSB7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiBnZXREZWJ1Z0NvbnRleHQoZXJyb3IpID8gZ2V0RGVidWdDb250ZXh0KGVycm9yKSA6CiAgICAgICAgICAgICAgICB0aGlzLl9maW5kQ29udGV4dChnZXRPcmlnaW5hbEVycm9yKGVycm9yKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZmluZE9yaWdpbmFsRXJyb3IoZXJyb3IpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGUgPSBnZXRPcmlnaW5hbEVycm9yKGVycm9yKTsKICAgICAgICB3aGlsZSAoZSAmJiBnZXRPcmlnaW5hbEVycm9yKGUpKSB7CiAgICAgICAgICAgIGUgPSBnZXRPcmlnaW5hbEVycm9yKGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KfQovKioKICogRGVmaW5lcyBhIHNjaGVtYSB0aGF0IGFsbG93cyBhbiBOZ01vZHVsZSB0byBjb250YWluIHRoZSBmb2xsb3dpbmc6CiAqIC0gTm9uLUFuZ3VsYXIgZWxlbWVudHMgbmFtZWQgd2l0aCBkYXNoIGNhc2UgKGAtYCkuCiAqIC0gRWxlbWVudCBwcm9wZXJ0aWVzIG5hbWVkIHdpdGggZGFzaCBjYXNlIChgLWApLgogKiBEYXNoIGNhc2UgaXMgdGhlIG5hbWluZyBjb252ZW50aW9uIGZvciBjdXN0b20gZWxlbWVudHMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSA9IHsKICAgIG5hbWU6ICdjdXN0b20tZWxlbWVudHMnCn07Ci8qKgogKiBEZWZpbmVzIGEgc2NoZW1hIHRoYXQgYWxsb3dzIGFueSBwcm9wZXJ0eSBvbiBhbnkgZWxlbWVudC4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBOT19FUlJPUlNfU0NIRU1BID0gewogICAgbmFtZTogJ25vLWVycm9ycy1zY2hlbWEnCn07Ci8qKgogKiBAYWJzdHJhY3QKICovCmNsYXNzIFNhZmVWYWx1ZUltcGwgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHkKICAgICAqLwogICAgY29uc3RydWN0b3IoY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSkgewogICAgICAgIHRoaXMuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSA9IGNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiBgU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzogJHt0aGlzLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHl9YCArCiAgICAgICAgICAgIGAgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYDsKICAgIH0KfQpjbGFzcyBTYWZlSHRtbEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJIVE1MIiAvKiBIdG1sICovOwogICAgfQp9CmNsYXNzIFNhZmVTdHlsZUltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJTdHlsZSIgLyogU3R5bGUgKi87CiAgICB9Cn0KY2xhc3MgU2FmZVNjcmlwdEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJTY3JpcHQiIC8qIFNjcmlwdCAqLzsKICAgIH0KfQpjbGFzcyBTYWZlVXJsSW1wbCBleHRlbmRzIFNhZmVWYWx1ZUltcGwgewogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRUeXBlTmFtZSgpIHsKICAgICAgICByZXR1cm4gIlVSTCIgLyogVXJsICovOwogICAgfQp9CmNsYXNzIFNhZmVSZXNvdXJjZVVybEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJSZXNvdXJjZVVSTCIgLyogUmVzb3VyY2VVcmwgKi87CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2FmZVZhbHVlSW1wbCA/ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSkpKSkgOgogICAgICAgICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgdHlwZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWN0dWFsVHlwZSA9IGdldFNhbml0aXphdGlvbkJ5cGFzc1R5cGUodmFsdWUpOwogICAgaWYgKGFjdHVhbFR5cGUgIT0gbnVsbCAmJiBhY3R1YWxUeXBlICE9PSB0eXBlKSB7CiAgICAgICAgLy8gQWxsb3cgUmVzb3VyY2VVUkxzIGluIFVSTCBjb250ZXh0cywgdGhleSBhcmUgc3RyaWN0bHkgbW9yZSB0cnVzdGVkLgogICAgICAgIGlmIChhY3R1YWxUeXBlID09PSAiUmVzb3VyY2VVUkwiIC8qIFJlc291cmNlVXJsICovICYmIHR5cGUgPT09ICJVUkwiIC8qIFVybCAqLykKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhIHNhZmUgJHt0eXBlfSwgZ290IGEgJHthY3R1YWxUeXBlfSAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgKTsKICAgIH0KICAgIHJldHVybiBhY3R1YWxUeXBlID09PSB0eXBlOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRTYW5pdGl6YXRpb25CeXBhc3NUeXBlKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBTYWZlVmFsdWVJbXBsICYmICgvKiogQHR5cGUgez99ICovICh2YWx1ZS5nZXRUeXBlTmFtZSgpKSkgfHwgbnVsbDsKfQovKioKICogTWFyayBgaHRtbGAgc3RyaW5nIGFzIHRydXN0ZWQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXQKICogcmVjb2duaXphYmxlIHRvIHtcQGxpbmsgaHRtbFNhbml0aXplcn0gdG8gYmUgdHJ1c3RlZCBpbXBsaWNpdGx5LgogKgogKiBAcGFyYW0gez99IHRydXN0ZWRIdG1sIGBodG1sYCBzdHJpbmcgd2hpY2ggbmVlZHMgdG8gYmUgaW1wbGljaXRseSB0cnVzdGVkLgogKiBAcmV0dXJuIHs/fSBhIGBodG1sYCB3aGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICovCmZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0SHRtbCh0cnVzdGVkSHRtbCkgewogICAgcmV0dXJuIG5ldyBTYWZlSHRtbEltcGwodHJ1c3RlZEh0bWwpOwp9Ci8qKgogKiBNYXJrIGBzdHlsZWAgc3RyaW5nIGFzIHRydXN0ZWQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXQKICogcmVjb2duaXphYmxlIHRvIHtcQGxpbmsgc3R5bGVTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS4KICoKICogQHBhcmFtIHs/fSB0cnVzdGVkU3R5bGUgYHN0eWxlYCBzdHJpbmcgd2hpY2ggbmVlZHMgdG8gYmUgaW1wbGljaXRseSB0cnVzdGVkLgogKiBAcmV0dXJuIHs/fSBhIGBzdHlsZWAgaGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICovCmZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U3R5bGUodHJ1c3RlZFN0eWxlKSB7CiAgICByZXR1cm4gbmV3IFNhZmVTdHlsZUltcGwodHJ1c3RlZFN0eWxlKTsKfQovKioKICogTWFyayBgc2NyaXB0YCBzdHJpbmcgYXMgdHJ1c3RlZC4KICoKICogVGhpcyBmdW5jdGlvbiB3cmFwcyB0aGUgdHJ1c3RlZCBzdHJpbmcgaW4gYFN0cmluZ2AgYW5kIGJyYW5kcyBpdCBpbiBhIHdheSB3aGljaCBtYWtlcyBpdAogKiByZWNvZ25pemFibGUgdG8ge1xAbGluayBzY3JpcHRTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS4KICoKICogQHBhcmFtIHs/fSB0cnVzdGVkU2NyaXB0IGBzY3JpcHRgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqIEByZXR1cm4gez99IGEgYHNjcmlwdGAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqLwpmdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFNjcmlwdCh0cnVzdGVkU2NyaXB0KSB7CiAgICByZXR1cm4gbmV3IFNhZmVTY3JpcHRJbXBsKHRydXN0ZWRTY3JpcHQpOwp9Ci8qKgogKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0cnVzdGVkIHN0cmluZyBpbiBgU3RyaW5nYCBhbmQgYnJhbmRzIGl0IGluIGEgd2F5IHdoaWNoIG1ha2VzIGl0CiAqIHJlY29nbml6YWJsZSB0byB7XEBsaW5rIHVybFNhbml0aXplcn0gdG8gYmUgdHJ1c3RlZCBpbXBsaWNpdGx5LgogKgogKiBAcGFyYW0gez99IHRydXN0ZWRVcmwgYHVybGAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICogQHJldHVybiB7P30gYSBgdXJsYCAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqLwpmdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybCh0cnVzdGVkVXJsKSB7CiAgICByZXR1cm4gbmV3IFNhZmVVcmxJbXBsKHRydXN0ZWRVcmwpOwp9Ci8qKgogKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0cnVzdGVkIHN0cmluZyBpbiBgU3RyaW5nYCBhbmQgYnJhbmRzIGl0IGluIGEgd2F5IHdoaWNoIG1ha2VzIGl0CiAqIHJlY29nbml6YWJsZSB0byB7XEBsaW5rIHJlc291cmNlVXJsU2FuaXRpemVyfSB0byBiZSB0cnVzdGVkIGltcGxpY2l0bHkuCiAqCiAqIEBwYXJhbSB7P30gdHJ1c3RlZFJlc291cmNlVXJsIGB1cmxgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqIEByZXR1cm4gez99IGEgYHVybGAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqLwpmdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFJlc291cmNlVXJsKHRydXN0ZWRSZXNvdXJjZVVybCkgewogICAgcmV0dXJuIG5ldyBTYWZlUmVzb3VyY2VVcmxJbXBsKHRydXN0ZWRSZXNvdXJjZVVybCk7Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGNvbnRyb2wgaWYgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIHBpcGVsaW5lIHNob3VsZCBiZSBgVmlld0VuZ2luZWAgb3IgYEl2eWAuCiAqCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gYW5kIGRlYnVnIHRlc3RzIHdpdGggZWl0aGVyIEl2eSBvciBWaWV3IEVuZ2luZSAobGVnYWN5KSwKICogcGxlYXNlIHNlZSBbQkFaRUwubWRdKC4vZG9jcy9CQVpFTC5tZCkuCiAqLwpsZXQgX2Rldk1vZGUgPSB0cnVlOwpsZXQgX3J1bk1vZGVMb2NrZWQgPSBmYWxzZTsKLyoqCiAqIFJldHVybnMgd2hldGhlciBBbmd1bGFyIGlzIGluIGRldmVsb3BtZW50IG1vZGUuIEFmdGVyIGNhbGxlZCBvbmNlLAogKiB0aGUgdmFsdWUgaXMgbG9ja2VkIGFuZCB3b24ndCBjaGFuZ2UgYW55IG1vcmUuCiAqCiAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdHJ1ZSwgdW5sZXNzIGEgdXNlciBjYWxscyBgZW5hYmxlUHJvZE1vZGVgIGJlZm9yZSBjYWxsaW5nIHRoaXMuCiAqCiAqIEBwdWJsaWNBcGkKICovCmZ1bmN0aW9uIGlzRGV2TW9kZSgpIHsKICAgIF9ydW5Nb2RlTG9ja2VkID0gdHJ1ZTsKICAgIHJldHVybiBfZGV2TW9kZTsKfQovKioKICogRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyCiAqIGNoZWNrcyB3aXRoaW4gdGhlIGZyYW1ld29yay4KICoKICogT25lIGltcG9ydGFudCBhc3NlcnRpb24gdGhpcyBkaXNhYmxlcyB2ZXJpZmllcyB0aGF0IGEgY2hhbmdlIGRldGVjdGlvbiBwYXNzCiAqIGRvZXMgbm90IHJlc3VsdCBpbiBhZGRpdGlvbmFsIGNoYW5nZXMgdG8gYW55IGJpbmRpbmdzIChhbHNvIGtub3duIGFzCiAqIHVuaWRpcmVjdGlvbmFsIGRhdGEgZmxvdykuCiAqCiAqIEBwdWJsaWNBcGkKICovCmZ1bmN0aW9uIGVuYWJsZVByb2RNb2RlKCkgewogICAgaWYgKF9ydW5Nb2RlTG9ja2VkKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZW5hYmxlIHByb2QgbW9kZSBhZnRlciBwbGF0Zm9ybSBzZXR1cC4nKTsKICAgIH0KICAgIF9kZXZNb2RlID0gZmFsc2U7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi9pbmVydF9ib2R5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gZ2V0IGhvbGQgb2YgYW4gaW5lcnQgdHJlZSBvZiBET00gZWxlbWVudHMgY29udGFpbmluZyBkaXJ0eSBIVE1MCiAqIHRoYXQgbmVlZHMgc2FuaXRpemluZy4KICogRGVwZW5kaW5nIHVwb24gYnJvd3NlciBzdXBwb3J0IHdlIG11c3QgdXNlIG9uZSBvZiB0aHJlZSBzdHJhdGVnaWVzIGZvciBkb2luZyB0aGlzLgogKiBTdXBwb3J0OiBTYWZhcmkgMTAueCAtPiBYSFIgc3RyYXRlZ3kKICogU3VwcG9ydDogRmlyZWZveCAtPiBEb21QYXJzZXIgc3RyYXRlZ3kKICogRGVmYXVsdDogSW5lcnREb2N1bWVudCBzdHJhdGVneQogKi8KY2xhc3MgSW5lcnRCb2R5SGVscGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZWZhdWx0RG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRlZmF1bHREb2MpIHsKICAgICAgICB0aGlzLmRlZmF1bHREb2MgPSBkZWZhdWx0RG9jOwogICAgICAgIHRoaXMuaW5lcnREb2N1bWVudCA9IHRoaXMuZGVmYXVsdERvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3Nhbml0aXphdGlvbi1pbmVydCcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuaW5lcnREb2N1bWVudC5ib2R5OwogICAgICAgIGlmIChpbmVydEJvZHlFbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gdXN1YWxseSB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgYm9keSBlbGVtZW50IGluIHRoZSBkb2N1bWVudCwgYnV0IElFIGRvZXNuJ3QgaGF2ZSBhbnksIHNvCiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIG9uZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmVydEh0bWwgPSB0aGlzLmluZXJ0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHRtbCcpOwogICAgICAgICAgICB0aGlzLmluZXJ0RG9jdW1lbnQuYXBwZW5kQ2hpbGQoaW5lcnRIdG1sKTsKICAgICAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7CiAgICAgICAgICAgIGluZXJ0SHRtbC5hcHBlbmRDaGlsZChpbmVydEJvZHlFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgaW5lcnRCb2R5RWxlbWVudC5pbm5lckhUTUwgPSAnPHN2Zz48ZyBvbmxvYWQ9InRoaXMucGFyZW50Tm9kZS5yZW1vdmUoKSI+PC9nPjwvc3ZnPic7CiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3RvciAmJiAhaW5lcnRCb2R5RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKSkgewogICAgICAgICAgICAvLyBXZSBqdXN0IGhpdCB0aGUgU2FmYXJpIDEwLjEgYnVnIC0gd2hpY2ggYWxsb3dzIEpTIHRvIHJ1biBpbnNpZGUgdGhlIFNWRyBHIGVsZW1lbnQKICAgICAgICAgICAgLy8gc28gdXNlIHRoZSBYSFIgc3RyYXRlZ3kuCiAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9YSFI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaW5lcnRCb2R5RWxlbWVudC5pbm5lckhUTUwgPSAnPHN2Zz48cD48c3R5bGU+PGltZyBzcmM9Ijwvc3R5bGU+PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpLy8iPic7CiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3RvciAmJiBpbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZyBpbWcnKSkgewogICAgICAgICAgICAvLyBXZSBqdXN0IGhpdCB0aGUgRmlyZWZveCBidWcgLSB3aGljaCBwcmV2ZW50cyB0aGUgaW5uZXIgaW1nIEpTIGZyb20gYmVpbmcgc2FuaXRpemVkCiAgICAgICAgICAgIC8vIHNvIHVzZSB0aGUgRE9NUGFyc2VyIHN0cmF0ZWd5LCBpZiBpdCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgIC8vIElmIHRoZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHdlIGFyZSBub3QgaW4gRmlyZWZveCAoU2VydmVyL1dlYldvcmtlcj8pIHNvIHdlCiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzdHJhdGVneSBiZWxvdy4KICAgICAgICAgICAgaWYgKGlzRE9NUGFyc2VyQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9ET01QYXJzZXI7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTm9uZSBvZiB0aGUgYnVncyB3ZXJlIGhpdCBzbyBpdCBpcyBzYWZlIGZvciB1cyB0byB1c2UgdGhlIGRlZmF1bHQgSW5lcnREb2N1bWVudCBzdHJhdGVneQogICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9JbmVydERvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBVc2UgWEhSIHRvIGNyZWF0ZSBhbmQgZmlsbCBhbiBpbmVydCBib2R5IGVsZW1lbnQgKG9uIFNhZmFyaSAxMC4xKQogICAgICogU2VlCiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9ibG9iL2E5OTJkM2E3NTAzMWNiOGJiMDMyZTVlYTgzOTliYTk3MmJkZjlhNjUvc3JjL3B1cmlmeS5qcyNMNDM5LUw0NDkKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGh0bWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEluZXJ0Qm9keUVsZW1lbnRfWEhSKGh0bWwpIHsKICAgICAgICAvLyBXZSBhZGQgdGhlc2UgZXh0cmEgZWxlbWVudHMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGNvbnRlbnQgaXMgcGFyc2VkIGFzIGV4cGVjdGVkCiAgICAgICAgLy8gZS5nLiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgbWFpbnRhaW5lZCBhbmQgdGFncyBsaWtlIGA8bWV0YT5gIGRvIG5vdCBnZXQgaG9pc3RlZCB0byB0aGUKICAgICAgICAvLyBgPGhlYWQ+YCB0YWcuCiAgICAgICAgaHRtbCA9ICc8Ym9keT48cmVtb3ZlPjwvcmVtb3ZlPicgKyBodG1sICsgJzwvYm9keT4nOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGh0bWwgPSBlbmNvZGVVUkkoaHRtbCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnOwogICAgICAgIHhoci5vcGVuKCdHRVQnLCAnZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCwnICsgaHRtbCwgZmFsc2UpOwogICAgICAgIHhoci5zZW5kKHVuZGVmaW5lZCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJvZHkgPSB4aHIucmVzcG9uc2UuYm9keTsKICAgICAgICBib2R5LnJlbW92ZUNoaWxkKCgvKiogQHR5cGUgez99ICovIChib2R5LmZpcnN0Q2hpbGQpKSk7CiAgICAgICAgcmV0dXJuIGJvZHk7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBET01QYXJzZXIgdG8gY3JlYXRlIGFuZCBmaWxsIGFuIGluZXJ0IGJvZHkgZWxlbWVudCAob24gRmlyZWZveCkKICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9yZWxlYXNlcy90YWcvMC42LjcKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRJbmVydEJvZHlFbGVtZW50X0RPTVBhcnNlcihodG1sKSB7CiAgICAgICAgLy8gV2UgYWRkIHRoZXNlIGV4dHJhIGVsZW1lbnRzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb250ZW50IGlzIHBhcnNlZCBhcyBleHBlY3RlZAogICAgICAgIC8vIGUuZy4gbGVhZGluZyB3aGl0ZXNwYWNlIGlzIG1haW50YWluZWQgYW5kIHRhZ3MgbGlrZSBgPG1ldGE+YCBkbyBub3QgZ2V0IGhvaXN0ZWQgdG8gdGhlCiAgICAgICAgLy8gYDxoZWFkPmAgdGFnLgogICAgICAgIGh0bWwgPSAnPGJvZHk+PHJlbW92ZT48L3JlbW92ZT4nICsgaHRtbCArICc8L2JvZHk+JzsKICAgICAgICB0cnkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSAoLyoqIEB0eXBlIHs/fSAqLyAobmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAod2luZG93KSkpLkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJykuYm9keSkpOwogICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKCgvKiogQHR5cGUgez99ICovIChib2R5LmZpcnN0Q2hpbGQpKSk7CiAgICAgICAgICAgIHJldHVybiBib2R5OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVc2UgYW4gSFRNTDUgYHRlbXBsYXRlYCBlbGVtZW50LCBpZiBzdXBwb3J0ZWQsIG9yIGFuIGluZXJ0IGJvZHkgZWxlbWVudCBjcmVhdGVkIHZpYQogICAgICogYGNyZWF0ZUh0bWxEb2N1bWVudGAgdG8gY3JlYXRlIGFuZCBmaWxsIGFuIGluZXJ0IERPTSBlbGVtZW50LgogICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzYW5lIHN0cmF0ZWd5IHRvIHVzZSBpZiB0aGUgYnJvd3NlciBkb2VzIG5vdCByZXF1aXJlIG9uZSBvZiB0aGUgc3BlY2lhbGlzZWQKICAgICAqIHN0cmF0ZWdpZXMgYWJvdmUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRJbmVydEJvZHlFbGVtZW50X0luZXJ0RG9jdW1lbnQoaHRtbCkgewogICAgICAgIC8vIFByZWZlciB1c2luZyA8dGVtcGxhdGU+IGVsZW1lbnQgaWYgc3VwcG9ydGVkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0ZW1wbGF0ZUVsID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKCdjb250ZW50JyBpbiB0ZW1wbGF0ZUVsKSB7CiAgICAgICAgICAgIHRlbXBsYXRlRWwuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlRWw7CiAgICAgICAgfQogICAgICAgIC8vIE5vdGUgdGhhdCBwcmV2aW91c2x5IHdlIHVzZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgYHRoaXMuaW5lcnREb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGh0bWxgCiAgICAgICAgLy8gYW5kIHdlIHJldHVybmVkIHRoZSBpbmVydCBgYm9keWAgbm9kZS4gVGhpcyB3YXMgY2hhbmdlZCwgYmVjYXVzZSBJRSBzZWVtcyB0byB0cmVhdCBzZXR0aW5nCiAgICAgICAgLy8gYGlubmVySFRNTGAgb24gYW4gaW5zZXJ0ZWQgZWxlbWVudCBkaWZmZXJlbnRseSwgY29tcGFyZWQgdG8gb25lIHRoYXQgaGFzbid0IGJlZW4gaW5zZXJ0ZWQKICAgICAgICAvLyB5ZXQuIEluIHBhcnRpY3VsYXIsIElFIGFwcGVhcnMgdG8gc3BsaXQgc29tZSBvZiB0aGUgdGV4dCBpbnRvIG11bHRpcGxlIHRleHQgbm9kZXMgcmF0aGVyCiAgICAgICAgLy8gdGhhbiBrZWVwaW5nIHRoZW0gaW4gYSBzaW5nbGUgb25lIHdoaWNoIGVuZHMgdXAgbWVzc2luZyB3aXRoIEl2eSdzIGkxOG4gcGFyc2luZyBmdXJ0aGVyCiAgICAgICAgLy8gZG93biB0aGUgbGluZS4gVGhpcyBoYXMgYmVlbiB3b3JrZWQgYXJvdW5kIGJ5IGNyZWF0aW5nIGEgbmV3IGluZXJ0IGBib2R5YCBhbmQgdXNpbmcgaXQgYXMKICAgICAgICAvLyB0aGUgcm9vdCBub2RlIGluIHdoaWNoIHdlIGluc2VydCB0aGUgSFRNTC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5lcnRCb2R5ID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTsKICAgICAgICBpbmVydEJvZHkuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHkKICAgICAgICAvLyBzdHJpcCBjdXN0b20tbmFtZXNwYWNlZCBhdHRyaWJ1dGVzIG9uIElFPD0xMQogICAgICAgIGlmICgoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVmYXVsdERvYykpKS5kb2N1bWVudE1vZGUpIHsKICAgICAgICAgICAgdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMoaW5lcnRCb2R5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZXJ0Qm9keTsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiBJRTktMTEgY29tZXMgYWNyb3NzIGFuIHVua25vd24gbmFtZXNwYWNlZCBhdHRyaWJ1dGUgZS5nLiAneGxpbms6Zm9vJyBpdCBhZGRzICd4bWxuczpuczEnCiAgICAgKiBhdHRyaWJ1dGUgdG8gZGVjbGFyZSBuczEgbmFtZXNwYWNlIGFuZCBwcmVmaXhlcyB0aGUgYXR0cmlidXRlIHdpdGggJ25zMScgKGUuZy4KICAgICAqICduczE6eGxpbms6Zm9vJykuCiAgICAgKgogICAgICogVGhpcyBpcyB1bmRlc2lyYWJsZSBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGFsbG93IGFueSBvZiB0aGVzZSBjdXN0b20gYXR0cmlidXRlcy4gVGhpcyBtZXRob2QKICAgICAqIHN0cmlwcyB0aGVtIGFsbC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdHJpcEN1c3RvbU5zQXR0cnMoZWwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxBdHRycyA9IGVsLmF0dHJpYnV0ZXM7CiAgICAgICAgLy8gbG9vcCBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCByZW1vdmFscy4KICAgICAgICBmb3IgKGxldCBpID0gZWxBdHRycy5sZW5ndGggLSAxOyAwIDwgaTsgaS0tKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0cmliID0gZWxBdHRycy5pdGVtKGkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJpYikpLm5hbWU7CiAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PT0gJ3htbG5zOm5zMScgfHwgYXR0ck5hbWUuaW5kZXhPZignbnMxOicpID09PSAwKSB7CiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY2hpbGROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsLmZpcnN0Q2hpbGQpKTsKICAgICAgICB3aGlsZSAoY2hpbGROb2RlKSB7CiAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKQogICAgICAgICAgICAgICAgdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMoKC8qKiBAdHlwZSB7P30gKi8gKGNoaWxkTm9kZSkpKTsKICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgIH0KfQovKioKICogV2UgbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgRE9NUGFyc2VyIGV4aXN0cyBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuCiAqIFRoZSB0cnktY2F0Y2ggaXMgYmVjYXVzZSwgb24gc29tZSBicm93c2VycywgdHJ5aW5nIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5CiAqIG9uIHdpbmRvdyBjYW4gYWN0dWFsbHkgdGhyb3cgYW4gZXJyb3IuCiAqCiAqIEBzdXBwcmVzcyB7dXNlbGVzc0NvZGV9CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0RPTVBhcnNlckF2YWlsYWJsZSgpIHsKICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuRE9NUGFyc2VyOwogICAgfQogICAgY2F0Y2ggKF9hKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBhIGNvbW1vbmx5IHVzZWZ1bCBzdWJzZXQgb2YgVVJMcyB0aGF0IGFyZSBzYWZlLgogKgogKiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGEgc3Vic2V0IG9mIFVSTHMgdGhhdCB3aWxsIG5vdCBjYXVzZSBzY3JpcHQKICogZXhlY3V0aW9uIGlmIHVzZWQgaW4gVVJMIGNvbnRleHQgd2l0aGluIGEgSFRNTCBkb2N1bWVudC4gU3BlY2lmaWNhbGx5LCB0aGlzCiAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGlmIChjb21tZW50IGZyb20gaGVyZSBvbiBhbmQgcmVnZXggY29waWVkIGZyb20KICogU295J3MgRXNjYXBpbmdDb252ZW50aW9ucyk6CiAqICgxKSBFaXRoZXIgYW4gYWxsb3dlZCBwcm90b2NvbCAoaHR0cCwgaHR0cHMsIG1haWx0byBvciBmdHApLgogKiAoMikgb3Igbm8gcHJvdG9jb2wuICBBIHByb3RvY29sIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjb2xvbi4gVGhlIGJlbG93CiAqICAgICBhbGxvd3MgdGhhdCBieSBhbGxvd2luZyBjb2xvbnMgb25seSBhZnRlciBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgWy8/I10uCiAqICAgICBBIGNvbG9uIGFmdGVyIGEgaGFzaCAoIykgbXVzdCBiZSBpbiB0aGUgZnJhZ21lbnQuCiAqICAgICBPdGhlcndpc2UsIGEgY29sb24gYWZ0ZXIgYSAoPykgbXVzdCBiZSBpbiBhIHF1ZXJ5LgogKiAgICAgT3RoZXJ3aXNlLCBhIGNvbG9uIGFmdGVyIGEgc2luZ2xlIHNvbGlkdXMgKC8pIG11c3QgYmUgaW4gYSBwYXRoLgogKiAgICAgT3RoZXJ3aXNlLCBhIGNvbG9uIGFmdGVyIGEgZG91YmxlIHNvbGlkdXMgKC8vKSBtdXN0IGJlIGluIHRoZSBhdXRob3JpdHkKICogICAgIChiZWZvcmUgcG9ydCkuCiAqCiAqIFRoZSBwYXR0ZXJuIGRpc2FsbG93cyAmLCB1c2VkIGluIEhUTUwgZW50aXR5IGRlY2xhcmF0aW9ucyBiZWZvcmUKICogb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIFsvPyNdLiBUaGlzIGRpc2FsbG93cyBIVE1MIGVudGl0aWVzIHVzZWQgaW4gdGhlCiAqIHByb3RvY29sIG5hbWUsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4sIGUuZy4gImgmIzExNjt0cCIgZm9yICJodHRwIi4KICogSXQgYWxzbyBkaXNhbGxvd3MgSFRNTCBlbnRpdGllcyBpbiB0aGUgZmlyc3QgcGF0aCBwYXJ0IG9mIGEgcmVsYXRpdmUgcGF0aCwKICogZS5nLiAiZm9vJmx0O2Jhci9iYXoiLiAgT3VyIGV4aXN0aW5nIGVzY2FwaW5nIGZ1bmN0aW9ucyBzaG91bGQgbm90IHByb2R1Y2UKICogdGhhdC4gTW9yZSBpbXBvcnRhbnRseSwgaXQgZGlzYWxsb3dzIG1hc2tpbmcgb2YgYSBjb2xvbiwKICogZS5nLiAiamF2YXNjcmlwdCYjNTg7Li4uIi4KICoKICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGUpOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvZ2k7Ci8qKgogKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBEQVRBX1VSTF9QQVRURVJOID0gL15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOStcL10rPSokL2k7Ci8qKgogKiBAcGFyYW0gez99IHVybAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX3Nhbml0aXplVXJsKHVybCkgewogICAgdXJsID0gU3RyaW5nKHVybCk7CiAgICBpZiAodXJsLm1hdGNoKFNBRkVfVVJMX1BBVFRFUk4pIHx8IHVybC5tYXRjaChEQVRBX1VSTF9QQVRURVJOKSkKICAgICAgICByZXR1cm4gdXJsOwogICAgaWYgKGlzRGV2TW9kZSgpKSB7CiAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBzYW5pdGl6aW5nIHVuc2FmZSBVUkwgdmFsdWUgJHt1cmx9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOwogICAgfQogICAgcmV0dXJuICd1bnNhZmU6JyArIHVybDsKfQovKioKICogQHBhcmFtIHs/fSBzcmNzZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNhbml0aXplU3Jjc2V0KHNyY3NldCkgewogICAgc3Jjc2V0ID0gU3RyaW5nKHNyY3NldCk7CiAgICByZXR1cm4gc3Jjc2V0LnNwbGl0KCcsJykubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gc3Jjc2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3Jjc2V0KSA9PiBfc2FuaXRpemVVcmwoc3Jjc2V0LnRyaW0oKSkpKS5qb2luKCcsICcpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vaHRtbF9zYW5pdGl6ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gdGFncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGFnU2V0KHRhZ3MpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IHt9OwogICAgZm9yIChjb25zdCB0IG9mIHRhZ3Muc3BsaXQoJywnKSkKICAgICAgICByZXNbdF0gPSB0cnVlOwogICAgcmV0dXJuIHJlczsKfQovKioKICogQHBhcmFtIHsuLi4/fSBzZXRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtZXJnZSQxKC4uLnNldHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IHt9OwogICAgZm9yIChjb25zdCBzIG9mIHNldHMpIHsKICAgICAgICBmb3IgKGNvbnN0IHYgaW4gcykgewogICAgICAgICAgICBpZiAocy5oYXNPd25Qcm9wZXJ0eSh2KSkKICAgICAgICAgICAgICAgIHJlc1t2XSA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKfQovLyBHb29kIHNvdXJjZSBvZiBpbmZvIGFib3V0IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCi8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNzZW1hbnRpY3MKLy8gaHR0cDovL3NpbW9uLmh0bWw1Lm9yZy9odG1sLWVsZW1lbnRzCi8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1Ci8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN2b2lkLWVsZW1lbnRzCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgVk9JRF9FTEVNRU5UUyA9IHRhZ1NldCgnYXJlYSxicixjb2wsaHIsaW1nLHdicicpOwovLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW4gKGFuZCB3aGljaCBjbG9zZSB0aGVtc2VsdmVzKQovLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjb3B0aW9uYWwtdGFncwovKiogQHR5cGUgez99ICovCmNvbnN0IE9QVElPTkFMX0VORF9UQUdfQkxPQ0tfRUxFTUVOVFMgPSB0YWdTZXQoJ2NvbGdyb3VwLGRkLGR0LGxpLHAsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHInKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUyA9IHRhZ1NldCgncnAscnQnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBPUFRJT05BTF9FTkRfVEFHX0VMRU1FTlRTID0gbWVyZ2UkMShPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUywgT1BUSU9OQUxfRU5EX1RBR19CTE9DS19FTEVNRU5UUyk7Ci8vIFNhZmUgQmxvY2sgRWxlbWVudHMgLSBIVE1MNQovKiogQHR5cGUgez99ICovCmNvbnN0IEJMT0NLX0VMRU1FTlRTID0gbWVyZ2UkMShPUFRJT05BTF9FTkRfVEFHX0JMT0NLX0VMRU1FTlRTLCB0YWdTZXQoJ2FkZHJlc3MsYXJ0aWNsZSwnICsKICAgICdhc2lkZSxibG9ja3F1b3RlLGNhcHRpb24sY2VudGVyLGRlbCxkZXRhaWxzLGRpYWxvZyxkaXIsZGl2LGRsLGZpZ3VyZSxmaWdjYXB0aW9uLGZvb3RlcixoMSxoMixoMyxoNCxoNSwnICsKICAgICdoNixoZWFkZXIsaGdyb3VwLGhyLGlucyxtYWluLG1hcCxtZW51LG5hdixvbCxwcmUsc2VjdGlvbixzdW1tYXJ5LHRhYmxlLHVsJykpOwovLyBJbmxpbmUgRWxlbWVudHMgLSBIVE1MNQovKiogQHR5cGUgez99ICovCmNvbnN0IElOTElORV9FTEVNRU5UUyA9IG1lcmdlJDEoT1BUSU9OQUxfRU5EX1RBR19JTkxJTkVfRUxFTUVOVFMsIHRhZ1NldCgnYSxhYmJyLGFjcm9ueW0sYXVkaW8sYiwnICsKICAgICdiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscGljdHVyZSxxLHJ1YnkscnAscnQscywnICsKICAgICdzYW1wLHNtYWxsLHNvdXJjZSxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHRyYWNrLHR0LHUsdmFyLHZpZGVvJykpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFZBTElEX0VMRU1FTlRTID0gbWVyZ2UkMShWT0lEX0VMRU1FTlRTLCBCTE9DS19FTEVNRU5UUywgSU5MSU5FX0VMRU1FTlRTLCBPUFRJT05BTF9FTkRfVEFHX0VMRU1FTlRTKTsKLy8gQXR0cmlidXRlcyB0aGF0IGhhdmUgaHJlZiBhbmQgaGVuY2UgbmVlZCB0byBiZSBzYW5pdGl6ZWQKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVUklfQVRUUlMgPSB0YWdTZXQoJ2JhY2tncm91bmQsY2l0ZSxocmVmLGl0ZW10eXBlLGxvbmdkZXNjLHBvc3RlcixzcmMseGxpbms6aHJlZicpOwovLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBzcGVjaWFsIGhyZWYgc2V0IGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1JDU0VUX0FUVFJTID0gdGFnU2V0KCdzcmNzZXQnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBIVE1MX0FUVFJTID0gdGFnU2V0KCdhYmJyLGFjY2Vzc2tleSxhbGlnbixhbHQsYXV0b3BsYXksYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhcixjb2xvcixjb2xzLGNvbHNwYW4sJyArCiAgICAnY29tcGFjdCxjb250cm9scyxjb29yZHMsZGF0ZXRpbWUsZGVmYXVsdCxkaXIsZG93bmxvYWQsZmFjZSxoZWFkZXJzLGhlaWdodCxoaWRkZW4saHJlZmxhbmcsaHNwYWNlLCcgKwogICAgJ2lzbWFwLGl0ZW1zY29wZSxpdGVtcHJvcCxraW5kLGxhYmVsLGxhbmcsbGFuZ3VhZ2UsbG9vcCxtZWRpYSxtdXRlZCxub2hyZWYsbm93cmFwLG9wZW4scHJlbG9hZCxyZWwscmV2LHJvbGUscm93cyxyb3dzcGFuLHJ1bGVzLCcgKwogICAgJ3Njb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNpemVzLHNwYW4sc3JjbGFuZyxzdGFydCxzdW1tYXJ5LHRhYmluZGV4LHRhcmdldCx0aXRsZSx0cmFuc2xhdGUsdHlwZSx1c2VtYXAsJyArCiAgICAndmFsaWduLHZhbHVlLHZzcGFjZSx3aWR0aCcpOwovLyBBY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZXMgYXMgcGVyIFdBSS1BUklBIDEuMSAoVzNDIFdvcmtpbmcgRHJhZnQgMTQgRGVjZW1iZXIgMjAxOCkKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBBUklBX0FUVFJTID0gdGFnU2V0KCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsYXJpYS1hdG9taWMsYXJpYS1hdXRvY29tcGxldGUsYXJpYS1idXN5LGFyaWEtY2hlY2tlZCxhcmlhLWNvbGNvdW50LGFyaWEtY29saW5kZXgsJyArCiAgICAnYXJpYS1jb2xzcGFuLGFyaWEtY29udHJvbHMsYXJpYS1jdXJyZW50LGFyaWEtZGVzY3JpYmVkYnksYXJpYS1kZXRhaWxzLGFyaWEtZGlzYWJsZWQsYXJpYS1kcm9wZWZmZWN0LCcgKwogICAgJ2FyaWEtZXJyb3JtZXNzYWdlLGFyaWEtZXhwYW5kZWQsYXJpYS1mbG93dG8sYXJpYS1ncmFiYmVkLGFyaWEtaGFzcG9wdXAsYXJpYS1oaWRkZW4sYXJpYS1pbnZhbGlkLCcgKwogICAgJ2FyaWEta2V5c2hvcnRjdXRzLGFyaWEtbGFiZWwsYXJpYS1sYWJlbGxlZGJ5LGFyaWEtbGV2ZWwsYXJpYS1saXZlLGFyaWEtbW9kYWwsYXJpYS1tdWx0aWxpbmUsJyArCiAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUsYXJpYS1vcmllbnRhdGlvbixhcmlhLW93bnMsYXJpYS1wbGFjZWhvbGRlcixhcmlhLXBvc2luc2V0LGFyaWEtcHJlc3NlZCxhcmlhLXJlYWRvbmx5LCcgKwogICAgJ2FyaWEtcmVsZXZhbnQsYXJpYS1yZXF1aXJlZCxhcmlhLXJvbGVkZXNjcmlwdGlvbixhcmlhLXJvd2NvdW50LGFyaWEtcm93aW5kZXgsYXJpYS1yb3dzcGFuLGFyaWEtc2VsZWN0ZWQsJyArCiAgICAnYXJpYS1zZXRzaXplLGFyaWEtc29ydCxhcmlhLXZhbHVlbWF4LGFyaWEtdmFsdWVtaW4sYXJpYS12YWx1ZW5vdyxhcmlhLXZhbHVldGV4dCcpOwovLyBOQjogVGhpcyBjdXJyZW50bHkgY29uc2Npb3VzbHkgZG9lc24ndCBzdXBwb3J0IFNWRy4gU1ZHIHNhbml0aXphdGlvbiBoYXMgaGFkIHNldmVyYWwgc2VjdXJpdHkKLy8gaXNzdWVzIGluIHRoZSBwYXN0LCBzbyBpdCBzZWVtcyBzYWZlciB0byBsZWF2ZSBpdCBvdXQgaWYgcG9zc2libGUuIElmIHN1cHBvcnQgZm9yIGJpbmRpbmcgU1ZHIHZpYQovLyBpbm5lckhUTUwgaXMgcmVxdWlyZWQsIFNWRyBhdHRyaWJ1dGVzIHNob3VsZCBiZSBhZGRlZCBoZXJlLgovLyBOQjogU2FuaXRpemF0aW9uIGRvZXMgbm90IGFsbG93IDxmb3JtPiBlbGVtZW50cyBvciBvdGhlciBhY3RpdmUgZWxlbWVudHMgKDxidXR0b24+IGV0YykuIFRob3NlCi8vIGNhbiBiZSBzYW5pdGl6ZWQsIGJ1dCB0aGV5IGluY3JlYXNlIHNlY3VyaXR5IHN1cmZhY2UgYXJlYSB3aXRob3V0IGEgbGVnaXRpbWF0ZSB1c2UgY2FzZSwgc28gdGhleQovLyBhcmUgbGVmdCBvdXQgaGVyZS4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBWQUxJRF9BVFRSUyA9IG1lcmdlJDEoVVJJX0FUVFJTLCBTUkNTRVRfQVRUUlMsIEhUTUxfQVRUUlMsIEFSSUFfQVRUUlMpOwovLyBFbGVtZW50cyB3aG9zZSBjb250ZW50IHNob3VsZCBub3QgYmUgdHJhdmVyc2VkL3ByZXNlcnZlZCwgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIGludmFsaWQuCi8vCi8vIFR5cGljYWxseSwgYDxpbnZhbGlkPlNvbWUgY29udGVudDwvaW52YWxpZD5gIHdvdWxkIHRyYXZlcnNlIChhbmQgaW4gdGhpcyBjYXNlIHByZXNlcnZlKQovLyBgU29tZSBjb250ZW50YCwgYnV0IHN0cmlwIGBpbnZhbGlkLWVsZW1lbnRgIG9wZW5pbmcvY2xvc2luZyB0YWdzLiBGb3Igc29tZSBlbGVtZW50cywgdGhvdWdoLCB3ZQovLyBkb24ndCB3YW50IHRvIHByZXNlcnZlIHRoZSBjb250ZW50LCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgZ29pbmcgdG8gYmUgcmVtb3ZlZC4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTS0lQX1RSQVZFUlNJTkdfQ09OVEVOVF9JRl9JTlZBTElEX0VMRU1FTlRTID0gdGFnU2V0KCdzY3JpcHQsc3R5bGUsdGVtcGxhdGUnKTsKLyoqCiAqIFNhbml0aXppbmdIdG1sU2VyaWFsaXplciBzZXJpYWxpemVzIGEgRE9NIGZyYWdtZW50LCBzdHJpcHBpbmcgb3V0IGFueSB1bnNhZmUgZWxlbWVudHMgYW5kIHVuc2FmZQogKiBhdHRyaWJ1dGVzLgogKi8KY2xhc3MgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIC8vIEV4cGxpY2l0bHkgdHJhY2sgaWYgc29tZXRoaW5nIHdhcyBzdHJpcHBlZCwgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHdhcm5pbmcgb2Ygc2FuaXRpemF0aW9uIGp1c3QKICAgICAgICAvLyBiZWNhdXNlIGNoYXJhY3RlcnMgd2VyZSByZS1lbmNvZGVkLgogICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5idWYgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2FuaXRpemVDaGlsZHJlbihlbCkgewogICAgICAgIC8vIFRoaXMgY2Fubm90IHVzZSBhIFRyZWVXYWxrZXIsIGFzIGl0IGhhcyB0byBydW4gb24gQW5ndWxhcidzIHZhcmlvdXMgRE9NIGFkYXB0ZXJzLgogICAgICAgIC8vIEhvd2V2ZXIgdGhpcyBjb2RlIG5ldmVyIGFjY2Vzc2VzIHByb3BlcnRpZXMgb2ZmIG9mIGBkb2N1bWVudGAgYmVmb3JlIGRlbGV0aW5nIGl0cyBjb250ZW50cwogICAgICAgIC8vIGFnYWluLCBzbyBpdCBzaG91bGRuJ3QgYmUgdnVsbmVyYWJsZSB0byBET00gY2xvYmJlcmluZy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnJlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWwuZmlyc3RDaGlsZCkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdHJhdmVyc2VDb250ZW50ID0gdHJ1ZTsKICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICBpZiAoY3VycmVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgIHRyYXZlcnNlQ29udGVudCA9IHRoaXMuc3RhcnRFbGVtZW50KCgvKiogQHR5cGUgez99ICovIChjdXJyZW50KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNoYXJzKCgvKiogQHR5cGUgez99ICovIChjdXJyZW50Lm5vZGVWYWx1ZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFN0cmlwIG5vbi1lbGVtZW50LCBub24tdGV4dCBub2Rlcy4KICAgICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHJhdmVyc2VDb250ZW50ICYmIGN1cnJlbnQuZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgY3VycmVudCA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50LmZpcnN0Q2hpbGQpKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICAgICAgICAvLyBMZWF2aW5nIHRoZSBlbGVtZW50LiBXYWxrIHVwIGFuZCB0byB0aGUgcmlnaHQsIGNsb3NpbmcgdGFncyBhcyB3ZSBnby4KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kRWxlbWVudCgoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5jaGVja0Nsb2JiZXJlZEVsZW1lbnQoY3VycmVudCwgKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQubmV4dFNpYmxpbmcpKSk7CiAgICAgICAgICAgICAgICBpZiAobmV4dCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuY2hlY2tDbG9iYmVyZWRFbGVtZW50KGN1cnJlbnQsICgvKiogQHR5cGUgez99ICovIChjdXJyZW50LnBhcmVudE5vZGUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLmpvaW4oJycpOwogICAgfQogICAgLyoqCiAgICAgKiBTYW5pdGl6ZXMgYW4gb3BlbmluZyBlbGVtZW50IHRhZyAoaWYgdmFsaWQpIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQncyBjb250ZW50cyBzaG91bGQKICAgICAqIGJlIHRyYXZlcnNlZC4gRWxlbWVudCBjb250ZW50IG11c3QgYWx3YXlzIGJlIHRyYXZlcnNlZCAoZXZlbiBpZiB0aGUgZWxlbWVudCBpdHNlbGYgaXMgbm90CiAgICAgKiB2YWxpZC9zYWZlKSwgdW5sZXNzIHRoZSBlbGVtZW50IGlzIG9uZSBvZiBgU0tJUF9UUkFWRVJTSU5HX0NPTlRFTlRfSUZfSU5WQUxJRF9FTEVNRU5UU2AuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgZWxlbWVudCB0byBzYW5pdGl6ZS4KICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGVsZW1lbnQncyBjb250ZW50cyBzaG91bGQgYmUgdHJhdmVyc2VkLgogICAgICovCiAgICBzdGFydEVsZW1lbnQoZWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmICghVkFMSURfRUxFTUVOVFMuaGFzT3duUHJvcGVydHkodGFnTmFtZSkpIHsKICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gIVNLSVBfVFJBVkVSU0lOR19DT05URU5UX0lGX0lOVkFMSURfRUxFTUVOVFMuaGFzT3duUHJvcGVydHkodGFnTmFtZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYnVmLnB1c2goJzwnKTsKICAgICAgICB0aGlzLmJ1Zi5wdXNoKHRhZ05hbWUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbEF0dHJzID0gZWxlbWVudC5hdHRyaWJ1dGVzOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxBdHRycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsQXR0ciA9IGVsQXR0cnMuaXRlbShpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChlbEF0dHIpKS5uYW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxvd2VyID0gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKCFWQUxJRF9BVFRSUy5oYXNPd25Qcm9wZXJ0eShsb3dlcikpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsQXR0cikpLnZhbHVlOwogICAgICAgICAgICAvLyBUT0RPKG1hcnRpbnByb2JzdCk6IFNwZWNpYWwgY2FzZSBpbWFnZSBVUklzIGZvciBkYXRhOmltYWdlLy4uLgogICAgICAgICAgICBpZiAoVVJJX0FUVFJTW2xvd2VyXSkKICAgICAgICAgICAgICAgIHZhbHVlID0gX3Nhbml0aXplVXJsKHZhbHVlKTsKICAgICAgICAgICAgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlcl0pCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNhbml0aXplU3Jjc2V0KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnICcsIGF0dHJOYW1lLCAnPSInLCBlbmNvZGVFbnRpdGllcyh2YWx1ZSksICciJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZW5kRWxlbWVudChjdXJyZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhZ05hbWUgPSBjdXJyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKFZBTElEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpICYmICFWT0lEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJzwvJyk7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2godGFnTmFtZSk7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGFycyhjaGFycykgewogICAgICAgIHRoaXMuYnVmLnB1c2goZW5jb2RlRW50aXRpZXMoY2hhcnMpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcGFyYW0gez99IG5leHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGVja0Nsb2JiZXJlZEVsZW1lbnQobm9kZSwgbmV4dE5vZGUpIHsKICAgICAgICBpZiAobmV4dE5vZGUgJiYKICAgICAgICAgICAgKG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dE5vZGUpICYKICAgICAgICAgICAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIGNsb2JiZXJlZDogJHsoKC8qKiBAdHlwZSB7P30gKi8gKG5vZGUpKSkub3V0ZXJIVE1MfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dE5vZGU7CiAgICB9Cn0KLy8gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgcGFyc2luZyB0YWdzIGFuZCBhdHRyaWJ1dGVzCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1VSUk9HQVRFX1BBSVJfUkVHRVhQID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nOwovLyAhIHRvIH4gaXMgdGhlIEFTQ0lJIHJhbmdlLgovKiogQHR5cGUgez99ICovCmNvbnN0IE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQID0gLyhbXlwjLX4gfCFdKS9nOwovKioKICogRXNjYXBlcyBhbGwgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMsIHNvIHRoYXQgdGhlCiAqIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHNhZmVseSBpbnNlcnRlZCBpbnRvIGF0dHJpYnV0ZSBvcgogKiBlbGVtZW50IHRleHQuCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGVuY29kZUVudGl0aWVzKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgIC5yZXBsYWNlKFNVUlJPR0FURV9QQUlSX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKG1hdGNoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhpID0gbWF0Y2guY2hhckNvZGVBdCgwKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG93ID0gbWF0Y2guY2hhckNvZGVBdCgxKTsKICAgICAgICByZXR1cm4gJyYjJyArICgoKGhpIC0gMHhEODAwKSAqIDB4NDAwKSArIChsb3cgLSAweERDMDApICsgMHgxMDAwMCkgKyAnOyc7CiAgICB9KSkKICAgICAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKG1hdGNoKSB7CiAgICAgICAgcmV0dXJuICcmIycgKyBtYXRjaC5jaGFyQ29kZUF0KDApICsgJzsnOwogICAgfSkpCiAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKQogICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgaW5lcnRCb2R5SGVscGVyOwovKioKICogU2FuaXRpemVzIHRoZSBnaXZlbiB1bnNhZmUsIHVudHJ1c3RlZCBIVE1MIGZyYWdtZW50LCBhbmQgcmV0dXJucyBIVE1MIHRleHQgdGhhdCBpcyBzYWZlIHRvIGFkZCB0bwogKiB0aGUgRE9NIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC4KICogQHBhcmFtIHs/fSBkZWZhdWx0RG9jCiAqIEBwYXJhbSB7P30gdW5zYWZlSHRtbElucHV0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfc2FuaXRpemVIdG1sKGRlZmF1bHREb2MsIHVuc2FmZUh0bWxJbnB1dCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGluZXJ0Qm9keUVsZW1lbnQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgICBpbmVydEJvZHlIZWxwZXIgPSBpbmVydEJvZHlIZWxwZXIgfHwgbmV3IEluZXJ0Qm9keUhlbHBlcihkZWZhdWx0RG9jKTsKICAgICAgICAvLyBNYWtlIHN1cmUgdW5zYWZlSHRtbCBpcyBhY3R1YWxseSBhIHN0cmluZyAoVHlwZVNjcmlwdCB0eXBlcyBhcmUgbm90IGVuZm9yY2VkIGF0IHJ1bnRpbWUpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdW5zYWZlSHRtbCA9IHVuc2FmZUh0bWxJbnB1dCA/IFN0cmluZyh1bnNhZmVIdG1sSW5wdXQpIDogJyc7CiAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpOwogICAgICAgIC8vIG1YU1MgcHJvdGVjdGlvbi4gUmVwZWF0ZWRseSBwYXJzZSB0aGUgZG9jdW1lbnQgdG8gbWFrZSBzdXJlIGl0IHN0YWJpbGl6ZXMsIHNvIHRoYXQgYSBicm93c2VyCiAgICAgICAgLy8gdHJ5aW5nIHRvIGF1dG8tY29ycmVjdCBpbmNvcnJlY3QgSFRNTCBjYW5ub3QgY2F1c2UgZm9ybWVybHkgaW5lcnQgSFRNTCB0byBiZWNvbWUgZGFuZ2Vyb3VzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbVhTU0F0dGVtcHRzID0gNTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcnNlZEh0bWwgPSB1bnNhZmVIdG1sOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKG1YU1NBdHRlbXB0cyA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBpbnB1dCBpcyB1bnN0YWJsZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1YU1NBdHRlbXB0cy0tOwogICAgICAgICAgICB1bnNhZmVIdG1sID0gcGFyc2VkSHRtbDsKICAgICAgICAgICAgcGFyc2VkSHRtbCA9ICgvKiogQHR5cGUgez99ICovIChpbmVydEJvZHlFbGVtZW50KSkuaW5uZXJIVE1MOwogICAgICAgICAgICBpbmVydEJvZHlFbGVtZW50ID0gaW5lcnRCb2R5SGVscGVyLmdldEluZXJ0Qm9keUVsZW1lbnQodW5zYWZlSHRtbCk7CiAgICAgICAgfSB3aGlsZSAodW5zYWZlSHRtbCAhPT0gcGFyc2VkSHRtbCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNhbml0aXplciA9IG5ldyBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2FmZUh0bWwgPSBzYW5pdGl6ZXIuc2FuaXRpemVDaGlsZHJlbigoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0VGVtcGxhdGVDb250ZW50KCgvKiogQHR5cGUgez99ICovIChpbmVydEJvZHlFbGVtZW50KSkpKSkgfHwgaW5lcnRCb2R5RWxlbWVudCk7CiAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIHNhbml0aXplci5zYW5pdGl6ZWRTb21ldGhpbmcpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50LCBzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzYWZlSHRtbDsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIC8vIEluIGNhc2UgYW55dGhpbmcgZ29lcyB3cm9uZywgY2xlYXIgb3V0IGluZXJ0RWxlbWVudCB0byByZXNldCB0aGUgZW50aXJlIERPTSBzdHJ1Y3R1cmUuCiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRUZW1wbGF0ZUNvbnRlbnQoaW5lcnRCb2R5RWxlbWVudCkgfHwgaW5lcnRCb2R5RWxlbWVudDsKICAgICAgICAgICAgd2hpbGUgKHBhcmVudC5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50LmZpcnN0Q2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGVsCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUZW1wbGF0ZUNvbnRlbnQoZWwpIHsKICAgIHJldHVybiAnY29udGVudCcgaW4gKCgvKiogQHR5cGUgez99ICovIChlbCkpKSAmJiBpc1RlbXBsYXRlRWxlbWVudChlbCkgPwogICAgICAgIGVsLmNvbnRlbnQgOgogICAgICAgIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzVGVtcGxhdGVFbGVtZW50KGVsKSB7CiAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGVsLm5vZGVOYW1lID09PSAnVEVNUExBVEUnOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vc2VjdXJpdHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgU2VjdXJpdHlDb250ZXh0ID0gewogICAgTk9ORTogMCwKICAgIEhUTUw6IDEsCiAgICBTVFlMRTogMiwKICAgIFNDUklQVDogMywKICAgIFVSTDogNCwKICAgIFJFU09VUkNFX1VSTDogNSwKfTsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5OT05FXSA9ICdOT05FJzsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5IVE1MXSA9ICdIVE1MJzsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5TVFlMRV0gPSAnU1RZTEUnOwpTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0LlNDUklQVF0gPSAnU0NSSVBUJzsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5VUkxdID0gJ1VSTCc7ClNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMXSA9ICdSRVNPVVJDRV9VUkwnOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3N0eWxlX3Nhbml0aXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmVndWxhciBleHByZXNzaW9uIGZvciBzYWZlIHN0eWxlIHZhbHVlcy4KICoKICogUXVvdGVzICgiIGFuZCAnKSBhcmUgYWxsb3dlZCwgYnV0IGEgY2hlY2sgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSB0byBlbnN1cmUgdGhleSdyZSBiYWxhbmNlZC4KICoKICogJywnIGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcHJvcGVydHkgKGUuZy4gYmFja2dyb3VuZC1hdHRhY2htZW50IG9yCiAqIGZvbnQtZmFtaWx5KSBhbmQgaGVuY2UgY291bGQgYWxsb3cgbXVsdGlwbGUgdmFsdWVzIHRvIGdldCBpbmplY3RlZCwgYnV0IHRoYXQgc2hvdWxkIHBvc2Ugbm8gcmlzawogKiBvZiBYU1MuCiAqCiAqIFRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGNoZWNrcyBvbmx5IGZvciBYU1Mgc2FmZXR5LCBub3QgZm9yIENTUyB2YWxpZGl0eS4KICoKICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnksIGFuZCBhdWdtZW50ZWQgZm9yCiAqIHRyYW5zZm9ybWF0aW9uIHZhbHVlcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBWQUxVRVMgPSAnWy0sLiJcJyVfISMgYS16QS1aMC05XSsnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRSQU5TRk9STUFUSU9OX0ZOUyA9ICcoPzptYXRyaXh8dHJhbnNsYXRlfHNjYWxlfHJvdGF0ZXxza2V3fHBlcnNwZWN0aXZlKSg/Olh8WXxafDNkKT8nOwovKiogQHR5cGUgez99ICovCmNvbnN0IENPTE9SX0ZOUyA9ICcoPzpyZ2J8aHNsKWE/JzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBHUkFESUVOVFMgPSAnKD86cmVwZWF0aW5nLSk/KD86bGluZWFyfHJhZGlhbCktZ3JhZGllbnQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IENTUzNfRk5TID0gJyg/OmF0dHJ8Y2FsY3x2YXIpJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBGTl9BUkdTID0gJ1xcKFstMC05LiUsICNhLXpBLVpdK1xcKSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU0FGRV9TVFlMRV9WQUxVRSA9IG5ldyBSZWdFeHAoYF4oJHtWQUxVRVN9fGAgKwogICAgYCg/OiR7VFJBTlNGT1JNQVRJT05fRk5TfXwke0NPTE9SX0ZOU318JHtHUkFESUVOVFN9fCR7Q1NTM19GTlN9KWAgKwogICAgYCR7Rk5fQVJHU30pJGAsICdnJyk7Ci8qKgogKiBNYXRjaGVzIGEgYHVybCguLi4pYCB2YWx1ZSB3aXRoIGFuIGFyYml0cmFyeSBhcmd1bWVudCBhcyBsb25nIGFzIGl0IGRvZXMKICogbm90IGNvbnRhaW4gcGFyZW50aGVzZXMuCiAqCiAqIFRoZSBVUkwgdmFsdWUgc3RpbGwgbmVlZHMgdG8gYmUgc2FuaXRpemVkIHNlcGFyYXRlbHkuCiAqCiAqIGB1cmwoLi4uKWAgdmFsdWVzIGFyZSBhIHZlcnkgY29tbW9uIHVzZSBjYXNlLCBlLmcuIGZvciBgYmFja2dyb3VuZC1pbWFnZWAuIFdpdGggY2FyZWZ1bGx5IGNyYWZ0ZWQKICogQ1NTIHN0eWxlIHJ1bGVzLCBpdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgYW4gaW5mb3JtYXRpb24gbGVhayB3aXRoIGB1cmxgIHZhbHVlcyBpbiBDU1MsIGUuZy4KICogYnkgb2JzZXJ2aW5nIHdoZXRoZXIgc2Nyb2xsIGJhcnMgYXJlIGRpc3BsYXllZCwgb3IgY2hhcmFjdGVyIHJhbmdlcyB1c2VkIGJ5IGEgZm9udCBmYWNlCiAqIGRlZmluaXRpb24uCiAqCiAqIEFuZ3VsYXIgb25seSBhbGxvd3MgYmluZGluZyBDU1MgdmFsdWVzIChhcyBvcHBvc2VkIHRvIGVudGlyZSBDU1MgcnVsZXMpLCBzbyBpdCBpcyB1bmxpa2VseSB0aGF0CiAqIGJpbmRpbmcgYSBVUkwgdmFsdWUgd2l0aG91dCBmdXJ0aGVyIGNvb3BlcmF0aW9uIGZyb20gdGhlIHBhZ2Ugd2lsbCBjYXVzZSBhbiBpbmZvcm1hdGlvbiBsZWFrLCBhbmQKICogaWYgc28sIGl0IGlzIGp1c3QgYSBsZWFrLCBub3QgYSBmdWxsIGJsb3duIFhTUyB2dWxuZXJhYmlsaXR5LgogKgogKiBHaXZlbiB0aGUgY29tbW9uIHVzZSBjYXNlLCBsb3cgbGlrZWxpaG9vZCBvZiBhdHRhY2sgdmVjdG9yLCBhbmQgbG93IGltcGFjdCBvZiBhbiBhdHRhY2ssIHRoaXMKICogY29kZSBpcyBwZXJtaXNzaXZlIGFuZCBhbGxvd3MgVVJMcyB0aGF0IHNhbml0aXplIG90aGVyd2lzZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBVUkxfUkUgPSAvXnVybFwoKFteKV0rKVwpJC87Ci8qKgogKiBDaGVja3MgdGhhdCBxdW90ZXMgKCIgYW5kICcpIGFyZSBwcm9wZXJseSBiYWxhbmNlZCBpbnNpZGUgYSBzdHJpbmcuIEFzc3VtZXMKICogdGhhdCBuZWl0aGVyIGVzY2FwZSAoXCkgbm9yIGFueSBvdGhlciBjaGFyYWN0ZXIgdGhhdCBjb3VsZCByZXN1bHQgaW4KICogYnJlYWtpbmcgb3V0IG9mIGEgc3RyaW5nIHBhcnNpbmcgY29udGV4dCBhcmUgYWxsb3dlZDsKICogc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNzdHJpbmctdG9rZW4tZGlhZ3JhbS4KICoKICogVGhpcyBjb2RlIHdhcyB0YWtlbiBmcm9tIHRoZSBDbG9zdXJlIHNhbml0aXphdGlvbiBsaWJyYXJ5LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBoYXNCYWxhbmNlZFF1b3Rlcyh2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG91dHNpZGVTaW5nbGUgPSB0cnVlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG91dHNpZGVEb3VibGUgPSB0cnVlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjID0gdmFsdWUuY2hhckF0KGkpOwogICAgICAgIGlmIChjID09PSAnXCcnICYmIG91dHNpZGVEb3VibGUpIHsKICAgICAgICAgICAgb3V0c2lkZVNpbmdsZSA9ICFvdXRzaWRlU2luZ2xlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjID09PSAnIicgJiYgb3V0c2lkZVNpbmdsZSkgewogICAgICAgICAgICBvdXRzaWRlRG91YmxlID0gIW91dHNpZGVEb3VibGU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHNpZGVTaW5nbGUgJiYgb3V0c2lkZURvdWJsZTsKfQovKioKICogU2FuaXRpemVzIHRoZSBnaXZlbiB1bnRydXN0ZWQgQ1NTIHN0eWxlIHByb3BlcnR5IHZhbHVlIChpLmUuIG5vdCBhbiBlbnRpcmUgb2JqZWN0LCBqdXN0IGEgc2luZ2xlCiAqIHZhbHVlKSBhbmQgcmV0dXJucyBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gYSBicm93c2VyIGVudmlyb25tZW50LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfc2FuaXRpemVTdHlsZSh2YWx1ZSkgewogICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcuCiAgICBpZiAoIXZhbHVlKQogICAgICAgIHJldHVybiAnJzsKICAgIC8vIFNpbmdsZSB1cmwoLi4uKSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG9ubHkgZm9yIFVSTHMgdGhhdCBzYW5pdGl6ZSBjbGVhbmx5LiBTZWUgYWJvdmUgZm9yCiAgICAvLyByZWFzb25pbmcgYmVoaW5kIHRoaXMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1cmxNYXRjaCA9IHZhbHVlLm1hdGNoKFVSTF9SRSk7CiAgICBpZiAoKHVybE1hdGNoICYmIF9zYW5pdGl6ZVVybCh1cmxNYXRjaFsxXSkgPT09IHVybE1hdGNoWzFdKSB8fAogICAgICAgIHZhbHVlLm1hdGNoKFNBRkVfU1RZTEVfVkFMVUUpICYmIGhhc0JhbGFuY2VkUXVvdGVzKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZTsgLy8gU2FmZSBzdHlsZSB2YWx1ZXMuCiAgICB9CiAgICBpZiAoaXNEZXZNb2RlKCkpIHsKICAgICAgICBjb25zb2xlLndhcm4oYFdBUk5JTkc6IHNhbml0aXppbmcgdW5zYWZlIHN0eWxlIHZhbHVlICR7dmFsdWV9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKS5gKTsKICAgIH0KICAgIHJldHVybiAndW5zYWZlJzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3Nhbml0aXphdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gYGh0bWxgIHNhbml0aXplciB3aGljaCBjb252ZXJ0cyB1bnRydXN0ZWQgYGh0bWxgICoqc3RyaW5nKiogaW50byB0cnVzdGVkIHN0cmluZyBieSByZW1vdmluZwogKiBkYW5nZXJvdXMgY29udGVudC4KICoKICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBgaHRtbGAgYW5kIGxvY2F0ZXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbnRlbnQgKHN1Y2ggYXMgdXJscyBhbmQKICogamF2YXNjcmlwdCkgYW5kIHJlbW92ZXMgaXQuCiAqCiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hcmsgYSBzdHJpbmcgYXMgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sfS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB1bnNhZmVIdG1sIHVudHJ1c3RlZCBgaHRtbGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcmV0dXJuIHs/fSBgaHRtbGAgc3RyaW5nIHdoaWNoIGlzIHNhZmUgdG8gZGlzcGxheSB0byB1c2VyLCBiZWNhdXNlIGFsbCBvZiB0aGUgZGFuZ2Vyb3VzIGphdmFzY3JpcHQKICogYW5kIHVybHMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAqCiAqLwpmdW5jdGlvbiDJtcm1c2FuaXRpemVIdG1sKHVuc2FmZUh0bWwpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgaWYgKHNhbml0aXplcikgewogICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIHVuc2FmZUh0bWwpIHx8ICcnOwogICAgfQogICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlSHRtbCwgIkhUTUwiIC8qIEh0bWwgKi8pKSB7CiAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVIdG1sKTsKICAgIH0KICAgIHJldHVybiBfc2FuaXRpemVIdG1sKGdldERvY3VtZW50KCksIHJlbmRlclN0cmluZ2lmeSh1bnNhZmVIdG1sKSk7Cn0KLyoqCiAqIEEgYHN0eWxlYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGBzdHlsZWAgKipzdHJpbmcqKiBpbnRvIHRydXN0ZWQgc3RyaW5nIGJ5IHJlbW92aW5nCiAqIGRhbmdlcm91cyBjb250ZW50LgogKgogKiBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIGBzdHlsZWAgYW5kIGxvY2F0ZXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbnRlbnQgKHN1Y2ggYXMgdXJscyBhbmQKICogamF2YXNjcmlwdCkgYW5kIHJlbW92ZXMgaXQuCiAqCiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hcmsgYSBzdHJpbmcgYXMgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZX0uCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gdW5zYWZlU3R5bGUgdW50cnVzdGVkIGBzdHlsZWAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcmV0dXJuIHs/fSBgc3R5bGVgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQgdG8gdGhlIGBzdHlsZWAgcHJvcGVydGllcywgYmVjYXVzZSBhbGwgb2YgdGhlCiAqIGRhbmdlcm91cyBqYXZhc2NyaXB0IGFuZCB1cmxzIGhhdmUgYmVlbiByZW1vdmVkLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplU3R5bGUodW5zYWZlU3R5bGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgaWYgKHNhbml0aXplcikgewogICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlNUWUxFLCB1bnNhZmVTdHlsZSkgfHwgJyc7CiAgICB9CiAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh1bnNhZmVTdHlsZSwgIlN0eWxlIiAvKiBTdHlsZSAqLykpIHsKICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHVuc2FmZVN0eWxlKTsKICAgIH0KICAgIHJldHVybiBfc2FuaXRpemVTdHlsZShyZW5kZXJTdHJpbmdpZnkodW5zYWZlU3R5bGUpKTsKfQovKioKICogQSBgdXJsYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGB1cmxgICoqc3RyaW5nKiogaW50byB0cnVzdGVkIHN0cmluZyBieSByZW1vdmluZwogKiBkYW5nZXJvdXMKICogY29udGVudC4KICoKICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBgdXJsYCBhbmQgbG9jYXRlcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY29udGVudCAoc3VjaCBhcyBqYXZhc2NyaXB0KSBhbmQKICogcmVtb3ZlcyBpdC4KICoKICogSXQgaXMgcG9zc2libGUgdG8gbWFyayBhIHN0cmluZyBhcyB0cnVzdGVkIGJ5IGNhbGxpbmcge1xAbGluayBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybH0uCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gdW5zYWZlVXJsIHVudHJ1c3RlZCBgdXJsYCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuCiAqIEByZXR1cm4gez99IGB1cmxgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQgdG8gdGhlIGBzcmNgIHByb3BlcnRpZXMgc3VjaCBhcyBgPGltZyBzcmM+YCwgYmVjYXVzZQogKiBhbGwgb2YgdGhlIGRhbmdlcm91cyBqYXZhc2NyaXB0IGhhcyBiZWVuIHJlbW92ZWQuCiAqCiAqLwpmdW5jdGlvbiDJtcm1c2FuaXRpemVVcmwodW5zYWZlVXJsKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzYW5pdGl6ZXIgPSBnZXRTYW5pdGl6ZXIoKTsKICAgIGlmIChzYW5pdGl6ZXIpIHsKICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5VUkwsIHVuc2FmZVVybCkgfHwgJyc7CiAgICB9CiAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh1bnNhZmVVcmwsICJVUkwiIC8qIFVybCAqLykpIHsKICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHVuc2FmZVVybCk7CiAgICB9CiAgICByZXR1cm4gX3Nhbml0aXplVXJsKHJlbmRlclN0cmluZ2lmeSh1bnNhZmVVcmwpKTsKfQovKioKICogQSBgdXJsYCBzYW5pdGl6ZXIgd2hpY2ggb25seSBsZXRzIHRydXN0ZWQgYHVybGBzIHRocm91Z2guCiAqCiAqIFRoaXMgcGFzc2VzIG9ubHkgYHVybGBzIG1hcmtlZCB0cnVzdGVkIGJ5IGNhbGxpbmcge1xAbGluayBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFJlc291cmNlVXJsfS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB1bnNhZmVSZXNvdXJjZVVybCB1bnRydXN0ZWQgYHVybGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcmV0dXJuIHs/fSBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kIHRvIHRoZSBgc3JjYCBwcm9wZXJ0aWVzIHN1Y2ggYXMgYDxpbWcgc3JjPmAsIGJlY2F1c2UKICogb25seSB0cnVzdGVkIGB1cmxgcyBoYXZlIGJlZW4gYWxsb3dlZCB0byBwYXNzLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplUmVzb3VyY2VVcmwodW5zYWZlUmVzb3VyY2VVcmwpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgaWYgKHNhbml0aXplcikgewogICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdW5zYWZlUmVzb3VyY2VVcmwpIHx8ICcnOwogICAgfQogICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlUmVzb3VyY2VVcmwsICJSZXNvdXJjZVVSTCIgLyogUmVzb3VyY2VVcmwgKi8pKSB7CiAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVSZXNvdXJjZVVybCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgcmVzb3VyY2UgVVJMIGNvbnRleHQgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpJyk7Cn0KLyoqCiAqIEEgYHNjcmlwdGAgc2FuaXRpemVyIHdoaWNoIG9ubHkgbGV0cyB0cnVzdGVkIGphdmFzY3JpcHQgdGhyb3VnaC4KICoKICogVGhpcyBwYXNzZXMgb25seSBgc2NyaXB0YHMgbWFya2VkIHRydXN0ZWQgYnkgY2FsbGluZyB7XEBsaW5rCiAqIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0fS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB1bnNhZmVTY3JpcHQgdW50cnVzdGVkIGBzY3JpcHRgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci4KICogQHJldHVybiB7P30gYHVybGAgc3RyaW5nIHdoaWNoIGlzIHNhZmUgdG8gYmluZCB0byB0aGUgYDxzY3JpcHQ+YCBlbGVtZW50IHN1Y2ggYXMgYDxpbWcgc3JjPmAsCiAqIGJlY2F1c2Ugb25seSB0cnVzdGVkIGBzY3JpcHRzYCBoYXZlIGJlZW4gYWxsb3dlZCB0byBwYXNzLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplU2NyaXB0KHVuc2FmZVNjcmlwdCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7CiAgICBpZiAoc2FuaXRpemVyKSB7CiAgICAgICAgcmV0dXJuIHNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuU0NSSVBULCB1bnNhZmVTY3JpcHQpIHx8ICcnOwogICAgfQogICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlU2NyaXB0LCAiU2NyaXB0IiAvKiBTY3JpcHQgKi8pKSB7CiAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVTY3JpcHQpOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Jyk7Cn0KLyoqCiAqIERldGVjdHMgd2hpY2ggc2FuaXRpemVyIHRvIHVzZSBmb3IgVVJMIHByb3BlcnR5LCBiYXNlZCBvbiB0YWcgbmFtZSBhbmQgcHJvcCBuYW1lLgogKgogKiBUaGUgcnVsZXMgYXJlIGJhc2VkIG9uIHRoZSBSRVNPVVJDRV9VUkwgY29udGV4dCBjb25maWcgZnJvbQogKiBgcGFja2FnZXMvY29tcGlsZXIvc3JjL3NjaGVtYS9kb21fc2VjdXJpdHlfc2NoZW1hLnRzYC4KICogSWYgdGFnIGFuZCBwcm9wIG5hbWVzIGRvbid0IG1hdGNoIFJlc291cmNlIFVSTCBzY2hlbWEsIHVzZSBVUkwgc2FuaXRpemVyLgogKiBAcGFyYW0gez99IHRhZwogKiBAcGFyYW0gez99IHByb3AKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFVybFNhbml0aXplcih0YWcsIHByb3ApIHsKICAgIGlmICgocHJvcCA9PT0gJ3NyYycgJiYKICAgICAgICAodGFnID09PSAnZW1iZWQnIHx8IHRhZyA9PT0gJ2ZyYW1lJyB8fCB0YWcgPT09ICdpZnJhbWUnIHx8IHRhZyA9PT0gJ21lZGlhJyB8fAogICAgICAgICAgICB0YWcgPT09ICdzY3JpcHQnKSkgfHwKICAgICAgICAocHJvcCA9PT0gJ2hyZWYnICYmICh0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdsaW5rJykpKSB7CiAgICAgICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsOwogICAgfQogICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVVybDsKfQovKioKICogU2FuaXRpemVzIFVSTCwgc2VsZWN0aW5nIHNhbml0aXplciBmdW5jdGlvbiBiYXNlZCBvbiB0YWcgYW5kIHByb3BlcnR5IG5hbWVzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gY2FzZSB3ZSBjYW4ndCBkZWZpbmUgc2VjdXJpdHkgY29udGV4dCBhdCBjb21waWxlIHRpbWUsIHdoZW4gb25seSBwcm9wCiAqIG5hbWUgaXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBnZW5lcmF0ZSBob3N0IGJpbmRpbmdzIGZvciBEaXJlY3RpdmVzL0NvbXBvbmVudHMuIFRoZQogKiBob3N0IGVsZW1lbnQgaXMgdW5rbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIGRlZmVyIGNhbGN1bGF0aW9uIG9mIHNwZWNpZmljIHNhbml0aXplciB0bwogKiBydW50aW1lLgogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHVuc2FmZVVybCB1bnRydXN0ZWQgYHVybGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcGFyYW0gez99IHRhZyB0YXJnZXQgZWxlbWVudCB0YWcgbmFtZS4KICogQHBhcmFtIHs/fSBwcm9wIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlLgogKiBAcmV0dXJuIHs/fSBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCh1bnNhZmVVcmwsIHRhZywgcHJvcCkgewogICAgcmV0dXJuIGdldFVybFNhbml0aXplcih0YWcsIHByb3ApKHVuc2FmZVVybCk7Cn0KLyoqCiAqIFRoZSBkZWZhdWx0IHN0eWxlIHNhbml0aXplciB3aWxsIGhhbmRsZSBzYW5pdGl6YXRpb24gZm9yIHN0eWxlIHByb3BlcnRpZXMgYnkKICogc2FuaXRpemluZyBhbnkgQ1NTIHByb3BlcnR5IHRoYXQgY2FuIGluY2x1ZGUgYSBgdXJsYCB2YWx1ZSAodXN1YWxseSBpbWFnZS1iYXNlZCBwcm9wZXJ0aWVzKQogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IMm1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXIgPSAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKioKICogQHBhcmFtIHs/fSBwcm9wCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/PX0gbW9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gKHByb3AsIHZhbHVlLCBtb2RlKSB7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtb2RlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCBgU3R5bGVTYW5pdGl6ZUZuYCBzaG91bGQgbm90IGV4aXN0IG9uY2UgUFIjMzQ0ODAKICAgICAgICAvLyBsYW5kcy4gRm9yIG5vdyB0aGUgYFN0eWxlU2FuaXRpemVGbmAgYW5kIHNob3VsZCBhY3QgbGlrZSBgKHZhbHVlOiBhbnkpID0+IHN0cmluZ2AgYXMgYQogICAgICAgIC8vIHdvcmsgYXJvdW5kLgogICAgICAgIHJldHVybiDJtcm1c2FuaXRpemVTdHlsZShwcm9wKTsKICAgIH0KICAgIG1vZGUgPSBtb2RlIHx8IDMgLyogVmFsaWRhdGVBbmRTYW5pdGl6ZSAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkb1Nhbml0aXplVmFsdWUgPSB0cnVlOwogICAgaWYgKG1vZGUgJiAxIC8qIFZhbGlkYXRlUHJvcGVydHkgKi8pIHsKICAgICAgICBkb1Nhbml0aXplVmFsdWUgPSBzdHlsZVByb3BOZWVkc1Nhbml0aXphdGlvbihwcm9wKTsKICAgIH0KICAgIGlmIChtb2RlICYgMiAvKiBTYW5pdGl6ZU9ubHkgKi8pIHsKICAgICAgICByZXR1cm4gZG9TYW5pdGl6ZVZhbHVlID8gybXJtXNhbml0aXplU3R5bGUodmFsdWUpIDogdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBkb1Nhbml0aXplVmFsdWU7CiAgICB9Cn0pKSkpOwovKioKICogQHBhcmFtIHs/fSBwcm9wCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdHlsZVByb3BOZWVkc1Nhbml0aXphdGlvbihwcm9wKSB7CiAgICByZXR1cm4gcHJvcCA9PT0gJ2JhY2tncm91bmQtaW1hZ2UnIHx8IHByb3AgPT09ICdiYWNrZ3JvdW5kSW1hZ2UnIHx8IHByb3AgPT09ICdiYWNrZ3JvdW5kJyB8fAogICAgICAgIHByb3AgPT09ICdib3JkZXItaW1hZ2UnIHx8IHByb3AgPT09ICdib3JkZXJJbWFnZScgfHwgcHJvcCA9PT0gJ2JvcmRlci1pbWFnZS1zb3VyY2UnIHx8CiAgICAgICAgcHJvcCA9PT0gJ2JvcmRlckltYWdlU291cmNlJyB8fCBwcm9wID09PSAnZmlsdGVyJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZScgfHwKICAgICAgICBwcm9wID09PSAnbGlzdFN0eWxlJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZS1pbWFnZScgfHwgcHJvcCA9PT0gJ2xpc3RTdHlsZUltYWdlJyB8fAogICAgICAgIHByb3AgPT09ICdjbGlwLXBhdGgnIHx8IHByb3AgPT09ICdjbGlwUGF0aCc7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdmFsaWRhdGVBZ2FpbnN0RXZlbnRQcm9wZXJ0aWVzKG5hbWUpIHsKICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb24nKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtc2cgPSBgQmluZGluZyB0byBldmVudCBwcm9wZXJ0eSAnJHtuYW1lfScgaXMgZGlzYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucywgYCArCiAgICAgICAgICAgIGBwbGVhc2UgdXNlICgke25hbWUuc2xpY2UoMil9KT0uLi5gICsKICAgICAgICAgICAgYFxuSWYgJyR7bmFtZX0nIGlzIGEgZGlyZWN0aXZlIGlucHV0LCBtYWtlIHN1cmUgdGhlIGRpcmVjdGl2ZSBpcyBpbXBvcnRlZCBieSB0aGVgICsKICAgICAgICAgICAgYCBjdXJyZW50IG1vZHVsZS5gOwogICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZhbGlkYXRlQWdhaW5zdEV2ZW50QXR0cmlidXRlcyhuYW1lKSB7CiAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ29uJykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbXNnID0gYEJpbmRpbmcgdG8gZXZlbnQgYXR0cmlidXRlICcke25hbWV9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBgICsKICAgICAgICAgICAgYHBsZWFzZSB1c2UgKCR7bmFtZS5zbGljZSgyKX0pPS4uLmA7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICB9Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRTYW5pdGl6ZXIoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICByZXR1cm4gbFZpZXcgJiYgbFZpZXdbU0FOSVRJWkVSXTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogVEhJUyBGSUxFIENPTlRBSU5TIENPREUgV0hJQ0ggU0hPVUxEIEJFIFRSRUUgU0hBS0VOIEFORCBORVZFUiBDQUxMRUQgRlJPTSBQUk9EVUNUSU9OIENPREUhISEKICovCi8qKgogKiBDcmVhdGVzIGFuIGBBcnJheWAgY29uc3RydWN0aW9uIHdpdGggYSBnaXZlbiBuYW1lLiBUaGlzIGlzIHVzZWZ1bCB3aGVuCiAqIGxvb2tpbmcgZm9yIG1lbW9yeSBjb25zdW1wdGlvbiB0byBzZWUgd2hhdCB0aW1lIG9mIGFycmF5IGl0IGlzLgogKgogKgogKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGdpdmUgdG8gdGhlIGNvbnN0cnVjdG9yCiAqIEByZXR1cm5zIEEgc3ViY2xhc3Mgb2YgYEFycmF5YCBpZiBwb3NzaWJsZS4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluCiAqICAgICAgICAgIGVudmlyb25tZW50cyB3aGljaCBzdXBwb3J0IGBjbGFzc2AgY29uc3RydWN0LgogKi8KZnVuY3Rpb24gY3JlYXRlTmFtZWRBcnJheVR5cGUobmFtZSkgewogICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIHByb2QgbW9kZSwgc28gbGV0J3MgdmVyaWZ5IHRoYXQgaXMgdGhlIGNhc2UuCiAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyBpdCB0aGlzIHdheSBzbyB0aGF0IFR5cGVTY3JpcHQgZG9lcyBub3QgZG93bi1sZXZlbCB0aGUgYmVsb3cgY29kZS4KICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Db25zdHJ1Y3RvciA9IGNyZWF0ZU5hbWVkQXJyYXlUeXBlLmNvbnN0cnVjdG9yOwogICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbkNvbnN0cnVjdG9yKCdBcnJheScsIGByZXR1cm4gY2xhc3MgJHtuYW1lfSBleHRlbmRzIEFycmF5e31gKSkoQXJyYXkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAvLyBJZiBpdCBkb2VzIG5vdCB3b3JrIGp1c3QgZ2l2ZSB1cCBhbmQgZmFsbCBiYWNrIHRvIHJlZ3VsYXIgQXJyYXkuCiAgICAgICAgICAgIHJldHVybiBBcnJheTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvb2tzIGxpa2Ugd2UgYXJlIGluIFwncHJvZCBtb2RlXCcsIGJ1dCB3ZSBhcmUgY3JlYXRpbmcgYSBuYW1lZCBBcnJheSB0eXBlLCB3aGljaCBpcyB3cm9uZyEgQ2hlY2sgeW91ciBjb2RlJyk7CiAgICB9Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KZnVuY3Rpb24gbm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZShuYW1lKSB7CiAgICAvLyBBdHRyaWJ1dGUgbmFtZXMgd2l0aCBgJGAgKGVnIGB4LXkkYCkgYXJlIHZhbGlkIHBlciBzcGVjLCBidXQgdW5zdXBwb3J0ZWQgYnkgc29tZSBicm93c2VycwogICAgbmFtZSA9IGNhbWVsQ2FzZVRvRGFzaENhc2UobmFtZS5yZXBsYWNlKC9bJEBdL2csICdfJykpOwogICAgcmV0dXJuIGBuZy1yZWZsZWN0LSR7bmFtZX1gOwp9CmNvbnN0IENBTUVMX0NBU0VfUkVHRVhQID0gLyhbQS1aXSkvZzsKZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dCkgewogICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoQ0FNRUxfQ0FTRV9SRUdFWFAsICguLi5tKSA9PiAnLScgKyBtWzFdLnRvTG93ZXJDYXNlKCkpOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZURlYnVnQmluZGluZ1ZhbHVlKHZhbHVlKSB7CiAgICB0cnkgewogICAgICAgIC8vIExpbWl0IHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBhcyBvdGhlcndpc2UgdGhlIERPTSBqdXN0IGdldHMgcG9sbHV0ZWQuCiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpLnNsaWNlKDAsIDMwKSA6IHZhbHVlOwogICAgfQogICAgY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gJ1tFUlJPUl0gRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBzZXJpYWxpemUgdGhlIHZhbHVlJzsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9jb250ZXh0X2Rpc2NvdmVyeS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgYExDb250ZXh0YCBkYXRhIGZvciBhIGdpdmVuIERPTSBub2RlLCBkaXJlY3RpdmUgb3IgY29tcG9uZW50IGluc3RhbmNlLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZXhhbWluZSB0aGUgcHJvdmlkZWQgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCwgb3IgZGlyZWN0aXZlIGluc3RhbmNlXCdzCiAqIG1vbmtleS1wYXRjaGVkIHByb3BlcnR5IHRvIGRlcml2ZSB0aGUgYExDb250ZXh0YCBkYXRhLiBPbmNlIGNhbGxlZCB0aGVuIHRoZSBtb25rZXktcGF0Y2hlZAogKiB2YWx1ZSB3aWxsIGJlIHRoYXQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgYExDb250ZXh0YC4KICoKICogSWYgdGhlIG1vbmtleS1wYXRjaGVkIHZhbHVlIGlzIHRoZSBgTFZpZXdgIGluc3RhbmNlIHRoZW4gdGhlIGNvbnRleHQgdmFsdWUgZm9yIHRoYXQKICogdGFyZ2V0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIG1vbmtleS1wYXRjaCByZWZlcmVuY2Ugd2lsbCBiZSB1cGRhdGVkLiBUaGVyZWZvcmUgd2hlbiB0aGlzCiAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBpdCBtYXkgbXV0YXRlIHRoZSBwcm92aWRlZCBlbGVtZW50XCdzLCBjb21wb25lbnRcJ3Mgb3IgYW55IG9mIHRoZSBhc3NvY2lhdGVkCiAqIGRpcmVjdGl2ZVwncyBtb25rZXktcGF0Y2ggdmFsdWVzLgogKgogKiBJZiB0aGUgbW9ua2V5LXBhdGNoIHZhbHVlIGlzIG5vdCBkZXRlY3RlZCB0aGVuIHRoZSBjb2RlIHdpbGwgd2FsayB1cCB0aGUgRE9NIHVudGlsIGFuIGVsZW1lbnQKICogaXMgZm91bmQgd2hpY2ggY29udGFpbnMgYSBtb25rZXktcGF0Y2ggcmVmZXJlbmNlLiBXaGVuIHRoYXQgb2NjdXJzIHRoZW4gdGhlIHByb3ZpZGVkIGVsZW1lbnQKICogd2lsbCBiZSB1cGRhdGVkIHdpdGggYSBuZXcgY29udGV4dCAod2hpY2ggaXMgdGhlbiByZXR1cm5lZCkuIElmIHRoZSBtb25rZXktcGF0Y2ggdmFsdWUgaXMgbm90CiAqIGRldGVjdGVkIGZvciBhIGNvbXBvbmVudC9kaXJlY3RpdmUgaW5zdGFuY2UgdGhlbiBpdCB3aWxsIHRocm93IGFuIGVycm9yIChhbGwgY29tcG9uZW50cyBhbmQKICogZGlyZWN0aXZlcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBtb25rZXktcGF0Y2hlZCBieSBpdnkpLgogKgogKiBAcGFyYW0gez99IHRhcmdldCBDb21wb25lbnQsIERpcmVjdGl2ZSBvciBET00gTm9kZS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExDb250ZXh0KHRhcmdldCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1wVmFsdWUgPSByZWFkUGF0Y2hlZERhdGEodGFyZ2V0KTsKICAgIGlmIChtcFZhbHVlKSB7CiAgICAgICAgLy8gb25seSB3aGVuIGl0J3MgYW4gYXJyYXkgaXMgaXQgY29uc2lkZXJlZCBhbiBMVmlldyBpbnN0YW5jZQogICAgICAgIC8vIC4uLiBvdGhlcndpc2UgaXQncyBhbiBhbHJlYWR5IGNvbnN0cnVjdGVkIExDb250ZXh0IGluc3RhbmNlCiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobXBWYWx1ZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChtcFZhbHVlKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG5vZGVJbmRleDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkaXJlY3RpdmVzID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoaXNDb21wb25lbnRJbnN0YW5jZSh0YXJnZXQpKSB7CiAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCB0YXJnZXQpOwogICAgICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kIGluIHRoZSBhcHBsaWNhdGlvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcG9uZW50ID0gdGFyZ2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGlyZWN0aXZlSW5zdGFuY2UodGFyZ2V0KSkgewogICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gZmluZFZpYURpcmVjdGl2ZShsVmlldywgdGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmIChub2RlSW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBkaXJlY3RpdmUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYXBwbGljYXRpb24nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSBnZXREaXJlY3RpdmVzQXROb2RlSW5kZXgobm9kZUluZGV4LCBsVmlldywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gZmluZFZpYU5hdGl2ZUVsZW1lbnQobFZpZXcsICgvKiogQHR5cGUgez99ICovICh0YXJnZXQpKSk7CiAgICAgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdGhlIGdvYWwgaXMgbm90IHRvIGZpbGwgdGhlIGVudGlyZSBjb250ZXh0IGZ1bGwgb2YgZGF0YSBiZWNhdXNlIHRoZSBsb29rdXBzCiAgICAgICAgICAgIC8vIGFyZSBleHBlbnNpdmUuIEluc3RlYWQsIG9ubHkgdGhlIHRhcmdldCBkYXRhICh0aGUgZWxlbWVudCwgY29tcG9uZW50LCBjb250YWluZXIsIElDVQogICAgICAgICAgICAvLyBleHByZXNzaW9uIG9yIGRpcmVjdGl2ZSBkZXRhaWxzKSBhcmUgZmlsbGVkIGludG8gdGhlIGNvbnRleHQuIElmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcwogICAgICAgICAgICAvLyB3aXRoIGRpZmZlcmVudCB0YXJnZXQgdmFsdWVzIHRoZW4gdGhlIG1pc3NpbmcgdGFyZ2V0IGRhdGEgd2lsbCBiZSBmaWxsZWQgaW4uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmF0aXZlID0gdW53cmFwUk5vZGUobFZpZXdbbm9kZUluZGV4XSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDdHggPSByZWFkUGF0Y2hlZERhdGEobmF0aXZlKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gKGV4aXN0aW5nQ3R4ICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nQ3R4KSkgPwogICAgICAgICAgICAgICAgZXhpc3RpbmdDdHggOgogICAgICAgICAgICAgICAgY3JlYXRlTENvbnRleHQobFZpZXcsIG5vZGVJbmRleCwgbmF0aXZlKTsKICAgICAgICAgICAgLy8gb25seSB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gZGlzY292ZXJlZCB0aGVuIHVwZGF0ZSB0aGUgbW9ua2V5LXBhdGNoCiAgICAgICAgICAgIGlmIChjb21wb25lbnQgJiYgY29udGV4dC5jb21wb25lbnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgICAgICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEoY29udGV4dC5jb21wb25lbnQsIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZGlzY292ZXJlZCB0aGVuIHVwZGF0ZSB0aGUgbW9ua2V5LXBhdGNoCiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVzICYmIGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGRpcmVjdGl2ZXNbaV0sIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb250ZXh0Lm5hdGl2ZSwgY29udGV4dCk7CiAgICAgICAgICAgIG1wVmFsdWUgPSBjb250ZXh0OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0YXJnZXQpKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RG9tTm9kZShyRWxlbWVudCk7CiAgICAgICAgLy8gaWYgdGhlIGNvbnRleHQgaXMgbm90IGZvdW5kIHRoZW4gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cHdhcmRzIHVwIHRoZSBET00KICAgICAgICAvLyB0byBmaW5kIHRoZSBuZWFyZXN0IGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIG1vbmtleSBwYXRjaGVkIHdpdGggZGF0YQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJFbGVtZW50KSk7CiAgICAgICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9IHJlYWRQYXRjaGVkRGF0YShwYXJlbnQpOwogICAgICAgICAgICBpZiAocGFyZW50Q29udGV4dCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGxWaWV3OwogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50Q29udGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRDb250ZXh0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsVmlldyA9IHBhcmVudENvbnRleHQubFZpZXc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSBvZiB0aGUgYXBwIHdhcyBhbHNvIHJlYWNoZWQgaGVyZSB0aHJvdWdoIGFub3RoZXIgbWVhbnMKICAgICAgICAgICAgICAgIC8vIChtYXliZSBiZWNhdXNlIHRoZSBET00gd2FzIGNoYW5nZWQgbWFudWFsbHkpLgogICAgICAgICAgICAgICAgaWYgKCFsVmlldykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgckVsZW1lbnQpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlID0gdW53cmFwUk5vZGUobFZpZXdbaW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUxDb250ZXh0KGxWaWV3LCBpbmRleCwgbmF0aXZlKTsKICAgICAgICAgICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEobmF0aXZlLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBtcFZhbHVlID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG1wVmFsdWUpKSkgfHwgbnVsbDsKfQovKioKICogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiBhIGBMQ29udGV4dGAgY29udGV4dAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gbm9kZUluZGV4CiAqIEBwYXJhbSB7P30gbmF0aXZlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVMQ29udGV4dChsVmlldywgbm9kZUluZGV4LCBuYXRpdmUpIHsKICAgIHJldHVybiB7CiAgICAgICAgbFZpZXcsCiAgICAgICAgbm9kZUluZGV4LAogICAgICAgIG5hdGl2ZSwKICAgICAgICBjb21wb25lbnQ6IHVuZGVmaW5lZCwKICAgICAgICBkaXJlY3RpdmVzOiB1bmRlZmluZWQsCiAgICAgICAgbG9jYWxSZWZzOiB1bmRlZmluZWQsCiAgICB9Owp9Ci8qKgogKiBUYWtlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmV0dXJucyB0aGUgdmlldyBmb3IgdGhhdCBjb21wb25lbnQuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50SW5zdGFuY2UKICogQHJldHVybiB7P30gVGhlIGNvbXBvbmVudCdzIHZpZXcKICovCmZ1bmN0aW9uIGdldENvbXBvbmVudFZpZXdCeUluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbFZpZXcgPSByZWFkUGF0Y2hlZERhdGEoY29tcG9uZW50SW5zdGFuY2UpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHZpZXc7CiAgICBpZiAoQXJyYXkuaXNBcnJheShsVmlldykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gZmluZFZpYUNvbXBvbmVudChsVmlldywgY29tcG9uZW50SW5zdGFuY2UpOwogICAgICAgIHZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgobm9kZUluZGV4LCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVMQ29udGV4dChsVmlldywgbm9kZUluZGV4LCAoLyoqIEB0eXBlIHs/fSAqLyAodmlld1tIT1NUXSkpKTsKICAgICAgICBjb250ZXh0LmNvbXBvbmVudCA9IGNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb21wb25lbnRJbnN0YW5jZSwgY29udGV4dCk7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGNvbnRleHQubmF0aXZlLCBjb250ZXh0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250ZXh0ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChsVmlldykpKSk7CiAgICAgICAgdmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldyk7CiAgICB9CiAgICByZXR1cm4gdmlldzsKfQovKioKICogQXNzaWducyB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZ2l2ZW4gdGFyZ2V0ICh3aGljaCBjb3VsZCBiZSBhIGNvbXBvbmVudCwKICogZGlyZWN0aXZlIG9yIERPTSBub2RlIGluc3RhbmNlKSB1c2luZyBtb25rZXktcGF0Y2hpbmcuCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEBwYXJhbSB7P30gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXR0YWNoUGF0Y2hEYXRhKHRhcmdldCwgZGF0YSkgewogICAgdGFyZ2V0W01PTktFWV9QQVRDSF9LRVlfTkFNRV0gPSBkYXRhOwp9Ci8qKgogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0NvbXBvbmVudEluc3RhbmNlKGluc3RhbmNlKSB7CiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2UuY29uc3RydWN0b3IgJiYgaW5zdGFuY2UuY29uc3RydWN0b3IuybVjbXA7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzRGlyZWN0aXZlSW5zdGFuY2UoaW5zdGFuY2UpIHsKICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5jb25zdHJ1Y3RvciAmJiBpbnN0YW5jZS5jb25zdHJ1Y3Rvci7JtWRpcjsKfQovKioKICogTG9jYXRlcyB0aGUgZWxlbWVudCB3aXRoaW4gdGhlIGdpdmVuIExWaWV3IGFuZCByZXR1cm5zIHRoZSBtYXRjaGluZyBpbmRleAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgdGFyZ2V0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgIHdoaWxlICh0Tm9kZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZU9yTnVsbCh0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgaWYgKG5hdGl2ZSA9PT0gdGFyZ2V0KSB7CiAgICAgICAgICAgIHJldHVybiB0Tm9kZS5pbmRleDsKICAgICAgICB9CiAgICAgICAgdE5vZGUgPSB0cmF2ZXJzZU5leHRFbGVtZW50KHROb2RlKTsKICAgIH0KICAgIHJldHVybiAtMTsKfQovKioKICogTG9jYXRlcyB0aGUgbmV4dCB0Tm9kZSAoY2hpbGQsIHNpYmxpbmcgb3IgcGFyZW50KS4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdHJhdmVyc2VOZXh0RWxlbWVudCh0Tm9kZSkgewogICAgaWYgKHROb2RlLmNoaWxkKSB7CiAgICAgICAgcmV0dXJuIHROb2RlLmNoaWxkOwogICAgfQogICAgZWxzZSBpZiAodE5vZGUubmV4dCkgewogICAgICAgIHJldHVybiB0Tm9kZS5uZXh0OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gTGV0J3MgdGFrZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiA8ZGl2PjxzcGFuPnRleHQ8L3NwYW4+PC9kaXY+PGNvbXBvbmVudC8+CiAgICAgICAgLy8gQWZ0ZXIgY2hlY2tpbmcgdGhlIHRleHQgbm9kZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBuZXh0IHBhcmVudCB0aGF0IGhhcyBhICJuZXh0IiBUTm9kZSwKICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHBhcmVudCBgZGl2YCwgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGUgY29tcG9uZW50LgogICAgICAgIHdoaWxlICh0Tm9kZS5wYXJlbnQgJiYgIXROb2RlLnBhcmVudC5uZXh0KSB7CiAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdE5vZGUucGFyZW50ICYmIHROb2RlLnBhcmVudC5uZXh0OwogICAgfQp9Ci8qKgogKiBMb2NhdGVzIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGNvbXBvbmVudEluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCBjb21wb25lbnRJbnN0YW5jZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50SW5kaWNlcyA9IGxWaWV3W1RWSUVXXS5jb21wb25lbnRzOwogICAgaWYgKGNvbXBvbmVudEluZGljZXMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudEluZGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50Q29tcG9uZW50SW5kZXggPSBjb21wb25lbnRJbmRpY2VzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgoZWxlbWVudENvbXBvbmVudEluZGV4LCBsVmlldyk7CiAgICAgICAgICAgIGlmIChjb21wb25lbnRWaWV3W0NPTlRFWFRdID09PSBjb21wb25lbnRJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb21wb25lbnRJbmRleDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290Q29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChIRUFERVJfT0ZGU0VULCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50Vmlld1tDT05URVhUXTsKICAgICAgICBpZiAocm9vdENvbXBvbmVudCA9PT0gY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgICAgICAgLy8gd2UgYXJlIGRlYWxpbmcgd2l0aCB0aGUgcm9vdCBlbGVtZW50IGhlcmUgdGhlcmVmb3JlIHdlIGtub3cgdGhhdCB0aGUKICAgICAgICAgICAgLy8gZWxlbWVudCBpcyB0aGUgdmVyeSBmaXJzdCBlbGVtZW50IGFmdGVyIHRoZSBIRUFERVIgZGF0YSBpbiB0aGUgbFZpZXcKICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9PRkZTRVQ7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9Ci8qKgogKiBMb2NhdGVzIHRoZSBkaXJlY3RpdmUgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kVmlhRGlyZWN0aXZlKGxWaWV3LCBkaXJlY3RpdmVJbnN0YW5jZSkgewogICAgLy8gaWYgYSBkaXJlY3RpdmUgaXMgbW9ua2V5IHBhdGNoZWQgdGhlbiBpdCB3aWxsIChieSBkZWZhdWx0KQogICAgLy8gaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgTFZpZXcgb2YgdGhlIGN1cnJlbnQgdmlldy4gVGhlCiAgICAvLyBlbGVtZW50IGJvdW5kIHRvIHRoZSBkaXJlY3RpdmUgYmVpbmcgc2VhcmNoIGxpdmVzIHNvbWV3aGVyZQogICAgLy8gaW4gdGhlIHZpZXcgZGF0YS4gV2UgbG9vcCB0aHJvdWdoIHRoZSBub2RlcyBhbmQgY2hlY2sgdGhlaXIKICAgIC8vIGxpc3Qgb2YgZGlyZWN0aXZlcyBmb3IgdGhlIGluc3RhbmNlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHROb2RlID0gbFZpZXdbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICB3aGlsZSAodE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlSW5kZXhTdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVJbmRleEVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgICAgICBmb3IgKGxldCBpID0gZGlyZWN0aXZlSW5kZXhTdGFydDsgaSA8IGRpcmVjdGl2ZUluZGV4RW5kOyBpKyspIHsKICAgICAgICAgICAgaWYgKGxWaWV3W2ldID09PSBkaXJlY3RpdmVJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHROb2RlLmluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHROb2RlID0gdHJhdmVyc2VOZXh0RWxlbWVudCh0Tm9kZSk7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KLyoqCiAqIFJldHVybnMgYSBsaXN0IG9mIGRpcmVjdGl2ZXMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIHZpZXcgYmFzZWQgb24gdGhlCiAqIHByb3ZpZGVkIGxpc3Qgb2YgZGlyZWN0aXZlIGluZGV4IHZhbHVlcy4KICoKICogQHBhcmFtIHs/fSBub2RlSW5kZXggVGhlIG5vZGUgaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdGFyZ2V0IHZpZXcgZGF0YQogKiBAcGFyYW0gez99IGluY2x1ZGVDb21wb25lbnRzIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgY29tcG9uZW50cyBpbiByZXR1cm5lZCBkaXJlY3RpdmVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREaXJlY3RpdmVzQXROb2RlSW5kZXgobm9kZUluZGV4LCBsVmlldywgaW5jbHVkZUNvbXBvbmVudHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaXJlY3RpdmVTdGFydEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICBpZiAoZGlyZWN0aXZlU3RhcnRJbmRleCA9PSAwKQogICAgICAgIHJldHVybiBFTVBUWV9BUlJBWTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZUVuZEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgaWYgKCFpbmNsdWRlQ29tcG9uZW50cyAmJiB0Tm9kZS5mbGFncyAmIDIgLyogaXNDb21wb25lbnRIb3N0ICovKQogICAgICAgIGRpcmVjdGl2ZVN0YXJ0SW5kZXgrKzsKICAgIHJldHVybiBsVmlldy5zbGljZShkaXJlY3RpdmVTdGFydEluZGV4LCBkaXJlY3RpdmVFbmRJbmRleCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbm9kZUluZGV4CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbXBvbmVudEF0Tm9kZUluZGV4KG5vZGVJbmRleCwgbFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaXJlY3RpdmVTdGFydEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICByZXR1cm4gdE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLyA/IGxWaWV3W2RpcmVjdGl2ZVN0YXJ0SW5kZXhdIDogbnVsbDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9lcnJvcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENhbGxlZCB3aGVuIGRpcmVjdGl2ZXMgaW5qZWN0IGVhY2ggb3RoZXIgKGNyZWF0aW5nIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSkKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGhyb3dDeWNsaWNEZXBlbmRlbmN5RXJyb3IodG9rZW4pIHsKICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3RhbnRpYXRlIGN5Y2xpYyBkZXBlbmRlbmN5ISAke3Rva2VufWApOwp9Ci8qKgogKiBDYWxsZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgY29tcG9uZW50IHNlbGVjdG9ycyB0aGF0IG1hdGNoIGEgZ2l2ZW4gbm9kZQogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd011bHRpcGxlQ29tcG9uZW50RXJyb3IodE5vZGUpIHsKICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgY29tcG9uZW50cyBtYXRjaCBub2RlIHdpdGggdGFnbmFtZSAke3ROb2RlLnRhZ05hbWV9YCk7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd01peGVkTXVsdGlQcm92aWRlckVycm9yKCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWl4IG11bHRpIHByb3ZpZGVycyBhbmQgcmVndWxhciBwcm92aWRlcnNgKTsKfQovKioKICogQHBhcmFtIHs/PX0gbmdNb2R1bGVUeXBlCiAqIEBwYXJhbSB7Pz19IHByb3ZpZGVycwogKiBAcGFyYW0gez89fSBwcm92aWRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGhyb3dJbnZhbGlkUHJvdmlkZXJFcnJvcihuZ01vZHVsZVR5cGUsIHByb3ZpZGVycywgcHJvdmlkZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ01vZHVsZURldGFpbCA9ICcnOwogICAgaWYgKG5nTW9kdWxlVHlwZSAmJiBwcm92aWRlcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXJEZXRhaWwgPSBwcm92aWRlcnMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHYgPT4gdiA9PSBwcm92aWRlciA/ICc/JyArIHByb3ZpZGVyICsgJz8nIDogJy4uLicpKTsKICAgICAgICBuZ01vZHVsZURldGFpbCA9CiAgICAgICAgICAgIGAgLSBvbmx5IGluc3RhbmNlcyBvZiBQcm92aWRlciBhbmQgVHlwZSBhcmUgYWxsb3dlZCwgZ290OiBbJHtwcm92aWRlckRldGFpbC5qb2luKCcsICcpfV1gOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb3ZpZGVyIGZvciB0aGUgTmdNb2R1bGUgJyR7c3RyaW5naWZ5KG5nTW9kdWxlVHlwZSl9J2AgKyBuZ01vZHVsZURldGFpbCk7Cn0KLyoqCiAqIFRocm93cyBhbiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVyQ2hlY2tlZCBlcnJvciBpZiBjaGVja05vQ2hhbmdlcyBtb2RlIGlzIG9uLgogKiBAcGFyYW0gez99IGNyZWF0aW9uTW9kZQogKiBAcGFyYW0gez99IG9sZFZhbHVlCiAqIEBwYXJhbSB7P30gY3VyclZhbHVlCiAqIEBwYXJhbSB7Pz19IHByb3BOYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd0Vycm9ySWZOb0NoYW5nZXNNb2RlKGNyZWF0aW9uTW9kZSwgb2xkVmFsdWUsIGN1cnJWYWx1ZSwgcHJvcE5hbWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpZWxkID0gcHJvcE5hbWUgPyBgIGZvciAnJHtwcm9wTmFtZX0nYCA6ICcnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1zZyA9IGBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yOiBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLiBQcmV2aW91cyB2YWx1ZSR7ZmllbGR9OiAnJHtvbGRWYWx1ZX0nLiBDdXJyZW50IHZhbHVlOiAnJHtjdXJyVmFsdWV9Jy5gOwogICAgaWYgKGNyZWF0aW9uTW9kZSkgewogICAgICAgIG1zZyArPQogICAgICAgICAgICBgIEl0IHNlZW1zIGxpa2UgdGhlIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBpdHMgcGFyZW50IGFuZCBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGRpcnR5IGNoZWNrZWQuYCArCiAgICAgICAgICAgICAgICBgIEhhcyBpdCBiZWVuIGNyZWF0ZWQgaW4gYSBjaGFuZ2UgZGV0ZWN0aW9uIGhvb2s/YDsKICAgIH0KICAgIC8vIFRPRE86IGluY2x1ZGUgZGVidWcgY29udGV4dCwgc2VlIGB2aWV3RGVidWdFcnJvcmAgZnVuY3Rpb24gaW4KICAgIC8vIGBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L2Vycm9ycy50c2AgZm9yIHJlZmVyZW5jZS4KICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwp9Ci8qKgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcm9vdEluZGV4CiAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbkluZGV4CiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcGFyYW0gez99IGNoYW5nZWRWYWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29uc3RydWN0RGV0YWlsc0ZvckludGVycG9sYXRpb24obFZpZXcsIHJvb3RJbmRleCwgZXhwcmVzc2lvbkluZGV4LCBtZXRhLCBjaGFuZ2VkVmFsdWUpIHsKICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJlZml4LCAuLi5jaHVua3NdID0gbWV0YS5zcGxpdChJTlRFUlBPTEFUSU9OX0RFTElNSVRFUik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgb2xkVmFsdWUgPSBwcmVmaXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV3VmFsdWUgPSBwcmVmaXg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90SWR4ID0gcm9vdEluZGV4ICsgaTsKICAgICAgICBvbGRWYWx1ZSArPSBgJHtsVmlld1tzbG90SWR4XX0ke2NodW5rc1tpXX1gOwogICAgICAgIG5ld1ZhbHVlICs9IGAke3Nsb3RJZHggPT09IGV4cHJlc3Npb25JbmRleCA/IGNoYW5nZWRWYWx1ZSA6IGxWaWV3W3Nsb3RJZHhdfSR7Y2h1bmtzW2ldfWA7CiAgICB9CiAgICByZXR1cm4geyBwcm9wTmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlIH07Cn0KLyoqCiAqIENvbnN0cnVjdHMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGV0YWlscyBmb3IgdGhlIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6CiAqIC0gcHJvcGVydHkgbmFtZSAoZm9yIHByb3BlcnR5IGJpbmRpbmdzIG9yIGludGVycG9sYXRpb25zKQogKiAtIG9sZCBhbmQgbmV3IHZhbHVlcywgZW5yaWNoZWQgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBtZXRhZGF0YQogKgogKiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBtZXRhZGF0YSBzdG9yYWdlIGZvcm1hdCBjYW4gYmUgZm91bmQgaW4gYHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGFgCiAqIGZ1bmN0aW9uIGRlc2NyaXB0aW9uLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4CiAqIEBwYXJhbSB7P30gb2xkVmFsdWUKICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbkNoYW5nZWRFcnJvckRldGFpbHMobFZpZXcsIGJpbmRpbmdJbmRleCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0RGF0YSA9IGxWaWV3W1RWSUVXXS5kYXRhOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWV0YWRhdGEgPSB0RGF0YVtiaW5kaW5nSW5kZXhdOwogICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAvLyBtZXRhZGF0YSBmb3IgcHJvcGVydHkgaW50ZXJwb2xhdGlvbgogICAgICAgIGlmIChtZXRhZGF0YS5pbmRleE9mKElOVEVSUE9MQVRJT05fREVMSU1JVEVSKSA+IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3REZXRhaWxzRm9ySW50ZXJwb2xhdGlvbihsVmlldywgYmluZGluZ0luZGV4LCBiaW5kaW5nSW5kZXgsIG1ldGFkYXRhLCBuZXdWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSBiaW5kaW5nCiAgICAgICAgcmV0dXJuIHsgcHJvcE5hbWU6IG1ldGFkYXRhLCBvbGRWYWx1ZSwgbmV3VmFsdWUgfTsKICAgIH0KICAgIC8vIG1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgY2hlY2sgaWYgdGhpcyBleHByZXNzaW9uIGlzIGEgcGFydCBvZiB0aGUKICAgIC8vIHByb3BlcnR5IGludGVycG9sYXRpb24gYnkgZ29pbmcgZnJvbSB0aGUgY3VycmVudCBiaW5kaW5nIGluZGV4IGxlZnQgYW5kIGxvb2sgZm9yIGEgc3RyaW5nIHRoYXQKICAgIC8vIGNvbnRhaW5zIElOVEVSUE9MQVRJT05fREVMSU1JVEVSLCB0aGUgbGF5b3V0IGluIHRWaWV3LmRhdGEgZm9yIHRoaXMgY2FzZSB3aWxsIGxvb2sgbGlrZSB0aGlzOgogICAgLy8gWy4uLiwgJ2lk77+9UHJlZml4IO+/vSBhbmQg77+9IHN1ZmZpeCcsIG51bGwsIG51bGwsIG51bGwsIC4uLl0KICAgIGlmIChtZXRhZGF0YSA9PT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaWR4ID0gYmluZGluZ0luZGV4IC0gMTsKICAgICAgICB3aGlsZSAodHlwZW9mIHREYXRhW2lkeF0gIT09ICdzdHJpbmcnICYmIHREYXRhW2lkeCArIDFdID09PSBudWxsKSB7CiAgICAgICAgICAgIGlkeC0tOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0YSA9IHREYXRhW2lkeF07CiAgICAgICAgaWYgKHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBtZXRhLm1hdGNoKG5ldyBSZWdFeHAoSU5URVJQT0xBVElPTl9ERUxJTUlURVIsICdnJykpOwogICAgICAgICAgICAvLyBmaXJzdCBpbnRlcnBvbGF0aW9uIGRlbGltaXRlciBzZXBhcmF0ZXMgcHJvcGVydHkgbmFtZSBmcm9tIGludGVycG9sYXRpb24gcGFydHMgKGluIGNhc2Ugb2YKICAgICAgICAgICAgLy8gcHJvcGVydHkgaW50ZXJwb2xhdGlvbnMpLCBzbyB3ZSBzdWJ0cmFjdCBvbmUgZnJvbSB0b3RhbCBudW1iZXIgb2YgZm91bmQgZGVsaW1pdGVycwogICAgICAgICAgICBpZiAobWF0Y2hlcyAmJiAobWF0Y2hlcy5sZW5ndGggLSAxKSA+IGJpbmRpbmdJbmRleCAtIGlkeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdERldGFpbHNGb3JJbnRlcnBvbGF0aW9uKGxWaWV3LCBpZHgsIGJpbmRpbmdJbmRleCwgbWV0YSwgbmV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgcHJvcE5hbWU6IHVuZGVmaW5lZCwgb2xkVmFsdWUsIG5ld1ZhbHVlIH07Cn0KLyoqCiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgVE5vZGVgIGhhcyBhIGRpcmVjdGl2ZSB3aGljaCBoYXMgYFxASW5wdXQoKWAgZm9yIGBjbGFzc2AgYmluZGluZy4KICoKICogYGBgCiAqIDxkaXYgbXktZGlyIFtjbGFzc109ImV4cCI+PC9kaXY+CiAqIGBgYAogKiBhbmQKICogYGBgCiAqIFxARGlyZWN0aXZlKHsKICogfSkKICogY2xhc3MgTXlEaXJlY3RpdmUgewogKiBcQElucHV0KCkKICogICBjbGFzczogc3RyaW5nOwogKiB9CiAqIGBgYAogKgogKiBJbiB0aGUgYWJvdmUgY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJlY29uY2lsZWQgc3R5bGluZyBpbmZvcm1hdGlvbiBpbnRvIHRoZQogKiBkaXJlY3RpdmUncyBpbnB1dC4KICoKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzQ2xhc3NJbnB1dCh0Tm9kZSkgewogICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDE2IC8qIGhhc0NsYXNzSW5wdXQgKi8pICE9PSAwOwp9Ci8qKgogKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYFROb2RlYCBoYXMgYSBkaXJlY3RpdmUgd2hpY2ggaGFzIGBcQElucHV0KClgIGZvciBgc3R5bGVgIGJpbmRpbmcuCiAqCiAqIGBgYAogKiA8ZGl2IG15LWRpciBbc3R5bGVdPSJleHAiPjwvZGl2PgogKiBgYGAKICogYW5kCiAqIGBgYAogKiBcQERpcmVjdGl2ZSh7CiAqIH0pCiAqIGNsYXNzIE15RGlyZWN0aXZlIHsKICogXEBJbnB1dCgpCiAqICAgY2xhc3M6IHN0cmluZzsKICogfQogKiBgYGAKICoKICogSW4gdGhlIGFib3ZlIGNhc2UgaXQgaXMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSByZWNvbmNpbGVkIHN0eWxpbmcgaW5mb3JtYXRpb24gaW50byB0aGUKICogZGlyZWN0aXZlJ3MgaW5wdXQuCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc1N0eWxlSW5wdXQodE5vZGUpIHsKICAgIHJldHVybiAodE5vZGUuZmxhZ3MgJiAzMiAvKiBoYXNTdHlsZUlucHV0ICovKSAhPT0gMDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9zdHlsaW5nL2NsYXNzX2RpZmZlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0dXJucyBhbiBpbmRleCBvZiBgY2xhc3NUb1NlYXJjaGAgaW4gYGNsYXNzTmFtZWAgdGFraW5nIHRva2VuIGJvdW5kYXJpZXMgaW50byBhY2NvdW50LgogKgogKiBgY2xhc3NJbmRleE9mKCdBQiBBJywgJ0EnLCAwKWAgd2lsbCBiZSAzIChub3QgMCBzaW5jZSBgQUIhPT1BYCkKICoKICogQHBhcmFtIHs/fSBjbGFzc05hbWUgQSBzdHJpbmcgY29udGFpbmluZyBjbGFzc2VzICh3aGl0ZXNwYWNlIHNlcGFyYXRlZCkKICogQHBhcmFtIHs/fSBjbGFzc1RvU2VhcmNoIEEgY2xhc3MgbmFtZSB0byBsb2NhdGUKICogQHBhcmFtIHs/fSBzdGFydGluZ0luZGV4IFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHNlYXJjaAogKiBAcmV0dXJuIHs/fSBhbiBpbmRleCBvZiB0aGUgbG9jYXRlZCBjbGFzcyAob3IgLTEgaWYgbm90IGZvdW5kKQogKi8KZnVuY3Rpb24gY2xhc3NJbmRleE9mKGNsYXNzTmFtZSwgY2xhc3NUb1NlYXJjaCwgc3RhcnRpbmdJbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdEVxdWFsKGNsYXNzVG9TZWFyY2gsICcnLCAnY2FuIG5vdCBsb29rIGZvciAiIiBzdHJpbmcuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZW5kID0gY2xhc3NOYW1lLmxlbmd0aDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihjbGFzc1RvU2VhcmNoLCBzdGFydGluZ0luZGV4KTsKICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4OwogICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAwIHx8IGNsYXNzTmFtZS5jaGFyQ29kZUF0KGZvdW5kSW5kZXggLSAxKSA8PSAzMiAvKiBTUEFDRSAqLykgewogICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBpdCBoYXMgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY2xhc3NUb1NlYXJjaC5sZW5ndGg7CiAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICsgbGVuZ3RoID09PSBlbmQgfHwKICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5jaGFyQ29kZUF0KGZvdW5kSW5kZXggKyBsZW5ndGgpIDw9IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBpdCBoYXMgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRmFsc2UgcG9zaXRpdmUsIGtlZXAgc2VhcmNoaW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYuCiAgICAgICAgc3RhcnRpbmdJbmRleCA9IGZvdW5kSW5kZXggKyAxOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfVEVNUExBVEVfU0VMRUNUT1IgPSAnbmctdGVtcGxhdGUnOwovKioKICogU2VhcmNoIHRoZSBgVEF0dHJpYnV0ZXNgIHRvIHNlZSBpZiBpdCBjb250YWlucyBgY3NzQ2xhc3NUb01hdGNoYCAoY2FzZSBpbnNlbnNpdGl2ZSkKICoKICogQHBhcmFtIHs/fSBhdHRycyBgVEF0dHJpYnV0ZXNgIHRvIHNlYXJjaCB0aHJvdWdoLgogKiBAcGFyYW0gez99IGNzc0NsYXNzVG9NYXRjaCBjbGFzcyB0byBtYXRjaCAobG93ZXJjYXNlKQogKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbk1vZGUgV2hldGhlciBvciBub3QgY2xhc3MgbWF0Y2hpbmcgc2hvdWxkIGxvb2sgaW50byB0aGUgYXR0cmlidXRlIGBjbGFzc2AgaW4KICogICAgYWRkaXRpb24gdG8gdGhlIGBBdHRyaWJ1dGVNYXJrZXIuQ2xhc3Nlc2AuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0Nzc0NsYXNzTWF0Y2hpbmcoYXR0cnMsIGNzc0NsYXNzVG9NYXRjaCwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgLy8gVE9ETyhtaXNrbyk6IFRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBrbm93IGFib3V0IGBpc1Byb2plY3Rpb25Nb2RlYCBzZWVtcyBzdXNwZWN0LgogICAgLy8gSXQgaXMgc3RyYW5nZSB0byBtZSB0aGF0IHNvbWV0aW1lcyB0aGUgY2xhc3MgaW5mb3JtYXRpb24gY29tZXMgaW4gZm9ybSBvZiBgY2xhc3NgIGF0dHJpYnV0ZQogICAgLy8gYW5kIHNvbWV0aW1lcyBpbiBmb3JtIG9mIGBBdHRyaWJ1dGVNYXJrZXIuQ2xhc3Nlc2AuIFNvbWUgaW52ZXN0aWdhdGlvbiBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lCiAgICAvLyBpZiB0aGF0IGlzIHRoZSByaWdodCBiZWhhdmlvci4KICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGNzc0NsYXNzVG9NYXRjaCwgY3NzQ2xhc3NUb01hdGNoLnRvTG93ZXJDYXNlKCksICdDbGFzcyBuYW1lIGV4cGVjdGVkIHRvIGJlIGxvd2VyY2FzZS4nKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMDsKICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpdGVtID0gYXR0cnNbaSsrXTsKICAgICAgICBpZiAoaXNQcm9qZWN0aW9uTW9kZSAmJiBpdGVtID09PSAnY2xhc3MnKSB7CiAgICAgICAgICAgIGl0ZW0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaV0pKTsKICAgICAgICAgICAgaWYgKGNsYXNzSW5kZXhPZihpdGVtLnRvTG93ZXJDYXNlKCksIGNzc0NsYXNzVG9NYXRjaCwgMCkgIT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpdGVtID09PSAxIC8qIENsYXNzZXMgKi8pIHsKICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIGNsYXNzZXMgc2VjdGlvbi4gU3RhcnQgc2VhcmNoaW5nIGZvciB0aGUgY2xhc3MuCiAgICAgICAgICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoICYmIHR5cGVvZiAoaXRlbSA9IGF0dHJzW2krK10pID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAvLyB3aGlsZSB3ZSBoYXZlIHN0cmluZ3MKICAgICAgICAgICAgICAgIGlmIChpdGVtLnRvTG93ZXJDYXNlKCkgPT09IGNzc0NsYXNzVG9NYXRjaCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Ci8qKgogKiBGdW5jdGlvbiB0aGF0IGNoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gdE5vZGUgbWF0Y2hlcyB0YWctYmFzZWQgc2VsZWN0b3IgYW5kIGhhcyBhIHZhbGlkIHR5cGUuCiAqCiAqIE1hdGNoaW5nIGNhbiBiZSBwZXJmb3JtZWQgaW4gMiBtb2RlczogcHJvamVjdGlvbiBtb2RlICh3aGVuIHdlIHByb2plY3Qgbm9kZXMpIGFuZCByZWd1bGFyCiAqIGRpcmVjdGl2ZSBtYXRjaGluZyBtb2RlOgogKiAtIGluIHRoZSAiZGlyZWN0aXZlIG1hdGNoaW5nIiBtb2RlIHdlIGRvIF9ub3RfIHRha2UgVENvbnRhaW5lcidzIHRhZ05hbWUgaW50byBhY2NvdW50IGlmIGl0IGlzCiAqIGRpZmZlcmVudCBmcm9tIE5HX1RFTVBMQVRFX1NFTEVDVE9SICh2YWx1ZSBkaWZmZXJlbnQgZnJvbSBOR19URU1QTEFURV9TRUxFQ1RPUiBpbmRpY2F0ZXMgdGhhdCBhCiAqIHRhZyBuYW1lIHdhcyBleHRyYWN0ZWQgZnJvbSAqIHN5bnRheCBzbyB3ZSB3b3VsZCBtYXRjaCB0aGUgc2FtZSBkaXJlY3RpdmUgdHdpY2UpOwogKiAtIGluIHRoZSAicHJvamVjdGlvbiIgbW9kZSwgd2UgdXNlIGEgdGFnIG5hbWUgcG90ZW50aWFsbHkgZXh0cmFjdGVkIGZyb20gdGhlICogc3ludGF4IHByb2Nlc3NpbmcKICogKGFwcGxpY2FibGUgdG8gVE5vZGVUeXBlLkNvbnRhaW5lciBvbmx5KS4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGN1cnJlbnRTZWxlY3RvcgogKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbk1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc1RhZ0FuZFR5cGVNYXRjaCh0Tm9kZSwgY3VycmVudFNlbGVjdG9yLCBpc1Byb2plY3Rpb25Nb2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0YWdOYW1lVG9Db21wYXJlID0gdE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8gJiYgIWlzUHJvamVjdGlvbk1vZGUgPwogICAgICAgIE5HX1RFTVBMQVRFX1NFTEVDVE9SIDoKICAgICAgICB0Tm9kZS50YWdOYW1lOwogICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RvciA9PT0gdGFnTmFtZVRvQ29tcGFyZTsKfQovKioKICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIG1hdGNoIGFuIEl2eSBub2RlIHN0YXRpYyBkYXRhIGFnYWluc3QgYSBzaW1wbGUgQ1NTIHNlbGVjdG9yCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gdHJ5IG1hdGNoaW5nIGFnYWluc3QgdGhlIG5vZGUuCiAqIEBwYXJhbSB7P30gaXNQcm9qZWN0aW9uTW9kZSBpZiBgdHJ1ZWAgd2UgYXJlIG1hdGNoaW5nIGZvciBjb250ZW50IHByb2plY3Rpb24sIG90aGVyd2lzZSB3ZSBhcmUgZG9pbmcKICogZGlyZWN0aXZlIG1hdGNoaW5nLgogKiBAcmV0dXJuIHs/fSB0cnVlIGlmIG5vZGUgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuCiAqLwpmdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yKHROb2RlLCBzZWxlY3RvciwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoc2VsZWN0b3JbMF0sICdTZWxlY3RvciBzaG91bGQgaGF2ZSBhIHRhZyBuYW1lJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbW9kZSA9IDQgLyogRUxFTUVOVCAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVBdHRycyA9IHROb2RlLmF0dHJzIHx8IFtdOwogICAgLy8gRmluZCB0aGUgaW5kZXggb2YgZmlyc3QgYXR0cmlidXRlIHRoYXQgaGFzIG5vIHZhbHVlLCBvbmx5IGEgbmFtZS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWVPbmx5TWFya2VySWR4ID0gZ2V0TmFtZU9ubHlNYXJrZXJJbmRleChub2RlQXR0cnMpOwogICAgLy8gV2hlbiBwcm9jZXNzaW5nICI6bm90IiBzZWxlY3RvcnMsIHdlIHNraXAgdG8gdGhlIG5leHQgIjpub3QiIGlmIHRoZQogICAgLy8gY3VycmVudCBvbmUgZG9lc24ndCBtYXRjaAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHNraXBUb05leHRTZWxlY3RvciA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rvci5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50ID0gc2VsZWN0b3JbaV07CiAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50ID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAvLyBJZiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBhIDpub3Qgc2VsZWN0b3IgYW5kIGl0IGhhc24ndCBmYWlsZWQsIHJldHVybiBmYWxzZQogICAgICAgICAgICBpZiAoIXNraXBUb05leHRTZWxlY3RvciAmJiAhaXNQb3NpdGl2ZShtb2RlKSAmJiAhaXNQb3NpdGl2ZShjdXJyZW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBza2lwcGluZyB0byB0aGUgbmV4dCA6bm90KCkgYW5kIHRoaXMgbW9kZSBmbGFnIGlzIHBvc2l0aXZlLAogICAgICAgICAgICAvLyBpdCdzIGEgcGFydCBvZiB0aGUgY3VycmVudCA6bm90KCkgc2VsZWN0b3IsIGFuZCB3ZSBzaG91bGQga2VlcCBza2lwcGluZwogICAgICAgICAgICBpZiAoc2tpcFRvTmV4dFNlbGVjdG9yICYmIGlzUG9zaXRpdmUoY3VycmVudCkpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gZmFsc2U7CiAgICAgICAgICAgIG1vZGUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQpKSkgfCAobW9kZSAmIDEgLyogTk9UICovKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChza2lwVG9OZXh0U2VsZWN0b3IpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChtb2RlICYgNCAvKiBFTEVNRU5UICovKSB7CiAgICAgICAgICAgIG1vZGUgPSAyIC8qIEFUVFJJQlVURSAqLyB8IG1vZGUgJiAxIC8qIE5PVCAqLzsKICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09ICcnICYmICFoYXNUYWdBbmRUeXBlTWF0Y2godE5vZGUsIGN1cnJlbnQsIGlzUHJvamVjdGlvbk1vZGUpIHx8CiAgICAgICAgICAgICAgICBjdXJyZW50ID09PSAnJyAmJiBzZWxlY3Rvci5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JBdHRyVmFsdWUgPSBtb2RlICYgOCAvKiBDTEFTUyAqLyA/IGN1cnJlbnQgOiBzZWxlY3RvclsrK2ldOwogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1hdGNoaW5nIGFnYWluc3QgY2xhc3NlcyB3aGVuIGEgdE5vZGUgaGFzIGJlZW4gaW5zdGFudGlhdGVkIHdpdGgKICAgICAgICAgICAgLy8gY2xhc3MgYW5kIHN0eWxlIHZhbHVlcyBhcyBzZXBhcmF0ZSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuIFsndGl0bGUnLCBDTEFTUywgJ2ZvbyddKQogICAgICAgICAgICBpZiAoKG1vZGUgJiA4IC8qIENMQVNTICovKSAmJiB0Tm9kZS5hdHRycyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKCFpc0Nzc0NsYXNzTWF0Y2hpbmcodE5vZGUuYXR0cnMsICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvckF0dHJWYWx1ZSkpLCBpc1Byb2plY3Rpb25Nb2RlKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNJbmxpbmVUZW1wbGF0ZSA9IHROb2RlLnR5cGUgPT0gMCAvKiBDb250YWluZXIgKi8gJiYgdE5vZGUudGFnTmFtZSAhPT0gTkdfVEVNUExBVEVfU0VMRUNUT1I7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSAobW9kZSAmIDggLyogQ0xBU1MgKi8pID8gJ2NsYXNzJyA6IGN1cnJlbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0ckluZGV4SW5Ob2RlID0gZmluZEF0dHJJbmRleEluTm9kZShhdHRyTmFtZSwgbm9kZUF0dHJzLCBpc0lubGluZVRlbXBsYXRlLCBpc1Byb2plY3Rpb25Nb2RlKTsKICAgICAgICAgICAgaWYgKGF0dHJJbmRleEluTm9kZSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2VsZWN0b3JBdHRyVmFsdWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgbm9kZUF0dHJWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChhdHRySW5kZXhJbk5vZGUgPiBuYW1lT25seU1hcmtlcklkeCkgewogICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyVmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbChub2RlQXR0cnNbYXR0ckluZGV4SW5Ob2RlXSwgMCAvKiBOYW1lc3BhY2VVUkkgKi8sICdXZSBkbyBub3QgbWF0Y2ggZGlyZWN0aXZlcyBvbiBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMnKTsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb3dlcmNhc2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBhYmxlIHRvIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0b3JzIHdpdGhvdXQgY2FzZS1zZW5zaXRpdml0eQogICAgICAgICAgICAgICAgICAgIC8vIChzZWxlY3RvcnMgYXJlIGFscmVhZHkgaW4gbG93ZXJjYXNlIHdoZW4gZ2VuZXJhdGVkKQogICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyVmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKG5vZGVBdHRyc1thdHRySW5kZXhJbk5vZGUgKyAxXSkpKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUFnYWluc3RDbGFzc05hbWUgPSBtb2RlICYgOCAvKiBDTEFTUyAqLyA/IG5vZGVBdHRyVmFsdWUgOiBudWxsOwogICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVBZ2FpbnN0Q2xhc3NOYW1lICYmCiAgICAgICAgICAgICAgICAgICAgY2xhc3NJbmRleE9mKGNvbXBhcmVBZ2FpbnN0Q2xhc3NOYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JBdHRyVmFsdWUpKSwgMCkgIT09IC0xIHx8CiAgICAgICAgICAgICAgICAgICAgbW9kZSAmIDIgLyogQVRUUklCVVRFICovICYmIHNlbGVjdG9yQXR0clZhbHVlICE9PSBub2RlQXR0clZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmUobW9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBza2lwVG9OZXh0U2VsZWN0b3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzUG9zaXRpdmUobW9kZSkgfHwgc2tpcFRvTmV4dFNlbGVjdG9yOwp9Ci8qKgogKiBAcGFyYW0gez99IG1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzUG9zaXRpdmUobW9kZSkgewogICAgcmV0dXJuIChtb2RlICYgMSAvKiBOT1QgKi8pID09PSAwOwp9Ci8qKgogKiBFeGFtaW5lcyB0aGUgYXR0cmlidXRlJ3MgZGVmaW5pdGlvbiBhcnJheSBmb3IgYSBub2RlIHRvIGZpbmQgdGhlIGluZGV4IG9mIHRoZQogKiBhdHRyaWJ1dGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBgbmFtZWAuCiAqCiAqIE5PVEU6IFRoaXMgd2lsbCBub3QgbWF0Y2ggbmFtZXNwYWNlZCBhdHRyaWJ1dGVzLgogKgogKiBBdHRyaWJ1dGUgbWF0Y2hpbmcgZGVwZW5kcyB1cG9uIGBpc0lubGluZVRlbXBsYXRlYCBhbmQgYGlzUHJvamVjdGlvbk1vZGVgLgogKiBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgd2hpY2ggdHlwZXMgb2YgYXR0cmlidXRlcyB3ZSBhdHRlbXB0IHRvIG1hdGNoOgogKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBNb2RlcyAgICAgICAgICAgICAgICAgICB8IE5vcm1hbCBBdHRyaWJ1dGVzIHwgQmluZGluZ3MgQXR0cmlidXRlcyB8IFRlbXBsYXRlIEF0dHJpYnV0ZXMgfCBJMThuCiAqIEF0dHJpYnV0ZXMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogSW5saW5lICsgUHJvamVjdGlvbiAgICAgfCBZRVMgICAgICAgICAgICAgICB8IFlFUyAgICAgICAgICAgICAgICAgfCBOTyAgICAgICAgICAgICAgICAgIHwgWUVTCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIElubGluZSArIERpcmVjdGl2ZSAgICAgIHwgTk8gICAgICAgICAgICAgICAgfCBOTyAgICAgICAgICAgICAgICAgIHwgWUVTICAgICAgICAgICAgICAgICB8IE5PCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIE5vbi1pbmxpbmUgKyBQcm9qZWN0aW9uIHwgWUVTICAgICAgICAgICAgICAgfCBZRVMgICAgICAgICAgICAgICAgIHwgTk8gICAgICAgICAgICAgICAgICB8IFlFUwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBOb24taW5saW5lICsgRGlyZWN0aXZlICB8IFlFUyAgICAgICAgICAgICAgIHwgWUVTICAgICAgICAgICAgICAgICB8IE5PICAgICAgICAgICAgICAgICAgfCBZRVMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogQHBhcmFtIHs/fSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gZmluZAogKiBAcGFyYW0gez99IGF0dHJzIHRoZSBhdHRyaWJ1dGUgYXJyYXkgdG8gZXhhbWluZQogKiBAcGFyYW0gez99IGlzSW5saW5lVGVtcGxhdGUgdHJ1ZSBpZiB0aGUgbm9kZSBiZWluZyBtYXRjaGVkIGlzIGFuIGlubGluZSB0ZW1wbGF0ZSAoZS5nLiBgKm5nRm9yYCkKICogcmF0aGVyIHRoYW4gYSBtYW51YWxseSBleHBhbmRlZCB0ZW1wbGF0ZSBub2RlIChlLmcgYDxuZy10ZW1wbGF0ZT5gKS4KICogQHBhcmFtIHs/fSBpc1Byb2plY3Rpb25Nb2RlIHRydWUgaWYgd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgY29udGVudCBwcm9qZWN0aW9uIG90aGVyd2lzZSB3ZSBhcmUKICogbWF0Y2hpbmcgYWdhaW5zdCBkaXJlY3RpdmVzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmluZEF0dHJJbmRleEluTm9kZShuYW1lLCBhdHRycywgaXNJbmxpbmVUZW1wbGF0ZSwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgaWYgKGF0dHJzID09PSBudWxsKQogICAgICAgIHJldHVybiAtMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMDsKICAgIGlmIChpc1Byb2plY3Rpb25Nb2RlIHx8ICFpc0lubGluZVRlbXBsYXRlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBiaW5kaW5nc01vZGUgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heWJlQXR0ck5hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgICAgaWYgKG1heWJlQXR0ck5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDMgLyogQmluZGluZ3MgKi8gfHwgbWF5YmVBdHRyTmFtZSA9PT0gNiAvKiBJMThuICovKSB7CiAgICAgICAgICAgICAgICBiaW5kaW5nc01vZGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDEgLyogQ2xhc3NlcyAqLyB8fCBtYXliZUF0dHJOYW1lID09PSAyIC8qIFN0eWxlcyAqLykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gYXR0cnNbKytpXTsKICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBza2lwIGNsYXNzZXMgaGVyZSBiZWNhdXNlIHdlIGhhdmUgYSBzZXBhcmF0ZSBtZWNoYW5pc20gZm9yCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBjbGFzc2VzIGluIHByb2plY3Rpb24gbW9kZS4KICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1srK2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVBdHRyTmFtZSA9PT0gNCAvKiBUZW1wbGF0ZSAqLykgewogICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGNhcmUgYWJvdXQgVGVtcGxhdGUgYXR0cmlidXRlcyBpbiB0aGlzIHNjZW5hcmlvLgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVBdHRyTmFtZSA9PT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHsKICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIHdob2xlIG5hbWVzcGFjZWQgYXR0cmlidXRlIGFuZCB2YWx1ZS4gVGhpcyBpcyBieSBkZXNpZ24uCiAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbiBiaW5kaW5nIG1vZGUgdGhlcmUgYXJlIG9ubHkgbmFtZXMsIHJhdGhlciB0aGFuIG5hbWUtdmFsdWUgcGFpcnMuCiAgICAgICAgICAgIGkgKz0gYmluZGluZ3NNb2RlID8gMSA6IDI7CiAgICAgICAgfQogICAgICAgIC8vIFdlIGRpZCBub3QgbWF0Y2ggdGhlIGF0dHJpYnV0ZQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBtYXRjaFRlbXBsYXRlQXR0cmlidXRlKGF0dHJzLCBuYW1lKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHNlbGVjdG9yCiAqIEBwYXJhbSB7Pz19IGlzUHJvamVjdGlvbk1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JMaXN0KHROb2RlLCBzZWxlY3RvciwgaXNQcm9qZWN0aW9uTW9kZSA9IGZhbHNlKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGlzTm9kZU1hdGNoaW5nU2VsZWN0b3IodE5vZGUsIHNlbGVjdG9yW2ldLCBpc1Byb2plY3Rpb25Nb2RlKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFByb2plY3RBc0F0dHJWYWx1ZSh0Tm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgbm9kZUF0dHJzID0gdE5vZGUuYXR0cnM7CiAgICBpZiAobm9kZUF0dHJzICE9IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdQcm9qZWN0QXNBdHRySWR4ID0gbm9kZUF0dHJzLmluZGV4T2YoNSAvKiBQcm9qZWN0QXMgKi8pOwogICAgICAgIC8vIG9ubHkgY2hlY2sgZm9yIG5nUHJvamVjdEFzIGluIGF0dHJpYnV0ZSBuYW1lcywgZG9uJ3QgYWNjaWRlbnRhbGx5IG1hdGNoIGF0dHJpYnV0ZSdzIHZhbHVlCiAgICAgICAgLy8gKGF0dHJpYnV0ZSBuYW1lcyBhcmUgc3RvcmVkIGF0IGV2ZW4gaW5kZXhlcykKICAgICAgICBpZiAoKG5nUHJvamVjdEFzQXR0cklkeCAmIDEpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobm9kZUF0dHJzW25nUHJvamVjdEFzQXR0cklkeCArIDFdKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbm9kZUF0dHJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROYW1lT25seU1hcmtlckluZGV4KG5vZGVBdHRycykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlQXR0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9kZUF0dHIgPSBub2RlQXR0cnNbaV07CiAgICAgICAgaWYgKGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobm9kZUF0dHIpKSB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlQXR0cnMubGVuZ3RoOwp9Ci8qKgogKiBAcGFyYW0gez99IGF0dHJzCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF0Y2hUZW1wbGF0ZUF0dHJpYnV0ZShhdHRycywgbmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSBhdHRycy5pbmRleE9mKDQgLyogVGVtcGxhdGUgKi8pOwogICAgaWYgKGkgPiAtMSkgewogICAgICAgIGkrKzsKICAgICAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoYXR0cnNbaV0gPT09IG5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBzZWxlY3RvciBpcyBpbnNpZGUgYSBDc3NTZWxlY3Rvckxpc3QKICogQHBhcmFtIHs/fSBzZWxlY3RvciBTZWxlY3RvciB0byBiZSBjaGVja2VkLgogKiBAcGFyYW0gez99IGxpc3QgTGlzdCBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgc2VsZWN0b3IuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1NlbGVjdG9ySW5TZWxlY3Rvckxpc3Qoc2VsZWN0b3IsIGxpc3QpIHsKICAgIHNlbGVjdG9yTGlzdExvb3A6IGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0b3JJbkxpc3QgPSBsaXN0W2ldOwogICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggIT09IGN1cnJlbnRTZWxlY3RvckluTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VsZWN0b3IubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNlbGVjdG9yW2pdICE9PSBjdXJyZW50U2VsZWN0b3JJbkxpc3Rbal0pIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlbGVjdG9yTGlzdExvb3A7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaXNOZWdhdGl2ZU1vZGUKICogQHBhcmFtIHs/fSBjaHVuawogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF5YmVXcmFwSW5Ob3RTZWxlY3Rvcihpc05lZ2F0aXZlTW9kZSwgY2h1bmspIHsKICAgIHJldHVybiBpc05lZ2F0aXZlTW9kZSA/ICc6bm90KCcgKyBjaHVuay50cmltKCkgKyAnKScgOiBjaHVuazsKfQovKioKICogQHBhcmFtIHs/fSBzZWxlY3RvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3RyaW5naWZ5Q1NTU2VsZWN0b3Ioc2VsZWN0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByZXN1bHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JbMF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtb2RlID0gMiAvKiBBVFRSSUJVVEUgKi87CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3VycmVudENodW5rID0gJyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaXNOZWdhdGl2ZU1vZGUgPSBmYWxzZTsKICAgIHdoaWxlIChpIDwgc2VsZWN0b3IubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2YWx1ZU9yTWFya2VyID0gc2VsZWN0b3JbaV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZU9yTWFya2VyID09PSAnc3RyaW5nJykgewogICAgICAgICAgICBpZiAobW9kZSAmIDIgLyogQVRUUklCVVRFICovKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JbKytpXSkpOwogICAgICAgICAgICAgICAgY3VycmVudENodW5rICs9CiAgICAgICAgICAgICAgICAgICAgJ1snICsgdmFsdWVPck1hcmtlciArIChhdHRyVmFsdWUubGVuZ3RoID4gMCA/ICc9IicgKyBhdHRyVmFsdWUgKyAnIicgOiAnJykgKyAnXSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobW9kZSAmIDggLyogQ0xBU1MgKi8pIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayArPSAnLicgKyB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgJiA0IC8qIEVMRU1FTlQgKi8pIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayArPSAnICcgKyB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBcHBlbmQgY3VycmVudCBjaHVuayB0byB0aGUgZmluYWwgcmVzdWx0IGluIGNhc2Ugd2UgY29tZSBhY3Jvc3MgU2VsZWN0b3JGbGFnLCB3aGljaAogICAgICAgICAgICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJldmlvdXMgc2VjdGlvbiBvZiBhIHNlbGVjdG9yIGlzIG92ZXIuIFdlIG5lZWQgdG8gYWNjdW11bGF0ZSBjb250ZW50CiAgICAgICAgICAgIC8vIGJldHdlZW4gZmxhZ3MgdG8gbWFrZSBzdXJlIHdlIHdyYXAgdGhlIGNodW5rIGxhdGVyIGluIDpub3QoKSBzZWxlY3RvciBpZiBuZWVkZWQsIGUuZy4KICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgIC8vICBbJycsIEZsYWdzLkNMQVNTLCAnLmNsYXNzQScsIEZsYWdzLkNMQVNTIHwgRmxhZ3MuTk9ULCAnLmNsYXNzQicsICcuY2xhc3NDJ10KICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBgLmNsYXNzQSA6bm90KC5jbGFzc0IgLmNsYXNzQylgLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBOb3RlOiBmb3IgbmVnYXRpdmUgc2VsZWN0b3IgcGFydCwgd2UgYWNjdW11bGF0ZSBjb250ZW50IGJldHdlZW4gZmxhZ3MgdW50aWwgd2UgZmluZCB0aGUKICAgICAgICAgICAgLy8gbmV4dCBuZWdhdGl2ZSBmbGFnLiBUaGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IGEgY2FzZSB3aGVyZSBgOm5vdCgpYCBydWxlIGNvbnRhaW5zIG1vcmUgdGhhbgogICAgICAgICAgICAvLyBvbmUgY2h1bmssIGUuZy4gdGhlIGZvbGxvd2luZyBzZWxlY3RvcjoKICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgIC8vICBbJycsIEZsYWdzLkVMRU1FTlQgfCBGbGFncy5OT1QsICdwJywgRmxhZ3MuQ0xBU1MsICdmb28nLCBGbGFncy5DTEFTUyB8IEZsYWdzLk5PVCwgJ2JhciddCiAgICAgICAgICAgIC8vIGBgYAogICAgICAgICAgICAvLyBzaG91bGQgYmUgc3RyaW5naWZpZWQgdG8gYDpub3QocC5mb28pIDpub3QoLmJhcilgCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIGlmIChjdXJyZW50Q2h1bmsgIT09ICcnICYmICFpc1Bvc2l0aXZlKHZhbHVlT3JNYXJrZXIpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbWF5YmVXcmFwSW5Ob3RTZWxlY3Rvcihpc05lZ2F0aXZlTW9kZSwgY3VycmVudENodW5rKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGUgPSB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gQ3NzU2VsZWN0b3Igc3BlYywgb25jZSB3ZSBjb21lIGFjcm9zcyBgU2VsZWN0b3JGbGFncy5OT1RgIGZsYWcsIHRoZSBuZWdhdGl2ZQogICAgICAgICAgICAvLyBtb2RlIGlzIG1haW50YWluZWQgZm9yIHJlbWFpbmluZyBjaHVua3Mgb2YgYSBzZWxlY3Rvci4KICAgICAgICAgICAgaXNOZWdhdGl2ZU1vZGUgPSBpc05lZ2F0aXZlTW9kZSB8fCAhaXNQb3NpdGl2ZShtb2RlKTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQogICAgaWYgKGN1cnJlbnRDaHVuayAhPT0gJycpIHsKICAgICAgICByZXN1bHQgKz0gbWF5YmVXcmFwSW5Ob3RTZWxlY3Rvcihpc05lZ2F0aXZlTW9kZSwgY3VycmVudENodW5rKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIEdlbmVyYXRlcyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQ1NTIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtLgogKgogKiBDb21wb25lbnREZWYgYW5kIERpcmVjdGl2ZURlZiBhcmUgZ2VuZXJhdGVkIHdpdGggdGhlIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtIHRvIGF2b2lkIGRvaW5nCiAqIGFkZGl0aW9uYWwgcGFyc2luZyBhdCBydW50aW1lIChmb3IgZXhhbXBsZSwgZm9yIGRpcmVjdGl2ZSBtYXRjaGluZykuIEhvd2V2ZXIgaW4gc29tZSBjYXNlcyAoZm9yCiAqIGV4YW1wbGUsIHdoaWxlIGJvb3RzdHJhcHBpbmcgYSBjb21wb25lbnQpLCBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBzZWxlY3RvciBpcyByZXF1aXJlZCB0byBxdWVyeQogKiBmb3IgdGhlIGhvc3QgZWxlbWVudCBvbiB0aGUgcGFnZS4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcGFyc2VkIGZvcm0gb2YgYSBzZWxlY3RvciBhbmQgcmV0dXJucwogKiBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogKgogKiBAcGFyYW0gez99IHNlbGVjdG9yTGlzdCBzZWxlY3RvciBpbiBwYXJzZWQgZm9ybQogKiBAcmV0dXJuIHs/fSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBzZWxlY3RvcgogKi8KZnVuY3Rpb24gc3RyaW5naWZ5Q1NTU2VsZWN0b3JMaXN0KHNlbGVjdG9yTGlzdCkgewogICAgcmV0dXJuIHNlbGVjdG9yTGlzdC5tYXAoc3RyaW5naWZ5Q1NTU2VsZWN0b3IpLmpvaW4oJywnKTsKfQovKioKICogRXh0cmFjdHMgYXR0cmlidXRlcyBhbmQgY2xhc3NlcyBpbmZvcm1hdGlvbiBmcm9tIGEgZ2l2ZW4gQ1NTIHNlbGVjdG9yLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hpbGUgY3JlYXRpbmcgYSBjb21wb25lbnQgZHluYW1pY2FsbHkuIEluIHRoaXMgY2FzZSwgdGhlIGhvc3QgZWxlbWVudAogKiAodGhhdCBpcyBjcmVhdGVkIGR5bmFtaWNhbGx5KSBzaG91bGQgY29udGFpbiBhdHRyaWJ1dGVzIGFuZCBjbGFzc2VzIHNwZWNpZmllZCBpbiBjb21wb25lbnQncyBDU1MKICogc2VsZWN0b3IuCiAqCiAqIEBwYXJhbSB7P30gc2VsZWN0b3IgQ1NTIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtIChpbiBhIGZvcm0gb2YgYXJyYXkpCiAqIEByZXR1cm4gez99IG9iamVjdCB3aXRoIGBhdHRyc2AgYW5kIGBjbGFzc2VzYCBmaWVsZHMgdGhhdCBjb250YWluIGV4dHJhY3RlZCBpbmZvcm1hdGlvbgogKi8KZnVuY3Rpb24gZXh0cmFjdEF0dHJzQW5kQ2xhc3Nlc0Zyb21TZWxlY3RvcihzZWxlY3RvcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYXR0cnMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNsYXNzZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtb2RlID0gMiAvKiBBVFRSSUJVVEUgKi87CiAgICB3aGlsZSAoaSA8IHNlbGVjdG9yLmxlbmd0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsdWVPck1hcmtlciA9IHNlbGVjdG9yW2ldOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWVPck1hcmtlciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgaWYgKG1vZGUgPT09IDIgLyogQVRUUklCVVRFICovKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWVPck1hcmtlciAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKHZhbHVlT3JNYXJrZXIsICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvclsrK2ldKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgPT09IDggLyogQ0xBU1MgKi8pIHsKICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCh2YWx1ZU9yTWFya2VyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIENzc1NlbGVjdG9yIHNwZWMsIG9uY2Ugd2UgY29tZSBhY3Jvc3MgYFNlbGVjdG9yRmxhZ3MuTk9UYCBmbGFnLCB0aGUgbmVnYXRpdmUKICAgICAgICAgICAgLy8gbW9kZSBpcyBtYWludGFpbmVkIGZvciByZW1haW5pbmcgY2h1bmtzIG9mIGEgc2VsZWN0b3IuIFNpbmNlIGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgYXJlCiAgICAgICAgICAgIC8vIGV4dHJhY3RlZCBvbmx5IGZvciAicG9zaXRpdmUiIHBhcnQgb2YgdGhlIHNlbGVjdG9yLCB3ZSBjYW4gc3RvcCBoZXJlLgogICAgICAgICAgICBpZiAoIWlzUG9zaXRpdmUobW9kZSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgbW9kZSA9IHZhbHVlT3JNYXJrZXI7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybiB7IGF0dHJzLCBjbGFzc2VzIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAovKioKICogQSBzcGVjaWFsIHZhbHVlIHdoaWNoIGRlc2lnbmF0ZXMgdGhhdCBhIHZhbHVlIGhhcyBub3QgY2hhbmdlZC4KICogQHR5cGUgez99CiAqLwpjb25zdCBOT19DSEFOR0UgPSAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSA/IHsgX19icmFuZF9fOiAnTk9fQ0hBTkdFJyB9IDogKCgvKiogQHR5cGUgez99ICovICh7fSkpKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC92aWV3X3RyYXZlcnNhbF91dGlscy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogR2V0cyB0aGUgcGFyZW50IExWaWV3IG9mIHRoZSBwYXNzZWQgTFZpZXcsIGlmIHRoZSBQQVJFTlQgaXMgYW4gTENvbnRhaW5lciwgd2lsbCBnZXQgdGhlIHBhcmVudCBvZgogKiB0aGF0IExDb250YWluZXIsIHdoaWNoIGlzIGFuIExWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGxWaWV3IHdob3NlIHBhcmVudCB0byBnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExWaWV3UGFyZW50KGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50ID0gbFZpZXdbUEFSRU5UXTsKICAgIHJldHVybiBpc0xDb250YWluZXIocGFyZW50KSA/ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRbUEFSRU5UXSkpIDogcGFyZW50Owp9Ci8qKgogKiBSZXRyaWV2ZSB0aGUgcm9vdCB2aWV3IGZyb20gYW55IGNvbXBvbmVudCBvciBgTFZpZXdgIGJ5IHdhbGtpbmcgdGhlIHBhcmVudCBgTFZpZXdgIHVudGlsCiAqIHJlYWNoaW5nIHRoZSByb290IGBMVmlld2AuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50T3JMVmlldyBhbnkgY29tcG9uZW50IG9yIGBMVmlld2AKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFJvb3RWaWV3KGNvbXBvbmVudE9yTFZpZXcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGNvbXBvbmVudE9yTFZpZXcsICdjb21wb25lbnQnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBsVmlldyA9IGlzTFZpZXcoY29tcG9uZW50T3JMVmlldykgPyBjb21wb25lbnRPckxWaWV3IDogKC8qKiBAdHlwZSB7P30gKi8gKHJlYWRQYXRjaGVkTFZpZXcoY29tcG9uZW50T3JMVmlldykpKTsKICAgIHdoaWxlIChsVmlldyAmJiAhKGxWaWV3W0ZMQUdTXSAmIDUxMiAvKiBJc1Jvb3QgKi8pKSB7CiAgICAgICAgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TFZpZXdQYXJlbnQobFZpZXcpKSk7CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgcmV0dXJuIGxWaWV3Owp9Ci8qKgogKiBSZXR1cm5zIHRoZSBgUm9vdENvbnRleHRgIGluc3RhbmNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoCiAqIHRoZSBhcHBsaWNhdGlvbiB3aGVyZSB0aGUgdGFyZ2V0IGlzIHNpdHVhdGVkLiBJdCBkb2VzIHRoaXMgYnkgd2Fsa2luZyB0aGUgcGFyZW50IHZpZXdzIHVudGlsIGl0CiAqIGdldHMgdG8gdGhlIHJvb3QgdmlldywgdGhlbiBnZXR0aW5nIHRoZSBjb250ZXh0IG9mZiBvZiB0aGF0LgogKgogKiBAcGFyYW0gez99IHZpZXdPckNvbXBvbmVudCB0aGUgYExWaWV3YCBvciBjb21wb25lbnQgdG8gZ2V0IHRoZSByb290IGNvbnRleHQgZm9yLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Um9vdENvbnRleHQodmlld09yQ29tcG9uZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VmlldyA9IGdldFJvb3RWaWV3KHZpZXdPckNvbXBvbmVudCk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnREZWZpbmVkKHJvb3RWaWV3W0NPTlRFWFRdLCAnUm9vdFZpZXcgaGFzIG5vIGNvbnRleHQuIFBlcmhhcHMgaXQgaXMgZGlzY29ubmVjdGVkPycpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyb290Vmlld1tDT05URVhUXSkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9hZHZhbmNlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBZHZhbmNlcyB0byBhbiBlbGVtZW50IGZvciBsYXRlciBiaW5kaW5nIGluc3RydWN0aW9ucy4KICoKICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGluc3RydWN0aW9ucyBsaWtlIHtcQGxpbmsgcHJvcGVydHl9IHRvIGFjdCBvbiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZAogKiBpbmRpY2VzLCBmb3IgZXhhbXBsZSB0aG9zZSBjcmVhdGVkIHdpdGgge1xAbGluayBlbGVtZW50fSBvciB7XEBsaW5rIGVsZW1lbnRTdGFydH0uCiAqCiAqIGBgYHRzCiAqIChyZjogUmVuZGVyRmxhZ3MsIGN0eDogYW55KSA9PiB7CiAqICAgaWYgKHJmICYgMSkgewogKiAgICAgdGV4dCgwLCAnSGVsbG8nKTsKICogICAgIHRleHQoMSwgJ0dvb2RieWUnKQogKiAgICAgZWxlbWVudCgyLCAnZGl2Jyk7CiAqICAgfQogKiAgIGlmIChyZiAmIDIpIHsKICogICAgIGFkdmFuY2UoMik7IC8vIEFkdmFuY2UgdHdpY2UgdG8gdGhlIDxkaXY+LgogKiAgICAgcHJvcGVydHkoJ3RpdGxlJywgJ3Rlc3QnKTsKICogICB9CiAqICB9CiAqIGBgYAogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBkZWx0YSBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYWR2YW5jZSBmb3J3YXJkcyBieS4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVhZHZhbmNlKGRlbHRhKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0R3JlYXRlclRoYW4oZGVsdGEsIDAsICdDYW4gb25seSBhZHZhbmNlIGZvcndhcmQnKTsKICAgIHNlbGVjdEluZGV4SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgZ2V0U2VsZWN0ZWRJbmRleCgpICsgZGVsdGEsIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKTsKfQovKioKICogU2VsZWN0cyBhbiBlbGVtZW50IGZvciBsYXRlciBiaW5kaW5nIGluc3RydWN0aW9ucy4KICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIGJlaW5nIGdlbmVyYXRlZCwgYnV0IHN0aWxsIHVzZWQgaW4gdW5pdCB0ZXN0cy4KICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzZWxlY3QoaW5kZXgpIHsKICAgIC8vIFRPRE8obWlza28pOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZC4KICAgIHNlbGVjdEluZGV4SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgaW5kZXgsIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBjaGVja05vQ2hhbmdlc01vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNlbGVjdEluZGV4SW50ZXJuYWwodFZpZXcsIGxWaWV3LCBpbmRleCwgY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0R3JlYXRlclRoYW4oaW5kZXgsIC0xLCAnSW52YWxpZCBpbmRleCcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCArIEhFQURFUl9PRkZTRVQpOwogICAgLy8gRmx1c2ggdGhlIGluaXRpYWwgaG9va3MgZm9yIGVsZW1lbnRzIGluIHRoZSB2aWV3IHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHVwIHRvIHRoaXMgcG9pbnQuCiAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9va3NJbml0UGhhc2VDb21wbGV0ZWQgPSAobFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLzsKICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVPcmRlckNoZWNrSG9va3MgPSB0Vmlldy5wcmVPcmRlckNoZWNrSG9va3M7CiAgICAgICAgICAgIGlmIChwcmVPcmRlckNoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBwcmVPcmRlckNoZWNrSG9va3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVPcmRlckhvb2tzID0gdFZpZXcucHJlT3JkZXJIb29rczsKICAgICAgICAgICAgaWYgKHByZU9yZGVySG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4ZWN1dGVJbml0QW5kQ2hlY2tIb29rcyhsVmlldywgcHJlT3JkZXJIb29rcywgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8sIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIFdlIG11c3Qgc2V0IHRoZSBzZWxlY3RlZCBpbmRleCAqYWZ0ZXIqIHJ1bm5pbmcgdGhlIGhvb2tzLCBiZWNhdXNlIGhvb2tzIG1heSBoYXZlIHNpZGUtZWZmZWN0cwogICAgLy8gdGhhdCBjYXVzZSBvdGhlciB0ZW1wbGF0ZSBmdW5jdGlvbnMgdG8gcnVuLCB0aHVzIHVwZGF0aW5nIHRoZSBzZWxlY3RlZCBpbmRleCwgd2hpY2ggaXMgZ2xvYmFsCiAgICAvLyBzdGF0ZS4gSWYgd2UgcnVuIGBzZXRTZWxlY3RlZEluZGV4YCAqYmVmb3JlKiB3ZSBydW4gdGhlIGhvb2tzLCBpbiBzb21lIGNhc2VzIHRoZSBzZWxlY3RlZCBpbmRleAogICAgLy8gd2lsbCBiZSBhbHRlcmVkIGJ5IHRoZSB0aW1lIHdlIGxlYXZlIHRoZSBgybXJtWFkdmFuY2VgIGluc3RydWN0aW9uLgogICAgc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7Cn0KLyoqCiAqIE1hcmtzIHRoYXQgdGhlIG5leHQgc3RyaW5nIGlzIGZvciBlbGVtZW50LgogKgogKiBTZWUgYEkxOG5NdXRhdGVPcENvZGVzYCBkb2N1bWVudGF0aW9uLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVMRU1FTlRfTUFSS0VSID0gewogICAgbWFya2VyOiAnZWxlbWVudCcKfTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAovKioKICogTWFya3MgdGhhdCB0aGUgbmV4dCBzdHJpbmcgaXMgZm9yIGNvbW1lbnQuCiAqCiAqIFNlZSBgSTE4bk11dGF0ZU9wQ29kZXNgIGRvY3VtZW50YXRpb24uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ09NTUVOVF9NQVJLRVIgPSB7CiAgICBtYXJrZXI6ICdjb21tZW50Jwp9OwovKioKICogQHBhcmFtIHs/fSBwcmV2CiAqIEBwYXJhbSB7P30gbmV4dAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9UU3R5bGluZ1JhbmdlKHByZXYsIG5leHQpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXJJblJhbmdlKHByZXYsIDAsIDMyNzY3IC8qIFVOU0lHTkVEX01BU0sgKi8pOwogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlckluUmFuZ2UobmV4dCwgMCwgMzI3NjcgLyogVU5TSUdORURfTUFTSyAqLyk7CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKChwcmV2IDw8IDE3IC8qIFBSRVZfU0hJRlQgKi8gfCBuZXh0IDw8IDIgLyogTkVYVF9TSElGVCAqLykpKTsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUU3R5bGluZ1JhbmdlUHJldih0U3R5bGluZ1JhbmdlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgIHJldHVybiAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpID4+IDE3IC8qIFBSRVZfU0hJRlQgKi8pICYgMzI3NjcgLyogVU5TSUdORURfTUFTSyAqLzsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0U3R5bGluZ1JhbmdlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgIHJldHVybiAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpICYgMiAvKiBQUkVWX0RVUExJQ0FURSAqLykgPT0KICAgICAgICAyIC8qIFBSRVZfRFVQTElDQVRFICovOwp9Ci8qKgogKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICogQHBhcmFtIHs/fSBwcmV2aW91cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZVByZXYodFN0eWxpbmdSYW5nZSwgcHJldmlvdXMpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlckluUmFuZ2UocHJldmlvdXMsIDAsIDMyNzY3IC8qIFVOU0lHTkVEX01BU0sgKi8pOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSAmIH40Mjk0ODM2MjI0IC8qIFBSRVZfTUFTSyAqLykgfAogICAgICAgIChwcmV2aW91cyA8PCAxNyAvKiBQUkVWX1NISUZUICovKSkpKTsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0U3R5bGluZ1JhbmdlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSB8IDIgLyogUFJFVl9EVVBMSUNBVEUgKi8pKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFN0eWxpbmdSYW5nZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdSYW5nZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICByZXR1cm4gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSAmIDEzMTA2OCAvKiBORVhUX01BU0sgKi8pID4+IDIgLyogTkVYVF9TSElGVCAqLzsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEBwYXJhbSB7P30gbmV4dAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdSYW5nZSwgbmV4dCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVySW5SYW5nZShuZXh0LCAwLCAzMjc2NyAvKiBVTlNJR05FRF9NQVNLICovKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgJiB+MTMxMDY4IC8qIE5FWFRfTUFTSyAqLykgfCAvLwogICAgICAgIG5leHQgPDwgMiAvKiBORVhUX1NISUZUICovKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nUmFuZ2UpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgcmV0dXJuICgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgJiAxIC8qIE5FWFRfRFVQTElDQVRFICovKSA9PT0KICAgICAgICAxIC8qIE5FWFRfRFVQTElDQVRFICovOwp9Ci8qKgogKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nUmFuZ2UpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpIHwgMSAvKiBORVhUX0RVUExJQ0FURSAqLykpKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2RlYnVnX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKiBAcGFyYW0gez99IG9iagogKiBAcGFyYW0gez99IGRlYnVnCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhdHRhY2hEZWJ1Z09iamVjdChvYmosIGRlYnVnKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAnZGVidWcnLCB7IHZhbHVlOiBkZWJ1ZywgZW51bWVyYWJsZTogZmFsc2UgfSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2x2aWV3X2RlYnVnLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfREVWX01PREUgPSAoKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8ICEhbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCkpOwovKgogKiBUaGlzIGZpbGUgY29udGFpbnMgY29uZGl0aW9uYWxseSBhdHRhY2hlZCBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgaHVtYW4gcmVhZGFibGUgKGRlYnVnKSBsZXZlbAogKiBpbmZvcm1hdGlvbiBmb3IgYExWaWV3YCwgYExDb250YWluZXJgIGFuZCBvdGhlciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuIFRoZXNlIGRhdGEgc3RydWN0dXJlcwogKiBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgYXJyYXkgd2hpY2ggbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgZHVyaW5nIGRlYnVnZ2luZyB0byByZWFzb24gYWJvdXQgdGhlCiAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN5c3RlbS4KICoKICogUGF0Y2hpbmcgdGhlIGFycmF5IHdpdGggZXh0cmEgcHJvcGVydHkgZG9lcyBjaGFuZ2UgdGhlIGFycmF5J3MgaGlkZGVuIGNsYXNzJyBidXQgaXQgZG9lcyBub3QKICogY2hhbmdlIHRoZSBjb3N0IG9mIGFjY2VzcywgdGhlcmVmb3JlIHRoaXMgcGF0Y2hpbmcgc2hvdWxkIG5vdCBoYXZlIHNpZ25pZmljYW50IGlmIGFueSBpbXBhY3QgaW4KICogYG5nRGV2TW9kZWAgbW9kZS4gKHNlZTogaHR0cHM6Ly9qc3BlcmYuY29tL2FycmF5LXZzLW1vbmtleS1wYXRjaC1hcnJheSkKICoKICogU28gaW5zdGVhZCBvZiBzZWVpbmc6CiAqIGBgYAogKiBBcnJheSgzMCkgW09iamVjdCwgNjU5LCBudWxsLCDigKZdCiAqIGBgYAogKgogKiBZb3UgZ2V0IHRvIHNlZToKICogYGBgCiAqIExWaWV3RGVidWcgewogKiAgIHZpZXdzOiBbLi4uXSwKICogICBmbGFnczoge2F0dGFjaGVkOiB0cnVlLCAuLi59CiAqICAgbm9kZXM6IFsKICogICAgIHtodG1sOiAnPGRpdiBpZD0iMTIzIj4nLCAuLi4sIG5vZGVzOiBbCiAqICAgICAgIHtodG1sOiAnPHNwYW4+JywgLi4uLCBub2RlczogbnVsbH0KICogICAgIF19CiAqICAgXQogKiB9CiAqIGBgYAogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgTFZJRVdfQ09NUE9ORU5UX0NBQ0hFOwovKiogQHR5cGUgez99ICovCmxldCBMVklFV19FTUJFRERFRF9DQUNIRTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgTFZJRVdfUk9PVDsKLyoqCiAqIFRoaXMgZnVuY3Rpb24gY2xvbmVzIGEgYmx1ZXByaW50IGFuZCBjcmVhdGVzIExWaWV3LgogKgogKiBTaW1wbGUgc2xpY2Ugd2lsbCBrZWVwIHRoZSBzYW1lIHR5cGUsIGFuZCB3ZSBuZWVkIGl0IHRvIGJlIExWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsb25lVG9MVmlld0Zyb21UVmlld0JsdWVwcmludCh0VmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVidWdUVmlldyA9ICgvKiogQHR5cGUgez99ICovICh0VmlldykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlld1RvQ2xvbmUoZGVidWdUVmlldy50eXBlLCB0Vmlldy50ZW1wbGF0ZSAmJiB0Vmlldy50ZW1wbGF0ZS5uYW1lKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXcuY29uY2F0KHRWaWV3LmJsdWVwcmludCkpKTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TFZpZXdUb0Nsb25lKHR5cGUsIG5hbWUpIHsKICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMCAvKiBSb290ICovOgogICAgICAgICAgICBpZiAoTFZJRVdfUk9PVCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgTFZJRVdfUk9PVCA9IG5ldyAoY3JlYXRlTmFtZWRBcnJheVR5cGUoJ0xSb290VmlldycpKSgpOwogICAgICAgICAgICByZXR1cm4gTFZJRVdfUk9PVDsKICAgICAgICBjYXNlIDEgLyogQ29tcG9uZW50ICovOgogICAgICAgICAgICBpZiAoTFZJRVdfQ09NUE9ORU5UX0NBQ0hFID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICBMVklFV19DT01QT05FTlRfQ0FDSEUgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbXBvbmVudEFycmF5ID0gTFZJRVdfQ09NUE9ORU5UX0NBQ0hFLmdldChuYW1lKTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudEFycmF5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudEFycmF5ID0gbmV3IChjcmVhdGVOYW1lZEFycmF5VHlwZSgnTENvbXBvbmVudFZpZXcnICsgbmFtZVN1ZmZpeChuYW1lKSkpKCk7CiAgICAgICAgICAgICAgICBMVklFV19DT01QT05FTlRfQ0FDSEUuc2V0KG5hbWUsIGNvbXBvbmVudEFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29tcG9uZW50QXJyYXk7CiAgICAgICAgY2FzZSAyIC8qIEVtYmVkZGVkICovOgogICAgICAgICAgICBpZiAoTFZJRVdfRU1CRURERURfQ0FDSEUgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgIExWSUVXX0VNQkVEREVEX0NBQ0hFID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBlbWJlZGRlZEFycmF5ID0gTFZJRVdfRU1CRURERURfQ0FDSEUuZ2V0KG5hbWUpOwogICAgICAgICAgICBpZiAoZW1iZWRkZWRBcnJheSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBlbWJlZGRlZEFycmF5ID0gbmV3IChjcmVhdGVOYW1lZEFycmF5VHlwZSgnTEVtYmVkZGVkVmlldycgKyBuYW1lU3VmZml4KG5hbWUpKSkoKTsKICAgICAgICAgICAgICAgIExWSUVXX0VNQkVEREVEX0NBQ0hFLnNldChuYW1lLCBlbWJlZGRlZEFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1iZWRkZWRBcnJheTsKICAgIH0KICAgIHRocm93IG5ldyBFcnJvcigndW5yZWFjaGFibGUgY29kZScpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5hbWVTdWZmaXgodGV4dCkgewogICAgaWYgKHRleHQgPT0gbnVsbCkKICAgICAgICByZXR1cm4gJyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleCA9IHRleHQubGFzdEluZGV4T2YoJ19UZW1wbGF0ZScpOwogICAgcmV0dXJuICdfJyArIChpbmRleCA9PT0gLTEgPyB0ZXh0IDogdGV4dC5zdWJzdHIoMCwgaW5kZXgpKTsKfQovKioKICogVGhpcyBjbGFzcyBpcyBhIGRlYnVnIHZlcnNpb24gb2YgT2JqZWN0IGxpdGVyYWwgc28gdGhhdCB3ZSBjYW4gaGF2ZSBjb25zdHJ1Y3RvciBuYW1lIHNob3cgdXAKICogaW4KICogZGVidWcgdG9vbHMgaW4gbmdEZXZNb2RlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFRWaWV3Q29uc3RydWN0b3IgPSBjbGFzcyBUVmlldyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBpZAogICAgICogQHBhcmFtIHs/fSBibHVlcHJpbnQKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAqIEBwYXJhbSB7P30gcXVlcmllcwogICAgICogQHBhcmFtIHs/fSB2aWV3UXVlcnkKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdTdGFydEluZGV4CiAgICAgKiBAcGFyYW0gez99IGV4cGFuZG9TdGFydEluZGV4CiAgICAgKiBAcGFyYW0gez99IGV4cGFuZG9JbnN0cnVjdGlvbnMKICAgICAqIEBwYXJhbSB7P30gZmlyc3RDcmVhdGVQYXNzCiAgICAgKiBAcGFyYW0gez99IGZpcnN0VXBkYXRlUGFzcwogICAgICogQHBhcmFtIHs/fSBzdGF0aWNWaWV3UXVlcmllcwogICAgICogQHBhcmFtIHs/fSBzdGF0aWNDb250ZW50UXVlcmllcwogICAgICogQHBhcmFtIHs/fSBwcmVPcmRlckhvb2tzCiAgICAgKiBAcGFyYW0gez99IHByZU9yZGVyQ2hlY2tIb29rcwogICAgICogQHBhcmFtIHs/fSBjb250ZW50SG9va3MKICAgICAqIEBwYXJhbSB7P30gY29udGVudENoZWNrSG9va3MKICAgICAqIEBwYXJhbSB7P30gdmlld0hvb2tzCiAgICAgKiBAcGFyYW0gez99IHZpZXdDaGVja0hvb2tzCiAgICAgKiBAcGFyYW0gez99IGRlc3Ryb3lIb29rcwogICAgICogQHBhcmFtIHs/fSBjbGVhbnVwCiAgICAgKiBAcGFyYW0gez99IGNvbnRlbnRRdWVyaWVzCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudHMKICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlUmVnaXN0cnkKICAgICAqIEBwYXJhbSB7P30gcGlwZVJlZ2lzdHJ5CiAgICAgKiBAcGFyYW0gez99IGZpcnN0Q2hpbGQKICAgICAqIEBwYXJhbSB7P30gc2NoZW1hcwogICAgICogQHBhcmFtIHs/fSBjb25zdHMKICAgICAqLwogICAgY29uc3RydWN0b3IodHlwZSwgLy8KICAgIGlkLCAvLwogICAgYmx1ZXByaW50LCAvLwogICAgdGVtcGxhdGUsIC8vCiAgICBxdWVyaWVzLCAvLwogICAgdmlld1F1ZXJ5LCAvLwogICAgbm9kZSwgLy8KICAgIGRhdGEsIC8vCiAgICBiaW5kaW5nU3RhcnRJbmRleCwgLy8KICAgIGV4cGFuZG9TdGFydEluZGV4LCAvLwogICAgZXhwYW5kb0luc3RydWN0aW9ucywgLy8KICAgIGZpcnN0Q3JlYXRlUGFzcywgLy8KICAgIGZpcnN0VXBkYXRlUGFzcywgLy8KICAgIHN0YXRpY1ZpZXdRdWVyaWVzLCAvLwogICAgc3RhdGljQ29udGVudFF1ZXJpZXMsIC8vCiAgICBwcmVPcmRlckhvb2tzLCAvLwogICAgcHJlT3JkZXJDaGVja0hvb2tzLCAvLwogICAgY29udGVudEhvb2tzLCAvLwogICAgY29udGVudENoZWNrSG9va3MsIC8vCiAgICB2aWV3SG9va3MsIC8vCiAgICB2aWV3Q2hlY2tIb29rcywgLy8KICAgIGRlc3Ryb3lIb29rcywgLy8KICAgIGNsZWFudXAsIC8vCiAgICBjb250ZW50UXVlcmllcywgLy8KICAgIGNvbXBvbmVudHMsIC8vCiAgICBkaXJlY3RpdmVSZWdpc3RyeSwgLy8KICAgIHBpcGVSZWdpc3RyeSwgLy8KICAgIGZpcnN0Q2hpbGQsIC8vCiAgICBzY2hlbWFzLCAvLwogICAgY29uc3RzKSB7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgdGhpcy5ibHVlcHJpbnQgPSBibHVlcHJpbnQ7CiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7CiAgICAgICAgdGhpcy52aWV3UXVlcnkgPSB2aWV3UXVlcnk7CiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMuYmluZGluZ1N0YXJ0SW5kZXggPSBiaW5kaW5nU3RhcnRJbmRleDsKICAgICAgICB0aGlzLmV4cGFuZG9TdGFydEluZGV4ID0gZXhwYW5kb1N0YXJ0SW5kZXg7CiAgICAgICAgdGhpcy5leHBhbmRvSW5zdHJ1Y3Rpb25zID0gZXhwYW5kb0luc3RydWN0aW9uczsKICAgICAgICB0aGlzLmZpcnN0Q3JlYXRlUGFzcyA9IGZpcnN0Q3JlYXRlUGFzczsKICAgICAgICB0aGlzLmZpcnN0VXBkYXRlUGFzcyA9IGZpcnN0VXBkYXRlUGFzczsKICAgICAgICB0aGlzLnN0YXRpY1ZpZXdRdWVyaWVzID0gc3RhdGljVmlld1F1ZXJpZXM7CiAgICAgICAgdGhpcy5zdGF0aWNDb250ZW50UXVlcmllcyA9IHN0YXRpY0NvbnRlbnRRdWVyaWVzOwogICAgICAgIHRoaXMucHJlT3JkZXJIb29rcyA9IHByZU9yZGVySG9va3M7CiAgICAgICAgdGhpcy5wcmVPcmRlckNoZWNrSG9va3MgPSBwcmVPcmRlckNoZWNrSG9va3M7CiAgICAgICAgdGhpcy5jb250ZW50SG9va3MgPSBjb250ZW50SG9va3M7CiAgICAgICAgdGhpcy5jb250ZW50Q2hlY2tIb29rcyA9IGNvbnRlbnRDaGVja0hvb2tzOwogICAgICAgIHRoaXMudmlld0hvb2tzID0gdmlld0hvb2tzOwogICAgICAgIHRoaXMudmlld0NoZWNrSG9va3MgPSB2aWV3Q2hlY2tIb29rczsKICAgICAgICB0aGlzLmRlc3Ryb3lIb29rcyA9IGRlc3Ryb3lIb29rczsKICAgICAgICB0aGlzLmNsZWFudXAgPSBjbGVhbnVwOwogICAgICAgIHRoaXMuY29udGVudFF1ZXJpZXMgPSBjb250ZW50UXVlcmllczsKICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzOwogICAgICAgIHRoaXMuZGlyZWN0aXZlUmVnaXN0cnkgPSBkaXJlY3RpdmVSZWdpc3RyeTsKICAgICAgICB0aGlzLnBpcGVSZWdpc3RyeSA9IHBpcGVSZWdpc3RyeTsKICAgICAgICB0aGlzLmZpcnN0Q2hpbGQgPSBmaXJzdENoaWxkOwogICAgICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7CiAgICAgICAgdGhpcy5jb25zdHMgPSBjb25zdHM7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0ZW1wbGF0ZV8oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJ1ZiA9IFtdOwogICAgICAgIHByb2Nlc3NUTm9kZUNoaWxkcmVuKHRoaXMuZmlyc3RDaGlsZCwgYnVmKTsKICAgICAgICByZXR1cm4gYnVmLmpvaW4oJycpOwogICAgfQp9OwpjbGFzcyBUTm9kZSQxIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Vmlld18KICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSBpbmplY3RvckluZGV4CiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVN0YXJ0CiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUVuZAogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVTdHlsaW5nTGFzdAogICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eUJpbmRpbmdzCiAgICAgKiBAcGFyYW0gez99IGZsYWdzCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVySW5kZXhlcwogICAgICogQHBhcmFtIHs/fSB0YWdOYW1lCiAgICAgKiBAcGFyYW0gez99IGF0dHJzCiAgICAgKiBAcGFyYW0gez99IG1lcmdlZEF0dHJzCiAgICAgKiBAcGFyYW0gez99IGxvY2FsTmFtZXMKICAgICAqIEBwYXJhbSB7P30gaW5pdGlhbElucHV0cwogICAgICogQHBhcmFtIHs/fSBpbnB1dHMKICAgICAqIEBwYXJhbSB7P30gb3V0cHV0cwogICAgICogQHBhcmFtIHs/fSB0Vmlld3MKICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICogQHBhcmFtIHs/fSBwcm9qZWN0aW9uTmV4dAogICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gcHJvamVjdGlvbgogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEBwYXJhbSB7P30gcmVzaWR1YWxTdHlsZXMKICAgICAqIEBwYXJhbSB7P30gY2xhc3NlcwogICAgICogQHBhcmFtIHs/fSByZXNpZHVhbENsYXNzZXMKICAgICAqIEBwYXJhbSB7P30gY2xhc3NCaW5kaW5ncwogICAgICogQHBhcmFtIHs/fSBzdHlsZUJpbmRpbmdzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHRWaWV3XywgLy8KICAgIHR5cGUsIC8vCiAgICBpbmRleCwgLy8KICAgIGluamVjdG9ySW5kZXgsIC8vCiAgICBkaXJlY3RpdmVTdGFydCwgLy8KICAgIGRpcmVjdGl2ZUVuZCwgLy8KICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0LCAvLwogICAgcHJvcGVydHlCaW5kaW5ncywgLy8KICAgIGZsYWdzLCAvLwogICAgcHJvdmlkZXJJbmRleGVzLCAvLwogICAgdGFnTmFtZSwgLy8KICAgIGF0dHJzLCAvLwogICAgbWVyZ2VkQXR0cnMsIC8vCiAgICBsb2NhbE5hbWVzLCAvLwogICAgaW5pdGlhbElucHV0cywgLy8KICAgIGlucHV0cywgLy8KICAgIG91dHB1dHMsIC8vCiAgICB0Vmlld3MsIC8vCiAgICBuZXh0LCAvLwogICAgcHJvamVjdGlvbk5leHQsIC8vCiAgICBjaGlsZCwgLy8KICAgIHBhcmVudCwgLy8KICAgIHByb2plY3Rpb24sIC8vCiAgICBzdHlsZXMsIC8vCiAgICByZXNpZHVhbFN0eWxlcywgLy8KICAgIGNsYXNzZXMsIC8vCiAgICByZXNpZHVhbENsYXNzZXMsIC8vCiAgICBjbGFzc0JpbmRpbmdzLCAvLwogICAgc3R5bGVCaW5kaW5ncykgewogICAgICAgIHRoaXMudFZpZXdfID0gdFZpZXdfOwogICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwogICAgICAgIHRoaXMuaW5qZWN0b3JJbmRleCA9IGluamVjdG9ySW5kZXg7CiAgICAgICAgdGhpcy5kaXJlY3RpdmVTdGFydCA9IGRpcmVjdGl2ZVN0YXJ0OwogICAgICAgIHRoaXMuZGlyZWN0aXZlRW5kID0gZGlyZWN0aXZlRW5kOwogICAgICAgIHRoaXMuZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgICAgICB0aGlzLnByb3BlcnR5QmluZGluZ3MgPSBwcm9wZXJ0eUJpbmRpbmdzOwogICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgICAgICB0aGlzLnByb3ZpZGVySW5kZXhlcyA9IHByb3ZpZGVySW5kZXhlczsKICAgICAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwogICAgICAgIHRoaXMuYXR0cnMgPSBhdHRyczsKICAgICAgICB0aGlzLm1lcmdlZEF0dHJzID0gbWVyZ2VkQXR0cnM7CiAgICAgICAgdGhpcy5sb2NhbE5hbWVzID0gbG9jYWxOYW1lczsKICAgICAgICB0aGlzLmluaXRpYWxJbnB1dHMgPSBpbml0aWFsSW5wdXRzOwogICAgICAgIHRoaXMuaW5wdXRzID0gaW5wdXRzOwogICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7CiAgICAgICAgdGhpcy50Vmlld3MgPSB0Vmlld3M7CiAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKICAgICAgICB0aGlzLnByb2plY3Rpb25OZXh0ID0gcHJvamVjdGlvbk5leHQ7CiAgICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOwogICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICAgIHRoaXMucHJvamVjdGlvbiA9IHByb2plY3Rpb247CiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7CiAgICAgICAgdGhpcy5yZXNpZHVhbFN0eWxlcyA9IHJlc2lkdWFsU3R5bGVzOwogICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXM7CiAgICAgICAgdGhpcy5yZXNpZHVhbENsYXNzZXMgPSByZXNpZHVhbENsYXNzZXM7CiAgICAgICAgdGhpcy5jbGFzc0JpbmRpbmdzID0gY2xhc3NCaW5kaW5nczsKICAgICAgICB0aGlzLnN0eWxlQmluZGluZ3MgPSBzdHlsZUJpbmRpbmdzOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdHlwZV8oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAwIC8qIENvbnRhaW5lciAqLzoKICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLkNvbnRhaW5lcic7CiAgICAgICAgICAgIGNhc2UgMyAvKiBFbGVtZW50ICovOgogICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuRWxlbWVudCc7CiAgICAgICAgICAgIGNhc2UgNCAvKiBFbGVtZW50Q29udGFpbmVyICovOgogICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuRWxlbWVudENvbnRhaW5lcic7CiAgICAgICAgICAgIGNhc2UgNSAvKiBJY3VDb250YWluZXIgKi86CiAgICAgICAgICAgICAgICByZXR1cm4gJ1ROb2RlVHlwZS5JY3VDb250YWluZXInOwogICAgICAgICAgICBjYXNlIDEgLyogUHJvamVjdGlvbiAqLzoKICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLlByb2plY3Rpb24nOwogICAgICAgICAgICBjYXNlIDIgLyogVmlldyAqLzoKICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLlZpZXcnOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuPz8/JzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmbGFnc18oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZsYWdzID0gW107CiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxNiAvKiBoYXNDbGFzc0lucHV0ICovKQogICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0NsYXNzSW5wdXQnKTsKICAgICAgICBpZiAodGhpcy5mbGFncyAmIDggLyogaGFzQ29udGVudFF1ZXJ5ICovKQogICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0NvbnRlbnRRdWVyeScpOwogICAgICAgIGlmICh0aGlzLmZsYWdzICYgMzIgLyogaGFzU3R5bGVJbnB1dCAqLykKICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5oYXNTdHlsZUlucHV0Jyk7CiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovKQogICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0hvc3RCaW5kaW5ncycpOwogICAgICAgIGlmICh0aGlzLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8pCiAgICAgICAgICAgIGZsYWdzLnB1c2goJ1ROb2RlRmxhZ3MuaXNDb21wb25lbnRIb3N0Jyk7CiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxIC8qIGlzRGlyZWN0aXZlSG9zdCAqLykKICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5pc0RpcmVjdGl2ZUhvc3QnKTsKICAgICAgICBpZiAodGhpcy5mbGFncyAmIDY0IC8qIGlzRGV0YWNoZWQgKi8pCiAgICAgICAgICAgIGZsYWdzLnB1c2goJ1ROb2RlRmxhZ3MuaXNEZXRhY2hlZCcpOwogICAgICAgIGlmICh0aGlzLmZsYWdzICYgNCAvKiBpc1Byb2plY3RlZCAqLykKICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5pc1Byb2plY3RlZCcpOwogICAgICAgIHJldHVybiBmbGFncy5qb2luKCd8Jyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0ZW1wbGF0ZV8oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJ1ZiA9IFtdOwogICAgICAgIGJ1Zi5wdXNoKCc8JywgdGhpcy50YWdOYW1lIHx8IHRoaXMudHlwZV8pOwogICAgICAgIGlmICh0aGlzLmF0dHJzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9IHRoaXMuYXR0cnNbaSsrXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXR0ck5hbWUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IHRoaXMuYXR0cnNbaSsrXTsKICAgICAgICAgICAgICAgIGJ1Zi5wdXNoKCcgJywgKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJOYW1lKSksICc9IicsICgvKiogQHR5cGUgez99ICovIChhdHRyVmFsdWUpKSwgJyInKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBidWYucHVzaCgnPicpOwogICAgICAgIHByb2Nlc3NUTm9kZUNoaWxkcmVuKHRoaXMuY2hpbGQsIGJ1Zik7CiAgICAgICAgYnVmLnB1c2goJzwvJywgdGhpcy50YWdOYW1lIHx8IHRoaXMudHlwZV8sICc+Jyk7CiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHN0eWxlQmluZGluZ3NfKCkgewogICAgICAgIHJldHVybiB0b0RlYnVnU3R5bGVCaW5kaW5nKHRoaXMsIGZhbHNlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNsYXNzQmluZGluZ3NfKCkgewogICAgICAgIHJldHVybiB0b0RlYnVnU3R5bGVCaW5kaW5nKHRoaXMsIHRydWUpOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVE5vZGVEZWJ1ZyA9IFROb2RlJDE7Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b0RlYnVnU3R5bGVCaW5kaW5nKHROb2RlLCBpc0NsYXNzQmFzZWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHREYXRhID0gdE5vZGUudFZpZXdfLmRhdGE7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5ncyA9ICgvKiogQHR5cGUgez99ICovIChbXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmFuZ2UgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5jbGFzc0JpbmRpbmdzIDogdE5vZGUuc3R5bGVCaW5kaW5nczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXYgPSBnZXRUU3R5bGluZ1JhbmdlUHJldihyYW5nZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXh0ID0gZ2V0VFN0eWxpbmdSYW5nZU5leHQocmFuZ2UpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzVGVtcGxhdGUgPSBuZXh0ICE9PSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGN1cnNvciA9IGlzVGVtcGxhdGUgPyBuZXh0IDogcHJldjsKICAgIHdoaWxlIChjdXJzb3IgIT09IDApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXRlbUtleSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3JdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW1SYW5nZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3IgKyAxXSkpOwogICAgICAgIGJpbmRpbmdzLnVuc2hpZnQoewogICAgICAgICAgICBrZXk6IGl0ZW1LZXksCiAgICAgICAgICAgIGluZGV4OiBjdXJzb3IsCiAgICAgICAgICAgIGlzVGVtcGxhdGU6IGlzVGVtcGxhdGUsCiAgICAgICAgICAgIHByZXZEdXBsaWNhdGU6IGdldFRTdHlsaW5nUmFuZ2VQcmV2RHVwbGljYXRlKGl0ZW1SYW5nZSksCiAgICAgICAgICAgIG5leHREdXBsaWNhdGU6IGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKGl0ZW1SYW5nZSksCiAgICAgICAgICAgIG5leHRJbmRleDogZ2V0VFN0eWxpbmdSYW5nZU5leHQoaXRlbVJhbmdlKSwKICAgICAgICAgICAgcHJldkluZGV4OiBnZXRUU3R5bGluZ1JhbmdlUHJldihpdGVtUmFuZ2UpLAogICAgICAgIH0pOwogICAgICAgIGlmIChjdXJzb3IgPT09IHByZXYpCiAgICAgICAgICAgIGlzVGVtcGxhdGUgPSBmYWxzZTsKICAgICAgICBjdXJzb3IgPSBnZXRUU3R5bGluZ1JhbmdlUHJldihpdGVtUmFuZ2UpOwogICAgfQogICAgYmluZGluZ3MucHVzaCgoaXNDbGFzc0Jhc2VkID8gdE5vZGUucmVzaWR1YWxDbGFzc2VzIDogdE5vZGUucmVzaWR1YWxTdHlsZXMpIHx8IG51bGwpOwogICAgcmV0dXJuIGJpbmRpbmdzOwp9Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gYnVmCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwcm9jZXNzVE5vZGVDaGlsZHJlbih0Tm9kZSwgYnVmKSB7CiAgICB3aGlsZSAodE5vZGUpIHsKICAgICAgICBidWYucHVzaCgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpKSkpLnRlbXBsYXRlXyk7CiAgICAgICAgdE5vZGUgPSB0Tm9kZS5uZXh0OwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVFZpZXdEYXRhID0gTkdfREVWX01PREUgJiYgY3JlYXRlTmFtZWRBcnJheVR5cGUoJ1RWaWV3RGF0YScpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7Ci8qKiBAdHlwZSB7P30gKi8KbGV0IFRWSUVXREFUQV9FTVBUWTsKLy8gY2FuJ3QgaW5pdGlhbGl6ZSBoZXJlIG9yIGl0IHdpbGwgbm90IGJlIHRyZWUgc2hha2VuLCBiZWNhdXNlCi8vIGBMVmlld2AgY29uc3RydWN0b3IgY291bGQgaGF2ZSBzaWRlLWVmZmVjdHMuCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGNsb25lcyBhIGJsdWVwcmludCBhbmQgY3JlYXRlcyBURGF0YS4KICoKICogU2ltcGxlIHNsaWNlIHdpbGwga2VlcCB0aGUgc2FtZSB0eXBlLCBhbmQgd2UgbmVlZCBpdCB0byBiZSBURGF0YQogKiBAcGFyYW0gez99IGxpc3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsb25lVG9UVmlld0RhdGEobGlzdCkgewogICAgaWYgKFRWSUVXREFUQV9FTVBUWSA9PT0gdW5kZWZpbmVkKQogICAgICAgIFRWSUVXREFUQV9FTVBUWSA9IG5ldyBUVmlld0RhdGEoKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoVFZJRVdEQVRBX0VNUFRZLmNvbmNhdChsaXN0KSkpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTFZpZXdCbHVlcHJpbnQgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTFZpZXdCbHVlcHJpbnQnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IE1hdGNoZXNBcnJheSA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdNYXRjaGVzQXJyYXknKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRWaWV3Q29tcG9uZW50cyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUVmlld0NvbXBvbmVudHMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFROb2RlTG9jYWxOYW1lcyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUTm9kZUxvY2FsTmFtZXMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFROb2RlSW5pdGlhbElucHV0cyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUTm9kZUluaXRpYWxJbnB1dHMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFROb2RlSW5pdGlhbERhdGEgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnVE5vZGVJbml0aWFsRGF0YScpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTENsZWFudXAgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTENsZWFudXAnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRDbGVhbnVwID0gTkdfREVWX01PREUgJiYgY3JlYXRlTmFtZWRBcnJheVR5cGUoJ1RDbGVhbnVwJykgfHwgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKTsKLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGF0dGFjaExWaWV3RGVidWcobFZpZXcpIHsKICAgIGF0dGFjaERlYnVnT2JqZWN0KGxWaWV3LCBuZXcgTFZpZXdEZWJ1ZyhsVmlldykpOwp9Ci8qKgogKiBAcGFyYW0gez99IGxDb250YWluZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGF0dGFjaExDb250YWluZXJEZWJ1ZyhsQ29udGFpbmVyKSB7CiAgICBhdHRhY2hEZWJ1Z09iamVjdChsQ29udGFpbmVyLCBuZXcgTENvbnRhaW5lckRlYnVnKGxDb250YWluZXIpKTsKfQovKioKICogQHBhcmFtIHs/fSBvYmoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRvRGVidWcob2JqKSB7CiAgICBpZiAob2JqKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlYnVnID0gKCgvKiogQHR5cGUgez99ICovIChvYmopKSkuZGVidWc7CiAgICAgICAgYXNzZXJ0RGVmaW5lZChkZWJ1ZywgJ09iamVjdCBkb2VzIG5vdCBoYXZlIGEgZGVidWcgcmVwcmVzZW50YXRpb24uJyk7CiAgICAgICAgcmV0dXJuIGRlYnVnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KfQovKioKICogVXNlIHRoaXMgbWV0aG9kIHRvIHVud3JhcCBhIG5hdGl2ZSBlbGVtZW50IGluIGBMVmlld2AgYW5kIGNvbnZlcnQgaXQgaW50byBIVE1MIGZvciBlYXNpZXIKICogcmVhZGluZy4KICoKICogQHBhcmFtIHs/fSB2YWx1ZSBwb3NzaWJseSB3cmFwcGVkIG5hdGl2ZSBET00gbm9kZS4KICogQHBhcmFtIHs/PX0gaW5jbHVkZUNoaWxkcmVuIElmIGB0cnVlYCB0aGVuIHRoZSBzZXJpYWxpemVkIEhUTUwgZm9ybSB3aWxsIGluY2x1ZGUgY2hpbGQgZWxlbWVudHMKICogKHNhbWUKICogYXMgYG91dGVySFRNTGApLiBJZiBgZmFsc2VgIHRoZW4gdGhlIHNlcmlhbGl6ZWQgSFRNTCBmb3JtIHdpbGwgb25seSBjb250YWluIHRoZSBlbGVtZW50CiAqIGl0c2VsZgogKiAod2lsbCBub3Qgc2VyaWFsaXplIGNoaWxkIGVsZW1lbnRzKS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRvSHRtbCh2YWx1ZSwgaW5jbHVkZUNoaWxkcmVuID0gZmFsc2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwUk5vZGUodmFsdWUpKSk7CiAgICBpZiAobm9kZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1RleHROb2RlID0gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG91dGVySFRNTCA9IChpc1RleHROb2RlID8gbm9kZS50ZXh0Q29udGVudCA6IG5vZGUub3V0ZXJIVE1MKSB8fCAnJzsKICAgICAgICBpZiAoaW5jbHVkZUNoaWxkcmVuIHx8IGlzVGV4dE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG91dGVySFRNTDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5uZXJIVE1MID0gJz4nICsgbm9kZS5pbm5lckhUTUwgKyAnPCc7CiAgICAgICAgICAgIHJldHVybiAob3V0ZXJIVE1MLnNwbGl0KGlubmVySFRNTClbMF0pICsgJz4nOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmNsYXNzIExWaWV3RGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yYXdfbFZpZXcKICAgICAqLwogICAgY29uc3RydWN0b3IoX3Jhd19sVmlldykgewogICAgICAgIHRoaXMuX3Jhd19sVmlldyA9IF9yYXdfbFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIEZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYExWaWV3YCB1bnBhY2tlZCBpbnRvIGEgbW9yZSByZWFkYWJsZSBzdGF0ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmbGFncygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmxhZ3MgPSB0aGlzLl9yYXdfbFZpZXdbRkxBR1NdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIF9fcmF3X19mbGFnc19fOiBmbGFncywKICAgICAgICAgICAgaW5pdFBoYXNlU3RhdGU6IGZsYWdzICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8sCiAgICAgICAgICAgIGNyZWF0aW9uTW9kZTogISEoZmxhZ3MgJiA0IC8qIENyZWF0aW9uTW9kZSAqLyksCiAgICAgICAgICAgIGZpcnN0Vmlld1Bhc3M6ICEhKGZsYWdzICYgOCAvKiBGaXJzdExWaWV3UGFzcyAqLyksCiAgICAgICAgICAgIGNoZWNrQWx3YXlzOiAhIShmbGFncyAmIDE2IC8qIENoZWNrQWx3YXlzICovKSwKICAgICAgICAgICAgZGlydHk6ICEhKGZsYWdzICYgNjQgLyogRGlydHkgKi8pLAogICAgICAgICAgICBhdHRhY2hlZDogISEoZmxhZ3MgJiAxMjggLyogQXR0YWNoZWQgKi8pLAogICAgICAgICAgICBkZXN0cm95ZWQ6ICEhKGZsYWdzICYgMjU2IC8qIERlc3Ryb3llZCAqLyksCiAgICAgICAgICAgIGlzUm9vdDogISEoZmxhZ3MgJiA1MTIgLyogSXNSb290ICovKSwKICAgICAgICAgICAgaW5kZXhXaXRoaW5Jbml0UGhhc2U6IGZsYWdzID4+IDEwIC8qIEluZGV4V2l0aGluSW5pdFBoYXNlU2hpZnQgKi8sCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBhcmVudCgpIHsKICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbUEFSRU5UXSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBob3N0KCkgewogICAgICAgIHJldHVybiB0b0h0bWwodGhpcy5fcmF3X2xWaWV3W0hPU1RdLCB0cnVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGh0bWwoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLm5vZGVzIHx8IFtdKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm9kZSA9PiB0b0h0bWwobm9kZS5uYXRpdmUsIHRydWUpKSkuam9pbignJyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250ZXh0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbQ09OVEVYVF07CiAgICB9CiAgICAvKioKICAgICAqIFRoZSB0cmVlIG9mIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBgTFZpZXdgLiBUaGUgbm9kZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgaW50bwogICAgICogYQogICAgICogdHJlZSBzdHJ1Y3R1cmUgd2l0aCByZWxldmFudCBkZXRhaWxzIHB1bGxlZCBvdXQgZm9yIHJlYWRhYmlsaXR5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5vZGVzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IHRoaXMuX3Jhd19sVmlldzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgICAgICByZXR1cm4gdG9EZWJ1Z05vZGVzKHROb2RlLCBsVmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0VmlldygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W1RWSUVXXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNsZWFudXAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tDTEVBTlVQXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbSU5KRUNUT1IkMV07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCByZW5kZXJlckZhY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tSRU5ERVJFUl9GQUNUT1JZXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJlbmRlcmVyKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbUkVOREVSRVJdOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc2FuaXRpemVyKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbU0FOSVRJWkVSXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNoaWxkSGVhZCgpIHsKICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbQ0hJTERfSEVBRF0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbmV4dCgpIHsKICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbTkVYVF0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY2hpbGRUYWlsKCkgewogICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sVmlld1tDSElMRF9UQUlMXSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkZWNsYXJhdGlvblZpZXcoKSB7CiAgICAgICAgcmV0dXJuIHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHF1ZXJpZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tRVUVSSUVTXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHRIb3N0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbVF9IT1NUXTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplZCB2aWV3IG9mIGNoaWxkIHZpZXdzIChhbmQgY29udGFpbmVycykgYXR0YWNoZWQgYXQgdGhpcyBsb2NhdGlvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjaGlsZFZpZXdzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaGlsZFZpZXdzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRIZWFkOwogICAgICAgIHdoaWxlIChjaGlsZCkgewogICAgICAgICAgICBjaGlsZFZpZXdzLnB1c2goY2hpbGQpOwogICAgICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaGlsZFZpZXdzOwogICAgfQp9Ci8qKgogKiBUdXJucyBhIGZsYXQgbGlzdCBvZiBub2RlcyBpbnRvIGEgdHJlZSBieSB3YWxraW5nIHRoZSBhc3NvY2lhdGVkIGBUTm9kZWAgdHJlZS4KICoKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b0RlYnVnTm9kZXModE5vZGUsIGxWaWV3KSB7CiAgICBpZiAodE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVidWdOb2RlcyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdE5vZGVDdXJzb3IgPSB0Tm9kZTsKICAgICAgICB3aGlsZSAodE5vZGVDdXJzb3IpIHsKICAgICAgICAgICAgZGVidWdOb2Rlcy5wdXNoKGJ1aWxkRGVidWdOb2RlKHROb2RlQ3Vyc29yLCBsVmlldywgdE5vZGVDdXJzb3IuaW5kZXgpKTsKICAgICAgICAgICAgdE5vZGVDdXJzb3IgPSB0Tm9kZUN1cnNvci5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVidWdOb2RlczsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJ1aWxkRGVidWdOb2RlKHROb2RlLCBsVmlldywgbm9kZUluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByYXdWYWx1ZSA9IGxWaWV3W25vZGVJbmRleF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYXRpdmUgPSB1bndyYXBSTm9kZShyYXdWYWx1ZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnRMVmlld0RlYnVnID0gdG9EZWJ1ZyhyZWFkTFZpZXdWYWx1ZShyYXdWYWx1ZSkpOwogICAgcmV0dXJuIHsKICAgICAgICBodG1sOiB0b0h0bWwobmF0aXZlKSwKICAgICAgICBuYXRpdmU6ICgvKiogQHR5cGUgez99ICovIChuYXRpdmUpKSwKICAgICAgICBub2RlczogdG9EZWJ1Z05vZGVzKHROb2RlLmNoaWxkLCBsVmlldyksCiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRMVmlld0RlYnVnLAogICAgfTsKfQpjbGFzcyBMQ29udGFpbmVyRGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yYXdfbENvbnRhaW5lcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmF3X2xDb250YWluZXIpIHsKICAgICAgICB0aGlzLl9yYXdfbENvbnRhaW5lciA9IF9yYXdfbENvbnRhaW5lcjsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFjdGl2ZUluZGV4KCkgewogICAgICAgIHJldHVybiBnZXRMQ29udGFpbmVyQWN0aXZlSW5kZXgodGhpcy5fcmF3X2xDb250YWluZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaGFzVHJhbnNwbGFudGVkVmlld3MoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLl9yYXdfbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdICYgMSAvKiBIQVNfVFJBTlNQTEFOVEVEX1ZJRVdTICovKSA9PT0KICAgICAgICAgICAgMSAvKiBIQVNfVFJBTlNQTEFOVEVEX1ZJRVdTICovOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdmlld3MoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyLnNsaWNlKENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUKQogICAgICAgICAgICAubWFwKCgvKiogQHR5cGUgez99ICovICh0b0RlYnVnKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGFyZW50KCkgewogICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW1BBUkVOVF0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbW92ZWRWaWV3cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbTU9WRURfVklFV1NdOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaG9zdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbSE9TVF07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuYXRpdmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyW05BVElWRV07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuZXh0KCkgewogICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW05FWFRdKTsKICAgIH0KfQovKioKICogUmV0dXJuIGFuIGBMVmlld2AgdmFsdWUgaWYgZm91bmQuCiAqCiAqIEBwYXJhbSB7P30gdmFsdWUgYExWaWV3YCBpZiBhbnkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlYWRMVmlld1ZhbHVlKHZhbHVlKSB7CiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5vdCBxdWl0ZSByaWdodCwgYXMgaXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgYFN0eWxpbmdDb250ZXh0YAogICAgICAgIC8vIFRoaXMgaXMgd2h5IGl0IGlzIGluIGRlYnVnLCBub3QgaW4gdXRpbC50cwogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gSEVBREVSX09GRlNFVCAtIDEpCiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICB2YWx1ZSA9IHZhbHVlW0hPU1RdOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KY2xhc3MgSTE4TkRlYnVnSXRlbSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX19yYXdfb3BDb2RlCiAgICAgKiBAcGFyYW0gez99IF9sVmlldwogICAgICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfX3Jhd19vcENvZGUsIF9sVmlldywgbm9kZUluZGV4LCB0eXBlKSB7CiAgICAgICAgdGhpcy5fX3Jhd19vcENvZGUgPSBfX3Jhd19vcENvZGU7CiAgICAgICAgdGhpcy5fbFZpZXcgPSBfbFZpZXc7CiAgICAgICAgdGhpcy5ub2RlSW5kZXggPSBub2RlSW5kZXg7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHROb2RlKCkgewogICAgICAgIHJldHVybiBnZXRUTm9kZSh0aGlzLl9sVmlld1tUVklFV10sIHRoaXMubm9kZUluZGV4KTsKICAgIH0KfQovKioKICogVHVybnMgYSBsaXN0IG9mICJDcmVhdGUiICYgIlVwZGF0ZSIgT3BDb2RlcyBpbnRvIGEgaHVtYW4tcmVhZGFibGUgbGlzdCBvZiBvcGVyYXRpb25zIGZvcgogKiBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAqIEBwYXJhbSB7P30gbXV0YXRlT3BDb2RlcyBtdXRhdGlvbiBvcENvZGVzIHRvIHJlYWQKICogQHBhcmFtIHs/fSB1cGRhdGVPcENvZGVzIHVwZGF0ZSBvcENvZGVzIHRvIHJlYWQKICogQHBhcmFtIHs/fSBpY3VzIGxpc3Qgb2YgSUNVIGV4cHJlc3Npb25zCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdGhlIG9wQ29kZXMgYXJlIGFjdGluZyBvbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXR0YWNoSTE4bk9wQ29kZXNEZWJ1ZyhtdXRhdGVPcENvZGVzLCB1cGRhdGVPcENvZGVzLCBpY3VzLCBsVmlldykgewogICAgYXR0YWNoRGVidWdPYmplY3QobXV0YXRlT3BDb2RlcywgbmV3IEkxOG5NdXRhdGVPcENvZGVzRGVidWcobXV0YXRlT3BDb2RlcywgbFZpZXcpKTsKICAgIGF0dGFjaERlYnVnT2JqZWN0KHVwZGF0ZU9wQ29kZXMsIG5ldyBJMThuVXBkYXRlT3BDb2Rlc0RlYnVnKHVwZGF0ZU9wQ29kZXMsIGljdXMsIGxWaWV3KSk7CiAgICBpZiAoaWN1cykgewogICAgICAgIGljdXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpY3UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGljdSA9PiB7CiAgICAgICAgICAgIGljdS5jcmVhdGUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaWN1Q2FzZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWN1Q2FzZSA9PiB7CiAgICAgICAgICAgICAgICBhdHRhY2hEZWJ1Z09iamVjdChpY3VDYXNlLCBuZXcgSTE4bk11dGF0ZU9wQ29kZXNEZWJ1ZyhpY3VDYXNlLCBsVmlldykpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGljdS51cGRhdGUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaWN1Q2FzZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWN1Q2FzZSA9PiB7CiAgICAgICAgICAgICAgICBhdHRhY2hEZWJ1Z09iamVjdChpY3VDYXNlLCBuZXcgSTE4blVwZGF0ZU9wQ29kZXNEZWJ1ZyhpY3VDYXNlLCBpY3VzLCBsVmlldykpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgfQp9CmNsYXNzIEkxOG5NdXRhdGVPcENvZGVzRGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9fcmF3X29wQ29kZXMKICAgICAqIEBwYXJhbSB7P30gX19sVmlldwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfX3Jhd19vcENvZGVzLCBfX2xWaWV3KSB7CiAgICAgICAgdGhpcy5fX3Jhd19vcENvZGVzID0gX19yYXdfb3BDb2RlczsKICAgICAgICB0aGlzLl9fbFZpZXcgPSBfX2xWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBBIGxpc3Qgb2Ygb3BlcmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgT3BDb2RlcyB3aWxsIGFjdCBvbiB0aGUgdmlldy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBvcGVyYXRpb25zKCkgewogICAgICAgIGNvbnN0IHsgX19sVmlldywgX19yYXdfb3BDb2RlcyB9ID0gdGhpczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX19yYXdfb3BDb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wQ29kZSA9IF9fcmF3X29wQ29kZXNbaV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NyZWF0ZSBUZXh0IE5vZGUnLAogICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleDogX19yYXdfb3BDb2Rlc1srK2ldLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IG9wQ29kZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXBwZW5kQ2hpbGQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Ob2RlSW5kZXggPSBvcENvZGUgPj4+IDE3IC8qIFNISUZUX1BBUkVOVCAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBkZXN0aW5hdGlvbk5vZGVJbmRleCwgJ0FwcGVuZENoaWxkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBTZWxlY3QgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBub2RlSW5kZXgsICdTZWxlY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1IC8qIEVsZW1lbnRFbmQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRJbmRleCA9IG9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgZWxlbWVudEluZGV4LCAnRWxlbWVudEVuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQgLyogQXR0ciAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBlbGVtZW50SW5kZXgsICdBdHRyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnYXR0ck5hbWUnXSA9IF9fcmF3X29wQ29kZXNbKytpXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydhdHRyVmFsdWUnXSA9IF9fcmF3X29wQ29kZXNbKytpXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAob3BDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01NRU5UX01BUktFUjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ09NTUVOVF9NQVJLRVInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudFZhbHVlOiBfX3Jhd19vcENvZGVzWysraV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXg6IF9fcmF3X29wQ29kZXNbKytpXSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBFTEVNRU5UX01BUktFUjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9NQVJLRVInLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVbmtub3duIE9wIENvZGUnLAogICAgICAgICAgICAgICAgICAgIGNvZGU6IG9wQ29kZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQp9CmNsYXNzIEkxOG5VcGRhdGVPcENvZGVzRGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9fcmF3X29wQ29kZXMKICAgICAqIEBwYXJhbSB7P30gaWN1cwogICAgICogQHBhcmFtIHs/fSBfX2xWaWV3CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9fcmF3X29wQ29kZXMsIGljdXMsIF9fbFZpZXcpIHsKICAgICAgICB0aGlzLl9fcmF3X29wQ29kZXMgPSBfX3Jhd19vcENvZGVzOwogICAgICAgIHRoaXMuaWN1cyA9IGljdXM7CiAgICAgICAgdGhpcy5fX2xWaWV3ID0gX19sVmlldzsKICAgIH0KICAgIC8qKgogICAgICogQSBsaXN0IG9mIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIE9wQ29kZXMgd2lsbCBhY3Qgb24gdGhlIHZpZXcuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb3BlcmF0aW9ucygpIHsKICAgICAgICBjb25zdCB7IF9fbFZpZXcsIF9fcmF3X29wQ29kZXMsIGljdXMgfSA9IHRoaXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9fcmF3X29wQ29kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gYml0IGNvZGUgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGFwcGx5IHRoZSBuZXh0IHVwZGF0ZQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNoZWNrQml0ID0gKC8qKiBAdHlwZSB7P30gKi8gKF9fcmF3X29wQ29kZXNbaV0pKTsKICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG9wQ29kZXMgdG8gc2tpcCB1bnRpbCBuZXh0IHNldCBvZiB1cGRhdGUgY29kZXMKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBza2lwQ29kZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoX19yYXdfb3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlID0gJyc7CiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8PSAoaSArIHNraXBDb2Rlcyk7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb3BDb2RlID0gX19yYXdfb3BDb2Rlc1tqXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BDb2RlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IG9wQ29kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3BDb2RlIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgYmluZGluZyBpbmRleCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3Qga25vdyB0aGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcgc28gd2Ugb25seSBzaG93IHRoZSBpbmRleAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBg77+9JHstb3BDb2RlIC0gMX3vv71gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDIgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0SWN1SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BDb2RlICYgMyAvKiBNQVNLX09QQ09ERSAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKF9fcmF3X29wQ29kZXNbKytqXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYW5pdGl6ZUZuID0gX19yYXdfb3BDb2Rlc1srK2pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0JpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0F0dHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemVGbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBUZXh0ICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0JpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIEljdVN3aXRjaCAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoX19yYXdfb3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljdSA9ICgvKiogQHR5cGUgez99ICovIChpY3VzKSlbdEljdUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnSWN1U3dpdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd0SWN1SW5kZXgnXSA9IHRJY3VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NoZWNrQml0J10gPSBjaGVja0JpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ21haW5CaW5kaW5nJ10gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RJY3UnXSA9IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogSWN1VXBkYXRlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9ICgvKiogQHR5cGUgez99ICovIChfX3Jhd19vcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnSWN1VXBkYXRlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd0SWN1SW5kZXgnXSA9IHRJY3VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NoZWNrQml0J10gPSBjaGVja0JpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RJY3UnXSA9IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSBza2lwQ29kZXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9zaGFyZWQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY29uc3QgybUwJDQgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+IFByb21pc2UucmVzb2x2ZShudWxsKTsKLyoqCiAqIEEgcGVybWFuZW50IG1hcmtlciBwcm9taXNlIHdoaWNoIHNpZ25pZmllcyB0aGF0IHRoZSBjdXJyZW50IENEIHRyZWUgaXMKICogY2xlYW4uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgX0NMRUFOX1BST01JU0UgPSAoKMm1MCQ0KSkoKTsKLyoqCiAqIFByb2Nlc3MgdGhlIGBUVmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zYC4gKEV4ZWN1dGUgdGhlIGBob3N0QmluZGluZ3NgLikKICoKICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIGNvbnRhaW5pbmcgdGhlIGBleHBhbmRvSW5zdHJ1Y3Rpb25zYAogKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBgVFZpZXdgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRIb3N0QmluZGluZ3NCeUV4ZWN1dGluZ0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0U2FtZSh0VmlldywgbFZpZXdbVFZJRVddLCAnYExWaWV3YCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBgVFZpZXdgIScpOwogICAgdHJ5IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXhwYW5kb0luc3RydWN0aW9ucyA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnM7CiAgICAgICAgaWYgKGV4cGFuZG9JbnN0cnVjdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYmluZGluZ1Jvb3RJbmRleCA9IHRWaWV3LmV4cGFuZG9TdGFydEluZGV4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjdXJyZW50RGlyZWN0aXZlSW5kZXggPSAtMTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY3VycmVudEVsZW1lbnRJbmRleCA9IC0xOwogICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogUEVSRiBJdCBpcyBwb3NzaWJsZSB0byBnZXQgaGVyZSB3aXRoIGBUVmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zYCBjb250YWluaW5nIG5vCiAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyB0byBleGVjdXRlLiBUaGlzIGlzIHdhc3RlZnVsIGFzIHRoZXJlIGlzIG5vIHdvcmsgdG8gYmUgZG9uZSwgYnV0IHdlIHN0aWxsIG5lZWQKICAgICAgICAgICAgLy8gdG8gaXRlcmF0ZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMuCiAgICAgICAgICAgIC8vIEluIGV4YW1wbGUgb2YgdGhpcyBpcyBpbiB0aGlzIHRlc3Q6IGBob3N0X2JpbmRpbmdfc3BlYy50c2AKICAgICAgICAgICAgLy8gYGZpdCgnc2hvdWxkIG5vdCBjYXVzZSBwcm9ibGVtcyBpZiBkZXRlY3RDaGFuZ2VzIGlzIGNhbGxlZCB3aGVuIGEgcHJvcGVydHkgdXBkYXRlcycsIC4uLmAKICAgICAgICAgICAgLy8gSW4gdGhlIGFib3ZlIHRlc3Qgd2UgZ2V0IGhlcmUgd2l0aCBleHBhbmRvIFswLCAwLCAxXSB3aGljaCByZXF1aXJlcyBhIGxvdCBvZiBwcm9jZXNzaW5nIGJ1dAogICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBmdW5jdGlvbiB0byBleGVjdXRlLgogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZG9JbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uID0gZXhwYW5kb0luc3RydWN0aW9uc1tpXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgbnVtYmVycyBtZWFuIHRoYXQgd2UgYXJlIHN0YXJ0aW5nIG5ldyBFWFBBTkRPIGJsb2NrIGFuZCBuZWVkIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBkaXJlY3RpdmUgaW5kZXguCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydGFudDogSW4gSlMgYC14YCBhbmQgYDAteGAgaXMgbm90IHRoZSBzYW1lISBJZiBgeD09PTBgIHRoZW4gYC14YCB3aWxsIHByb2R1Y2UKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYC0wYCB3aGljaCByZXF1aXJlcyBub24gc3RhbmRhcmQgbWF0aCBhcml0aG1ldGljIGFuZCBpdCBjYW4gcHJldmVudCBWTSBvcHRpbWl6YXRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBgMC0wYCB3aWxsIGFsd2F5cyBwcm9kdWNlIGAwYCBhbmQgd2lsbCBub3QgY2F1c2UgYSBwb3RlbnRpYWwgZGVvcHRpbWl6YXRpb24gaW4gVk0uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiBQRVJGIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gdXNlIGB+aW5zdHJ1Y3Rpb25gIGFzIHRoYXQgZG9lcyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VmZmVyIGZyb20gYC0wYCBhbmQgaXQgaXMgZmFzdGVyL21vcmUgY29tcGFjdC4KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRJbmRleCA9IDAgLSBpbnN0cnVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChjdXJyZW50RWxlbWVudEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0b3IgYmxvY2sgYW5kIHByb3ZpZGVycyBhcmUgdGFrZW4gaW50byBhY2NvdW50LgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyQ291bnQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGV4cGFuZG9JbnN0cnVjdGlvbnNbKytpXSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ1Jvb3RJbmRleCArPSBJTkpFQ1RPUl9CTE9PTV9QQVJFTlRfU0laRSArIHByb3ZpZGVyQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGJpbmRpbmdSb290SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGVpdGhlciB0aGUgaW5qZWN0b3Igc2l6ZSAoc28gdGhlIGJpbmRpbmcgcm9vdCBjYW4gc2tpcCBvdmVyIGRpcmVjdGl2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGdldCB0byB0aGUgZmlyc3Qgc2V0IG9mIGhvc3QgYmluZGluZ3Mgb24gdGhpcyBub2RlKSBvciB0aGUgaG9zdCB2YXIgY291bnQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRvIGdldCB0byB0aGUgbmV4dCBzZXQgb2YgaG9zdCBiaW5kaW5ncyBvbiB0aGlzIG5vZGUpLgogICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nUm9vdEluZGV4ICs9IGluc3RydWN0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgbnVtYmVyLCBpdCdzIGEgaG9zdCBiaW5kaW5nIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpbmRpbmdSb290Rm9ySG9zdEJpbmRpbmdzKGJpbmRpbmdSb290SW5kZXgsIGN1cnJlbnREaXJlY3RpdmVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdEN0eCA9IGxWaWV3W2N1cnJlbnREaXJlY3RpdmVJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uKDIgLyogVXBkYXRlICovLCBob3N0Q3R4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IFBFUkYgUmVseWluZyBvbiBpbmNyZW1lbnRpbmcgdGhlIGBjdXJyZW50RGlyZWN0aXZlSW5kZXhgIGhlcmUgaXMKICAgICAgICAgICAgICAgICAgICAvLyBzdWItb3B0aW1hbC4gVGhlIGltcGxpY2F0aW9ucyBhcmUgdGhhdCBpZiB3ZSBoYXZlIGEgbG90IG9mIGRpcmVjdGl2ZXMgYnV0IG5vbmUgb2YgdGhlbQogICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgaG9zdCBiaW5kaW5ncyB3ZSBuZXZlcnRoZWxlc3MgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGV4cGFuZG8gaW5zdHJ1Y3Rpb25zIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb3VudGVyLiBJdCB3b3VsZCBiZSBtdWNoIGJldHRlciBpZiB3ZSBjb3VsZCBlbmNvZGUgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gYGN1cnJlbnREaXJlY3RpdmVJbmRleGAgaW50byB0aGUgYGV4cGFuZG9JbnN0cnVjdGlvbmAgYXJyYXkgc28gdGhhdCB3ZSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhvc2UgZGlyZWN0aXZlcyB3aGljaCBhY3R1YWxseSBoYXZlIGBob3N0QmluZGluZ3NgLgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmVJbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiAgICB9Cn0KLyoqCiAqIFJlZnJlc2hlcyBhbGwgY29udGVudCBxdWVyaWVzIGRlY2xhcmVkIGJ5IGRpcmVjdGl2ZXMgaW4gYSBnaXZlbiB2aWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVmcmVzaENvbnRlbnRRdWVyaWVzKHRWaWV3LCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGVudFF1ZXJpZXMgPSB0Vmlldy5jb250ZW50UXVlcmllczsKICAgIGlmIChjb250ZW50UXVlcmllcyAhPT0gbnVsbCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudFF1ZXJpZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBxdWVyeVN0YXJ0SWR4ID0gY29udGVudFF1ZXJpZXNbaV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmSWR4ID0gY29udGVudFF1ZXJpZXNbaSArIDFdOwogICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmSWR4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbZGlyZWN0aXZlRGVmSWR4XSkpOwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZChkaXJlY3RpdmVEZWYuY29udGVudFF1ZXJpZXMsICdjb250ZW50UXVlcmllcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVmaW5lZCcpOwogICAgICAgICAgICAgICAgc2V0Q3VycmVudFF1ZXJ5SW5kZXgocXVlcnlTdGFydElkeCk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyZWN0aXZlRGVmLmNvbnRlbnRRdWVyaWVzKSkoMiAvKiBVcGRhdGUgKi8sIGxWaWV3W2RpcmVjdGl2ZURlZklkeF0sIGRpcmVjdGl2ZURlZklkeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFJlZnJlc2hlcyBjaGlsZCBjb21wb25lbnRzIGluIHRoZSBjdXJyZW50IHZpZXcgKHVwZGF0ZSBtb2RlKS4KICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICogQHBhcmFtIHs/fSBjb21wb25lbnRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZyZXNoQ2hpbGRDb21wb25lbnRzKGhvc3RMVmlldywgY29tcG9uZW50cykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVmcmVzaENvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudHNbaV0pOwogICAgfQp9Ci8qKgogKiBSZW5kZXJzIGNoaWxkIGNvbXBvbmVudHMgaW4gdGhlIGN1cnJlbnQgdmlldyAoY3JlYXRpb24gbW9kZSkuCiAqIEBwYXJhbSB7P30gaG9zdExWaWV3CiAqIEBwYXJhbSB7P30gY29tcG9uZW50cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVuZGVyQ2hpbGRDb21wb25lbnRzKGhvc3RMVmlldywgY29tcG9uZW50cykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVuZGVyQ29tcG9uZW50KGhvc3RMVmlldywgY29tcG9uZW50c1tpXSk7CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYSBuYXRpdmUgZWxlbWVudCBmcm9tIGEgdGFnIG5hbWUsIHVzaW5nIGEgcmVuZGVyZXIuCiAqIEBwYXJhbSB7P30gbmFtZSB0aGUgdGFnIG5hbWUKICogQHBhcmFtIHs/fSByZW5kZXJlciBBIHJlbmRlcmVyIHRvIHVzZQogKiBAcGFyYW0gez99IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSB0aGUgZWxlbWVudCBjcmVhdGVkCiAqLwpmdW5jdGlvbiBlbGVtZW50Q3JlYXRlKG5hbWUsIHJlbmRlcmVyLCBuYW1lc3BhY2UpIHsKICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICByZXR1cm4gcmVuZGVyZXIuY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSA9PT0gbnVsbCA/IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQobmFtZSkgOgogICAgICAgICAgICByZW5kZXJlci5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwYXJlbnRMVmlldwogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gY29udGV4dAogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gaG9zdAogKiBAcGFyYW0gez99IHRIb3N0Tm9kZQogKiBAcGFyYW0gez89fSByZW5kZXJlckZhY3RvcnkKICogQHBhcmFtIHs/PX0gcmVuZGVyZXIKICogQHBhcmFtIHs/PX0gc2FuaXRpemVyCiAqIEBwYXJhbSB7Pz19IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVMVmlldyhwYXJlbnRMVmlldywgdFZpZXcsIGNvbnRleHQsIGZsYWdzLCBob3N0LCB0SG9zdE5vZGUsIHJlbmRlcmVyRmFjdG9yeSwgcmVuZGVyZXIsIHNhbml0aXplciwgaW5qZWN0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gbmdEZXZNb2RlID8gY2xvbmVUb0xWaWV3RnJvbVRWaWV3Qmx1ZXByaW50KHRWaWV3KSA6ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5ibHVlcHJpbnQuc2xpY2UoKSkpOwogICAgbFZpZXdbSE9TVF0gPSBob3N0OwogICAgbFZpZXdbRkxBR1NdID0gZmxhZ3MgfCA0IC8qIENyZWF0aW9uTW9kZSAqLyB8IDEyOCAvKiBBdHRhY2hlZCAqLyB8IDggLyogRmlyc3RMVmlld1Bhc3MgKi87CiAgICByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KTsKICAgIGxWaWV3W1BBUkVOVF0gPSBsVmlld1tERUNMQVJBVElPTl9WSUVXXSA9IHBhcmVudExWaWV3OwogICAgbFZpZXdbQ09OVEVYVF0gPSBjb250ZXh0OwogICAgbFZpZXdbUkVOREVSRVJfRkFDVE9SWV0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoKHJlbmRlcmVyRmFjdG9yeSB8fCBwYXJlbnRMVmlldyAmJiBwYXJlbnRMVmlld1tSRU5ERVJFUl9GQUNUT1JZXSkpKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldLCAnUmVuZGVyZXJGYWN0b3J5IGlzIHJlcXVpcmVkJyk7CiAgICBsVmlld1tSRU5ERVJFUl0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoKHJlbmRlcmVyIHx8IHBhcmVudExWaWV3ICYmIHBhcmVudExWaWV3W1JFTkRFUkVSXSkpKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxWaWV3W1JFTkRFUkVSXSwgJ1JlbmRlcmVyIGlzIHJlcXVpcmVkJyk7CiAgICBsVmlld1tTQU5JVElaRVJdID0gc2FuaXRpemVyIHx8IHBhcmVudExWaWV3ICYmIHBhcmVudExWaWV3W1NBTklUSVpFUl0gfHwgKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIGxWaWV3WygvKiogQHR5cGUgez99ICovIChJTkpFQ1RPUiQxKSldID0gaW5qZWN0b3IgfHwgcGFyZW50TFZpZXcgJiYgcGFyZW50TFZpZXdbSU5KRUNUT1IkMV0gfHwgbnVsbDsKICAgIGxWaWV3W1RfSE9TVF0gPSB0SG9zdE5vZGU7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbCh0Vmlldy50eXBlID09IDIgLyogRW1iZWRkZWQgKi8gPyBwYXJlbnRMVmlldyAhPT0gbnVsbCA6IHRydWUsIHRydWUsICdFbWJlZGRlZCB2aWV3cyBtdXN0IGhhdmUgcGFyZW50TFZpZXcnKTsKICAgIGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXSA9CiAgICAgICAgdFZpZXcudHlwZSA9PSAyIC8qIEVtYmVkZGVkICovID8gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudExWaWV3KSlbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddIDogbFZpZXc7CiAgICBuZ0Rldk1vZGUgJiYgYXR0YWNoTFZpZXdEZWJ1ZyhsVmlldyk7CiAgICByZXR1cm4gbFZpZXc7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0SG9zdE5vZGUKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gYXR0cnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIHRIb3N0Tm9kZSwgaW5kZXgsIHR5cGUsIG5hbWUsIGF0dHJzKSB7CiAgICAvLyBLZWVwIHRoaXMgZnVuY3Rpb24gc2hvcnQsIHNvIHRoYXQgdGhlIFZNIHdpbGwgaW5saW5lIGl0LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKSB8fAogICAgICAgIGNyZWF0ZVROb2RlQXRJbmRleCh0VmlldywgdEhvc3ROb2RlLCBhZGp1c3RlZEluZGV4LCB0eXBlLCBuYW1lLCBhdHRycyk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIHRydWUpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gdEhvc3ROb2RlCiAqIEBwYXJhbSB7P30gYWRqdXN0ZWRJbmRleAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gYXR0cnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZVROb2RlQXRJbmRleCh0VmlldywgdEhvc3ROb2RlLCBhZGp1c3RlZEluZGV4LCB0eXBlLCBuYW1lLCBhdHRycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpc1BhcmVudCA9IGdldElzUGFyZW50KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnQgPSBpc1BhcmVudCA/IHByZXZpb3VzT3JQYXJlbnRUTm9kZSA6IHByZXZpb3VzT3JQYXJlbnRUTm9kZSAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50OwogICAgLy8gUGFyZW50cyBjYW5ub3QgY3Jvc3MgY29tcG9uZW50IGJvdW5kYXJpZXMgYmVjYXVzZSBjb21wb25lbnRzIHdpbGwgYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMsCiAgICAvLyBzbyBpdCdzIG9ubHkgc2V0IGlmIHRoZSB2aWV3IGlzIHRoZSBzYW1lLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50SW5TYW1lVmlldyA9IHBhcmVudCAmJiBwYXJlbnQgIT09IHRIb3N0Tm9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRQYXJlbnROb2RlID0gcGFyZW50SW5TYW1lVmlldyA/ICgvKiogQHR5cGUgez99ICovIChwYXJlbnQpKSA6IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgIGNyZWF0ZVROb2RlKHRWaWV3LCB0UGFyZW50Tm9kZSwgdHlwZSwgYWRqdXN0ZWRJbmRleCwgbmFtZSwgYXR0cnMpOwogICAgLy8gQXNzaWduIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgbm9kZSBvZiBhIGdpdmVuIHZpZXcuIFRoZSBmaXJzdCBub2RlIGlzIG5vdCBhbHdheXMgdGhlIG9uZQogICAgLy8gYXQgaW5kZXggMCwgaW4gY2FzZSBvZiBpMThuLCBpbmRleCAwIGNhbiBiZSB0aGUgaW5zdHJ1Y3Rpb24gYGkxOG5TdGFydGAgYW5kIHRoZSBmaXJzdCBub2RlIGhhcwogICAgLy8gdGhlIGluZGV4IDEgb3IgbW9yZSwgc28gd2UgY2FuJ3QganVzdCBjaGVjayBub2RlIGluZGV4LgogICAgaWYgKHRWaWV3LmZpcnN0Q2hpbGQgPT09IG51bGwpIHsKICAgICAgICB0Vmlldy5maXJzdENoaWxkID0gdE5vZGU7CiAgICB9CiAgICBpZiAocHJldmlvdXNPclBhcmVudFROb2RlKSB7CiAgICAgICAgaWYgKGlzUGFyZW50ICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5jaGlsZCA9PSBudWxsICYmCiAgICAgICAgICAgICh0Tm9kZS5wYXJlbnQgIT09IG51bGwgfHwgcHJldmlvdXNPclBhcmVudFROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykpIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBzYW1lIHZpZXcsIHdoaWNoIG1lYW5zIHdlIGFyZSBhZGRpbmcgY29udGVudCBub2RlIHRvIHRoZSBwYXJlbnQgdmlldy4KICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlLmNoaWxkID0gdE5vZGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFpc1BhcmVudCkgewogICAgICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9IHROb2RlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0Tm9kZTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHRQYXJlbnROb2RlCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzaWduVFZpZXdOb2RlVG9MVmlldyh0VmlldywgdFBhcmVudE5vZGUsIGluZGV4LCBsVmlldykgewogICAgLy8gVmlldyBub2RlcyBhcmUgbm90IHN0b3JlZCBpbiBkYXRhIGJlY2F1c2UgdGhleSBjYW4gYmUgYWRkZWQgLyByZW1vdmVkIGF0IHJ1bnRpbWUgKHdoaWNoCiAgICAvLyB3b3VsZCBjYXVzZSBpbmRpY2VzIHRvIGNoYW5nZSkuIFRoZWlyIFROb2RlcyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gdFZpZXcubm9kZS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0Tm9kZSA9IHRWaWV3Lm5vZGU7CiAgICBpZiAodE5vZGUgPT0gbnVsbCkgewogICAgICAgIG5nRGV2TW9kZSAmJiB0UGFyZW50Tm9kZSAmJgogICAgICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHRQYXJlbnROb2RlLCAzIC8qIEVsZW1lbnQgKi8sIDAgLyogQ29udGFpbmVyICovKTsKICAgICAgICB0Vmlldy5ub2RlID0gdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlVE5vZGUodFZpZXcsICgvKiogQHR5cGUgez99ICovICh0UGFyZW50Tm9kZSkpLCAvLwogICAgICAgIDIgLyogVmlldyAqLywgaW5kZXgsIG51bGwsIG51bGwpKSk7CiAgICB9CiAgICByZXR1cm4gbFZpZXdbVF9IT1NUXSA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwp9Ci8qKgogKiBXaGVuIGVsZW1lbnRzIGFyZSBjcmVhdGVkIGR5bmFtaWNhbGx5IGFmdGVyIGEgdmlldyBibHVlcHJpbnQgaXMgY3JlYXRlZCAoZS5nLiB0aHJvdWdoCiAqIGkxOG5BcHBseSgpIG9yIENvbXBvbmVudEZhY3RvcnkuY3JlYXRlKSwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGJsdWVwcmludCBmb3IgZnV0dXJlCiAqIHRlbXBsYXRlIHBhc3Nlcy4KICoKICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIGFzc29jaWF0ZWQgd2l0aCBgTFZpZXdgCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBudW1TbG90c1RvQWxsb2MgVGhlIG51bWJlciBvZiBzbG90cyB0byBhbGxvYyBpbiB0aGUgTFZpZXcsIHNob3VsZCBiZSA+MAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb2NFeHBhbmRvKHRWaWV3LCBsVmlldywgbnVtU2xvdHNUb0FsbG9jKSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRHcmVhdGVyVGhhbihudW1TbG90c1RvQWxsb2MsIDAsICdUaGUgbnVtYmVyIG9mIHNsb3RzIHRvIGFsbG9jIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCcpOwogICAgaWYgKG51bVNsb3RzVG9BbGxvYyA+IDApIHsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2xvdHNUb0FsbG9jOyBpKyspIHsKICAgICAgICAgICAgICAgIHRWaWV3LmJsdWVwcmludC5wdXNoKG51bGwpOwogICAgICAgICAgICAgICAgdFZpZXcuZGF0YS5wdXNoKG51bGwpOwogICAgICAgICAgICAgICAgbFZpZXcucHVzaChudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBzaG91bGQgb25seSBpbmNyZW1lbnQgdGhlIGV4cGFuZG8gc3RhcnQgaW5kZXggaWYgdGhlcmUgYXJlbid0IGFscmVhZHkgZGlyZWN0aXZlcwogICAgICAgICAgICAvLyBhbmQgaW5qZWN0b3JzIHNhdmVkIGluIHRoZSAiZXhwYW5kbyIgc2VjdGlvbgogICAgICAgICAgICBpZiAoIXRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRWaWV3LmV4cGFuZG9TdGFydEluZGV4ICs9IG51bVNsb3RzVG9BbGxvYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIGFkZGluZyB0aGUgZHluYW1pYyBub2RlcyBpbnRvIHRoZSBleHBhbmRvIHNlY3Rpb24sIHdlIG5lZWQgdG8gbGV0IHRoZSBob3N0CiAgICAgICAgICAgICAgICAvLyBiaW5kaW5ncyBrbm93IHRoYXQgdGhleSBzaG91bGQgc2tpcCB4IHNsb3RzCiAgICAgICAgICAgICAgICB0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zLnB1c2gobnVtU2xvdHNUb0FsbG9jKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vIFJlbmRlcgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovKioKICogUHJvY2Vzc2VzIGEgdmlldyBpbiB0aGUgY3JlYXRpb24gbW9kZS4gVGhpcyBpbmNsdWRlcyBhIG51bWJlciBvZiBzdGVwcyBpbiBhIHNwZWNpZmljIG9yZGVyOgogKiAtIGNyZWF0aW5nIHZpZXcgcXVlcnkgZnVuY3Rpb25zIChpZiBhbnkpOwogKiAtIGV4ZWN1dGluZyBhIHRlbXBsYXRlIGZ1bmN0aW9uIGluIHRoZSBjcmVhdGlvbiBtb2RlOwogKiAtIHVwZGF0aW5nIHN0YXRpYyBxdWVyaWVzIChpZiBhbnkpOwogKiAtIGNyZWF0aW5nIGNoaWxkIGNvbXBvbmVudHMgZGVmaW5lZCBpbiBhIGdpdmVuIHZpZXcuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwoaXNDcmVhdGlvbk1vZGUobFZpZXcpLCB0cnVlLCAnU2hvdWxkIGJlIHJ1biBpbiBjcmVhdGlvbiBtb2RlJyk7CiAgICBlbnRlclZpZXcobFZpZXcsIGxWaWV3W1RfSE9TVF0pOwogICAgdHJ5IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld1F1ZXJ5ID0gdFZpZXcudmlld1F1ZXJ5OwogICAgICAgIGlmICh2aWV3UXVlcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgZXhlY3V0ZVZpZXdRdWVyeUZuKDEgLyogQ3JlYXRlICovLCB2aWV3UXVlcnksIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgICAvLyBFeGVjdXRlIGEgdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldywgaWYgaXQgZXhpc3RzLiBBIHRlbXBsYXRlIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZQogICAgICAgIC8vIGRlZmluZWQgZm9yIHRoZSByb290IGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGVGbiA9IHRWaWV3LnRlbXBsYXRlOwogICAgICAgIGlmICh0ZW1wbGF0ZUZuICE9PSBudWxsKSB7CiAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIDEgLyogQ3JlYXRlICovLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIGNoaWxkcmVuIGFyZSBwcm9jZXNzZWQgdG8gc3VwcG9ydCByZWN1cnNpdmUgY29tcG9uZW50cy4KICAgICAgICAvLyBUaGlzIG11c3QgYmUgc2V0IHRvIGZhbHNlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaXJzdCBjcmVhdGlvbiBydW4gYmVjYXVzZSBpbiBhbgogICAgICAgIC8vIG5nRm9yIGxvb3AsIGFsbCB0aGUgdmlld3Mgd2lsbCBiZSBjcmVhdGVkIHRvZ2V0aGVyIGJlZm9yZSB1cGRhdGUgbW9kZSBydW5zIGFuZCB0dXJucwogICAgICAgIC8vIG9mZiBmaXJzdENyZWF0ZVBhc3MuIElmIHdlIGRvbid0IHNldCBpdCBoZXJlLCBpbnN0YW5jZXMgd2lsbCBwZXJmb3JtIGRpcmVjdGl2ZQogICAgICAgIC8vIG1hdGNoaW5nLCBldGMgYWdhaW4gYW5kIGFnYWluLgogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgdFZpZXcuZmlyc3RDcmVhdGVQYXNzID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFdlIHJlc29sdmUgY29udGVudCBxdWVyaWVzIHNwZWNpZmljYWxseSBtYXJrZWQgYXMgYHN0YXRpY2AgaW4gY3JlYXRpb24gbW9kZS4gRHluYW1pYwogICAgICAgIC8vIGNvbnRlbnQgcXVlcmllcyBhcmUgcmVzb2x2ZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gKGkuZS4gdXBkYXRlIG1vZGUpLCBhZnRlciBlbWJlZGRlZAogICAgICAgIC8vIHZpZXdzIGFyZSByZWZyZXNoZWQgKHNlZSBibG9jayBhYm92ZSkuCiAgICAgICAgaWYgKHRWaWV3LnN0YXRpY0NvbnRlbnRRdWVyaWVzKSB7CiAgICAgICAgICAgIHJlZnJlc2hDb250ZW50UXVlcmllcyh0VmlldywgbFZpZXcpOwogICAgICAgIH0KICAgICAgICAvLyBXZSBtdXN0IG1hdGVyaWFsaXplIHF1ZXJ5IHJlc3VsdHMgYmVmb3JlIGNoaWxkIGNvbXBvbmVudHMgYXJlIHByb2Nlc3NlZAogICAgICAgIC8vIGluIGNhc2UgYSBjaGlsZCBjb21wb25lbnQgaGFzIHByb2plY3RlZCBhIGNvbnRhaW5lci4gVGhlIExDb250YWluZXIgbmVlZHMKICAgICAgICAvLyB0byBleGlzdCBzbyB0aGUgZW1iZWRkZWQgdmlld3MgYXJlIHByb3Blcmx5IGF0dGFjaGVkIGJ5IHRoZSBjb250YWluZXIuCiAgICAgICAgaWYgKHRWaWV3LnN0YXRpY1ZpZXdRdWVyaWVzKSB7CiAgICAgICAgICAgIGV4ZWN1dGVWaWV3UXVlcnlGbigyIC8qIFVwZGF0ZSAqLywgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LnZpZXdRdWVyeSkpLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLy8gUmVuZGVyIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRWaWV3LmNvbXBvbmVudHM7CiAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVuZGVyQ2hpbGRDb21wb25lbnRzKGxWaWV3LCBjb21wb25lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBsVmlld1tGTEFHU10gJj0gfjQgLyogQ3JlYXRpb25Nb2RlICovOwogICAgICAgIGxlYXZlVmlldygpOwogICAgfQp9Ci8qKgogKiBQcm9jZXNzZXMgYSB2aWV3IGluIHVwZGF0ZSBtb2RlLiBUaGlzIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN0ZXBzIGluIGEgc3BlY2lmaWMgb3JkZXI6CiAqIC0gZXhlY3V0aW5nIGEgdGVtcGxhdGUgZnVuY3Rpb24gaW4gdXBkYXRlIG1vZGU7CiAqIC0gZXhlY3V0aW5nIGhvb2tzOwogKiAtIHJlZnJlc2hpbmcgcXVlcmllczsKICogLSBzZXR0aW5nIGhvc3QgYmluZGluZ3M7CiAqIC0gcmVmcmVzaGluZyBjaGlsZCAoZW1iZWRkZWQgYW5kIGNvbXBvbmVudCkgdmlld3MuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRlbXBsYXRlRm4KICogQHBhcmFtIHs/fSBjb250ZXh0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZyZXNoVmlldyh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIGNvbnRleHQpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChpc0NyZWF0aW9uTW9kZShsVmlldyksIGZhbHNlLCAnU2hvdWxkIGJlIHJ1biBpbiB1cGRhdGUgbW9kZScpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZmxhZ3MgPSBsVmlld1tGTEFHU107CiAgICBpZiAoKGZsYWdzICYgMjU2IC8qIERlc3Ryb3llZCAqLykgPT09IDI1NiAvKiBEZXN0cm95ZWQgKi8pCiAgICAgICAgcmV0dXJuOwogICAgZW50ZXJWaWV3KGxWaWV3LCBsVmlld1tUX0hPU1RdKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNoZWNrTm9DaGFuZ2VzTW9kZSA9IGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpOwogICAgdHJ5IHsKICAgICAgICByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KTsKICAgICAgICBzZXRCaW5kaW5nSW5kZXgodFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgpOwogICAgICAgIGlmICh0ZW1wbGF0ZUZuICE9PSBudWxsKSB7CiAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIDIgLyogVXBkYXRlICovLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvb2tzSW5pdFBoYXNlQ29tcGxldGVkID0gKGZsYWdzICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLzsKICAgICAgICAvLyBleGVjdXRlIHByZS1vcmRlciBob29rcyAoT25Jbml0LCBPbkNoYW5nZXMsIERvQ2hlY2spCiAgICAgICAgLy8gUEVSRiBXQVJOSU5HOiBkbyBOT1QgZXh0cmFjdCB0aGlzIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gd2l0aG91dCBydW5uaW5nIGJlbmNobWFya3MKICAgICAgICBpZiAoIWNoZWNrTm9DaGFuZ2VzTW9kZSkgewogICAgICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZU9yZGVyQ2hlY2tIb29rcyA9IHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmIChwcmVPcmRlckNoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBleGVjdXRlQ2hlY2tIb29rcyhsVmlldywgcHJlT3JkZXJDaGVja0hvb2tzLCBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZU9yZGVySG9va3MgPSB0Vmlldy5wcmVPcmRlckhvb2tzOwogICAgICAgICAgICAgICAgaWYgKHByZU9yZGVySG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBleGVjdXRlSW5pdEFuZENoZWNrSG9va3MobFZpZXcsIHByZU9yZGVySG9va3MsIDAgLyogT25Jbml0SG9va3NUb0JlUnVuICovLCBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluY3JlbWVudEluaXRQaGFzZUZsYWdzKGxWaWV3LCAwIC8qIE9uSW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVmcmVzaER5bmFtaWNFbWJlZGRlZFZpZXdzKGxWaWV3KTsKICAgICAgICAvLyBDb250ZW50IHF1ZXJ5IHJlc3VsdHMgbXVzdCBiZSByZWZyZXNoZWQgYmVmb3JlIGNvbnRlbnQgaG9va3MgYXJlIGNhbGxlZC4KICAgICAgICBpZiAodFZpZXcuY29udGVudFF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVmcmVzaENvbnRlbnRRdWVyaWVzKHRWaWV3LCBsVmlldyk7CiAgICAgICAgfQogICAgICAgIC8vIGV4ZWN1dGUgY29udGVudCBob29rcyAoQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCkKICAgICAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgICAgIGlmICghY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICAgICAgICAgIGlmIChob29rc0luaXRQaGFzZUNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGVudENoZWNrSG9va3MgPSB0Vmlldy5jb250ZW50Q2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmIChjb250ZW50Q2hlY2tIb29rcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBjb250ZW50Q2hlY2tIb29rcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SG9va3MgPSB0Vmlldy5jb250ZW50SG9va3M7CiAgICAgICAgICAgICAgICBpZiAoY29udGVudEhvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCBjb250ZW50SG9va3MsIDEgLyogQWZ0ZXJDb250ZW50SW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMSAvKiBBZnRlckNvbnRlbnRJbml0SG9va3NUb0JlUnVuICovKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRIb3N0QmluZGluZ3NCeUV4ZWN1dGluZ0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGxWaWV3KTsKICAgICAgICAvLyBSZWZyZXNoIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRWaWV3LmNvbXBvbmVudHM7CiAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVmcmVzaENoaWxkQ29tcG9uZW50cyhsVmlldywgY29tcG9uZW50cyk7CiAgICAgICAgfQogICAgICAgIC8vIFZpZXcgcXVlcmllcyBtdXN0IGV4ZWN1dGUgYWZ0ZXIgcmVmcmVzaGluZyBjaGlsZCBjb21wb25lbnRzIGJlY2F1c2UgYSB0ZW1wbGF0ZSBpbiB0aGlzIHZpZXcKICAgICAgICAvLyBjb3VsZCBiZSBpbnNlcnRlZCBpbiBhIGNoaWxkIGNvbXBvbmVudC4gSWYgdGhlIHZpZXcgcXVlcnkgZXhlY3V0ZXMgYmVmb3JlIGNoaWxkIGNvbXBvbmVudAogICAgICAgIC8vIHJlZnJlc2gsIHRoZSB0ZW1wbGF0ZSBtaWdodCBub3QgeWV0IGJlIGluc2VydGVkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3UXVlcnkgPSB0Vmlldy52aWV3UXVlcnk7CiAgICAgICAgaWYgKHZpZXdRdWVyeSAhPT0gbnVsbCkgewogICAgICAgICAgICBleGVjdXRlVmlld1F1ZXJ5Rm4oMiAvKiBVcGRhdGUgKi8sIHZpZXdRdWVyeSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8vIGV4ZWN1dGUgdmlldyBob29rcyAoQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCkKICAgICAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgICAgIGlmICghY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICAgICAgICAgIGlmIChob29rc0luaXRQaGFzZUNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgdmlld0NoZWNrSG9va3MgPSB0Vmlldy52aWV3Q2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmICh2aWV3Q2hlY2tIb29rcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCB2aWV3Q2hlY2tIb29rcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3SG9va3MgPSB0Vmlldy52aWV3SG9va3M7CiAgICAgICAgICAgICAgICBpZiAodmlld0hvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCB2aWV3SG9va3MsIDIgLyogQWZ0ZXJWaWV3SW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMiAvKiBBZnRlclZpZXdJbml0SG9va3NUb0JlUnVuICovKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodFZpZXcuZmlyc3RVcGRhdGVQYXNzID09PSB0cnVlKSB7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugb25seSBmbGlwIHRoZSBmbGFnIG9uIHN1Y2Nlc3NmdWwgYHJlZnJlc2hWaWV3YCBvbmx5CiAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgaW4gYGZpbmFsbHlgIGJsb2NrLgogICAgICAgICAgICAvLyBJZiB3ZSBkaWQgdGhpcyBpbiBgZmluYWxseWAgYmxvY2sgdGhlbiBhbiBleGNlcHRpb24gY291bGQgYmxvY2sgdGhlIGV4ZWN1dGlvbiBvZiBzdHlsaW5nCiAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyB3aGljaCBpbiB0dXJuIHdvdWxkIGJlIHVuYWJsZSB0byBpbnNlcnQgdGhlbXNlbHZlcyBpbnRvIHRoZSBzdHlsaW5nIGxpbmtlZAogICAgICAgICAgICAvLyBsaXN0LiBUaGUgcmVzdWx0IG9mIHRoaXMgd291bGQgYmUgdGhhdCBpZiB0aGUgZXhjZXB0aW9uIHdvdWxkIG5vdCBiZSB0aHJvdyBvbiBzdWJzZXF1ZW50IENECiAgICAgICAgICAgIC8vIHRoZSBzdHlsaW5nIHdvdWxkIGJlIHVuYWJsZSB0byBwcm9jZXNzIGl0IGRhdGEgYW5kIHJlZmxlY3QgdG8gdGhlIERPTS4KICAgICAgICAgICAgdFZpZXcuZmlyc3RVcGRhdGVQYXNzID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIERvIG5vdCByZXNldCB0aGUgZGlydHkgc3RhdGUgd2hlbiBydW5uaW5nIGluIGNoZWNrIG5vIGNoYW5nZXMgbW9kZS4gV2UgZG9uJ3Qgd2FudCBjb21wb25lbnRzCiAgICAgICAgLy8gdG8gYmVoYXZlIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIGNoZWNrIG5vIGNoYW5nZXMgaXMgZW5hYmxlZCBvciBub3QuIEZvciBleGFtcGxlOgogICAgICAgIC8vIE1hcmtpbmcgYW4gT25QdXNoIGNvbXBvbmVudCBhcyBkaXJ0eSBmcm9tIHdpdGhpbiB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgaG9vayBpbiBvcmRlciB0bwogICAgICAgIC8vIHJlZnJlc2ggYSBgTmdDbGFzc2AgYmluZGluZyBzaG91bGQgd29yay4gSWYgd2Ugd291bGQgcmVzZXQgdGhlIGRpcnR5IHN0YXRlIGluIHRoZSBjaGVjawogICAgICAgIC8vIG5vIGNoYW5nZXMgY3ljbGUsIHRoZSBjb21wb25lbnQgd291bGQgYmUgbm90IGJlIGRpcnR5IGZvciB0aGUgbmV4dCB1cGRhdGUgcGFzcy4gVGhpcyB3b3VsZAogICAgICAgIC8vIGJlIGRpZmZlcmVudCBpbiBwcm9kdWN0aW9uIG1vZGUgd2hlcmUgdGhlIGNvbXBvbmVudCBkaXJ0eSBzdGF0ZSBpcyBub3QgcmVzZXQuCiAgICAgICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHsKICAgICAgICAgICAgbFZpZXdbRkxBR1NdICY9IH4oNjQgLyogRGlydHkgKi8gfCA4IC8qIEZpcnN0TFZpZXdQYXNzICovKTsKICAgICAgICB9CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBsZWF2ZVZpZXcoKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbgogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudE9yVGVtcGxhdGUodFZpZXcsIGxWaWV3LCB0ZW1wbGF0ZUZuLCBjb250ZXh0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJlckZhY3RvcnkgPSBsVmlld1tSRU5ERVJFUl9GQUNUT1JZXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vcm1hbEV4ZWN1dGlvblBhdGggPSAhZ2V0Q2hlY2tOb0NoYW5nZXNNb2RlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjcmVhdGlvbk1vZGVJc0FjdGl2ZSA9IGlzQ3JlYXRpb25Nb2RlKGxWaWV3KTsKICAgIHRyeSB7CiAgICAgICAgaWYgKG5vcm1hbEV4ZWN1dGlvblBhdGggJiYgIWNyZWF0aW9uTW9kZUlzQWN0aXZlICYmIHJlbmRlcmVyRmFjdG9yeS5iZWdpbikgewogICAgICAgICAgICByZW5kZXJlckZhY3RvcnkuYmVnaW4oKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNyZWF0aW9uTW9kZUlzQWN0aXZlKSB7CiAgICAgICAgICAgIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0ZW1wbGF0ZUZuLCBjb250ZXh0KTsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmIChub3JtYWxFeGVjdXRpb25QYXRoICYmICFjcmVhdGlvbk1vZGVJc0FjdGl2ZSAmJiByZW5kZXJlckZhY3RvcnkuZW5kKSB7CiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5lbmQoKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRlbXBsYXRlRm4KICogQHBhcmFtIHs/fSByZgogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIHJmLCBjb250ZXh0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2U2VsZWN0ZWRJbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTsKICAgIHRyeSB7CiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiAgICAgICAgaWYgKHJmICYgMiAvKiBVcGRhdGUgKi8gJiYgbFZpZXcubGVuZ3RoID4gSEVBREVSX09GRlNFVCkgewogICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIHVwZGF0aW5nLCBpbmhlcmVudGx5IHNlbGVjdCAwIHNvIHdlIGRvbid0CiAgICAgICAgICAgIC8vIGhhdmUgdG8gZ2VuZXJhdGUgdGhhdCBpbnN0cnVjdGlvbiBmb3IgbW9zdCB1cGRhdGUgYmxvY2tzLgogICAgICAgICAgICBzZWxlY3RJbmRleEludGVybmFsKHRWaWV3LCBsVmlldywgMCwgZ2V0Q2hlY2tOb0NoYW5nZXNNb2RlKCkpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZUZuKHJmLCBjb250ZXh0KTsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHNldFNlbGVjdGVkSW5kZXgocHJldlNlbGVjdGVkSW5kZXgpOwogICAgfQp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8gRWxlbWVudAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVDb250ZW50UXVlcmllcyh0VmlldywgdE5vZGUsIGxWaWV3KSB7CiAgICBpZiAoaXNDb250ZW50UXVlcnlIb3N0KHROb2RlKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICAgICAgZm9yIChsZXQgZGlyZWN0aXZlSW5kZXggPSBzdGFydDsgZGlyZWN0aXZlSW5kZXggPCBlbmQ7IGRpcmVjdGl2ZUluZGV4KyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtkaXJlY3RpdmVJbmRleF0pKTsKICAgICAgICAgICAgaWYgKGRlZi5jb250ZW50UXVlcmllcykgewogICAgICAgICAgICAgICAgZGVmLmNvbnRlbnRRdWVyaWVzKDEgLyogQ3JlYXRlICovLCBsVmlld1tkaXJlY3RpdmVJbmRleF0sIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogQ3JlYXRlcyBkaXJlY3RpdmUgaW5zdGFuY2VzLgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKSB7CiAgICBpZiAoIWdldEJpbmRpbmdzRW5hYmxlZCgpKQogICAgICAgIHJldHVybjsKICAgIGluc3RhbnRpYXRlQWxsRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHROb2RlLCBnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldykpOwogICAgaWYgKCh0Tm9kZS5mbGFncyAmIDEyOCAvKiBoYXNIb3N0QmluZGluZ3MgKi8pID09PSAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovKSB7CiAgICAgICAgaW52b2tlRGlyZWN0aXZlc0hvc3RCaW5kaW5ncyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgIH0KfQovKioKICogVGFrZXMgYSBsaXN0IG9mIGxvY2FsIG5hbWVzIGFuZCBpbmRpY2VzIGFuZCBwdXNoZXMgdGhlIHJlc29sdmVkIGxvY2FsIHZhcmlhYmxlIHZhbHVlcwogKiB0byBMVmlldyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFyZSBsb2FkZWQgaW4gdGhlIHRlbXBsYXRlIHdpdGggbG9hZCgpLgogKiBAcGFyYW0gez99IHZpZXdEYXRhCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/PX0gbG9jYWxSZWZFeHRyYWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNhdmVSZXNvbHZlZExvY2Fsc0luRGF0YSh2aWV3RGF0YSwgdE5vZGUsIGxvY2FsUmVmRXh0cmFjdG9yID0gZ2V0TmF0aXZlQnlUTm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXM7CiAgICBpZiAobG9jYWxOYW1lcyAhPT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbG9jYWxJbmRleCA9IHROb2RlLmluZGV4ICsgMTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleCA9ICgvKiogQHR5cGUgez99ICovIChsb2NhbE5hbWVzW2kgKyAxXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5kZXggPT09IC0xID8KICAgICAgICAgICAgICAgIGxvY2FsUmVmRXh0cmFjdG9yKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCB2aWV3RGF0YSkgOgogICAgICAgICAgICAgICAgdmlld0RhdGFbaW5kZXhdOwogICAgICAgICAgICB2aWV3RGF0YVtsb2NhbEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBHZXRzIFRWaWV3IGZyb20gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBvciBjcmVhdGVzIGEgbmV3IFRWaWV3CiAqIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KICoKICogQHBhcmFtIHs/fSBkZWYgQ29tcG9uZW50RGVmCiAqIEByZXR1cm4gez99IFRWaWV3CiAqLwpmdW5jdGlvbiBnZXRPckNyZWF0ZVRDb21wb25lbnRWaWV3KGRlZikgewogICAgcmV0dXJuIGRlZi50VmlldyB8fAogICAgICAgIChkZWYudFZpZXcgPSBjcmVhdGVUVmlldygxIC8qIENvbXBvbmVudCAqLywgLTEsIGRlZi50ZW1wbGF0ZSwgZGVmLmRlY2xzLCBkZWYudmFycywgZGVmLmRpcmVjdGl2ZURlZnMsIGRlZi5waXBlRGVmcywgZGVmLnZpZXdRdWVyeSwgZGVmLnNjaGVtYXMsIGRlZi5jb25zdHMpKTsKfQovKioKICogQ3JlYXRlcyBhIFRWaWV3IGluc3RhbmNlCiAqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IHZpZXdJbmRleCBUaGUgdmlld0Jsb2NrSWQgZm9yIGlubGluZSB2aWV3cywgb3IgLTEgaWYgaXQncyBhIGNvbXBvbmVudC9keW5hbWljCiAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbiBUZW1wbGF0ZSBmdW5jdGlvbgogKiBAcGFyYW0gez99IGRlY2xzIFRoZSBudW1iZXIgb2Ygbm9kZXMsIGxvY2FsIHJlZnMsIGFuZCBwaXBlcyBpbiB0aGlzIHRlbXBsYXRlCiAqIEBwYXJhbSB7P30gdmFycwogKiBAcGFyYW0gez99IGRpcmVjdGl2ZXMgUmVnaXN0cnkgb2YgZGlyZWN0aXZlcyBmb3IgdGhpcyB2aWV3CiAqIEBwYXJhbSB7P30gcGlwZXMgUmVnaXN0cnkgb2YgcGlwZXMgZm9yIHRoaXMgdmlldwogKiBAcGFyYW0gez99IHZpZXdRdWVyeSBWaWV3IHF1ZXJpZXMgZm9yIHRoaXMgdmlldwogKiBAcGFyYW0gez99IHNjaGVtYXMgU2NoZW1hcyBmb3IgdGhpcyB2aWV3CiAqIEBwYXJhbSB7P30gY29uc3RzIENvbnN0YW50cyBmb3IgdGhpcyB2aWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVUVmlldyh0eXBlLCB2aWV3SW5kZXgsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCBkaXJlY3RpdmVzLCBwaXBlcywgdmlld1F1ZXJ5LCBzY2hlbWFzLCBjb25zdHMpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUudFZpZXcrKzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdTdGFydEluZGV4ID0gSEVBREVSX09GRlNFVCArIGRlY2xzOwogICAgLy8gVGhpcyBsZW5ndGggZG9lcyBub3QgeWV0IGNvbnRhaW4gaG9zdCBiaW5kaW5ncyBmcm9tIGNoaWxkIGRpcmVjdGl2ZXMgYmVjYXVzZSBhdCB0aGlzIHBvaW50LAogICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBkaXJlY3RpdmVzIGFyZSBhY3RpdmUgb24gdGhpcyB0ZW1wbGF0ZS4gQXMgc29vbiBhcyBhIGRpcmVjdGl2ZSBpcyBtYXRjaGVkCiAgICAvLyB0aGF0IGhhcyBhIGhvc3QgYmluZGluZywgd2Ugd2lsbCB1cGRhdGUgdGhlIGJsdWVwcmludCB3aXRoIHRoYXQgZGVmJ3MgaG9zdFZhcnMgY291bnQuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbml0aWFsVmlld0xlbmd0aCA9IGJpbmRpbmdTdGFydEluZGV4ICsgdmFyczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJsdWVwcmludCA9IGNyZWF0ZVZpZXdCbHVlcHJpbnQoYmluZGluZ1N0YXJ0SW5kZXgsIGluaXRpYWxWaWV3TGVuZ3RoKTsKICAgIHJldHVybiBibHVlcHJpbnRbKC8qKiBAdHlwZSB7P30gKi8gKFRWSUVXKSldID0gbmdEZXZNb2RlID8KICAgICAgICBuZXcgVFZpZXdDb25zdHJ1Y3Rvcih0eXBlLCB2aWV3SW5kZXgsIC8vIGlkOiBudW1iZXIsCiAgICAgICAgYmx1ZXByaW50LCAvLyBibHVlcHJpbnQ6IExWaWV3LAogICAgICAgIHRlbXBsYXRlRm4sIC8vIHRlbXBsYXRlOiBDb21wb25lbnRUZW1wbGF0ZTx7fT58bnVsbCwKICAgICAgICBudWxsLCAvLyBxdWVyaWVzOiBUUXVlcmllc3xudWxsCiAgICAgICAgdmlld1F1ZXJ5LCAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLCAvLyBub2RlOiBUVmlld05vZGV8VEVsZW1lbnROb2RlfG51bGwsCiAgICAgICAgY2xvbmVUb1RWaWV3RGF0YShibHVlcHJpbnQpLmZpbGwobnVsbCwgYmluZGluZ1N0YXJ0SW5kZXgpLCAvLyBkYXRhOiBURGF0YSwKICAgICAgICBiaW5kaW5nU3RhcnRJbmRleCwgLy8gYmluZGluZ1N0YXJ0SW5kZXg6IG51bWJlciwKICAgICAgICBpbml0aWFsVmlld0xlbmd0aCwgLy8gZXhwYW5kb1N0YXJ0SW5kZXg6IG51bWJlciwKICAgICAgICBudWxsLCAvLyBleHBhbmRvSW5zdHJ1Y3Rpb25zOiBFeHBhbmRvSW5zdHJ1Y3Rpb25zfG51bGwsCiAgICAgICAgdHJ1ZSwgLy8gZmlyc3RDcmVhdGVQYXNzOiBib29sZWFuLAogICAgICAgIHRydWUsIC8vIGZpcnN0VXBkYXRlUGFzczogYm9vbGVhbiwKICAgICAgICBmYWxzZSwgLy8gc3RhdGljVmlld1F1ZXJpZXM6IGJvb2xlYW4sCiAgICAgICAgZmFsc2UsIC8vIHN0YXRpY0NvbnRlbnRRdWVyaWVzOiBib29sZWFuLAogICAgICAgIG51bGwsIC8vIHByZU9yZGVySG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgbnVsbCwgLy8gcHJlT3JkZXJDaGVja0hvb2tzOiBIb29rRGF0YXxudWxsLAogICAgICAgIG51bGwsIC8vIGNvbnRlbnRIb29rczogSG9va0RhdGF8bnVsbCwKICAgICAgICBudWxsLCAvLyBjb250ZW50Q2hlY2tIb29rczogSG9va0RhdGF8bnVsbCwKICAgICAgICBudWxsLCAvLyB2aWV3SG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgbnVsbCwgLy8gdmlld0NoZWNrSG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgbnVsbCwgLy8gZGVzdHJveUhvb2tzOiBEZXN0cm95SG9va0RhdGF8bnVsbCwKICAgICAgICBudWxsLCAvLyBjbGVhbnVwOiBhbnlbXXxudWxsLAogICAgICAgIG51bGwsIC8vIGNvbnRlbnRRdWVyaWVzOiBudW1iZXJbXXxudWxsLAogICAgICAgIG51bGwsIC8vIGNvbXBvbmVudHM6IG51bWJlcltdfG51bGwsCiAgICAgICAgdHlwZW9mIGRpcmVjdGl2ZXMgPT09ICdmdW5jdGlvbicgPwogICAgICAgICAgICBkaXJlY3RpdmVzKCkgOgogICAgICAgICAgICBkaXJlY3RpdmVzLCAvLyBkaXJlY3RpdmVSZWdpc3RyeTogRGlyZWN0aXZlRGVmTGlzdHxudWxsLAogICAgICAgIHR5cGVvZiBwaXBlcyA9PT0gJ2Z1bmN0aW9uJyA/IHBpcGVzKCkgOiBwaXBlcywgLy8gcGlwZVJlZ2lzdHJ5OiBQaXBlRGVmTGlzdHxudWxsLAogICAgICAgIG51bGwsIC8vIGZpcnN0Q2hpbGQ6IFROb2RlfG51bGwsCiAgICAgICAgc2NoZW1hcywgLy8gc2NoZW1hczogU2NoZW1hTWV0YWRhdGFbXXxudWxsLAogICAgICAgIGNvbnN0cykgOiAvLyBjb25zdHM6IFRDb25zdGFudHN8bnVsbAogICAgICAgIHsKICAgICAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICAgICAgaWQ6IHZpZXdJbmRleCwKICAgICAgICAgICAgYmx1ZXByaW50OiBibHVlcHJpbnQsCiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUZuLAogICAgICAgICAgICBxdWVyaWVzOiBudWxsLAogICAgICAgICAgICB2aWV3UXVlcnk6IHZpZXdRdWVyeSwKICAgICAgICAgICAgbm9kZTogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgZGF0YTogYmx1ZXByaW50LnNsaWNlKCkuZmlsbChudWxsLCBiaW5kaW5nU3RhcnRJbmRleCksCiAgICAgICAgICAgIGJpbmRpbmdTdGFydEluZGV4OiBiaW5kaW5nU3RhcnRJbmRleCwKICAgICAgICAgICAgZXhwYW5kb1N0YXJ0SW5kZXg6IGluaXRpYWxWaWV3TGVuZ3RoLAogICAgICAgICAgICBleHBhbmRvSW5zdHJ1Y3Rpb25zOiBudWxsLAogICAgICAgICAgICBmaXJzdENyZWF0ZVBhc3M6IHRydWUsCiAgICAgICAgICAgIGZpcnN0VXBkYXRlUGFzczogdHJ1ZSwKICAgICAgICAgICAgc3RhdGljVmlld1F1ZXJpZXM6IGZhbHNlLAogICAgICAgICAgICBzdGF0aWNDb250ZW50UXVlcmllczogZmFsc2UsCiAgICAgICAgICAgIHByZU9yZGVySG9va3M6IG51bGwsCiAgICAgICAgICAgIHByZU9yZGVyQ2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgY29udGVudEhvb2tzOiBudWxsLAogICAgICAgICAgICBjb250ZW50Q2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgdmlld0hvb2tzOiBudWxsLAogICAgICAgICAgICB2aWV3Q2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgZGVzdHJveUhvb2tzOiBudWxsLAogICAgICAgICAgICBjbGVhbnVwOiBudWxsLAogICAgICAgICAgICBjb250ZW50UXVlcmllczogbnVsbCwKICAgICAgICAgICAgY29tcG9uZW50czogbnVsbCwKICAgICAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnk6IHR5cGVvZiBkaXJlY3RpdmVzID09PSAnZnVuY3Rpb24nID8gZGlyZWN0aXZlcygpIDogZGlyZWN0aXZlcywKICAgICAgICAgICAgcGlwZVJlZ2lzdHJ5OiB0eXBlb2YgcGlwZXMgPT09ICdmdW5jdGlvbicgPyBwaXBlcygpIDogcGlwZXMsCiAgICAgICAgICAgIGZpcnN0Q2hpbGQ6IG51bGwsCiAgICAgICAgICAgIHNjaGVtYXM6IHNjaGVtYXMsCiAgICAgICAgICAgIGNvbnN0czogY29uc3RzLAogICAgICAgIH07Cn0KLyoqCiAqIEBwYXJhbSB7P30gYmluZGluZ1N0YXJ0SW5kZXgKICogQHBhcmFtIHs/fSBpbml0aWFsVmlld0xlbmd0aAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVmlld0JsdWVwcmludChiaW5kaW5nU3RhcnRJbmRleCwgaW5pdGlhbFZpZXdMZW5ndGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJsdWVwcmludCA9IG5nRGV2TW9kZSA/IG5ldyBMVmlld0JsdWVwcmludCgpIDogW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRpYWxWaWV3TGVuZ3RoOyBpKyspIHsKICAgICAgICBibHVlcHJpbnQucHVzaChpIDwgYmluZGluZ1N0YXJ0SW5kZXggPyBudWxsIDogTk9fQ0hBTkdFKTsKICAgIH0KICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoYmx1ZXByaW50KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGV4dAogKiBAcGFyYW0gez99IHRva2VuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVFcnJvcih0ZXh0LCB0b2tlbikgewogICAgcmV0dXJuIG5ldyBFcnJvcihgUmVuZGVyZXI6ICR7dGV4dH0gWyR7c3RyaW5naWZ5Rm9yRXJyb3IodG9rZW4pfV1gKTsKfQovKioKICogQHBhcmFtIHs/fSByRWxlbWVudAogKiBAcGFyYW0gez99IGVsZW1lbnRPclNlbGVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRIb3N0Tm9kZUV4aXN0cyhyRWxlbWVudCwgZWxlbWVudE9yU2VsZWN0b3IpIHsKICAgIGlmICghckVsZW1lbnQpIHsKICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRPclNlbGVjdG9yID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcignSG9zdCBub2RlIHdpdGggc2VsZWN0b3Igbm90IGZvdW5kOicsIGVsZW1lbnRPclNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IGNyZWF0ZUVycm9yKCdIb3N0IG5vZGUgaXMgcmVxdWlyZWQ6JywgZWxlbWVudE9yU2VsZWN0b3IpOwogICAgICAgIH0KICAgIH0KfQovKioKICogTG9jYXRlcyB0aGUgaG9zdCBuYXRpdmUgZWxlbWVudCwgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyBleGlzdGluZyBub2RlcyBpbnRvIHJlbmRlcmluZyBwaXBlbGluZS4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IGVsZW1lbnRPclNlbGVjdG9yIFJlbmRlciBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB0byBsb2NhdGUgdGhlIGVsZW1lbnQuCiAqIEBwYXJhbSB7P30gZW5jYXBzdWxhdGlvbiBWaWV3IEVuY2Fwc3VsYXRpb24gZGVmaW5lZCBmb3IgY29tcG9uZW50IHRoYXQgcmVxdWVzdHMgaG9zdCBlbGVtZW50LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbG9jYXRlSG9zdEVsZW1lbnQocmVuZGVyZXIsIGVsZW1lbnRPclNlbGVjdG9yLCBlbmNhcHN1bGF0aW9uKSB7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgLy8gV2hlbiB1c2luZyBuYXRpdmUgU2hhZG93IERPTSwgZG8gbm90IGNsZWFyIGhvc3QgZWxlbWVudCB0byBhbGxvdyBuYXRpdmUgc2xvdCBwcm9qZWN0aW9uCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXNlcnZlQ29udGVudCA9IGVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uJDEuU2hhZG93RG9tOwogICAgICAgIHJldHVybiByZW5kZXJlci5zZWxlY3RSb290RWxlbWVudChlbGVtZW50T3JTZWxlY3RvciwgcHJlc2VydmVDb250ZW50KTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByRWxlbWVudCA9IHR5cGVvZiBlbGVtZW50T3JTZWxlY3RvciA9PT0gJ3N0cmluZycgPwogICAgICAgICgvKiogQHR5cGUgez99ICovIChyZW5kZXJlci5xdWVyeVNlbGVjdG9yKGVsZW1lbnRPclNlbGVjdG9yKSkpIDoKICAgICAgICBlbGVtZW50T3JTZWxlY3RvcjsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIb3N0Tm9kZUV4aXN0cyhyRWxlbWVudCwgZWxlbWVudE9yU2VsZWN0b3IpOwogICAgLy8gQWx3YXlzIGNsZWFyIGhvc3QgZWxlbWVudCdzIGNvbnRlbnQgd2hlbiBSZW5kZXJlcjMgaXMgaW4gdXNlLiBGb3IgcHJvY2VkdXJhbCByZW5kZXJlciBjYXNlIHdlCiAgICAvLyBtYWtlIGl0IGRlcGVuZCBvbiB3aGV0aGVyIFNoYWRvd0RvbSBlbmNhcHN1bGF0aW9uIGlzIHVzZWQgKGluIHdoaWNoIGNhc2UgdGhlIGNvbnRlbnQgc2hvdWxkIGJlCiAgICAvLyBwcmVzZXJ2ZWQgdG8gYWxsb3cgbmF0aXZlIHNsb3QgcHJvamVjdGlvbikuIFNoYWRvd0RvbSBlbmNhcHN1bGF0aW9uIHJlcXVpcmVzIHByb2NlZHVyYWwKICAgIC8vIHJlbmRlcmVyLCBhbmQgcHJvY2VkdXJhbCByZW5kZXJlciBjYXNlIGlzIGhhbmRsZWQgYWJvdmUuCiAgICByRWxlbWVudC50ZXh0Q29udGVudCA9ICcnOwogICAgcmV0dXJuIHJFbGVtZW50Owp9Ci8qKgogKiBTYXZlcyBjb250ZXh0IGZvciB0aGlzIGNsZWFudXAgZnVuY3Rpb24gaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcy4KICoKICogT24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHNhdmVzIGluIFRWaWV3OgogKiAtIENsZWFudXAgZnVuY3Rpb24KICogLSBJbmRleCBvZiBjb250ZXh0IHdlIGp1c3Qgc2F2ZWQgaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcwogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBjb250ZXh0CiAqIEBwYXJhbSB7P30gY2xlYW51cEZuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdG9yZUNsZWFudXBXaXRoQ29udGV4dCh0VmlldywgbFZpZXcsIGNvbnRleHQsIGNsZWFudXBGbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENsZWFudXAgPSBnZXRMQ2xlYW51cChsVmlldyk7CiAgICBsQ2xlYW51cC5wdXNoKGNvbnRleHQpOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIGdldFRWaWV3Q2xlYW51cCh0VmlldykucHVzaChjbGVhbnVwRm4sIGxDbGVhbnVwLmxlbmd0aCAtIDEpOwogICAgfQp9Ci8qKgogKiBTYXZlcyB0aGUgY2xlYW51cCBmdW5jdGlvbiBpdHNlbGYgaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcy4KICoKICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSB3cmFwcGVkIHdpdGggdGhlaXIgY29udGV4dHMsIGxpa2UgaW4gcmVuZGVyZXIyCiAqIGxpc3RlbmVycy4KICoKICogT24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHRoZSBpbmRleCBvZiB0aGUgY2xlYW51cCBmdW5jdGlvbiBpcyBzYXZlZCBpbiBUVmlldy4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gY2xlYW51cEZuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdG9yZUNsZWFudXBGbih0VmlldywgbFZpZXcsIGNsZWFudXBGbikgewogICAgZ2V0TENsZWFudXAobFZpZXcpLnB1c2goY2xlYW51cEZuKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBnZXRUVmlld0NsZWFudXAodFZpZXcpLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NMRUFOVVBdKSkubGVuZ3RoIC0gMSwgbnVsbCk7CiAgICB9Cn0KLyoqCiAqIENvbnN0cnVjdHMgYSBUTm9kZSBvYmplY3QgZnJvbSB0aGUgYXJndW1lbnRzLgogKgogKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2AgdG8gd2hpY2ggdGhpcyBgVE5vZGVgIGJlbG9uZ3MgKHVzZWQgb25seSBpbiBgbmdEZXZNb2RlYCkKICogQHBhcmFtIHs/fSB0UGFyZW50CiAqIEBwYXJhbSB7P30gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbm9kZQogKiBAcGFyYW0gez99IGFkanVzdGVkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBUTm9kZSBpbiBUVmlldy5kYXRhLCBhZGp1c3RlZCBmb3IgSEVBREVSX09GRlNFVAogKiBAcGFyYW0gez99IHRhZ05hbWUgVGhlIHRhZyBuYW1lIG9mIHRoZSBub2RlCiAqIEBwYXJhbSB7P30gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBvbiB0aGlzIG5vZGUKICogQHJldHVybiB7P30gdGhlIFROb2RlIG9iamVjdAogKi8KZnVuY3Rpb24gY3JlYXRlVE5vZGUodFZpZXcsIHRQYXJlbnQsIHR5cGUsIGFkanVzdGVkSW5kZXgsIHRhZ05hbWUsIGF0dHJzKSB7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnROb2RlKys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5qZWN0b3JJbmRleCA9IHRQYXJlbnQgPyB0UGFyZW50LmluamVjdG9ySW5kZXggOiAtMTsKICAgIHJldHVybiBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVEZWJ1Zyh0VmlldywgLy8gdFZpZXdfOiBUVmlldwogICAgdHlwZSwgLy8gdHlwZTogVE5vZGVUeXBlCiAgICBhZGp1c3RlZEluZGV4LCAvLyBpbmRleDogbnVtYmVyCiAgICBpbmplY3RvckluZGV4LCAvLyBpbmplY3RvckluZGV4OiBudW1iZXIKICAgIC0xLCAvLyBkaXJlY3RpdmVTdGFydDogbnVtYmVyCiAgICAtMSwgLy8gZGlyZWN0aXZlRW5kOiBudW1iZXIKICAgIC0xLCAvLyBkaXJlY3RpdmVTdHlsaW5nTGFzdDogbnVtYmVyCiAgICBudWxsLCAvLyBwcm9wZXJ0eUJpbmRpbmdzOiBudW1iZXJbXXxudWxsCiAgICAwLCAvLyBmbGFnczogVE5vZGVGbGFncwogICAgMCwgLy8gcHJvdmlkZXJJbmRleGVzOiBUTm9kZVByb3ZpZGVySW5kZXhlcwogICAgdGFnTmFtZSwgLy8gdGFnTmFtZTogc3RyaW5nfG51bGwKICAgIGF0dHJzLCAvLyBhdHRyczogKHN0cmluZ3xBdHRyaWJ1dGVNYXJrZXJ8KHN0cmluZ3xTZWxlY3RvckZsYWdzKVtdKVtdfG51bGwKICAgIG51bGwsIC8vIG1lcmdlZEF0dHJzCiAgICBudWxsLCAvLyBsb2NhbE5hbWVzOiAoc3RyaW5nfG51bWJlcilbXXxudWxsCiAgICB1bmRlZmluZWQsIC8vIGluaXRpYWxJbnB1dHM6IChzdHJpbmdbXXxudWxsKVtdfG51bGx8dW5kZWZpbmVkCiAgICBudWxsLCAvLyBpbnB1dHM6IFByb3BlcnR5QWxpYXNlc3xudWxsCiAgICBudWxsLCAvLyBvdXRwdXRzOiBQcm9wZXJ0eUFsaWFzZXN8bnVsbAogICAgbnVsbCwgLy8gdFZpZXdzOiBJVFZpZXd8SVRWaWV3W118bnVsbAogICAgbnVsbCwgLy8gbmV4dDogSVROb2RlfG51bGwKICAgIG51bGwsIC8vIHByb2plY3Rpb25OZXh0OiBJVE5vZGV8bnVsbAogICAgbnVsbCwgLy8gY2hpbGQ6IElUTm9kZXxudWxsCiAgICB0UGFyZW50LCAvLyBwYXJlbnQ6IFRFbGVtZW50Tm9kZXxUQ29udGFpbmVyTm9kZXxudWxsCiAgICBudWxsLCAvLyBwcm9qZWN0aW9uOiBudW1iZXJ8KElUTm9kZXxSTm9kZVtdKVtdfG51bGwKICAgIG51bGwsIC8vIHN0eWxlczogc3RyaW5nfG51bGwKICAgIHVuZGVmaW5lZCwgLy8gcmVzaWR1YWxTdHlsZXM6IHN0cmluZ3xudWxsCiAgICBudWxsLCAvLyBjbGFzc2VzOiBzdHJpbmd8bnVsbAogICAgdW5kZWZpbmVkLCAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpLCAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpKSA6CiAgICAgICAgewogICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICBpbmRleDogYWRqdXN0ZWRJbmRleCwKICAgICAgICAgICAgaW5qZWN0b3JJbmRleDogaW5qZWN0b3JJbmRleCwKICAgICAgICAgICAgZGlyZWN0aXZlU3RhcnQ6IC0xLAogICAgICAgICAgICBkaXJlY3RpdmVFbmQ6IC0xLAogICAgICAgICAgICBkaXJlY3RpdmVTdHlsaW5nTGFzdDogLTEsCiAgICAgICAgICAgIHByb3BlcnR5QmluZGluZ3M6IG51bGwsCiAgICAgICAgICAgIGZsYWdzOiAwLAogICAgICAgICAgICBwcm92aWRlckluZGV4ZXM6IDAsCiAgICAgICAgICAgIHRhZ05hbWU6IHRhZ05hbWUsCiAgICAgICAgICAgIGF0dHJzOiBhdHRycywKICAgICAgICAgICAgbWVyZ2VkQXR0cnM6IG51bGwsCiAgICAgICAgICAgIGxvY2FsTmFtZXM6IG51bGwsCiAgICAgICAgICAgIGluaXRpYWxJbnB1dHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgaW5wdXRzOiBudWxsLAogICAgICAgICAgICBvdXRwdXRzOiBudWxsLAogICAgICAgICAgICB0Vmlld3M6IG51bGwsCiAgICAgICAgICAgIG5leHQ6IG51bGwsCiAgICAgICAgICAgIHByb2plY3Rpb25OZXh0OiBudWxsLAogICAgICAgICAgICBjaGlsZDogbnVsbCwKICAgICAgICAgICAgcGFyZW50OiB0UGFyZW50LAogICAgICAgICAgICBwcm9qZWN0aW9uOiBudWxsLAogICAgICAgICAgICBzdHlsZXM6IG51bGwsCiAgICAgICAgICAgIHJlc2lkdWFsU3R5bGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGNsYXNzZXM6IG51bGwsCiAgICAgICAgICAgIHJlc2lkdWFsQ2xhc3NlczogdW5kZWZpbmVkLAogICAgICAgICAgICBjbGFzc0JpbmRpbmdzOiAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpLAogICAgICAgICAgICBzdHlsZUJpbmRpbmdzOiAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpLAogICAgICAgIH07Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5wdXRBbGlhc01hcAogKiBAcGFyYW0gez99IGRpcmVjdGl2ZURlZklkeAogKiBAcGFyYW0gez99IHByb3BTdG9yZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2VuZXJhdGVQcm9wZXJ0eUFsaWFzZXMoaW5wdXRBbGlhc01hcCwgZGlyZWN0aXZlRGVmSWR4LCBwcm9wU3RvcmUpIHsKICAgIGZvciAobGV0IHB1YmxpY05hbWUgaW4gaW5wdXRBbGlhc01hcCkgewogICAgICAgIGlmIChpbnB1dEFsaWFzTWFwLmhhc093blByb3BlcnR5KHB1YmxpY05hbWUpKSB7CiAgICAgICAgICAgIHByb3BTdG9yZSA9IHByb3BTdG9yZSA9PT0gbnVsbCA/IHt9IDogcHJvcFN0b3JlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGludGVybmFsTmFtZSA9IGlucHV0QWxpYXNNYXBbcHVibGljTmFtZV07CiAgICAgICAgICAgIGlmIChwcm9wU3RvcmUuaGFzT3duUHJvcGVydHkocHVibGljTmFtZSkpIHsKICAgICAgICAgICAgICAgIHByb3BTdG9yZVtwdWJsaWNOYW1lXS5wdXNoKGRpcmVjdGl2ZURlZklkeCwgaW50ZXJuYWxOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIChwcm9wU3RvcmVbcHVibGljTmFtZV0gPSBbZGlyZWN0aXZlRGVmSWR4LCBpbnRlcm5hbE5hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9wU3RvcmU7Cn0KLyoqCiAqIEluaXRpYWxpemVzIGRhdGEgc3RydWN0dXJlcyByZXF1aXJlZCB0byB3b3JrIHdpdGggZGlyZWN0aXZlIG91dHB1dHMgYW5kIG91dHB1dHMuCiAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgZm9yIGFsbCBkaXJlY3RpdmVzIG1hdGNoZWQgb24gYSBnaXZlbiBUTm9kZS4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbml0aWFsaXplSW5wdXRBbmRPdXRwdXRBbGlhc2VzKHRWaWV3LCB0Tm9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVmcyA9IHRWaWV3LmRhdGE7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZUF0dHJzID0gdE5vZGUuYXR0cnM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnB1dHNGcm9tQXR0cnMgPSBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVJbml0aWFsSW5wdXRzKCkgOiBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbnB1dHNTdG9yZSA9IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgb3V0cHV0c1N0b3JlID0gbnVsbDsKICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlZiA9ICgvKiogQHR5cGUgez99ICovIChkZWZzW2ldKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpcmVjdGl2ZUlucHV0cyA9IGRpcmVjdGl2ZURlZi5pbnB1dHM7CiAgICAgICAgaW5wdXRzRnJvbUF0dHJzLnB1c2godE5vZGVBdHRycyAhPT0gbnVsbCA/IGdlbmVyYXRlSW5pdGlhbElucHV0cyhkaXJlY3RpdmVJbnB1dHMsIHROb2RlQXR0cnMpIDogbnVsbCk7CiAgICAgICAgaW5wdXRzU3RvcmUgPSBnZW5lcmF0ZVByb3BlcnR5QWxpYXNlcyhkaXJlY3RpdmVJbnB1dHMsIGksIGlucHV0c1N0b3JlKTsKICAgICAgICBvdXRwdXRzU3RvcmUgPSBnZW5lcmF0ZVByb3BlcnR5QWxpYXNlcyhkaXJlY3RpdmVEZWYub3V0cHV0cywgaSwgb3V0cHV0c1N0b3JlKTsKICAgIH0KICAgIGlmIChpbnB1dHNTdG9yZSAhPT0gbnVsbCkgewogICAgICAgIGlmIChpbnB1dHNTdG9yZS5oYXNPd25Qcm9wZXJ0eSgnY2xhc3MnKSkgewogICAgICAgICAgICB0Tm9kZS5mbGFncyB8PSAxNiAvKiBoYXNDbGFzc0lucHV0ICovOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXRzU3RvcmUuaGFzT3duUHJvcGVydHkoJ3N0eWxlJykpIHsKICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gMzIgLyogaGFzU3R5bGVJbnB1dCAqLzsKICAgICAgICB9CiAgICB9CiAgICB0Tm9kZS5pbml0aWFsSW5wdXRzID0gaW5wdXRzRnJvbUF0dHJzOwogICAgdE5vZGUuaW5wdXRzID0gaW5wdXRzU3RvcmU7CiAgICB0Tm9kZS5vdXRwdXRzID0gb3V0cHV0c1N0b3JlOwp9Ci8qKgogKiBNYXBwaW5nIGJldHdlZW4gYXR0cmlidXRlcyBuYW1lcyB0aGF0IGRvbid0IGNvcnJlc3BvbmQgdG8gdGhlaXIgZWxlbWVudCBwcm9wZXJ0eSBuYW1lcy4KICoKICogUGVyZm9ybWFuY2Ugbm90ZTogdGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIGFzIGEgc2VyaWVzIG9mIGlmIGNoZWNrcyAoaW5zdGVhZCBvZiwgc2F5LCBhIHByb3BlcnR5CiAqIG9iamVjdCBsb29rdXApIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIC0gdGhlIHNlcmllcyBvZiBgaWZgIGNoZWNrcyBzZWVtcyB0byBiZSB0aGUgZmFzdGVzdCB3YXkgb2YKICogbWFwcGluZyBwcm9wZXJ0eSBuYW1lcy4gRG8gTk9UIGNoYW5nZSB3aXRob3V0IGJlbmNobWFya2luZy4KICoKICogTm90ZTogdGhpcyBtYXBwaW5nIGhhcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZXF1YWxseSBuYW1lZCBtYXBwaW5nIGluIHRoZSB0ZW1wbGF0ZQogKiB0eXBlLWNoZWNraW5nIG1hY2hpbmVyeSBvZiBuZ3RzYy4KICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXBQcm9wTmFtZShuYW1lKSB7CiAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykKICAgICAgICByZXR1cm4gJ2NsYXNzTmFtZSc7CiAgICBpZiAobmFtZSA9PT0gJ2ZvcicpCiAgICAgICAgcmV0dXJuICdodG1sRm9yJzsKICAgIGlmIChuYW1lID09PSAnZm9ybWFjdGlvbicpCiAgICAgICAgcmV0dXJuICdmb3JtQWN0aW9uJzsKICAgIGlmIChuYW1lID09PSAnaW5uZXJIdG1sJykKICAgICAgICByZXR1cm4gJ2lubmVySFRNTCc7CiAgICBpZiAobmFtZSA9PT0gJ3JlYWRvbmx5JykKICAgICAgICByZXR1cm4gJ3JlYWRPbmx5JzsKICAgIGlmIChuYW1lID09PSAndGFiaW5kZXgnKQogICAgICAgIHJldHVybiAndGFiSW5kZXgnOwogICAgcmV0dXJuIG5hbWU7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJvcE5hbWUKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gc2FuaXRpemVyCiAqIEBwYXJhbSB7P30gbmF0aXZlT25seQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIHZhbHVlLCByZW5kZXJlciwgc2FuaXRpemVyLCBuYXRpdmVPbmx5KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgKC8qKiBAdHlwZSB7P30gKi8gKE5PX0NIQU5HRSkpLCAnSW5jb21pbmcgdmFsdWUgc2hvdWxkIG5ldmVyIGJlIE5PX0NIQU5HRS4nKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5wdXREYXRhID0gdE5vZGUuaW5wdXRzOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRhdGFWYWx1ZTsKICAgIGlmICghbmF0aXZlT25seSAmJiBpbnB1dERhdGEgIT0gbnVsbCAmJiAoZGF0YVZhbHVlID0gaW5wdXREYXRhW3Byb3BOYW1lXSkpIHsKICAgICAgICBzZXRJbnB1dHNGb3JQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGRhdGFWYWx1ZSwgcHJvcE5hbWUsIHZhbHVlKTsKICAgICAgICBpZiAoaXNDb21wb25lbnRIb3N0KHROb2RlKSkKICAgICAgICAgICAgbWFya0RpcnR5SWZPblB1c2gobFZpZXcsIHROb2RlLmluZGV4KTsKICAgICAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnRpZXMobFZpZXcsIGVsZW1lbnQsIHROb2RlLnR5cGUsIGRhdGFWYWx1ZSwgdmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgIHByb3BOYW1lID0gbWFwUHJvcE5hbWUocHJvcE5hbWUpOwogICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgdmFsaWRhdGVBZ2FpbnN0RXZlbnRQcm9wZXJ0aWVzKHByb3BOYW1lKTsKICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVByb3BlcnR5KHRWaWV3LCBsVmlldywgZWxlbWVudCwgcHJvcE5hbWUsIHROb2RlKSkgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIGhlcmUgc2luY2Ugd2Ugb25seSBsb2cgd2FybmluZ3MgZm9yIHVua25vd24gcHJvcGVydGllcy4KICAgICAgICAgICAgICAgIHdhcm5BYm91dFVua25vd25Qcm9wZXJ0eShwcm9wTmFtZSwgdE5vZGUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5nRGV2TW9kZS5yZW5kZXJlclNldFByb3BlcnR5Kys7CiAgICAgICAgfQogICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgc2FuaXRpemVyIGlzIG9ubHkgYWRkZWQgd2hlbiB0aGUgY29tcGlsZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZQogICAgICAgIC8vIHByb3BlcnR5IGlzIHJpc2t5LCBzbyBzYW5pdGl6YXRpb24gY2FuIGJlIGRvbmUgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KICAgICAgICB2YWx1ZSA9IHNhbml0aXplciAhPSBudWxsID8gKCgvKiogQHR5cGUgez99ICovIChzYW5pdGl6ZXIodmFsdWUsIHROb2RlLnRhZ05hbWUgfHwgJycsIHByb3BOYW1lKSkpKSA6IHZhbHVlOwogICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0UHJvcGVydHkoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSwgcHJvcE5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIWlzQW5pbWF0aW9uUHJvcChwcm9wTmFtZSkpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnNldFByb3BlcnR5ID8gKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSkgOgogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpW3Byb3BOYW1lXSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgYSBjb250YWluZXIgYW5kIHRoZSBwcm9wZXJ0eSBkaWRuJ3QKICAgICAgICAvLyBtYXRjaCBhbnkgb2YgdGhlIGlucHV0cyBvciBzY2hlbWFzIHdlIHNob3VsZCB0aHJvdy4KICAgICAgICBpZiAobmdEZXZNb2RlICYmICFtYXRjaGluZ1NjaGVtYXModFZpZXcsIGxWaWV3LCB0Tm9kZS50YWdOYW1lKSkgewogICAgICAgICAgICB3YXJuQWJvdXRVbmtub3duUHJvcGVydHkocHJvcE5hbWUsIHROb2RlKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIElmIG5vZGUgaXMgYW4gT25QdXNoIGNvbXBvbmVudCwgbWFya3MgaXRzIExWaWV3IGRpcnR5LgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdmlld0luZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXJrRGlydHlJZk9uUHVzaChsVmlldywgdmlld0luZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2hpbGRDb21wb25lbnRMVmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh2aWV3SW5kZXgsIGxWaWV3KTsKICAgIGlmICghKGNoaWxkQ29tcG9uZW50TFZpZXdbRkxBR1NdICYgMTYgLyogQ2hlY2tBbHdheXMgKi8pKSB7CiAgICAgICAgY2hpbGRDb21wb25lbnRMVmlld1tGTEFHU10gfD0gNjQgLyogRGlydHkgKi87CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IGF0dHJOYW1lCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBlbGVtZW50LCB0eXBlLCBhdHRyTmFtZSwgdmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgYXR0ck5hbWUgPSBub3JtYWxpemVEZWJ1Z0JpbmRpbmdOYW1lKGF0dHJOYW1lKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlYnVnVmFsdWUgPSBub3JtYWxpemVEZWJ1Z0JpbmRpbmdWYWx1ZSh2YWx1ZSk7CiAgICBpZiAodHlwZSA9PT0gMyAvKiBFbGVtZW50ICovKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKSwgYXR0ck5hbWUpIDoKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8KICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldEF0dHJpYnV0ZSgoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSksIGF0dHJOYW1lLCBkZWJ1Z1ZhbHVlKSA6CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSkuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBkZWJ1Z1ZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBgYmluZGluZ3M9JHtKU09OLnN0cmluZ2lmeSh7IFthdHRyTmFtZV06IGRlYnVnVmFsdWUgfSwgbnVsbCwgMil9YDsKICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIHJlbmRlcmVyLnNldFZhbHVlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKSwgdGV4dENvbnRlbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBkYXRhVmFsdWUKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0TmdSZWZsZWN0UHJvcGVydGllcyhsVmlldywgZWxlbWVudCwgdHlwZSwgZGF0YVZhbHVlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fCB0eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgIC8qKgogICAgICAgICAqIGRhdGFWYWx1ZSBpcyBhbiBhcnJheSBjb250YWluaW5nIHJ1bnRpbWUgaW5wdXQgb3Igb3V0cHV0IG5hbWVzIGZvciB0aGUgZGlyZWN0aXZlczoKICAgICAgICAgKiBpKzA6IGRpcmVjdGl2ZSBpbnN0YW5jZSBpbmRleAogICAgICAgICAqIGkrMTogcHJpdmF0ZU5hbWUKICAgICAgICAgKgogICAgICAgICAqIGUuZy4gWzAsICdjaGFuZ2UnLCAnY2hhbmdlLW1pbmlmaWVkJ10KICAgICAgICAgKiB3ZSB3YW50IHRvIHNldCB0aGUgcmVmbGVjdGVkIHByb3BlcnR5IHdpdGggdGhlIHByaXZhdGVOYW1lOiBkYXRhVmFsdWVbaSsxXQogICAgICAgICAqLwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVZhbHVlLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBlbGVtZW50LCB0eXBlLCAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVZhbHVlW2kgKyAxXSkpLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gcHJvcE5hbWUKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGVsZW1lbnQsIHByb3BOYW1lLCB0Tm9kZSkgewogICAgLy8gVGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQgdmFsaWQgaWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2NoZW1hLCBpdCBleGlzdHMgb24gdGhlIGVsZW1lbnQKICAgIC8vIG9yIGl0IGlzIHN5bnRoZXRpYywgYW5kIHdlIGFyZSBpbiBhIGJyb3dzZXIgY29udGV4dCAod2ViIHdvcmtlciBub2RlcyBzaG91bGQgYmUgc2tpcHBlZCkuCiAgICBpZiAobWF0Y2hpbmdTY2hlbWFzKHRWaWV3LCBsVmlldywgdE5vZGUudGFnTmFtZSkgfHwgcHJvcE5hbWUgaW4gZWxlbWVudCB8fAogICAgICAgIGlzQW5pbWF0aW9uUHJvcChwcm9wTmFtZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIE5vdGU6IGB0eXBlb2YgTm9kZWAgcmV0dXJucyAnZnVuY3Rpb24nIGluIG1vc3QgYnJvd3NlcnMsIGJ1dCBvbiBJRSBpdCBpcyAnb2JqZWN0JyBzbyB3ZQogICAgLy8gbmVlZCB0byBhY2NvdW50IGZvciBib3RoIGhlcmUsIHdoaWxlIGJlaW5nIGNhcmVmdWwgZm9yIGB0eXBlb2YgbnVsbGAgYWxzbyByZXR1cm5pbmcgJ29iamVjdCcuCiAgICByZXR1cm4gdHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnIHx8IE5vZGUgPT09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgTm9kZSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRhZ05hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1hdGNoaW5nU2NoZW1hcyh0VmlldywgbFZpZXcsIHRhZ05hbWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjaGVtYXMgPSB0Vmlldy5zY2hlbWFzOwogICAgaWYgKHNjaGVtYXMgIT09IG51bGwpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW2ldOwogICAgICAgICAgICBpZiAoc2NoZW1hID09PSBOT19FUlJPUlNfU0NIRU1BIHx8CiAgICAgICAgICAgICAgICBzY2hlbWEgPT09IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgJiYgdGFnTmFtZSAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQovKioKICogTG9ncyBhIHdhcm5pbmcgdGhhdCBhIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgb24gYW4gZWxlbWVudC4KICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHRoZSBpbnZhbGlkIHByb3BlcnR5LgogKiBAcGFyYW0gez99IHROb2RlIE5vZGUgb24gd2hpY2ggd2UgZW5jb3VudGVyZWQgdGhlIHByb3BlcnR5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gd2FybkFib3V0VW5rbm93blByb3BlcnR5KHByb3BOYW1lLCB0Tm9kZSkgewogICAgY29uc29sZS53YXJuKGBDYW4ndCBiaW5kIHRvICcke3Byb3BOYW1lfScgc2luY2UgaXQgaXNuJ3QgYSBrbm93biBwcm9wZXJ0eSBvZiAnJHt0Tm9kZS50YWdOYW1lfScuYCk7Cn0KLyoqCiAqIEluc3RhbnRpYXRlIGEgcm9vdCBjb21wb25lbnQuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGRlZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zdGFudGlhdGVSb290Q29tcG9uZW50KHRWaWV3LCBsVmlldywgZGVmKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBpZiAoZGVmLnByb3ZpZGVyc1Jlc29sdmVyKQogICAgICAgICAgICBkZWYucHJvdmlkZXJzUmVzb2x2ZXIoZGVmKTsKICAgICAgICBnZW5lcmF0ZUV4cGFuZG9JbnN0cnVjdGlvbkJsb2NrKHRWaWV3LCByb290VE5vZGUsIDEpOwogICAgICAgIGJhc2VSZXNvbHZlRGlyZWN0aXZlKHRWaWV3LCBsVmlldywgZGVmKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGdldE5vZGVJbmplY3RhYmxlKGxWaWV3LCB0VmlldywgbFZpZXcubGVuZ3RoIC0gMSwgKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RUTm9kZSkpKTsKICAgIGF0dGFjaFBhdGNoRGF0YShkaXJlY3RpdmUsIGxWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hdGl2ZSA9IGdldE5hdGl2ZUJ5VE5vZGUocm9vdFROb2RlLCBsVmlldyk7CiAgICBpZiAobmF0aXZlKSB7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgfQogICAgcmV0dXJuIGRpcmVjdGl2ZTsKfQovKioKICogUmVzb2x2ZSB0aGUgbWF0Y2hlZCBkaXJlY3RpdmVzIG9uIGEgbm9kZS4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsb2NhbFJlZnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmVzKHRWaWV3LCBsVmlldywgdE5vZGUsIGxvY2FsUmVmcykgewogICAgLy8gUGxlYXNlIG1ha2Ugc3VyZSB0byBoYXZlIGV4cGxpY2l0IHR5cGUgZm9yIGBleHBvcnRzTWFwYC4gSW5mZXJyZWQgdHlwZSB0cmlnZ2VycyBidWcgaW4KICAgIC8vIHRzaWNrbGUuCiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBoYXNEaXJlY3RpdmVzID0gZmFsc2U7CiAgICBpZiAoZ2V0QmluZGluZ3NFbmFibGVkKCkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmcyA9IGZpbmREaXJlY3RpdmVEZWZNYXRjaGVzKHRWaWV3LCBsVmlldywgdE5vZGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleHBvcnRzTWFwID0gbG9jYWxSZWZzID09PSBudWxsID8gbnVsbCA6IHsgJyc6IC0xIH07CiAgICAgICAgaWYgKGRpcmVjdGl2ZURlZnMgIT09IG51bGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdG90YWxEaXJlY3RpdmVIb3N0VmFycyA9IDA7CiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlOwogICAgICAgICAgICBpbml0VE5vZGVGbGFncyh0Tm9kZSwgdFZpZXcuZGF0YS5sZW5ndGgsIGRpcmVjdGl2ZURlZnMubGVuZ3RoKTsKICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2FtZSB0b2tlbiBpcyBwcm92aWRlZCBieSBzZXZlcmFsIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgbm9kZSwgc29tZSBydWxlcyBhcHBseSBpbgogICAgICAgICAgICAvLyB0aGUgdmlld0VuZ2luZToKICAgICAgICAgICAgLy8gLSB2aWV3UHJvdmlkZXJzIGhhdmUgcHJpb3JpdHkgb3ZlciBwcm92aWRlcnMKICAgICAgICAgICAgLy8gLSB0aGUgbGFzdCBkaXJlY3RpdmUgaW4gTmdNb2R1bGUuZGVjbGFyYXRpb25zIGhhcyBwcmlvcml0eSBvdmVyIHRoZSBwcmV2aW91cyBvbmUKICAgICAgICAgICAgLy8gU28gdG8gbWF0Y2ggdGhlc2UgcnVsZXMsIHRoZSBvcmRlciBpbiB3aGljaCBwcm92aWRlcnMgYXJlIGFkZGVkIGluIHRoZSBhcnJheXMgaXMgdmVyeQogICAgICAgICAgICAvLyBpbXBvcnRhbnQuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlyZWN0aXZlRGVmcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVmID0gZGlyZWN0aXZlRGVmc1tpXTsKICAgICAgICAgICAgICAgIGlmIChkZWYucHJvdmlkZXJzUmVzb2x2ZXIpCiAgICAgICAgICAgICAgICAgICAgZGVmLnByb3ZpZGVyc1Jlc29sdmVyKGRlZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2VuZXJhdGVFeHBhbmRvSW5zdHJ1Y3Rpb25CbG9jayh0VmlldywgdE5vZGUsIGRpcmVjdGl2ZURlZnMubGVuZ3RoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJlT3JkZXJIb29rc0ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHByZU9yZGVyQ2hlY2tIb29rc0ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlyZWN0aXZlRGVmcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVmID0gZGlyZWN0aXZlRGVmc1tpXTsKICAgICAgICAgICAgICAgIC8vIE1lcmdlIHRoZSBhdHRycyBpbiB0aGUgb3JkZXIgb2YgbWF0Y2hlcy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpcyB0aGUKICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBpdHNlbGYsIHNvIHRoYXQgdGhlIGNvbXBvbmVudCBoYXMgdGhlIGxlYXN0IHByaW9yaXR5LgogICAgICAgICAgICAgICAgdE5vZGUubWVyZ2VkQXR0cnMgPSBtZXJnZUhvc3RBdHRycyh0Tm9kZS5tZXJnZWRBdHRycywgZGVmLmhvc3RBdHRycyk7CiAgICAgICAgICAgICAgICBiYXNlUmVzb2x2ZURpcmVjdGl2ZSh0VmlldywgbFZpZXcsIGRlZik7CiAgICAgICAgICAgICAgICBzYXZlTmFtZVRvRXhwb3J0TWFwKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhKSkubGVuZ3RoIC0gMSwgZGVmLCBleHBvcnRzTWFwKTsKICAgICAgICAgICAgICAgIGlmIChkZWYuY29udGVudFF1ZXJpZXMgIT09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gOCAvKiBoYXNDb250ZW50UXVlcnkgKi87CiAgICAgICAgICAgICAgICBpZiAoZGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCB8fCBkZWYuaG9zdEF0dHJzICE9PSBudWxsIHx8IGRlZi5ob3N0VmFycyAhPT0gMCkKICAgICAgICAgICAgICAgICAgICB0Tm9kZS5mbGFncyB8PSAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovOwogICAgICAgICAgICAgICAgLy8gT25seSBwdXNoIGEgbm9kZSBpbmRleCBpbnRvIHRoZSBwcmVPcmRlckhvb2tzIGFycmF5IGlmIHRoaXMgaXMgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAvLyBwcmUtb3JkZXIgaG9vayBmb3VuZCBvbiB0aGlzIG5vZGUuCiAgICAgICAgICAgICAgICBpZiAoIXByZU9yZGVySG9va3NGb3VuZCAmJiAoZGVmLm9uQ2hhbmdlcyB8fCBkZWYub25Jbml0IHx8IGRlZi5kb0NoZWNrKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcHVzaCB0aGUgYWN0dWFsIGhvb2sgZnVuY3Rpb24gaW50byB0aGlzIGFycmF5IGxhdGVyIGR1cmluZyBkaXIgaW5zdGFudGlhdGlvbi4KICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZG8gaXQgbm93IGJlY2F1c2Ugd2UgbXVzdCBlbnN1cmUgaG9va3MgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAvLyBvcmRlciB0aGF0IGRpcmVjdGl2ZXMgYXJlIGNyZWF0ZWQgKGkuZS4gaW5qZWN0aW9uIG9yZGVyKS4KICAgICAgICAgICAgICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaCh0Tm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpOwogICAgICAgICAgICAgICAgICAgIHByZU9yZGVySG9va3NGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXByZU9yZGVyQ2hlY2tIb29rc0ZvdW5kICYmIChkZWYub25DaGFuZ2VzIHx8IGRlZi5kb0NoZWNrKSkgewogICAgICAgICAgICAgICAgICAgICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgfHwgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyA9IFtdKSkKICAgICAgICAgICAgICAgICAgICAgICAgLnB1c2godE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUKTsKICAgICAgICAgICAgICAgICAgICBwcmVPcmRlckNoZWNrSG9va3NGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRIb3N0QmluZGluZ3NUb0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGRlZik7CiAgICAgICAgICAgICAgICB0b3RhbERpcmVjdGl2ZUhvc3RWYXJzICs9IGRlZi5ob3N0VmFyczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0aWFsaXplSW5wdXRBbmRPdXRwdXRBbGlhc2VzKHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgIGdyb3dIb3N0VmFyc1NwYWNlKHRWaWV3LCBsVmlldywgdG90YWxEaXJlY3RpdmVIb3N0VmFycyk7CiAgICAgICAgfQogICAgICAgIGlmIChleHBvcnRzTWFwKQogICAgICAgICAgICBjYWNoZU1hdGNoaW5nTG9jYWxOYW1lcyh0Tm9kZSwgbG9jYWxSZWZzLCBleHBvcnRzTWFwKTsKICAgIH0KICAgIC8vIE1lcmdlIHRoZSB0ZW1wbGF0ZSBhdHRycyBsYXN0IHNvIHRoYXQgdGhleSBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogICAgdE5vZGUubWVyZ2VkQXR0cnMgPSBtZXJnZUhvc3RBdHRycyh0Tm9kZS5tZXJnZWRBdHRycywgdE5vZGUuYXR0cnMpOwogICAgcmV0dXJuIGhhc0RpcmVjdGl2ZXM7Cn0KLyoqCiAqIEFkZCBgaG9zdEJpbmRpbmdzYCB0byB0aGUgYFRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnNgLgogKgogKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2AgdG8gd2hpY2ggdGhlIGBob3N0QmluZGluZ3NgIHNob3VsZCBiZSBhZGRlZC4KICogQHBhcmFtIHs/fSBkZWYgYENvbXBvbmVudERlZmAvYERpcmVjdGl2ZURlZmAsIHdoaWNoIGNvbnRhaW5zIHRoZSBgaG9zdFZhcnNgL2Bob3N0QmluZGluZ3NgIHRvIGFkZC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFkZEhvc3RCaW5kaW5nc1RvRXhwYW5kb0luc3RydWN0aW9ucyh0VmlldywgZGVmKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGV4cGFuZG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucykpOwogICAgLy8gVE9ETyhtaXNrbyk6IFBFUkYgd2UgYXJlIGFkZGluZyBgaG9zdEJpbmRpbmdzYCBldmVuIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkISBUaGlzIGlzCiAgICAvLyBzdWJvcHRpbWFsIGZvciBwZXJmb3JtYW5jZS4gYGRlZi5ob3N0QmluZGluZ3NgIG1heSBiZSBudWxsLAogICAgLy8gYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHVzaCBudWxsIHRvIHRoZSBhcnJheSBhcyBhIHBsYWNlaG9sZGVyCiAgICAvLyB0byBlbnN1cmUgdGhlIGRpcmVjdGl2ZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIChzbyBob3N0CiAgICAvLyBiaW5kaW5nIGZ1bmN0aW9ucyBhbHdheXMgbGluZSB1cCB3aXRoIHRoZSBjb3JyZWN0aXZlIGRpcmVjdGl2ZSkuCiAgICAvLyBUaGlzIGlzIHN1Ym9wdGltYWwgZm9yIHBlcmZvcm1hbmNlLiBTZWUgYGN1cnJlbnREaXJlY3RpdmVJbmRleGAKICAgIC8vICBjb21tZW50IGluIGBzZXRIb3N0QmluZGluZ3NCeUV4ZWN1dGluZ0V4cGFuZG9JbnN0cnVjdGlvbnNgIGZvciBtb3JlCiAgICAvLyBkZXRhaWxzLiAgZXhwYW5kby5wdXNoKGRlZi5ob3N0QmluZGluZ3MpOwogICAgZXhwYW5kby5wdXNoKGRlZi5ob3N0QmluZGluZ3MpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaG9zdFZhcnMgPSBkZWYuaG9zdFZhcnM7CiAgICBpZiAoaG9zdFZhcnMgIT09IDApIHsKICAgICAgICBleHBhbmRvLnB1c2goZGVmLmhvc3RWYXJzKTsKICAgIH0KfQovKioKICogR3JvdyB0aGUgYExWaWV3YCwgYmx1ZXByaW50IGFuZCBgVFZpZXcuZGF0YWAgdG8gYWNjb21tb2RhdGUgdGhlIGBob3N0QmluZGluZ3NgLgogKgogKiBUbyBzdXBwb3J0IGxvY2FsaXR5IHdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZSBob3cgbWFueSBgaG9zdFZhcnNgIG9mIHRoZSBjb250YWluaW5nIGRpcmVjdGl2ZXMKICogd2UgbmVlZCB0byBhbGxvY2F0ZS4gRm9yIHRoaXMgcmVhc29uIHdlIGFsbG93IGdyb3dpbmcgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFzIHdlIGRpc2NvdmVyIG1vcmUKICogZGlyZWN0aXZlcyB0byBhY2NvbW1vZGF0ZSB0aGVtLgogKgogKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2Agd2hpY2ggbmVlZHMgdG8gYmUgZ3Jvd24uCiAqIEBwYXJhbSB7P30gbFZpZXcgYExWaWV3YCB3aGljaCBuZWVkcyB0byBiZSBncm93bi4KICogQHBhcmFtIHs/fSBjb3VudCBTaXplIGJ5IHdoaWNoIHdlIG5lZWQgdG8gZ3JvdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ3Jvd0hvc3RWYXJzU3BhY2UodFZpZXcsIGxWaWV3LCBjb3VudCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0U2FtZSh0VmlldywgbFZpZXdbVFZJRVddLCAnYExWaWV3YCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBgVFZpZXdgIScpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgbFZpZXcucHVzaChOT19DSEFOR0UpOwogICAgICAgIHRWaWV3LmJsdWVwcmludC5wdXNoKE5PX0NIQU5HRSk7CiAgICAgICAgdFZpZXcuZGF0YS5wdXNoKG51bGwpOwogICAgfQp9Ci8qKgogKiBJbnN0YW50aWF0ZSBhbGwgdGhlIGRpcmVjdGl2ZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgcmVzb2x2ZWQgb24gdGhlIGN1cnJlbnQgbm9kZS4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBuYXRpdmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluc3RhbnRpYXRlQWxsRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHROb2RlLCBuYXRpdmUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICBpZiAoIXRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSh0Tm9kZSwgbFZpZXcpOwogICAgfQogICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdGlhbElucHV0cyA9IHROb2RlLmluaXRpYWxJbnB1dHM7CiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtpXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0NvbXBvbmVudCA9IGlzQ29tcG9uZW50RGVmKGRlZik7CiAgICAgICAgaWYgKGlzQ29tcG9uZW50KSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgICAgICBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksICgvKiogQHR5cGUgez99ICovIChkZWYpKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgdFZpZXcsIGksIHROb2RlKTsKICAgICAgICBhdHRhY2hQYXRjaERhdGEoZGlyZWN0aXZlLCBsVmlldyk7CiAgICAgICAgaWYgKGluaXRpYWxJbnB1dHMgIT09IG51bGwpIHsKICAgICAgICAgICAgc2V0SW5wdXRzRnJvbUF0dHJzKGxWaWV3LCBpIC0gc3RhcnQsIGRpcmVjdGl2ZSwgZGVmLCB0Tm9kZSwgKC8qKiBAdHlwZSB7P30gKi8gKGluaXRpYWxJbnB1dHMpKSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0NvbXBvbmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KTsKICAgICAgICAgICAgY29tcG9uZW50Vmlld1tDT05URVhUXSA9IGRpcmVjdGl2ZTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnZva2VEaXJlY3RpdmVzSG9zdEJpbmRpbmdzKHRWaWV3LCBsVmlldywgdE5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBleHBhbmRvID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpcnN0Q3JlYXRlUGFzcyA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVDsKICAgIHRyeSB7CiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChlbGVtZW50SW5kZXgpOwogICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaV0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBsVmlld1tpXTsKICAgICAgICAgICAgaWYgKGRlZi5ob3N0QmluZGluZ3MgIT09IG51bGwgfHwgZGVmLmhvc3RWYXJzICE9PSAwIHx8IGRlZi5ob3N0QXR0cnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGRlZiwgZGlyZWN0aXZlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmaXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgICAgIGV4cGFuZG8ucHVzaChudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHNldFNlbGVjdGVkSW5kZXgoLTEpOwogICAgfQp9Ci8qKgogKiBJbnZva2UgdGhlIGhvc3QgYmluZGluZ3MgaW4gY3JlYXRpb24gbW9kZS4KICoKICogQHBhcmFtIHs/fSBkZWYgYERpcmVjdGl2ZURlZmAgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIGBob3N0QmluZGluZ3NgIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IGRpcmVjdGl2ZSBJbnN0YW5jZSBvZiBkaXJlY3RpdmUuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnZva2VIb3N0QmluZGluZ3NJbkNyZWF0aW9uTW9kZShkZWYsIGRpcmVjdGl2ZSkgewogICAgaWYgKGRlZi5ob3N0QmluZGluZ3MgIT09IG51bGwpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLmhvc3RCaW5kaW5ncykpKDEgLyogQ3JlYXRlICovLCBkaXJlY3RpdmUpOwogICAgfQp9Ci8qKgogKiBHZW5lcmF0ZXMgYSBuZXcgYmxvY2sgaW4gVFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucyBmb3IgdGhpcyBub2RlLgogKgogKiBFYWNoIGV4cGFuZG8gYmxvY2sgc3RhcnRzIHdpdGggdGhlIGVsZW1lbnQgaW5kZXggKHR1cm5lZCBuZWdhdGl2ZSBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2gKICogaXQgZnJvbSB0aGUgaG9zdFZhciBjb3VudCkgYW5kIHRoZSBkaXJlY3RpdmUgY291bnQuIFNlZSBtb3JlIGluIFZJRVdfREFUQS5tZC4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlQ291bnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdlbmVyYXRlRXhwYW5kb0luc3RydWN0aW9uQmxvY2sodFZpZXcsIHROb2RlLCBkaXJlY3RpdmVDb3VudCkgewogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RDcmVhdGVQYXNzLCB0cnVlLCAnRXhwYW5kbyBibG9jayBzaG91bGQgb25seSBiZSBnZW5lcmF0ZWQgb24gZmlyc3QgY3JlYXRlIHBhc3MuJyk7CiAgICAvLyBJbXBvcnRhbnQ6IEluIEpTIGAteGAgYW5kIGAwLXhgIGlzIG5vdCB0aGUgc2FtZSEgSWYgYHg9PT0wYCB0aGVuIGAteGAgd2lsbCBwcm9kdWNlIGAtMGAgd2hpY2gKICAgIC8vIHJlcXVpcmVzIG5vbiBzdGFuZGFyZCBtYXRoIGFyaXRobWV0aWMgYW5kIGl0IGNhbiBwcmV2ZW50IFZNIG9wdGltaXphdGlvbnMuCiAgICAvLyBgMC0wYCB3aWxsIGFsd2F5cyBwcm9kdWNlIGAwYCBhbmQgd2lsbCBub3QgY2F1c2UgYSBwb3RlbnRpYWwgZGVvcHRpbWl6YXRpb24gaW4gVk0uCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbGVtZW50SW5kZXggPSBIRUFERVJfT0ZGU0VUIC0gdE5vZGUuaW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcm92aWRlclN0YXJ0SW5kZXggPSB0Tm9kZS5wcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByb3ZpZGVyQ291bnQgPSB0Vmlldy5kYXRhLmxlbmd0aCAtIHByb3ZpZGVyU3RhcnRJbmRleDsKICAgICh0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zIHx8ICh0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zID0gW10pKQogICAgICAgIC5wdXNoKGVsZW1lbnRJbmRleCwgcHJvdmlkZXJDb3VudCwgZGlyZWN0aXZlQ291bnQpOwp9Ci8qKgogKiBNYXRjaGVzIHRoZSBjdXJyZW50IG5vZGUgYWdhaW5zdCBhbGwgYXZhaWxhYmxlIHNlbGVjdG9ycy4KICogSWYgYSBjb21wb25lbnQgaXMgbWF0Y2hlZCAoYXQgbW9zdCBvbmUpLCBpdCBpcyByZXR1cm5lZCBpbiBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB2aWV3RGF0YQogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kRGlyZWN0aXZlRGVmTWF0Y2hlcyh0Vmlldywgdmlld0RhdGEsIHROb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWdpc3RyeSA9IHRWaWV3LmRpcmVjdGl2ZVJlZ2lzdHJ5OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hdGNoZXMgPSBudWxsOwogICAgaWYgKHJlZ2lzdHJ5KSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZiA9ICgvKiogQHR5cGUgez99ICovIChyZWdpc3RyeVtpXSkpOwogICAgICAgICAgICBpZiAoaXNOb2RlTWF0Y2hpbmdTZWxlY3Rvckxpc3QodE5vZGUsICgvKiogQHR5cGUgez99ICovIChkZWYuc2VsZWN0b3JzKSksIC8qIGlzUHJvamVjdGlvbk1vZGUgKi8gZmFsc2UpKSB7CiAgICAgICAgICAgICAgICBtYXRjaGVzIHx8IChtYXRjaGVzID0gbmdEZXZNb2RlID8gbmV3IE1hdGNoZXNBcnJheSgpIDogW10pOwogICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSh0Tm9kZSwgdmlld0RhdGEpLCB0VmlldywgZGVmLnR5cGUpOwogICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLykKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dNdWx0aXBsZUNvbXBvbmVudEVycm9yKHROb2RlKTsKICAgICAgICAgICAgICAgICAgICBtYXJrQXNDb21wb25lbnRIb3N0KHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBpcyBhbHdheXMgc3RvcmVkIGZpcnN0IHdpdGggZGlyZWN0aXZlcyBhZnRlci4KICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnVuc2hpZnQoZGVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdGNoZXM7Cn0KLyoqCiAqIE1hcmtzIGEgZ2l2ZW4gVE5vZGUgYXMgYSBjb21wb25lbnQncyBob3N0LiBUaGlzIGNvbnNpc3RzIG9mOgogKiAtIHNldHRpbmcgYXBwcm9wcmlhdGUgVE5vZGUgZmxhZ3M7CiAqIC0gc3RvcmluZyBpbmRleCBvZiBjb21wb25lbnQncyBob3N0IGVsZW1lbnQgc28gaXQgd2lsbCBiZSBxdWV1ZWQgZm9yIHZpZXcgcmVmcmVzaCBkdXJpbmcgQ0QuCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBob3N0VE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1hcmtBc0NvbXBvbmVudEhvc3QodFZpZXcsIGhvc3RUTm9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBob3N0VE5vZGUuZmxhZ3MgfD0gMiAvKiBpc0NvbXBvbmVudEhvc3QgKi87CiAgICAodFZpZXcuY29tcG9uZW50cyB8fCAodFZpZXcuY29tcG9uZW50cyA9IG5nRGV2TW9kZSA/IG5ldyBUVmlld0NvbXBvbmVudHMoKSA6IFtdKSkKICAgICAgICAucHVzaChob3N0VE5vZGUuaW5kZXgpOwp9Ci8qKgogKiBDYWNoZXMgbG9jYWwgbmFtZXMgYW5kIHRoZWlyIG1hdGNoaW5nIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBxdWVyeSBhbmQgdGVtcGxhdGUgbG9va3Vwcy4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxvY2FsUmVmcwogKiBAcGFyYW0gez99IGV4cG9ydHNNYXAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNhY2hlTWF0Y2hpbmdMb2NhbE5hbWVzKHROb2RlLCBsb2NhbFJlZnMsIGV4cG9ydHNNYXApIHsKICAgIGlmIChsb2NhbFJlZnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXMgPSBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVMb2NhbE5hbWVzKCkgOiBbXTsKICAgICAgICAvLyBMb2NhbCBuYW1lcyBtdXN0IGJlIHN0b3JlZCBpbiB0Tm9kZSBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IGxvY2FsUmVmcyBhcmUgZGVmaW5lZAogICAgICAgIC8vIGluIHRoZSB0ZW1wbGF0ZSB0byBlbnN1cmUgdGhlIGRhdGEgaXMgbG9hZGVkIGluIHRoZSBzYW1lIHNsb3RzIGFzIHRoZWlyIHJlZnMKICAgICAgICAvLyBpbiB0aGUgdGVtcGxhdGUgKGZvciB0ZW1wbGF0ZSBxdWVyaWVzKS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsUmVmcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZXhwb3J0c01hcFtsb2NhbFJlZnNbaSArIDFdXTsKICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cG9ydCBvZiBuYW1lICcke2xvY2FsUmVmc1tpICsgMV19JyBub3QgZm91bmQhYCk7CiAgICAgICAgICAgIGxvY2FsTmFtZXMucHVzaChsb2NhbFJlZnNbaV0sIGluZGV4KTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEJ1aWxkcyB1cCBhbiBleHBvcnQgbWFwIGFzIGRpcmVjdGl2ZXMgYXJlIGNyZWF0ZWQsIHNvIGxvY2FsIHJlZnMgY2FuIGJlIHF1aWNrbHkgbWFwcGVkCiAqIHRvIHRoZWlyIGRpcmVjdGl2ZSBpbnN0YW5jZXMuCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBkZWYKICogQHBhcmFtIHs/fSBleHBvcnRzTWFwCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzYXZlTmFtZVRvRXhwb3J0TWFwKGluZGV4LCBkZWYsIGV4cG9ydHNNYXApIHsKICAgIGlmIChleHBvcnRzTWFwKSB7CiAgICAgICAgaWYgKGRlZi5leHBvcnRBcykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZi5leHBvcnRBcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZXhwb3J0c01hcFtkZWYuZXhwb3J0QXNbaV1dID0gaW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZikpCiAgICAgICAgICAgIGV4cG9ydHNNYXBbJyddID0gaW5kZXg7CiAgICB9Cn0KLyoqCiAqIEluaXRpYWxpemVzIHRoZSBmbGFncyBvbiB0aGUgY3VycmVudCBub2RlLCBzZXR0aW5nIGFsbCBpbmRpY2VzIHRvIHRoZSBpbml0aWFsIGluZGV4LAogKiB0aGUgZGlyZWN0aXZlIGNvdW50IHRvIDAsIGFuZCBhZGRpbmcgdGhlIGlzQ29tcG9uZW50IGZsYWcuCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBpbmRleCB0aGUgaW5pdGlhbCBpbmRleAogKiBAcGFyYW0gez99IG51bWJlck9mRGlyZWN0aXZlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5pdFROb2RlRmxhZ3ModE5vZGUsIGluZGV4LCBudW1iZXJPZkRpcmVjdGl2ZXMpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vdEVxdWFsKG51bWJlck9mRGlyZWN0aXZlcywgdE5vZGUuZGlyZWN0aXZlRW5kIC0gdE5vZGUuZGlyZWN0aXZlU3RhcnQsICdSZWFjaGVkIHRoZSBtYXggbnVtYmVyIG9mIGRpcmVjdGl2ZXMnKTsKICAgIHROb2RlLmZsYWdzIHw9IDEgLyogaXNEaXJlY3RpdmVIb3N0ICovOwogICAgLy8gV2hlbiB0aGUgZmlyc3QgZGlyZWN0aXZlIGlzIGNyZWF0ZWQgb24gYSBub2RlLCBzYXZlIHRoZSBpbmRleAogICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQgPSBpbmRleDsKICAgIHROb2RlLmRpcmVjdGl2ZUVuZCA9IGluZGV4ICsgbnVtYmVyT2ZEaXJlY3RpdmVzOwogICAgdE5vZGUucHJvdmlkZXJJbmRleGVzID0gaW5kZXg7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB2aWV3RGF0YQogKiBAcGFyYW0gez99IGRlZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmFzZVJlc29sdmVEaXJlY3RpdmUodFZpZXcsIHZpZXdEYXRhLCBkZWYpIHsKICAgIHRWaWV3LmRhdGEucHVzaChkZWYpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlyZWN0aXZlRmFjdG9yeSA9IGRlZi5mYWN0b3J5IHx8ICgoKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpKS5mYWN0b3J5ID0gZ2V0RmFjdG9yeURlZihkZWYudHlwZSwgdHJ1ZSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgbm9kZUluamVjdG9yRmFjdG9yeSA9IG5ldyBOb2RlSW5qZWN0b3JGYWN0b3J5KGRpcmVjdGl2ZUZhY3RvcnksIGlzQ29tcG9uZW50RGVmKGRlZiksIG51bGwpOwogICAgdFZpZXcuYmx1ZXByaW50LnB1c2gobm9kZUluamVjdG9yRmFjdG9yeSk7CiAgICB2aWV3RGF0YS5wdXNoKG5vZGVJbmplY3RvckZhY3RvcnkpOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaG9zdFROb2RlCiAqIEBwYXJhbSB7P30gZGVmCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgaG9zdFROb2RlLCBkZWYpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hdGl2ZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKGhvc3RUTm9kZSwgbFZpZXcpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldE9yQ3JlYXRlVENvbXBvbmVudFZpZXcoZGVmKTsKICAgIC8vIE9ubHkgY29tcG9uZW50IHZpZXdzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdmlldyB0cmVlIGRpcmVjdGx5LiBFbWJlZGRlZCB2aWV3cyBhcmUKICAgIC8vIGFjY2Vzc2VkIHRocm91Z2ggdGhlaXIgY29udGFpbmVycyBiZWNhdXNlIHRoZXkgbWF5IGJlIHJlbW92ZWQgLyByZS1hZGRlZCBsYXRlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyRmFjdG9yeSA9IGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50VmlldyA9IGFkZFRvVmlld1RyZWUobFZpZXcsIGNyZWF0ZUxWaWV3KGxWaWV3LCB0VmlldywgbnVsbCwgZGVmLm9uUHVzaCA/IDY0IC8qIERpcnR5ICovIDogMTYgLyogQ2hlY2tBbHdheXMgKi8sIG5hdGl2ZSwgKC8qKiBAdHlwZSB7P30gKi8gKGhvc3RUTm9kZSkpLCByZW5kZXJlckZhY3RvcnksIHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihuYXRpdmUsIGRlZikpKTsKICAgIC8vIENvbXBvbmVudCB2aWV3IHdpbGwgYWx3YXlzIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBpbmplY3RlZCBMQ29udGFpbmVycywKICAgIC8vIHNvIHRoaXMgaXMgYSByZWd1bGFyIGVsZW1lbnQsIHdyYXAgaXQgd2l0aCB0aGUgY29tcG9uZW50IHZpZXcKICAgIGxWaWV3W2hvc3RUTm9kZS5pbmRleF0gPSBjb21wb25lbnRWaWV3Owp9Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICogQHBhcmFtIHs/fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdFNhbWUodmFsdWUsICgvKiogQHR5cGUgez99ICovIChOT19DSEFOR0UpKSwgJ0luY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuJyk7CiAgICBuZ0Rldk1vZGUgJiYgdmFsaWRhdGVBZ2FpbnN0RXZlbnRBdHRyaWJ1dGVzKG5hbWUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldykpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlQXR0cmlidXRlKys7CiAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIG5hbWVzcGFjZSkgOgogICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSBzYW5pdGl6ZXIgPT0gbnVsbCA/IHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkgOiBzYW5pdGl6ZXIodmFsdWUsIHROb2RlLnRhZ05hbWUgfHwgJycsIG5hbWUpOwogICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHN0clZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmFtZXNwYWNlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIG5hbWUsIHN0clZhbHVlKSA6CiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBzdHJWYWx1ZSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBTZXRzIGluaXRpYWwgaW5wdXQgcHJvcGVydGllcyBvbiBkaXJlY3RpdmUgaW5zdGFuY2VzIGZyb20gYXR0cmlidXRlIGRhdGEKICoKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBsVmlldyBDdXJyZW50IExWaWV3IHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkLgogKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluZGV4IEluZGV4IG9mIHRoZSBkaXJlY3RpdmUgaW4gZGlyZWN0aXZlcyBhcnJheQogKiBAcGFyYW0gez99IGluc3RhbmNlIEluc3RhbmNlIG9mIHRoZSBkaXJlY3RpdmUgb24gd2hpY2ggdG8gc2V0IHRoZSBpbml0aWFsIGlucHV0cwogKiBAcGFyYW0gez99IGRlZiBUaGUgZGlyZWN0aXZlIGRlZiB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIGlucHV0cwogKiBAcGFyYW0gez99IHROb2RlIFRoZSBzdGF0aWMgZGF0YSBmb3IgdGhpcyBub2RlCiAqIEBwYXJhbSB7P30gaW5pdGlhbElucHV0RGF0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0SW5wdXRzRnJvbUF0dHJzKGxWaWV3LCBkaXJlY3RpdmVJbmRleCwgaW5zdGFuY2UsIGRlZiwgdE5vZGUsIGluaXRpYWxJbnB1dERhdGEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluaXRpYWxJbnB1dHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5pdGlhbElucHV0RGF0YSkpW2RpcmVjdGl2ZUluZGV4XTsKICAgIGlmIChpbml0aWFsSW5wdXRzICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNldElucHV0ID0gZGVmLnNldElucHV0OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGlhbElucHV0cy5sZW5ndGg7KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHVibGljTmFtZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcml2YXRlTmFtZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgaWYgKHNldElucHV0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLnNldElucHV0KSkoaW5zdGFuY2UsIHZhbHVlLCBwdWJsaWNOYW1lLCBwcml2YXRlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGluc3RhbmNlKSkpW3ByaXZhdGVOYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgICAgICAgICBzZXROZ1JlZmxlY3RQcm9wZXJ0eShsVmlldywgbmF0aXZlRWxlbWVudCwgdE5vZGUudHlwZSwgcHJpdmF0ZU5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogR2VuZXJhdGVzIGluaXRpYWxJbnB1dERhdGEgZm9yIGEgbm9kZSBhbmQgc3RvcmVzIGl0IGluIHRoZSB0ZW1wbGF0ZSdzIHN0YXRpYyBzdG9yYWdlCiAqIHNvIHN1YnNlcXVlbnQgdGVtcGxhdGUgaW52b2NhdGlvbnMgZG9uJ3QgaGF2ZSB0byByZWNhbGN1bGF0ZSBpdC4KICoKICogaW5pdGlhbElucHV0RGF0YSBpcyBhbiBhcnJheSBjb250YWluaW5nIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgc2V0IGFzIGlucHV0IHByb3BlcnRpZXMKICogZm9yIGRpcmVjdGl2ZXMgb24gdGhpcyBub2RlLCBidXQgb25seSBvbmNlIG9uIGNyZWF0aW9uLiBXZSBuZWVkIHRoaXMgYXJyYXkgdG8gc3VwcG9ydAogKiB0aGUgY2FzZSB3aGVyZSB5b3Ugc2V0IGFuIFxASW5wdXQgcHJvcGVydHkgb2YgYSBkaXJlY3RpdmUgdXNpbmcgYXR0cmlidXRlLWxpa2Ugc3ludGF4LgogKiBlLmcuIGlmIHlvdSBoYXZlIGEgYG5hbWVgIFxASW5wdXQsIHlvdSBjYW4gc2V0IGl0IG9uY2UgbGlrZSB0aGlzOgogKgogKiA8bXktY29tcG9uZW50IG5hbWU9IkJlc3MiPjwvbXktY29tcG9uZW50PgogKgogKiBAcGFyYW0gez99IGlucHV0cyBUaGUgbGlzdCBvZiBpbnB1dHMgZnJvbSB0aGUgZGlyZWN0aXZlIGRlZgogKiBAcGFyYW0gez99IGF0dHJzIFRoZSBzdGF0aWMgYXR0cnMgb24gdGhpcyBub2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZW5lcmF0ZUluaXRpYWxJbnB1dHMoaW5wdXRzLCBhdHRycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlucHV0c1RvU3RvcmUgPSBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBhdHRycy5sZW5ndGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyc1tpXTsKICAgICAgICBpZiAoYXR0ck5hbWUgPT09IDAgLyogTmFtZXNwYWNlVVJJICovKSB7CiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBpbnB1dHMgb24gbmFtZXNwYWNlZCBhdHRyaWJ1dGVzLgogICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhdHRyTmFtZSA9PT0gNSAvKiBQcm9qZWN0QXMgKi8pIHsKICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBgbmdQcm9qZWN0QXNgIHZhbHVlLgogICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBoaXQgYW55IG90aGVyIGF0dHJpYnV0ZSBtYXJrZXJzLCB3ZSdyZSBkb25lIGFueXdheS4gTm9uZSBvZiB0aG9zZSBhcmUgdmFsaWQgaW5wdXRzLgogICAgICAgIGlmICh0eXBlb2YgYXR0ck5hbWUgPT09ICdudW1iZXInKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoaW5wdXRzLmhhc093blByb3BlcnR5KCgvKiogQHR5cGUgez99ICovIChhdHRyTmFtZSkpKSkgewogICAgICAgICAgICBpZiAoaW5wdXRzVG9TdG9yZSA9PT0gbnVsbCkKICAgICAgICAgICAgICAgIGlucHV0c1RvU3RvcmUgPSBbXTsKICAgICAgICAgICAgaW5wdXRzVG9TdG9yZS5wdXNoKCgvKiogQHR5cGUgez99ICovIChhdHRyTmFtZSkpLCBpbnB1dHNbKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJOYW1lKSldLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaSArIDFdKSkpOwogICAgICAgIH0KICAgICAgICBpICs9IDI7CiAgICB9CiAgICByZXR1cm4gaW5wdXRzVG9TdG9yZTsKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vIFZpZXdDb250YWluZXIgJiBWaWV3Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIE5vdCBzdXJlIHdoeSBJIG5lZWQgdG8gZG8gYGFueWAgaGVyZSBidXQgVFMgY29tcGxhaW5zIGxhdGVyLgovKiogQHR5cGUgez99ICovCmNvbnN0IExDb250YWluZXJBcnJheSA9ICgodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCkpICYmCiAgICBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTENvbnRhaW5lcicpOwovKioKICogQ3JlYXRlcyBhIExDb250YWluZXIsIGVpdGhlciBmcm9tIGEgY29udGFpbmVyIGluc3RydWN0aW9uLCBvciBmb3IgYSBWaWV3Q29udGFpbmVyUmVmLgogKgogKiBAcGFyYW0gez99IGhvc3ROYXRpdmUgVGhlIGhvc3QgZWxlbWVudCBmb3IgdGhlIExDb250YWluZXIKICogQHBhcmFtIHs/fSBjdXJyZW50VmlldyBUaGUgcGFyZW50IHZpZXcgb2YgdGhlIExDb250YWluZXIKICogQHBhcmFtIHs/fSBuYXRpdmUgVGhlIG5hdGl2ZSBjb21tZW50IGVsZW1lbnQKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fSBMQ29udGFpbmVyCiAqLwpmdW5jdGlvbiBjcmVhdGVMQ29udGFpbmVyKGhvc3ROYXRpdmUsIGN1cnJlbnRWaWV3LCBuYXRpdmUsIHROb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcoY3VycmVudFZpZXcpOwogICAgbmdEZXZNb2RlICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihjdXJyZW50Vmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobmF0aXZlKTsKICAgIC8vIGh0dHBzOi8vanNwZXJmLmNvbS9hcnJheS1saXRlcmFsLXZzLW5ldy1hcnJheS1yZWFsbHkKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxDb250YWluZXIgPSBuZXcgKG5nRGV2TW9kZSA/IExDb250YWluZXJBcnJheSA6IEFycmF5KShob3N0TmF0aXZlLCAvLyBob3N0IG5hdGl2ZQogICAgdHJ1ZSwgLy8gQm9vbGVhbiBgdHJ1ZWAgaW4gdGhpcyBwb3NpdGlvbiBzaWduaWZpZXMgdGhhdCB0aGlzIGlzIGFuIGBMQ29udGFpbmVyYAogICAgLTEgLyogRFlOQU1JQ19FTUJFRERFRF9WSUVXU19PTkxZICovIDw8IDEgLyogU0hJRlQgKi8sIC8vIGFjdGl2ZSBpbmRleAogICAgY3VycmVudFZpZXcsIC8vIHBhcmVudAogICAgbnVsbCwgLy8gbmV4dAogICAgbnVsbCwgLy8gcXVlcmllcwogICAgdE5vZGUsIC8vIHRfaG9zdAogICAgbmF0aXZlLCAvLyBuYXRpdmUsCiAgICBudWxsKTsKICAgIG5nRGV2TW9kZSAmJiBhdHRhY2hMQ29udGFpbmVyRGVidWcobENvbnRhaW5lcik7CiAgICByZXR1cm4gbENvbnRhaW5lcjsKfQovKioKICogR29lcyBvdmVyIGR5bmFtaWMgZW1iZWRkZWQgdmlld3MgKG9uZXMgY3JlYXRlZCB0aHJvdWdoIFZpZXdDb250YWluZXJSZWYgQVBJcykgYW5kIHJlZnJlc2hlcwogKiB0aGVtIGJ5IGV4ZWN1dGluZyBhbiBhc3NvY2lhdGVkIHRlbXBsYXRlIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZyZXNoRHluYW1pY0VtYmVkZGVkVmlld3MobFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aWV3T3JDb250YWluZXIgPSBsVmlld1tDSElMRF9IRUFEXTsKICAgIHdoaWxlICh2aWV3T3JDb250YWluZXIgIT09IG51bGwpIHsKICAgICAgICAvLyBOb3RlOiB2aWV3T3JDb250YWluZXIgY2FuIGJlIGFuIExWaWV3IG9yIGFuIExDb250YWluZXIgaW5zdGFuY2UsIGJ1dCBoZXJlIHdlIGFyZSBvbmx5CiAgICAgICAgLy8gaW50ZXJlc3RlZCBpbiBMQ29udGFpbmVyCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBhY3RpdmVJbmRleEZsYWc7CiAgICAgICAgaWYgKGlzTENvbnRhaW5lcih2aWV3T3JDb250YWluZXIpICYmCiAgICAgICAgICAgIChhY3RpdmVJbmRleEZsYWcgPSB2aWV3T3JDb250YWluZXJbQUNUSVZFX0lOREVYXSkgPj4gMSAvKiBTSElGVCAqLyA9PT0KICAgICAgICAgICAgICAgIC0xIC8qIERZTkFNSUNfRU1CRURERURfVklFV1NfT05MWSAqLykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQ7IGkgPCB2aWV3T3JDb250YWluZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmlld09yQ29udGFpbmVyW2ldKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZFRWaWV3ID0gZW1iZWRkZWRMVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChlbWJlZGRlZFRWaWV3LCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTsKICAgICAgICAgICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKGVtYmVkZGVkTFZpZXcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFZpZXcoZW1iZWRkZWRUVmlldywgZW1iZWRkZWRMVmlldywgZW1iZWRkZWRUVmlldy50ZW1wbGF0ZSwgKC8qKiBAdHlwZSB7P30gKi8gKGVtYmVkZGVkTFZpZXdbQ09OVEVYVF0pKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChhY3RpdmVJbmRleEZsYWcgJiAxIC8qIEhBU19UUkFOU1BMQU5URURfVklFV1MgKi8pICE9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgb25seSBDRCBtb3ZlZCB2aWV3cyBpZiB0aGUgY29tcG9uZW50IHdoZXJlIHRoZXkgd2VyZSBpbnNlcnRlZCBkb2VzIG5vdCBtYXRjaAogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aGVyZSB0aGV5IHdlcmUgZGVjbGFyZWQgYW5kIGluc2VydGlvbiBpcyBvbi1wdXNoLiBNb3ZlZCB2aWV3cyBhbHNvCiAgICAgICAgICAgICAgICAvLyBjb250YWlucyBpbnRyYSBjb21wb25lbnQgbW92ZXMsIG9yIGNoZWNrLWFsd2F5cyB3aGljaCBuZWVkIHRvIGJlIHNraXBwZWQuCiAgICAgICAgICAgICAgICByZWZyZXNoVHJhbnNwbGFudGVkVmlld3Modmlld09yQ29udGFpbmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZpZXdPckNvbnRhaW5lciA9IHZpZXdPckNvbnRhaW5lcltORVhUXTsKICAgIH0KfQovKioKICogUmVmcmVzaCB0cmFuc3BsYW50ZWQgTFZpZXdzLgogKgogKiBTZWU6IGBBY3RpdmVJbmRleEZsYWcuSEFTX1RSQU5TUExBTlRFRF9WSUVXU2AgYW5kIGBMVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV11gIGZvcgogKiBleHBsYW5hdGlvbiBvZiB0cmFuc3BsYW50ZWQgdmlld3MuCiAqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciBUaGUgYExDb250YWluZXJgIHdoaWNoIGhhcyB0cmFuc3BsYW50ZWQgdmlld3MuCiAqIEBwYXJhbSB7P30gZGVjbGFyZWRDb21wb25lbnRMVmlldyBUaGUgYGxDb250YWluZXJgIHBhcmVudCBjb21wb25lbnQgYExWaWV3YC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlZnJlc2hUcmFuc3BsYW50ZWRWaWV3cyhsQ29udGFpbmVyLCBkZWNsYXJlZENvbXBvbmVudExWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb3ZlZFZpZXdzID0gKC8qKiBAdHlwZSB7P30gKi8gKGxDb250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChtb3ZlZFZpZXdzLCAnVHJhbnNwbGFudGVkIFZpZXcgZmxhZ3Mgc2V0IGJ1dCBtaXNzaW5nIE1PVkVEX1ZJRVdTJyk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vdmVkVmlld3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbW92ZWRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChtb3ZlZFZpZXdzW2ldKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluc2VydGlvbkxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobW92ZWRMVmlld1tQQVJFTlRdKSk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIoaW5zZXJ0aW9uTENvbnRhaW5lcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluc2VydGVkQ29tcG9uZW50TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5zZXJ0aW9uTENvbnRhaW5lcltQQVJFTlRdW0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXSkpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGluc2VydGVkQ29tcG9uZW50TFZpZXcsICdNaXNzaW5nIExWaWV3Jyk7CiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRyYW5zcGxhbnRlZCB2aWV3IGJ5IGNvbXBlcmluZyBkZWNsYXJhdGlvbiBhbmQgaW5zZXJ0aW9uIGxvY2F0aW9uLgogICAgICAgIGlmIChpbnNlcnRlZENvbXBvbmVudExWaWV3ICE9PSBkZWNsYXJlZENvbXBvbmVudExWaWV3KSB7CiAgICAgICAgICAgIC8vIFllcyB0aGUgYExWaWV3YCBpcyB0cmFuc3BsYW50ZWQuCiAgICAgICAgICAgIC8vIEhlcmUgd2Ugd291bGQgbGlrZSB0byBrbm93IGlmIHRoZSBjb21wb25lbnQgaXMgYE9uUHVzaGAuIFdlIGRvbid0IGhhdmUKICAgICAgICAgICAgLy8gZXhwbGljaXQgYE9uUHVzaGAgZmxhZyBpbnN0ZWFkIHdlIHNldCBgQ2hlY2tBbHdheXNgIHRvIGZhbHNlICh3aGljaCBpcyBgT25QdXNoYCkKICAgICAgICAgICAgLy8gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYE1hbnVhbE9uUHVzaGAgd2hpY2ggaXMgdXNlZCB3aXRoIHdldGhlciBhIERPTSBldmVudAogICAgICAgICAgICAvLyBzaG91bGQgYXV0b21hdGljYWxseSBtYXJrIGEgdmlldyBhcyBkaXJ0eS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnNlcnRpb25Db21wb25lbnRJc09uUHVzaCA9IChpbnNlcnRlZENvbXBvbmVudExWaWV3W0ZMQUdTXSAmIDE2IC8qIENoZWNrQWx3YXlzICovKSA9PT0gMDsKICAgICAgICAgICAgaWYgKGluc2VydGlvbkNvbXBvbmVudElzT25QdXNoKSB7CiAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIGtub3cgdGhhdCB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gdHJhbnNwbGFudGVkIGFjcm9zcyBjb21wb25lbnRzIGFuZCBpcwogICAgICAgICAgICAgICAgLy8gb24tcHVzaCAobm90IGp1c3QgbW92ZWQgd2l0aGluIGEgY29tcG9uZW50KS4gSWYgdGhlIGluc2VydGlvbiBpcyBtYXJrZWQgZGlydHksIHRoZW4KICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gQ0QgaGVyZSBhcyB3ZSB3aWxsIGRvIGl0IGFnYWluIGxhdGVyIHdoZW4gd2UgZ2V0IHRvIGluc2VydGlvbgogICAgICAgICAgICAgICAgLy8gcG9pbnQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlZFRWaWV3ID0gbW92ZWRMVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChtb3ZlZFRWaWV3LCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTsKICAgICAgICAgICAgICAgIHJlZnJlc2hWaWV3KG1vdmVkVFZpZXcsIG1vdmVkTFZpZXcsIG1vdmVkVFZpZXcudGVtcGxhdGUsICgvKiogQHR5cGUgez99ICovIChtb3ZlZExWaWV3W0NPTlRFWFRdKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8vLy8vLy8vLy8vLy8KLyoqCiAqIFJlZnJlc2hlcyBjb21wb25lbnRzIGJ5IGVudGVyaW5nIHRoZSBjb21wb25lbnQgdmlldyBhbmQgcHJvY2Vzc2luZyBpdHMgYmluZGluZ3MsIHF1ZXJpZXMsIGV0Yy4KICoKICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICogQHBhcmFtIHs/fSBjb21wb25lbnRIb3N0SWR4ICBFbGVtZW50IGluZGV4IGluIExWaWV3W10gKGFkanVzdGVkIGZvciBIRUFERVJfT0ZGU0VUKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVmcmVzaENvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudEhvc3RJZHgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChpc0NyZWF0aW9uTW9kZShob3N0TFZpZXcpLCBmYWxzZSwgJ1Nob3VsZCBiZSBydW4gaW4gdXBkYXRlIG1vZGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgoY29tcG9uZW50SG9zdElkeCwgaG9zdExWaWV3KTsKICAgIC8vIE9ubHkgYXR0YWNoZWQgY29tcG9uZW50cyB0aGF0IGFyZSBDaGVja0Fsd2F5cyBvciBPblB1c2ggYW5kIGRpcnR5IHNob3VsZCBiZSByZWZyZXNoZWQKICAgIGlmICh2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKGNvbXBvbmVudFZpZXcpICYmCiAgICAgICAgY29tcG9uZW50Vmlld1tGTEFHU10gJiAoMTYgLyogQ2hlY2tBbHdheXMgKi8gfCA2NCAvKiBEaXJ0eSAqLykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50VFZpZXcgPSBjb21wb25lbnRWaWV3W1RWSUVXXTsKICAgICAgICByZWZyZXNoVmlldyhjb21wb25lbnRUVmlldywgY29tcG9uZW50VmlldywgY29tcG9uZW50VFZpZXcudGVtcGxhdGUsIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0pOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGhvc3RMVmlldwogKiBAcGFyYW0gez99IGNvbXBvbmVudEhvc3RJZHgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudEhvc3RJZHgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChpc0NyZWF0aW9uTW9kZShob3N0TFZpZXcpLCB0cnVlLCAnU2hvdWxkIGJlIHJ1biBpbiBjcmVhdGlvbiBtb2RlJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnRWaWV3ID0gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KGNvbXBvbmVudEhvc3RJZHgsIGhvc3RMVmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnRUVmlldyA9IGNvbXBvbmVudFZpZXdbVFZJRVddOwogICAgc3luY1ZpZXdXaXRoQmx1ZXByaW50KGNvbXBvbmVudFRWaWV3LCBjb21wb25lbnRWaWV3KTsKICAgIHJlbmRlclZpZXcoY29tcG9uZW50VFZpZXcsIGNvbXBvbmVudFZpZXcsIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0pOwp9Ci8qKgogKiBTeW5jcyBhbiBMVmlldyBpbnN0YW5jZSB3aXRoIGl0cyBibHVlcHJpbnQgaWYgdGhleSBoYXZlIGdvdHRlbiBvdXQgb2Ygc3luYy4KICoKICogVHlwaWNhbGx5LCBibHVlcHJpbnRzIGFuZCB0aGVpciB2aWV3IGluc3RhbmNlcyBzaG91bGQgYWx3YXlzIGJlIGluIHN5bmMsIHNvIHRoZSBsb29wIGhlcmUKICogd2lsbCBiZSBza2lwcGVkLiBIb3dldmVyLCBjb25zaWRlciB0aGlzIGNhc2Ugb2YgdHdvIGNvbXBvbmVudHMgc2lkZS1ieS1zaWRlOgogKgogKiBBcHAgdGVtcGxhdGU6CiAqIGBgYAogKiA8Y29tcD48L2NvbXA+CiAqIDxjb21wPjwvY29tcD4KICogYGBgCiAqCiAqIFRoZSBmb2xsb3dpbmcgd2lsbCBoYXBwZW46CiAqIDEuIEFwcCB0ZW1wbGF0ZSBiZWdpbnMgcHJvY2Vzc2luZy4KICogMi4gRmlyc3QgPGNvbXA+IGlzIG1hdGNoZWQgYXMgYSBjb21wb25lbnQgYW5kIGl0cyBMVmlldyBpcyBjcmVhdGVkLgogKiAzLiBTZWNvbmQgPGNvbXA+IGlzIG1hdGNoZWQgYXMgYSBjb21wb25lbnQgYW5kIGl0cyBMVmlldyBpcyBjcmVhdGVkLgogKiA0LiBBcHAgdGVtcGxhdGUgY29tcGxldGVzIHByb2Nlc3NpbmcsIHNvIGl0J3MgdGltZSB0byBjaGVjayBjaGlsZCB0ZW1wbGF0ZXMuCiAqIDUuIEZpcnN0IDxjb21wPiB0ZW1wbGF0ZSBpcyBjaGVja2VkLiBJdCBoYXMgYSBkaXJlY3RpdmUsIHNvIGl0cyBkZWYgaXMgcHVzaGVkIHRvIGJsdWVwcmludC4KICogNi4gU2Vjb25kIDxjb21wPiB0ZW1wbGF0ZSBpcyBjaGVja2VkLiBJdHMgYmx1ZXByaW50IGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGZpcnN0CiAqIDxjb21wPiB0ZW1wbGF0ZSwgYnV0IGl0cyBMVmlldyB3YXMgY3JlYXRlZCBiZWZvcmUgdGhpcyB1cGRhdGUsIHNvIGl0IGlzIG91dCBvZiBzeW5jLgogKgogKiBOb3RlIHRoYXQgZW1iZWRkZWQgdmlld3MgaW5zaWRlIG5nRm9yIGxvb3BzIHdpbGwgbmV2ZXIgYmUgb3V0IG9mIHN5bmMgYmVjYXVzZSB0aGVzZSB2aWV3cwogKiBhcmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhleSBhcmUgY3JlYXRlZC4KICoKICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3YCB0aGF0IGNvbnRhaW5zIHRoZSBibHVlcHJpbnQgZm9yIHN5bmNpbmcKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdmlldyB0byBzeW5jCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzeW5jVmlld1dpdGhCbHVlcHJpbnQodFZpZXcsIGxWaWV3KSB7CiAgICBmb3IgKGxldCBpID0gbFZpZXcubGVuZ3RoOyBpIDwgdFZpZXcuYmx1ZXByaW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbFZpZXcucHVzaCh0Vmlldy5ibHVlcHJpbnRbaV0pOwogICAgfQp9Ci8qKgogKiBBZGRzIExWaWV3IG9yIExDb250YWluZXIgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCB2aWV3IHRyZWUuCiAqCiAqIFRoaXMgc3RydWN0dXJlIHdpbGwgYmUgdXNlZCB0byB0cmF2ZXJzZSB0aHJvdWdoIG5lc3RlZCB2aWV3cyB0byByZW1vdmUgbGlzdGVuZXJzCiAqIGFuZCBjYWxsIG9uRGVzdHJveSBjYWxsYmFja3MuCiAqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgd2hlcmUgTFZpZXcgb3IgTENvbnRhaW5lciBzaG91bGQgYmUgYWRkZWQKICogQHBhcmFtIHs/fSBsVmlld09yTENvbnRhaW5lciBUaGUgTFZpZXcgb3IgTENvbnRhaW5lciB0byBhZGQgdG8gdGhlIHZpZXcgdHJlZQogKiBAcmV0dXJuIHs/fSBUaGUgc3RhdGUgcGFzc2VkIGluCiAqLwpmdW5jdGlvbiBhZGRUb1ZpZXdUcmVlKGxWaWV3LCBsVmlld09yTENvbnRhaW5lcikgewogICAgLy8gVE9ETyhiZW5sZXNoL21pc2tvKTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvcnJlY3QsIGJlY2F1c2UgaXQgYWx3YXlzIGFkZHMgdGhlIExDb250YWluZXIKICAgIC8vIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLCB3aGljaCBtZWFucyBpZiB0aGUgZGV2ZWxvcGVyIHJldHJpZXZlcyB0aGUgTENvbnRhaW5lcnMgZnJvbSBSTm9kZXMgb3V0CiAgICAvLyBvZiBvcmRlciwgdGhlIGNoYW5nZSBkZXRlY3Rpb24gd2lsbCBydW4gb3V0IG9mIG9yZGVyLCBhcyB0aGUgYWN0IG9mIHJldHJpZXZpbmcgdGhlIHRoZQogICAgLy8gTENvbnRhaW5lciBmcm9tIHRoZSBSTm9kZSBpcyB3aGF0IGFkZHMgaXQgdG8gdGhlIHF1ZXVlLgogICAgaWYgKGxWaWV3W0NISUxEX0hFQURdKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NISUxEX1RBSUxdKSlbTkVYVF0gPSBsVmlld09yTENvbnRhaW5lcjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGxWaWV3W0NISUxEX0hFQURdID0gbFZpZXdPckxDb250YWluZXI7CiAgICB9CiAgICBsVmlld1tDSElMRF9UQUlMXSA9IGxWaWV3T3JMQ29udGFpbmVyOwogICAgcmV0dXJuIGxWaWV3T3JMQ29udGFpbmVyOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyBDaGFuZ2UgZGV0ZWN0aW9uCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLyoqCiAqIE1hcmtzIGN1cnJlbnQgdmlldyBhbmQgYWxsIGFuY2VzdG9ycyBkaXJ0eS4KICoKICogUmV0dXJucyB0aGUgcm9vdCB2aWV3IGJlY2F1c2UgaXQgaXMgZm91bmQgYXMgYSBieXByb2R1Y3Qgb2YgbWFya2luZyB0aGUgdmlldyB0cmVlCiAqIGRpcnR5LCBhbmQgY2FuIGJlIHVzZWQgYnkgbWV0aG9kcyB0aGF0IGNvbnN1bWUgbWFya1ZpZXdEaXJ0eSgpIHRvIGVhc2lseSBzY2hlZHVsZQogKiBjaGFuZ2UgZGV0ZWN0aW9uLiBPdGhlcndpc2UsIHN1Y2ggbWV0aG9kcyB3b3VsZCBuZWVkIHRvIHRyYXZlcnNlIHVwIHRoZSB2aWV3IHRyZWUKICogYW4gYWRkaXRpb25hbCB0aW1lIHRvIGdldCB0aGUgcm9vdCB2aWV3IGFuZCBzY2hlZHVsZSBhIHRpY2sgb24gaXQuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHN0YXJ0aW5nIExWaWV3IHRvIG1hcmsgZGlydHkKICogQHJldHVybiB7P30gdGhlIHJvb3QgTFZpZXcKICovCmZ1bmN0aW9uIG1hcmtWaWV3RGlydHkobFZpZXcpIHsKICAgIHdoaWxlIChsVmlldykgewogICAgICAgIGxWaWV3W0ZMQUdTXSB8PSA2NCAvKiBEaXJ0eSAqLzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0TFZpZXdQYXJlbnQobFZpZXcpOwogICAgICAgIC8vIFN0b3AgdHJhdmVyc2luZyB1cCBhcyBzb29uIGFzIHlvdSBmaW5kIGEgcm9vdCB2aWV3IHRoYXQgd2Fzbid0IGF0dGFjaGVkIHRvIGFueSBjb250YWluZXIKICAgICAgICBpZiAoaXNSb290VmlldyhsVmlldykgJiYgIXBhcmVudCkgewogICAgICAgICAgICByZXR1cm4gbFZpZXc7CiAgICAgICAgfQogICAgICAgIC8vIGNvbnRpbnVlIG90aGVyd2lzZQogICAgICAgIGxWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudCkpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIFVzZWQgdG8gc2NoZWR1bGUgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgd2hvbGUgYXBwbGljYXRpb24uCiAqCiAqIFVubGlrZSBgdGlja2AsIGBzY2hlZHVsZVRpY2tgIGNvYWxlc2NlcyBtdWx0aXBsZSBjYWxscyBpbnRvIG9uZSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi4KICogSXQgaXMgdXN1YWxseSBjYWxsZWQgaW5kaXJlY3RseSBieSBjYWxsaW5nIGBtYXJrRGlydHlgIHdoZW4gdGhlIHZpZXcgbmVlZHMgdG8gYmUKICogcmUtcmVuZGVyZWQuCiAqCiAqIFR5cGljYWxseSBgc2NoZWR1bGVUaWNrYCB1c2VzIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRvIGNvYWxlc2NlIG11bHRpcGxlCiAqIGBzY2hlZHVsZVRpY2tgIHJlcXVlc3RzLiBUaGUgc2NoZWR1bGluZyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbgogKiBgcmVuZGVyQ29tcG9uZW50YCdzIGBzY2hlZHVsZXJgIG9wdGlvbi4KICogQHBhcmFtIHs/fSByb290Q29udGV4dAogKiBAcGFyYW0gez99IGZsYWdzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzY2hlZHVsZVRpY2socm9vdENvbnRleHQsIGZsYWdzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBub3RoaW5nU2NoZWR1bGVkID0gcm9vdENvbnRleHQuZmxhZ3MgPT09IDAgLyogRW1wdHkgKi87CiAgICByb290Q29udGV4dC5mbGFncyB8PSBmbGFnczsKICAgIGlmIChub3RoaW5nU2NoZWR1bGVkICYmIHJvb3RDb250ZXh0LmNsZWFuID09IF9DTEVBTl9QUk9NSVNFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXM7CiAgICAgICAgcm9vdENvbnRleHQuY2xlYW4gPSBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocikgPT4gcmVzID0gcikpOwogICAgICAgIHJvb3RDb250ZXh0LnNjaGVkdWxlcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChyb290Q29udGV4dC5mbGFncyAmIDEgLyogRGV0ZWN0Q2hhbmdlcyAqLykgewogICAgICAgICAgICAgICAgcm9vdENvbnRleHQuZmxhZ3MgJj0gfjEgLyogRGV0ZWN0Q2hhbmdlcyAqLzsKICAgICAgICAgICAgICAgIHRpY2tSb290Q29udGV4dChyb290Q29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJvb3RDb250ZXh0LmZsYWdzICYgMiAvKiBGbHVzaFBsYXllcnMgKi8pIHsKICAgICAgICAgICAgICAgIHJvb3RDb250ZXh0LmZsYWdzICY9IH4yIC8qIEZsdXNoUGxheWVycyAqLzsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllckhhbmRsZXIgPSByb290Q29udGV4dC5wbGF5ZXJIYW5kbGVyOwogICAgICAgICAgICAgICAgaWYgKHBsYXllckhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJIYW5kbGVyLmZsdXNoUGxheWVycygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvb3RDb250ZXh0LmNsZWFuID0gX0NMRUFOX1BST01JU0U7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChyZXMpKShudWxsKTsKICAgICAgICB9KSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcm9vdENvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRpY2tSb290Q29udGV4dChyb290Q29udGV4dCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb290Q29udGV4dC5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSByb290Q29udGV4dC5jb21wb25lbnRzW2ldOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChyZWFkUGF0Y2hlZExWaWV3KHJvb3RDb21wb25lbnQpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddOwogICAgICAgIHJlbmRlckNvbXBvbmVudE9yVGVtcGxhdGUodFZpZXcsIGxWaWV3LCB0Vmlldy50ZW1wbGF0ZSwgcm9vdENvbXBvbmVudCk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRldGVjdENoYW5nZXNJbnRlcm5hbCh0VmlldywgbFZpZXcsIGNvbnRleHQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyRmFjdG9yeSA9IGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldOwogICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5iZWdpbikKICAgICAgICByZW5kZXJlckZhY3RvcnkuYmVnaW4oKTsKICAgIHRyeSB7CiAgICAgICAgcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0Vmlldy50ZW1wbGF0ZSwgY29udGV4dCk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5lbmQpCiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5lbmQoKTsKICAgIH0KfQovKioKICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSByb290IHZpZXcgYW5kIGl0cyBjb21wb25lbnRzLgogKgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSB2aWV3IHdoaWNoIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgb24uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZXRlY3RDaGFuZ2VzSW5Sb290VmlldyhsVmlldykgewogICAgdGlja1Jvb3RDb250ZXh0KCgvKiogQHR5cGUgez99ICovIChsVmlld1tDT05URVhUXSkpKTsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHZpZXcKICogQHBhcmFtIHs/fSBjb250ZXh0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja05vQ2hhbmdlc0ludGVybmFsKHRWaWV3LCB2aWV3LCBjb250ZXh0KSB7CiAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUodHJ1ZSk7CiAgICB0cnkgewogICAgICAgIGRldGVjdENoYW5nZXNJbnRlcm5hbCh0VmlldywgdmlldywgY29udGV4dCk7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUoZmFsc2UpOwogICAgfQp9Ci8qKgogKiBDaGVja3MgdGhlIGNoYW5nZSBkZXRlY3RvciBvbiBhIHJvb3QgdmlldyBhbmQgaXRzIGNvbXBvbmVudHMsIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlCiAqIGRldGVjdGVkLgogKgogKiBUaGlzIGlzIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSB0byB2ZXJpZnkgdGhhdCBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndAogKiBpbnRyb2R1Y2Ugb3RoZXIgY2hhbmdlcy4KICoKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdmlldyB3aGljaCB0aGUgY2hhbmdlIGRldGVjdGlvbiBzaG91bGQgYmUgY2hlY2tlZCBvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNoZWNrTm9DaGFuZ2VzSW5Sb290VmlldyhsVmlldykgewogICAgc2V0Q2hlY2tOb0NoYW5nZXNNb2RlKHRydWUpOwogICAgdHJ5IHsKICAgICAgICBkZXRlY3RDaGFuZ2VzSW5Sb290VmlldyhsVmlldyk7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUoZmFsc2UpOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gdmlld1F1ZXJ5Rm4KICogQHBhcmFtIHs/fSBjb21wb25lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVWaWV3UXVlcnlGbihmbGFncywgdmlld1F1ZXJ5Rm4sIGNvbXBvbmVudCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodmlld1F1ZXJ5Rm4sICdWaWV3IHF1ZXJpZXMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBtdXN0IGJlIGRlZmluZWQuJyk7CiAgICBzZXRDdXJyZW50UXVlcnlJbmRleCgwKTsKICAgIHZpZXdRdWVyeUZuKGZsYWdzLCBjb21wb25lbnQpOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyBCaW5kaW5ncyAmIGludGVycG9sYXRpb25zCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLyoqCiAqIFN0b3JlcyBtZXRhLWRhdGEgZm9yIGEgcHJvcGVydHkgYmluZGluZyB0byBiZSB1c2VkIGJ5IFRlc3RCZWQncyBgRGVidWdFbGVtZW50LnByb3BlcnRpZXNgLgogKgogKiBJbiBvcmRlciB0byBzdXBwb3J0IFRlc3RCZWQncyBgRGVidWdFbGVtZW50LnByb3BlcnRpZXNgIHdlIG5lZWQgdG8gc2F2ZSwgZm9yIGVhY2ggYmluZGluZzoKICogLSBhIGJvdW5kIHByb3BlcnR5IG5hbWU7CiAqIC0gYSBzdGF0aWMgcGFydHMgb2YgaW50ZXJwb2xhdGVkIHN0cmluZ3M7CiAqCiAqIEEgZ2l2ZW4gcHJvcGVydHkgbWV0YWRhdGEgaXMgc2F2ZWQgYXQgdGhlIGJpbmRpbmcncyBpbmRleCBpbiB0aGUgYFRWaWV3LmRhdGFgIChpbiBvdGhlciB3b3JkcywgYQogKiBwcm9wZXJ0eSBiaW5kaW5nIG1ldGFkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGBUVmlldy5kYXRhYCBhdCB0aGUgc2FtZSBpbmRleCBhcyBhIGJvdW5kIHZhbHVlIGluCiAqIGBMVmlld2ApLiBNZXRhZGF0YSBhcmUgcmVwcmVzZW50ZWQgYXMgYElOVEVSUE9MQVRJT05fREVMSU1JVEVSYC1kZWxpbWl0ZWQgc3RyaW5nIHdpdGggdGhlCiAqIGZvbGxvd2luZyBmb3JtYXQ6CiAqIC0gYHByb3BlcnR5TmFtZWAgZm9yIGJvdW5kIHByb3BlcnRpZXM7CiAqIC0gYHByb3BlcnR5TmFtZe+/vXByZWZpeO+/vWludGVycG9sYXRpb25fc3RhdGljX3BhcnQx77+9Li5pbnRlcnBvbGF0aW9uX3N0YXRpY19wYXJ0Tu+/vXN1ZmZpeGAgZm9yCiAqIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgbWV0YS1kYXRhIHdpbGwgYmUgc2F2ZWQ7CiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB0aGF0IGlzIGEgdGFyZ2V0IG9mIHRoZSBiaW5kaW5nOwogKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZSBib3VuZCBwcm9wZXJ0eSBuYW1lOwogKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleCBiaW5kaW5nIGluZGV4IGluIGBMVmlld2AKICogQHBhcmFtIHsuLi4/fSBpbnRlcnBvbGF0aW9uUGFydHMgc3RhdGljIGludGVycG9sYXRpb24gcGFydHMgKGZvciBwcm9wZXJ0eSBpbnRlcnBvbGF0aW9ucykKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodERhdGEsIHROb2RlLCBwcm9wZXJ0eU5hbWUsIGJpbmRpbmdJbmRleCwgLi4uaW50ZXJwb2xhdGlvblBhcnRzKSB7CiAgICAvLyBCaW5kaW5nIG1ldGEtZGF0YSBhcmUgc3RvcmVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgYSBnaXZlbiBwcm9wZXJ0eSBpbnN0cnVjdGlvbiBpcyBwcm9jZXNzZWQuCiAgICAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgY29uY2VwdCBvZiB0aGUgImZpcnN0IHVwZGF0ZSBwYXNzIiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBwcmVzZW5jZSBvZiB0aGUKICAgIC8vIGJpbmRpbmcgbWV0YS1kYXRhIHRvIGRlY2lkZSBpZiBvbmUgc2hvdWxkIGJlIHN0b3JlZCAob3IgaWYgd2FzIHN0b3JlZCBhbHJlYWR5KS4KICAgIGlmICh0RGF0YVtiaW5kaW5nSW5kZXhdID09PSBudWxsKSB7CiAgICAgICAgaWYgKHROb2RlLmlucHV0cyA9PSBudWxsIHx8ICF0Tm9kZS5pbnB1dHNbcHJvcGVydHlOYW1lXSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3BCaW5kaW5nSWR4cyA9IHROb2RlLnByb3BlcnR5QmluZGluZ3MgfHwgKHROb2RlLnByb3BlcnR5QmluZGluZ3MgPSBbXSk7CiAgICAgICAgICAgIHByb3BCaW5kaW5nSWR4cy5wdXNoKGJpbmRpbmdJbmRleCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGJpbmRpbmdNZXRhZGF0YSA9IHByb3BlcnR5TmFtZTsKICAgICAgICAgICAgaWYgKGludGVycG9sYXRpb25QYXJ0cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBiaW5kaW5nTWV0YWRhdGEgKz0KICAgICAgICAgICAgICAgICAgICBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiArIGludGVycG9sYXRpb25QYXJ0cy5qb2luKElOVEVSUE9MQVRJT05fREVMSU1JVEVSKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXhdID0gYmluZGluZ01ldGFkYXRhOwogICAgICAgIH0KICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IENMRUFOX1BST01JU0UgPSBfQ0xFQU5fUFJPTUlTRTsKLyoqCiAqIEBwYXJhbSB7P30gdmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TENsZWFudXAodmlldykgewogICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKQogICAgcmV0dXJuIHZpZXdbQ0xFQU5VUF0gfHwgKHZpZXdbQ0xFQU5VUF0gPSBuZ0Rldk1vZGUgPyBuZXcgTENsZWFudXAoKSA6IFtdKTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VFZpZXdDbGVhbnVwKHRWaWV3KSB7CiAgICByZXR1cm4gdFZpZXcuY2xlYW51cCB8fCAodFZpZXcuY2xlYW51cCA9IG5nRGV2TW9kZSA/IG5ldyBUQ2xlYW51cCgpIDogW10pOwp9Ci8qKgogKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHN1YiBjb21wb25lbnQncyByZW5kZXJlciBuZWVkcyB0byBiZSBpbmNsdWRlZAogKiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVyIChzZWUgdGhlIGNvbXBvbmVudFN5bnRoZXRpY0hvc3QqIGluc3RydWN0aW9ucykuCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbG9hZENvbXBvbmVudFJlbmRlcmVyKHROb2RlLCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwTFZpZXcobFZpZXdbdE5vZGUuaW5kZXhdKSkpOwogICAgcmV0dXJuIGNvbXBvbmVudExWaWV3W1JFTkRFUkVSXTsKfQovKioKICogSGFuZGxlcyBhbiBlcnJvciB0aHJvd24gaW4gYW4gTFZpZXcuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBlcnJvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFuZGxlRXJyb3IobFZpZXcsIGVycm9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmplY3RvciA9IGxWaWV3W0lOSkVDVE9SJDFdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJyb3JIYW5kbGVyID0gaW5qZWN0b3IgPyBpbmplY3Rvci5nZXQoRXJyb3JIYW5kbGVyLCBudWxsKSA6IG51bGw7CiAgICBlcnJvckhhbmRsZXIgJiYgZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKTsKfQovKioKICogU2V0IHRoZSBpbnB1dHMgb2YgZGlyZWN0aXZlcyBhdCB0aGUgY3VycmVudCBub2RlIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGN1cnJlbnQgVFZpZXcKICogQHBhcmFtIHs/fSBsVmlldyB0aGUgYExWaWV3YCB3aGljaCBjb250YWlucyB0aGUgZGlyZWN0aXZlcy4KICogQHBhcmFtIHs/fSBpbnB1dHMgbWFwcGluZyBiZXR3ZWVuIHRoZSBwdWJsaWMgImlucHV0IiBuYW1lIGFuZCBwcml2YXRlbHkta25vd24sCiAqICAgICAgICBwb3NzaWJseSBtaW5pZmllZCwgcHJvcGVydHkgbmFtZXMgdG8gd3JpdGUgdG8uCiAqIEBwYXJhbSB7P30gcHVibGljTmFtZQogKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIHRvIHNldC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldElucHV0c0ZvclByb3BlcnR5KHRWaWV3LCBsVmlldywgaW5wdXRzLCBwdWJsaWNOYW1lLCB2YWx1ZSkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleCA9ICgvKiogQHR5cGUgez99ICovIChpbnB1dHNbaSsrXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcml2YXRlTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChpbnB1dHNbaSsrXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGxWaWV3W2luZGV4XTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaW5kZXhdKSk7CiAgICAgICAgaWYgKGRlZi5zZXRJbnB1dCAhPT0gbnVsbCkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLnNldElucHV0KSkoaW5zdGFuY2UsIHZhbHVlLCBwdWJsaWNOYW1lLCBwcml2YXRlTmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnN0YW5jZVtwcml2YXRlTmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFVwZGF0ZXMgYSB0ZXh0IGJpbmRpbmcgYXQgYSBnaXZlbiBpbmRleCBpbiBhIGdpdmVuIExWaWV3LgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgaW5kZXgsIHZhbHVlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgKC8qKiBAdHlwZSB7P30gKi8gKE5PX0NIQU5HRSkpLCAndmFsdWUgc2hvdWxkIG5vdCBiZSBOT19DSEFOR0UnKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgaW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5SW5kZXgoaW5kZXgsIGxWaWV3KSkpKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChlbGVtZW50LCAnbmF0aXZlIGVsZW1lbnQgc2hvdWxkIGV4aXN0Jyk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyU2V0VGV4dCsrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5zZXRWYWx1ZShlbGVtZW50LCB2YWx1ZSkgOiBlbGVtZW50LnRleHRDb250ZW50ID0gdmFsdWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBlbWJlZGRlZFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExDb250YWluZXIodE5vZGUsIGVtYmVkZGVkVmlldykgewogICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGVtYmVkZGVkVmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZW1iZWRkZWRWaWV3W1BBUkVOVF0pKTsKICAgIGlmICh0Tm9kZS5pbmRleCA9PT0gLTEpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgZHluYW1pY2FsbHkgY3JlYXRlZCB2aWV3IGluc2lkZSBhIGR5bmFtaWMgY29udGFpbmVyLgogICAgICAgIC8vIFRoZSBwYXJlbnQgaXNuJ3QgYW4gTENvbnRhaW5lciBpZiB0aGUgZW1iZWRkZWQgdmlldyBoYXNuJ3QgYmVlbiBhdHRhY2hlZCB5ZXQuCiAgICAgICAgcmV0dXJuIGlzTENvbnRhaW5lcihjb250YWluZXIpID8gY29udGFpbmVyIDogbnVsbDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGNvbnRhaW5lcik7CiAgICAgICAgLy8gVGhpcyBpcyBhIGlubGluZSB2aWV3IG5vZGUgKGUuZy4gZW1iZWRkZWRWaWV3U3RhcnQpCiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKICAgIH0KfQovKioKICogUmV0cmlldmVzIHJlbmRlciBwYXJlbnQgZm9yIGEgZ2l2ZW4gdmlldy4KICogTWlnaHQgYmUgbnVsbCBpZiBhIHZpZXcgaXMgbm90IHlldCBhdHRhY2hlZCB0byBhbnkgY29udGFpbmVyLgogKiBAcGFyYW0gez99IHRWaWV3Tm9kZQogKiBAcGFyYW0gez99IHZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbnRhaW5lclJlbmRlclBhcmVudCh0Vmlld05vZGUsIHZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldExDb250YWluZXIodFZpZXdOb2RlLCB2aWV3KTsKICAgIHJldHVybiBjb250YWluZXIgPyBuYXRpdmVQYXJlbnROb2RlKHZpZXdbUkVOREVSRVJdLCBjb250YWluZXJbTkFUSVZFXSkgOiBudWxsOwp9Ci8qKgogKiBOT1RFOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIHBvc3NpYmxlIGFjdGlvbnMgYXJlIGlubGluZWQgd2l0aGluIHRoZSBmdW5jdGlvbiBpbnN0ZWFkIG9mCiAqIGJlaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4KICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcGFyYW0gez99IGxOb2RlVG9IYW5kbGUKICogQHBhcmFtIHs/PX0gYmVmb3JlTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCBwYXJlbnQsIGxOb2RlVG9IYW5kbGUsIGJlZm9yZU5vZGUpIHsKICAgIC8vIElmIHRoaXMgc2xvdCB3YXMgYWxsb2NhdGVkIGZvciBhIHRleHQgbm9kZSBkeW5hbWljYWxseSBjcmVhdGVkIGJ5IGkxOG4sIHRoZSB0ZXh0IG5vZGUgaXRzZWxmCiAgICAvLyB3b24ndCBiZSBjcmVhdGVkIHVudGlsIGkxOG5BcHBseSgpIGluIHRoZSB1cGRhdGUgYmxvY2ssIHNvIHRoaXMgbm9kZSBzaG91bGQgYmUgc2tpcHBlZC4KICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSAiSUNVIGV4cHJlc3Npb25zIHNob3VsZCB3b3JrIGluc2lkZSBhbiBuZ1RlbXBsYXRlT3V0bGV0IGluc2lkZSBhbiBuZ0ZvciIKICAgIC8vIGluIGBpMThuX3NwZWMudHNgLgogICAgaWYgKGxOb2RlVG9IYW5kbGUgIT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbENvbnRhaW5lcjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlzQ29tcG9uZW50ID0gZmFsc2U7CiAgICAgICAgLy8gV2UgYXJlIGV4cGVjdGluZyBhbiBSTm9kZSwgYnV0IGluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50IG9yIExDb250YWluZXIgdGhlIGBSTm9kZWAgaXMKICAgICAgICAvLyB3cmFwcGVkIGluIGFuIGFycmF5IHdoaWNoIG5lZWRzIHRvIGJlIHVud3JhcHBlZC4gV2UgbmVlZCB0byBrbm93IGlmIGl0IGlzIGEgY29tcG9uZW50IGFuZCBpZgogICAgICAgIC8vIGl0IGhhcyBMQ29udGFpbmVyIHNvIHRoYXQgd2UgY2FuIHByb2Nlc3MgYWxsIG9mIHRob3NlIGNhc2VzIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgaWYgKGlzTENvbnRhaW5lcihsTm9kZVRvSGFuZGxlKSkgewogICAgICAgICAgICBsQ29udGFpbmVyID0gbE5vZGVUb0hhbmRsZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNMVmlldyhsTm9kZVRvSGFuZGxlKSkgewogICAgICAgICAgICBpc0NvbXBvbmVudCA9IHRydWU7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxOb2RlVG9IYW5kbGVbSE9TVF0sICdIT1NUIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBjb21wb25lbnQgTFZpZXcnKTsKICAgICAgICAgICAgbE5vZGVUb0hhbmRsZSA9ICgvKiogQHR5cGUgez99ICovIChsTm9kZVRvSGFuZGxlW0hPU1RdKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByTm9kZSA9IHVud3JhcFJOb2RlKGxOb2RlVG9IYW5kbGUpOwogICAgICAgIG5nRGV2TW9kZSAmJiAhaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpICYmIGFzc2VydERvbU5vZGUock5vZGUpOwogICAgICAgIGlmIChhY3Rpb24gPT09IDAgLyogQ3JlYXRlICovICYmIHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoYmVmb3JlTm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVBcHBlbmRDaGlsZChyZW5kZXJlciwgcGFyZW50LCByTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuYXRpdmVJbnNlcnRCZWZvcmUocmVuZGVyZXIsIHBhcmVudCwgck5vZGUsIGJlZm9yZU5vZGUgfHwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAxIC8qIEluc2VydCAqLyAmJiBwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIHJOb2RlLCBiZWZvcmVOb2RlIHx8IG51bGwpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09IDIgLyogRGV0YWNoICovKSB7CiAgICAgICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBpc0NvbXBvbmVudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gMyAvKiBEZXN0cm95ICovKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJEZXN0cm95Tm9kZSsrOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5kZXN0cm95Tm9kZSkpKHJOb2RlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxDb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICBhcHBseUNvbnRhaW5lcihyZW5kZXJlciwgYWN0aW9uLCBsQ29udGFpbmVyLCBwYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh2YWx1ZSwgcmVuZGVyZXIpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVUZXh0Tm9kZSsrOwogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKzsKICAgIHJldHVybiBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5jcmVhdGVUZXh0KHZhbHVlKSA6CiAgICAgICAgcmVuZGVyZXIuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbnNlcnRNb2RlCiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWRkUmVtb3ZlVmlld0Zyb21Db250YWluZXIodFZpZXcsIGxWaWV3LCBpbnNlcnRNb2RlLCBiZWZvcmVOb2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJQYXJlbnQgPSBnZXRDb250YWluZXJSZW5kZXJQYXJlbnQoKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3Lm5vZGUpKSwgbFZpZXcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5ub2RlKSksIDIgLyogVmlldyAqLyk7CiAgICBpZiAocmVuZGVyUGFyZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhY3Rpb24gPSBpbnNlcnRNb2RlID8gMSAvKiBJbnNlcnQgKi8gOiAyIC8qIERldGFjaCAqLzsKICAgICAgICBhcHBseVZpZXcodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgYWN0aW9uLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgfQp9Ci8qKgogKiBEZXRhY2ggYSBgTFZpZXdgIGZyb20gdGhlIERPTSBieSBkZXRhY2hpbmcgaXRzIG5vZGVzLgogKgogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBgVFZpZXcnIG9mIHRoZSBgTFZpZXdgIHRvIGJlIGRldGFjaGVkCiAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGBMVmlld2AgdG8gYmUgZGV0YWNoZWQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW5kZXJEZXRhY2hWaWV3KHRWaWV3LCBsVmlldykgewogICAgYXBwbHlWaWV3KHRWaWV3LCBsVmlldywgbFZpZXdbUkVOREVSRVJdLCAyIC8qIERldGFjaCAqLywgbnVsbCwgbnVsbCk7Cn0KLyoqCiAqIFRyYXZlcnNlcyBkb3duIGFuZCB1cCB0aGUgdHJlZSBvZiB2aWV3cyBhbmQgY29udGFpbmVycyB0byByZW1vdmUgbGlzdGVuZXJzIGFuZAogKiBjYWxsIG9uRGVzdHJveSBjYWxsYmFja3MuCiAqCiAqIE5vdGVzOgogKiAgLSBCZWNhdXNlIGl0J3MgdXNlZCBmb3Igb25EZXN0cm95IGNhbGxzLCBpdCBuZWVkcyB0byBiZSBib3R0b20tdXAuCiAqICAtIE11c3QgcHJvY2VzcyBjb250YWluZXJzIGluc3RlYWQgb2YgdGhlaXIgdmlld3MgdG8gYXZvaWQgc3BsaWNpbmcKICogIHdoZW4gdmlld3MgYXJlIGRlc3Ryb3llZCBhbmQgcmUtYWRkZWQuCiAqICAtIFVzaW5nIGEgd2hpbGUgbG9vcCBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gcmVjdXJzaW9uCiAqICAtIERlc3Ryb3kgb25seSBjYWxsZWQgb24gbW92ZW1lbnQgdG8gc2libGluZyBvciBtb3ZlbWVudCB0byBwYXJlbnQgKGxhdGVyYWxseSBvciB1cCkKICoKICogQHBhcmFtIHs/fSByb290VmlldyBUaGUgdmlldyB0byBkZXN0cm95CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZXN0cm95Vmlld1RyZWUocm9vdFZpZXcpIHsKICAgIC8vIElmIHRoZSB2aWV3IGhhcyBubyBjaGlsZHJlbiwgd2UgY2FuIGNsZWFuIGl0IHVwIGFuZCByZXR1cm4gZWFybHkuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbFZpZXdPckxDb250YWluZXIgPSByb290Vmlld1tDSElMRF9IRUFEXTsKICAgIGlmICghbFZpZXdPckxDb250YWluZXIpIHsKICAgICAgICByZXR1cm4gY2xlYW5VcFZpZXcocm9vdFZpZXdbVFZJRVddLCByb290Vmlldyk7CiAgICB9CiAgICB3aGlsZSAobFZpZXdPckxDb250YWluZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5leHQgPSBudWxsOwogICAgICAgIGlmIChpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSkgewogICAgICAgICAgICAvLyBJZiBMVmlldywgdHJhdmVyc2UgZG93biB0byBjaGlsZC4KICAgICAgICAgICAgbmV4dCA9IGxWaWV3T3JMQ29udGFpbmVyW0NISUxEX0hFQURdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIobFZpZXdPckxDb250YWluZXIpOwogICAgICAgICAgICAvLyBJZiBjb250YWluZXIsIHRyYXZlcnNlIGRvd24gdG8gaXRzIGZpcnN0IExWaWV3LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmlldyA9IGxWaWV3T3JMQ29udGFpbmVyW0NPTlRBSU5FUl9IRUFERVJfT0ZGU0VUXTsKICAgICAgICAgICAgaWYgKGZpcnN0VmlldykKICAgICAgICAgICAgICAgIG5leHQgPSBmaXJzdFZpZXc7CiAgICAgICAgfQogICAgICAgIGlmICghbmV4dCkgewogICAgICAgICAgICAvLyBPbmx5IGNsZWFuIHVwIHZpZXcgd2hlbiBtb3ZpbmcgdG8gdGhlIHNpZGUgb3IgdXAsIGFzIGRlc3Ryb3kgaG9va3MKICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlciBmcm9tIHRoZSBib3R0b20gdXAuCiAgICAgICAgICAgIHdoaWxlIChsVmlld09yTENvbnRhaW5lciAmJiAhKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3T3JMQ29udGFpbmVyKSlbTkVYVF0gJiYgbFZpZXdPckxDb250YWluZXIgIT09IHJvb3RWaWV3KSB7CiAgICAgICAgICAgICAgICBpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSAmJiBjbGVhblVwVmlldyhsVmlld09yTENvbnRhaW5lcltUVklFV10sIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGxWaWV3T3JMQ29udGFpbmVyID0gZ2V0UGFyZW50U3RhdGUobFZpZXdPckxDb250YWluZXIsIHJvb3RWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobFZpZXdPckxDb250YWluZXIgPT09IG51bGwpCiAgICAgICAgICAgICAgICBsVmlld09yTENvbnRhaW5lciA9IHJvb3RWaWV3OwogICAgICAgICAgICBpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSAmJiBjbGVhblVwVmlldyhsVmlld09yTENvbnRhaW5lcltUVklFV10sIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgbmV4dCA9IGxWaWV3T3JMQ29udGFpbmVyICYmICgvKiogQHR5cGUgez99ICovIChsVmlld09yTENvbnRhaW5lcikpW05FWFRdOwogICAgICAgIH0KICAgICAgICBsVmlld09yTENvbnRhaW5lciA9IG5leHQ7CiAgICB9Cn0KLyoqCiAqIEluc2VydHMgYSB2aWV3IGludG8gYSBjb250YWluZXIuCiAqCiAqIFRoaXMgYWRkcyB0aGUgdmlldyB0byB0aGUgY29udGFpbmVyJ3MgYXJyYXkgb2YgYWN0aXZlIHZpZXdzIGluIHRoZSBjb3JyZWN0CiAqIHBvc2l0aW9uLiBJdCBhbHNvIGFkZHMgdGhlIHZpZXcncyBlbGVtZW50cyB0byB0aGUgRE9NIGlmIHRoZSBjb250YWluZXIgaXNuJ3QgYQogKiByb290IG5vZGUgb2YgYW5vdGhlciB2aWV3IChpbiB0aGF0IGNhc2UsIHRoZSB2aWV3J3MgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB3aGVuCiAqIHRoZSBjb250YWluZXIncyBwYXJlbnQgdmlldyBpcyBhZGRlZCBsYXRlcikuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgb2YgdGhlIGBMVmlld2AgdG8gaW5zZXJ0CiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdG8gaW5zZXJ0CiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciBUaGUgY29udGFpbmVyIGludG8gd2hpY2ggdGhlIHZpZXcgc2hvdWxkIGJlIGluc2VydGVkCiAqIEBwYXJhbSB7P30gaW5kZXggV2hpY2ggaW5kZXggaW4gdGhlIGNvbnRhaW5lciB0byBpbnNlcnQgdGhlIGNoaWxkIHZpZXcgaW50bwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zZXJ0Vmlldyh0VmlldywgbFZpZXcsIGxDb250YWluZXIsIGluZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIobENvbnRhaW5lcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleEluQ29udGFpbmVyID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQgKyBpbmRleDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5lckxlbmd0aCA9IGxDb250YWluZXIubGVuZ3RoOwogICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgdmlldywgd2UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIGNoaWxkcmVuLgogICAgICAgIGxDb250YWluZXJbaW5kZXhJbkNvbnRhaW5lciAtIDFdW05FWFRdID0gbFZpZXc7CiAgICB9CiAgICBpZiAoaW5kZXggPCBjb250YWluZXJMZW5ndGggLSBDT05UQUlORVJfSEVBREVSX09GRlNFVCkgewogICAgICAgIGxWaWV3W05FWFRdID0gbENvbnRhaW5lcltpbmRleEluQ29udGFpbmVyXTsKICAgICAgICBhZGRUb0FycmF5KGxDb250YWluZXIsIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUICsgaW5kZXgsIGxWaWV3KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGxDb250YWluZXIucHVzaChsVmlldyk7CiAgICAgICAgbFZpZXdbTkVYVF0gPSBudWxsOwogICAgfQogICAgbFZpZXdbUEFSRU5UXSA9IGxDb250YWluZXI7CiAgICAvLyB0cmFjayB2aWV3cyB3aGVyZSBkZWNsYXJhdGlvbiBhbmQgaW5zZXJ0aW9uIHBvaW50cyBhcmUgZGlmZmVyZW50CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSBsVmlld1tERUNMQVJBVElPTl9MQ09OVEFJTkVSXTsKICAgIGlmIChkZWNsYXJhdGlvbkxDb250YWluZXIgIT09IG51bGwgJiYgbENvbnRhaW5lciAhPT0gZGVjbGFyYXRpb25MQ29udGFpbmVyKSB7CiAgICAgICAgdHJhY2tNb3ZlZFZpZXcoZGVjbGFyYXRpb25MQ29udGFpbmVyLCBsVmlldyk7CiAgICB9CiAgICAvLyBub3RpZnkgcXVlcnkgdGhhdCBhIG5ldyB2aWV3IGhhcyBiZWVuIGFkZGVkCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsUXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdOwogICAgaWYgKGxRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgbFF1ZXJpZXMuaW5zZXJ0Vmlldyh0Vmlldyk7CiAgICB9CiAgICAvLyBTZXRzIHRoZSBhdHRhY2hlZCBmbGFnCiAgICBsVmlld1tGTEFHU10gfD0gMTI4IC8qIEF0dGFjaGVkICovOwp9Ci8qKgogKiBUcmFjayB2aWV3cyBjcmVhdGVkIGZyb20gdGhlIGRlY2xhcmF0aW9uIGNvbnRhaW5lciAoVGVtcGxhdGVSZWYpIGFuZCBpbnNlcnRlZCBpbnRvIGEKICogZGlmZmVyZW50IExDb250YWluZXIuCiAqIEBwYXJhbSB7P30gZGVjbGFyYXRpb25Db250YWluZXIKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdHJhY2tNb3ZlZFZpZXcoZGVjbGFyYXRpb25Db250YWluZXIsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChsVmlldywgJ0xWaWV3IHJlcXVpcmVkJyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkNvbnRhaW5lcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb3ZlZFZpZXdzID0gZGVjbGFyYXRpb25Db250YWluZXJbTU9WRURfVklFV1NdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5zZXJ0ZWRMQ29udGFpbmVyID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1BBUkVOVF0pKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGluc2VydGVkTENvbnRhaW5lcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnNlcnRlZENvbXBvbmVudExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKGluc2VydGVkTENvbnRhaW5lcltQQVJFTlRdKSlbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoaW5zZXJ0ZWRDb21wb25lbnRMVmlldywgJ01pc3NpbmcgaW5zZXJ0ZWRDb21wb25lbnRMVmlldycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5zZXJ0ZWRDb21wb25lbnRJc09uUHVzaCA9IChpbnNlcnRlZENvbXBvbmVudExWaWV3W0ZMQUdTXSAmIDE2IC8qIENoZWNrQWx3YXlzICovKSAhPT0gMTYgLyogQ2hlY2tBbHdheXMgKi87CiAgICBpZiAoaW5zZXJ0ZWRDb21wb25lbnRJc09uUHVzaCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJlZENvbXBvbmVudExWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGRlY2xhcmVkQ29tcG9uZW50TFZpZXcsICdNaXNzaW5nIGRlY2xhcmVkQ29tcG9uZW50TFZpZXcnKTsKICAgICAgICBpZiAoZGVjbGFyZWRDb21wb25lbnRMVmlldyAhPT0gaW5zZXJ0ZWRDb21wb25lbnRMVmlldykgewogICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBkZWNsYXJhdGlvbi1jb21wb25lbnQgaXMgbm90IHNhbWUgYXMgaW5zZXJ0aW9uLWNvbXBvbmVudCBhbmQgd2UgYXJlIGluCiAgICAgICAgICAgIC8vIG9uLXB1c2ggbW9kZSwgdGhpcyBtZWFucyB0aGF0IHRoaXMgaXMgYSB0cmFuc3BsYW50ZWQgdmlldy4gTWFyayB0aGUgZGVjbGFyZWQgbFZpZXcgYXMKICAgICAgICAgICAgLy8gaGF2aW5nCiAgICAgICAgICAgIC8vIHRyYW5zcGxhbnRlZCB2aWV3cyBzbyB0aGF0IHRob3NlIHZpZXdzIGNhbiBwYXJ0aWNpcGF0ZSBpbiBDRC4KICAgICAgICAgICAgZGVjbGFyYXRpb25Db250YWluZXJbQUNUSVZFX0lOREVYXSB8PSAxIC8qIEhBU19UUkFOU1BMQU5URURfVklFV1MgKi87CiAgICAgICAgfQogICAgfQogICAgaWYgKG1vdmVkVmlld3MgPT09IG51bGwpIHsKICAgICAgICBkZWNsYXJhdGlvbkNvbnRhaW5lcltNT1ZFRF9WSUVXU10gPSBbbFZpZXddOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbW92ZWRWaWV3cy5wdXNoKGxWaWV3KTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbkNvbnRhaW5lcgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZXRhY2hNb3ZlZFZpZXcoZGVjbGFyYXRpb25Db250YWluZXIsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkNvbnRhaW5lcik7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnREZWZpbmVkKGRlY2xhcmF0aW9uQ29udGFpbmVyW01PVkVEX1ZJRVdTXSwgJ0EgcHJvamVjdGVkIHZpZXcgc2hvdWxkIGJlbG9uZyB0byBhIG5vbi1lbXB0eSBwcm9qZWN0ZWQgdmlld3MgY29sbGVjdGlvbicpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbW92ZWRWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbkNvbnRhaW5lcltNT1ZFRF9WSUVXU10pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlY2xhcmVkVmlld0luZGV4ID0gbW92ZWRWaWV3cy5pbmRleE9mKGxWaWV3KTsKICAgIG1vdmVkVmlld3Muc3BsaWNlKGRlY2xhcmVkVmlld0luZGV4LCAxKTsKfQovKioKICogRGV0YWNoZXMgYSB2aWV3IGZyb20gYSBjb250YWluZXIuCiAqCiAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIHZpZXcgZnJvbSB0aGUgY29udGFpbmVyJ3MgYXJyYXkgb2YgYWN0aXZlIHZpZXdzLiBJdCBhbHNvCiAqIHJlbW92ZXMgdGhlIHZpZXcncyBlbGVtZW50cyBmcm9tIHRoZSBET00uCiAqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciBUaGUgY29udGFpbmVyIGZyb20gd2hpY2ggdG8gZGV0YWNoIGEgdmlldwogKiBAcGFyYW0gez99IHJlbW92ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmlldyB0byBkZXRhY2gKICogQHJldHVybiB7P30gRGV0YWNoZWQgTFZpZXcgaW5zdGFuY2UuCiAqLwpmdW5jdGlvbiBkZXRhY2hWaWV3KGxDb250YWluZXIsIHJlbW92ZUluZGV4KSB7CiAgICBpZiAobENvbnRhaW5lci5sZW5ndGggPD0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQpCiAgICAgICAgcmV0dXJuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXhJbkNvbnRhaW5lciA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUICsgcmVtb3ZlSW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aWV3VG9EZXRhY2ggPSBsQ29udGFpbmVyW2luZGV4SW5Db250YWluZXJdOwogICAgaWYgKHZpZXdUb0RldGFjaCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSB2aWV3VG9EZXRhY2hbREVDTEFSQVRJT05fTENPTlRBSU5FUl07CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uTENvbnRhaW5lciAhPT0gbnVsbCAmJiBkZWNsYXJhdGlvbkxDb250YWluZXIgIT09IGxDb250YWluZXIpIHsKICAgICAgICAgICAgZGV0YWNoTW92ZWRWaWV3KGRlY2xhcmF0aW9uTENvbnRhaW5lciwgdmlld1RvRGV0YWNoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlbW92ZUluZGV4ID4gMCkgewogICAgICAgICAgICBsQ29udGFpbmVyW2luZGV4SW5Db250YWluZXIgLSAxXVtORVhUXSA9ICgvKiogQHR5cGUgez99ICovICh2aWV3VG9EZXRhY2hbTkVYVF0pKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbW92ZWRMVmlldyA9IHJlbW92ZUZyb21BcnJheShsQ29udGFpbmVyLCBDT05UQUlORVJfSEVBREVSX09GRlNFVCArIHJlbW92ZUluZGV4KTsKICAgICAgICBhZGRSZW1vdmVWaWV3RnJvbUNvbnRhaW5lcih2aWV3VG9EZXRhY2hbVFZJRVddLCB2aWV3VG9EZXRhY2gsIGZhbHNlLCBudWxsKTsKICAgICAgICAvLyBub3RpZnkgcXVlcnkgdGhhdCBhIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsUXVlcmllcyA9IHJlbW92ZWRMVmlld1tRVUVSSUVTXTsKICAgICAgICBpZiAobFF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgbFF1ZXJpZXMuZGV0YWNoVmlldyhyZW1vdmVkTFZpZXdbVFZJRVddKTsKICAgICAgICB9CiAgICAgICAgdmlld1RvRGV0YWNoW1BBUkVOVF0gPSBudWxsOwogICAgICAgIHZpZXdUb0RldGFjaFtORVhUXSA9IG51bGw7CiAgICAgICAgLy8gVW5zZXRzIHRoZSBhdHRhY2hlZCBmbGFnCiAgICAgICAgdmlld1RvRGV0YWNoW0ZMQUdTXSAmPSB+MTI4IC8qIEF0dGFjaGVkICovOwogICAgfQogICAgcmV0dXJuIHZpZXdUb0RldGFjaDsKfQovKioKICogUmVtb3ZlcyBhIHZpZXcgZnJvbSBhIGNvbnRhaW5lciwgaS5lLiBkZXRhY2hlcyBpdCBhbmQgdGhlbiBkZXN0cm95cyB0aGUgdW5kZXJseWluZyBMVmlldy4KICoKICogQHBhcmFtIHs/fSBsQ29udGFpbmVyIFRoZSBjb250YWluZXIgZnJvbSB3aGljaCB0byByZW1vdmUgYSB2aWV3CiAqIEBwYXJhbSB7P30gcmVtb3ZlSW5kZXggVGhlIGluZGV4IG9mIHRoZSB2aWV3IHRvIHJlbW92ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlVmlldyhsQ29udGFpbmVyLCByZW1vdmVJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGV0YWNoZWRWaWV3ID0gZGV0YWNoVmlldyhsQ29udGFpbmVyLCByZW1vdmVJbmRleCk7CiAgICBkZXRhY2hlZFZpZXcgJiYgZGVzdHJveUxWaWV3KGRldGFjaGVkVmlld1tUVklFV10sIGRldGFjaGVkVmlldyk7Cn0KLyoqCiAqIEEgc3RhbmRhbG9uZSBmdW5jdGlvbiB3aGljaCBkZXN0cm95cyBhbiBMVmlldywKICogY29uZHVjdGluZyBjbGVhbiB1cCAoZS5nLiByZW1vdmluZyBsaXN0ZW5lcnMsIGNhbGxpbmcgb25EZXN0cm95cykuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgb2YgdGhlIGBMVmlld2AgdG8gYmUgZGVzdHJveWVkCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdG8gYmUgZGVzdHJveWVkLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGVzdHJveUxWaWV3KHRWaWV3LCBsVmlldykgewogICAgaWYgKCEobFZpZXdbRkxBR1NdICYgMjU2IC8qIERlc3Ryb3llZCAqLykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSAmJiByZW5kZXJlci5kZXN0cm95Tm9kZSkgewogICAgICAgICAgICBhcHBseVZpZXcodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgMyAvKiBEZXN0cm95ICovLCBudWxsLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgZGVzdHJveVZpZXdUcmVlKGxWaWV3KTsKICAgIH0KfQovKioKICogRGV0ZXJtaW5lcyB3aGljaCBMVmlld09yTENvbnRhaW5lciB0byBqdW1wIHRvIHdoZW4gdHJhdmVyc2luZyBiYWNrIHVwIHRoZQogKiB0cmVlIGluIGRlc3Ryb3lWaWV3VHJlZS4KICoKICogTm9ybWFsbHksIHRoZSB2aWV3J3MgcGFyZW50IExWaWV3IHNob3VsZCBiZSBjaGVja2VkLCBidXQgaW4gdGhlIGNhc2Ugb2YKICogZW1iZWRkZWQgdmlld3MsIHRoZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSB2aWV3IG5vZGUncyBwYXJlbnQsIGJ1dCBub3QgdGhlCiAqIExWaWV3J3MgcGFyZW50KSBuZWVkcyB0byBiZSBjaGVja2VkIGZvciBhIHBvc3NpYmxlIG5leHQgcHJvcGVydHkuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXdPckxDb250YWluZXIgVGhlIExWaWV3T3JMQ29udGFpbmVyIGZvciB3aGljaCB3ZSBuZWVkIGEgcGFyZW50IHN0YXRlCiAqIEBwYXJhbSB7P30gcm9vdFZpZXcgVGhlIHJvb3RWaWV3LCBzbyB3ZSBkb24ndCBwcm9wYWdhdGUgdG9vIGZhciB1cCB0aGUgdmlldyB0cmVlCiAqIEByZXR1cm4gez99IFRoZSBjb3JyZWN0IHBhcmVudCBMVmlld09yTENvbnRhaW5lcgogKi8KZnVuY3Rpb24gZ2V0UGFyZW50U3RhdGUobFZpZXdPckxDb250YWluZXIsIHJvb3RWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdE5vZGU7CiAgICBpZiAoaXNMVmlldyhsVmlld09yTENvbnRhaW5lcikgJiYgKHROb2RlID0gbFZpZXdPckxDb250YWluZXJbVF9IT1NUXSkgJiYKICAgICAgICB0Tm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHsKICAgICAgICAvLyBpZiBpdCdzIGFuIGVtYmVkZGVkIHZpZXcsIHRoZSBzdGF0ZSBuZWVkcyB0byBnbyB1cCB0byB0aGUgY29udGFpbmVyLCBpbiBjYXNlIHRoZQogICAgICAgIC8vIGNvbnRhaW5lciBoYXMgYSBuZXh0CiAgICAgICAgcmV0dXJuIGdldExDb250YWluZXIoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHBhcmVudCB2aWV3IGZvciBjb250YWluZXJzIG9yIGNvbXBvbmVudCB2aWV3cwogICAgICAgIHJldHVybiBsVmlld09yTENvbnRhaW5lcltQQVJFTlRdID09PSByb290VmlldyA/IG51bGwgOiBsVmlld09yTENvbnRhaW5lcltQQVJFTlRdOwogICAgfQp9Ci8qKgogKiBDYWxscyBvbkRlc3Ryb3lzIGhvb2tzIGZvciBhbGwgZGlyZWN0aXZlcyBhbmQgcGlwZXMgaW4gYSBnaXZlbiB2aWV3IGFuZCB0aGVuIHJlbW92ZXMgYWxsCiAqIGxpc3RlbmVycy4gTGlzdGVuZXJzIGFyZSByZW1vdmVkIGFzIHRoZSBsYXN0IHN0ZXAgc28gZXZlbnRzIGRlbGl2ZXJlZCBpbiB0aGUgb25EZXN0cm95cyBob29rcwogKiBjYW4gYmUgcHJvcGFnYXRlZCB0byBcQE91dHB1dCBsaXN0ZW5lcnMuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgYFRWaWV3YCBmb3IgdGhlIGBMVmlld2AgdG8gY2xlYW4gdXAuCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIExWaWV3IHRvIGNsZWFuIHVwCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjbGVhblVwVmlldyh0VmlldywgbFZpZXcpIHsKICAgIGlmICghKGxWaWV3W0ZMQUdTXSAmIDI1NiAvKiBEZXN0cm95ZWQgKi8pKSB7CiAgICAgICAgLy8gVXN1YWxseSB0aGUgQXR0YWNoZWQgZmxhZyBpcyByZW1vdmVkIHdoZW4gdGhlIHZpZXcgaXMgZGV0YWNoZWQgZnJvbSBpdHMgcGFyZW50LCBob3dldmVyCiAgICAgICAgLy8gaWYgaXQncyBhIHJvb3QgdmlldywgdGhlIGZsYWcgd29uJ3QgYmUgdW5zZXQgaGVuY2Ugd2h5IHdlJ3JlIGFsc28gcmVtb3Zpbmcgb24gZGVzdHJveS4KICAgICAgICBsVmlld1tGTEFHU10gJj0gfjEyOCAvKiBBdHRhY2hlZCAqLzsKICAgICAgICAvLyBNYXJrIHRoZSBMVmlldyBhcyBkZXN0cm95ZWQgKmJlZm9yZSogZXhlY3V0aW5nIHRoZSBvbkRlc3Ryb3kgaG9va3MuIEFuIG9uRGVzdHJveSBob29rCiAgICAgICAgLy8gcnVucyBhcmJpdHJhcnkgdXNlciBjb2RlLCB3aGljaCBjb3VsZCBpbmNsdWRlIGl0cyBvd24gYHZpZXdSZWYuZGVzdHJveSgpYCAob3Igc2ltaWxhcikuIElmCiAgICAgICAgLy8gV2UgZG9uJ3QgZmxhZyB0aGUgdmlldyBhcyBkZXN0cm95ZWQgYmVmb3JlIHRoZSBob29rcywgdGhpcyBjb3VsZCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuCiAgICAgICAgLy8gVGhpcyBhbHNvIGFsaWducyB3aXRoIHRoZSBWaWV3RW5naW5lIGJlaGF2aW9yLiBJdCBhbHNvIG1lYW5zIHRoYXQgdGhlIG9uRGVzdHJveSBob29rIGlzCiAgICAgICAgLy8gcmVhbGx5IG1vcmUgb2YgYW4gImFmdGVyRGVzdHJveSIgaG9vayBpZiB5b3UgdGhpbmsgYWJvdXQgaXQuCiAgICAgICAgbFZpZXdbRkxBR1NdIHw9IDI1NiAvKiBEZXN0cm95ZWQgKi87CiAgICAgICAgZXhlY3V0ZU9uRGVzdHJveXModFZpZXcsIGxWaWV3KTsKICAgICAgICByZW1vdmVMaXN0ZW5lcnModFZpZXcsIGxWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9zdFROb2RlID0gbFZpZXdbVF9IT1NUXTsKICAgICAgICAvLyBGb3IgY29tcG9uZW50IHZpZXdzIG9ubHksIHRoZSBsb2NhbCByZW5kZXJlciBpcyBkZXN0cm95ZWQgYXMgY2xlYW4gdXAgdGltZS4KICAgICAgICBpZiAoaG9zdFROb2RlICYmIGhvc3RUTm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gJiYKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIobFZpZXdbUkVOREVSRVJdKSkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyRGVzdHJveSsrOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1JFTkRFUkVSXSkpKS5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkNvbnRhaW5lciA9IGxWaWV3W0RFQ0xBUkFUSU9OX0xDT05UQUlORVJdOwogICAgICAgIC8vIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gZW1iZWRkZWQgdmlldyB0aGF0IGlzIHN0aWxsIGluc2VydGVkIGludG8gYSBjb250YWluZXIKICAgICAgICBpZiAoZGVjbGFyYXRpb25Db250YWluZXIgIT09IG51bGwgJiYgaXNMQ29udGFpbmVyKGxWaWV3W1BBUkVOVF0pKSB7CiAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIGEgcHJvamVjdGVkIHZpZXcKICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ29udGFpbmVyICE9PSBsVmlld1tQQVJFTlRdKSB7CiAgICAgICAgICAgICAgICBkZXRhY2hNb3ZlZFZpZXcoZGVjbGFyYXRpb25Db250YWluZXIsIGxWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGb3IgZW1iZWRkZWQgdmlld3Mgc3RpbGwgYXR0YWNoZWQgdG8gYSBjb250YWluZXI6IHJlbW92ZSBxdWVyeSByZXN1bHQgZnJvbSB0aGlzIHZpZXcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbFF1ZXJpZXMgPSBsVmlld1tRVUVSSUVTXTsKICAgICAgICAgICAgaWYgKGxRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsUXVlcmllcy5kZXRhY2hWaWV3KHRWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogUmVtb3ZlcyBsaXN0ZW5lcnMgYW5kIHVuc3Vic2NyaWJlcyBmcm9tIG91dHB1dCBzdWJzY3JpcHRpb25zCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKHRWaWV3LCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgaWYgKHRDbGVhbnVwICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDbGVhbnVwID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NMRUFOVVBdKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGggLSAxOyBpICs9IDIpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB0Q2xlYW51cFtpXSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuYXRpdmUgRE9NIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpZHhPclRhcmdldEdldHRlciA9IHRDbGVhbnVwW2kgKyAxXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHR5cGVvZiBpZHhPclRhcmdldEdldHRlciA9PT0gJ2Z1bmN0aW9uJyA/CiAgICAgICAgICAgICAgICAgICAgaWR4T3JUYXJnZXRHZXR0ZXIobFZpZXcpIDoKICAgICAgICAgICAgICAgICAgICB1bndyYXBSTm9kZShsVmlld1tpZHhPclRhcmdldEdldHRlcl0pOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBsQ2xlYW51cFt0Q2xlYW51cFtpICsgMl1dOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdXNlQ2FwdHVyZU9yU3ViSWR4ID0gdENsZWFudXBbaSArIDNdOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VDYXB0dXJlT3JTdWJJZHggPT09ICdib29sZWFuJykgewogICAgICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBET00gbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIFJlbmRlcmVyMwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRDbGVhbnVwW2ldLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZU9yU3ViSWR4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh1c2VDYXB0dXJlT3JTdWJJZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnJlZ2lzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGxDbGVhbnVwW3VzZUNhcHR1cmVPclN1YklkeF0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNjcmlwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBsQ2xlYW51cFstdXNlQ2FwdHVyZU9yU3ViSWR4XS51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjbGVhbnVwIGZ1bmN0aW9uIHRoYXQgaXMgZ3JvdXBlZCB3aXRoIHRoZSBpbmRleCBvZiBpdHMgY29udGV4dAogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGxDbGVhbnVwW3RDbGVhbnVwW2kgKyAxXV07CiAgICAgICAgICAgICAgICB0Q2xlYW51cFtpXS5jYWxsKGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxWaWV3W0NMRUFOVVBdID0gbnVsbDsKICAgIH0KfQovKioKICogQ2FsbHMgb25EZXN0cm95IGhvb2tzIGZvciB0aGlzIHZpZXcKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleGVjdXRlT25EZXN0cm95cyh0VmlldywgbFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkZXN0cm95SG9va3M7CiAgICBpZiAodFZpZXcgIT0gbnVsbCAmJiAoZGVzdHJveUhvb2tzID0gdFZpZXcuZGVzdHJveUhvb2tzKSAhPSBudWxsKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXN0cm95SG9va3MubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbFZpZXdbKC8qKiBAdHlwZSB7P30gKi8gKGRlc3Ryb3lIb29rc1tpXSkpXTsKICAgICAgICAgICAgLy8gT25seSBjYWxsIHRoZSBkZXN0cm95IGhvb2sgaWYgdGhlIGNvbnRleHQgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAgICAgICAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgTm9kZUluamVjdG9yRmFjdG9yeSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRvQ2FsbCA9ICgvKiogQHR5cGUgez99ICovIChkZXN0cm95SG9va3NbaSArIDFdKSk7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b0NhbGwpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b0NhbGwubGVuZ3RoOyBqICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0b0NhbGxbaiArIDFdKSkpLmNhbGwoY29udGV4dFsoLyoqIEB0eXBlIHs/fSAqLyAodG9DYWxsW2pdKSldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0b0NhbGwuY2FsbChjb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogUmV0dXJucyBhIG5hdGl2ZSBlbGVtZW50IGlmIGEgbm9kZSBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gcGFyZW50LgogKgogKiBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgd2h5IHdlIG1heSBub3QgYmUgYWJsZSB0byBpbnNlcnQgYSBlbGVtZW50IGltbWVkaWF0ZWx5LgogKiAtIFByb2plY3Rpb246IFdoZW4gY3JlYXRpbmcgYSBjaGlsZCBjb250ZW50IGVsZW1lbnQgb2YgYSBjb21wb25lbnQsIHdlIGhhdmUgdG8gc2tpcCB0aGUKICogICBpbnNlcnRpb24gYmVjYXVzZSB0aGUgY29udGVudCBvZiBhIGNvbXBvbmVudCB3aWxsIGJlIHByb2plY3RlZC4KICogICBgPGNvbXBvbmVudD48Y29udGVudD5kZWxheWVkIGR1ZSB0byBwcm9qZWN0aW9uPC9jb250ZW50PjwvY29tcG9uZW50PmAKICogLSBQYXJlbnQgY29udGFpbmVyIGlzIGRpc2Nvbm5lY3RlZDogVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGluc2VydGluZyBhIHZpZXcgaW50bwogKiAgIHBhcmVudCBjb250YWluZXIsIHdoaWNoIGl0c2VsZiBpcyBkaXNjb25uZWN0ZWQuIEZvciBleGFtcGxlIHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIHBhcnQKICogICBvZiBhIFZpZXcgd2hpY2ggaGFzIG5vdCBiZSBpbnNlcnRlZCBvciBpcyBtYWRlIGZvciBwcm9qZWN0aW9uIGJ1dCBoYXMgbm90IGJlZW4gaW5zZXJ0ZWQKICogICBpbnRvIGRlc3RpbmF0aW9uLgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBjdXJyZW50VmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UmVuZGVyUGFyZW50KHRWaWV3LCB0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgIC8vIFNraXAgb3ZlciBlbGVtZW50IGFuZCBJQ1UgY29udGFpbmVycyBhcyB0aG9zZSBhcmUgcmVwcmVzZW50ZWQgYnkgYSBjb21tZW50IG5vZGUgYW5kCiAgICAvLyBjYW4ndCBiZSB1c2VkIGFzIGEgcmVuZGVyIHBhcmVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnRUTm9kZSA9IHROb2RlLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnRUTm9kZSAhPSBudWxsICYmCiAgICAgICAgKHBhcmVudFROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fAogICAgICAgICAgICBwYXJlbnRUTm9kZS50eXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykpIHsKICAgICAgICB0Tm9kZSA9IHBhcmVudFROb2RlOwogICAgICAgIHBhcmVudFROb2RlID0gdE5vZGUucGFyZW50OwogICAgfQogICAgLy8gSWYgdGhlIHBhcmVudCB0Tm9kZSBpcyBudWxsLCB0aGVuIHdlIGFyZSBpbnNlcnRpbmcgYWNyb3NzIHZpZXdzOiBlaXRoZXIgaW50byBhbiBlbWJlZGRlZCB2aWV3CiAgICAvLyBvciBhIGNvbXBvbmVudCB2aWV3LgogICAgaWYgKHBhcmVudFROb2RlID09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9zdFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRWaWV3W1RfSE9TVF0pKTsKICAgICAgICBpZiAoaG9zdFROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykgewogICAgICAgICAgICAvLyBXZSBhcmUgaW5zZXJ0aW5nIGEgcm9vdCBlbGVtZW50IG9mIGFuIGVtYmVkZGVkIHZpZXcgV2UgbWlnaHQgZGVsYXkgaW5zZXJ0aW9uIG9mIGNoaWxkcmVuCiAgICAgICAgICAgIC8vIGZvciBhIGdpdmVuIHZpZXcgaWYgaXQgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1pZ2h0IGhhcHBlbiBmb3IgMiBtYWluIHJlYXNvbnM6CiAgICAgICAgICAgIC8vIC0gdmlldyBpcyBub3QgaW5zZXJ0ZWQgaW50byBhbnkgY29udGFpbmVyKHZpZXcgd2FzIGNyZWF0ZWQgYnV0IG5vdCBpbnNlcnRlZCB5ZXQpCiAgICAgICAgICAgIC8vIC0gdmlldyBpcyBpbnNlcnRlZCBpbnRvIGEgY29udGFpbmVyIGJ1dCB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBub3QgaW5zZXJ0ZWQgaW50byB0aGUgRE9NCiAgICAgICAgICAgIC8vIChjb250YWluZXIgbWlnaHQgYmUgcGFydCBvZiBwcm9qZWN0aW9uIG9yIGNoaWxkIG9mIGEgdmlldyB0aGF0IGlzIG5vdCBpbnNlcnRlZCB5ZXQpLgogICAgICAgICAgICAvLyBJbiBvdGhlciB3b3JkcyB3ZSBjYW4gaW5zZXJ0IGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdmlldyBpZiB0aGlzIHZpZXcgd2FzIGluc2VydGVkIGludG8gYQogICAgICAgICAgICAvLyBjb250YWluZXIgYW5kIHRoZSBjb250YWluZXIgaXRzZWxmIGhhcyBpdHMgcmVuZGVyIHBhcmVudCBkZXRlcm1pbmVkLgogICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyUmVuZGVyUGFyZW50KCgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgY3VycmVudFZpZXcpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBhIHJvb3QgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHZpZXcgaW50byB0aGUgY29tcG9uZW50IGhvc3QgZWxlbWVudCBhbmQKICAgICAgICAgICAgLy8gaXQgc2hvdWxkIGFsd2F5cyBiZSBlYWdlci4KICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXMoaG9zdFROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgICAgICByZXR1cm4gY3VycmVudFZpZXdbSE9TVF07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzSWN1Q2FzZSA9IHROb2RlICYmIHROb2RlLnR5cGUgPT09IDUgLyogSWN1Q29udGFpbmVyICovOwogICAgICAgIC8vIElmIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlIGlzIGFuIElDVSBjb250YWluZXIsIHRoZW4gaXQgaXMgcmVwcmVzZW50ZWQgYnkgY29tbWVudCBub2RlIGFuZCB3ZQogICAgICAgIC8vIG5lZWQgdG8gdXNlIGl0IGFzIGFuIGFuY2hvci4gSWYgaXQgaXMgcHJvamVjdGVkIHRoZW4gaXQncyBkaXJlY3QgcGFyZW50IG5vZGUgaXMgdGhlIHJlbmRlcmVyLgogICAgICAgIGlmIChpc0ljdUNhc2UgJiYgdE5vZGUuZmxhZ3MgJiA0IC8qIGlzUHJvamVjdGVkICovKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgY3VycmVudFZpZXcpLnBhcmVudE5vZGUpKTsKICAgICAgICB9CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHBhcmVudFROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgIGlmIChwYXJlbnRUTm9kZS5mbGFncyAmIDIgLyogaXNDb21wb25lbnRIb3N0ICovKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdERhdGEgPSB0Vmlldy5kYXRhOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3BhcmVudFROb2RlLmluZGV4XSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuY2Fwc3VsYXRpb24gPSAoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3ROb2RlLmRpcmVjdGl2ZVN0YXJ0XSkpKS5lbmNhcHN1bGF0aW9uOwogICAgICAgICAgICAvLyBXZSd2ZSBnb3QgYSBwYXJlbnQgd2hpY2ggaXMgYW4gZWxlbWVudCBpbiB0aGUgY3VycmVudCB2aWV3LiBXZSBqdXN0IG5lZWQgdG8gdmVyaWZ5IGlmIHRoZQogICAgICAgICAgICAvLyBwYXJlbnQgZWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQuIENvbXBvbmVudCdzIGNvbnRlbnQgbm9kZXMgYXJlIG5vdCBpbnNlcnRlZCBpbW1lZGlhdGVseQogICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBwcm9qZWN0ZWQsIGFuZCBzbyBkb2luZyBpbnNlcnQgYXQgdGhpcyBwb2ludCB3b3VsZCBiZSB3YXN0ZWZ1bC4KICAgICAgICAgICAgLy8gU2luY2UgdGhlIHByb2plY3Rpb24gd291bGQgdGhlbiBtb3ZlIGl0IHRvIGl0cyBmaW5hbCBkZXN0aW5hdGlvbi4gTm90ZSB0aGF0IHdlIGNhbid0CiAgICAgICAgICAgIC8vIG1ha2UgdGhpcyBhc3N1bXB0aW9uIHdoZW4gdXNpbmcgdGhlIFNoYWRvdyBET00sIGJlY2F1c2UgdGhlIG5hdGl2ZSBwcm9qZWN0aW9uIHBsYWNlaG9sZGVycwogICAgICAgICAgICAvLyAoPGNvbnRlbnQ+IG9yIDxzbG90PikgaGF2ZSB0byBiZSBpbiBwbGFjZSBhcyBlbGVtZW50cyBhcmUgYmVpbmcgaW5zZXJ0ZWQuCiAgICAgICAgICAgIGlmIChlbmNhcHN1bGF0aW9uICE9PSBWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbSAmJgogICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24kMS5OYXRpdmUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZShwYXJlbnRUTm9kZSwgY3VycmVudFZpZXcpKSk7CiAgICB9Cn0KLyoqCiAqIEluc2VydHMgYSBuYXRpdmUgbm9kZSBiZWZvcmUgYW5vdGhlciBuYXRpdmUgbm9kZSBmb3IgYSBnaXZlbiBwYXJlbnQgdXNpbmcge1xAbGluayBSZW5kZXJlcjN9LgogKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gbmF0aXZlIG5vZGVzIHdlcmUgZGV0ZXJtaW5lZCAtIGl0IGFic3RyYWN0cyBhbgogKiBhY3R1YWwgcmVuZGVyZXIgYmVpbmcgdXNlZC4KICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcGFyYW0gez99IGNoaWxkCiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkLCBiZWZvcmVOb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVySW5zZXJ0QmVmb3JlKys7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgcmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHBhcmVudCwgY2hpbGQsIGJlZm9yZU5vZGUpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlTm9kZSwgdHJ1ZSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBwYXJlbnQKICogQHBhcmFtIHs/fSBjaGlsZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmF0aXZlQXBwZW5kQ2hpbGQocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJBcHBlbmRDaGlsZCsrOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocGFyZW50LCAncGFyZW50IG5vZGUgbXVzdCBiZSBkZWZpbmVkJyk7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50LCBjaGlsZCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gcGFyZW50CiAqIEBwYXJhbSB7P30gY2hpbGQKICogQHBhcmFtIHs/fSBiZWZvcmVOb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgYmVmb3JlTm9kZSkgewogICAgaWYgKGJlZm9yZU5vZGUgIT09IG51bGwpIHsKICAgICAgICBuYXRpdmVJbnNlcnRCZWZvcmUocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQsIGJlZm9yZU5vZGUpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmF0aXZlQXBwZW5kQ2hpbGQocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQpOwogICAgfQp9Ci8qKgogKiBSZW1vdmVzIGEgbm9kZSBmcm9tIHRoZSBET00gZ2l2ZW4gaXRzIG5hdGl2ZSBwYXJlbnQuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBwYXJlbnQKICogQHBhcmFtIHs/fSBjaGlsZAogKiBAcGFyYW0gez89fSBpc0hvc3RFbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBuYXRpdmVSZW1vdmVDaGlsZChyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgaXNIb3N0RWxlbWVudCkgewogICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkgewogICAgICAgIHJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQsIGlzSG9zdEVsZW1lbnQpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKICAgIH0KfQovKioKICogUmV0dXJucyBhIG5hdGl2ZSBwYXJlbnQgb2YgYSBnaXZlbiBuYXRpdmUgbm9kZS4KICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IG5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5hdGl2ZVBhcmVudE5vZGUocmVuZGVyZXIsIG5vZGUpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSA/IHJlbmRlcmVyLnBhcmVudE5vZGUobm9kZSkgOiBub2RlLnBhcmVudE5vZGUpKSk7Cn0KLyoqCiAqIFJldHVybnMgYSBuYXRpdmUgc2libGluZyBvZiBhIGdpdmVuIG5hdGl2ZSBub2RlLgogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gbm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmF0aXZlTmV4dFNpYmxpbmcocmVuZGVyZXIsIG5vZGUpIHsKICAgIHJldHVybiBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5uZXh0U2libGluZyhub2RlKSA6IG5vZGUubmV4dFNpYmxpbmc7Cn0KLyoqCiAqIEZpbmRzIGEgbmF0aXZlICJhbmNob3IiIG5vZGUgZm9yIGNhc2VzIHdoZXJlIHdlIGNhbid0IGFwcGVuZCBhIG5hdGl2ZSBjaGlsZCBkaXJlY3RseQogKiAoYGFwcGVuZENoaWxkYCkgYW5kIG5lZWQgdG8gdXNlIGEgcmVmZXJlbmNlIChhbmNob3IpIG5vZGUgZm9yIHRoZSBgaW5zZXJ0QmVmb3JlYCBvcGVyYXRpb24uCiAqIEBwYXJhbSB7P30gcGFyZW50VE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TmF0aXZlQW5jaG9yTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpIHsKICAgIGlmIChwYXJlbnRUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbENvbnRhaW5lciA9IGdldExDb250YWluZXIoKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudFROb2RlKSksIGxWaWV3KTsKICAgICAgICBpZiAobENvbnRhaW5lciA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4ID0gbENvbnRhaW5lci5pbmRleE9mKGxWaWV3LCBDT05UQUlORVJfSEVBREVSX09GRlNFVCkgLSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsKICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoaW5kZXgsIGxDb250YWluZXIpOwogICAgfQogICAgZWxzZSBpZiAocGFyZW50VE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8CiAgICAgICAgcGFyZW50VE5vZGUudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICByZXR1cm4gZ2V0TmF0aXZlQnlUTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEFwcGVuZHMgdGhlIGBjaGlsZGAgbmF0aXZlIG5vZGUgKG9yIGEgY29sbGVjdGlvbiBvZiBub2RlcykgdG8gdGhlIGBwYXJlbnRgLgogKgogKiBUaGUgZWxlbWVudCBpbnNlcnRpb24gbWlnaHQgYmUgZGVsYXllZCB7XEBsaW5rIGNhbkluc2VydE5hdGl2ZU5vZGV9LgogKgogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBgVFZpZXcnIHRvIGJlIGFwcGVuZGVkCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIGN1cnJlbnQgTFZpZXcKICogQHBhcmFtIHs/fSBjaGlsZEVsIFRoZSBuYXRpdmUgY2hpbGQgKG9yIGNoaWxkcmVuKSB0aGF0IHNob3VsZCBiZSBhcHBlbmRlZAogKiBAcGFyYW0gez99IGNoaWxkVE5vZGUgVGhlIFROb2RlIG9mIHRoZSBjaGlsZCBlbGVtZW50CiAqIEByZXR1cm4gez99IFdoZXRoZXIgb3Igbm90IHRoZSBjaGlsZCB3YXMgYXBwZW5kZWQKICovCmZ1bmN0aW9uIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgY2hpbGRFbCwgY2hpbGRUTm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyUGFyZW50ID0gZ2V0UmVuZGVyUGFyZW50KHRWaWV3LCBjaGlsZFROb2RlLCBsVmlldyk7CiAgICBpZiAocmVuZGVyUGFyZW50ICE9IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudFROb2RlID0gY2hpbGRUTm9kZS5wYXJlbnQgfHwgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RfSE9TVF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW5jaG9yTm9kZSA9IGdldE5hdGl2ZUFuY2hvck5vZGUocGFyZW50VE5vZGUsIGxWaWV3KTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZEVsKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkRWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIG5hdGl2ZUFwcGVuZE9ySW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIGNoaWxkRWxbaV0sIGFuY2hvck5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcmVuZGVyUGFyZW50LCBjaGlsZEVsLCBhbmNob3JOb2RlKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFJldHVybnMgdGhlIGZpcnN0IG5hdGl2ZSBub2RlIGZvciBhIGdpdmVuIExWaWV3LCBzdGFydGluZyBmcm9tIHRoZSBwcm92aWRlZCBUTm9kZS4KICoKICogTmF0aXZlIG5vZGVzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhvc2UgYXBwZWFyIGluIHRoZSBuYXRpdmUgdHJlZSAoRE9NKS4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRGaXJzdE5hdGl2ZU5vZGUobFZpZXcsIHROb2RlKSB7CiAgICBpZiAodE5vZGUgIT09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCA1IC8qIEljdUNvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGVUeXBlID0gdE5vZGUudHlwZTsKICAgICAgICBpZiAodE5vZGVUeXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHsKICAgICAgICAgICAgcmV0dXJuIGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodE5vZGVUeXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoLTEsIGxWaWV3W3ROb2RlLmluZGV4XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbEljdUNvbnRhaW5lckNoaWxkID0gdE5vZGUuY2hpbGQ7CiAgICAgICAgICAgIGlmIChlbEljdUNvbnRhaW5lckNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3ROYXRpdmVOb2RlKGxWaWV3LCBlbEljdUNvbnRhaW5lckNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJOb2RlT3JMQ29udGFpbmVyID0gbFZpZXdbdE5vZGUuaW5kZXhdOwogICAgICAgICAgICAgICAgaWYgKGlzTENvbnRhaW5lcihyTm9kZU9yTENvbnRhaW5lcikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoLTEsIHJOb2RlT3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBSTm9kZShyTm9kZU9yTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRIb3N0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFZpZXdbVF9IT1NUXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudFZpZXcgPSBnZXRMVmlld1BhcmVudChjb21wb25lbnRWaWV3KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaXJzdFByb2plY3RlZFROb2RlID0gKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRIb3N0LnByb2plY3Rpb24pKSlbKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLnByb2plY3Rpb24pKV07CiAgICAgICAgICAgIGlmIChmaXJzdFByb2plY3RlZFROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdE5hdGl2ZU5vZGUoKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudFZpZXcpKSwgZmlyc3RQcm9qZWN0ZWRUTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3ROYXRpdmVOb2RlKGxWaWV3LCB0Tm9kZS5uZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHZpZXdJbmRleEluQ29udGFpbmVyCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmVmb3JlTm9kZUZvclZpZXcodmlld0luZGV4SW5Db250YWluZXIsIGxDb250YWluZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5leHRWaWV3SW5kZXggPSBDT05UQUlORVJfSEVBREVSX09GRlNFVCArIHZpZXdJbmRleEluQ29udGFpbmVyICsgMTsKICAgIGlmIChuZXh0Vmlld0luZGV4IDwgbENvbnRhaW5lci5sZW5ndGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobENvbnRhaW5lcltuZXh0Vmlld0luZGV4XSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaXJzdFROb2RlT2ZWaWV3ID0gbFZpZXdbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICAgICAgaWYgKGZpcnN0VE5vZGVPZlZpZXcgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0TmF0aXZlTm9kZShsVmlldywgZmlyc3RUTm9kZU9mVmlldyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGxDb250YWluZXJbTkFUSVZFXTsKfQovKioKICogUmVtb3ZlcyBhIG5hdGl2ZSBub2RlIGl0c2VsZiB1c2luZyBhIGdpdmVuIHJlbmRlcmVyLiBUbyByZW1vdmUgdGhlIG5vZGUgd2UgYXJlIGxvb2tpbmcgdXAgaXRzCiAqIHBhcmVudCBmcm9tIHRoZSBuYXRpdmUgdHJlZSBhcyBub3QgYWxsIHBsYXRmb3JtcyAvIGJyb3dzZXJzIHN1cHBvcnQgdGhlIGVxdWl2YWxlbnQgb2YKICogbm9kZS5yZW1vdmUoKS4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBBIHJlbmRlcmVyIHRvIGJlIHVzZWQKICogQHBhcmFtIHs/fSByTm9kZSBUaGUgbmF0aXZlIG5vZGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAogKiBAcGFyYW0gez89fSBpc0hvc3RFbGVtZW50IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgbm9kZSB0byBiZSByZW1vdmVkIGlzIGEgaG9zdCBvZiBhIGNvbXBvbmVudC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBpc0hvc3RFbGVtZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYXRpdmVQYXJlbnQgPSBuYXRpdmVQYXJlbnROb2RlKHJlbmRlcmVyLCByTm9kZSk7CiAgICBpZiAobmF0aXZlUGFyZW50KSB7CiAgICAgICAgbmF0aXZlUmVtb3ZlQ2hpbGQocmVuZGVyZXIsIG5hdGl2ZVBhcmVudCwgck5vZGUsIGlzSG9zdEVsZW1lbnQpOwogICAgfQp9Ci8qKgogKiBQZXJmb3JtcyB0aGUgb3BlcmF0aW9uIG9mIGBhY3Rpb25gIG9uIHRoZSBub2RlLiBUeXBpY2FsbHkgdGhpcyBpbnZvbHZlcyBpbnNlcnRpbmcgb3IgcmVtb3ZpbmcKICogbm9kZXMgb24gdGhlIExWaWV3IG9yIHByb2plY3Rpb24gYm91bmRhcnkuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcmVuZGVyUGFyZW50CiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZQogKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlOb2RlcyhyZW5kZXJlciwgYWN0aW9uLCB0Tm9kZSwgbFZpZXcsIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSwgaXNQcm9qZWN0aW9uKSB7CiAgICB3aGlsZSAodE5vZGUgIT0gbnVsbCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovLCAxIC8qIFByb2plY3Rpb24gKi8sIDUgLyogSWN1Q29udGFpbmVyICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmF3U2xvdFZhbHVlID0gbFZpZXdbdE5vZGUuaW5kZXhdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZVR5cGUgPSB0Tm9kZS50eXBlOwogICAgICAgIGlmIChpc1Byb2plY3Rpb24pIHsKICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gMCAvKiBDcmVhdGUgKi8pIHsKICAgICAgICAgICAgICAgIHJhd1Nsb3RWYWx1ZSAmJiBhdHRhY2hQYXRjaERhdGEodW53cmFwUk5vZGUocmF3U2xvdFZhbHVlKSwgbFZpZXcpOwogICAgICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gNCAvKiBpc1Byb2plY3RlZCAqLzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKHROb2RlLmZsYWdzICYgNjQgLyogaXNEZXRhY2hlZCAqLykgIT09IDY0IC8qIGlzRGV0YWNoZWQgKi8pIHsKICAgICAgICAgICAgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgIGFwcGx5Tm9kZXMocmVuZGVyZXIsIGFjdGlvbiwgdE5vZGUuY2hpbGQsIGxWaWV3LCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGFwcGx5VG9FbGVtZW50T3JDb250YWluZXIoYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCByYXdTbG90VmFsdWUsIGJlZm9yZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHROb2RlVHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7CiAgICAgICAgICAgICAgICBhcHBseVByb2plY3Rpb25SZWN1cnNpdmUocmVuZGVyZXIsIGFjdGlvbiwgbFZpZXcsICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgMCAvKiBDb250YWluZXIgKi8pOwogICAgICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIHJhd1Nsb3RWYWx1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdE5vZGUgPSBpc1Byb2plY3Rpb24gPyB0Tm9kZS5wcm9qZWN0aW9uTmV4dCA6IHROb2RlLm5leHQ7CiAgICB9Cn0KLyoqCiAqIGBhcHBseVZpZXdgIHBlcmZvcm1zIG9wZXJhdGlvbiBvbiB0aGUgdmlldyBhcyBzcGVjaWZpZWQgaW4gYGFjdGlvbmAgKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogKgogKiBJbnNlcnRpbmcgYSB2aWV3IHdpdGhvdXQgcHJvamVjdGlvbiBvciBjb250YWluZXJzIGF0IHRvcCBsZXZlbCBpcyBzaW1wbGUuIEp1c3QgaXRlcmF0ZSBvdmVyIHRoZQogKiByb290IG5vZGVzIG9mIHRoZSBWaWV3LCBhbmQgZm9yIGVhY2ggbm9kZSBwZXJmb3JtIHRoZSBgYWN0aW9uYC4KICoKICogVGhpbmdzIGdldCBtb3JlIGNvbXBsaWNhdGVkIHdpdGggY29udGFpbmVycyBhbmQgcHJvamVjdGlvbnMuIFRoYXQgaXMgYmVjYXVzZSBjb21pbmcgYWNyb3NzOgogKiAtIENvbnRhaW5lcjogaW1wbGllcyB0aGF0IHdlIGhhdmUgdG8gaW5zZXJ0L3JlbW92ZS9kZXN0cm95IHRoZSB2aWV3cyBvZiB0aGF0IGNvbnRhaW5lciBhcyB3ZWxsCiAqICAgICAgICAgICAgICB3aGljaCBpbiB0dXJuIGNhbiBoYXZlIHRoZWlyIG93biBDb250YWluZXJzIGF0IHRoZSBWaWV3IHJvb3RzLgogKiAtIFByb2plY3Rpb246IGltcGxpZXMgdGhhdCB3ZSBoYXZlIHRvIGluc2VydC9yZW1vdmUvZGVzdHJveSB0aGUgbm9kZXMgb2YgdGhlIHByb2plY3Rpb24uIFRoZQogKiAgICAgICAgICAgICAgIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSBub2RlcyB3ZSBhcmUgcHJvamVjdGluZyBjYW4gdGhlbXNlbHZlcyBoYXZlIENvbnRhaW5lcnMKICogICAgICAgICAgICAgICBvciBvdGhlciBQcm9qZWN0aW9ucy4KICoKICogQXMgeW91IGNhbiBzZWUgdGhpcyBpcyBhIHZlcnkgcmVjdXJzaXZlIHByb2JsZW0uIFllcyByZWN1cnNpb24gaXMgbm90IG1vc3QgZWZmaWNpZW50IGJ1dCB0aGUKICogY29kZSBpcyBjb21wbGljYXRlZCBlbm91Z2ggdGhhdCB0cnlpbmcgdG8gaW1wbGVtZW50ZWQgd2l0aCByZWN1cnNpb24gYmVjb21lcyB1bm1haW50YWluYWJsZS4KICoKICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3JyB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCwgZGV0YWNoZWQsIGRlc3Ryb3llZAogKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCwgZGV0YWNoZWQsIGRlc3Ryb3llZC4KICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBhY3Rpb24gYWN0aW9uIHRvIHBlcmZvcm0gKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogKiBAcGFyYW0gez99IHJlbmRlclBhcmVudCBwYXJlbnQgRE9NIGVsZW1lbnQgZm9yIGluc2VydGlvbi9yZW1vdmFsLgogKiBAcGFyYW0gez99IGJlZm9yZU5vZGUgQmVmb3JlIHdoaWNoIG5vZGUgdGhlIGluc2VydGlvbnMgc2hvdWxkIGhhcHBlbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5Vmlldyh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCBhY3Rpb24sIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5ub2RlKSksIDIgLyogVmlldyAqLyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aWV3Um9vdFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3Lm5vZGUpKS5jaGlsZDsKICAgIGFwcGx5Tm9kZXMocmVuZGVyZXIsIGFjdGlvbiwgdmlld1Jvb3RUTm9kZSwgbFZpZXcsIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSwgZmFsc2UpOwp9Ci8qKgogKiBgYXBwbHlQcm9qZWN0aW9uYCBwZXJmb3JtcyBvcGVyYXRpb24gb24gdGhlIHByb2plY3Rpb24uCiAqCiAqIEluc2VydGluZyBhIHByb2plY3Rpb24gcmVxdWlyZXMgdXMgdG8gbG9jYXRlIHRoZSBwcm9qZWN0ZWQgbm9kZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC4gVGhlCiAqIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRob3NlIG5vZGVzIHRoZW1zZWx2ZXMgY291bGQgYmUgcmUtcHJvamVjdGVkIGZyb20gdGhlaXIgcGFyZW50IGNvbXBvbmVudC4KICoKICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3YCBvZiBgTFZpZXdgIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkLCBkZXRhY2hlZCwgZGVzdHJveWVkCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIGBMVmlld2Agd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAqIEBwYXJhbSB7P30gdFByb2plY3Rpb25Ob2RlIG5vZGUgdG8gcHJvamVjdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlQcm9qZWN0aW9uKHRWaWV3LCBsVmlldywgdFByb2plY3Rpb25Ob2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJlciA9IGxWaWV3W1JFTkRFUkVSXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlclBhcmVudCA9IGdldFJlbmRlclBhcmVudCh0VmlldywgdFByb2plY3Rpb25Ob2RlLCBsVmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnRUTm9kZSA9IHRQcm9qZWN0aW9uTm9kZS5wYXJlbnQgfHwgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RfSE9TVF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBiZWZvcmVOb2RlID0gZ2V0TmF0aXZlQW5jaG9yTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpOwogICAgYXBwbHlQcm9qZWN0aW9uUmVjdXJzaXZlKHJlbmRlcmVyLCAwIC8qIENyZWF0ZSAqLywgbFZpZXcsIHRQcm9qZWN0aW9uTm9kZSwgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlKTsKfQovKioKICogYGFwcGx5UHJvamVjdGlvblJlY3Vyc2l2ZWAgcGVyZm9ybXMgb3BlcmF0aW9uIG9uIHRoZSBwcm9qZWN0aW9uIHNwZWNpZmllZCBieSBgYWN0aW9uYCAoaW5zZXJ0LAogKiBkZXRhY2gsIGRlc3Ryb3kpCiAqCiAqIEluc2VydGluZyBhIHByb2plY3Rpb24gcmVxdWlyZXMgdXMgdG8gbG9jYXRlIHRoZSBwcm9qZWN0ZWQgbm9kZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC4gVGhlCiAqIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRob3NlIG5vZGVzIHRoZW1zZWx2ZXMgY291bGQgYmUgcmUtcHJvamVjdGVkIGZyb20gdGhlaXIgcGFyZW50IGNvbXBvbmVudC4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXIgdG8gdXNlCiAqIEBwYXJhbSB7P30gYWN0aW9uIGFjdGlvbiB0byBwZXJmb3JtIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgTFZpZXcgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAqIEBwYXJhbSB7P30gdFByb2plY3Rpb25Ob2RlIG5vZGUgdG8gcHJvamVjdAogKiBAcGFyYW0gez99IHJlbmRlclBhcmVudCBwYXJlbnQgRE9NIGVsZW1lbnQgZm9yIGluc2VydGlvbi9yZW1vdmFsLgogKiBAcGFyYW0gez99IGJlZm9yZU5vZGUgQmVmb3JlIHdoaWNoIG5vZGUgdGhlIGluc2VydGlvbnMgc2hvdWxkIGhhcHBlbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5UHJvamVjdGlvblJlY3Vyc2l2ZShyZW5kZXJlciwgYWN0aW9uLCBsVmlldywgdFByb2plY3Rpb25Ob2RlLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudExWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRMVmlld1tUX0hPU1RdKSk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbCh0eXBlb2YgdFByb2plY3Rpb25Ob2RlLnByb2plY3Rpb24sICdudW1iZXInLCAnZXhwZWN0aW5nIHByb2plY3Rpb24gaW5kZXgnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVUb1Byb2plY3RPclJOb2RlcyA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50Tm9kZS5wcm9qZWN0aW9uKSlbdFByb2plY3Rpb25Ob2RlLnByb2plY3Rpb25dKSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlVG9Qcm9qZWN0T3JSTm9kZXMpKSB7CiAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGV4aXN0LCBpdCBpcyBhIGJpdCBvZiBhIGhhY2suIFdoZW4gd2UgYm9vdHN0cmFwIGEgdG9wIGxldmVsIG5vZGUgYW5kIHdlCiAgICAgICAgLy8gbmVlZCB0byBzdXBwb3J0IHBhc3NpbmcgcHJvamVjdGFibGUgbm9kZXMsIHNvIHdlIGNoZWF0IGFuZCBwdXQgdGhlbSBpbiB0aGUgVE5vZGUKICAgICAgICAvLyBvZiB0aGUgSG9zdCBUVmlldy4gKFllcyB3ZSBwdXQgaW5zdGFuY2UgaW5mbyBhdCB0aGUgVCBMZXZlbCkuIFdlIGNhbiBnZXQgYXdheSB3aXRoIGl0CiAgICAgICAgLy8gYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhhdCBUVmlldyBpcyBub3Qgc2hhcmVkIGFuZCB0aGVyZWZvcmUgaXQgd2lsbCBub3QgYmUgYSBwcm9ibGVtLgogICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgYW5kIGNsZWFuZWQgdXAuCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlVG9Qcm9qZWN0T3JSTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByTm9kZSA9IG5vZGVUb1Byb2plY3RPclJOb2Rlc1tpXTsKICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIHJOb2RlLCBiZWZvcmVOb2RlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5vZGVUb1Byb2plY3QgPSBub2RlVG9Qcm9qZWN0T3JSTm9kZXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb2plY3RlZENvbXBvbmVudExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudExWaWV3W1BBUkVOVF0pKTsKICAgICAgICBhcHBseU5vZGVzKHJlbmRlcmVyLCBhY3Rpb24sIG5vZGVUb1Byb2plY3QsIHByb2plY3RlZENvbXBvbmVudExWaWV3LCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUsIHRydWUpOwogICAgfQp9Ci8qKgogKiBgYXBwbHlDb250YWluZXJgIHBlcmZvcm1zIGFuIG9wZXJhdGlvbiBvbiB0aGUgY29udGFpbmVyIGFuZCBpdHMgdmlld3MgYXMgc3BlY2lmaWVkIGJ5CiAqIGBhY3Rpb25gIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICoKICogSW5zZXJ0aW5nIGEgQ29udGFpbmVyIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIGNvbnRhaW5lciBtYXkgaGF2ZSBWaWV3cyB3aGljaAogKiB0aGVtc2VsdmVzIGhhdmUgY29udGFpbmVycyBvciBwcm9qZWN0aW9ucy4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBhY3Rpb24gYWN0aW9uIHRvIHBlcmZvcm0gKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogKiBAcGFyYW0gez99IGxDb250YWluZXIgVGhlIExDb250YWluZXIgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAqIEBwYXJhbSB7P30gcmVuZGVyUGFyZW50IHBhcmVudCBET00gZWxlbWVudCBmb3IgaW5zZXJ0aW9uL3JlbW92YWwuCiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZSBCZWZvcmUgd2hpY2ggbm9kZSB0aGUgaW5zZXJ0aW9ucyBzaG91bGQgaGFwcGVuLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlDb250YWluZXIocmVuZGVyZXIsIGFjdGlvbiwgbENvbnRhaW5lciwgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihsQ29udGFpbmVyKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFuY2hvciA9IGxDb250YWluZXJbTkFUSVZFXTsKICAgIC8vIExDb250YWluZXIgaGFzIGl0cyBvd24gYmVmb3JlIG5vZGUuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYXRpdmUgPSB1bndyYXBSTm9kZShsQ29udGFpbmVyKTsKICAgIC8vIEFuIExDb250YWluZXIgY2FuIGJlIGNyZWF0ZWQgZHluYW1pY2FsbHkgb24gYW55IG5vZGUgYnkgaW5qZWN0aW5nIFZpZXdDb250YWluZXJSZWYuCiAgICAvLyBBc2tpbmcgZm9yIGEgVmlld0NvbnRhaW5lclJlZiBvbiBhbiBlbGVtZW50IHdpbGwgcmVzdWx0IGluIGEgY3JlYXRpb24gb2YgYSBzZXBhcmF0ZSBhbmNob3Igbm9kZQogICAgLy8gKGNvbW1lbnQgaW4gdGhlIERPTSkgdGhhdCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBMQ29udGFpbmVyJ3MgaG9zdCBub2RlLiBJbiB0aGlzIHBhcnRpY3VsYXIKICAgIC8vIGNhc2Ugd2UgbmVlZCB0byBleGVjdXRlIGFjdGlvbiBvbiAyIG5vZGVzOgogICAgLy8gLSBjb250YWluZXIncyBob3N0IG5vZGUgKHRoaXMgaXMgZG9uZSBpbiB0aGUgZXhlY3V0ZUFjdGlvbk9uRWxlbWVudE9yQ29udGFpbmVyKQogICAgLy8gLSBjb250YWluZXIncyBob3N0IG5vZGUgKHRoaXMgaXMgZG9uZSBoZXJlKQogICAgaWYgKGFuY2hvciAhPT0gbmF0aXZlKSB7CiAgICAgICAgLy8gVGhpcyBpcyB2ZXJ5IHN0cmFuZ2UgdG8gbWUgKE1pc2tvKS4gSSB3b3VsZCBleHBlY3QgdGhhdCB0aGUgbmF0aXZlIGlzIHNhbWUgYXMgYW5jaG9yLiBJIGRvbid0CiAgICAgICAgLy8gc2VlIGEgcmVhc29uIHdoeSB0aGV5IHNob3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCB0aGV5IGFyZS4KICAgICAgICAvLwogICAgICAgIC8vIElmIHRoZXkgYXJlIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgc2Vjb25kIGFuY2hvciBhcyB3ZWxsLgogICAgICAgIGFwcGx5VG9FbGVtZW50T3JDb250YWluZXIoYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCBhbmNob3IsIGJlZm9yZU5vZGUpOwogICAgfQogICAgZm9yIChsZXQgaSA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUOyBpIDwgbENvbnRhaW5lci5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChsQ29udGFpbmVyW2ldKSk7CiAgICAgICAgYXBwbHlWaWV3KGxWaWV3W1RWSUVXXSwgbFZpZXcsIHJlbmRlcmVyLCBhY3Rpb24sIHJlbmRlclBhcmVudCwgYW5jaG9yKTsKICAgIH0KfQovKioKICogV3JpdGVzIGNsYXNzL3N0eWxlIHRvIGVsZW1lbnQuCiAqCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIgUmVuZGVyZXIgdG8gdXNlLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgaXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYGNsYXNzYCAoYGZhbHNlYCB0byB3cml0ZSB0byBgc3R5bGVgKQogKiBAcGFyYW0gez99IHJOb2RlIFRoZSBOb2RlIHRvIHdyaXRlIHRvLgogKiBAcGFyYW0gez99IHByb3AgUHJvcGVydHkgdG8gd3JpdGUgdG8uIFRoaXMgd291bGQgYmUgdGhlIGNsYXNzL3N0eWxlIG5hbWUuCiAqIEBwYXJhbSB7P30gdmFsdWUgVmFsdWUgdG8gd3JpdGUuIElmIGBudWxsYC9gdW5kZWZpbmVkYC9gZmFsc2VgIHRoaXMgaXMgY29uc2lkZXJlZCBhIHJlbW92ZSAoc2V0L2FkZAogKiAgICAgICAgb3RoZXJ3aXNlKS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5U3R5bGluZyhyZW5kZXJlciwgaXNDbGFzc0Jhc2VkLCByTm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzUHJvY2VkdXJhbCA9IGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKTsKICAgIGlmIChpc0NsYXNzQmFzZWQpIHsKICAgICAgICAvLyBXZSBhY3R1YWxseSB3YW50IEpTIHRydWUvZmFsc2UgaGVyZSBiZWNhdXNlIGFueSB0cnV0aHkgdmFsdWUgc2hvdWxkIGFkZCB0aGUgY2xhc3MKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVDbGFzcysrOwogICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHJlbmRlcmVyKSkpLnJlbW92ZUNsYXNzKHJOb2RlLCBwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAock5vZGUpKSkuY2xhc3NMaXN0LnJlbW92ZShwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZENsYXNzKys7CiAgICAgICAgICAgIGlmIChpc1Byb2NlZHVyYWwpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuYWRkQ2xhc3Mock5vZGUsIHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5jbGFzc0xpc3QsICdIVE1MRWxlbWVudCBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5jbGFzc0xpc3QuYWRkKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IENhbid0IGltcG9ydCBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlIGFzIGl0IGNhdXNlcyBpbXBvcnRzIHRvIGJlIHJlc29sdmVkIGluCiAgICAgICAgLy8gZGlmZmVyZW50IG9yZGVyIHdoaWNoIGNhdXNlcyBmYWlsdXJlcy4gVXNpbmcgZGlyZWN0IGNvbnN0YW50IGFzIHdvcmthcm91bmQgZm9yIG5vdy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmxhZ3MgPSBwcm9wLmluZGV4T2YoJy0nKSA9PSAtMSA/IHVuZGVmaW5lZCA6IDIgLyogUmVuZGVyZXJTdHlsZUZsYWdzMi5EYXNoQ2FzZSAqLzsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAvKiogfHwgdmFsdWUgPT09IHVuZGVmaW5lZCAqLykgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlU3R5bGUrKzsKICAgICAgICAgICAgaWYgKGlzUHJvY2VkdXJhbCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5yZW1vdmVTdHlsZShyTm9kZSwgcHJvcCwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFN0eWxlKys7CiAgICAgICAgICAgIGlmIChpc1Byb2NlZHVyYWwpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0U3R5bGUock5vZGUsIHByb3AsIHZhbHVlLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCgoKC8qKiBAdHlwZSB7P30gKi8gKHJOb2RlKSkpLnN0eWxlLCAnSFRNTEVsZW1lbnQgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAock5vZGUpKSkuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBXcml0ZSBgY3NzVGV4dGAgdG8gYFJFbGVtZW50YC4KICoKICogVGhpcyBmdW5jdGlvbiBkb2VzIGRpcmVjdCB3cml0ZSB3aXRob3V0IGFueSByZWNvbmNpbGlhdGlvbi4gVXNlZCBmb3Igd3JpdGluZyBpbml0aWFsIHZhbHVlcywgc28KICogdGhhdCBzdGF0aWMgc3R5bGluZyB2YWx1ZXMgZG8gbm90IHB1bGwgaW4gdGhlIHN0eWxlIHBhcnNlci4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbmV3VmFsdWUgVGhlIG5ldyBjbGFzcyBsaXN0IHRvIHdyaXRlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gd3JpdGVEaXJlY3RTdHlsZShyZW5kZXJlciwgZWxlbWVudCwgbmV3VmFsdWUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRTdHJpbmcobmV3VmFsdWUsICdcJ25ld1ZhbHVlXCcgc2hvdWxkIGJlIGEgc3RyaW5nJyk7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdzdHlsZScsIG5ld1ZhbHVlKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKS5zdHlsZS5jc3NUZXh0ID0gbmV3VmFsdWU7CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyU2V0U3R5bGUrKzsKfQovKioKICogV3JpdGUgYGNsYXNzTmFtZWAgdG8gYFJFbGVtZW50YC4KICoKICogVGhpcyBmdW5jdGlvbiBkb2VzIGRpcmVjdCB3cml0ZSB3aXRob3V0IGFueSByZWNvbmNpbGlhdGlvbi4gVXNlZCBmb3Igd3JpdGluZyBpbml0aWFsIHZhbHVlcywgc28KICogdGhhdCBzdGF0aWMgc3R5bGluZyB2YWx1ZXMgZG8gbm90IHB1bGwgaW4gdGhlIHN0eWxlIHBhcnNlci4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbmV3VmFsdWUgVGhlIG5ldyBjbGFzcyBsaXN0IHRvIHdyaXRlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gd3JpdGVEaXJlY3RDbGFzcyhyZW5kZXJlciwgZWxlbWVudCwgbmV3VmFsdWUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRTdHJpbmcobmV3VmFsdWUsICdcJ25ld1ZhbHVlXCcgc2hvdWxkIGJlIGEgc3RyaW5nJyk7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSAnJykgewogICAgICAgICAgICAvLyBUaGVyZSBhcmUgdGVzdHMgaW4gYGdvb2dsZTNgIHdoaWNoIGV4cGVjdCBgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylgIHRvIGJlIGBudWxsYC4KICAgICAgICAgICAgcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsICdjbGFzcycpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdjbGFzcycsIG5ld1ZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld1ZhbHVlOwogICAgfQogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldENsYXNzTmFtZSsrOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL25vZGVfdXRpbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogSWYgYHN0YXJ0VE5vZGUucGFyZW50YCBleGlzdHMgYW5kIGhhcyBhbiBpbmplY3RvciwgcmV0dXJucyBUTm9kZSBmb3IgdGhhdCBpbmplY3Rvci4KICogT3RoZXJ3aXNlLCB1bndyYXBzIGEgcGFyZW50IGluamVjdG9yIGxvY2F0aW9uIG51bWJlciB0byBmaW5kIHRoZSB2aWV3IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50CiAqIGluamVjdG9yLCB0aGVuIHdhbGtzIHVwIHRoZSBkZWNsYXJhdGlvbiB2aWV3IHRyZWUgdW50aWwgdGhlIFROb2RlIG9mIHRoZSBwYXJlbnQgaW5qZWN0b3IgaXMKICogZm91bmQuCiAqCiAqIEBwYXJhbSB7P30gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJlbnQgaW5qZWN0b3IsIHdoaWNoIGNvbnRhaW5zIHRoZSB2aWV3IG9mZnNldAogKiBAcGFyYW0gez99IHN0YXJ0VmlldyBUaGUgTFZpZXcgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBzdGFydCB3YWxraW5nIHVwIHRoZSB2aWV3IHRyZWUKICogQHBhcmFtIHs/fSBzdGFydFROb2RlIFRoZSBUTm9kZSBpbnN0YW5jZSBvZiB0aGUgc3RhcnRpbmcgZWxlbWVudAogKiBAcmV0dXJuIHs/fSBUaGUgVE5vZGUgb2YgdGhlIHBhcmVudCBpbmplY3RvcgogKi8KZnVuY3Rpb24gZ2V0UGFyZW50SW5qZWN0b3JUTm9kZShsb2NhdGlvbiwgc3RhcnRWaWV3LCBzdGFydFROb2RlKSB7CiAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbmplY3RvciBvbiB0aGUgcGFyZW50IFROb2RlLCByZXRyaWV2ZSB0aGUgVE5vZGUgZm9yIHRoYXQgaW5qZWN0b3IuCiAgICBpZiAoc3RhcnRUTm9kZS5wYXJlbnQgJiYgc3RhcnRUTm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAvLyB2aWV3IG9mZnNldCBpcyAwCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluamVjdG9ySW5kZXggPSBzdGFydFROb2RlLnBhcmVudC5pbmplY3RvckluZGV4OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdE5vZGUgPSBzdGFydFROb2RlLnBhcmVudDsKICAgICAgICAvLyBJZiB0Tm9kZS5pbmplY3RvckluZGV4ID09PSB0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCwgdGhlbiB0aGUgaW5kZXggYmVsb25ncyB0byBhIHBhcmVudAogICAgICAgIC8vIGluamVjdG9yLgogICAgICAgIHdoaWxlICh0Tm9kZS5wYXJlbnQgIT0gbnVsbCAmJiBpbmplY3RvckluZGV4ID09IHROb2RlLnBhcmVudC5pbmplY3RvckluZGV4KSB7CiAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdE5vZGU7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdmlld09mZnNldCA9IGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChsb2NhdGlvbik7CiAgICAvLyB2aWV3IG9mZnNldCBpcyAxCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcGFyZW50VmlldyA9IHN0YXJ0VmlldzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChzdGFydFZpZXdbVF9IT1NUXSkpOwogICAgLy8gdmlldyBvZmZzZXQgaXMgc3VwZXJpb3IgdG8gMQogICAgd2hpbGUgKHZpZXdPZmZzZXQgPiAxKSB7CiAgICAgICAgcGFyZW50VmlldyA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddKSk7CiAgICAgICAgcGFyZW50VE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50Vmlld1tUX0hPU1RdKSk7CiAgICAgICAgdmlld09mZnNldC0tOwogICAgfQogICAgcmV0dXJuIHBhcmVudFROb2RlOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgVmlld1JlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2xWaWV3CiAgICAgKiBAcGFyYW0gez89fSBfY2RSZWZJbmplY3RpbmdWaWV3CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9sVmlldywgX2NkUmVmSW5qZWN0aW5nVmlldykgewogICAgICAgIHRoaXMuX2xWaWV3ID0gX2xWaWV3OwogICAgICAgIHRoaXMuX2NkUmVmSW5qZWN0aW5nVmlldyA9IF9jZFJlZkluamVjdGluZ1ZpZXc7CiAgICAgICAgdGhpcy5fYXBwUmVmID0gbnVsbDsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdFZpZXdOb2RlID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJvb3ROb2RlcygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSB0aGlzLl9sVmlldzsKICAgICAgICBpZiAobFZpZXdbSE9TVF0gPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhvc3RUVmlldyA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tUX0hPU1RdKSk7CiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0TmF0aXZlTm9kZXMobFZpZXdbVFZJRVddLCBsVmlldywgaG9zdFRWaWV3LmNoaWxkLCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNvbnRleHQoKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLl9sVmlld1tDT05URVhUXSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGVzdHJveWVkKCkgewogICAgICAgIHJldHVybiAodGhpcy5fbFZpZXdbRkxBR1NdICYgMjU2IC8qIERlc3Ryb3llZCAqLykgPT09IDI1NiAvKiBEZXN0cm95ZWQgKi87CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX2FwcFJlZikgewogICAgICAgICAgICB0aGlzLl9hcHBSZWYuZGV0YWNoVmlldyh0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmlld0NvbnRhaW5lclJlZikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMpOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBudWxsOwogICAgICAgIH0KICAgICAgICBkZXN0cm95TFZpZXcodGhpcy5fbFZpZXdbVFZJRVddLCB0aGlzLl9sVmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgIHN0b3JlQ2xlYW51cEZuKHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcsIGNhbGxiYWNrKTsKICAgIH0KICAgIC8qKgogICAgICogTWFya3MgYSB2aWV3IGFuZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyBkaXJ0eS4KICAgICAqCiAgICAgKiBJdCBhbHNvIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gYnkgY2FsbGluZyBgc2NoZWR1bGVUaWNrYCBpbnRlcm5hbGx5LCB3aGljaCBjb2FsZXNjZXMKICAgICAqIG11bHRpcGxlIGBtYXJrRm9yQ2hlY2tgIGNhbGxzIHRvIGludG8gb25lIGNoYW5nZSBkZXRlY3Rpb24gcnVuLgogICAgICoKICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW5zdXJlIGFuIHtcQGxpbmsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kjT25QdXNoIE9uUHVzaH0gY29tcG9uZW50IGlzCiAgICAgKiBjaGVja2VkIHdoZW4gaXQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQgYnV0IHRoZSB0d28gbm9ybWFsIHRyaWdnZXJzIGhhdmVuJ3QgbWFya2VkIGl0CiAgICAgKiBkaXJ0eSAoaS5lLiBpbnB1dHMgaGF2ZW4ndCBjaGFuZ2VkIGFuZCBldmVudHMgaGF2ZW4ndCBmaXJlZCBpbiB0aGUgdmlldykuCiAgICAgKgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBPblB1c2ggY29tcG9uZW50cyAtLT4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogXEBDb21wb25lbnQoewogICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsCiAgICAgKiAgIHRlbXBsYXRlOiBgTnVtYmVyIG9mIHRpY2tzOiB7e251bWJlck9mVGlja3N9fWAKICAgICAqICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgKiB9KQogICAgICogY2xhc3MgQXBwQ29tcG9uZW50IHsKICAgICAqICAgbnVtYmVyT2ZUaWNrcyA9IDA7CiAgICAgKgogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAqICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgKiAgICAgICB0aGlzLm51bWJlck9mVGlja3MrKzsKICAgICAqICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgcmVxdWlyZWQsIG90aGVyd2lzZSB0aGUgdmlldyB3aWxsIG5vdCBiZSB1cGRhdGVkCiAgICAgKiAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAqICAgICB9LCAxMDAwKTsKICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXJrRm9yQ2hlY2soKSB7CiAgICAgICAgbWFya1ZpZXdEaXJ0eSh0aGlzLl9jZFJlZkluamVjdGluZ1ZpZXcgfHwgdGhpcy5fbFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyB0aGUgdmlldyBmcm9tIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyZWUuCiAgICAgKgogICAgICogRGV0YWNoZWQgdmlld3Mgd2lsbCBub3QgYmUgY2hlY2tlZCBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbiBydW5zIHVudGlsIHRoZXkgYXJlCiAgICAgKiByZS1hdHRhY2hlZCwgZXZlbiBpZiB0aGV5IGFyZSBkaXJ0eS4gYGRldGFjaGAgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAogICAgICoge1xAbGluayBDaGFuZ2VEZXRlY3RvclJlZiNkZXRlY3RDaGFuZ2VzIGRldGVjdENoYW5nZXN9IHRvIGltcGxlbWVudCBsb2NhbCBjaGFuZ2UKICAgICAqIGRldGVjdGlvbiBjaGVja3MuCiAgICAgKgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaXZlIGRlbW8gb25jZSByZWYuZGV0ZWN0Q2hhbmdlcyBpcyBtZXJnZWQgaW50byBtYXN0ZXIgLS0+CiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY29tcG9uZW50IHdpdGggYSBsYXJnZSBsaXN0IG9mIHJlYWRvbmx5IGRhdGEuCiAgICAgKiBJbWFnaW5lIHRoZSBkYXRhIGNoYW5nZXMgY29uc3RhbnRseSwgbWFueSB0aW1lcyBwZXIgc2Vjb25kLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKICAgICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZwogICAgICogdGhlIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3RvciBhbmQgZG9pbmcgYSBsb2NhbCBjaGVjayBldmVyeSBmaXZlIHNlY29uZHMuCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogY2xhc3MgRGF0YVByb3ZpZGVyIHsKICAgICAqICAgLy8gaW4gYSByZWFsIGFwcGxpY2F0aW9uIHRoZSByZXR1cm5lZCBkYXRhIHdpbGwgYmUgZGlmZmVyZW50IGV2ZXJ5IHRpbWUKICAgICAqICAgZ2V0IGRhdGEoKSB7CiAgICAgKiAgICAgcmV0dXJuIFsxLDIsMyw0LDVdOwogICAgICogICB9CiAgICAgKiB9CiAgICAgKgogICAgICogXEBDb21wb25lbnQoewogICAgICogICBzZWxlY3RvcjogJ2dpYW50LWxpc3QnLAogICAgICogICB0ZW1wbGF0ZTogYAogICAgICogICAgIDxsaSAqbmdGb3I9ImxldCBkIG9mIGRhdGFQcm92aWRlci5kYXRhIj5EYXRhIHt7ZH19PC9saT4KICAgICAqICAgYCwKICAgICAqIH0pCiAgICAgKiBjbGFzcyBHaWFudExpc3QgewogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIpIHsKICAgICAqICAgICByZWYuZGV0YWNoKCk7CiAgICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICogICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgICogICAgIH0sIDUwMDApOwogICAgICogICB9CiAgICAgKiB9CiAgICAgKiAgLwogICAgICogICBzZWxlY3RvcjogJ2FwcCcsCiAgICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgICAgPGdpYW50LWxpc3Q+PGdpYW50LWxpc3Q+CiAgICAgKiAgIGAsCiAgICAgKiB9KQogICAgICogY2xhc3MgQXBwIHsKICAgICAqIH0KICAgICAqIGBgYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGV0YWNoKCkgewogICAgICAgIHRoaXMuX2xWaWV3W0ZMQUdTXSAmPSB+MTI4IC8qIEF0dGFjaGVkICovOwogICAgfQogICAgLyoqCiAgICAgKiBSZS1hdHRhY2hlcyBhIHZpZXcgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS4KICAgICAqCiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlLWF0dGFjaCB2aWV3cyB0aGF0IHdlcmUgcHJldmlvdXNseSBkZXRhY2hlZCBmcm9tIHRoZSB0cmVlCiAgICAgKiB1c2luZyB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9LiBWaWV3cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHRyZWUgYnkgZGVmYXVsdC4KICAgICAqCiAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+CiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IGRpc3BsYXlpbmcgYGxpdmVgIGRhdGEuIFRoZSBjb21wb25lbnQgd2lsbCBkZXRhY2gKICAgICAqIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZSB3aGVuIHRoZSBjb21wb25lbnQncyBsaXZlIHByb3BlcnR5CiAgICAgKiBpcyBzZXQgdG8gZmFsc2UuCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogY2xhc3MgRGF0YVByb3ZpZGVyIHsKICAgICAqICAgZGF0YSA9IDE7CiAgICAgKgogICAgICogICBjb25zdHJ1Y3RvcigpIHsKICAgICAqICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgKiAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgKiAyOwogICAgICogICAgIH0sIDUwMCk7CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqCiAgICAgKiBcQENvbXBvbmVudCh7CiAgICAgKiAgIHNlbGVjdG9yOiAnbGl2ZS1kYXRhJywKICAgICAqICAgaW5wdXRzOiBbJ2xpdmUnXSwKICAgICAqICAgdGVtcGxhdGU6ICdEYXRhOiB7e2RhdGFQcm92aWRlci5kYXRhfX0nCiAgICAgKiB9KQogICAgICogY2xhc3MgTGl2ZURhdGEgewogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIpIHt9CiAgICAgKgogICAgICogICBzZXQgbGl2ZSh2YWx1ZSkgewogICAgICogICAgIGlmICh2YWx1ZSkgewogICAgICogICAgICAgdGhpcy5yZWYucmVhdHRhY2goKTsKICAgICAqICAgICB9IGVsc2UgewogICAgICogICAgICAgdGhpcy5yZWYuZGV0YWNoKCk7CiAgICAgKiAgICAgfQogICAgICogICB9CiAgICAgKiB9CiAgICAgKiAgLwogICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsCiAgICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgICAgTGl2ZSBVcGRhdGU6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgWyhuZ01vZGVsKV09ImxpdmUiPgogICAgICogICAgIDxsaXZlLWRhdGEgW2xpdmVdPSJsaXZlIj48bGl2ZS1kYXRhPgogICAgICogICBgLAogICAgICogfSkKICAgICAqIGNsYXNzIEFwcENvbXBvbmVudCB7CiAgICAgKiAgIGxpdmUgPSB0cnVlOwogICAgICogfQogICAgICogYGBgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWF0dGFjaCgpIHsKICAgICAgICB0aGlzLl9sVmlld1tGTEFHU10gfD0gMTI4IC8qIEF0dGFjaGVkICovOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVja3MgdGhlIHZpZXcgYW5kIGl0cyBjaGlsZHJlbi4KICAgICAqCiAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9IHRvIGltcGxlbWVudAogICAgICogbG9jYWwgY2hhbmdlIGRldGVjdGlvbiBjaGVja3MuCiAgICAgKgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaXZlIGRlbW8gb25jZSByZWYuZGV0ZWN0Q2hhbmdlcyBpcyBtZXJnZWQgaW50byBtYXN0ZXIgLS0+CiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY29tcG9uZW50IHdpdGggYSBsYXJnZSBsaXN0IG9mIHJlYWRvbmx5IGRhdGEuCiAgICAgKiBJbWFnaW5lLCB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCiAgICAgKiB3ZSB3YW50IHRvIGNoZWNrIGFuZCB1cGRhdGUgdGhlIGxpc3QgZXZlcnkgZml2ZSBzZWNvbmRzLgogICAgICoKICAgICAqIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZyB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb24KICAgICAqIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy4KICAgICAqCiAgICAgKiBTZWUge1xAbGluayBDaGFuZ2VEZXRlY3RvclJlZiNkZXRhY2ggZGV0YWNofSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRldGVjdENoYW5nZXMoKSB7CiAgICAgICAgZGV0ZWN0Q2hhbmdlc0ludGVybmFsKHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcsIHRoaXMuY29udGV4dCk7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB0aGUgY2hhbmdlIGRldGVjdG9yIGFuZCBpdHMgY2hpbGRyZW4sIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlIGRldGVjdGVkLgogICAgICoKICAgICAqIFRoaXMgaXMgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlIHRvIHZlcmlmeSB0aGF0IHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0CiAgICAgKiBpbnRyb2R1Y2Ugb3RoZXIgY2hhbmdlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNoZWNrTm9DaGFuZ2VzKCkgewogICAgICAgIGNoZWNrTm9DaGFuZ2VzSW50ZXJuYWwodGhpcy5fbFZpZXdbVFZJRVddLCB0aGlzLl9sVmlldywgdGhpcy5jb250ZXh0KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2Y1JlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKHZjUmVmKSB7CiAgICAgICAgaWYgKHRoaXMuX2FwcFJlZikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBBcHBsaWNhdGlvblJlZiEnKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IHZjUmVmOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2hGcm9tQXBwUmVmKCkgewogICAgICAgIHRoaXMuX2FwcFJlZiA9IG51bGw7CiAgICAgICAgcmVuZGVyRGV0YWNoVmlldyh0aGlzLl9sVmlld1tUVklFV10sIHRoaXMuX2xWaWV3KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhcHBSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGF0dGFjaFRvQXBwUmVmKGFwcFJlZikgewogICAgICAgIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyIScpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9hcHBSZWYgPSBhcHBSZWY7CiAgICB9Cn0KLyoqCiAqIFxAaW50ZXJuYWwKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIFJvb3RWaWV3UmVmIGV4dGVuZHMgVmlld1JlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXcKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXcpIHsKICAgICAgICBzdXBlcihfdmlldyk7CiAgICAgICAgdGhpcy5fdmlldyA9IF92aWV3OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRlY3RDaGFuZ2VzKCkgewogICAgICAgIGRldGVjdENoYW5nZXNJblJvb3RWaWV3KHRoaXMuX3ZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGVja05vQ2hhbmdlcygpIHsKICAgICAgICBjaGVja05vQ2hhbmdlc0luUm9vdFZpZXcodGhpcy5fdmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250ZXh0KCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHJlc3VsdAogKiBAcGFyYW0gez89fSBpc1Byb2plY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbGxlY3ROYXRpdmVOb2Rlcyh0VmlldywgbFZpZXcsIHROb2RlLCByZXN1bHQsIGlzUHJvamVjdGlvbiA9IGZhbHNlKSB7CiAgICB3aGlsZSAodE5vZGUgIT09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovLCA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8sIDUgLyogSWN1Q29udGFpbmVyICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbE5vZGUgPSBsVmlld1t0Tm9kZS5pbmRleF07CiAgICAgICAgaWYgKGxOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVud3JhcFJOb2RlKGxOb2RlKSk7CiAgICAgICAgfQogICAgICAgIC8vIEEgZ2l2ZW4gbE5vZGUgY2FuIHJlcHJlc2VudCBlaXRoZXIgYSBuYXRpdmUgbm9kZSBvciBhIExDb250YWluZXIgKHdoZW4gaXQgaXMgYSBob3N0IG9mIGEKICAgICAgICAvLyBWaWV3Q29udGFpbmVyUmVmKS4gV2hlbiB3ZSBmaW5kIGEgTENvbnRhaW5lciB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50byBpdCB0byBjb2xsZWN0IHJvb3Qgbm9kZXMKICAgICAgICAvLyBmcm9tIHRoZSB2aWV3cyBpbiB0aGlzIGNvbnRhaW5lci4KICAgICAgICBpZiAoaXNMQ29udGFpbmVyKGxOb2RlKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQ7IGkgPCBsTm9kZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbFZpZXdJbkFDb250YWluZXIgPSBsTm9kZVtpXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGxWaWV3Rmlyc3RDaGlsZFROb2RlID0gbFZpZXdJbkFDb250YWluZXJbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgICAgICBpZiAobFZpZXdGaXJzdENoaWxkVE5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TmF0aXZlTm9kZXMobFZpZXdJbkFDb250YWluZXJbVFZJRVddLCBsVmlld0luQUNvbnRhaW5lciwgbFZpZXdGaXJzdENoaWxkVE5vZGUsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlVHlwZSA9IHROb2RlLnR5cGU7CiAgICAgICAgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgY29sbGVjdE5hdGl2ZU5vZGVzKHRWaWV3LCBsVmlldywgdE5vZGUuY2hpbGQsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlVHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRIb3N0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFZpZXdbVF9IT1NUXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudFZpZXcgPSBnZXRMVmlld1BhcmVudChjb21wb25lbnRWaWV3KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZmlyc3RQcm9qZWN0ZWROb2RlID0gKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRIb3N0LnByb2plY3Rpb24pKSlbKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLnByb2plY3Rpb24pKV07CiAgICAgICAgICAgIGlmIChmaXJzdFByb2plY3RlZE5vZGUgIT09IG51bGwgJiYgcGFyZW50VmlldyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29sbGVjdE5hdGl2ZU5vZGVzKHBhcmVudFZpZXdbVFZJRVddLCBwYXJlbnRWaWV3LCBmaXJzdFByb2plY3RlZE5vZGUsIHJlc3VsdCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdE5vZGUgPSBpc1Byb2plY3Rpb24gPyB0Tm9kZS5wcm9qZWN0aW9uTmV4dCA6IHROb2RlLm5leHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3ZpZXdfZW5naW5lX2NvbXBhdGliaWxpdHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENyZWF0ZXMgYW4gRWxlbWVudFJlZiBmcm9tIHRoZSBtb3N0IHJlY2VudCBub2RlLgogKgogKiBAcGFyYW0gez99IEVsZW1lbnRSZWZUb2tlbgogKiBAcmV0dXJuIHs/fSBUaGUgRWxlbWVudFJlZiBpbnN0YW5jZSB0byB1c2UKICovCmZ1bmN0aW9uIGluamVjdEVsZW1lbnRSZWYoRWxlbWVudFJlZlRva2VuKSB7CiAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBnZXRMVmlldygpKTsKfQovKiogQHR5cGUgez99ICovCmxldCBSM0VsZW1lbnRSZWY7Ci8qKgogKiBDcmVhdGVzIGFuIEVsZW1lbnRSZWYgZ2l2ZW4gYSBub2RlLgogKgogKiBAcGFyYW0gez99IEVsZW1lbnRSZWZUb2tlbiBUaGUgRWxlbWVudFJlZiB0eXBlCiAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIG5vZGUgZm9yIHdoaWNoIHlvdSdkIGxpa2UgYW4gRWxlbWVudFJlZgogKiBAcGFyYW0gez99IHZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncwogKiBAcmV0dXJuIHs/fSBUaGUgRWxlbWVudFJlZiBpbnN0YW5jZSB0byB1c2UKICovCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZlRva2VuLCB0Tm9kZSwgdmlldykgewogICAgaWYgKCFSM0VsZW1lbnRSZWYpIHsKICAgICAgICBSM0VsZW1lbnRSZWYgPSBjbGFzcyBFbGVtZW50UmVmIGV4dGVuZHMgRWxlbWVudFJlZlRva2VuIHsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIG5ldyBSM0VsZW1lbnRSZWYoKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIHZpZXcpKSkpOwp9Ci8qKiBAdHlwZSB7P30gKi8KbGV0IFIzVGVtcGxhdGVSZWY7Ci8qKgogKiBDcmVhdGVzIGEgVGVtcGxhdGVSZWYgZ2l2ZW4gYSBub2RlLgogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IFRlbXBsYXRlUmVmVG9rZW4KICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4KICogQHJldHVybiB7P30gVGhlIFRlbXBsYXRlUmVmIGluc3RhbmNlIHRvIHVzZQogKi8KZnVuY3Rpb24gaW5qZWN0VGVtcGxhdGVSZWYoVGVtcGxhdGVSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuKSB7CiAgICByZXR1cm4gY3JlYXRlVGVtcGxhdGVSZWYoVGVtcGxhdGVSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuLCBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgZ2V0TFZpZXcoKSk7Cn0KLyoqCiAqIENyZWF0ZXMgYSBUZW1wbGF0ZVJlZiBhbmQgc3RvcmVzIGl0IG9uIHRoZSBpbmplY3Rvci4KICoKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBUZW1wbGF0ZVJlZlRva2VuIFRoZSBUZW1wbGF0ZVJlZiB0eXBlCiAqIEBwYXJhbSB7P30gRWxlbWVudFJlZlRva2VuIFRoZSBFbGVtZW50UmVmIHR5cGUKICogQHBhcmFtIHs/fSBob3N0VE5vZGUgVGhlIG5vZGUgb24gd2hpY2ggYSBUZW1wbGF0ZVJlZiBpcyByZXF1ZXN0ZWQKICogQHBhcmFtIHs/fSBob3N0VmlldyBUaGUgdmlldyB0byB3aGljaCB0aGUgbm9kZSBiZWxvbmdzCiAqIEByZXR1cm4gez99IFRoZSBUZW1wbGF0ZVJlZiBpbnN0YW5jZSBvciBudWxsIGlmIHdlIGNhbid0IGNyZWF0ZSBhIFRlbXBsYXRlUmVmIG9uIGEgZ2l2ZW4gbm9kZSB0eXBlCiAqLwpmdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZlRva2VuLCBFbGVtZW50UmVmVG9rZW4sIGhvc3RUTm9kZSwgaG9zdFZpZXcpIHsKICAgIGlmICghUjNUZW1wbGF0ZVJlZikgewogICAgICAgIFIzVGVtcGxhdGVSZWYgPSBjbGFzcyBUZW1wbGF0ZVJlZiBleHRlbmRzIFRlbXBsYXRlUmVmVG9rZW4gewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfZGVjbGFyYXRpb25WaWV3CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2RlY2xhcmF0aW9uVENvbnRhaW5lcgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKF9kZWNsYXJhdGlvblZpZXcsIF9kZWNsYXJhdGlvblRDb250YWluZXIsIGVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9kZWNsYXJhdGlvblZpZXcgPSBfZGVjbGFyYXRpb25WaWV3OwogICAgICAgICAgICAgICAgdGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyID0gX2RlY2xhcmF0aW9uVENvbnRhaW5lcjsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3JlYXRlRW1iZWRkZWRWaWV3KGNvbnRleHQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkVFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyLnRWaWV3cykpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW1iZWRkZWRMVmlldyA9IGNyZWF0ZUxWaWV3KHRoaXMuX2RlY2xhcmF0aW9uVmlldywgZW1iZWRkZWRUVmlldywgY29udGV4dCwgMTYgLyogQ2hlY2tBbHdheXMgKi8sIG51bGwsIGVtYmVkZGVkVFZpZXcubm9kZSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSB0aGlzLl9kZWNsYXJhdGlvblZpZXdbdGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyLmluZGV4XTsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGRlY2xhcmF0aW9uTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICBlbWJlZGRlZExWaWV3W0RFQ0xBUkFUSU9OX0xDT05UQUlORVJdID0gZGVjbGFyYXRpb25MQ29udGFpbmVyOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMgPSB0aGlzLl9kZWNsYXJhdGlvblZpZXdbUVVFUklFU107CiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZExWaWV3W1FVRVJJRVNdID0gZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMuY3JlYXRlRW1iZWRkZWRWaWV3KGVtYmVkZGVkVFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVuZGVyVmlldyhlbWJlZGRlZFRWaWV3LCBlbWJlZGRlZExWaWV3LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSBuZXcgVmlld1JlZihlbWJlZGRlZExWaWV3KTsKICAgICAgICAgICAgICAgIHZpZXdSZWYuX3RWaWV3Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChlbWJlZGRlZExWaWV3W1RfSE9TVF0pKTsKICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmIChob3N0VE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChob3N0VE5vZGUudFZpZXdzLCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTsKICAgICAgICByZXR1cm4gbmV3IFIzVGVtcGxhdGVSZWYoaG9zdFZpZXcsICgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIGhvc3RUTm9kZSwgaG9zdFZpZXcpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KbGV0IFIzVmlld0NvbnRhaW5lclJlZjsKLyoqCiAqIENyZWF0ZXMgYSBWaWV3Q29udGFpbmVyUmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yLiBPciwgaWYgdGhlIFZpZXdDb250YWluZXJSZWYKICogYWxyZWFkeSBleGlzdHMsIHJldHJpZXZlcyB0aGUgZXhpc3RpbmcgVmlld0NvbnRhaW5lclJlZi4KICoKICogQHBhcmFtIHs/fSBWaWV3Q29udGFpbmVyUmVmVG9rZW4KICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4KICogQHJldHVybiB7P30gVGhlIFZpZXdDb250YWluZXJSZWYgaW5zdGFuY2UgdG8gdXNlCiAqLwpmdW5jdGlvbiBpbmplY3RWaWV3Q29udGFpbmVyUmVmKFZpZXdDb250YWluZXJSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c1ROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpKSk7CiAgICByZXR1cm4gY3JlYXRlQ29udGFpbmVyUmVmKFZpZXdDb250YWluZXJSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuLCBwcmV2aW91c1ROb2RlLCBnZXRMVmlldygpKTsKfQovKioKICogQ3JlYXRlcyBhIFZpZXdDb250YWluZXJSZWYgYW5kIHN0b3JlcyBpdCBvbiB0aGUgaW5qZWN0b3IuCiAqCiAqIEBwYXJhbSB7P30gVmlld0NvbnRhaW5lclJlZlRva2VuIFRoZSBWaWV3Q29udGFpbmVyUmVmIHR5cGUKICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4gVGhlIEVsZW1lbnRSZWYgdHlwZQogKiBAcGFyYW0gez99IGhvc3RUTm9kZSBUaGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBWaWV3Q29udGFpbmVyUmVmCiAqIEBwYXJhbSB7P30gaG9zdFZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncwogKiBAcmV0dXJuIHs/fSBUaGUgVmlld0NvbnRhaW5lclJlZiBpbnN0YW5jZSB0byB1c2UKICovCmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgaG9zdFROb2RlLCBob3N0VmlldykgewogICAgaWYgKCFSM1ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICBSM1ZpZXdDb250YWluZXJSZWYgPSBjbGFzcyBWaWV3Q29udGFpbmVyUmVmIGV4dGVuZHMgVmlld0NvbnRhaW5lclJlZlRva2VuIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2xDb250YWluZXIKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfaG9zdFROb2RlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2hvc3RWaWV3CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdHJ1Y3RvcihfbENvbnRhaW5lciwgX2hvc3RUTm9kZSwgX2hvc3RWaWV3KSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgdGhpcy5fbENvbnRhaW5lciA9IF9sQ29udGFpbmVyOwogICAgICAgICAgICAgICAgdGhpcy5faG9zdFROb2RlID0gX2hvc3RUTm9kZTsKICAgICAgICAgICAgICAgIHRoaXMuX2hvc3RWaWV3ID0gX2hvc3RWaWV3OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0IGVsZW1lbnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIHRoaXMuX2hvc3RUTm9kZSwgdGhpcy5faG9zdFZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXQgcGFyZW50SW5qZWN0b3IoKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRMb2NhdGlvbiA9IGdldFBhcmVudEluamVjdG9yTG9jYXRpb24odGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRWaWV3ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3KHBhcmVudExvY2F0aW9uLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUTm9kZSA9IGdldFBhcmVudEluamVjdG9yVE5vZGUocGFyZW50TG9jYXRpb24sIHRoaXMuX2hvc3RWaWV3LCB0aGlzLl9ob3N0VE5vZGUpOwogICAgICAgICAgICAgICAgcmV0dXJuICFoYXNQYXJlbnRJbmplY3RvcihwYXJlbnRMb2NhdGlvbikgfHwgcGFyZW50VE5vZGUgPT0gbnVsbCA/CiAgICAgICAgICAgICAgICAgICAgbmV3IE5vZGVJbmplY3RvcihudWxsLCB0aGlzLl9ob3N0VmlldykgOgogICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlSW5qZWN0b3IocGFyZW50VE5vZGUsIHBhcmVudFZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhpcy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0KGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdICE9PSBudWxsICYmICgvKiogQHR5cGUgez99ICovICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10pKVtpbmRleF0gfHwgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lci5sZW5ndGggLSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHRlbXBsYXRlIEMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0CiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGVSZWYsIGNvbnRleHQsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGVtcGxhdGVSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KGNvbnRleHQgfHwgKC8qKiBAdHlwZSB7P30gKi8gKHt9KSkpOwogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQodmlld1JlZiwgaW5kZXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdSZWY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50RmFjdG9yeQogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleAogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmplY3RvcgogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlUmVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgaW5kZXgsIGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzLCBuZ01vZHVsZVJlZikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGV4dEluamVjdG9yID0gaW5qZWN0b3IgfHwgdGhpcy5wYXJlbnRJbmplY3RvcjsKICAgICAgICAgICAgICAgIGlmICghbmdNb2R1bGVSZWYgJiYgKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRGYWN0b3J5KSkpLm5nTW9kdWxlID09IG51bGwgJiYgY29udGV4dEluamVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRE8gTk9UIFJFRkFDVE9SLiBUaGUgY29kZSBoZXJlIHVzZWQgdG8gaGF2ZSBhIGB2YWx1ZSB8fCB1bmRlZmluZWRgIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBzZWVtcyB0byBjYXVzZSBpbnRlcm5hbCBnb29nbGUgYXBwcyB0byBmYWlsLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGludGVybmFsIGJ1ZyBpc3N1ZTogZ28vYi8xNDI5Njc4MDIKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dEluamVjdG9yLmdldChOZ01vZHVsZVJlZiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZVJlZiA9IHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShjb250ZXh0SW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHVuZGVmaW5lZCwgbmdNb2R1bGVSZWYpOwogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoY29tcG9uZW50UmVmLmhvc3RWaWV3LCBpbmRleCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWYKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGluc2VydCh2aWV3UmVmLCBpbmRleCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh2aWV3UmVmKSkpLl9sVmlldykpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBpZiAodmlld1JlZi5kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbnNlcnQgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmFsbG9jYXRlQ29udGFpbmVySWZOZWVkZWQoKTsKICAgICAgICAgICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NvbnRhaW5lcihsVmlldykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQsIGRldGFjaCBpdCBmaXJzdCBzbyB3ZSBjbGVhbiB1cCByZWZlcmVuY2VzIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZJZHggPSB0aGlzLmluZGV4T2Yodmlld1JlZik7CiAgICAgICAgICAgICAgICAgICAgLy8gQSB2aWV3IG1pZ2h0IGJlIGF0dGFjaGVkIGVpdGhlciB0byB0aGlzIG9yIGEgZGlmZmVyZW50IGNvbnRhaW5lci4gVGhlIGBwcmV2SWR4YCBmb3IKICAgICAgICAgICAgICAgICAgICAvLyB0aG9zZSBjYXNlcyB3aWxsIGJlOgogICAgICAgICAgICAgICAgICAgIC8vIGVxdWFsIHRvIC0xIGZvciB2aWV3cyBhdHRhY2hlZCB0byB0aGlzIFZpZXdDb250YWluZXJSZWYKICAgICAgICAgICAgICAgICAgICAvLyA+PSAwIGZvciB2aWV3cyBhdHRhY2hlZCB0byBhIGRpZmZlcmVudCBWaWV3Q29udGFpbmVyUmVmCiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZJZHggIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoKHByZXZJZHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2TENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tQQVJFTlRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWwoaXNMQ29udGFpbmVyKHByZXZMQ29udGFpbmVyKSwgdHJ1ZSwgJ0FuIGF0dGFjaGVkIHZpZXcgc2hvdWxkIGhhdmUgaXRzIFBBUkVOVCBwb2ludCB0byBhIGNvbnRhaW5lci4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZS1jcmVhdGUgYSBSM1ZpZXdDb250YWluZXJSZWYgaW5zdGFuY2Ugc2luY2UgdGhvc2UgYXJlIG5vdCBzdG9yZWQgb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFZpZXcgKG5vciBhbnl3aGVyZSBlbHNlKS4KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VkNSZWYgPSBuZXcgUjNWaWV3Q29udGFpbmVyUmVmKHByZXZMQ29udGFpbmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAocHJldkxDb250YWluZXJbVF9IT1NUXSkpLCBwcmV2TENvbnRhaW5lcltQQVJFTlRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJldlZDUmVmLmRldGFjaChwcmV2VkNSZWYuaW5kZXhPZih2aWV3UmVmKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRJZHggPSB0aGlzLl9hZGp1c3RJbmRleChpbmRleCk7CiAgICAgICAgICAgICAgICBpbnNlcnRWaWV3KHRWaWV3LCBsVmlldywgdGhpcy5fbENvbnRhaW5lciwgYWRqdXN0ZWRJZHgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlTm9kZSA9IGdldEJlZm9yZU5vZGVGb3JWaWV3KGFkanVzdGVkSWR4LCB0aGlzLl9sQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGFkZFJlbW92ZVZpZXdGcm9tQ29udGFpbmVyKHRWaWV3LCBsVmlldywgdHJ1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdSZWYpKSkuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKHRoaXMpOwogICAgICAgICAgICAgICAgYWRkVG9BcnJheSgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdKSksIGFkanVzdGVkSWR4LCB2aWV3UmVmKTsKICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWYKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuZXdJbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbW92ZSh2aWV3UmVmLCBuZXdJbmRleCkgewogICAgICAgICAgICAgICAgaWYgKHZpZXdSZWYuZGVzdHJveWVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbW92ZSBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc2VydCh2aWV3UmVmLCBuZXdJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmlld1JlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5kZXhPZih2aWV3UmVmKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmc0FyciA9IHRoaXMuX2xDb250YWluZXJbVklFV19SRUZTXTsKICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmc0FyciAhPT0gbnVsbCA/IHZpZXdSZWZzQXJyLmluZGV4T2Yodmlld1JlZikgOiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlbW92ZShpbmRleCkgewogICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZElkeCA9IHRoaXMuX2FkanVzdEluZGV4KGluZGV4LCAtMSk7CiAgICAgICAgICAgICAgICByZW1vdmVWaWV3KHRoaXMuX2xDb250YWluZXIsIGFkanVzdGVkSWR4KTsKICAgICAgICAgICAgICAgIHJlbW92ZUZyb21BcnJheSgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdKSksIGFkanVzdGVkSWR4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRldGFjaChpbmRleCkgewogICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZElkeCA9IHRoaXMuX2FkanVzdEluZGV4KGluZGV4LCAtMSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gZGV0YWNoVmlldyh0aGlzLl9sQ29udGFpbmVyLCBhZGp1c3RlZElkeCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB3YXNEZXRhY2hlZCA9IHZpZXcgJiYgcmVtb3ZlRnJvbUFycmF5KCgvKiogQHR5cGUgez99ICovICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10pKSwgYWRqdXN0ZWRJZHgpICE9IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gd2FzRGV0YWNoZWQgPyBuZXcgVmlld1JlZigoLyoqIEB0eXBlIHs/fSAqLyAodmlldykpKSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IHNoaWZ0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfYWRqdXN0SW5kZXgoaW5kZXgsIHNoaWZ0ID0gMCkgewogICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggKyBzaGlmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICBhc3NlcnRHcmVhdGVyVGhhbihpbmRleCwgLTEsIGBWaWV3UmVmIGluZGV4IG11c3QgYmUgcG9zaXRpdmUsIGdvdCAke2luZGV4fWApOwogICAgICAgICAgICAgICAgICAgIC8vICsxIGJlY2F1c2UgaXQncyBsZWdhbCB0byBpbnNlcnQgYXQgdGhlIGVuZC4KICAgICAgICAgICAgICAgICAgICBhc3NlcnRMZXNzVGhhbihpbmRleCwgdGhpcy5sZW5ndGggKyAxICsgc2hpZnQsICdpbmRleCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYWxsb2NhdGVDb250YWluZXJJZk5lZWRlZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKGhvc3RUTm9kZSwgMCAvKiBDb250YWluZXIgKi8sIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBsQ29udGFpbmVyOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2xvdFZhbHVlID0gaG9zdFZpZXdbaG9zdFROb2RlLmluZGV4XTsKICAgIGlmIChpc0xDb250YWluZXIoc2xvdFZhbHVlKSkgewogICAgICAgIC8vIElmIHRoZSBob3N0IGlzIGEgY29udGFpbmVyLCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBMQ29udGFpbmVyCiAgICAgICAgbENvbnRhaW5lciA9IHNsb3RWYWx1ZTsKICAgICAgICBzZXRMQ29udGFpbmVyQWN0aXZlSW5kZXgobENvbnRhaW5lciwgLTEgLyogRFlOQU1JQ19FTUJFRERFRF9WSUVXU19PTkxZICovKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY29tbWVudE5vZGU7CiAgICAgICAgLy8gSWYgdGhlIGhvc3QgaXMgYW4gZWxlbWVudCBjb250YWluZXIsIHRoZSBuYXRpdmUgaG9zdCBlbGVtZW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgYQogICAgICAgIC8vIGNvbW1lbnQgYW5kIHdlIGNhbiByZXVzZSB0aGF0IGNvbW1lbnQgYXMgYW5jaG9yIGVsZW1lbnQgZm9yIHRoZSBuZXcgTENvbnRhaW5lci4KICAgICAgICAvLyBUaGUgY29tbWVudCBub2RlIGluIHF1ZXN0aW9uIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NIHN0cnVjdHVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIGFwcGVuZAogICAgICAgIC8vIGl0IGFnYWluLgogICAgICAgIGlmIChob3N0VE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSB7CiAgICAgICAgICAgIGNvbW1lbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHVud3JhcFJOb2RlKHNsb3RWYWx1ZSkpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7CiAgICAgICAgICAgIGNvbW1lbnROb2RlID0gaG9zdFZpZXdbUkVOREVSRVJdLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlID8gJ2NvbnRhaW5lcicgOiAnJyk7CiAgICAgICAgICAgIC8vIEEgYFZpZXdDb250YWluZXJSZWZgIGNhbiBiZSBpbmplY3RlZCBieSB0aGUgcm9vdCAodG9wbW9zdCAvIGJvb3RzdHJhcHBlZCkgY29tcG9uZW50LiBJbgogICAgICAgICAgICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3QgdXNlIFRWaWV3IC8gVE5vZGUgZGF0YSBzdHJ1Y3R1cmVzIHRvIGluc2VydCBjb250YWluZXIncyBtYXJrZXIgbm9kZQogICAgICAgICAgICAvLyAoYm90aCBhIHBhcmVudCBvZiBhIGNvbW1lbnQgbm9kZSBhbmQgdGhlIGNvbW1lbnQgbm9kZSBpdHNlbGYgYXJlIG5vdCBwYXJ0IG9mIGFueSB2aWV3KS4gSW4KICAgICAgICAgICAgLy8gdGhpcyBzcGVjaWZpYyBjYXNlIHdlIHVzZSBsb3ctbGV2ZWwgRE9NIG1hbmlwdWxhdGlvbiB0byBpbnNlcnQgY29udGFpbmVyJ3MgbWFya2VyIChjb21tZW50KQogICAgICAgICAgICAvLyBub2RlLgogICAgICAgICAgICBpZiAoaXNSb290Vmlldyhob3N0VmlldykpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gaG9zdFZpZXdbUkVOREVSRVJdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaG9zdE5hdGl2ZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKGhvc3RUTm9kZSwgaG9zdFZpZXcpKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRPZkhvc3ROYXRpdmUgPSBuYXRpdmVQYXJlbnROb2RlKHJlbmRlcmVyLCBob3N0TmF0aXZlKTsKICAgICAgICAgICAgICAgIG5hdGl2ZUluc2VydEJlZm9yZShyZW5kZXJlciwgKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudE9mSG9zdE5hdGl2ZSkpLCBjb21tZW50Tm9kZSwgbmF0aXZlTmV4dFNpYmxpbmcocmVuZGVyZXIsIGhvc3ROYXRpdmUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkKGhvc3RWaWV3W1RWSUVXXSwgaG9zdFZpZXcsIGNvbW1lbnROb2RlLCBob3N0VE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhvc3RWaWV3W2hvc3RUTm9kZS5pbmRleF0gPSBsQ29udGFpbmVyID0KICAgICAgICAgICAgY3JlYXRlTENvbnRhaW5lcihzbG90VmFsdWUsIGhvc3RWaWV3LCBjb21tZW50Tm9kZSwgaG9zdFROb2RlKTsKICAgICAgICBhZGRUb1ZpZXdUcmVlKGhvc3RWaWV3LCBsQ29udGFpbmVyKTsKICAgIH0KICAgIHJldHVybiBuZXcgUjNWaWV3Q29udGFpbmVyUmVmKGxDb250YWluZXIsIGhvc3RUTm9kZSwgaG9zdFZpZXcpOwp9Ci8qKgogKiBSZXR1cm5zIGEgQ2hhbmdlRGV0ZWN0b3JSZWYgKGEuay5hLiBhIFZpZXdSZWYpCiAqIEBwYXJhbSB7Pz19IGlzUGlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5qZWN0Q2hhbmdlRGV0ZWN0b3JSZWYoaXNQaXBlID0gZmFsc2UpIHsKICAgIHJldHVybiBjcmVhdGVWaWV3UmVmKGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBnZXRMVmlldygpLCBpc1BpcGUpOwp9Ci8qKgogKiBDcmVhdGVzIGEgVmlld1JlZiBhbmQgc3RvcmVzIGl0IG9uIHRoZSBpbmplY3RvciBhcyBDaGFuZ2VEZXRlY3RvclJlZiAocHVibGljIGFsaWFzKS4KICoKICogQHBhcmFtIHs/fSB0Tm9kZSBUaGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBDaGFuZ2VEZXRlY3RvclJlZgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSB2aWV3IHRvIHdoaWNoIHRoZSBub2RlIGJlbG9uZ3MKICogQHBhcmFtIHs/fSBpc1BpcGUgV2hldGhlciB0aGUgdmlldyBpcyBiZWluZyBpbmplY3RlZCBpbnRvIGEgcGlwZS4KICogQHJldHVybiB7P30gVGhlIENoYW5nZURldGVjdG9yUmVmIHRvIHVzZQogKi8KZnVuY3Rpb24gY3JlYXRlVmlld1JlZih0Tm9kZSwgbFZpZXcsIGlzUGlwZSkgewogICAgLy8gYGlzQ29tcG9uZW50Vmlld2Agd2lsbCBiZSB0cnVlIGZvciBDb21wb25lbnQgYW5kIERpcmVjdGl2ZXMgKGJ1dCBub3QgZm9yIFBpcGVzKS4KICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3B1bGwvMzMwNzIgZm9yIHByb3BlciBmaXgKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzQ29tcG9uZW50VmlldyA9ICFpc1BpcGUgJiYgaXNDb21wb25lbnRIb3N0KHROb2RlKTsKICAgIGlmIChpc0NvbXBvbmVudFZpZXcpIHsKICAgICAgICAvLyBUaGUgTFZpZXcgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvbXBvbmVudCBpcyBkZWNsYXJlZC4KICAgICAgICAvLyBJbnN0ZWFkIHdlIHdhbnQgdGhlIExWaWV3IGZvciB0aGUgY29tcG9uZW50IFZpZXcgYW5kIHNvIHdlIG5lZWQgdG8gbG9vayBpdCB1cC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh0Tm9kZS5pbmRleCwgbFZpZXcpOwogICAgICAgIHJldHVybiBuZXcgVmlld1JlZihjb21wb25lbnRWaWV3LCBjb21wb25lbnRWaWV3KTsKICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fCB0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyB8fAogICAgICAgIHROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fCB0Tm9kZS50eXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykgewogICAgICAgIC8vIFRoZSBMVmlldyByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCBmcm9tLgogICAgICAgIC8vIFdlIG5lZWQgdG8gbG9jYXRlIHRoZSBjb250YWluaW5nIExWaWV3IChpbiBjYXNlIHdoZXJlIHRoZSBgbFZpZXdgIGlzIGFuIGVtYmVkZGVkIHZpZXcpCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvc3RDb21wb25lbnRWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgICAgIHJldHVybiBuZXcgVmlld1JlZihob3N0Q29tcG9uZW50VmlldywgbFZpZXcpOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChudWxsKSk7Cn0KLyoqCiAqIFJldHVybnMgYSBSZW5kZXJlcjIgKG9yIHRocm93cyB3aGVuIGFwcGxpY2F0aW9uIHdhcyBib290c3RyYXBwZWQgd2l0aCBSZW5kZXJlcjMpCiAqIEBwYXJhbSB7P30gdmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVSZW5kZXJlcjIodmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSB2aWV3W1JFTkRFUkVSXTsKICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHJlbmRlcmVyKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmplY3QgUmVuZGVyZXIyIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHVzZXMgUmVuZGVyZXIzIScpOwogICAgfQp9Ci8qKgogKiBJbmplY3RzIGEgUmVuZGVyZXIyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3RSZW5kZXJlcjIoKSB7CiAgICAvLyBXZSBuZWVkIHRoZSBSZW5kZXJlciB0byBiZSBiYXNlZCBvbiB0aGUgY29tcG9uZW50IHRoYXQgaXQncyBiZWluZyBpbmplY3RlZCBpbnRvLCBob3dldmVyIHNpbmNlCiAgICAvLyBESSBoYXBwZW5zIGJlZm9yZSB3ZSd2ZSBlbnRlcmVkIGl0cyB2aWV3LCBgZ2V0TFZpZXdgIHdpbGwgcmV0dXJuIHRoZSBwYXJlbnQgdmlldyBpbnN0ZWFkLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVBdEluZGV4ID0gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KHROb2RlLmluZGV4LCBsVmlldyk7CiAgICByZXR1cm4gZ2V0T3JDcmVhdGVSZW5kZXJlcjIoaXNMVmlldyhub2RlQXRJbmRleCkgPyBub2RlQXRJbmRleCA6IGxWaWV3KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBCYXNlIGNsYXNzIGZvciBBbmd1bGFyIFZpZXdzLCBwcm92aWRlcyBjaGFuZ2UgZGV0ZWN0aW9uIGZ1bmN0aW9uYWxpdHkuCiAqIEEgY2hhbmdlLWRldGVjdGlvbiB0cmVlIGNvbGxlY3RzIGFsbCB2aWV3cyB0aGF0IGFyZSB0byBiZSBjaGVja2VkIGZvciBjaGFuZ2VzLgogKiBVc2UgdGhlIG1ldGhvZHMgdG8gYWRkIGFuZCByZW1vdmUgdmlld3MgZnJvbSB0aGUgdHJlZSwgaW5pdGlhdGUgY2hhbmdlLWRldGVjdGlvbiwKICogYW5kIGV4cGxpY2l0bHkgbWFyayB2aWV3cyBhcyBfZGlydHlfLCBtZWFuaW5nIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYW5kIG5lZWQgdG8gYmUgcmVyZW5kZXJlZC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgZGVtb25zdHJhdGUgaG93IHRvIG1vZGlmeSBkZWZhdWx0IGNoYW5nZS1kZXRlY3Rpb24gYmVoYXZpb3IKICogdG8gcGVyZm9ybSBleHBsaWNpdCBkZXRlY3Rpb24gd2hlbiBuZWVkZWQuCiAqCiAqICMjIyBVc2UgYG1hcmtGb3JDaGVjaygpYCB3aXRoIGBDaGVja09uY2VgIHN0cmF0ZWd5CiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHRoZSBgT25QdXNoYCBjaGFuZ2UtZGV0ZWN0aW9uIHN0cmF0ZWd5IGZvciBhIGNvbXBvbmVudAogKiAoYENoZWNrT25jZWAsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGBDaGVja0Fsd2F5c2ApLCB0aGVuIGZvcmNlcyBhIHNlY29uZCBjaGVjawogKiBhZnRlciBhbiBpbnRlcnZhbC4gU2VlIFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0dDNTEyYj9wPXByZXZpZXcpLgogKgogKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvcmUvdHMvY2hhbmdlX2RldGVjdC9jaGFuZ2UtZGV0ZWN0aW9uLnRzIgogKiByZWdpb249Im1hcmstZm9yLWNoZWNrIj48L2NvZGUtZXhhbXBsZT4KICoKICogIyMjIERldGFjaCBjaGFuZ2UgZGV0ZWN0b3IgdG8gbGltaXQgaG93IG9mdGVuIGNoZWNrIG9jY3VycwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkLW9ubHkgZGF0YQogKiB0aGF0IGlzIGV4cGVjdGVkIHRvIGNoYW5nZSBjb25zdGFudGx5LCBtYW55IHRpbWVzIHBlciBzZWNvbmQuCiAqIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdAogKiBsZXNzIG9mdGVuIHRoYW4gdGhlIGNoYW5nZXMgYWN0dWFsbHkgb2NjdXIuIFRvIGRvIHRoYXQsIHdlIGRldGFjaAogKiB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBwZXJmb3JtIGFuIGV4cGxpY2l0IGxvY2FsIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy4KICoKICogPGNvZGUtZXhhbXBsZSBwYXRoPSJjb3JlL3RzL2NoYW5nZV9kZXRlY3QvY2hhbmdlLWRldGVjdGlvbi50cyIgcmVnaW9uPSJkZXRhY2giPjwvY29kZS1leGFtcGxlPgogKgogKgogKiAjIyMgUmVhdHRhY2hpbmcgYSBkZXRhY2hlZCBjb21wb25lbnQKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBjb21wb25lbnQgZGlzcGxheWluZyBsaXZlIGRhdGEuCiAqIFRoZSBjb21wb25lbnQgZGV0YWNoZXMgaXRzIGNoYW5nZSBkZXRlY3RvciBmcm9tIHRoZSBtYWluIGNoYW5nZSBkZXRlY3RvciB0cmVlCiAqIHdoZW4gdGhlIGBsaXZlYCBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UsIGFuZCByZWF0dGFjaGVzIGl0IHdoZW4gdGhlIHByb3BlcnR5CiAqIGJlY29tZXMgdHJ1ZS4KICoKICogPGNvZGUtZXhhbXBsZSBwYXRoPSJjb3JlL3RzL2NoYW5nZV9kZXRlY3QvY2hhbmdlLWRldGVjdGlvbi50cyIgcmVnaW9uPSJyZWF0dGFjaCI+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgQ2hhbmdlRGV0ZWN0b3JSZWYgewp9Ci8qKgogKiBcQGludGVybmFsCiAqIEBub2NvbGxhcHNlCiAqLwpDaGFuZ2VEZXRlY3RvclJlZi5fX05HX0VMRU1FTlRfSURfXyA9ICgvKioKICogQHJldHVybiB7P30KICovCigpID0+IFNXSVRDSF9DSEFOR0VfREVURUNUT1JfUkVGX0ZBQ1RPUlkoKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NIQU5HRV9ERVRFQ1RPUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0Q2hhbmdlRGV0ZWN0b3JSZWY7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NIQU5HRV9ERVRFQ1RPUl9SRUZfRkFDVE9SWSA9IFNXSVRDSF9DSEFOR0VfREVURUNUT1JfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXzsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIEBkZXNjcmlwdGlvbgogKgogKiBSZXByZXNlbnRzIGEgdHlwZSB0aGF0IGEgQ29tcG9uZW50IG9yIG90aGVyIG9iamVjdCBpcyBpbnN0YW5jZXMgb2YuCiAqCiAqIEFuIGV4YW1wbGUgb2YgYSBgVHlwZWAgaXMgYE15Q3VzdG9tQ29tcG9uZW50YCBjbGFzcywgd2hpY2ggaW4gSmF2YVNjcmlwdCBpcyBiZSByZXByZXNlbnRlZCBieQogKiB0aGUgYE15Q3VzdG9tQ29tcG9uZW50YCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHB1YmxpY0FwaQogKi8KY29uc3QgVHlwZSA9IEZ1bmN0aW9uOwpmdW5jdGlvbiBpc1R5cGUodikgewogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBBdHRlbnRpb246IFRoZXNlIHJlZ2V4IGhhcyB0byBob2xkIGV2ZW4gaWYgdGhlIGNvZGUgaXMgbWluaWZpZWQhCiAqLwpjb25zdCBERUxFR0FURV9DVE9SID0gL15mdW5jdGlvblxzK1xTK1woXClccyp7W1xzXFNdK1wuYXBwbHlcKHRoaXMsXHMqYXJndW1lbnRzXCkvOwpjb25zdCBJTkhFUklURURfQ0xBU1MgPSAvXmNsYXNzXHMrW0EtWmEtelxkJF9dKlxzKmV4dGVuZHNccytbXntdK3svOwpjb25zdCBJTkhFUklURURfQ0xBU1NfV0lUSF9DVE9SID0gL15jbGFzc1xzK1tBLVphLXpcZCRfXSpccypleHRlbmRzXHMrW157XSt7W1xzXFNdKmNvbnN0cnVjdG9yXHMqXCgvOwpjb25zdCBJTkhFUklURURfQ0xBU1NfV0lUSF9ERUxFR0FURV9DVE9SID0gL15jbGFzc1xzK1tBLVphLXpcZCRfXSpccypleHRlbmRzXHMrW157XSt7W1xzXFNdKmNvbnN0cnVjdG9yXHMqXChcKVxzKntccytzdXBlclwoXC5cLlwuYXJndW1lbnRzXCkvOwovKioKICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdHJpbmdpZmllZCB0eXBlIGlzIGEgY2xhc3Mgd2hpY2ggZGVsZWdhdGVzIGl0cyBjb25zdHJ1Y3RvcgogKiB0byBpdHMgcGFyZW50LgogKgogKiBUaGlzIGlzIG5vdCB0cml2aWFsIHNpbmNlIGNvbXBpbGVkIGNvZGUgY2FuIGFjdHVhbGx5IGNvbnRhaW4gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiBldmVuIGlmIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSBkaWQgbm90LiBGb3IgaW5zdGFuY2UsIHdoZW4gdGhlIGNoaWxkIGNsYXNzIGNvbnRhaW5zCiAqIGFuIGluaXRpYWxpemVkIGluc3RhbmNlIHByb3BlcnR5LgogKi8KZnVuY3Rpb24gaXNEZWxlZ2F0ZUN0b3IodHlwZVN0cikgewogICAgcmV0dXJuIERFTEVHQVRFX0NUT1IudGVzdCh0eXBlU3RyKSB8fCBJTkhFUklURURfQ0xBU1NfV0lUSF9ERUxFR0FURV9DVE9SLnRlc3QodHlwZVN0cikgfHwKICAgICAgICAoSU5IRVJJVEVEX0NMQVNTLnRlc3QodHlwZVN0cikgJiYgIUlOSEVSSVRFRF9DTEFTU19XSVRIX0NUT1IudGVzdCh0eXBlU3RyKSk7Cn0KY2xhc3MgUmVmbGVjdGlvbkNhcGFiaWxpdGllcyB7CiAgICBjb25zdHJ1Y3RvcihyZWZsZWN0KSB7CiAgICAgICAgdGhpcy5fcmVmbGVjdCA9IHJlZmxlY3QgfHwgX2dsb2JhbFsnUmVmbGVjdCddOwogICAgfQogICAgaXNSZWZsZWN0aW9uRW5hYmxlZCgpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZhY3RvcnkodCkgewogICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gbmV3IHQoLi4uYXJncyk7CiAgICB9CiAgICAvKiogQGludGVybmFsICovCiAgICBfemlwVHlwZXNBbmRBbm5vdGF0aW9ucyhwYXJhbVR5cGVzLCBwYXJhbUFubm90YXRpb25zKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBpZiAodHlwZW9mIHBhcmFtVHlwZXMgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ld0FycmF5KHBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ld0FycmF5KHBhcmFtVHlwZXMubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gVFMgb3V0cHV0cyBPYmplY3QgZm9yIHBhcmFtZXRlcnMgd2l0aG91dCB0eXBlcywgd2hpbGUgVHJhY2V1ciBvbWl0cwogICAgICAgICAgICAvLyB0aGUgYW5ub3RhdGlvbnMuIEZvciBub3cgd2UgcHJlc2VydmUgdGhlIFRyYWNldXIgYmVoYXZpb3IgdG8gYWlkCiAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiwgYnV0IHRoaXMgY2FuIGJlIHJldmlzaXRlZC4KICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1UeXBlc1tpXSAmJiBwYXJhbVR5cGVzW2ldICE9IE9iamVjdCkgewogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW3BhcmFtVHlwZXNbaV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtQW5ub3RhdGlvbnMgJiYgcGFyYW1Bbm5vdGF0aW9uc1tpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXN1bHRbaV0uY29uY2F0KHBhcmFtQW5ub3RhdGlvbnNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfb3duUGFyYW1ldGVycyh0eXBlLCBwYXJlbnRDdG9yKSB7CiAgICAgICAgY29uc3QgdHlwZVN0ciA9IHR5cGUudG9TdHJpbmcoKTsKICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRlY29yYXRvcnMsIHdlIG9ubHkgaGF2ZSBmdW5jdGlvbi5sZW5ndGggYXMgbWV0YWRhdGEuCiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0byBkZXRlY3Qgd2hldGhlciBhIGNoaWxkIGNsYXNzIGRlY2xhcmVkIGFuIG93biBjb25zdHJ1Y3RvciBvciBub3QsCiAgICAgICAgLy8gd2UgbmVlZCB0byBsb29rIGluc2lkZSBvZiB0aGF0IGNvbnN0cnVjdG9yIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMKICAgICAgICAvLyBqdXN0IGNhbGxpbmcgdGhlIHBhcmVudC4KICAgICAgICAvLyBUaGlzIGFsc28gaGVscHMgdG8gd29yayBhcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTI0MzkKICAgICAgICAvLyB0aGF0IHNldHMgJ2Rlc2lnbjpwYXJhbXR5cGVzJyB0byBbXQogICAgICAgIC8vIGlmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzIGJ1dCBoYXMgbm8gY3RvciBkZWNsYXJlZCBpdHNlbGYuCiAgICAgICAgaWYgKGlzRGVsZWdhdGVDdG9yKHR5cGVTdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBQcmVmZXIgdGhlIGRpcmVjdCBBUEkuCiAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVycyAmJiB0eXBlLnBhcmFtZXRlcnMgIT09IHBhcmVudEN0b3IucGFyYW1ldGVycykgewogICAgICAgICAgICByZXR1cm4gdHlwZS5wYXJhbWV0ZXJzOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy4KICAgICAgICBjb25zdCB0c2lja2xlQ3RvclBhcmFtcyA9IHR5cGUuY3RvclBhcmFtZXRlcnM7CiAgICAgICAgaWYgKHRzaWNrbGVDdG9yUGFyYW1zICYmIHRzaWNrbGVDdG9yUGFyYW1zICE9PSBwYXJlbnRDdG9yLmN0b3JQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIC8vIE5ld2VyIHRzaWNrbGUgdXNlcyBhIGZ1bmN0aW9uIGNsb3N1cmUKICAgICAgICAgICAgLy8gUmV0YWluIHRoZSBub24tZnVuY3Rpb24gY2FzZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRzaWNrbGUKICAgICAgICAgICAgY29uc3QgY3RvclBhcmFtZXRlcnMgPSB0eXBlb2YgdHNpY2tsZUN0b3JQYXJhbXMgPT09ICdmdW5jdGlvbicgPyB0c2lja2xlQ3RvclBhcmFtcygpIDogdHNpY2tsZUN0b3JQYXJhbXM7CiAgICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBjdG9yUGFyYW1ldGVycy5tYXAoKGN0b3JQYXJhbSkgPT4gY3RvclBhcmFtICYmIGN0b3JQYXJhbS50eXBlKTsKICAgICAgICAgICAgY29uc3QgcGFyYW1Bbm5vdGF0aW9ucyA9IGN0b3JQYXJhbWV0ZXJzLm1hcCgoY3RvclBhcmFtKSA9PiBjdG9yUGFyYW0gJiYgY29udmVydFRzaWNrbGVEZWNvcmF0b3JJbnRvTWV0YWRhdGEoY3RvclBhcmFtLmRlY29yYXRvcnMpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ppcFR5cGVzQW5kQW5ub3RhdGlvbnMocGFyYW1UeXBlcywgcGFyYW1Bbm5vdGF0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy4KICAgICAgICBjb25zdCBwYXJhbUFubm90YXRpb25zID0gdHlwZS5oYXNPd25Qcm9wZXJ0eShQQVJBTUVURVJTKSAmJiB0eXBlW1BBUkFNRVRFUlNdOwogICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSB0aGlzLl9yZWZsZWN0ICYmIHRoaXMuX3JlZmxlY3QuZ2V0T3duTWV0YWRhdGEgJiYKICAgICAgICAgICAgdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnZGVzaWduOnBhcmFtdHlwZXMnLCB0eXBlKTsKICAgICAgICBpZiAocGFyYW1UeXBlcyB8fCBwYXJhbUFubm90YXRpb25zKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvLyBJZiBhIGNsYXNzIGhhcyBubyBkZWNvcmF0b3JzLCBhdCBsZWFzdCBjcmVhdGUgbWV0YWRhdGEKICAgICAgICAvLyBiYXNlZCBvbiBmdW5jdGlvbi5sZW5ndGguCiAgICAgICAgLy8gTm90ZTogV2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIGNvbnN0cnVjdG9yIGFzIHdlIGNoZWNrZWQKICAgICAgICAvLyB0aGUgY29udGVudCBvZiB0aGUgY29uc3RydWN0b3IgYWJvdmUuCiAgICAgICAgcmV0dXJuIG5ld0FycmF5KHR5cGUubGVuZ3RoKTsKICAgIH0KICAgIHBhcmFtZXRlcnModHlwZSkgewogICAgICAgIC8vIE5vdGU6IG9ubHkgcmVwb3J0IG1ldGFkYXRhIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNsYXNzIGRlY29yYXRvcgogICAgICAgIC8vIHRvIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBzdGF0aWMgcmVmbGVjdG9yLgogICAgICAgIGlmICghaXNUeXBlKHR5cGUpKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyZW50Q3RvciA9IGdldFBhcmVudEN0b3IodHlwZSk7CiAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSB0aGlzLl9vd25QYXJhbWV0ZXJzKHR5cGUsIHBhcmVudEN0b3IpOwogICAgICAgIGlmICghcGFyYW1ldGVycyAmJiBwYXJlbnRDdG9yICE9PSBPYmplY3QpIHsKICAgICAgICAgICAgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycyhwYXJlbnRDdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMgfHwgW107CiAgICB9CiAgICBfb3duQW5ub3RhdGlvbnModHlwZU9yRnVuYywgcGFyZW50Q3RvcikgewogICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS4KICAgICAgICBpZiAodHlwZU9yRnVuYy5hbm5vdGF0aW9ucyAmJiB0eXBlT3JGdW5jLmFubm90YXRpb25zICE9PSBwYXJlbnRDdG9yLmFubm90YXRpb25zKSB7CiAgICAgICAgICAgIGxldCBhbm5vdGF0aW9ucyA9IHR5cGVPckZ1bmMuYW5ub3RhdGlvbnM7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYW5ub3RhdGlvbnMgPT09ICdmdW5jdGlvbicgJiYgYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy4KICAgICAgICBpZiAodHlwZU9yRnVuYy5kZWNvcmF0b3JzICYmIHR5cGVPckZ1bmMuZGVjb3JhdG9ycyAhPT0gcGFyZW50Q3Rvci5kZWNvcmF0b3JzKSB7CiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YSh0eXBlT3JGdW5jLmRlY29yYXRvcnMpOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgZm9yIG1ldGFkYXRhIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlY29yYXRvcnMuCiAgICAgICAgaWYgKHR5cGVPckZ1bmMuaGFzT3duUHJvcGVydHkoQU5OT1RBVElPTlMpKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlT3JGdW5jW0FOTk9UQVRJT05TXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBhbm5vdGF0aW9ucyh0eXBlT3JGdW5jKSB7CiAgICAgICAgaWYgKCFpc1R5cGUodHlwZU9yRnVuYykpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYXJlbnRDdG9yID0gZ2V0UGFyZW50Q3Rvcih0eXBlT3JGdW5jKTsKICAgICAgICBjb25zdCBvd25Bbm5vdGF0aW9ucyA9IHRoaXMuX293bkFubm90YXRpb25zKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpIHx8IFtdOwogICAgICAgIGNvbnN0IHBhcmVudEFubm90YXRpb25zID0gcGFyZW50Q3RvciAhPT0gT2JqZWN0ID8gdGhpcy5hbm5vdGF0aW9ucyhwYXJlbnRDdG9yKSA6IFtdOwogICAgICAgIHJldHVybiBwYXJlbnRBbm5vdGF0aW9ucy5jb25jYXQob3duQW5ub3RhdGlvbnMpOwogICAgfQogICAgX293blByb3BNZXRhZGF0YSh0eXBlT3JGdW5jLCBwYXJlbnRDdG9yKSB7CiAgICAgICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLgogICAgICAgIGlmICh0eXBlT3JGdW5jLnByb3BNZXRhZGF0YSAmJgogICAgICAgICAgICB0eXBlT3JGdW5jLnByb3BNZXRhZGF0YSAhPT0gcGFyZW50Q3Rvci5wcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgbGV0IHByb3BNZXRhZGF0YSA9IHR5cGVPckZ1bmMucHJvcE1ldGFkYXRhOwogICAgICAgICAgICBpZiAodHlwZW9mIHByb3BNZXRhZGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGEgPSBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7CiAgICAgICAgfQogICAgICAgIC8vIEFQSSBvZiB0c2lja2xlIGZvciBsb3dlcmluZyBkZWNvcmF0b3JzIHRvIHByb3BlcnRpZXMgb24gdGhlIGNsYXNzLgogICAgICAgIGlmICh0eXBlT3JGdW5jLnByb3BEZWNvcmF0b3JzICYmCiAgICAgICAgICAgIHR5cGVPckZ1bmMucHJvcERlY29yYXRvcnMgIT09IHBhcmVudEN0b3IucHJvcERlY29yYXRvcnMpIHsKICAgICAgICAgICAgY29uc3QgcHJvcERlY29yYXRvcnMgPSB0eXBlT3JGdW5jLnByb3BEZWNvcmF0b3JzOwogICAgICAgICAgICBjb25zdCBwcm9wTWV0YWRhdGEgPSB7fTsKICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcERlY29yYXRvcnMpLmZvckVhY2gocHJvcCA9PiB7CiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFbcHJvcF0gPSBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YShwcm9wRGVjb3JhdG9yc1twcm9wXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgZm9yIG1ldGFkYXRhIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlY29yYXRvcnMuCiAgICAgICAgaWYgKHR5cGVPckZ1bmMuaGFzT3duUHJvcGVydHkoUFJPUF9NRVRBREFUQSkpIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGVPckZ1bmNbUFJPUF9NRVRBREFUQV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpIHsKICAgICAgICBpZiAoIWlzVHlwZSh0eXBlT3JGdW5jKSkgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhcmVudEN0b3IgPSBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpOwogICAgICAgIGNvbnN0IHByb3BNZXRhZGF0YSA9IHt9OwogICAgICAgIGlmIChwYXJlbnRDdG9yICE9PSBPYmplY3QpIHsKICAgICAgICAgICAgY29uc3QgcGFyZW50UHJvcE1ldGFkYXRhID0gdGhpcy5wcm9wTWV0YWRhdGEocGFyZW50Q3Rvcik7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmVudFByb3BNZXRhZGF0YSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHsKICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwcm9wTmFtZV0gPSBwYXJlbnRQcm9wTWV0YWRhdGFbcHJvcE5hbWVdOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3duUHJvcE1ldGFkYXRhID0gdGhpcy5fb3duUHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpOwogICAgICAgIGlmIChvd25Qcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgT2JqZWN0LmtleXMob3duUHJvcE1ldGFkYXRhKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFtdOwogICAgICAgICAgICAgICAgaWYgKHByb3BNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goLi4ucHJvcE1ldGFkYXRhW3Byb3BOYW1lXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goLi4ub3duUHJvcE1ldGFkYXRhW3Byb3BOYW1lXSk7CiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFbcHJvcE5hbWVdID0gZGVjb3JhdG9yczsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7CiAgICB9CiAgICBvd25Qcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgewogICAgICAgIGlmICghaXNUeXBlKHR5cGVPckZ1bmMpKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX293blByb3BNZXRhZGF0YSh0eXBlT3JGdW5jLCBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpKSB8fCB7fTsKICAgIH0KICAgIGhhc0xpZmVjeWNsZUhvb2sodHlwZSwgbGNQcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZSAmJiBsY1Byb3BlcnR5IGluIHR5cGUucHJvdG90eXBlOwogICAgfQogICAgZ3VhcmRzKHR5cGUpIHsKICAgICAgICByZXR1cm4ge307CiAgICB9CiAgICBnZXR0ZXIobmFtZSkgewogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ28nLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnOycpOwogICAgfQogICAgc2V0dGVyKG5hbWUpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdvJywgJ3YnLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnID0gdjsnKTsKICAgIH0KICAgIG1ldGhvZChuYW1lKSB7CiAgICAgICAgY29uc3QgZnVuY3Rpb25Cb2R5ID0gYGlmICghby4ke25hbWV9KSB0aHJvdyBuZXcgRXJyb3IoJyIke25hbWV9IiBpcyB1bmRlZmluZWQnKTsKICAgICAgICByZXR1cm4gby4ke25hbWV9LmFwcGx5KG8sIGFyZ3MpO2A7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbignbycsICdhcmdzJywgZnVuY3Rpb25Cb2R5KTsKICAgIH0KICAgIC8vIFRoZXJlIGlzIG5vdCBhIGNvbmNlcHQgb2YgaW1wb3J0IHVyaSBpbiBKcywgYnV0IHRoaXMgaXMgdXNlZnVsIGluIGRldmVsb3BpbmcgRGFydCBhcHBsaWNhdGlvbnMuCiAgICBpbXBvcnRVcmkodHlwZSkgewogICAgICAgIC8vIFN0YXRpY1N5bWJvbAogICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZVsnZmlsZVBhdGgnXSkgewogICAgICAgICAgICByZXR1cm4gdHlwZVsnZmlsZVBhdGgnXTsKICAgICAgICB9CiAgICAgICAgLy8gUnVudGltZSB0eXBlCiAgICAgICAgcmV0dXJuIGAuLyR7c3RyaW5naWZ5KHR5cGUpfWA7CiAgICB9CiAgICByZXNvdXJjZVVyaSh0eXBlKSB7CiAgICAgICAgcmV0dXJuIGAuLyR7c3RyaW5naWZ5KHR5cGUpfWA7CiAgICB9CiAgICByZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpIHsKICAgICAgICByZXR1cm4gcnVudGltZTsKICAgIH0KICAgIHJlc29sdmVFbnVtKGVudW1JZGVudGlmaWVyLCBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGVudW1JZGVudGlmaWVyW25hbWVdOwogICAgfQp9CmZ1bmN0aW9uIGNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhKGRlY29yYXRvckludm9jYXRpb25zKSB7CiAgICBpZiAoIWRlY29yYXRvckludm9jYXRpb25zKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgcmV0dXJuIGRlY29yYXRvckludm9jYXRpb25zLm1hcChkZWNvcmF0b3JJbnZvY2F0aW9uID0+IHsKICAgICAgICBjb25zdCBkZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9ySW52b2NhdGlvbi50eXBlOwogICAgICAgIGNvbnN0IGFubm90YXRpb25DbHMgPSBkZWNvcmF0b3JUeXBlLmFubm90YXRpb25DbHM7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkFyZ3MgPSBkZWNvcmF0b3JJbnZvY2F0aW9uLmFyZ3MgPyBkZWNvcmF0b3JJbnZvY2F0aW9uLmFyZ3MgOiBbXTsKICAgICAgICByZXR1cm4gbmV3IGFubm90YXRpb25DbHMoLi4uYW5ub3RhdGlvbkFyZ3MpOwogICAgfSk7Cn0KZnVuY3Rpb24gZ2V0UGFyZW50Q3RvcihjdG9yKSB7CiAgICBjb25zdCBwYXJlbnRQcm90byA9IGN0b3IucHJvdG90eXBlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IucHJvdG90eXBlKSA6IG51bGw7CiAgICBjb25zdCBwYXJlbnRDdG9yID0gcGFyZW50UHJvdG8gPyBwYXJlbnRQcm90by5jb25zdHJ1Y3RvciA6IG51bGw7CiAgICAvLyBOb3RlOiBXZSBhbHdheXMgdXNlIGBPYmplY3RgIGFzIHRoZSBudWxsIHZhbHVlCiAgICAvLyB0byBzaW1wbGlmeSBjaGVja2luZyBsYXRlciBvbi4KICAgIHJldHVybiBwYXJlbnRDdG9yIHx8IE9iamVjdDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaml0L3V0aWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgX3JlZmxlY3QgPSBudWxsOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFJlZmxlY3QoKSB7CiAgICByZXR1cm4gKF9yZWZsZWN0ID0gX3JlZmxlY3QgfHwgbmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVmbGVjdERlcGVuZGVuY2llcyh0eXBlKSB7CiAgICByZXR1cm4gY29udmVydERlcGVuZGVuY2llcyhnZXRSZWZsZWN0KCkucGFyYW1ldGVycyh0eXBlKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZGVwcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udmVydERlcGVuZGVuY2llcyhkZXBzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICByZXR1cm4gZGVwcy5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlcCA9PiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbXBpbGVyCiAqIEBwYXJhbSB7P30gZGVwCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXRhID0gewogICAgICAgIHRva2VuOiBudWxsLAogICAgICAgIGhvc3Q6IGZhbHNlLAogICAgICAgIG9wdGlvbmFsOiBmYWxzZSwKICAgICAgICByZXNvbHZlZDogY29tcGlsZXIuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLlRva2VuLAogICAgICAgIHNlbGY6IGZhbHNlLAogICAgICAgIHNraXBTZWxmOiBmYWxzZSwKICAgIH07CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKHRva2VuKSB7CiAgICAgICAgbWV0YS5yZXNvbHZlZCA9IGNvbXBpbGVyLlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5Ub2tlbjsKICAgICAgICBtZXRhLnRva2VuID0gdG9rZW47CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXApICYmIGRlcC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkZXAubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJhbSA9IGRlcFtqXTsKICAgICAgICAgICAgaWYgKHBhcmFtID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIHBhcmFtIG1heSBiZSB1bmRlZmluZWQgaWYgdHlwZSBvZiBkZXAgaXMgbm90IHNldCBieSBuZ3RzYwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJhbSk7CiAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIE9wdGlvbmFsIHx8IHByb3RvLm5nTWV0YWRhdGFOYW1lID09PSAnT3B0aW9uYWwnKSB7CiAgICAgICAgICAgICAgICBtZXRhLm9wdGlvbmFsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFNraXBTZWxmIHx8IHByb3RvLm5nTWV0YWRhdGFOYW1lID09PSAnU2tpcFNlbGYnKSB7CiAgICAgICAgICAgICAgICBtZXRhLnNraXBTZWxmID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFNlbGYgfHwgcHJvdG8ubmdNZXRhZGF0YU5hbWUgPT09ICdTZWxmJykgewogICAgICAgICAgICAgICAgbWV0YS5zZWxmID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIEhvc3QgfHwgcHJvdG8ubmdNZXRhZGF0YU5hbWUgPT09ICdIb3N0JykgewogICAgICAgICAgICAgICAgbWV0YS5ob3N0ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIEluamVjdCkgewogICAgICAgICAgICAgICAgbWV0YS50b2tlbiA9IHBhcmFtLnRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uYXR0cmlidXRlTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGRlZmluZWQuYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZXRhLnRva2VuID0gcGFyYW0uYXR0cmlidXRlTmFtZTsKICAgICAgICAgICAgICAgIG1ldGEucmVzb2x2ZWQgPSBjb21waWxlci5SM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUuQXR0cmlidXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSBDaGFuZ2VEZXRlY3RvclJlZikgewogICAgICAgICAgICAgICAgbWV0YS50b2tlbiA9IHBhcmFtOwogICAgICAgICAgICAgICAgbWV0YS5yZXNvbHZlZCA9IGNvbXBpbGVyLlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5DaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKHBhcmFtKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGRlcCA9PT0gdW5kZWZpbmVkIHx8IChBcnJheS5pc0FycmF5KGRlcCkgJiYgZGVwLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICBtZXRhLnRva2VuID0gdW5kZWZpbmVkOwogICAgICAgIG1ldGEucmVzb2x2ZWQgPSBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUuSW52YWxpZDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKGRlcCk7CiAgICB9CiAgICByZXR1cm4gbWV0YTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaml0L2luamVjdGFibGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENvbXBpbGUgYW4gQW5ndWxhciBpbmplY3RhYmxlIGFjY29yZGluZyB0byBpdHMgYEluamVjdGFibGVgIG1ldGFkYXRhLCBhbmQgcGF0Y2ggdGhlIHJlc3VsdGluZwogKiBpbmplY3RhYmxlIGRlZiAoYMm1cHJvdmApIG9udG8gdGhlIGluamVjdGFibGUgdHlwZS4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7Pz19IHNyY01ldGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBpbGVJbmplY3RhYmxlKHR5cGUsIHNyY01ldGEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ0luamVjdGFibGVEZWYgPSBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nRmFjdG9yeURlZiA9IG51bGw7CiAgICAvLyBpZiBOR19QUk9WX0RFRiBpcyBhbHJlYWR5IGRlZmluZWQgb24gdGhpcyBjbGFzcyB0aGVuIGRvbid0IG92ZXJ3cml0ZSBpdAogICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX1BST1ZfREVGKSkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19QUk9WX0RFRiwgewogICAgICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChuZ0luamVjdGFibGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBuZ0luamVjdGFibGVEZWYgPSBnZXRDb21waWxlckZhY2FkZSgpLmNvbXBpbGVJbmplY3RhYmxlKGFuZ3VsYXJDb3JlRGlFbnYsIGBuZzovLy8ke3R5cGUubmFtZX0vybVwcm92LmpzYCwgZ2V0SW5qZWN0YWJsZU1ldGFkYXRhKHR5cGUsIHNyY01ldGEpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZ0luamVjdGFibGVEZWY7CiAgICAgICAgICAgIH0pLAogICAgICAgIH0pOwogICAgICAgIC8vIE9uIElFMTAgcHJvcGVydGllcyBkZWZpbmVkIHZpYSBgZGVmaW5lUHJvcGVydHlgIHdvbid0IGJlIGluaGVyaXRlZCBieSBjaGlsZCBjbGFzc2VzLAogICAgICAgIC8vIHdoaWNoIHdpbGwgYnJlYWsgaW5oZXJpdGluZyB0aGUgaW5qZWN0YWJsZSBkZWZpbml0aW9uIGZyb20gYSBncmFuZHBhcmVudCB0aHJvdWdoIGFuCiAgICAgICAgLy8gdW5kZWNvcmF0ZWQgcGFyZW50IGNsYXNzLiBXZSB3b3JrIGFyb3VuZCBpdCBieSBkZWZpbmluZyBhIG1ldGhvZCB3aGljaCBzaG91bGQgYmUgdXNlZAogICAgICAgIC8vIGFzIGEgZmFsbGJhY2suIFRoaXMgc2hvdWxkIG9ubHkgYmUgYSBwcm9ibGVtIGluIEpJVCBtb2RlLCBiZWNhdXNlIGluIEFPVCBUeXBlU2NyaXB0CiAgICAgICAgLy8gc2VlbXMgdG8gaGF2ZSBhIHdvcmthcm91bmQgZm9yIHN0YXRpYyBwcm9wZXJ0aWVzLiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhbiB1bmRlY29yYXRlZAogICAgICAgIC8vIHBhcmVudCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHYxMCwgdGhpcyBjYW4gc2FmZWx5IGJlIHJlbW92ZWQuCiAgICAgICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX1BST1ZfREVGX0ZBTExCQUNLKSkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSlbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpW05HX1BST1ZfREVGXSk7CiAgICAgICAgfQogICAgfQogICAgLy8gaWYgTkdfRkFDVE9SWV9ERUYgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIHRoaXMgY2xhc3MgdGhlbiBkb24ndCBvdmVyd3JpdGUgaXQKICAgIGlmICghdHlwZS5oYXNPd25Qcm9wZXJ0eShOR19GQUNUT1JZX0RFRikpIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRkFDVE9SWV9ERUYsIHsKICAgICAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobmdGYWN0b3J5RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0SW5qZWN0YWJsZU1ldGFkYXRhKHR5cGUsIHNyY01ldGEpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICAgICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVEaUVudiwgYG5nOi8vLyR7dHlwZS5uYW1lfS/JtWZhYy5qc2AsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWV0YWRhdGEudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IG1ldGFkYXRhLnR5cGVBcmd1bWVudENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiByZWZsZWN0RGVwZW5kZW5jaWVzKHR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RGbjogJ2luamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogY29tcGlsZXIuUjNGYWN0b3J5VGFyZ2V0LkluamVjdGFibGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZ0ZhY3RvcnlEZWY7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICAvLyBMZWF2ZSB0aGlzIGNvbmZpZ3VyYWJsZSBzbyB0aGF0IHRoZSBmYWN0b3JpZXMgZnJvbSBkaXJlY3RpdmVzIG9yIHBpcGVzIGNhbiB0YWtlIHByZWNlZGVuY2UuCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgfQp9CmNvbnN0IMm1MCQ2ID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVU0VfVkFMVUUkMSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkNiB9KTsKLyoqCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVc2VDbGFzc1Byb3ZpZGVyKG1ldGEpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG1ldGEpKSkudXNlQ2xhc3MgIT09IHVuZGVmaW5lZDsKfQovKioKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1VzZVZhbHVlUHJvdmlkZXIobWV0YSkgewogICAgcmV0dXJuIFVTRV9WQUxVRSQxIGluIG1ldGE7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVc2VGYWN0b3J5UHJvdmlkZXIobWV0YSkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobWV0YSkpKS51c2VGYWN0b3J5ICE9PSB1bmRlZmluZWQ7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG1ldGEpKSkudXNlRXhpc3RpbmcgIT09IHVuZGVmaW5lZDsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7Pz19IHNyY01ldGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEluamVjdGFibGVNZXRhZGF0YSh0eXBlLCBzcmNNZXRhKSB7CiAgICAvLyBBbGxvdyB0aGUgY29tcGlsYXRpb24gb2YgYSBjbGFzcyB3aXRoIGEgYEBJbmplY3RhYmxlKClgIGRlY29yYXRvciB3aXRob3V0IHBhcmFtZXRlcnMKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1ldGEgPSBzcmNNZXRhIHx8IHsgcHJvdmlkZWRJbjogbnVsbCB9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcGlsZXJNZXRhID0gewogICAgICAgIG5hbWU6IHR5cGUubmFtZSwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLAogICAgICAgIHByb3ZpZGVkSW46IG1ldGEucHJvdmlkZWRJbiwKICAgICAgICB1c2VyRGVwczogdW5kZWZpbmVkLAogICAgfTsKICAgIGlmICgoaXNVc2VDbGFzc1Byb3ZpZGVyKG1ldGEpIHx8IGlzVXNlRmFjdG9yeVByb3ZpZGVyKG1ldGEpKSAmJiBtZXRhLmRlcHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbXBpbGVyTWV0YS51c2VyRGVwcyA9IGNvbnZlcnREZXBlbmRlbmNpZXMobWV0YS5kZXBzKTsKICAgIH0KICAgIGlmIChpc1VzZUNsYXNzUHJvdmlkZXIobWV0YSkpIHsKICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VDbGFzcywgYW5kIG1heSBvciBtYXkgbm90IGhhdmUgcHJvdmlkZWQgZGVwcy4KICAgICAgICBjb21waWxlck1ldGEudXNlQ2xhc3MgPSByZXNvbHZlRm9yd2FyZFJlZihtZXRhLnVzZUNsYXNzKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzVXNlVmFsdWVQcm92aWRlcihtZXRhKSkgewogICAgICAgIC8vIFRoZSB1c2VyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHVzZVZhbHVlLgogICAgICAgIGNvbXBpbGVyTWV0YS51c2VWYWx1ZSA9IHJlc29sdmVGb3J3YXJkUmVmKG1ldGEudXNlVmFsdWUpOwogICAgfQogICAgZWxzZSBpZiAoaXNVc2VGYWN0b3J5UHJvdmlkZXIobWV0YSkpIHsKICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VGYWN0b3J5LgogICAgICAgIGNvbXBpbGVyTWV0YS51c2VGYWN0b3J5ID0gbWV0YS51c2VGYWN0b3J5OwogICAgfQogICAgZWxzZSBpZiAoaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpKSB7CiAgICAgICAgLy8gVGhlIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZWQgdXNlRXhpc3RpbmcuCiAgICAgICAgY29tcGlsZXJNZXRhLnVzZUV4aXN0aW5nID0gcmVzb2x2ZUZvcndhcmRSZWYobWV0YS51c2VFeGlzdGluZyk7CiAgICB9CiAgICByZXR1cm4gY29tcGlsZXJNZXRhOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS91dGlsLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNvbnN0IMm1MCQ3ID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVU0VfVkFMVUUkMiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkNyB9KTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdApjb25zdCDJtTAkOCA9IC8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwoodHlwZSwgbWV0YSkgPT4gU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRSgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBtZXRhKTsKLyoqCiAqIEluamVjdGFibGUgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSW5qZWN0YWJsZSA9IG1ha2VEZWNvcmF0b3IoJ0luamVjdGFibGUnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoybUwJDgpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9JTkpFQ1RBQkxFX19QT1NUX1IzX18gPSBjb21waWxlSW5qZWN0YWJsZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9JTkpFQ1RBQkxFID0gU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRV9fUE9TVF9SM19fOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvc2NvcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFuIGludGVybmFsIHRva2VuIHdob3NlIHByZXNlbmNlIGluIGFuIGluamVjdG9yIGluZGljYXRlcyB0aGF0IHRoZSBpbmplY3RvciBzaG91bGQgdHJlYXQgaXRzZWxmCiAqIGFzIGEgcm9vdCBzY29wZWQgaW5qZWN0b3Igd2hlbiBwcm9jZXNzaW5nIHJlcXVlc3RzIGZvciB1bmtub3duIHRva2VucyB3aGljaCBtYXkgaW5kaWNhdGUKICogdGhleSBhcmUgcHJvdmlkZWQgaW4gdGhlIHJvb3Qgc2NvcGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSU5KRUNUT1JfU0NPUEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1NldCBJbmplY3RvciBzY29wZS4nKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3IzX2luamVjdG9yLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBNYXJrZXIgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSB2YWx1ZSBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgZmFjdG9yeSBmdW5jdGlvbi4KICogQHR5cGUgez99CiAqLwpjb25zdCBOT1RfWUVUID0ge307Ci8qKgogKiBNYXJrZXIgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGEgdG9rZW4gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY2FsbGVkLgogKgogKiBJZiB0aGUgaW5qZWN0b3IgaXMgYXNrZWQgdG8gaW5qZWN0IGEgdG9rZW4gd2l0aCBpdHMgdmFsdWUgc2V0IHRvIENJUkNVTEFSLCB0aGF0IGluZGljYXRlcwogKiBpbmplY3Rpb24gb2YgYSBkZXBlbmRlbmN5IGhhcyByZWN1cnNpdmVseSBhdHRlbXB0ZWQgdG8gaW5qZWN0IHRoZSBvcmlnaW5hbCB0b2tlbiwgYW5kIHRoZXJlIGlzCiAqIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBhbW9uZyB0aGUgcHJvdmlkZXJzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IENJUkNVTEFSID0ge307Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRU1QVFlfQVJSQVkkMiA9ICgvKiogQHR5cGUgez99ICovIChbXSkpOwovKioKICogQSBsYXppbHkgaW5pdGlhbGl6ZWQgTnVsbEluamVjdG9yLgogKiBAdHlwZSB7P30KICovCmxldCBOVUxMX0lOSkVDVE9SID0gdW5kZWZpbmVkOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE51bGxJbmplY3RvcigpIHsKICAgIGlmIChOVUxMX0lOSkVDVE9SID09PSB1bmRlZmluZWQpIHsKICAgICAgICBOVUxMX0lOSkVDVE9SID0gbmV3IE51bGxJbmplY3RvcigpOwogICAgfQogICAgcmV0dXJuIE5VTExfSU5KRUNUT1I7Cn0KLyoqCiAqIENyZWF0ZSBhIG5ldyBgSW5qZWN0b3JgIHdoaWNoIGlzIGNvbmZpZ3VyZWQgdXNpbmcgYSBgZGVmVHlwZWAgb2YgYEluamVjdG9yVHlwZTxhbnk+YHMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gZGVmVHlwZQogKiBAcGFyYW0gez89fSBwYXJlbnQKICogQHBhcmFtIHs/PX0gYWRkaXRpb25hbFByb3ZpZGVycwogKiBAcGFyYW0gez89fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVJbmplY3RvcihkZWZUeXBlLCBwYXJlbnQgPSBudWxsLCBhZGRpdGlvbmFsUHJvdmlkZXJzID0gbnVsbCwgbmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcldpdGhvdXRJbmplY3Rvckluc3RhbmNlcyhkZWZUeXBlLCBwYXJlbnQsIGFkZGl0aW9uYWxQcm92aWRlcnMsIG5hbWUpOwogICAgaW5qZWN0b3IuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCk7CiAgICByZXR1cm4gaW5qZWN0b3I7Cn0KLyoqCiAqIENyZWF0ZXMgYSBuZXcgaW5qZWN0b3Igd2l0aG91dCBlYWdlcmx5IHJlc29sdmluZyBpdHMgaW5qZWN0b3IgdHlwZXMuIENhbiBiZSB1c2VkIGluIHBsYWNlcwogKiB3aGVyZSByZXNvbHZpbmcgdGhlIGluamVjdG9yIHR5cGVzIGltbWVkaWF0ZWx5IGNhbiBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuIFRoZSBpbmplY3RvciB0eXBlcwogKiBzaG91bGQgYmUgcmVzb2x2ZWQgYXQgYSBsYXRlciBwb2ludCBieSBjYWxsaW5nIGBfcmVzb2x2ZUluamVjdG9yRGVmVHlwZXNgLgogKiBAcGFyYW0gez99IGRlZlR5cGUKICogQHBhcmFtIHs/PX0gcGFyZW50CiAqIEBwYXJhbSB7Pz19IGFkZGl0aW9uYWxQcm92aWRlcnMKICogQHBhcmFtIHs/PX0gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlSW5qZWN0b3JXaXRob3V0SW5qZWN0b3JJbnN0YW5jZXMoZGVmVHlwZSwgcGFyZW50ID0gbnVsbCwgYWRkaXRpb25hbFByb3ZpZGVycyA9IG51bGwsIG5hbWUpIHsKICAgIHJldHVybiBuZXcgUjNJbmplY3RvcihkZWZUeXBlLCBhZGRpdGlvbmFsUHJvdmlkZXJzLCBwYXJlbnQgfHwgZ2V0TnVsbEluamVjdG9yKCksIG5hbWUpOwp9CmNsYXNzIFIzSW5qZWN0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbmFsUHJvdmlkZXJzCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/PX0gc291cmNlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRlZiwgYWRkaXRpb25hbFByb3ZpZGVycywgcGFyZW50LCBzb3VyY2UgPSBudWxsKSB7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIHRva2VucyB0byByZWNvcmRzIHdoaWNoIGNvbnRhaW4gdGhlIGluc3RhbmNlcyBvZiB0aG9zZSB0b2tlbnMuCiAgICAgICAgICogLSBgbnVsbGAgdmFsdWUgaW1wbGllcyB0aGF0IHdlIGRvbid0IGhhdmUgdGhlIHJlY29yZC4gVXNlZCBieSB0cmVlLXNoYWthYmxlIGluamVjdG9ycwogICAgICAgICAqIHRvIHByZXZlbnQgZnVydGhlciBzZWFyY2hlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRyYW5zaXRpdmUgc2V0IG9mIGBJbmplY3RvclR5cGVgcyB3aGljaCBkZWZpbmUgdGhpcyBpbmplY3Rvci4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmluamVjdG9yRGVmVHlwZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IG9mIHZhbHVlcyBpbnN0YW50aWF0ZWQgYnkgdGhpcyBpbmplY3RvciB3aGljaCBjb250YWluIGBuZ09uRGVzdHJveWAgbGlmZWN5Y2xlIGhvb2tzLgogICAgICAgICAqLwogICAgICAgIHRoaXMub25EZXN0cm95ID0gbmV3IFNldCgpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWR1cFN0YWNrID0gW107CiAgICAgICAgLy8gU3RhcnQgb2ZmIGJ5IGNyZWF0aW5nIFJlY29yZHMgZm9yIGV2ZXJ5IHByb3ZpZGVyIGRlY2xhcmVkIGluIGV2ZXJ5IEluamVjdG9yVHlwZQogICAgICAgIC8vIGluY2x1ZGVkIHRyYW5zaXRpdmVseSBpbiBhZGRpdGlvbmFsIHByb3ZpZGVycyB0aGVuIGRvIHRoZSBzYW1lIGZvciBgZGVmYC4gVGhpcyBvcmRlciBpcwogICAgICAgIC8vIGltcG9ydGFudCBiZWNhdXNlIGBkZWZgIG1heSBpbmNsdWRlIHByb3ZpZGVycyB0aGF0IG92ZXJyaWRlIG9uZXMgaW4gYWRkaXRpb25hbFByb3ZpZGVycy4KICAgICAgICBhZGRpdGlvbmFsUHJvdmlkZXJzICYmCiAgICAgICAgICAgIGRlZXBGb3JFYWNoKGFkZGl0aW9uYWxQcm92aWRlcnMsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvdmlkZXIgPT4gdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIGRlZiwgYWRkaXRpb25hbFByb3ZpZGVycykpKTsKICAgICAgICBkZWVwRm9yRWFjaChbZGVmXSwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JEZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluamVjdG9yRGVmID0+IHRoaXMucHJvY2Vzc0luamVjdG9yVHlwZShpbmplY3RvckRlZiwgW10sIGRlZHVwU3RhY2spKSk7CiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBJTkpFQ1RPUiB0b2tlbiBwcm92aWRlcyB0aGlzIGluamVjdG9yLgogICAgICAgIHRoaXMucmVjb3Jkcy5zZXQoSU5KRUNUT1IsIG1ha2VSZWNvcmQodW5kZWZpbmVkLCB0aGlzKSk7CiAgICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhpcyBpbmplY3RvciBoYXMgdGhlIEFQUF9ST09UX1NDT1BFIHRva2VuIGFuZCB0aHVzIHNob3VsZCBwcm92aWRlCiAgICAgICAgLy8gYW55IGluamVjdGFibGUgc2NvcGVkIHRvIEFQUF9ST09UX1NDT1BFLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KElOSkVDVE9SX1NDT1BFKTsKICAgICAgICB0aGlzLnNjb3BlID0gcmVjb3JkICE9IG51bGwgPyByZWNvcmQudmFsdWUgOiBudWxsOwogICAgICAgIC8vIFNvdXJjZSBuYW1lLCB1c2VkIGZvciBkZWJ1Z2dpbmcKICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZSB8fCAodHlwZW9mIGRlZiA9PT0gJ29iamVjdCcgPyBudWxsIDogc3RyaW5naWZ5KGRlZikpOwogICAgfQogICAgLyoqCiAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGluamVjdG9yIHdhcyBwcmV2aW91c2x5IGRlc3Ryb3llZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkZXN0cm95ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDsKICAgIH0KICAgIC8qKgogICAgICogRGVzdHJveSB0aGUgaW5qZWN0b3IgYW5kIHJlbGVhc2UgcmVmZXJlbmNlcyB0byBldmVyeSBpbnN0YW5jZSBvciBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgKgogICAgICogQWxzbyBjYWxscyB0aGUgYE9uRGVzdHJveWAgbGlmZWN5Y2xlIGhvb2tzIG9mIGV2ZXJ5IGluc3RhbmNlIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHdoaWNoIGEKICAgICAqIGhvb2sgd2FzIGZvdW5kLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpOwogICAgICAgIC8vIFNldCBkZXN0cm95ZWQgPSB0cnVlIGZpcnN0LCBpbiBjYXNlIGxpZmVjeWNsZSBob29rcyByZS1lbnRlciBkZXN0cm95KCkuCiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDYWxsIGFsbCB0aGUgbGlmZWN5Y2xlIGhvb2tzLgogICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZXJ2aWNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXJ2aWNlID0+IHNlcnZpY2UubmdPbkRlc3Ryb3koKSkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgLy8gUmVsZWFzZSBhbGwgcmVmZXJlbmNlcy4KICAgICAgICAgICAgdGhpcy5yZWNvcmRzLmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMub25EZXN0cm95LmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5jbGVhcigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7Pz19IG5vdEZvdW5kVmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUgPSBUSFJPV19JRl9OT1RfRk9VTkQsIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCkgewogICAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7CiAgICAgICAgLy8gU2V0IHRoZSBpbmplY3Rpb24gY29udGV4dC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmplY3RvciA9IHNldEN1cnJlbnRJbmplY3Rvcih0aGlzKTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFNraXBTZWxmIGZsYWcuCiAgICAgICAgICAgIGlmICghKGZsYWdzICYgSW5qZWN0RmxhZ3MuU2tpcFNlbGYpKSB7CiAgICAgICAgICAgICAgICAvLyBTa2lwU2VsZiBpc24ndCBzZXQsIGNoZWNrIGlmIHRoZSByZWNvcmQgYmVsb25ncyB0byB0aGlzIGluamVjdG9yLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodG9rZW4pOwogICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkLCBidXQgbWF5YmUgdGhlIHRva2VuIGlzIHNjb3BlZCB0byB0aGlzIGluamVjdG9yLiBMb29rIGZvciBhbiBpbmplY3RhYmxlCiAgICAgICAgICAgICAgICAgICAgLy8gZGVmIHdpdGggYSBzY29wZSBtYXRjaGluZyB0aGlzIGluamVjdG9yLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWYgPSBjb3VsZEJlSW5qZWN0YWJsZVR5cGUodG9rZW4pICYmIGdldEluamVjdGFibGVEZWYodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmIChkZWYgJiYgdGhpcy5pbmplY3RhYmxlRGVmSW5TY29wZShkZWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGluamVjdGFibGUgZGVmIGFuZCBpdCdzIHNjb3BlZCB0byB0aGlzIGluamVjdG9yLiBQcmV0ZW5kIGFzIGlmIGl0IHdhcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBhbG9uZy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkID0gbWFrZVJlY29yZChpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodG9rZW4pLCBOT1RfWUVUKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5zZXQodG9rZW4sIHJlY29yZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJZiBhIHJlY29yZCB3YXMgZm91bmQsIGdldCB0aGUgaW5zdGFuY2UgZm9yIGl0IGFuZCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwgLyogTk9UIG51bGwgfHwgdW5kZWZpbmVkICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh0b2tlbiwgcmVjb3JkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTZWxlY3QgdGhlIG5leHQgaW5qZWN0b3IgYmFzZWQgb24gdGhlIFNlbGYgZmxhZyAtIGlmIHNlbGYgaXMgc2V0LCB0aGUgbmV4dCBpbmplY3RvciBpcwogICAgICAgICAgICAvLyB0aGUgTnVsbEluamVjdG9yLCBvdGhlcndpc2UgaXQncyB0aGUgcGFyZW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHRJbmplY3RvciA9ICEoZmxhZ3MgJiBJbmplY3RGbGFncy5TZWxmKSA/IHRoaXMucGFyZW50IDogZ2V0TnVsbEluamVjdG9yKCk7CiAgICAgICAgICAgIC8vIFNldCB0aGUgbm90Rm91bmRWYWx1ZSBiYXNlZCBvbiB0aGUgT3B0aW9uYWwgZmxhZyAtIGlmIG9wdGlvbmFsIGlzIHNldCBhbmQgbm90Rm91bmRWYWx1ZQogICAgICAgICAgICAvLyBpcyB1bmRlZmluZWQsIHRoZSB2YWx1ZSBpcyBudWxsLCBvdGhlcndpc2UgaXQncyB0aGUgbm90Rm91bmRWYWx1ZS4KICAgICAgICAgICAgbm90Rm91bmRWYWx1ZSA9IChmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKSAmJiBub3RGb3VuZFZhbHVlID09PSBUSFJPV19JRl9OT1RfRk9VTkQgPwogICAgICAgICAgICAgICAgbnVsbCA6CiAgICAgICAgICAgICAgICBub3RGb3VuZFZhbHVlOwogICAgICAgICAgICByZXR1cm4gbmV4dEluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdOdWxsSW5qZWN0b3JFcnJvcicpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBlW05HX1RFTVBfVE9LRU5fUEFUSF0gPSBlW05HX1RFTVBfVE9LRU5fUEFUSF0gfHwgW107CiAgICAgICAgICAgICAgICBwYXRoLnVuc2hpZnQoc3RyaW5naWZ5KHRva2VuKSk7CiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJbmplY3RvcikgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYSBwYXJlbnQgaW5qZWN0b3IsIGtlZXAgdGhyb3dpbmcKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0ICYgdGhyb3cgdGhlIGZpbmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB3ZSBkb24ndCBoYXZlIGFueSBwcmV2aW91cyBpbmplY3RvcgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXRjaEluamVjdG9yRXJyb3IoZSwgdG9rZW4sICdSM0luamVjdG9yRXJyb3InLCB0aGlzLnNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAvLyBMYXN0bHksIGNsZWFuIHVwIHRoZSBzdGF0ZSBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGluamVjdG9yLgogICAgICAgICAgICBzZXRDdXJyZW50SW5qZWN0b3IocHJldmlvdXNJbmplY3Rvcik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVzb2x2ZUluamVjdG9yRGVmVHlwZXMoKSB7CiAgICAgICAgdGhpcy5pbmplY3RvckRlZlR5cGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmVHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVmVHlwZSA9PiB0aGlzLmdldChkZWZUeXBlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b1N0cmluZygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9rZW5zID0gKC8qKiBAdHlwZSB7P30gKi8gKFtdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlY29yZHMgPSB0aGlzLnJlY29yZHM7CiAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodiwgdG9rZW4pID0+IHRva2Vucy5wdXNoKHN0cmluZ2lmeSh0b2tlbikpKSk7CiAgICAgICAgcmV0dXJuIGBSM0luamVjdG9yWyR7dG9rZW5zLmpvaW4oJywgJyl9XWA7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhc3NlcnROb3REZXN0cm95ZWQoKSB7CiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luamVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLicpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGBJbmplY3RvclR5cGVgIG9yIGBJbmplY3RvclR5cGVXaXRoUHJvdmlkZXJzYCBhbmQgYWxsIG9mIGl0cyB0cmFuc2l0aXZlIHByb3ZpZGVycwogICAgICogdG8gdGhpcyBpbmplY3Rvci4KICAgICAqCiAgICAgKiBJZiBhbiBgSW5qZWN0b3JUeXBlV2l0aFByb3ZpZGVyc2AgdGhhdCBkZWNsYXJlcyBwcm92aWRlcnMgYmVzaWRlcyB0aGUgdHlwZSBpcyBzcGVjaWZpZWQsCiAgICAgKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gInRydWUiIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb3ZpZGVycyBvZiB0aGUgdHlwZSBkZWZpbml0aW9uIG5lZWQKICAgICAqIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBhbGxvd3MgdXMgdG8gcHJvY2VzcyBwcm92aWRlcnMgb2YgaW5qZWN0b3IgdHlwZXMgYWZ0ZXIgYWxsIGltcG9ydHMgb2YKICAgICAqIGFuIGluamVjdG9yIGRlZmluaXRpb24gYXJlIHByb2Nlc3NlZC4gKGZvbGxvd2luZyBWaWV3IEVuZ2luZSBzZW1hbnRpY3M6IHNlZSBGVy0xMzQ5KQogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZGVmT3JXcmFwcGVkRGVmCiAgICAgKiBAcGFyYW0gez99IHBhcmVudHMKICAgICAqIEBwYXJhbSB7P30gZGVkdXBTdGFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcHJvY2Vzc0luamVjdG9yVHlwZShkZWZPcldyYXBwZWREZWYsIHBhcmVudHMsIGRlZHVwU3RhY2spIHsKICAgICAgICBkZWZPcldyYXBwZWREZWYgPSByZXNvbHZlRm9yd2FyZFJlZihkZWZPcldyYXBwZWREZWYpOwogICAgICAgIGlmICghZGVmT3JXcmFwcGVkRGVmKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy8gRWl0aGVyIHRoZSBkZWZPcldyYXBwZWREZWYgaXMgYW4gSW5qZWN0b3JUeXBlICh3aXRoIGluamVjdG9yIGRlZikgb3IgYW4KICAgICAgICAvLyBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzIChha2EgTW9kdWxlV2l0aFByb3ZpZGVycykuIERldGVjdGluZyBlaXRoZXIgaXMgYSBtZWdhbW9ycGhpYwogICAgICAgIC8vIHJlYWQsIHNvIGNhcmUgaXMgdGFrZW4gdG8gb25seSBkbyB0aGUgcmVhZCBvbmNlLgogICAgICAgIC8vIEZpcnN0IGF0dGVtcHQgdG8gcmVhZCB0aGUgaW5qZWN0b3IgZGVmIChgybVpbmpgKS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRlZiA9IGdldEluamVjdG9yRGVmKGRlZk9yV3JhcHBlZERlZik7CiAgICAgICAgLy8gSWYgdGhhdCdzIG5vdCBwcmVzZW50LCB0aGVuIGF0dGVtcHQgdG8gcmVhZCBuZ01vZHVsZSBmcm9tIHRoZSBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZ01vZHVsZSA9IChkZWYgPT0gbnVsbCkgJiYgKCgvKiogQHR5cGUgez99ICovIChkZWZPcldyYXBwZWREZWYpKSkubmdNb2R1bGUgfHwgdW5kZWZpbmVkOwogICAgICAgIC8vIERldGVybWluZSB0aGUgSW5qZWN0b3JUeXBlLiBJbiB0aGUgY2FzZSB3aGVyZSBgZGVmT3JXcmFwcGVkRGVmYCBpcyBhbiBgSW5qZWN0b3JUeXBlYCwKICAgICAgICAvLyB0aGVuIHRoaXMgaXMgZWFzeS4gSW4gdGhlIGNhc2Ugb2YgYW4gSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVycywgdGhlbiB0aGUgZGVmaW5pdGlvbiB0eXBlCiAgICAgICAgLy8gaXMgdGhlIGBuZ01vZHVsZWAuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZlR5cGUgPSAobmdNb2R1bGUgPT09IHVuZGVmaW5lZCkgPyAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZk9yV3JhcHBlZERlZikpKSA6IG5nTW9kdWxlOwogICAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMuCiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiBwYXJlbnRzLmluZGV4T2YoZGVmVHlwZSkgIT09IC0xKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmTmFtZSA9IHN0cmluZ2lmeShkZWZUeXBlKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaXJjdWxhciBkZXBlbmRlbmN5IGluIERJIGRldGVjdGVkIGZvciB0eXBlICR7ZGVmTmFtZX0uIERlcGVuZGVuY3kgcGF0aDogJHtwYXJlbnRzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmVHlwZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGVmVHlwZSA9PiBzdHJpbmdpZnkoZGVmVHlwZSkpKS5qb2luKCcgPiAnKX0gPiAke2RlZk5hbWV9LmApOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBmb3IgbXVsdGlwbGUgaW1wb3J0cyBvZiB0aGUgc2FtZSBtb2R1bGUKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBkZWR1cFN0YWNrLmluZGV4T2YoZGVmVHlwZSkgIT09IC0xOwogICAgICAgIC8vIEZpbmFsbHksIGlmIGRlZk9yV3JhcHBlZFR5cGUgd2FzIGFuIGBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzYCwgdGhlbiB0aGUgYWN0dWFsCiAgICAgICAgLy8gYEluamVjdG9yRGVmYCBpcyBvbiBpdHMgYG5nTW9kdWxlYC4KICAgICAgICBpZiAobmdNb2R1bGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBkZWYgPSBnZXRJbmplY3RvckRlZihuZ01vZHVsZSk7CiAgICAgICAgfQogICAgICAgIC8vIElmIG5vIGRlZmluaXRpb24gd2FzIGZvdW5kLCBpdCBtaWdodCBiZSBmcm9tIGV4cG9ydHMuIFJlbW92ZSBpdC4KICAgICAgICBpZiAoZGVmID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGluIHRoZSBzYW1lIHdheSB0aGF0IEBOZ01vZHVsZSByZXNvbHV0aW9uIGRpZDoKICAgICAgICAvLyBGaXJzdCwgaW5jbHVkZSBwcm92aWRlcnMgZnJvbSBhbnkgaW1wb3J0cy4KICAgICAgICBpZiAoZGVmLmltcG9ydHMgIT0gbnVsbCAmJiAhaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgLy8gQmVmb3JlIHByb2Nlc3NpbmcgZGVmVHlwZSdzIGltcG9ydHMsIGFkZCBpdCB0byB0aGUgc2V0IG9mIHBhcmVudHMuIFRoaXMgd2F5LCBpZiBpdCBlbmRzCiAgICAgICAgICAgIC8vIHVwIGRlZXBseSBpbXBvcnRpbmcgaXRzZWxmLCB0aGlzIGNhbiBiZSBkZXRlY3RlZC4KICAgICAgICAgICAgbmdEZXZNb2RlICYmIHBhcmVudHMucHVzaChkZWZUeXBlKTsKICAgICAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBzZXQgb2YgZGVkdXBzLiBUaGlzIHdheSB3ZSBjYW4gZGV0ZWN0IG11bHRpcGxlIGltcG9ydHMgb2YgdGhlIHNhbWUgbW9kdWxlCiAgICAgICAgICAgIGRlZHVwU3RhY2sucHVzaChkZWZUeXBlKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZGVlcEZvckVhY2goZGVmLmltcG9ydHMsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW1wb3J0ZWQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGltcG9ydGVkID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9jZXNzSW5qZWN0b3JUeXBlKGltcG9ydGVkLCBwYXJlbnRzLCBkZWR1cFN0YWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlc1dpdGhQcm92aWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByb2Nlc3NlZCBpbXBvcnQgaXMgYW4gaW5qZWN0b3IgdHlwZSB3aXRoIHByb3ZpZGVycywgd2Ugc3RvcmUgaXQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgaW1wb3J0IHR5cGVzIHdpdGggcHJvdmlkZXJzLCBzbyB0aGF0IHdlIGNhbiBwcm9jZXNzIHRob3NlIGFmdGVyd2FyZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFR5cGVzV2l0aFByb3ZpZGVycy5wdXNoKGltcG9ydGVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgcGFyZW50cyBzZXQgd2hlbiBmaW5pc2hlZC4KICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBwYXJlbnRzLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEltcG9ydHMgd2hpY2ggYXJlIGRlY2xhcmVkIHdpdGggcHJvdmlkZXJzIChUeXBlV2l0aFByb3ZpZGVycykgbmVlZCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgICAgLy8gYWZ0ZXIgYWxsIGltcG9ydGVkIG1vZHVsZXMgYXJlIHByb2Nlc3NlZC4gVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBWaWV3IEVuZ2luZQogICAgICAgICAgICAvLyBwcm9jZXNzZXMvbWVyZ2VzIG1vZHVsZSBpbXBvcnRzIGluIHRoZSBtZXRhZGF0YSByZXNvbHZlci4gU2VlOiBGVy0xMzQ5LgogICAgICAgICAgICBpZiAoaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuZ01vZHVsZSwgcHJvdmlkZXJzIH0gPSBpbXBvcnRUeXBlc1dpdGhQcm92aWRlcnNbaV07CiAgICAgICAgICAgICAgICAgICAgZGVlcEZvckVhY2goKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVycykpLCAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPT4gdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIG5nTW9kdWxlLCBwcm92aWRlcnMgfHwgRU1QVFlfQVJSQVkkMikpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUcmFjayB0aGUgSW5qZWN0b3JUeXBlIGFuZCBhZGQgYSBwcm92aWRlciBmb3IgaXQuIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyBpcyBkb25lIGFmdGVyIHRoZQogICAgICAgIC8vIGRlZidzIGltcG9ydHMuCiAgICAgICAgdGhpcy5pbmplY3RvckRlZlR5cGVzLmFkZChkZWZUeXBlKTsKICAgICAgICB0aGlzLnJlY29yZHMuc2V0KGRlZlR5cGUsIG1ha2VSZWNvcmQoZGVmLmZhY3RvcnksIE5PVF9ZRVQpKTsKICAgICAgICAvLyBOZXh0LCBpbmNsdWRlIHByb3ZpZGVycyBsaXN0ZWQgb24gdGhlIGRlZmluaXRpb24gaXRzZWxmLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWZQcm92aWRlcnMgPSBkZWYucHJvdmlkZXJzOwogICAgICAgIGlmIChkZWZQcm92aWRlcnMgIT0gbnVsbCAmJiAhaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmplY3RvclR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmT3JXcmFwcGVkRGVmKSk7CiAgICAgICAgICAgIGRlZXBGb3JFYWNoKGRlZlByb3ZpZGVycywgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm92aWRlciA9PiB0aGlzLnByb2Nlc3NQcm92aWRlcihwcm92aWRlciwgaW5qZWN0b3JUeXBlLCBkZWZQcm92aWRlcnMpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAobmdNb2R1bGUgIT09IHVuZGVmaW5lZCAmJgogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZk9yV3JhcHBlZERlZikpKS5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCk7CiAgICB9CiAgICAvKioKICAgICAqIFByb2Nlc3MgYSBgU2luZ2xlUHJvdmlkZXJgIGFuZCBhZGQgaXQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZVR5cGUKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKSB7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0b2tlbiBmcm9tIHRoZSBwcm92aWRlci4gRWl0aGVyIGl0J3MgaXRzIG93biB0b2tlbiwgb3IgaGFzIGEge3Byb3ZpZGU6IC4uLn0KICAgICAgICAvLyBwcm9wZXJ0eS4KICAgICAgICBwcm92aWRlciA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRva2VuID0gaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpID8gcHJvdmlkZXIgOiByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlciAmJiBwcm92aWRlci5wcm92aWRlKTsKICAgICAgICAvLyBDb25zdHJ1Y3QgYSBgUmVjb3JkYCBmb3IgdGhlIHByb3ZpZGVyLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWNvcmQgPSBwcm92aWRlclRvUmVjb3JkKHByb3ZpZGVyLCBuZ01vZHVsZVR5cGUsIHByb3ZpZGVycyk7CiAgICAgICAgaWYgKCFpc1R5cGVQcm92aWRlcihwcm92aWRlcikgJiYgcHJvdmlkZXIubXVsdGkgPT09IHRydWUpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIHByb3ZpZGVyIGluZGljYXRlcyB0aGF0IGl0J3MgYSBtdWx0aS1wcm92aWRlciwgcHJvY2VzcyBpdCBzcGVjaWFsbHkuCiAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIHdoZXRoZXIgaXQncyBiZWVuIGRlZmluZWQgYWxyZWFkeS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbXVsdGlSZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHRva2VuKTsKICAgICAgICAgICAgaWYgKG11bHRpUmVjb3JkKSB7CiAgICAgICAgICAgICAgICAvLyBJdCBoYXMuIFRocm93IGEgbmljZSBlcnJvciBpZgogICAgICAgICAgICAgICAgaWYgKG11bHRpUmVjb3JkLm11bHRpID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvd01peGVkTXVsdGlQcm92aWRlckVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBtdWx0aVJlY29yZCA9IG1ha2VSZWNvcmQodW5kZWZpbmVkLCBOT1RfWUVULCB0cnVlKTsKICAgICAgICAgICAgICAgIG11bHRpUmVjb3JkLmZhY3RvcnkgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBpbmplY3RBcmdzKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobXVsdGlSZWNvcmQpKS5tdWx0aSkpKSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMuc2V0KHRva2VuLCBtdWx0aVJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9rZW4gPSBwcm92aWRlcjsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG11bHRpUmVjb3JkLm11bHRpKSkucHVzaChwcm92aWRlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5yZWNvcmRzLmdldCh0b2tlbik7CiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5tdWx0aSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aHJvd01peGVkTXVsdGlQcm92aWRlckVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5yZWNvcmRzLnNldCh0b2tlbiwgcmVjb3JkKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaHlkcmF0ZSh0b2tlbiwgcmVjb3JkKSB7CiAgICAgICAgaWYgKHJlY29yZC52YWx1ZSA9PT0gQ0lSQ1VMQVIpIHsKICAgICAgICAgICAgdGhyb3dDeWNsaWNEZXBlbmRlbmN5RXJyb3Ioc3RyaW5naWZ5KHRva2VuKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJlY29yZC52YWx1ZSA9PT0gTk9UX1lFVCkgewogICAgICAgICAgICByZWNvcmQudmFsdWUgPSBDSVJDVUxBUjsKICAgICAgICAgICAgcmVjb3JkLnZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlY29yZC5mYWN0b3J5KSkoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQudmFsdWUgPT09ICdvYmplY3QnICYmIHJlY29yZC52YWx1ZSAmJiBoYXNPbkRlc3Ryb3kocmVjb3JkLnZhbHVlKSkgewogICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5hZGQocmVjb3JkLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyZWNvcmQudmFsdWUpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbmplY3RhYmxlRGVmSW5TY29wZShkZWYpIHsKICAgICAgICBpZiAoIWRlZi5wcm92aWRlZEluKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZi5wcm92aWRlZEluID09PSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gZGVmLnByb3ZpZGVkSW4gPT09ICdhbnknIHx8IChkZWYucHJvdmlkZWRJbiA9PT0gdGhpcy5zY29wZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RvckRlZlR5cGVzLmhhcyhkZWYucHJvdmlkZWRJbik7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRva2VuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodG9rZW4pIHsKICAgIC8vIE1vc3QgdG9rZW5zIHdpbGwgaGF2ZSBhbiBpbmplY3RhYmxlIGRlZiBkaXJlY3RseSBvbiB0aGVtLCB3aGljaCBzcGVjaWZpZXMgYSBmYWN0b3J5IGRpcmVjdGx5LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0YWJsZURlZiA9IGdldEluamVjdGFibGVEZWYodG9rZW4pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZmFjdG9yeSA9IGluamVjdGFibGVEZWYgIT09IG51bGwgPyBpbmplY3RhYmxlRGVmLmZhY3RvcnkgOiBnZXRGYWN0b3J5RGVmKHRva2VuKTsKICAgIGlmIChmYWN0b3J5ICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICB9CiAgICAvLyBJZiB0aGUgdG9rZW4gaXMgYW4gTmdNb2R1bGUsIGl0J3MgYWxzbyBpbmplY3RhYmxlIGJ1dCB0aGUgZmFjdG9yeSBpcyBvbiBpdHMgaW5qZWN0b3IgZGVmCiAgICAvLyAoYMm1aW5qYCkKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluamVjdG9yRGVmID0gZ2V0SW5qZWN0b3JEZWYodG9rZW4pOwogICAgaWYgKGluamVjdG9yRGVmICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGluamVjdG9yRGVmLmZhY3Rvcnk7CiAgICB9CiAgICAvLyBJbmplY3Rpb25Ub2tlbnMgc2hvdWxkIGhhdmUgYW4gaW5qZWN0YWJsZSBkZWYgKMm1cHJvdikgYW5kIHRodXMgc2hvdWxkIGJlIGhhbmRsZWQgYWJvdmUuCiAgICAvLyBJZiBpdCdzIG1pc3NpbmcgdGhhdCwgaXQncyBhbiBlcnJvci4KICAgIGlmICh0b2tlbiBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiAke3N0cmluZ2lmeSh0b2tlbil9IGlzIG1pc3NpbmcgYSDJtXByb3YgZGVmaW5pdGlvbi5gKTsKICAgIH0KICAgIC8vIFVuZGVjb3JhdGVkIHR5cGVzIGNhbiBzb21ldGltZXMgYmUgY3JlYXRlZCBpZiB0aGV5IGhhdmUgbm8gY29uc3RydWN0b3IgYXJndW1lbnRzLgogICAgaWYgKHRva2VuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgICByZXR1cm4gZ2V0VW5kZWNvcmF0ZWRJbmplY3RhYmxlRmFjdG9yeSh0b2tlbik7CiAgICB9CiAgICAvLyBUaGVyZSB3YXMgbm8gd2F5IHRvIHJlc29sdmUgYSBmYWN0b3J5IGZvciB0aGlzIHRva2VuLgogICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlYWNoYWJsZScpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRva2VuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRVbmRlY29yYXRlZEluamVjdGFibGVGYWN0b3J5KHRva2VuKSB7CiAgICAvLyBJZiB0aGUgdG9rZW4gaGFzIHBhcmFtZXRlcnMgdGhlbiBpdCBoYXMgZGVwZW5kZW5jaWVzIHRoYXQgd2UgY2Fubm90IHJlc29sdmUgaW1wbGljaXRseS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhcmFtTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOwogICAgaWYgKHBhcmFtTGVuZ3RoID4gMCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhcmdzID0gbmV3QXJyYXkocGFyYW1MZW5ndGgsICc/Jyk7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciAke3N0cmluZ2lmeSh0b2tlbil9OiAoJHthcmdzLmpvaW4oJywgJyl9KS5gKTsKICAgIH0KICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBhcHBlYXJzIHRvIGhhdmUgbm8gcGFyYW1ldGVycy4KICAgIC8vIFRoaXMgbWlnaHQgYmUgYmVjYXVzZSBpdCBpbmhlcml0cyBmcm9tIGEgc3VwZXItY2xhc3MuIEluIHdoaWNoIGNhc2UsIHVzZSBhbiBpbmplY3RhYmxlCiAgICAvLyBkZWYgZnJvbSBhbiBhbmNlc3RvciBpZiB0aGVyZSBpcyBvbmUuCiAgICAvLyBPdGhlcndpc2UgdGhpcyByZWFsbHkgaXMgYSBzaW1wbGUgY2xhc3Mgd2l0aCBubyBkZXBlbmRlbmNpZXMsIHNvIHJldHVybiBhIGZhY3RvcnkgdGhhdAogICAgLy8ganVzdCBpbnN0YW50aWF0ZXMgdGhlIHplcm8tYXJnIGNvbnN0cnVjdG9yLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5oZXJpdGVkSW5qZWN0YWJsZURlZiA9IGdldEluaGVyaXRlZEluamVjdGFibGVEZWYodG9rZW4pOwogICAgaWYgKGluaGVyaXRlZEluamVjdGFibGVEZWYgIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gaW5oZXJpdGVkSW5qZWN0YWJsZURlZi5mYWN0b3J5KCgvKiogQHR5cGUgez99ICovICh0b2tlbikpKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gbmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAodG9rZW4pKSkoKSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICogQHBhcmFtIHs/fSBuZ01vZHVsZVR5cGUKICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHByb3ZpZGVyVG9SZWNvcmQocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKSB7CiAgICBpZiAoaXNWYWx1ZVByb3ZpZGVyKHByb3ZpZGVyKSkgewogICAgICAgIHJldHVybiBtYWtlUmVjb3JkKHVuZGVmaW5lZCwgcHJvdmlkZXIudXNlVmFsdWUpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSBwcm92aWRlclRvRmFjdG9yeShwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpOwogICAgICAgIHJldHVybiBtYWtlUmVjb3JkKGZhY3RvcnksIE5PVF9ZRVQpOwogICAgfQp9Ci8qKgogKiBDb252ZXJ0cyBhIGBTaW5nbGVQcm92aWRlcmAgaW50byBhIGZhY3RvcnkgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSB7P30gcHJvdmlkZXIgcHJvdmlkZXIgdG8gY29udmVydCB0byBmYWN0b3J5CiAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlVHlwZQogKiBAcGFyYW0gez89fSBwcm92aWRlcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHByb3ZpZGVyVG9GYWN0b3J5KHByb3ZpZGVyLCBuZ01vZHVsZVR5cGUsIHByb3ZpZGVycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZhY3RvcnkgPSB1bmRlZmluZWQ7CiAgICBpZiAoaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHVud3JhcHBlZFByb3ZpZGVyID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIpOwogICAgICAgIHJldHVybiBnZXRGYWN0b3J5RGVmKHVud3JhcHBlZFByb3ZpZGVyKSB8fCBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodW53cmFwcGVkUHJvdmlkZXIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGlzVmFsdWVQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnVzZVZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzRmFjdG9yeVByb3ZpZGVyKHByb3ZpZGVyKSkgewogICAgICAgICAgICBmYWN0b3J5ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gcHJvdmlkZXIudXNlRmFjdG9yeSguLi5pbmplY3RBcmdzKHByb3ZpZGVyLmRlcHMgfHwgW10pKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzRXhpc3RpbmdQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IMm1ybVpbmplY3QocmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIudXNlRXhpc3RpbmcpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmVmID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIgJiYKICAgICAgICAgICAgICAgICgoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyKSkpLnVzZUNsYXNzIHx8IHByb3ZpZGVyLnByb3ZpZGUpKTsKICAgICAgICAgICAgaWYgKCFjbGFzc1JlZikgewogICAgICAgICAgICAgICAgdGhyb3dJbnZhbGlkUHJvdmlkZXJFcnJvcihuZ01vZHVsZVR5cGUsIHByb3ZpZGVycywgcHJvdmlkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoYXNEZXBzKHByb3ZpZGVyKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IG5ldyAoY2xhc3NSZWYpKC4uLmluamVjdEFyZ3MocHJvdmlkZXIuZGVwcykpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRGYWN0b3J5RGVmKGNsYXNzUmVmKSB8fCBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkoY2xhc3NSZWYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhY3Rvcnk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZmFjdG9yeQogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7Pz19IG11bHRpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYWtlUmVjb3JkKGZhY3RvcnksIHZhbHVlLCBtdWx0aSA9IGZhbHNlKSB7CiAgICByZXR1cm4gewogICAgICAgIGZhY3Rvcnk6IGZhY3RvcnksCiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIG11bHRpOiBtdWx0aSA/IFtdIDogdW5kZWZpbmVkLAogICAgfTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNWYWx1ZVByb3ZpZGVyKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIFVTRV9WQUxVRSBpbiB2YWx1ZTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNFeGlzdGluZ1Byb3ZpZGVyKHZhbHVlKSB7CiAgICByZXR1cm4gISEodmFsdWUgJiYgKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS51c2VFeGlzdGluZyk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzRmFjdG9yeVByb3ZpZGVyKHZhbHVlKSB7CiAgICByZXR1cm4gISEodmFsdWUgJiYgKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS51c2VGYWN0b3J5KTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNUeXBlUHJvdmlkZXIodmFsdWUpIHsKICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ2xhc3NQcm92aWRlcih2YWx1ZSkgewogICAgcmV0dXJuICEhKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS51c2VDbGFzczsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzRGVwcyh2YWx1ZSkgewogICAgcmV0dXJuICEhKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS5kZXBzOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBoYXNPbkRlc3Ryb3kodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmCiAgICAgICAgdHlwZW9mICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkubmdPbkRlc3Ryb3kgPT09ICdmdW5jdGlvbic7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvdWxkQmVJbmplY3RhYmxlVHlwZSh2YWx1ZSkgewogICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHx8CiAgICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbik7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAqIEBwYXJhbSB7P30gcGFyZW50CiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gSU5KRUNUT1JfSU1QTF9fUE9TVF9SM19fKHByb3ZpZGVycywgcGFyZW50LCBuYW1lKSB7CiAgICByZXR1cm4gY3JlYXRlSW5qZWN0b3IoeyBuYW1lOiBuYW1lIH0sIHBhcmVudCwgcHJvdmlkZXJzLCBuYW1lKTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IElOSkVDVE9SX0lNUEwgPSBJTkpFQ1RPUl9JTVBMX19QT1NUX1IzX187Ci8qKgogKiBDb25jcmV0ZSBpbmplY3RvcnMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBJbmplY3RvcnMgYXJlIGNvbmZpZ3VyZWQKICogd2l0aCBbcHJvdmlkZXJzXShndWlkZS9nbG9zc2FyeSNwcm92aWRlcikgdGhhdCBhc3NvY2lhdGUKICogZGVwZW5kZW5jaWVzIG9mIHZhcmlvdXMgdHlwZXMgd2l0aCBbaW5qZWN0aW9uIHRva2Vuc10oZ3VpZGUvZ2xvc3NhcnkjZGktdG9rZW4pLgogKgogKiBAc2VlIFsiREkgUHJvdmlkZXJzIl0oZ3VpZGUvZGVwZW5kZW5jeS1pbmplY3Rpb24tcHJvdmlkZXJzKS4KICogQHNlZSBgU3RhdGljUHJvdmlkZXJgCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBzZXJ2aWNlIGluamVjdG9yIGluc3RhbmNlLgogKgogKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvcHJvdmlkZXJfc3BlYy50cyByZWdpb249J0NvbnN0cnVjdG9yUHJvdmlkZXInfQogKgogKiAjIyMgVXNhZ2UgZXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J0luamVjdG9yJ30KICoKICogYEluamVjdG9yYCByZXR1cm5zIGl0c2VsZiB3aGVuIGdpdmVuIGBJbmplY3RvcmAgYXMgYSB0b2tlbjoKICoKICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdpbmplY3RJbmplY3Rvcid9CiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgSW5qZWN0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGNyZWF0ZShvcHRpb25zLCBwYXJlbnQpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkgewogICAgICAgICAgICByZXR1cm4gSU5KRUNUT1JfSU1QTChvcHRpb25zLCBwYXJlbnQsICcnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBJTkpFQ1RPUl9JTVBMKG9wdGlvbnMucHJvdmlkZXJzLCBvcHRpb25zLnBhcmVudCwgb3B0aW9ucy5uYW1lIHx8ICcnKTsKICAgICAgICB9CiAgICB9Cn0KSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5EID0gVEhST1dfSUZfTk9UX0ZPVU5EOwpJbmplY3Rvci5OVUxMID0gbmV3IE51bGxJbmplY3RvcigpOwovKiogQG5vY29sbGFwc2UgKi8KSW5qZWN0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoewogICAgdG9rZW46IEluamVjdG9yLAogICAgcHJvdmlkZWRJbjogKC8qKiBAdHlwZSB7P30gKi8gKCdhbnknKSksCiAgICBmYWN0b3J5OiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiDJtcm1aW5qZWN0KElOSkVDVE9SKSksCn0pOwovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KSW5qZWN0b3IuX19OR19FTEVNRU5UX0lEX18gPSAtMTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3JlZmxlY3RpdmVfZXJyb3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IGtleXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZpbmRGaXJzdENsb3NlZEN5Y2xlKGtleXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHJlcy5pbmRleE9mKGtleXNbaV0pID4gLTEpIHsKICAgICAgICAgICAgcmVzLnB1c2goa2V5c1tpXSk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgICAgIHJlcy5wdXNoKGtleXNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlczsKfQovKioKICogQHBhcmFtIHs/fSBrZXlzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpIHsKICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmV2ZXJzZWQgPSBmaW5kRmlyc3RDbG9zZWRDeWNsZShrZXlzLnNsaWNlKCkucmV2ZXJzZSgpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9rZW5TdHJzID0gcmV2ZXJzZWQubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGsKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGsgPT4gc3RyaW5naWZ5KGsudG9rZW4pKSk7CiAgICAgICAgcmV0dXJuICcgKCcgKyB0b2tlblN0cnMuam9pbignIC0+ICcpICsgJyknOwogICAgfQogICAgcmV0dXJuICcnOwp9Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30ga2V5CiAqIEBwYXJhbSB7P30gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZQogKiBAcGFyYW0gez89fSBvcmlnaW5hbEVycm9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBrZXlzID0gW2tleV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlcnJNc2cgPSBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlKGtleXMpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJyb3IgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKG9yaWdpbmFsRXJyb3IgPyB3cmFwcGVkRXJyb3IoZXJyTXNnLCBvcmlnaW5hbEVycm9yKSA6IEVycm9yKGVyck1zZykpKSk7CiAgICBlcnJvci5hZGRLZXkgPSBhZGRLZXk7CiAgICBlcnJvci5rZXlzID0ga2V5czsKICAgIGVycm9yLmluamVjdG9ycyA9IFtpbmplY3Rvcl07CiAgICBlcnJvci5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlID0gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTsKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZXJyb3IpKSlbRVJST1JfT1JJR0lOQUxfRVJST1JdID0gb3JpZ2luYWxFcnJvcjsKICAgIHJldHVybiBlcnJvcjsKfQovKioKICogQHRoaXMgez99CiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSBrZXkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFkZEtleShpbmplY3Rvciwga2V5KSB7CiAgICB0aGlzLmluamVjdG9ycy5wdXNoKGluamVjdG9yKTsKICAgIHRoaXMua2V5cy5wdXNoKGtleSk7CiAgICAvLyBOb3RlOiBUaGlzIHVwZGF0ZWQgbWVzc2FnZSB3b24ndCBiZSByZWZsZWN0ZWQgaW4gdGhlIGAuc3RhY2tgIHByb3BlcnR5CiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTsKfQovKioKICogVGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJldHJpZXZlIGEgZGVwZW5kZW5jeSBieSBrZXkgZnJvbSB7XEBsaW5rIEluamVjdG9yfSwgYnV0IHRoZQogKiB7XEBsaW5rIEluamVjdG9yfSBkb2VzIG5vdCBoYXZlIGEge1xAbGluayBQcm92aWRlcn0gZm9yIHRoZSBnaXZlbiBrZXkuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgRXhhbXBsZQogKgogKiBgYGB0eXBlc2NyaXB0CiAqIGNsYXNzIEEgewogKiAgIGNvbnN0cnVjdG9yKGI6Qikge30KICogfQogKgogKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTsKICogYGBgCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSBrZXkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vUHJvdmlkZXJFcnJvcihpbmplY3Rvciwga2V5KSB7CiAgICByZXR1cm4gaW5qZWN0aW9uRXJyb3IoaW5qZWN0b3IsIGtleSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBrZXlzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoa2V5cykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaXJzdCA9IHN0cmluZ2lmeShrZXlzWzBdLnRva2VuKTsKICAgICAgICByZXR1cm4gYE5vIHByb3ZpZGVyIGZvciAke2ZpcnN0fSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyl9YDsKICAgIH0pKTsKfQovKioKICogVGhyb3duIHdoZW4gZGVwZW5kZW5jaWVzIGZvcm0gYSBjeWNsZS4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbCiAqICAge3Byb3ZpZGU6ICJvbmUiLCB1c2VGYWN0b3J5OiAodHdvKSA9PiAidHdvIiwgZGVwczogW1tuZXcgSW5qZWN0KCJ0d28iKV1dfSwKICogICB7cHJvdmlkZTogInR3byIsIHVzZUZhY3Rvcnk6IChvbmUpID0+ICJvbmUiLCBkZXBzOiBbW25ldyBJbmplY3QoIm9uZSIpXV19CiAqIF0pOwogKgogKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KCJvbmUiKSkudG9UaHJvd0Vycm9yKCk7CiAqIGBgYAogKgogKiBSZXRyaWV2aW5nIGBBYCBvciBgQmAgdGhyb3dzIGEgYEN5Y2xpY0RlcGVuZGVuY3lFcnJvcmAgYXMgdGhlIGdyYXBoIGFib3ZlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4KICogQHBhcmFtIHs/fSBpbmplY3RvcgogKiBAcGFyYW0gez99IGtleQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3ljbGljRGVwZW5kZW5jeUVycm9yKGluamVjdG9yLCBrZXkpIHsKICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgcmV0dXJuIGBDYW5ub3QgaW5zdGFudGlhdGUgY3ljbGljIGRlcGVuZGVuY3khJHtjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfWA7CiAgICB9KSk7Cn0KLyoqCiAqIFRocm93biB3aGVuIGEgY29uc3RydWN0aW5nIHR5cGUgcmV0dXJucyB3aXRoIGFuIEVycm9yLgogKgogKiBUaGUgYEluc3RhbnRpYXRpb25FcnJvcmAgY2xhc3MgY29udGFpbnMgdGhlIG9yaWdpbmFsIGVycm9yIHBsdXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggd2hpY2ggY2F1c2VkCiAqIHRoaXMgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZC4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogY2xhc3MgQSB7CiAqICAgY29uc3RydWN0b3IoKSB7CiAqICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UnKTsKICogICB9CiAqIH0KICoKICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pOwogKiB0cnkgewogKiAgIGluamVjdG9yLmdldChBKTsKICogfSBjYXRjaCAoZSkgewogKiAgIGV4cGVjdChlIGluc3RhbmNlb2YgSW5zdGFudGlhdGlvbkVycm9yKS50b0JlKHRydWUpOwogKiAgIGV4cGVjdChlLm9yaWdpbmFsRXhjZXB0aW9uLm1lc3NhZ2UpLnRvRXF1YWwoIm1lc3NhZ2UiKTsKICogICBleHBlY3QoZS5vcmlnaW5hbFN0YWNrKS50b0JlRGVmaW5lZCgpOwogKiB9CiAqIGBgYAogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30gb3JpZ2luYWxFeGNlcHRpb24KICogQHBhcmFtIHs/fSBvcmlnaW5hbFN0YWNrCiAqIEBwYXJhbSB7P30ga2V5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnN0YW50aWF0aW9uRXJyb3IoaW5qZWN0b3IsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBrZXkpIHsKICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpcnN0ID0gc3RyaW5naWZ5KGtleXNbMF0udG9rZW4pOwogICAgICAgIHJldHVybiBgJHtvcmlnaW5hbEV4Y2VwdGlvbi5tZXNzYWdlfTogRXJyb3IgZHVyaW5nIGluc3RhbnRpYXRpb24gb2YgJHtmaXJzdH0hJHtjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfS5gOwogICAgfSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKfQovKioKICogVGhyb3duIHdoZW4gYW4gb2JqZWN0IG90aGVyIHRoZW4ge1xAbGluayBQcm92aWRlcn0gKG9yIGBUeXBlYCkgaXMgcGFzc2VkIHRvIHtcQGxpbmsgSW5qZWN0b3J9CiAqIGNyZWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbIm5vdCBhIHR5cGUiXSkpLnRvVGhyb3dFcnJvcigpOwogKiBgYGAKICogQHBhcmFtIHs/fSBwcm92aWRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW52YWxpZFByb3ZpZGVyRXJyb3IocHJvdmlkZXIpIHsKICAgIHJldHVybiBFcnJvcihgSW52YWxpZCBwcm92aWRlciAtIG9ubHkgaW5zdGFuY2VzIG9mIFByb3ZpZGVyIGFuZCBUeXBlIGFyZSBhbGxvd2VkLCBnb3Q6ICR7cHJvdmlkZXJ9YCk7Cn0KLyoqCiAqIFRocm93biB3aGVuIHRoZSBjbGFzcyBoYXMgbm8gYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4KICoKICogTGFjayBvZiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHByZXZlbnRzIHRoZSB7XEBsaW5rIEluamVjdG9yfSBmcm9tIGRldGVybWluaW5nIHdoaWNoIGRlcGVuZGVuY2llcwogKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBjbGFzcyBBIHsKICogICBjb25zdHJ1Y3RvcihiKSB7fQogKiB9CiAqCiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSkpLnRvVGhyb3dFcnJvcigpOwogKiBgYGAKICoKICogVGhpcyBlcnJvciBpcyBhbHNvIHRocm93biB3aGVuIHRoZSBjbGFzcyBub3QgbWFya2VkIHdpdGgge1xAbGluayBJbmplY3RhYmxlfSBoYXMgcGFyYW1ldGVyIHR5cGVzLgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIGNsYXNzIEIge30KICoKICogY2xhc3MgQSB7CiAqICAgY29uc3RydWN0b3IoYjpCKSB7fSAvLyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIEEgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCiAqIH0KICoKICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0EsQl0pKS50b1Rocm93RXJyb3IoKTsKICogYGBgCiAqCiAqIEBwYXJhbSB7P30gdHlwZU9yRnVuYwogKiBAcGFyYW0gez99IHBhcmFtcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzaWduYXR1cmUgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBhcmFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHBhcmFtc1tpXTsKICAgICAgICBpZiAoIXBhcmFtZXRlciB8fCBwYXJhbWV0ZXIubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgc2lnbmF0dXJlLnB1c2goJz8nKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNpZ25hdHVyZS5wdXNoKHBhcmFtZXRlci5tYXAoc3RyaW5naWZ5KS5qb2luKCcgJykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBFcnJvcignQ2Fubm90IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwnJyArIHN0cmluZ2lmeSh0eXBlT3JGdW5jKSArICdcJygnICsKICAgICAgICBzaWduYXR1cmUuam9pbignLCAnKSArICcpLiAnICsKICAgICAgICAnTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBkZWNvcmF0ZWQgd2l0aCBJbmplY3Qgb3IgaGF2ZSB2YWxpZCB0eXBlIGFubm90YXRpb25zIGFuZCB0aGF0IFwnJyArCiAgICAgICAgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgJ1wnIGlzIGRlY29yYXRlZCB3aXRoIEluamVjdGFibGUuJyk7Cn0KLyoqCiAqIFRocm93biB3aGVuIGdldHRpbmcgYW4gb2JqZWN0IGJ5IGluZGV4LgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBjbGFzcyBBIHt9CiAqCiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKTsKICoKICogZXhwZWN0KCgpID0+IGluamVjdG9yLmdldEF0KDEwMCkpLnRvVGhyb3dFcnJvcigpOwogKiBgYGAKICoKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gb3V0T2ZCb3VuZHNFcnJvcihpbmRleCkgewogICAgcmV0dXJuIEVycm9yKGBJbmRleCAke2luZGV4fSBpcyBvdXQtb2YtYm91bmRzLmApOwp9Ci8vIFRPRE86IGFkZCBhIHdvcmtpbmcgZXhhbXBsZSBhZnRlciBhbHBoYTM4IGlzIHJlbGVhc2VkCi8qKgogKiBUaHJvd24gd2hlbiBhIG11bHRpIHByb3ZpZGVyIGFuZCBhIHJlZ3VsYXIgcHJvdmlkZXIgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIHRva2VuLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbCiAqICAgeyBwcm92aWRlOiAiU3RyaW5ncyIsIHVzZVZhbHVlOiAic3RyaW5nMSIsIG11bHRpOiB0cnVlfSwKICogICB7IHByb3ZpZGU6ICJTdHJpbmdzIiwgdXNlVmFsdWU6ICJzdHJpbmcyIiwgbXVsdGk6IGZhbHNlfQogKiBdKSkudG9UaHJvd0Vycm9yKCk7CiAqIGBgYAogKiBAcGFyYW0gez99IHByb3ZpZGVyMQogKiBAcGFyYW0gez99IHByb3ZpZGVyMgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSB7CiAgICByZXR1cm4gRXJyb3IoYENhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycywgZ290OiAke3Byb3ZpZGVyMX0gJHtwcm92aWRlcjJ9YCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3JlZmxlY3RpdmVfa2V5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIHVuaXF1ZSBvYmplY3QgdXNlZCBmb3IgcmV0cmlldmluZyBpdGVtcyBmcm9tIHRoZSB7XEBsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0uCiAqCiAqIEtleXMgaGF2ZToKICogLSBhIHN5c3RlbS13aWRlIHVuaXF1ZSBgaWRgLgogKiAtIGEgYHRva2VuYC4KICoKICogYEtleWAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHtcQGxpbmsgUmVmbGVjdGl2ZUluamVjdG9yfSBiZWNhdXNlIGl0cyBzeXN0ZW0td2lkZSB1bmlxdWUgYGlkYCBhbGxvd3MKICogdGhlCiAqIGluamVjdG9yIHRvIHN0b3JlIGNyZWF0ZWQgb2JqZWN0cyBpbiBhIG1vcmUgZWZmaWNpZW50IHdheS4KICoKICogYEtleWAgc2hvdWxkIG5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5LiB7XEBsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0gY3JlYXRlcyBrZXlzIGF1dG9tYXRpY2FsbHkgd2hlbgogKiByZXNvbHZpbmcKICogcHJvdmlkZXJzLgogKgogKiBAZGVwcmVjYXRlZCBObyByZXBsYWNlbWVudAogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUmVmbGVjdGl2ZUtleSB7CiAgICAvKioKICAgICAqIFByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAqLwogICAgY29uc3RydWN0b3IodG9rZW4sIGlkKSB7CiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuOwogICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICBpZiAoIXRva2VuKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gbXVzdCBiZSBkZWZpbmVkIScpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gc3RyaW5naWZ5KHRoaXMudG9rZW4pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgYSBgS2V5YCBmb3IgYSB0b2tlbi4KICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBnZXQodG9rZW4pIHsKICAgICAgICByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5LmdldChyZXNvbHZlRm9yd2FyZFJlZih0b2tlbikpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fSB0aGUgbnVtYmVyIG9mIGtleXMgcmVnaXN0ZXJlZCBpbiB0aGUgc3lzdGVtLgogICAgICovCiAgICBzdGF0aWMgZ2V0IG51bWJlck9mS2V5cygpIHsKICAgICAgICByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5Lm51bWJlck9mS2V5czsKICAgIH0KfQpjbGFzcyBLZXlSZWdpc3RyeSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9hbGxLZXlzID0gbmV3IE1hcCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4pIHsKICAgICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBSZWZsZWN0aXZlS2V5KQogICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgaWYgKHRoaXMuX2FsbEtleXMuaGFzKHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2FsbEtleXMuZ2V0KHRva2VuKSkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3S2V5ID0gbmV3IFJlZmxlY3RpdmVLZXkodG9rZW4sIFJlZmxlY3RpdmVLZXkubnVtYmVyT2ZLZXlzKTsKICAgICAgICB0aGlzLl9hbGxLZXlzLnNldCh0b2tlbiwgbmV3S2V5KTsKICAgICAgICByZXR1cm4gbmV3S2V5OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbnVtYmVyT2ZLZXlzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hbGxLZXlzLnNpemU7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfZ2xvYmFsS2V5UmVnaXN0cnkgPSBuZXcgS2V5UmVnaXN0cnkoKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFByb3ZpZGVzIGFjY2VzcyB0byByZWZsZWN0aW9uIGRhdGEgYWJvdXQgc3ltYm9scy4gVXNlZCBpbnRlcm5hbGx5IGJ5IEFuZ3VsYXIKICogdG8gcG93ZXIgZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIGNvbXBpbGF0aW9uLgogKi8KY2xhc3MgUmVmbGVjdG9yIHsKICAgIGNvbnN0cnVjdG9yKHJlZmxlY3Rpb25DYXBhYmlsaXRpZXMpIHsKICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSByZWZsZWN0aW9uQ2FwYWJpbGl0aWVzOwogICAgfQogICAgdXBkYXRlQ2FwYWJpbGl0aWVzKGNhcHMpIHsKICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBjYXBzOwogICAgfQogICAgZmFjdG9yeSh0eXBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5mYWN0b3J5KHR5cGUpOwogICAgfQogICAgcGFyYW1ldGVycyh0eXBlT3JGdW5jKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wYXJhbWV0ZXJzKHR5cGVPckZ1bmMpOwogICAgfQogICAgYW5ub3RhdGlvbnModHlwZU9yRnVuYykgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuYW5ub3RhdGlvbnModHlwZU9yRnVuYyk7CiAgICB9CiAgICBwcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpOwogICAgfQogICAgaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCBsY1Byb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5oYXNMaWZlY3ljbGVIb29rKHR5cGUsIGxjUHJvcGVydHkpOwogICAgfQogICAgZ2V0dGVyKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlcihuYW1lKTsKICAgIH0KICAgIHNldHRlcihuYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIobmFtZSk7CiAgICB9CiAgICBtZXRob2QobmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMubWV0aG9kKG5hbWUpOwogICAgfQogICAgaW1wb3J0VXJpKHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSh0eXBlKTsKICAgIH0KICAgIHJlc291cmNlVXJpKHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc291cmNlVXJpKHR5cGUpOwogICAgfQogICAgcmVzb2x2ZUlkZW50aWZpZXIobmFtZSwgbW9kdWxlVXJsLCBtZW1iZXJzLCBydW50aW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5yZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpOwogICAgfQogICAgcmVzb2x2ZUVudW0oaWRlbnRpZmllciwgbmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb2x2ZUVudW0oaWRlbnRpZmllciwgbmFtZSk7CiAgICB9Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoZSB7QGxpbmsgUmVmbGVjdG9yfSB1c2VkIGludGVybmFsbHkgaW4gQW5ndWxhciB0byBhY2Nlc3MgbWV0YWRhdGEKICogYWJvdXQgc3ltYm9scy4KICovCmNvbnN0IHJlZmxlY3RvciA9IG5ldyBSZWZsZWN0b3IobmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKSk7Ci8qKgogKiBgRGVwZW5kZW5jeWAgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGV4dGVuZCBESS4KICogVGhpcyBpcyBpbnRlcm5hbCB0byBBbmd1bGFyIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuCiAqLwpjbGFzcyBSZWZsZWN0aXZlRGVwZW5kZW5jeSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IG9wdGlvbmFsCiAgICAgKiBAcGFyYW0gez99IHZpc2liaWxpdHkKICAgICAqLwogICAgY29uc3RydWN0b3Ioa2V5LCBvcHRpb25hbCwgdmlzaWJpbGl0eSkgewogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGZyb21LZXkoa2V5KSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlRGVwZW5kZW5jeShrZXksIGZhbHNlLCBudWxsKTsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9FTVBUWV9MSVNUID0gW107CmNsYXNzIFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVyXyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IHJlc29sdmVkRmFjdG9yaWVzCiAgICAgKiBAcGFyYW0gez99IG11bHRpUHJvdmlkZXIKICAgICAqLwogICAgY29uc3RydWN0b3Ioa2V5LCByZXNvbHZlZEZhY3RvcmllcywgbXVsdGlQcm92aWRlcikgewogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIHRoaXMucmVzb2x2ZWRGYWN0b3JpZXMgPSByZXNvbHZlZEZhY3RvcmllczsKICAgICAgICB0aGlzLm11bHRpUHJvdmlkZXIgPSBtdWx0aVByb3ZpZGVyOwogICAgICAgIHRoaXMucmVzb2x2ZWRGYWN0b3J5ID0gdGhpcy5yZXNvbHZlZEZhY3Rvcmllc1swXTsKICAgIH0KfQovKioKICogQW4gaW50ZXJuYWwgcmVzb2x2ZWQgcmVwcmVzZW50YXRpb24gb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZWQgYnkgcmVzb2x2aW5nIGBQcm92aWRlcmAuCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmYWN0b3J5CiAgICAgKiBAcGFyYW0gez99IGRlcGVuZGVuY2llcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihmYWN0b3J5LCBkZXBlbmRlbmNpZXMpIHsKICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzOwogICAgfQp9Ci8qKgogKiBSZXNvbHZlIGEgc2luZ2xlIHByb3ZpZGVyLgogKiBAcGFyYW0gez99IHByb3ZpZGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZUZhY3RvcnkocHJvdmlkZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBmYWN0b3J5Rm47CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzb2x2ZWREZXBzOwogICAgaWYgKHByb3ZpZGVyLnVzZUNsYXNzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHVzZUNsYXNzID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIudXNlQ2xhc3MpOwogICAgICAgIGZhY3RvcnlGbiA9IHJlZmxlY3Rvci5mYWN0b3J5KHVzZUNsYXNzKTsKICAgICAgICByZXNvbHZlZERlcHMgPSBfZGVwZW5kZW5jaWVzRm9yKHVzZUNsYXNzKTsKICAgIH0KICAgIGVsc2UgaWYgKHByb3ZpZGVyLnVzZUV4aXN0aW5nKSB7CiAgICAgICAgZmFjdG9yeUZuID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWxpYXNJbnN0YW5jZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGFsaWFzSW5zdGFuY2UpID0+IGFsaWFzSW5zdGFuY2UpOwogICAgICAgIHJlc29sdmVkRGVwcyA9IFtSZWZsZWN0aXZlRGVwZW5kZW5jeS5mcm9tS2V5KFJlZmxlY3RpdmVLZXkuZ2V0KHByb3ZpZGVyLnVzZUV4aXN0aW5nKSldOwogICAgfQogICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRmFjdG9yeSkgewogICAgICAgIGZhY3RvcnlGbiA9IHByb3ZpZGVyLnVzZUZhY3Rvcnk7CiAgICAgICAgcmVzb2x2ZWREZXBzID0gY29uc3RydWN0RGVwZW5kZW5jaWVzKHByb3ZpZGVyLnVzZUZhY3RvcnksIHByb3ZpZGVyLmRlcHMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZmFjdG9yeUZuID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gcHJvdmlkZXIudXNlVmFsdWUpOwogICAgICAgIHJlc29sdmVkRGVwcyA9IF9FTVBUWV9MSVNUOwogICAgfQogICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KGZhY3RvcnlGbiwgcmVzb2x2ZWREZXBzKTsKfQovKioKICogQ29udmVydHMgdGhlIGBQcm92aWRlcmAgaW50byBgUmVzb2x2ZWRQcm92aWRlcmAuCiAqCiAqIGBJbmplY3RvcmAgaW50ZXJuYWxseSBvbmx5IHVzZXMgYFJlc29sdmVkUHJvdmlkZXJgLCBgUHJvdmlkZXJgIGNvbnRhaW5zIGNvbnZlbmllbmNlIHByb3ZpZGVyCiAqIHN5bnRheC4KICogQHBhcmFtIHs/fSBwcm92aWRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcihwcm92aWRlcikgewogICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl8oUmVmbGVjdGl2ZUtleS5nZXQocHJvdmlkZXIucHJvdmlkZSksIFtyZXNvbHZlUmVmbGVjdGl2ZUZhY3RvcnkocHJvdmlkZXIpXSwgcHJvdmlkZXIubXVsdGkgfHwgZmFsc2UpOwp9Ci8qKgogKiBSZXNvbHZlIGEgbGlzdCBvZiBQcm92aWRlcnMuCiAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplUHJvdmlkZXJzKHByb3ZpZGVycywgW10pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzb2x2ZWQgPSBub3JtYWxpemVkLm1hcChyZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVyKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc29sdmVkUHJvdmlkZXJNYXAgPSBtZXJnZVJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyhyZXNvbHZlZCwgbmV3IE1hcCgpKTsKICAgIHJldHVybiBBcnJheS5mcm9tKHJlc29sdmVkUHJvdmlkZXJNYXAudmFsdWVzKCkpOwp9Ci8qKgogKiBNZXJnZXMgYSBsaXN0IG9mIFJlc29sdmVkUHJvdmlkZXJzIGludG8gYSBsaXN0IHdoZXJlIGVhY2gga2V5IGlzIGNvbnRhaW5lZCBleGFjdGx5IG9uY2UgYW5kCiAqIG11bHRpIHByb3ZpZGVycyBoYXZlIGJlZW4gbWVyZ2VkLgogKiBAcGFyYW0gez99IHByb3ZpZGVycwogKiBAcGFyYW0gez99IG5vcm1hbGl6ZWRQcm92aWRlcnNNYXAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1lcmdlUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzKHByb3ZpZGVycywgbm9ybWFsaXplZFByb3ZpZGVyc01hcCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBwcm92aWRlcnNbaV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gbm9ybWFsaXplZFByb3ZpZGVyc01hcC5nZXQocHJvdmlkZXIua2V5LmlkKTsKICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIgIT09IGV4aXN0aW5nLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZywgcHJvdmlkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm92aWRlci5tdWx0aVByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucmVzb2x2ZWRGYWN0b3JpZXMucHVzaChwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1tqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJzTWFwLnNldChwcm92aWRlci5rZXkuaWQsIHByb3ZpZGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVzb2x2ZWRQcm92aWRlcjsKICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKHByb3ZpZGVyLmtleSwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMuc2xpY2UoKSwgcHJvdmlkZXIubXVsdGlQcm92aWRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9ybWFsaXplZFByb3ZpZGVyc01hcC5zZXQocHJvdmlkZXIua2V5LmlkLCByZXNvbHZlZFByb3ZpZGVyKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9ybWFsaXplZFByb3ZpZGVyc01hcDsKfQovKioKICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHBhcmFtIHs/fSByZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9ub3JtYWxpemVQcm92aWRlcnMocHJvdmlkZXJzLCByZXMpIHsKICAgIHByb3ZpZGVycy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gYgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYiA9PiB7CiAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBUeXBlKSB7CiAgICAgICAgICAgIHJlcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh7IHByb3ZpZGU6IGIsIHVzZUNsYXNzOiBiIH0pKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGIgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcgJiYgKCgvKiogQHR5cGUgez99ICovIChiKSkpLnByb3ZpZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXMucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAoYikpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiKSkgewogICAgICAgICAgICBfbm9ybWFsaXplUHJvdmlkZXJzKGIsIHJlcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUHJvdmlkZXJFcnJvcihiKTsKICAgICAgICB9CiAgICB9KSk7CiAgICByZXR1cm4gcmVzOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGVPckZ1bmMKICogQHBhcmFtIHs/PX0gZGVwZW5kZW5jaWVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb25zdHJ1Y3REZXBlbmRlbmNpZXModHlwZU9yRnVuYywgZGVwZW5kZW5jaWVzKSB7CiAgICBpZiAoIWRlcGVuZGVuY2llcykgewogICAgICAgIHJldHVybiBfZGVwZW5kZW5jaWVzRm9yKHR5cGVPckZ1bmMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmFtcyA9IGRlcGVuZGVuY2llcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdCA9PiBbdF0pKTsKICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0ID0+IF9leHRyYWN0VG9rZW4odHlwZU9yRnVuYywgdCwgcGFyYW1zKSkpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGVPckZ1bmMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9kZXBlbmRlbmNpZXNGb3IodHlwZU9yRnVuYykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyYW1zID0gcmVmbGVjdG9yLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7CiAgICBpZiAoIXBhcmFtcykKICAgICAgICByZXR1cm4gW107CiAgICBpZiAocGFyYW1zLnNvbWUoKC8qKgogICAgICogQHBhcmFtIHs/fSBwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwID0+IHAgPT0gbnVsbCkpKSB7CiAgICAgICAgdGhyb3cgbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTsKICAgIH0KICAgIHJldHVybiBwYXJhbXMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcCA9PiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHAsIHBhcmFtcykpKTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHBhcmFtIHs/fSBwYXJhbXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9leHRyYWN0VG9rZW4odHlwZU9yRnVuYywgbWV0YWRhdGEsIHBhcmFtcykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHRva2VuID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBvcHRpb25hbCA9IGZhbHNlOwogICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkgewogICAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdCkgewogICAgICAgICAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kobWV0YWRhdGEudG9rZW4sIG9wdGlvbmFsLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeShtZXRhZGF0YSwgb3B0aW9uYWwsIG51bGwpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aXNpYmlsaXR5ID0gbnVsbDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YWRhdGEubGVuZ3RoOyArK2kpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyYW1NZXRhZGF0YSA9IG1ldGFkYXRhW2ldOwogICAgICAgIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgVHlwZSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBJbmplY3QpIHsKICAgICAgICAgICAgdG9rZW4gPSBwYXJhbU1ldGFkYXRhLnRva2VuOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgT3B0aW9uYWwpIHsKICAgICAgICAgICAgb3B0aW9uYWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2VsZiB8fCBwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2tpcFNlbGYpIHsKICAgICAgICAgICAgdmlzaWJpbGl0eSA9IHBhcmFtTWV0YWRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgewogICAgICAgICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGE7CiAgICAgICAgfQogICAgfQogICAgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZih0b2tlbik7CiAgICBpZiAodG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeSh0b2tlbiwgb3B0aW9uYWwsIHZpc2liaWxpdHkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGhyb3cgbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcGFyYW0gez99IG9wdGlvbmFsCiAqIEBwYXJhbSB7P30gdmlzaWJpbGl0eQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCB2aXNpYmlsaXR5KSB7CiAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVEZXBlbmRlbmN5KFJlZmxlY3RpdmVLZXkuZ2V0KHRva2VuKSwgb3B0aW9uYWwsIHZpc2liaWxpdHkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9yZWZsZWN0aXZlX2luamVjdG9yLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIFRocmVzaG9sZCBmb3IgdGhlIGR5bmFtaWMgdmVyc2lvbgovKiogQHR5cGUgez99ICovCmNvbnN0IFVOREVGSU5FRCA9IHt9OwovKioKICogQSBSZWZsZWN0aXZlRGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgb2JqZWN0cyBhbmQgcmVzb2x2aW5nCiAqIGRlcGVuZGVuY2llcy4KICoKICogQW4gYEluamVjdG9yYCBpcyBhIHJlcGxhY2VtZW50IGZvciBhIGBuZXdgIG9wZXJhdG9yLCB3aGljaCBjYW4gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZQogKiBjb25zdHJ1Y3RvciBkZXBlbmRlbmNpZXMuCiAqCiAqIEluIHR5cGljYWwgdXNlLCBhcHBsaWNhdGlvbiBjb2RlIGFza3MgZm9yIHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGV5IGFyZQogKiByZXNvbHZlZCBieSB0aGUgYEluamVjdG9yYC4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGFuIGBJbmplY3RvcmAgY29uZmlndXJlZCB0byBjcmVhdGUgYEVuZ2luZWAgYW5kIGBDYXJgLgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIFxASW5qZWN0YWJsZSgpCiAqIGNsYXNzIEVuZ2luZSB7CiAqIH0KICoKICogXEBJbmplY3RhYmxlKCkKICogY2xhc3MgQ2FyIHsKICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge30KICogfQogKgogKiB2YXIgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQ2FyLCBFbmdpbmVdKTsKICogdmFyIGNhciA9IGluamVjdG9yLmdldChDYXIpOwogKiBleHBlY3QoY2FyIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpOwogKiBleHBlY3QoY2FyLmVuZ2luZSBpbnN0YW5jZW9mIEVuZ2luZSkudG9CZSh0cnVlKTsKICogYGBgCiAqCiAqIE5vdGljZSwgd2UgZG9uJ3QgdXNlIHRoZSBgbmV3YCBvcGVyYXRvciBiZWNhdXNlIHdlIGV4cGxpY2l0bHkgd2FudCB0byBoYXZlIHRoZSBgSW5qZWN0b3JgCiAqIHJlc29sdmUgYWxsIG9mIHRoZSBvYmplY3QncyBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS4KICoKICogQGRlcHJlY2F0ZWQgZnJvbSB2NSAtIHNsb3cgYW5kIGJyaW5ncyBpbiBhIGxvdCBvZiBjb2RlLCBVc2UgYEluamVjdG9yLmNyZWF0ZWAgaW5zdGVhZC4KICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBSZWZsZWN0aXZlSW5qZWN0b3IgewogICAgLyoqCiAgICAgKiBUdXJucyBhbiBhcnJheSBvZiBwcm92aWRlciBkZWZpbml0aW9ucyBpbnRvIGFuIGFycmF5IG9mIHJlc29sdmVkIHByb3ZpZGVycy4KICAgICAqCiAgICAgKiBBIHJlc29sdXRpb24gaXMgYSBwcm9jZXNzIG9mIGZsYXR0ZW5pbmcgbXVsdGlwbGUgbmVzdGVkIGFycmF5cyBhbmQgY29udmVydGluZyBpbmRpdmlkdWFsCiAgICAgKiBwcm92aWRlcnMgaW50byBhbiBhcnJheSBvZiBgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJgcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogXEBJbmplY3RhYmxlKCkKICAgICAqIGNsYXNzIEVuZ2luZSB7CiAgICAgKiB9CiAgICAgKiAgLwogICAgICogY2xhc3MgQ2FyIHsKICAgICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9CiAgICAgKiB9CiAgICAgKgogICAgICogdmFyIHByb3ZpZGVycyA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtDYXIsIFtbRW5naW5lXV1dKTsKICAgICAqCiAgICAgKiBleHBlY3QocHJvdmlkZXJzLmxlbmd0aCkudG9FcXVhbCgyKTsKICAgICAqCiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXIpLnRvQmUodHJ1ZSk7CiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmtleS5kaXNwbGF5TmFtZSkudG9CZSgiQ2FyIik7CiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmRlcGVuZGVuY2llcy5sZW5ndGgpLnRvRXF1YWwoMSk7CiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmZhY3RvcnkpLnRvQmVEZWZpbmVkKCk7CiAgICAgKgogICAgICogZXhwZWN0KHByb3ZpZGVyc1sxXS5rZXkuZGlzcGxheU5hbWUpLnRvQmUoIkVuZ2luZSIpOwogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIHJlc29sdmUocHJvdmlkZXJzKSB7CiAgICAgICAgcmV0dXJuIHJlc29sdmVSZWZsZWN0aXZlUHJvdmlkZXJzKHByb3ZpZGVycyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlc29sdmVzIGFuIGFycmF5IG9mIHByb3ZpZGVycyBhbmQgY3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHRob3NlIHByb3ZpZGVycy4KICAgICAqCiAgICAgKiBUaGUgcGFzc2VkLWluIHByb3ZpZGVycyBjYW4gYmUgYW4gYXJyYXkgb2YgYFR5cGVgLCBgUHJvdmlkZXJgLAogICAgICogb3IgYSByZWN1cnNpdmUgYXJyYXkgb2YgbW9yZSBwcm92aWRlcnMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgKiBjbGFzcyBFbmdpbmUgewogICAgICogfQogICAgICogIC8KICAgICAqIGNsYXNzIENhciB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fQogICAgICogfQogICAgICoKICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pOwogICAgICogZXhwZWN0KGluamVjdG9yLmdldChDYXIpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpOwogICAgICogYGBgCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHBhcmFtIHs/PX0gcGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgcmVzb2x2ZUFuZENyZWF0ZShwcm92aWRlcnMsIHBhcmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShwcm92aWRlcnMpOwogICAgICAgIHJldHVybiBSZWZsZWN0aXZlSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycywgcGFyZW50KTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHByZXZpb3VzbHkgcmVzb2x2ZWQgcHJvdmlkZXJzLgogICAgICoKICAgICAqIFRoaXMgQVBJIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gY29uc3RydWN0IGluamVjdG9ycyBpbiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgcGFydHMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgKiBjbGFzcyBFbmdpbmUgewogICAgICogfQogICAgICogIC8KICAgICAqIGNsYXNzIENhciB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fQogICAgICogfQogICAgICoKICAgICAqIHZhciBwcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShbQ2FyLCBFbmdpbmVdKTsKICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMocHJvdmlkZXJzKTsKICAgICAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTsKICAgICAqIGBgYAogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGZyb21SZXNvbHZlZFByb3ZpZGVycyhwcm92aWRlcnMsIHBhcmVudCkgewogICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGl2ZUluamVjdG9yXyhwcm92aWRlcnMsIHBhcmVudCk7CiAgICB9Cn0KY2xhc3MgUmVmbGVjdGl2ZUluamVjdG9yXyB7CiAgICAvKioKICAgICAqIFByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gX3Byb3ZpZGVycwogICAgICogQHBhcmFtIHs/PX0gX3BhcmVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcHJvdmlkZXJzLCBfcGFyZW50KSB7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwOwogICAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IF9wcm92aWRlcnM7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBfcGFyZW50IHx8IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxlbiA9IF9wcm92aWRlcnMubGVuZ3RoOwogICAgICAgIHRoaXMua2V5SWRzID0gW107CiAgICAgICAgdGhpcy5vYmpzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICB0aGlzLmtleUlkc1tpXSA9IF9wcm92aWRlcnNbaV0ua2V5LmlkOwogICAgICAgICAgICB0aGlzLm9ianNbaV0gPSBVTkRFRklORUQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUgPSBUSFJPV19JRl9OT1RfRk9VTkQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXkoUmVmbGVjdGl2ZUtleS5nZXQodG9rZW4pLCBudWxsLCBub3RGb3VuZFZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc29sdmVBbmRDcmVhdGVDaGlsZChwcm92aWRlcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUocHJvdmlkZXJzKTsKICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQocHJvdmlkZXJzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaiA9IG5ldyBSZWZsZWN0aXZlSW5qZWN0b3JfKHByb3ZpZGVycyk7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChpbmopKSkucGFyZW50ID0gdGhpczsKICAgICAgICByZXR1cm4gaW5qOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNvbHZlQW5kSW5zdGFudGlhdGUocHJvdmlkZXIpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW50aWF0ZVJlc29sdmVkKFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtwcm92aWRlcl0pWzBdKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5zdGFudGlhdGVSZXNvbHZlZChwcm92aWRlcikgewogICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4KSB7CiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9wcm92aWRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG91dE9mQm91bmRzRXJyb3IoaW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcHJvdmlkZXJzW2luZGV4XTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX25ldyhwcm92aWRlcikgewogICAgICAgIGlmICh0aGlzLl9jb25zdHJ1Y3Rpb25Db3VudGVyKysgPiB0aGlzLl9nZXRNYXhOdW1iZXJPZk9iamVjdHMoKSkgewogICAgICAgICAgICB0aHJvdyBjeWNsaWNEZXBlbmRlbmN5RXJyb3IodGhpcywgcHJvdmlkZXIua2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE1heE51bWJlck9mT2JqZWN0cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5vYmpzLmxlbmd0aDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKSB7CiAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgcmVzW2ldID0gdGhpcy5faW5zdGFudGlhdGUocHJvdmlkZXIsIHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1swXSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHBhcmFtIHs/fSBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaW5zdGFudGlhdGUocHJvdmlkZXIsIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjdG9yeSA9IFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkuZmFjdG9yeTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRlcHM7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZGVwcyA9CiAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5LmRlcGVuZGVuY2llcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRlcCA9PiB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KGRlcCkpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKGUuYWRkS2V5KSB7CiAgICAgICAgICAgICAgICBlLmFkZEtleSh0aGlzLCBwcm92aWRlci5rZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoLi4uZGVwcyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRocm93IGluc3RhbnRpYXRpb25FcnJvcih0aGlzLCBlLCBlLnN0YWNrLCBwcm92aWRlci5rZXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KGRlcCkgewogICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleShkZXAua2V5LCBkZXAudmlzaWJpbGl0eSwgZGVwLm9wdGlvbmFsID8gbnVsbCA6IFRIUk9XX0lGX05PVF9GT1VORCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSB2aXNpYmlsaXR5CiAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kVmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRCeUtleShrZXksIHZpc2liaWxpdHksIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICBpZiAoa2V5ID09PSBSZWZsZWN0aXZlSW5qZWN0b3JfLklOSkVDVE9SX0tFWSkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2liaWxpdHkgaW5zdGFuY2VvZiBTZWxmKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleVNlbGYoa2V5LCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleURlZmF1bHQoa2V5LCBub3RGb3VuZFZhbHVlLCB2aXNpYmlsaXR5KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGtleUlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0T2JqQnlLZXlJZChrZXlJZCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5rZXlJZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRoaXMua2V5SWRzW2ldID09PSBrZXlJZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub2Jqc1tpXSA9PT0gVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmpzW2ldID0gdGhpcy5fbmV3KHRoaXMuX3Byb3ZpZGVyc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmpzW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBVTkRFRklORUQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kVmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICBpZiAobm90Rm91bmRWYWx1ZSAhPT0gVEhST1dfSUZfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbm9Qcm92aWRlckVycm9yKHRoaXMsIGtleSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0QnlLZXlTZWxmKGtleSwgbm90Rm91bmRWYWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvYmogPSB0aGlzLl9nZXRPYmpCeUtleUlkKGtleS5pZCk7CiAgICAgICAgcmV0dXJuIChvYmogIT09IFVOREVGSU5FRCkgPyBvYmogOiB0aGlzLl90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcGFyYW0gez99IHZpc2liaWxpdHkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRCeUtleURlZmF1bHQoa2V5LCBub3RGb3VuZFZhbHVlLCB2aXNpYmlsaXR5KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbmo7CiAgICAgICAgaWYgKHZpc2liaWxpdHkgaW5zdGFuY2VvZiBTa2lwU2VsZikgewogICAgICAgICAgICBpbmogPSB0aGlzLnBhcmVudDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGluaiA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChpbmogaW5zdGFuY2VvZiBSZWZsZWN0aXZlSW5qZWN0b3JfKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5qXyA9ICgvKiogQHR5cGUgez99ICovIChpbmopKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYmogPSBpbmpfLl9nZXRPYmpCeUtleUlkKGtleS5pZCk7CiAgICAgICAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkKICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgIGluaiA9IGlual8ucGFyZW50OwogICAgICAgIH0KICAgICAgICBpZiAoaW5qICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBpbmouZ2V0KGtleS50b2tlbiwgbm90Rm91bmRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGhyb3dPck51bGwoa2V5LCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkaXNwbGF5TmFtZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXJzID0gX21hcFByb3ZpZGVycyh0aGlzLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoYikgPT4gJyAiJyArIGIua2V5LmRpc3BsYXlOYW1lICsgJyIgJykpCiAgICAgICAgICAgIC5qb2luKCcsICcpOwogICAgICAgIHJldHVybiBgUmVmbGVjdGl2ZUluamVjdG9yKHByb3ZpZGVyczogWyR7cHJvdmlkZXJzfV0pYDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheU5hbWU7CiAgICB9Cn0KUmVmbGVjdGl2ZUluamVjdG9yXy5JTkpFQ1RPUl9LRVkgPSBSZWZsZWN0aXZlS2V5LmdldChJbmplY3Rvcik7Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30gZm4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9tYXBQcm92aWRlcnMoaW5qZWN0b3IsIGZuKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0b3IuX3Byb3ZpZGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHJlc1tpXSA9IGZuKGluamVjdG9yLmdldFByb3ZpZGVyQXRJbmRleChpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9pbmRleC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL21ldGFkYXRhL2RpLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIERJIHRva2VuIHRoYXQgeW91IGNhbiB1c2UgdG8gY3JlYXRlIGEgdmlydHVhbCBbcHJvdmlkZXJdKGd1aWRlL2dsb3NzYXJ5I3Byb3ZpZGVyKQogKiB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIGBlbnRyeUNvbXBvbmVudHNgIGZpZWxkIG9mIGNvbXBvbmVudHMgYW5kIE5nTW9kdWxlcwogKiBiYXNlZCBvbiBpdHMgYHVzZVZhbHVlYCBwcm9wZXJ0eSB2YWx1ZS4KICogQWxsIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgYHVzZVZhbHVlYCB2YWx1ZSAoZWl0aGVyIGRpcmVjdGx5CiAqIG9yIGluIGEgbmVzdGVkIGFycmF5IG9yIG1hcCkgYXJlIGFkZGVkIHRvIHRoZSBgZW50cnlDb21wb25lbnRzYCBwcm9wZXJ0eS4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdGhlIHJvdXRlciBjYW4gcG9wdWxhdGUgdGhlIGBlbnRyeUNvbXBvbmVudHNgCiAqIGZpZWxkIG9mIGFuIE5nTW9kdWxlIGJhc2VkIG9uIGEgcm91dGVyIGNvbmZpZ3VyYXRpb24gdGhhdCByZWZlcnMKICogdG8gY29tcG9uZW50cy4KICoKICogYGBgdHlwZXNjcmlwdAogKiAvLyBoZWxwZXIgZnVuY3Rpb24gaW5zaWRlIHRoZSByb3V0ZXIKICogZnVuY3Rpb24gcHJvdmlkZVJvdXRlcyhyb3V0ZXMpIHsKICogICByZXR1cm4gWwogKiAgICAge3Byb3ZpZGU6IFJPVVRFUywgdXNlVmFsdWU6IHJvdXRlc30sCiAqICAgICB7cHJvdmlkZTogQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUywgdXNlVmFsdWU6IHJvdXRlcywgbXVsdGk6IHRydWV9CiAqICAgXTsKICogfQogKgogKiAvLyB1c2VyIGNvZGUKICogbGV0IHJvdXRlcyA9IFsKICogICB7cGF0aDogJy9yb290JywgY29tcG9uZW50OiBSb290Q29tcH0sCiAqICAge3BhdGg6ICcvdGVhbXMnLCBjb21wb25lbnQ6IFRlYW1zQ29tcH0KICogXTsKICoKICogXEBOZ01vZHVsZSh7CiAqICAgcHJvdmlkZXJzOiBbcHJvdmlkZVJvdXRlcyhyb3V0ZXMpXQogKiB9KQogKiBjbGFzcyBNb2R1bGVXaXRoUm91dGVzIHt9CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAZGVwcmVjYXRlZCBTaW5jZSA5LjAuMC4gV2l0aCBJdnksIHRoaXMgcHJvcGVydHkgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KICogQHR5cGUgez99CiAqLwpjb25zdCBBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTID0gbmV3IEluamVjdGlvblRva2VuKCdBbmFseXplRm9yRW50cnlDb21wb25lbnRzJyk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKLyoqCiAqIEJhc2UgY2xhc3MgZm9yIHF1ZXJ5IG1ldGFkYXRhLgogKgogKiBAc2VlIGBDb250ZW50Q2hpbGRyZW5gLgogKiBAc2VlIGBDb250ZW50Q2hpbGRgLgogKiBAc2VlIGBWaWV3Q2hpbGRyZW5gLgogKiBAc2VlIGBWaWV3Q2hpbGRgLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIFF1ZXJ5IHsKfQpjb25zdCDJtTAkYSA9IC8qKgogKiBAcGFyYW0gez89fSBzZWxlY3RvcgogKiBAcGFyYW0gez89fSBkYXRhCiAqIEByZXR1cm4gez99CiAqLwooc2VsZWN0b3IsIGRhdGEgPSB7fSkgPT4gKE9iamVjdC5hc3NpZ24oeyBzZWxlY3RvciwgZmlyc3Q6IGZhbHNlLCBpc1ZpZXdRdWVyeTogZmFsc2UsIGRlc2NlbmRhbnRzOiBmYWxzZSB9LCBkYXRhKSk7Ci8qKgogKiBDb250ZW50Q2hpbGRyZW4gZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ29udGVudENoaWxkcmVuID0gbWFrZVByb3BEZWNvcmF0b3IoJ0NvbnRlbnRDaGlsZHJlbicsICjJtTAkYSksIFF1ZXJ5KTsKY29uc3QgybUxJDIgPSAvKioKICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICogQHBhcmFtIHs/PX0gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KKHNlbGVjdG9yLCBkYXRhID0ge30pID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiB0cnVlLCBpc1ZpZXdRdWVyeTogZmFsc2UsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTsKLyoqCiAqIENvbnRlbnRDaGlsZCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogKgogKgogKiBcQEFubm90YXRpb24KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBDb250ZW50Q2hpbGQgPSBtYWtlUHJvcERlY29yYXRvcignQ29udGVudENoaWxkJywgKMm1MSQyKSwgUXVlcnkpOwpjb25zdCDJtTIgPSAvKioKICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICogQHBhcmFtIHs/PX0gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KKHNlbGVjdG9yLCBkYXRhID0ge30pID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiBmYWxzZSwgaXNWaWV3UXVlcnk6IHRydWUsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTsKLyoqCiAqIFZpZXdDaGlsZHJlbiBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogKgogKiBcQEFubm90YXRpb24KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBWaWV3Q2hpbGRyZW4gPSBtYWtlUHJvcERlY29yYXRvcignVmlld0NoaWxkcmVuJywgKMm1MiksIFF1ZXJ5KTsKY29uc3QgybUzID0gLyoqCiAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICogQHBhcmFtIHs/fSBkYXRhCiAqIEByZXR1cm4gez99CiAqLwooc2VsZWN0b3IsIGRhdGEpID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiB0cnVlLCBpc1ZpZXdRdWVyeTogdHJ1ZSwgZGVzY2VuZGFudHM6IHRydWUgfSwgZGF0YSkpOwovKioKICogVmlld0NoaWxkIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFZpZXdDaGlsZCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdWaWV3Q2hpbGQnLCAoybUzKSwgUXVlcnkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbWV0YWRhdGEvcmVzb3VyY2VfbG9hZGluZy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBVc2VkIHRvIHJlc29sdmUgcmVzb3VyY2UgVVJMcyBvbiBgXEBDb21wb25lbnRgIHdoZW4gdXNlZCB3aXRoIEpJVCBjb21waWxhdGlvbi4KICoKICogRXhhbXBsZToKICogYGBgCiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogJ215LWNvbXAnLAogKiAgIHRlbXBsYXRlVXJsOiAnbXktY29tcC5odG1sJywgLy8gVGhpcyByZXF1aXJlcyBhc3luY2hyb25vdXMgcmVzb2x1dGlvbgogKiB9KQogKiBjbGFzcyBNeUNvbXBvbmVudHsKICogfQogKgogKiAvLyBDYWxsaW5nIGByZW5kZXJDb21wb25lbnRgIHdpbGwgZmFpbCBiZWNhdXNlIGByZW5kZXJDb21wb25lbnRgIGlzIGEgc3luY2hyb25vdXMgcHJvY2VzcwogKiAvLyBhbmQgYE15Q29tcG9uZW50YCdzIGBcQENvbXBvbmVudC50ZW1wbGF0ZVVybGAgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgYXN5bmNocm9ub3VzbHkuCiAqCiAqIC8vIENhbGxpbmcgYHJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMoKWAgd2lsbCByZXNvbHZlIGBcQENvbXBvbmVudC50ZW1wbGF0ZVVybGAgaW50bwogKiAvLyBgXEBDb21wb25lbnQudGVtcGxhdGVgLCB3aGljaCBhbGxvd3MgYHJlbmRlckNvbXBvbmVudGAgdG8gcHJvY2VlZCBpbiBhIHN5bmNocm9ub3VzIG1hbm5lci4KICoKICogLy8gVXNlIGJyb3dzZXIncyBgZmV0Y2goKWAgZnVuY3Rpb24gYXMgdGhlIGRlZmF1bHQgcmVzb3VyY2UgcmVzb2x1dGlvbiBzdHJhdGVneS4KICogcmVzb2x2ZUNvbXBvbmVudFJlc291cmNlcyhmZXRjaCkudGhlbigoKSA9PiB7CiAqICAgLy8gQWZ0ZXIgcmVzb2x1dGlvbiBhbGwgVVJMcyBoYXZlIGJlZW4gY29udmVydGVkIGludG8gYHRlbXBsYXRlYCBzdHJpbmdzLgogKiAgIHJlbmRlckNvbXBvbmVudChNeUNvbXBvbmVudCk7CiAqIH0pOwogKgogKiBgYGAKICoKICogTk9URTogSW4gQU9UIHRoZSByZXNvbHV0aW9uIGhhcHBlbnMgZHVyaW5nIGNvbXBpbGF0aW9uLCBhbmQgc28gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQKICogdG8gY2FsbCB0aGlzIG1ldGhvZCBvdXRzaWRlIEpJVCBtb2RlLgogKgogKiBAcGFyYW0gez99IHJlc291cmNlUmVzb2x2ZXIgYSBmdW5jdGlvbiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIGEgYFByb21pc2VgIHRvIHRoZQogKiBjb250ZW50cyBvZiB0aGUgcmVzb2x2ZWQgVVJMLiBCcm93c2VyJ3MgYGZldGNoKClgIG1ldGhvZCBpcyBhIGdvb2QgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMocmVzb3VyY2VSZXNvbHZlcikgewogICAgLy8gU3RvcmUgYWxsIHByb21pc2VzIHdoaWNoIGFyZSBmZXRjaGluZyB0aGUgcmVzb3VyY2VzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50UmVzb2x2ZWQgPSBbXTsKICAgIC8vIENhY2hlIHNvIHRoYXQgd2UgZG9uJ3QgZmV0Y2ggdGhlIHNhbWUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1cmxNYXAgPSBuZXcgTWFwKCk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjYWNoZWRSZXNvdXJjZVJlc29sdmUodXJsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcm9taXNlID0gdXJsTWFwLmdldCh1cmwpOwogICAgICAgIGlmICghcHJvbWlzZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSByZXNvdXJjZVJlc29sdmVyKHVybCk7CiAgICAgICAgICAgIHVybE1hcC5zZXQodXJsLCBwcm9taXNlID0gcmVzcC50aGVuKHVud3JhcFJlc3BvbnNlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9taXNlOwogICAgfQogICAgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoY29tcG9uZW50LCB0eXBlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybCkgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlZFJlc291cmNlUmVzb2x2ZShjb21wb25lbnQudGVtcGxhdGVVcmwpLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodGVtcGxhdGUpID0+IHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVVcmxzID0gY29tcG9uZW50LnN0eWxlVXJsczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gY29tcG9uZW50LnN0eWxlcyB8fCAoY29tcG9uZW50LnN0eWxlcyA9IFtdKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVPZmZzZXQgPSBjb21wb25lbnQuc3R5bGVzLmxlbmd0aDsKICAgICAgICBzdHlsZVVybHMgJiYgc3R5bGVVcmxzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVVcmwKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoc3R5bGVVcmwsIGluZGV4KSA9PiB7CiAgICAgICAgICAgIHN0eWxlcy5wdXNoKCcnKTsgLy8gcHJlLWFsbG9jYXRlIGFycmF5LgogICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlZFJlc291cmNlUmVzb2x2ZShzdHlsZVVybCkudGhlbigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzdHlsZSkgPT4gewogICAgICAgICAgICAgICAgc3R5bGVzW3N0eWxlT2Zmc2V0ICsgaW5kZXhdID0gc3R5bGU7CiAgICAgICAgICAgICAgICBzdHlsZVVybHMuc3BsaWNlKHN0eWxlVXJscy5pbmRleE9mKHN0eWxlVXJsKSwgMSk7CiAgICAgICAgICAgICAgICBpZiAoc3R5bGVVcmxzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnN0eWxlVXJscyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpKTsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZ1bGx5UmVzb2x2ZWQgPSBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBjb21wb25lbnREZWZSZXNvbHZlZCh0eXBlKSkpOwogICAgICAgIGNvbXBvbmVudFJlc29sdmVkLnB1c2goZnVsbHlSZXNvbHZlZCk7CiAgICB9KSk7CiAgICBjbGVhclJlc29sdXRpb25PZkNvbXBvbmVudFJlc291cmNlc1F1ZXVlKCk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY29tcG9uZW50UmVzb2x2ZWQpLnRoZW4oKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gdW5kZWZpbmVkKSk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUgPSBuZXcgTWFwKCk7Ci8vIFRyYWNrIHdoZW4gZXhpc3RpbmcgybVjbXAgZm9yIGEgVHlwZSBpcyB3YWl0aW5nIG9uIHJlc291cmNlcy4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBjb21wb25lbnREZWZQZW5kaW5nUmVzb2x1dGlvbiA9IG5ldyBTZXQoKTsKLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGFkYXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXliZVF1ZXVlUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzKHR5cGUsIG1ldGFkYXRhKSB7CiAgICBpZiAoY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKG1ldGFkYXRhKSkgewogICAgICAgIGNvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlLnNldCh0eXBlLCBtZXRhZGF0YSk7CiAgICAgICAgY29tcG9uZW50RGVmUGVuZGluZ1Jlc29sdXRpb24uYWRkKHR5cGUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGNvbXBvbmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKGNvbXBvbmVudCkgewogICAgcmV0dXJuICEhKChjb21wb25lbnQudGVtcGxhdGVVcmwgJiYgIWNvbXBvbmVudC5oYXNPd25Qcm9wZXJ0eSgndGVtcGxhdGUnKSkgfHwKICAgICAgICBjb21wb25lbnQuc3R5bGVVcmxzICYmIGNvbXBvbmVudC5zdHlsZVVybHMubGVuZ3RoKTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsZWFyUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzUXVldWUoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvbGQgPSBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZTsKICAgIGNvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlID0gbmV3IE1hcCgpOwogICAgcmV0dXJuIG9sZDsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWVFbXB0eSgpIHsKICAgIHJldHVybiBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZS5zaXplID09PSAwOwp9Ci8qKgogKiBAcGFyYW0gez99IHJlc3BvbnNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1bndyYXBSZXNwb25zZShyZXNwb25zZSkgewogICAgcmV0dXJuIHR5cGVvZiByZXNwb25zZSA9PSAnc3RyaW5nJyA/IHJlc3BvbnNlIDogcmVzcG9uc2UudGV4dCgpOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBvbmVudERlZlJlc29sdmVkKHR5cGUpIHsKICAgIGNvbXBvbmVudERlZlBlbmRpbmdSZXNvbHV0aW9uLmRlbGV0ZSh0eXBlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9zdHlsaW5nL3N0YXRpY19zdHlsaW5nLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBDb21wdXRlIHRoZSBzdGF0aWMgc3R5bGluZyAoY2xhc3Mvc3R5bGUpIGZyb20gYFRBdHRyaWJ1dGVzYC4KICoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBgZmlyc3RDcmVhdGVQYXNzYCBvbmx5LgogKgogKiBAcGFyYW0gez99IHROb2RlIFRoZSBgVE5vZGVgIGludG8gd2hpY2ggdGhlIHN0eWxpbmcgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGxvYWRlZC4KICogQHBhcmFtIHs/fSBhdHRycyBgVEF0dHJpYnV0ZXNgIGNvbnRhaW5pbmcgdGhlIHN0eWxpbmcgaW5mb3JtYXRpb24uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21wdXRlU3RhdGljU3R5bGluZyh0Tm9kZSwgYXR0cnMpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyhnZXRUVmlldygpLCAnRXhwZWN0aW5nIHRvIGJlIGNhbGxlZCBpbiBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHknKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBzdHlsZXMgPSB0Tm9kZS5zdHlsZXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2xhc3NlcyA9IHROb2RlLmNsYXNzZXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbW9kZSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgbW9kZSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChtb2RlID09IDEgLyogQ2xhc3NlcyAqLykgewogICAgICAgICAgICBjbGFzc2VzID0gY29uY2F0U3RyaW5nc1dpdGhTcGFjZShjbGFzc2VzLCAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMiAvKiBTdHlsZXMgKi8pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbKytpXSkpOwogICAgICAgICAgICBzdHlsZXMgPSBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKHN0eWxlcywgc3R5bGUgKyAnOiAnICsgc3R5bGVWYWx1ZSArICc7Jyk7CiAgICAgICAgfQogICAgfQogICAgc3R5bGVzICE9PSBudWxsICYmICh0Tm9kZS5zdHlsZXMgPSBzdHlsZXMpOwogICAgY2xhc3NlcyAhPT0gbnVsbCAmJiAodE5vZGUuY2xhc3NlcyA9IGNsYXNzZXMpOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCmxldCBfc3ltYm9sSXRlcmF0b3IgPSBudWxsOwpmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvciQxKCkgewogICAgaWYgKCFfc3ltYm9sSXRlcmF0b3IpIHsKICAgICAgICBjb25zdCBTeW1ib2wgPSBfZ2xvYmFsWydTeW1ib2wnXTsKICAgICAgICBpZiAoU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcikgewogICAgICAgICAgICBfc3ltYm9sSXRlcmF0b3IgPSBTeW1ib2wuaXRlcmF0b3I7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBlczYtc2hpbSBzcGVjaWZpYyBsb2dpYwogICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwLnByb3RvdHlwZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdlbnRyaWVzJyAmJiBrZXkgIT09ICdzaXplJyAmJgogICAgICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVba2V5XSA9PT0gTWFwLnByb3RvdHlwZVsnZW50cmllcyddKSB7CiAgICAgICAgICAgICAgICAgICAgX3N5bWJvbEl0ZXJhdG9yID0ga2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9zeW1ib2xJdGVyYXRvcjsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovLyBKUyBoYXMgTmFOICE9PSBOYU4KZnVuY3Rpb24gbG9vc2VJZGVudGljYWwoYSwgYikgewogICAgcmV0dXJuIGEgPT09IGIgfHwgdHlwZW9mIGEgPT09ICdudW1iZXInICYmIHR5cGVvZiBiID09PSAnbnVtYmVyJyAmJiBpc05hTihhKSAmJiBpc05hTihiKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRldk1vZGVFcXVhbCQxKGEsIGIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTGlzdExpa2VJdGVyYWJsZUEgPSBpc0xpc3RMaWtlSXRlcmFibGUkMShhKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTGlzdExpa2VJdGVyYWJsZUIgPSBpc0xpc3RMaWtlSXRlcmFibGUkMShiKTsKICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGVBICYmIGlzTGlzdExpa2VJdGVyYWJsZUIpIHsKICAgICAgICByZXR1cm4gYXJlSXRlcmFibGVzRXF1YWwkMShhLCBiLCBkZXZNb2RlRXF1YWwkMSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBT2JqZWN0ID0gYSAmJiAodHlwZW9mIGEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNCT2JqZWN0ID0gYiAmJiAodHlwZW9mIGIgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBiID09PSAnZnVuY3Rpb24nKTsKICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZUEgJiYgaXNBT2JqZWN0ICYmICFpc0xpc3RMaWtlSXRlcmFibGVCICYmIGlzQk9iamVjdCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBsb29zZUlkZW50aWNhbChhLCBiKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgb2YgYSB7XEBsaW5rIFBpcGV9IHRyYW5zZm9ybWF0aW9uIGhhcyBjaGFuZ2VkIGV2ZW4gdGhvdWdoIHRoZQogKiByZWZlcmVuY2UgaGFzIG5vdCBjaGFuZ2VkLgogKgogKiBXcmFwcGVkIHZhbHVlcyBhcmUgdW53cmFwcGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLCBhbmQgdGhlIHVud3JhcHBlZCB2YWx1ZQogKiBpcyBzdG9yZWQuCiAqCiAqIEV4YW1wbGU6CiAqCiAqIGBgYAogKiBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHsKICogICAgcmV0dXJuIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWU7CiAqICB9IGVsc2UgewogKiAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7CiAqICAgIHJldHVybiBXcmFwcGVkVmFsdWUud3JhcCh0aGlzLl9sYXRlc3RWYWx1ZSk7IC8vIHRoaXMgd2lsbCBmb3JjZSB1cGRhdGUKICogIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBXcmFwcGVkVmFsdWUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7CiAgICAgICAgdGhpcy53cmFwcGVkID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSB3cmFwcGVkIHZhbHVlLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIHdyYXAodmFsdWUpIHsKICAgICAgICByZXR1cm4gbmV3IFdyYXBwZWRWYWx1ZSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdmFsdWUgb2YgYSB3cmFwcGVkIHZhbHVlLgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gYHZhbHVlYCB3aGVuIGl0IGlzIG5vdCB3cmFwcGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyB1bndyYXAodmFsdWUpIHsKICAgICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLmlzV3JhcHBlZCh2YWx1ZSkgPyB2YWx1ZS53cmFwcGVkIDogdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgd3JhcHBlZCB2YWx1ZS4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBpc1dyYXBwZWQodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkVmFsdWU7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gb2JqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0xpc3RMaWtlSXRlcmFibGUkMShvYmopIHsKICAgIGlmICghaXNKc09iamVjdCQxKG9iaikpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSB8fAogICAgICAgICghKG9iaiBpbnN0YW5jZW9mIE1hcCkgJiYgLy8gSlMgTWFwIGFyZSBpdGVyYWJsZXMgYnV0IHJldHVybiBlbnRyaWVzIGFzIFtrLCB2XQogICAgICAgICAgICBnZXRTeW1ib2xJdGVyYXRvciQxKCkgaW4gb2JqKTsgLy8gSlMgSXRlcmFibGUgaGF2ZSBhIFN5bWJvbC5pdGVyYXRvciBwcm9wCn0KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHBhcmFtIHs/fSBjb21wYXJhdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcmVJdGVyYWJsZXNFcXVhbCQxKGEsIGIsIGNvbXBhcmF0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGl0ZXJhdG9yMSA9IGFbZ2V0U3ltYm9sSXRlcmF0b3IkMSgpXSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaXRlcmF0b3IyID0gYltnZXRTeW1ib2xJdGVyYXRvciQxKCldKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtMSA9IGl0ZXJhdG9yMS5uZXh0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW0yID0gaXRlcmF0b3IyLm5leHQoKTsKICAgICAgICBpZiAoaXRlbTEuZG9uZSAmJiBpdGVtMi5kb25lKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoaXRlbTEuZG9uZSB8fCBpdGVtMi5kb25lKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKCFjb21wYXJhdG9yKGl0ZW0xLnZhbHVlLCBpdGVtMi52YWx1ZSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBvYmoKICogQHBhcmFtIHs/fSBmbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXRlcmF0ZUxpc3RMaWtlJDEob2JqLCBmbikgewogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZuKG9ialtpXSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gb2JqW2dldFN5bWJvbEl0ZXJhdG9yJDEoKV0oKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGl0ZW07CiAgICAgICAgd2hpbGUgKCEoKGl0ZW0gPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpKSB7CiAgICAgICAgICAgIGZuKGl0ZW0udmFsdWUpOwogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBvCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0pzT2JqZWN0JDEobykgewogICAgcmV0dXJuIG8gIT09IG51bGwgJiYgKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvID09PSAnb2JqZWN0Jyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvYmluZGluZ3MudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gVE9ETyhtaXNrbyk6IGNvbnNpZGVyIGlubGluaW5nCi8qKgogKiBVcGRhdGVzIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlIHZhbHVlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpIHsKICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdID0gdmFsdWU7Cn0KLyoqCiAqIEdldHMgdGhlIGN1cnJlbnQgYmluZGluZyB2YWx1ZS4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGJpbmRpbmdJbmRleCk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RTYW1lKGxWaWV3W2JpbmRpbmdJbmRleF0sIE5PX0NIQU5HRSwgJ1N0b3JlZCB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLicpOwogICAgcmV0dXJuIGxWaWV3W2JpbmRpbmdJbmRleF07Cn0KLyoqCiAqIFVwZGF0ZXMgYmluZGluZyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBpdCB3YXMgdXBkYXRlZC4KICoKICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyB0aGUgYENoZWNrTm9DaGFuZ2VzTW9kZWAgYW5kIHRocm93cyBpZiBjaGFuZ2VzIGFyZSBtYWRlLgogKiBTb21lIGNoYW5nZXMgKE9iamVjdHMvaXRlcmFibGVzKSBkdXJpbmcgYENoZWNrTm9DaGFuZ2VzTW9kZWAgYXJlIGV4ZW1wdCB0byBjb21wbHkgd2l0aCBWRQogKiBiZWhhdmlvci4KICoKICogQHBhcmFtIHs/fSBsVmlldyBjdXJyZW50IGBMVmlld2AKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggVGhlIGJpbmRpbmcgaW4gdGhlIGBMVmlld2AgdG8gY2hlY2sKICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdCBgbFZpZXdbYmluZGluZ0luZGV4XWAKICogQHJldHVybiB7P30gYHRydWVgIGlmIHRoZSBiaW5kaW5ncyBoYXMgY2hhbmdlZC4gKFRocm93cyBpZiBiaW5kaW5nIGhhcyBjaGFuZ2VkIGR1cmluZwogKiAgICAgICAgICBgQ2hlY2tOb0NoYW5nZXNNb2RlYCkKICovCmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHZhbHVlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgTk9fQ0hBTkdFLCAnSW5jb21pbmcgdmFsdWUgc2hvdWxkIG5ldmVyIGJlIE5PX0NIQU5HRS4nKTsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydExlc3NUaGFuKGJpbmRpbmdJbmRleCwgbFZpZXcubGVuZ3RoLCBgU2xvdCBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHRvIE5PX0NIQU5HRWApOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb2xkVmFsdWUgPSBsVmlld1tiaW5kaW5nSW5kZXhdOwogICAgaWYgKE9iamVjdC5pcyhvbGRWYWx1ZSwgdmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiBnZXRDaGVja05vQ2hhbmdlc01vZGUoKSkgewogICAgICAgICAgICAvLyBWaWV3IGVuZ2luZSBkaWRuJ3QgcmVwb3J0IHVuZGVmaW5lZCB2YWx1ZXMgYXMgY2hhbmdlZCBvbiB0aGUgZmlyc3QgY2hlY2tOb0NoYW5nZXMgcGFzcwogICAgICAgICAgICAvLyAoYmVmb3JlIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHdhcyBydW4pLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlVG9Db21wYXJlID0gb2xkVmFsdWUgIT09IE5PX0NIQU5HRSA/IG9sZFZhbHVlIDogdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoIWRldk1vZGVFcXVhbCQxKG9sZFZhbHVlVG9Db21wYXJlLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBnZXRFeHByZXNzaW9uQ2hhbmdlZEVycm9yRGV0YWlscyhsVmlldywgYmluZGluZ0luZGV4LCBvbGRWYWx1ZVRvQ29tcGFyZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgdGhyb3dFcnJvcklmTm9DaGFuZ2VzTW9kZShvbGRWYWx1ZSA9PT0gTk9fQ0hBTkdFLCBkZXRhaWxzLm9sZFZhbHVlLCBkZXRhaWxzLm5ld1ZhbHVlLCBkZXRhaWxzLnByb3BOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBjaGFuZ2UsIGJ1dCB0aGUgYGRldk1vZGVFcXVhbGAgZGVjaWRlZCB0aGF0IHRoZSBjaGFuZ2UgaXMgZXhlbXB0IGZyb20gYW4gZXJyb3IuCiAgICAgICAgICAgIC8vIEZvciB0aGlzIHJlYXNvbiB3ZSBleGl0IGFzIGlmIG5vIGNoYW5nZS4gVGhlIGVhcmx5IGV4aXQgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIGNoYW5nZWQKICAgICAgICAgICAgLy8gdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIGBMVmlld2AgKElmIHdlIHdvdWxkIHdyaXRlIHRoZSBuZXcgdmFsdWUgdGhhdCB3ZSB3b3VsZCBub3Qgc2VlIGl0CiAgICAgICAgICAgIC8vIGFzIGNoYW5nZSBvbiBuZXh0IENELikKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsVmlld1tiaW5kaW5nSW5kZXhdID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLyoqCiAqIFVwZGF0ZXMgMiBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBlaXRoZXIgd2FzIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEpOwogICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAxLCBleHAyKSB8fCBkaWZmZXJlbnQ7Cn0KLyoqCiAqIFVwZGF0ZXMgMyBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBhbnkgd2FzIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkMyhsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMik7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDIsIGV4cDMpIHx8IGRpZmZlcmVudDsKfQovKioKICogVXBkYXRlcyA0IGJpbmRpbmdzIGlmIGNoYW5nZWQsIHRoZW4gcmV0dXJucyB3aGV0aGVyIGFueSB3YXMgdXBkYXRlZC4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogKiBAcGFyYW0gez99IGV4cDEKICogQHBhcmFtIHs/fSBleHAyCiAqIEBwYXJhbSB7P30gZXhwMwogKiBAcGFyYW0gez99IGV4cDQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzLCBleHA0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMik7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAyLCBleHAzLCBleHA0KSB8fCBkaWZmZXJlbnQ7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2F0dHJpYnV0ZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVXBkYXRlcyB0aGUgdmFsdWUgb2Ygb3IgcmVtb3ZlcyBhIGJvdW5kIGF0dHJpYnV0ZSBvbiBhbiBFbGVtZW50LgogKgogKiBVc2VkIGluIHRoZSBjYXNlIG9mIGBbYXR0ci50aXRsZV09InZhbHVlImAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gbmFtZSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSB7P30gdmFsdWUgdmFsdWUgVGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkIHdoZW4gdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLgogKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHNldCB0byB0aGUgc3RyaW5naWZpZWQgdmFsdWUuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlIE9wdGlvbmFsIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBzZXR0aW5nIHRoZSBhdHRyaWJ1dGUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlKG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gbmV4dEJpbmRpbmdJbmRleCgpOwogICAgaWYgKGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHZhbHVlKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBuYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2ludGVycG9sYXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENyZWF0ZSBpbnRlcnBvbGF0aW9uIGJpbmRpbmdzIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMuCiAqCiAqIElmIHRoZXJlIGFyZSAxIHRvIDggZXhwcmVzc2lvbnMgYGludGVycG9sYXRpb24xKClgIHRvIGBpbnRlcnBvbGF0aW9uOCgpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgogKiBUaG9zZSBhcmUgZmFzdGVyIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgYW5kIGl0ZXJhdGUgb3ZlciBpdC4KICoKICogYHZhbHVlc2A6CiAqIC0gaGFzIHN0YXRpYyB0ZXh0IGF0IGV2ZW4gaW5kZXhlcywKICogLSBoYXMgZXZhbHVhdGVkIGV4cHJlc3Npb25zIGF0IG9kZCBpbmRleGVzLgogKgogKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHdoZW4gYW55IG9mIHRoZSBhcmd1bWVudHMgY2hhbmdlcywgYE5PX0NIQU5HRWAgb3RoZXJ3aXNlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdmFsdWVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TGVzc1RoYW4oMiwgdmFsdWVzLmxlbmd0aCwgJ3Nob3VsZCBoYXZlIGF0IGxlYXN0IDMgdmFsdWVzJyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwodmFsdWVzLmxlbmd0aCAlIDIsIDEsICdzaG91bGQgaGF2ZSBhbiBvZGQgbnVtYmVyIG9mIHZhbHVlcycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzQmluZGluZ1VwZGF0ZWQgPSBmYWxzZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgYmluZGluZ3MgKG9kZCBpbmRleGVzKSBoYXZlIGNoYW5nZWQKICAgICAgICBpc0JpbmRpbmdVcGRhdGVkID0gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCsrLCB2YWx1ZXNbaV0pIHx8IGlzQmluZGluZ1VwZGF0ZWQ7CiAgICB9CiAgICBzZXRCaW5kaW5nSW5kZXgoYmluZGluZ0luZGV4KTsKICAgIGlmICghaXNCaW5kaW5nVXBkYXRlZCkgewogICAgICAgIHJldHVybiBOT19DSEFOR0U7CiAgICB9CiAgICAvLyBCdWlsZCB0aGUgdXBkYXRlZCBjb250ZW50CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY29udGVudCA9IHZhbHVlc1swXTsKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgY29udGVudCArPSByZW5kZXJTdHJpbmdpZnkodmFsdWVzW2ldKSArIHZhbHVlc1tpICsgMV07CiAgICB9CiAgICByZXR1cm4gY29udGVudDsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAxIGV4cHJlc3Npb24uCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBwcmVmaXggc3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCB2YWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IHN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZChsVmlldywgbmV4dEJpbmRpbmdJbmRleCgpLCB2MCk7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAyIGV4cHJlc3Npb25zLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gc3VmZml4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSk7CiAgICBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoMik7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAzIGV4cHJlc3Npb25zLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW50ZXJwb2xhdGlvbjMobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSwgdjIpOwogICAgaW5jcmVtZW50QmluZGluZ0luZGV4KDMpOwogICAgcmV0dXJuIGRpZmZlcmVudCA/CiAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIHN1ZmZpeCA6CiAgICAgICAgTk9fQ0hBTkdFOwp9Ci8qKgogKiBDcmVhdGUgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNCBleHByZXNzaW9ucy4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gc3VmZml4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoNCk7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsKICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgc3VmZml4IDoKICAgICAgICBOT19DSEFOR0U7Cn0KLyoqCiAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNSBleHByZXNzaW9ucy4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gaTMKICogQHBhcmFtIHs/fSB2NAogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW50ZXJwb2xhdGlvbjUobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpOwogICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIHY0KSB8fCBkaWZmZXJlbnQ7CiAgICBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoNSk7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsKICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgaTMgKyByZW5kZXJTdHJpbmdpZnkodjQpICsgc3VmZml4IDoKICAgICAgICBOT19DSEFOR0U7Cn0KLyoqCiAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNiBleHByZXNzaW9ucy4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gaTMKICogQHBhcmFtIHs/fSB2NAogKiBAcGFyYW0gez99IGk0CiAqIEBwYXJhbSB7P30gdjUKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludGVycG9sYXRpb242KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpOwogICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCwgdjUpIHx8IGRpZmZlcmVudDsKICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg2KTsKICAgIHJldHVybiBkaWZmZXJlbnQgPwogICAgICAgIHByZWZpeCArIHJlbmRlclN0cmluZ2lmeSh2MCkgKyBpMCArIHJlbmRlclN0cmluZ2lmeSh2MSkgKyBpMSArIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArCiAgICAgICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArIHJlbmRlclN0cmluZ2lmeSh2NSkgKyBzdWZmaXggOgogICAgICAgIE5PX0NIQU5HRTsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCA3IGV4cHJlc3Npb25zLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBpMwogKiBAcGFyYW0gez99IHY0CiAqIEBwYXJhbSB7P30gaTQKICogQHBhcmFtIHs/fSB2NQogKiBAcGFyYW0gez99IGk1CiAqIEBwYXJhbSB7P30gdjYKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDMobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIHY0LCB2NSwgdjYpIHx8IGRpZmZlcmVudDsKICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg3KTsKICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArCiAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHY1KSArIGk1ICsgcmVuZGVyU3RyaW5naWZ5KHY2KSArIHN1ZmZpeCA6CiAgICAgICAgTk9fQ0hBTkdFOwp9Ci8qKgogKiBDcmVhdGVzIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDggZXhwcmVzc2lvbnMuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBwcmVmaXgKICogQHBhcmFtIHs/fSB2MAogKiBAcGFyYW0gez99IGkwCiAqIEBwYXJhbSB7P30gdjEKICogQHBhcmFtIHs/fSBpMQogKiBAcGFyYW0gez99IHYyCiAqIEBwYXJhbSB7P30gaTIKICogQHBhcmFtIHs/fSB2MwogKiBAcGFyYW0gez99IGkzCiAqIEBwYXJhbSB7P30gdjQKICogQHBhcmFtIHs/fSBpNAogKiBAcGFyYW0gez99IHY1CiAqIEBwYXJhbSB7P30gaTUKICogQHBhcmFtIHs/fSB2NgogKiBAcGFyYW0gez99IGk2CiAqIEBwYXJhbSB7P30gdjcKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludGVycG9sYXRpb244KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ0luZGV4KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSwgdjIsIHYzKTsKICAgIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4ICsgNCwgdjQsIHY1LCB2NiwgdjcpIHx8IGRpZmZlcmVudDsKICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg4KTsKICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArCiAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHY1KSArIGk1ICsgcmVuZGVyU3RyaW5naWZ5KHY2KSArIGk2ICsgcmVuZGVyU3RyaW5naWZ5KHY3KSArIHN1ZmZpeCA6CiAgICAgICAgTk9fQ0hBTkdFOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9hdHRyaWJ1dGVfaW50ZXJwb2xhdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTEoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMShhdHRyTmFtZSwgcHJlZml4LCB2MCwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKGdldFRWaWV3KCkuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBhdHRyTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSAxLCBwcmVmaXgsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyKCd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTIoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDIsIHByZWZpeCwgaTAsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMjsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICoKICogYGBgdHMKICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMygKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMyhhdHRyTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjMobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDMsIHByZWZpeCwgaTAsIGkxLCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTM7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGF0dHIudGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0KAogKiAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0KGF0dHJOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDQsIHByZWZpeCwgaTAsIGkxLCBpMiwgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA1IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTUoCiAqICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTUoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDUsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICoKICogYGBgdHMKICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNigKICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNihhdHRyTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDYsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTY7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGF0dHIudGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3KAogKiAgICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3KGF0dHJOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDcsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTgoCiAqICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk2IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjcgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4KGF0dHJOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKGdldFRWaWV3KCkuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBhdHRyTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA4LCBwcmVmaXgsIGkwLCBpMSwgaTIsIGkzLCBpNCwgaTUsIGk2LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTg7Cn0KLyoqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAqCiAqIGBgYGh0bWwKICogPGRpdgogKiAgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGVWKAogKiAgJ3RpdGxlJywgWydwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJy0nLCB2OSwKICogICdzdWZmaXgnXSk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZS4KICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICogYSBzdHJpbmcgcHJlZml4IGFuZCBlbmRpbmcgd2l0aCBhIHN0cmluZyBzdWZmaXguCiAqIChlLmcuIGBbJ3ByZWZpeCcsIHZhbHVlMCwgJy0nLCB2YWx1ZTEsICctJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZVYoYXR0ck5hbWUsIHZhbHVlcywgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZCA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWQsIHNhbml0aXplciwgbmFtZXNwYWNlKTsKICAgICAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbkluQmV0d2VlbiA9IFt2YWx1ZXNbMF1dOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkluQmV0d2Vlbi5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YShnZXRUVmlldygpLmRhdGEsIHROb2RlLCAnYXR0ci4nICsgYXR0ck5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gaW50ZXJwb2xhdGlvbkluQmV0d2Vlbi5sZW5ndGggKyAxLCAuLi5pbnRlcnBvbGF0aW9uSW5CZXR3ZWVuKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlVjsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvY2hhbmdlX2RldGVjdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSBjb21wb25lbnQgKGFuZCBwb3NzaWJseSBpdHMgc3ViLWNvbXBvbmVudHMpLgogKgogKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gaW4gYSBzeW5jaHJvbm91cyB3YXkgb24gYSBjb21wb25lbnQuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50IFRoZSBjb21wb25lbnQgd2hpY2ggdGhlIGNoYW5nZSBkZXRlY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRldGVjdENoYW5nZXMoY29tcG9uZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5zdGFuY2UoY29tcG9uZW50KTsKICAgIGRldGVjdENoYW5nZXNJbnRlcm5hbCh2aWV3W1RWSUVXXSwgdmlldywgY29tcG9uZW50KTsKfQovKioKICogTWFya3MgdGhlIGNvbXBvbmVudCBhcyBkaXJ0eSAobmVlZGluZyBjaGFuZ2UgZGV0ZWN0aW9uKS4gTWFya2luZyBhIGNvbXBvbmVudCBkaXJ0eSB3aWxsCiAqIHNjaGVkdWxlIGEgY2hhbmdlIGRldGVjdGlvbiBvbiBpdCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCiAqCiAqIE1hcmtpbmcgYW4gYWxyZWFkeSBkaXJ0eSBjb21wb25lbnQgYXMgZGlydHkgd29uJ3QgZG8gYW55dGhpbmcuIE9ubHkgb25lIG91dHN0YW5kaW5nIGNoYW5nZQogKiBkZXRlY3Rpb24gY2FuIGJlIHNjaGVkdWxlZCBwZXIgY29tcG9uZW50IHRyZWUuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50IENvbXBvbmVudCB0byBtYXJrIGFzIGRpcnR5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWFya0RpcnR5KGNvbXBvbmVudCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY29tcG9uZW50LCAnY29tcG9uZW50Jyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VmlldyA9ICgvKiogQHR5cGUgez99ICovIChtYXJrVmlld0RpcnR5KGdldENvbXBvbmVudFZpZXdCeUluc3RhbmNlKGNvbXBvbmVudCkpKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChyb290Vmlld1tDT05URVhUXSwgJ3Jvb3RDb250ZXh0IHNob3VsZCBiZSBkZWZpbmVkJyk7CiAgICBzY2hlZHVsZVRpY2soKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RWaWV3W0NPTlRFWFRdKSksIDEgLyogRGV0ZWN0Q2hhbmdlcyAqLyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2NvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ3JlYXRlcyBhbiBMQ29udGFpbmVyIGZvciBpbmxpbmUgdmlld3MsIGUuZy4KICoKICogJSBpZiAoc2hvd2luZykgewogKiAgIDxkaXY+PC9kaXY+CiAqICUgfQogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciBpbiB0aGUgZGF0YSBhcnJheQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNvbnRhaW5lcihpbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBjb250YWluZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIGluZGV4LCBudWxsLCBudWxsKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICB0Tm9kZS50Vmlld3MgPSBbXTsKICAgIH0KICAgIHNldElzTm90UGFyZW50KCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbgogKiBAcGFyYW0gez99IGRlY2xzCiAqIEBwYXJhbSB7P30gdmFycwogKiBAcGFyYW0gez89fSB0YWdOYW1lCiAqIEBwYXJhbSB7Pz19IGF0dHJzSW5kZXgKICogQHBhcmFtIHs/PX0gbG9jYWxSZWZzSW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRlbXBsYXRlRmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCB0YWdOYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXdDb25zdHMgPSB0Vmlldy5jb25zdHM7CiAgICAvLyBUT0RPKHBrKTogcmVmYWN0b3IgZ2V0T3JDcmVhdGVUTm9kZSB0byBoYXZlIHRoZSAiY3JlYXRlIiBvbmx5IHZlcnNpb24KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDAgLyogQ29udGFpbmVyICovLCB0YWdOYW1lIHx8IG51bGwsIGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBhdHRyc0luZGV4KSk7CiAgICByZXNvbHZlRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHROb2RlLCBnZXRDb25zdGFudCh0Vmlld0NvbnN0cywgbG9jYWxSZWZzSW5kZXgpKTsKICAgIHJlZ2lzdGVyUG9zdE9yZGVySG9va3ModFZpZXcsIHROb2RlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVtYmVkZGVkVFZpZXcgPSB0Tm9kZS50Vmlld3MgPSBjcmVhdGVUVmlldygyIC8qIEVtYmVkZGVkICovLCAtMSwgdGVtcGxhdGVGbiwgZGVjbHMsIHZhcnMsIHRWaWV3LmRpcmVjdGl2ZVJlZ2lzdHJ5LCB0Vmlldy5waXBlUmVnaXN0cnksIG51bGwsIHRWaWV3LnNjaGVtYXMsIHRWaWV3Q29uc3RzKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVtYmVkZGVkVFZpZXdOb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZVROb2RlKHRWaWV3LCBudWxsLCAyIC8qIFZpZXcgKi8sIC0xLCBudWxsLCBudWxsKSkpOwogICAgZW1iZWRkZWRUVmlld05vZGUuaW5qZWN0b3JJbmRleCA9IHROb2RlLmluamVjdG9ySW5kZXg7CiAgICBlbWJlZGRlZFRWaWV3Lm5vZGUgPSBlbWJlZGRlZFRWaWV3Tm9kZTsKICAgIGlmICh0Vmlldy5xdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgdFZpZXcucXVlcmllcy50ZW1wbGF0ZSh0VmlldywgdE5vZGUpOwogICAgICAgIGVtYmVkZGVkVFZpZXcucXVlcmllcyA9IHRWaWV3LnF1ZXJpZXMuZW1iZWRkZWRUVmlldyh0Tm9kZSk7CiAgICB9CiAgICByZXR1cm4gdE5vZGU7Cn0KLyoqCiAqIENyZWF0ZXMgYW4gTENvbnRhaW5lciBmb3IgYW4gbmctdGVtcGxhdGUgKGR5bmFtaWNhbGx5LWluc2VydGVkIHZpZXcpLCBlLmcuCiAqCiAqIDxuZy10ZW1wbGF0ZSAjZm9vPgogKiAgICA8ZGl2PjwvZGl2PgogKiA8L25nLXRlbXBsYXRlPgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciBpbiB0aGUgZGF0YSBhcnJheQogKiBAcGFyYW0gez99IHRlbXBsYXRlRm4gSW5saW5lIHRlbXBsYXRlCiAqIEBwYXJhbSB7P30gZGVjbHMgVGhlIG51bWJlciBvZiBub2RlcywgbG9jYWwgcmVmcywgYW5kIHBpcGVzIGZvciB0aGlzIHRlbXBsYXRlCiAqIEBwYXJhbSB7P30gdmFycyBUaGUgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciB0aGlzIHRlbXBsYXRlCiAqIEBwYXJhbSB7Pz19IHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50LCBpZiBhcHBsaWNhYmxlCiAqIEBwYXJhbSB7Pz19IGF0dHJzSW5kZXggSW5kZXggb2YgdGVtcGxhdGUgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmRXh0cmFjdG9yIEEgZnVuY3Rpb24gd2hpY2ggZXh0cmFjdHMgbG9jYWwtcmVmcyB2YWx1ZXMgZnJvbSB0aGUgdGVtcGxhdGUuCiAqICAgICAgICBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jYWwtcmVmLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXRlbXBsYXRlKGluZGV4LCB0ZW1wbGF0ZUZuLCBkZWNscywgdmFycywgdGFnTmFtZSwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgsIGxvY2FsUmVmRXh0cmFjdG9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3MgPwogICAgICAgIHRlbXBsYXRlRmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCB0YWdOYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgOgogICAgICAgICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIGZhbHNlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbW1lbnQgPSBsVmlld1tSRU5ERVJFUl0uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGUgPyAnY29udGFpbmVyJyA6ICcnKTsKICAgIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgY29tbWVudCwgdE5vZGUpOwogICAgYXR0YWNoUGF0Y2hEYXRhKGNvbW1lbnQsIGxWaWV3KTsKICAgIGFkZFRvVmlld1RyZWUobFZpZXcsIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gY3JlYXRlTENvbnRhaW5lcihjb21tZW50LCBsVmlldywgY29tbWVudCwgdE5vZGUpKTsKICAgIGlmIChpc0RpcmVjdGl2ZUhvc3QodE5vZGUpKSB7CiAgICAgICAgY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgIH0KICAgIGlmIChsb2NhbFJlZnNJbmRleCAhPSBudWxsKSB7CiAgICAgICAgc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKGxWaWV3LCB0Tm9kZSwgbG9jYWxSZWZFeHRyYWN0b3IpOwogICAgfQp9Ci8qKgogKiBTZXRzIGEgY29udGFpbmVyIHVwIHRvIHJlY2VpdmUgdmlld3MuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29udGFpbmVyIGluIHRoZSBkYXRhIGFycmF5CiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y29udGFpbmVyUmVmcmVzaFN0YXJ0KGluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcHJldmlvdXNPclBhcmVudFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxvYWQodFZpZXcuZGF0YSwgaW5kZXgpKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUocHJldmlvdXNPclBhcmVudFROb2RlLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUocHJldmlvdXNPclBhcmVudFROb2RlLCB0cnVlKTsKICAgIGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF1bQUNUSVZFX0lOREVYXSA9IDA7CiAgICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgaW5pdCBob29rcyBoZXJlIHNvIG5nT25Jbml0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdG9wIGxldmVsIHZpZXdzCiAgICAvLyBiZWZvcmUgdGhleSBhcmUgY2FsbGVkIGluIGVtYmVkZGVkIHZpZXdzIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgogICAgaWYgKCFnZXRDaGVja05vQ2hhbmdlc01vZGUoKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob29rc0luaXRQaGFzZUNvbXBsZXRlZCA9IChsVmlld1tGTEFHU10gJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovOwogICAgICAgIGlmIChob29rc0luaXRQaGFzZUNvbXBsZXRlZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZU9yZGVyQ2hlY2tIb29rcyA9IHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rczsKICAgICAgICAgICAgaWYgKHByZU9yZGVyQ2hlY2tIb29rcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZXhlY3V0ZUNoZWNrSG9va3MobFZpZXcsIHByZU9yZGVyQ2hlY2tIb29rcywgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlT3JkZXJIb29rcyA9IHRWaWV3LnByZU9yZGVySG9va3M7CiAgICAgICAgICAgIGlmIChwcmVPcmRlckhvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBleGVjdXRlSW5pdEFuZENoZWNrSG9va3MobFZpZXcsIHByZU9yZGVySG9va3MsIDAgLyogT25Jbml0SG9va3NUb0JlUnVuICovLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8pOwogICAgICAgIH0KICAgIH0KfQovKioKICogTWFya3MgdGhlIGVuZCBvZiB0aGUgTENvbnRhaW5lci4KICoKICogTWFya2luZyB0aGUgZW5kIG9mIExDb250YWluZXIgaXMgdGhlIHRpbWUgd2hlbiB0byBjaGlsZCB2aWV3cyBnZXQgaW5zZXJ0ZWQgb3IgcmVtb3ZlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y29udGFpbmVyUmVmcmVzaEVuZCgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIGlmIChnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwcmV2aW91c09yUGFyZW50VE5vZGUsIDIgLyogVmlldyAqLyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEhhc1BhcmVudChwcmV2aW91c09yUGFyZW50VE5vZGUpOwogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgfQogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgMCAvKiBDb250YWluZXIgKi8pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENvbnRhaW5lciA9IGdldExWaWV3KClbcHJldmlvdXNPclBhcmVudFROb2RlLmluZGV4XTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5leHRJbmRleCA9IGdldExDb250YWluZXJBY3RpdmVJbmRleChsQ29udGFpbmVyKTsKICAgIC8vIHJlbW92ZSBleHRyYSB2aWV3cyBhdCB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIKICAgIHdoaWxlIChuZXh0SW5kZXggPCBsQ29udGFpbmVyLmxlbmd0aCAtIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUKSB7CiAgICAgICAgcmVtb3ZlVmlldyhsQ29udGFpbmVyLCBuZXh0SW5kZXgpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHBhcmFtIHs/fSB0YWdOYW1lCiAqIEBwYXJhbSB7P30gYXR0cnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbnRhaW5lckludGVybmFsKHRWaWV3LCBsVmlldywgbm9kZUluZGV4LCB0YWdOYW1lLCBhdHRycykgewogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RXF1YWwoZ2V0QmluZGluZ0luZGV4KCksIHRWaWV3LmJpbmRpbmdTdGFydEluZGV4LCAnY29udGFpbmVyIG5vZGVzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSBub2RlSW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBub2RlSW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21tZW50ID0gbFZpZXdbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgIGxWaWV3W1JFTkRFUkVSXS5jcmVhdGVDb21tZW50KG5nRGV2TW9kZSA/ICdjb250YWluZXInIDogJycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBub2RlSW5kZXgsIDAgLyogQ29udGFpbmVyICovLCB0YWdOYW1lLCBhdHRycyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsQ29udGFpbmVyID0gbFZpZXdbYWRqdXN0ZWRJbmRleF0gPSBjcmVhdGVMQ29udGFpbmVyKGNvbW1lbnQsIGxWaWV3LCBjb21tZW50LCB0Tm9kZSk7CiAgICBhcHBlbmRDaGlsZCh0VmlldywgbFZpZXcsIGNvbW1lbnQsIHROb2RlKTsKICAgIGF0dGFjaFBhdGNoRGF0YShjb21tZW50LCBsVmlldyk7CiAgICAvLyBDb250YWluZXJzIGFyZSBhZGRlZCB0byB0aGUgY3VycmVudCB2aWV3IHRyZWUgaW5zdGVhZCBvZiB0aGVpciBlbWJlZGRlZCB2aWV3cwogICAgLy8gYmVjYXVzZSB2aWV3cyBjYW4gYmUgcmVtb3ZlZCBhbmQgcmUtaW5zZXJ0ZWQuCiAgICBhZGRUb1ZpZXdUcmVlKGxWaWV3LCBsQ29udGFpbmVyKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgMCAvKiBDb250YWluZXIgKi8pOwogICAgcmV0dXJuIHROb2RlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9zdG9yYWdlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBTdG9yZSBhIHZhbHVlIGluIHRoZSBgZGF0YWAgYXQgYSBnaXZlbiBgaW5kZXhgLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdG9yZSh0VmlldywgbFZpZXcsIGluZGV4LCB2YWx1ZSkgewogICAgLy8gV2UgZG9uJ3Qgc3RvcmUgYW55IHN0YXRpYyBkYXRhIGZvciBsb2NhbCB2YXJpYWJsZXMsIHNvIHRoZSBmaXJzdCB0aW1lCiAgICAvLyB3ZSBzZWUgdGhlIHRlbXBsYXRlLCB3ZSBzaG91bGQgc3RvcmUgYXMgbnVsbCB0byBhdm9pZCBhIHNwYXJzZSBhcnJheQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgIGlmIChhZGp1c3RlZEluZGV4ID49IHRWaWV3LmRhdGEubGVuZ3RoKSB7CiAgICAgICAgdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSA9IG51bGw7CiAgICAgICAgdFZpZXcuYmx1ZXByaW50W2FkanVzdGVkSW5kZXhdID0gbnVsbDsKICAgIH0KICAgIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gdmFsdWU7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIGxvY2FsIHJlZmVyZW5jZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHRWaWV3RGF0YS4KICoKICogSWYgdGhlIHJlZmVyZW5jZSB0byByZXRyaWV2ZSBpcyBpbiBhIHBhcmVudCB2aWV3LCB0aGlzIGluc3RydWN0aW9uIGlzIHVzZWQgaW4gY29uanVuY3Rpb24KICogd2l0aCBhIG5leHRDb250ZXh0KCkgY2FsbCwgd2hpY2ggd2Fsa3MgdXAgdGhlIHRyZWUgYW5kIHVwZGF0ZXMgdGhlIGNvbnRleHRWaWV3RGF0YSBpbnN0YW5jZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBsb2NhbCByZWYgaW4gY29udGV4dFZpZXdEYXRhLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXJlZmVyZW5jZShpbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dExWaWV3ID0gZ2V0Q29udGV4dExWaWV3KCk7CiAgICByZXR1cm4gbG9hZChjb250ZXh0TFZpZXcsIGluZGV4KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvZGkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdG9rZW4KICogQHBhcmFtIHs/PX0gZmxhZ3MKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVkaXJlY3RpdmVJbmplY3QodG9rZW4sIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLy8gRmFsbCBiYWNrIHRvIGluamVjdCgpIGlmIHZpZXcgaGFzbid0IGJlZW4gY3JlYXRlZC4gVGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbiBpbiB0ZXN0cwogICAgLy8gaWYgaW5qZWN0IHV0aWxpdGllcyBhcmUgdXNlZCBiZWZvcmUgYm9vdHN0cmFwcGluZy4KICAgIGlmIChsVmlldyA9PSBudWxsKQogICAgICAgIHJldHVybiDJtcm1aW5qZWN0KHRva2VuLCBmbGFncyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgcmV0dXJuIGdldE9yQ3JlYXRlSW5qZWN0YWJsZSgoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcsIHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKSwgZmxhZ3MpOwp9Ci8qKgogKiBGYWNhZGUgZm9yIHRoZSBhdHRyaWJ1dGUgaW5qZWN0aW9uIGZyb20gREkuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lVG9JbmplY3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpbmplY3RBdHRyaWJ1dGUoYXR0ck5hbWVUb0luamVjdCkgewogICAgcmV0dXJuIGluamVjdEF0dHJpYnV0ZUltcGwoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGF0dHJOYW1lVG9JbmplY3QpOwp9Ci8qKgogKiBUaHJvd3MgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IGEgZmFjdG9yeSBmdW5jdGlvbiBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgYQogKiBwYXJ0aWN1bGFyIGNsYXNzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFsbG93cyB0aGUgYWN0dWFsIGVycm9yIG1lc3NhZ2UgdG8gYmUgb3B0aW1pemVkIGF3YXkgd2hlbiBuZ0Rldk1vZGUgaXMgdHVybmVkCiAqIG9mZiwgc2F2aW5nIGJ5dGVzIG9mIGdlbmVyYXRlZCBjb2RlIHdoaWxlIHN0aWxsIHByb3ZpZGluZyBhIGdvb2QgZXhwZXJpZW5jZSBpbiBkZXYgbW9kZS4KICoKICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdCBtZW50aW9uZWQgaGVyZSwgYnV0IHdpbGwgYmUgaW4gdGhlIGdlbmVyYXRlZCBmYWN0b3J5IGZ1bmN0aW9uIG5hbWUKICogYW5kIHRodXMgaW4gdGhlIHN0YWNrIHRyYWNlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpbnZhbGlkRmFjdG9yeSgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1zZyA9IG5nRGV2TW9kZSA/IGBUaGlzIGNvbnN0cnVjdG9yIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIERlcGVuZGVuY3kgSW5qZWN0aW9uLmAgOiAnaW52YWxpZCc7CiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvcHJvcGVydHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFVwZGF0ZSBhIHByb3BlcnR5IG9uIGEgc2VsZWN0ZWQgZWxlbWVudC4KICoKICogT3BlcmF0ZXMgb24gdGhlIGVsZW1lbnQgc2VsZWN0ZWQgYnkgaW5kZXggdmlhIHRoZSB7XEBsaW5rIHNlbGVjdH0gaW5zdHJ1Y3Rpb24uCiAqCiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZAogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHByb3BlcnR5LiBCZWNhdXNlIGl0IGlzIGdvaW5nIHRvIERPTSwgdGhpcyBpcyBub3Qgc3ViamVjdCB0bwogKiAgICAgICAgcmVuYW1pbmcgYXMgcGFydCBvZiBtaW5pZmljYXRpb24uCiAqIEBwYXJhbSB7P30gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlLgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogKiAoZS5nLiBgcHJvcGVydHkoJ25hbWUnLCBjdHgubmFtZSkoJ3RpdGxlJywgY3R4LnRpdGxlKWApCiAqCiAqLwpmdW5jdGlvbiDJtcm1cHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eTsKfQovKioKICogR2l2ZW4gYDxkaXYgc3R5bGU9Ii4uLiIgbXktZGlyPmAgYW5kIGBNeURpcmAgd2l0aCBgXEBJbnB1dCgnc3R5bGUnKWAgd2UgbmVlZCB0byB3cml0ZSB0bwogKiBkaXJlY3RpdmUgaW5wdXQuCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldERpcmVjdGl2ZUlucHV0c1doaWNoU2hhZG93c1N0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgdmFsdWUsIGlzQ2xhc3NCYXNlZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5wdXRzID0gKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLmlucHV0cykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJvcGVydHkgPSBpc0NsYXNzQmFzZWQgPyAnY2xhc3MnIDogJ3N0eWxlJzsKICAgIC8vIFdlIHN1cHBvcnQgYm90aCAnY2xhc3MnIGFuZCBgY2xhc3NOYW1lYCBoZW5jZSB0aGUgZmFsbGJhY2suCiAgICBzZXRJbnB1dHNGb3JQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGlucHV0c1twcm9wZXJ0eV0sIHByb3BlcnR5LCB2YWx1ZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2VsZW1lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gbmF0aXZlCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4CiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbGVtZW50U3RhcnRGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgbmF0aXZlLCBuYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXdDb25zdHMgPSB0Vmlldy5jb25zdHM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhdHRycyA9IGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBhdHRyc0luZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDMgLyogRWxlbWVudCAqLywgbmFtZSwgYXR0cnMpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaGFzRGlyZWN0aXZlcyA9IHJlc29sdmVEaXJlY3RpdmVzKHRWaWV3LCBsVmlldywgdE5vZGUsIGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBsb2NhbFJlZnNJbmRleCkpOwogICAgbmdEZXZNb2RlICYmIHdhcm5BYm91dFVua25vd25FbGVtZW50KHRWaWV3LCBsVmlldywgbmF0aXZlLCB0Tm9kZSwgaGFzRGlyZWN0aXZlcyk7CiAgICBpZiAodE5vZGUubWVyZ2VkQXR0cnMgIT09IG51bGwpIHsKICAgICAgICBjb21wdXRlU3RhdGljU3R5bGluZyh0Tm9kZSwgdE5vZGUubWVyZ2VkQXR0cnMpOwogICAgfQogICAgaWYgKHRWaWV3LnF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICB0Vmlldy5xdWVyaWVzLmVsZW1lbnRTdGFydCh0VmlldywgdE5vZGUpOwogICAgfQogICAgcmV0dXJuIHROb2RlOwp9Ci8qKgogKiBDcmVhdGUgRE9NIGVsZW1lbnQuIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGxhdGVyIGJlIGZvbGxvd2VkIGJ5IGBlbGVtZW50RW5kKClgIGNhbGwuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheQogKiBAcGFyYW0gez99IG5hbWUgTmFtZSBvZiB0aGUgRE9NIE5vZGUKICogQHBhcmFtIHs/PX0gYXR0cnNJbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIGxvY2FsIHJlZmVyZW5jZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogKgogKiBBdHRyaWJ1dGVzIGFuZCBsb2NhbFJlZnMgYXJlIHBhc3NlZCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzIHdoZXJlIGVsZW1lbnRzIHdpdGggYW4gZXZlbiBpbmRleAogKiBob2xkIGFuIGF0dHJpYnV0ZSBuYW1lIGFuZCBlbGVtZW50cyB3aXRoIGFuIG9kZCBpbmRleCBob2xkIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgZXguOgogKiBbJ2lkJywgJ3dhcm5pbmc1JywgJ2NsYXNzJywgJ2FsZXJ0J10KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50U3RhcnQoaW5kZXgsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gSEVBREVSX09GRlNFVCArIGluZGV4OwogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RXF1YWwoZ2V0QmluZGluZ0luZGV4KCksIHRWaWV3LmJpbmRpbmdTdGFydEluZGV4LCAnZWxlbWVudHMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpOwogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUVsZW1lbnQrKzsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgYWRqdXN0ZWRJbmRleCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJlciA9IGxWaWV3W1JFTkRFUkVSXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hdGl2ZSA9IGxWaWV3W2FkanVzdGVkSW5kZXhdID0gZWxlbWVudENyZWF0ZShuYW1lLCByZW5kZXJlciwgZ2V0TmFtZXNwYWNlKCkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3MgPwogICAgICAgIGVsZW1lbnRTdGFydEZpcnN0Q3JlYXRlUGFzcyhpbmRleCwgdFZpZXcsIGxWaWV3LCBuYXRpdmUsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSA6CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKTsKICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZSh0Tm9kZSwgdHJ1ZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXJnZWRBdHRycyA9IHROb2RlLm1lcmdlZEF0dHJzOwogICAgaWYgKG1lcmdlZEF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgc2V0VXBBdHRyaWJ1dGVzKHJlbmRlcmVyLCBuYXRpdmUsIG1lcmdlZEF0dHJzKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNsYXNzZXMgPSB0Tm9kZS5jbGFzc2VzOwogICAgaWYgKGNsYXNzZXMgIT09IG51bGwpIHsKICAgICAgICB3cml0ZURpcmVjdENsYXNzKHJlbmRlcmVyLCBuYXRpdmUsIGNsYXNzZXMpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3R5bGVzID0gdE5vZGUuc3R5bGVzOwogICAgaWYgKHN0eWxlcyAhPT0gbnVsbCkgewogICAgICAgIHdyaXRlRGlyZWN0U3R5bGUocmVuZGVyZXIsIG5hdGl2ZSwgc3R5bGVzKTsKICAgIH0KICAgIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgbmF0aXZlLCB0Tm9kZSk7CiAgICAvLyBhbnkgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIGEgY29tcG9uZW50IG9yIHRlbXBsYXRlIGNvbnRhaW5lciBtdXN0IGJlIHByZS1lbXB0aXZlbHkKICAgIC8vIG1vbmtleS1wYXRjaGVkIHdpdGggdGhlIGNvbXBvbmVudCB2aWV3IGRhdGEgc28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUgaW5zcGVjdGVkCiAgICAvLyBsYXRlciBvbiB1c2luZyBhbnkgZWxlbWVudCBkaXNjb3ZlcnkgdXRpbGl0eSBtZXRob2RzIChzZWUgYGVsZW1lbnRfZGlzY292ZXJ5LnRzYCkKICAgIGlmIChnZXRFbGVtZW50RGVwdGhDb3VudCgpID09PSAwKSB7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgfQogICAgaW5jcmVhc2VFbGVtZW50RGVwdGhDb3VudCgpOwogICAgaWYgKGlzRGlyZWN0aXZlSG9zdCh0Tm9kZSkpIHsKICAgICAgICBjcmVhdGVEaXJlY3RpdmVzSW5zdGFuY2VzKHRWaWV3LCBsVmlldywgdE5vZGUpOwogICAgICAgIGV4ZWN1dGVDb250ZW50UXVlcmllcyh0VmlldywgdE5vZGUsIGxWaWV3KTsKICAgIH0KICAgIGlmIChsb2NhbFJlZnNJbmRleCAhPT0gbnVsbCkgewogICAgICAgIHNhdmVSZXNvbHZlZExvY2Fsc0luRGF0YShsVmlldywgdE5vZGUpOwogICAgfQp9Ci8qKgogKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWVsZW1lbnRFbmQoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChwcmV2aW91c09yUGFyZW50VE5vZGUsICdObyBwYXJlbnQgbm9kZSB0byBjbG9zZS4nKTsKICAgIGlmIChnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIYXNQYXJlbnQoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCkpOwogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBwcmV2aW91c09yUGFyZW50VE5vZGU7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUodE5vZGUsIDMgLyogRWxlbWVudCAqLyk7CiAgICBkZWNyZWFzZUVsZW1lbnREZXB0aENvdW50KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgcHJldmlvdXNPclBhcmVudFROb2RlKTsKICAgICAgICBpZiAoaXNDb250ZW50UXVlcnlIb3N0KHByZXZpb3VzT3JQYXJlbnRUTm9kZSkpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LnF1ZXJpZXMpKS5lbGVtZW50RW5kKHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKHROb2RlLmNsYXNzZXMgIT09IG51bGwgJiYgaGFzQ2xhc3NJbnB1dCh0Tm9kZSkpIHsKICAgICAgICBzZXREaXJlY3RpdmVJbnB1dHNXaGljaFNoYWRvd3NTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgZ2V0TFZpZXcoKSwgdE5vZGUuY2xhc3NlcywgdHJ1ZSk7CiAgICB9CiAgICBpZiAodE5vZGUuc3R5bGVzICE9PSBudWxsICYmIGhhc1N0eWxlSW5wdXQodE5vZGUpKSB7CiAgICAgICAgc2V0RGlyZWN0aXZlSW5wdXRzV2hpY2hTaGFkb3dzU3R5bGluZyh0VmlldywgdE5vZGUsIGdldExWaWV3KCksIHROb2RlLnN0eWxlcywgZmFsc2UpOwogICAgfQp9Ci8qKgogKiBDcmVhdGVzIGFuIGVtcHR5IGVsZW1lbnQgdXNpbmcge1xAbGluayBlbGVtZW50U3RhcnR9IGFuZCB7XEBsaW5rIGVsZW1lbnRFbmR9CiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkYXRhIGFycmF5CiAqIEBwYXJhbSB7P30gbmFtZSBOYW1lIG9mIHRoZSBET00gTm9kZQogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3MgbG9jYWwgcmVmZXJlbmNlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1ZWxlbWVudChpbmRleCwgbmFtZSwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoaW5kZXgsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGhhc0RpcmVjdGl2ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdhcm5BYm91dFVua25vd25FbGVtZW50KHRWaWV3LCBsVmlldywgZWxlbWVudCwgdE5vZGUsIGhhc0RpcmVjdGl2ZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjaGVtYXMgPSB0Vmlldy5zY2hlbWFzOwogICAgLy8gSWYgYHNjaGVtYXNgIGlzIHNldCB0byBgbnVsbGAsIHRoYXQncyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhpcyBDb21wb25lbnQgd2FzIGNvbXBpbGVkIGluIEFPVAogICAgLy8gbW9kZSB3aGVyZSB0aGlzIGNoZWNrIGhhcHBlbnMgYXQgY29tcGlsZSB0aW1lLiBJbiBKSVQgbW9kZSwgYHNjaGVtYXNgIGlzIGFsd2F5cyBwcmVzZW50IGFuZAogICAgLy8gZGVmaW5lZCBhcyBhbiBhcnJheSAoYXMgYW4gZW1wdHkgYXJyYXkgaW4gY2FzZSBgc2NoZW1hc2AgZmllbGQgaXMgbm90IGRlZmluZWQpIGFuZCB3ZSBzaG91bGQKICAgIC8vIGV4ZWN1dGUgdGhlIGNoZWNrIGJlbG93LgogICAgaWYgKHNjaGVtYXMgPT09IG51bGwpCiAgICAgICAgcmV0dXJuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdGFnTmFtZSA9IHROb2RlLnRhZ05hbWU7CiAgICAvLyBJZiB0aGUgZWxlbWVudCBtYXRjaGVzIGFueSBkaXJlY3RpdmUsIGl0J3MgY29uc2lkZXJlZCBhcyB2YWxpZC4KICAgIGlmICghaGFzRGlyZWN0aXZlcyAmJiB0YWdOYW1lICE9PSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgdW5rbm93biBpZiBpdCdzIGFuIGluc3RhbmNlIG9mIEhUTUxVbmtub3duRWxlbWVudCBvciBpdCBpc24ndCByZWdpc3RlcmVkCiAgICAgICAgLy8gYXMgYSBjdXN0b20gZWxlbWVudC4gTm90ZSB0aGF0IHVua25vd24gZWxlbWVudHMgd2l0aCBhIGRhc2ggaW4gdGhlaXIgbmFtZSB3b24ndCBiZSBpbnN0YW5jZXMKICAgICAgICAvLyBvZiBIVE1MVW5rbm93bkVsZW1lbnQgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IHdlYiBjb21wb25lbnRzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1Vua25vd24gPSAKICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2hlY2sgZm9yIGB0eXBlb2YgSFRNTFVua25vd25FbGVtZW50ID09PSAnZnVuY3Rpb24nYCwKICAgICAgICAvLyBiZWNhdXNlIHdoaWxlIG1vc3QgYnJvd3NlcnMgcmV0dXJuICdmdW5jdGlvbicsIElFIHJldHVybnMgJ29iamVjdCcuCiAgICAgICAgKHR5cGVvZiBIVE1MVW5rbm93bkVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIEhUTUxVbmtub3duRWxlbWVudCAmJgogICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFVua25vd25FbGVtZW50KSB8fAogICAgICAgICAgICAodHlwZW9mIGN1c3RvbUVsZW1lbnRzICE9PSAndW5kZWZpbmVkJyAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xICYmCiAgICAgICAgICAgICAgICAhY3VzdG9tRWxlbWVudHMuZ2V0KHRhZ05hbWUpKTsKICAgICAgICBpZiAoaXNVbmtub3duICYmICFtYXRjaGluZ1NjaGVtYXModFZpZXcsIGxWaWV3LCB0YWdOYW1lKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB3YXJuaW5nID0gYCcke3RhZ05hbWV9JyBpcyBub3QgYSBrbm93biBlbGVtZW50OlxuYDsKICAgICAgICAgICAgd2FybmluZyArPSBgMS4gSWYgJyR7dGFnTmFtZX0nIGlzIGFuIEFuZ3VsYXIgY29tcG9uZW50LCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIHBhcnQgb2YgdGhpcyBtb2R1bGUuXG5gOwogICAgICAgICAgICBpZiAodGFnTmFtZSAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nICs9IGAyLiBJZiAnJHt0YWdOYW1lfScgaXMgYSBXZWIgQ29tcG9uZW50IHRoZW4gYWRkICdDVVNUT01fRUxFTUVOVFNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudCB0byBzdXBwcmVzcyB0aGlzIG1lc3NhZ2UuYDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcgKz0KICAgICAgICAgICAgICAgICAgICBgMi4gVG8gYWxsb3cgYW55IGVsZW1lbnQgYWRkICdOT19FUlJPUlNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudC5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2VsZW1lbnRfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IGluZGV4CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4CiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbGVtZW50Q29udGFpbmVyU3RhcnRGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUuZmlyc3RDcmVhdGVQYXNzKys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Vmlld0NvbnN0cyA9IHRWaWV3LmNvbnN0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGF0dHJzID0gZ2V0Q29uc3RhbnQodFZpZXdDb25zdHMsIGF0dHJzSW5kZXgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBpbmRleCwgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCAnbmctY29udGFpbmVyJywgYXR0cnMpOwogICAgLy8gV2hpbGUgbmctY29udGFpbmVyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBzdHlsaW5nLCB3ZSB1c2UgdGhlIHN0eWxlIGNvbnRleHQgdG8gaWRlbnRpZnkKICAgIC8vIGFuZCBleGVjdXRlIGRpcmVjdGl2ZXMgb24gdGhlIG5nLWNvbnRhaW5lci4KICAgIGlmIChhdHRycyAhPT0gbnVsbCkgewogICAgICAgIGNvbXB1dGVTdGF0aWNTdHlsaW5nKHROb2RlLCBhdHRycyk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsb2NhbFJlZnMgPSBnZXRDb25zdGFudCh0Vmlld0NvbnN0cywgbG9jYWxSZWZzSW5kZXgpOwogICAgcmVzb2x2ZURpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgbG9jYWxSZWZzKTsKICAgIGlmICh0Vmlldy5xdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgdFZpZXcucXVlcmllcy5lbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKTsKICAgIH0KICAgIHJldHVybiB0Tm9kZTsKfQovKioKICogQ3JlYXRlcyBhIGxvZ2ljYWwgY29udGFpbmVyIGZvciBvdGhlciBub2RlcyAoPG5nLWNvbnRhaW5lcj4pIGJhY2tlZCBieSBhIGNvbW1lbnQgbm9kZSBpbiB0aGUgRE9NLgogKiBUaGUgaW5zdHJ1Y3Rpb24gbXVzdCBsYXRlciBiZSBmb2xsb3dlZCBieSBgZWxlbWVudENvbnRhaW5lckVuZCgpYCBjYWxsLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgTFZpZXcgYXJyYXkKICogQHBhcmFtIHs/PX0gYXR0cnNJbmRleCBJbmRleCBvZiB0aGUgY29udGFpbmVyIGF0dHJpYnV0ZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleCBJbmRleCBvZiB0aGUgY29udGFpbmVyJ3MgbG9jYWwgcmVmZXJlbmNlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqCiAqIEV2ZW4gaWYgdGhpcyBpbnN0cnVjdGlvbiBhY2NlcHRzIGEgc2V0IG9mIGF0dHJpYnV0ZXMgbm8gYWN0dWFsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQgdG8KICogdGhlIERPTSAoYXMgYSBjb21tZW50IG5vZGUgY2FuJ3QgaGF2ZSBhdHRyaWJ1dGVzKS4gQXR0cmlidXRlcyBhcmUgaGVyZSBvbmx5IGZvciBkaXJlY3RpdmUKICogbWF0Y2hpbmcgcHVycG9zZXMgYW5kIHNldHRpbmcgaW5pdGlhbCBpbnB1dHMgb2YgZGlyZWN0aXZlcy4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoaW5kZXgsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBhZGp1c3RlZEluZGV4KTsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ2VsZW1lbnQgY29udGFpbmVycyBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGJpbmRpbmdzJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyA/CiAgICAgICAgZWxlbWVudENvbnRhaW5lclN0YXJ0Rmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSA6CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKTsKICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZSh0Tm9kZSwgdHJ1ZSk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmF0aXZlID0gbFZpZXdbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgIGxWaWV3W1JFTkRFUkVSXS5jcmVhdGVDb21tZW50KG5nRGV2TW9kZSA/ICduZy1jb250YWluZXInIDogJycpOwogICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBuYXRpdmUsIHROb2RlKTsKICAgIGF0dGFjaFBhdGNoRGF0YShuYXRpdmUsIGxWaWV3KTsKICAgIGlmIChpc0RpcmVjdGl2ZUhvc3QodE5vZGUpKSB7CiAgICAgICAgY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgICAgICBleGVjdXRlQ29udGVudFF1ZXJpZXModFZpZXcsIHROb2RlLCBsVmlldyk7CiAgICB9CiAgICBpZiAobG9jYWxSZWZzSW5kZXggIT0gbnVsbCkgewogICAgICAgIHNhdmVSZXNvbHZlZExvY2Fsc0luRGF0YShsVmlldywgdE5vZGUpOwogICAgfQp9Ci8qKgogKiBNYXJrIHRoZSBlbmQgb2YgdGhlIDxuZy1jb250YWluZXI+LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgaWYgKGdldElzUGFyZW50KCkpIHsKICAgICAgICBzZXRJc05vdFBhcmVudCgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEhhc1BhcmVudChwcmV2aW91c09yUGFyZW50VE5vZGUpOwogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgfQogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICByZWdpc3RlclBvc3RPcmRlckhvb2tzKHRWaWV3LCBwcmV2aW91c09yUGFyZW50VE5vZGUpOwogICAgICAgIGlmIChpc0NvbnRlbnRRdWVyeUhvc3QocHJldmlvdXNPclBhcmVudFROb2RlKSkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcucXVlcmllcykpLmVsZW1lbnRFbmQocHJldmlvdXNPclBhcmVudFROb2RlKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYW4gZW1wdHkgbG9naWNhbCBjb250YWluZXIgdXNpbmcge1xAbGluayBlbGVtZW50Q29udGFpbmVyU3RhcnR9CiAqIGFuZCB7XEBsaW5rIGVsZW1lbnRDb250YWluZXJFbmR9CiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheQogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRoZSBjb250YWluZXIgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4IEluZGV4IG9mIHRoZSBjb250YWluZXIncyBsb2NhbCByZWZlcmVuY2VzIGluIHRoZSBgY29uc3RzYCBhcnJheS4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyKGluZGV4LCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydChpbmRleCwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpOwogICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvZW1iZWRkZWRfdmlldy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogTWFya3MgdGhlIHN0YXJ0IG9mIGFuIGVtYmVkZGVkIHZpZXcuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHZpZXdCbG9ja0lkIFRoZSBJRCBvZiB0aGlzIHZpZXcKICogQHBhcmFtIHs/fSBkZWNscwogKiBAcGFyYW0gez99IHZhcnMKICogQHJldHVybiB7P30gYm9vbGVhbiBXaGV0aGVyIG9yIG5vdCB0aGlzIHZpZXcgaXMgaW4gY3JlYXRpb24gbW9kZQogKgogKi8KZnVuY3Rpb24gybXJtWVtYmVkZGVkVmlld1N0YXJ0KHZpZXdCbG9ja0lkLCBkZWNscywgdmFycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAvLyBUaGUgcHJldmlvdXMgbm9kZSBjYW4gYmUgYSB2aWV3IG5vZGUgaWYgd2UgYXJlIHByb2Nlc3NpbmcgYW4gaW5saW5lIGZvciBsb29wCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250YWluZXJUTm9kZSA9IHByZXZpb3VzT3JQYXJlbnRUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8gPwogICAgICAgICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSkgOgogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbY29udGFpbmVyVE5vZGUuaW5kZXhdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUoY29udGFpbmVyVE5vZGUsIDAgLyogQ29udGFpbmVyICovKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aWV3VG9SZW5kZXIgPSBzY2FuRm9yVmlldyhsQ29udGFpbmVyLCBnZXRMQ29udGFpbmVyQWN0aXZlSW5kZXgobENvbnRhaW5lciksIHZpZXdCbG9ja0lkKTsKICAgIGlmICh2aWV3VG9SZW5kZXIpIHsKICAgICAgICBzZXRJc1BhcmVudCgpOwogICAgICAgIGVudGVyVmlldyh2aWV3VG9SZW5kZXIsIHZpZXdUb1JlbmRlcltUVklFV10ubm9kZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXaGVuIHdlIGNyZWF0ZSBhIG5ldyBMVmlldywgd2UgYWx3YXlzIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zLgogICAgICAgIHZpZXdUb1JlbmRlciA9IGNyZWF0ZUxWaWV3KGxWaWV3LCBnZXRPckNyZWF0ZUVtYmVkZGVkVFZpZXcodmlld0Jsb2NrSWQsIGRlY2xzLCB2YXJzLCAoLyoqIEB0eXBlIHs/fSAqLyAoY29udGFpbmVyVE5vZGUpKSksIG51bGwsIDE2IC8qIENoZWNrQWx3YXlzICovLCBudWxsLCBudWxsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFBhcmVudE5vZGUgPSBnZXRJc1BhcmVudCgpID8gcHJldmlvdXNPclBhcmVudFROb2RlIDoKICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5wYXJlbnQ7CiAgICAgICAgYXNzaWduVFZpZXdOb2RlVG9MVmlldyh2aWV3VG9SZW5kZXJbVFZJRVddLCB0UGFyZW50Tm9kZSwgdmlld0Jsb2NrSWQsIHZpZXdUb1JlbmRlcik7CiAgICAgICAgZW50ZXJWaWV3KHZpZXdUb1JlbmRlciwgdmlld1RvUmVuZGVyW1RWSUVXXS5ub2RlKTsKICAgIH0KICAgIGlmIChsQ29udGFpbmVyKSB7CiAgICAgICAgaWYgKGlzQ3JlYXRpb25Nb2RlKHZpZXdUb1JlbmRlcikpIHsKICAgICAgICAgICAgLy8gaXQgaXMgYSBuZXcgdmlldywgaW5zZXJ0IGl0IGludG8gY29sbGVjdGlvbiBvZiB2aWV3cyBmb3IgYSBnaXZlbiBjb250YWluZXIKICAgICAgICAgICAgaW5zZXJ0Vmlldyh2aWV3VG9SZW5kZXJbVFZJRVddLCB2aWV3VG9SZW5kZXIsIGxDb250YWluZXIsIGdldExDb250YWluZXJBY3RpdmVJbmRleChsQ29udGFpbmVyKSk7CiAgICAgICAgfQogICAgICAgIGxDb250YWluZXJbQUNUSVZFX0lOREVYXSArPSAyIC8qIElOQ1JFTUVOVCAqLzsKICAgIH0KICAgIHJldHVybiBpc0NyZWF0aW9uTW9kZSh2aWV3VG9SZW5kZXIpID8gMSAvKiBDcmVhdGUgKi8gfCAyIC8qIFVwZGF0ZSAqLyA6CiAgICAgICAgMiAvKiBVcGRhdGUgKi87Cn0KLyoqCiAqIEluaXRpYWxpemUgdGhlIFRWaWV3IChlLmcuIHN0YXRpYyBkYXRhKSBmb3IgdGhlIGFjdGl2ZSBlbWJlZGRlZCB2aWV3LgogKgogKiBFYWNoIGVtYmVkZGVkIHZpZXcgYmxvY2sgbXVzdCBjcmVhdGUgb3IgcmV0cmlldmUgaXRzIG93biBUVmlldy4gT3RoZXJ3aXNlLCB0aGUgZW1iZWRkZWQgdmlldydzCiAqIHN0YXRpYyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgbm9kZSB3b3VsZCBvdmVyd3JpdGUgdGhlIHN0YXRpYyBkYXRhIGZvciBhIG5vZGUgaW4gdGhlIHZpZXcgYWJvdmUKICogaXQgd2l0aCB0aGUgc2FtZSBpbmRleCAoc2luY2UgaXQncyBpbiB0aGUgc2FtZSB0ZW1wbGF0ZSkuCiAqCiAqIEBwYXJhbSB7P30gdmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGUgVFZpZXcgaW4gVE5vZGUudFZpZXdzCiAqIEBwYXJhbSB7P30gZGVjbHMgVGhlIG51bWJlciBvZiBub2RlcywgbG9jYWwgcmVmcywgYW5kIHBpcGVzIGluIHRoaXMgdGVtcGxhdGUKICogQHBhcmFtIHs/fSB2YXJzIFRoZSBudW1iZXIgb2YgYmluZGluZ3MgYW5kIHB1cmUgZnVuY3Rpb24gYmluZGluZ3MgaW4gdGhpcyB0ZW1wbGF0ZQogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcmV0dXJuIHs/fSBUVmlldwogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVFbWJlZGRlZFRWaWV3KHZpZXdJbmRleCwgZGVjbHMsIHZhcnMsIHBhcmVudCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRMVmlldygpW1RWSUVXXTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwYXJlbnQsIDAgLyogQ29udGFpbmVyICovKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5lclRWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnQudFZpZXdzKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjb250YWluZXJUVmlld3MsICdUVmlldyBleHBlY3RlZCcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKEFycmF5LmlzQXJyYXkoY29udGFpbmVyVFZpZXdzKSwgdHJ1ZSwgJ1RWaWV3cyBzaG91bGQgYmUgaW4gYW4gYXJyYXknKTsKICAgIGlmICh2aWV3SW5kZXggPj0gY29udGFpbmVyVFZpZXdzLmxlbmd0aCB8fCBjb250YWluZXJUVmlld3Nbdmlld0luZGV4XSA9PSBudWxsKSB7CiAgICAgICAgY29udGFpbmVyVFZpZXdzW3ZpZXdJbmRleF0gPSBjcmVhdGVUVmlldygyIC8qIEVtYmVkZGVkICovLCB2aWV3SW5kZXgsIG51bGwsIGRlY2xzLCB2YXJzLCB0Vmlldy5kaXJlY3RpdmVSZWdpc3RyeSwgdFZpZXcucGlwZVJlZ2lzdHJ5LCBudWxsLCBudWxsLCB0Vmlldy5jb25zdHMpOwogICAgfQogICAgcmV0dXJuIGNvbnRhaW5lclRWaWV3c1t2aWV3SW5kZXhdOwp9Ci8qKgogKiBMb29rcyBmb3IgYSB2aWV3IHdpdGggYSBnaXZlbiB2aWV3IGJsb2NrIGlkIGluc2lkZSBhIHByb3ZpZGVkIExDb250YWluZXIuCiAqIFJlbW92ZXMgdmlld3MgdGhhdCBuZWVkIHRvIGJlIGRlbGV0ZWQgaW4gdGhlIHByb2Nlc3MuCiAqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciB0byBzZWFyY2ggZm9yIHZpZXdzCiAqIEBwYXJhbSB7P30gc3RhcnRJZHggc3RhcnRpbmcgaW5kZXggaW4gdGhlIHZpZXdzIGFycmF5IHRvIHNlYXJjaCBmcm9tCiAqIEBwYXJhbSB7P30gdmlld0Jsb2NrSWQgZXhhY3QgdmlldyBibG9jayBpZCB0byBsb29rIGZvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2NhbkZvclZpZXcobENvbnRhaW5lciwgc3RhcnRJZHgsIHZpZXdCbG9ja0lkKSB7CiAgICBmb3IgKGxldCBpID0gc3RhcnRJZHggKyBDT05UQUlORVJfSEVBREVSX09GRlNFVDsgaSA8IGxDb250YWluZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld0F0UG9zaXRpb25JZCA9IGxDb250YWluZXJbaV1bVFZJRVddLmlkOwogICAgICAgIGlmICh2aWV3QXRQb3NpdGlvbklkID09PSB2aWV3QmxvY2tJZCkgewogICAgICAgICAgICByZXR1cm4gbENvbnRhaW5lcltpXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodmlld0F0UG9zaXRpb25JZCA8IHZpZXdCbG9ja0lkKSB7CiAgICAgICAgICAgIC8vIGZvdW5kIGEgdmlldyB0aGF0IHNob3VsZCBub3QgYmUgYXQgdGhpcyBwb3NpdGlvbiAtIHJlbW92ZQogICAgICAgICAgICByZW1vdmVWaWV3KGxDb250YWluZXIsIGkgLSBDT05UQUlORVJfSEVBREVSX09GRlNFVCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBmb3VuZCBhIHZpZXcgd2l0aCBpZCBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvcgogICAgICAgICAgICAvLyB3aGljaCBtZWFucyB0aGF0IHJlcXVpcmVkIHZpZXcgZG9lc24ndCBleGlzdCBhbmQgY2FuJ3QgYmUgZm91bmQgYXQKICAgICAgICAgICAgLy8gbGF0ZXIgcG9zaXRpb25zIGluIHRoZSB2aWV3cyBhcnJheSAtIHN0b3AgdGhlIHNlYXJjaGRlZi5jb250IGhlcmUKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIE1hcmtzIHRoZSBlbmQgb2YgYW4gZW1iZWRkZWQgdmlldy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1ZW1iZWRkZWRWaWV3RW5kKCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgdmlld0hvc3QgPSBsVmlld1tUX0hPU1RdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dCA9IGxWaWV3W0NPTlRFWFRdOwogICAgaWYgKGlzQ3JlYXRpb25Nb2RlKGxWaWV3KSkgewogICAgICAgIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KTsgLy8gY3JlYXRpb24gbW9kZSBwYXNzCiAgICB9CiAgICByZWZyZXNoVmlldyh0VmlldywgbFZpZXcsIHRWaWV3LnRlbXBsYXRlLCBjb250ZXh0KTsgLy8gdXBkYXRlIG1vZGUgcGFzcwogICAgLy8gdXBkYXRlIG1vZGUgcGFzcwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tQQVJFTlRdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lck9yVW5kZWZpbmVkKGxDb250YWluZXIpOwogICAgbGVhdmVWaWV3KCk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdIb3N0KSksIGZhbHNlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvZ2V0X2N1cnJlbnRfdmlldy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0dXJucyB0aGUgY3VycmVudCBPcGFxdWVWaWV3U3RhdGUgaW5zdGFuY2UuCiAqCiAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcmVzdG9yZVZpZXcoKSBpbnN0cnVjdGlvbiB0byBzYXZlIGEgc25hcHNob3QKICogb2YgdGhlIGN1cnJlbnQgdmlldyBhbmQgcmVzdG9yZSBpdCB3aGVuIGxpc3RlbmVycyBhcmUgaW52b2tlZC4gVGhpcyBhbGxvd3MKICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Z2V0Q3VycmVudFZpZXcoKSB7CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChnZXRMVmlldygpKSkpKTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBzaGFwZWQgbGlrZSBhIFByb21pc2UKICovCmZ1bmN0aW9uIGlzUHJvbWlzZSQxKG9iaikgewogICAgLy8gYWxsb3cgYW55IFByb21pc2UvQSsgY29tcGxpYW50IHRoZW5hYmxlLgogICAgLy8gSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IG9iai50aGVuIGNvbmZvcm1zIHRvIHRoZSBzcGVjCiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nOwp9Ci8qKgogKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIE9ic2VydmFibGUKICovCmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSQxKG9iaikgewogICAgLy8gVE9ETzogdXNlIGlzT2JzZXJ2YWJsZSBvbmNlIHdlIHVwZGF0ZSBwYXNzIHJ4anMgNi4xCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvYmxvYi9tYXN0ZXIvQ0hBTkdFTE9HLm1kIzYxMC0yMDE4LTA1LTAzCiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbic7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2xpc3RlbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IG5vZGUuCiAqCiAqIElmIGFuIG91dHB1dCBleGlzdHMgb24gb25lIG9mIHRoZSBub2RlJ3MgZGlyZWN0aXZlcywgaXQgYWxzbyBzdWJzY3JpYmVzIHRvIHRoZSBvdXRwdXQKICogYW5kIHNhdmVzIHRoZSBzdWJzY3JpcHRpb24gZm9yIGxhdGVyIGNsZWFudXAuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudAogKiBAcGFyYW0gez99IGxpc3RlbmVyRm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGV2ZW50IGVtaXRzCiAqIEBwYXJhbSB7Pz19IHVzZUNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gdXNlIGNhcHR1cmUgaW4gZXZlbnQgbGlzdGVuZXIKICogQHBhcmFtIHs/PX0gZXZlbnRUYXJnZXRSZXNvbHZlciBGdW5jdGlvbiB0aGF0IHJldHVybnMgZ2xvYmFsIHRhcmdldCBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoaXMgbGlzdGVuZXIKICogc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGEgZ2xvYmFsIG9iamVjdCBsaWtlIHdpbmRvdywgZG9jdW1lbnQgb3IgYm9keQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSA9IGZhbHNlLCBldmVudFRhcmdldFJlc29sdmVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgbGlzdGVuZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgdE5vZGUsIGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSwgZXZlbnRUYXJnZXRSZXNvbHZlcik7CiAgICByZXR1cm4gybXJtWxpc3RlbmVyOwp9Ci8qKgogKiBSZWdpc3RlcnMgYSBzeW50aGV0aWMgaG9zdCBsaXN0ZW5lciAoZS5nLiBgKFxAZm9vLnN0YXJ0KWApIG9uIGEgY29tcG9uZW50LgogKgogKiBUaGlzIGluc3RydWN0aW9uIGlzIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzIGFuZCBpcyBkZXNpZ25lZCB0byBlbnN1cmUgdGhhdCBhCiAqIHN5bnRoZXRpYyBob3N0IGxpc3RlbmVyIChlLmcuIGBcQEhvc3RMaXN0ZW5lcignXEBmb28uc3RhcnQnKWApIHByb3Blcmx5IGdldHMgcmVuZGVyZWQKICogaW4gdGhlIGNvbXBvbmVudCdzIHJlbmRlcmVyLiBOb3JtYWxseSBhbGwgaG9zdCBsaXN0ZW5lcnMgYXJlIGV2YWx1YXRlZCB3aXRoIHRoZQogKiBwYXJlbnQgY29tcG9uZW50J3MgcmVuZGVyZXIsIGJ1dCwgaW4gdGhlIGNhc2Ugb2YgYW5pbWF0aW9uIFxAdHJpZ2dlcnMsIHRoZXkgbmVlZAogKiB0byBiZSBldmFsdWF0ZWQgd2l0aCB0aGUgc3ViIGNvbXBvbmVudCdzIHJlbmRlcmVyIChiZWNhdXNlIHRoYXQncyB3aGVyZSB0aGUKICogYW5pbWF0aW9uIHRyaWdnZXJzIGFyZSBkZWZpbmVkKS4KICoKICogRG8gbm90IHVzZSB0aGlzIGluc3RydWN0aW9uIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGBsaXN0ZW5lcmAuIFRoaXMgaW5zdHJ1Y3Rpb24KICogb25seSBleGlzdHMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVmlld0VuZ2luZSdzIGhvc3QgYmluZGluZyBiZWhhdmlvci4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50CiAqIEBwYXJhbSB7P30gbGlzdGVuZXJGbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZXZlbnQgZW1pdHMKICogQHBhcmFtIHs/PX0gdXNlQ2FwdHVyZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgY2FwdHVyZSBpbiBldmVudCBsaXN0ZW5lcgogKiBAcGFyYW0gez89fSBldmVudFRhcmdldFJlc29sdmVyIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBnbG9iYWwgdGFyZ2V0IGluZm9ybWF0aW9uIGluIGNhc2UgdGhpcyBsaXN0ZW5lcgogKiBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYSBnbG9iYWwgb2JqZWN0IGxpa2Ugd2luZG93LCBkb2N1bWVudCBvciBib2R5CiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSA9IGZhbHNlLCBldmVudFRhcmdldFJlc29sdmVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSBsb2FkQ29tcG9uZW50UmVuZGVyZXIodE5vZGUsIGxWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIGxpc3RlbmVySW50ZXJuYWwodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgdE5vZGUsIGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSwgZXZlbnRUYXJnZXRSZXNvbHZlcik7CiAgICByZXR1cm4gybXJtWNvbXBvbmVudEhvc3RTeW50aGV0aWNMaXN0ZW5lcjsKfQovKioKICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGEgZ2l2ZW4gZWxlbWVudCBoYXMgYWxyZWFkeSBhbiBldmVudCBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIGFuCiAqIGV2ZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZS4gVGhlIFRWaWV3LmNsZWFudXAgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBmaW5kIG91dCB3aGljaCBldmVudHMKICogYXJlIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudC4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAqIEBwYXJhbSB7P30gdE5vZGVJZHgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZpbmRFeGlzdGluZ0xpc3RlbmVyKHRWaWV3LCBsVmlldywgZXZlbnROYW1lLCB0Tm9kZUlkeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgaWYgKHRDbGVhbnVwICE9IG51bGwpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsZWFudXBFdmVudE5hbWUgPSB0Q2xlYW51cFtpXTsKICAgICAgICAgICAgaWYgKGNsZWFudXBFdmVudE5hbWUgPT09IGV2ZW50TmFtZSAmJiB0Q2xlYW51cFtpICsgMV0gPT09IHROb2RlSWR4KSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWF0Y2hpbmcgZXZlbnQgbmFtZSBvbiB0aGUgc2FtZSBub2RlIGJ1dCBpdCBtaWdodCBub3QgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlcmVkIHlldCwgc28gd2UgbXVzdCBleHBsaWNpdGx5IHZlcmlmeSBlbnRyaWVzIGluIHRoZSBMVmlldyBjbGVhbnVwIGRhdGEKICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZXMuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsQ2xlYW51cCA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tDTEVBTlVQXSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJJZHhJbkxDbGVhbnVwID0gdENsZWFudXBbaSArIDJdOwogICAgICAgICAgICAgICAgcmV0dXJuIGxDbGVhbnVwLmxlbmd0aCA+IGxpc3RlbmVySWR4SW5MQ2xlYW51cCA/IGxDbGVhbnVwW2xpc3RlbmVySWR4SW5MQ2xlYW51cF0gOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRWaWV3LmNsZWFudXAgY2FuIGhhdmUgYSBtaXggb2YgNC1lbGVtZW50cyBlbnRyaWVzIChmb3IgZXZlbnQgaGFuZGxlciBjbGVhbnVwcykgb3IKICAgICAgICAgICAgLy8gMi1lbGVtZW50IGVudHJpZXMgKGZvciBkaXJlY3RpdmUgYW5kIHF1ZXJpZXMgZGVzdHJveSBob29rcykuIEFzIHN1Y2ggd2UgY2FuIGVuY291bnRlcgogICAgICAgICAgICAvLyBibG9ja3Mgb2YgNCBvciAyIGl0ZW1zIGluIHRoZSB0Vmlldy5jbGVhbnVwIGFuZCB0aGlzIGlzIHdoeSB3ZSBpdGVyYXRlIG92ZXIgMiBlbGVtZW50cwogICAgICAgICAgICAvLyBmaXJzdCBhbmQganVtcCBhbm90aGVyIDIgZWxlbWVudHMgaWYgd2UgZGV0ZWN0IGxpc3RlbmVycyBjbGVhbnVwICg0IGVsZW1lbnRzKS4gQWxzbyBjaGVjawogICAgICAgICAgICAvLyBkb2N1bWVudGF0aW9uIG9mIFRWaWV3LmNsZWFudXAgZm9yIG1vcmUgZGV0YWlscyBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIGxheW91dC4KICAgICAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwRXZlbnROYW1lID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBldmVudE5hbWUKICogQHBhcmFtIHs/fSBsaXN0ZW5lckZuCiAqIEBwYXJhbSB7Pz19IHVzZUNhcHR1cmUKICogQHBhcmFtIHs/PX0gZXZlbnRUYXJnZXRSZXNvbHZlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbGlzdGVuZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCB0Tm9kZSwgZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlID0gZmFsc2UsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzVE5vZGVEaXJlY3RpdmVIb3N0ID0gaXNEaXJlY3RpdmVIb3N0KHROb2RlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpcnN0Q3JlYXRlUGFzcyA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRDbGVhbnVwID0gZmlyc3RDcmVhdGVQYXNzICYmICh0Vmlldy5jbGVhbnVwIHx8ICh0Vmlldy5jbGVhbnVwID0gW10pKTsKICAgIC8vIFdoZW4gdGhlIMm1ybVsaXN0ZW5lciBpbnN0cnVjdGlvbiB3YXMgZ2VuZXJhdGVkIGFuZCBpcyBleGVjdXRlZCB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgZWl0aGVyIGEKICAgIC8vIG5hdGl2ZSBsaXN0ZW5lciBvciBhIGRpcmVjdGl2ZSBvdXRwdXQgb24gdGhpcyBlbGVtZW50LiBBcyBzdWNoIHdlIHdlIGtub3cgdGhhdCB3ZSB3aWxsIGhhdmUgdG8KICAgIC8vIHJlZ2lzdGVyIGEgbGlzdGVuZXIgYW5kIHN0b3JlIGl0cyBjbGVhbnVwIGZ1bmN0aW9uIG9uIExWaWV3LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENsZWFudXAgPSBnZXRMQ2xlYW51cChsVmlldyk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8sIDAgLyogQ29udGFpbmVyICovLCA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByb2Nlc3NPdXRwdXRzID0gdHJ1ZTsKICAgIC8vIGFkZCBuYXRpdmUgZXZlbnQgbGlzdGVuZXIgLSBhcHBsaWNhYmxlIHRvIGVsZW1lbnRzIG9ubHkKICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmF0aXZlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNvbHZlZCA9IGV2ZW50VGFyZ2V0UmVzb2x2ZXIgPyBldmVudFRhcmdldFJlc29sdmVyKG5hdGl2ZSkgOiAoLyoqIEB0eXBlIHs/fSAqLyAoRU1QVFlfT0JKKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhcmdldCA9IHJlc29sdmVkLnRhcmdldCB8fCBuYXRpdmU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDbGVhbnVwSW5kZXggPSBsQ2xlYW51cC5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlkeE9yVGFyZ2V0R2V0dGVyID0gZXZlbnRUYXJnZXRSZXNvbHZlciA/CiAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfbFZpZXcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfbFZpZXcpID0+IGV2ZW50VGFyZ2V0UmVzb2x2ZXIodW53cmFwUk5vZGUoX2xWaWV3W3ROb2RlLmluZGV4XSkpLnRhcmdldCkgOgogICAgICAgICAgICB0Tm9kZS5pbmRleDsKICAgICAgICAvLyBJbiBvcmRlciB0byBtYXRjaCBjdXJyZW50IGJlaGF2aW9yLCBuYXRpdmUgRE9NIGV2ZW50IGxpc3RlbmVycyBtdXN0IGJlIGFkZGVkIGZvciBhbGwKICAgICAgICAvLyBldmVudHMgKGluY2x1ZGluZyBvdXRwdXRzKS4KICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIGNhc2VzIHdoZXJlIG11bHRpcGxlIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgZWxlbWVudCB0cnkgdG8gcmVnaXN0ZXIgYW4gZXZlbnQKICAgICAgICAgICAgLy8gaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIHNhbWUgZXZlbnQuIEluIHRoaXMgc2l0dWF0aW9uIHdlIHdhbnQgdG8gYXZvaWQgcmVnaXN0cmF0aW9uIG9mCiAgICAgICAgICAgIC8vIHNldmVyYWwgbmF0aXZlIGxpc3RlbmVycyBhcyBlYWNoIHJlZ2lzdHJhdGlvbiB3b3VsZCBiZSBpbnRlcmNlcHRlZCBieSBOZ1pvbmUgYW5kCiAgICAgICAgICAgIC8vIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbi4gVGhpcyB3b3VsZCBtZWFuIHRoYXQgYSBzaW5nbGUgdXNlciBhY3Rpb24gd291bGQgcmVzdWx0IGluIHNldmVyYWwKICAgICAgICAgICAgLy8gY2hhbmdlIGRldGVjdGlvbnMgYmVpbmcgaW52b2tlZC4gVG8gYXZvaWQgdGhpcyBzaXR1YXRpb24gd2Ugd2FudCB0byBoYXZlIG9ubHkgb25lIGNhbGwgdG8KICAgICAgICAgICAgLy8gbmF0aXZlIGhhbmRsZXIgcmVnaXN0cmF0aW9uIChmb3IgdGhlIHNhbWUgZWxlbWVudCBhbmQgc2FtZSB0eXBlIG9mIGV2ZW50KS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gaGF2ZSBqdXN0IG9uZSBuYXRpdmUgZXZlbnQgaGFuZGxlciBpbiBwcmVzZW5jZSBvZiBtdWx0aXBsZSBoYW5kbGVyIGZ1bmN0aW9ucywKICAgICAgICAgICAgLy8gd2UganVzdCByZWdpc3RlciBhIGZpcnN0IGhhbmRsZXIgZnVuY3Rpb24gYXMgYSBuYXRpdmUgZXZlbnQgbGlzdGVuZXIgYW5kIHRoZW4gY2hhaW4KICAgICAgICAgICAgLy8gKGNvYWxlc2NlKSBvdGhlciBoYW5kbGVyIGZ1bmN0aW9ucyBvbiB0b3Agb2YgdGhlIGZpcnN0IG5hdGl2ZSBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBleGlzdGluZ0xpc3RlbmVyID0gbnVsbDsKICAgICAgICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgY29hbGVzY2luZyBkZXNjcmliZWQgaGVyZSBkb2Vzbid0IGhhcHBlbiBmb3IgZXZlbnRzIHNwZWNpZnlpbmcgYW4KICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdGFyZ2V0IChleC4gKGRvY3VtZW50OmNsaWNrKSkgLSB0aGlzIGlzIHRvIGtlZXAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQogICAgICAgICAgICAvLyB2aWV3IGVuZ2luZS4KICAgICAgICAgICAgLy8gQWxzbywgd2UgZG9uJ3QgaGF2ZSB0byBzZWFyY2ggZm9yIGV4aXN0aW5nIGxpc3RlbmVycyBpcyB0aGVyZSBhcmUgbm8gZGlyZWN0aXZlcwogICAgICAgICAgICAvLyBtYXRjaGluZyBvbiBhIGdpdmVuIG5vZGUgYXMgd2UgY2FuJ3QgcmVnaXN0ZXIgbXVsdGlwbGUgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBzYW1lIGV2ZW50IGluCiAgICAgICAgICAgIC8vIGEgdGVtcGxhdGUgKHRoaXMgd291bGQgbWVhbiBoYXZpbmcgZHVwbGljYXRlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICBpZiAoIWV2ZW50VGFyZ2V0UmVzb2x2ZXIgJiYgaXNUTm9kZURpcmVjdGl2ZUhvc3QpIHsKICAgICAgICAgICAgICAgIGV4aXN0aW5nTGlzdGVuZXIgPSBmaW5kRXhpc3RpbmdMaXN0ZW5lcih0VmlldywgbFZpZXcsIGV2ZW50TmFtZSwgdE5vZGUuaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChleGlzdGluZ0xpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBBdHRhY2ggYSBuZXcgbGlzdGVuZXIgdG8gY29hbGVzY2VkIGxpc3RlbmVycyBsaXN0LCBtYWludGFpbmluZyB0aGUgb3JkZXIgaW4gd2hpY2gKICAgICAgICAgICAgICAgIC8vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QKICAgICAgICAgICAgICAgIC8vIGxpc3RlbmVyIGluIHRoYXQgbGlzdCAoaW4gYF9fbmdMYXN0TGlzdGVuZXJGbl9fYCBmaWVsZCksIHNvIHdlIGNhbiBhdm9pZCBnb2luZyB0aHJvdWdoCiAgICAgICAgICAgICAgICAvLyB0aGUgZW50aXJlIHNldCBlYWNoIHRpbWUgd2UgbmVlZCB0byBhZGQgYSBuZXcgbGlzdGVuZXIuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsYXN0TGlzdGVuZXJGbiA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZXhpc3RpbmdMaXN0ZW5lcikpKS5fX25nTGFzdExpc3RlbmVyRm5fXyB8fCBleGlzdGluZ0xpc3RlbmVyOwogICAgICAgICAgICAgICAgbGFzdExpc3RlbmVyRm4uX19uZ05leHRMaXN0ZW5lckZuX18gPSBsaXN0ZW5lckZuOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChleGlzdGluZ0xpc3RlbmVyKSkpLl9fbmdMYXN0TGlzdGVuZXJGbl9fID0gbGlzdGVuZXJGbjsKICAgICAgICAgICAgICAgIHByb2Nlc3NPdXRwdXRzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgYGxpc3RlbmAgZnVuY3Rpb24gaW4gUHJvY2VkdXJhbCBSZW5kZXJlciBpczoKICAgICAgICAgICAgICAgIC8vIC0gZWl0aGVyIGEgdGFyZ2V0IG5hbWUgKGFzIGEgc3RyaW5nKSBpbiBjYXNlIG9mIGdsb2JhbCB0YXJnZXQgKHdpbmRvdywgZG9jdW1lbnQsIGJvZHkpCiAgICAgICAgICAgICAgICAvLyAtIG9yIGVsZW1lbnQgcmVmZXJlbmNlIChpbiBhbGwgb3RoZXIgY2FzZXMpCiAgICAgICAgICAgICAgICBsaXN0ZW5lckZuID0gd3JhcExpc3RlbmVyKHROb2RlLCBsVmlldywgbGlzdGVuZXJGbiwgZmFsc2UgLyoqIHByZXZlbnREZWZhdWx0ICovKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBGbiA9IHJlbmRlcmVyLmxpc3RlbihyZXNvbHZlZC5uYW1lIHx8IHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lckZuKTsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJBZGRFdmVudExpc3RlbmVyKys7CiAgICAgICAgICAgICAgICBsQ2xlYW51cC5wdXNoKGxpc3RlbmVyRm4sIGNsZWFudXBGbik7CiAgICAgICAgICAgICAgICB0Q2xlYW51cCAmJiB0Q2xlYW51cC5wdXNoKGV2ZW50TmFtZSwgaWR4T3JUYXJnZXRHZXR0ZXIsIGxDbGVhbnVwSW5kZXgsIGxDbGVhbnVwSW5kZXggKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGlzdGVuZXJGbiA9IHdyYXBMaXN0ZW5lcih0Tm9kZSwgbFZpZXcsIGxpc3RlbmVyRm4sIHRydWUgLyoqIHByZXZlbnREZWZhdWx0ICovKTsKICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZEV2ZW50TGlzdGVuZXIrKzsKICAgICAgICAgICAgbENsZWFudXAucHVzaChsaXN0ZW5lckZuKTsKICAgICAgICAgICAgdENsZWFudXAgJiYgdENsZWFudXAucHVzaChldmVudE5hbWUsIGlkeE9yVGFyZ2V0R2V0dGVyLCBsQ2xlYW51cEluZGV4LCB1c2VDYXB0dXJlKTsKICAgICAgICB9CiAgICB9CiAgICAvLyBzdWJzY3JpYmUgdG8gZGlyZWN0aXZlIG91dHB1dHMKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG91dHB1dHMgPSB0Tm9kZS5vdXRwdXRzOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByb3BzOwogICAgaWYgKHByb2Nlc3NPdXRwdXRzICYmIG91dHB1dHMgIT09IG51bGwgJiYgKHByb3BzID0gb3V0cHV0c1tldmVudE5hbWVdKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDsKICAgICAgICBpZiAocHJvcHNMZW5ndGgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc0xlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICgvKiogQHR5cGUgez99ICovIChwcm9wc1tpXSkpOwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtaW5pZmllZE5hbWUgPSBwcm9wc1tpICsgMV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVJbnN0YW5jZSA9IGxWaWV3W2luZGV4XTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGRpcmVjdGl2ZUluc3RhbmNlW21pbmlmaWVkTmFtZV07CiAgICAgICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmICFpc09ic2VydmFibGUkMShvdXRwdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAT3V0cHV0ICR7bWluaWZpZWROYW1lfSBub3QgaW5pdGlhbGl6ZWQgaW4gJyR7ZGlyZWN0aXZlSW5zdGFuY2UuY29uc3RydWN0b3IubmFtZX0nLmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb3V0cHV0LnN1YnNjcmliZShsaXN0ZW5lckZuKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGxDbGVhbnVwLmxlbmd0aDsKICAgICAgICAgICAgICAgIGxDbGVhbnVwLnB1c2gobGlzdGVuZXJGbiwgc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIHRDbGVhbnVwICYmIHRDbGVhbnVwLnB1c2goZXZlbnROYW1lLCB0Tm9kZS5pbmRleCwgaWR4LCAtKGlkeCArIDEpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGxpc3RlbmVyRm4KICogQHBhcmFtIHs/fSBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbGlzdGVuZXJGbiwgZSkgewogICAgdHJ5IHsKICAgICAgICAvLyBPbmx5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGZhbHNlIGZyb20gYSBsaXN0ZW5lciBzaG91bGQgcHJldmVudERlZmF1bHQKICAgICAgICByZXR1cm4gbGlzdGVuZXJGbihlKSAhPT0gZmFsc2U7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKioKICogV3JhcHMgYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgbWFya3MgYW5jZXN0b3JzIGRpcnR5IGFuZCBwcmV2ZW50cyBkZWZhdWx0IGJlaGF2aW9yLAogKiBpZiBhcHBsaWNhYmxlLgogKgogKiBAcGFyYW0gez99IHROb2RlIFRoZSBUTm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaXN0ZW5lcgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB0aGF0IGNvbnRhaW5zIHRoaXMgbGlzdGVuZXIKICogQHBhcmFtIHs/fSBsaXN0ZW5lckZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAqIEBwYXJhbSB7P30gd3JhcFdpdGhQcmV2ZW50RGVmYXVsdCBXaGV0aGVyIG9yIG5vdCB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IKICogKHRoZSBwcm9jZWR1cmFsIHJlbmRlcmVyIGRvZXMgdGhpcyBhbHJlYWR5LCBzbyBpbiB0aG9zZSBjYXNlcywgd2Ugc2hvdWxkIHNraXApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB3cmFwTGlzdGVuZXIodE5vZGUsIGxWaWV3LCBsaXN0ZW5lckZuLCB3cmFwV2l0aFByZXZlbnREZWZhdWx0KSB7CiAgICAvLyBOb3RlOiB3ZSBhcmUgcGVyZm9ybWluZyBtb3N0IG9mIHRoZSB3b3JrIGluIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpdHNlbGYKICAgIC8vIHRvIG9wdGltaXplIGxpc3RlbmVyIHJlZ2lzdHJhdGlvbi4KICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lckluX21hcmtEaXJ0eUFuZFByZXZlbnREZWZhdWx0KGUpIHsKICAgICAgICAvLyBJdnkgdXNlcyBgRnVuY3Rpb25gIGFzIGEgc3BlY2lhbCB0b2tlbiB0aGF0IGFsbG93cyB1cyB0byB1bndyYXAgdGhlIGZ1bmN0aW9uCiAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgaW52b2tlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5IGBEZWJ1Z05vZGUudHJpZ2dlckV2ZW50SGFuZGxlcmAuCiAgICAgICAgaWYgKGUgPT09IEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckZuOwogICAgICAgIH0KICAgICAgICAvLyBJbiBvcmRlciB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFZpZXcgRW5naW5lLCBldmVudHMgb24gY29tcG9uZW50IGhvc3Qgbm9kZXMKICAgICAgICAvLyBtdXN0IGFsc28gbWFyayB0aGUgY29tcG9uZW50IHZpZXcgaXRzZWxmIGRpcnR5IChpLmUuIHRoZSB2aWV3IHRoYXQgaXQgb3ducykuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0VmlldyA9IHROb2RlLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8gPwogICAgICAgICAgICBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KSA6CiAgICAgICAgICAgIGxWaWV3OwogICAgICAgIC8vIFNlZSBpbnRlcmZhY2VzL3ZpZXcudHMgZm9yIG1vcmUgb24gTFZpZXdGbGFncy5NYW51YWxPblB1c2gKICAgICAgICBpZiAoKGxWaWV3W0ZMQUdTXSAmIDMyIC8qIE1hbnVhbE9uUHVzaCAqLykgPT09IDApIHsKICAgICAgICAgICAgbWFya1ZpZXdEaXJ0eShzdGFydFZpZXcpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc3VsdCA9IGV4ZWN1dGVMaXN0ZW5lcldpdGhFcnJvckhhbmRsaW5nKGxWaWV3LCBsaXN0ZW5lckZuLCBlKTsKICAgICAgICAvLyBBIGp1c3QtaW52b2tlZCBsaXN0ZW5lciBmdW5jdGlvbiBtaWdodCBoYXZlIGNvYWxlc2NlZCBsaXN0ZW5lcnMgc28gd2UgbmVlZCB0byBjaGVjayBmb3IKICAgICAgICAvLyB0aGVpciBwcmVzZW5jZSBhbmQgaW52b2tlIGFzIG5lZWRlZC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5leHRMaXN0ZW5lckZuID0gKCgvKiogQHR5cGUgez99ICovICh3cmFwTGlzdGVuZXJJbl9tYXJrRGlydHlBbmRQcmV2ZW50RGVmYXVsdCkpKS5fX25nTmV4dExpc3RlbmVyRm5fXzsKICAgICAgICB3aGlsZSAobmV4dExpc3RlbmVyRm4pIHsKICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZXZlbnQgZGVmYXVsdCBpZiBhbnkgb2YgdGhlIGxpc3RlbmVycyBleHBsaWNpdGx5IHJldHVybiBmYWxzZQogICAgICAgICAgICByZXN1bHQgPSBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbmV4dExpc3RlbmVyRm4sIGUpICYmIHJlc3VsdDsKICAgICAgICAgICAgbmV4dExpc3RlbmVyRm4gPSAoKC8qKiBAdHlwZSB7P30gKi8gKG5leHRMaXN0ZW5lckZuKSkpLl9fbmdOZXh0TGlzdGVuZXJGbl9fOwogICAgICAgIH0KICAgICAgICBpZiAod3JhcFdpdGhQcmV2ZW50RGVmYXVsdCAmJiByZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgLy8gTmVjZXNzYXJ5IGZvciBsZWdhY3kgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByZXZlbnREZWZhdWx0IChlLmcuIElFKQogICAgICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvbmFtZXNwYWNlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9uZXh0X2NvbnRleHQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJldHJpZXZlcyBhIGNvbnRleHQgYXQgdGhlIGxldmVsIHNwZWNpZmllZCBhbmQgc2F2ZXMgaXQgYXMgdGhlIGdsb2JhbCwgY29udGV4dFZpZXdEYXRhLgogKiBXaWxsIGdldCB0aGUgbmV4dCBsZXZlbCB1cCBpZiBsZXZlbCBpcyBub3Qgc3BlY2lmaWVkLgogKgogKiBUaGlzIGlzIHVzZWQgdG8gc2F2ZSBjb250ZXh0cyBvZiBwYXJlbnQgdmlld3Mgc28gdGhleSBjYW4gYmUgYm91bmQgaW4gZW1iZWRkZWQgdmlld3MsIG9yCiAqIGluIGNvbmp1bmN0aW9uIHdpdGggcmVmZXJlbmNlKCkgdG8gYmluZCBhIHJlZiBmcm9tIGEgcGFyZW50IHZpZXcuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez89fSBsZXZlbCBUaGUgcmVsYXRpdmUgbGV2ZWwgb2YgdGhlIHZpZXcgZnJvbSB3aGljaCB0byBncmFiIGNvbnRleHQgY29tcGFyZWQgdG8gY29udGV4dFZld0RhdGEKICogQHJldHVybiB7P30gY29udGV4dAogKgogKi8KZnVuY3Rpb24gybXJtW5leHRDb250ZXh0KGxldmVsID0gMSkgewogICAgcmV0dXJuIG5leHRDb250ZXh0SW1wbChsZXZlbCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3Byb2plY3Rpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENoZWNrcyBhIGdpdmVuIG5vZGUgYWdhaW5zdCBtYXRjaGluZyBwcm9qZWN0aW9uIHNsb3RzIGFuZCByZXR1cm5zIHRoZQogKiBkZXRlcm1pbmVkIHNsb3QgaW5kZXguIFJldHVybnMgIm51bGwiIGlmIG5vIHNsb3QgbWF0Y2hlZCB0aGUgZ2l2ZW4gbm9kZS4KICoKICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHBhcnNlZCBuZ1Byb2plY3RBcyBzZWxlY3RvciBmcm9tIHRoZQogKiBub2RlJ3MgYXR0cmlidXRlcy4gSWYgcHJlc2VudCwgaXQgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBuZ1Byb2plY3RBcyBzZWxlY3RvcgogKiBtYXRjaGVzIGFueSBvZiB0aGUgcHJvamVjdGlvbiBzbG90IHNlbGVjdG9ycy4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHByb2plY3Rpb25TbG90cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF0Y2hpbmdQcm9qZWN0aW9uU2xvdEluZGV4KHROb2RlLCBwcm9qZWN0aW9uU2xvdHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nUHJvamVjdEFzQXR0clZhbCA9IGdldFByb2plY3RBc0F0dHJWYWx1ZSh0Tm9kZSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2plY3Rpb25TbG90cy5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90VmFsdWUgPSBwcm9qZWN0aW9uU2xvdHNbaV07CiAgICAgICAgLy8gVGhlIGxhc3Qgd2lsZGNhcmQgcHJvamVjdGlvbiBzbG90IHNob3VsZCBtYXRjaCBhbGwgbm9kZXMgd2hpY2ggYXJlbid0IG1hdGNoaW5nCiAgICAgICAgLy8gYW55IHNlbGVjdG9yLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHZpZXcgZW5naW5lLgogICAgICAgIGlmIChzbG90VmFsdWUgPT09ICcqJykgewogICAgICAgICAgICB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gaTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8vIElmIHdlIHJhbiBpbnRvIGFuIGBuZ1Byb2plY3RBc2AgYXR0cmlidXRlLCB3ZSBzaG91bGQgbWF0Y2ggaXRzIHBhcnNlZCBzZWxlY3RvcgogICAgICAgIC8vIHRvIHRoZSBsaXN0IG9mIHNlbGVjdG9ycywgb3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byBtYXRjaGluZyBhZ2FpbnN0IHRoZSBub2RlLgogICAgICAgIGlmIChuZ1Byb2plY3RBc0F0dHJWYWwgPT09IG51bGwgPwogICAgICAgICAgICBpc05vZGVNYXRjaGluZ1NlbGVjdG9yTGlzdCh0Tm9kZSwgc2xvdFZhbHVlLCAvKiBpc1Byb2plY3Rpb25Nb2RlICovIHRydWUpIDoKICAgICAgICAgICAgaXNTZWxlY3RvckluU2VsZWN0b3JMaXN0KG5nUHJvamVjdEFzQXR0clZhbCwgc2xvdFZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gaTsgLy8gZmlyc3QgbWF0Y2hpbmcgc2VsZWN0b3IgImNhcHR1cmVzIiBhIGdpdmVuIG5vZGUKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gd2lsZGNhcmROZ0NvbnRlbnRJbmRleDsKfQovKioKICogSW5zdHJ1Y3Rpb24gdG8gZGlzdHJpYnV0ZSBwcm9qZWN0YWJsZSBub2RlcyBhbW9uZyA8bmctY29udGVudD4gb2NjdXJyZW5jZXMgaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICogSXQgdGFrZXMgYWxsIHRoZSBzZWxlY3RvcnMgZnJvbSB0aGUgZW50aXJlIGNvbXBvbmVudCdzIHRlbXBsYXRlIGFuZCBkZWNpZGVzIHdoZXJlCiAqIGVhY2ggcHJvamVjdGVkIG5vZGUgYmVsb25ncyAoaXQgcmUtZGlzdHJpYnV0ZXMgbm9kZXMgYW1vbmcgImJ1Y2tldHMiIHdoZXJlIGVhY2ggImJ1Y2tldCIgaXMKICogYmFja2VkIGJ5IGEgc2VsZWN0b3IpLgogKgogKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIENTUyBzZWxlY3RvcnMgdG8gYmUgcHJvdmlkZWQgaW4gMiBmb3JtczogcGFyc2VkIChieSBhIGNvbXBpbGVyKSBhbmQgdGV4dCwKICogdW4tcGFyc2VkIGZvcm0uCiAqCiAqIFRoZSBwYXJzZWQgZm9ybSBpcyBuZWVkZWQgZm9yIGVmZmljaWVudCBtYXRjaGluZyBvZiBhIG5vZGUgYWdhaW5zdCBhIGdpdmVuIENTUyBzZWxlY3Rvci4KICogVGhlIHVuLXBhcnNlZCwgdGV4dHVhbCBmb3JtIGlzIG5lZWRlZCBmb3Igc3VwcG9ydCBvZiB0aGUgbmdQcm9qZWN0QXMgYXR0cmlidXRlLgogKgogKiBIYXZpbmcgYSBDU1Mgc2VsZWN0b3IgaW4gMiBkaWZmZXJlbnQgZm9ybWF0cyBpcyBub3QgaWRlYWwsIGJ1dCBhbHRlcm5hdGl2ZXMgaGF2ZSBldmVuIG1vcmUKICogZHJhd2JhY2tzOgogKiAtIGhhdmluZyBvbmx5IGEgdGV4dHVhbCBmb3JtIHdvdWxkIHJlcXVpcmUgcnVudGltZSBwYXJzaW5nIG9mIENTUyBzZWxlY3RvcnM7CiAqIC0gd2UgY2FuJ3QgaGF2ZSBvbmx5IGEgcGFyc2VkIGFzIHdlIGNhbid0IHJlLWNvbnN0cnVjdCB0ZXh0dWFsIGZvcm0gZnJvbSBpdCAoYXMgZW50ZXJlZCBieSBhCiAqIHRlbXBsYXRlIGF1dGhvcikuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez89fSBwcm9qZWN0aW9uU2xvdHMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVwcm9qZWN0aW9uRGVmKHByb2plY3Rpb25TbG90cykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChnZXRMVmlldygpW0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXVtUX0hPU1RdKSk7CiAgICBpZiAoIWNvbXBvbmVudE5vZGUucHJvamVjdGlvbikgewogICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IHByb2plY3Rpb24gc2xvdHMgYXJlIGRlZmluZWQsIGZhbGwgYmFjayB0byBhIHNpbmdsZQogICAgICAgIC8vIHByb2plY3Rpb24gc2xvdCB3aXRoIHRoZSB3aWxkY2FyZCBzZWxlY3Rvci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbnVtUHJvamVjdGlvblNsb3RzID0gcHJvamVjdGlvblNsb3RzID8gcHJvamVjdGlvblNsb3RzLmxlbmd0aCA6IDE7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb2plY3Rpb25IZWFkcyA9IGNvbXBvbmVudE5vZGUucHJvamVjdGlvbiA9CiAgICAgICAgICAgIG5ld0FycmF5KG51bVByb2plY3Rpb25TbG90cywgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhaWxzID0gcHJvamVjdGlvbkhlYWRzLnNsaWNlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb21wb25lbnRDaGlsZCA9IGNvbXBvbmVudE5vZGUuY2hpbGQ7CiAgICAgICAgd2hpbGUgKGNvbXBvbmVudENoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2xvdEluZGV4ID0gcHJvamVjdGlvblNsb3RzID8gbWF0Y2hpbmdQcm9qZWN0aW9uU2xvdEluZGV4KGNvbXBvbmVudENoaWxkLCBwcm9qZWN0aW9uU2xvdHMpIDogMDsKICAgICAgICAgICAgaWYgKHNsb3RJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHRhaWxzW3Nsb3RJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGFpbHNbc2xvdEluZGV4XSkpLnByb2plY3Rpb25OZXh0ID0gY29tcG9uZW50Q2hpbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSGVhZHNbc2xvdEluZGV4XSA9IGNvbXBvbmVudENoaWxkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGFpbHNbc2xvdEluZGV4XSA9IGNvbXBvbmVudENoaWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbXBvbmVudENoaWxkID0gY29tcG9uZW50Q2hpbGQubmV4dDsKICAgICAgICB9CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgZGVsYXlQcm9qZWN0aW9uID0gZmFsc2U7Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXREZWxheVByb2plY3Rpb24odmFsdWUpIHsKICAgIGRlbGF5UHJvamVjdGlvbiA9IHZhbHVlOwp9Ci8qKgogKiBJbnNlcnRzIHByZXZpb3VzbHkgcmUtZGlzdHJpYnV0ZWQgcHJvamVjdGVkIG5vZGVzLiBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBjYWxsCiAqIHRvIHRoZSBwcm9qZWN0aW9uRGVmIGluc3RydWN0aW9uLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHBhcmFtIHs/PX0gc2VsZWN0b3JJbmRleAogKiBAcGFyYW0gez89fSBhdHRycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXByb2plY3Rpb24obm9kZUluZGV4LCBzZWxlY3RvckluZGV4ID0gMCwgYXR0cnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRQcm9qZWN0aW9uTm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIGxWaWV3W1RfSE9TVF0sIG5vZGVJbmRleCwgMSAvKiBQcm9qZWN0aW9uICovLCBudWxsLCBhdHRycyB8fCBudWxsKTsKICAgIC8vIFdlIGNhbid0IHVzZSB2aWV3RGF0YVtIT1NUX05PREVdIGJlY2F1c2UgcHJvamVjdGlvbiBub2RlcyBjYW4gYmUgbmVzdGVkIGluIGVtYmVkZGVkIHZpZXdzLgogICAgaWYgKHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uID09PSBudWxsKQogICAgICAgIHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uID0gc2VsZWN0b3JJbmRleDsKICAgIC8vIGA8bmctY29udGVudD5gIGhhcyBubyBjb250ZW50CiAgICBzZXRJc05vdFBhcmVudCgpOwogICAgLy8gV2UgbWlnaHQgbmVlZCB0byBkZWxheSB0aGUgcHJvamVjdGlvbiBvZiBub2RlcyBpZiB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGkxOG4gYmxvY2sKICAgIGlmICghZGVsYXlQcm9qZWN0aW9uKSB7CiAgICAgICAgLy8gcmUtZGlzdHJpYnV0aW9uIG9mIHByb2plY3RhYmxlIG5vZGVzIGlzIHN0b3JlZCBvbiBhIGNvbXBvbmVudCdzIHZpZXcgbGV2ZWwKICAgICAgICBhcHBseVByb2plY3Rpb24odFZpZXcsIGxWaWV3LCB0UHJvamVjdGlvbk5vZGUpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9wcm9wZXJ0eV9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBhIGxvbmUgYm91bmQgdmFsdWUKICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQsIGFuIG5vIGFkZGl0aW9uYWwgdGV4dAogKiBzdXJyb3VuZHMgdGhhdCBpbnRlcnBvbGF0ZWQgdmFsdWU6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0ie3t2MH19Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCd0aXRsZScsIHYwKTsKICogYGBgCiAqCiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZShwcm9wTmFtZSwgdjAsIHNhbml0aXplcikgewogICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxKHByb3BOYW1lLCAnJywgdjAsICcnLCBzYW5pdGl6ZXIpOwogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICoKICogYGBgdHMKICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxKCd0aXRsZScsICdwcmVmaXgnLCB2MCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYFxASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMShwcm9wTmFtZSwgcHJlZml4LCB2MCwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMSwgcHJlZml4LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggMiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTIoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24yKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMiwgcHJlZml4LCBpMCwgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTI7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMygKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUzKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjMobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDMsIHByZWZpeCwgaTAsIGkxLCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMzsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA0IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNCgKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgsIHNhbml0aXplcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBsVmlld1tSRU5ERVJFUl0sIHNhbml0aXplciwgZmFsc2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA0LCBwcmVmaXgsIGkwLCBpMSwgaTIsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNSgKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gNSwgcHJlZml4LCBpMCwgaTEsIGkyLCBpMywgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTU7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNigKICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU2KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDYsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNjsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNygKICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgsIHNhbml0aXplcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBsVmlld1tSRU5ERVJFUl0sIHNhbml0aXplciwgZmFsc2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA3LCBwcmVmaXgsIGkwLCBpMSwgaTIsIGkzLCBpNCwgaTUsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOCgKICogICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYFxASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk2IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjcgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOChwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgsIHNhbml0aXplcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDgsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgaTYsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4Owp9Ci8qKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAqCiAqIGBgYGh0bWwKICogPGRpdgogKiAgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYoCiAqICAndGl0bGUnLCBbJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnLScsIHY5LAogKiAgJ3N1ZmZpeCddKTsKICogYGBgCiAqCiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZS4KICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbmJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aCBhCiAqIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYocHJvcE5hbWUsIHZhbHVlcywgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb25JbkJldHdlZW4gPSBbdmFsdWVzWzBdXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIGludGVycG9sYXRpb25JbkJldHdlZW4ucHVzaCh2YWx1ZXNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIGludGVycG9sYXRpb25JbkJldHdlZW4ubGVuZ3RoICsgMSwgLi4uaW50ZXJwb2xhdGlvbkluQmV0d2Vlbik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlVjsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogVGhpcyBmaWxlIGNvbnRhaW5zIHJldXNlYWJsZSAiZW1wdHkiIHN5bWJvbHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0IHJldHVybiB2YWx1ZXMKICogaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSByZW5kZXJpbmcgY29kZS4gQmVjYXVzZSB0aGUgc2FtZSBzeW1ib2xzIGFyZSByZXR1cm5lZCwgdGhpcwogKiBhbGxvd3MgZm9yIGlkZW50aXR5IGNoZWNrcyBhZ2FpbnN0IHRoZXNlIHZhbHVlcyB0byBiZSBjb25zaXN0ZW50bHkgdXNlZCBieSB0aGUgZnJhbWV3b3JrCiAqIGNvZGUuCiAqLwpjb25zdCBFTVBUWV9PQkokMSA9IHt9Owpjb25zdCBFTVBUWV9BUlJBWSQzID0gW107Ci8vIGZyZWV6aW5nIHRoZSB2YWx1ZXMgcHJldmVudHMgYW55IGNvZGUgZnJvbSBhY2NpZGVudGFsbHkgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMgaW4KaWYgKCh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSkgewogICAgLy8gVGhlc2UgcHJvcGVydHkgYWNjZXNzZXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSBuZ0Rldk1vZGUgd2lsbCBiZSBzZXQgdG8gZmFsc2UKICAgIC8vIHdoZW4gb3B0aW1pemluZyBjb2RlIGFuZCB0aGUgd2hvbGUgaWYgc3RhdGVtZW50IHdpbGwgYmUgZHJvcHBlZC4KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIE9iamVjdC5mcmVlemUoRU1QVFlfT0JKJDEpOwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRvcGxldmVsLXByb3BlcnR5LWFjY2VzcwogICAgT2JqZWN0LmZyZWV6ZShFTVBUWV9BUlJBWSQzKTsKfQovKioKICogSW5zZXJ0IG5ldyBgdFN0eWxlVmFsdWVgIGF0IGBURGF0YWAgYW5kIGxpbmsgZXhpc3Rpbmcgc3R5bGUgYmluZGluZ3Mgc3VjaCB0aGF0IHdlIG1haW50YWluIGxpbmtlZAogKiBsaXN0IG9mIHN0eWxlcyBhbmQgY29tcHV0ZSB0aGUgZHVwbGljYXRlIGZsYWcuCiAqCiAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZHVyaW5nIGBmaXJzdFVwZGF0ZVBhc3NgIG9ubHkgdG8gcG9wdWxhdGUgdGhlIGBUVmlldy5kYXRhYC4KICoKICogVGhlIGZ1bmN0aW9uIHdvcmtzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgYHRTdHlsaW5nUmFuZ2VgIHdoaWNoIGNvbnRhaW5zIHR3byBwb2ludGVycyBwb2ludGluZyB0bwogKiB0aGUgaGVhZC90YWlsIG9mIHRoZSB0ZW1wbGF0ZSBwb3J0aW9uIG9mIHRoZSBzdHlsZXMuCiAqICAtIGlmIGBpc0hvc3QgPT09IGZhbHNlYCAod2UgYXJlIHRlbXBsYXRlKSB0aGVuIGluc2VydGlvbiBpcyBhdCB0YWlsIG9mIGBUU3R5bGluZ1JhbmdlYAogKiAgLSBpZiBgaXNIb3N0ID09PSB0cnVlYCAod2UgYXJlIGhvc3QgYmluZGluZykgdGhlbiBpbnNlcnRpb24gaXMgYXQgaGVhZCBvZiBgVFN0eWxpbmdSYW5nZWAKICoKICogQHBhcmFtIHs/fSB0RGF0YSBUaGUgYFREYXRhYCB0byBpbnNlcnQgaW50by4KICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3R5bGluZyBlbGVtZW50LgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5V2l0aFN0YXRpYwogKiBAcGFyYW0gez99IGluZGV4IGxvY2F0aW9uIG9mIHdoZXJlIGB0U3R5bGVWYWx1ZWAgc2hvdWxkIGJlIHN0b3JlZCAoYW5kIGxpbmtlZCBpbnRvIGxpc3QuKQogKiBAcGFyYW0gez99IGlzSG9zdEJpbmRpbmcgYHRydWVgIGlmIHRoZSBpbnNlcnRpb24gaXMgZm9yIGEgYGhvc3RCaW5kaW5nYC4gKGluc2VydGlvbiBpcyBpbiBmcm9udCBvZgogKiAgICAgICAgICAgICAgIHRlbXBsYXRlLikKICogQHBhcmFtIHs/fSBpc0NsYXNzQmluZGluZyBUcnVlIGlmIHRoZSBhc3NvY2lhdGVkIGB0U3R5bGluZ0tleWAgYXMgYSBgY2xhc3NgIHN0eWxpbmcuCiAqICAgICAgICAgICAgICAgICAgICAgICBgdE5vZGUuY2xhc3NCaW5kaW5nc2Agc2hvdWxkIGJlIHVzZWQgKG9yIGB0Tm9kZS5zdHlsZUJpbmRpbmdzYCBvdGhlcndpc2UuKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zZXJ0VFN0eWxpbmdCaW5kaW5nKHREYXRhLCB0Tm9kZSwgdFN0eWxpbmdLZXlXaXRoU3RhdGljLCBpbmRleCwgaXNIb3N0QmluZGluZywgaXNDbGFzc0JpbmRpbmcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdFVwZGF0ZVBhc3MoZ2V0VFZpZXcoKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdEJpbmRpbmdzID0gaXNDbGFzc0JpbmRpbmcgPyB0Tm9kZS5jbGFzc0JpbmRpbmdzIDogdE5vZGUuc3R5bGVCaW5kaW5nczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0bXBsSGVhZCA9IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRCaW5kaW5ncyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdG1wbFRhaWwgPSBnZXRUU3R5bGluZ1JhbmdlTmV4dCh0QmluZGluZ3MpOwogICAgdERhdGFbaW5kZXhdID0gdFN0eWxpbmdLZXlXaXRoU3RhdGljOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMgPSBmYWxzZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0U3R5bGluZ0tleTsKICAgIGlmIChBcnJheS5pc0FycmF5KHRTdHlsaW5nS2V5V2l0aFN0YXRpYykpIHsKICAgICAgICAvLyBXZSBhcmUgY2FzZSB3aGVuIHRoZSBgVFN0eWxpbmdLZXlgIGNvbnRhaW5zIHN0YXRpYyBmaWVsZHMgYXMgd2VsbC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhdGljS2V5VmFsdWVBcnJheSA9ICgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ0tleVdpdGhTdGF0aWMpKTsKICAgICAgICB0U3R5bGluZ0tleSA9IHN0YXRpY0tleVZhbHVlQXJyYXlbMV07IC8vIHVud3JhcC4KICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIG91ciBrZXkgaXMgcHJlc2VudCBpbiB0aGUgc3RhdGljIHNvIHRoYXQgd2UgY2FuIG1hcmsgaXQgYXMgZHVwbGljYXRlLgogICAgICAgIGlmICh0U3R5bGluZ0tleSA9PT0gbnVsbCB8fAogICAgICAgICAgICBrZXlWYWx1ZUFycmF5SW5kZXhPZihzdGF0aWNLZXlWYWx1ZUFycmF5LCAoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdLZXkpKSkgPiAwKSB7CiAgICAgICAgICAgIC8vIHRTdHlsaW5nS2V5IGlzIHByZXNlbnQgaW4gdGhlIHN0YXRpY3MsIG5lZWQgdG8gbWFyayBpdCBhcyBkdXBsaWNhdGUuCiAgICAgICAgICAgIGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHRTdHlsaW5nS2V5ID0gdFN0eWxpbmdLZXlXaXRoU3RhdGljOwogICAgfQogICAgaWYgKGlzSG9zdEJpbmRpbmcpIHsKICAgICAgICAvLyBXZSBhcmUgaW5zZXJ0aW5nIGhvc3QgYmluZGluZ3MKICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRlbXBsYXRlIGJpbmRpbmdzIHRoZW4gYHRhaWxgIGlzIDAuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhc1RlbXBsYXRlQmluZGluZ3MgPSB0bXBsVGFpbCAhPT0gMDsKICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCB0byBrbm93IGJlY2F1c2UgdGhhdCBtZWFucyB0aGF0IHRoZSBgaGVhZGAgY2FuJ3QgcG9pbnQgdG8gdGhlIGZpcnN0CiAgICAgICAgLy8gdGVtcGxhdGUgYmluZGluZ3MgKHRoZXJlIGFyZSBub25lLikgSW5zdGVhZCB0aGUgaGVhZCBwb2ludHMgdG8gdGhlIHRhaWwgb2YgdGhlIHRlbXBsYXRlLgogICAgICAgIGlmIChoYXNUZW1wbGF0ZUJpbmRpbmdzKSB7CiAgICAgICAgICAgIC8vIHRlbXBsYXRlIGhlYWQncyAicHJldiIgd2lsbCBwb2ludCB0byBsYXN0IGhvc3QgYmluZGluZyBvciB0byAwIGlmIG5vIGhvc3QgYmluZGluZ3MgeWV0CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlID0gZ2V0VFN0eWxpbmdSYW5nZVByZXYoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxIZWFkICsgMV0pKSk7CiAgICAgICAgICAgIHREYXRhW2luZGV4ICsgMV0gPSB0b1RTdHlsaW5nUmFuZ2UocHJldmlvdXNOb2RlLCB0bXBsSGVhZCk7CiAgICAgICAgICAgIC8vIGlmIGEgaG9zdCBiaW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5leHQgb2YgdGhhdCBob3N0CiAgICAgICAgICAgIC8vIGJpbmRpbmcgdG8gcG9pbnQgdG8gdGhpcyBvbmUKICAgICAgICAgICAgaWYgKHByZXZpb3VzTm9kZSAhPT0gMCkgewogICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHRlbXBsYXRlLXRhaWwgdmFsdWUgdG8gcG9pbnQgdG8gdXMuCiAgICAgICAgICAgICAgICB0RGF0YVtwcmV2aW91c05vZGUgKyAxXSA9CiAgICAgICAgICAgICAgICAgICAgc2V0VFN0eWxpbmdSYW5nZU5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3ByZXZpb3VzTm9kZSArIDFdKSksIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgInByZXZpb3VzIiBvZiB0aGUgdGVtcGxhdGUgYmluZGluZyBoZWFkIHNob3VsZCBwb2ludCB0byB0aGlzIGhvc3QgYmluZGluZwogICAgICAgICAgICB0RGF0YVt0bXBsSGVhZCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZVByZXYoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxIZWFkICsgMV0pKSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHRvVFN0eWxpbmdSYW5nZSh0bXBsSGVhZCwgMCk7CiAgICAgICAgICAgIC8vIGlmIGEgaG9zdCBiaW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5leHQgb2YgdGhhdCBob3N0CiAgICAgICAgICAgIC8vIGJpbmRpbmcgdG8gcG9pbnQgdG8gdGhpcyBvbmUKICAgICAgICAgICAgaWYgKHRtcGxIZWFkICE9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUtdGFpbCB2YWx1ZSB0byBwb2ludCB0byB1cy4KICAgICAgICAgICAgICAgIHREYXRhW3RtcGxIZWFkICsgMV0gPSBzZXRUU3R5bGluZ1JhbmdlTmV4dCgoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbdG1wbEhlYWQgKyAxXSkpLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSB0ZW1wbGF0ZSwgdGhlIGhlYWQgcG9pbnRzIHRvIHRlbXBsYXRlLXRhaWwsIGFuZCBuZWVkcyB0byBiZSBhZHZhbmNlZC4KICAgICAgICAgICAgdG1wbEhlYWQgPSBpbmRleDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXZSBhcmUgaW5zZXJ0aW5nIGluIHRlbXBsYXRlIHNlY3Rpb24uCiAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhpcyBiaW5kaW5nJ3MgInByZXZpb3VzIiB0byB0aGUgY3VycmVudCB0ZW1wbGF0ZSB0YWlsCiAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHRvVFN0eWxpbmdSYW5nZSh0bXBsVGFpbCwgMCk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKHRtcGxIZWFkICE9PSAwICYmIHRtcGxUYWlsID09PSAwLCBmYWxzZSwgJ0FkZGluZyB0ZW1wbGF0ZSBiaW5kaW5ncyBhZnRlciBob3N0QmluZGluZ3MgaXMgbm90IGFsbG93ZWQuJyk7CiAgICAgICAgaWYgKHRtcGxIZWFkID09PSAwKSB7CiAgICAgICAgICAgIHRtcGxIZWFkID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcHJldmlvdXMgdmFsdWUgIm5leHQiIHRvIHBvaW50IHRvIHRoaXMgYmluZGluZwogICAgICAgICAgICB0RGF0YVt0bXBsVGFpbCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZU5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxUYWlsICsgMV0pKSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICB0bXBsVGFpbCA9IGluZGV4OwogICAgfQogICAgLy8gTm93IHdlIG5lZWQgdG8gdXBkYXRlIC8gY29tcHV0ZSB0aGUgZHVwbGljYXRlcy4KICAgIC8vIFN0YXJ0aW5nIHdpdGggb3VyIGxvY2F0aW9uIHNlYXJjaCB0b3dhcmRzIGhlYWQgKGxlYXN0IHByaW9yaXR5KQogICAgaWYgKGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMpIHsKICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKSk7CiAgICB9CiAgICBtYXJrRHVwbGljYXRlcyh0RGF0YSwgdFN0eWxpbmdLZXksIGluZGV4LCB0cnVlKTsKICAgIG1hcmtEdXBsaWNhdGVzKHREYXRhLCB0U3R5bGluZ0tleSwgaW5kZXgsIGZhbHNlKTsKICAgIG1hcmtEdXBsaWNhdGVPZlJlc2lkdWFsU3R5bGluZyh0Tm9kZSwgdFN0eWxpbmdLZXksIHREYXRhLCBpbmRleCwgaXNDbGFzc0JpbmRpbmcpOwogICAgdEJpbmRpbmdzID0gdG9UU3R5bGluZ1JhbmdlKHRtcGxIZWFkLCB0bXBsVGFpbCk7CiAgICBpZiAoaXNDbGFzc0JpbmRpbmcpIHsKICAgICAgICB0Tm9kZS5jbGFzc0JpbmRpbmdzID0gdEJpbmRpbmdzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdE5vZGUuc3R5bGVCaW5kaW5ncyA9IHRCaW5kaW5nczsKICAgIH0KfQovKioKICogTG9vayBpbnRvIHRoZSByZXNpZHVhbCBzdHlsaW5nIHRvIHNlZSBpZiB0aGUgY3VycmVudCBgdFN0eWxpbmdLZXlgIGlzIGR1cGxpY2F0ZSBvZiByZXNpZHVhbC4KICoKICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIHdoZXJlIHRoZSByZXNpZHVhbCBpcyBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdFN0eWxpbmdLZXkgYFRTdHlsaW5nS2V5YCB0byBzdG9yZS4KICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBgTFZpZXdgLgogKiBAcGFyYW0gez99IGluZGV4IGxvY2F0aW9uIG9mIHdoZXJlIGB0U3R5bGVWYWx1ZWAgc2hvdWxkIGJlIHN0b3JlZCAoYW5kIGxpbmtlZCBpbnRvIGxpc3QuKQogKiBAcGFyYW0gez99IGlzQ2xhc3NCaW5kaW5nIFRydWUgaWYgdGhlIGFzc29jaWF0ZWQgYHRTdHlsaW5nS2V5YCBhcyBhIGBjbGFzc2Agc3R5bGluZy4KICogICAgICAgICAgICAgICAgICAgICAgIGB0Tm9kZS5jbGFzc0JpbmRpbmdzYCBzaG91bGQgYmUgdXNlZCAob3IgYHROb2RlLnN0eWxlQmluZGluZ3NgIG90aGVyd2lzZS4pCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXJrRHVwbGljYXRlT2ZSZXNpZHVhbFN0eWxpbmcodE5vZGUsIHRTdHlsaW5nS2V5LCB0RGF0YSwgaW5kZXgsIGlzQ2xhc3NCaW5kaW5nKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXNpZHVhbCA9IGlzQ2xhc3NCaW5kaW5nID8gdE5vZGUucmVzaWR1YWxDbGFzc2VzIDogdE5vZGUucmVzaWR1YWxTdHlsZXM7CiAgICBpZiAocmVzaWR1YWwgIT0gbnVsbCAvKiBvciB1bmRlZmluZWQgKi8gJiYgdHlwZW9mIHRTdHlsaW5nS2V5ID09ICdzdHJpbmcnICYmCiAgICAgICAga2V5VmFsdWVBcnJheUluZGV4T2YocmVzaWR1YWwsIHRTdHlsaW5nS2V5KSA+PSAwKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBkdXBsaWNhdGUgaW4gdGhlIHJlc2lkdWFsIHNvIG1hcmsgb3Vyc2VsdmVzIGFzIGR1cGxpY2F0ZS4KICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZU5leHREdXBsaWNhdGUoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKSk7CiAgICB9Cn0KLyoqCiAqIE1hcmtzIGBUU3R5bGVWYWx1ZWBzIGFzIGR1cGxpY2F0ZXMgaWYgYW5vdGhlciBzdHlsZSBiaW5kaW5nIGluIHRoZSBsaXN0IGhhcyB0aGUgc2FtZQogKiBgVFN0eWxlVmFsdWVgLgogKgogKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCB0d2ljZSBvbmNlIHdpdGggYGlzUHJldkRpcmAgc2V0IHRvIGB0cnVlYCBhbmQgb25jZQogKiB3aXRoIGl0IHNldCB0byBgZmFsc2VgIHRvIHNlYXJjaCBib3RoIHRoZSBwcmV2aW91cyBhcyB3ZWxsIGFzIG5leHQgaXRlbXMgaW4gdGhlIGxpc3QuCiAqCiAqIE5vIGR1cGxpY2F0ZSBjYXNlCiAqIGBgYAogKiAgIFtzdHlsZS5jb2xvcl0KICogICBbc3R5bGUud2lkdGgucHhdIDw8LSBpbmRleAogKiAgIFtzdHlsZS5oZWlnaHQucHhdCiAqIGBgYAogKgogKiBJbiB0aGUgYWJvdmUgY2FzZSBhZGRpbmcgYFtzdHlsZS53aWR0aC5weF1gIHRvIHRoZSBleGlzdGluZyBgW3N0eWxlLmNvbG9yXWAgcHJvZHVjZXMgbm8KICogZHVwbGljYXRlcyBiZWNhdXNlIGB3aWR0aGAgaXMgbm90IGZvdW5kIGluIGFueSBvdGhlciBwYXJ0IG9mIHRoZSBsaW5rZWQgbGlzdC4KICoKICogRHVwbGljYXRlIGNhc2UKICogYGBgCiAqICAgW3N0eWxlLmNvbG9yXQogKiAgIFtzdHlsZS53aWR0aC5lbV0KICogICBbc3R5bGUud2lkdGgucHhdIDw8LSBpbmRleAogKiBgYGAKICogSW4gdGhlIGFib3ZlIGNhc2UgYWRkaW5nIGBbc3R5bGUud2lkdGgucHhdYCB3aWxsIHByb2R1Y2UgYSBkdXBsaWNhdGUgd2l0aCBgW3N0eWxlLndpZHRoLmVtXWAKICogYmVjYXVzZSBgd2lkdGhgIGlzIGZvdW5kIGluIHRoZSBjaGFpbi4KICoKICogTWFwIGNhc2UgMQogKiBgYGAKICogICBbc3R5bGUud2lkdGgucHhdCiAqICAgW3N0eWxlLmNvbG9yXQogKiAgIFtzdHlsZV0gIDw8LSBpbmRleAogKiBgYGAKICogSW4gdGhlIGFib3ZlIGNhc2UgYWRkaW5nIGBbc3R5bGVdYCB3aWxsIHByb2R1Y2UgYSBkdXBsaWNhdGUgd2l0aCBhbnkgb3RoZXIgYmluZGluZ3MgYmVjYXVzZQogKiBgW3N0eWxlXWAgaXMgYSBNYXAgYW5kIGFzIHN1Y2ggaXMgZnVsbHkgZHluYW1pYyBhbmQgY291bGQgcHJvZHVjZSBgY29sb3JgIG9yIGB3aWR0aGAuCiAqCiAqIE1hcCBjYXNlIDIKICogYGBgCiAqICAgW3N0eWxlXQogKiAgIFtzdHlsZS53aWR0aC5weF0KICogICBbc3R5bGUuY29sb3JdICA8PC0gaW5kZXgKICogYGBgCiAqIEluIHRoZSBhYm92ZSBjYXNlIGFkZGluZyBgW3N0eWxlLmNvbG9yXWAgd2lsbCBwcm9kdWNlIGEgZHVwbGljYXRlIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCiAqIGBbc3R5bGVdYCBiaW5kaW5nIHdoaWNoIGlzIGEgTWFwIGFuZCBhcyBzdWNoIGlzIGZ1bGx5IGR5bmFtaWMgYW5kIGNvdWxkIHByb2R1Y2UgYGNvbG9yYCBvcgogKiBgd2lkdGhgLgogKgogKiBOT1RFOiBPbmNlIGBbc3R5bGVdYCAoTWFwKSBpcyBhZGRlZCBpbnRvIHRoZSBzeXN0ZW0gYWxsIHRoaW5ncyBhcmUgbWFwcGVkIGFzIGR1cGxpY2F0ZXMuCiAqIE5PVEU6IFdlIHVzZSBgc3R5bGVgIGFzIGV4YW1wbGUsIGJ1dCBzYW1lIGxvZ2ljIGlzIGFwcGxpZWQgdG8gYGNsYXNzYGVzIGFzIHdlbGwuCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgbGlua2VkIGxpc3QgaXMgc3RvcmVkLgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5IGBUU3R5bGluZ0tleVByaW1pdGl2ZWAgd2hpY2ggY29udGFpbnMgdGhlIHZhbHVlIHRvIGNvbXBhcmUgdG8gb3RoZXIga2V5cyBpbgogKiAgICAgICAgdGhlIGxpbmtlZCBsaXN0LgogKiBAcGFyYW0gez99IGluZGV4IFN0YXJ0aW5nIGxvY2F0aW9uIGluIHRoZSBsaW5rZWQgbGlzdCB0byBzZWFyY2ggZnJvbQogKiBAcGFyYW0gez99IGlzUHJldkRpciBEaXJlY3Rpb24uCiAqICAgICAgICAtIGB0cnVlYCBmb3IgcHJldmlvdXMgKGxvd2VyIHByaW9yaXR5KTsKICogICAgICAgIC0gYGZhbHNlYCBmb3IgbmV4dCAoaGlnaGVyIHByaW9yaXR5KS4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmluZGluZwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWFya0R1cGxpY2F0ZXModERhdGEsIHRTdHlsaW5nS2V5LCBpbmRleCwgaXNQcmV2RGlyLCBpc0NsYXNzQmluZGluZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFN0eWxpbmdBdEluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTWFwID0gdFN0eWxpbmdLZXkgPT09IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3Vyc29yID0gaXNQcmV2RGlyID8gZ2V0VFN0eWxpbmdSYW5nZVByZXYodFN0eWxpbmdBdEluZGV4KSA6IGdldFRTdHlsaW5nUmFuZ2VOZXh0KHRTdHlsaW5nQXRJbmRleCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZm91bmREdXBsaWNhdGUgPSBmYWxzZTsKICAgIC8vIFdlIGtlZXAgaXRlcmF0aW5nIGFzIGxvbmcgYXMgd2UgaGF2ZSBhIGN1cnNvcgogICAgLy8gQU5EIGVpdGhlcjoKICAgIC8vIC0gd2UgZm91bmQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IsIE9SCiAgICAvLyAtIHdlIGFyZSBhIG1hcCBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gY29udGludWUgc2VhcmNoaW5nIGV2ZW4gYWZ0ZXIgd2UgZmluZCB3aGF0IHdlIHdlcmUKICAgIC8vICAgbG9va2luZyBmb3Igc2luY2Ugd2UgYXJlIGEgd2lsZCBjYXJkIGFuZCBldmVyeXRoaW5nIG5lZWRzIHRvIGJlIGZsaXBwZWQgdG8gZHVwbGljYXRlLgogICAgd2hpbGUgKGN1cnNvciAhPT0gMCAmJiAoZm91bmREdXBsaWNhdGUgPT09IGZhbHNlIHx8IGlzTWFwKSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZSh0RGF0YSwgY3Vyc29yKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFN0eWxpbmdWYWx1ZUF0Q3Vyc29yID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2N1cnNvcl0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFN0eWxlUmFuZ2VBdEN1cnNvciA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3IgKyAxXSkpOwogICAgICAgIGlmIChpc1N0eWxpbmdNYXRjaCh0U3R5bGluZ1ZhbHVlQXRDdXJzb3IsIHRTdHlsaW5nS2V5KSkgewogICAgICAgICAgICBmb3VuZER1cGxpY2F0ZSA9IHRydWU7CiAgICAgICAgICAgIHREYXRhW2N1cnNvciArIDFdID0gaXNQcmV2RGlyID8gc2V0VFN0eWxpbmdSYW5nZU5leHREdXBsaWNhdGUodFN0eWxlUmFuZ2VBdEN1cnNvcikgOgogICAgICAgICAgICAgICAgc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUodFN0eWxlUmFuZ2VBdEN1cnNvcik7CiAgICAgICAgfQogICAgICAgIGN1cnNvciA9IGlzUHJldkRpciA/IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRTdHlsZVJhbmdlQXRDdXJzb3IpIDoKICAgICAgICAgICAgZ2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxlUmFuZ2VBdEN1cnNvcik7CiAgICB9CiAgICBpZiAoZm91bmREdXBsaWNhdGUpIHsKICAgICAgICAvLyBpZiB3ZSBmb3VuZCBhIGR1cGxpY2F0ZSwgdGhhbiBtYXJrIG91cnNlbHZlcy4KICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gaXNQcmV2RGlyID8gc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUodFN0eWxpbmdBdEluZGV4KSA6CiAgICAgICAgICAgIHNldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nQXRJbmRleCk7CiAgICB9Cn0KLyoqCiAqIERldGVybWluZXMgaWYgdHdvIGBUU3R5bGluZ0tleWBzIGFyZSBhIG1hdGNoLgogKgogKiBXaGVuIGNvbXB1dGluZyB3ZWF0aGVyIGEgYmluZGluZyBjb250YWlucyBhIGR1cGxpY2F0ZSwgd2UgbmVlZCB0byBjb21wYXJlIGlmIHRoZSBpbnN0cnVjdGlvbgogKiBgVFN0eWxpbmdLZXlgIGhhcyBhIG1hdGNoLgogKgogKiBIZXJlIGFyZSBleGFtcGxlcyBvZiBgVFN0eWxpbmdLZXlgcyB3aGljaCBtYXRjaCBnaXZlbiBgdFN0eWxpbmdLZXlDdXJzb3JgIGlzOgogKiAtIGBjb2xvcmAKICogICAgLSBgY29sb3JgICAgIC8vIE1hdGNoIGFub3RoZXIgY29sb3IKICogICAgLSBgbnVsbGAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCBgdFN0eWxpbmdLZXlgIGlzIGEgYGNsYXNzTWFwYC9gc3R5bGVNYXBgIGluc3RydWN0aW9uCiAqICAgIC0gYFsnJywgJ2NvbG9yJywgJ290aGVyJywgdHJ1ZV1gIC8vIHdyYXBwZWQgYGNvbG9yYCBzbyBtYXRjaAogKiAgICAtIGBbJycsIG51bGwsICdvdGhlcicsIHRydWVdYCAgICAgICAvLyB3cmFwcGVkIGBudWxsYCBzbyBtYXRjaAogKiAgICAtIGBbJycsICd3aWR0aCcsICdjb2xvcicsICd2YWx1ZSddYCAvLyB3cmFwcGVkIHN0YXRpYyB2YWx1ZSBjb250YWlucyBhIG1hdGNoIG9uIGAnY29sb3InYAogKiAtIGBudWxsYCAgICAgICAvLyBgdFN0eWxpbmdLZXlDdXJzb3JgIGFsd2F5cyBtYXRjaCBhcyBpdCBpcyBgY2xhc3NNYXBgL2BzdHlsZU1hcGAgaW5zdHJ1Y3Rpb24KICoKICogQHBhcmFtIHs/fSB0U3R5bGluZ0tleUN1cnNvcgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1N0eWxpbmdNYXRjaCh0U3R5bGluZ0tleUN1cnNvciwgdFN0eWxpbmdLZXkpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vdEVxdWFsKEFycmF5LmlzQXJyYXkodFN0eWxpbmdLZXkpLCB0cnVlLCAnRXhwZWN0ZWQgdGhhdCBcJ3RTdHlsaW5nS2V5XCcgaGFzIGJlZW4gdW53cmFwcGVkJyk7CiAgICBpZiAodFN0eWxpbmdLZXlDdXJzb3IgPT09IG51bGwgfHwgLy8gSWYgdGhlIGN1cnNvciBpcyBgbnVsbGAgaXQgbWVhbnMgdGhhdCB3ZSBoYXZlIG1hcCBhdCB0aGF0CiAgICAgICAgLy8gbG9jYXRpb24gc28gd2UgbXVzdCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgbWF0Y2guCiAgICAgICAgdFN0eWxpbmdLZXkgPT0gbnVsbCB8fCAvLyBJZiBgdFN0eWxpbmdLZXlgIGlzIGBudWxsYCB0aGVuIGl0IGlzIGEgbWFwIHRoZXJlZm9yIGFzc3VtZSB0aGF0IGl0CiAgICAgICAgLy8gY29udGFpbnMgYSBtYXRjaC4KICAgICAgICAoQXJyYXkuaXNBcnJheSh0U3R5bGluZ0tleUN1cnNvcikgPyB0U3R5bGluZ0tleUN1cnNvclsxXSA6IHRTdHlsaW5nS2V5Q3Vyc29yKSA9PT0KICAgICAgICAgICAgdFN0eWxpbmdLZXkgLy8gSWYgdGhlIGtleXMgbWF0Y2ggZXhwbGljaXRseSB0aGFuIHdlIGFyZSBhIG1hdGNoLgogICAgKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRTdHlsaW5nS2V5Q3Vyc29yKSAmJiB0eXBlb2YgdFN0eWxpbmdLZXkgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgLy8gaWYgd2UgZGlkIG5vdCBmaW5kIGEgbWF0Y2gsIGJ1dCBgdFN0eWxpbmdLZXlDdXJzb3JgIGlzIGBLZXlWYWx1ZUFycmF5YCB0aGF0IG1lYW5zIGN1cnNvciBoYXMKICAgICAgICAvLyBzdGF0aWNzIGFuZCB3ZSBuZWVkIHRvIGNoZWNrIHRob3NlIGFzIHdlbGwuCiAgICAgICAgcmV0dXJuIGtleVZhbHVlQXJyYXlJbmRleE9mKHRTdHlsaW5nS2V5Q3Vyc29yLCB0U3R5bGluZ0tleSkgPj0KICAgICAgICAgICAgMDsgLy8gc2VlIGlmIHdlIGFyZSBtYXRjaGluZyB0aGUga2V5CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLy8gR2xvYmFsIHN0YXRlIG9mIHRoZSBwYXJzZXIuIChUaGlzIG1ha2VzIHBhcnNlciBub24tcmVlbnRyYW50LCBidXQgdGhhdCBpcyBub3QgYW4gaXNzdWUpCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgcGFyc2VyU3RhdGUgPSB7CiAgICB0ZXh0RW5kOiAwLAogICAga2V5OiAwLAogICAga2V5RW5kOiAwLAogICAgdmFsdWU6IDAsCiAgICB2YWx1ZUVuZDogMCwKfTsKLyoqCiAqIFJldHJpZXZlcyB0aGUgbGFzdCBwYXJzZWQgYGtleWAgb2Ygc3R5bGUuCiAqIEBwYXJhbSB7P30gdGV4dCB0aGUgdGV4dCB0byBzdWJzdHJpbmcgdGhlIGtleSBmcm9tLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TGFzdFBhcnNlZEtleSh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFyc2VyU3RhdGUua2V5LCBwYXJzZXJTdGF0ZS5rZXlFbmQpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgdGhlIGxhc3QgcGFyc2VkIGB2YWx1ZWAgb2Ygc3R5bGUuCiAqIEBwYXJhbSB7P30gdGV4dCB0aGUgdGV4dCB0byBzdWJzdHJpbmcgdGhlIGtleSBmcm9tLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TGFzdFBhcnNlZFZhbHVlKHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhwYXJzZXJTdGF0ZS52YWx1ZSwgcGFyc2VyU3RhdGUudmFsdWVFbmQpOwp9Ci8qKgogKiBJbml0aWFsaXplcyBgY2xhc3NOYW1lYCBzdHJpbmcgZm9yIHBhcnNpbmcgYW5kIHBhcnNlcyB0aGUgZmlyc3QgdG9rZW4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGlzIGZvcm1hdDoKICogYGBgCiAqIGZvciAobGV0IGkgPSBwYXJzZUNsYXNzTmFtZSh0ZXh0KTsgaSA+PSAwOyBpID0gcGFyc2VDbGFzc05hbWVOZXh0KHRleHQsIGkpKSB7CiAqICAgY29uc3Qga2V5ID0gZ2V0TGFzdFBhcnNlZEtleSgpOwogKiAgIC4uLgogKiB9CiAqIGBgYAogKiBAcGFyYW0gez99IHRleHQgYGNsYXNzTmFtZWAgdG8gcGFyc2UKICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VDbGFzc05hbWVOZXh0YCBzaG91bGQgcmVzdW1lLgogKi8KZnVuY3Rpb24gcGFyc2VDbGFzc05hbWUodGV4dCkgewogICAgcmVzZXRQYXJzZXJTdGF0ZSh0ZXh0KTsKICAgIHJldHVybiBwYXJzZUNsYXNzTmFtZU5leHQodGV4dCwgY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgMCwgcGFyc2VyU3RhdGUudGV4dEVuZCkpOwp9Ci8qKgogKiBQYXJzZXMgbmV4dCBgY2xhc3NOYW1lYCB0b2tlbi4KICoKICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHRoaXMgZm9ybWF0OgogKiBgYGAKICogZm9yIChsZXQgaSA9IHBhcnNlQ2xhc3NOYW1lKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZUNsYXNzTmFtZU5leHQodGV4dCwgaSkpIHsKICogICBjb25zdCBrZXkgPSBnZXRMYXN0UGFyc2VkS2V5KCk7CiAqICAgLi4uCiAqIH0KICogYGBgCiAqCiAqIEBwYXJhbSB7P30gdGV4dCBgY2xhc3NOYW1lYCB0byBwYXJzZQogKiBAcGFyYW0gez99IGluZGV4IHdoZXJlIHRoZSBwYXJzaW5nIHNob3VsZCByZXN1bWUuCiAqIEByZXR1cm4gez99IGluZGV4IHdoZXJlIHRoZSBuZXh0IGludm9jYXRpb24gb2YgYHBhcnNlQ2xhc3NOYW1lTmV4dGAgc2hvdWxkIHJlc3VtZS4KICovCmZ1bmN0aW9uIHBhcnNlQ2xhc3NOYW1lTmV4dCh0ZXh0LCBpbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZW5kID0gcGFyc2VyU3RhdGUudGV4dEVuZDsKICAgIGlmIChlbmQgPT09IGluZGV4KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaW5kZXggPSBwYXJzZXJTdGF0ZS5rZXlFbmQgPSBjb25zdW1lQ2xhc3NUb2tlbih0ZXh0LCBwYXJzZXJTdGF0ZS5rZXkgPSBpbmRleCwgZW5kKTsKICAgIHJldHVybiBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBpbmRleCwgZW5kKTsKfQovKioKICogSW5pdGlhbGl6ZXMgYGNzc1RleHRgIHN0cmluZyBmb3IgcGFyc2luZyBhbmQgcGFyc2VzIHRoZSBmaXJzdCBrZXkvdmFsdWVzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gdGhpcyBmb3JtYXQ6CiAqIGBgYAogKiBmb3IgKGxldCBpID0gcGFyc2VTdHlsZSh0ZXh0KTsgaSA+PSAwOyBpID0gcGFyc2VTdHlsZU5leHQodGV4dCwgaSkpKSB7CiAqICAgY29uc3Qga2V5ID0gZ2V0TGFzdFBhcnNlZEtleSgpOwogKiAgIGNvbnN0IHZhbHVlID0gZ2V0TGFzdFBhcnNlZFZhbHVlKCk7CiAqICAgLi4uCiAqIH0KICogYGBgCiAqIEBwYXJhbSB7P30gdGV4dCBgY3NzVGV4dGAgdG8gcGFyc2UKICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VTdHlsZU5leHRgIHNob3VsZCByZXN1bWUuCiAqLwpmdW5jdGlvbiBwYXJzZVN0eWxlKHRleHQpIHsKICAgIHJlc2V0UGFyc2VyU3RhdGUodGV4dCk7CiAgICByZXR1cm4gcGFyc2VTdHlsZU5leHQodGV4dCwgY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgMCwgcGFyc2VyU3RhdGUudGV4dEVuZCkpOwp9Ci8qKgogKiBQYXJzZXMgdGhlIG5leHQgYGNzc1RleHRgIGtleS92YWx1ZXMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGlzIGZvcm1hdDoKICogYGBgCiAqIGZvciAobGV0IGkgPSBwYXJzZVN0eWxlKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZVN0eWxlTmV4dCh0ZXh0LCBpKSkpIHsKICogICBjb25zdCBrZXkgPSBnZXRMYXN0UGFyc2VkS2V5KCk7CiAqICAgY29uc3QgdmFsdWUgPSBnZXRMYXN0UGFyc2VkVmFsdWUoKTsKICogICAuLi4KICogfQogKgogKiBAcGFyYW0gez99IHRleHQgYGNzc1RleHRgIHRvIHBhcnNlCiAqIEBwYXJhbSB7P30gc3RhcnRJbmRleAogKiBAcmV0dXJuIHs/fSBpbmRleCB3aGVyZSB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIGBwYXJzZVN0eWxlTmV4dGAgc2hvdWxkIHJlc3VtZS4KICovCmZ1bmN0aW9uIHBhcnNlU3R5bGVOZXh0KHRleHQsIHN0YXJ0SW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVuZCA9IHBhcnNlclN0YXRlLnRleHRFbmQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5kZXggPSBwYXJzZXJTdGF0ZS5rZXkgPSBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBzdGFydEluZGV4LCBlbmQpOwogICAgaWYgKGVuZCA9PT0gaW5kZXgpIHsKICAgICAgICAvLyB3ZSByZWFjaGVkIGFuIGVuZCBzbyBqdXN0IHF1aXQKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpbmRleCA9IHBhcnNlclN0YXRlLmtleUVuZCA9IGNvbnN1bWVTdHlsZUtleSh0ZXh0LCBpbmRleCwgZW5kKTsKICAgIGluZGV4ID0gY29uc3VtZVNlcGFyYXRvcih0ZXh0LCBpbmRleCwgZW5kLCA1OCAvKiBDT0xPTiAqLyk7CiAgICBpbmRleCA9IHBhcnNlclN0YXRlLnZhbHVlID0gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgaW5kZXgsIGVuZCk7CiAgICBpbmRleCA9IHBhcnNlclN0YXRlLnZhbHVlRW5kID0gY29uc3VtZVN0eWxlVmFsdWUodGV4dCwgaW5kZXgsIGVuZCk7CiAgICByZXR1cm4gY29uc3VtZVNlcGFyYXRvcih0ZXh0LCBpbmRleCwgZW5kLCA1OSAvKiBTRU1JX0NPTE9OICovKTsKfQovKioKICogUmVzZXQgdGhlIGdsb2JhbCBzdGF0ZSBvZiB0aGUgc3R5bGluZyBwYXJzZXIuCiAqIEBwYXJhbSB7P30gdGV4dCBUaGUgc3R5bGluZyB0ZXh0IHRvIHBhcnNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVzZXRQYXJzZXJTdGF0ZSh0ZXh0KSB7CiAgICBwYXJzZXJTdGF0ZS5rZXkgPSAwOwogICAgcGFyc2VyU3RhdGUua2V5RW5kID0gMDsKICAgIHBhcnNlclN0YXRlLnZhbHVlID0gMDsKICAgIHBhcnNlclN0YXRlLnZhbHVlRW5kID0gMDsKICAgIHBhcnNlclN0YXRlLnRleHRFbmQgPSB0ZXh0Lmxlbmd0aDsKfQovKioKICogUmV0dXJucyBpbmRleCBvZiBuZXh0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci4KICoKICogQHBhcmFtIHs/fSB0ZXh0IFRleHQgdG8gc2NhbgogKiBAcGFyYW0gez99IHN0YXJ0SW5kZXggU3RhcnRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBzdGFydC4KICogQHBhcmFtIHs/fSBlbmRJbmRleCBFbmRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBlbmQuCiAqIEByZXR1cm4gez99IEluZGV4IG9mIG5leHQgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIChNYXkgYmUgdGhlIHNhbWUgYXMgYHN0YXJ0YCBpZiBubyB3aGl0ZXNwYWNlIGF0CiAqICAgICAgICAgIHRoYXQgbG9jYXRpb24uKQogKi8KZnVuY3Rpb24gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXggJiYgdGV4dC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXgpIDw9IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgc3RhcnRJbmRleCsrOwogICAgfQogICAgcmV0dXJuIHN0YXJ0SW5kZXg7Cn0KLyoqCiAqIFJldHVybnMgaW5kZXggb2YgbGFzdCBjaGFyIGluIGNsYXNzIHRva2VuLgogKgogKiBAcGFyYW0gez99IHRleHQgVGV4dCB0byBzY2FuCiAqIEBwYXJhbSB7P30gc3RhcnRJbmRleCBTdGFydGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIHN0YXJ0LgogKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICogQHJldHVybiB7P30gSW5kZXggYWZ0ZXIgbGFzdCBjaGFyIGluIGNsYXNzIHRva2VuLgogKi8KZnVuY3Rpb24gY29uc3VtZUNsYXNzVG9rZW4odGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXggJiYgdGV4dC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXgpID4gMzIgLyogU1BBQ0UgKi8pIHsKICAgICAgICBzdGFydEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gc3RhcnRJbmRleDsKfQovKioKICogQ29uc3VtZXMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byBzdHlsZSBrZXkgYW5kIHRva2VuLgogKgogKiBAcGFyYW0gez99IHRleHQgVGV4dCB0byBzY2FuCiAqIEBwYXJhbSB7P30gc3RhcnRJbmRleCBTdGFydGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIHN0YXJ0LgogKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICogQHJldHVybiB7P30gSW5kZXggYWZ0ZXIgbGFzdCBzdHlsZSBrZXkgY2hhcmFjdGVyLgogKi8KZnVuY3Rpb24gY29uc3VtZVN0eWxlS2V5KHRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2g7CiAgICB3aGlsZSAoc3RhcnRJbmRleCA8IGVuZEluZGV4ICYmCiAgICAgICAgKChjaCA9IHRleHQuY2hhckNvZGVBdChzdGFydEluZGV4KSkgPT09IDQ1IC8qIERBU0ggKi8gfHwgY2ggPT09IDk1IC8qIFVOREVSU0NPUkUgKi8gfHwKICAgICAgICAgICAgKChjaCAmIC0zMyAvKiBVUFBFUl9DQVNFICovKSA+PSA2NSAvKiBBICovICYmIChjaCAmIC0zMyAvKiBVUFBFUl9DQVNFICovKSA8PSA5MCAvKiBaICovKSkpIHsKICAgICAgICBzdGFydEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gc3RhcnRJbmRleDsKfQovKioKICogQ29uc3VtZXMgYWxsIHdoaXRlc3BhY2UgYW5kIHRoZSBzZXBhcmF0b3IgYDpgIGFmdGVyIHRoZSBzdHlsZSBrZXkuCiAqCiAqIEBwYXJhbSB7P30gdGV4dCBUZXh0IHRvIHNjYW4KICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAqIEBwYXJhbSB7P30gZW5kSW5kZXggRW5kaW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgZW5kLgogKiBAcGFyYW0gez99IHNlcGFyYXRvcgogKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBzZXBhcmF0b3IgYW5kIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UuCiAqLwpmdW5jdGlvbiBjb25zdW1lU2VwYXJhdG9yKHRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzZXBhcmF0b3IpIHsKICAgIHN0YXJ0SW5kZXggPSBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICBpZiAoc3RhcnRJbmRleCA8IGVuZEluZGV4KSB7CiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiB0ZXh0LmNoYXJDb2RlQXQoc3RhcnRJbmRleCkgIT09IHNlcGFyYXRvcikgewogICAgICAgICAgICBtYWxmb3JtZWRTdHlsZUVycm9yKHRleHQsIFN0cmluZy5mcm9tQ2hhckNvZGUoc2VwYXJhdG9yKSwgc3RhcnRJbmRleCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0SW5kZXgrKzsKICAgIH0KICAgIHJldHVybiBzdGFydEluZGV4Owp9Ci8qKgogKiBDb25zdW1lcyBzdHlsZSB2YWx1ZSBob25vcmluZyBgdXJsKClgIGFuZCBgIiJgIHRleHQuCiAqCiAqIEBwYXJhbSB7P30gdGV4dCBUZXh0IHRvIHNjYW4KICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAqIEBwYXJhbSB7P30gZW5kSW5kZXggRW5kaW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgZW5kLgogKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBsYXN0IHN0eWxlIHZhbHVlIGNoYXJhY3Rlci4KICovCmZ1bmN0aW9uIGNvbnN1bWVTdHlsZVZhbHVlKHRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2gxID0gLTE7CiAgICAvLyAxc3QgcHJldmlvdXMgY2hhcmFjdGVyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2gyID0gLTE7CiAgICAvLyAybmQgcHJldmlvdXMgY2hhcmFjdGVyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2gzID0gLTE7CiAgICAvLyAzcmQgcHJldmlvdXMgY2hhcmFjdGVyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaSA9IHN0YXJ0SW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbGFzdENoSW5kZXggPSBpOwogICAgd2hpbGUgKGkgPCBlbmRJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaCA9IHRleHQuY2hhckNvZGVBdChpKyspOwogICAgICAgIGlmIChjaCA9PT0gNTkgLyogU0VNSV9DT0xPTiAqLykgewogICAgICAgICAgICByZXR1cm4gbGFzdENoSW5kZXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNoID09PSAzNCAvKiBET1VCTEVfUVVPVEUgKi8gfHwgY2ggPT09IDM5IC8qIFNJTkdMRV9RVU9URSAqLykgewogICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGkgPSBjb25zdW1lUXVvdGVkVGV4dCh0ZXh0LCBjaCwgaSwgZW5kSW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdGFydEluZGV4ID09PQogICAgICAgICAgICBpIC0gNCAmJiAvLyBXZSBoYXZlIHNlZW4gb25seSA0IGNoYXJhY3RlcnMgc28gZmFyICJVUkwoIiAoSWdub3JlICJmb29fVVJMKCkiKQogICAgICAgICAgICBjaDMgPT09IDg1IC8qIFUgKi8gJiYKICAgICAgICAgICAgY2gyID09PSA4MiAvKiBSICovICYmIGNoMSA9PT0gNzYgLyogTCAqLyAmJiBjaCA9PT0gNDAgLyogT1BFTl9QQVJFTiAqLykgewogICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGkgPSBjb25zdW1lUXVvdGVkVGV4dCh0ZXh0LCA0MSAvKiBDTE9TRV9QQVJFTiAqLywgaSwgZW5kSW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaCA+IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgdGhlbiBjYXB0dXJlIGl0cyBsb2NhdGlvbgogICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGk7CiAgICAgICAgfQogICAgICAgIGNoMyA9IGNoMjsKICAgICAgICBjaDIgPSBjaDE7CiAgICAgICAgY2gxID0gY2ggJiAtMzMgLyogVVBQRVJfQ0FTRSAqLzsKICAgIH0KICAgIHJldHVybiBsYXN0Q2hJbmRleDsKfQovKioKICogQ29uc3VtZXMgYWxsIG9mIHRoZSBxdW90ZWQgY2hhcmFjdGVycy4KICoKICogQHBhcmFtIHs/fSB0ZXh0IFRleHQgdG8gc2NhbgogKiBAcGFyYW0gez99IHF1b3RlQ2hhckNvZGUgQ2hhckNvZGUgb2YgZWl0aGVyIGAiYCBvciBgJ2AgcXVvdGUgb3IgYClgIGZvciBgdXJsKC4uLilgLgogKiBAcGFyYW0gez99IHN0YXJ0SW5kZXggU3RhcnRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBzdGFydC4KICogQHBhcmFtIHs/fSBlbmRJbmRleCBFbmRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBlbmQuCiAqIEByZXR1cm4gez99IEluZGV4IGFmdGVyIHF1b3RlZCBjaGFyYWN0ZXJzLgogKi8KZnVuY3Rpb24gY29uc3VtZVF1b3RlZFRleHQodGV4dCwgcXVvdGVDaGFyQ29kZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjaDEgPSAtMTsKICAgIC8vIDFzdCBwcmV2aW91cyBjaGFyYWN0ZXIKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7CiAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaCA9IHRleHQuY2hhckNvZGVBdChpbmRleCsrKTsKICAgICAgICBpZiAoY2ggPT0gcXVvdGVDaGFyQ29kZSAmJiBjaDEgIT09IDkyIC8qIEJBQ0tfU0xBU0ggKi8pIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT0gOTIgLyogQkFDS19TTEFTSCAqLyAmJiBjaDEgPT09IDkyIC8qIEJBQ0tfU0xBU0ggKi8pIHsKICAgICAgICAgICAgLy8gdHdvIGJhY2sgc2xhc2hlcyBjYW5jZWwgZWFjaCBvdGhlciBvdXQuIEZvciBleGFtcGxlIGAiXFwiYCBzaG91bGQgcHJvcGVybHkgZW5kIHRoZQogICAgICAgICAgICAvLyBxdW90YXRpb24uIChJdCBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZSBsYXN0IGAiYCBpcyBlc2NhcGVkLikKICAgICAgICAgICAgY2gxID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNoMSA9IGNoOwogICAgICAgIH0KICAgIH0KICAgIHRocm93IG5nRGV2TW9kZSA/IG1hbGZvcm1lZFN0eWxlRXJyb3IodGV4dCwgU3RyaW5nLmZyb21DaGFyQ29kZShxdW90ZUNoYXJDb2RlKSwgZW5kSW5kZXgpIDoKICAgICAgICBuZXcgRXJyb3IoKTsKfQovKioKICogQHBhcmFtIHs/fSB0ZXh0CiAqIEBwYXJhbSB7P30gZXhwZWN0aW5nCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1hbGZvcm1lZFN0eWxlRXJyb3IodGV4dCwgZXhwZWN0aW5nLCBpbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJywgdHJ1ZSwgJ1N0cmluZyBleHBlY3RlZCBoZXJlJyk7CiAgICB0aHJvdyB0aHJvd0Vycm9yJDEoYE1hbGZvcm1lZCBzdHlsZSBhdCBsb2NhdGlvbiAke2luZGV4fSBpbiBzdHJpbmcgJ2AgKyB0ZXh0LnN1YnN0cmluZygwLCBpbmRleCkgKyAnWz4+JyArCiAgICAgICAgdGV4dC5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkgKyAnPDxdJyArIHRleHQuc3Vic3RyKGluZGV4ICsgMSkgKwogICAgICAgIGAnLiBFeHBlY3RpbmcgJyR7ZXhwZWN0aW5nfScuYCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3N0eWxpbmcudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFNldHMgdGhlIGN1cnJlbnQgc3R5bGUgc2FuaXRpemVyIGZ1bmN0aW9uIHdoaWNoIHdpbGwgdGhlbiBiZSB1c2VkCiAqIHdpdGhpbiBhbGwgZm9sbG93LXVwIHByb3AgYW5kIG1hcC1iYXNlZCBzdHlsZSBiaW5kaW5nIGluc3RydWN0aW9ucwogKiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCiAqCiAqIE5vdGUgdGhhdCBvbmNlIHN0eWxpbmcgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudCAoaS5lLiBvbmNlCiAqIGBhZHZhbmNlKG4pYCBpcyBleGVjdXRlZCBvciB0aGUgaG9zdEJpbmRpbmdzL3RlbXBsYXRlIGZ1bmN0aW9uIGV4aXRzKQogKiB0aGVuIHRoZSBhY3RpdmUgYHNhbml0aXplckZuYCB3aWxsIGJlIHNldCB0byBgbnVsbGAuIFRoaXMgbWVhbnMgdGhhdAogKiBvbmNlIHN0eWxpbmcgaXMgYXBwbGllZCB0byBhbm90aGVyIGVsZW1lbnQgdGhlbiBhIGFub3RoZXIgY2FsbCB0bwogKiBgc3R5bGVTYW5pdGl6ZXJgIHdpbGwgbmVlZCB0byBiZSBtYWRlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpIHsKICAgIHNldEN1cnJlbnRTdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpOwp9Ci8qKgogKiBVcGRhdGUgYSBzdHlsZSBiaW5kaW5nIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuCiAqCiAqIElmIHRoZSBzdHlsZSB2YWx1ZSBpcyBmYWxzeSB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50CiAqIChvciBhc3NpZ25lZCBhIGRpZmZlcmVudCB2YWx1ZSBkZXBlbmRpbmcgaWYgdGhlcmUgYXJlIGFueSBzdHlsZXMgcGxhY2VkCiAqIG9uIHRoZSBlbGVtZW50IHdpdGggYHN0eWxlTWFwYCBvciBhbnkgc3RhdGljIHN0eWxlcyB0aGF0IGFyZQogKiBwcmVzZW50IGZyb20gd2hlbiB0aGUgZWxlbWVudCB3YXMgY3JlYXRlZCB3aXRoIGBzdHlsaW5nYCkuCiAqCiAqIE5vdGUgdGhhdCB0aGUgc3R5bGluZyBlbGVtZW50IGlzIHVwZGF0ZWQgYXMgcGFydCBvZiBgc3R5bGluZ0FwcGx5YC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcCBBIHZhbGlkIENTUyBwcm9wZXJ0eS4KICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUgKGBudWxsYCBvciBhbiBlbXB0eSBzdHJpbmcgdG8gcmVtb3ZlKS4KICogQHBhcmFtIHs/PX0gc3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogKiAgICAgICAgTm90ZSB0aGF0IHdoZW4gYSBzdWZmaXggaXMgcHJvdmlkZWQgdGhlbiB0aGUgdW5kZXJseWluZyBzYW5pdGl6ZXIgd2lsbAogKiAgICAgICAgYmUgaWdub3JlZC4KICoKICogTm90ZSB0aGF0IHRoaXMgd2lsbCBhcHBseSB0aGUgcHJvdmlkZWQgc3R5bGUgdmFsdWUgdG8gdGhlIGhvc3QgZWxlbWVudCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAogKiB3aXRoaW4gYSBob3N0IGJpbmRpbmcgZnVuY3Rpb24uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVQcm9wKHByb3AsIHZhbHVlLCBzdWZmaXgpIHsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlLCBzdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wOwp9Ci8qKgogKiBVcGRhdGUgYSBjbGFzcyBiaW5kaW5nIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuCiAqCiAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gaGFuZGxlIHRoZSBgW2NsYXNzLmZvb109ImV4cCJgIGNhc2UgYW5kLAogKiB0aGVyZWZvcmUsIHRoZSBjbGFzcyBiaW5kaW5nIGl0c2VsZiBtdXN0IGFscmVhZHkgYmUgYWxsb2NhdGVkIHVzaW5nCiAqIGBzdHlsaW5nYCB3aXRoaW4gdGhlIGNyZWF0aW9uIGJsb2NrLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBjbGFzc05hbWUKICogQHBhcmFtIHs/fSB2YWx1ZSBBIHRydWUvZmFsc2UgdmFsdWUgd2hpY2ggd2lsbCB0dXJuIHRoZSBjbGFzcyBvbiBvciBvZmYuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgYXBwbHkgdGhlIHByb3ZpZGVkIGNsYXNzIHZhbHVlIHRvIHRoZSBob3N0IGVsZW1lbnQgaWYgdGhpcyBmdW5jdGlvbgogKiBpcyBjYWxsZWQgd2l0aGluIGEgaG9zdCBiaW5kaW5nIGZ1bmN0aW9uLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNsYXNzUHJvcChjbGFzc05hbWUsIHZhbHVlKSB7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShjbGFzc05hbWUsIHZhbHVlLCBudWxsLCB0cnVlKTsKICAgIHJldHVybiDJtcm1Y2xhc3NQcm9wOwp9Ci8qKgogKiBVcGRhdGUgc3R5bGUgYmluZGluZ3MgdXNpbmcgYW4gb2JqZWN0IGxpdGVyYWwgb24gYW4gZWxlbWVudC4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBhcHBseSBzdHlsaW5nIHZpYSB0aGUgYFtzdHlsZV09ImV4cCJgIHRlbXBsYXRlIGJpbmRpbmdzLgogKiBXaGVuIHN0eWxlcyBhcmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCB0aGV5IHdpbGwgdGhlbiBiZSB1cGRhdGVkIHdpdGggcmVzcGVjdCB0bwogKiBhbnkgc3R5bGVzL2NsYXNzZXMgc2V0IHZpYSBgc3R5bGVQcm9wYC4gSWYgYW55IHN0eWxlcyBhcmUgc2V0IHRvIGZhbHN5CiAqIHRoZW4gdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudC4KICoKICogTm90ZSB0aGF0IHRoZSBzdHlsaW5nIGluc3RydWN0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQgdW50aWwgYHN0eWxpbmdBcHBseWAgaXMgY2FsbGVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzdHlsZXMgQSBrZXkvdmFsdWUgc3R5bGUgbWFwIG9mIHRoZSBzdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCiAqICAgICAgICBBbnkgbWlzc2luZyBzdHlsZXMgKHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudCBiZWZvcmVoYW5kKSB3aWxsIGJlCiAqICAgICAgICByZW1vdmVkICh1bnNldCkgZnJvbSB0aGUgZWxlbWVudCdzIHN0eWxpbmcuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgYXBwbHkgdGhlIHByb3ZpZGVkIHN0eWxlTWFwIHZhbHVlIHRvIHRoZSBob3N0IGVsZW1lbnQgaWYgdGhpcyBmdW5jdGlvbgogKiBpcyBjYWxsZWQgd2l0aGluIGEgaG9zdCBiaW5kaW5nLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0eWxlTWFwKHN0eWxlcykgewogICAgY2hlY2tTdHlsaW5nTWFwKHN0eWxlS2V5VmFsdWVBcnJheVNldCwgc3R5bGVTdHJpbmdQYXJzZXIsIHN0eWxlcywgZmFsc2UpOwp9Ci8qKgogKiBQYXJzZSB0ZXh0IGFzIHN0eWxlIGFuZCBhZGQgdmFsdWVzIHRvIEtleVZhbHVlQXJyYXkuCiAqCiAqIFRoaXMgY29kZSBpcyBwdWxsZWQgb3V0IHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgdHJlZSBzaGFrZW4gYXdheSBpZiBpdCBpcyBub3QKICogbmVlZGVkLiBJdCBpcyBvbmx5IHJlZmVyZW5jZWQgZnJvbSBgybXJtXN0eWxlTWFwYC4KICoKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5IEtleVZhbHVlQXJyYXkgdG8gYWRkIHBhcnNlZCB2YWx1ZXMgdG8uCiAqIEBwYXJhbSB7P30gdGV4dCB0ZXh0IHRvIHBhcnNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3R5bGVTdHJpbmdQYXJzZXIoa2V5VmFsdWVBcnJheSwgdGV4dCkgewogICAgZm9yIChsZXQgaSA9IHBhcnNlU3R5bGUodGV4dCk7IGkgPj0gMDsgaSA9IHBhcnNlU3R5bGVOZXh0KHRleHQsIGkpKSB7CiAgICAgICAgc3R5bGVLZXlWYWx1ZUFycmF5U2V0KGtleVZhbHVlQXJyYXksIGdldExhc3RQYXJzZWRLZXkodGV4dCksIGdldExhc3RQYXJzZWRWYWx1ZSh0ZXh0KSk7CiAgICB9Cn0KLyoqCiAqIFVwZGF0ZSBjbGFzcyBiaW5kaW5ncyB1c2luZyBhbiBvYmplY3QgbGl0ZXJhbCBvciBjbGFzcy1zdHJpbmcgb24gYW4gZWxlbWVudC4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBhcHBseSBzdHlsaW5nIHZpYSB0aGUgYFtjbGFzc109ImV4cCJgIHRlbXBsYXRlIGJpbmRpbmdzLgogKiBXaGVuIGNsYXNzZXMgYXJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgdGhleSB3aWxsIHRoZW4gYmUgdXBkYXRlZCB3aXRoCiAqIHJlc3BlY3QgdG8gYW55IHN0eWxlcy9jbGFzc2VzIHNldCB2aWEgYGNsYXNzUHJvcGAuIElmIGFueQogKiBjbGFzc2VzIGFyZSBzZXQgdG8gZmFsc3kgdGhlbiB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50LgogKgogKiBOb3RlIHRoYXQgdGhlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gd2lsbCBub3QgYmUgYXBwbGllZCB1bnRpbCBgc3R5bGluZ0FwcGx5YCBpcyBjYWxsZWQuCiAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgdGhlIHByb3ZpZGVkIGNsYXNzTWFwIHZhbHVlIHRvIHRoZSBob3N0IGVsZW1lbnQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKICogd2l0aGluIGEgaG9zdCBiaW5kaW5nLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBjbGFzc2VzIEEga2V5L3ZhbHVlIG1hcCBvciBzdHJpbmcgb2YgQ1NTIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQogKiAgICAgICAgZ2l2ZW4gZWxlbWVudC4gQW55IG1pc3NpbmcgY2xhc3NlcyAodGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50CiAqICAgICAgICBiZWZvcmVoYW5kKSB3aWxsIGJlIHJlbW92ZWQgKHVuc2V0KSBmcm9tIHRoZSBlbGVtZW50J3MgbGlzdCBvZiBDU1MgY2xhc3Nlcy4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcChjbGFzc2VzKSB7CiAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGNsYXNzZXMsIHRydWUpOwp9Ci8qKgogKiBQYXJzZSB0ZXh0IGFzIGNsYXNzIGFuZCBhZGQgdmFsdWVzIHRvIEtleVZhbHVlQXJyYXkuCiAqCiAqIFRoaXMgY29kZSBpcyBwdWxsZWQgb3V0IHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgdHJlZSBzaGFrZW4gYXdheSBpZiBpdCBpcyBub3QKICogbmVlZGVkLiBJdCBpcyBvbmx5IHJlZmVyZW5jZWQgZnJvbSBgybXJtWNsYXNzTWFwYC4KICoKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5IEtleVZhbHVlQXJyYXkgdG8gYWRkIHBhcnNlZCB2YWx1ZXMgdG8uCiAqIEBwYXJhbSB7P30gdGV4dCB0ZXh0IHRvIHBhcnNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2xhc3NTdHJpbmdQYXJzZXIoa2V5VmFsdWVBcnJheSwgdGV4dCkgewogICAgZm9yIChsZXQgaSA9IHBhcnNlQ2xhc3NOYW1lKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZUNsYXNzTmFtZU5leHQodGV4dCwgaSkpIHsKICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KGtleVZhbHVlQXJyYXksIGdldExhc3RQYXJzZWRLZXkodGV4dCksIHRydWUpOwogICAgfQp9Ci8qKgogKiBDb21tb24gY29kZSBiZXR3ZWVuIGDJtcm1Y2xhc3NQcm9wYCBhbmQgYMm1ybVzdHlsZVByb3BgLgogKgogKiBAcGFyYW0gez99IHByb3AgcHJvcGVydHkgbmFtZS4KICogQHBhcmFtIHs/fSB2YWx1ZSBiaW5kaW5nIHZhbHVlLgogKiBAcGFyYW0gez99IHN1ZmZpeE9yU2FuaXRpemVyIHN1ZmZpeCBvciBzYW5pdGl6YXRpb24gZnVuY3Rpb24KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgY2hhbmdlIChgZmFsc2VgIGlmIGBzdHlsZWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCB2YWx1ZSwgc3VmZml4T3JTYW5pdGl6ZXIsIGlzQ2xhc3NCYXNlZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLy8gU3R5bGluZyBpbnN0cnVjdGlvbnMgdXNlIDIgc2xvdHMgcGVyIGJpbmRpbmcuCiAgICAvLyAxLiBvbmUgZm9yIHRoZSB2YWx1ZSAvIFRTdHlsaW5nS2V5CiAgICAvLyAyLiBvbmUgZm9yIHRoZSBpbnRlcm1pdHRlbnQtdmFsdWUgLyBUU3R5bGluZ1JhbmdlCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoMik7CiAgICBpZiAodFZpZXcuZmlyc3RVcGRhdGVQYXNzKSB7CiAgICAgICAgc3R5bGluZ0ZpcnN0VXBkYXRlUGFzcyh0VmlldywgcHJvcCwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpOwogICAgfQogICAgaWYgKHZhbHVlICE9PSBOT19DSEFOR0UgJiYgYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmsgYXJvdW5kLiBPbmNlIFBSIzM0NDgwIGxhbmRzIHRoZSBzYW5pdGl6ZXIgaXMgcGFzc2VkIGV4cGxpY2l0bHkgYW5kIHRoaXMgbGluZQogICAgICAgIC8vIGNhbiBiZSByZW1vdmVkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3R5bGVTYW5pdGl6ZXI7CiAgICAgICAgaWYgKHN1ZmZpeE9yU2FuaXRpemVyID09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHN0eWxlU2FuaXRpemVyID0gZ2V0Q3VycmVudFN0eWxlU2FuaXRpemVyKCkpIHsKICAgICAgICAgICAgICAgIHN1ZmZpeE9yU2FuaXRpemVyID0gKC8qKiBAdHlwZSB7P30gKi8gKHN0eWxlU2FuaXRpemVyKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbZ2V0U2VsZWN0ZWRJbmRleCgpICsgSEVBREVSX09GRlNFVF0pKTsKICAgICAgICB1cGRhdGVTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgcHJvcCwgbFZpZXdbYmluZGluZ0luZGV4ICsgMV0gPSBub3JtYWxpemVBbmRBcHBseVN1ZmZpeE9yU2FuaXRpemVyKHZhbHVlLCBzdWZmaXhPclNhbml0aXplciksIGlzQ2xhc3NCYXNlZCwgYmluZGluZ0luZGV4KTsKICAgIH0KfQovKioKICogQ29tbW9uIGNvZGUgYmV0d2VlbiBgybXJtWNsYXNzTWFwYCBhbmQgYMm1ybVzdHlsZU1hcGAuCiAqCiAqIEBwYXJhbSB7P30ga2V5VmFsdWVBcnJheVNldCAoU2VlIGBrZXlWYWx1ZUFycmF5U2V0YCBpbiAidXRpbC9hcnJheV91dGlscyIpIEdldHMgcGFzc2VkIGluIGFzIGEKICogZnVuY3Rpb24gc28gdGhhdAogKiAgICAgICAgYHN0eWxlYCBjYW4gcGFzcyBpbiB2ZXJzaW9uIHdoaWNoIGRvZXMgc2FuaXRpemF0aW9uLiBUaGlzIGlzIGRvbmUgZm9yIHRyZWUgc2hha2luZwogKiAgICAgICAgcHVycG9zZXMuCiAqIEBwYXJhbSB7P30gc3RyaW5nUGFyc2VyIFBhcnNlciB1c2VkIHRvIHBhcnNlIGB2YWx1ZWAgaWYgYHN0cmluZ2AuIChQYXNzZWQgaW4gYXMgYHN0eWxlYCBhbmQgYGNsYXNzYAogKiAgICAgICAgaGF2ZSBkaWZmZXJlbnQgcGFyc2Vycy4pCiAqIEBwYXJhbSB7P30gdmFsdWUgYm91bmQgdmFsdWUgZnJvbSBhcHBsaWNhdGlvbgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCBjaGFuZ2UgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlLCBpc0NsYXNzQmFzZWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGluY3JlbWVudEJpbmRpbmdJbmRleCgyKTsKICAgIGlmICh0Vmlldy5maXJzdFVwZGF0ZVBhc3MpIHsKICAgICAgICBzdHlsaW5nRmlyc3RVcGRhdGVQYXNzKHRWaWV3LCBudWxsLCBiaW5kaW5nSW5kZXgsIGlzQ2xhc3NCYXNlZCk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICBpZiAodmFsdWUgIT09IE5PX0NIQU5HRSAmJiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvLyBgZ2V0U2VsZWN0ZWRJbmRleCgpYCBzaG91bGQgYmUgaGVyZSAocmF0aGVyIHRoYW4gaW4gaW5zdHJ1Y3Rpb24pIHNvIHRoYXQgaXQgaXMgZ3VhcmRlZCBieSB0aGUKICAgICAgICAvLyBpZiBzbyBhcyBub3QgdG8gcmVhZCB1bm5lY2Vzc2FyaWx5LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2dldFNlbGVjdGVkSW5kZXgoKSArIEhFQURFUl9PRkZTRVRdKSk7CiAgICAgICAgaWYgKGhhc1N0eWxpbmdJbnB1dFNoYWRvdyh0Tm9kZSwgaXNDbGFzc0Jhc2VkKSAmJiAhaXNJbkhvc3RCaW5kaW5ncyh0VmlldywgYmluZGluZ0luZGV4KSkgewogICAgICAgICAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBpZiB3ZSBhcmUgc2hhZG93aW5nIHRoZW4gYFREYXRhYCBpcyBhcHByb3ByaWF0ZWx5IG1hcmtlZCBzbyB0aGF0IHdlIHNraXAKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgdGhpcyBiaW5kaW5nIGluIHN0eWxpbmcgcmVzb2x1dGlvbi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRTdHlsaW5nS2V5ID0gdFZpZXcuZGF0YVtiaW5kaW5nSW5kZXhdOwogICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWwoQXJyYXkuaXNBcnJheSh0U3R5bGluZ0tleSkgPyB0U3R5bGluZ0tleVsxXSA6IHRTdHlsaW5nS2V5LCBmYWxzZSwgJ1N0eWxpbmcgbGlua2VkIGxpc3Qgc2hhZG93IGlucHV0IHNob3VsZCBiZSBtYXJrZWQgYXMgXCdmYWxzZVwnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVkUgZG9lcyBub3QgY29uY2F0ZW5hdGUgdGhlIHN0YXRpYyBwb3J0aW9uIGxpa2Ugd2UgYXJlIGRvaW5nIGhlcmUuCiAgICAgICAgICAgIC8vIEluc3RlYWQgVkUganVzdCBpZ25vcmVzIHRoZSBzdGF0aWMgY29tcGxldGVseSBpZiBkeW5hbWljIGJpbmRpbmcgaXMgcHJlc2VudC4KICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiBsb2NhbGl0eSB3ZSBoYXZlIGFscmVhZHkgc2V0IHRoZSBzdGF0aWMgcG9ydGlvbiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlcmUKICAgICAgICAgICAgLy8gaXMgYSBkeW5hbWljIHBvcnRpb24gdW50aWwgbGF0ZXIuIElmIHdlIHdvdWxkIGlnbm9yZSB0aGUgc3RhdGljIHBvcnRpb24gaXQgd291bGQgbG9vayBsaWtlCiAgICAgICAgICAgIC8vIHRoZSBiaW5kaW5nIGhhcyByZW1vdmVkIGl0LiBUaGlzIHdvdWxkIGNvbmZ1c2UgYFtuZ1N0eWxlXWAvYFtuZ0NsYXNzXWAgdG8gZG8gdGhlIHdyb25nCiAgICAgICAgICAgIC8vIHRoaW5nIGFzIGl0IHdvdWxkIHRoaW5rIHRoYXQgdGhlIHN0YXRpYyBwb3J0aW9uIHdhcyByZW1vdmVkLiBGb3IgdGhpcyByZWFzb24gd2UKICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGUgaXQgc28gdGhhdCBgW25nU3R5bGVdYC9gW25nQ2xhc3NdYCAgY2FuIGNvbnRpbnVlIHRvIHdvcmsgb24gY2hhbmdlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3RhdGljUHJlZml4ID0gaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NlcyA6IHROb2RlLnN0eWxlczsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGlzQ2xhc3NCYXNlZCA9PT0gZmFsc2UgJiYgc3RhdGljUHJlZml4ICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbChzdGF0aWNQcmVmaXguZW5kc1dpdGgoJzsnKSwgdHJ1ZSwgJ0V4cGVjdGluZyBzdGF0aWMgcG9ydGlvbiB0byBlbmQgd2l0aCBcJztcJycpOwogICAgICAgICAgICBpZiAoc3RhdGljUHJlZml4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGZhbHN5IHZhbHVlcyBvZiBgdmFsdWVgIGJlY29tZSBlbXB0eSBzdHJpbmdzLgogICAgICAgICAgICAgICAgdmFsdWUgPSBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKHN0YXRpY1ByZWZpeCwgdmFsdWUgPyB2YWx1ZSA6ICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBHaXZlbiBgPGRpdiBbc3R5bGVdIG15LWRpcj5gIHN1Y2ggdGhhdCBgbXktZGlyYCBoYXMgYEBJbnB1dCgnc3R5bGUnKWAuCiAgICAgICAgICAgIC8vIFRoaXMgdGFrZXMgb3ZlciB0aGUgYFtzdHlsZV1gIGJpbmRpbmcuIChTYW1lIGZvciBgW2NsYXNzXWApCiAgICAgICAgICAgIHNldERpcmVjdGl2ZUlucHV0c1doaWNoU2hhZG93c1N0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgdmFsdWUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB1cGRhdGVTdHlsaW5nTWFwKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgbFZpZXdbYmluZGluZ0luZGV4ICsgMV0sIGxWaWV3W2JpbmRpbmdJbmRleCArIDFdID0gdG9TdHlsaW5nS2V5VmFsdWVBcnJheShrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlKSwgaXNDbGFzc0Jhc2VkLCBiaW5kaW5nSW5kZXgpOwogICAgICAgIH0KICAgIH0KfQovKioKICogRGV0ZXJtaW5lcyB3aGVuIHRoZSBiaW5kaW5nIGlzIGluIGBob3N0QmluZGluZ3NgIHNlY3Rpb24KICoKICogQHBhcmFtIHs/fSB0VmlldyBDdXJyZW50IGBUVmlld2AKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggaW5kZXggb2YgYmluZGluZyB3aGljaCB3ZSB3b3VsZCBsaWtlIGlmIGl0IGlzIGluIGBob3N0QmluZGluZ3NgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0luSG9zdEJpbmRpbmdzKHRWaWV3LCBiaW5kaW5nSW5kZXgpIHsKICAgIC8vIEFsbCBob3N0IGJpbmRpbmdzIGFyZSBwbGFjZWQgYWZ0ZXIgdGhlIGV4cGFuZG8gc2VjdGlvbi4KICAgIHJldHVybiBiaW5kaW5nSW5kZXggPj0gdFZpZXcuZXhwYW5kb1N0YXJ0SW5kZXg7Cn0KLyoqCiAqIENvbGxlY3RzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gaW5zZXJ0IHRoZSBiaW5kaW5nIGludG8gYSBsaW5rZWQgbGlzdCBvZiBzdHlsZSBiaW5kaW5ncwogKiB1c2luZyBgaW5zZXJ0VFN0eWxpbmdCaW5kaW5nYC4KICoKICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIHdoZXJlIHRoZSBiaW5kaW5nIGxpbmtlZCBsaXN0IHdpbGwgYmUgc3RvcmVkLgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5IFByb3BlcnR5L2tleSBvZiB0aGUgYmluZGluZy4KICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggSW5kZXggb2YgYmluZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9wYAogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCBjaGFuZ2UgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN0eWxpbmdGaXJzdFVwZGF0ZVBhc3ModFZpZXcsIHRTdHlsaW5nS2V5LCBiaW5kaW5nSW5kZXgsIGlzQ2xhc3NCYXNlZCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0VXBkYXRlUGFzcyh0Vmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0RGF0YSA9IHRWaWV3LmRhdGE7CiAgICBpZiAodERhdGFbYmluZGluZ0luZGV4ICsgMV0gPT09IG51bGwpIHsKICAgICAgICAvLyBUaGUgYWJvdmUgY2hlY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG9uJ3QgY2xlYXIgZmlyc3QgdXBkYXRlIHBhc3MgdW50aWwgZmlyc3Qgc3VjY2Vzc2Z1bAogICAgICAgIC8vIChubyBleGNlcHRpb24pIHRlbXBsYXRlIGV4ZWN1dGlvbi4gVGhpcyBwcmV2ZW50cyB0aGUgc3R5bGluZyBpbnN0cnVjdGlvbiBmcm9tIGRvdWJsZSBhZGRpbmcKICAgICAgICAvLyBpdHNlbGYgdG8gdGhlIGxpc3QuCiAgICAgICAgLy8gYGdldFNlbGVjdGVkSW5kZXgoKWAgc2hvdWxkIGJlIGhlcmUgKHJhdGhlciB0aGFuIGluIGluc3RydWN0aW9uKSBzbyB0aGF0IGl0IGlzIGd1YXJkZWQgYnkgdGhlCiAgICAgICAgLy8gaWYgc28gYXMgbm90IHRvIHJlYWQgdW5uZWNlc3NhcmlseS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbZ2V0U2VsZWN0ZWRJbmRleCgpICsgSEVBREVSX09GRlNFVF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNIb3N0QmluZGluZ3MgPSBpc0luSG9zdEJpbmRpbmdzKHRWaWV3LCBiaW5kaW5nSW5kZXgpOwogICAgICAgIGlmIChoYXNTdHlsaW5nSW5wdXRTaGFkb3codE5vZGUsIGlzQ2xhc3NCYXNlZCkgJiYgdFN0eWxpbmdLZXkgPT09IG51bGwgJiYgIWlzSG9zdEJpbmRpbmdzKSB7CiAgICAgICAgICAgIC8vIGB0U3R5bGluZ0tleSA9PT0gbnVsbGAgaW1wbGllcyB0aGF0IHdlIGFyZSBlaXRoZXIgYFtzdHlsZV1gIG9yIGBbY2xhc3NdYCBiaW5kaW5nLgogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGRpcmVjdGl2ZSB3aGljaCB1c2VzIGBASW5wdXQoJ3N0eWxlJylgIG9yIGBASW5wdXQoJ2NsYXNzJylgIHRoYW4KICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBuZXV0cmFsaXplIHRoaXMgYmluZGluZyBzaW5jZSB0aGF0IGRpcmVjdGl2ZSBpcyBzaGFkb3dpbmcgaXQuCiAgICAgICAgICAgIC8vIFdlIHR1cm4gdGhpcyBpbnRvIGEgbm9vcCBieSBzZXR0aW5nIHRoZSBrZXkgdG8gYGZhbHNlYAogICAgICAgICAgICB0U3R5bGluZ0tleSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0U3R5bGluZ0tleSA9IHdyYXBJblN0YXRpY1N0eWxpbmdLZXkodERhdGEsIHROb2RlLCB0U3R5bGluZ0tleSwgaXNDbGFzc0Jhc2VkKTsKICAgICAgICBpbnNlcnRUU3R5bGluZ0JpbmRpbmcodERhdGEsIHROb2RlLCB0U3R5bGluZ0tleSwgYmluZGluZ0luZGV4LCBpc0hvc3RCaW5kaW5ncywgaXNDbGFzc0Jhc2VkKTsKICAgIH0KfQovKioKICogQWRkcyBzdGF0aWMgc3R5bGluZyBpbmZvcm1hdGlvbiB0byB0aGUgYmluZGluZyBpZiBhcHBsaWNhYmxlLgogKgogKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3R5bGVzIG5vdCBvbmx5IHN0b3JlcyB0aGUgbGlzdCBhbmQga2V5cywgYnV0IGFsc28gc3RvcmVzIHN0YXRpYyBzdHlsaW5nCiAqIGluZm9ybWF0aW9uIG9uIHNvbWUgb2YgdGhlIGtleXMuIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUga2V5IHNob3VsZCBjb250YWluIHRoZSBzdHlsaW5nCiAqIGluZm9ybWF0aW9uIGFuZCBjb21wdXRlcyBpdC4KICoKICogU2VlIGBUU3R5bGluZ1N0YXRpY2AgZm9yIG1vcmUgZGV0YWlscy4KICoKICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHdoZXJlIHRoZSBsaW5rZWQgbGlzdCBpcyBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCBmb3Igd2hpY2ggdGhlIHN0eWxpbmcgaXMgYmVpbmcgY29tcHV0ZWQuCiAqIEBwYXJhbSB7P30gc3R5bGluZ0tleSBgVFN0eWxpbmdLZXlQcmltaXRpdmVgIHdoaWNoIG1heSBuZWVkIHRvIGJlIHdyYXBwZWQgaW50byBgVFN0eWxpbmdLZXlgCiAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB3cmFwSW5TdGF0aWNTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgc3R5bGluZ0tleSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBob3N0RGlyZWN0aXZlRGVmID0gZ2V0SG9zdERpcmVjdGl2ZURlZih0RGF0YSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzaWR1YWwgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5yZXNpZHVhbENsYXNzZXMgOiB0Tm9kZS5yZXNpZHVhbFN0eWxlczsKICAgIGlmIChob3N0RGlyZWN0aXZlRGVmID09PSBudWxsKSB7CiAgICAgICAgLy8gV2UgYXJlIGluIHRlbXBsYXRlIG5vZGUuCiAgICAgICAgLy8gSWYgdGVtcGxhdGUgbm9kZSBhbHJlYWR5IGhhZCBzdHlsaW5nIGluc3RydWN0aW9uIHRoZW4gaXQgaGFzIGFscmVhZHkgY29sbGVjdGVkIHRoZSBzdGF0aWMKICAgICAgICAvLyBzdHlsaW5nIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbGxlY3QgdGhlbSBhZ2Fpbi4gV2Uga25vdyB0aGF0IHdlIGFyZSB0aGUgZmlyc3Qgc3R5bGluZwogICAgICAgIC8vIGluc3RydWN0aW9uIGJlY2F1c2UgdGhlIGBUTm9kZS4qQmluZGluZ3NgIHBvaW50cyB0byAwIChub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkIHlldCkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzRmlyc3RTdHlsaW5nSW5zdHJ1Y3Rpb25JblRlbXBsYXRlID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICgoaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NCaW5kaW5ncyA6IHROb2RlLnN0eWxlQmluZGluZ3MpKSkpKSA9PT0gMDsKICAgICAgICBpZiAoaXNGaXJzdFN0eWxpbmdJbnN0cnVjdGlvbkluVGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIGdldCB0aGUgc3RhdGljcyBmcm9tIGBtZXJnZUF0dHJzYCwgaG93ZXZlciwgYXQgdGhpcyBwb2ludAogICAgICAgICAgICAvLyB0aGV5IGFyZSBhbHJlYWR5IG1lcmdlZCBhbmQgaXQgd291bGQgbm90IGJlIHBvc3NpYmxlIHRvIGZpZ3VyZSB3aGljaCBwcm9wZXJ0eSBiZWxvbmdzIHdoZXJlCiAgICAgICAgICAgIC8vIGluIHRoZSBwcmlvcml0eS4KICAgICAgICAgICAgc3R5bGluZ0tleSA9IGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMobnVsbCwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICBzdHlsaW5nS2V5ID0gY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHN0eWxpbmdLZXksIHROb2RlLmF0dHJzLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgaWYgd2UgaGF2ZSBzdHlsaW5nIGJpbmRpbmcgaW4gdGVtcGxhdGUgd2UgY2FuJ3QgaGF2ZSByZXNpZHVhbC4KICAgICAgICAgICAgcmVzaWR1YWwgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIFdlIGFyZSBpbiBob3N0IGJpbmRpbmcgbm9kZSBhbmQgdGhlcmUgd2FzIG5vIGJpbmRpbmcgaW5zdHJ1Y3Rpb24gaW4gdGVtcGxhdGUgbm9kZS4KICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBjb21wdXRlIHRoZSByZXNpZHVhbC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSB0Tm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNGaXJzdFN0eWxpbmdJbnN0cnVjdGlvbkluSG9zdEJpbmRpbmcgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdCA9PT0gLTEgfHwgdERhdGFbZGlyZWN0aXZlU3R5bGluZ0xhc3RdICE9PSBob3N0RGlyZWN0aXZlRGVmOwogICAgICAgIGlmIChpc0ZpcnN0U3R5bGluZ0luc3RydWN0aW9uSW5Ib3N0QmluZGluZykgewogICAgICAgICAgICBzdHlsaW5nS2V5ID0KICAgICAgICAgICAgICAgIGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMoaG9zdERpcmVjdGl2ZURlZiwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICBpZiAocmVzaWR1YWwgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIC0gSWYgYG51bGxgIHRoYW4gZWl0aGVyOgogICAgICAgICAgICAgICAgLy8gICAgLSBUZW1wbGF0ZSBzdHlsaW5nIGluc3RydWN0aW9uIGFscmVhZHkgcmFuIGFuZCBpdCBoYXMgY29uc3VtZWQgdGhlIHN0YXRpYwogICAgICAgICAgICAgICAgLy8gICAgICBzdHlsaW5nIGludG8gaXRzIGBUU3R5bGluZ0tleWAgYW5kIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlIHJlc2lkdWFsLiBJbnN0ZWFkCiAgICAgICAgICAgICAgICAvLyAgICAgIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBgVFN0eWxpbmdLZXlgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlyc3QgdGVtcGxhdGUgbm9kZQogICAgICAgICAgICAgICAgLy8gICAgICBpbnN0cnVjdGlvbi4gT1IKICAgICAgICAgICAgICAgIC8vICAgIC0gU29tZSBvdGhlciBzdHlsaW5nIGluc3RydWN0aW9uIHJhbiBhbmQgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGFyZSBubyByZXNpZHVhbHMKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxpbmdLZXkgPSBnZXRUZW1wbGF0ZUhlYWRUU3R5bGluZ0tleSh0RGF0YSwgdE5vZGUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVTdHlsaW5nS2V5ICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZVN0eWxpbmdLZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZWNvbXB1dGUgaWYgYHRlbXBsYXRlU3R5bGluZ0tleWAgaGFkIHN0YXRpYyB2YWx1ZXMuIChJZiBubyBzdGF0aWMgdmFsdWUgZm91bmQKICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gc2luY2UgdGhpcyBvcGVyYXRpb24gY2FuIG9ubHkgcHJvZHVjZSBsZXNzIHN0YXRpYyBrZXlzLCBub3QKICAgICAgICAgICAgICAgICAgICAvLyBtb3JlLikKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVN0eWxpbmdLZXkgPSBjb2xsZWN0U3R5bGluZ0Zyb21EaXJlY3RpdmVzKG51bGwsIHREYXRhLCB0Tm9kZSwgdGVtcGxhdGVTdHlsaW5nS2V5WzFdIC8qIHVud3JhcCBwcmV2aW91cyBzdGF0aWNzICovLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3R5bGluZ0tleSA9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RTdHlsaW5nRnJvbVRBdHRycyh0ZW1wbGF0ZVN0eWxpbmdLZXksIHROb2RlLmF0dHJzLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgICAgIHNldFRlbXBsYXRlSGVhZFRTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkLCB0ZW1wbGF0ZVN0eWxpbmdLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlY29tcHV0ZSByZXNpZHVhbCBpZiBpdCBpcyBub3QgYG51bGxgLgogICAgICAgICAgICAgICAgLy8gLSBJZiBleGlzdGluZyByZXNpZHVhbCAoaW1wbGllcyB0aGVyZSB3YXMgbm8gdGVtcGxhdGUgc3R5bGluZykuIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mCiAgICAgICAgICAgICAgICAvLyAgIHRoZSBzdGF0aWNzIG1heSBoYXZlIG1vdmVkIGZyb20gdGhlIHJlc2lkdWFsIHRvIHRoZSBgc3R5bGluZ0tleWAgYW5kIHNvIHdlIGhhdmUgdG8KICAgICAgICAgICAgICAgIC8vICAgcmVjb21wdXRlLgogICAgICAgICAgICAgICAgLy8gLSBJZiBgdW5kZWZpbmVkYCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBydW5uaW5nLgogICAgICAgICAgICAgICAgcmVzaWR1YWwgPSBjb2xsZWN0UmVzaWR1YWwodERhdGEsIHROb2RlLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlc2lkdWFsICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpc0NsYXNzQmFzZWQgPyAodE5vZGUucmVzaWR1YWxDbGFzc2VzID0gcmVzaWR1YWwpIDogKHROb2RlLnJlc2lkdWFsU3R5bGVzID0gcmVzaWR1YWwpOwogICAgfQogICAgcmV0dXJuIHN0eWxpbmdLZXk7Cn0KLyoqCiAqIFJldHJpZXZlIHRoZSBgVFN0eWxpbmdLZXlgIGZvciB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbi4KICoKICogVGhpcyBpcyBuZWVkZWQgc2luY2UgYGhvc3RCaW5kaW5nYCBzdHlsaW5nIGluc3RydWN0aW9ucyBhcmUgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHRlbXBsYXRlCiAqIGluc3RydWN0aW9uLiBXaGlsZSB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gbmVlZHMgdG8gdXBkYXRlIHRoZSByZXNpZHVhbCBpbiBgVE5vZGVgIHRoZQogKiBgaG9zdEJpbmRpbmdgIGluc3RydWN0aW9ucyBuZWVkIHRvIHVwZGF0ZSB0aGUgYFRTdHlsaW5nS2V5YCBvZiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gYmVjYXVzZQogKiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gaXMgZG93bnN0cmVhbSBmcm9tIHRoZSBgaG9zdEJpbmRpbmdzYCBpbnN0cnVjdGlvbnMuCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgbGlua2VkIGxpc3QgaXMgc3RvcmVkLgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgZm9yIHdoaWNoIHRoZSBzdHlsaW5nIGlzIGJlaW5nIGNvbXB1dGVkLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fSBgVFN0eWxpbmdLZXlgIGlmIGZvdW5kIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4KICovCmZ1bmN0aW9uIGdldFRlbXBsYXRlSGVhZFRTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5ncyA9IGlzQ2xhc3NCYXNlZCA/IHROb2RlLmNsYXNzQmluZGluZ3MgOiB0Tm9kZS5zdHlsZUJpbmRpbmdzOwogICAgaWYgKGdldFRTdHlsaW5nUmFuZ2VOZXh0KGJpbmRpbmdzKSA9PT0gMCkgewogICAgICAgIC8vIFRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgYSBzdHlsaW5nIGluc3RydWN0aW9uIGluIHRoZSBgdGVtcGxhdGVgLgogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2dldFRTdHlsaW5nUmFuZ2VQcmV2KGJpbmRpbmdzKV0pKTsKfQovKioKICogVXBkYXRlIHRoZSBgVFN0eWxpbmdLZXlgIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiBpbiBgVE5vZGVgLgogKgogKiBMb2dpY2FsbHkgYGhvc3RCaW5kaW5nc2Agc3R5bGluZyBpbnN0cnVjdGlvbnMgYXJlIG9mIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhhdCBvZiB0aGUgdGVtcGxhdGUuCiAqIEhvd2V2ZXIsIHRoZXkgZXhlY3V0ZSBhZnRlciB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGV5IGdldCBpbnNlcnRlZAogKiBpbiBmcm9udCBvZiB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbnMuCiAqCiAqIElmIHdlIGhhdmUgYSB0ZW1wbGF0ZSBzdHlsaW5nIGluc3RydWN0aW9uIGFuZCBhIG5ldyBgaG9zdEJpbmRpbmdzYCBzdHlsaW5nIGluc3RydWN0aW9uIGlzCiAqIGV4ZWN1dGVkIGl0IG1lYW5zIHRoYXQgaXQgbWF5IG5lZWQgdG8gc3RlYWwgc3RhdGljIGZpZWxkcyBmcm9tIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbi4gVGhpcwogKiBtZXRob2QgYWxsb3dzIHVzIHRvIHVwZGF0ZSB0aGUgZmlyc3QgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gYFRTdHlsaW5nS2V5YCB3aXRoIGEgbmV3IHZhbHVlLgogKgogKiBBc3N1bWU6CiAqIGBgYAogKiA8ZGl2IG15LWRpciBzdHlsZT0iY29sb3I6IHJlZCIgW3N0eWxlLmNvbG9yXT0idG1wbEV4cCI+PC9kaXY+CiAqCiAqIFxARGlyZWN0aXZlKHsKICogICBob3N0OiB7CiAqICAgICAnc3R5bGUnOiAnd2lkdGg6IDEwMHB4JywKICogICAgICdbc3R5bGUuY29sb3JdJzogJ2RpckV4cCcsCiAqICAgfQogKiB9KQogKiBjbGFzcyBNeURpciB7fQogKiBgYGAKICoKICogd2hlbiBgW3N0eWxlLmNvbG9yXT0idG1wbEV4cCJgIGV4ZWN1dGVzIGl0IGNyZWF0ZXMgdGhpcyBkYXRhIHN0cnVjdHVyZS4KICogYGBgCiAqICBbJycsICdjb2xvcicsICdjb2xvcicsICdyZWQnLCAnd2lkdGgnLCAnMTAwcHgnXSwKICogYGBgCiAqCiAqIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qga25vdyBpZiB0aGVyZSBhcmUgc3R5bGluZwogKiBpbnN0cnVjdGlvbnMgYW5kIG11c3QgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vbmUgYW5kIG11c3QgY29sbGVjdCBhbGwgb2YgdGhlIHN0YXRpYyBzdHlsaW5nLgogKiAoYm90aAogKiBgY29sb3InIGFuZCAnd2lkdGhgKQogKgogKiBXaGVuIGAnW3N0eWxlLmNvbG9yXSc6ICdkaXJFeHAnLGAgZXhlY3V0ZXMgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcgZGF0YSBpbnRvIHRoZSBsaW5rZWQgbGlzdC4KICogYGBgCiAqICBbJycsICdjb2xvcicsICd3aWR0aCcsICcxMDBweCddLCAgLy8gbmV3bHkgaW5zZXJ0ZWQKICogIFsnJywgJ2NvbG9yJywgJ2NvbG9yJywgJ3JlZCcsICd3aWR0aCcsICcxMDBweCddLCAvLyB0aGlzIGlzIHdyb25nCiAqIGBgYAogKgogKiBOb3RpY2UgdGhhdCB0aGUgdGVtcGxhdGUgc3RhdGljcyBpcyBub3cgd3JvbmcgYXMgaXQgaW5jb3JyZWN0bHkgY29udGFpbnMgYHdpZHRoYCBzbyB3ZSBuZWVkIHRvCiAqIHVwZGF0ZSBpdCBsaWtlIHNvOgogKiBgYGAKICogIFsnJywgJ2NvbG9yJywgJ3dpZHRoJywgJzEwMHB4J10sCiAqICBbJycsICdjb2xvcicsICdjb2xvcicsICdyZWQnXSwgICAgLy8gVVBEQVRFCiAqIGBgYAogKgogKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGlzIHN0b3JlZC4KICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIGZvciB3aGljaCB0aGUgc3R5bGluZyBpcyBiZWluZyBjb21wdXRlZC4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHBhcmFtIHs/fSB0U3R5bGluZ0tleSBOZXcgYFRTdHlsaW5nS2V5YCB3aGljaCBpcyByZXBsYWNpbmcgdGhlIG9sZCBvbmUuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRUZW1wbGF0ZUhlYWRUU3R5bGluZ0tleSh0RGF0YSwgdE5vZGUsIGlzQ2xhc3NCYXNlZCwgdFN0eWxpbmdLZXkpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdzID0gaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NCaW5kaW5ncyA6IHROb2RlLnN0eWxlQmluZGluZ3M7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RFcXVhbChnZXRUU3R5bGluZ1JhbmdlTmV4dChiaW5kaW5ncyksIDAsICdFeHBlY3RpbmcgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgdGVtcGxhdGUgc3R5bGluZyBiaW5kaW5nLicpOwogICAgdERhdGFbZ2V0VFN0eWxpbmdSYW5nZVByZXYoYmluZGluZ3MpXSA9IHRTdHlsaW5nS2V5Owp9Ci8qKgogKiBDb2xsZWN0IGFsbCBzdGF0aWMgdmFsdWVzIGFmdGVyIHRoZSBjdXJyZW50IGBUTm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdGAgaW5kZXguCiAqCiAqIENvbGxlY3QgdGhlIHJlbWFpbmluZyBzdHlsaW5nIGluZm9ybWF0aW9uIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gY29sbGVjdGVkIGJ5IGFuIGV4aXN0aW5nCiAqIHN0eWxpbmcgaW5zdHJ1Y3Rpb24uCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgYERpcmVjdGl2ZURlZnNgIGFyZSBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB3aGljaCBjb250YWlucyB0aGUgZGlyZWN0aXZlIHJhbmdlLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29sbGVjdFJlc2lkdWFsKHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzaWR1YWwgPSB1bmRlZmluZWQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaXJlY3RpdmVFbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RFcXVhbCh0Tm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdCwgLTEsICdCeSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGF0IGxlYXN0IG9uZSBob3N0QmluZGluZ3Mtbm9kZSBzdHlsaW5nIGluc3RydWN0aW9uIG11c3QgaGF2ZSBleGVjdXRlZC4nKTsKICAgIC8vIFdlIGFkZCBgMSArIHROb2RlLmRpcmVjdGl2ZVN0YXJ0YCBiZWNhdXNlIHdlIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBkaXJlY3RpdmUgKGFzIHdlIGFyZQogICAgLy8gY29sbGVjdGluZyB0aGluZ3MgYWZ0ZXIgdGhlIGxhc3QgYGhvc3RCaW5kaW5nc2AgZGlyZWN0aXZlIHdoaWNoIGhhZCBhIHN0eWxpbmcgaW5zdHJ1Y3Rpb24uKQogICAgZm9yIChsZXQgaSA9IDEgKyB0Tm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdDsgaSA8IGRpcmVjdGl2ZUVuZDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF0dHJzID0gKCgvKiogQHR5cGUgez99ICovICh0RGF0YVtpXSkpKS5ob3N0QXR0cnM7CiAgICAgICAgcmVzaWR1YWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHJlc2lkdWFsLCBhdHRycywgaXNDbGFzc0Jhc2VkKSkpOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChjb2xsZWN0U3R5bGluZ0Zyb21UQXR0cnMocmVzaWR1YWwsIHROb2RlLmF0dHJzLCBpc0NsYXNzQmFzZWQpKSk7Cn0KLyoqCiAqIENvbGxlY3QgdGhlIHN0YXRpYyBzdHlsaW5nIGluZm9ybWF0aW9uIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiBgaG9zdERpcmVjdGl2ZURlZmAuCiAqCiAqIChUaGlzIGlzIG9wcG9zaXRlIG9mIHJlc2lkdWFsIHN0eWxpbmcuKQogKgogKiBAcGFyYW0gez99IGhvc3REaXJlY3RpdmVEZWYgYERpcmVjdGl2ZURlZmAgZm9yIHdoaWNoIHdlIHdhbnQgdG8gY29sbGVjdCBsb3dlciBwcmlvcml0eSBzdGF0aWMKICogICAgICAgIHN0eWxpbmcuIChPciBgbnVsbGAgaWYgdGVtcGxhdGUgc3R5bGluZykKICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHdoZXJlIHRoZSBsaW5rZWQgbGlzdCBpcyBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCBmb3Igd2hpY2ggdGhlIHN0eWxpbmcgaXMgYmVpbmcgY29tcHV0ZWQuCiAqIEBwYXJhbSB7P30gc3R5bGluZ0tleSBFeGlzdGluZyBgVFN0eWxpbmdLZXlgIHRvIHVwZGF0ZSBvciB3cmFwLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29sbGVjdFN0eWxpbmdGcm9tRGlyZWN0aXZlcyhob3N0RGlyZWN0aXZlRGVmLCB0RGF0YSwgdE5vZGUsIHN0eWxpbmdLZXksIGlzQ2xhc3NCYXNlZCkgewogICAgLy8gV2UgbmVlZCB0byBsb29wIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBgaG9zdEF0dHJzYCBidXQgZG9uJ3QgaGF2ZQogICAgLy8gYGhvc3RCaW5kaW5nc2Agc28gdGhpcyBsb29wIGNhdGNoZXMgdXAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0aXZlLi4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXJyZW50RGlyZWN0aXZlID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZUVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaXJlY3RpdmVTdHlsaW5nTGFzdCA9IHROb2RlLmRpcmVjdGl2ZVN0eWxpbmdMYXN0OwogICAgaWYgKGRpcmVjdGl2ZVN0eWxpbmdMYXN0ID09PSAtMSkgewogICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBkaXJlY3RpdmVTdHlsaW5nTGFzdCsrOwogICAgfQogICAgd2hpbGUgKGRpcmVjdGl2ZVN0eWxpbmdMYXN0IDwgZGlyZWN0aXZlRW5kKSB7CiAgICAgICAgY3VycmVudERpcmVjdGl2ZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtkaXJlY3RpdmVTdHlsaW5nTGFzdF0pKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjdXJyZW50RGlyZWN0aXZlLCAnZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCcpOwogICAgICAgIHN0eWxpbmdLZXkgPSBjb2xsZWN0U3R5bGluZ0Zyb21UQXR0cnMoc3R5bGluZ0tleSwgY3VycmVudERpcmVjdGl2ZS5ob3N0QXR0cnMsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgaWYgKGN1cnJlbnREaXJlY3RpdmUgPT09IGhvc3REaXJlY3RpdmVEZWYpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0Kys7CiAgICB9CiAgICBpZiAoaG9zdERpcmVjdGl2ZURlZiAhPT0gbnVsbCkgewogICAgICAgIC8vIHdlIG9ubHkgYWR2YW5jZSB0aGUgc3R5bGluZyBjdXJzb3IgaWYgd2UgYXJlIGNvbGxlY3RpbmcgZGF0YSBmcm9tIGhvc3QgYmluZGluZ3MuCiAgICAgICAgLy8gVGVtcGxhdGUgZXhlY3V0ZXMgYmVmb3JlIGhvc3QgYmluZGluZ3MgYW5kIHNvIGlmIHdlIHdvdWxkIHVwZGF0ZSB0aGUgaW5kZXgsCiAgICAgICAgLy8gaG9zdCBiaW5kaW5ncyB3b3VsZCBub3QgZ2V0IHRoZWlyIHN0YXRpY3MuCiAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgIH0KICAgIHJldHVybiBzdHlsaW5nS2V5Owp9Ci8qKgogKiBDb252ZXJ0IGBUQXR0cnNgIGludG8gYFRTdHlsaW5nU3RhdGljYC4KICoKICogQHBhcmFtIHs/fSBzdHlsaW5nS2V5IGV4aXN0aW5nIGBUU3R5bGluZ0tleWAgdG8gdXBkYXRlIG9yIHdyYXAuCiAqIEBwYXJhbSB7P30gYXR0cnMgYFRBdHRyaWJ1dGVzYCB0byBwcm9jZXNzLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHN0eWxpbmdLZXksIGF0dHJzLCBpc0NsYXNzQmFzZWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlc2lyZWRNYXJrZXIgPSBpc0NsYXNzQmFzZWQgPyAxIC8qIENsYXNzZXMgKi8gOiAyIC8qIFN0eWxlcyAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXJyZW50TWFya2VyID0gLTEgLyogSW1wbGljaXRBdHRyaWJ1dGVzICovOwogICAgaWYgKGF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaV0pKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1hcmtlciA9PT0gZGVzaXJlZE1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHlsaW5nS2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsaW5nS2V5ID0gc3R5bGluZ0tleSA9PT0gdW5kZWZpbmVkID8gW10gOiAoLyoqIEB0eXBlIHs/fSAqLyAoWycnLCBzdHlsaW5nS2V5XSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KCgvKiogQHR5cGUgez99ICovIChzdHlsaW5nS2V5KSksIGl0ZW0sIGlzQ2xhc3NCYXNlZCA/IHRydWUgOiBhdHRyc1srK2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHlsaW5nS2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogc3R5bGluZ0tleTsKfQovKioKICogUmV0cmlldmUgdGhlIGN1cnJlbnQgYERpcmVjdGl2ZURlZmAgd2hpY2ggaXMgYWN0aXZlIHdoZW4gYGhvc3RCaW5kaW5nc2Agc3R5bGUgaW5zdHJ1Y3Rpb24gaXMKICogYmVpbmcgZXhlY3V0ZWQgKG9yIGBudWxsYCBpZiB3ZSBhcmUgaW4gYHRlbXBsYXRlYC4pCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgQ3VycmVudCBgVERhdGFgIHdoZXJlIHRoZSBgRGlyZWN0aXZlRGVmYCB3aWxsIGJlIGxvb2tlZCB1cCBhdC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEhvc3REaXJlY3RpdmVEZWYodERhdGEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGdldEN1cnJlbnREaXJlY3RpdmVJbmRleCgpOwogICAgcmV0dXJuIGN1cnJlbnREaXJlY3RpdmVJbmRleCA9PT0gLTEgPyBudWxsIDogKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2N1cnJlbnREaXJlY3RpdmVJbmRleF0pKTsKfQovKioKICogQ29udmVydCB1c2VyIGlucHV0IHRvIGBLZXlWYWx1ZUFycmF5YC4KICoKICogVGhpcyBmdW5jdGlvbiB0YWtlcyB1c2VyIGlucHV0IHdoaWNoIGNvdWxkIGJlIGBzdHJpbmdgLCBPYmplY3QgbGl0ZXJhbCwgb3IgaXRlcmFibGUgYW5kIGNvbnZlcnRzCiAqIGl0IGludG8gYSBjb25zaXN0ZW50IHJlcHJlc2VudGF0aW9uLiBUaGUgb3V0cHV0IG9mIHRoaXMgaXMgYEtleVZhbHVlQXJyYXlgICh3aGljaCBpcyBhbiBhcnJheQogKiB3aGVyZQogKiBldmVuIGluZGV4ZXMgY29udGFpbiBrZXlzIGFuZCBvZGQgaW5kZXhlcyBjb250YWluIHZhbHVlcyBmb3IgdGhvc2Uga2V5cykuCiAqCiAqIFRoZSBhZHZhbnRhZ2Ugb2YgY29udmVydGluZyB0byBgS2V5VmFsdWVBcnJheWAgaXMgdGhhdCB3ZSBjYW4gcGVyZm9ybSBkaWZmIGluIGFuIGlucHV0CiAqIGluZGVwZW5kZW50CiAqIHdheS4KICogKGllIHdlIGNhbiBjb21wYXJlIGBmb28gYmFyYCB0byBgWydiYXInLCAnYmF6J10gYW5kIGRldGVybWluZSBhIHNldCBvZiBjaGFuZ2VzIHdoaWNoIG5lZWQgdG8gYmUKICogYXBwbGllZCkKICoKICogVGhlIGZhY3QgdGhhdCBgS2V5VmFsdWVBcnJheWAgaXMgc29ydGVkIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIGNvbXB1dGUgdGhlCiAqIGRpZmZlcmVuY2UgaW4gbGluZWFyIGZhc2hpb24gd2l0aG91dCB0aGUgbmVlZCB0byBhbGxvY2F0ZSBhbnkgYWRkaXRpb25hbCBkYXRhLgogKgogKiBGb3IgZXhhbXBsZSBpZiB3ZSBrZXB0IHRoaXMgYXMgYSBgTWFwYCB3ZSB3b3VsZCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBwcmV2aW91cyBgTWFwYCB0byBkZXRlcm1pbmUKICogd2hpY2ggdmFsdWVzIG5lZWQgdG8gYmUgZGVsZXRlZCwgb3ZlciB0aGUgbmV3IGBNYXBgIHRvIGRldGVybWluZSBhZGRpdGlvbnMsIGFuZCB3ZSB3b3VsZCBoYXZlIHRvCiAqIGtlZXAgYWRkaXRpb25hbCBgTWFwYCB0byBrZWVwIHRyYWNrIG9mIGR1cGxpY2F0ZXMgb3IgaXRlbXMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gdmlzaXRlZC4KICoKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5U2V0IChTZWUgYGtleVZhbHVlQXJyYXlTZXRgIGluICJ1dGlsL2FycmF5X3V0aWxzIikgR2V0cyBwYXNzZWQgaW4gYXMgYQogKiBmdW5jdGlvbiBzbyB0aGF0CiAqICAgICAgICBgc3R5bGVgIGNhbiBwYXNzIGluIHZlcnNpb24gd2hpY2ggZG9lcyBzYW5pdGl6YXRpb24uIFRoaXMgaXMgZG9uZSBmb3IgdHJlZSBzaGFraW5nCiAqICAgICAgICBwdXJwb3Nlcy4KICogQHBhcmFtIHs/fSBzdHJpbmdQYXJzZXIgVGhlIHBhcnNlciBpcyBwYXNzZWQgaW4gc28gdGhhdCBpdCB3aWxsIGJlIHRyZWUgc2hha2FibGUuIFNlZQogKiAgICAgICAgYHN0eWxlU3RyaW5nUGFyc2VyYCBhbmQgYGNsYXNzU3RyaW5nUGFyc2VyYAogKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXJzZS9jb252ZXJ0IHRvIGBLZXlWYWx1ZUFycmF5YAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9TdHlsaW5nS2V5VmFsdWVBcnJheShrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gbnVsbCAvKnx8IHZhbHVlID09PSB1bmRlZmluZWQgKi8gfHwgdmFsdWUgPT09ICcnKQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoRU1QVFlfQVJSQVkkMykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3R5bGVLZXlWYWx1ZUFycmF5ID0gKC8qKiBAdHlwZSB7P30gKi8gKFtdKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1bndyYXBwZWRWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovICh1bndyYXBTYWZlVmFsdWUodmFsdWUpKSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh1bndyYXBwZWRWYWx1ZSkpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVud3JhcHBlZFZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGtleVZhbHVlQXJyYXlTZXQoc3R5bGVLZXlWYWx1ZUFycmF5LCB1bndyYXBwZWRWYWx1ZVtpXSwgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAodHlwZW9mIHVud3JhcHBlZFZhbHVlID09PSAnb2JqZWN0JykgewogICAgICAgIGZvciAoY29uc3Qga2V5IGluIHVud3JhcHBlZFZhbHVlKSB7CiAgICAgICAgICAgIGlmICh1bndyYXBwZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KHN0eWxlS2V5VmFsdWVBcnJheSwga2V5LCB1bndyYXBwZWRWYWx1ZVtrZXldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiB1bndyYXBwZWRWYWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBzdHJpbmdQYXJzZXIoc3R5bGVLZXlWYWx1ZUFycmF5LCB1bndyYXBwZWRWYWx1ZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgdGhyb3dFcnJvciQxKCdVbnN1cHBvcnRlZCBzdHlsaW5nIHR5cGUgJyArIHR5cGVvZiB1bndyYXBwZWRWYWx1ZSArICc6ICcgKyB1bndyYXBwZWRWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gc3R5bGVLZXlWYWx1ZUFycmF5Owp9Ci8qKgogKiBTZXQgYSBgdmFsdWVgIGZvciBhIGBrZXlgIHRha2luZyBzdHlsZSBzYW5pdGl6YXRpb24gaW50byBhY2NvdW50LgogKgogKiBTZWU6IGBrZXlWYWx1ZUFycmF5U2V0YCBmb3IgZGV0YWlscwogKgogKiBAcGFyYW0gez99IGtleVZhbHVlQXJyYXkgS2V5VmFsdWVBcnJheSB0byBhZGQgdG8uCiAqIEBwYXJhbSB7P30ga2V5IFN0eWxlIGtleSB0byBhZGQuIChUaGlzIGtleSB3aWxsIGJlIGNoZWNrZWQgaWYgaXQgbmVlZHMgc2FuaXRpemF0aW9uKQogKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgKElmIGtleSBuZWVkcyBzYW5pdGl6YXRpb24gaXQgd2lsbCBiZSBzYW5pdGl6ZWQpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdHlsZUtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwga2V5LCB2YWx1ZSkgewogICAgaWYgKHN0eWxlUHJvcE5lZWRzU2FuaXRpemF0aW9uKGtleSkpIHsKICAgICAgICB2YWx1ZSA9IMm1ybVzYW5pdGl6ZVN0eWxlKHZhbHVlKTsKICAgIH0KICAgIGtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwga2V5LCB2YWx1ZSk7Cn0KLyoqCiAqIFVwZGF0ZSBtYXAgYmFzZWQgc3R5bGluZy4KICoKICogTWFwIGJhc2VkIHN0eWxpbmcgY291bGQgYmUgYW55dGhpbmcgd2hpY2ggY29udGFpbnMgbW9yZSB0aGFuIG9uZSBiaW5kaW5nLiBGb3IgZXhhbXBsZSBgc3RyaW5nYCwKICogb3Igb2JqZWN0IGxpdGVyYWwuIERlYWxpbmcgd2l0aCBhbGwgb2YgdGhlc2UgdHlwZXMgd291bGQgY29tcGxpY2F0ZSB0aGUgbG9naWMgc28KICogaW5zdGVhZCB0aGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCB0aGUgY29tcGxleCBpbnB1dCBpcyBmaXJzdCBjb252ZXJ0ZWQgaW50byBub3JtYWxpemVkCiAqIGBLZXlWYWx1ZUFycmF5YC4gVGhlIGFkdmFudGFnZSBvZiBub3JtYWxpemF0aW9uIGlzIHRoYXQgd2UgZ2V0IHRoZSB2YWx1ZXMgc29ydGVkLCB3aGljaCBtYWtlcyBpdAogKiB2ZXJ5IGNoZWFwIHRvIGNvbXB1dGUgZGVsdGFzIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHZhbHVlLgogKgogKiBAcGFyYW0gez99IHRWaWV3IEFzc29jaWF0ZWQgYFRWaWV3LmRhdGFgIGNvbnRhaW5zIHRoZSBsaW5rZWQgbGlzdCBvZiBiaW5kaW5nIHByaW9yaXRpZXMuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB3aGVyZSB0aGUgYmluZGluZyBpcyBsb2NhdGVkLgogKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgY29udGFpbnMgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgc3R5bGluZyBiaW5kaW5nIGF0IHRoaXMgYFROb2RlYC4KICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UgaWYgYW55IHVwZGF0ZXMuCiAqIEBwYXJhbSB7P30gb2xkS2V5VmFsdWVBcnJheSBQcmV2aW91cyB2YWx1ZSByZXByZXNlbnRlZCBhcyBgS2V5VmFsdWVBcnJheWAKICogQHBhcmFtIHs/fSBuZXdLZXlWYWx1ZUFycmF5IEN1cnJlbnQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYEtleVZhbHVlQXJyYXlgCiAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4IEJpbmRpbmcgaW5kZXggb2YgdGhlIGJpbmRpbmcuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1cGRhdGVTdHlsaW5nTWFwKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHJlbmRlcmVyLCBvbGRLZXlWYWx1ZUFycmF5LCBuZXdLZXlWYWx1ZUFycmF5LCBpc0NsYXNzQmFzZWQsIGJpbmRpbmdJbmRleCkgewogICAgaWYgKCgvKiogQHR5cGUgez99ICovIChvbGRLZXlWYWx1ZUFycmF5KSkgPT09IE5PX0NIQU5HRSkgewogICAgICAgIC8vIE9uIGZpcnN0IGV4ZWN1dGlvbiB0aGUgb2xkS2V5VmFsdWVBcnJheSBpcyBOT19DSEFOR0UgPT4gdHJlYXQgaXQgYXMgZW1wdHkgS2V5VmFsdWVBcnJheS4KICAgICAgICBvbGRLZXlWYWx1ZUFycmF5ID0gKC8qKiBAdHlwZSB7P30gKi8gKEVNUFRZX0FSUkFZJDMpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBvbGRJbmRleCA9IDA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV3SW5kZXggPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG9sZEtleSA9IDAgPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbMF0gOiBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5ld0tleSA9IDAgPCBuZXdLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG5ld0tleVZhbHVlQXJyYXlbMF0gOiBudWxsOwogICAgd2hpbGUgKG9sZEtleSAhPT0gbnVsbCB8fCBuZXdLZXkgIT09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TGVzc1RoYW4ob2xkSW5kZXgsIDk5OSwgJ0FyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPycpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMZXNzVGhhbihuZXdJbmRleCwgOTk5LCAnQXJlIHdlIHN0dWNrIGluIGluZmluaXRlIGxvb3A/Jyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkSW5kZXggPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbb2xkSW5kZXggKyAxXSA6IHVuZGVmaW5lZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXdJbmRleCA8IG5ld0tleVZhbHVlQXJyYXkubGVuZ3RoID8gbmV3S2V5VmFsdWVBcnJheVtuZXdJbmRleCArIDFdIDogdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2V0S2V5ID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNldFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChvbGRLZXkgPT09IG5ld0tleSkgewogICAgICAgICAgICAvLyBVUERBVEU6IEtleXMgYXJlIGVxdWFsID0+IG5ldyB2YWx1ZSBpcyBvdmVyd3JpdGluZyBvbGQgdmFsdWUuCiAgICAgICAgICAgIG9sZEluZGV4ICs9IDI7CiAgICAgICAgICAgIG5ld0luZGV4ICs9IDI7CiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIHNldEtleSA9IG5ld0tleTsKICAgICAgICAgICAgICAgIHNldFZhbHVlID0gbmV3VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmV3S2V5ID09PSBudWxsIHx8IG9sZEtleSAhPT0gbnVsbCAmJiBvbGRLZXkgPCAoLyoqIEB0eXBlIHs/fSAqLyAobmV3S2V5KSkpIHsKICAgICAgICAgICAgLy8gREVMRVRFOiBvbGRLZXkga2V5IGlzIG1pc3Npbmcgb3Igd2UgZGlkIG5vdCBmaW5kIHRoZSBvbGRLZXkgaW4gdGhlIG5ld1ZhbHVlCiAgICAgICAgICAgIC8vIChiZWNhdXNlIHRoZSBrZXlWYWx1ZUFycmF5IGlzIHNvcnRlZCBhbmQgYG5ld0tleWAgaXMgZm91bmQgbGF0ZXIgYWxwaGFiZXRpY2FsbHkpLgogICAgICAgICAgICAvLyBgImJhY2tncm91bmQiIDwgImNvbG9yImAgc28gd2UgbmVlZCB0byBkZWxldGUgYCJiYWNrZ3JvdW5kImAgYmVjYXVzZSBpdCBpcyBub3QgZm91bmQgaW4gdGhlCiAgICAgICAgICAgIC8vIG5ldyBhcnJheS4KICAgICAgICAgICAgb2xkSW5kZXggKz0gMjsKICAgICAgICAgICAgc2V0S2V5ID0gb2xkS2V5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQ1JFQVRFOiBuZXdLZXkncyBpcyBlYXJsaWVyIGFscGhhYmV0aWNhbGx5IHRoYW4gb2xkS2V5J3MgKG9yIG5vIG9sZEtleSkgPT4gd2UgaGF2ZSBuZXcga2V5LgogICAgICAgICAgICAvLyBgImNvbG9yIiA+ICJiYWNrZ3JvdW5kImAgc28gd2UgbmVlZCB0byBhZGQgYGNvbG9yYCBiZWNhdXNlIGl0IGlzIGluIG5ldyBhcnJheSBidXQgbm90IGluCiAgICAgICAgICAgIC8vIG9sZCBhcnJheS4KICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobmV3S2V5LCAnRXhwZWN0aW5nIHRvIGhhdmUgYSB2YWxpZCBrZXknKTsKICAgICAgICAgICAgbmV3SW5kZXggKz0gMjsKICAgICAgICAgICAgc2V0S2V5ID0gbmV3S2V5OwogICAgICAgICAgICBzZXRWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoc2V0S2V5ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHVwZGF0ZVN0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgcmVuZGVyZXIsIHNldEtleSwgc2V0VmFsdWUsIGlzQ2xhc3NCYXNlZCwgYmluZGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgb2xkS2V5ID0gb2xkSW5kZXggPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbb2xkSW5kZXhdIDogbnVsbDsKICAgICAgICBuZXdLZXkgPSBuZXdJbmRleCA8IG5ld0tleVZhbHVlQXJyYXkubGVuZ3RoID8gbmV3S2V5VmFsdWVBcnJheVtuZXdJbmRleF0gOiBudWxsOwogICAgfQp9Ci8qKgogKiBVcGRhdGUgYSBzaW1wbGUgKHByb3BlcnR5IG5hbWUpIHN0eWxpbmcuCiAqCiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYHByb3BgIGFuZCB1cGRhdGVzIHRoZSBET00gdG8gdGhhdCB2YWx1ZS4gVGhlIGZ1bmN0aW9uIHRha2VzIHRoZSBiaW5kaW5nCiAqIHZhbHVlIGFzIHdlbGwgYXMgYmluZGluZyBwcmlvcml0eSBpbnRvIGNvbnNpZGVyYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuCiAqIHRvIERPTS4gKEZvciBleGFtcGxlIGl0IG1heSBiZSBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgYSBoaWdoZXIgcHJpb3JpdHkgb3ZlcndyaXRlIHdoaWNoIGJsb2NrcwogKiB0aGUgRE9NIHdyaXRlLCBvciBpZiB0aGUgdmFsdWUgZ29lcyB0byBgdW5kZWZpbmVkYCBhIGxvd2VyIHByaW9yaXR5IG92ZXJ3cml0ZSBtYXkgYmUgY29uc3VsdGVkLikKICoKICogQHBhcmFtIHs/fSB0VmlldyBBc3NvY2lhdGVkIGBUVmlldy5kYXRhYCBjb250YWlucyB0aGUgbGlua2VkIGxpc3Qgb2YgYmluZGluZyBwcmlvcml0aWVzLgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hlcmUgdGhlIGJpbmRpbmcgaXMgbG9jYXRlZC4KICogQHBhcmFtIHs/fSBsVmlldyBgTFZpZXdgIGNvbnRhaW5zIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHN0eWxpbmcgYmluZGluZyBhdCB0aGlzIGBUTm9kZWAuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIgUmVuZGVyZXIgdG8gdXNlIGlmIGFueSB1cGRhdGVzLgogKiBAcGFyYW0gez99IHByb3AgRWl0aGVyIHN0eWxlIHByb3BlcnR5IG5hbWUgb3IgYSBjbGFzcyBuYW1lLgogKiBAcGFyYW0gez99IHZhbHVlIEVpdGhlciBzdHlsZSB2YWx1ZSBmb3IgYHByb3BgIG9yIGB0cnVlYC9gZmFsc2VgIGlmIGBwcm9wYCBpcyBjbGFzcy4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggQmluZGluZyBpbmRleCBvZiB0aGUgYmluZGluZy4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVwZGF0ZVN0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgcmVuZGVyZXIsIHByb3AsIHZhbHVlLCBpc0NsYXNzQmFzZWQsIGJpbmRpbmdJbmRleCkgewogICAgaWYgKHROb2RlLnR5cGUgIT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc3R5bGluZyBvbiBub24tZWxlbWVudHMgKHN1Y2ggYXMgbmctY29udGFpbmVyKS4KICAgICAgICAvLyBUaGlzIGlzIHJhcmUsIGJ1dCBpdCBkb2VzIGhhcHBlbi4gSW4gc3VjaCBhIGNhc2UsIGp1c3QgaWdub3JlIHRoZSBiaW5kaW5nLgogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHREYXRhID0gdFZpZXcuZGF0YTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRSYW5nZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtiaW5kaW5nSW5kZXggKyAxXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaGlnaGVyUHJpb3JpdHlWYWx1ZSA9IGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRSYW5nZSkgPwogICAgICAgIGZpbmRTdHlsaW5nVmFsdWUodERhdGEsIHROb2RlLCBsVmlldywgcHJvcCwgZ2V0VFN0eWxpbmdSYW5nZU5leHQodFJhbmdlKSwgaXNDbGFzc0Jhc2VkKSA6CiAgICAgICAgdW5kZWZpbmVkOwogICAgaWYgKCFpc1N0eWxpbmdWYWx1ZVByZXNlbnQoaGlnaGVyUHJpb3JpdHlWYWx1ZSkpIHsKICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGEgbmV4dCBkdXBsaWNhdGUsIG9yIHdlIGRpZCBub3QgZmluZCBhIGR1cGxpY2F0ZSB2YWx1ZS4KICAgICAgICBpZiAoIWlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSkpIHsKICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRlbGV0ZSBjdXJyZW50IHZhbHVlIG9yIHJlc3RvcmUgdG8gbG93ZXIgcHJpb3JpdHkgdmFsdWUuCiAgICAgICAgICAgIGlmIChnZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0UmFuZ2UpKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcG9zc2libGUgcHJldiBkdXBsaWNhdGUsIGxldCdzIHJldHJpZXZlIGl0LgogICAgICAgICAgICAgICAgdmFsdWUgPSBmaW5kU3R5bGluZ1ZhbHVlKHREYXRhLCBudWxsLCBsVmlldywgcHJvcCwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeUluZGV4KGdldFNlbGVjdGVkSW5kZXgoKSwgbFZpZXcpKSk7CiAgICAgICAgYXBwbHlTdHlsaW5nKHJlbmRlcmVyLCBpc0NsYXNzQmFzZWQsIHJOb2RlLCBwcm9wLCB2YWx1ZSk7CiAgICB9Cn0KLyoqCiAqIFNlYXJjaCBmb3Igc3R5bGluZyB2YWx1ZSB3aXRoIGhpZ2hlciBwcmlvcml0eSB3aGljaCBpcyBvdmVyd3JpdGluZyBjdXJyZW50IHZhbHVlLCBvciBhCiAqIHZhbHVlIG9mIGxvd2VyIHByaW9yaXR5IHRvIHdoaWNoIHdlIHNob3VsZCBmYWxsIGJhY2sgaWYgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLgogKgogKiBXaGVuIHZhbHVlIGlzIGJlaW5nIGFwcGxpZWQgYXQgYSBsb2NhdGlvbiwgcmVsYXRlZCB2YWx1ZXMgbmVlZCB0byBiZSBjb25zdWx0ZWQuCiAqIC0gSWYgdGhlcmUgaXMgYSBoaWdoZXIgcHJpb3JpdHkgYmluZGluZywgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoYXQgb25lIGluc3RlYWQuCiAqICAgRm9yIGV4YW1wbGUgYDxkaXYgIFtzdHlsZV09Intjb2xvcjpleHAxfSIgW3N0eWxlLmNvbG9yXT0iZXhwMiI+YCBjaGFuZ2UgdG8gYGV4cDFgCiAqICAgcmVxdWlyZXMgdGhhdCB3ZSBjaGVjayBgZXhwMmAgdG8gc2VlIGlmIGl0IGlzIHNldCB0byB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLgogKiAtIElmIHRoZXJlIGlzIGEgbG93ZXIgcHJpb3JpdHkgYmluZGluZyBhbmQgd2UgYXJlIGNoYW5naW5nIHRvIGB1bmRlZmluZWRgCiAqICAgRm9yIGV4YW1wbGUgYDxkaXYgIFtzdHlsZV09Intjb2xvcjpleHAxfSIgW3N0eWxlLmNvbG9yXT0iZXhwMiI+YCBjaGFuZ2UgdG8gYGV4cDJgIHRvCiAqICAgYHVuZGVmaW5lZGAgcmVxdWlyZXMgdGhhdCB3ZSBjaGVjayBgZXhwMWAgKGFuZCBzdGF0aWMgdmFsdWVzKSBhbmQgdXNlIHRoYXQgYXMgbmV3IHZhbHVlLgogKgogKiBOT1RFOiBUaGUgc3R5bGluZyBzdG9yZXMgdHdvIHZhbHVlcy4KICogMS4gVGhlIHJhdyB2YWx1ZSB3aGljaCBjYW1lIGZyb20gdGhlIGFwcGxpY2F0aW9uIGlzIHN0b3JlZCBhdCBgaW5kZXggKyAwYCBsb2NhdGlvbi4gKFRoaXMgdmFsdWUKICogICAgaXMgdXNlZCBmb3IgZGlydHkgY2hlY2tpbmcpLgogKiAyLiBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoY29udmVydGVkIHRvIGBLZXlWYWx1ZUFycmF5YCBpZiBtYXAgYW5kIHNhbml0aXplZCkgaXMgc3RvcmVkIGF0IGBpbmRleCArCiAqIDFgLgogKiAgICBUaGUgYWR2YW50YWdlIG9mIHN0b3JpbmcgdGhlIHNhbml0aXplZCB2YWx1ZSBpcyB0aGF0IG9uY2UgdGhlIHZhbHVlIGlzIHdyaXR0ZW4gd2UgZG9uJ3QgbmVlZAogKiAgICB0byB3b3JyeSBhYm91dCBzYW5pdGl6aW5nIGl0IGxhdGVyIG9yIGtlZXBpbmcgdHJhY2sgb2YgdGhlIHNhbml0aXplci4KICoKICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIHByaW9yaXR5LgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgdG8gdXNlIGZvciByZXNvbHZpbmcgc3RhdGljIHN0eWxpbmcuIEFsc28gY29udHJvbHMgc2VhcmNoIGRpcmVjdGlvbi4KICogICAtIGBUTm9kZWAgc2VhcmNoIG5leHQgYW5kIHF1aXQgYXMgc29vbiBhcyBgaXNTdHlsaW5nVmFsdWVQcmVzZW50KHZhbHVlKWAgaXMgdHJ1ZS4KICogICAgICBJZiBubyB2YWx1ZSBmb3VuZCBjb25zdWx0IGB0Tm9kZS5yZXNpZHVhbFN0eWxlYC9gdE5vZGUucmVzaWR1YWxDbGFzc2AgZm9yIGRlZmF1bHQgdmFsdWUuCiAqICAgLSBgbnVsbGAgc2VhcmNoIHByZXYgYW5kIGdvIGFsbCB0aGUgd2F5IHRvIGVuZC4gUmV0dXJuIGxhc3QgdmFsdWUgd2hlcmUKICogICAgIGBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpYCBpcyB0cnVlLgogKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0dWFsIHZhbHVlcy4KICogQHBhcmFtIHs/fSBwcm9wIFByb3BlcnR5IHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkIGluLgogKiBAcGFyYW0gez99IGluZGV4IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBsaW5rZWQgbGlzdCBvZiBzdHlsaW5nIGJpbmRpbmdzIHdoZXJlIHRoZSBzZWFyY2ggc2hvdWxkIHN0YXJ0LgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmluZFN0eWxpbmdWYWx1ZSh0RGF0YSwgdE5vZGUsIGxWaWV3LCBwcm9wLCBpbmRleCwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvLyBgVE5vZGVgIHRvIHVzZSBmb3IgcmVzb2x2aW5nIHN0YXRpYyBzdHlsaW5nLiBBbHNvIGNvbnRyb2xzIHNlYXJjaCBkaXJlY3Rpb24uCiAgICAvLyAgIC0gYFROb2RlYCBzZWFyY2ggbmV4dCBhbmQgcXVpdCBhcyBzb29uIGFzIGBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpYCBpcyB0cnVlLgogICAgLy8gICAgICBJZiBubyB2YWx1ZSBmb3VuZCBjb25zdWx0IGB0Tm9kZS5yZXNpZHVhbFN0eWxlYC9gdE5vZGUucmVzaWR1YWxDbGFzc2AgZm9yIGRlZmF1bHQgdmFsdWUuCiAgICAvLyAgIC0gYG51bGxgIHNlYXJjaCBwcmV2IGFuZCBnbyBhbGwgdGhlIHdheSB0byBlbmQuIFJldHVybiBsYXN0IHZhbHVlIHdoZXJlCiAgICAvLyAgICAgYGlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSlgIGlzIHRydWUuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpc1ByZXZEaXJlY3Rpb24gPSB0Tm9kZSA9PT0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgIHdoaWxlIChpbmRleCA+IDApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmF3S2V5ID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4XSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluc1N0YXRpY3MgPSBBcnJheS5pc0FycmF5KHJhd0tleSk7CiAgICAgICAgLy8gVW53cmFwIHRoZSBrZXkgaWYgd2UgY29udGFpbiBzdGF0aWMgdmFsdWVzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBrZXkgPSBjb250YWluc1N0YXRpY3MgPyAoKC8qKiBAdHlwZSB7P30gKi8gKHJhd0tleSkpKVsxXSA6IHJhd0tleTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNTdHlsaW5nTWFwID0ga2V5ID09PSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsdWVBdExWaWV3SW5kZXggPSBsVmlld1tpbmRleCArIDFdOwogICAgICAgIGlmICh2YWx1ZUF0TFZpZXdJbmRleCA9PT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8vIEluIGZpcnN0VXBkYXRlUGFzcyB0aGUgc3R5bGluZyBpbnN0cnVjdGlvbnMgY3JlYXRlIGEgbGlua2VkIGxpc3Qgb2Ygc3R5bGluZy4KICAgICAgICAgICAgLy8gT24gc3Vic2VxdWVudCBwYXNzZXMgaXQgaXMgcG9zc2libGUgZm9yIGEgc3R5bGluZyBpbnN0cnVjdGlvbiB0byB0cnkgdG8gcmVhZCBhIGJpbmRpbmcKICAgICAgICAgICAgLy8gd2hpY2gKICAgICAgICAgICAgLy8gaGFzIG5vdCB5ZXQgZXhlY3V0ZWQuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGZpbmQgYE5PX0NIQU5HRWAgYW5kIHdlIHNob3VsZCBhc3N1bWUgdGhhdAogICAgICAgICAgICAvLyB3ZSBoYXZlIGB1bmRlZmluZWRgIChvciBlbXB0eSBhcnJheSBpbiBjYXNlIG9mIHN0eWxpbmctbWFwIGluc3RydWN0aW9uKSBpbnN0ZWFkLiBUaGlzCiAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgcmVzb2x1dGlvbiB0byBhcHBseSB0aGUgdmFsdWUgKHdoaWNoIG1heSBsYXRlciBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZQogICAgICAgICAgICAvLyBiaW5kaW5nIGFjdHVhbGx5IGV4ZWN1dGVzLikKICAgICAgICAgICAgdmFsdWVBdExWaWV3SW5kZXggPSBpc1N0eWxpbmdNYXAgPyBFTVBUWV9BUlJBWSQzIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZSA9IGlzU3R5bGluZ01hcCA/IGtleVZhbHVlQXJyYXlHZXQodmFsdWVBdExWaWV3SW5kZXgsIHByb3ApIDoKICAgICAgICAgICAga2V5ID09PSBwcm9wID8gdmFsdWVBdExWaWV3SW5kZXggOiB1bmRlZmluZWQ7CiAgICAgICAgaWYgKGNvbnRhaW5zU3RhdGljcyAmJiAhaXNTdHlsaW5nVmFsdWVQcmVzZW50KGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgY3VycmVudFZhbHVlID0ga2V5VmFsdWVBcnJheUdldCgoLyoqIEB0eXBlIHs/fSAqLyAocmF3S2V5KSksIHByb3ApOwogICAgICAgIH0KICAgICAgICBpZiAoaXNTdHlsaW5nVmFsdWVQcmVzZW50KGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgdmFsdWUgPSBjdXJyZW50VmFsdWU7CiAgICAgICAgICAgIGlmIChpc1ByZXZEaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFJhbmdlID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKTsKICAgICAgICBpbmRleCA9IGlzUHJldkRpcmVjdGlvbiA/IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRSYW5nZSkgOiBnZXRUU3R5bGluZ1JhbmdlTmV4dCh0UmFuZ2UpOwogICAgfQogICAgaWYgKHROb2RlICE9PSBudWxsKSB7CiAgICAgICAgLy8gaW4gY2FzZSB3aGVyZSB3ZSBhcmUgZ29pbmcgaW4gbmV4dCBkaXJlY3Rpb24gQU5EIHdlIGRpZCBub3QgZmluZCBhbnl0aGluZywgd2UgbmVlZCB0bwogICAgICAgIC8vIGNvbnN1bHQgcmVzaWR1YWwgc3R5bGluZwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzaWR1YWwgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5yZXNpZHVhbENsYXNzZXMgOiB0Tm9kZS5yZXNpZHVhbFN0eWxlczsKICAgICAgICBpZiAocmVzaWR1YWwgIT0gbnVsbCAvKiogT1IgcmVzaWR1YWwgIT09PSB1bmRlZmluZWQgKi8pIHsKICAgICAgICAgICAgdmFsdWUgPSBrZXlWYWx1ZUFycmF5R2V0KCgvKiogQHR5cGUgez99ICovIChyZXNpZHVhbCkpLCBwcm9wKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KLyoqCiAqIERldGVybWluZXMgaWYgdGhlIGJpbmRpbmcgdmFsdWUgc2hvdWxkIGJlIHVzZWQgKG9yIGlmIHRoZSB2YWx1ZSBpcyAndW5kZWZpbmVkJyBhbmQgaGVuY2UgcHJpb3JpdHkKICogcmVzb2x1dGlvbiBzaG91bGQgYmUgdXNlZC4pCiAqCiAqIEBwYXJhbSB7P30gdmFsdWUgQmluZGluZyBzdHlsZSB2YWx1ZS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSkgewogICAgLy8gQ3VycmVudGx5IG9ubHkgYHVuZGVmaW5lZGAgdmFsdWUgaXMgY29uc2lkZXJlZCBub24tYmluZGluZy4gVGhhdCBpcyBgdW5kZWZpbmVkYCBzYXlzIEkgZG9uJ3QKICAgIC8vIGhhdmUgYW4gb3BpbmlvbiBhcyB0byB3aGF0IHRoaXMgYmluZGluZyBzaG91bGQgYmUgYW5kIHlvdSBzaG91bGQgY29uc3VsdCBvdGhlciBiaW5kaW5ncyBieQogICAgLy8gcHJpb3JpdHkgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCB2YWx1ZS4KICAgIC8vIFRoaXMgaXMgZXh0cmFjdGVkIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHBsYWNlIHRvIGNvbnRyb2wgdGhpcy4KICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkOwp9Ci8qKgogKiBTYW5pdGl6ZXMgb3IgYWRkcyBzdWZmaXggdG8gdGhlIHZhbHVlLgogKgogKiBJZiB2YWx1ZSBpcyBgbnVsbGAvYHVuZGVmaW5lZGAgbm8gc3VmZml4IGlzIGFkZGVkCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBzdWZmaXhPclNhbml0aXplcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9ybWFsaXplQW5kQXBwbHlTdWZmaXhPclNhbml0aXplcih2YWx1ZSwgc3VmZml4T3JTYW5pdGl6ZXIpIHsKICAgIGlmICh2YWx1ZSA9PSBudWxsIC8qKiB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICovKSA7CiAgICBlbHNlIGlmICh0eXBlb2Ygc3VmZml4T3JTYW5pdGl6ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAvLyBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAgICAgICAgdmFsdWUgPSBzdWZmaXhPclNhbml0aXplcih2YWx1ZSk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2Ygc3VmZml4T3JTYW5pdGl6ZXIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSArIHN1ZmZpeE9yU2FuaXRpemVyOwogICAgfQogICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgewogICAgICAgIHZhbHVlID0gc3RyaW5naWZ5KHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSkpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9Ci8qKgogKiBUZXN0cyBpZiB0aGUgYFROb2RlYCBoYXMgaW5wdXQgc2hhZG93LgogKgogKiBBbiBpbnB1dCBzaGFkb3cgaXMgd2hlbiBhIGRpcmVjdGl2ZSBzdGVhbHMgKHNoYWRvd3MpIHRoZSBpbnB1dCBieSB1c2luZyBgXEBJbnB1dCgnc3R5bGUnKWAgb3IKICogYFxASW5wdXQoJ2NsYXNzJylgIGFzIGlucHV0LgogKgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hpY2ggd2Ugd291bGQgbGlrZSB0byBzZWUgaWYgaXQgaGFzIHNoYWRvdy4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc1N0eWxpbmdJbnB1dFNoYWRvdyh0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgKGlzQ2xhc3NCYXNlZCA/IDE2IC8qIGhhc0NsYXNzSW5wdXQgKi8gOiAzMiAvKiBoYXNTdHlsZUlucHV0ICovKSkgIT09IDA7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3RleHQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENyZWF0ZSBzdGF0aWMgdGV4dCBub2RlCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBub2RlIGluIHRoZSBkYXRhIGFycmF5CiAqIEBwYXJhbSB7Pz19IHZhbHVlIFN0YXRpYyBzdHJpbmcgdmFsdWUgdG8gd3JpdGUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1dGV4dChpbmRleCwgdmFsdWUgPSAnJykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ3RleHQgbm9kZXMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBhZGp1c3RlZEluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gdFZpZXcuZmlyc3RDcmVhdGVQYXNzID8KICAgICAgICBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBpbmRleCwgMyAvKiBFbGVtZW50ICovLCBudWxsLCBudWxsKSA6CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRleHROYXRpdmUgPSBsVmlld1thZGp1c3RlZEluZGV4XSA9IGNyZWF0ZVRleHROb2RlKHZhbHVlLCBsVmlld1tSRU5ERVJFUl0pOwogICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCB0ZXh0TmF0aXZlLCB0Tm9kZSk7CiAgICAvLyBUZXh0IG5vZGVzIGFyZSBzZWxmIGNsb3NpbmcuCiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIGZhbHNlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvdGV4dF9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggYSBsb25lIGJvdW5kIHZhbHVlCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQsIGFuIG5vIGFkZGl0aW9uYWwgdGV4dAogKiBzdXJyb3VuZHMgdGhhdCBpbnRlcnBvbGF0ZWQgdmFsdWU6CiAqCiAqIGBgYGh0bWwKICogPGRpdj57e3YwfX08L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXRleHRJbnRlcnBvbGF0ZSh2MCk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gdjAKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZSh2MCkgewogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoJycsIHYwLCAnJyk7CiAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX1zdWZmaXg8L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXRleHRJbnRlcnBvbGF0ZTEoJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTEocHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlMTsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGUyKCdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogKiBgYGAKICogQHNlZSB0ZXh0SW50ZXJwb2xhdGVWCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1dGV4dEludGVycG9sYXRlMihwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjIobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlMjsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyAzIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeDwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1dGV4dEludGVycG9sYXRlMygKICogJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1dGV4dEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICB0ZXh0QmluZGluZ0ludGVybmFsKGxWaWV3LCBnZXRTZWxlY3RlZEluZGV4KCksICgvKiogQHR5cGUgez99ICovIChpbnRlcnBvbGF0ZWQpKSk7CiAgICB9CiAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTM7Cn0KLyoqCiAqCiAqIFVwZGF0ZSB0ZXh0IGNvbnRlbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU0KAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICdzdWZmaXgnKTsKICogYGBgCiAqIEBzZWUgybXJtXRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTQocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlNDsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyA1IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU1KAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICdzdWZmaXgnKTsKICogYGBgCiAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXgKICogQHBhcmFtIHs/fSB2MAogKiBAcGFyYW0gez99IGkwCiAqIEBwYXJhbSB7P30gdjEKICogQHBhcmFtIHs/fSBpMQogKiBAcGFyYW0gez99IHYyCiAqIEBwYXJhbSB7P30gaTIKICogQHBhcmFtIHs/fSB2MwogKiBAcGFyYW0gez99IGkzCiAqIEBwYXJhbSB7P30gdjQKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTUocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZCA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICB0ZXh0QmluZGluZ0ludGVybmFsKGxWaWV3LCBnZXRTZWxlY3RlZEluZGV4KCksICgvKiogQHR5cGUgez99ICovIChpbnRlcnBvbGF0ZWQpKSk7CiAgICB9CiAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTU7Cn0KLyoqCiAqCiAqIFVwZGF0ZSB0ZXh0IGNvbnRlbnQgd2l0aCA2IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX1zdWZmaXg8L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXRleHRJbnRlcnBvbGF0ZTYoCiAqICAgICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogQHNlZSB0ZXh0SW50ZXJwb2xhdGVWCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gaTMKICogQHBhcmFtIHs/fSB2NAogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLiBcQHJldHVybnMgaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTYocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgfQogICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGU2Owp9Ci8qKgogKgogKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LgogKgogKiBVc2VkIHdoZW4gYSB0ZXh0IG5vZGUgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2PnByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeDwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1dGV4dEludGVycG9sYXRlNygKICogICAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBpMwogKiBAcGFyYW0gez99IHY0CiAqIEBwYXJhbSB7P30gaTQKICogQHBhcmFtIHs/fSB2NQogKiBAcGFyYW0gez99IGk1CiAqIEBwYXJhbSB7P30gdjYKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uNyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlNzsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDggYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU4KAogKiAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBpMwogKiBAcGFyYW0gez99IHY0CiAqIEBwYXJhbSB7P30gaTQKICogQHBhcmFtIHs/fSB2NQogKiBAcGFyYW0gez99IGk1CiAqIEBwYXJhbSB7P30gdjYKICogQHBhcmFtIHs/fSBpNgogKiBAcGFyYW0gez99IHY3CiAqIEBwYXJhbSB7P30gc3VmZml4CiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybV0ZXh0SW50ZXJwb2xhdGU4KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgfQogICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGU4Owp9Ci8qKgogKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggOSBvciBtb3JlIGJvdW5kIHZhbHVlcyBvdGhlciBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogKgogKiBgYGBodG1sCiAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19LXt7djd9fS17e3Y4fX0te3t2OX19c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGVWKAogKiAgWydwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJy0nLCB2OSwKICogICdzdWZmaXgnXSk7CiAqIGBgYAogKiAuCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHZhbHVlcyBUaGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYW5kIHRoZSBzdHJpbmdzIGluIGJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aAogKiBhIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICoKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlVjsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvY2xhc3NfbWFwX2ludGVycG9sYXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlMSgncHJlZml4JywgdjAsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMShwcmVmaXgsIHYwLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGludGVycG9sYXRlZFZhbHVlLCB0cnVlKTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBjbGFzcyBvbiBhbiBlbGVtZW50IHdpdGggMiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBjbGFzcz0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlMigncHJlZml4JywgdjAsICctJywgdjEsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMihwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUzKAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24zKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTQoCiAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU1KAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlNShwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU2KAogKiAgICAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlNihwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb242KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTcoCiAqICAgICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU4KAogKiAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTgocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAqCiAqIGBgYGh0bWwKICogPGRpdgogKiAgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlVigKICogIFsncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICctJywgdjksCiAqICAnc3VmZml4J10pOwogKiBgYGAKICogLgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICogYSBzdHJpbmcgcHJlZml4IGFuZCBlbmRpbmcgd2l0aCBhIHN0cmluZyBzdWZmaXguCiAqIChlLmcuIGBbJ3ByZWZpeCcsIHZhbHVlMCwgJy0nLCB2YWx1ZTEsICctJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3N0eWxlX21hcF9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlPSJrZXk6IHt7djB9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMSgna2V5OiAnLCB2MCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUxKHByZWZpeCwgdjAsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIoJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIocHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjIobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkyOiB7e3YxfX07IGtleTI6IHt7djJ9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMygKICogICAgICdrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24zKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU0KAogKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjQobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCk7CiAgICDJtcm1c3R5bGVNYXAoaW50ZXJwb2xhdGVkVmFsdWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlPSJrZXk6IHt7djB9fTsga2V5MToge3t2MX19OyBrZXkyOiB7e3YyfX07IGtleTM6IHt7djN9fTsga2V5NDoge3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU1KAogKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjUobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319OyBrZXk0OiB7e3Y0fX07CiAqICAgICAgICAgICAgIGtleTU6IHt7djV9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNigKICogICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnOyBrZXk1OiAnLCB2NSwKICogICAgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBvbiBhbiBlbGVtZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogKiAgICAgICAgICAgICBrZXk2OiB7e3Y2fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTcoCiAqICAgICdrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICc7IGtleTM6ICcsIHYzLCAnOyBrZXk0OiAnLCB2NCwgJzsga2V5NTogJywgdjUsCiAqICAgICc7IGtleTY6ICcsIHY2LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpOwogICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogKiAgICAgICAgICAgICBrZXk2OiB7e3Y2fX07IGtleTc6IHt7djd9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlOCgKICogICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnOyBrZXk1OiAnLCB2NSwKICogICAgJzsga2V5NjogJywgdjYsICc7IGtleTc6ICcsIHY3LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDkgb3IgbW9yZSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIG51bWJlciBvZiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGV4Y2VlZHMgOC4KICoKICogYGBgaHRtbAogKiA8ZGl2CiAqICBjbGFzcz0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogKiAgICAgICAgIGtleTY6IHt7djZ9fTsga2V5Nzoge3t2N319OyBrZXk4OiB7e3Y4fX07IGtleTk6IHt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlVigKICogICAgWydrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICc7IGtleTM6ICcsIHYzLCAnOyBrZXk0OiAnLCB2NCwgJzsga2V5NTogJywgdjUsCiAqICAgICAnOyBrZXk2OiAnLCB2NiwgJzsga2V5NzogJywgdjcsICc7IGtleTg6ICcsIHY4LCAnOyBrZXk5OiAnLCB2OSwgJ3N1ZmZpeCddKTsKICogYGBgCiAqIC4KICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gdmFsdWVzIFRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBhbmQgdGhlIHN0cmluZ3MgaW4tYmV0d2VlbiB0aG9zZSB2YWx1ZXMsIGJlZ2lubmluZyB3aXRoCiAqIGEgc3RyaW5nIHByZWZpeCBhbmQgZW5kaW5nIHdpdGggYSBzdHJpbmcgc3VmZml4LgogKiAoZS5nLiBgWydwcmVmaXgnLCB2YWx1ZTAsICc7IGtleTI6ICcsIHZhbHVlMSwgJzsga2V5MjogJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvc3R5bGVfcHJvcF9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxKDAsICdwcmVmaXgnLCB2MCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEocHJvcCwgcHJlZml4LCB2MCwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTE7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyKDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTIocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgsIHZhbHVlU3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24yKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCAzIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDMgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMoMCwgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlMyhwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUzOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0KDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQ7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNSBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1KDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTUocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgsIHZhbHVlU3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA2IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDYgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYoMCwgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlNihwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU2Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3KAogKiAgICAwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3AKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3KHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlOCgwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsCiAqICctJywgdjcsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3AKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU4KHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICByZXR1cm4gybXJtXN0eWxlUHJvcEludGVycG9sYXRlODsKfQovKioKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggOSBvciBtb3JlIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5CiAqIHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogKgogKiBgYGBodG1sCiAqIDxkaXYKICogIHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319LXt7djh9fS17e3Y5fX1zdWZmaXgiPgogKiA8L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlVigKICogIDAsIFsncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICctJywgdjksCiAqICAnc3VmZml4J10pOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHZhbHVlcyBUaGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYW5kIHRoZSBzdHJpbmdzIGluLWJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aAogKiBhIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYocHJvcCwgdmFsdWVzLCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKTsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVY7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2hvc3RfcHJvcGVydHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFVwZGF0ZSBhIHByb3BlcnR5IG9uIGEgaG9zdCBlbGVtZW50LiBPbmx5IGFwcGxpZXMgdG8gbmF0aXZlIG5vZGUgcHJvcGVydGllcywgbm90IGlucHV0cy4KICoKICogT3BlcmF0ZXMgb24gdGhlIGVsZW1lbnQgc2VsZWN0ZWQgYnkgaW5kZXggdmlhIHRoZSB7XEBsaW5rIHNlbGVjdH0gaW5zdHJ1Y3Rpb24uCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHByb3BOYW1lIE5hbWUgb2YgcHJvcGVydHkuIEJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gRE9NLCB0aGlzIGlzIG5vdCBzdWJqZWN0IHRvCiAqICAgICAgICByZW5hbWluZyBhcyBwYXJ0IG9mIG1pbmlmaWNhdGlvbi4KICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICogQHJldHVybiB7P30gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGl0c2VsZiBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkCiAqIChlLmcuIGBwcm9wZXJ0eSgnbmFtZScsIGN0eC5uYW1lKSgndGl0bGUnLCBjdHgudGl0bGUpYCkKICoKICovCmZ1bmN0aW9uIMm1ybVob3N0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCB0cnVlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGJpbmRpbmdJbmRleCk7CiAgICB9CiAgICByZXR1cm4gybXJtWhvc3RQcm9wZXJ0eTsKfQovKioKICogVXBkYXRlcyBhIHN5bnRoZXRpYyBob3N0IGJpbmRpbmcgKGUuZy4gYFtcQGZvb11gKSBvbiBhIGNvbXBvbmVudC4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBpcyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlcyBhbmQgaXMgZGVzaWduZWQgdG8gZW5zdXJlIHRoYXQgYQogKiBzeW50aGV0aWMgaG9zdCBiaW5kaW5nIChlLmcuIGBcQEhvc3RCaW5kaW5nKCdcQGZvbycpYCkgcHJvcGVybHkgZ2V0cyByZW5kZXJlZCBpbgogKiB0aGUgY29tcG9uZW50J3MgcmVuZGVyZXIuIE5vcm1hbGx5IGFsbCBob3N0IGJpbmRpbmdzIGFyZSBldmFsdWF0ZWQgd2l0aCB0aGUgcGFyZW50CiAqIGNvbXBvbmVudCdzIHJlbmRlcmVyLCBidXQsIGluIHRoZSBjYXNlIG9mIGFuaW1hdGlvbiBcQHRyaWdnZXJzLCB0aGV5IG5lZWQgdG8gYmUKICogZXZhbHVhdGVkIHdpdGggdGhlIHN1YiBjb21wb25lbnQncyByZW5kZXJlciAoYmVjYXVzZSB0aGF0J3Mgd2hlcmUgdGhlIGFuaW1hdGlvbgogKiB0cmlnZ2VycyBhcmUgZGVmaW5lZCkuCiAqCiAqIERvIG5vdCB1c2UgdGhpcyBpbnN0cnVjdGlvbiBhcyBhIHJlcGxhY2VtZW50IGZvciBgZWxlbWVudFByb3BlcnR5YC4gVGhpcyBpbnN0cnVjdGlvbgogKiBvbmx5IGV4aXN0cyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBWaWV3RW5naW5lJ3MgaG9zdCBiaW5kaW5nIGJlaGF2aW9yLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHByb3BlcnR5LiBCZWNhdXNlIGl0IGlzIGdvaW5nIHRvIERPTSwgdGhpcyBpcyBub3Qgc3ViamVjdCB0bwogKiAgICAgICAgcmVuYW1pbmcgYXMgcGFydCBvZiBtaW5pZmljYXRpb24uCiAqIEBwYXJhbSB7P30gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlLgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmcocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsb2FkQ29tcG9uZW50UmVuZGVyZXIodE5vZGUsIGxWaWV3KTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIHJlbmRlcmVyLCBzYW5pdGl6ZXIsIHRydWUpOwogICAgICAgIG5nRGV2TW9kZSAmJiBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgYmluZGluZ0luZGV4KTsKICAgIH0KICAgIHJldHVybiDJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmc7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2FsbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2Rpc2NvdmVyeV91dGlscy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRE9NIGVsZW1lbnQuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBHaXZlbiB0aGUgZm9sbG93aW5nIERPTSBzdHJ1Y3R1cmU6CiAqIGBgYGh0bWwKICogPG15LWFwcD4KICogICA8ZGl2PgogKiAgICAgPGNoaWxkLWNvbXA+PC9jaGlsZC1jb21wPgogKiAgIDwvZGl2PgogKiA8L215LWFwcD4KICogYGBgCiAqIENhbGxpbmcgYGdldENvbXBvbmVudGAgb24gYDxjaGlsZC1jb21wPmAgd2lsbCByZXR1cm4gdGhlIGluc3RhbmNlIG9mIGBDaGlsZENvbXBvbmVudGAKICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgRE9NIGVsZW1lbnQuCiAqCiAqIENhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uIGA8bXktYXBwPmAgd2lsbCByZXR1cm4gdGhlIGBNeUFwcGAgaW5zdGFuY2UuCiAqCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAZ2xvYmFsQXBpIG5nCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZWxlbWVudCBET00gZWxlbWVudCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHJldHJpZXZlZC4KICogQHJldHVybiB7P30gQ29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBvciBgbnVsbGAgaWYgdGhlcmUKICogICAgaXMgbm8gY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4KICoKICovCmZ1bmN0aW9uIGdldENvbXBvbmVudChlbGVtZW50KSB7CiAgICBhc3NlcnREb21FbGVtZW50KGVsZW1lbnQpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dCA9IGxvYWRMQ29udGV4dChlbGVtZW50LCBmYWxzZSk7CiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGlmIChjb250ZXh0LmNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBnZXRDb21wb25lbnRBdE5vZGVJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldyk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY29tcG9uZW50KSk7Cn0KLyoqCiAqIElmIGluc2lkZSBhbiBlbWJlZGRlZCB2aWV3IChlLmcuIGAqbmdJZmAgb3IgYCpuZ0ZvcmApLCByZXRyaWV2ZXMgdGhlIGNvbnRleHQgb2YgdGhlIGVtYmVkZGVkCiAqIHZpZXcgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mLiBPdGhlcndpc2UgcmV0cmlldmVzIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IHdob3NlIHZpZXcKICogb3ducyB0aGUgZWxlbWVudCAoaW4gdGhpcyBjYXNlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgYGdldE93bmluZ0NvbXBvbmVudGApLgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBzdXJyb3VuZGluZyBjb21wb25lbnQgaW5zdGFuY2UuCiAqIEByZXR1cm4gez99IEluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgdGhhdCBpcyBhcm91bmQgdGhlIGVsZW1lbnQgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpc24ndAogKiAgICBpbnNpZGUgYW55IGNvbXBvbmVudC4KICoKICovCmZ1bmN0aW9uIGdldENvbnRleHQoZWxlbWVudCkgewogICAgYXNzZXJ0RG9tRWxlbWVudChlbGVtZW50KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRleHQgPSBsb2FkTENvbnRleHQoZWxlbWVudCwgZmFsc2UpOwogICAgcmV0dXJuIGNvbnRleHQgPT09IG51bGwgPyBudWxsIDogKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQubFZpZXdbQ09OVEVYVF0pKTsKfQovKioKICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBjb250YWlucyB0aGUgRE9NIGVsZW1lbnQuCiAqCiAqIEZvciBleGFtcGxlLCBpZiBgPGNoaWxkLWNvbXA+YCBpcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBvZiBgPGFwcC1jb21wPmAKICogKGkuZS4gYSBgVmlld0NoaWxkYCBvZiBgPGFwcC1jb21wPmApLCBjYWxsaW5nIGBnZXRPd25pbmdDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gCiAqIHdvdWxkIHJldHVybiBgPGFwcC1jb21wPmAuCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAZ2xvYmFsQXBpIG5nCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZWxlbWVudE9yRGlyIERPTSBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlCiAqICAgIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgcm9vdCBjb21wb25lbnRzLgogKiBAcmV0dXJuIHs/fSBDb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBvd25zIHRoZSBET00gZWxlbWVudCBvciBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdAogKiAgICBwYXJ0IG9mIGEgY29tcG9uZW50IHZpZXcuCiAqCiAqLwpmdW5jdGlvbiBnZXRPd25pbmdDb21wb25lbnQoZWxlbWVudE9yRGlyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnRPckRpciwgZmFsc2UpOwogICAgaWYgKGNvbnRleHQgPT09IG51bGwpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbFZpZXcgPSBjb250ZXh0LmxWaWV3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBhcmVudDsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMVmlldyhsVmlldyk7CiAgICB3aGlsZSAobFZpZXdbSE9TVF0gPT09IG51bGwgJiYgKHBhcmVudCA9ICgvKiogQHR5cGUgez99ICovIChnZXRMVmlld1BhcmVudChsVmlldykpKSkpIHsKICAgICAgICAvLyBBcyBsb25nIGFzIGxWaWV3W0hPU1RdIGlzIG51bGwgd2Uga25vdyB3ZSBhcmUgcGFydCBvZiBzdWItdGVtcGxhdGUgc3VjaCBhcyBgKm5nSWZgCiAgICAgICAgbFZpZXcgPSBwYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbFZpZXdbRkxBR1NdICYgNTEyIC8qIElzUm9vdCAqLyA/IG51bGwgOiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbQ09OVEVYVF0pKTsKfQovKioKICogUmV0cmlldmVzIGFsbCByb290IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NIGVsZW1lbnQsIGRpcmVjdGl2ZSBvciBjb21wb25lbnQgaW5zdGFuY2UuCiAqIFJvb3QgY29tcG9uZW50cyBhcmUgdGhvc2Ugd2hpY2ggaGF2ZSBiZWVuIGJvb3RzdHJhcHBlZCBieSBBbmd1bGFyLgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAcGFyYW0gez99IGVsZW1lbnRPckRpciBET00gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZQogKiAgICBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHJvb3QgY29tcG9uZW50cy4KICogQHJldHVybiB7P30gUm9vdCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFyZ2V0IG9iamVjdC4KICoKICovCmZ1bmN0aW9uIGdldFJvb3RDb21wb25lbnRzKGVsZW1lbnRPckRpcikgewogICAgcmV0dXJuIFsuLi5nZXRSb290Q29udGV4dChlbGVtZW50T3JEaXIpLmNvbXBvbmVudHNdOwp9Ci8qKgogKiBSZXRyaWV2ZXMgYW4gYEluamVjdG9yYCBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICoKICogXEBwdWJsaWNBcGkKICogXEBnbG9iYWxBcGkgbmcKICogQHBhcmFtIHs/fSBlbGVtZW50T3JEaXIgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRvCiAqICAgIHJldHJpZXZlIHRoZSBpbmplY3Rvci4KICogQHJldHVybiB7P30gSW5qZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlLgogKgogKi8KZnVuY3Rpb24gZ2V0SW5qZWN0b3IoZWxlbWVudE9yRGlyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnRPckRpciwgZmFsc2UpOwogICAgaWYgKGNvbnRleHQgPT09IG51bGwpCiAgICAgICAgcmV0dXJuIEluamVjdG9yLk5VTEw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmxWaWV3W1RWSUVXXS5kYXRhW2NvbnRleHQubm9kZUluZGV4XSkpOwogICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodE5vZGUsIGNvbnRleHQubFZpZXcpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgZGlyZWN0aXZlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBET00gZWxlbWVudC4gRG9lcyBub3QgaW5jbHVkZQogKiBjb21wb25lbnQgaW5zdGFuY2VzLgogKgogKiBcQHVzYWdlTm90ZXMKICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOgogKiBgYGAKICogPG15LWFwcD4KICogICA8YnV0dG9uIG15LWJ1dHRvbj48L2J1dHRvbj4KICogICA8bXktY29tcD48L215LWNvbXA+CiAqIDwvbXktYXBwPgogKiBgYGAKICogQ2FsbGluZyBgZ2V0RGlyZWN0aXZlc2Agb24gYDxidXR0b24+YCB3aWxsIHJldHVybiBhbiBhcnJheSB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBgTXlCdXR0b25gCiAqIGRpcmVjdGl2ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRE9NIGVsZW1lbnQuCiAqCiAqIENhbGxpbmcgYGdldERpcmVjdGl2ZXNgIG9uIGA8bXktY29tcD5gIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAcGFyYW0gez99IGVsZW1lbnQgRE9NIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZGlyZWN0aXZlcy4KICogQHJldHVybiB7P30gQXJyYXkgb2YgZGlyZWN0aXZlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQuCiAqCiAqLwpmdW5jdGlvbiBnZXREaXJlY3RpdmVzKGVsZW1lbnQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRleHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAobG9hZExDb250ZXh0KGVsZW1lbnQpKSk7CiAgICBpZiAoY29udGV4dC5kaXJlY3RpdmVzID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBnZXREaXJlY3RpdmVzQXROb2RlSW5kZXgoY29udGV4dC5ub2RlSW5kZXgsIGNvbnRleHQubFZpZXcsIGZhbHNlKTsKICAgIH0KICAgIC8vIFRoZSBgZGlyZWN0aXZlc2AgaW4gdGhpcyBjYXNlIGFyZSBhIG5hbWVkIGFycmF5IGNhbGxlZCBgTENvbXBvbmVudFZpZXdgLiBDbG9uZSB0aGUKICAgIC8vIHJlc3VsdCBzbyB3ZSBkb24ndCBleHBvc2UgYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIHVzZXIncyBjb25zb2xlLgogICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gbnVsbCA/IFtdIDogWy4uLmNvbnRleHQuZGlyZWN0aXZlc107Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEBwYXJhbSB7Pz19IHRocm93T25Ob3RGb3VuZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbG9hZExDb250ZXh0KHRhcmdldCwgdGhyb3dPbk5vdEZvdW5kID0gdHJ1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dCA9IGdldExDb250ZXh0KHRhcmdldCk7CiAgICBpZiAoIWNvbnRleHQgJiYgdGhyb3dPbk5vdEZvdW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5nRGV2TW9kZSA/IGBVbmFibGUgdG8gZmluZCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCAke3N0cmluZ2lmeUZvckVycm9yKHRhcmdldCl9YCA6CiAgICAgICAgICAgICdJbnZhbGlkIG5nIHRhcmdldCcpOwogICAgfQogICAgcmV0dXJuIGNvbnRleHQ7Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgaG9zdCBlbGVtZW50IG9mIGEgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICogVGhlIGhvc3QgZWxlbWVudCBpcyB0aGUgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvciBvZiB0aGUgZGlyZWN0aXZlLgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAcGFyYW0gez99IGNvbXBvbmVudE9yRGlyZWN0aXZlIENvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSBob3N0CiAqICAgICBlbGVtZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuCiAqIEByZXR1cm4gez99IEhvc3QgZWxlbWVudCBvZiB0aGUgdGFyZ2V0LgogKgogKi8KZnVuY3Rpb24gZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50T3JEaXJlY3RpdmUpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChnZXRMQ29udGV4dChjb21wb25lbnRPckRpcmVjdGl2ZSkpKS5uYXRpdmUpKSkpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggYSBET00gZWxlbWVudC4gVGhlIGxpc3QgZG9lcyBpbmNsdWRlIGhvc3QKICogbGlzdGVuZXJzLCBidXQgaXQgZG9lcyBub3QgaW5jbHVkZSBldmVudCBsaXN0ZW5lcnMgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIGNvbnRleHQKICogKGUuZy4gdGhyb3VnaCBgYWRkRXZlbnRMaXN0ZW5lcmApLgogKgogKiBcQHVzYWdlTm90ZXMKICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOgogKiBgYGAKICogPG15LWFwcD4KICogICA8ZGl2IChjbGljayk9ImRvU29tZXRoaW5nKCkiPjwvZGl2PgogKiA8L215LWFwcD4KICoKICogYGBgCiAqIENhbGxpbmcgYGdldExpc3RlbmVyc2Agb24gYDxkaXY+YCB3aWxsIHJldHVybiBhbiBvYmplY3QgdGhhdCBsb29rcyBhcyBmb2xsb3dzOgogKiBgYGAKICogewogKiAgIG5hbWU6ICdjbGljaycsCiAqICAgZWxlbWVudDogPGRpdj4sCiAqICAgY2FsbGJhY2s6ICgpID0+IGRvU29tZXRoaW5nKCksCiAqICAgdXNlQ2FwdHVyZTogZmFsc2UKICogfQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogXEBnbG9iYWxBcGkgbmcKICogQHBhcmFtIHs/fSBlbGVtZW50IEVsZW1lbnQgZm9yIHdoaWNoIHRoZSBET00gbGlzdGVuZXJzIHNob3VsZCBiZSByZXRyaWV2ZWQuCiAqIEByZXR1cm4gez99IEFycmF5IG9mIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgRE9NIGVsZW1lbnQuCiAqCiAqLwpmdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZWxlbWVudCkgewogICAgYXNzZXJ0RG9tRWxlbWVudChlbGVtZW50KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxDb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnQsIGZhbHNlKTsKICAgIGlmIChsQ29udGV4dCA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGxDb250ZXh0LmxWaWV3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsQ2xlYW51cCA9IGxWaWV3W0NMRUFOVVBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbGlzdGVuZXJzID0gW107CiAgICBpZiAodENsZWFudXAgJiYgbENsZWFudXApIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aDspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFtID0gdENsZWFudXBbaSsrXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWNvbmRQYXJhbSA9IHRDbGVhbnVwW2krK107CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlyc3RQYXJhbSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBmaXJzdFBhcmFtOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh1bndyYXBSTm9kZShsVmlld1tzZWNvbmRQYXJhbV0pKSkpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gbENsZWFudXBbdENsZWFudXBbaSsrXV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1c2VDYXB0dXJlT3JJbmR4ID0gdENsZWFudXBbaSsrXTsKICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgYm9vbGVhbiB0aGVuIHJlcG9ydCBpdCBhcyBpcy4KICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgcG9zaXRpdmUgbnVtYmVyIHRoZW4gaXQgaW4gdW5zdWJzY3JpYmUgbWV0aG9kCiAgICAgICAgICAgICAgICAvLyBpZiB1c2VDYXB0dXJlT3JJbmR4IGlzIG5lZ2F0aXZlIG51bWJlciB0aGVuIGl0IGlzIGEgU3Vic2NyaXB0aW9uCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gKHR5cGVvZiB1c2VDYXB0dXJlT3JJbmR4ID09PSAnYm9vbGVhbicgfHwgdXNlQ2FwdHVyZU9ySW5keCA+PSAwKSA/ICdkb20nIDogJ291dHB1dCc7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1c2VDYXB0dXJlID0gdHlwZW9mIHVzZUNhcHR1cmVPckluZHggPT09ICdib29sZWFuJyA/IHVzZUNhcHR1cmVPckluZHggOiBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IGxpc3RlbmVyRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKHsgZWxlbWVudCwgbmFtZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUsIHR5cGUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBsaXN0ZW5lcnMuc29ydChzb3J0TGlzdGVuZXJzKTsKICAgIHJldHVybiBsaXN0ZW5lcnM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNvcnRMaXN0ZW5lcnMoYSwgYikgewogICAgaWYgKGEubmFtZSA9PSBiLm5hbWUpCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOwp9Ci8qKgogKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBhIERPTSBFbGVtZW50LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnREb21FbGVtZW50KHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICEodmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGluc3RhbmNlIG9mIERPTSBFbGVtZW50Jyk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBNYXJrcyBhIGNvbXBvbmVudCBmb3IgY2hlY2sgKGluIGNhc2Ugb2YgT25QdXNoIGNvbXBvbmVudHMpIGFuZCBzeW5jaHJvbm91c2x5CiAqIHBlcmZvcm1zIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGFwcGxpY2F0aW9uIHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8uCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAZ2xvYmFsQXBpIG5nCiAqIEBwYXJhbSB7P30gY29tcG9uZW50IENvbXBvbmVudCB0byB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI21hcmtGb3JDaGVjayBtYXJrIGZvciBjaGVja30uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcHBseUNoYW5nZXMoY29tcG9uZW50KSB7CiAgICBtYXJrRGlydHkoY29tcG9uZW50KTsKICAgIGdldFJvb3RDb21wb25lbnRzKGNvbXBvbmVudCkuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHJvb3RDb21wb25lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJvb3RDb21wb25lbnQgPT4gZGV0ZWN0Q2hhbmdlcyhyb290Q29tcG9uZW50KSkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3V0aWwvZ2xvYmFsX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaGlzIHZhbHVlIHJlZmxlY3RzIHRoZSBwcm9wZXJ0eSBvbiB0aGUgd2luZG93IHdoZXJlIHRoZSBkZXYKICogdG9vbHMgYXJlIHBhdGNoZWQgKHdpbmRvdy5uZykuCiAqCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVkgPSAnbmcnOwovKiogQHR5cGUgez99ICovCmxldCBfcHVibGlzaGVkID0gZmFsc2U7Ci8qKgogKiBQdWJsaXNoZXMgYSBjb2xsZWN0aW9uIG9mIGRlZmF1bHQgZGVidWcgdG9vbHMgb250b2B3aW5kb3cubmdgLgogKgogKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSB3aGVuIEFuZ3VsYXIgaXMgaW4gZGV2ZWxvcG1lbnQKICogbW9kZSBhbmQgYXJlIGF1dG9tYXRpY2FsbHkgc3RyaXBwZWQgYXdheSBmcm9tIHByb2QgbW9kZSBpcyBvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMoKSB7CiAgICBpZiAoIV9wdWJsaXNoZWQpIHsKICAgICAgICBfcHVibGlzaGVkID0gdHJ1ZTsKICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Q29tcG9uZW50JywgZ2V0Q29tcG9uZW50KTsKICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Q29udGV4dCcsIGdldENvbnRleHQpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRMaXN0ZW5lcnMnLCBnZXRMaXN0ZW5lcnMpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRPd25pbmdDb21wb25lbnQnLCBnZXRPd25pbmdDb21wb25lbnQpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRIb3N0RWxlbWVudCcsIGdldEhvc3RFbGVtZW50KTsKICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0SW5qZWN0b3InLCBnZXRJbmplY3Rvcik7CiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldFJvb3RDb21wb25lbnRzJywgZ2V0Um9vdENvbXBvbmVudHMpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXREaXJlY3RpdmVzJywgZ2V0RGlyZWN0aXZlcyk7CiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2FwcGx5Q2hhbmdlcycsIGFwcGx5Q2hhbmdlcyk7CiAgICB9Cn0KLyoqCiAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYHdpbmRvdy5uZ2Agc28gdGhhdCBpdCBjYW4gYmUKICogdXNlZCBmcm9tIHRoZSBicm93c2VyIGNvbnNvbGUgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyBub3QgaW4gcHJvZHVjdGlvbi4KICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gZm4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHB1Ymxpc2hHbG9iYWxVdGlsKG5hbWUsIGZuKSB7CiAgICBpZiAodHlwZW9mIENPTVBJTEVEID09PSAndW5kZWZpbmVkJyB8fCAhQ09NUElMRUQpIHsKICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCBleHBvcnQgYG5nYCB3aGVuIHVzaW5nIGNsb3N1cmUgZW5oYW5jZWQgb3B0aW1pemF0aW9uIGFzOgogICAgICAgIC8vIC0gY2xvc3VyZSBkZWNsYXJlcyBnbG9iYWxzIGl0c2VsZiBmb3IgbWluaWZpZWQgbmFtZXMsIHdoaWNoIHNvbWV0aW1lcyBjbG9iYmVyIG91ciBgbmdgIGdsb2JhbAogICAgICAgIC8vIC0gd2UgY2FuJ3QgZGVjbGFyZSBhIGNsb3N1cmUgZXh0ZXJuIGFzIHRoZSBuYW1lc3BhY2UgYG5nYCBpcyBhbHJlYWR5IHVzZWQgd2l0aGluIEdvb2dsZQogICAgICAgIC8vICAgZm9yIHR5cGluZ3MgZm9yIEFuZ3VsYXJKUyAodmlhIGBnb29nLnByb3ZpZGUoJ25nLi4uLicpYCkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKF9nbG9iYWwpKSkpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGZuLCAnZnVuY3Rpb24gbm90IGRlZmluZWQnKTsKICAgICAgICBpZiAodykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB3W0dMT0JBTF9QVUJMSVNIX0VYUEFORE9fS0VZXTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHdbR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVldID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGFpbmVyW25hbWVdID0gZm47CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBDcmVhdGVzIHRoZSByb290IGNvbXBvbmVudCB2aWV3IGFuZCB0aGUgcm9vdCBjb21wb25lbnQgbm9kZS4KICoKICogQHBhcmFtIHs/fSByTm9kZSBSZW5kZXIgaG9zdCBlbGVtZW50LgogKiBAcGFyYW0gez99IGRlZiBDb21wb25lbnREZWYKICogQHBhcmFtIHs/fSByb290VmlldyBUaGUgcGFyZW50IHZpZXcgd2hlcmUgdGhlIGhvc3Qgbm9kZSBpcyBzdG9yZWQKICogQHBhcmFtIHs/fSByZW5kZXJlckZhY3RvcnkKICogQHBhcmFtIHs/fSBob3N0UmVuZGVyZXIgVGhlIGN1cnJlbnQgcmVuZGVyZXIKICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIFRoZSBzYW5pdGl6ZXIsIGlmIHByb3ZpZGVkCiAqCiAqIEByZXR1cm4gez99IENvbXBvbmVudCB2aWV3IGNyZWF0ZWQKICovCmZ1bmN0aW9uIGNyZWF0ZVJvb3RDb21wb25lbnRWaWV3KHJOb2RlLCBkZWYsIHJvb3RWaWV3LCByZW5kZXJlckZhY3RvcnksIGhvc3RSZW5kZXJlciwgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IHJvb3RWaWV3W1RWSUVXXTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShyb290VmlldywgMCArIEhFQURFUl9PRkZTRVQpOwogICAgcm9vdFZpZXdbMCArIEhFQURFUl9PRkZTRVRdID0gck5vZGU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIG51bGwsIDAsIDMgLyogRWxlbWVudCAqLywgbnVsbCwgbnVsbCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXJnZWRBdHRycyA9IHROb2RlLm1lcmdlZEF0dHJzID0gZGVmLmhvc3RBdHRyczsKICAgIGlmIChtZXJnZWRBdHRycyAhPT0gbnVsbCkgewogICAgICAgIGNvbXB1dGVTdGF0aWNTdHlsaW5nKHROb2RlLCBtZXJnZWRBdHRycyk7CiAgICAgICAgaWYgKHJOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhob3N0UmVuZGVyZXIsIHJOb2RlLCBtZXJnZWRBdHRycyk7CiAgICAgICAgICAgIGlmICh0Tm9kZS5jbGFzc2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB3cml0ZURpcmVjdENsYXNzKGhvc3RSZW5kZXJlciwgck5vZGUsIHROb2RlLmNsYXNzZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0Tm9kZS5zdHlsZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHdyaXRlRGlyZWN0U3R5bGUoaG9zdFJlbmRlcmVyLCByTm9kZSwgdE5vZGUuc3R5bGVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZpZXdSZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihyTm9kZSwgZGVmKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBjcmVhdGVMVmlldyhyb290VmlldywgZ2V0T3JDcmVhdGVUQ29tcG9uZW50VmlldyhkZWYpLCBudWxsLCBkZWYub25QdXNoID8gNjQgLyogRGlydHkgKi8gOiAxNiAvKiBDaGVja0Fsd2F5cyAqLywgcm9vdFZpZXdbSEVBREVSX09GRlNFVF0sIHROb2RlLCByZW5kZXJlckZhY3RvcnksIHZpZXdSZW5kZXJlciwgc2FuaXRpemVyKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBkaVB1YmxpY0luSW5qZWN0b3IoZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCByb290VmlldyksIHRWaWV3LCBkZWYudHlwZSk7CiAgICAgICAgbWFya0FzQ29tcG9uZW50SG9zdCh0VmlldywgdE5vZGUpOwogICAgICAgIGluaXRUTm9kZUZsYWdzKHROb2RlLCByb290Vmlldy5sZW5ndGgsIDEpOwogICAgfQogICAgYWRkVG9WaWV3VHJlZShyb290VmlldywgY29tcG9uZW50Vmlldyk7CiAgICAvLyBTdG9yZSBjb21wb25lbnQgdmlldyBhdCBub2RlIGluZGV4LCB3aXRoIG5vZGUgYXMgdGhlIEhPU1QKICAgIHJldHVybiByb290Vmlld1tIRUFERVJfT0ZGU0VUXSA9IGNvbXBvbmVudFZpZXc7Cn0KLyoqCiAqIENyZWF0ZXMgYSByb290IGNvbXBvbmVudCBhbmQgc2V0cyBpdCB1cCB3aXRoIGZlYXR1cmVzIGFuZCBob3N0IGJpbmRpbmdzLiBTaGFyZWQgYnkKICogcmVuZGVyQ29tcG9uZW50KCkgYW5kIFZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KCkuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gY29tcG9uZW50VmlldwogKiBAcGFyYW0gez99IGNvbXBvbmVudERlZgogKiBAcGFyYW0gez99IHJvb3RMVmlldwogKiBAcGFyYW0gez99IHJvb3RDb250ZXh0CiAqIEBwYXJhbSB7P30gaG9zdEZlYXR1cmVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSb290Q29tcG9uZW50KGNvbXBvbmVudFZpZXcsIGNvbXBvbmVudERlZiwgcm9vdExWaWV3LCByb290Q29udGV4dCwgaG9zdEZlYXR1cmVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IHJvb3RMVmlld1tUVklFV107CiAgICAvLyBDcmVhdGUgZGlyZWN0aXZlIGluc3RhbmNlIHdpdGggZmFjdG9yeSgpIGFuZCBzdG9yZSBhdCBuZXh0IGluZGV4IGluIHZpZXdEYXRhCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnQgPSBpbnN0YW50aWF0ZVJvb3RDb21wb25lbnQodFZpZXcsIHJvb3RMVmlldywgY29tcG9uZW50RGVmKTsKICAgIHJvb3RDb250ZXh0LmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpOwogICAgY29tcG9uZW50Vmlld1tDT05URVhUXSA9IGNvbXBvbmVudDsKICAgIGhvc3RGZWF0dXJlcyAmJiBob3N0RmVhdHVyZXMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGZlYXR1cmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChmZWF0dXJlKSA9PiBmZWF0dXJlKGNvbXBvbmVudCwgY29tcG9uZW50RGVmKSkpOwogICAgLy8gV2Ugd2FudCB0byBnZW5lcmF0ZSBhbiBlbXB0eSBRdWVyeUxpc3QgZm9yIHJvb3QgY29udGVudCBxdWVyaWVzIGZvciBiYWNrd2FyZHMKICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBWaWV3RW5naW5lLgogICAgaWYgKGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcykgewogICAgICAgIGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcygxIC8qIENyZWF0ZSAqLywgY29tcG9uZW50LCByb290TFZpZXcubGVuZ3RoIC0gMSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYKICAgICAgICAoY29tcG9uZW50RGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCB8fCBjb21wb25lbnREZWYuaG9zdEF0dHJzICE9PSBudWxsKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50SW5kZXggPSByb290VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUOwogICAgICAgIHNldFNlbGVjdGVkSW5kZXgoZWxlbWVudEluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdFRWaWV3ID0gcm9vdExWaWV3W1RWSUVXXTsKICAgICAgICBhZGRIb3N0QmluZGluZ3NUb0V4cGFuZG9JbnN0cnVjdGlvbnMocm9vdFRWaWV3LCBjb21wb25lbnREZWYpOwogICAgICAgIGdyb3dIb3N0VmFyc1NwYWNlKHJvb3RUVmlldywgcm9vdExWaWV3LCBjb21wb25lbnREZWYuaG9zdFZhcnMpOwogICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGNvbXBvbmVudERlZiwgY29tcG9uZW50KTsKICAgIH0KICAgIHJldHVybiBjb21wb25lbnQ7Cn0KLyoqCiAqIEBwYXJhbSB7Pz19IHNjaGVkdWxlcgogKiBAcGFyYW0gez89fSBwbGF5ZXJIYW5kbGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSb290Q29udGV4dChzY2hlZHVsZXIsIHBsYXllckhhbmRsZXIpIHsKICAgIHJldHVybiB7CiAgICAgICAgY29tcG9uZW50czogW10sCiAgICAgICAgc2NoZWR1bGVyOiBzY2hlZHVsZXIgfHwgZGVmYXVsdFNjaGVkdWxlciwKICAgICAgICBjbGVhbjogQ0xFQU5fUFJPTUlTRSwKICAgICAgICBwbGF5ZXJIYW5kbGVyOiBwbGF5ZXJIYW5kbGVyIHx8IG51bGwsCiAgICAgICAgZmxhZ3M6IDAgLyogRW1wdHkgKi8KICAgIH07Cn0KLyoqCiAqIFVzZWQgdG8gZW5hYmxlIGxpZmVjeWNsZSBob29rcyBvbiB0aGUgcm9vdCBjb21wb25lbnQuCiAqCiAqIEluY2x1ZGUgdGhpcyBmZWF0dXJlIHdoZW4gY2FsbGluZyBgcmVuZGVyQ29tcG9uZW50YCBpZiB0aGUgcm9vdCBjb21wb25lbnQKICogeW91IGFyZSByZW5kZXJpbmcgaGFzIGxpZmVjeWNsZSBob29rcyBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZSBob29rcyB3b24ndAogKiBiZSBjYWxsZWQgcHJvcGVybHkuCiAqCiAqIEV4YW1wbGU6CiAqCiAqIGBgYAogKiByZW5kZXJDb21wb25lbnQoQXBwQ29tcG9uZW50LCB7aG9zdEZlYXR1cmVzOiBbTGlmZWN5Y2xlSG9va3NGZWF0dXJlXX0pOwogKiBgYGAKICogQHBhcmFtIHs/fSBjb21wb25lbnQKICogQHBhcmFtIHs/fSBkZWYKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIExpZmVjeWNsZUhvb2tzRmVhdHVyZShjb21wb25lbnQsIGRlZikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgcm9vdFRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlYWRQYXRjaGVkTFZpZXcoY29tcG9uZW50KSkpW1RWSUVXXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpckluZGV4ID0gcm9vdFRWaWV3LmRhdGEubGVuZ3RoIC0gMTsKICAgIC8vIFRPRE8obWlza28pOiByZXBsYWNlIGBhcyBUTm9kZWAgd2l0aCBjcmVhdGVUTm9kZSBjYWxsLiAobmVlZHMgcmVmYWN0b3JpbmcgdG8gbG9zZSBkZXAgb24KICAgIC8vIExOb2RlKS4KICAgIHJlZ2lzdGVyUG9zdE9yZGVySG9va3Mocm9vdFRWaWV3LCAoLyoqIEB0eXBlIHs/fSAqLyAoeyBkaXJlY3RpdmVTdGFydDogZGlySW5kZXgsIGRpcmVjdGl2ZUVuZDogZGlySW5kZXggKyAxIH0pKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZmVhdHVyZXMvaW5oZXJpdF9kZWZpbml0aW9uX2ZlYXR1cmUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0U3VwZXJUeXBlKHR5cGUpIHsKICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHlwZS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yOwp9Ci8qKgogKiBNZXJnZXMgdGhlIGRlZmluaXRpb24gZnJvbSBhIHN1cGVyIGNsYXNzIHRvIGEgc3ViIGNsYXNzLgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBkZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIHRoYXQgaXMgYSBTdWJDbGFzcyBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvZiBjb21wb25lbnQKICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUoZGVmaW5pdGlvbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN1cGVyVHlwZSA9IGdldFN1cGVyVHlwZShkZWZpbml0aW9uLnR5cGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHNob3VsZEluaGVyaXRGaWVsZHMgPSB0cnVlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5oZXJpdGFuY2VDaGFpbiA9IFtkZWZpbml0aW9uXTsKICAgIHdoaWxlIChzdXBlclR5cGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN1cGVyRGVmID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChpc0NvbXBvbmVudERlZihkZWZpbml0aW9uKSkgewogICAgICAgICAgICAvLyBEb24ndCB1c2UgZ2V0Q29tcG9uZW50RGVmL2dldERpcmVjdGl2ZURlZi4gVGhpcyBsb2dpYyByZWxpZXMgb24gaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIHN1cGVyRGVmID0gc3VwZXJUeXBlLsm1Y21wIHx8IHN1cGVyVHlwZS7JtWRpcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChzdXBlclR5cGUuybVjbXApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGlyZWN0aXZlcyBjYW5ub3QgaW5oZXJpdCBDb21wb25lbnRzJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgICAgICBzdXBlckRlZiA9IHN1cGVyVHlwZS7JtWRpcjsKICAgICAgICB9CiAgICAgICAgaWYgKHN1cGVyRGVmKSB7CiAgICAgICAgICAgIGlmIChzaG91bGRJbmhlcml0RmllbGRzKSB7CiAgICAgICAgICAgICAgICBpbmhlcml0YW5jZUNoYWluLnB1c2goc3VwZXJEZWYpOwogICAgICAgICAgICAgICAgLy8gU29tZSBmaWVsZHMgaW4gdGhlIGRlZmluaXRpb24gbWF5IGJlIGVtcHR5LCBpZiB0aGVyZSB3ZXJlIG5vIHZhbHVlcyB0byBwdXQgaW4gdGhlbSB0aGF0CiAgICAgICAgICAgICAgICAvLyB3b3VsZCd2ZSBqdXN0aWZpZWQgb2JqZWN0IGNyZWF0aW9uLiBVbndyYXAgdGhlbSBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB3cml0ZWFibGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmaW5pdGlvbikpOwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmlucHV0cyA9IG1heWJlVW53cmFwRW1wdHkoZGVmaW5pdGlvbi5pbnB1dHMpOwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmRlY2xhcmVkSW5wdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLmRlY2xhcmVkSW5wdXRzKTsKICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5vdXRwdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLm91dHB1dHMpOwogICAgICAgICAgICAgICAgLy8gTWVyZ2UgaG9zdEJpbmRpbmdzCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdXBlckhvc3RCaW5kaW5ncyA9IHN1cGVyRGVmLmhvc3RCaW5kaW5nczsKICAgICAgICAgICAgICAgIHN1cGVySG9zdEJpbmRpbmdzICYmIGluaGVyaXRIb3N0QmluZGluZ3MoZGVmaW5pdGlvbiwgc3VwZXJIb3N0QmluZGluZ3MpOwogICAgICAgICAgICAgICAgLy8gTWVyZ2UgcXVlcmllcwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3VwZXJWaWV3UXVlcnkgPSBzdXBlckRlZi52aWV3UXVlcnk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdXBlckNvbnRlbnRRdWVyaWVzID0gc3VwZXJEZWYuY29udGVudFF1ZXJpZXM7CiAgICAgICAgICAgICAgICBzdXBlclZpZXdRdWVyeSAmJiBpbmhlcml0Vmlld1F1ZXJ5KGRlZmluaXRpb24sIHN1cGVyVmlld1F1ZXJ5KTsKICAgICAgICAgICAgICAgIHN1cGVyQ29udGVudFF1ZXJpZXMgJiYgaW5oZXJpdENvbnRlbnRRdWVyaWVzKGRlZmluaXRpb24sIHN1cGVyQ29udGVudFF1ZXJpZXMpOwogICAgICAgICAgICAgICAgLy8gTWVyZ2UgaW5wdXRzIGFuZCBvdXRwdXRzCiAgICAgICAgICAgICAgICBmaWxsUHJvcGVydGllcyhkZWZpbml0aW9uLmlucHV0cywgc3VwZXJEZWYuaW5wdXRzKTsKICAgICAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24uZGVjbGFyZWRJbnB1dHMsIHN1cGVyRGVmLmRlY2xhcmVkSW5wdXRzKTsKICAgICAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24ub3V0cHV0cywgc3VwZXJEZWYub3V0cHV0cyk7CiAgICAgICAgICAgICAgICAvLyBNZXJnZSBhbmltYXRpb25zIG1ldGFkYXRhLgogICAgICAgICAgICAgICAgLy8gSWYgYHN1cGVyRGVmYCBpcyBhIENvbXBvbmVudCwgdGhlIGBkYXRhYCBmaWVsZCBpcyBwcmVzZW50IChkZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QpLgogICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKHN1cGVyRGVmKSAmJiBzdXBlckRlZi5kYXRhLmFuaW1hdGlvbikgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHN1cGVyIGRlZiBpcyBhIENvbXBvbmVudCwgdGhlIGBkZWZpbml0aW9uYCBpcyBhbHNvIGEgQ29tcG9uZW50LCBzaW5jZSBEaXJlY3RpdmVzIGNhbgogICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbmhlcml0IENvbXBvbmVudHMgKHdlIHRocm93IGFuIGVycm9yIGFib3ZlIGFuZCBjYW5ub3QgcmVhY2ggdGhpcyBjb2RlKS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmRGF0YSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmaW5pdGlvbikpKS5kYXRhOwogICAgICAgICAgICAgICAgICAgIGRlZkRhdGEuYW5pbWF0aW9uID0gKGRlZkRhdGEuYW5pbWF0aW9uIHx8IFtdKS5jb25jYXQoc3VwZXJEZWYuZGF0YS5hbmltYXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSW5oZXJpdCBob29rcwogICAgICAgICAgICAgICAgLy8gQXNzdW1lIHN1cGVyIGNsYXNzIGluaGVyaXRhbmNlIGZlYXR1cmUgaGFzIGFscmVhZHkgcnVuLgogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmFmdGVyQ29udGVudENoZWNrZWQgPQogICAgICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5hZnRlckNvbnRlbnRDaGVja2VkIHx8IHN1cGVyRGVmLmFmdGVyQ29udGVudENoZWNrZWQ7CiAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuYWZ0ZXJDb250ZW50SW5pdCA9IGRlZmluaXRpb24uYWZ0ZXJDb250ZW50SW5pdCB8fCBzdXBlckRlZi5hZnRlckNvbnRlbnRJbml0OwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmFmdGVyVmlld0NoZWNrZWQgPSBkZWZpbml0aW9uLmFmdGVyVmlld0NoZWNrZWQgfHwgc3VwZXJEZWYuYWZ0ZXJWaWV3Q2hlY2tlZDsKICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5hZnRlclZpZXdJbml0ID0gZGVmaW5pdGlvbi5hZnRlclZpZXdJbml0IHx8IHN1cGVyRGVmLmFmdGVyVmlld0luaXQ7CiAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuZG9DaGVjayA9IGRlZmluaXRpb24uZG9DaGVjayB8fCBzdXBlckRlZi5kb0NoZWNrOwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLm9uRGVzdHJveSA9IGRlZmluaXRpb24ub25EZXN0cm95IHx8IHN1cGVyRGVmLm9uRGVzdHJveTsKICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5vbkluaXQgPSBkZWZpbml0aW9uLm9uSW5pdCB8fCBzdXBlckRlZi5vbkluaXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUnVuIHBhcmVudCBmZWF0dXJlcwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gc3VwZXJEZWYuZmVhdHVyZXM7CiAgICAgICAgICAgIGlmIChmZWF0dXJlcykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUgJiYgZmVhdHVyZS5uZ0luaGVyaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChmZWF0dXJlKSkpKGRlZmluaXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJZiBgSW5oZXJpdERlZmluaXRpb25GZWF0dXJlYCBpcyBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgYHN1cGVyRGVmYCwgaXQgbWVhbnMgdGhhdCB0aGlzCiAgICAgICAgICAgICAgICAgICAgLy8gZGVmIGFscmVhZHkgaGFzIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlciBjbGFzcyhlcyksIHNvIHdlCiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHN0b3AgbWVyZ2luZyBmaWVsZHMgZnJvbSBzdXBlciBjbGFzc2VzLiBIb3dldmVyIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHByb3RvdHlwZSBjaGFpbiB0byBsb29rIGZvciBjbGFzc2VzIHRoYXQgbWlnaHQgY29udGFpbiBvdGhlciAiZmVhdHVyZXMiIChsaWtlCiAgICAgICAgICAgICAgICAgICAgLy8gTmdPbkNoYW5nZXMpLCB3aGljaCB3ZSBzaG91bGQgaW52b2tlIGZvciB0aGUgb3JpZ2luYWwgYGRlZmluaXRpb25gLiBXZSBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gYHNob3VsZEluaGVyaXRGaWVsZHNgIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCwgZXNzZW50aWFsbHkgc2tpcHBpbmcgZmllbGRzIGluaGVyaXRhbmNlCiAgICAgICAgICAgICAgICAgICAgLy8gbG9naWMgYW5kIG9ubHkgaW52b2tpbmcgZnVuY3Rpb25zIGZyb20gdGhlICJmZWF0dXJlcyIgbGlzdC4KICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZSA9PT0gybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmhlcml0RmllbGRzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cGVyVHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzdXBlclR5cGUpOwogICAgfQogICAgbWVyZ2VIb3N0QXR0cnNBY3Jvc3NJbmhlcml0YW5jZShpbmhlcml0YW5jZUNoYWluKTsKfQovKioKICogTWVyZ2UgdGhlIGBob3N0QXR0cnNgIGFuZCBgaG9zdFZhcnNgIGZyb20gdGhlIGluaGVyaXRlZCBwYXJlbnQgdG8gdGhlIGJhc2UgY2xhc3MuCiAqCiAqIEBwYXJhbSB7P30gaW5oZXJpdGFuY2VDaGFpbiBBIGxpc3Qgb2YgYFdyaXRhYmxlRGVmc2Agc3RhcnRpbmcgYXQgdGhlIHRvcCBtb3N0IHR5cGUgYW5kIGxpc3RpbmcKICogc3ViLXR5cGVzIGluIG9yZGVyLiBGb3IgZWFjaCB0eXBlIHRha2UgdGhlIGBob3N0QXR0cnNgIGFuZCBgaG9zdFZhcnNgIGFuZCBtZXJnZSBpdCB3aXRoIHRoZSBjaGlsZAogKiB0eXBlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWVyZ2VIb3N0QXR0cnNBY3Jvc3NJbmhlcml0YW5jZShpbmhlcml0YW5jZUNoYWluKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaG9zdFZhcnMgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGhvc3RBdHRycyA9IG51bGw7CiAgICAvLyBXZSBwcm9jZXNzIHRoZSBpbmhlcml0YW5jZSBvcmRlciBmcm9tIHRoZSBiYXNlIHRvIHRoZSBsZWF2ZXMgaGVyZS4KICAgIGZvciAobGV0IGkgPSBpbmhlcml0YW5jZUNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZiA9IGluaGVyaXRhbmNlQ2hhaW5baV07CiAgICAgICAgLy8gRm9yIGVhY2ggYGhvc3RWYXJzYCwgd2UgbmVlZCB0byBhZGQgdGhlIHN1cGVyY2xhc3MgYW1vdW50LgogICAgICAgIGRlZi5ob3N0VmFycyA9IChob3N0VmFycyArPSBkZWYuaG9zdFZhcnMpOwogICAgICAgIC8vIGZvciBlYWNoIGBob3N0QXR0cnNgIHdlIG5lZWQgdG8gbWVyZ2UgaXQgd2l0aCBzdXBlcmNsYXNzLgogICAgICAgIGRlZi5ob3N0QXR0cnMgPQogICAgICAgICAgICBtZXJnZUhvc3RBdHRycyhkZWYuaG9zdEF0dHJzLCBob3N0QXR0cnMgPSBtZXJnZUhvc3RBdHRycyhob3N0QXR0cnMsIGRlZi5ob3N0QXR0cnMpKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF5YmVVbndyYXBFbXB0eSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09PSBFTVBUWV9PQkopIHsKICAgICAgICByZXR1cm4ge307CiAgICB9CiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gRU1QVFlfQVJSQVkpIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gZGVmaW5pdGlvbgogKiBAcGFyYW0gez99IHN1cGVyVmlld1F1ZXJ5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmhlcml0Vmlld1F1ZXJ5KGRlZmluaXRpb24sIHN1cGVyVmlld1F1ZXJ5KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2Vmlld1F1ZXJ5ID0gZGVmaW5pdGlvbi52aWV3UXVlcnk7CiAgICBpZiAocHJldlZpZXdRdWVyeSkgewogICAgICAgIGRlZmluaXRpb24udmlld1F1ZXJ5ID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmYKICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJmLCBjdHgpID0+IHsKICAgICAgICAgICAgc3VwZXJWaWV3UXVlcnkocmYsIGN0eCk7CiAgICAgICAgICAgIHByZXZWaWV3UXVlcnkocmYsIGN0eCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBkZWZpbml0aW9uLnZpZXdRdWVyeSA9IHN1cGVyVmlld1F1ZXJ5OwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGRlZmluaXRpb24KICogQHBhcmFtIHs/fSBzdXBlckNvbnRlbnRRdWVyaWVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmhlcml0Q29udGVudFF1ZXJpZXMoZGVmaW5pdGlvbiwgc3VwZXJDb250ZW50UXVlcmllcykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldkNvbnRlbnRRdWVyaWVzID0gZGVmaW5pdGlvbi5jb250ZW50UXVlcmllczsKICAgIGlmIChwcmV2Q29udGVudFF1ZXJpZXMpIHsKICAgICAgICBkZWZpbml0aW9uLmNvbnRlbnRRdWVyaWVzID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmYKICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZiwgY3R4LCBkaXJlY3RpdmVJbmRleCkgPT4gewogICAgICAgICAgICBzdXBlckNvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICAgICAgcHJldkNvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGRlZmluaXRpb24uY29udGVudFF1ZXJpZXMgPSBzdXBlckNvbnRlbnRRdWVyaWVzOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGRlZmluaXRpb24KICogQHBhcmFtIHs/fSBzdXBlckhvc3RCaW5kaW5ncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5oZXJpdEhvc3RCaW5kaW5ncyhkZWZpbml0aW9uLCBzdXBlckhvc3RCaW5kaW5ncykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldkhvc3RCaW5kaW5ncyA9IGRlZmluaXRpb24uaG9zdEJpbmRpbmdzOwogICAgaWYgKHByZXZIb3N0QmluZGluZ3MpIHsKICAgICAgICBkZWZpbml0aW9uLmhvc3RCaW5kaW5ncyA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJmCiAgICAgICAgICogQHBhcmFtIHs/fSBjdHgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZiwgY3R4KSA9PiB7CiAgICAgICAgICAgIHN1cGVySG9zdEJpbmRpbmdzKHJmLCBjdHgpOwogICAgICAgICAgICBwcmV2SG9zdEJpbmRpbmdzKHJmLCBjdHgpOwogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZGVmaW5pdGlvbi5ob3N0QmluZGluZ3MgPSBzdXBlckhvc3RCaW5kaW5nczsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9mZWF0dXJlcy9jb3B5X2RlZmluaXRpb25fZmVhdHVyZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogRmllbGRzIHdoaWNoIGV4aXN0IG9uIGVpdGhlciBkaXJlY3RpdmUgb3IgY29tcG9uZW50IGRlZmluaXRpb25zLCBhbmQgbmVlZCB0byBiZSBjb3BpZWQgZnJvbQogKiBwYXJlbnQgdG8gY2hpbGQgY2xhc3NlcyBieSB0aGUgYMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmVgLgogKiBAdHlwZSB7P30KICovCmNvbnN0IENPUFlfRElSRUNUSVZFX0ZJRUxEUyA9IFsKICAgIC8vIFRoZSBjaGlsZCBjbGFzcyBzaG91bGQgdXNlIHRoZSBwcm92aWRlcnMgb2YgaXRzIHBhcmVudC4KICAgICdwcm92aWRlcnNSZXNvbHZlcicsCl07Ci8qKgogKiBGaWVsZHMgd2hpY2ggZXhpc3Qgb25seSBvbiBjb21wb25lbnQgZGVmaW5pdGlvbnMsIGFuZCBuZWVkIHRvIGJlIGNvcGllZCBmcm9tIHBhcmVudCB0byBjaGlsZAogKiBjbGFzc2VzIGJ5IHRoZSBgybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZWAuCiAqCiAqIFRoZSB0eXBlIGhlcmUgYWxsb3dzIGFueSBmaWVsZCBvZiBgQ29tcG9uZW50RGVmYCB3aGljaCBpcyBub3QgYWxzbyBhIHByb3BlcnR5IG9mIGBEaXJlY3RpdmVEZWZgLAogKiBzaW5jZSB0aG9zZSBzaG91bGQgZ28gaW4gYENPUFlfRElSRUNUSVZFX0ZJRUxEU2AgYWJvdmUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ09QWV9DT01QT05FTlRfRklFTERTID0gWwogICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCB1c2UgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIG9mIGl0cyBwYXJlbnQsIGluY2x1ZGluZyBhbGwgdGVtcGxhdGUKICAgIC8vIHNlbWFudGljcy4KICAgICd0ZW1wbGF0ZScsCiAgICAnZGVjbHMnLAogICAgJ2NvbnN0cycsCiAgICAndmFycycsCiAgICAnb25QdXNoJywKICAgICduZ0NvbnRlbnRTZWxlY3RvcnMnLAogICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCB1c2UgdGhlIENTUyBzdHlsZXMgb2YgaXRzIHBhcmVudCwgaW5jbHVkaW5nIGFsbCBzdHlsaW5nIHNlbWFudGljcy4KICAgICdzdHlsZXMnLAogICAgJ2VuY2Fwc3VsYXRpb24nLAogICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCBiZSBjaGVja2VkIGJ5IHRoZSBydW50aW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdHMgcGFyZW50LgogICAgJ3NjaGVtYXMnLApdOwovKioKICogQ29waWVzIHRoZSBmaWVsZHMgbm90IGhhbmRsZWQgYnkgdGhlIGDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlYCBmcm9tIHRoZSBzdXBlcnR5cGUgb2YgYQogKiBkZWZpbml0aW9uLgogKgogKiBUaGlzIGV4aXN0cyBwcmltYXJpbHkgdG8gc3VwcG9ydCBuZ2NjIG1pZ3JhdGlvbiBvZiBhbiBleGlzdGluZyBWaWV3IEVuZ2luZSBwYXR0ZXJuLCB3aGVyZSBhbgogKiBlbnRpcmUgZGVjb3JhdG9yIGlzIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IHRvIGEgY2hpbGQgY2xhc3MuIFdoZW4gbmdjYyBkZXRlY3RzIHRoaXMgY2FzZSwgaXQKICogZ2VuZXJhdGVzIGEgc2tlbGV0b24gZGVmaW5pdGlvbiBvbiB0aGUgY2hpbGQgY2xhc3MsIGFuZCBhcHBsaWVzIHRoaXMgZmVhdHVyZS4KICoKICogVGhlIGDJtcm1Q29weURlZmluaXRpb25GZWF0dXJlYCB0aGVuIGNvcGllcyBhbnkgbmVlZGVkIGZpZWxkcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MnIGRlZmluaXRpb24sCiAqIGluY2x1ZGluZyB0aGluZ3MgbGlrZSB0aGUgY29tcG9uZW50IHRlbXBsYXRlIGZ1bmN0aW9uLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBkZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIGEgY2hpbGQgY2xhc3Mgd2hpY2ggaW5oZXJpdHMgZnJvbSBhIHBhcmVudCBjbGFzcyB3aXRoIGl0cwogKiBvd24gZGVmaW5pdGlvbi4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmUoZGVmaW5pdGlvbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN1cGVyVHlwZSA9ICgvKiogQHR5cGUgez99ICovIChnZXRTdXBlclR5cGUoZGVmaW5pdGlvbi50eXBlKSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN1cGVyRGVmID0gdW5kZWZpbmVkOwogICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZmluaXRpb24pKSB7CiAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgIHN1cGVyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHN1cGVyVHlwZS7JtWNtcCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgIHN1cGVyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHN1cGVyVHlwZS7JtWRpcikpOwogICAgfQogICAgLy8gTmVlZGVkIGJlY2F1c2UgYGRlZmluaXRpb25gIGZpZWxkcyBhcmUgcmVhZG9ubHkuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWZBbnkgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZmluaXRpb24pKSk7CiAgICAvLyBDb3B5IG92ZXIgYW55IGZpZWxkcyB0aGF0IGFwcGx5IHRvIGVpdGhlciBkaXJlY3RpdmVzIG9yIGNvbXBvbmVudHMuCiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIENPUFlfRElSRUNUSVZFX0ZJRUxEUykgewogICAgICAgIGRlZkFueVtmaWVsZF0gPSBzdXBlckRlZltmaWVsZF07CiAgICB9CiAgICBpZiAoaXNDb21wb25lbnREZWYoc3VwZXJEZWYpKSB7CiAgICAgICAgLy8gQ29weSBvdmVyIGFueSBjb21wb25lbnQtc3BlY2lmaWMgZmllbGRzLgogICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgQ09QWV9DT01QT05FTlRfRklFTERTKSB7CiAgICAgICAgICAgIGRlZkFueVtmaWVsZF0gPSBzdXBlckRlZltmaWVsZF07CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBSZXByZXNlbnRzIGEgYmFzaWMgY2hhbmdlIGZyb20gYSBwcmV2aW91cyB0byBhIG5ldyB2YWx1ZSBmb3IgYSBzaW5nbGUKICogcHJvcGVydHkgb24gYSBkaXJlY3RpdmUgaW5zdGFuY2UuIFBhc3NlZCBhcyBhIHZhbHVlIGluIGEKICoge0BsaW5rIFNpbXBsZUNoYW5nZXN9IG9iamVjdCB0byB0aGUgYG5nT25DaGFuZ2VzYCBob29rLgogKgogKiBAc2VlIGBPbkNoYW5nZXNgCiAqCiAqIEBwdWJsaWNBcGkKICovCmNsYXNzIFNpbXBsZUNoYW5nZSB7CiAgICBjb25zdHJ1Y3RvcihwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUsIGZpcnN0Q2hhbmdlKSB7CiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gcHJldmlvdXNWYWx1ZTsKICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICAgICAgICB0aGlzLmZpcnN0Q2hhbmdlID0gZmlyc3RDaGFuZ2U7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIG5ldyB2YWx1ZSBpcyB0aGUgZmlyc3QgdmFsdWUgYXNzaWduZWQuCiAgICAgKi8KICAgIGlzRmlyc3RDaGFuZ2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFuZ2U7CiAgICB9Cn0KLyoqCiAqIFRoZSBOZ09uQ2hhbmdlc0ZlYXR1cmUgZGVjb3JhdGVzIGEgY29tcG9uZW50IHdpdGggc3VwcG9ydCBmb3IgdGhlIG5nT25DaGFuZ2VzCiAqIGxpZmVjeWNsZSBob29rLCBzbyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW55IGNvbXBvbmVudCB0aGF0IGltcGxlbWVudHMKICogdGhhdCBob29rLgogKgogKiBJZiB0aGUgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSB1c2VzIGluaGVyaXRhbmNlLCB0aGUgTmdPbkNoYW5nZXNGZWF0dXJlIE1VU1QKICogYmUgaW5jbHVkZWQgYXMgYSBmZWF0dXJlIEFGVEVSIHtcQGxpbmsgSW5oZXJpdERlZmluaXRpb25GZWF0dXJlfSwgb3RoZXJ3aXNlCiAqIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gdGhlIG5nT25DaGFuZ2VzIGxpZmVjeWNsZQogKiBob29rLgogKgogKiBFeGFtcGxlIHVzYWdlOgogKgogKiBgYGAKICogc3RhdGljIMm1Y21wID0gZGVmaW5lQ29tcG9uZW50KHsKICogICAuLi4KICogICBpbnB1dHM6IHtuYW1lOiAncHVibGljTmFtZSd9LAogKiAgIGZlYXR1cmVzOiBbTmdPbkNoYW5nZXNGZWF0dXJlXQogKiB9KTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGRlZmluaXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmUoZGVmaW5pdGlvbikgewogICAgaWYgKGRlZmluaXRpb24udHlwZS5wcm90b3R5cGUubmdPbkNoYW5nZXMpIHsKICAgICAgICBkZWZpbml0aW9uLnNldElucHV0ID0gbmdPbkNoYW5nZXNTZXRJbnB1dDsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZmluaXRpb24pKSkub25DaGFuZ2VzID0gd3JhcE9uQ2hhbmdlcygpOwogICAgfQp9Ci8vIFRoaXMgb3B0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbmdPbkNoYW5nZXMgbGlmZWN5Y2xlIGhvb2sgd2lsbCBiZSBpbmhlcml0ZWQKLy8gZnJvbSBzdXBlcmNsYXNzZXMgKGluIEluaGVyaXREZWZpbml0aW9uRmVhdHVyZSkuCi8qKiBAbm9jb2xsYXBzZSAqLwovLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCigoLyoqIEB0eXBlIHs/fSAqLyAoybXJtU5nT25DaGFuZ2VzRmVhdHVyZSkpKS5uZ0luaGVyaXQgPSB0cnVlOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdyYXBPbkNoYW5nZXMoKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHRoaXMgez99CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB3cmFwT25DaGFuZ2VzSG9va19pblByZXZpb3VzQ2hhbmdlc1N0b3JhZ2UoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNpbXBsZUNoYW5nZXNTdG9yZSA9IGdldFNpbXBsZUNoYW5nZXNTdG9yZSh0aGlzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3VycmVudCA9IHNpbXBsZUNoYW5nZXNTdG9yZSAmJiBzaW1wbGVDaGFuZ2VzU3RvcmUuY3VycmVudDsKICAgICAgICBpZiAoY3VycmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gKC8qKiBAdHlwZSB7P30gKi8gKHNpbXBsZUNoYW5nZXNTdG9yZSkpLnByZXZpb3VzOwogICAgICAgICAgICBpZiAocHJldmlvdXMgPT09IEVNUFRZX09CSikgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHNpbXBsZUNoYW5nZXNTdG9yZSkpLnByZXZpb3VzID0gY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5ldyBjaGFuZ2VzIGFyZSBjb3BpZWQgdG8gdGhlIHByZXZpb3VzIHN0b3JlLCBzbyB0aGF0IHdlIGRvbid0IGxvc2UgaGlzdG9yeSBmb3IgaW5wdXRzCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3ZXJlIG5vdCBjaGFuZ2VkIHRoaXMgdGltZQogICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1trZXldID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChzaW1wbGVDaGFuZ2VzU3RvcmUpKS5jdXJyZW50ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5uZ09uQ2hhbmdlcyhjdXJyZW50KTsKICAgICAgICB9CiAgICB9KTsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHRoaXMgez99CiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHB1YmxpY05hbWUKICogQHBhcmFtIHs/fSBwcml2YXRlTmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmdPbkNoYW5nZXNTZXRJbnB1dChpbnN0YW5jZSwgdmFsdWUsIHB1YmxpY05hbWUsIHByaXZhdGVOYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzaW1wbGVDaGFuZ2VzU3RvcmUgPSBnZXRTaW1wbGVDaGFuZ2VzU3RvcmUoaW5zdGFuY2UpIHx8CiAgICAgICAgc2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlLCB7IHByZXZpb3VzOiBFTVBUWV9PQkosIGN1cnJlbnQ6IG51bGwgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjdXJyZW50ID0gc2ltcGxlQ2hhbmdlc1N0b3JlLmN1cnJlbnQgfHwgKHNpbXBsZUNoYW5nZXNTdG9yZS5jdXJyZW50ID0ge30pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXMgPSBzaW1wbGVDaGFuZ2VzU3RvcmUucHJldmlvdXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJlZE5hbWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVjbGFyZWRJbnB1dHMpKSlbcHVibGljTmFtZV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c0NoYW5nZSA9IHByZXZpb3VzW2RlY2xhcmVkTmFtZV07CiAgICBjdXJyZW50W2RlY2xhcmVkTmFtZV0gPSBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzQ2hhbmdlICYmIHByZXZpb3VzQ2hhbmdlLmN1cnJlbnRWYWx1ZSwgdmFsdWUsIHByZXZpb3VzID09PSBFTVBUWV9PQkopOwogICAgKCgvKiogQHR5cGUgez99ICovIChpbnN0YW5jZSkpKVtwcml2YXRlTmFtZV0gPSB2YWx1ZTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IFNJTVBMRV9DSEFOR0VTX1NUT1JFID0gJ19fbmdTaW1wbGVDaGFuZ2VzX18nOwovKioKICogQHBhcmFtIHs/fSBpbnN0YW5jZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlKSB7CiAgICByZXR1cm4gaW5zdGFuY2VbU0lNUExFX0NIQU5HRVNfU1RPUkVdIHx8IG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHBhcmFtIHs/fSBzdG9yZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlLCBzdG9yZSkgewogICAgcmV0dXJuIGluc3RhbmNlW1NJTVBMRV9DSEFOR0VTX1NUT1JFXSA9IHN0b3JlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2RpX3NldHVwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXNvbHZlcyB0aGUgcHJvdmlkZXJzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBEaXJlY3RpdmVEZWYuCiAqCiAqIFdoZW4gaW5zZXJ0aW5nIHRoZSB0b2tlbnMgYW5kIHRoZSBmYWN0b3JpZXMgaW4gdGhlaXIgcmVzcGVjdGl2ZSBhcnJheXMsIHdlIGNhbiBhc3N1bWUgdGhhdAogKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZmlyc3QgZm9yIHRoZSBjb21wb25lbnQgKGlmIGFueSksIGFuZCB0aGVuIGZvciBvdGhlciBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lCiAqIG5vZGUuCiAqIEFzIGEgY29uc2VxdWVuY2UsdGhlIHByb3ZpZGVycyBhcmUgYWx3YXlzIHByb2Nlc3NlZCBpbiB0aGF0IG9yZGVyOgogKiAxKSBUaGUgdmlldyBwcm92aWRlcnMgb2YgdGhlIGNvbXBvbmVudAogKiAyKSBUaGUgcHJvdmlkZXJzIG9mIHRoZSBjb21wb25lbnQKICogMykgVGhlIHByb3ZpZGVycyBvZiB0aGUgb3RoZXIgZGlyZWN0aXZlcwogKiBUaGlzIG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5qZWN0YWJsZXMgYXJyYXlzIG9mIGEgdmlldyAoZm9yIGVhY2ggbm9kZSkuCiAqIFNvIHRoZSB0b2tlbnMgYW5kIHRoZSBmYWN0b3JpZXMgY2FuIGJlIHB1c2hlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheXMsIGV4Y2VwdAogKiBpbiBvbmUgY2FzZSBmb3IgbXVsdGkgcHJvdmlkZXJzLgogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGRlZiB0aGUgZGlyZWN0aXZlIGRlZmluaXRpb24KICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHBhcmFtIHs/fSB2aWV3UHJvdmlkZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwcm92aWRlcnNSZXNvbHZlcihkZWYsIHByb3ZpZGVycywgdmlld1Byb3ZpZGVycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0NvbXBvbmVudCA9IGlzQ29tcG9uZW50RGVmKGRlZik7CiAgICAgICAgLy8gVGhlIGxpc3Qgb2YgdmlldyBwcm92aWRlcnMgaXMgcHJvY2Vzc2VkIGZpcnN0LCBhbmQgdGhlIGZsYWdzIGFyZSB1cGRhdGVkCiAgICAgICAgcmVzb2x2ZVByb3ZpZGVyJDEodmlld1Byb3ZpZGVycywgdFZpZXcuZGF0YSwgdFZpZXcuYmx1ZXByaW50LCBpc0NvbXBvbmVudCwgdHJ1ZSk7CiAgICAgICAgLy8gVGhlbiwgdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIGlzIHByb2Nlc3NlZCwgYW5kIHRoZSBmbGFncyBhcmUgdXBkYXRlZAogICAgICAgIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVycywgdFZpZXcuZGF0YSwgdFZpZXcuYmx1ZXByaW50LCBpc0NvbXBvbmVudCwgZmFsc2UpOwogICAgfQp9Ci8qKgogKiBSZXNvbHZlcyBhIHByb3ZpZGVyIGFuZCBwdWJsaXNoZXMgaXQgdG8gdGhlIERJIHN5c3RlbS4KICogQHBhcmFtIHs/fSBwcm92aWRlcgogKiBAcGFyYW0gez99IHRJbmplY3RhYmxlcwogKiBAcGFyYW0gez99IGxJbmplY3RhYmxlc0JsdWVwcmludAogKiBAcGFyYW0gez99IGlzQ29tcG9uZW50CiAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVyLCB0SW5qZWN0YWJsZXMsIGxJbmplY3RhYmxlc0JsdWVwcmludCwgaXNDb21wb25lbnQsIGlzVmlld1Byb3ZpZGVyKSB7CiAgICBwcm92aWRlciA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKTsKICAgIGlmIChBcnJheS5pc0FycmF5KHByb3ZpZGVyKSkgewogICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgYHJlc29sdmVQcm92aWRlcmAKICAgICAgICAvLyBSZWN1cnNpb24gaXMgT0sgaW4gdGhpcyBjYXNlIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgbm90IGJlIGluIGhvdC1wYXRoIG9uY2Ugd2UgaW1wbGVtZW50CiAgICAgICAgLy8gY2xvbmluZyBvZiB0aGUgaW5pdGlhbCBzdGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3ZpZGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVyW2ldLCB0SW5qZWN0YWJsZXMsIGxJbmplY3RhYmxlc0JsdWVwcmludCwgaXNDb21wb25lbnQsIGlzVmlld1Byb3ZpZGVyKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0b2tlbiA9IGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSA/IHByb3ZpZGVyIDogcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIucHJvdmlkZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcm92aWRlckZhY3RvcnkgPSBwcm92aWRlclRvRmFjdG9yeShwcm92aWRlcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJlZ2luSW5kZXggPSB0Tm9kZS5wcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3B0Vmlld1Byb3ZpZGVyc0NvdW50ID0gdE5vZGUucHJvdmlkZXJJbmRleGVzID4+IDE2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ICovOwogICAgICAgIGlmIChpc1R5cGVQcm92aWRlcihwcm92aWRlcikgfHwgIXByb3ZpZGVyLm11bHRpKSB7CiAgICAgICAgICAgIC8vIFNpbmdsZSBwcm92aWRlciBjYXNlOiB0aGUgZmFjdG9yeSBpcyBjcmVhdGVkIGFuZCBwdXNoZWQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE5vZGVJbmplY3RvckZhY3RvcnkocHJvdmlkZXJGYWN0b3J5LCBpc1ZpZXdQcm92aWRlciwgybXJtWRpcmVjdGl2ZUluamVjdCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdGYWN0b3J5SW5kZXggPSBpbmRleE9mKHRva2VuLCB0SW5qZWN0YWJsZXMsIGlzVmlld1Byb3ZpZGVyID8gYmVnaW5JbmRleCA6IGJlZ2luSW5kZXggKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQsIGVuZEluZGV4KTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nRmFjdG9yeUluZGV4ID09PSAtMSkgewogICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSgoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcpLCB0VmlldywgdG9rZW4pOwogICAgICAgICAgICAgICAgcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIHRJbmplY3RhYmxlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgdEluamVjdGFibGVzLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQrKzsKICAgICAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZUVuZCsrOwogICAgICAgICAgICAgICAgaWYgKGlzVmlld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdE5vZGUucHJvdmlkZXJJbmRleGVzICs9IDY1NTM2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ZXIgKi87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnQucHVzaChmYWN0b3J5KTsKICAgICAgICAgICAgICAgIGxWaWV3LnB1c2goZmFjdG9yeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdGYWN0b3J5SW5kZXhdID0gZmFjdG9yeTsKICAgICAgICAgICAgICAgIGxWaWV3W2V4aXN0aW5nRmFjdG9yeUluZGV4XSA9IGZhY3Rvcnk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIE11bHRpIHByb3ZpZGVyIGNhc2U6CiAgICAgICAgICAgIC8vIFdlIGNyZWF0ZSBhIG11bHRpIGZhY3Rvcnkgd2hpY2ggaXMgZ29pbmcgdG8gYWdncmVnYXRlIGFsbCB0aGUgdmFsdWVzLgogICAgICAgICAgICAvLyBTaW5jZSB0aGUgb3V0cHV0IG9mIHN1Y2ggYSBmYWN0b3J5IGRlcGVuZHMgb24gY29udGVudCBvciB2aWV3IGluamVjdGlvbiwKICAgICAgICAgICAgLy8gd2UgY3JlYXRlIHR3byBvZiB0aGVtLCB3aGljaCBhcmUgbGlua2VkIHRvZ2V0aGVyLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBUaGUgZmlyc3Qgb25lIChmb3IgdmlldyBwcm92aWRlcnMpIGlzIGFsd2F5cyBpbiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGluamVjdGFibGVzIGFycmF5LAogICAgICAgICAgICAvLyBhbmQgdGhlIHNlY29uZCBvbmUgKGZvciBwcm92aWRlcnMpIGlzIGFsd2F5cyBpbiB0aGUgc2Vjb25kIGJsb2NrLgogICAgICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHZpZXcgcHJvdmlkZXJzIGhhdmUgaGlnaGVyIHByaW9yaXR5LiBXaGVuIGEgbXVsdGkgdG9rZW4KICAgICAgICAgICAgLy8gaXMgYmVpbmcgbG9va2VkIHVwLCB0aGUgdmlldyBwcm92aWRlcnMgc2hvdWxkIGJlIGZvdW5kIGZpcnN0LgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgYSBtdWx0aSBmYWN0b3J5IGluIHRoZSB0aGlyZCBibG9jayAoZGlyZWN0aXZlIGJsb2NrKS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVGhlIGFsZ29yaXRobSB0byBwcm9jZXNzIG11bHRpIHByb3ZpZGVycyBpcyBhcyBmb2xsb3dzOgogICAgICAgICAgICAvLyAxKSBJZiB0aGUgbXVsdGkgcHJvdmlkZXIgY29tZXMgZnJvbSB0aGUgYHZpZXdQcm92aWRlcnNgIG9mIHRoZSBjb21wb25lbnQ6CiAgICAgICAgICAgIC8vICAgYSkgSWYgdGhlIHNwZWNpYWwgdmlldyBwcm92aWRlcnMgZmFjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBwdXNoZWQuCiAgICAgICAgICAgIC8vICAgYikgRWxzZSwgdGhlIG11bHRpIHByb3ZpZGVyIGlzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBtdWx0aSBmYWN0b3J5LgogICAgICAgICAgICAvLyAyKSBJZiB0aGUgbXVsdGkgcHJvdmlkZXIgY29tZXMgZnJvbSB0aGUgYHByb3ZpZGVyc2Agb2YgdGhlIGNvbXBvbmVudCBvciBvZiBhbm90aGVyCiAgICAgICAgICAgIC8vIGRpcmVjdGl2ZToKICAgICAgICAgICAgLy8gICBhKSBJZiB0aGUgbXVsdGkgZmFjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBwcm92aWRlciBwdXNoZWQgaW50byBpdC4KICAgICAgICAgICAgLy8gICAgICBJdCBpcyBhbHNvIGxpbmtlZCB0byB0aGUgbXVsdGkgZmFjdG9yeSBmb3IgdmlldyBwcm92aWRlcnMsIGlmIGl0IGV4aXN0cy4KICAgICAgICAgICAgLy8gICBiKSBFbHNlLCB0aGUgbXVsdGkgcHJvdmlkZXIgaXMgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIG11bHRpIGZhY3RvcnkuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXggPSBpbmRleE9mKHRva2VuLCB0SW5qZWN0YWJsZXMsIGJlZ2luSW5kZXggKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQsIGVuZEluZGV4KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBleGlzdGluZ1ZpZXdQcm92aWRlcnNGYWN0b3J5SW5kZXggPSBpbmRleE9mKHRva2VuLCB0SW5qZWN0YWJsZXMsIGJlZ2luSW5kZXgsIGJlZ2luSW5kZXggKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QgPSBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA+PSAwICYmCiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXhdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvZXNWaWV3UHJvdmlkZXJzRmFjdG9yeUV4aXN0ID0gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4ID49IDAgJiYKICAgICAgICAgICAgICAgIGxJbmplY3RhYmxlc0JsdWVwcmludFtleGlzdGluZ1ZpZXdQcm92aWRlcnNGYWN0b3J5SW5kZXhdOwogICAgICAgICAgICBpZiAoaXNWaWV3UHJvdmlkZXIgJiYgIWRvZXNWaWV3UHJvdmlkZXJzRmFjdG9yeUV4aXN0IHx8CiAgICAgICAgICAgICAgICAhaXNWaWV3UHJvdmlkZXIgJiYgIWRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgIC8vIENhc2VzIDEuYSBhbmQgMi5hCiAgICAgICAgICAgICAgICBkaVB1YmxpY0luSW5qZWN0b3IoZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCBsVmlldyksIHRWaWV3LCB0b2tlbik7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gbXVsdGlGYWN0b3J5KGlzVmlld1Byb3ZpZGVyID8gbXVsdGlWaWV3UHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyIDogbXVsdGlQcm92aWRlcnNGYWN0b3J5UmVzb2x2ZXIsIGxJbmplY3RhYmxlc0JsdWVwcmludC5sZW5ndGgsIGlzVmlld1Byb3ZpZGVyLCBpc0NvbXBvbmVudCwgcHJvdmlkZXJGYWN0b3J5KTsKICAgICAgICAgICAgICAgIGlmICghaXNWaWV3UHJvdmlkZXIgJiYgZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5wcm92aWRlckZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIHRJbmplY3RhYmxlcy5sZW5ndGgsIDApOwogICAgICAgICAgICAgICAgdEluamVjdGFibGVzLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQrKzsKICAgICAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZUVuZCsrOwogICAgICAgICAgICAgICAgaWYgKGlzVmlld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdE5vZGUucHJvdmlkZXJJbmRleGVzICs9IDY1NTM2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ZXIgKi87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnQucHVzaChmYWN0b3J5KTsKICAgICAgICAgICAgICAgIGxWaWV3LnB1c2goZmFjdG9yeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBDYXNlcyAxLmIgYW5kIDIuYgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXhJbkZhY3RvcnkgPSBtdWx0aUZhY3RvcnlBZGQoKC8qKiBAdHlwZSB7P30gKi8gKGxJbmplY3RhYmxlc0JsdWVwcmludCkpW2lzVmlld1Byb3ZpZGVyID8gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4IDoKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleF0sIHByb3ZpZGVyRmFjdG9yeSwgIWlzVmlld1Byb3ZpZGVyICYmIGlzQ29tcG9uZW50KTsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyRGVzdHJveUhvb2tzSWZTdXBwb3J0ZWQodFZpZXcsIHByb3ZpZGVyLCBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA+IC0xID8gZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXggOgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVmlld1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCwgaW5kZXhJbkZhY3RvcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNWaWV3UHJvdmlkZXIgJiYgaXNDb21wb25lbnQgJiYgZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5jb21wb25lbnRQcm92aWRlcnMpKSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBSZWdpc3RlcnMgdGhlIGBuZ09uRGVzdHJveWAgaG9vayBvZiBhIHByb3ZpZGVyLCBpZiB0aGUgcHJvdmlkZXIgc3VwcG9ydHMgZGVzdHJveSBob29rcy4KICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIGluIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBob29rLgogKiBAcGFyYW0gez99IHByb3ZpZGVyIFByb3ZpZGVyIHdob3NlIGhvb2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCiAqIEBwYXJhbSB7P30gY29udGV4dEluZGV4IEluZGV4IHVuZGVyIHdoaWNoIHRvIGZpbmQgdGhlIGNvbnRleHQgZm9yIHRoZSBob29rIHdoZW4gaXQncyBiZWluZyBpbnZva2VkLgogKiBAcGFyYW0gez89fSBpbmRleEluRmFjdG9yeSBPbmx5IHJlcXVpcmVkIGZvciBgbXVsdGlgIHByb3ZpZGVycy4gSW5kZXggb2YgdGhlIHByb3ZpZGVyIGluIHRoZSBtdWx0aQogKiBwcm92aWRlciBmYWN0b3J5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIGNvbnRleHRJbmRleCwgaW5kZXhJbkZhY3RvcnkpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByb3ZpZGVySXNUeXBlUHJvdmlkZXIgPSBpc1R5cGVQcm92aWRlcihwcm92aWRlcik7CiAgICBpZiAocHJvdmlkZXJJc1R5cGVQcm92aWRlciB8fCBpc0NsYXNzUHJvdmlkZXIocHJvdmlkZXIpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3RvdHlwZSA9ICgoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyKSkpLnVzZUNsYXNzIHx8IHByb3ZpZGVyKS5wcm90b3R5cGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nT25EZXN0cm95ID0gcHJvdG90eXBlLm5nT25EZXN0cm95OwogICAgICAgIGlmIChuZ09uRGVzdHJveSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhvb2tzID0gdFZpZXcuZGVzdHJveUhvb2tzIHx8ICh0Vmlldy5kZXN0cm95SG9va3MgPSBbXSk7CiAgICAgICAgICAgIGlmICghcHJvdmlkZXJJc1R5cGVQcm92aWRlciAmJiAoKCgvKiogQHR5cGUgez99ICovIChwcm92aWRlcikpKSkubXVsdGkpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQoaW5kZXhJbkZhY3RvcnksICdpbmRleEluRmFjdG9yeSB3aGVuIHJlZ2lzdGVyaW5nIG11bHRpIGZhY3RvcnkgZGVzdHJveSBob29rJyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0NhbGxiYWNrc0luZGV4ID0gaG9va3MuaW5kZXhPZihjb250ZXh0SW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tzSW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaG9va3MucHVzaChjb250ZXh0SW5kZXgsIFtpbmRleEluRmFjdG9yeSwgbmdPbkRlc3Ryb3ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoaG9va3NbZXhpc3RpbmdDYWxsYmFja3NJbmRleCArIDFdKSkpLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGluZGV4SW5GYWN0b3J5KSksIG5nT25EZXN0cm95KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvb2tzLnB1c2goY29udGV4dEluZGV4LCBuZ09uRGVzdHJveSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEFkZCBhIGZhY3RvcnkgaW4gYSBtdWx0aSBmYWN0b3J5LgogKiBAcGFyYW0gez99IG11bHRpRmFjdG9yeQogKiBAcGFyYW0gez99IGZhY3RvcnkKICogQHBhcmFtIHs/fSBpc0NvbXBvbmVudFByb3ZpZGVyCiAqIEByZXR1cm4gez99IEluZGV4IGF0IHdoaWNoIHRoZSBmYWN0b3J5IHdhcyBpbnNlcnRlZC4KICovCmZ1bmN0aW9uIG11bHRpRmFjdG9yeUFkZChtdWx0aUZhY3RvcnksIGZhY3RvcnksIGlzQ29tcG9uZW50UHJvdmlkZXIpIHsKICAgIGlmIChpc0NvbXBvbmVudFByb3ZpZGVyKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG11bHRpRmFjdG9yeS5jb21wb25lbnRQcm92aWRlcnMpKSsrOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChtdWx0aUZhY3RvcnkubXVsdGkpKS5wdXNoKGZhY3RvcnkpIC0gMTsKfQovKioKICogUmV0dXJucyB0aGUgaW5kZXggb2YgaXRlbSBpbiB0aGUgYXJyYXksIGJ1dCBvbmx5IGluIHRoZSBiZWdpbiB0byBlbmQgcmFuZ2UuCiAqIEBwYXJhbSB7P30gaXRlbQogKiBAcGFyYW0gez99IGFycgogKiBAcGFyYW0gez99IGJlZ2luCiAqIEBwYXJhbSB7P30gZW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmRleE9mKGl0ZW0sIGFyciwgYmVnaW4sIGVuZCkgewogICAgZm9yIChsZXQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpZiAoYXJyW2ldID09PSBpdGVtKQogICAgICAgICAgICByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKfQovKioKICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGBwcm92aWRlcnNgLgogKiBAdGhpcyB7P30KICogQHBhcmFtIHs/fSBfCiAqIEBwYXJhbSB7P30gdERhdGEKICogQHBhcmFtIHs/fSBsRGF0YQogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtdWx0aVByb3ZpZGVyc0ZhY3RvcnlSZXNvbHZlcihfLCB0RGF0YSwgbERhdGEsIHROb2RlKSB7CiAgICByZXR1cm4gbXVsdGlSZXNvbHZlKCgvKiogQHR5cGUgez99ICovICh0aGlzLm11bHRpKSksIFtdKTsKfQovKioKICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGB2aWV3UHJvdmlkZXJzYC4KICoKICogVGhpcyBmYWN0b3J5IGtub3dzIGhvdyB0byBjb25jYXRlbmF0ZSBpdHNlbGYgd2l0aCB0aGUgZXhpc3RpbmcgYG11bHRpYCBgcHJvdmlkZXJzYC4KICogQHRoaXMgez99CiAqIEBwYXJhbSB7P30gXwogKiBAcGFyYW0gez99IHREYXRhCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbXVsdGlWaWV3UHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyKF8sIHREYXRhLCBsVmlldywgdE5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZhY3RvcmllcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm11bHRpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzdWx0OwogICAgaWYgKHRoaXMucHJvdmlkZXJGYWN0b3J5KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudENvdW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMucHJvdmlkZXJGYWN0b3J5LmNvbXBvbmVudFByb3ZpZGVycykpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtdWx0aVByb3ZpZGVycyA9IGdldE5vZGVJbmplY3RhYmxlKGxWaWV3LCBsVmlld1tUVklFV10sICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5wcm92aWRlckZhY3RvcnkpKS5pbmRleCkpLCB0Tm9kZSk7CiAgICAgICAgLy8gQ29weSB0aGUgc2VjdGlvbiBvZiB0aGUgYXJyYXkgd2hpY2ggY29udGFpbnMgYG11bHRpYCBgcHJvdmlkZXJzYCBmcm9tIHRoZSBjb21wb25lbnQKICAgICAgICByZXN1bHQgPSBtdWx0aVByb3ZpZGVycy5zbGljZSgwLCBjb21wb25lbnRDb3VudCk7CiAgICAgICAgLy8gSW5zZXJ0IHRoZSBgdmlld1Byb3ZpZGVyYCBpbnN0YW5jZXMuCiAgICAgICAgbXVsdGlSZXNvbHZlKGZhY3RvcmllcywgcmVzdWx0KTsKICAgICAgICAvLyBDb3B5IHRoZSBzZWN0aW9uIG9mIHRoZSBhcnJheSB3aGljaCBjb250YWlucyBgbXVsdGlgIGBwcm92aWRlcnNgIGZyb20gb3RoZXIgZGlyZWN0aXZlcwogICAgICAgIGZvciAobGV0IGkgPSBjb21wb25lbnRDb3VudDsgaSA8IG11bHRpUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpUHJvdmlkZXJzW2ldKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgICAvLyBJbnNlcnQgdGhlIGB2aWV3UHJvdmlkZXJgIGluc3RhbmNlcy4KICAgICAgICBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogTWFwcyBhbiBhcnJheSBvZiBmYWN0b3JpZXMgaW50byBhbiBhcnJheSBvZiB2YWx1ZXMuCiAqIEBwYXJhbSB7P30gZmFjdG9yaWVzCiAqIEBwYXJhbSB7P30gcmVzdWx0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGZhY3Rvcmllc1tpXSkpKSk7CiAgICAgICAgcmVzdWx0LnB1c2goZmFjdG9yeSgpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIENyZWF0ZXMgYSBtdWx0aSBmYWN0b3J5LgogKiBAcGFyYW0gez99IGZhY3RvcnlGbgogKiBAcGFyYW0gez99IGluZGV4CiAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICogQHBhcmFtIHs/fSBpc0NvbXBvbmVudAogKiBAcGFyYW0gez99IGYKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG11bHRpRmFjdG9yeShmYWN0b3J5Rm4sIGluZGV4LCBpc1ZpZXdQcm92aWRlciwgaXNDb21wb25lbnQsIGYpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgTm9kZUluamVjdG9yRmFjdG9yeShmYWN0b3J5Rm4sIGlzVmlld1Byb3ZpZGVyLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KTsKICAgIGZhY3RvcnkubXVsdGkgPSBbXTsKICAgIGZhY3RvcnkuaW5kZXggPSBpbmRleDsKICAgIGZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzID0gMDsKICAgIG11bHRpRmFjdG9yeUFkZChmYWN0b3J5LCBmLCBpc0NvbXBvbmVudCAmJiAhaXNWaWV3UHJvdmlkZXIpOwogICAgcmV0dXJuIGZhY3Rvcnk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZmVhdHVyZXMvcHJvdmlkZXJzX2ZlYXR1cmUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRoaXMgZmVhdHVyZSByZXNvbHZlcyB0aGUgcHJvdmlkZXJzIG9mIGEgZGlyZWN0aXZlIChvciBjb21wb25lbnQpLAogKiBhbmQgcHVibGlzaCB0aGVtIGludG8gdGhlIERJIHN5c3RlbSwgbWFraW5nIGl0IHZpc2libGUgdG8gb3RoZXJzIGZvciBpbmplY3Rpb24uCiAqCiAqIEZvciBleGFtcGxlOgogKiBgYGB0cwogKiBjbGFzcyBDb21wb25lbnRXaXRoUHJvdmlkZXJzIHsKICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyZWV0ZXI6IEdyZWV0ZXJERSkge30KICoKICogICBzdGF0aWMgybVjbXAgPSBkZWZpbmVDb21wb25lbnQoewogKiAgICAgdHlwZTogQ29tcG9uZW50V2l0aFByb3ZpZGVycywKICogICAgIHNlbGVjdG9yczogW1snY29tcG9uZW50LXdpdGgtcHJvdmlkZXJzJ11dLAogKiAgICBmYWN0b3J5OiAoKSA9PiBuZXcgQ29tcG9uZW50V2l0aFByb3ZpZGVycyhkaXJlY3RpdmVJbmplY3QoR3JlZXRlckRFIGFzIGFueSkpLAogKiAgICBkZWNsczogMSwKICogICAgdmFyczogMSwKICogICAgdGVtcGxhdGU6IGZ1bmN0aW9uKGZzOiBSZW5kZXJGbGFncywgY3R4OiBDb21wb25lbnRXaXRoUHJvdmlkZXJzKSB7CiAqICAgICAgaWYgKGZzICYgUmVuZGVyRmxhZ3MuQ3JlYXRlKSB7CiAqICAgICAgICDJtcm1dGV4dCgwKTsKICogICAgICB9CiAqICAgICAgaWYgKGZzICYgUmVuZGVyRmxhZ3MuVXBkYXRlKSB7CiAqICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eC5ncmVldGVyLmdyZWV0KCkpOwogKiAgICAgIH0KICogICAgfSwKICogICAgZmVhdHVyZXM6IFtQcm92aWRlcnNGZWF0dXJlKFtHcmVldGVyREVdKV0KICogIH0pOwogKiB9CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHBhcmFtIHs/PX0gdmlld1Byb3ZpZGVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtVByb3ZpZGVyc0ZlYXR1cmUocHJvdmlkZXJzLCB2aWV3UHJvdmlkZXJzID0gW10pIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGRlZmluaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChkZWZpbml0aW9uKSA9PiB7CiAgICAgICAgZGVmaW5pdGlvbi5wcm92aWRlcnNSZXNvbHZlciA9CiAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gcHJvY2Vzc1Byb3ZpZGVyc0ZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGVmLCBwcm9jZXNzUHJvdmlkZXJzRm4pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnNSZXNvbHZlcihkZWYsIC8vCiAgICAgICAgICAgICAgICBwcm9jZXNzUHJvdmlkZXJzRm4gPyBwcm9jZXNzUHJvdmlkZXJzRm4ocHJvdmlkZXJzKSA6IHByb3ZpZGVycywgLy8KICAgICAgICAgICAgICAgIHZpZXdQcm92aWRlcnMpOwogICAgICAgICAgICB9KTsKICAgIH0pOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvY29tcG9uZW50X2ZhY3RvcnkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCBjcmVhdGVkIGJ5IGEgYENvbXBvbmVudEZhY3RvcnlgLgogKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmVsYXRlZCBvYmplY3RzLAogKiBhbmQgcHJvdmlkZXMgdGhlIG1lYW5zIG9mIGRlc3Ryb3lpbmcgdGhlIGluc3RhbmNlLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICogQHRlbXBsYXRlIEMKICovCmNsYXNzIENvbXBvbmVudFJlZiB7Cn0KLyoqCiAqIEJhc2UgY2xhc3MgZm9yIGEgZmFjdG9yeSB0aGF0IGNhbiBjcmVhdGUgYSBjb21wb25lbnQgZHluYW1pY2FsbHkuCiAqIEluc3RhbnRpYXRlIGEgZmFjdG9yeSBmb3IgYSBnaXZlbiB0eXBlIG9mIGNvbXBvbmVudCB3aXRoIGByZXNvbHZlQ29tcG9uZW50RmFjdG9yeSgpYC4KICogVXNlIHRoZSByZXN1bHRpbmcgYENvbXBvbmVudEZhY3RvcnkuY3JlYXRlKClgIG1ldGhvZCB0byBjcmVhdGUgYSBjb21wb25lbnQgb2YgdGhhdCB0eXBlLgogKgogKiBAc2VlIFtEeW5hbWljIENvbXBvbmVudHNdKGd1aWRlL2R5bmFtaWMtY29tcG9uZW50LWxvYWRlcikKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBDCiAqLwpjbGFzcyBDb21wb25lbnRGYWN0b3J5IHsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL2NvbXBvbmVudF9mYWN0b3J5X3Jlc29sdmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IGNvbXBvbmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlcnJvciA9IEVycm9yKGBObyBjb21wb25lbnQgZmFjdG9yeSBmb3VuZCBmb3IgJHtzdHJpbmdpZnkoY29tcG9uZW50KX0uIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/YCk7CiAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX0NPTVBPTkVOVF0gPSBjb21wb25lbnQ7CiAgICByZXR1cm4gZXJyb3I7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFUlJPUl9DT01QT05FTlQgPSAnbmdDb21wb25lbnQnOwpjbGFzcyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB7CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KSB7CiAgICAgICAgdGhyb3cgbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KTsKICAgIH0KfQovKioKICogQSBzaW1wbGUgcmVnaXN0cnkgdGhhdCBtYXBzIGBDb21wb25lbnRzYCB0byBnZW5lcmF0ZWQgYENvbXBvbmVudEZhY3RvcnlgIGNsYXNzZXMKICogdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGNvbXBvbmVudHMuCiAqIFVzZSB0byBvYnRhaW4gdGhlIGZhY3RvcnkgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IHR5cGUsCiAqIHRoZW4gdXNlIHRoZSBmYWN0b3J5J3MgYGNyZWF0ZSgpYCBtZXRob2QgdG8gY3JlYXRlIGEgY29tcG9uZW50IG9mIHRoYXQgdHlwZS4KICoKICogQHNlZSBbRHluYW1pYyBDb21wb25lbnRzXShndWlkZS9keW5hbWljLWNvbXBvbmVudC1sb2FkZXIpCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIHsKfQpDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIuTlVMTCA9IG5ldyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcigpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL2VsZW1lbnRfcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIHdyYXBwZXIgYXJvdW5kIGEgbmF0aXZlIGVsZW1lbnQgaW5zaWRlIG9mIGEgVmlldy4KICoKICogQW4gYEVsZW1lbnRSZWZgIGlzIGJhY2tlZCBieSBhIHJlbmRlci1zcGVjaWZpYyBlbGVtZW50LiBJbiB0aGUgYnJvd3NlciwgdGhpcyBpcyB1c3VhbGx5IGEgRE9NCiAqIGVsZW1lbnQuCiAqCiAqIFxAc2VjdXJpdHkgUGVybWl0dGluZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBET00gY2FuIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBtb3JlIHZ1bG5lcmFibGUgdG8KICogWFNTIGF0dGFja3MuIENhcmVmdWxseSByZXZpZXcgYW55IHVzZSBvZiBgRWxlbWVudFJlZmAgaW4geW91ciBjb2RlLiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUKICogW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwovLyBOb3RlOiBXZSBkb24ndCBleHBvc2UgdGhpbmdzIGxpa2UgYEluamVjdG9yYCwgYFZpZXdDb250YWluZXJgLCAuLi4gaGVyZSwKLy8gaS5lLiB1c2VycyBoYXZlIHRvIGFzayBmb3Igd2hhdCB0aGV5IG5lZWQuIFdpdGggdGhhdCwgd2UgY2FuIGJ1aWxkIGJldHRlciBhbmFseXNpcyB0b29scwovLyBhbmQgY291bGQgZG8gYmV0dGVyIGNvZGVnZW4gaW4gdGhlIGZ1dHVyZS4KY2xhc3MgRWxlbWVudFJlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmF0aXZlRWxlbWVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihuYXRpdmVFbGVtZW50KSB7CiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gbmF0aXZlRWxlbWVudDsKICAgIH0KfQovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KRWxlbWVudFJlZi5fX05HX0VMRU1FTlRfSURfXyA9ICgvKioKICogQHJldHVybiB7P30KICovCigpID0+IFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZKEVsZW1lbnRSZWYpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0RWxlbWVudFJlZjsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWSA9IFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZX19QT1NUX1IzX187CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIvYXBpLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUmVuZGVyZXIySW50ZXJjZXB0b3IgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1JlbmRlcmVyMkludGVyY2VwdG9yJyk7Ci8qKgogKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGN1c3RvbSByZW5kZXJlciB0aGF0IGltcGxlbWVudHMgdGhlIGBSZW5kZXJlcjJgIGJhc2UgY2xhc3MuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgUmVuZGVyZXJGYWN0b3J5MiB7Cn0KLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IFJlbmRlcmVyU3R5bGVGbGFnczIgPSB7CiAgICAvLyBUT0RPKG1pc2tvKTogVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGludG8gYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlIGltcG9ydGVkIGZyb20KICAgIC8vIGBub2RlX21hbmlwdWxhdGlvbi50c2AgQ3VycmVudGx5IGRvaW5nIHRoZSBpbXBvcnQgY2F1c2UgcmVzb2x1dGlvbiBvcmRlciB0byBjaGFuZ2UgYW5kIGZhaWxzCiAgICAvLyB0aGUgdGVzdHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBoYXZlIGhhcmQgY29kZWQgdmFsdWUgaW4gYG5vZGVfbWFuaXB1bGF0aW9uLnRzYCBmb3Igbm93LgogICAgLyoqCiAgICAgKiBNYXJrcyBhIHN0eWxlIGFzIGltcG9ydGFudC4KICAgICAqLwogICAgSW1wb3J0YW50OiAxLAogICAgLyoqCiAgICAgKiBNYXJrcyBhIHN0eWxlIGFzIHVzaW5nIGRhc2ggY2FzZSBuYW1pbmcgKHRoaXMtaXMtZGFzaC1jYXNlKS4KICAgICAqLwogICAgRGFzaENhc2U6IDIsCn07ClJlbmRlcmVyU3R5bGVGbGFnczJbUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnRdID0gJ0ltcG9ydGFudCc7ClJlbmRlcmVyU3R5bGVGbGFnczJbUmVuZGVyZXJTdHlsZUZsYWdzMi5EYXNoQ2FzZV0gPSAnRGFzaENhc2UnOwovKioKICogRXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyB0byBpbXBsZW1lbnQgY3VzdG9tIHJlbmRlcmluZy4gQnkgZGVmYXVsdCwgQW5ndWxhcgogKiByZW5kZXJzIGEgdGVtcGxhdGUgaW50byBET00uIFlvdSBjYW4gdXNlIGN1c3RvbSByZW5kZXJpbmcgdG8gaW50ZXJjZXB0CiAqIHJlbmRlcmluZyBjYWxscywgb3IgdG8gcmVuZGVyIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIERPTS4KICoKICogQ3JlYXRlIHlvdXIgY3VzdG9tIHJlbmRlcmVyIHVzaW5nIGBSZW5kZXJlckZhY3RvcnkyYC4KICoKICogVXNlIGEgY3VzdG9tIHJlbmRlcmVyIHRvIGJ5cGFzcyBBbmd1bGFyJ3MgdGVtcGxhdGluZyBhbmQKICogbWFrZSBjdXN0b20gVUkgY2hhbmdlcyB0aGF0IGNhbid0IGJlIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LgogKiBGb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBzZXQgYSBwcm9wZXJ0eSBvciBhbiBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcwogKiBub3Qgc3RhdGljYWxseSBrbm93biwgdXNlIHRoZSBgc2V0UHJvcGVydHkoKWAgb3IKICogYHNldEF0dHJpYnV0ZSgpYCBtZXRob2QuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgUmVuZGVyZXIyIHsKfQovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KUmVuZGVyZXIyLl9fTkdfRUxFTUVOVF9JRF9fID0gKC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gU1dJVENIX1JFTkRFUkVSMl9GQUNUT1JZKCkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0UmVuZGVyZXIyOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWSA9IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWV9fUE9TVF9SM19fOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3Nhbml0aXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogU2FuaXRpemVyIGlzIHVzZWQgYnkgdGhlIHZpZXdzIHRvIHNhbml0aXplIHBvdGVudGlhbGx5IGRhbmdlcm91cyB2YWx1ZXMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgU2FuaXRpemVyIHsKfQovKiogQG5vY29sbGFwc2UgKi8KU2FuaXRpemVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgIHRva2VuOiBTYW5pdGl6ZXIsCiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBudWxsKSwKfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy92ZXJzaW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFxAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBBbmd1bGFyCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBWZXJzaW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmdWxsCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGZ1bGwpIHsKICAgICAgICB0aGlzLmZ1bGwgPSBmdWxsOwogICAgICAgIHRoaXMubWFqb3IgPSBmdWxsLnNwbGl0KCcuJylbMF07CiAgICAgICAgdGhpcy5taW5vciA9IGZ1bGwuc3BsaXQoJy4nKVsxXTsKICAgICAgICB0aGlzLnBhdGNoID0gZnVsbC5zcGxpdCgnLicpLnNsaWNlKDIpLmpvaW4oJy4nKTsKICAgIH0KfQovKioKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9pdGVyYWJsZV9kaWZmZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeSB7CiAgICBjb25zdHJ1Y3RvcigpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3VwcG9ydHMob2JqKSB7CiAgICAgICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZSQxKG9iaik7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKiBAcGFyYW0gez89fSB0cmFja0J5Rm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZSh0cmFja0J5Rm4pIHsKICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRJdGVyYWJsZURpZmZlcih0cmFja0J5Rm4pOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgdHJhY2tCeUlkZW50aXR5ID0gKC8qKgogKiBAcGFyYW0gez99IGluZGV4CiAqIEBwYXJhbSB7P30gaXRlbQogKiBAcmV0dXJuIHs/fQogKi8KKGluZGV4LCBpdGVtKSA9PiBpdGVtKTsKLyoqCiAqIEBkZXByZWNhdGVkIHY0LjAuMCAtIFNob3VsZCBub3QgYmUgcGFydCBvZiBwdWJsaWMgQVBJLgogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVgogKi8KY2xhc3MgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gdHJhY2tCeUZuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHRyYWNrQnlGbikgewogICAgICAgIHRoaXMubGVuZ3RoID0gMDsKICAgICAgICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdXNlZCByZWNvcmRzIGF0IGFueSBwb2ludCBpbiB0aW1lIChkdXJpbmcgJiBhY3Jvc3MgYF9jaGVjaygpYCBjYWxscykKICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbnVsbDsKICAgICAgICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgcmVtb3ZlZCByZWNvcmRzIGF0IGFueSBwb2ludCBpbiB0aW1lIGR1cmluZyBgX2NoZWNrKClgIGNhbGxzLgogICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3JkcyA9IG51bGw7CiAgICAgICAgdGhpcy5fcHJldmlvdXNJdEhlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX2l0SGVhZCA9IG51bGw7CiAgICAgICAgdGhpcy5faXRUYWlsID0gbnVsbDsKICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gbnVsbDsKICAgICAgICB0aGlzLl9tb3Zlc0hlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX21vdmVzVGFpbCA9IG51bGw7CiAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsOwogICAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHJlY29yZHMgd2hlcmUgY3VzdG9tIHRyYWNrIGJ5IGlzIHRoZSBzYW1lLCBidXQgaXRlbSBpZGVudGl0eSBoYXMgY2hhbmdlZAogICAgICAgIHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSBudWxsOwogICAgICAgIHRoaXMuX3RyYWNrQnlGbiA9IHRyYWNrQnlGbiB8fCB0cmFja0J5SWRlbnRpdHk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hJdGVtKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3JFYWNoT3BlcmF0aW9uKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZXh0SXQgPSB0aGlzLl9pdEhlYWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZXh0UmVtb3ZlID0gdGhpcy5fcmVtb3ZhbHNIZWFkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYWRkUmVtb3ZlT2Zmc2V0ID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1vdmVPZmZzZXRzID0gbnVsbDsKICAgICAgICB3aGlsZSAobmV4dEl0IHx8IG5leHRSZW1vdmUpIHsKICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBpcyB0aGUgbmV4dCByZWNvcmQgdG8gcHJvY2VzcwogICAgICAgICAgICAvLyBPcmRlcjogcmVtb3ZlLCBhZGQsIG1vdmUKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWNvcmQgPSAhbmV4dFJlbW92ZSB8fAogICAgICAgICAgICAgICAgbmV4dEl0ICYmCiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG5leHRJdC5jdXJyZW50SW5kZXgpKSA8CiAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZXZpb3VzSW5kZXgobmV4dFJlbW92ZSwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cykgPwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG5leHRJdCkpIDoKICAgICAgICAgICAgICAgIG5leHRSZW1vdmU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWRqUHJldmlvdXNJbmRleCA9IGdldFByZXZpb3VzSW5kZXgocmVjb3JkLCBhZGRSZW1vdmVPZmZzZXQsIG1vdmVPZmZzZXRzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4OwogICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBpdGVtLCBhbmQgYWRqdXN0IHRoZSBhZGRSZW1vdmVPZmZzZXQgYW5kIHVwZGF0ZSBtb3ZlRGlzdGFuY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG5leHRSZW1vdmUpIHsKICAgICAgICAgICAgICAgIGFkZFJlbW92ZU9mZnNldC0tOwogICAgICAgICAgICAgICAgbmV4dFJlbW92ZSA9IG5leHRSZW1vdmUuX25leHRSZW1vdmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dEl0ID0gKC8qKiBAdHlwZSB7P30gKi8gKG5leHRJdCkpLl9uZXh0OwogICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdmVPZmZzZXQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIElOVkFSSUFOVDogIGN1cnJlbnRJbmRleCA8IHByZXZpb3VzSW5kZXgKICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVPZmZzZXRzKQogICAgICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE1vdmVQcmV2aW91c0luZGV4ID0gYWRqUHJldmlvdXNJbmRleCAtIGFkZFJlbW92ZU9mZnNldDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxDdXJyZW50SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudEluZGV4KSkgLSBhZGRSZW1vdmVPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTW92ZVByZXZpb3VzSW5kZXggIT0gbG9jYWxDdXJyZW50SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbE1vdmVQcmV2aW91c0luZGV4OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGkgPCBtb3ZlT2Zmc2V0cy5sZW5ndGggPyBtb3ZlT2Zmc2V0c1tpXSA6IChtb3ZlT2Zmc2V0c1tpXSA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQ3VycmVudEluZGV4IDw9IGluZGV4ICYmIGluZGV4IDwgbG9jYWxNb3ZlUHJldmlvdXNJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzW2ldID0gb2Zmc2V0ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSByZWNvcmQucHJldmlvdXNJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZU9mZnNldHNbcHJldmlvdXNJbmRleF0gPSBsb2NhbEN1cnJlbnRJbmRleCAtIGxvY2FsTW92ZVByZXZpb3VzSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZGpQcmV2aW91c0luZGV4ICE9PSBjdXJyZW50SW5kZXgpIHsKICAgICAgICAgICAgICAgIGZuKHJlY29yZCwgYWRqUHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaFByZXZpb3VzSXRlbShmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UHJldmlvdXMpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hBZGRlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hNb3ZlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZCkgewogICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaFJlbW92ZWRJdGVtKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkgewogICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaElkZW50aXR5Q2hhbmdlKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dElkZW50aXR5Q2hhbmdlKSB7CiAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpZmYoY29sbGVjdGlvbikgewogICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpCiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBbXTsKICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZSQxKGNvbGxlY3Rpb24pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgdHJ5aW5nIHRvIGRpZmYgJyR7c3RyaW5naWZ5KGNvbGxlY3Rpb24pfScuIE9ubHkgYXJyYXlzIGFuZCBpdGVyYWJsZXMgYXJlIGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuY2hlY2soY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveSgpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNoZWNrKGNvbGxlY3Rpb24pIHsKICAgICAgICB0aGlzLl9yZXNldCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faXRIZWFkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWF5QmVEaXJ0eSA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpdGVtOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaXRlbVRyYWNrQnk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2xsZWN0aW9uW2luZGV4XTsKICAgICAgICAgICAgICAgIGl0ZW1UcmFja0J5ID0gdGhpcy5fdHJhY2tCeUZuKGluZGV4LCBpdGVtKTsKICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwgfHwgIWxvb3NlSWRlbnRpY2FsKHJlY29yZC50cmFja0J5SWQsIGl0ZW1UcmFja0J5KSkgewogICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX21pc21hdGNoKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICBtYXlCZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXlCZURpcnR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiBjYW4gd2UgbGltaXQgdGhpcyB0byBkdXBsaWNhdGVzIG9ubHk/CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHJlY29yZCwgaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWNvcmQgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgaXRlcmF0ZUxpc3RMaWtlJDEoY29sbGVjdGlvbiwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICBpdGVtVHJhY2tCeSA9IHRoaXMuX3RyYWNrQnlGbihpbmRleCwgaXRlbSk7CiAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09PSBudWxsIHx8ICFsb29zZUlkZW50aWNhbChyZWNvcmQudHJhY2tCeUlkLCBpdGVtVHJhY2tCeSkpIHsKICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSB0aGlzLl9taXNtYXRjaChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWF5QmVEaXJ0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogY2FuIHdlIGxpbWl0IHRoaXMgdG8gZHVwbGljYXRlcyBvbmx5PwogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSB0aGlzLl92ZXJpZnlSZWluc2VydGlvbihyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0OwogICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkubGVuZ3RoID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3RydW5jYXRlKHJlY29yZCk7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwogICAgICAgIHJldHVybiB0aGlzLmlzRGlydHk7CiAgICB9CiAgICAvKiBDb2xsZWN0aW9uQ2hhbmdlcyBpcyBjb25zaWRlcmVkIGRpcnR5IGlmIGl0IGhhcyBhbnkgYWRkaXRpb25zLCBtb3ZlcywgcmVtb3ZhbHMsIG9yIGlkZW50aXR5CiAgICAgICAqIGNoYW5nZXMuCiAgICAgICAqLwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaXNEaXJ0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25zSGVhZCAhPT0gbnVsbCB8fCB0aGlzLl9tb3Zlc0hlYWQgIT09IG51bGwgfHwKICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgIT09IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgY2hhbmdlIG9iamVjdHMgdG8gc2hvdyBubyBjaGFuZ2VzLiBUaGlzIG1lYW5zIHNldCBwcmV2aW91c0tleSB0bwogICAgICogY3VycmVudEtleSwgYW5kIGNsZWFyIGFsbCBvZiB0aGUgcXVldWVzIChhZGRpdGlvbnMsIG1vdmVzLCByZW1vdmFscykuCiAgICAgKiBTZXQgdGhlIHByZXZpb3VzSW5kZXhlcyBvZiBtb3ZlZCBhbmQgYWRkZWQgaXRlbXMgdG8gdGhlaXIgY3VycmVudEluZGV4ZXMKICAgICAqIFJlc2V0IHRoZSBsaXN0IG9mIGFkZGl0aW9ucywgbW92ZXMgYW5kIHJlbW92YWxzCiAgICAgKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Jlc2V0KCkgewogICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBuZXh0UmVjb3JkOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzSXRIZWFkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkgewogICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNJbmRleCA9IHJlY29yZC5jdXJyZW50SW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSBuZXh0UmVjb3JkKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNJbmRleCA9IHJlY29yZC5jdXJyZW50SW5kZXg7CiAgICAgICAgICAgICAgICBuZXh0UmVjb3JkID0gcmVjb3JkLl9uZXh0TW92ZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbW92ZXNIZWFkID0gdGhpcy5fbW92ZXNUYWlsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gdGhpcy5fcmVtb3ZhbHNUYWlsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSBudWxsOwogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOiB3aGVuIGFzc2VydCBnZXRzIHN1cHBvcnRlZAogICAgICAgICAgICAvLyBhc3NlcnQoIXRoaXMuaXNEaXJ0eSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBjb3JlIGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb2xsZWN0aW9ucy4KICAgICAqCiAgICAgKiAtIGByZWNvcmRgIGlzIHRoZSByZWNvcmQgd2hpY2ggd2Ugc2F3IGF0IHRoaXMgcG9zaXRpb24gbGFzdCB0aW1lLiBJZiBudWxsIHRoZW4gaXQgaXMgYSBuZXcKICAgICAqICAgaXRlbS4KICAgICAqIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24KICAgICAqIC0gYGluZGV4YCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24KICAgICAqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcGFyYW0gez99IGl0ZW1UcmFja0J5CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbWlzbWF0Y2gocmVjb3JkLCBpdGVtLCBpdGVtVHJhY2tCeSwgaW5kZXgpIHsKICAgICAgICAvLyBUaGUgcHJldmlvdXMgcmVjb3JkIGFmdGVyIHdoaWNoIHdlIHdpbGwgYXBwZW5kIHRoZSBjdXJyZW50IG9uZS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByZXZpb3VzUmVjb3JkOwogICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwpIHsKICAgICAgICAgICAgcHJldmlvdXNSZWNvcmQgPSB0aGlzLl9pdFRhaWw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2aW91c1JlY29yZCA9IHJlY29yZC5fcHJldjsKICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZWNvcmQgZnJvbSB0aGUgY29sbGVjdGlvbiBzaW5jZSB3ZSBrbm93IGl0IGRvZXMgbm90IG1hdGNoIHRoZSBpdGVtLgogICAgICAgICAgICB0aGlzLl9yZW1vdmUocmVjb3JkKTsKICAgICAgICB9CiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZWUgaWYgd2UgaGF2ZSBzZWVuIHRoZSBpdGVtIGJlZm9yZS4KICAgICAgICByZWNvcmQgPSB0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX2xpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgaWYgKHJlY29yZCAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBXZSBoYXZlIHNlZW4gdGhpcyBiZWZvcmUsIHdlIG5lZWQgdG8gbW92ZSBpdCBmb3J3YXJkIGluIHRoZSBjb2xsZWN0aW9uLgogICAgICAgICAgICAvLyBCdXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBpZGVudGl0eSBjaGFuZ2VkLCBzbyB3ZSBjYW4gdXBkYXRlIGluIHZpZXcgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKQogICAgICAgICAgICAgICAgdGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UocmVjb3JkLCBpdGVtKTsKICAgICAgICAgICAgdGhpcy5fbW92ZUFmdGVyKHJlY29yZCwgcHJldmlvdXNSZWNvcmQsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIE5ldmVyIHNlZW4gaXQsIGNoZWNrIGV2aWN0ZWQgbGlzdC4KICAgICAgICAgICAgcmVjb3JkID0gdGhpcy5fdW5saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQoaXRlbVRyYWNrQnksIG51bGwpOwogICAgICAgICAgICBpZiAocmVjb3JkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhbiBpdGVtIHdoaWNoIHdlIGhhdmUgZXZpY3RlZCBlYXJsaWVyOiByZWluc2VydCBpdCBiYWNrIGludG8gdGhlIGxpc3QuCiAgICAgICAgICAgICAgICAvLyBCdXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBpZGVudGl0eSBjaGFuZ2VkLCBzbyB3ZSBjYW4gdXBkYXRlIGluIHZpZXcgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pOwogICAgICAgICAgICAgICAgdGhpcy5fcmVpbnNlcnRBZnRlcihyZWNvcmQsIHByZXZpb3VzUmVjb3JkLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIG5ldyBpdGVtOiBhZGQgaXQuCiAgICAgICAgICAgICAgICByZWNvcmQgPQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEFmdGVyKG5ldyBJdGVyYWJsZUNoYW5nZVJlY29yZF8oaXRlbSwgaXRlbVRyYWNrQnkpLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgY2hlY2sgaXMgb25seSBuZWVkZWQgaWYgYW4gYXJyYXkgY29udGFpbnMgZHVwbGljYXRlcy4gKFNob3J0IGNpcmN1aXQgb2Ygbm90aGluZyBkaXJ0eSkKICAgICAqCiAgICAgKiBVc2UgY2FzZTogYFthLCBhXWAgPT4gYFtiLCBhLCBhXWAKICAgICAqCiAgICAgKiBJZiB3ZSBkaWQgbm90IGhhdmUgdGhpcyBjaGVjayB0aGVuIHRoZSBpbnNlcnRpb24gb2YgYGJgIHdvdWxkOgogICAgICogICAxKSBldmljdCBmaXJzdCBgYWAKICAgICAqICAgMikgaW5zZXJ0IGBiYCBhdCBgMGAgaW5kZXguCiAgICAgKiAgIDMpIGxlYXZlIGBhYCBhdCBpbmRleCBgMWAgYXMgaXMuIDwtLSB0aGlzIGlzIHdyb25nIQogICAgICogICAzKSByZWluc2VydCBgYWAgYXQgaW5kZXggMi4gPC0tIHRoaXMgaXMgd3JvbmchCiAgICAgKgogICAgICogVGhlIGNvcnJlY3QgYmVoYXZpb3IgaXM6CiAgICAgKiAgIDEpIGV2aWN0IGZpcnN0IGBhYAogICAgICogICAyKSBpbnNlcnQgYGJgIGF0IGAwYCBpbmRleC4KICAgICAqICAgMykgcmVpbnNlcnQgYGFgIGF0IGluZGV4IDEuCiAgICAgKiAgIDMpIG1vdmUgYGFgIGF0IGZyb20gYDFgIHRvIGAyYC4KICAgICAqCiAgICAgKgogICAgICogRG91YmxlIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZXZpY3RlZCBhIGR1cGxpY2F0ZSBpdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBpdGVtIHR5cGUgbWF5CiAgICAgKiBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkOgogICAgICogVGhlIGluc2VydGlvbiBvZiBiIHdpbGwgZXZpY3QgdGhlIGZpcnN0ICdhJy4gSWYgd2UgZG9uJ3QgcmVpbnNlcnQgaXQgbm93IGl0IHdpbGwgYmUgcmVpbnNlcnRlZAogICAgICogYXQgdGhlIGVuZC4gV2hpY2ggd2lsbCBzaG93IHVwIGFzIHRoZSB0d28gJ2EncyBzd2l0Y2hpbmcgcG9zaXRpb24uIFRoaXMgaXMgaW5jb3JyZWN0LCBzaW5jZSBhCiAgICAgKiBiZXR0ZXIgd2F5IHRvIHRoaW5rIG9mIGl0IGlzIGFzIGluc2VydCBvZiAnYicgcmF0aGVyIHRoZW4gc3dpdGNoICdhJyB3aXRoICdiJyBhbmQgdGhlbiBhZGQgJ2EnCiAgICAgKiBhdCB0aGUgZW5kLgogICAgICoKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEBwYXJhbSB7P30gaXRlbVRyYWNrQnkKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF92ZXJpZnlSZWluc2VydGlvbihyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVpbnNlcnRSZWNvcmQgPSB0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChpdGVtVHJhY2tCeSwgbnVsbCk7CiAgICAgICAgaWYgKHJlaW5zZXJ0UmVjb3JkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3JlaW5zZXJ0QWZ0ZXIocmVpbnNlcnRSZWNvcmQsICgvKiogQHR5cGUgez99ICovIChyZWNvcmQuX3ByZXYpKSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyZWNvcmQuY3VycmVudEluZGV4ICE9IGluZGV4KSB7CiAgICAgICAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHJpZCBvZiBhbnkgZXhjZXNzIHtcQGxpbmsgSXRlcmFibGVDaGFuZ2VSZWNvcmRffXMgZnJvbSB0aGUgcHJldmlvdXMgY29sbGVjdGlvbgogICAgICoKICAgICAqIC0gYHJlY29yZGAgVGhlIGZpcnN0IGV4Y2VzcyB7XEBsaW5rIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkX30uCiAgICAgKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90cnVuY2F0ZShyZWNvcmQpIHsKICAgICAgICAvLyBBbnl0aGluZyBhZnRlciB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQ7CiAgICAgICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHRSZWNvcmQgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHJlY29yZCkpOwogICAgICAgICAgICByZWNvcmQgPSBuZXh0UmVjb3JkOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fdW5saW5rZWRSZWNvcmRzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5jbGVhcigpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbW92ZXNUYWlsICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2l0VGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pdFRhaWwuX25leHQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fcmVtb3ZhbHNUYWlsICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEBwYXJhbSB7P30gcHJldlJlY29yZAogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkgewogICAgICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzLnJlbW92ZShyZWNvcmQpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldlJlbW92ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkOwogICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2Ll9uZXh0UmVtb3ZlZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHByZXY7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXh0Ll9wcmV2UmVtb3ZlZCA9IHByZXY7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpOwogICAgICAgIHRoaXMuX2FkZFRvTW92ZXMocmVjb3JkLCBpbmRleCk7CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEBwYXJhbSB7P30gcHJldlJlY29yZAogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX21vdmVBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7CiAgICAgICAgdGhpcy5fdW5saW5rKHJlY29yZCk7CiAgICAgICAgdGhpcy5faW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCk7CiAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkQWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkgewogICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpOwogICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgICAgIC8vIGFzc2VydCh0aGlzLl9hZGRpdGlvbnNIZWFkID09PSBudWxsKTsKICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IHByZXZSZWNvcmQKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7CiAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAvLyBhc3NlcnQocmVjb3JkICE9IHByZXZSZWNvcmQpOwogICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT09IG51bGwpOwogICAgICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXYgPT09IG51bGwpOwogICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgLy8gYXNzZXJ0KHJlY29yZCAhPSBwcmV2UmVjb3JkKTsKICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0ID09PSBudWxsKTsKICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9wcmV2ID09PSBudWxsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dCA9IHByZXZSZWNvcmQgPT09IG51bGwgPyB0aGlzLl9pdEhlYWQgOiBwcmV2UmVjb3JkLl9uZXh0OwogICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgLy8gYXNzZXJ0KG5leHQgIT0gcmVjb3JkKTsKICAgICAgICAvLyBhc3NlcnQocHJldlJlY29yZCAhPSByZWNvcmQpOwogICAgICAgIHJlY29yZC5fbmV4dCA9IG5leHQ7CiAgICAgICAgcmVjb3JkLl9wcmV2ID0gcHJldlJlY29yZDsKICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pdFRhaWwgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXh0Ll9wcmV2ID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBpZiAocHJldlJlY29yZCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pdEhlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2UmVjb3JkLl9uZXh0ID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTsKICAgICAgICByZWNvcmQuY3VycmVudEluZGV4ID0gaW5kZXg7CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmUocmVjb3JkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHJlY29yZCkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VubGluayhyZWNvcmQpIHsKICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzLnJlbW92ZShyZWNvcmQpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9wcmV2ID0gbnVsbCkgPT09IG51bGwpOwogICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9uZXh0ID0gbnVsbCkgPT09IG51bGwpOwogICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX2l0SGVhZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2Ll9uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKG5leHQgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5faXRUYWlsID0gcHJldjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5leHQuX3ByZXYgPSBwcmV2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHBhcmFtIHs/fSB0b0luZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkVG9Nb3ZlcyhyZWNvcmQsIHRvSW5kZXgpIHsKICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRNb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09PSB0b0luZGV4KSB7CiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9tb3Zlc1RhaWwgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgLy8gYXNzZXJ0KF9tb3Zlc0hlYWQgPT09IG51bGwpOwogICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwgPSB0aGlzLl9tb3Zlc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX21vdmVzVGFpbC5fbmV4dE1vdmVkID09PSBudWxsKTsKICAgICAgICAgICAgdGhpcy5fbW92ZXNUYWlsID0gdGhpcy5fbW92ZXNUYWlsLl9uZXh0TW92ZWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZFRvUmVtb3ZhbHMocmVjb3JkKSB7CiAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMgPSBuZXcgX0R1cGxpY2F0ZU1hcCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHJlY29yZCk7CiAgICAgICAgcmVjb3JkLmN1cnJlbnRJbmRleCA9IG51bGw7CiAgICAgICAgcmVjb3JkLl9uZXh0UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgaWYgKHRoaXMuX3JlbW92YWxzVGFpbCA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX3JlbW92YWxzSGVhZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzSGVhZCA9IHJlY29yZDsKICAgICAgICAgICAgcmVjb3JkLl9wcmV2UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPT09IG51bGwpOwogICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSB0aGlzLl9yZW1vdmFsc1RhaWw7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pIHsKICAgICAgICByZWNvcmQuaXRlbSA9IGl0ZW07CiAgICAgICAgaWYgKHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgVgogKi8KY2xhc3MgSXRlcmFibGVDaGFuZ2VSZWNvcmRfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcGFyYW0gez99IHRyYWNrQnlJZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihpdGVtLCB0cmFja0J5SWQpIHsKICAgICAgICB0aGlzLml0ZW0gPSBpdGVtOwogICAgICAgIHRoaXMudHJhY2tCeUlkID0gdHJhY2tCeUlkOwogICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gbnVsbDsKICAgICAgICB0aGlzLnByZXZpb3VzSW5kZXggPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0UHJldmlvdXMgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX3ByZXZEdXAgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0RHVwID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcHJldlJlbW92ZWQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRBZGRlZCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRNb3ZlZCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRJZGVudGl0eUNoYW5nZSA9IG51bGw7CiAgICB9Cn0KLy8gQSBsaW5rZWQgbGlzdCBvZiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkcyB3aXRoIHRoZSBzYW1lIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy5pdGVtCi8qKgogKiBAdGVtcGxhdGUgVgogKi8KY2xhc3MgX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9oZWFkID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdGFpbCA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZCB0aGUgcmVjb3JkIHRvIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuCiAgICAgKgogICAgICogTm90ZTogYnkgZGVzaWduIGFsbCByZWNvcmRzIGluIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgaG9sZCB0aGUgc2FtZSB2YWx1ZSBpbiByZWNvcmQuaXRlbS4KICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGQocmVjb3JkKSB7CiAgICAgICAgaWYgKHRoaXMuX2hlYWQgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7CiAgICAgICAgICAgIHJlY29yZC5fbmV4dER1cCA9IG51bGw7CiAgICAgICAgICAgIHJlY29yZC5fcHJldkR1cCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLml0ZW0gPT0gIF9oZWFkLml0ZW0gfHwKICAgICAgICAgICAgLy8gICAgICAgcmVjb3JkLml0ZW0gaXMgbnVtICYmIHJlY29yZC5pdGVtLmlzTmFOICYmIF9oZWFkLml0ZW0gaXMgbnVtICYmIF9oZWFkLml0ZW0uaXNOYU4pOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdGFpbCkpLl9uZXh0RHVwID0gcmVjb3JkOwogICAgICAgICAgICByZWNvcmQuX3ByZXZEdXAgPSB0aGlzLl90YWlsOwogICAgICAgICAgICByZWNvcmQuX25leHREdXAgPSBudWxsOwogICAgICAgICAgICB0aGlzLl90YWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgIH0KICAgIC8vIFJldHVybnMgYSBJdGVyYWJsZUNoYW5nZVJlY29yZF8gaGF2aW5nIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy50cmFja0J5SWQgPT0gdHJhY2tCeUlkIGFuZAogICAgLy8gSXRlcmFibGVDaGFuZ2VSZWNvcmRfLmN1cnJlbnRJbmRleCA+PSBhdE9yQWZ0ZXJJbmRleAogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRyYWNrQnlJZAogICAgICogQHBhcmFtIHs/fSBhdE9yQWZ0ZXJJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHRyYWNrQnlJZCwgYXRPckFmdGVySW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0RHVwKSB7CiAgICAgICAgICAgIGlmICgoYXRPckFmdGVySW5kZXggPT09IG51bGwgfHwgYXRPckFmdGVySW5kZXggPD0gKC8qKiBAdHlwZSB7P30gKi8gKHJlY29yZC5jdXJyZW50SW5kZXgpKSkgJiYKICAgICAgICAgICAgICAgIGxvb3NlSWRlbnRpY2FsKHJlY29yZC50cmFja0J5SWQsIHRyYWNrQnlJZCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBvbmUge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KICAgICAqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBpcyBlbXB0eS4KICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmUocmVjb3JkKSB7CiAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAvLyBhc3NlcnQoKCkgewogICAgICAgIC8vICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjb3JkIGJlaW5nIHJlbW92ZWQgaXMgaW4gdGhlIGxpc3QuCiAgICAgICAgLy8gIGZvciAoSXRlcmFibGVDaGFuZ2VSZWNvcmRfIGN1cnNvciA9IF9oZWFkOyBjdXJzb3IgIT0gbnVsbDsgY3Vyc29yID0gY3Vyc29yLl9uZXh0RHVwKSB7CiAgICAgICAgLy8gICAgaWYgKGlkZW50aWNhbChjdXJzb3IsIHJlY29yZCkpIHJldHVybiB0cnVlOwogICAgICAgIC8vICB9CiAgICAgICAgLy8gIHJldHVybiBmYWxzZTsKICAgICAgICAvL30pOwogICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgLy8gYXNzZXJ0KCgpIHsKICAgICAgICAvLyAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlY29yZCBiZWluZyByZW1vdmVkIGlzIGluIHRoZSBsaXN0LgogICAgICAgIC8vICBmb3IgKEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyBjdXJzb3IgPSBfaGVhZDsgY3Vyc29yICE9IG51bGw7IGN1cnNvciA9IGN1cnNvci5fbmV4dER1cCkgewogICAgICAgIC8vICAgIGlmIChpZGVudGljYWwoY3Vyc29yLCByZWNvcmQpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAvLyAgfQogICAgICAgIC8vICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy99KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldkR1cDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dER1cDsKICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9oZWFkID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByZXYuX25leHREdXAgPSBuZXh0OwogICAgICAgIH0KICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl90YWlsID0gcHJldjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5leHQuX3ByZXZEdXAgPSBwcmV2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5faGVhZCA9PT0gbnVsbDsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFYKICovCmNsYXNzIF9EdXBsaWNhdGVNYXAgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwdXQocmVjb3JkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHJlY29yZC50cmFja0J5SWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkdXBsaWNhdGVzID0gdGhpcy5tYXAuZ2V0KGtleSk7CiAgICAgICAgaWYgKCFkdXBsaWNhdGVzKSB7CiAgICAgICAgICAgIGR1cGxpY2F0ZXMgPSBuZXcgX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0KCk7CiAgICAgICAgICAgIHRoaXMubWFwLnNldChrZXksIGR1cGxpY2F0ZXMpOwogICAgICAgIH0KICAgICAgICBkdXBsaWNhdGVzLmFkZChyZWNvcmQpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgYHZhbHVlYCB1c2luZyBrZXkuIEJlY2F1c2UgdGhlIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyB2YWx1ZSBtYXkgYmUgb25lIHdoaWNoIHdlCiAgICAgKiBoYXZlIGFscmVhZHkgaXRlcmF0ZWQgb3Zlciwgd2UgdXNlIHRoZSBgYXRPckFmdGVySW5kZXhgIHRvIHByZXRlbmQgaXQgaXMgbm90IHRoZXJlLgogICAgICoKICAgICAqIFVzZSBjYXNlOiBgW2EsIGIsIGMsIGEsIGFdYCBpZiB3ZSBhcmUgYXQgaW5kZXggYDNgIHdoaWNoIGlzIHRoZSBzZWNvbmQgYGFgIHRoZW4gYXNraW5nIGlmIHdlCiAgICAgKiBoYXZlIGFueSBtb3JlIGBhYHMgbmVlZHMgdG8gcmV0dXJuIHRoZSBzZWNvbmQgYGFgLgogICAgICogQHBhcmFtIHs/fSB0cmFja0J5SWQKICAgICAqIEBwYXJhbSB7P30gYXRPckFmdGVySW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCh0cmFja0J5SWQsIGF0T3JBZnRlckluZGV4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHRyYWNrQnlJZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjb3JkTGlzdCA9IHRoaXMubWFwLmdldChrZXkpOwogICAgICAgIHJldHVybiByZWNvcmRMaXN0ID8gcmVjb3JkTGlzdC5nZXQodHJhY2tCeUlkLCBhdE9yQWZ0ZXJJbmRleCkgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KICAgICAqCiAgICAgKiBUaGUgbGlzdCBvZiBkdXBsaWNhdGVzIGFsc28gaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXAgaWYgaXQgZ2V0cyBlbXB0eS4KICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmUocmVjb3JkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHJlY29yZC50cmFja0J5SWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlY29yZExpc3QgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXAuZ2V0KGtleSkpKTsKICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyB3aGVuIGl0IGdldHMgZW1wdHkKICAgICAgICBpZiAocmVjb3JkTGlzdC5yZW1vdmUocmVjb3JkKSkgewogICAgICAgICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGlzRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnNpemUgPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsZWFyKCkgewogICAgICAgIHRoaXMubWFwLmNsZWFyKCk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gaXRlbQogKiBAcGFyYW0gez99IGFkZFJlbW92ZU9mZnNldAogKiBAcGFyYW0gez99IG1vdmVPZmZzZXRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRQcmV2aW91c0luZGV4KGl0ZW0sIGFkZFJlbW92ZU9mZnNldCwgbW92ZU9mZnNldHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBpdGVtLnByZXZpb3VzSW5kZXg7CiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gcHJldmlvdXNJbmRleDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtb3ZlT2Zmc2V0ID0gMDsKICAgIGlmIChtb3ZlT2Zmc2V0cyAmJiBwcmV2aW91c0luZGV4IDwgbW92ZU9mZnNldHMubGVuZ3RoKSB7CiAgICAgICAgbW92ZU9mZnNldCA9IG1vdmVPZmZzZXRzW3ByZXZpb3VzSW5kZXhdOwogICAgfQogICAgcmV0dXJuIHByZXZpb3VzSW5kZXggKyBhZGRSZW1vdmVPZmZzZXQgKyBtb3ZlT2Zmc2V0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEB0ZW1wbGF0ZSBLLCBWCiAqLwpjbGFzcyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5IHsKICAgIGNvbnN0cnVjdG9yKCkgeyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdXBwb3J0cyhvYmopIHsKICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3QkMShvYmopOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgSywgVgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlKCkgewogICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEtleVZhbHVlRGlmZmVyKCk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBLLCBWCiAqLwpjbGFzcyBEZWZhdWx0S2V5VmFsdWVEaWZmZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5fcmVjb3JkcyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLl9tYXBIZWFkID0gbnVsbDsKICAgICAgICAvLyBfYXBwZW5kQWZ0ZXIgaXMgdXNlZCBpbiB0aGUgY2hlY2sgbG9vcAogICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gbnVsbDsKICAgICAgICB0aGlzLl9wcmV2aW91c01hcEhlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7CiAgICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IG51bGw7CiAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7CiAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaXNEaXJ0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25zSGVhZCAhPT0gbnVsbCB8fCB0aGlzLl9jaGFuZ2VzSGVhZCAhPT0gbnVsbCB8fAogICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgIT09IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hJdGVtKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9tYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkgewogICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaFByZXZpb3VzSXRlbShmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNNYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFByZXZpb3VzKSB7CiAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3JFYWNoQ2hhbmdlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2NoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dENoYW5nZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hBZGRlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hSZW1vdmVkSXRlbShmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcmVtb3ZhbHNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFJlbW92ZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IG1hcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlmZihtYXApIHsKICAgICAgICBpZiAoIW1hcCkgewogICAgICAgICAgICBtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3QkMShtYXApKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke3N0cmluZ2lmeShtYXApfScuIE9ubHkgbWFwcyBhbmQgb2JqZWN0cyBhcmUgYWxsb3dlZGApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jaGVjayhtYXApID8gdGhpcyA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveSgpIHsgfQogICAgLyoqCiAgICAgKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFwIHZzIHRoZSBwcmV2aW91cy4KICAgICAqIFRoZSBhbGdvcml0aG0gaXMgb3B0aW1pc2VkIGZvciB3aGVuIHRoZSBrZXlzIGRvIG5vIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gbWFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGVjayhtYXApIHsKICAgICAgICB0aGlzLl9yZXNldCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5zZXJ0QmVmb3JlID0gdGhpcy5fbWFwSGVhZDsKICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IG51bGw7CiAgICAgICAgdGhpcy5fZm9yRWFjaChtYXAsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh2YWx1ZSwga2V5KSA9PiB7CiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgJiYgaW5zZXJ0QmVmb3JlLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhpbnNlcnRCZWZvcmUsIHZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gaW5zZXJ0QmVmb3JlOwogICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlLl9uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5fZ2V0T3JDcmVhdGVSZWNvcmRGb3JLZXkoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUgPSB0aGlzLl9pbnNlcnRCZWZvcmVPckFwcGVuZChpbnNlcnRCZWZvcmUsIHJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgLy8gSXRlbXMgcmVtYWluaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgaGF2ZSBiZWVuIGRlbGV0ZWQKICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlKSB7CiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUuX3ByZXYpIHsKICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZS5fcHJldi5fbmV4dCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gaW5zZXJ0QmVmb3JlOwogICAgICAgICAgICBmb3IgKGxldCByZWNvcmQgPSBpbnNlcnRCZWZvcmU7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkgewogICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gdGhpcy5fbWFwSGVhZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fcmVjb3Jkcy5kZWxldGUocmVjb3JkLmtleSk7CiAgICAgICAgICAgICAgICByZWNvcmQuX25leHRSZW1vdmVkID0gcmVjb3JkLl9uZXh0OwogICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBudWxsOwogICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNYWtlIHN1cmUgdGFpbHMgaGF2ZSBubyBuZXh0IHJlY29yZHMgZnJvbSBwcmV2aW91cyBydW5zCiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZXNUYWlsKQogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQgPSBudWxsOwogICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsKQogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsOwogICAgICAgIHJldHVybiB0aGlzLmlzRGlydHk7CiAgICB9CiAgICAvKioKICAgICAqIEluc2VydHMgYSByZWNvcmQgYmVmb3JlIGBiZWZvcmVgIG9yIGFwcGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHdoZW4gYGJlZm9yZWAgaXMgbnVsbC4KICAgICAqCiAgICAgKiBOb3RlczoKICAgICAqIC0gVGhpcyBtZXRob2QgYXBwZW5kcyBhdCBgdGhpcy5fYXBwZW5kQWZ0ZXJgLAogICAgICogLSBUaGlzIG1ldGhvZCB1cGRhdGVzIGB0aGlzLl9hcHBlbmRBZnRlcmAsCiAgICAgKiAtIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGluc2VydGlvbiBwb2ludGVyLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gYmVmb3JlCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2luc2VydEJlZm9yZU9yQXBwZW5kKGJlZm9yZSwgcmVjb3JkKSB7CiAgICAgICAgaWYgKGJlZm9yZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBiZWZvcmUuX3ByZXY7CiAgICAgICAgICAgIHJlY29yZC5fbmV4dCA9IGJlZm9yZTsKICAgICAgICAgICAgcmVjb3JkLl9wcmV2ID0gcHJldjsKICAgICAgICAgICAgYmVmb3JlLl9wcmV2ID0gcmVjb3JkOwogICAgICAgICAgICBpZiAocHJldikgewogICAgICAgICAgICAgICAgcHJldi5fbmV4dCA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmVmb3JlID09PSB0aGlzLl9tYXBIZWFkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXBIZWFkID0gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gYmVmb3JlOwogICAgICAgICAgICByZXR1cm4gYmVmb3JlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYXBwZW5kQWZ0ZXIpIHsKICAgICAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQgPSByZWNvcmQ7CiAgICAgICAgICAgIHJlY29yZC5fcHJldiA9IHRoaXMuX2FwcGVuZEFmdGVyOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fbWFwSGVhZCA9IHJlY29yZDsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIgPSByZWNvcmQ7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE9yQ3JlYXRlUmVjb3JkRm9yS2V5KGtleSwgdmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5fcmVjb3Jkcy5oYXMoa2V5KSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9yZWNvcmRzLmdldChrZXkpKSk7CiAgICAgICAgICAgIHRoaXMuX21heWJlQWRkVG9DaGFuZ2VzKHJlY29yZCwgdmFsdWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXYgPSByZWNvcmQuX3ByZXY7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgaWYgKHByZXYpIHsKICAgICAgICAgICAgICAgIHByZXYuX25leHQgPSBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2ID0gcHJldjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWNvcmQuX25leHQgPSBudWxsOwogICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBudWxsOwogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjb3JkID0gbmV3IEtleVZhbHVlQ2hhbmdlUmVjb3JkXyhrZXkpOwogICAgICAgIHRoaXMuX3JlY29yZHMuc2V0KGtleSwgcmVjb3JkKTsKICAgICAgICByZWNvcmQuY3VycmVudFZhbHVlID0gdmFsdWU7CiAgICAgICAgdGhpcy5fYWRkVG9BZGRpdGlvbnMocmVjb3JkKTsKICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVzZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgICAgIC8vIGxldCBgX3ByZXZpb3VzTWFwSGVhZGAgY29udGFpbiB0aGUgc3RhdGUgb2YgdGhlIG1hcCBiZWZvcmUgdGhlIGNoYW5nZXMKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNNYXBIZWFkID0gdGhpcy5fbWFwSGVhZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgICAgICByZWNvcmQuX25leHRQcmV2aW91cyA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBVcGRhdGUgYHJlY29yZC5wcmV2aW91c1ZhbHVlYCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSBiZWZvcmUgdGhlIGNoYW5nZXMKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgYWxsIGNoYW5nZWQgaXRlbXMgKHRoYXQncyB0aG9zZSB3aGljaCBoYXZlIGJlZW4gYWRkZWQgYW5kIGNoYW5nZWQpCiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fY2hhbmdlc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0Q2hhbmdlZCkgewogICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hhbmdlc0hlYWQgPSB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvLyBBZGQgdGhlIHJlY29yZCBvciBhIGdpdmVuIGtleSB0byB0aGUgbGlzdCBvZiBjaGFuZ2VzIG9ubHkgd2hlbiB0aGUgdmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbWF5YmVBZGRUb0NoYW5nZXMocmVjb3JkLCBuZXdWYWx1ZSkgewogICAgICAgIGlmICghbG9vc2VJZGVudGljYWwobmV3VmFsdWUsIHJlY29yZC5jdXJyZW50VmFsdWUpKSB7CiAgICAgICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICB0aGlzLl9hZGRUb0NoYW5nZXMocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZFRvQWRkaXRpb25zKHJlY29yZCkgewogICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNIZWFkID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2FkZGl0aW9uc1RhaWwpKS5fbmV4dEFkZGVkID0gcmVjb3JkOwogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkVG9DaGFuZ2VzKHJlY29yZCkgewogICAgICAgIGlmICh0aGlzLl9jaGFuZ2VzSGVhZCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzSGVhZCA9IHRoaXMuX2NoYW5nZXNUYWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NoYW5nZXNUYWlsKSkuX25leHRDaGFuZ2VkID0gcmVjb3JkOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IHJlY29yZDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwcml2YXRlCiAgICAgKiBAdGVtcGxhdGUgSywgVgogICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mb3JFYWNoKG9iaiwgZm4pIHsKICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgIG9iai5mb3JFYWNoKGZuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gawogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgayA9PiBmbihvYmpba10sIGspKSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgSywgVgogKi8KY2xhc3MgS2V5VmFsdWVDaGFuZ2VSZWNvcmRfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqLwogICAgY29uc3RydWN0b3Ioa2V5KSB7CiAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gbnVsbDsKICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRQcmV2aW91cyA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmV4dEFkZGVkID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmV4dFJlbW92ZWQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0Q2hhbmdlZCA9IG51bGw7CiAgICB9Cn0KLyoqCiAqIEEgcmVwb3NpdG9yeSBvZiBkaWZmZXJlbnQgaXRlcmFibGUgZGlmZmluZyBzdHJhdGVnaWVzIHVzZWQgYnkgTmdGb3IsIE5nQ2xhc3MsIGFuZCBvdGhlcnMuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBJdGVyYWJsZURpZmZlcnMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihmYWN0b3JpZXMpIHsKICAgICAgICB0aGlzLmZhY3RvcmllcyA9IGZhY3RvcmllczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGNyZWF0ZShmYWN0b3JpZXMsIHBhcmVudCkgewogICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTsKICAgICAgICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7XEBsaW5rIEl0ZXJhYmxlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGUKICAgICAqIGluaGVyaXRlZCB7XEBsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXcKICAgICAqIHtcQGxpbmsgSXRlcmFibGVEaWZmZXJzfSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBleHRlbmQgYW4gZXhpc3RpbmcgbGlzdCBvZiBmYWN0b3JpZXMsCiAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtcQGxpbmsgSXRlcmFibGVEaWZmZXJ9IGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgdmlld1Byb3ZpZGVyczogWwogICAgICogICAgIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQoW25ldyBJbW11dGFibGVMaXN0RGlmZmVyKCldKQogICAgICogICBdCiAgICAgKiB9KQogICAgICogYGBgCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm92aWRlOiBJdGVyYWJsZURpZmZlcnMsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYXJlbnQpID0+IHsKICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHlwaWNhbGx5IHdvdWxkIG9jY3VyIHdoZW4gY2FsbGluZyBJdGVyYWJsZURpZmZlcnMuZXh0ZW5kIGluc2lkZSBvZiBkZXBlbmRlbmNpZXMgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8gdG8KICAgICAgICAgICAgICAgICAgICAvLyBib290c3RyYXAoKSwgd2hpY2ggd291bGQgb3ZlcnJpZGUgZGVmYXVsdCBwaXBlcyBpbnN0ZWFkIG9mIGV4dGVuZGluZyB0aGVtLgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGV4dGVuZCBJdGVyYWJsZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlRGlmZmVycy5jcmVhdGUoZmFjdG9yaWVzLCBwYXJlbnQpOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgLy8gRGVwZW5kZW5jeSB0ZWNobmljYWxseSBpc24ndCBvcHRpb25hbCwgYnV0IHdlIGNhbiBwcm92aWRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhpcyB3YXkuCiAgICAgICAgICAgIGRlcHM6IFtbSXRlcmFibGVEaWZmZXJzLCBuZXcgU2tpcFNlbGYoKSwgbmV3IE9wdGlvbmFsKCldXQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaXRlcmFibGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmQoaXRlcmFibGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZmFjdG9yaWVzLmZpbmQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZiA9PiBmLnN1cHBvcnRzKGl0ZXJhYmxlKSkpOwogICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICcke2l0ZXJhYmxlfScgb2YgdHlwZSAnJHtnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyhpdGVyYWJsZSl9J2ApOwogICAgICAgIH0KICAgIH0KfQovKiogQG5vY29sbGFwc2UgKi8KSXRlcmFibGVEaWZmZXJzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgIHRva2VuOiBJdGVyYWJsZURpZmZlcnMsCiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBuZXcgSXRlcmFibGVEaWZmZXJzKFtuZXcgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeSgpXSkpCn0pOwovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyh0eXBlKSB7CiAgICByZXR1cm4gdHlwZVsnbmFtZSddIHx8IHR5cGVvZiB0eXBlOwp9Ci8qKgogKiBBIHJlcG9zaXRvcnkgb2YgZGlmZmVyZW50IE1hcCBkaWZmaW5nIHN0cmF0ZWdpZXMgdXNlZCBieSBOZ0NsYXNzLCBOZ1N0eWxlLCBhbmQgb3RoZXJzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgS2V5VmFsdWVEaWZmZXJzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAqLwogICAgY29uc3RydWN0b3IoZmFjdG9yaWVzKSB7CiAgICAgICAgdGhpcy5mYWN0b3JpZXMgPSBmYWN0b3JpZXM7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBTCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICogQHBhcmFtIHs/PX0gcGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KSB7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTsKICAgICAgICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEtleVZhbHVlRGlmZmVycyhmYWN0b3JpZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7XEBsaW5rIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGUKICAgICAqIGluaGVyaXRlZCB7XEBsaW5rIEtleVZhbHVlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXcKICAgICAqIHtcQGxpbmsgS2V5VmFsdWVEaWZmZXJzfSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBleHRlbmQgYW4gZXhpc3RpbmcgbGlzdCBvZiBmYWN0b3JpZXMsCiAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtcQGxpbmsgS2V5VmFsdWVEaWZmZXJ9IGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgdmlld1Byb3ZpZGVyczogWwogICAgICogICAgIEtleVZhbHVlRGlmZmVycy5leHRlbmQoW25ldyBJbW11dGFibGVNYXBEaWZmZXIoKV0pCiAgICAgKiAgIF0KICAgICAqIH0pCiAgICAgKiBgYGAKICAgICAqIEB0ZW1wbGF0ZSBTCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYXJlbnQpID0+IHsKICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHlwaWNhbGx5IHdvdWxkIG9jY3VyIHdoZW4gY2FsbGluZyBLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIGluc2lkZSBvZiBkZXBlbmRlbmNpZXMgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS4KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleHRlbmQgS2V5VmFsdWVEaWZmZXJzIHdpdGhvdXQgYSBwYXJlbnQgaW5qZWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBLZXlWYWx1ZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIC8vIERlcGVuZGVuY3kgdGVjaG5pY2FsbHkgaXNuJ3Qgb3B0aW9uYWwsIGJ1dCB3ZSBjYW4gcHJvdmlkZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoaXMgd2F5LgogICAgICAgICAgICBkZXBzOiBbW0tleVZhbHVlRGlmZmVycywgbmV3IFNraXBTZWxmKCksIG5ldyBPcHRpb25hbCgpXV0KICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGt2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kKGt2KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGYgPT4gZi5zdXBwb3J0cyhrdikpKTsKICAgICAgICBpZiAoZmFjdG9yeSkgewogICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHtrdn0nYCk7CiAgICB9Cn0KLyoqIEBub2NvbGxhcHNlICovCktleVZhbHVlRGlmZmVycy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7CiAgICB0b2tlbjogS2V5VmFsdWVEaWZmZXJzLAogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gbmV3IEtleVZhbHVlRGlmZmVycyhbbmV3IERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkoKV0pKQp9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgT2JqZWN0YHMgYW5kIGBNYXBgcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBrZXlWYWxEaWZmID0gW25ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5KCldOwovKioKICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgSXRlcmFibGVgIHR5cGVzIHN1Y2ggYXMgYEFycmF5YHMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgaXRlcmFibGVEaWZmID0gW25ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5KCldOwovKiogQHR5cGUgez99ICovCmNvbnN0IGRlZmF1bHRJdGVyYWJsZURpZmZlcnMgPSBuZXcgSXRlcmFibGVEaWZmZXJzKGl0ZXJhYmxlRGlmZik7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZGVmYXVsdEtleVZhbHVlRGlmZmVycyA9IG5ldyBLZXlWYWx1ZURpZmZlcnMoa2V5VmFsRGlmZik7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvdGVtcGxhdGVfcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXByZXNlbnRzIGFuIGVtYmVkZGVkIHRlbXBsYXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZW1iZWRkZWQgdmlld3MuCiAqIFRvIGluc3RhbnRpYXRlIGVtYmVkZGVkIHZpZXdzIGJhc2VkIG9uIGEgdGVtcGxhdGUsIHVzZSB0aGUgYFZpZXdDb250YWluZXJSZWZgCiAqIG1ldGhvZCBgY3JlYXRlRW1iZWRkZWRWaWV3KClgLgogKgogKiBBY2Nlc3MgYSBgVGVtcGxhdGVSZWZgIGluc3RhbmNlIGJ5IHBsYWNpbmcgYSBkaXJlY3RpdmUgb24gYW4gYDxuZy10ZW1wbGF0ZT5gCiAqIGVsZW1lbnQgKG9yIGRpcmVjdGl2ZSBwcmVmaXhlZCB3aXRoIGAqYCkuIFRoZSBgVGVtcGxhdGVSZWZgIGZvciB0aGUgZW1iZWRkZWQgdmlldwogKiBpcyBpbmplY3RlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGlyZWN0aXZlLAogKiB1c2luZyB0aGUgYFRlbXBsYXRlUmVmYCB0b2tlbi4KICoKICogWW91IGNhbiBhbHNvIHVzZSBhIGBRdWVyeWAgdG8gZmluZCBhIGBUZW1wbGF0ZVJlZmAgYXNzb2NpYXRlZCB3aXRoCiAqIGEgY29tcG9uZW50IG9yIGEgZGlyZWN0aXZlLgogKgogKiBAc2VlIGBWaWV3Q29udGFpbmVyUmVmYAogKiBAc2VlIFtOYXZpZ2F0ZSB0aGUgQ29tcG9uZW50IFRyZWUgd2l0aCBESV0oZ3VpZGUvZGVwZW5kZW5jeS1pbmplY3Rpb24tbmF2dHJlZSkKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBDCiAqLwpjbGFzcyBUZW1wbGF0ZVJlZiB7Cn0KLyoqCiAqIFxAaW50ZXJuYWwKICogQG5vY29sbGFwc2UKICovClRlbXBsYXRlUmVmLl9fTkdfRUxFTUVOVF9JRF9fID0gKC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gU1dJVENIX1RFTVBMQVRFX1JFRl9GQUNUT1JZKFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX1RFTVBMQVRFX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RUZW1wbGF0ZVJlZjsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUlkgPSBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJlcHJlc2VudHMgYSBjb250YWluZXIgd2hlcmUgb25lIG9yIG1vcmUgdmlld3MgY2FuIGJlIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LgogKgogKiBDYW4gY29udGFpbiAqaG9zdCB2aWV3cyogKGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyBhCiAqIGNvbXBvbmVudCB3aXRoIHRoZSBgY3JlYXRlQ29tcG9uZW50KClgIG1ldGhvZCksIGFuZCAqZW1iZWRkZWQgdmlld3MqCiAqIChjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgYSBgVGVtcGxhdGVSZWZgIHdpdGggdGhlIGBjcmVhdGVFbWJlZGRlZFZpZXcoKWAgbWV0aG9kKS4KICoKICogQSB2aWV3IGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gY29udGFpbiBvdGhlciB2aWV3IGNvbnRhaW5lcnMsCiAqIGNyZWF0aW5nIGEgW3ZpZXcgaGllcmFyY2h5XShndWlkZS9nbG9zc2FyeSN2aWV3LXRyZWUpLgogKgogKiBAc2VlIGBDb21wb25lbnRSZWZgCiAqIEBzZWUgYEVtYmVkZGVkVmlld1JlZmAKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBWaWV3Q29udGFpbmVyUmVmIHsKfQovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KVmlld0NvbnRhaW5lclJlZi5fX05HX0VMRU1FTlRfSURfXyA9ICgvKioKICogQHJldHVybiB7P30KICovCigpID0+IFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWShWaWV3Q29udGFpbmVyUmVmLCBFbGVtZW50UmVmKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX1ZJRVdfQ09OVEFJTkVSX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RWaWV3Q29udGFpbmVyUmVmOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWSA9IFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fOwovKiogQHR5cGUgez99ICovCmNvbnN0IF90b2tlbktleUNhY2hlID0gbmV3IE1hcCgpOwovKioKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9rZW5LZXkodG9rZW4pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBrZXkgPSBfdG9rZW5LZXlDYWNoZS5nZXQodG9rZW4pOwogICAgaWYgKCFrZXkpIHsKICAgICAgICBrZXkgPSBzdHJpbmdpZnkodG9rZW4pICsgJ18nICsgX3Rva2VuS2V5Q2FjaGUuc2l6ZTsKICAgICAgICBfdG9rZW5LZXlDYWNoZS5zZXQodG9rZW4sIGtleSk7CiAgICB9CiAgICByZXR1cm4ga2V5Owp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSW5qZWN0b3JSZWZUb2tlbktleSA9IHRva2VuS2V5KEluamVjdG9yKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJTkpFQ1RPUlJlZlRva2VuS2V5ID0gdG9rZW5LZXkoSU5KRUNUT1IpOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5nTW9kdWxlUmVmVG9rZW5LZXkgPSB0b2tlbktleShOZ01vZHVsZVJlZik7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L3Byb3ZpZGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUmVuZGVyZXIyVG9rZW5LZXkgPSB0b2tlbktleShSZW5kZXJlcjIpOwovKiogQHR5cGUgez99ICovCmNvbnN0IEVsZW1lbnRSZWZUb2tlbktleSA9IHRva2VuS2V5KEVsZW1lbnRSZWYpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFZpZXdDb250YWluZXJSZWZUb2tlbktleSA9IHRva2VuS2V5KFZpZXdDb250YWluZXJSZWYpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRlbXBsYXRlUmVmVG9rZW5LZXkgPSB0b2tlbktleShUZW1wbGF0ZVJlZik7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ2hhbmdlRGV0ZWN0b3JSZWZUb2tlbktleSA9IHRva2VuS2V5KENoYW5nZURldGVjdG9yUmVmKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJbmplY3RvclJlZlRva2VuS2V5JDEgPSB0b2tlbktleShJbmplY3Rvcik7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSU5KRUNUT1JSZWZUb2tlbktleSQxID0gdG9rZW5LZXkoSU5KRUNUT1IpOwovLyBUaGlzIGRlZmF1bHQgdmFsdWUgaXMgd2hlbiBjaGVja2luZyB0aGUgaGllcmFyY2h5IGZvciBhIHRva2VuLgovLwovLyBJdCBtZWFucyBib3RoOgovLyAtIHRoZSB0b2tlbiBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgaW5qZWN0b3IsCi8vIC0gb25seSB0aGUgZWxlbWVudCBpbmplY3RvcnMgc2hvdWxkIGJlIGNoZWNrZWQgKGllIGRvIG5vdCBjaGVjayBtb2R1bGUgaW5qZWN0b3JzCi8vCi8vICAgICAgICAgIG1vZDEKLy8gICAgICAgICAvCi8vICAgICAgIGVsMSAgIG1vZDIKLy8gICAgICAgICBcICAvCi8vICAgICAgICAgZWwyCi8vCi8vIFdoZW4gcmVxdWVzdGluZyBlbDIuaW5qZWN0b3IuZ2V0KHRva2VuKSwgd2Ugc2hvdWxkIGNoZWNrIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgYW5kIHJldHVybiB0aGUKLy8gZmlyc3QgZm91bmQgdmFsdWU6Ci8vIC0gZWwyLmluamVjdG9yLmdldCh0b2tlbiwgZGVmYXVsdCkKLy8gLSBlbDEuaW5qZWN0b3IuZ2V0KHRva2VuLCBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKSAtPiBkbyBub3QgY2hlY2sgdGhlIG1vZHVsZQovLyAtIG1vZDIuaW5qZWN0b3IuZ2V0KHRva2VuLCBkZWZhdWx0KQovKiogQHR5cGUgez99ICovCmNvbnN0IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IgPSB7fTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvY29tcG9uZW50X3JlZi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIkMSBleHRlbmRzIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlIFRoZSBOZ01vZHVsZVJlZiB0byB3aGljaCBhbGwgcmVzb2x2ZWQgZmFjdG9yaWVzIGFyZSBib3VuZC4KICAgICAqLwogICAgY29uc3RydWN0b3IobmdNb2R1bGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMubmdNb2R1bGUgPSBuZ01vZHVsZTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Q29tcG9uZW50VHlwZShjb21wb25lbnQpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnREZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0Q29tcG9uZW50RGVmKGNvbXBvbmVudCkpKTsKICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEZhY3RvcnkkMShjb21wb25lbnREZWYsIHRoaXMubmdNb2R1bGUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG1hcAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9SZWZBcnJheShtYXApIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFycmF5ID0gW107CiAgICBmb3IgKGxldCBub25NaW5pZmllZCBpbiBtYXApIHsKICAgICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KG5vbk1pbmlmaWVkKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1pbmlmaWVkID0gbWFwW25vbk1pbmlmaWVkXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh7IHByb3BOYW1lOiBtaW5pZmllZCwgdGVtcGxhdGVOYW1lOiBub25NaW5pZmllZCB9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYXJyYXk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWxlbWVudE5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE5hbWVzcGFjZSQxKGVsZW1lbnROYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiBuYW1lID09PSAnc3ZnJyA/IFNWR19OQU1FU1BBQ0UgOiAobmFtZSA9PT0gJ21hdGgnID8gTUFUSF9NTF9OQU1FU1BBQ0UgOiBudWxsKTsKfQovKioKICogQSBjaGFuZ2UgZGV0ZWN0aW9uIHNjaGVkdWxlciB0b2tlbiBmb3Ige1xAbGluayBSb290Q29udGV4dH0uIFRoaXMgdG9rZW4gaXMgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZAogKiBmb3IgdGhlIGRlZmF1bHQgYFJvb3RDb250ZXh0YCBmb3VuZCBpbiB0aGUge1xAbGluayBST09UX0NPTlRFWFR9IHRva2VuLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFNDSEVEVUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignU0NIRURVTEVSX1RPS0VOJywgewogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gZGVmYXVsdFNjaGVkdWxlciksCn0pOwovKioKICogQHBhcmFtIHs/fSByb290Vmlld0luamVjdG9yCiAqIEBwYXJhbSB7P30gbW9kdWxlSW5qZWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUNoYWluZWRJbmplY3Rvcihyb290Vmlld0luamVjdG9yLCBtb2R1bGVJbmplY3RvcikgewogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmxhZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgZmxhZ3MpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJvb3RWaWV3SW5qZWN0b3IuZ2V0KHRva2VuLCAoLyoqIEB0eXBlIHs/fSAqLyAoTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikpLCBmbGFncyk7CiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUiB8fAogICAgICAgICAgICAgICAgbm90Rm91bmRWYWx1ZSA9PT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSByb290IGVsZW1lbnQgaW5qZWN0b3Igd2hlbgogICAgICAgICAgICAgICAgLy8gLSBpdCBwcm92aWRlcyBpdAogICAgICAgICAgICAgICAgLy8gICAodmFsdWUgIT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IpCiAgICAgICAgICAgICAgICAvLyAtIHRoZSBtb2R1bGUgaW5qZWN0b3Igc2hvdWxkIG5vdCBiZSBjaGVja2VkCiAgICAgICAgICAgICAgICAvLyAgIChub3RGb3VuZFZhbHVlID09PSBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbmplY3Rvci5nZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKTsKICAgICAgICB9KQogICAgfTsKfQovKioKICogUmVuZGVyMyBpbXBsZW1lbnRhdGlvbiBvZiB7XEBsaW5rIHZpZXdFbmdpbmVfQ29tcG9uZW50RmFjdG9yeX0uCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBDb21wb25lbnRGYWN0b3J5JDEgZXh0ZW5kcyBDb21wb25lbnRGYWN0b3J5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnREZWYgVGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLgogICAgICogQHBhcmFtIHs/PX0gbmdNb2R1bGUgVGhlIE5nTW9kdWxlUmVmIHRvIHdoaWNoIHRoZSBmYWN0b3J5IGlzIGJvdW5kLgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWYsIG5nTW9kdWxlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmNvbXBvbmVudERlZiA9IGNvbXBvbmVudERlZjsKICAgICAgICB0aGlzLm5nTW9kdWxlID0gbmdNb2R1bGU7CiAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gY29tcG9uZW50RGVmLnR5cGU7CiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHN0cmluZ2lmeUNTU1NlbGVjdG9yTGlzdChjb21wb25lbnREZWYuc2VsZWN0b3JzKTsKICAgICAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9CiAgICAgICAgICAgIGNvbXBvbmVudERlZi5uZ0NvbnRlbnRTZWxlY3RvcnMgPyBjb21wb25lbnREZWYubmdDb250ZW50U2VsZWN0b3JzIDogW107CiAgICAgICAgdGhpcy5pc0JvdW5kVG9Nb2R1bGUgPSAhIW5nTW9kdWxlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaW5wdXRzKCkgewogICAgICAgIHJldHVybiB0b1JlZkFycmF5KHRoaXMuY29tcG9uZW50RGVmLmlucHV0cyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBvdXRwdXRzKCkgewogICAgICAgIHJldHVybiB0b1JlZkFycmF5KHRoaXMuY29tcG9uZW50RGVmLm91dHB1dHMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9yCiAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzCiAgICAgKiBAcGFyYW0gez89fSByb290U2VsZWN0b3JPck5vZGUKICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGUoaW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHJvb3RTZWxlY3Rvck9yTm9kZSwgbmdNb2R1bGUpIHsKICAgICAgICBuZ01vZHVsZSA9IG5nTW9kdWxlIHx8IHRoaXMubmdNb2R1bGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RWaWV3SW5qZWN0b3IgPSBuZ01vZHVsZSA/IGNyZWF0ZUNoYWluZWRJbmplY3RvcihpbmplY3RvciwgbmdNb2R1bGUuaW5qZWN0b3IpIDogaW5qZWN0b3I7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyRmFjdG9yeSA9ICgvKiogQHR5cGUgez99ICovIChyb290Vmlld0luamVjdG9yLmdldChSZW5kZXJlckZhY3RvcnkyLCBkb21SZW5kZXJlckZhY3RvcnkzKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzYW5pdGl6ZXIgPSByb290Vmlld0luamVjdG9yLmdldChTYW5pdGl6ZXIsIG51bGwpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob3N0UmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgdGhpcy5jb21wb25lbnREZWYpOwogICAgICAgIC8vIERldGVybWluZSBhIHRhZyBuYW1lIHVzZWQgZm9yIGNyZWF0aW5nIGhvc3QgZWxlbWVudHMgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkCiAgICAgICAgLy8gZHluYW1pY2FsbHkuIERlZmF1bHQgdG8gJ2RpdicgaWYgdGhpcyBjb21wb25lbnQgZGlkIG5vdCBzcGVjaWZ5IGFueSB0YWcgbmFtZSBpbiBpdHMgc2VsZWN0b3IuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY29tcG9uZW50RGVmLnNlbGVjdG9yc1swXVswXSkpIHx8ICdkaXYnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob3N0Uk5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgPwogICAgICAgICAgICBsb2NhdGVIb3N0RWxlbWVudChob3N0UmVuZGVyZXIsIHJvb3RTZWxlY3Rvck9yTm9kZSwgdGhpcy5jb21wb25lbnREZWYuZW5jYXBzdWxhdGlvbikgOgogICAgICAgICAgICBlbGVtZW50Q3JlYXRlKGVsZW1lbnROYW1lLCByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgdGhpcy5jb21wb25lbnREZWYpLCBnZXROYW1lc3BhY2UkMShlbGVtZW50TmFtZSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290RmxhZ3MgPSB0aGlzLmNvbXBvbmVudERlZi5vblB1c2ggPyA2NCAvKiBEaXJ0eSAqLyB8IDUxMiAvKiBJc1Jvb3QgKi8gOgogICAgICAgICAgICAxNiAvKiBDaGVja0Fsd2F5cyAqLyB8IDUxMiAvKiBJc1Jvb3QgKi87CiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIENvbXBvbmVudCBuZWVkcyB0byBiZSBpc29sYXRlZCBmcm9tIG90aGVyIGNvbXBvbmVudHMsIGkuZS4gd2hldGhlciBpdAogICAgICAgIC8vIHNob3VsZCBiZSBwbGFjZWQgaW50byBpdHMgb3duIChlbXB0eSkgcm9vdCBjb250ZXh0IG9yIGV4aXN0aW5nIHJvb3QgY29udGV4dCBzaG91bGQgYmUgdXNlZC4KICAgICAgICAvLyBOb3RlOiB0aGlzIGlzIGludGVybmFsLW9ubHkgY29udmVudGlvbiBhbmQgbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUsIHNvIGl0IHNob3VsZCBub3QgYmUKICAgICAgICAvLyByZWxpZWQgdXBvbiBleHRlcm5hbGx5LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0lzb2xhdGVkID0gdHlwZW9mIHJvb3RTZWxlY3Rvck9yTm9kZSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgL14jcm9vdC1uZy1pbnRlcm5hbC1pc29sYXRlZC1cZCsvLnRlc3Qocm9vdFNlbGVjdG9yT3JOb2RlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdENvbnRleHQgPSBjcmVhdGVSb290Q29udGV4dCgpOwogICAgICAgIC8vIENyZWF0ZSB0aGUgcm9vdCB2aWV3LiBVc2VzIGVtcHR5IFRWaWV3IGFuZCBDb250ZW50VGVtcGxhdGUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RUVmlldyA9IGNyZWF0ZVRWaWV3KDAgLyogUm9vdCAqLywgLTEsIG51bGwsIDEsIDAsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290TFZpZXcgPSBjcmVhdGVMVmlldyhudWxsLCByb290VFZpZXcsIHJvb3RDb250ZXh0LCByb290RmxhZ3MsIG51bGwsIG51bGwsIHJlbmRlcmVyRmFjdG9yeSwgaG9zdFJlbmRlcmVyLCBzYW5pdGl6ZXIsIHJvb3RWaWV3SW5qZWN0b3IpOwogICAgICAgIC8vIHJvb3RWaWV3IGlzIHRoZSBwYXJlbnQgd2hlbiBib290c3RyYXBwaW5nCiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGVudGVyaW5nIHZpZXcgaGVyZSBidXQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gYXMKICAgICAgICAvLyBgcmVuZGVyVmlld2AgZG9lcyB0aGF0LiBIb3dldmVyIGFzIHRoZSBjb2RlIGlzIHdyaXR0ZW4gaXQgaXMgbmVlZGVkIGJlY2F1c2UKICAgICAgICAvLyBgY3JlYXRlUm9vdENvbXBvbmVudFZpZXdgIGFuZCBgY3JlYXRlUm9vdENvbXBvbmVudGAgYm90aCByZWFkIGdsb2JhbCBzdGF0ZS4gRml4aW5nIHRob3NlCiAgICAgICAgLy8gaXNzdWVzIHdvdWxkIGFsbG93IHVzIHRvIGRyb3AgdGhpcy4KICAgICAgICBlbnRlclZpZXcocm9vdExWaWV3LCBudWxsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbXBvbmVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRFbGVtZW50Tm9kZTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBjcmVhdGVSb290Q29tcG9uZW50Vmlldyhob3N0Uk5vZGUsIHRoaXMuY29tcG9uZW50RGVmLCByb290TFZpZXcsIHJlbmRlcmVyRmFjdG9yeSwgaG9zdFJlbmRlcmVyKTsKICAgICAgICAgICAgaWYgKGhvc3RSTm9kZSkgewogICAgICAgICAgICAgICAgaWYgKHJvb3RTZWxlY3Rvck9yTm9kZSkgewogICAgICAgICAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhob3N0UmVuZGVyZXIsIGhvc3RSTm9kZSwgWyduZy12ZXJzaW9uJywgVkVSU0lPTi5mdWxsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBob3N0IGVsZW1lbnQgaXMgY3JlYXRlZCBhcyBhIHBhcnQgb2YgdGhpcyBmdW5jdGlvbiBjYWxsIChpLmUuIGByb290U2VsZWN0b3JPck5vZGVgCiAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGRlZmluZWQpLCBhbHNvIGFwcGx5IGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgZXh0cmFjdGVkIGZyb20gY29tcG9uZW50IHNlbGVjdG9yLgogICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgYXR0cmlidXRlcyBhbmQgY2xhc3NlcyBmcm9tIHRoZSBmaXJzdCBzZWxlY3RvciBvbmx5IHRvIG1hdGNoIFZFIGJlaGF2aW9yLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgYXR0cnMsIGNsYXNzZXMgfSA9IGV4dHJhY3RBdHRyc0FuZENsYXNzZXNGcm9tU2VsZWN0b3IodGhpcy5jb21wb25lbnREZWYuc2VsZWN0b3JzWzBdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBBdHRyaWJ1dGVzKGhvc3RSZW5kZXJlciwgaG9zdFJOb2RlLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzICYmIGNsYXNzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURpcmVjdENsYXNzKGhvc3RSZW5kZXJlciwgaG9zdFJOb2RlLCBjbGFzc2VzLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRFbGVtZW50Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChnZXRUTm9kZShyb290TFZpZXdbVFZJRVddLCAwKSkpOwogICAgICAgICAgICBpZiAocHJvamVjdGFibGVOb2RlcykgewogICAgICAgICAgICAgICAgLy8gcHJvamVjdGFibGUgbm9kZXMgY2FuIGJlIHBhc3NlZCBhcyBhcnJheSBvZiBhcnJheXMgb3IgYW4gYXJyYXkgb2YgaXRlcmFibGVzIChuZ1VwZ3JhZGUKICAgICAgICAgICAgICAgIC8vIGNhc2UpLiBIZXJlIHdlIGRvIG5vcm1hbGl6ZSBwYXNzZWQgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAvLyBjb21wbGV4IGNoZWNrcyBkb3duIHRoZSBsaW5lLgogICAgICAgICAgICAgICAgdEVsZW1lbnROb2RlLnByb2plY3Rpb24gPSBwcm9qZWN0YWJsZU5vZGVzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVzZm9yU2xvdAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKG5vZGVzZm9yU2xvdCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5vZGVzZm9yU2xvdCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIExpZmVjeWNsZUhvb2tzRmVhdHVyZSBhbmQgb3RoZXIgaG9zdCBmZWF0dXJlcyBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZAogICAgICAgICAgICAvLyBleGVjdXRlZCBoZXJlPwogICAgICAgICAgICAvLyBBbmd1bGFyIDUgcmVmZXJlbmNlOiBodHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvbGlmZWN5Y2xlLWhvb2tzLXZjcmVmCiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZVJvb3RDb21wb25lbnQoY29tcG9uZW50VmlldywgdGhpcy5jb21wb25lbnREZWYsIHJvb3RMVmlldywgcm9vdENvbnRleHQsIFtMaWZlY3ljbGVIb29rc0ZlYXR1cmVdKTsKICAgICAgICAgICAgcmVuZGVyVmlldyhyb290VFZpZXcsIHJvb3RMVmlldywgbnVsbCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBsZWF2ZVZpZXcoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IG5ldyBDb21wb25lbnRSZWYkMSh0aGlzLmNvbXBvbmVudFR5cGUsIGNvbXBvbmVudCwgY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmLCB0RWxlbWVudE5vZGUsIHJvb3RMVmlldyksIHJvb3RMVmlldywgdEVsZW1lbnROb2RlKTsKICAgICAgICBpZiAoIXJvb3RTZWxlY3Rvck9yTm9kZSB8fCBpc0lzb2xhdGVkKSB7CiAgICAgICAgICAgIC8vIFRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGludGVybmFsIG9yIGlzb2xhdGVkIHJvb3QgdmlldyBpcyBhdHRhY2hlZCB0byB0aGUgY29tcG9uZW50J3MgaG9zdAogICAgICAgICAgICAvLyB2aWV3IG5vZGUuCiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRSZWYuaG9zdFZpZXcuX3RWaWV3Tm9kZSkpLmNoaWxkID0gdEVsZW1lbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gbmV3IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciQxKCk7Ci8qKgogKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGNyZWF0ZWQgdmlhIGEge1xAbGluayBDb21wb25lbnRGYWN0b3J5fS4KICoKICogYENvbXBvbmVudFJlZmAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBDb21wb25lbnQgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpcwogKiBDb21wb25lbnQgSW5zdGFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVzdHJveSB0aGUgQ29tcG9uZW50IEluc3RhbmNlIHZpYSB0aGUge1xAbGluayAjZGVzdHJveX0KICogbWV0aG9kLgogKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgQ29tcG9uZW50UmVmJDEgZXh0ZW5kcyBDb21wb25lbnRSZWYgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFR5cGUKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb24KICAgICAqIEBwYXJhbSB7P30gX3Jvb3RMVmlldwogICAgICogQHBhcmFtIHs/fSBfdE5vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IoY29tcG9uZW50VHlwZSwgaW5zdGFuY2UsIGxvY2F0aW9uLCBfcm9vdExWaWV3LCBfdE5vZGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICB0aGlzLl9yb290TFZpZXcgPSBfcm9vdExWaWV3OwogICAgICAgIHRoaXMuX3ROb2RlID0gX3ROb2RlOwogICAgICAgIHRoaXMuZGVzdHJveUNicyA9IFtdOwogICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKICAgICAgICB0aGlzLmhvc3RWaWV3ID0gdGhpcy5jaGFuZ2VEZXRlY3RvclJlZiA9IG5ldyBSb290Vmlld1JlZihfcm9vdExWaWV3KTsKICAgICAgICB0aGlzLmhvc3RWaWV3Ll90Vmlld05vZGUgPSBhc3NpZ25UVmlld05vZGVUb0xWaWV3KF9yb290TFZpZXdbVFZJRVddLCBudWxsLCAtMSwgX3Jvb3RMVmlldyk7CiAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgIHJldHVybiBuZXcgTm9kZUluamVjdG9yKHRoaXMuX3ROb2RlLCB0aGlzLl9yb290TFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYnMpIHsKICAgICAgICAgICAgdGhpcy5kZXN0cm95Q2JzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNicyA9IG51bGw7CiAgICAgICAgICAgICF0aGlzLmhvc3RWaWV3LmRlc3Ryb3llZCAmJiB0aGlzLmhvc3RWaWV3LmRlc3Ryb3koKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYnMpIHsKICAgICAgICAgICAgdGhpcy5kZXN0cm95Q2JzLnB1c2goY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogTk9URTogY2hhbmdlcyB0byB0aGUgYG5nSTE4bkNsb3N1cmVNb2RlYCBuYW1lIG11c3QgYmUgc3luY2VkIHdpdGggYGNvbXBpbGVyLWNsaS9zcmMvdG9vbGluZy50c2AuCiAqLwppZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlID09PSAndW5kZWZpbmVkJykgewogICAgLy8gVGhlc2UgcHJvcGVydHkgYWNjZXNzZXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSBuZ0kxOG5DbG9zdXJlTW9kZSB3aWxsIGJlIHNldCB0byBmYWxzZQogICAgLy8gd2hlbiBvcHRpbWl6aW5nIGNvZGUgYW5kIHRoZSB3aG9sZSBpZiBzdGF0ZW1lbnQgd2lsbCBiZSBkcm9wcGVkLgogICAgLy8gTWFrZSBzdXJlIHRvIHJlZmVyIHRvIG5nSTE4bkNsb3N1cmVNb2RlIGFzIFsnbmdJMThuQ2xvc3VyZU1vZGUnXSBmb3IgY2xvc3VyZS4KICAgIC8vIE5PVEU6IHdlIG5lZWQgdG8gaGF2ZSBpdCBpbiBJSUZFIHNvIHRoYXQgdGhlIHRyZWUtc2hha2VyIGlzIGhhcHB5LgogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCiAgICAgICAgX2dsb2JhbFsnbmdJMThuQ2xvc3VyZU1vZGUnXSA9CiAgICAgICAgICAgIC8vIFRPRE8oRlctMTI1MCk6IHZhbGlkYXRlIHRoYXQgdGhpcyBhY3R1YWxseSwgeW91IGtub3csIHdvcmtzLgogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCiAgICAgICAgICAgIHR5cGVvZiBnb29nICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ29vZy5nZXRNc2cgPT09ICdmdW5jdGlvbic7CiAgICB9KSgpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9pMThuL2xvY2FsZV9lbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZCi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgdSA9IHVuZGVmaW5lZDsKLyoqCiAqIEBwYXJhbSB7P30gbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGx1cmFsKG4pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdiA9IG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcLj8vLCAnJykubGVuZ3RoOwogICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMCkKICAgICAgICByZXR1cm4gMTsKICAgIHJldHVybiA1Owp9CnZhciBsb2NhbGVFbiA9IFsKICAgICdlbicsCiAgICBbWydhJywgJ3AnXSwgWydBTScsICdQTSddLCB1XSwKICAgIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLAogICAgWwogICAgICAgIFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLCBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLAogICAgICAgIFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSwKICAgICAgICBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10KICAgIF0sCiAgICB1LAogICAgWwogICAgICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSwKICAgICAgICBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sCiAgICAgICAgWwogICAgICAgICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLAogICAgICAgICAgICAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcicKICAgICAgICBdCiAgICBdLAogICAgdSwKICAgIFtbJ0InLCAnQSddLCBbJ0JDJywgJ0FEJ10sIFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddXSwKICAgIDAsCiAgICBbNiwgMF0sCiAgICBbJ00vZC95eScsICdNTU0gZCwgeScsICdNTU1NIGQsIHknLCAnRUVFRSwgTU1NTSBkLCB5J10sCiAgICBbJ2g6bW0gYScsICdoOm1tOnNzIGEnLCAnaDptbTpzcyBhIHonLCAnaDptbTpzcyBhIHp6enonXSwKICAgIFsnezF9LCB7MH0nLCB1LCAnezF9IFwnYXRcJyB7MH0nLCB1XSwKICAgIFsnLicsICcsJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sCiAgICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSwKICAgICdVU0QnLAogICAgJyQnLAogICAgJ1VTIERvbGxhcicsCiAgICB7fSwKICAgICdsdHInLAogICAgcGx1cmFsCl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9pMThuL2xvY2FsZV9kYXRhX2FwaS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhpcyBjb25zdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBsb2NhbGUgZGF0YSByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVyTG9jYWxlRGF0YWAKICogQHR5cGUgez99CiAqLwpsZXQgTE9DQUxFX0RBVEEgPSB7fTsKLyoqCiAqIEZpbmRzIHRoZSBsb2NhbGUgZGF0YSBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqIEBwYXJhbSB7P30gbG9jYWxlIFRoZSBsb2NhbGUgY29kZS4KICogQHJldHVybiB7P30gVGhlIGxvY2FsZSBkYXRhLgogKi8KZnVuY3Rpb24gZmluZExvY2FsZURhdGEobG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBub3JtYWxpemVkTG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWF0Y2ggPSBnZXRMb2NhbGVEYXRhKG5vcm1hbGl6ZWRMb2NhbGUpOwogICAgaWYgKG1hdGNoKSB7CiAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgfQogICAgLy8gbGV0J3MgdHJ5IHRvIGZpbmQgYSBwYXJlbnQgbG9jYWxlCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnRMb2NhbGUgPSBub3JtYWxpemVkTG9jYWxlLnNwbGl0KCctJylbMF07CiAgICBtYXRjaCA9IGdldExvY2FsZURhdGEocGFyZW50TG9jYWxlKTsKICAgIGlmIChtYXRjaCkgewogICAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIGlmIChwYXJlbnRMb2NhbGUgPT09ICdlbicpIHsKICAgICAgICByZXR1cm4gbG9jYWxlRW47CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIHRoZSBsb2NhbGUgIiR7bG9jYWxlfSIuYCk7Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgcGx1cmFsIGZ1bmN0aW9uIHVzZWQgYnkgSUNVIGV4cHJlc3Npb25zIHRvIGRldGVybWluZSB0aGUgcGx1cmFsIGNhc2UgdG8gdXNlCiAqIGZvciBhIGdpdmVuIGxvY2FsZS4KICogQHNlZSBgTmdQbHVyYWxgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHJldHVybiB7P30gVGhlIHBsdXJhbCBmdW5jdGlvbiBmb3IgdGhlIGxvY2FsZS4KICovCmZ1bmN0aW9uIGdldExvY2FsZVBsdXJhbENhc2UobG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIHJldHVybiBkYXRhW0xvY2FsZURhdGFJbmRleC5QbHVyYWxDYXNlXTsKfQovKioKICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2l2ZW4gYG5vcm1hbGl6ZWRMb2NhbGVgIGZyb20gYExPQ0FMRV9EQVRBYAogKiBvciBmcm9tIHRoZSBnbG9iYWwgYG5nLmNvbW1vbi5sb2NhbGVgLgogKiBAcGFyYW0gez99IG5vcm1hbGl6ZWRMb2NhbGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExvY2FsZURhdGEobm9ybWFsaXplZExvY2FsZSkgewogICAgaWYgKCEobm9ybWFsaXplZExvY2FsZSBpbiBMT0NBTEVfREFUQSkpIHsKICAgICAgICBMT0NBTEVfREFUQVtub3JtYWxpemVkTG9jYWxlXSA9IF9nbG9iYWwubmcgJiYgX2dsb2JhbC5uZy5jb21tb24gJiYgX2dsb2JhbC5uZy5jb21tb24ubG9jYWxlcyAmJgogICAgICAgICAgICBfZ2xvYmFsLm5nLmNvbW1vbi5sb2NhbGVzW25vcm1hbGl6ZWRMb2NhbGVdOwogICAgfQogICAgcmV0dXJuIExPQ0FMRV9EQVRBW25vcm1hbGl6ZWRMb2NhbGVdOwp9Ci8qKiBAZW51bSB7bnVtYmVyfSAqLwpjb25zdCBMb2NhbGVEYXRhSW5kZXggPSB7CiAgICBMb2NhbGVJZDogMCwKICAgIERheVBlcmlvZHNGb3JtYXQ6IDEsCiAgICBEYXlQZXJpb2RzU3RhbmRhbG9uZTogMiwKICAgIERheXNGb3JtYXQ6IDMsCiAgICBEYXlzU3RhbmRhbG9uZTogNCwKICAgIE1vbnRoc0Zvcm1hdDogNSwKICAgIE1vbnRoc1N0YW5kYWxvbmU6IDYsCiAgICBFcmFzOiA3LAogICAgRmlyc3REYXlPZldlZWs6IDgsCiAgICBXZWVrZW5kUmFuZ2U6IDksCiAgICBEYXRlRm9ybWF0OiAxMCwKICAgIFRpbWVGb3JtYXQ6IDExLAogICAgRGF0ZVRpbWVGb3JtYXQ6IDEyLAogICAgTnVtYmVyU3ltYm9sczogMTMsCiAgICBOdW1iZXJGb3JtYXRzOiAxNCwKICAgIEN1cnJlbmN5Q29kZTogMTUsCiAgICBDdXJyZW5jeVN5bWJvbDogMTYsCiAgICBDdXJyZW5jeU5hbWU6IDE3LAogICAgQ3VycmVuY2llczogMTgsCiAgICBEaXJlY3Rpb25hbGl0eTogMTksCiAgICBQbHVyYWxDYXNlOiAyMCwKICAgIEV4dHJhRGF0YTogMjEsCn07CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTG9jYWxlSWRdID0gJ0xvY2FsZUlkJzsKTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzRm9ybWF0XSA9ICdEYXlQZXJpb2RzRm9ybWF0JzsKTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzU3RhbmRhbG9uZV0gPSAnRGF5UGVyaW9kc1N0YW5kYWxvbmUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRheXNGb3JtYXRdID0gJ0RheXNGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRheXNTdGFuZGFsb25lXSA9ICdEYXlzU3RhbmRhbG9uZSc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTW9udGhzRm9ybWF0XSA9ICdNb250aHNGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4Lk1vbnRoc1N0YW5kYWxvbmVdID0gJ01vbnRoc1N0YW5kYWxvbmUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkVyYXNdID0gJ0VyYXMnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkZpcnN0RGF5T2ZXZWVrXSA9ICdGaXJzdERheU9mV2Vlayc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguV2Vla2VuZFJhbmdlXSA9ICdXZWVrZW5kUmFuZ2UnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRhdGVGb3JtYXRdID0gJ0RhdGVGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LlRpbWVGb3JtYXRdID0gJ1RpbWVGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRhdGVUaW1lRm9ybWF0XSA9ICdEYXRlVGltZUZvcm1hdCc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTnVtYmVyU3ltYm9sc10gPSAnTnVtYmVyU3ltYm9scyc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTnVtYmVyRm9ybWF0c10gPSAnTnVtYmVyRm9ybWF0cyc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguQ3VycmVuY3lDb2RlXSA9ICdDdXJyZW5jeUNvZGUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmN5U3ltYm9sXSA9ICdDdXJyZW5jeVN5bWJvbCc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguQ3VycmVuY3lOYW1lXSA9ICdDdXJyZW5jeU5hbWUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmNpZXNdID0gJ0N1cnJlbmNpZXMnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRpcmVjdGlvbmFsaXR5XSA9ICdEaXJlY3Rpb25hbGl0eSc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguUGx1cmFsQ2FzZV0gPSAnUGx1cmFsQ2FzZSc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguRXh0cmFEYXRhXSA9ICdFeHRyYURhdGEnOwovKioKICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBsb2NhbGUgbmFtZSAtIGxvd2VyY2FzZSB3aXRoIGBfYCByZXBsYWNlZCB3aXRoIGAtYC4KICogQHBhcmFtIHs/fSBsb2NhbGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpIHsKICAgIHJldHVybiBsb2NhbGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2kxOG4vbG9jYWxpemF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBsb2NhbGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBsdXJhbENhc2UodmFsdWUsIGxvY2FsZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGx1cmFsID0gZ2V0TG9jYWxlUGx1cmFsQ2FzZShsb2NhbGUpKHZhbHVlKTsKICAgIHN3aXRjaCAocGx1cmFsKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICByZXR1cm4gJ3plcm8nOwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuICdvbmUnOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcmV0dXJuICd0d28nOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuICdmZXcnOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuICdtYW55JzsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gJ290aGVyJzsKICAgIH0KfQovKioKICogVGhlIGxvY2FsZSBpZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBieSBkZWZhdWx0IChmb3IgdHJhbnNsYXRpb25zIGFuZCBJQ1UgZXhwcmVzc2lvbnMpLgogKiBAdHlwZSB7P30KICovCmNvbnN0IERFRkFVTFRfTE9DQUxFX0lEID0gJ2VuLVVTJzsKLyoqCiAqIFVTRCBjdXJyZW5jeSBjb2RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdCBmb3IgQ3VycmVuY3lQaXBlIHdoZW4gbm8KICogREVGQVVMVF9DVVJSRU5DWV9DT0RFIGlzIHByb3ZpZGVkLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFVTRF9DVVJSRU5DWV9DT0RFID0gJ1VTRCc7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2kxOG4udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBNQVJLRVIgPSBg77+9YDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJQ1VfQkxPQ0tfUkVHRVhQID0gL15ccyoo77+9XGQrOj9cZCrvv70pXHMqLFxzKihzZWxlY3R8cGx1cmFsKVxzKiwvOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNVQlRFTVBMQVRFX1JFR0VYUCA9IC/vv71cLz9cKihcZCs6XGQrKe+/vS9naTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQSF9SRUdFWFAgPSAv77+9KFwvP1sjKiFdXGQrKTo/XGQq77+9L2dpOwovKiogQHR5cGUgez99ICovCmNvbnN0IEJJTkRJTkdfUkVHRVhQID0gL++/vShcZCspOj9cZCrvv70vZ2k7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSUNVX1JFR0VYUCA9IC8oe1xzKu+/vVxkKzo/XGQq77+9XHMqLFxzKlxTezZ9XHMqLFtcc1xTXSp9KS9naTsKLy8gaTE4blBvc3Rwcm9jZXNzIGNvbnN0cwovKiogQHR5cGUgez99ICovCmNvbnN0IFJPT1RfVEVNUExBVEVfSUQgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBQX01VTFRJX1ZBTFVFX1BMQUNFSE9MREVSU19SRUdFWFAgPSAvXFso77+9Lis/77+9PylcXS87Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUFBfUExBQ0VIT0xERVJTX1JFR0VYUCA9IC9cWyjvv70uKz/vv70/KVxdfCjvv71cLz9cKlxkKzpcZCvvv70pL2c7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUFBfSUNVX1ZBUlNfUkVHRVhQID0gLyh7XHMqKShWQVJfKFBMVVJBTHxTRUxFQ1QpKF9cZCspPykoXHMqLCkvZzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQUF9JQ1VfUExBQ0VIT0xERVJTX1JFR0VYUCA9IC97KFtBLVowLTlfXSspfS9nOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBQX0lDVVNfUkVHRVhQID0gL++/vUkxOE5fRVhQXyhJQ1UoX1xkKyk/Ke+/vS9nOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBQX0NMT1NFX1RFTVBMQVRFX1JFR0VYUCA9IC9cL1wqLzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQUF9URU1QTEFURV9JRF9SRUdFWFAgPSAvXGQrXDooXGQrKS87Ci8qKgogKiBCcmVha3MgcGF0dGVybiBpbnRvIHN0cmluZ3MgYW5kIHRvcCBsZXZlbCB7Li4ufSBibG9ja3MuCiAqIENhbiBiZSB1c2VkIHRvIGJyZWFrIGEgbWVzc2FnZSBpbnRvIHRleHQgYW5kIElDVSBleHByZXNzaW9ucywgb3IgdG8gYnJlYWsgYW4gSUNVIGV4cHJlc3Npb24gaW50bwogKiBrZXlzIGFuZCBjYXNlcy4KICogT3JpZ2luYWwgY29kZSBmcm9tIGNsb3N1cmUgbGlicmFyeSwgbW9kaWZpZWQgZm9yIEFuZ3VsYXIuCiAqCiAqIEBwYXJhbSB7P30gcGF0dGVybiAoc3ViKVBhdHRlcm4gdG8gYmUgYnJva2VuLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXh0cmFjdFBhcnRzKHBhdHRlcm4pIHsKICAgIGlmICghcGF0dGVybikgewogICAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2UG9zID0gMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJyYWNlU3RhY2sgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc3VsdHMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJyYWNlcyA9IC9be31dL2c7CiAgICAvLyBsYXN0SW5kZXggZG9lc24ndCBnZXQgc2V0IHRvIDAgc28gd2UgaGF2ZSB0by4KICAgIGJyYWNlcy5sYXN0SW5kZXggPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hdGNoOwogICAgd2hpbGUgKG1hdGNoID0gYnJhY2VzLmV4ZWMocGF0dGVybikpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcG9zID0gbWF0Y2guaW5kZXg7CiAgICAgICAgaWYgKG1hdGNoWzBdID09ICd9JykgewogICAgICAgICAgICBicmFjZVN0YWNrLnBvcCgpOwogICAgICAgICAgICBpZiAoYnJhY2VTdGFjay5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgLy8gRW5kIG9mIHRoZSBibG9jay4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gcGF0dGVybi5zdWJzdHJpbmcocHJldlBvcywgcG9zKTsKICAgICAgICAgICAgICAgIGlmIChJQ1VfQkxPQ0tfUkVHRVhQLnRlc3QoYmxvY2spKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSUNVQmxvY2soYmxvY2spKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChibG9jayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmV2UG9zID0gcG9zICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGJyYWNlU3RhY2subGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IHBhdHRlcm4uc3Vic3RyaW5nKHByZXZQb3MsIHBvcyk7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goc3Vic3RyaW5nKTsKICAgICAgICAgICAgICAgIHByZXZQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyYWNlU3RhY2sucHVzaCgneycpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN1YnN0cmluZyA9IHBhdHRlcm4uc3Vic3RyaW5nKHByZXZQb3MpOwogICAgcmVzdWx0cy5wdXNoKHN1YnN0cmluZyk7CiAgICByZXR1cm4gcmVzdWx0czsKfQovKioKICogUGFyc2VzIHRleHQgY29udGFpbmluZyBhbiBJQ1UgZXhwcmVzc2lvbiBhbmQgcHJvZHVjZXMgYSBKU09OIG9iamVjdCBmb3IgaXQuCiAqIE9yaWdpbmFsIGNvZGUgZnJvbSBjbG9zdXJlIGxpYnJhcnksIG1vZGlmaWVkIGZvciBBbmd1bGFyLgogKgogKiBAcGFyYW0gez99IHBhdHRlcm4gVGV4dCBjb250YWluaW5nIGFuIElDVSBleHByZXNzaW9uIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VJQ1VCbG9jayhwYXR0ZXJuKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjYXNlcyA9IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdmFsdWVzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaWN1VHlwZSA9IDEgLyogcGx1cmFsICovOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1haW5CaW5kaW5nID0gMDsKICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoSUNVX0JMT0NLX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdHIKICAgICAqIEBwYXJhbSB7P30gYmluZGluZwogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoc3RyLCBiaW5kaW5nLCB0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgIGljdVR5cGUgPSAwIC8qIHNlbGVjdCAqLzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGljdVR5cGUgPSAxIC8qIHBsdXJhbCAqLzsKICAgICAgICB9CiAgICAgICAgbWFpbkJpbmRpbmcgPSBwYXJzZUludChiaW5kaW5nLnN1YnN0cigxKSwgMTApOwogICAgICAgIHJldHVybiAnJzsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhcnRzID0gKC8qKiBAdHlwZSB7P30gKi8gKGV4dHJhY3RQYXJ0cyhwYXR0ZXJuKSkpOwogICAgLy8gTG9va2luZyBmb3IgKGtleSBibG9jaykrIHNlcXVlbmNlLiBPbmUgb2YgdGhlIGtleXMgaGFzIHRvIGJlICJvdGhlciIuCiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBwYXJ0cy5sZW5ndGg7KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBrZXkgPSBwYXJ0c1twb3MrK10udHJpbSgpOwogICAgICAgIGlmIChpY3VUeXBlID09PSAxIC8qIHBsdXJhbCAqLykgewogICAgICAgICAgICAvLyBLZXkgY2FuIGJlICI9eCIsIHdlIGp1c3Qgd2FudCAieCIKICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xzKig/Oj0pPyhcdyspXHMqLywgJyQxJyk7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2VzLnB1c2goa2V5KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJsb2NrcyA9ICgvKiogQHR5cGUgez99ICovIChleHRyYWN0UGFydHMocGFydHNbcG9zKytdKSkpOwogICAgICAgIGlmIChjYXNlcy5sZW5ndGggPiB2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGJsb2Nrcyk7CiAgICAgICAgfQogICAgfQogICAgLy8gVE9ETyhvY29tYmUpOiBzdXBwb3J0IElDVSBleHByZXNzaW9ucyBpbiBhdHRyaWJ1dGVzLCBzZWUgIzIxNjE1CiAgICByZXR1cm4geyB0eXBlOiBpY3VUeXBlLCBtYWluQmluZGluZzogbWFpbkJpbmRpbmcsIGNhc2VzLCB2YWx1ZXMgfTsKfQovKioKICogUmVtb3ZlcyBldmVyeXRoaW5nIGluc2lkZSB0aGUgc3ViLXRlbXBsYXRlcyBvZiBhIG1lc3NhZ2UuCiAqIEBwYXJhbSB7P30gbWVzc2FnZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlSW5uZXJUZW1wbGF0ZVRyYW5zbGF0aW9uKG1lc3NhZ2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtYXRjaDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByZXMgPSAnJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmRleCA9IDA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5UZW1wbGF0ZSA9IGZhbHNlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHRhZ01hdGNoZWQ7CiAgICB3aGlsZSAoKG1hdGNoID0gU1VCVEVNUExBVEVfUkVHRVhQLmV4ZWMobWVzc2FnZSkpICE9PSBudWxsKSB7CiAgICAgICAgaWYgKCFpblRlbXBsYXRlKSB7CiAgICAgICAgICAgIHJlcyArPSBtZXNzYWdlLnN1YnN0cmluZyhpbmRleCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICB0YWdNYXRjaGVkID0gbWF0Y2hbMV07CiAgICAgICAgICAgIGluVGVtcGxhdGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKG1hdGNoWzBdID09PSBgJHtNQVJLRVJ9Lyoke3RhZ01hdGNoZWR9JHtNQVJLRVJ9YCkgewogICAgICAgICAgICAgICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgICAgICAgICAgICAgIGluVGVtcGxhdGUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGluVGVtcGxhdGUsIGZhbHNlLCBgVGFnIG1pc21hdGNoOiB1bmFibGUgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBzdWItdGVtcGxhdGUgaW4gdGhlIHRyYW5zbGF0aW9uICIke21lc3NhZ2V9ImApOwogICAgcmVzICs9IG1lc3NhZ2Uuc3Vic3RyKGluZGV4KTsKICAgIHJldHVybiByZXM7Cn0KLyoqCiAqIEV4dHJhY3RzIGEgcGFydCBvZiBhIG1lc3NhZ2UgYW5kIHJlbW92ZXMgdGhlIHJlc3QuCiAqCiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGV4dHJhY3RpbmcgYSBwYXJ0IG9mIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCBhIHRlbXBsYXRlLiBBIHRyYW5zbGF0ZWQKICogbWVzc2FnZSBjYW4gc3BhbiBtdWx0aXBsZSB0ZW1wbGF0ZXMuCiAqCiAqIEV4YW1wbGU6CiAqIGBgYAogKiA8ZGl2IGkxOG4+VHJhbnNsYXRlIDxzcGFuICpuZ0lmPm1lPC9zcGFuPiE8L2Rpdj4KICogYGBgCiAqCiAqIEBwYXJhbSB7P30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBjcm9wCiAqIEBwYXJhbSB7Pz19IHN1YlRlbXBsYXRlSW5kZXggSW5kZXggb2YgdGhlIHN1Yi10ZW1wbGF0ZSB0byBleHRyYWN0LiBJZiB1bmRlZmluZWQgaXQgcmV0dXJucyB0aGUKICogZXh0ZXJuYWwgdGVtcGxhdGUgYW5kIHJlbW92ZXMgYWxsIHN1Yi10ZW1wbGF0ZXMuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbkZvclRlbXBsYXRlKG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpIHsKICAgIGlmICh0eXBlb2Ygc3ViVGVtcGxhdGVJbmRleCAhPT0gJ251bWJlcicpIHsKICAgICAgICAvLyBXZSB3YW50IHRoZSByb290IHRlbXBsYXRlIG1lc3NhZ2UsIGlnbm9yZSBhbGwgc3ViLXRlbXBsYXRlcwogICAgICAgIHJldHVybiByZW1vdmVJbm5lclRlbXBsYXRlVHJhbnNsYXRpb24obWVzc2FnZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXZSB3YW50IGEgc3BlY2lmaWMgc3ViLXRlbXBsYXRlCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKGA6JHtzdWJUZW1wbGF0ZUluZGV4fSR7TUFSS0VSfWApICsgMiArIHN1YlRlbXBsYXRlSW5kZXgudG9TdHJpbmcoKS5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVuZCA9IG1lc3NhZ2Uuc2VhcmNoKG5ldyBSZWdFeHAoYCR7TUFSS0VSfVxcL1xcKlxcZCs6JHtzdWJUZW1wbGF0ZUluZGV4fSR7TUFSS0VSfWApKTsKICAgICAgICByZXR1cm4gcmVtb3ZlSW5uZXJUZW1wbGF0ZVRyYW5zbGF0aW9uKG1lc3NhZ2Uuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICAgIH0KfQovKioKICogR2VuZXJhdGUgdGhlIE9wQ29kZXMgdG8gdXBkYXRlIHRoZSBiaW5kaW5ncyBvZiBhIHN0cmluZy4KICoKICogQHBhcmFtIHs/fSBzdHIgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBiaW5kaW5ncy4KICogQHBhcmFtIHs/fSBkZXN0aW5hdGlvbk5vZGUgSW5kZXggb2YgdGhlIGRlc3RpbmF0aW9uIG5vZGUgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBiaW5kaW5nLgogKiBAcGFyYW0gez89fSBhdHRyTmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIGlmIHRoZSBzdHJpbmcgYmVsb25ncyB0byBhbiBhdHRyaWJ1dGUuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplRm4gU2FuaXRpemF0aW9uIGZ1bmN0aW9uIHVzZWQgdG8gc2FuaXRpemUgdGhlIHN0cmluZyBhZnRlciB1cGRhdGUsIGlmIG5lY2Vzc2FyeS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXMoc3RyLCBkZXN0aW5hdGlvbk5vZGUsIGF0dHJOYW1lLCBzYW5pdGl6ZUZuID0gbnVsbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdXBkYXRlT3BDb2RlcyA9IFtudWxsLCBudWxsXTsKICAgIC8vIEFsbG9jIHNwYWNlIGZvciBtYXNrIGFuZCBzaXplCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0ZXh0UGFydHMgPSBzdHIuc3BsaXQoQklORElOR19SRUdFWFApOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hc2sgPSAwOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB0ZXh0UGFydHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGV4dFZhbHVlID0gdGV4dFBhcnRzW2pdOwogICAgICAgIGlmIChqICYgMSkgewogICAgICAgICAgICAvLyBPZGQgaW5kZXhlcyBhcmUgYmluZGluZ3MKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBwYXJzZUludCh0ZXh0VmFsdWUsIDEwKTsKICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKC0xIC0gYmluZGluZ0luZGV4KTsKICAgICAgICAgICAgbWFzayA9IG1hc2sgfCB0b01hc2tCaXQoYmluZGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGV4dFZhbHVlICE9PSAnJykgewogICAgICAgICAgICAvLyBFdmVuIGluZGV4ZXMgYXJlIHRleHQKICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKHRleHRWYWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgdXBkYXRlT3BDb2Rlcy5wdXNoKGRlc3RpbmF0aW9uTm9kZSA8PCAyIC8qIFNISUZUX1JFRiAqLyB8CiAgICAgICAgKGF0dHJOYW1lID8gMSAvKiBBdHRyICovIDogMCAvKiBUZXh0ICovKSk7CiAgICBpZiAoYXR0ck5hbWUpIHsKICAgICAgICB1cGRhdGVPcENvZGVzLnB1c2goYXR0ck5hbWUsIHNhbml0aXplRm4pOwogICAgfQogICAgdXBkYXRlT3BDb2Rlc1swXSA9IG1hc2s7CiAgICB1cGRhdGVPcENvZGVzWzFdID0gdXBkYXRlT3BDb2Rlcy5sZW5ndGggLSAyOwogICAgcmV0dXJuIHVwZGF0ZU9wQ29kZXM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaWN1RXhwcmVzc2lvbgogKiBAcGFyYW0gez89fSBtYXNrCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRCaW5kaW5nTWFzayhpY3VFeHByZXNzaW9uLCBtYXNrID0gMCkgewogICAgbWFzayA9IG1hc2sgfCB0b01hc2tCaXQoaWN1RXhwcmVzc2lvbi5tYWluQmluZGluZyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWF0Y2g7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljdUV4cHJlc3Npb24udmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlQXJyID0gaWN1RXhwcmVzc2lvbi52YWx1ZXNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZUFyci5sZW5ndGg7IGorKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVBcnJbal07CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBCSU5ESU5HX1JFR0VYUC5leGVjKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIG1hc2sgPSBtYXNrIHwgdG9NYXNrQml0KHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbWFzayA9IGdldEJpbmRpbmdNYXNrKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpLCBtYXNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXNrOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgaTE4bkluZGV4U3RhY2sgPSBbXTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgaTE4bkluZGV4U3RhY2tQb2ludGVyID0gLTE7Ci8qKgogKiBDb252ZXJ0IGJpbmRpbmcgaW5kZXggdG8gbWFzayBiaXQuCiAqCiAqIEVhY2ggaW5kZXggcmVwcmVzZW50cyBhIHNpbmdsZSBiaXQgb24gdGhlIGJpdC1tYXNrLiBCZWNhdXNlIGJpdC1tYXNrIG9ubHkgaGFzIDMyIGJpdHMsIHdlIG1ha2UKICogdGhlIDMybmQgYml0IHNoYXJlIGFsbCBtYXNrcyBmb3IgYWxsIGJpbmRpbmdzIGhpZ2hlciB0aGFuIDMyLiBTaW5jZSBpdCBpcyBleHRyZW1lbHkgcmFyZSB0byBoYXZlCiAqIG1vcmUgdGhhbiAzMiBiaW5kaW5ncyB0aGlzIHdpbGwgYmUgaGl0IHZlcnkgcmFyZWx5LiBUaGUgZG93bnNpZGUgb2YgaGl0dGluZyB0aGlzIGNvcm5lciBjYXNlIGlzCiAqIHRoYXQgd2Ugd2lsbCBleGVjdXRlIGJpbmRpbmcgY29kZSBtb3JlIG9mdGVuIHRoYW4gbmVjZXNzYXJ5LiAocGVuYWx0eSBvZiBwZXJmb3JtYW5jZSkKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRvTWFza0JpdChiaW5kaW5nSW5kZXgpIHsKICAgIHJldHVybiAxIDw8IE1hdGgubWluKGJpbmRpbmdJbmRleCwgMzEpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgcGFyZW50SW5kZXhTdGFjayA9IFtdOwovKioKICogTWFya3MgYSBibG9jayBvZiB0ZXh0IGFzIHRyYW5zbGF0YWJsZS4KICoKICogVGhlIGluc3RydWN0aW9ucyBgaTE4blN0YXJ0YCBhbmQgYGkxOG5FbmRgIG1hcmsgdGhlIHRyYW5zbGF0aW9uIGJsb2NrIGluIHRoZSB0ZW1wbGF0ZS4KICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBpcyB0aGUgdmFsdWUgd2hpY2ggaXMgbG9jYWxlIHNwZWNpZmljLiBUaGUgdHJhbnNsYXRpb24gc3RyaW5nIG1heQogKiBjb250YWluIHBsYWNlaG9sZGVycyB3aGljaCBhc3NvY2lhdGUgaW5uZXIgZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KICoKICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBwbGFjZWhvbGRlcnMgYXJlOgogKiAtIGDvv717aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpCaW5kaW5nIFBsYWNlaG9sZGVyKjogTWFya3MgYSBsb2NhdGlvbiB3aGVyZSBhbiBleHByZXNzaW9uIHdpbGwgYmUKICogICBpbnRlcnBvbGF0ZWQgaW50by4gVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaW5kZXguIEFuIG9wdGlvbmFsCiAqICAgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAqIC0gYO+/vSN7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8je2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqRWxlbWVudCBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUgYmVnaW5uaW5nCiAqICAgYW5kIGVuZCBvZiBET00gZWxlbWVudCB0aGF0IHdlcmUgZW1iZWRkZWQgaW4gdGhlIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGJsb2NrLiBUaGUgcGxhY2Vob2xkZXIKICogICBgaW5kZXhgIHBvaW50cyB0byB0aGUgZWxlbWVudCBpbmRleCBpbiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb25zIHNldC4gQW4gb3B0aW9uYWwgYGJsb2NrYCB0aGF0CiAqICAgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICogLSBg77+9IXtpbmRleH0oOntibG9ja30p77+9YC9g77+9LyF7aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpQcm9qZWN0aW9uIFBsYWNlaG9sZGVyKjogIE1hcmtzIHRoZQogKiAgIGJlZ2lubmluZyBhbmQgZW5kIG9mIDxuZy1jb250ZW50PiB0aGF0IHdhcyBlbWJlZGRlZCBpbiB0aGUgb3JpZ2luYWwgdHJhbnNsYXRpb24gYmxvY2suCiAqICAgVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBlbGVtZW50IGluZGV4IGluIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbnMgc2V0LgogKiAgIEFuIG9wdGlvbmFsIGBibG9ja2AgdGhhdCBtYXRjaGVzIHRoZSBzdWItdGVtcGxhdGUgaW4gd2hpY2ggaXQgd2FzIGRlY2xhcmVkLgogKiAtIGDvv70qe2luZGV4fTp7YmxvY2t977+9YC9g77+9Lyp7aW5kZXh9OntibG9ja33vv71gOiAqU3ViLXRlbXBsYXRlIFBsYWNlaG9sZGVyKjogU3ViLXRlbXBsYXRlcyBtdXN0IGJlCiAqICAgc3BsaXQgdXAgYW5kIHRyYW5zbGF0ZWQgc2VwYXJhdGVseSBpbiBlYWNoIGFuZ3VsYXIgdGVtcGxhdGUgZnVuY3Rpb24uIFRoZSBgaW5kZXhgIHBvaW50cyB0byB0aGUKICogICBgdGVtcGxhdGVgIGluc3RydWN0aW9uIGluZGV4LiBBIGBibG9ja2AgdGhhdCBtYXRjaGVzIHRoZSBzdWItdGVtcGxhdGUgaW4gd2hpY2ggaXQgd2FzIGRlY2xhcmVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBBIHVuaXF1ZSBpbmRleCBvZiB0aGUgdHJhbnNsYXRpb24gaW4gdGhlIHN0YXRpYyBibG9jay4KICogQHBhcmFtIHs/fSBtZXNzYWdlIFRoZSB0cmFuc2xhdGlvbiBtZXNzYWdlLgogKiBAcGFyYW0gez89fSBzdWJUZW1wbGF0ZUluZGV4IE9wdGlvbmFsIHN1Yi10ZW1wbGF0ZSBpbmRleCBpbiB0aGUgYG1lc3NhZ2VgLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWkxOG5TdGFydChpbmRleCwgbWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIGB0VmlldyBzaG91bGQgYmUgZGVmaW5lZGApOwogICAgaTE4bkluZGV4U3RhY2tbKytpMThuSW5kZXhTdGFja1BvaW50ZXJdID0gaW5kZXg7CiAgICAvLyBXZSBuZWVkIHRvIGRlbGF5IHByb2plY3Rpb25zIHVudGlsIGBpMThuRW5kYAogICAgc2V0RGVsYXlQcm9qZWN0aW9uKHRydWUpOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyAmJiB0Vmlldy5kYXRhW2luZGV4ICsgSEVBREVSX09GRlNFVF0gPT09IG51bGwpIHsKICAgICAgICBpMThuU3RhcnRGaXJzdFBhc3MoZ2V0TFZpZXcoKSwgdFZpZXcsIGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgIH0KfQovLyBDb3VudCBmb3IgdGhlIG51bWJlciBvZiB2YXJzIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIGVhY2ggaTE4biBibG9jay4KLy8gSXQgaXMgZ2xvYmFsIGJlY2F1c2UgdGhpcyBpcyB1c2VkIGluIG11bHRpcGxlIGZ1bmN0aW9ucyB0aGF0IGluY2x1ZGUgbG9vcHMgYW5kIHJlY3Vyc2l2ZSBjYWxscy4KLy8gVGhpcyBpcyByZXNldCB0byAwIHdoZW4gYGkxOG5TdGFydEZpcnN0UGFzc2AgaXMgY2FsbGVkLgovKiogQHR5cGUgez99ICovCmxldCBpMThuVmFyc0NvdW50OwovKioKICogU2VlIGBpMThuU3RhcnRgIGFib3ZlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IG1lc3NhZ2UKICogQHBhcmFtIHs/PX0gc3ViVGVtcGxhdGVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaTE4blN0YXJ0Rmlyc3RQYXNzKGxWaWV3LCB0VmlldywgaW5kZXgsIG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0Vmlldy5ibHVlcHJpbnQubGVuZ3RoIC0gSEVBREVSX09GRlNFVDsKICAgIGkxOG5WYXJzQ291bnQgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnRUTm9kZSA9IGdldElzUGFyZW50KCkgPyBwcmV2aW91c09yUGFyZW50VE5vZGUgOiBwcmV2aW91c09yUGFyZW50VE5vZGUgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnRJbmRleCA9IHBhcmVudFROb2RlICYmIHBhcmVudFROb2RlICE9PSBsVmlld1tUX0hPU1RdID8gcGFyZW50VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUIDogaW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcGFyZW50SW5kZXhQb2ludGVyID0gMDsKICAgIHBhcmVudEluZGV4U3RhY2tbcGFyZW50SW5kZXhQb2ludGVyXSA9IHBhcmVudEluZGV4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3JlYXRlT3BDb2RlcyA9IFtdOwogICAgLy8gSWYgdGhlIHByZXZpb3VzIG5vZGUgd2Fzbid0IHRoZSBkaXJlY3QgcGFyZW50IHRoZW4gd2UgaGF2ZSBhIHRyYW5zbGF0aW9uIHdpdGhvdXQgdG9wIGxldmVsCiAgICAvLyBlbGVtZW50IGFuZCB3ZSBuZWVkIHRvIGtlZXAgYSByZWZlcmVuY2Ugb2YgdGhlIHByZXZpb3VzIGVsZW1lbnQgaWYgdGhlcmUgaXMgb25lLiBXZSBzaG91bGQgYWxzbwogICAgLy8ga2VlcCB0cmFjayB3aGV0aGVyIGFuIGVsZW1lbnQgd2FzIGEgcGFyZW50IG5vZGUgb3Igbm90LCBzbyB0aGF0IHRoZSBsb2dpYyB0aGF0IGNvbnN1bWVzCiAgICAvLyB0aGUgZ2VuZXJhdGVkIGBJMThuTXV0YXRlT3BDb2RlYHMgY2FuIGxldmVyYWdlIHRoaXMgaW5mb3JtYXRpb24gdG8gcHJvcGVybHkgc2V0IFROb2RlIHN0YXRlCiAgICAvLyAod2hldGhlciBpdCdzIGEgcGFyZW50IG9yIHNpYmxpbmcpLgogICAgaWYgKGluZGV4ID4gMCAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUgIT09IHBhcmVudFROb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcmV2aW91c1ROb2RlSW5kZXggPSBwcmV2aW91c09yUGFyZW50VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUOwogICAgICAgIC8vIElmIGN1cnJlbnQgVE5vZGUgaXMgYSBzaWJsaW5nIG5vZGUsIGVuY29kZSBpdCB1c2luZyBhIG5lZ2F0aXZlIGluZGV4LiBUaGlzIGluZm9ybWF0aW9uIGlzCiAgICAgICAgLy8gcmVxdWlyZWQgd2hlbiB0aGUgYFNlbGVjdGAgYWN0aW9uIGlzIHByb2Nlc3NlZCAoc2VlIHRoZSBgcmVhZENyZWF0ZU9wQ29kZXNgIGZ1bmN0aW9uKS4KICAgICAgICBpZiAoIWdldElzUGFyZW50KCkpIHsKICAgICAgICAgICAgcHJldmlvdXNUTm9kZUluZGV4ID0gfnByZXZpb3VzVE5vZGVJbmRleDsKICAgICAgICB9CiAgICAgICAgLy8gQ3JlYXRlIGFuIE9wQ29kZSB0byBzZWxlY3QgdGhlIHByZXZpb3VzIFROb2RlCiAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKHByZXZpb3VzVE5vZGVJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDAgLyogU2VsZWN0ICovKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHVwZGF0ZU9wQ29kZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGljdUV4cHJlc3Npb25zID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0ZW1wbGF0ZVRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb25Gb3JUZW1wbGF0ZShtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1zZ1BhcnRzID0gcmVwbGFjZU5nc3AodGVtcGxhdGVUcmFuc2xhdGlvbikuc3BsaXQoUEhfUkVHRVhQKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXNnUGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHZhbHVlID0gbXNnUGFydHNbaV07CiAgICAgICAgaWYgKGkgJiAxKSB7CiAgICAgICAgICAgIC8vIE9kZCBpbmRleGVzIGFyZSBwbGFjZWhvbGRlcnMgKGVsZW1lbnRzIGFuZCBzdWItdGVtcGxhdGVzKQogICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KDApID09PSAnLycpIHsKICAgICAgICAgICAgICAgIC8vIEl0IGlzIGEgY2xvc2luZyB0YWcKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoMSkgPT09ICIjIiAvKiBFTEVNRU5UICovKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBoSW5kZXggPSBwYXJzZUludCh2YWx1ZS5zdWJzdHIoMiksIDEwKTsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IHBhcmVudEluZGV4U3RhY2tbLS1wYXJlbnRJbmRleFBvaW50ZXJdOwogICAgICAgICAgICAgICAgICAgIGNyZWF0ZU9wQ29kZXMucHVzaChwaEluZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgNSAvKiBFbGVtZW50RW5kICovKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBoSW5kZXggPSBwYXJzZUludCh2YWx1ZS5zdWJzdHIoMSksIDEwKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlzRWxlbWVudCA9IHZhbHVlLmNoYXJBdCgwKSA9PT0gIiMiIC8qIEVMRU1FTlQgKi87CiAgICAgICAgICAgICAgICAvLyBUaGUgdmFsdWUgcmVwcmVzZW50cyBhIHBsYWNlaG9sZGVyIHRoYXQgd2UgbW92ZSB0byB0aGUgZGVzaWduYXRlZCBpbmRleC4KICAgICAgICAgICAgICAgIC8vIE5vdGU6IHBvc2l0aXZlIGluZGljaWVzIGluZGljYXRlIHRoYXQgYSBUTm9kZSB3aXRoIGEgZ2l2ZW4gaW5kZXggc2hvdWxkIGFsc28gYmUgbWFya2VkIGFzCiAgICAgICAgICAgICAgICAvLyBwYXJlbnQgd2hpbGUgZXhlY3V0aW5nIGBTZWxlY3RgIGluc3RydWN0aW9uLgogICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKChpc0VsZW1lbnQgPyBwaEluZGV4IDogfnBoSW5kZXgpIDw8IDMgLyogU0hJRlRfUkVGICovIHwKICAgICAgICAgICAgICAgICAgICAwIC8qIFNlbGVjdCAqLywgcGFyZW50SW5kZXggPDwgMTcgLyogU0hJRlRfUEFSRU5UICovIHwgMSAvKiBBcHBlbmRDaGlsZCAqLyk7CiAgICAgICAgICAgICAgICBpZiAoaXNFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5kZXhTdGFja1srK3BhcmVudEluZGV4UG9pbnRlcl0gPSBwYXJlbnRJbmRleCA9IHBoSW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzICYgSUNVIGV4cHJlc3Npb25zKQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZXh0cmFjdFBhcnRzKHZhbHVlKTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgaWYgKGogJiAxKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT2RkIGluZGV4ZXMgYXJlIElDVSBleHByZXNzaW9ucwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpY3VFeHByZXNzaW9uID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgSUNVIGV4cHJlc3Npb24gaGFzIHRoZSByaWdodCBzaGFwZS4gVHJhbnNsYXRpb25zIG1pZ2h0IGNvbnRhaW4gaW52YWxpZAogICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdGlvbnMgKHdoaWxlIG9yaWdpbmFsIG1lc3NhZ2VzIHdlcmUgY29ycmVjdCksIHNvIElDVSBwYXJzaW5nIGF0IHJ1bnRpbWUgbWF5IG5vdAogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWQgKHRodXMgYGljdUV4cHJlc3Npb25gIHJlbWFpbnMgYSBzdHJpbmcpLgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWN1RXhwcmVzc2lvbiAhPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgSUNVIGV4cHJlc3Npb24gaW4gIiR7dGVtcGxhdGVUcmFuc2xhdGlvbn0iIG1lc3NhZ2UuYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbWVudCBub2RlIHRoYXQgd2lsbCBhbmNob3IgdGhlIElDVSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGljdU5vZGVJbmRleCA9IHN0YXJ0SW5kZXggKyBpMThuVmFyc0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKENPTU1FTlRfTUFSS0VSLCBuZ0Rldk1vZGUgPyBgSUNVICR7aWN1Tm9kZUluZGV4fWAgOiAnJywgaWN1Tm9kZUluZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY29kZXMgZm9yIHRoZSBJQ1UgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gZ2V0QmluZGluZ01hc2soaWN1RXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgICAgICAgaWN1U3RhcnQoaWN1RXhwcmVzc2lvbnMsIGljdUV4cHJlc3Npb24sIGljdU5vZGVJbmRleCwgaWN1Tm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHJlY3Vyc2l2ZSwgdGhlIGxhc3QgVEljdSB0aGF0IHdhcyBwdXNoZWQgaXMgdGhlIG9uZSB3ZSB3YW50CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRJY3VJbmRleCA9IGljdUV4cHJlc3Npb25zLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKHRvTWFza0JpdChpY3VFeHByZXNzaW9uLm1haW5CaW5kaW5nKSwgLy8gbWFzayBvZiB0aGUgbWFpbiBiaW5kaW5nCiAgICAgICAgICAgICAgICAgICAgMywgLy8gc2tpcCAzIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAtMSAtIGljdUV4cHJlc3Npb24ubWFpbkJpbmRpbmcsIGljdU5vZGVJbmRleCA8PCAyIC8qIFNISUZUX1JFRiAqLyB8IDIgLyogSWN1U3dpdGNoICovLCB0SWN1SW5kZXgsIG1hc2ssIC8vIG1hc2sgb2YgYWxsIHRoZSBiaW5kaW5ncyBvZiB0aGlzIElDVSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgMiwgLy8gc2tpcCAyIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICBpY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIEljdVVwZGF0ZSAqLywgdEljdUluZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRzW2pdICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbiBpbmRleGVzIGFyZSB0ZXh0IChpbmNsdWRpbmcgYmluZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSB0ZXh0Lm1hdGNoKEJJTkRJTkdfUkVHRVhQKTsKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGV4dCBub2RlcwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZUluZGV4ID0gc3RhcnRJbmRleCArIGkxOG5WYXJzQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBjcmVhdGVPcENvZGVzLnB1c2goCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBiaW5kaW5nLCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgZHVyaW5nIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGhhc0JpbmRpbmcgPyAnJyA6IHRleHQsIHRleHROb2RlSW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgIGlmIChoYXNCaW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2Rlcyh0ZXh0LCB0ZXh0Tm9kZUluZGV4KSwgdXBkYXRlT3BDb2Rlcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKGkxOG5WYXJzQ291bnQgPiAwKSB7CiAgICAgICAgYWxsb2NFeHBhbmRvKHRWaWV3LCBsVmlldywgaTE4blZhcnNDb3VudCk7CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhdHRhY2hJMThuT3BDb2Rlc0RlYnVnKGNyZWF0ZU9wQ29kZXMsIHVwZGF0ZU9wQ29kZXMsIGljdUV4cHJlc3Npb25zLmxlbmd0aCA/IGljdUV4cHJlc3Npb25zIDogbnVsbCwgbFZpZXcpOwogICAgLy8gTk9URTogbG9jYWwgdmFyIG5lZWRlZCB0byBwcm9wZXJseSBhc3NlcnQgdGhlIHR5cGUgb2YgYFRJMThuYC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRJMThuID0gewogICAgICAgIHZhcnM6IGkxOG5WYXJzQ291bnQsCiAgICAgICAgY3JlYXRlOiBjcmVhdGVPcENvZGVzLAogICAgICAgIHVwZGF0ZTogdXBkYXRlT3BDb2RlcywKICAgICAgICBpY3VzOiBpY3VFeHByZXNzaW9ucy5sZW5ndGggPyBpY3VFeHByZXNzaW9ucyA6IG51bGwsCiAgICB9OwogICAgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID0gdEkxOG47Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHBhcmVudFROb2RlCiAqIEBwYXJhbSB7P30gcHJldmlvdXNUTm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcHBlbmRJMThuTm9kZSh0VmlldywgdE5vZGUsIHBhcmVudFROb2RlLCBwcmV2aW91c1ROb2RlLCBsVmlldykgewogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlck1vdmVOb2RlKys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXh0Tm9kZSA9IHROb2RlLm5leHQ7CiAgICBpZiAoIXByZXZpb3VzVE5vZGUpIHsKICAgICAgICBwcmV2aW91c1ROb2RlID0gcGFyZW50VE5vZGU7CiAgICB9CiAgICAvLyBSZS1vcmdhbml6ZSBub2RlIHRyZWUgdG8gcHV0IHRoaXMgbm9kZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbi4KICAgIGlmIChwcmV2aW91c1ROb2RlID09PSBwYXJlbnRUTm9kZSAmJiB0Tm9kZSAhPT0gcGFyZW50VE5vZGUuY2hpbGQpIHsKICAgICAgICB0Tm9kZS5uZXh0ID0gcGFyZW50VE5vZGUuY2hpbGQ7CiAgICAgICAgcGFyZW50VE5vZGUuY2hpbGQgPSB0Tm9kZTsKICAgIH0KICAgIGVsc2UgaWYgKHByZXZpb3VzVE5vZGUgIT09IHBhcmVudFROb2RlICYmIHROb2RlICE9PSBwcmV2aW91c1ROb2RlLm5leHQpIHsKICAgICAgICB0Tm9kZS5uZXh0ID0gcHJldmlvdXNUTm9kZS5uZXh0OwogICAgICAgIHByZXZpb3VzVE5vZGUubmV4dCA9IHROb2RlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdE5vZGUubmV4dCA9IG51bGw7CiAgICB9CiAgICBpZiAocGFyZW50VE5vZGUgIT09IGxWaWV3W1RfSE9TVF0pIHsKICAgICAgICB0Tm9kZS5wYXJlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50VE5vZGUpKTsKICAgIH0KICAgIC8vIElmIHROb2RlIHdhcyBtb3ZlZCBhcm91bmQsIHdlIG1pZ2h0IG5lZWQgdG8gZml4IGEgYnJva2VuIGxpbmsuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3Vyc29yID0gdE5vZGUubmV4dDsKICAgIHdoaWxlIChjdXJzb3IpIHsKICAgICAgICBpZiAoY3Vyc29yLm5leHQgPT09IHROb2RlKSB7CiAgICAgICAgICAgIGN1cnNvci5uZXh0ID0gbmV4dE5vZGU7CiAgICAgICAgfQogICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0OwogICAgfQogICAgLy8gSWYgdGhlIHBsYWNlaG9sZGVyIHRvIGFwcGVuZCBpcyBhIHByb2plY3Rpb24sIHdlIG5lZWQgdG8gbW92ZSB0aGUgcHJvamVjdGVkIG5vZGVzIGluc3RlYWQKICAgIGlmICh0Tm9kZS50eXBlID09PSAxIC8qIFByb2plY3Rpb24gKi8pIHsKICAgICAgICBhcHBseVByb2plY3Rpb24odFZpZXcsIGxWaWV3LCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSk7CiAgICAgICAgcmV0dXJuIHROb2RlOwogICAgfQogICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldyksIHROb2RlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNsb3RWYWx1ZSA9IGxWaWV3W3ROb2RlLmluZGV4XTsKICAgIGlmICh0Tm9kZS50eXBlICE9PSAwIC8qIENvbnRhaW5lciAqLyAmJiBpc0xDb250YWluZXIoc2xvdFZhbHVlKSkgewogICAgICAgIC8vIE5vZGVzIHRoYXQgaW5qZWN0IFZpZXdDb250YWluZXJSZWYgYWxzbyBoYXZlIGEgY29tbWVudCBub2RlIHRoYXQgc2hvdWxkIGJlIG1vdmVkCiAgICAgICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBzbG90VmFsdWVbTkFUSVZFXSwgdE5vZGUpOwogICAgfQogICAgcmV0dXJuIHROb2RlOwp9Ci8qKgogKiBIYW5kbGVzIG1lc3NhZ2Ugc3RyaW5nIHBvc3QtcHJvY2Vzc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCiAqCiAqIEhhbmRsZXMgbWVzc2FnZSBzdHJpbmcgcG9zdC1wcm9jZXNzaW5nIGJ5IHRyYW5zZm9ybWluZyBpdCBmcm9tIGludGVybWVkaWF0ZQogKiBmb3JtYXQgKHRoYXQgbWlnaHQgY29udGFpbiBzb21lIG1hcmtlcnMgdGhhdCB3ZSBuZWVkIHRvIHJlcGxhY2UpIHRvIHRoZSBmaW5hbAogKiBmb3JtLCBjb25zdW1hYmxlIGJ5IGkxOG5TdGFydCBpbnN0cnVjdGlvbi4gUG9zdCBwcm9jZXNzaW5nIHN0ZXBzIGluY2x1ZGU6CiAqCiAqIDEuIFJlc29sdmUgYWxsIG11bHRpLXZhbHVlIGNhc2VzIChsaWtlIFvvv70qMTox77+977+9IzI6Me+/vXzvv70jNDox77+9fO+/vTXvv71dKQogKiAyLiBSZXBsYWNlIGFsbCBJQ1UgdmFycyAobGlrZSAiVkFSX1BMVVJBTCIpCiAqIDMuIFJlcGxhY2UgYWxsIHBsYWNlaG9sZGVycyB1c2VkIGluc2lkZSBJQ1VzIGluIGEgZm9ybSBvZiB7UExBQ0VIT0xERVJ9CiAqIDQuIFJlcGxhY2UgYWxsIElDVSByZWZlcmVuY2VzIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgKGxpa2Ug77+9SUNVX0VYUF9JQ1VfMe+/vSkKICogICAgaW4gY2FzZSBtdWx0aXBsZSBJQ1VzIGhhdmUgdGhlIHNhbWUgcGxhY2Vob2xkZXIgbmFtZQogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBtZXNzYWdlIFJhdyB0cmFuc2xhdGlvbiBzdHJpbmcgZm9yIHBvc3QgcHJvY2Vzc2luZwogKiBAcGFyYW0gez89fSByZXBsYWNlbWVudHMgU2V0IG9mIHJlcGxhY2VtZW50cyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkCiAqCiAqIEByZXR1cm4gez99IFRyYW5zZm9ybWVkIHN0cmluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBpMThuU3RhcnQgaW5zdHJ1Y3Rpb24KICoKICovCmZ1bmN0aW9uIMm1ybVpMThuUG9zdHByb2Nlc3MobWVzc2FnZSwgcmVwbGFjZW1lbnRzID0ge30pIHsKICAgIC8qKgogICAgICogU3RlcCAxOiByZXNvbHZlIGFsbCBtdWx0aS12YWx1ZSBwbGFjZWhvbGRlcnMgbGlrZSBb77+9IzXvv71877+9KjE6Me+/ve+/vSMyOjHvv71877+9IzQ6Me+/vV0KICAgICAqCiAgICAgKiBOb3RlOiBkdWUgdG8gdGhlIHdheSB3ZSBwcm9jZXNzIG5lc3RlZCB0ZW1wbGF0ZXMgKEJGUyksIG11bHRpLXZhbHVlIHBsYWNlaG9sZGVycyBhcmUgdHlwaWNhbGx5CiAgICAgKiBncm91cGVkIGJ5IHRlbXBsYXRlcywgZm9yIGV4YW1wbGU6IFvvv70jNe+/vXzvv70jNu+/vXzvv70jMTox77+9fO+/vSMzOjLvv71dIHdoZXJlIO+/vSM177+9IGFuZCDvv70jNu+/vSBiZWxvbmcgdG8gcm9vdAogICAgICogdGVtcGxhdGUsIO+/vSMxOjHvv70gYmVsb25nIHRvIG5lc3RlZCB0ZW1wbGF0ZSB3aXRoIGluZGV4IDEgYW5kIO+/vSMxOjLvv70gLSBuZXN0ZWQgdGVtcGxhdGUgd2l0aCBpbmRleAogICAgICogMy4gSG93ZXZlciBpbiByZWFsIHRlbXBsYXRlcyB0aGUgb3JkZXIgbWlnaHQgYmUgZGlmZmVyZW50OiBpLmUuIO+/vSMxOjHvv70gYW5kL29yIO+/vSMzOjLvv70gbWF5IGdvIGluCiAgICAgKiBmcm9udCBvZiDvv70jNu+/vS4gVGhlIHBvc3QgcHJvY2Vzc2luZyBzdGVwIHJlc3RvcmVzIHRoZSByaWdodCBvcmRlciBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZQogICAgICogdGVtcGxhdGUgaWQgc3RhY2sgYW5kIGxvb2tzIGZvciBwbGFjZWhvbGRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgdGVtcGxhdGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgbGV0IHJlc3VsdCA9IG1lc3NhZ2U7CiAgICBpZiAoUFBfTVVMVElfVkFMVUVfUExBQ0VIT0xERVJTX1JFR0VYUC50ZXN0KG1lc3NhZ2UpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hdGNoZXMgPSB7fTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGVJZHNTdGFjayA9IFtST09UX1RFTVBMQVRFX0lEXTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9QTEFDRUhPTERFUlNfUkVHRVhQLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtCiAgICAgICAgICogQHBhcmFtIHs/fSBwaHMKICAgICAgICAgKiBAcGFyYW0gez99IHRtcGwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtLCBwaHMsIHRtcGwpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gcGhzIHx8IHRtcGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gbWF0Y2hlc1tjb250ZW50XSB8fCBbXTsKICAgICAgICAgICAgaWYgKCFwbGFjZWhvbGRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb250ZW50LnNwbGl0KCd8JykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYWNlaG9sZGVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocGxhY2Vob2xkZXIpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBwbGFjZWhvbGRlci5tYXRjaChQUF9URU1QTEFURV9JRF9SRUdFWFApOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkID0gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogUk9PVF9URU1QTEFURV9JRDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDbG9zZVRlbXBsYXRlVGFnID0gUFBfQ0xPU0VfVEVNUExBVEVfUkVHRVhQLnRlc3QocGxhY2Vob2xkZXIpOwogICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5wdXNoKFt0ZW1wbGF0ZUlkLCBpc0Nsb3NlVGVtcGxhdGVUYWcsIHBsYWNlaG9sZGVyXSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBtYXRjaGVzW2NvbnRlbnRdID0gcGxhY2Vob2xkZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcGxhY2Vob2xkZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpMThuIHBvc3Rwcm9jZXNzOiB1bm1hdGNoZWQgcGxhY2Vob2xkZXIgLSAke2NvbnRlbnR9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdXJyZW50VGVtcGxhdGVJZCA9IHRlbXBsYXRlSWRzU3RhY2tbdGVtcGxhdGVJZHNTdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaWR4ID0gMDsKICAgICAgICAgICAgLy8gZmluZCBwbGFjZWhvbGRlciBpbmRleCB0aGF0IG1hdGNoZXMgY3VycmVudCB0ZW1wbGF0ZSBpZAogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyc1tpXVswXSA9PT0gY3VycmVudFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBpZHggPSBpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHVwZGF0ZSB0ZW1wbGF0ZSBpZCBzdGFjayBiYXNlZCBvbiB0aGUgY3VycmVudCB0YWcgZXh0cmFjdGVkCiAgICAgICAgICAgIGNvbnN0IFt0ZW1wbGF0ZUlkLCBpc0Nsb3NlVGVtcGxhdGVUYWcsIHBsYWNlaG9sZGVyXSA9IHBsYWNlaG9sZGVyc1tpZHhdOwogICAgICAgICAgICBpZiAoaXNDbG9zZVRlbXBsYXRlVGFnKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkc1N0YWNrLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRUZW1wbGF0ZUlkICE9PSB0ZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkc1N0YWNrLnB1c2godGVtcGxhdGVJZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIHByb2Nlc3NlZCB0YWcgZnJvbSB0aGUgbGlzdAogICAgICAgICAgICBwbGFjZWhvbGRlcnMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjsKICAgICAgICB9KSk7CiAgICB9CiAgICAvLyByZXR1cm4gY3VycmVudCByZXN1bHQgaWYgbm8gcmVwbGFjZW1lbnRzIHNwZWNpZmllZAogICAgaWYgKCFPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLmxlbmd0aCkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFN0ZXAgMjogcmVwbGFjZSBhbGwgSUNVIHZhcnMgKGxpa2UgIlZBUl9QTFVSQUwiKQogICAgICovCiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VfVkFSU19SRUdFWFAsICgvKioKICAgICAqIEBwYXJhbSB7P30gbWF0Y2gKICAgICAqIEBwYXJhbSB7P30gc3RhcnQKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IF90eXBlCiAgICAgKiBAcGFyYW0gez99IF9pZHgKICAgICAqIEBwYXJhbSB7P30gZW5kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAobWF0Y2gsIHN0YXJ0LCBrZXksIF90eXBlLCBfaWR4LCBlbmQpID0+IHsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnRzLmhhc093blByb3BlcnR5KGtleSkgPyBgJHtzdGFydH0ke3JlcGxhY2VtZW50c1trZXldfSR7ZW5kfWAgOiBtYXRjaDsKICAgIH0pKTsKICAgIC8qKgogICAgICogU3RlcCAzOiByZXBsYWNlIGFsbCBwbGFjZWhvbGRlcnMgdXNlZCBpbnNpZGUgSUNVcyBpbiBhIGZvcm0gb2Yge1BMQUNFSE9MREVSfQogICAgICovCiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VfUExBQ0VIT0xERVJTX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChtYXRjaCwga2V5KSA9PiB7CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpID8gKC8qKiBAdHlwZSB7P30gKi8gKHJlcGxhY2VtZW50c1trZXldKSkgOiBtYXRjaDsKICAgIH0pKTsKICAgIC8qKgogICAgICogU3RlcCA0OiByZXBsYWNlIGFsbCBJQ1UgcmVmZXJlbmNlcyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzIChsaWtlIO+/vUlDVV9FWFBfSUNVXzHvv70pIGluIGNhc2UKICAgICAqIG11bHRpcGxlIElDVXMgaGF2ZSB0aGUgc2FtZSBwbGFjZWhvbGRlciBuYW1lCiAgICAgKi8KICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFBQX0lDVVNfUkVHRVhQLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IG1hdGNoCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKG1hdGNoLCBrZXkpID0+IHsKICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaXN0ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlcGxhY2VtZW50c1trZXldKSk7CiAgICAgICAgICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaTE4biBwb3N0cHJvY2VzczogdW5tYXRjaGVkIElDVSAtICR7bWF0Y2h9IHdpdGgga2V5OiAke2tleX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGxpc3Quc2hpZnQoKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICB9KSk7CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBUcmFuc2xhdGVzIGEgdHJhbnNsYXRpb24gYmxvY2sgbWFya2VkIGJ5IGBpMThuU3RhcnRgIGFuZCBgaTE4bkVuZGAuIEl0IGluc2VydHMgdGhlIHRleHQvSUNVIG5vZGVzCiAqIGludG8gdGhlIHJlbmRlciB0cmVlLCBtb3ZlcyB0aGUgcGxhY2Vob2xkZXIgbm9kZXMgYW5kIHJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZXMuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWkxOG5FbmQoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0VmlldywgYHRWaWV3IHNob3VsZCBiZSBkZWZpbmVkYCk7CiAgICBpMThuRW5kRmlyc3RQYXNzKHRWaWV3LCBsVmlldyk7CiAgICAvLyBTdG9wIGRlbGF5aW5nIHByb2plY3Rpb25zCiAgICBzZXREZWxheVByb2plY3Rpb24oZmFsc2UpOwp9Ci8qKgogKiBTZWUgYGkxOG5FbmRgIGFib3ZlLgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGkxOG5FbmRGaXJzdFBhc3ModFZpZXcsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbChnZXRCaW5kaW5nSW5kZXgoKSwgdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgsICdpMThuRW5kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBiaW5kaW5nJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290SW5kZXggPSBpMThuSW5kZXhTdGFja1tpMThuSW5kZXhTdGFja1BvaW50ZXItLV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0STE4biA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW3Jvb3RJbmRleCArIEhFQURFUl9PRkZTRVRdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0STE4biwgYFlvdSBzaG91bGQgY2FsbCBpMThuU3RhcnQgYmVmb3JlIGkxOG5FbmRgKTsKICAgIC8vIEZpbmQgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhZGRlZCBiZWZvcmUgYGkxOG5FbmRgCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsYXN0Q3JlYXRlZE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIC8vIFJlYWQgdGhlIGluc3RydWN0aW9ucyB0byBpbnNlcnQvbW92ZS9yZW1vdmUgRE9NIGVsZW1lbnRzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSByZWFkQ3JlYXRlT3BDb2Rlcyhyb290SW5kZXgsIHRJMThuLmNyZWF0ZSwgdFZpZXcsIGxWaWV3KTsKICAgIC8vIFJlbW92ZSBkZWxldGVkIG5vZGVzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5kZXggPSByb290SW5kZXggKyAxOwogICAgd2hpbGUgKGluZGV4IDw9IGxhc3RDcmVhdGVkTm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpIHsKICAgICAgICBpZiAodmlzaXRlZE5vZGVzLmluZGV4T2YoaW5kZXgpID09PSAtMSkgewogICAgICAgICAgICByZW1vdmVOb2RlKHRWaWV3LCBsVmlldywgaW5kZXgsIC8qIG1hcmtBc0RldGFjaGVkICovIHRydWUpOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBpZiBhbiBlbGVtZW50IGhhcyBhbnkgbG9jYWwgcmVmcyBhbmQgc2tpcCB0aGVtCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGluZGV4KTsKICAgICAgICBpZiAodE5vZGUgJiYKICAgICAgICAgICAgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovIHx8IHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fAogICAgICAgICAgICAgICAgdE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSAmJgogICAgICAgICAgICB0Tm9kZS5sb2NhbE5hbWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIERpdmlkZSBieSAyIHRvIGdldCB0aGUgbnVtYmVyIG9mIGxvY2FsIHJlZnMsCiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXkgYXJlIHN0b3JlZCBhcyBhbiBhcnJheSB0aGF0IGFsc28gaW5jbHVkZXMgZGlyZWN0aXZlIGluZGV4ZXMsCiAgICAgICAgICAgIC8vIGkuZS4gWyJsb2NhbFJlZiIsIGRpcmVjdGl2ZUluZGV4LCAuLi5dCiAgICAgICAgICAgIGluZGV4ICs9IHROb2RlLmxvY2FsTmFtZXMubGVuZ3RoID4+IDE7CiAgICAgICAgfQogICAgICAgIGluZGV4Kys7CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYW5kIHN0b3JlcyB0aGUgZHluYW1pYyBUTm9kZSwgYW5kIHVuaG9va3MgaXQgZnJvbSB0aGUgdHJlZSBmb3Igbm93LgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYXRpdmUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVEeW5hbWljTm9kZUF0SW5kZXgodFZpZXcsIGxWaWV3LCBpbmRleCwgdHlwZSwgbmF0aXZlLCBuYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgaW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgIGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF0gPSBuYXRpdmU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIGxWaWV3W1RfSE9TVF0sIGluZGV4LCAoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBuYW1lLCBudWxsKTsKICAgIC8vIFdlIGFyZSBjcmVhdGluZyBhIGR5bmFtaWMgbm9kZSwgdGhlIHByZXZpb3VzIHROb2RlIG1pZ2h0IG5vdCBiZSBwb2ludGluZyBhdCB0aGlzIG5vZGUuCiAgICAvLyBXZSB3aWxsIGxpbmsgb3Vyc2VsdmVzIGludG8gdGhlIHRyZWUgbGF0ZXIgd2l0aCBgYXBwZW5kSTE4bk5vZGVgLgogICAgaWYgKHByZXZpb3VzT3JQYXJlbnRUTm9kZSAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9PT0gdE5vZGUpIHsKICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gdE5vZGU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBjcmVhdGVPcENvZGVzCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVhZENyZWF0ZU9wQ29kZXMoaW5kZXgsIGNyZWF0ZU9wQ29kZXMsIHRWaWV3LCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3VycmVudFROb2RlID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2aW91c1ROb2RlID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZpc2l0ZWROb2RlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjcmVhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9wQ29kZSA9IGNyZWF0ZU9wQ29kZXNbaV07CiAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0Uk5vZGUgPSBjcmVhdGVUZXh0Tm9kZShvcENvZGUsIHJlbmRlcmVyKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZUluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlVGV4dE5vZGUrKzsKICAgICAgICAgICAgcHJldmlvdXNUTm9kZSA9IGN1cnJlbnRUTm9kZTsKICAgICAgICAgICAgY3VycmVudFROb2RlID0KICAgICAgICAgICAgICAgIGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleCh0VmlldywgbFZpZXcsIHRleHROb2RlSW5kZXgsIDMgLyogRWxlbWVudCAqLywgdGV4dFJOb2RlLCBudWxsKTsKICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2godGV4dE5vZGVJbmRleCk7CiAgICAgICAgICAgIHNldElzTm90UGFyZW50KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgc3dpdGNoIChvcENvZGUgJiA3IC8qIE1BU0tfT1BDT0RFICovKSB7CiAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXBwZW5kQ2hpbGQgKi86CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uTm9kZUluZGV4ID0gb3BDb2RlID4+PiAxNyAvKiBTSElGVF9QQVJFTlQgKi87CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBkZXN0aW5hdGlvblROb2RlOwogICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbk5vZGVJbmRleCA9PT0gaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIG5vZGUgaXMgYGkxOG5TdGFydGAsIHdlIGRvbid0IGhhdmUgYQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3AtbGV2ZWwgbm9kZSBhbmQgd2Ugc2hvdWxkIHVzZSB0aGUgaG9zdCBub2RlIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25UTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tUX0hPU1RdKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGRlc3RpbmF0aW9uTm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpLCBgWW91IG5lZWQgdG8gY3JlYXRlIG9yIHNlbGVjdCBhIG5vZGUgYmVmb3JlIHlvdSBjYW4gaW5zZXJ0IGl0IGludG8gdGhlIERPTWApOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRJMThuTm9kZSh0VmlldywgKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpLCBkZXN0aW5hdGlvblROb2RlLCBwcmV2aW91c1ROb2RlLCBsVmlldyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogU2VsZWN0ICovOgogICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGluZGljaWVzIGluZGljYXRlIHRoYXQgYSBnaXZlbiBUTm9kZSBpcyBhIHNpYmxpbmcgbm9kZSwgbm90IGEgcGFyZW50IG5vZGUKICAgICAgICAgICAgICAgICAgICAvLyAoc2VlIGBpMThuU3RhcnRGaXJzdFBhc3NgIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uKS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQYXJlbnQgPSBvcENvZGUgPj0gMDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gKGlzUGFyZW50ID8gb3BDb2RlIDogfm9wQ29kZSkgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKG5vZGVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUTm9kZSA9IGN1cnJlbnRUTm9kZTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50VE5vZGUgPSBnZXRUTm9kZSh0Vmlldywgbm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZShjdXJyZW50VE5vZGUsIGlzUGFyZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDUgLyogRWxlbWVudEVuZCAqLzoKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlID0gY3VycmVudFROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGVsZW1lbnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKGN1cnJlbnRUTm9kZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0IC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnROb2RlSW5kZXggPSBvcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBpcyB1c2VkIGZvciBJQ1UgZXhwcmVzc2lvbnMgb25seSwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMvY29tcG9uZW50cyBpbiBJQ1VzLCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGlucHV0cyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKGdldFROb2RlKHRWaWV3LCBlbGVtZW50Tm9kZUluZGV4KSwgbFZpZXcsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7b3BDb2RlfSJgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3dpdGNoIChvcENvZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9NQVJLRVI6CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudE5vZGVJbmRleCA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWwodHlwZW9mIGNvbW1lbnRWYWx1ZSwgJ3N0cmluZycsIGBFeHBlY3RlZCAiJHtjb21tZW50VmFsdWV9IiB0byBiZSBhIGNvbW1lbnQgbm9kZSB2YWx1ZWApOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50Uk5vZGUgPSByZW5kZXJlci5jcmVhdGVDb21tZW50KGNvbW1lbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUNvbW1lbnQrKzsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlID0gY3VycmVudFROb2RlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUTm9kZSA9IGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleCh0VmlldywgbFZpZXcsIGNvbW1lbnROb2RlSW5kZXgsIDUgLyogSWN1Q29udGFpbmVyICovLCBjb21tZW50Uk5vZGUsIG51bGwpOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKGNvbW1lbnROb2RlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb21tZW50Uk5vZGUsIGxWaWV3KTsKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpKS5hY3RpdmVDYXNlSW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYWRkIHRoZSBjYXNlIG5vZGVzIGxhdGVyLCBkdXJpbmcgdGhlIHVwZGF0ZSBwaGFzZQogICAgICAgICAgICAgICAgICAgIHNldElzTm90UGFyZW50KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVMRU1FTlRfTUFSS0VSOgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnROb2RlSW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFsKHR5cGVvZiB0YWdOYW1lVmFsdWUsICdzdHJpbmcnLCBgRXhwZWN0ZWQgIiR7dGFnTmFtZVZhbHVlfSIgdG8gYmUgYW4gZWxlbWVudCBub2RlIHRhZyBuYW1lYCk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSTm9kZSA9IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGFnTmFtZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlRWxlbWVudCsrOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGU7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFROb2RlID0gY3JlYXRlRHluYW1pY05vZGVBdEluZGV4KHRWaWV3LCBsVmlldywgZWxlbWVudE5vZGVJbmRleCwgMyAvKiBFbGVtZW50ICovLCBlbGVtZW50Uk5vZGUsIHRhZ05hbWVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2goZWxlbWVudE5vZGVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBtdXRhdGUgb3BlcmF0aW9uIGZvciAiJHtvcENvZGV9ImApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgIHJldHVybiB2aXNpdGVkTm9kZXM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdXBkYXRlT3BDb2RlcwogKiBAcGFyYW0gez99IGljdXMKICogQHBhcmFtIHs/fSBiaW5kaW5nc1N0YXJ0SW5kZXgKICogQHBhcmFtIHs/fSBjaGFuZ2VNYXNrCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez89fSBieXBhc3NDaGVja0JpdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVhZFVwZGF0ZU9wQ29kZXModXBkYXRlT3BDb2RlcywgaWN1cywgYmluZGluZ3NTdGFydEluZGV4LCBjaGFuZ2VNYXNrLCB0VmlldywgbFZpZXcsIGJ5cGFzc0NoZWNrQml0ID0gZmFsc2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjYXNlQ3JlYXRlZCA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gYml0IGNvZGUgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGFwcGx5IHRoZSBuZXh0IHVwZGF0ZQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaGVja0JpdCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzW2ldKSk7CiAgICAgICAgLy8gTnVtYmVyIG9mIG9wQ29kZXMgdG8gc2tpcCB1bnRpbCBuZXh0IHNldCBvZiB1cGRhdGUgY29kZXMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2tpcENvZGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHVwZGF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgIGlmIChieXBhc3NDaGVja0JpdCB8fCAoY2hlY2tCaXQgJiBjaGFuZ2VNYXNrKSkgewogICAgICAgICAgICAvLyBUaGUgdmFsdWUgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0IGNoZWNrZWQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmFsdWUgPSAnJzsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDw9IChpICsgc2tpcENvZGVzKTsgaisrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcENvZGUgPSB1cGRhdGVPcENvZGVzW2pdOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBvcENvZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3BDb2RlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wQ29kZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIGJpbmRpbmcgaW5kZXggd2hvc2UgdmFsdWUgaXMgbmVnYXRpdmUKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gcmVuZGVyU3RyaW5naWZ5KGxWaWV3W2JpbmRpbmdzU3RhcnRJbmRleCAtIG9wQ29kZV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDIgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0SWN1SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljdVROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDMgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBBdHRyICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVGbiA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgZ2V0VE5vZGUodFZpZXcsIG5vZGVJbmRleCksIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVGbiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIC8qIFRleHQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgbm9kZUluZGV4LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogSWN1U3dpdGNoICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGNhc2UsIGRlbGV0ZSB0aGUgb2xkIG5vZGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljdVROb2RlLmFjdGl2ZUNhc2VJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUNvZGVzID0gdEljdS5yZW1vdmVbaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByZW1vdmVDb2Rlcy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlT3BDb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlbW92ZUNvZGVzW2tdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlbW92ZU9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogUmVtb3ZlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IHJlbW92ZU9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBET00gZWxlbWVudCwgYnV0IGRvICpub3QqIG1hcmsgVE5vZGUgYXMgZGV0YWNoZWQsIHNpbmNlIHdlIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHN3aXRjaGluZyBJQ1UgY2FzZXMgKHdoaWxlIGtlZXBpbmcgdGhlIHNhbWUgVE5vZGUpLCBzbyBhIERPTSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGluZyBhIG5ldyBJQ1UgY2FzZSB3aWxsIGJlIHJlLWNyZWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUodFZpZXcsIGxWaWV3LCBub2RlSW5kZXgsIC8qIG1hcmtBc0RldGFjaGVkICovIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2IC8qIFJlbW92ZU5lc3RlZEljdSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VOb2RlSW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAocmVtb3ZlQ29kZXNbayArIDFdKSkgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBuZXN0ZWRJY3VOb2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSBuZXN0ZWRJY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkSWN1VEluZGV4ID0gcmVtb3ZlT3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFRJY3UgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaWN1cykpW25lc3RlZEljdVRJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KG5lc3RlZFRJY3UucmVtb3ZlW2FjdGl2ZUluZGV4XSwgcmVtb3ZlQ29kZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIGNhc2VJbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXNlSW5kZXggPSBnZXRDYXNlSW5kZXgodEljdSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlLmFjdGl2ZUNhc2VJbmRleCA9IGNhc2VJbmRleCAhPT0gLTEgPyBjYXNlSW5kZXggOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXNlSW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGVzIGZvciB0aGUgbmV3IGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZENyZWF0ZU9wQ29kZXMoLTEsIHRJY3UuY3JlYXRlW2Nhc2VJbmRleF0sIHRWaWV3LCBsVmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VDcmVhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogSWN1VXBkYXRlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljdVROb2RlLmFjdGl2ZUNhc2VJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVXBkYXRlT3BDb2Rlcyh0SWN1LnVwZGF0ZVtpY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXhdLCBpY3VzLCBiaW5kaW5nc1N0YXJ0SW5kZXgsIGNoYW5nZU1hc2ssIHRWaWV3LCBsVmlldywgY2FzZUNyZWF0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpICs9IHNraXBDb2RlczsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBtYXJrQXNEZXRhY2hlZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlTm9kZSh0VmlldywgbFZpZXcsIGluZGV4LCBtYXJrQXNEZXRhY2hlZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVtb3ZlZFBoVE5vZGUgPSBnZXRUTm9kZSh0VmlldywgaW5kZXgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVtb3ZlZFBoUk5vZGUgPSBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldyk7CiAgICBpZiAocmVtb3ZlZFBoUk5vZGUpIHsKICAgICAgICBuYXRpdmVSZW1vdmVOb2RlKGxWaWV3W1JFTkRFUkVSXSwgcmVtb3ZlZFBoUk5vZGUpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2xvdFZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxvYWQobFZpZXcsIGluZGV4KSkpOwogICAgaWYgKGlzTENvbnRhaW5lcihzbG90VmFsdWUpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc2xvdFZhbHVlKSk7CiAgICAgICAgaWYgKHJlbW92ZWRQaFROb2RlLnR5cGUgIT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUobFZpZXdbUkVOREVSRVJdLCBsQ29udGFpbmVyW05BVElWRV0pOwogICAgICAgIH0KICAgIH0KICAgIGlmIChtYXJrQXNEZXRhY2hlZCkgewogICAgICAgIC8vIERlZmluZSB0aGlzIG5vZGUgYXMgZGV0YWNoZWQgdG8gYXZvaWQgcHJvamVjdGluZyBpdCBsYXRlcgogICAgICAgIHJlbW92ZWRQaFROb2RlLmZsYWdzIHw9IDY0IC8qIGlzRGV0YWNoZWQgKi87CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlTm9kZSsrOwp9Ci8qKgogKgogKiBVc2UgdGhpcyBpbnN0cnVjdGlvbiB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiBibG9jayB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgcGxhY2Vob2xkZXIuCiAqIEl0IGNhbGxzIGJvdGgge1xAbGluayBpMThuU3RhcnR9IGFuZCB7XEBsaW5rIGkxOG5FbmR9IGluIG9uZSBpbnN0cnVjdGlvbi4KICoKICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBpcyB0aGUgdmFsdWUgd2hpY2ggaXMgbG9jYWxlIHNwZWNpZmljLiBUaGUgdHJhbnNsYXRpb24gc3RyaW5nIG1heQogKiBjb250YWluIHBsYWNlaG9sZGVycyB3aGljaCBhc3NvY2lhdGUgaW5uZXIgZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KICoKICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBwbGFjZWhvbGRlcnMgYXJlOgogKiAtIGDvv717aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpCaW5kaW5nIFBsYWNlaG9sZGVyKjogTWFya3MgYSBsb2NhdGlvbiB3aGVyZSBhbiBleHByZXNzaW9uIHdpbGwgYmUKICogICBpbnRlcnBvbGF0ZWQgaW50by4gVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaW5kZXguIEFuIG9wdGlvbmFsCiAqICAgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAqIC0gYO+/vSN7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8je2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqRWxlbWVudCBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUgYmVnaW5uaW5nCiAqICAgYW5kIGVuZCBvZiBET00gZWxlbWVudCB0aGF0IHdlcmUgZW1iZWRkZWQgaW4gdGhlIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGJsb2NrLiBUaGUgcGxhY2Vob2xkZXIKICogICBgaW5kZXhgIHBvaW50cyB0byB0aGUgZWxlbWVudCBpbmRleCBpbiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb25zIHNldC4gQW4gb3B0aW9uYWwgYGJsb2NrYCB0aGF0CiAqICAgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICogLSBg77+9KntpbmRleH06e2Jsb2Nrfe+/vWAvYO+/vS8qe2luZGV4fTp7YmxvY2t977+9YDogKlN1Yi10ZW1wbGF0ZSBQbGFjZWhvbGRlcio6IFN1Yi10ZW1wbGF0ZXMgbXVzdCBiZQogKiAgIHNwbGl0IHVwIGFuZCB0cmFuc2xhdGVkIHNlcGFyYXRlbHkgaW4gZWFjaCBhbmd1bGFyIHRlbXBsYXRlIGZ1bmN0aW9uLiBUaGUgYGluZGV4YCBwb2ludHMgdG8gdGhlCiAqICAgYHRlbXBsYXRlYCBpbnN0cnVjdGlvbiBpbmRleC4gQSBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggQSB1bmlxdWUgaW5kZXggb2YgdGhlIHRyYW5zbGF0aW9uIGluIHRoZSBzdGF0aWMgYmxvY2suCiAqIEBwYXJhbSB7P30gbWVzc2FnZSBUaGUgdHJhbnNsYXRpb24gbWVzc2FnZS4KICogQHBhcmFtIHs/PX0gc3ViVGVtcGxhdGVJbmRleCBPcHRpb25hbCBzdWItdGVtcGxhdGUgaW5kZXggaW4gdGhlIGBtZXNzYWdlYC4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpMThuKGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KSB7CiAgICDJtcm1aTE4blN0YXJ0KGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgIMm1ybVpMThuRW5kKCk7Cn0KLyoqCiAqIE1hcmtzIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGFzIHRyYW5zbGF0YWJsZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggQSB1bmlxdWUgaW5kZXggaW4gdGhlIHN0YXRpYyBibG9jawogKiBAcGFyYW0gez99IHZhbHVlcwogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWkxOG5BdHRyaWJ1dGVzKGluZGV4LCB2YWx1ZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LCBgdFZpZXcgc2hvdWxkIGJlIGRlZmluZWRgKTsKICAgIGkxOG5BdHRyaWJ1dGVzRmlyc3RQYXNzKGxWaWV3LCB0VmlldywgaW5kZXgsIHZhbHVlcyk7Cn0KLyoqCiAqIFNlZSBgaTE4bkF0dHJpYnV0ZXNgIGFib3ZlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHZhbHVlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaTE4bkF0dHJpYnV0ZXNGaXJzdFBhc3MobFZpZXcsIHRWaWV3LCBpbmRleCwgdmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudEluZGV4ID0gcHJldmlvdXNFbGVtZW50LmluZGV4IC0gSEVBREVSX09GRlNFVDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHVwZGF0ZU9wQ29kZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF0dHJOYW1lID0gdmFsdWVzW2ldOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXNzYWdlID0gdmFsdWVzW2kgKyAxXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFydHMgPSBtZXNzYWdlLnNwbGl0KElDVV9SRUdFWFApOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnRzW2pdOwogICAgICAgICAgICBpZiAoaiAmIDEpIHsKICAgICAgICAgICAgICAgIC8vIE9kZCBpbmRleGVzIGFyZSBJQ1UgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgIC8vIFRPRE8ob2NvbWJlKTogc3VwcG9ydCBJQ1UgZXhwcmVzc2lvbnMgaW4gYXR0cmlidXRlcwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJQ1UgZXhwcmVzc2lvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGF0dHJpYnV0ZXMnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzKQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaGFzQmluZGluZyA9ICEhdmFsdWUubWF0Y2goQklORElOR19SRUdFWFApOwogICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzICYmIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXModmFsdWUsIHByZXZpb3VzRWxlbWVudEluZGV4LCBhdHRyTmFtZSksIHVwZGF0ZU9wQ29kZXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFROb2RlKHRWaWV3LCBwcmV2aW91c0VsZW1lbnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGF0dHJpYnV0ZXMgZm9yIEVsZW1lbnRzIG9ubHksIGZvciBvdGhlciB0eXBlcyAobGlrZSBFbGVtZW50Q29udGFpbmVyKSwKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBpbnB1dHMgYmVsb3cKICAgICAgICAgICAgICAgICAgICBpZiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCB2YWx1ZSwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoYXQgYXR0cmlidXRlIGlzIGEgZGlyZWN0aXZlIGlucHV0CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFWYWx1ZSA9IHROb2RlLmlucHV0cyAhPT0gbnVsbCAmJiB0Tm9kZS5pbnB1dHNbYXR0ck5hbWVdOwogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXRzRm9yUHJvcGVydHkodFZpZXcsIGxWaWV3LCBkYXRhVmFsdWUsIGF0dHJOYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlJbmRleChwcmV2aW91c0VsZW1lbnRJbmRleCwgbFZpZXcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZ1JlZmxlY3RQcm9wZXJ0aWVzKGxWaWV3LCBlbGVtZW50LCB0Tm9kZS50eXBlLCBkYXRhVmFsdWUsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID09PSBudWxsKSB7CiAgICAgICAgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID0gdXBkYXRlT3BDb2RlczsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmxldCBjaGFuZ2VNYXNrID0gMGIwOwovKiogQHR5cGUgez99ICovCmxldCBzaGlmdHNDb3VudGVyID0gMDsKLyoqCiAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBiaW5kaW5ncyBkdXJpbmcgZWFjaCB1cGRhdGUgY3ljbGUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8KICogdXBkYXRlIHRoZSB0cmFuc2xhdGVkIG5vZGVzLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgYmluZGluZydzIHZhbHVlCiAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogKiAoZS5nLiBgaTE4bkV4cChjdHgubmFtZSkoY3R4LnRpdGxlKWApCiAqCiAqLwpmdW5jdGlvbiDJtcm1aTE4bkV4cCh2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgaWYgKGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBuZXh0QmluZGluZ0luZGV4KCksIHZhbHVlKSkgewogICAgICAgIGNoYW5nZU1hc2sgPSBjaGFuZ2VNYXNrIHwgKDEgPDwgc2hpZnRzQ291bnRlcik7CiAgICB9CiAgICBzaGlmdHNDb3VudGVyKys7CiAgICByZXR1cm4gybXJtWkxOG5FeHA7Cn0KLyoqCiAqIFVwZGF0ZXMgYSB0cmFuc2xhdGlvbiBibG9jayBvciBhbiBpMThuIGF0dHJpYnV0ZSB3aGVuIHRoZSBiaW5kaW5ncyBoYXZlIGNoYW5nZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIGVpdGhlciB7XEBsaW5rIGkxOG5TdGFydH0gKHRyYW5zbGF0aW9uIGJsb2NrKSBvciB7XEBsaW5rIGkxOG5BdHRyaWJ1dGVzfQogKiAoaTE4biBhdHRyaWJ1dGUpIG9uIHdoaWNoIGl0IHNob3VsZCB1cGRhdGUgdGhlIGNvbnRlbnQuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1aTE4bkFwcGx5KGluZGV4KSB7CiAgICBpZiAoc2hpZnRzQ291bnRlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIGB0VmlldyBzaG91bGQgYmUgZGVmaW5lZGApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0STE4biA9IHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHVwZGF0ZU9wQ29kZXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpY3VzID0gbnVsbDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0STE4bikpIHsKICAgICAgICAgICAgdXBkYXRlT3BDb2RlcyA9ICgvKiogQHR5cGUgez99ICovICh0STE4bikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdXBkYXRlT3BDb2RlcyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodEkxOG4pKSkudXBkYXRlOwogICAgICAgICAgICBpY3VzID0gKCgvKiogQHR5cGUgez99ICovICh0STE4bikpKS5pY3VzOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ3NTdGFydEluZGV4ID0gZ2V0QmluZGluZ0luZGV4KCkgLSBzaGlmdHNDb3VudGVyIC0gMTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIHJlYWRVcGRhdGVPcENvZGVzKHVwZGF0ZU9wQ29kZXMsIGljdXMsIGJpbmRpbmdzU3RhcnRJbmRleCwgY2hhbmdlTWFzaywgdFZpZXcsIGxWaWV3KTsKICAgICAgICAvLyBSZXNldCBjaGFuZ2VNYXNrICYgbWFza0JpdCB0byBkZWZhdWx0IGZvciB0aGUgbmV4dCB1cGRhdGUgY3ljbGUKICAgICAgICBjaGFuZ2VNYXNrID0gMGIwOwogICAgICAgIHNoaWZ0c0NvdW50ZXIgPSAwOwogICAgfQp9Ci8qKgogKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjYXNlIG9mIGFuIElDVSBleHByZXNzaW9uIGRlcGVuZGluZyBvbiB0aGUgbWFpbiBiaW5kaW5nIHZhbHVlCiAqCiAqIEBwYXJhbSB7P30gaWN1RXhwcmVzc2lvbgogKiBAcGFyYW0gez99IGJpbmRpbmdWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG1haW4gYmluZGluZyB1c2VkIGJ5IHRoaXMgSUNVIGV4cHJlc3Npb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENhc2VJbmRleChpY3VFeHByZXNzaW9uLCBiaW5kaW5nVmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmRleCA9IGljdUV4cHJlc3Npb24uY2FzZXMuaW5kZXhPZihiaW5kaW5nVmFsdWUpOwogICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgIHN3aXRjaCAoaWN1RXhwcmVzc2lvbi50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgMSAvKiBwbHVyYWwgKi86IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FzZSA9IGdldFBsdXJhbENhc2UoYmluZGluZ1ZhbHVlLCBnZXRMb2NhbGVJZCgpKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKHJlc29sdmVkQ2FzZSk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xICYmIHJlc29sdmVkQ2FzZSAhPT0gJ290aGVyJykgewogICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKCdvdGhlcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAwIC8qIHNlbGVjdCAqLzogewogICAgICAgICAgICAgICAgaW5kZXggPSBpY3VFeHByZXNzaW9uLmNhc2VzLmluZGV4T2YoJ290aGVyJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbmRleDsKfQovKioKICogR2VuZXJhdGUgdGhlIE9wQ29kZXMgZm9yIElDVSBleHByZXNzaW9ucy4KICoKICogQHBhcmFtIHs/fSB0SWN1cwogKiBAcGFyYW0gez99IGljdUV4cHJlc3Npb24KICogQHBhcmFtIHs/fSBzdGFydEluZGV4CiAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGljdVN0YXJ0KHRJY3VzLCBpY3VFeHByZXNzaW9uLCBzdGFydEluZGV4LCBleHBhbmRvU3RhcnRJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3JlYXRlQ29kZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbW92ZUNvZGVzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1cGRhdGVDb2RlcyA9IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdmFycyA9IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2hpbGRJY3VzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljdUV4cHJlc3Npb24udmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gRWFjaCB2YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzICYgb3RoZXIgSUNVIGV4cHJlc3Npb25zCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlQXJyID0gaWN1RXhwcmVzc2lvbi52YWx1ZXNbaV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5lc3RlZEljdXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlQXJyLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUFycltqXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vIEl0IGlzIGFuIG5lc3RlZCBJQ1UgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaWN1SW5kZXggPSBuZXN0ZWRJY3VzLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpIC0gMTsKICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgbmVzdGVkIElDVSBleHByZXNzaW9uIGJ5IGEgY29tbWVudCBub2RlCiAgICAgICAgICAgICAgICB2YWx1ZUFycltqXSA9IGA8IS0t77+9JHtpY3VJbmRleH3vv70tLT5gOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpY3VDYXNlID0gcGFyc2VJY3VDYXNlKHZhbHVlQXJyLmpvaW4oJycpLCBzdGFydEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpOwogICAgICAgIGNyZWF0ZUNvZGVzLnB1c2goaWN1Q2FzZS5jcmVhdGUpOwogICAgICAgIHJlbW92ZUNvZGVzLnB1c2goaWN1Q2FzZS5yZW1vdmUpOwogICAgICAgIHVwZGF0ZUNvZGVzLnB1c2goaWN1Q2FzZS51cGRhdGUpOwogICAgICAgIHZhcnMucHVzaChpY3VDYXNlLnZhcnMpOwogICAgICAgIGNoaWxkSWN1cy5wdXNoKGljdUNhc2UuY2hpbGRJY3VzKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRJY3UgPSB7CiAgICAgICAgdHlwZTogaWN1RXhwcmVzc2lvbi50eXBlLAogICAgICAgIHZhcnMsCiAgICAgICAgY2hpbGRJY3VzLAogICAgICAgIGNhc2VzOiBpY3VFeHByZXNzaW9uLmNhc2VzLAogICAgICAgIGNyZWF0ZTogY3JlYXRlQ29kZXMsCiAgICAgICAgcmVtb3ZlOiByZW1vdmVDb2RlcywKICAgICAgICB1cGRhdGU6IHVwZGF0ZUNvZGVzCiAgICB9OwogICAgdEljdXMucHVzaCh0SWN1KTsKICAgIC8vIEFkZGluZyB0aGUgbWF4aW11bSBwb3NzaWJsZSBvZiB2YXJzIG5lZWRlZCAoYmFzZWQgb24gdGhlIGNhc2VzIHdpdGggdGhlIG1vc3QgdmFycykKICAgIGkxOG5WYXJzQ291bnQgKz0gTWF0aC5tYXgoLi4udmFycyk7Cn0KLyoqCiAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgdGVtcGxhdGUgaW50byBhbiBIVE1MIHRlbXBsYXRlIGFuZCBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgdG8gdXBkYXRlCiAqIGF0dHJpYnV0ZXMgb3Igbm9kZXMgdGhhdCBjb250YWluIGJpbmRpbmdzLgogKgogKiBAcGFyYW0gez99IHVuc2FmZUh0bWwgVGhlIHN0cmluZyB0byBwYXJzZQogKiBAcGFyYW0gez99IHBhcmVudEluZGV4CiAqIEBwYXJhbSB7P30gbmVzdGVkSWN1cwogKiBAcGFyYW0gez99IHRJY3VzCiAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlSWN1Q2FzZSh1bnNhZmVIdG1sLCBwYXJlbnRJbmRleCwgbmVzdGVkSWN1cywgdEljdXMsIGV4cGFuZG9TdGFydEluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmVydEJvZHlIZWxwZXIgPSBuZXcgSW5lcnRCb2R5SGVscGVyKGdldERvY3VtZW50KCkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpOwogICAgaWYgKCFpbmVydEJvZHlFbGVtZW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2VuZXJhdGUgaW5lcnQgYm9keSBlbGVtZW50Jyk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB3cmFwcGVyID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFRlbXBsYXRlQ29udGVudCgoLyoqIEB0eXBlIHs/fSAqLyAoaW5lcnRCb2R5RWxlbWVudCkpKSkpIHx8IGluZXJ0Qm9keUVsZW1lbnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvcENvZGVzID0geyB2YXJzOiAwLCBjaGlsZEljdXM6IFtdLCBjcmVhdGU6IFtdLCByZW1vdmU6IFtdLCB1cGRhdGU6IFtdIH07CiAgICBwYXJzZU5vZGVzKHdyYXBwZXIuZmlyc3RDaGlsZCwgb3BDb2RlcywgcGFyZW50SW5kZXgsIG5lc3RlZEljdXMsIHRJY3VzLCBleHBhbmRvU3RhcnRJbmRleCk7CiAgICByZXR1cm4gb3BDb2RlczsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IE5FU1RFRF9JQ1UgPSAv77+9KFxkKynvv70vOwovKioKICogUGFyc2VzIGEgbm9kZSwgaXRzIGNoaWxkcmVuIGFuZCBpdHMgc2libGluZ3MsIGFuZCBnZW5lcmF0ZXMgdGhlIG11dGF0ZSAmIHVwZGF0ZSBPcENvZGVzLgogKgogKiBAcGFyYW0gez99IGN1cnJlbnROb2RlIFRoZSBmaXJzdCBub2RlIHRvIHBhcnNlCiAqIEBwYXJhbSB7P30gaWN1Q2FzZSBUaGUgZGF0YSBmb3IgdGhlIElDVSBleHByZXNzaW9uIGNhc2UgdGhhdCBjb250YWlucyB0aG9zZSBub2RlcwogKiBAcGFyYW0gez99IHBhcmVudEluZGV4IEluZGV4IG9mIHRoZSBjdXJyZW50IG5vZGUncyBwYXJlbnQKICogQHBhcmFtIHs/fSBuZXN0ZWRJY3VzIERhdGEgZm9yIHRoZSBuZXN0ZWQgSUNVIGV4cHJlc3Npb25zIHRoYXQgdGhpcyBjYXNlIGNvbnRhaW5zCiAqIEBwYXJhbSB7P30gdEljdXMgRGF0YSBmb3IgYWxsIElDVSBleHByZXNzaW9ucyBvZiB0aGUgY3VycmVudCBtZXNzYWdlCiAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXggRXhwYW5kbyBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgSUNVIGV4cHJlc3Npb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlTm9kZXMoY3VycmVudE5vZGUsIGljdUNhc2UsIHBhcmVudEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpIHsKICAgIGlmIChjdXJyZW50Tm9kZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXN0ZWRJY3VzVG9DcmVhdGUgPSBbXTsKICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gZXhwYW5kb1N0YXJ0SW5kZXggKyArK2ljdUNhc2UudmFyczsKICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5ub2RlVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50Tm9kZSkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IGEgdmFsaWQgZWxlbWVudCwgd2Ugd29uJ3QgY3JlYXRlIGFuIGVsZW1lbnQgZm9yIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIGljdUNhc2UudmFycy0tOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChFTEVNRU5UX01BUktFUiwgdGFnTmFtZSwgbmV3SW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsQXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxBdHRycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9ICgvKiogQHR5cGUgez99ICovIChlbEF0dHJzLml0ZW0oaSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQXR0ck5hbWUgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSAhIWF0dHIudmFsdWUubWF0Y2goQklORElOR19SRUdFWFApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBpbnB1dCBzdHJpbmcgaXMgc2FmZSwgdW5sZXNzIGl0J3MgdXNpbmcgYSBiaW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmluZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQUxJRF9BVFRSUy5oYXNPd25Qcm9wZXJ0eShsb3dlckF0dHJOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVJJX0FUVFJTW2xvd2VyQXR0ck5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXMoYXR0ci52YWx1ZSwgbmV3SW5kZXgsIGF0dHIubmFtZSwgX3Nhbml0aXplVXJsKSwgaWN1Q2FzZS51cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlckF0dHJOYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUsIHNhbml0aXplU3Jjc2V0KSwgaWN1Q2FzZS51cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUpLCBpY3VDYXNlLnVwZGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBpZ25vcmluZyB1bnNhZmUgYXR0cmlidXRlIHZhbHVlICR7bG93ZXJBdHRyTmFtZX0gb24gZWxlbWVudCAke3RhZ05hbWV9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdUNhc2UuY3JlYXRlLnB1c2gobmV3SW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCA0IC8qIEF0dHIgKi8sIGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSAoaWYgYW55KQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5vZGVzKGN1cnJlbnROb2RlLmZpcnN0Q2hpbGQsIGljdUNhc2UsIG5ld0luZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCBub2RlIGFmdGVyIHRoZSBjaGlsZHJlbgogICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLnJlbW92ZS5wdXNoKG5ld0luZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgMyAvKiBSZW1vdmUgKi8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSB2YWx1ZS5tYXRjaChCSU5ESU5HX1JFR0VYUCk7CiAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChoYXNCaW5kaW5nID8gJycgOiB2YWx1ZSwgbmV3SW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgIGljdUNhc2UucmVtb3ZlLnB1c2gobmV3SW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIFJlbW92ZSAqLyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKHZhbHVlLCBuZXdJbmRleCksIGljdUNhc2UudXBkYXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21tZW50IG5vZGUgaXMgYSBwbGFjZWhvbGRlciBmb3IgYSBuZXN0ZWQgSUNVCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gTkVTVEVEX0lDVS5leGVjKGN1cnJlbnROb2RlLnRleHRDb250ZW50IHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VJbmRleCA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3TG9jYWwgPSBuZ0Rldk1vZGUgPyBgbmVzdGVkIElDVSAke25lc3RlZEljdUluZGV4fWAgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tZW50IG5vZGUgdGhhdCB3aWxsIGFuY2hvciB0aGUgSUNVIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChDT01NRU5UX01BUktFUiwgbmV3TG9jYWwsIG5ld0luZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3UgPSBuZXN0ZWRJY3VzW25lc3RlZEljdUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkSWN1c1RvQ3JlYXRlLnB1c2goW25lc3RlZEljdSwgbmV3SW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIHR5cGUgb2YgY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLnZhcnMtLTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIHR5cGUgb2YgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGljdUNhc2UudmFycy0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKG5leHROb2RlKSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVzdGVkSWN1c1RvQ3JlYXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmVzdGVkSWN1ID0gbmVzdGVkSWN1c1RvQ3JlYXRlW2ldWzBdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdU5vZGVJbmRleCA9IG5lc3RlZEljdXNUb0NyZWF0ZVtpXVsxXTsKICAgICAgICAgICAgaWN1U3RhcnQodEljdXMsIG5lc3RlZEljdSwgbmVzdGVkSWN1Tm9kZUluZGV4LCBleHBhbmRvU3RhcnRJbmRleCArIGljdUNhc2UudmFycyk7CiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgcmVjdXJzaXZlLCB0aGUgbGFzdCBUSWN1IHRoYXQgd2FzIHB1c2hlZCBpcyB0aGUgb25lIHdlIHdhbnQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXN0VEljdUluZGV4ID0gdEljdXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgaWN1Q2FzZS52YXJzICs9IE1hdGgubWF4KC4uLnRJY3VzW25lc3RUSWN1SW5kZXhdLnZhcnMpOwogICAgICAgICAgICBpY3VDYXNlLmNoaWxkSWN1cy5wdXNoKG5lc3RUSWN1SW5kZXgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBnZXRCaW5kaW5nTWFzayhuZXN0ZWRJY3UpOwogICAgICAgICAgICBpY3VDYXNlLnVwZGF0ZS5wdXNoKHRvTWFza0JpdChuZXN0ZWRJY3UubWFpbkJpbmRpbmcpLCAvLyBtYXNrIG9mIHRoZSBtYWluIGJpbmRpbmcKICAgICAgICAgICAgMywgLy8gc2tpcCAzIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgLTEgLSBuZXN0ZWRJY3UubWFpbkJpbmRpbmcsIG5lc3RlZEljdU5vZGVJbmRleCA8PCAyIC8qIFNISUZUX1JFRiAqLyB8IDIgLyogSWN1U3dpdGNoICovLCBuZXN0VEljdUluZGV4LCBtYXNrLCAvLyBtYXNrIG9mIGFsbCB0aGUgYmluZGluZ3Mgb2YgdGhpcyBJQ1UgZXhwcmVzc2lvbgogICAgICAgICAgICAyLCAvLyBza2lwIDIgb3BDb2RlcyBpZiBub3QgY2hhbmdlZAogICAgICAgICAgICBuZXN0ZWRJY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIEljdVVwZGF0ZSAqLywgbmVzdFRJY3VJbmRleCk7CiAgICAgICAgICAgIGljdUNhc2UucmVtb3ZlLnB1c2gobmVzdFRJY3VJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDYgLyogUmVtb3ZlTmVzdGVkSWN1ICovLCBuZXN0ZWRJY3VOb2RlSW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIFJlbW92ZSAqLyk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBBbmd1bGFyIERhcnQgaW50cm9kdWNlZCAmbmdzcDsgYXMgYSBwbGFjZWhvbGRlciBmb3Igbm9uLXJlbW92YWJsZSBzcGFjZSwgc2VlOgogKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2FuZ3VsYXIvYmxvYi8wYmI2MTEzODdkMjlkNjViNWFmN2Y5ZDI1MTVhYjU3MWZkM2ZiZWU0L190ZXN0cy90ZXN0L2NvbXBpbGVyL3ByZXNlcnZlX3doaXRlc3BhY2VfdGVzdC5kYXJ0I0wyNS1MMzIKICogSW4gQW5ndWxhciBEYXJ0ICZuZ3NwOyBpcyBjb252ZXJ0ZWQgdG8gdGhlIDB4RTUwMCBQVUEgKFByaXZhdGUgVXNlIEFyZWFzKSB1bmljb2RlIGNoYXJhY3RlcgogKiBhbmQgbGF0ZXIgb24gcmVwbGFjZWQgYnkgYSBzcGFjZS4gV2UgYXJlIHJlLWltcGxlbWVudGluZyB0aGUgc2FtZSBpZGVhIGhlcmUsIHNpbmNlIHRyYW5zbGF0aW9ucwogKiBtaWdodCBjb250YWluIHRoaXMgc3BlY2lhbCBjaGFyYWN0ZXIuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTkdTUF9VTklDT0RFX1JFR0VYUCA9IC9cdUU1MDAvZzsKLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlcGxhY2VOZ3NwKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShOR1NQX1VOSUNPREVfUkVHRVhQLCAnICcpOwp9Ci8qKgogKiBUaGUgbG9jYWxlIGlkIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSB1c2luZyAoZm9yIHRyYW5zbGF0aW9ucyBhbmQgSUNVIGV4cHJlc3Npb25zKS4KICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuCiAqIEB0eXBlIHs/fQogKi8KbGV0IExPQ0FMRV9JRCA9IERFRkFVTFRfTE9DQUxFX0lEOwovKioKICogU2V0cyB0aGUgbG9jYWxlIGlkIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMgYW5kIElDVSBleHByZXNzaW9ucy4KICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbG9jYWxlSWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldExvY2FsZUlkKGxvY2FsZUlkKSB7CiAgICBhc3NlcnREZWZpbmVkKGxvY2FsZUlkLCBgRXhwZWN0ZWQgbG9jYWxlSWQgdG8gYmUgZGVmaW5lZGApOwogICAgaWYgKHR5cGVvZiBsb2NhbGVJZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICBMT0NBTEVfSUQgPSBsb2NhbGVJZC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgJy0nKTsKICAgIH0KfQovKioKICogR2V0cyB0aGUgbG9jYWxlIGlkIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMgYW5kIElDVSBleHByZXNzaW9ucy4KICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVJZCgpIHsKICAgIHJldHVybiBMT0NBTEVfSUQ7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeV9yZWdpc3RyYXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIE1hcCBvZiBtb2R1bGUtaWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmdNb2R1bGUuCiAqIC0gSW4gcHJlIEl2eSB3ZSB0cmFjayBOZ01vZHVsZUZhY3RvcnksCiAqIC0gSW4gcG9zdCBJdnkgd2UgdHJhY2sgdGhlIE5nTW9kdWxlVHlwZQogKiBAdHlwZSB7P30KICovCmNvbnN0IG1vZHVsZXMgPSBuZXcgTWFwKCk7Ci8qKgogKiBAcGFyYW0gez99IGlkCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IGluY29taW5nCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRTYW1lT3JOb3RFeGlzdGluZyhpZCwgdHlwZSwgaW5jb21pbmcpIHsKICAgIGlmICh0eXBlICYmIHR5cGUgIT09IGluY29taW5nKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgbW9kdWxlIHJlZ2lzdGVyZWQgZm9yICR7aWR9IC0gJHtzdHJpbmdpZnkodHlwZSl9IHZzICR7c3RyaW5naWZ5KHR5cGUubmFtZSl9YCk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbmdNb2R1bGVUeXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWdpc3Rlck5nTW9kdWxlVHlwZShuZ01vZHVsZVR5cGUpIHsKICAgIGlmIChuZ01vZHVsZVR5cGUuybVtb2QuaWQgIT09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaWQgPSBuZ01vZHVsZVR5cGUuybVtb2QuaWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZXMuZ2V0KGlkKSkpOwogICAgICAgIGFzc2VydFNhbWVPck5vdEV4aXN0aW5nKGlkLCBleGlzdGluZywgbmdNb2R1bGVUeXBlKTsKICAgICAgICBtb2R1bGVzLnNldChpZCwgbmdNb2R1bGVUeXBlKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbXBvcnRzID0gbmdNb2R1bGVUeXBlLsm1bW9kLmltcG9ydHM7CiAgICBpZiAoaW1wb3J0cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgaW1wb3J0cyA9IGltcG9ydHMoKTsKICAgIH0KICAgIGlmIChpbXBvcnRzKSB7CiAgICAgICAgaW1wb3J0cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGkgPT4gcmVnaXN0ZXJOZ01vZHVsZVR5cGUoKC8qKiBAdHlwZSB7P30gKi8gKGkpKSkpKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIE5nTW9kdWxlUmVmJDEgZXh0ZW5kcyBOZ01vZHVsZVJlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVUeXBlCiAgICAgKiBAcGFyYW0gez99IF9wYXJlbnQKICAgICAqLwogICAgY29uc3RydWN0b3IobmdNb2R1bGVUeXBlLCBfcGFyZW50KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50OwogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgIHRoaXMuX2Jvb3RzdHJhcENvbXBvbmVudHMgPSBbXTsKICAgICAgICB0aGlzLmluamVjdG9yID0gdGhpczsKICAgICAgICB0aGlzLmRlc3Ryb3lDYnMgPSBbXTsKICAgICAgICAvLyBXaGVuIGJvb3RzdHJhcHBpbmcgYSBtb2R1bGUgd2UgaGF2ZSBhIGRlcGVuZGVuY3kgZ3JhcGggdGhhdCBsb29rcyBsaWtlIHRoaXM6CiAgICAgICAgLy8gQXBwbGljYXRpb25SZWYgLT4gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIC0+IE5nTW9kdWxlUmVmLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoZQogICAgICAgIC8vIG1vZHVsZSBiZWluZyByZXNvbHZlZCB0cmllcyB0byBpbmplY3QgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgaXQnbGwgY3JlYXRlIGEKICAgICAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgcnVudGltZSBlcnJvciwgYmVjYXVzZSB0aGUgaW5qZWN0b3IgZG9lc24ndAogICAgICAgIC8vIGV4aXN0IHlldC4gV2Ugd29yayBhcm91bmQgdGhlIGlzc3VlIGJ5IGNyZWF0aW5nIHRoZSBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgb3Vyc2VsdmVzCiAgICAgICAgLy8gYW5kIHByb3ZpZGluZyBpdCwgcmF0aGVyIHRoYW4gbGV0dGluZyB0aGUgaW5qZWN0b3IgcmVzb2x2ZSBpdC4KICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IG5ldyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIkMSh0aGlzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZihuZ01vZHVsZVR5cGUpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnREZWZpbmVkKG5nTW9kdWxlRGVmLCBgTmdNb2R1bGUgJyR7c3RyaW5naWZ5KG5nTW9kdWxlVHlwZSl9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICdOZ01vZHVsZVR5cGUnLmApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZ0xvY2FsZUlkRGVmID0gZ2V0TmdMb2NhbGVJZERlZihuZ01vZHVsZVR5cGUpOwogICAgICAgIG5nTG9jYWxlSWREZWYgJiYgc2V0TG9jYWxlSWQobmdMb2NhbGVJZERlZik7CiAgICAgICAgdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cyA9IG1heWJlVW53cmFwRm4oKC8qKiBAdHlwZSB7P30gKi8gKG5nTW9kdWxlRGVmKSkuYm9vdHN0cmFwKTsKICAgICAgICB0aGlzLl9yM0luamVjdG9yID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZUluamVjdG9yV2l0aG91dEluamVjdG9ySW5zdGFuY2VzKG5nTW9kdWxlVHlwZSwgX3BhcmVudCwgWwogICAgICAgICAgICB7IHByb3ZpZGU6IE5nTW9kdWxlUmVmLCB1c2VWYWx1ZTogdGhpcyB9LCB7CiAgICAgICAgICAgICAgICBwcm92aWRlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsCiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAgICAgICAgfQogICAgICAgIF0sIHN0cmluZ2lmeShuZ01vZHVsZVR5cGUpKSkpOwogICAgICAgIC8vIFdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgaW5qZWN0b3IgdHlwZXMgc2VwYXJhdGVseSBmcm9tIHRoZSBpbmplY3RvciBjcmVhdGlvbiwgYmVjYXVzZQogICAgICAgIC8vIHRoZSBtb2R1bGUgbWlnaHQgYmUgdHJ5aW5nIHRvIHVzZSB0aGlzIHJlZiBpbiBpdHMgY29udHJ1Y3RvciBmb3IgREkgd2hpY2ggd2lsbCBjYXVzZSBhCiAgICAgICAgLy8gY2lyY3VsYXIgZXJyb3IgdGhhdCB3aWxsIGV2ZW50dWFsbHkgZXJyb3Igb3V0LCBiZWNhdXNlIHRoZSBpbmplY3RvciBpc24ndCBjcmVhdGVkIHlldC4KICAgICAgICB0aGlzLl9yM0luamVjdG9yLl9yZXNvbHZlSW5qZWN0b3JEZWZUeXBlcygpOwogICAgICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLmdldChuZ01vZHVsZVR5cGUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcGFyYW0gez89fSBpbmplY3RGbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlID0gSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5ELCBpbmplY3RGbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQpIHsKICAgICAgICBpZiAodG9rZW4gPT09IEluamVjdG9yIHx8IHRva2VuID09PSBOZ01vZHVsZVJlZiB8fCB0b2tlbiA9PT0gSU5KRUNUT1IpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9yM0luamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgaW5qZWN0RmxhZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5fcjNJbmplY3RvcjsKICAgICAgICAhaW5qZWN0b3IuZGVzdHJveWVkICYmIGluamVjdG9yLmRlc3Ryb3koKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5kZXN0cm95Q2JzKSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgIHRoaXMuZGVzdHJveUNicyA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVzdHJveUNicykpLnB1c2goY2FsbGJhY2spOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgTmdNb2R1bGVGYWN0b3J5JDEgZXh0ZW5kcyBOZ01vZHVsZUZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqLwogICAgY29uc3RydWN0b3IobW9kdWxlVHlwZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZihtb2R1bGVUeXBlKTsKICAgICAgICBpZiAobmdNb2R1bGVEZWYgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIE5nTW9kdWxlIHdpdGggQW5ndWxhcidzIG1vZHVsZSByZWdpc3RyeS4gVGhlIGxvY2F0aW9uIChhbmQgaGVuY2UgdGltaW5nKSBvZgogICAgICAgICAgICAvLyB0aGlzIGNhbGwgaXMgY3JpdGljYWwgdG8gZW5zdXJlIHRoaXMgd29ya3MgY29ycmVjdGx5IChtb2R1bGVzIGdldCByZWdpc3RlcmVkIHdoZW4gZXhwZWN0ZWQpCiAgICAgICAgICAgIC8vIHdpdGhvdXQgYmxvYXRpbmcgYnVuZGxlcyAobW9kdWxlcyBhcmUgcmVnaXN0ZXJlZCB3aGVuIG90aGVyd2lzZSBub3QgcmVmZXJlbmNlZCkuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEluIFZpZXcgRW5naW5lLCByZWdpc3RyYXRpb24gb2NjdXJzIGluIHRoZSAubmdmYWN0b3J5LmpzIGZpbGUgYXMgYSBzaWRlIGVmZmVjdC4gVGhpcyBoYXMKICAgICAgICAgICAgLy8gc2V2ZXJhbCBwcmFjdGljYWwgY29uc2VxdWVuY2VzOgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAtIElmIGFuIC5uZ2ZhY3RvcnkgZmlsZSBpcyBub3QgaW1wb3J0ZWQgZnJvbSwgdGhlIG1vZHVsZSB3b24ndCBiZSByZWdpc3RlcmVkIChhbmQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgdHJlZSBzaGFrZW4pLgogICAgICAgICAgICAvLyAtIElmIGFuIC5uZ2ZhY3RvcnkgZmlsZSBpcyBpbXBvcnRlZCBmcm9tLCB0aGUgbW9kdWxlIHdpbGwgYmUgcmVnaXN0ZXJlZCBldmVuIGlmIGFuIGluc3RhbmNlCiAgICAgICAgICAgIC8vICAgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQgKHZpYSBgY3JlYXRlYCBiZWxvdykuCiAgICAgICAgICAgIC8vIC0gU2luY2UgYW4gLm5nZmFjdG9yeSBmaWxlIGluIFZpZXcgRW5naW5lIHJlZmVyZW5jZXMgdGhlIC5uZ2ZhY3RvcnkgZmlsZXMgb2YgdGhlIE5nTW9kdWxlJ3MKICAgICAgICAgICAgLy8gICBpbXBvcnRzLAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBJbiBJdnksIHRoaW5ncyBhcmUgYSBiaXQgZGlmZmVyZW50LiAubmdmYWN0b3J5IGZpbGVzIHN0aWxsIGV4aXN0IGZvciBjb21wYXRpYmlsaXR5LCBidXQgYXJlCiAgICAgICAgICAgIC8vIG5vdCBhIHJlcXVpcmVkIEFQSSB0byB1c2UgLSB0aGVyZSBhcmUgb3RoZXIgd2F5cyB0byBvYnRhaW4gYW4gTmdNb2R1bGVGYWN0b3J5IGZvciBhIGdpdmVuCiAgICAgICAgICAgIC8vIE5nTW9kdWxlLiBUaHVzLCByZWx5aW5nIG9uIGEgc2lkZSBlZmZlY3QgaW4gdGhlIC5uZ2ZhY3RvcnkgZmlsZSBpcyBub3Qgc3VmZmljaWVudC4gSW5zdGVhZCwKICAgICAgICAgICAgLy8gdGhlIHNpZGUgZWZmZWN0IG9mIHJlZ2lzdHJhdGlvbiBpcyBhZGRlZCBoZXJlLCBpbiB0aGUgY29uc3RydWN0b3Igb2YgTmdNb2R1bGVGYWN0b3J5LAogICAgICAgICAgICAvLyBlbnN1cmluZyBubyBtYXR0ZXIgaG93IGEgZmFjdG9yeSBpcyBjcmVhdGVkLCB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQgY29ycmVjdGx5LgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBpbmNsdWRlIHRoZSByZWdpc3RyYXRpb24gc2lkZSBlZmZlY3QgaW5saW5lIGZvbGxvd2luZyB0aGUgYWN0dWFsCiAgICAgICAgICAgIC8vIE5nTW9kdWxlIGRlZmluaXRpb24uIFRoaXMgYWxzbyBoYXMgdGhlIGNvcnJlY3QgdGltaW5nLCBidXQgYnJlYWtzIHRyZWUtc2hha2luZyAtIG1vZHVsZXMKICAgICAgICAgICAgLy8gd2lsbCBiZSByZWdpc3RlcmVkIGFuZCByZXRhaW5lZCBldmVuIGlmIHRoZXkncmUgb3RoZXJ3aXNlIG5ldmVyIHJlZmVyZW5jZWQuCiAgICAgICAgICAgIHJlZ2lzdGVyTmdNb2R1bGVUeXBlKCgvKiogQHR5cGUgez99ICovIChtb2R1bGVUeXBlKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwYXJlbnRJbmplY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlKHBhcmVudEluamVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOZ01vZHVsZVJlZiQxKHRoaXMubW9kdWxlVHlwZSwgcGFyZW50SW5qZWN0b3IpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3B1cmVfZnVuY3Rpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEJpbmRpbmdzIGZvciBwdXJlIGZ1bmN0aW9ucyBhcmUgc3RvcmVkIGFmdGVyIHJlZ3VsYXIgYmluZGluZ3MuCiAqCiAqIHwtLS0tLS0tZGVjbHMtLS0tLS18LS0tLS0tLS0tdmFycy0tLS0tLS0tLXwgICAgICAgICAgICAgICAgIHwtLS0tLSBob3N0VmFycyAoZGlyMSkgLS0tLS0tfAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogfCBub2Rlcy9yZWZzL3BpcGVzIHwgYmluZGluZ3MgfCBmbiBzbG90cyAgfCBpbmplY3RvciB8IGRpcjEgfCBob3N0IGJpbmRpbmdzIHwgaG9zdCBzbG90cyB8CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeCiAqICAgICAgVFZpZXcuYmluZGluZ1N0YXJ0SW5kZXggICAgICBUVmlldy5leHBhbmRvU3RhcnRJbmRleAogKgogKiBQdXJlIGZ1bmN0aW9uIGluc3RydWN0aW9ucyBhcmUgZ2l2ZW4gYW4gb2Zmc2V0IGZyb20gdGhlIGJpbmRpbmcgcm9vdC4gQWRkaW5nIHRoZSBvZmZzZXQgdG8gdGhlCiAqIGJpbmRpbmcgcm9vdCBnaXZlcyB0aGUgZmlyc3QgaW5kZXggd2hlcmUgdGhlIGJpbmRpbmdzIGFyZSBzdG9yZWQuIEluIGNvbXBvbmVudCB2aWV3cywgdGhlIGJpbmRpbmcKICogcm9vdCBpcyB0aGUgYmluZGluZ1N0YXJ0SW5kZXguIEluIGhvc3QgYmluZGluZ3MsIHRoZSBiaW5kaW5nIHJvb3QgaXMgdGhlIGV4cGFuZG9TdGFydEluZGV4ICsKICogYW55IGRpcmVjdGl2ZSBpbnN0YW5jZXMgKyBhbnkgaG9zdFZhcnMgaW4gZGlyZWN0aXZlcyBldmFsdWF0ZWQgYmVmb3JlIGl0LgogKgogKiBTZWUgVklFV19EQVRBLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvc3QgYmluZGluZyByZXNvbHV0aW9uLgogKi8KLyoqCiAqIElmIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBzYXZlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gc3RvcmUgYW5kIHJldHVybiB0aGUKICogdmFsdWUuIElmIGl0IGhhcyBiZWVuIHNhdmVkLCByZXR1cm5zIHRoZSBzYXZlZCB2YWx1ZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAqIEBwYXJhbSB7P30gcHVyZUZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlCiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSB2YWx1ZQogKgogKi8KZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjAoc2xvdE9mZnNldCwgcHVyZUZuLCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdID09PSBOT19DSEFOR0UgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcpIDogcHVyZUZuKCkpIDoKICAgICAgICBnZXRCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXgpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4gRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIHVwZGF0ZWQgdmFsdWUKICogQHBhcmFtIHs/fSBleHAgVXBkYXRlZCBleHByZXNzaW9uIHZhbHVlCiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKgogKi8KZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjEoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpIHsKICAgIHJldHVybiBwdXJlRnVuY3Rpb24xSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb24yKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgdGhpc0FyZykgewogICAgcmV0dXJuIHB1cmVGdW5jdGlvbjJJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIHRoaXNBcmcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/PX0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuCiAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAqCiAqLwpmdW5jdGlvbiDJtcm1cHVyZUZ1bmN0aW9uMyhzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIHRoaXNBcmcpIHsKICAgIHJldHVybiBwdXJlRnVuY3Rpb24zSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKTsKfQovKioKICogSWYgdGhlIHZhbHVlIG9mIGFueSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAqIEBwYXJhbSB7P30gcHVyZUZuCiAqIEBwYXJhbSB7P30gZXhwMQogKiBAcGFyYW0gez99IGV4cDIKICogQHBhcmFtIHs/fSBleHAzCiAqIEBwYXJhbSB7P30gZXhwNAogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb240KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgdGhpc0FyZykgewogICAgcmV0dXJuIHB1cmVGdW5jdGlvbjRJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIHRoaXNBcmcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7P30gZXhwNQogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb241KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIGV4cDUpIHx8IGRpZmZlcmVudCA/CiAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgNSwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUpIDoKICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUpKSA6CiAgICAgICAgZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgNSk7Cn0KLyoqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogKiBAcGFyYW0gez99IHB1cmVGbgogKiBAcGFyYW0gez99IGV4cDEKICogQHBhcmFtIHs/fSBleHAyCiAqIEBwYXJhbSB7P30gZXhwMwogKiBAcGFyYW0gez99IGV4cDQKICogQHBhcmFtIHs/fSBleHA1CiAqIEBwYXJhbSB7P30gZXhwNgogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb242KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2KSB8fCBkaWZmZXJlbnQgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2KSA6CiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2KSkgOgogICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7P30gZXhwNQogKiBAcGFyYW0gez99IGV4cDYKICogQHBhcmFtIHs/fSBleHA3CiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKgogKi8KZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjcoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2LCBleHA3KSB8fCBkaWZmZXJlbnQgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDcsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3KSA6CiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3KSkgOgogICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7P30gZXhwNQogKiBAcGFyYW0gez99IGV4cDYKICogQHBhcmFtIHs/fSBleHA3CiAqIEBwYXJhbSB7P30gZXhwOAogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb244KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgZXhwNywgZXhwOCwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSB8fCBkaWZmZXJlbnQgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDgsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSA6CiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSkgOgogICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDgpOwp9Ci8qKgogKiBwdXJlRnVuY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gc3VwcG9ydCBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzLgogKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4gQSBwdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYmluZGluZyB2YWx1ZXMgYW5kIGJ1aWxkcyBhbiBvYmplY3Qgb3IgYXJyYXkKICogY29udGFpbmluZyB0aG9zZSB2YWx1ZXMuCiAqIEBwYXJhbSB7P30gZXhwcyBBbiBhcnJheSBvZiBiaW5kaW5nIHZhbHVlcwogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb25WKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwcywgdGhpc0FyZykgewogICAgcmV0dXJuIHB1cmVGdW5jdGlvblZJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cHMsIHRoaXNBcmcpOwp9Ci8qKgogKiBSZXN1bHRzIG9mIGEgcHVyZSBmdW5jdGlvbiBpbnZvY2F0aW9uIGFyZSBzdG9yZWQgaW4gTFZpZXcgaW4gYSBkZWRpY2F0ZWQgc2xvdCB0aGF0IGlzIGluaXRpYWxpemVkCiAqIHRvIE5PX0NIQU5HRS4gSW4gcmFyZSBzaXR1YXRpb25zIGEgcHVyZSBwaXBlIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbiBvbiB0aGUgdmVyeSBmaXJzdAogKiBpbnZvY2F0aW9uIGFuZCBub3QgcHJvZHVjZSBhbnkgdmFsaWQgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIExWaWV3IHdvdWxkIGtlZXAgaG9sZGluZyB0aGUgTk9fQ0hBTkdFCiAqIHZhbHVlLiBUaGUgTk9fQ0hBTkdFIGlzIG5vdCBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gdXNlIGluIGV4cHJlc3Npb25zIC8gYmluZGluZ3MgdGh1cyB3ZSBjb252ZXJ0CiAqIGl0IHRvIGB1bmRlZmluZWRgLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcmV0dXJuVmFsdWVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIHJldHVyblZhbHVlSW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgcmV0dXJuVmFsdWVJbmRleCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsYXN0UmV0dXJuVmFsdWUgPSBsVmlld1tyZXR1cm5WYWx1ZUluZGV4XTsKICAgIHJldHVybiBsYXN0UmV0dXJuVmFsdWUgPT09IE5PX0NIQU5HRSA/IHVuZGVmaW5lZCA6IGxhc3RSZXR1cm5WYWx1ZTsKfQovKioKICogSWYgdGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICoKICogQHBhcmFtIHs/fSBsVmlldyBMVmlldyBpbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuCiAqIEBwYXJhbSB7P30gYmluZGluZ1Jvb3QgQmluZGluZyByb290IGluZGV4LgogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogKiBAcGFyYW0gez99IHB1cmVGbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gdXBkYXRlZCB2YWx1ZQogKiBAcGFyYW0gez99IGV4cCBVcGRhdGVkIGV4cHJlc3Npb24gdmFsdWUKICogQHBhcmFtIHs/PX0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuCiAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAqLwpmdW5jdGlvbiBwdXJlRnVuY3Rpb24xSW50ZXJuYWwobFZpZXcsIGJpbmRpbmdSb290LCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cCwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cCkgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDEsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHApIDogcHVyZUZuKGV4cCkpIDoKICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgMSk7Cn0KLyoqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICovCmZ1bmN0aW9uIHB1cmVGdW5jdGlvbjJJbnRlcm5hbChsVmlldywgYmluZGluZ1Jvb3QsIHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkMihsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyKSA/CiAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgMiwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIpIDogcHVyZUZuKGV4cDEsIGV4cDIpKSA6CiAgICAgICAgZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIGJpbmRpbmdJbmRleCArIDIpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBAcGFyYW0gez99IGxWaWV3IExWaWV3IGluIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBleGVjdXRlZC4KICogQHBhcmFtIHs/fSBiaW5kaW5nUm9vdCBCaW5kaW5nIHJvb3QgaW5kZXguCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAqIEBwYXJhbSB7P30gcHVyZUZuCiAqIEBwYXJhbSB7P30gZXhwMQogKiBAcGFyYW0gez99IGV4cDIKICogQHBhcmFtIHs/fSBleHAzCiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKi8KZnVuY3Rpb24gcHVyZUZ1bmN0aW9uM0ludGVybmFsKGxWaWV3LCBiaW5kaW5nUm9vdCwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBiaW5kaW5nUm9vdCArIHNsb3RPZmZzZXQ7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMpID8KICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAzLCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMykgOiBwdXJlRm4oZXhwMSwgZXhwMiwgZXhwMykpIDoKICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgMyk7Cn0KLyoqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKgogKi8KZnVuY3Rpb24gcHVyZUZ1bmN0aW9uNEludGVybmFsKGxWaWV3LCBiaW5kaW5nUm9vdCwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBiaW5kaW5nUm9vdCArIHNsb3RPZmZzZXQ7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpID8KICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkgOiBwdXJlRm4oZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkpIDoKICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgNCk7Cn0KLyoqCiAqIHB1cmVGdW5jdGlvbiBpbnN0cnVjdGlvbiB0aGF0IGNhbiBzdXBwb3J0IGFueSBudW1iZXIgb2YgYmluZGluZ3MuCiAqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4gQSBwdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYmluZGluZyB2YWx1ZXMgYW5kIGJ1aWxkcyBhbiBvYmplY3Qgb3IgYXJyYXkKICogY29udGFpbmluZyB0aG9zZSB2YWx1ZXMuCiAqIEBwYXJhbSB7P30gZXhwcyBBbiBhcnJheSBvZiBiaW5kaW5nIHZhbHVlcwogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICovCmZ1bmN0aW9uIHB1cmVGdW5jdGlvblZJbnRlcm5hbChsVmlldywgYmluZGluZ1Jvb3QsIHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwcywgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGJpbmRpbmdJbmRleCA9IGJpbmRpbmdSb290ICsgc2xvdE9mZnNldDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBmYWxzZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgrKywgZXhwc1tpXSkgJiYgKGRpZmZlcmVudCA9IHRydWUpOwogICAgfQogICAgcmV0dXJuIGRpZmZlcmVudCA/IHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgcHVyZUZuLmFwcGx5KHRoaXNBcmcsIGV4cHMpKSA6CiAgICAgICAgZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIGJpbmRpbmdJbmRleCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvcGlwZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ3JlYXRlIGEgcGlwZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3aWxsIGJlIHN0b3JlZC4KICogQHBhcmFtIHs/fSBwaXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGlwZQogKiBAcmV0dXJuIHs/fSBUIHRoZSBpbnN0YW5jZSBvZiB0aGUgcGlwZS4KICoKICovCmZ1bmN0aW9uIMm1ybVwaXBlKGluZGV4LCBwaXBlTmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBpcGVEZWY7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIHBpcGVEZWYgPSBnZXRQaXBlRGVmJDEocGlwZU5hbWUsIHRWaWV3LnBpcGVSZWdpc3RyeSk7CiAgICAgICAgdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSA9IHBpcGVEZWY7CiAgICAgICAgaWYgKHBpcGVEZWYub25EZXN0cm95KSB7CiAgICAgICAgICAgICh0Vmlldy5kZXN0cm95SG9va3MgfHwgKHRWaWV3LmRlc3Ryb3lIb29rcyA9IFtdKSkucHVzaChhZGp1c3RlZEluZGV4LCBwaXBlRGVmLm9uRGVzdHJveSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGlwZURlZiA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlRmFjdG9yeSA9IHBpcGVEZWYuZmFjdG9yeSB8fCAocGlwZURlZi5mYWN0b3J5ID0gZ2V0RmFjdG9yeURlZihwaXBlRGVmLnR5cGUsIHRydWUpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbijJtcm1ZGlyZWN0aXZlSW5qZWN0KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBpcGVJbnN0YW5jZSA9IHBpcGVGYWN0b3J5KCk7CiAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgIHN0b3JlKHRWaWV3LCBnZXRMVmlldygpLCBpbmRleCwgcGlwZUluc3RhbmNlKTsKICAgIHJldHVybiBwaXBlSW5zdGFuY2U7Cn0KLyoqCiAqIFNlYXJjaGVzIHRoZSBwaXBlIHJlZ2lzdHJ5IGZvciBhIHBpcGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgb25lIGlzIGZvdW5kLAogKiByZXR1cm5zIHRoZSBwaXBlLiBPdGhlcndpc2UsIGFuIGVycm9yIGlzIHRocm93biBiZWNhdXNlIHRoZSBwaXBlIGNhbm5vdCBiZSByZXNvbHZlZC4KICoKICogQHBhcmFtIHs/fSBuYW1lIE5hbWUgb2YgcGlwZSB0byByZXNvbHZlCiAqIEBwYXJhbSB7P30gcmVnaXN0cnkgRnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBwaXBlcwogKiBAcmV0dXJuIHs/fSBNYXRjaGluZyBQaXBlRGVmCiAqLwpmdW5jdGlvbiBnZXRQaXBlRGVmJDEobmFtZSwgcmVnaXN0cnkpIHsKICAgIGlmIChyZWdpc3RyeSkgewogICAgICAgIGZvciAobGV0IGkgPSByZWdpc3RyeS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBpcGVEZWYgPSByZWdpc3RyeVtpXTsKICAgICAgICAgICAgaWYgKG5hbWUgPT09IHBpcGVEZWYubmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBpcGVEZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwaXBlICcke25hbWV9JyBjb3VsZCBub3QgYmUgZm91bmQhYCk7Cn0KLyoqCiAqIEludm9rZXMgYSBwaXBlIHdpdGggMSBhcmd1bWVudHMuCiAqCiAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAqIHRoZSBwaXBlIG9ubHkgd2hlbiBhbiBpbnB1dCB0byB0aGUgcGlwZSBjaGFuZ2VzLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdhcyBzdG9yZWQgb24gY3JlYXRpb24uCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSByZXNlcnZlZCBzbG90IHNwYWNlCiAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXBpcGVCaW5kMShpbmRleCwgc2xvdE9mZnNldCwgdjEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBpcGVJbnN0YW5jZSA9IGxvYWQobFZpZXcsIGluZGV4KTsKICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/CiAgICAgICAgcHVyZUZ1bmN0aW9uMUludGVybmFsKGxWaWV3LCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLCB2MSwgcGlwZUluc3RhbmNlKSA6CiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSh2MSkpOwp9Ci8qKgogKiBJbnZva2VzIGEgcGlwZSB3aXRoIDIgYXJndW1lbnRzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFjdHMgYXMgYSBndWFyZCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZwogKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgcmVzZXJ2ZWQgc2xvdCBzcGFjZQogKiBAcGFyYW0gez99IHYxIDFzdCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICogQHBhcmFtIHs/fSB2MiAybmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cGlwZUJpbmQyKGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBpcGVJbnN0YW5jZSA9IGxvYWQobFZpZXcsIGluZGV4KTsKICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/CiAgICAgICAgcHVyZUZ1bmN0aW9uMkludGVybmFsKGxWaWV3LCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLCB2MSwgdjIsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0odjEsIHYyKSk7Cn0KLyoqCiAqIEludm9rZXMgYSBwaXBlIHdpdGggMyBhcmd1bWVudHMuCiAqCiAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAqIHRoZSBwaXBlIG9ubHkgd2hlbiBhbiBpbnB1dCB0byB0aGUgcGlwZSBjaGFuZ2VzLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdhcyBzdG9yZWQgb24gY3JlYXRpb24uCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSByZXNlcnZlZCBzbG90IHNwYWNlCiAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogKiBAcGFyYW0gez99IHYyIDJuZCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICogQHBhcmFtIHs/fSB2MyA0cmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cGlwZUJpbmQzKGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIsIHYzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShsVmlldywgaXNQdXJlKGxWaWV3LCBpbmRleCkgPyBwdXJlRnVuY3Rpb24zSW50ZXJuYWwobFZpZXcsIGdldEJpbmRpbmdSb290KCksIHNsb3RPZmZzZXQsIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0sIHYxLCB2MiwgdjMsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0odjEsIHYyLCB2MykpOwp9Ci8qKgogKiBJbnZva2VzIGEgcGlwZSB3aXRoIDQgYXJndW1lbnRzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFjdHMgYXMgYSBndWFyZCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZwogKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgcmVzZXJ2ZWQgc2xvdCBzcGFjZQogKiBAcGFyYW0gez99IHYxIDFzdCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICogQHBhcmFtIHs/fSB2MiAybmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAqIEBwYXJhbSB7P30gdjMgM3JkIGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogKiBAcGFyYW0gez99IHY0IDR0aCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVwaXBlQmluZDQoaW5kZXgsIHNsb3RPZmZzZXQsIHYxLCB2MiwgdjMsIHY0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShsVmlldywgaXNQdXJlKGxWaWV3LCBpbmRleCkgPyBwdXJlRnVuY3Rpb240SW50ZXJuYWwobFZpZXcsIGdldEJpbmRpbmdSb290KCksIHNsb3RPZmZzZXQsIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0sIHYxLCB2MiwgdjMsIHY0LCBwaXBlSW5zdGFuY2UpIDoKICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0KSk7Cn0KLyoqCiAqIEludm9rZXMgYSBwaXBlIHdpdGggdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBhY3RzIGFzIGEgZ3VhcmQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0gaW52b2tpbmcKICogdGhlIHBpcGUgb25seSB3aGVuIGFuIGlucHV0IHRvIHRoZSBwaXBlIGNoYW5nZXMuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2FzIHN0b3JlZCBvbiBjcmVhdGlvbi4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2UKICogQHBhcmFtIHs/fSB2YWx1ZXMgQXJyYXkgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0gbWV0aG9kLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXBpcGVCaW5kVihpbmRleCwgc2xvdE9mZnNldCwgdmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShsVmlldywgaXNQdXJlKGxWaWV3LCBpbmRleCkgPwogICAgICAgIHB1cmVGdW5jdGlvblZJbnRlcm5hbChsVmlldywgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdmFsdWVzLCBwaXBlSW5zdGFuY2UpIDoKICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLmFwcGx5KHBpcGVJbnN0YW5jZSwgdmFsdWVzKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQdXJlKGxWaWV3LCBpbmRleCkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbVFZJRVddLmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSkpKS5wdXJlOwp9Ci8qKgogKiBVbndyYXAgdGhlIG91dHB1dCBvZiBhIHBpcGUgdHJhbnNmb3JtYXRpb24uCiAqIEluIG9yZGVyIHRvIHRyaWNrIGNoYW5nZSBkZXRlY3Rpb24gaW50byBjb25zaWRlcmluZyB0aGF0IHRoZSBuZXcgdmFsdWUgaXMgYWx3YXlzIGRpZmZlcmVudCBmcm9tCiAqIHRoZSBvbGQgb25lLCB0aGUgb2xkIHZhbHVlIGlzIG92ZXJ3cml0dGVuIGJ5IE5PX0NIQU5HRS4KICoKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IG5ld1ZhbHVlIHRoZSBwaXBlIHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVud3JhcFZhbHVlJDEobFZpZXcsIG5ld1ZhbHVlKSB7CiAgICBpZiAoV3JhcHBlZFZhbHVlLmlzV3JhcHBlZChuZXdWYWx1ZSkpIHsKICAgICAgICBuZXdWYWx1ZSA9IFdyYXBwZWRWYWx1ZS51bndyYXAobmV3VmFsdWUpOwogICAgICAgIC8vIFRoZSBOT19DSEFOR0UgdmFsdWUgbmVlZHMgdG8gYmUgd3JpdHRlbiBhdCB0aGUgaW5kZXggd2hlcmUgdGhlIGltcGFjdGVkIGJpbmRpbmcgdmFsdWUgaXMKICAgICAgICAvLyBzdG9yZWQKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ1RvSW52YWxpZGF0ZUlkeCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgICAgIGxWaWV3W2JpbmRpbmdUb0ludmFsaWRhdGVJZHhdID0gTk9fQ0hBTkdFOwogICAgfQogICAgcmV0dXJuIG5ld1ZhbHVlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9ldmVudF9lbWl0dGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBVc2UgaW4gY29tcG9uZW50cyB3aXRoIHRoZSBgXEBPdXRwdXRgIGRpcmVjdGl2ZSB0byBlbWl0IGN1c3RvbSBldmVudHMKICogc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSwgYW5kIHJlZ2lzdGVyIGhhbmRsZXJzIGZvciB0aG9zZSBldmVudHMKICogYnkgc3Vic2NyaWJpbmcgdG8gYW4gaW5zdGFuY2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiBFeHRlbmRzCiAqIFtSeEpTIGBTdWJqZWN0YF0oaHR0cHM6Ly9yeGpzLmRldi9hcGkvaW5kZXgvY2xhc3MvU3ViamVjdCkKICogZm9yIEFuZ3VsYXIgYnkgYWRkaW5nIHRoZSBgZW1pdCgpYCBtZXRob2QuCiAqCiAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYSBjb21wb25lbnQgZGVmaW5lcyB0d28gb3V0cHV0IHByb3BlcnRpZXMKICogdGhhdCBjcmVhdGUgZXZlbnQgZW1pdHRlcnMuIFdoZW4gdGhlIHRpdGxlIGlzIGNsaWNrZWQsIHRoZSBlbWl0dGVyCiAqIGVtaXRzIGFuIG9wZW4gb3IgY2xvc2UgZXZlbnQgdG8gdG9nZ2xlIHRoZSBjdXJyZW50IHZpc2liaWxpdHkgc3RhdGUuCiAqCiAqIGBgYGh0bWwKICogXEBDb21wb25lbnQoewogKiAgIHNlbGVjdG9yOiAnemlwcHknLAogKiAgIHRlbXBsYXRlOiBgCiAqICAgPGRpdiBjbGFzcz0iemlwcHkiPgogKiAgICAgPGRpdiAoY2xpY2spPSJ0b2dnbGUoKSI+VG9nZ2xlPC9kaXY+CiAqICAgICA8ZGl2IFtoaWRkZW5dPSIhdmlzaWJsZSI+CiAqICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD4KICogICAgIDwvZGl2PgogKiAgPC9kaXY+YH0pCiAqIGV4cG9ydCBjbGFzcyBaaXBweSB7CiAqICAgdmlzaWJsZTogYm9vbGVhbiA9IHRydWU7CiAqIFxAT3V0cHV0KCkgb3BlbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAqIFxAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogKgogKiAgIHRvZ2dsZSgpIHsKICogICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7CiAqICAgICBpZiAodGhpcy52aXNpYmxlKSB7CiAqICAgICAgIHRoaXMub3Blbi5lbWl0KG51bGwpOwogKiAgICAgfSBlbHNlIHsKICogICAgICAgdGhpcy5jbG9zZS5lbWl0KG51bGwpOwogKiAgICAgfQogKiAgIH0KICogfQogKiBgYGAKICoKICogQWNjZXNzIHRoZSBldmVudCBvYmplY3Qgd2l0aCB0aGUgYCRldmVudGAgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBvdXRwdXQgZXZlbnQKICogaGFuZGxlcjoKICoKICogYGBgaHRtbAogKiA8emlwcHkgKG9wZW4pPSJvbk9wZW4oJGV2ZW50KSIgKGNsb3NlKT0ib25DbG9zZSgkZXZlbnQpIj48L3ppcHB5PgogKiBgYGAKICoKICogQHNlZSBbT2JzZXJ2YWJsZXMgaW4gQW5ndWxhcl0oZ3VpZGUvb2JzZXJ2YWJsZXMtaW4tYW5ndWxhcikKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIEV2ZW50RW1pdHRlciBleHRlbmRzIFN1YmplY3QgewogICAgLy8gdHNsaW50OmRpc2FibGUtbGluZQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBjYW4KICAgICAqIGRlbGl2ZXIgZXZlbnRzIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gaXNBc3luYyBXaGVuIHRydWUsIGRlbGl2ZXIgZXZlbnRzIGFzeW5jaHJvbm91c2x5LgogICAgICoKICAgICAqLwogICAgY29uc3RydWN0b3IoaXNBc3luYyA9IGZhbHNlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9faXNBc3luYyA9IGlzQXN5bmM7CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIGFuIGV2ZW50IGNvbnRhaW5pbmcgYSBnaXZlbiB2YWx1ZS4KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFRoZSB2YWx1ZSB0byBlbWl0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZW1pdCh2YWx1ZSkgewogICAgICAgIHN1cGVyLm5leHQodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgaGFuZGxlcnMgZm9yIGV2ZW50cyBlbWl0dGVkIGJ5IHRoaXMgaW5zdGFuY2UuCiAgICAgKiBAcGFyYW0gez89fSBnZW5lcmF0b3JPck5leHQgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgZW1pdHRlZCBldmVudHMuCiAgICAgKiBAcGFyYW0gez89fSBlcnJvciBXaGVuIHN1cHBsaWVkLCBhIGN1c3RvbSBoYW5kbGVyIGZvciBhbiBlcnJvciBub3RpZmljYXRpb24KICAgICAqIGZyb20gdGhpcyBlbWl0dGVyLgogICAgICogQHBhcmFtIHs/PX0gY29tcGxldGUgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgYSBjb21wbGV0aW9uCiAgICAgKiBub3RpZmljYXRpb24gZnJvbSB0aGlzIGVtaXR0ZXIuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdWJzY3JpYmUoZ2VuZXJhdG9yT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNjaGVkdWxlckZuOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZXJyb3JGbiA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGVycikgPT4gbnVsbCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb21wbGV0ZUZuID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gbnVsbCk7CiAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dCAmJiB0eXBlb2YgZ2VuZXJhdG9yT3JOZXh0ID09PSAnb2JqZWN0JykgewogICAgICAgICAgICBzY2hlZHVsZXJGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gZ2VuZXJhdG9yT3JOZXh0Lm5leHQodmFsdWUpKSk7CiAgICAgICAgICAgIH0pIDogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChnZW5lcmF0b3JPck5leHQuZXJyb3IpIHsKICAgICAgICAgICAgICAgIGVycm9yRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBnZW5lcmF0b3JPck5leHQuZXJyb3IoZXJyKSkpOwogICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgY29tcGxldGVGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gZ2VuZXJhdG9yT3JOZXh0LmNvbXBsZXRlKCkpKTsKICAgICAgICAgICAgICAgIH0pIDogKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNjaGVkdWxlckZuID0gdGhpcy5fX2lzQXN5bmMgPyAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBnZW5lcmF0b3JPck5leHQodmFsdWUpKSk7CiAgICAgICAgICAgIH0pIDogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGVycm9yRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBlcnJvcihlcnIpKSk7CiAgICAgICAgICAgICAgICB9KSA6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb21wbGV0ZSkgewogICAgICAgICAgICAgICAgY29tcGxldGVGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gY29tcGxldGUoKSkpOwogICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzaW5rID0gc3VwZXIuc3Vic2NyaWJlKHNjaGVkdWxlckZuLCBlcnJvckZuLCBjb21wbGV0ZUZuKTsKICAgICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5hZGQoc2luayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzaW5rOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvcXVlcnlfbGlzdC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHRlbXBsYXRlIFQKICogQHRoaXMgez99CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzeW1ib2xJdGVyYXRvcigpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpKS5fcmVzdWx0cykpKVtnZXRTeW1ib2xJdGVyYXRvciQxKCldKCk7Cn0KLyoqCiAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIGl0ZW1zIHRoYXQgQW5ndWxhciBrZWVwcyB1cCB0byBkYXRlIHdoZW4gdGhlIHN0YXRlCiAqIG9mIHRoZSBhcHBsaWNhdGlvbiBjaGFuZ2VzLgogKgogKiBUaGUgdHlwZSBvZiBvYmplY3QgdGhhdCB7XEBsaW5rIFZpZXdDaGlsZHJlbn0sIHtcQGxpbmsgQ29udGVudENoaWxkcmVufSwgYW5kIHtcQGxpbmsgUXVlcnlMaXN0fQogKiBwcm92aWRlLgogKgogKiBJbXBsZW1lbnRzIGFuIGl0ZXJhYmxlIGludGVyZmFjZSwgdGhlcmVmb3JlIGl0IGNhbiBiZSB1c2VkIGluIGJvdGggRVM2CiAqIGphdmFzY3JpcHQgYGZvciAodmFyIGkgb2YgaXRlbXMpYCBsb29wcyBhcyB3ZWxsIGFzIGluIEFuZ3VsYXIgdGVtcGxhdGVzIHdpdGgKICogYCpuZ0Zvcj0ibGV0IGkgb2YgbXlMaXN0ImAuCiAqCiAqIENoYW5nZXMgY2FuIGJlIG9ic2VydmVkIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBjaGFuZ2VzIGBPYnNlcnZhYmxlYC4KICoKICogTk9URTogSW4gdGhlIGZ1dHVyZSB0aGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGBPYnNlcnZhYmxlYCBpbnRlcmZhY2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgRXhhbXBsZQogKiBgYGB0eXBlc2NyaXB0CiAqIFxAQ29tcG9uZW50KHsuLi59KQogKiBjbGFzcyBDb250YWluZXIgewogKiBcQFZpZXdDaGlsZHJlbihJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT47CiAqIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBRdWVyeUxpc3QgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgICAgICAgdGhpcy5fcmVzdWx0cyA9IFtdOwogICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVjbGFyZWQgb24gdGhlIHByb3RvdHlwZSwgYnV0IGRvaW5nIHNvIHRoZXJlIHdpbGwgY2F1c2UgdGhlIGNsYXNzCiAgICAgICAgLy8gZGVjbGFyYXRpb24gdG8gaGF2ZSBzaWRlLWVmZmVjdHMgYW5kIGJlY29tZSBub3QgdHJlZS1zaGFrYWJsZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvIGl0IGluCiAgICAgICAgLy8gdGhlIGNvbnN0cnVjdG9yLgogICAgICAgIC8vIFtnZXRTeW1ib2xJdGVyYXRvcigpXSgpOiBJdGVyYXRvcjxUPiB7IC4uLiB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN5bWJvbCA9IGdldFN5bWJvbEl0ZXJhdG9yJDEoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAoUXVlcnlMaXN0LnByb3RvdHlwZSkpOwogICAgICAgIGlmICghcHJvdG9bc3ltYm9sXSkKICAgICAgICAgICAgcHJvdG9bc3ltYm9sXSA9IHN5bWJvbEl0ZXJhdG9yOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUKICAgICAqIFtBcnJheS5tYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkKICAgICAqIEB0ZW1wbGF0ZSBVCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXAoZm4pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5tYXAoZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUKICAgICAqIFtBcnJheS5maWx0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlcikKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbHRlcihmbikgewogICAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcihmbik7CiAgICB9CiAgICAvKioKICAgICAqIFNlZQogICAgICogW0FycmF5LmZpbmRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kKGZuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMuZmluZChmbik7CiAgICB9CiAgICAvKioKICAgICAqIFNlZQogICAgICogW0FycmF5LnJlZHVjZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlKQogICAgICogQHRlbXBsYXRlIFUKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEBwYXJhbSB7P30gaW5pdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVkdWNlKGZuLCBpbml0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMucmVkdWNlKGZuLCBpbml0KTsKICAgIH0KICAgIC8qKgogICAgICogU2VlCiAgICAgKiBbQXJyYXkuZm9yRWFjaF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZm9yRWFjaCkKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2goZm4pIHsKICAgICAgICB0aGlzLl9yZXN1bHRzLmZvckVhY2goZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUKICAgICAqIFtBcnJheS5zb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKQogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc29tZShmbikgewogICAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRzLnNvbWUoZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgcmVzdWx0cyBsaXN0IGFzIGFuIEFycmF5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9BcnJheSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5zbGljZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy50b1N0cmluZygpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBzdG9yZWQgZGF0YSBvZiB0aGUgcXVlcnkgbGlzdCwgYW5kIHJlc2V0cyB0aGUgYGRpcnR5YCBmbGFnIHRvIGBmYWxzZWAsIHNvIHRoYXQKICAgICAqIG9uIGNoYW5nZSBkZXRlY3Rpb24sIGl0IHdpbGwgbm90IG5vdGlmeSBvZiBjaGFuZ2VzIHRvIHRoZSBxdWVyaWVzLCB1bmxlc3MgYSBuZXcgY2hhbmdlCiAgICAgKiBvY2N1cnMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSByZXN1bHRzVHJlZSBUaGUgcXVlcnkgcmVzdWx0cyB0byBzdG9yZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQocmVzdWx0c1RyZWUpIHsKICAgICAgICB0aGlzLl9yZXN1bHRzID0gZmxhdHRlbihyZXN1bHRzVHJlZSk7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRpcnR5ID0gZmFsc2U7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmxlbmd0aCA9IHRoaXMuX3Jlc3VsdHMubGVuZ3RoOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sYXN0ID0gdGhpcy5fcmVzdWx0c1t0aGlzLmxlbmd0aCAtIDFdOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5maXJzdCA9IHRoaXMuX3Jlc3VsdHNbMF07CiAgICB9CiAgICAvKioKICAgICAqIFRyaWdnZXJzIGEgY2hhbmdlIGV2ZW50IGJ5IGVtaXR0aW5nIG9uIHRoZSBgY2hhbmdlc2Age1xAbGluayBFdmVudEVtaXR0ZXJ9LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbm90aWZ5T25DaGFuZ2VzKCkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5jaGFuZ2VzKSkpLmVtaXQodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXREaXJ0eSgpIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuZGlydHkgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY2hhbmdlcykpKS5jb21wbGV0ZSgpOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5jaGFuZ2VzKSkpLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBMUXVlcnlfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBxdWVyeUxpc3QKICAgICAqLwogICAgY29uc3RydWN0b3IocXVlcnlMaXN0KSB7CiAgICAgICAgdGhpcy5xdWVyeUxpc3QgPSBxdWVyeUxpc3Q7CiAgICAgICAgdGhpcy5tYXRjaGVzID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMUXVlcnlfKHRoaXMucXVlcnlMaXN0KTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlydHkoKSB7CiAgICAgICAgdGhpcy5xdWVyeUxpc3Quc2V0RGlydHkoKTsKICAgIH0KfQpjbGFzcyBMUXVlcmllc18gewogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBxdWVyaWVzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHF1ZXJpZXMgPSBbXSkgewogICAgICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUVtYmVkZGVkVmlldyh0VmlldykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UXVlcmllcyA9IHRWaWV3LnF1ZXJpZXM7CiAgICAgICAgaWYgKHRRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgbm9PZkluaGVyaXRlZFF1ZXJpZXMgPSB0Vmlldy5jb250ZW50UXVlcmllcyAhPT0gbnVsbCA/IHRWaWV3LmNvbnRlbnRRdWVyaWVzWzBdIDogdFF1ZXJpZXMubGVuZ3RoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdMUXVlcmllcyA9IFtdOwogICAgICAgICAgICAvLyBBbiBlbWJlZGRlZCB2aWV3IGhhcyBxdWVyaWVzIHByb3BhZ2F0ZWQgZnJvbSBhIGRlY2xhcmF0aW9uIHZpZXcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgICAgICAgICAgLy8gVFF1ZXJpZXMgY29sbGVjdGlvbiBhbmQgdXAgdW50aWwgYSBmaXJzdCBjb250ZW50IHF1ZXJ5IGRlY2xhcmVkIGluIHRoZSBlbWJlZGRlZCB2aWV3LiBPbmx5CiAgICAgICAgICAgIC8vIHByb3BhZ2F0ZWQgTFF1ZXJpZXMgYXJlIGNyZWF0ZWQgYXQgdGhpcyBwb2ludCAoTFF1ZXJ5IGNvcnJlc3BvbmRpbmcgdG8gZGVjbGFyZWQgY29udGVudAogICAgICAgICAgICAvLyBxdWVyaWVzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGZyb20gdGhlIGNvbnRlbnQgcXVlcnkgaW5zdHJ1Y3Rpb25zIGZvciBlYWNoIGRpcmVjdGl2ZSkuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9PZkluaGVyaXRlZFF1ZXJpZXM7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdFF1ZXJ5ID0gdFF1ZXJpZXMuZ2V0QnlJbmRleChpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudExRdWVyeSA9IHRoaXMucXVlcmllc1t0UXVlcnkuaW5kZXhJbkRlY2xhcmF0aW9uVmlld107CiAgICAgICAgICAgICAgICB2aWV3TFF1ZXJpZXMucHVzaChwYXJlbnRMUXVlcnkuY2xvbmUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBMUXVlcmllc18odmlld0xRdWVyaWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGluc2VydFZpZXcodFZpZXcpIHsKICAgICAgICB0aGlzLmRpcnR5UXVlcmllc1dpdGhNYXRjaGVzKHRWaWV3KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGV0YWNoVmlldyh0VmlldykgewogICAgICAgIHRoaXMuZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModFZpZXcpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZ2V0VFF1ZXJ5KHRWaWV3LCBpKS5tYXRjaGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJpZXNbaV0uc2V0RGlydHkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpjbGFzcyBUUXVlcnlNZXRhZGF0YV8gewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZQogICAgICogQHBhcmFtIHs/fSBkZXNjZW5kYW50cwogICAgICogQHBhcmFtIHs/fSBpc1N0YXRpYwogICAgICogQHBhcmFtIHs/PX0gcmVhZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihwcmVkaWNhdGUsIGRlc2NlbmRhbnRzLCBpc1N0YXRpYywgcmVhZCA9IG51bGwpIHsKICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKICAgICAgICB0aGlzLmRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHM7CiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOwogICAgICAgIHRoaXMucmVhZCA9IHJlYWQ7CiAgICB9Cn0KY2xhc3MgVFF1ZXJpZXNfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gcXVlcmllcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihxdWVyaWVzID0gW10pIHsKICAgICAgICB0aGlzLnF1ZXJpZXMgPSBxdWVyaWVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0VmlldywgJ1F1ZXJpZXMgc2hvdWxkIGNvbGxlY3QgcmVzdWx0cyBvbiB0aGUgZmlyc3QgdGVtcGxhdGUgcGFzcyBvbmx5Jyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5xdWVyaWVzW2ldLmVsZW1lbnRTdGFydCh0VmlldywgdE5vZGUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZWxlbWVudEVuZCh0Tm9kZSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5xdWVyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMucXVlcmllc1tpXS5lbGVtZW50RW5kKHROb2RlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVtYmVkZGVkVFZpZXcodE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZiA9IG51bGw7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2hpbGRRdWVyeUluZGV4ID0gcXVlcmllc0ZvclRlbXBsYXRlUmVmICE9PSBudWxsID8gcXVlcmllc0ZvclRlbXBsYXRlUmVmLmxlbmd0aCA6IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHF1ZXJ5Q2xvbmUgPSB0aGlzLmdldEJ5SW5kZXgoaSkuZW1iZWRkZWRUVmlldyh0Tm9kZSwgY2hpbGRRdWVyeUluZGV4KTsKICAgICAgICAgICAgaWYgKHRxdWVyeUNsb25lKSB7CiAgICAgICAgICAgICAgICB0cXVlcnlDbG9uZS5pbmRleEluRGVjbGFyYXRpb25WaWV3ID0gaTsKICAgICAgICAgICAgICAgIGlmIChxdWVyaWVzRm9yVGVtcGxhdGVSZWYgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBxdWVyaWVzRm9yVGVtcGxhdGVSZWYucHVzaCh0cXVlcnlDbG9uZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBxdWVyaWVzRm9yVGVtcGxhdGVSZWYgPSBbdHF1ZXJ5Q2xvbmVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBxdWVyaWVzRm9yVGVtcGxhdGVSZWYgIT09IG51bGwgPyBuZXcgVFF1ZXJpZXNfKHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZikgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0ZW1wbGF0ZSh0VmlldywgdE5vZGUpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3LCAnUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHknKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLnF1ZXJpZXNbaV0udGVtcGxhdGUodFZpZXcsIHROb2RlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEJ5SW5kZXgoaW5kZXgpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UodGhpcy5xdWVyaWVzLCBpbmRleCk7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcmllc1tpbmRleF07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcmllcy5sZW5ndGg7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHF1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmFjayh0cXVlcnkpIHsKICAgICAgICB0aGlzLnF1ZXJpZXMucHVzaCh0cXVlcnkpOwogICAgfQp9CmNsYXNzIFRRdWVyeV8gewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez89fSBub2RlSW5kZXgKICAgICAqLwogICAgY29uc3RydWN0b3IobWV0YWRhdGEsIG5vZGVJbmRleCA9IC0xKSB7CiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgIHRoaXMubWF0Y2hlcyA9IG51bGw7CiAgICAgICAgdGhpcy5pbmRleEluRGVjbGFyYXRpb25WaWV3ID0gLTE7CiAgICAgICAgdGhpcy5jcm9zc2VzTmdUZW1wbGF0ZSA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgZ2l2ZW4gcXVlcnkgc3RpbGwgYXBwbGllcyB0byBub2RlcyBpdCBpcyBjcm9zc2luZy4gV2UgdXNlIHRoaXMgZmxhZwogICAgICAgICAqIChhbG9uZ3NpZGUgd2l0aCBfZGVjbGFyYXRpb25Ob2RlSW5kZXgpIHRvIGtub3cgd2hlbiB0byBzdG9wIGFwcGx5aW5nIGNvbnRlbnQgcXVlcmllcyB0bwogICAgICAgICAqIGVsZW1lbnRzIGluIGEgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fYXBwbGllc1RvTmV4dE5vZGUgPSB0cnVlOwogICAgICAgIHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4ID0gbm9kZUluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuaXNBcHBseWluZ1RvTm9kZSh0Tm9kZSkpIHsKICAgICAgICAgICAgdGhpcy5tYXRjaFROb2RlKHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50RW5kKHROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4ID09PSB0Tm9kZS5pbmRleCkgewogICAgICAgICAgICB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZSA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdGVtcGxhdGUodFZpZXcsIHROb2RlKSB7CiAgICAgICAgdGhpcy5lbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBjaGlsZFF1ZXJ5SW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVtYmVkZGVkVFZpZXcodE5vZGUsIGNoaWxkUXVlcnlJbmRleCkgewogICAgICAgIGlmICh0aGlzLmlzQXBwbHlpbmdUb05vZGUodE5vZGUpKSB7CiAgICAgICAgICAgIHRoaXMuY3Jvc3Nlc05nVGVtcGxhdGUgPSB0cnVlOwogICAgICAgICAgICAvLyBBIG1hcmtlciBpbmRpY2F0aW5nIGEgYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQgKGEgcGxhY2Vob2xkZXIgZm9yIHF1ZXJ5IHJlc3VsdHMgZnJvbQogICAgICAgICAgICAvLyBlbWJlZGRlZCB2aWV3cyBjcmVhdGVkIGJhc2VkIG9uIHRoaXMgYDxuZy10ZW1wbGF0ZT5gKS4KICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCgtdE5vZGUuaW5kZXgsIGNoaWxkUXVlcnlJbmRleCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgVFF1ZXJ5Xyh0aGlzLm1ldGFkYXRhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc0FwcGx5aW5nVG9Ob2RlKHROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuX2FwcGxpZXNUb05leHROb2RlICYmIHRoaXMubWV0YWRhdGEuZGVzY2VuZGFudHMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Ob2RlSWR4ID0gdGhpcy5fZGVjbGFyYXRpb25Ob2RlSW5kZXg7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcmVudCA9IHROb2RlLnBhcmVudDsKICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gVE5vZGUgaXMgYSAiZGlyZWN0IiBjaGlsZCBvZiBhIG5vZGUgb24gd2hpY2ggYSBjb250ZW50IHF1ZXJ5IHdhcwogICAgICAgICAgICAvLyBkZWNsYXJlZCAob25seSBkaXJlY3QgY2hpbGRyZW4gb2YgcXVlcnkncyBob3N0IG5vZGUgY2FuIG1hdGNoIHdpdGggdGhlIGRlc2NlbmRhbnRzOiBmYWxzZQogICAgICAgICAgICAvLyBvcHRpb24pLiBUaGVyZSBhcmUgMyBtYWluIHVzZS1jYXNlIC8gY29uZGl0aW9ucyB0byBjb25zaWRlciBoZXJlOgogICAgICAgICAgICAvLyAtIDxuZWVkcy10YXJnZXQ+PGkgI3RhcmdldD48L2k+PC9uZWVkcy10YXJnZXQ+OiBoZXJlIDxpICN0YXJnZXQ+IHBhcmVudCBub2RlIGlzIGEgcXVlcnkKICAgICAgICAgICAgLy8gaG9zdCBub2RlOwogICAgICAgICAgICAvLyAtIDxuZWVkcy10YXJnZXQ+PG5nLXRlbXBsYXRlIFtuZ0lmXT0idHJ1ZSI+PGkgI3RhcmdldD48L2k+PC9uZy10ZW1wbGF0ZT48L25lZWRzLXRhcmdldD46CiAgICAgICAgICAgIC8vIGhlcmUgPGkgI3RhcmdldD4gcGFyZW50IG5vZGUgaXMgbnVsbDsKICAgICAgICAgICAgLy8gLSA8bmVlZHMtdGFyZ2V0PjxuZy1jb250YWluZXI+PGkgI3RhcmdldD48L2k+PC9uZy1jb250YWluZXI+PC9uZWVkcy10YXJnZXQ+OiBoZXJlIHdlIG5lZWQKICAgICAgICAgICAgLy8gdG8gZ28gcGFzdCBgPG5nLWNvbnRhaW5lcj5gIHRvIGRldGVybWluZSA8aSAjdGFyZ2V0PiBwYXJlbnQgbm9kZSAoYnV0IHdlIHNob3VsZG4ndCB0cmF2ZXJzZQogICAgICAgICAgICAvLyB1cCBwYXN0IHRoZSBxdWVyeSdzIGhvc3Qgbm9kZSEpLgogICAgICAgICAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gJiYKICAgICAgICAgICAgICAgIHBhcmVudC5pbmRleCAhPT0gZGVjbGFyYXRpb25Ob2RlSWR4KSB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbk5vZGVJZHggPT09IChwYXJlbnQgIT09IG51bGwgPyBwYXJlbnQuaW5kZXggOiAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1hdGNoVE5vZGUodFZpZXcsIHROb2RlKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tZXRhZGF0YS5wcmVkaWNhdGUpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9IHRoaXMubWV0YWRhdGEucHJlZGljYXRlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgZ2V0SWR4T2ZNYXRjaGluZ1NlbGVjdG9yKHROb2RlLCBsb2NhbE5hbWVzW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHlwZVByZWRpY2F0ZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm1ldGFkYXRhLnByZWRpY2F0ZSkpOwogICAgICAgICAgICBpZiAodHlwZVByZWRpY2F0ZSA9PT0gVGVtcGxhdGVSZWYpIHsKICAgICAgICAgICAgICAgIGlmICh0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgLTEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5tYXRjaFROb2RlV2l0aFJlYWRPcHRpb24odFZpZXcsIHROb2RlLCBsb2NhdGVEaXJlY3RpdmVPclByb3ZpZGVyKHROb2RlLCB0VmlldywgdHlwZVByZWRpY2F0ZSwgZmFsc2UsIGZhbHNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IG5vZGVNYXRjaElkeAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgbm9kZU1hdGNoSWR4KSB7CiAgICAgICAgaWYgKG5vZGVNYXRjaElkeCAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlYWQgPSB0aGlzLm1ldGFkYXRhLnJlYWQ7CiAgICAgICAgICAgIGlmIChyZWFkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAocmVhZCA9PT0gRWxlbWVudFJlZiB8fCByZWFkID09PSBWaWV3Q29udGFpbmVyUmVmIHx8CiAgICAgICAgICAgICAgICAgICAgcmVhZCA9PT0gVGVtcGxhdGVSZWYgJiYgdE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1hdGNoKHROb2RlLmluZGV4LCAtMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlT3JQcm92aWRlcklkeCA9IGxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIodE5vZGUsIHRWaWV3LCByZWFkLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmVPclByb3ZpZGVySWR4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2godE5vZGUuaW5kZXgsIGRpcmVjdGl2ZU9yUHJvdmlkZXJJZHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2godE5vZGUuaW5kZXgsIG5vZGVNYXRjaElkeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHROb2RlSWR4CiAgICAgKiBAcGFyYW0gez99IG1hdGNoSWR4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRNYXRjaCh0Tm9kZUlkeCwgbWF0Y2hJZHgpIHsKICAgICAgICBpZiAodGhpcy5tYXRjaGVzID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IFt0Tm9kZUlkeCwgbWF0Y2hJZHhdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5tYXRjaGVzLnB1c2godE5vZGVJZHgsIG1hdGNoSWR4KTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEl0ZXJhdGVzIG92ZXIgbG9jYWwgbmFtZXMgZm9yIGEgZ2l2ZW4gbm9kZSBhbmQgcmV0dXJucyBkaXJlY3RpdmUgaW5kZXgKICogKG9yIC0xIGlmIGEgbG9jYWwgbmFtZSBwb2ludHMgdG8gYW4gZWxlbWVudCkuCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUgc3RhdGljIGRhdGEgb2YgYSBub2RlIHRvIGNoZWNrCiAqIEBwYXJhbSB7P30gc2VsZWN0b3Igc2VsZWN0b3IgdG8gbWF0Y2gKICogQHJldHVybiB7P30gZGlyZWN0aXZlIGluZGV4LCAtMSBvciBudWxsIGlmIGEgc2VsZWN0b3IgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgbG9jYWwgbmFtZXMKICovCmZ1bmN0aW9uIGdldElkeE9mTWF0Y2hpbmdTZWxlY3Rvcih0Tm9kZSwgc2VsZWN0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvY2FsTmFtZXMgPSB0Tm9kZS5sb2NhbE5hbWVzOwogICAgaWYgKGxvY2FsTmFtZXMgIT09IG51bGwpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgaWYgKGxvY2FsTmFtZXNbaV0gPT09IHNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGxvY2FsTmFtZXNbaSArIDFdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGN1cnJlbnRWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSZXN1bHRCeVROb2RlVHlwZSh0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gfHwgdE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZiwgdE5vZGUsIGN1cnJlbnRWaWV3KTsKICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmLCB0Tm9kZSwgY3VycmVudFZpZXcpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IG1hdGNoaW5nSWR4CiAqIEBwYXJhbSB7P30gcmVhZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlUmVzdWx0Rm9yTm9kZShsVmlldywgdE5vZGUsIG1hdGNoaW5nSWR4LCByZWFkKSB7CiAgICBpZiAobWF0Y2hpbmdJZHggPT09IC0xKSB7CiAgICAgICAgLy8gaWYgcmVhZCB0b2tlbiBhbmQgLyBvciBzdHJhdGVneSBpcyBub3Qgc3BlY2lmaWVkLCBkZXRlY3QgaXQgdXNpbmcgYXBwcm9wcmlhdGUgdE5vZGUgdHlwZQogICAgICAgIHJldHVybiBjcmVhdGVSZXN1bHRCeVROb2RlVHlwZSh0Tm9kZSwgbFZpZXcpOwogICAgfQogICAgZWxzZSBpZiAobWF0Y2hpbmdJZHggPT09IC0yKSB7CiAgICAgICAgLy8gcmVhZCBhIHNwZWNpYWwgdG9rZW4gZnJvbSBhIG5vZGUgaW5qZWN0b3IKICAgICAgICByZXR1cm4gY3JlYXRlU3BlY2lhbFRva2VuKGxWaWV3LCB0Tm9kZSwgcmVhZCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyByZWFkIGEgdG9rZW4KICAgICAgICByZXR1cm4gZ2V0Tm9kZUluamVjdGFibGUobFZpZXcsIGxWaWV3W1RWSUVXXSwgbWF0Y2hpbmdJZHgsICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gcmVhZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlU3BlY2lhbFRva2VuKGxWaWV3LCB0Tm9kZSwgcmVhZCkgewogICAgaWYgKHJlYWQgPT09IEVsZW1lbnRSZWYpIHsKICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmLCB0Tm9kZSwgbFZpZXcpOwogICAgfQogICAgZWxzZSBpZiAocmVhZCA9PT0gVGVtcGxhdGVSZWYpIHsKICAgICAgICByZXR1cm4gY3JlYXRlVGVtcGxhdGVSZWYoVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYsIHROb2RlLCBsVmlldyk7CiAgICB9CiAgICBlbHNlIGlmIChyZWFkID09PSBWaWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgMCAvKiBDb250YWluZXIgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmLCBFbGVtZW50UmVmLCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHRocm93RXJyb3IkMShgU3BlY2lhbCB0b2tlbiB0byByZWFkIHNob3VsZCBiZSBvbmUgb2YgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYgb3IgVmlld0NvbnRhaW5lclJlZiBidXQgZ290ICR7c3RyaW5naWZ5KHJlYWQpfS5gKTsKICAgIH0KfQovKioKICogQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHF1ZXJ5IHJlc3VsdHMgZm9yIGEgZ2l2ZW4gdmlldy4gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBkbyB0aGUKICogcHJvY2Vzc2luZyBvbmNlIGFuZCBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gdmlldyBpbnN0YW5jZSAoYSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBnaXZlbiB2aWV3CiAqIGRvZXNuJ3QgY2hhbmdlKS4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFF1ZXJ5CiAqIEBwYXJhbSB7P30gcXVlcnlJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF0ZXJpYWxpemVWaWV3UmVzdWx0cyh0VmlldywgbFZpZXcsIHRRdWVyeSwgcXVlcnlJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFF1ZXJ5ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXMpKVtxdWVyeUluZGV4XTsKICAgIGlmIChsUXVlcnkubWF0Y2hlcyA9PT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Vmlld0RhdGEgPSB0Vmlldy5kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UXVlcnlNYXRjaGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHRRdWVyeS5tYXRjaGVzKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFF1ZXJ5TWF0Y2hlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROb2RlSWR4ID0gdFF1ZXJ5TWF0Y2hlc1tpXTsKICAgICAgICAgICAgaWYgKG1hdGNoZWROb2RlSWR4IDwgMCkgewogICAgICAgICAgICAgICAgLy8gd2UgYXQgdGhlIDxuZy10ZW1wbGF0ZT4gbWFya2VyIHdoaWNoIG1pZ2h0IGhhdmUgcmVzdWx0cyBpbiB2aWV3cyBjcmVhdGVkIGJhc2VkIG9uIHRoaXMKICAgICAgICAgICAgICAgIC8vIDxuZy10ZW1wbGF0ZT4gLSB0aG9zZSByZXN1bHRzIHdpbGwgYmUgaW4gc2VwYXJhdGUgdmlld3MgdGhvdWdoLCBzbyBoZXJlIHdlIGp1c3QgbGVhdmUKICAgICAgICAgICAgICAgIC8vIG51bGwgYXMgYSBwbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UodFZpZXdEYXRhLCBtYXRjaGVkTm9kZUlkeCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlld0RhdGFbbWF0Y2hlZE5vZGVJZHhdKSk7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjcmVhdGVSZXN1bHRGb3JOb2RlKGxWaWV3LCB0Tm9kZSwgdFF1ZXJ5TWF0Y2hlc1tpICsgMV0sIHRRdWVyeS5tZXRhZGF0YS5yZWFkKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbFF1ZXJ5Lm1hdGNoZXMgPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gbFF1ZXJ5Lm1hdGNoZXM7Cn0KLyoqCiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29sbGVjdHMgKGFscmVhZHkgbWF0ZXJpYWxpemVkKSBxdWVyeSByZXN1bHRzIGZyb20gYSB0cmVlIG9mIHZpZXdzLAogKiBzdGFydGluZyB3aXRoIGEgcHJvdmlkZWQgTFZpZXcuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHF1ZXJ5SW5kZXgKICogQHBhcmFtIHs/fSByZXN1bHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbGxlY3RRdWVyeVJlc3VsdHModFZpZXcsIGxWaWV3LCBxdWVyeUluZGV4LCByZXN1bHQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRRdWVyeSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5xdWVyaWVzKSkuZ2V0QnlJbmRleChxdWVyeUluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRRdWVyeU1hdGNoZXMgPSB0UXVlcnkubWF0Y2hlczsKICAgIGlmICh0UXVlcnlNYXRjaGVzICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3UmVzdWx0cyA9IG1hdGVyaWFsaXplVmlld1Jlc3VsdHModFZpZXcsIGxWaWV3LCB0UXVlcnksIHF1ZXJ5SW5kZXgpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFF1ZXJ5TWF0Y2hlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlSWR4ID0gdFF1ZXJ5TWF0Y2hlc1tpXTsKICAgICAgICAgICAgaWYgKHROb2RlSWR4ID4gMCkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3UmVzdWx0c1tpIC8gMl0pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFF1ZXJ5SW5kZXggPSB0UXVlcnlNYXRjaGVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uTENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1stdE5vZGVJZHhdKSk7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkxDb250YWluZXIpOwogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBtYXRjaGVzIGZvciB2aWV3cyBpbnNlcnRlZCBpbiB0aGlzIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUOyBpIDwgZGVjbGFyYXRpb25MQ29udGFpbmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBkZWNsYXJhdGlvbkxDb250YWluZXJbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtYmVkZGVkTFZpZXdbREVDTEFSQVRJT05fTENPTlRBSU5FUl0gPT09IGVtYmVkZGVkTFZpZXdbUEFSRU5UXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0UXVlcnlSZXN1bHRzKGVtYmVkZGVkTFZpZXdbVFZJRVddLCBlbWJlZGRlZExWaWV3LCBjaGlsZFF1ZXJ5SW5kZXgsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBtYXRjaGVzIGZvciB2aWV3cyBjcmVhdGVkIGZyb20gdGhpcyBkZWNsYXJhdGlvbiBjb250YWluZXIgYW5kIGluc2VydGVkIGludG8KICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250YWluZXJzCiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25MQ29udGFpbmVyW01PVkVEX1ZJRVdTXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZExWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbkxDb250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbWJlZGRlZExWaWV3cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBlbWJlZGRlZExWaWV3c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdFF1ZXJ5UmVzdWx0cyhlbWJlZGRlZExWaWV3W1RWSUVXXSwgZW1iZWRkZWRMVmlldywgY2hpbGRRdWVyeUluZGV4LCByZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIFJlZnJlc2hlcyBhIHF1ZXJ5IGJ5IGNvbWJpbmluZyBtYXRjaGVzIGZyb20gYWxsIGFjdGl2ZSB2aWV3cyBhbmQgcmVtb3ZpbmcgbWF0Y2hlcyBmcm9tIGRlbGV0ZWQKICogdmlld3MuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHF1ZXJ5TGlzdAogKiBAcmV0dXJuIHs/fSBgdHJ1ZWAgaWYgYSBxdWVyeSBnb3QgZGlydHkgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gb3IgaWYgdGhpcyBpcyBhIHN0YXRpYyBxdWVyeQogKiByZXNvbHZpbmcgaW4gY3JlYXRpb24gbW9kZSwgYGZhbHNlYCBvdGhlcndpc2UuCiAqCiAqLwpmdW5jdGlvbiDJtcm1cXVlcnlSZWZyZXNoKHF1ZXJ5TGlzdCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcXVlcnlJbmRleCA9IGdldEN1cnJlbnRRdWVyeUluZGV4KCk7CiAgICBzZXRDdXJyZW50UXVlcnlJbmRleChxdWVyeUluZGV4ICsgMSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0UXVlcnkgPSBnZXRUUXVlcnkodFZpZXcsIHF1ZXJ5SW5kZXgpOwogICAgaWYgKHF1ZXJ5TGlzdC5kaXJ0eSAmJiAoaXNDcmVhdGlvbk1vZGUobFZpZXcpID09PSB0UXVlcnkubWV0YWRhdGEuaXNTdGF0aWMpKSB7CiAgICAgICAgaWYgKHRRdWVyeS5tYXRjaGVzID09PSBudWxsKSB7CiAgICAgICAgICAgIHF1ZXJ5TGlzdC5yZXNldChbXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRRdWVyeS5jcm9zc2VzTmdUZW1wbGF0ZSA/CiAgICAgICAgICAgICAgICBjb2xsZWN0UXVlcnlSZXN1bHRzKHRWaWV3LCBsVmlldywgcXVlcnlJbmRleCwgW10pIDoKICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplVmlld1Jlc3VsdHModFZpZXcsIGxWaWV3LCB0UXVlcnksIHF1ZXJ5SW5kZXgpOwogICAgICAgICAgICBxdWVyeUxpc3QucmVzZXQocmVzdWx0KTsKICAgICAgICAgICAgcXVlcnlMaXN0Lm5vdGlmeU9uQ2hhbmdlcygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQovKioKICogQ3JlYXRlcyBuZXcgUXVlcnlMaXN0IGZvciBhIHN0YXRpYyB2aWV3IHF1ZXJ5LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0YXRpY1ZpZXdRdWVyeShwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpIHsKICAgIHZpZXdRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgdHJ1ZSk7Cn0KLyoqCiAqIENyZWF0ZXMgbmV3IFF1ZXJ5TGlzdCwgc3RvcmVzIHRoZSByZWZlcmVuY2UgaW4gTFZpZXcgYW5kIHJldHVybnMgUXVlcnlMaXN0LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXZpZXdRdWVyeShwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpIHsKICAgIHZpZXdRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgZmFsc2UpOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUKICogQHBhcmFtIHs/fSBkZXNjZW5kCiAqIEBwYXJhbSB7P30gcmVhZAogKiBAcGFyYW0gez99IGlzU3RhdGljCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB2aWV3UXVlcnlJbnRlcm5hbCh0VmlldywgbFZpZXcsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgaXNTdGF0aWMpIHsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBjcmVhdGVUUXVlcnkodFZpZXcsIG5ldyBUUXVlcnlNZXRhZGF0YV8ocHJlZGljYXRlLCBkZXNjZW5kLCBpc1N0YXRpYywgcmVhZCksIC0xKTsKICAgICAgICBpZiAoaXNTdGF0aWMpIHsKICAgICAgICAgICAgdFZpZXcuc3RhdGljVmlld1F1ZXJpZXMgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGNyZWF0ZUxRdWVyeSh0VmlldywgbFZpZXcpOwp9Ci8qKgogKiBSZWdpc3RlcnMgYSBRdWVyeUxpc3QsIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgcXVlcnksIGZvciBsYXRlciByZWZyZXNoIChwYXJ0IG9mIGEgdmlldwogKiByZWZyZXNoKS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSW5kZXggQ3VycmVudCBkaXJlY3RpdmUgaW5kZXgKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogKiBAcmV0dXJuIHs/fSBRdWVyeUxpc3Q8VD4KICoKICovCmZ1bmN0aW9uIMm1ybVjb250ZW50UXVlcnkoZGlyZWN0aXZlSW5kZXgsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkgewogICAgY29udGVudFF1ZXJ5SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgcHJlZGljYXRlLCBkZXNjZW5kLCByZWFkLCBmYWxzZSwgZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGRpcmVjdGl2ZUluZGV4KTsKfQovKioKICogUmVnaXN0ZXJzIGEgUXVlcnlMaXN0LCBhc3NvY2lhdGVkIHdpdGggYSBzdGF0aWMgY29udGVudCBxdWVyeSwgZm9yIGxhdGVyIHJlZnJlc2gKICogKHBhcnQgb2YgYSB2aWV3IHJlZnJlc2gpLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleCBDdXJyZW50IGRpcmVjdGl2ZSBpbmRleAogKiBAcGFyYW0gez99IHByZWRpY2F0ZSBUaGUgdHlwZSBmb3Igd2hpY2ggdGhlIHF1ZXJ5IHdpbGwgc2VhcmNoCiAqIEBwYXJhbSB7P30gZGVzY2VuZCBXaGV0aGVyIG9yIG5vdCB0byBkZXNjZW5kIGludG8gY2hpbGRyZW4KICogQHBhcmFtIHs/PX0gcmVhZCBXaGF0IHRvIHNhdmUgaW4gdGhlIHF1ZXJ5CiAqIEByZXR1cm4gez99IFF1ZXJ5TGlzdDxUPgogKgogKi8KZnVuY3Rpb24gybXJtXN0YXRpY0NvbnRlbnRRdWVyeShkaXJlY3RpdmVJbmRleCwgcHJlZGljYXRlLCBkZXNjZW5kLCByZWFkKSB7CiAgICBjb250ZW50UXVlcnlJbnRlcm5hbChnZXRUVmlldygpLCBnZXRMVmlldygpLCBwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQsIHRydWUsIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBkaXJlY3RpdmVJbmRleCk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWRpY2F0ZQogKiBAcGFyYW0gez99IGRlc2NlbmQKICogQHBhcmFtIHs/fSByZWFkCiAqIEBwYXJhbSB7P30gaXNTdGF0aWMKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb250ZW50UXVlcnlJbnRlcm5hbCh0VmlldywgbFZpZXcsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgaXNTdGF0aWMsIHROb2RlLCBkaXJlY3RpdmVJbmRleCkgewogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIGNyZWF0ZVRRdWVyeSh0VmlldywgbmV3IFRRdWVyeU1ldGFkYXRhXyhwcmVkaWNhdGUsIGRlc2NlbmQsIGlzU3RhdGljLCByZWFkKSwgdE5vZGUuaW5kZXgpOwogICAgICAgIHNhdmVDb250ZW50UXVlcnlBbmREaXJlY3RpdmVJbmRleCh0VmlldywgZGlyZWN0aXZlSW5kZXgpOwogICAgICAgIGlmIChpc1N0YXRpYykgewogICAgICAgICAgICB0Vmlldy5zdGF0aWNDb250ZW50UXVlcmllcyA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgY3JlYXRlTFF1ZXJ5KHRWaWV3LCBsVmlldyk7Cn0KLyoqCiAqIExvYWRzIGEgUXVlcnlMaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgdmlldyBvciBjb250ZW50IHF1ZXJ5LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVsb2FkUXVlcnkoKSB7CiAgICByZXR1cm4gbG9hZFF1ZXJ5SW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0Q3VycmVudFF1ZXJ5SW5kZXgoKSk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBxdWVyeUluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBsb2FkUXVlcnlJbnRlcm5hbChsVmlldywgcXVlcnlJbmRleCkgewogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RGVmaW5lZChsVmlld1tRVUVSSUVTXSwgJ0xRdWVyaWVzIHNob3VsZCBiZSBkZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGxvYWQgYSBxdWVyeScpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKCgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXMsIHF1ZXJ5SW5kZXgpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXNbcXVlcnlJbmRleF0ucXVlcnlMaXN0Owp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUxRdWVyeSh0VmlldywgbFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHF1ZXJ5TGlzdCA9IG5ldyBRdWVyeUxpc3QoKTsKICAgIHN0b3JlQ2xlYW51cFdpdGhDb250ZXh0KHRWaWV3LCBsVmlldywgcXVlcnlMaXN0LCBxdWVyeUxpc3QuZGVzdHJveSk7CiAgICBpZiAobFZpZXdbUVVFUklFU10gPT09IG51bGwpCiAgICAgICAgbFZpZXdbUVVFUklFU10gPSBuZXcgTFF1ZXJpZXNfKCk7CiAgICAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUVVFUklFU10pKS5xdWVyaWVzLnB1c2gobmV3IExRdWVyeV8ocXVlcnlMaXN0KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBtZXRhZGF0YQogKiBAcGFyYW0gez99IG5vZGVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVFF1ZXJ5KHRWaWV3LCBtZXRhZGF0YSwgbm9kZUluZGV4KSB7CiAgICBpZiAodFZpZXcucXVlcmllcyA9PT0gbnVsbCkKICAgICAgICB0Vmlldy5xdWVyaWVzID0gbmV3IFRRdWVyaWVzXygpOwogICAgdFZpZXcucXVlcmllcy50cmFjayhuZXcgVFF1ZXJ5XyhtZXRhZGF0YSwgbm9kZUluZGV4KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2F2ZUNvbnRlbnRRdWVyeUFuZERpcmVjdGl2ZUluZGV4KHRWaWV3LCBkaXJlY3RpdmVJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXdDb250ZW50UXVlcmllcyA9IHRWaWV3LmNvbnRlbnRRdWVyaWVzIHx8ICh0Vmlldy5jb250ZW50UXVlcmllcyA9IFtdKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxhc3RTYXZlZERpcmVjdGl2ZUluZGV4ID0gdFZpZXcuY29udGVudFF1ZXJpZXMubGVuZ3RoID8gdFZpZXdDb250ZW50UXVlcmllc1t0Vmlld0NvbnRlbnRRdWVyaWVzLmxlbmd0aCAtIDFdIDogLTE7CiAgICBpZiAoZGlyZWN0aXZlSW5kZXggIT09IGxhc3RTYXZlZERpcmVjdGl2ZUluZGV4KSB7CiAgICAgICAgdFZpZXdDb250ZW50UXVlcmllcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5xdWVyaWVzKSkubGVuZ3RoIC0gMSwgZGlyZWN0aXZlSW5kZXgpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFRRdWVyeSh0VmlldywgaW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LnF1ZXJpZXMsICdUUXVlcmllcyBtdXN0IGJlIGRlZmluZWQgdG8gcmV0cmlldmUgYSBUUXVlcnknKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcucXVlcmllcykpLmdldEJ5SW5kZXgoaW5kZXgpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3ZpZXdfZW5naW5lX2NvbXBhdGliaWxpdHlfcHJlYm91bmQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJldHJpZXZlcyBgVGVtcGxhdGVSZWZgIGluc3RhbmNlIGZyb20gYEluamVjdG9yYCB3aGVuIGEgbG9jYWwgcmVmZXJlbmNlIGlzIHBsYWNlZCBvbiB0aGUKICogYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcih0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZiwgRWxlbWVudFJlZiwgdE5vZGUsIGN1cnJlbnRWaWV3KTsKfQovKioKICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgYENoYW5nZURldGVjdG9yUmVmYCBmb3IgYSBwaXBlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/PX0gZmxhZ3MKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpbmplY3RQaXBlQ2hhbmdlRGV0ZWN0b3JSZWYoZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2YWx1ZSA9IGluamVjdENoYW5nZURldGVjdG9yUmVmKHRydWUpOwogICAgaWYgKHZhbHVlID09IG51bGwgJiYgIShmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJvdmlkZXIgZm9yIENoYW5nZURldGVjdG9yUmVmIWApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ppdC9lbnZpcm9ubWVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCDJtTAkZCA9IC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gKHsKICAgICfJtcm1YXR0cmlidXRlJzogybXJtWF0dHJpYnV0ZSwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUxJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMSwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMiwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUzJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMywKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNCwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU1JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNSwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU2JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNiwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNywKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlOCwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGVWJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlViwKICAgICfJtcm1ZGVmaW5lQ29tcG9uZW50JzogybXJtWRlZmluZUNvbXBvbmVudCwKICAgICfJtcm1ZGVmaW5lRGlyZWN0aXZlJzogybXJtWRlZmluZURpcmVjdGl2ZSwKICAgICfJtcm1ZGVmaW5lSW5qZWN0YWJsZSc6IMm1ybVkZWZpbmVJbmplY3RhYmxlLAogICAgJ8m1ybVkZWZpbmVJbmplY3Rvcic6IMm1ybVkZWZpbmVJbmplY3RvciwKICAgICfJtcm1ZGVmaW5lTmdNb2R1bGUnOiDJtcm1ZGVmaW5lTmdNb2R1bGUsCiAgICAnybXJtWRlZmluZVBpcGUnOiDJtcm1ZGVmaW5lUGlwZSwKICAgICfJtcm1ZGlyZWN0aXZlSW5qZWN0JzogybXJtWRpcmVjdGl2ZUluamVjdCwKICAgICfJtcm1Z2V0RmFjdG9yeU9mJzogybXJtWdldEZhY3RvcnlPZiwKICAgICfJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeSc6IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5LAogICAgJ8m1ybVpbmplY3QnOiDJtcm1aW5qZWN0LAogICAgJ8m1ybVpbmplY3RBdHRyaWJ1dGUnOiDJtcm1aW5qZWN0QXR0cmlidXRlLAogICAgJ8m1ybVpbnZhbGlkRmFjdG9yeSc6IMm1ybVpbnZhbGlkRmFjdG9yeSwKICAgICfJtcm1aW52YWxpZEZhY3RvcnlEZXAnOiDJtcm1aW52YWxpZEZhY3RvcnlEZXAsCiAgICAnybXJtWluamVjdFBpcGVDaGFuZ2VEZXRlY3RvclJlZic6IMm1ybVpbmplY3RQaXBlQ2hhbmdlRGV0ZWN0b3JSZWYsCiAgICAnybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yJzogybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yLAogICAgJ8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmUnOiDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlLAogICAgJ8m1ybVQcm92aWRlcnNGZWF0dXJlJzogybXJtVByb3ZpZGVyc0ZlYXR1cmUsCiAgICAnybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZSc6IMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmUsCiAgICAnybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSc6IMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsCiAgICAnybXJtWNvbnRhaW5lcic6IMm1ybVjb250YWluZXIsCiAgICAnybXJtW5leHRDb250ZXh0JzogybXJtW5leHRDb250ZXh0LAogICAgJ8m1ybVjb250YWluZXJSZWZyZXNoU3RhcnQnOiDJtcm1Y29udGFpbmVyUmVmcmVzaFN0YXJ0LAogICAgJ8m1ybVjb250YWluZXJSZWZyZXNoRW5kJzogybXJtWNvbnRhaW5lclJlZnJlc2hFbmQsCiAgICAnybXJtW5hbWVzcGFjZUhUTUwnOiDJtcm1bmFtZXNwYWNlSFRNTCwKICAgICfJtcm1bmFtZXNwYWNlTWF0aE1MJzogybXJtW5hbWVzcGFjZU1hdGhNTCwKICAgICfJtcm1bmFtZXNwYWNlU1ZHJzogybXJtW5hbWVzcGFjZVNWRywKICAgICfJtcm1ZW5hYmxlQmluZGluZ3MnOiDJtcm1ZW5hYmxlQmluZGluZ3MsCiAgICAnybXJtWRpc2FibGVCaW5kaW5ncyc6IMm1ybVkaXNhYmxlQmluZGluZ3MsCiAgICAnybXJtWVsZW1lbnRTdGFydCc6IMm1ybVlbGVtZW50U3RhcnQsCiAgICAnybXJtWVsZW1lbnRFbmQnOiDJtcm1ZWxlbWVudEVuZCwKICAgICfJtcm1ZWxlbWVudCc6IMm1ybVlbGVtZW50LAogICAgJ8m1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQnOiDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0LAogICAgJ8m1ybVlbGVtZW50Q29udGFpbmVyRW5kJzogybXJtWVsZW1lbnRDb250YWluZXJFbmQsCiAgICAnybXJtWVsZW1lbnRDb250YWluZXInOiDJtcm1ZWxlbWVudENvbnRhaW5lciwKICAgICfJtcm1cHVyZUZ1bmN0aW9uMCc6IMm1ybVwdXJlRnVuY3Rpb24wLAogICAgJ8m1ybVwdXJlRnVuY3Rpb24xJzogybXJtXB1cmVGdW5jdGlvbjEsCiAgICAnybXJtXB1cmVGdW5jdGlvbjInOiDJtcm1cHVyZUZ1bmN0aW9uMiwKICAgICfJtcm1cHVyZUZ1bmN0aW9uMyc6IMm1ybVwdXJlRnVuY3Rpb24zLAogICAgJ8m1ybVwdXJlRnVuY3Rpb240JzogybXJtXB1cmVGdW5jdGlvbjQsCiAgICAnybXJtXB1cmVGdW5jdGlvbjUnOiDJtcm1cHVyZUZ1bmN0aW9uNSwKICAgICfJtcm1cHVyZUZ1bmN0aW9uNic6IMm1ybVwdXJlRnVuY3Rpb242LAogICAgJ8m1ybVwdXJlRnVuY3Rpb243JzogybXJtXB1cmVGdW5jdGlvbjcsCiAgICAnybXJtXB1cmVGdW5jdGlvbjgnOiDJtcm1cHVyZUZ1bmN0aW9uOCwKICAgICfJtcm1cHVyZUZ1bmN0aW9uVic6IMm1ybVwdXJlRnVuY3Rpb25WLAogICAgJ8m1ybVnZXRDdXJyZW50Vmlldyc6IMm1ybVnZXRDdXJyZW50VmlldywKICAgICfJtcm1cmVzdG9yZVZpZXcnOiDJtcm1cmVzdG9yZVZpZXcsCiAgICAnybXJtWxpc3RlbmVyJzogybXJtWxpc3RlbmVyLAogICAgJ8m1ybVwcm9qZWN0aW9uJzogybXJtXByb2plY3Rpb24sCiAgICAnybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nJzogybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nLAogICAgJ8m1ybVjb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXInOiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyLAogICAgJ8m1ybVwaXBlQmluZDEnOiDJtcm1cGlwZUJpbmQxLAogICAgJ8m1ybVwaXBlQmluZDInOiDJtcm1cGlwZUJpbmQyLAogICAgJ8m1ybVwaXBlQmluZDMnOiDJtcm1cGlwZUJpbmQzLAogICAgJ8m1ybVwaXBlQmluZDQnOiDJtcm1cGlwZUJpbmQ0LAogICAgJ8m1ybVwaXBlQmluZFYnOiDJtcm1cGlwZUJpbmRWLAogICAgJ8m1ybVwcm9qZWN0aW9uRGVmJzogybXJtXByb2plY3Rpb25EZWYsCiAgICAnybXJtWhvc3RQcm9wZXJ0eSc6IMm1ybVob3N0UHJvcGVydHksCiAgICAnybXJtXByb3BlcnR5JzogybXJtXByb3BlcnR5LAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUsCiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxLAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlMic6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMiwKICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMsCiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0LAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNSc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNSwKICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYsCiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3LAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlOCc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOCwKICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYsCiAgICAnybXJtXBpcGUnOiDJtcm1cGlwZSwKICAgICfJtcm1cXVlcnlSZWZyZXNoJzogybXJtXF1ZXJ5UmVmcmVzaCwKICAgICfJtcm1dmlld1F1ZXJ5JzogybXJtXZpZXdRdWVyeSwKICAgICfJtcm1c3RhdGljVmlld1F1ZXJ5JzogybXJtXN0YXRpY1ZpZXdRdWVyeSwKICAgICfJtcm1c3RhdGljQ29udGVudFF1ZXJ5JzogybXJtXN0YXRpY0NvbnRlbnRRdWVyeSwKICAgICfJtcm1bG9hZFF1ZXJ5JzogybXJtWxvYWRRdWVyeSwKICAgICfJtcm1Y29udGVudFF1ZXJ5JzogybXJtWNvbnRlbnRRdWVyeSwKICAgICfJtcm1cmVmZXJlbmNlJzogybXJtXJlZmVyZW5jZSwKICAgICfJtcm1Y2xhc3NNYXAnOiDJtcm1Y2xhc3NNYXAsCiAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUxJzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUxLAogICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlMic6IMm1ybVjbGFzc01hcEludGVycG9sYXRlMiwKICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTMnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTMsCiAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0JzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0LAogICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlNSc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlNSwKICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTYnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTYsCiAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3JzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3LAogICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlOCc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlOCwKICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYsCiAgICAnybXJtXN0eWxlTWFwJzogybXJtXN0eWxlTWFwLAogICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlMSc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlMSwKICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTInOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIsCiAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUzJzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUzLAogICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlNCc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlNCwKICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUnOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUsCiAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2JzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2LAogICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlNyc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlNywKICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgnOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgsCiAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGVWJzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGVWLAogICAgJ8m1ybVzdHlsZVByb3AnOiDJtcm1c3R5bGVQcm9wLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTInOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUzLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTUnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU2LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTcnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTgnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU4LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGVWLAogICAgJ8m1ybVzdHlsZVNhbml0aXplcic6IMm1ybVzdHlsZVNhbml0aXplciwKICAgICfJtcm1Y2xhc3NQcm9wJzogybXJtWNsYXNzUHJvcCwKICAgICfJtcm1c2VsZWN0JzogybXJtXNlbGVjdCwKICAgICfJtcm1YWR2YW5jZSc6IMm1ybVhZHZhbmNlLAogICAgJ8m1ybV0ZW1wbGF0ZSc6IMm1ybV0ZW1wbGF0ZSwKICAgICfJtcm1dGV4dCc6IMm1ybV0ZXh0LAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGUnOiDJtcm1dGV4dEludGVycG9sYXRlLAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGUxJzogybXJtXRleHRJbnRlcnBvbGF0ZTEsCiAgICAnybXJtXRleHRJbnRlcnBvbGF0ZTInOiDJtcm1dGV4dEludGVycG9sYXRlMiwKICAgICfJtcm1dGV4dEludGVycG9sYXRlMyc6IMm1ybV0ZXh0SW50ZXJwb2xhdGUzLAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGU0JzogybXJtXRleHRJbnRlcnBvbGF0ZTQsCiAgICAnybXJtXRleHRJbnRlcnBvbGF0ZTUnOiDJtcm1dGV4dEludGVycG9sYXRlNSwKICAgICfJtcm1dGV4dEludGVycG9sYXRlNic6IMm1ybV0ZXh0SW50ZXJwb2xhdGU2LAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGU3JzogybXJtXRleHRJbnRlcnBvbGF0ZTcsCiAgICAnybXJtXRleHRJbnRlcnBvbGF0ZTgnOiDJtcm1dGV4dEludGVycG9sYXRlOCwKICAgICfJtcm1dGV4dEludGVycG9sYXRlVic6IMm1ybV0ZXh0SW50ZXJwb2xhdGVWLAogICAgJ8m1ybVlbWJlZGRlZFZpZXdTdGFydCc6IMm1ybVlbWJlZGRlZFZpZXdTdGFydCwKICAgICfJtcm1ZW1iZWRkZWRWaWV3RW5kJzogybXJtWVtYmVkZGVkVmlld0VuZCwKICAgICfJtcm1aTE4bic6IMm1ybVpMThuLAogICAgJ8m1ybVpMThuQXR0cmlidXRlcyc6IMm1ybVpMThuQXR0cmlidXRlcywKICAgICfJtcm1aTE4bkV4cCc6IMm1ybVpMThuRXhwLAogICAgJ8m1ybVpMThuU3RhcnQnOiDJtcm1aTE4blN0YXJ0LAogICAgJ8m1ybVpMThuRW5kJzogybXJtWkxOG5FbmQsCiAgICAnybXJtWkxOG5BcHBseSc6IMm1ybVpMThuQXBwbHksCiAgICAnybXJtWkxOG5Qb3N0cHJvY2Vzcyc6IMm1ybVpMThuUG9zdHByb2Nlc3MsCiAgICAnybXJtXJlc29sdmVXaW5kb3cnOiDJtcm1cmVzb2x2ZVdpbmRvdywKICAgICfJtcm1cmVzb2x2ZURvY3VtZW50JzogybXJtXJlc29sdmVEb2N1bWVudCwKICAgICfJtcm1cmVzb2x2ZUJvZHknOiDJtcm1cmVzb2x2ZUJvZHksCiAgICAnybXJtXNldENvbXBvbmVudFNjb3BlJzogybXJtXNldENvbXBvbmVudFNjb3BlLAogICAgJ8m1ybVzZXROZ01vZHVsZVNjb3BlJzogybXJtXNldE5nTW9kdWxlU2NvcGUsCiAgICAnybXJtXNhbml0aXplSHRtbCc6IMm1ybVzYW5pdGl6ZUh0bWwsCiAgICAnybXJtXNhbml0aXplU3R5bGUnOiDJtcm1c2FuaXRpemVTdHlsZSwKICAgICfJtcm1ZGVmYXVsdFN0eWxlU2FuaXRpemVyJzogybXJtWRlZmF1bHRTdHlsZVNhbml0aXplciwKICAgICfJtcm1c2FuaXRpemVSZXNvdXJjZVVybCc6IMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsLAogICAgJ8m1ybVzYW5pdGl6ZVNjcmlwdCc6IMm1ybVzYW5pdGl6ZVNjcmlwdCwKICAgICfJtcm1c2FuaXRpemVVcmwnOiDJtcm1c2FuaXRpemVVcmwsCiAgICAnybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCc6IMm1ybVzYW5pdGl6ZVVybE9yUmVzb3VyY2VVcmwsCn0pOwovKioKICogQSBtYXBwaW5nIG9mIHRoZSBcQGFuZ3VsYXIvY29yZSBBUEkgc3VyZmFjZSB1c2VkIGluIGdlbmVyYXRlZCBleHByZXNzaW9ucyB0byB0aGUgYWN0dWFsIHN5bWJvbHMuCiAqCiAqIFRoaXMgc2hvdWxkIGJlIGtlcHQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBwdWJsaWMgZXhwb3J0cyBvZiBcQGFuZ3VsYXIvY29yZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBhbmd1bGFyQ29yZUVudiA9ICgoybUwJGQpKSgpOwovKiogQHR5cGUgez99ICovCmxldCBqaXRPcHRpb25zID0gbnVsbDsKLyoqCiAqIEBwYXJhbSB7P30gb3B0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0Sml0T3B0aW9ucyhvcHRpb25zKSB7CiAgICBpZiAoaml0T3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRFbmNhcHN1bGF0aW9uICE9PSBqaXRPcHRpb25zLmRlZmF1bHRFbmNhcHN1bGF0aW9uKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgdmFsdWUgZm9yIGBkZWZhdWx0RW5jYXBzdWxhdGlvbmAgY2FuIG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXQgaGFzIGJlZW4gc2V0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXMgIT09IGppdE9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlcykgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIHZhbHVlIGZvciBgcHJlc2VydmVXaGl0ZXNwYWNlc2AgY2FuIG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXQgaGFzIGJlZW4gc2V0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaml0T3B0aW9ucyA9IG9wdGlvbnM7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRKaXRPcHRpb25zKCkgewogICAgcmV0dXJuIGppdE9wdGlvbnM7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaml0L21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IEVNUFRZX0FSUkFZJDUgPSBbXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBtb2R1bGVRdWV1ZSA9IFtdOwovKioKICogRW5xdWV1ZXMgbW9kdWxlRGVmIHRvIGJlIGNoZWNrZWQgbGF0ZXIgdG8gc2VlIGlmIHNjb3BlIGNhbiBiZSBzZXQgb24gaXRzCiAqIGNvbXBvbmVudCBkZWNsYXJhdGlvbnMuCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcGFyYW0gez99IG5nTW9kdWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbnF1ZXVlTW9kdWxlRm9yRGVsYXllZFNjb3BpbmcobW9kdWxlVHlwZSwgbmdNb2R1bGUpIHsKICAgIG1vZHVsZVF1ZXVlLnB1c2goeyBtb2R1bGVUeXBlLCBuZ01vZHVsZSB9KTsKfQovKiogQHR5cGUgez99ICovCmxldCBmbHVzaGluZ01vZHVsZVF1ZXVlID0gZmFsc2U7Ci8qKgogKiBMb29wcyBvdmVyIHF1ZXVlZCBtb2R1bGUgZGVmaW5pdGlvbnMsIGlmIGEgZ2l2ZW4gbW9kdWxlIGRlZmluaXRpb24gaGFzIGFsbCBvZiBpdHMKICogZGVjbGFyYXRpb25zIHJlc29sdmVkLCBpdCBkZXF1ZXVlcyB0aGF0IG1vZHVsZSBkZWZpbml0aW9uIGFuZCBzZXRzIHRoZSBzY29wZSBvbgogKiBpdHMgZGVjbGFyYXRpb25zLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlKCkgewogICAgaWYgKCFmbHVzaGluZ01vZHVsZVF1ZXVlKSB7CiAgICAgICAgZmx1c2hpbmdNb2R1bGVRdWV1ZSA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1vZHVsZVF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IG1vZHVsZVR5cGUsIG5nTW9kdWxlIH0gPSBtb2R1bGVRdWV1ZVtpXTsKICAgICAgICAgICAgICAgIGlmIChuZ01vZHVsZS5kZWNsYXJhdGlvbnMgJiYgbmdNb2R1bGUuZGVjbGFyYXRpb25zLmV2ZXJ5KGlzUmVzb2x2ZWREZWNsYXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBkZXF1ZXVlCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUXVldWUuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgIHNldFNjb3BlT25EZWNsYXJlZENvbXBvbmVudHMobW9kdWxlVHlwZSwgbmdNb2R1bGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBmbHVzaGluZ01vZHVsZVF1ZXVlID0gZmFsc2U7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBSZXR1cm5zIHRydXRoeSBpZiBhIGRlY2xhcmF0aW9uIGhhcyByZXNvbHZlZC4gSWYgdGhlIGRlY2xhcmF0aW9uIGhhcHBlbnMgdG8gYmUKICogYW4gYXJyYXkgb2YgZGVjbGFyYXRpb25zLCBpdCB3aWxsIHJlY3Vyc2UgdG8gY2hlY2sgZWFjaCBkZWNsYXJhdGlvbiBpbiB0aGF0IGFycmF5CiAqICh3aGljaCBtYXkgYWxzbyBiZSBhcnJheXMpLgogKiBAcGFyYW0gez99IGRlY2xhcmF0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1Jlc29sdmVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uKSkgewogICAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5ldmVyeShpc1Jlc29sdmVkRGVjbGFyYXRpb24pOwogICAgfQogICAgcmV0dXJuICEhcmVzb2x2ZUZvcndhcmRSZWYoZGVjbGFyYXRpb24pOwp9Ci8qKgogKiBDb21waWxlcyBhIG1vZHVsZSBpbiBKSVQgbW9kZS4KICoKICogVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGdldHMgY2FsbGVkIHdoZW4gYSBjbGFzcyBoYXMgYSBgXEBOZ01vZHVsZWAgZGVjb3JhdG9yLgogKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICogQHBhcmFtIHs/PX0gbmdNb2R1bGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZShtb2R1bGVUeXBlLCBuZ01vZHVsZSA9IHt9KSB7CiAgICBjb21waWxlTmdNb2R1bGVEZWZzKCgvKiogQHR5cGUgez99ICovIChtb2R1bGVUeXBlKSksIG5nTW9kdWxlKTsKICAgIC8vIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbGwgZGVjbGFyYXRpb25zIGhhdmUgcmVzb2x2ZWQgeWV0IGF0IHRoZSBtb21lbnQgdGhlCiAgICAvLyBOZ01vZHVsZSBkZWNvcmF0b3IgaXMgZXhlY3V0aW5nLCB3ZSdyZSBlbnF1ZXVlaW5nIHRoZSBzZXR0aW5nIG9mIG1vZHVsZSBzY29wZQogICAgLy8gb24gaXRzIGRlY2xhcmF0aW9ucyB0byBiZSBydW4gYXQgYSBsYXRlciB0aW1lIHdoZW4gYWxsIGRlY2xhcmF0aW9ucyBmb3IgdGhlIG1vZHVsZSwKICAgIC8vIGluY2x1ZGluZyBmb3J3YXJkIHJlZnMsIGhhdmUgcmVzb2x2ZWQuCiAgICBlbnF1ZXVlTW9kdWxlRm9yRGVsYXllZFNjb3BpbmcobW9kdWxlVHlwZSwgbmdNb2R1bGUpOwp9Ci8qKgogKiBDb21waWxlcyBhbmQgYWRkcyB0aGUgYMm1bW9kYCBhbmQgYMm1aW5qYCBwcm9wZXJ0aWVzIHRvIHRoZSBtb2R1bGUgY2xhc3MuCiAqCiAqIEl0J3MgcG9zc2libGUgdG8gY29tcGlsZSBhIG1vZHVsZSB2aWEgdGhpcyBBUEkgd2hpY2ggd2lsbCBhbGxvdyBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIGluIGl0cwogKiByb290LgogKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICogQHBhcmFtIHs/fSBuZ01vZHVsZQogKiBAcGFyYW0gez89fSBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcGlsZU5nTW9kdWxlRGVmcyhtb2R1bGVUeXBlLCBuZ01vZHVsZSwgYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QgPSBmYWxzZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobW9kdWxlVHlwZSwgJ1JlcXVpcmVkIHZhbHVlIG1vZHVsZVR5cGUnKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKG5nTW9kdWxlLCAnUmVxdWlyZWQgdmFsdWUgbmdNb2R1bGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGZsYXR0ZW4obmdNb2R1bGUuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZJDUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nTW9kdWxlRGVmID0gbnVsbDsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGVUeXBlLCBOR19NT0RfREVGLCB7CiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdNb2R1bGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUgJiYgbmdNb2R1bGUuaW1wb3J0cyAmJiBuZ01vZHVsZS5pbXBvcnRzLmluZGV4T2YobW9kdWxlVHlwZSkgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYXNzZXJ0IHRoaXMgaW1tZWRpYXRlbHksIGJlY2F1c2UgYWxsb3dpbmcgaXQgdG8gY29udGludWUgd2lsbCBjYXVzZSBpdCB0bwogICAgICAgICAgICAgICAgICAgIC8vIGdvIGludG8gYW4gaW5maW5pdGUgbG9vcCBiZWZvcmUgd2UndmUgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgd2UgdGhyb3cgYWxsIHRoZSBlcnJvcnMuCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtzdHJpbmdpZnlGb3JFcnJvcihtb2R1bGVUeXBlKX0nIG1vZHVsZSBjYW4ndCBpbXBvcnQgaXRzZWxmYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZ01vZHVsZURlZiA9IGdldENvbXBpbGVyRmFjYWRlKCkuY29tcGlsZU5nTW9kdWxlKGFuZ3VsYXJDb3JlRW52LCBgbmc6Ly8vJHttb2R1bGVUeXBlLm5hbWV9L8m1bW9kLmpzYCwgewogICAgICAgICAgICAgICAgICAgIHR5cGU6IG1vZHVsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwOiBmbGF0dGVuKG5nTW9kdWxlLmJvb3RzdHJhcCB8fCBFTVBUWV9BUlJBWSQ1KS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogZGVjbGFyYXRpb25zLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogZmxhdHRlbihuZ01vZHVsZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZXhwYW5kTW9kdWxlV2l0aFByb3ZpZGVycyksCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogZmxhdHRlbihuZ01vZHVsZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZXhwYW5kTW9kdWxlV2l0aFByb3ZpZGVycyksCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hczogbmdNb2R1bGUuc2NoZW1hcyA/IGZsYXR0ZW4obmdNb2R1bGUuc2NoZW1hcykgOiBudWxsLAogICAgICAgICAgICAgICAgICAgIGlkOiBuZ01vZHVsZS5pZCB8fCBudWxsLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBTZXQgYHNjaGVtYXNgIG9uIG5nTW9kdWxlRGVmIHRvIGFuIGVtcHR5IGFycmF5IGluIEpJVCBtb2RlIHRvIGluZGljYXRlIHRoYXQgcnVudGltZQogICAgICAgICAgICAgICAgLy8gc2hvdWxkIHZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyB1bmtub3duIGVsZW1lbnRzIGluIGEgdGVtcGxhdGUuIEluIEFPVCBtb2RlLCB0aGF0IGNoZWNrCiAgICAgICAgICAgICAgICAvLyBoYXBwZW5zIGF0IGNvbXBpbGUgdGltZSBhbmQgYHNjaGVtYXNgIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50IG9uIENvbXBvbmVudCBhbmQgTW9kdWxlCiAgICAgICAgICAgICAgICAvLyBkZWZzIGFmdGVyIGNvbXBpbGF0aW9uIChzbyB0aGUgY2hlY2sgZG9lc24ndCBoYXBwZW4gdGhlIHNlY29uZCB0aW1lIGF0IHJ1bnRpbWUpLgogICAgICAgICAgICAgICAgaWYgKCFuZ01vZHVsZURlZi5zY2hlbWFzKSB7CiAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVEZWYuc2NoZW1hcyA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZ01vZHVsZURlZjsKICAgICAgICB9KQogICAgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmdJbmplY3RvckRlZiA9IG51bGw7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlVHlwZSwgTkdfSU5KX0RFRiwgewogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdJbmplY3RvckRlZiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZURlZigoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZVR5cGUpKSkpLCBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZVR5cGUubmFtZSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiBtb2R1bGVUeXBlLAogICAgICAgICAgICAgICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXMobW9kdWxlVHlwZSksCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBuZ01vZHVsZS5wcm92aWRlcnMgfHwgRU1QVFlfQVJSQVkkNSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZHVsZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZHVsZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBuZ0luamVjdG9yRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlSW5qZWN0b3IoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke21vZHVsZVR5cGUubmFtZX0vybVpbmouanNgLCBtZXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmdJbmplY3RvckRlZjsKICAgICAgICB9KSwKICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0cwogICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICB9KTsKfQovKioKICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAqIEBwYXJhbSB7P30gYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QKICogQHBhcmFtIHs/PX0gaW1wb3J0aW5nTW9kdWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKG1vZHVsZVR5cGUsIGFsbG93RHVwbGljYXRlRGVjbGFyYXRpb25zSW5Sb290LCBpbXBvcnRpbmdNb2R1bGUpIHsKICAgIGlmICh2ZXJpZmllZE5nTW9kdWxlLmdldChtb2R1bGVUeXBlKSkKICAgICAgICByZXR1cm47CiAgICB2ZXJpZmllZE5nTW9kdWxlLnNldChtb2R1bGVUeXBlLCB0cnVlKTsKICAgIG1vZHVsZVR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZihtb2R1bGVUeXBlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ01vZHVsZURlZjsKICAgIGlmIChpbXBvcnRpbmdNb2R1bGUpIHsKICAgICAgICBuZ01vZHVsZURlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXROZ01vZHVsZURlZihtb2R1bGVUeXBlKSkpOwogICAgICAgIGlmICghbmdNb2R1bGVEZWYpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlICcke21vZHVsZVR5cGUubmFtZX0nIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJyR7aW1wb3J0aW5nTW9kdWxlLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBuZ01vZHVsZURlZiA9IGdldE5nTW9kdWxlRGVmKG1vZHVsZVR5cGUsIHRydWUpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJyb3JzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBtYXliZVVud3JhcEZuKG5nTW9kdWxlRGVmLmRlY2xhcmF0aW9ucyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbXBvcnRzID0gbWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5pbXBvcnRzKTsKICAgIGZsYXR0ZW4oaW1wb3J0cykubWFwKHVud3JhcE1vZHVsZVdpdGhQcm92aWRlcnNJbXBvcnRzKS5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gbW9kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtb2QgPT4gewogICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVJbXBvcnQobW9kLCBtb2R1bGVUeXBlKTsKICAgICAgICB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKG1vZCwgZmFsc2UsIG1vZHVsZVR5cGUpOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXhwb3J0cyA9IG1heWJlVW53cmFwRm4obmdNb2R1bGVEZWYuZXhwb3J0cyk7CiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlEZWNsYXJhdGlvbnNIYXZlRGVmaW5pdGlvbnMpOwogICAgZGVjbGFyYXRpb25zLmZvckVhY2godmVyaWZ5RGlyZWN0aXZlc0hhdmVTZWxlY3Rvcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21iaW5lZERlY2xhcmF0aW9ucyA9IFsKICAgICAgICAuLi5kZWNsYXJhdGlvbnMubWFwKHJlc29sdmVGb3J3YXJkUmVmKSwKICAgICAgICAuLi5mbGF0dGVuKGltcG9ydHMubWFwKGNvbXB1dGVDb21iaW5lZEV4cG9ydHMpKS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgXTsKICAgIGV4cG9ydHMuZm9yRWFjaCh2ZXJpZnlFeHBvcnRzQXJlRGVjbGFyZWRPclJlRXhwb3J0ZWQpOwogICAgZGVjbGFyYXRpb25zLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWNsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZWNsID0+IHZlcmlmeURlY2xhcmF0aW9uSXNVbmlxdWUoZGVjbCwgYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QpKSk7CiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nTW9kdWxlID0gZ2V0QW5ub3RhdGlvbihtb2R1bGVUeXBlLCAnTmdNb2R1bGUnKTsKICAgIGlmIChuZ01vZHVsZSkgewogICAgICAgIG5nTW9kdWxlLmltcG9ydHMgJiYKICAgICAgICAgICAgZmxhdHRlbihuZ01vZHVsZS5pbXBvcnRzKS5tYXAodW53cmFwTW9kdWxlV2l0aFByb3ZpZGVyc0ltcG9ydHMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG1vZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbW9kID0+IHsKICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVJbXBvcnQobW9kLCBtb2R1bGVUeXBlKTsKICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYobW9kLCBmYWxzZSwgbW9kdWxlVHlwZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICBuZ01vZHVsZS5ib290c3RyYXAgJiYgZGVlcEZvckVhY2gobmdNb2R1bGUuYm9vdHN0cmFwLCB2ZXJpZnlDb3JyZWN0Qm9vdHN0cmFwVHlwZSk7CiAgICAgICAgbmdNb2R1bGUuYm9vdHN0cmFwICYmIGRlZXBGb3JFYWNoKG5nTW9kdWxlLmJvb3RzdHJhcCwgdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7CiAgICAgICAgbmdNb2R1bGUuZW50cnlDb21wb25lbnRzICYmCiAgICAgICAgICAgIGRlZXBGb3JFYWNoKG5nTW9kdWxlLmVudHJ5Q29tcG9uZW50cywgdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7CiAgICB9CiAgICAvLyBUaHJvdyBFcnJvciBpZiBhbnkgZXJyb3JzIHdlcmUgZGV0ZWN0ZWQuCiAgICBpZiAoZXJyb3JzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnMuam9pbignXG4nKSk7CiAgICB9CiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlEZWNsYXJhdGlvbnNIYXZlRGVmaW5pdGlvbnModHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHx8IGdldERpcmVjdGl2ZURlZih0eXBlKSB8fCBnZXRQaXBlRGVmKHR5cGUpOwogICAgICAgIGlmICghZGVmKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBVbmV4cGVjdGVkIHZhbHVlICcke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfScgZGVjbGFyZWQgYnkgdGhlIG1vZHVsZSAnJHtzdHJpbmdpZnlGb3JFcnJvcihtb2R1bGVUeXBlKX0nLiBQbGVhc2UgYWRkIGEgQFBpcGUvQERpcmVjdGl2ZS9AQ29tcG9uZW50IGFubm90YXRpb24uYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHZlcmlmeURpcmVjdGl2ZXNIYXZlU2VsZWN0b3IodHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gZ2V0RGlyZWN0aXZlRGVmKHR5cGUpOwogICAgICAgIGlmICghZ2V0Q29tcG9uZW50RGVmKHR5cGUpICYmIGRlZiAmJiBkZWYuc2VsZWN0b3JzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBEaXJlY3RpdmUgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gaGFzIG5vIHNlbGVjdG9yLCBwbGVhc2UgYWRkIGl0IWApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlFeHBvcnRzQXJlRGVjbGFyZWRPclJlRXhwb3J0ZWQodHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2luZCA9IGdldENvbXBvbmVudERlZih0eXBlKSAmJiAnY29tcG9uZW50JyB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkgJiYgJ2RpcmVjdGl2ZScgfHwKICAgICAgICAgICAgZ2V0UGlwZURlZih0eXBlKSAmJiAncGlwZSc7CiAgICAgICAgaWYgKGtpbmQpIHsKICAgICAgICAgICAgLy8gb25seSBjaGVja2VkIGlmIHdlIGFyZSBkZWNsYXJlZCBhcyBDb21wb25lbnQsIERpcmVjdGl2ZSwgb3IgUGlwZQogICAgICAgICAgICAvLyBNb2R1bGVzIGRvbid0IG5lZWQgdG8gYmUgZGVjbGFyZWQgb3IgaW1wb3J0ZWQuCiAgICAgICAgICAgIGlmIChjb21iaW5lZERlY2xhcmF0aW9ucy5sYXN0SW5kZXhPZih0eXBlKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBvcnRpbmcgc29tZXRoaW5nIHdoaWNoIHdlIGRvbid0IGV4cGxpY2l0bHkgZGVjbGFyZSBvciBpbXBvcnQuCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgQ2FuJ3QgZXhwb3J0ICR7a2luZH0gJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gZnJvbSAke3N0cmluZ2lmeUZvckVycm9yKG1vZHVsZVR5cGUpfSBhcyBpdCB3YXMgbmVpdGhlciBkZWNsYXJlZCBub3IgaW1wb3J0ZWQhYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBzdXBwcmVzc0Vycm9ycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5RGVjbGFyYXRpb25Jc1VuaXF1ZSh0eXBlLCBzdXBwcmVzc0Vycm9ycykgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXhpc3RpbmdNb2R1bGUgPSBvd25lck5nTW9kdWxlLmdldCh0eXBlKTsKICAgICAgICBpZiAoZXhpc3RpbmdNb2R1bGUgJiYgZXhpc3RpbmdNb2R1bGUgIT09IG1vZHVsZVR5cGUpIHsKICAgICAgICAgICAgaWYgKCFzdXBwcmVzc0Vycm9ycykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtleGlzdGluZ01vZHVsZSwgbW9kdWxlVHlwZV0ubWFwKHN0cmluZ2lmeUZvckVycm9yKS5zb3J0KCk7CiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgVHlwZSAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBpcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbnMgb2YgMiBtb2R1bGVzOiAke21vZHVsZXNbMF19IGFuZCAke21vZHVsZXNbMV19ISBgICsKICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIGNvbnNpZGVyIG1vdmluZyAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSB0byBhIGhpZ2hlciBtb2R1bGUgdGhhdCBpbXBvcnRzICR7bW9kdWxlc1swXX0gYW5kICR7bW9kdWxlc1sxXX0uIGAgKwogICAgICAgICAgICAgICAgICAgIGBZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gdGhlbiBpbXBvcnQgdGhhdCBOZ01vZHVsZSBpbiAke21vZHVsZXNbMF19IGFuZCAke21vZHVsZXNbMV19LmApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBNYXJrIHR5cGUgYXMgaGF2aW5nIG93bmVyLgogICAgICAgICAgICBvd25lck5nTW9kdWxlLnNldCh0eXBlLCBtb2R1bGVUeXBlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSh0eXBlKSB7CiAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleGlzdGluZ01vZHVsZSA9IG93bmVyTmdNb2R1bGUuZ2V0KHR5cGUpOwogICAgICAgIGlmICghZXhpc3RpbmdNb2R1bGUpIHsKICAgICAgICAgICAgZXJyb3JzLnB1c2goYENvbXBvbmVudCAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBpcyBub3QgcGFydCBvZiBhbnkgTmdNb2R1bGUgb3IgdGhlIG1vZHVsZSBoYXMgbm90IGJlZW4gaW1wb3J0ZWQgaW50byB5b3VyIG1vZHVsZS5gKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5Q29ycmVjdEJvb3RzdHJhcFR5cGUodHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICBpZiAoIWdldENvbXBvbmVudERlZih0eXBlKSkgewogICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gY2Fubm90IGJlIHVzZWQgYXMgYW4gZW50cnkgY29tcG9uZW50LmApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKHR5cGUpIHsKICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgaWYgKGdldENvbXBvbmVudERlZih0eXBlKSkgewogICAgICAgICAgICAvLyBXZSBrbm93IHdlIGFyZSBjb21wb25lbnQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBnZXRBbm5vdGF0aW9uKHR5cGUsICdDb21wb25lbnQnKTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuZW50cnlDb21wb25lbnRzKSB7CiAgICAgICAgICAgICAgICBkZWVwRm9yRWFjaChjb21wb25lbnQuZW50cnlDb21wb25lbnRzLCB2ZXJpZnlDb21wb25lbnRJc1BhcnRPZk5nTW9kdWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IGltcG9ydGluZ01vZHVsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZUltcG9ydCh0eXBlLCBpbXBvcnRpbmdNb2R1bGUpIHsKICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgaWYgKGdldENvbXBvbmVudERlZih0eXBlKSB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRpcmVjdGl2ZSAnJHt0eXBlLm5hbWV9JyBpbXBvcnRlZCBieSB0aGUgbW9kdWxlICcke2ltcG9ydGluZ01vZHVsZS5uYW1lfScuIFBsZWFzZSBhZGQgYW4gQE5nTW9kdWxlIGFubm90YXRpb24uYCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRQaXBlRGVmKHR5cGUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBwaXBlICcke3R5cGUubmFtZX0nIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJyR7aW1wb3J0aW5nTW9kdWxlLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZU9yV2l0aFByb3ZpZGVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdW53cmFwTW9kdWxlV2l0aFByb3ZpZGVyc0ltcG9ydHModHlwZU9yV2l0aFByb3ZpZGVycykgewogICAgdHlwZU9yV2l0aFByb3ZpZGVycyA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGVPcldpdGhQcm92aWRlcnMpOwogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZU9yV2l0aFByb3ZpZGVycykpKS5uZ01vZHVsZSB8fCB0eXBlT3JXaXRoUHJvdmlkZXJzOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRBbm5vdGF0aW9uKHR5cGUsIG5hbWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBhbm5vdGF0aW9uID0gbnVsbDsKICAgIGNvbGxlY3QodHlwZS5fX2Fubm90YXRpb25zX18pOwogICAgY29sbGVjdCh0eXBlLmRlY29yYXRvcnMpOwogICAgcmV0dXJuIGFubm90YXRpb247CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbGxlY3QoYW5ub3RhdGlvbnMpIHsKICAgICAgICBpZiAoYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgYW5ub3RhdGlvbnMuZm9yRWFjaChyZWFkQW5ub3RhdGlvbik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlY29yYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVhZEFubm90YXRpb24oZGVjb3JhdG9yKSB7CiAgICAgICAgaWYgKCFhbm5vdGF0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZGVjb3JhdG9yKTsKICAgICAgICAgICAgaWYgKHByb3RvLm5nTWV0YWRhdGFOYW1lID09IG5hbWUpIHsKICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVjb3JhdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGVjb3JhdG9yLnR5cGUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRlY29yYXRvci50eXBlKTsKICAgICAgICAgICAgICAgIGlmIChwcm90by5uZ01ldGFkYXRhTmFtZSA9PSBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGRlY29yYXRvci5hcmdzWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBLZWVwIHRyYWNrIG9mIGNvbXBpbGVkIGNvbXBvbmVudHMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gdGVzdHMgd2Ugb2Z0ZW4gd2FudCB0byBjb21waWxlIHRoZQogKiBzYW1lIGNvbXBvbmVudCB3aXRoIG1vcmUgdGhhbiBvbmUgTmdNb2R1bGUuIFRoaXMgd291bGQgY2F1c2UgYW4gZXJyb3IgdW5sZXNzIHdlIHJlc2V0IHdoaWNoCiAqIE5nTW9kdWxlIHRoZSBjb21wb25lbnQgYmVsb25ncyB0by4gV2Uga2VlcCB0aGUgbGlzdCBvZiBjb21waWxlZCBjb21wb25lbnRzIGhlcmUgc28gdGhhdCB0aGUKICogVGVzdEJlZCBjYW4gcmVzZXQgaXQgbGF0ZXIuCiAqIEB0eXBlIHs/fQogKi8KbGV0IG93bmVyTmdNb2R1bGUgPSBuZXcgTWFwKCk7Ci8qKiBAdHlwZSB7P30gKi8KbGV0IHZlcmlmaWVkTmdNb2R1bGUgPSBuZXcgTWFwKCk7Ci8qKgogKiBDb21wdXRlcyB0aGUgY29tYmluZWQgZGVjbGFyYXRpb25zIG9mIGV4cGxpY2l0IGRlY2xhcmF0aW9ucywgYXMgd2VsbCBhcyBkZWNsYXJhdGlvbnMgaW5oZXJpdGVkIGJ5CiAqIHRyYXZlcnNpbmcgdGhlIGV4cG9ydHMgb2YgaW1wb3J0ZWQgbW9kdWxlcy4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21wdXRlQ29tYmluZWRFeHBvcnRzKHR5cGUpIHsKICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYodHlwZSwgdHJ1ZSk7CiAgICByZXR1cm4gWy4uLmZsYXR0ZW4obWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5leHBvcnRzKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHR5cGUpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZ01vZHVsZURlZiA9IGdldE5nTW9kdWxlRGVmKHR5cGUpOwogICAgICAgICAgICBpZiAobmdNb2R1bGVEZWYpIHsKICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVDb21iaW5lZEV4cG9ydHModHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0pKSldOwp9Ci8qKgogKiBTb21lIGRlY2xhcmVkIGNvbXBvbmVudHMgbWF5IGJlIGNvbXBpbGVkIGFzeW5jaHJvbm91c2x5LCBhbmQgdGh1cyBtYXkgbm90IGhhdmUgdGhlaXIKICogybVjbXAgc2V0IHlldC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIGlzIHdyaXR0ZW4gaW50bwogKiB0aGUgYG5nU2VsZWN0b3JTY29wZWAgcHJvcGVydHkgb2YgdGhlIGRlY2xhcmVkIHR5cGUuCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcGFyYW0gez99IG5nTW9kdWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRTY29wZU9uRGVjbGFyZWRDb21wb25lbnRzKG1vZHVsZVR5cGUsIG5nTW9kdWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBmbGF0dGVuKG5nTW9kdWxlLmRlY2xhcmF0aW9ucyB8fCBFTVBUWV9BUlJBWSQ1KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRyYW5zaXRpdmVTY29wZXMgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKG1vZHVsZVR5cGUpOwogICAgZGVjbGFyYXRpb25zLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVjbGFyYXRpb24gPT4gewogICAgICAgIGlmIChkZWNsYXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShOR19DT01QX0RFRikpIHsKICAgICAgICAgICAgLy8gQSBgybVjbXBgIGZpZWxkIGV4aXN0cyAtIGdvIGFoZWFkIGFuZCBwYXRjaCB0aGUgY29tcG9uZW50IGRpcmVjdGx5LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbikpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXRDb21wb25lbnREZWYoY29tcG9uZW50KSkpOwogICAgICAgICAgICBwYXRjaENvbXBvbmVudERlZldpdGhTY29wZShjb21wb25lbnREZWYsIHRyYW5zaXRpdmVTY29wZXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghZGVjbGFyYXRpb24uaGFzT3duUHJvcGVydHkoTkdfRElSX0RFRikgJiYgIWRlY2xhcmF0aW9uLmhhc093blByb3BlcnR5KE5HX1BJUEVfREVGKSkgewogICAgICAgICAgICAvLyBTZXQgYG5nU2VsZWN0b3JTY29wZWAgZm9yIGZ1dHVyZSByZWZlcmVuY2Ugd2hlbiB0aGUgY29tcG9uZW50IGNvbXBpbGF0aW9uIGZpbmlzaGVzLgogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmF0aW9uKSkpLm5nU2VsZWN0b3JTY29wZSA9IG1vZHVsZVR5cGU7CiAgICAgICAgfQogICAgfSkpOwp9Ci8qKgogKiBQYXRjaCB0aGUgZGVmaW5pdGlvbiBvZiBhIGNvbXBvbmVudCB3aXRoIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGZyb20gdGhlIGNvbXBpbGF0aW9uIHNjb3BlIG9mCiAqIGEgZ2l2ZW4gbW9kdWxlLgogKiBAdGVtcGxhdGUgQwogKiBAcGFyYW0gez99IGNvbXBvbmVudERlZgogKiBAcGFyYW0gez99IHRyYW5zaXRpdmVTY29wZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhdGNoQ29tcG9uZW50RGVmV2l0aFNjb3BlKGNvbXBvbmVudERlZiwgdHJhbnNpdGl2ZVNjb3BlcykgewogICAgY29tcG9uZW50RGVmLmRpcmVjdGl2ZURlZnMgPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBBcnJheS5mcm9tKHRyYW5zaXRpdmVTY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcykKICAgICAgICAubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXIgPT4gZGlyLmhhc093blByb3BlcnR5KE5HX0NPTVBfREVGKSA/ICgvKiogQHR5cGUgez99ICovIChnZXRDb21wb25lbnREZWYoZGlyKSkpIDogKC8qKiBAdHlwZSB7P30gKi8gKGdldERpcmVjdGl2ZURlZihkaXIpKSkpKQogICAgICAgIC5maWx0ZXIoKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlZiA9PiAhIWRlZikpKTsKICAgIGNvbXBvbmVudERlZi5waXBlRGVmcyA9ICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IEFycmF5LmZyb20odHJhbnNpdGl2ZVNjb3Blcy5jb21waWxhdGlvbi5waXBlcykubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcGlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGlwZSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0UGlwZURlZihwaXBlKSkpKSkpOwogICAgY29tcG9uZW50RGVmLnNjaGVtYXMgPSB0cmFuc2l0aXZlU2NvcGVzLnNjaGVtYXM7CiAgICAvLyBTaW5jZSB3ZSBhdm9pZCBDb21wb25lbnRzL0RpcmVjdGl2ZXMvUGlwZXMgcmVjb21waWxpbmcgaW4gY2FzZSB0aGVyZSBhcmUgbm8gb3ZlcnJpZGVzLCB3ZQogICAgLy8gbWF5IGZhY2UgYSBwcm9ibGVtIHdoZXJlIHByZXZpb3VzbHkgY29tcGlsZWQgZGVmcyBhdmFpbGFibGUgdG8gYSBnaXZlbiBDb21wb25lbnQvRGlyZWN0aXZlCiAgICAvLyBhcmUgY2FjaGVkIGluIFRWaWV3IGFuZCBtYXkgYmVjb21lIHN0YWxlIChpbiBjYXNlIGFueSBvZiB0aGVzZSBkZWZzIGdldHMgcmVjb21waWxlZCkuIEluCiAgICAvLyBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGZvcmNlIGZyZXNoIFRWaWV3IHRvIGJlIGNyZWF0ZWQuCiAgICBjb21wb25lbnREZWYudFZpZXcgPSBudWxsOwp9Ci8qKgogKiBDb21wdXRlIHRoZSBwYWlyIG9mIHRyYW5zaXRpdmUgc2NvcGVzIChjb21waWxhdGlvbiBzY29wZSBhbmQgZXhwb3J0ZWQgc2NvcGUpIGZvciBhIGdpdmVuIG1vZHVsZS4KICoKICogVGhpcyBvcGVyYXRpb24gaXMgbWVtb2l6ZWQgYW5kIHRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBtb2R1bGUncyBkZWZpbml0aW9uLiBUaGlzIGZ1bmN0aW9uIGNhbgogKiBiZSBjYWxsZWQgb24gbW9kdWxlcyB3aXRoIGNvbXBvbmVudHMgdGhhdCBoYXZlIG5vdCBmdWxseSBjb21waWxlZCB5ZXQsIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBub3QKICogYmUgdXNlZCB1bnRpbCB0aGV5IGhhdmUuCiAqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZSBtb2R1bGUgdGhhdCB0cmFuc2l0aXZlIHNjb3BlIHNob3VsZCBiZSBjYWxjdWxhdGVkIGZvci4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRyYW5zaXRpdmVTY29wZXNGb3IobW9kdWxlVHlwZSkgewogICAgaWYgKCFpc05nTW9kdWxlKG1vZHVsZVR5cGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZHVsZVR5cGUubmFtZX0gZG9lcyBub3QgaGF2ZSBhIG1vZHVsZSBkZWYgKMm1bW9kIHByb3BlcnR5KWApOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5nTW9kdWxlRGVmKG1vZHVsZVR5cGUpKSk7CiAgICBpZiAoZGVmLnRyYW5zaXRpdmVDb21waWxlU2NvcGVzICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGRlZi50cmFuc2l0aXZlQ29tcGlsZVNjb3BlczsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjb3BlcyA9IHsKICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLAogICAgICAgIGNvbXBpbGF0aW9uOiB7CiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgcGlwZXM6IG5ldyBTZXQoKSwKICAgICAgICB9LAogICAgICAgIGV4cG9ydGVkOiB7CiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgcGlwZXM6IG5ldyBTZXQoKSwKICAgICAgICB9LAogICAgfTsKICAgIG1heWJlVW53cmFwRm4oZGVmLmltcG9ydHMpLmZvckVhY2goKC8qKgogICAgICogQHRlbXBsYXRlIEkKICAgICAqIEBwYXJhbSB7P30gaW1wb3J0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChpbXBvcnRlZCkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbXBvcnRlZFR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW1wb3J0ZWQpKTsKICAgICAgICBpZiAoIWlzTmdNb2R1bGUoaW1wb3J0ZWRUeXBlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydGluZyAke2ltcG9ydGVkVHlwZS5uYW1lfSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgybVtb2QgcHJvcGVydHlgKTsKICAgICAgICB9CiAgICAgICAgLy8gV2hlbiB0aGlzIG1vZHVsZSBpbXBvcnRzIGFub3RoZXIsIHRoZSBpbXBvcnRlZCBtb2R1bGUncyBleHBvcnRlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhcmUKICAgICAgICAvLyBhZGRlZCB0byB0aGUgY29tcGlsYXRpb24gc2NvcGUgb2YgdGhpcyBtb2R1bGUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGltcG9ydGVkU2NvcGUgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKGltcG9ydGVkVHlwZSk7CiAgICAgICAgaW1wb3J0ZWRTY29wZS5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVudHJ5ID0+IHNjb3Blcy5jb21waWxhdGlvbi5kaXJlY3RpdmVzLmFkZChlbnRyeSkpKTsKICAgICAgICBpbXBvcnRlZFNjb3BlLmV4cG9ydGVkLnBpcGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVudHJ5ID0+IHNjb3Blcy5jb21waWxhdGlvbi5waXBlcy5hZGQoZW50cnkpKSk7CiAgICB9KSk7CiAgICBtYXliZVVud3JhcEZuKGRlZi5kZWNsYXJhdGlvbnMpLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWNsYXJlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVjbGFyZWQgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJlZFdpdGhEZWZzID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmVkKSk7CiAgICAgICAgaWYgKGdldFBpcGVEZWYoZGVjbGFyZWRXaXRoRGVmcykpIHsKICAgICAgICAgICAgc2NvcGVzLmNvbXBpbGF0aW9uLnBpcGVzLmFkZChkZWNsYXJlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBFaXRoZXIgZGVjbGFyZWQgaGFzIGEgybVjbXAgb3IgybVkaXIsIG9yIGl0J3MgYSBjb21wb25lbnQgd2hpY2ggaGFzbid0CiAgICAgICAgICAgIC8vIGhhZCBpdHMgdGVtcGxhdGUgY29tcGlsZWQgeWV0LiBJbiBlaXRoZXIgY2FzZSwgaXQgZ2V0cyBhZGRlZCB0byB0aGUgY29tcGlsYXRpb24ncwogICAgICAgICAgICAvLyBkaXJlY3RpdmVzLgogICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZGVjbGFyZWQpOwogICAgICAgIH0KICAgIH0pKTsKICAgIG1heWJlVW53cmFwRm4oZGVmLmV4cG9ydHMpLmZvckVhY2goKC8qKgogICAgICogQHRlbXBsYXRlIEUKICAgICAqIEBwYXJhbSB7P30gZXhwb3J0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChleHBvcnRlZCkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleHBvcnRlZFR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXhwb3J0ZWQpKTsKICAgICAgICAvLyBFaXRoZXIgdGhlIHR5cGUgaXMgYSBtb2R1bGUsIGEgcGlwZSwgb3IgYSBjb21wb25lbnQvZGlyZWN0aXZlICh3aGljaCBtYXkgbm90IGhhdmUgYQogICAgICAgIC8vIMm1Y21wIGFzIGl0IG1pZ2h0IGJlIGNvbXBpbGVkIGFzeW5jaHJvbm91c2x5KS4KICAgICAgICBpZiAoaXNOZ01vZHVsZShleHBvcnRlZFR5cGUpKSB7CiAgICAgICAgICAgIC8vIFdoZW4gdGhpcyBtb2R1bGUgZXhwb3J0cyBhbm90aGVyLCB0aGUgZXhwb3J0ZWQgbW9kdWxlJ3MgZXhwb3J0ZWQgZGlyZWN0aXZlcyBhbmQgcGlwZXMgYXJlCiAgICAgICAgICAgIC8vIGFkZGVkIHRvIGJvdGggdGhlIGNvbXBpbGF0aW9uIGFuZCBleHBvcnRlZCBzY29wZXMgb2YgdGhpcyBtb2R1bGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRTY29wZSA9IHRyYW5zaXRpdmVTY29wZXNGb3IoZXhwb3J0ZWRUeXBlKTsKICAgICAgICAgICAgZXhwb3J0ZWRTY29wZS5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZW50cnkpOwogICAgICAgICAgICAgICAgc2NvcGVzLmV4cG9ydGVkLmRpcmVjdGl2ZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBleHBvcnRlZFNjb3BlLmV4cG9ydGVkLnBpcGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgICAgIHNjb3Blcy5leHBvcnRlZC5waXBlcy5hZGQoZW50cnkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGdldFBpcGVEZWYoZXhwb3J0ZWRUeXBlKSkgewogICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQucGlwZXMuYWRkKGV4cG9ydGVkVHlwZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQuZGlyZWN0aXZlcy5hZGQoZXhwb3J0ZWRUeXBlKTsKICAgICAgICB9CiAgICB9KSk7CiAgICBkZWYudHJhbnNpdGl2ZUNvbXBpbGVTY29wZXMgPSBzY29wZXM7CiAgICByZXR1cm4gc2NvcGVzOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleHBhbmRNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSB7CiAgICBpZiAoaXNNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZS5uZ01vZHVsZTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSB7CiAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS5uZ01vZHVsZSAhPT0gdW5kZWZpbmVkOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc05nTW9kdWxlKHZhbHVlKSB7CiAgICByZXR1cm4gISFnZXROZ01vZHVsZURlZih2YWx1ZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaml0L2RpcmVjdGl2ZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ29tcGlsZSBhbiBBbmd1bGFyIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRvciBtZXRhZGF0YSwgYW5kIHBhdGNoIHRoZSByZXN1bHRpbmcKICogY29tcG9uZW50IGRlZiAoybVjbXApIG9udG8gdGhlIGNvbXBvbmVudCB0eXBlLgogKgogKiBDb21waWxhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzIChkdWUgdG8gdGhlIG5lZWQgdG8gcmVzb2x2ZSBVUkxzIGZvciB0aGUgY29tcG9uZW50IHRlbXBsYXRlIG9yCiAqIG90aGVyIHJlc291cmNlcywgZm9yIGV4YW1wbGUpLiBJbiB0aGUgZXZlbnQgdGhhdCBjb21waWxhdGlvbiBpcyBub3QgaW1tZWRpYXRlLCBgY29tcGlsZUNvbXBvbmVudGAKICogd2lsbCBlbnF1ZXVlIHJlc291cmNlIHJlc29sdXRpb24gaW50byBhIGdsb2JhbCBxdWV1ZSBhbmQgd2lsbCBmYWlsIHRvIHJldHVybiB0aGUgYMm1Y21wYAogKiB1bnRpbCB0aGUgZ2xvYmFsIHF1ZXVlIGhhcyBiZWVuIHJlc29sdmVkIHdpdGggYSBjYWxsIHRvIGByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzYC4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBpbGVDb21wb25lbnQodHlwZSwgbWV0YWRhdGEpIHsKICAgIC8vIEluaXRpYWxpemUgbmdEZXZNb2RlLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiBjb21waWxlQ29tcG9uZW50LgogICAgLy8gU2VlIHRoZSBgaW5pdE5nRGV2TW9kZWAgZG9jc3RyaW5nIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgJiYgaW5pdE5nRGV2TW9kZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nQ29tcG9uZW50RGVmID0gbnVsbDsKICAgIC8vIE1ldGFkYXRhIG1heSBoYXZlIHJlc291cmNlcyB3aGljaCBuZWVkIHRvIGJlIHJlc29sdmVkLgogICAgbWF5YmVRdWV1ZVJlc29sdXRpb25PZkNvbXBvbmVudFJlc291cmNlcyh0eXBlLCBtZXRhZGF0YSk7CiAgICAvLyBOb3RlIHRoYXQgd2UncmUgdXNpbmcgdGhlIHNhbWUgZnVuY3Rpb24gYXMgYERpcmVjdGl2ZWAsIGJlY2F1c2UgdGhhdCdzIG9ubHkgc3Vic2V0IG9mIG1ldGFkYXRhCiAgICAvLyB0aGF0IHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBuZ0ZhY3RvcnlEZWYuIFdlJ3JlIGF2b2lkaW5nIHVzaW5nIHRoZSBjb21wb25lbnQgbWV0YWRhdGEKICAgIC8vIGJlY2F1c2Ugd2UnZCBoYXZlIHRvIHJlc29sdmUgdGhlIGFzeW5jaHJvbm91cyB0ZW1wbGF0ZXMuCiAgICBhZGREaXJlY3RpdmVGYWN0b3J5RGVmKHR5cGUsIG1ldGFkYXRhKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19DT01QX0RFRiwgewogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdDb21wb25lbnREZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnROZWVkc1Jlc29sdXRpb24obWV0YWRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gW2BDb21wb25lbnQgJyR7dHlwZS5uYW1lfScgaXMgbm90IHJlc29sdmVkOmBdOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS50ZW1wbGF0ZVVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGAgLSB0ZW1wbGF0ZVVybDogJHttZXRhZGF0YS50ZW1wbGF0ZVVybH1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnN0eWxlVXJscyAmJiBtZXRhZGF0YS5zdHlsZVVybHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnB1c2goYCAtIHN0eWxlVXJsczogJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YS5zdHlsZVVybHMpfWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBEaWQgeW91IHJ1biBhbmQgd2FpdCBmb3IgJ3Jlc29sdmVDb21wb25lbnRSZXNvdXJjZXMoKSc/YCk7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmpvaW4oJ1xuJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhpcyBjb25zdCB3YXMgY2FsbGVkIGBqaXRPcHRpb25zYCBwcmV2aW91c2x5IGJ1dCBoYWQgdG8gYmUgcmVuYW1lZCB0byBgb3B0aW9uc2AgYmVjYXVzZQogICAgICAgICAgICAgICAgLy8gb2YgYSBidWcgd2l0aCBUZXJzZXIgdGhhdCBjYXVzZWQgb3B0aW1pemVkIEpJVCBidWlsZHMgdG8gdGhyb3cgYSBgUmVmZXJlbmNlRXJyb3JgLgogICAgICAgICAgICAgICAgLy8gVGhpcyBidWcgd2FzIGludmVzdGlnYXRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLWNsaS9pc3N1ZXMvMTcyNjQuCiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IHJlbmFtZSBpdCBiYWNrIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJzZXIvdGVyc2VyL2lzc3Vlcy82MTUgaXMgZml4ZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0Sml0T3B0aW9ucygpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHByZXNlcnZlV2hpdGVzcGFjZXMgPSBtZXRhZGF0YS5wcmVzZXJ2ZVdoaXRlc3BhY2VzOwogICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlV2hpdGVzcGFjZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGVuY2Fwc3VsYXRpb24gPSBtZXRhZGF0YS5lbmNhcHN1bGF0aW9uOwogICAgICAgICAgICAgICAgaWYgKGVuY2Fwc3VsYXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uID0gb3B0aW9ucy5kZWZhdWx0RW5jYXBzdWxhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24gPSBWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVXJsID0gbWV0YWRhdGEudGVtcGxhdGVVcmwgfHwgYG5nOi8vLyR7dHlwZS5uYW1lfS90ZW1wbGF0ZS5odG1sYDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRpcmVjdGl2ZU1ldGFkYXRhKHR5cGUsIG1ldGFkYXRhKSksIHsgdHlwZVNvdXJjZVNwYW46IGNvbXBpbGVyLmNyZWF0ZVBhcnNlU291cmNlU3BhbignQ29tcG9uZW50JywgdHlwZS5uYW1lLCB0ZW1wbGF0ZVVybCksIHRlbXBsYXRlOiBtZXRhZGF0YS50ZW1wbGF0ZSB8fCAnJywgcHJlc2VydmVXaGl0ZXNwYWNlcywgc3R5bGVzOiBtZXRhZGF0YS5zdHlsZXMgfHwgRU1QVFlfQVJSQVksIGFuaW1hdGlvbnM6IG1ldGFkYXRhLmFuaW1hdGlvbnMsIGRpcmVjdGl2ZXM6IFtdLCBjaGFuZ2VEZXRlY3Rpb246IG1ldGFkYXRhLmNoYW5nZURldGVjdGlvbiwgcGlwZXM6IG5ldyBNYXAoKSwgZW5jYXBzdWxhdGlvbiwgaW50ZXJwb2xhdGlvbjogbWV0YWRhdGEuaW50ZXJwb2xhdGlvbiwgdmlld1Byb3ZpZGVyczogbWV0YWRhdGEudmlld1Byb3ZpZGVycyB8fCBudWxsIH0pOwogICAgICAgICAgICAgICAgaWYgKG1ldGEudXNlc0luaGVyaXRhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkRGlyZWN0aXZlRGVmVG9VbmRlY29yYXRlZFBhcmVudHModHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZ0NvbXBvbmVudERlZiA9IGNvbXBpbGVyLmNvbXBpbGVDb21wb25lbnQoYW5ndWxhckNvcmVFbnYsIHRlbXBsYXRlVXJsLCBtZXRhKTsKICAgICAgICAgICAgICAgIC8vIFdoZW4gTmdNb2R1bGUgZGVjb3JhdG9yIGV4ZWN1dGVkLCB3ZSBlbnF1ZXVlZCB0aGUgbW9kdWxlIGRlZmluaXRpb24gc3VjaCB0aGF0CiAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBvbmx5IGRlcXVldWUgYW5kIGFkZCBpdHNlbGYgYXMgbW9kdWxlIHNjb3BlIHRvIGFsbCBvZiBpdHMgZGVjbGFyYXRpb25zLAogICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYgIGlmIGFsbCBvZiBpdHMgZGVjbGFyYXRpb25zIGhhZCByZXNvbHZlZC4gVGhpcyBjYWxsIHJ1bnMgdGhlIGNoZWNrCiAgICAgICAgICAgICAgICAvLyB0byBzZWUgaWYgYW55IG1vZHVsZXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlIGNhbiBiZSBkZXF1ZXVlZCBhbmQgYWRkIHNjb3BlIHRvCiAgICAgICAgICAgICAgICAvLyB0aGVpciBkZWNsYXJhdGlvbnMuCiAgICAgICAgICAgICAgICBmbHVzaE1vZHVsZVNjb3BpbmdRdWV1ZUFzTXVjaEFzUG9zc2libGUoKTsKICAgICAgICAgICAgICAgIC8vIElmIGNvbXBvbmVudCBjb21waWxhdGlvbiBpcyBhc3luYywgdGhlbiB0aGUgQE5nTW9kdWxlIGFubm90YXRpb24gd2hpY2ggZGVjbGFyZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGV4ZWN1dGUgYW5kIHNldCBhbiBuZ1NlbGVjdG9yU2NvcGUgcHJvcGVydHkgb24gdGhlIGNvbXBvbmVudCB0eXBlLiBUaGlzCiAgICAgICAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbXBvbmVudCB0byBwYXRjaCBpdHNlbGYgd2l0aCBkaXJlY3RpdmVEZWZzIGZyb20gdGhlIG1vZHVsZSBhZnRlciBpdAogICAgICAgICAgICAgICAgLy8gZmluaXNoZXMgY29tcGlsaW5nLgogICAgICAgICAgICAgICAgaWYgKGhhc1NlbGVjdG9yU2NvcGUodHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVzID0gdHJhbnNpdGl2ZVNjb3Blc0Zvcih0eXBlLm5nU2VsZWN0b3JTY29wZSk7CiAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUobmdDb21wb25lbnREZWYsIHNjb3Blcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5nQ29tcG9uZW50RGVmOwogICAgICAgIH0pLAogICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgIH0pOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGNvbXBvbmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzU2VsZWN0b3JTY29wZShjb21wb25lbnQpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudCkpKS5uZ1NlbGVjdG9yU2NvcGUgIT09IHVuZGVmaW5lZDsKfQovKioKICogQ29tcGlsZSBhbiBBbmd1bGFyIGRpcmVjdGl2ZSBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRvciBtZXRhZGF0YSwgYW5kIHBhdGNoIHRoZSByZXN1bHRpbmcKICogZGlyZWN0aXZlIGRlZiBvbnRvIHRoZSBjb21wb25lbnQgdHlwZS4KICoKICogSW4gdGhlIGV2ZW50IHRoYXQgY29tcGlsYXRpb24gaXMgbm90IGltbWVkaWF0ZSwgYGNvbXBpbGVEaXJlY3RpdmVgIHdpbGwgcmV0dXJuIGEgYFByb21pc2VgIHdoaWNoCiAqIHdpbGwgcmVzb2x2ZSB3aGVuIGNvbXBpbGF0aW9uIGNvbXBsZXRlcyBhbmQgdGhlIGRpcmVjdGl2ZSBiZWNvbWVzIHVzYWJsZS4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21waWxlRGlyZWN0aXZlKHR5cGUsIGRpcmVjdGl2ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nRGlyZWN0aXZlRGVmID0gbnVsbDsKICAgIGFkZERpcmVjdGl2ZUZhY3RvcnlEZWYodHlwZSwgZGlyZWN0aXZlIHx8IHt9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19ESVJfREVGLCB7CiAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChuZ0RpcmVjdGl2ZURlZiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gYGRpcmVjdGl2ZWAgY2FuIGJlIG51bGwgaW4gdGhlIGNhc2Ugb2YgYWJzdHJhY3QgZGlyZWN0aXZlcyBhcyBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgICAgIC8vIHRoYXQgdXNlIGBARGlyZWN0aXZlKClgIHdpdGggbm8gc2VsZWN0b3IuIEluIHRoYXQgY2FzZSwgcGFzcyBlbXB0eSBvYmplY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAvLyBgZGlyZWN0aXZlTWV0YWRhdGFgIGZ1bmN0aW9uIGluc3RlYWQgb2YgbnVsbC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBnZXREaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBkaXJlY3RpdmUgfHwge30pOwogICAgICAgICAgICAgICAgbmdEaXJlY3RpdmVEZWYgPQogICAgICAgICAgICAgICAgICAgIGdldENvbXBpbGVyRmFjYWRlKCkuY29tcGlsZURpcmVjdGl2ZShhbmd1bGFyQ29yZUVudiwgbWV0YS5zb3VyY2VNYXBVcmwsIG1ldGEubWV0YWRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZ0RpcmVjdGl2ZURlZjsKICAgICAgICB9KSwKICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0cwogICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICB9KTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERpcmVjdGl2ZU1ldGFkYXRhKHR5cGUsIG1ldGFkYXRhKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYW1lID0gdHlwZSAmJiB0eXBlLm5hbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzb3VyY2VNYXBVcmwgPSBgbmc6Ly8vJHtuYW1lfS/JtWRpci5qc2A7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmYWNhZGUgPSBkaXJlY3RpdmVNZXRhZGF0YSgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBtZXRhZGF0YSk7CiAgICBmYWNhZGUudHlwZVNvdXJjZVNwYW4gPSBjb21waWxlci5jcmVhdGVQYXJzZVNvdXJjZVNwYW4oJ0RpcmVjdGl2ZScsIG5hbWUsIHNvdXJjZU1hcFVybCk7CiAgICBpZiAoZmFjYWRlLnVzZXNJbmhlcml0YW5jZSkgewogICAgICAgIGFkZERpcmVjdGl2ZURlZlRvVW5kZWNvcmF0ZWRQYXJlbnRzKHR5cGUpOwogICAgfQogICAgcmV0dXJuIHsgbWV0YWRhdGE6IGZhY2FkZSwgc291cmNlTWFwVXJsIH07Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGFkYXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGREaXJlY3RpdmVGYWN0b3J5RGVmKHR5cGUsIG1ldGFkYXRhKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmdGYWN0b3J5RGVmID0gbnVsbDsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19GQUNUT1JZX0RFRiwgewogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdGYWN0b3J5RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gZ2V0RGlyZWN0aXZlTWV0YWRhdGEodHlwZSwgbWV0YWRhdGEpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpOwogICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke3R5cGUubmFtZX0vybVmYWMuanNgLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1ldGEubWV0YWRhdGEpLCB7IGluamVjdEZuOiAnZGlyZWN0aXZlSW5qZWN0JywgdGFyZ2V0OiBjb21waWxlci5SM0ZhY3RvcnlUYXJnZXQuRGlyZWN0aXZlIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmdGYWN0b3J5RGVmOwogICAgICAgIH0pLAogICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4dGVuZHNEaXJlY3RseUZyb21PYmplY3QodHlwZSkgewogICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGU7Cn0KLyoqCiAqIEV4dHJhY3QgdGhlIGBSM0RpcmVjdGl2ZU1ldGFkYXRhYCBmb3IgYSBwYXJ0aWN1bGFyIGRpcmVjdGl2ZSAoZWl0aGVyIGEgYERpcmVjdGl2ZWAgb3IgYQogKiBgQ29tcG9uZW50YCkuCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGFkYXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBtZXRhZGF0YSkgewogICAgLy8gUmVmbGVjdCBpbnB1dHMgYW5kIG91dHB1dHMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWZsZWN0ID0gZ2V0UmVmbGVjdCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJvcE1ldGFkYXRhID0gcmVmbGVjdC5vd25Qcm9wTWV0YWRhdGEodHlwZSk7CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6IHR5cGUubmFtZSwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLAogICAgICAgIHNlbGVjdG9yOiBtZXRhZGF0YS5zZWxlY3RvciAhPT0gdW5kZWZpbmVkID8gbWV0YWRhdGEuc2VsZWN0b3IgOiBudWxsLAogICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksCiAgICAgICAgaG9zdDogbWV0YWRhdGEuaG9zdCB8fCBFTVBUWV9PQkosCiAgICAgICAgcHJvcE1ldGFkYXRhOiBwcm9wTWV0YWRhdGEsCiAgICAgICAgaW5wdXRzOiBtZXRhZGF0YS5pbnB1dHMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgb3V0cHV0czogbWV0YWRhdGEub3V0cHV0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICBxdWVyaWVzOiBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNDb250ZW50UXVlcnkpLAogICAgICAgIGxpZmVjeWNsZTogeyB1c2VzT25DaGFuZ2VzOiByZWZsZWN0Lmhhc0xpZmVjeWNsZUhvb2sodHlwZSwgJ25nT25DaGFuZ2VzJykgfSwKICAgICAgICB0eXBlU291cmNlU3BhbjogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICB1c2VzSW5oZXJpdGFuY2U6ICFleHRlbmRzRGlyZWN0bHlGcm9tT2JqZWN0KHR5cGUpLAogICAgICAgIGV4cG9ydEFzOiBleHRyYWN0RXhwb3J0QXMobWV0YWRhdGEuZXhwb3J0QXMpLAogICAgICAgIHByb3ZpZGVyczogbWV0YWRhdGEucHJvdmlkZXJzIHx8IG51bGwsCiAgICAgICAgdmlld1F1ZXJpZXM6IGV4dHJhY3RRdWVyaWVzTWV0YWRhdGEodHlwZSwgcHJvcE1ldGFkYXRhLCBpc1ZpZXdRdWVyeSkKICAgIH07Cn0KLyoqCiAqIEFkZHMgYSBkaXJlY3RpdmUgZGVmaW5pdGlvbiB0byBhbGwgcGFyZW50IGNsYXNzZXMgb2YgYSB0eXBlIHRoYXQgZG9uJ3QgaGF2ZSBhbiBBbmd1bGFyIGRlY29yYXRvci4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGREaXJlY3RpdmVEZWZUb1VuZGVjb3JhdGVkUGFyZW50cyh0eXBlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkuY29uc3RydWN0b3I7CiAgICAvLyBHbyB1cCB0aGUgcHJvdG90eXBlIHVudGlsIHdlIGhpdCBgT2JqZWN0YC4KICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBvYmpQcm90b3R5cGUpIHsKICAgICAgICAvLyBTaW5jZSBpbmhlcml0YW5jZSB3b3JrcyBpZiB0aGUgY2xhc3Mgd2FzIGFubm90YXRlZCBhbHJlYWR5LCB3ZSBvbmx5IG5lZWQgdG8gYWRkCiAgICAgICAgLy8gdGhlIGRlZiBpZiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMgYW5kIHRoZSBkZWYgaGFzbid0IGJlZW4gY3JlYXRlZCBhbHJlYWR5LgogICAgICAgIGlmICghZ2V0RGlyZWN0aXZlRGVmKHBhcmVudCkgJiYgIWdldENvbXBvbmVudERlZihwYXJlbnQpICYmCiAgICAgICAgICAgIHNob3VsZEFkZEFic3RyYWN0RGlyZWN0aXZlKHBhcmVudCkpIHsKICAgICAgICAgICAgY29tcGlsZURpcmVjdGl2ZShwYXJlbnQsIG51bGwpOwogICAgICAgIH0KICAgICAgICBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBzZWxlY3RvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udmVydFRvUjNRdWVyeVByZWRpY2F0ZShzZWxlY3RvcikgewogICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycgPyBzcGxpdEJ5Q29tbWEoc2VsZWN0b3IpIDogcmVzb2x2ZUZvcndhcmRSZWYoc2VsZWN0b3IpOwp9Ci8qKgogKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZQogKiBAcGFyYW0gez99IGFubgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udmVydFRvUjNRdWVyeU1ldGFkYXRhKHByb3BlcnR5TmFtZSwgYW5uKSB7CiAgICByZXR1cm4gewogICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLAogICAgICAgIHByZWRpY2F0ZTogY29udmVydFRvUjNRdWVyeVByZWRpY2F0ZShhbm4uc2VsZWN0b3IpLAogICAgICAgIGRlc2NlbmRhbnRzOiBhbm4uZGVzY2VuZGFudHMsCiAgICAgICAgZmlyc3Q6IGFubi5maXJzdCwKICAgICAgICByZWFkOiBhbm4ucmVhZCA/IGFubi5yZWFkIDogbnVsbCwKICAgICAgICBzdGF0aWM6ICEhYW5uLnN0YXRpYwogICAgfTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gcHJvcE1ldGFkYXRhCiAqIEBwYXJhbSB7P30gaXNRdWVyeUFubgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXh0cmFjdFF1ZXJpZXNNZXRhZGF0YSh0eXBlLCBwcm9wTWV0YWRhdGEsIGlzUXVlcnlBbm4pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHF1ZXJpZXNNZXRhID0gW107CiAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHByb3BNZXRhZGF0YSkgewogICAgICAgIGlmIChwcm9wTWV0YWRhdGEuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbnMgPSBwcm9wTWV0YWRhdGFbZmllbGRdOwogICAgICAgICAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFubiA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaXNRdWVyeUFubihhbm4pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbm4uc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBjb25zdHJ1Y3QgYSBxdWVyeSBmb3IgdGhlIHByb3BlcnR5ICIke2ZpZWxkfSIgb2YgYCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgIiR7c3RyaW5naWZ5Rm9yRXJyb3IodHlwZSl9IiBzaW5jZSB0aGUgcXVlcnkgc2VsZWN0b3Igd2Fzbid0IGRlZmluZWQuYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5zb21lKGlzSW5wdXRBbm5vdGF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21iaW5lIEBJbnB1dCBkZWNvcmF0b3JzIHdpdGggcXVlcnkgZGVjb3JhdG9yc2ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxdWVyaWVzTWV0YS5wdXNoKGNvbnZlcnRUb1IzUXVlcnlNZXRhZGF0YShmaWVsZCwgYW5uKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcXVlcmllc01ldGE7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXhwb3J0QXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRBcyhleHBvcnRBcykgewogICAgcmV0dXJuIGV4cG9ydEFzID09PSB1bmRlZmluZWQgPyBudWxsIDogc3BsaXRCeUNvbW1hKGV4cG9ydEFzKTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNDb250ZW50UXVlcnkodmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTsKICAgIHJldHVybiBuYW1lID09PSAnQ29udGVudENoaWxkJyB8fCBuYW1lID09PSAnQ29udGVudENoaWxkcmVuJzsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNWaWV3UXVlcnkodmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTsKICAgIHJldHVybiBuYW1lID09PSAnVmlld0NoaWxkJyB8fCBuYW1lID09PSAnVmlld0NoaWxkcmVuJzsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNJbnB1dEFubm90YXRpb24odmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZS5uZ01ldGFkYXRhTmFtZSA9PT0gJ0lucHV0JzsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3BsaXRCeUNvbW1hKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSBwaWVjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGllY2UgPT4gcGllY2UudHJpbSgpKSk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBMSUZFQ1lDTEVfSE9PS1MgPSBbCiAgICAnbmdPbkNoYW5nZXMnLCAnbmdPbkluaXQnLCAnbmdPbkRlc3Ryb3knLCAnbmdEb0NoZWNrJywgJ25nQWZ0ZXJWaWV3SW5pdCcsICduZ0FmdGVyVmlld0NoZWNrZWQnLAogICAgJ25nQWZ0ZXJDb250ZW50SW5pdCcsICduZ0FmdGVyQ29udGVudENoZWNrZWQnCl07Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNob3VsZEFkZEFic3RyYWN0RGlyZWN0aXZlKHR5cGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlZmxlY3QgPSBnZXRSZWZsZWN0KCk7CiAgICBpZiAoTElGRUNZQ0xFX0hPT0tTLnNvbWUoKC8qKgogICAgICogQHBhcmFtIHs/fSBob29rTmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaG9va05hbWUgPT4gcmVmbGVjdC5oYXNMaWZlY3ljbGVIb29rKHR5cGUsIGhvb2tOYW1lKSkpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcm9wTWV0YWRhdGEgPSByZWZsZWN0LnByb3BNZXRhZGF0YSh0eXBlKTsKICAgIGZvciAoY29uc3QgZmllbGQgaW4gcHJvcE1ldGFkYXRhKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gcHJvcE1ldGFkYXRhW2ZpZWxkXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGFubm90YXRpb25zW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhTmFtZSA9IGN1cnJlbnQubmdNZXRhZGF0YU5hbWU7CiAgICAgICAgICAgIGlmIChpc0lucHV0QW5ub3RhdGlvbihjdXJyZW50KSB8fCBpc0NvbnRlbnRRdWVyeShjdXJyZW50KSB8fCBpc1ZpZXdRdWVyeShjdXJyZW50KSB8fAogICAgICAgICAgICAgICAgbWV0YWRhdGFOYW1lID09PSAnT3V0cHV0JyB8fCBtZXRhZGF0YU5hbWUgPT09ICdIb3N0QmluZGluZycgfHwKICAgICAgICAgICAgICAgIG1ldGFkYXRhTmFtZSA9PT0gJ0hvc3RMaXN0ZW5lcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ppdC9waXBlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21waWxlUGlwZSh0eXBlLCBtZXRhKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmdQaXBlRGVmID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ0ZhY3RvcnlEZWYgPSBudWxsOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIE5HX0ZBQ1RPUllfREVGLCB7CiAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChuZ0ZhY3RvcnlEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0UGlwZU1ldGFkYXRhKHR5cGUsIG1ldGEpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpOwogICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke21ldGFkYXRhLm5hbWV9L8m1ZmFjLmpzYCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXRhZGF0YSksIHsgaW5qZWN0Rm46ICdkaXJlY3RpdmVJbmplY3QnLCB0YXJnZXQ6IGNvbXBpbGVyLlIzRmFjdG9yeVRhcmdldC5QaXBlIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmdGYWN0b3J5RGVmOwogICAgICAgIH0pLAogICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIE5HX1BJUEVfREVGLCB7CiAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChuZ1BpcGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0UGlwZU1ldGFkYXRhKHR5cGUsIG1ldGEpOwogICAgICAgICAgICAgICAgbmdQaXBlRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlUGlwZShhbmd1bGFyQ29yZUVudiwgYG5nOi8vLyR7bWV0YWRhdGEubmFtZX0vybVwaXBlLmpzYCwgbWV0YWRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZ1BpcGVEZWY7CiAgICAgICAgfSksCiAgICAgICAgLy8gTWFrZSB0aGUgcHJvcGVydHkgY29uZmlndXJhYmxlIGluIGRldiBtb2RlIHRvIGFsbG93IG92ZXJyaWRpbmcgaW4gdGVzdHMKICAgICAgICBjb25maWd1cmFibGU6ICEhbmdEZXZNb2RlLAogICAgfSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBpcGVNZXRhZGF0YSh0eXBlLCBtZXRhKSB7CiAgICByZXR1cm4gewogICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IDAsCiAgICAgICAgbmFtZTogdHlwZS5uYW1lLAogICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksCiAgICAgICAgcGlwZU5hbWU6IG1ldGEubmFtZSwKICAgICAgICBwdXJlOiBtZXRhLnB1cmUgIT09IHVuZGVmaW5lZCA/IG1ldGEucHVyZSA6IHRydWUKICAgIH07Cn0KLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdApjb25zdCDJtTAkZSA9IC8qKgogKiBAcGFyYW0gez89fSBkaXIKICogQHJldHVybiB7P30KICovCihkaXIgPSB7fSkgPT4gZGlyLCDJtTEkMyA9IC8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwoodHlwZSwgbWV0YSkgPT4gU1dJVENIX0NPTVBJTEVfRElSRUNUSVZFKHR5cGUsIG1ldGEpOwovKioKICogVHlwZSBvZiB0aGUgRGlyZWN0aXZlIG1ldGFkYXRhLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IERpcmVjdGl2ZSA9IG1ha2VEZWNvcmF0b3IoJ0RpcmVjdGl2ZScsICjJtTAkZSksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoybUxJDMpKTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdApjb25zdCDJtTIkMSA9IC8qKgogKiBAcGFyYW0gez89fSBjCiAqIEByZXR1cm4gez99CiAqLwooYyA9IHt9KSA9PiAoT2JqZWN0LmFzc2lnbih7IGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCB9LCBjKSksIMm1MyQxID0gLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGEKICogQHJldHVybiB7P30KICovCih0eXBlLCBtZXRhKSA9PiBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlQodHlwZSwgbWV0YSk7Ci8qKgogKiBDb21wb25lbnQgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ29tcG9uZW50ID0gbWFrZURlY29yYXRvcignQ29tcG9uZW50JywgKMm1MiQxKSwgRGlyZWN0aXZlLCB1bmRlZmluZWQsICjJtTMkMSkpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1NCA9IC8qKgogKiBAcGFyYW0gez99IHAKICogQHJldHVybiB7P30KICovCihwKSA9PiAoT2JqZWN0LmFzc2lnbih7IHB1cmU6IHRydWUgfSwgcCkpLCDJtTUgPSAvKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KKHR5cGUsIG1ldGEpID0+IFNXSVRDSF9DT01QSUxFX1BJUEUodHlwZSwgbWV0YSk7Ci8qKgogKiBcQEFubm90YXRpb24KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBQaXBlID0gbWFrZURlY29yYXRvcignUGlwZScsICjJtTQpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKMm1NSkpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1NiA9IC8qKgogKiBAcGFyYW0gez89fSBiaW5kaW5nUHJvcGVydHlOYW1lCiAqIEByZXR1cm4gez99CiAqLwooYmluZGluZ1Byb3BlcnR5TmFtZSkgPT4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsKLyoqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IElucHV0ID0gbWFrZVByb3BEZWNvcmF0b3IoJ0lucHV0JywgKMm1NikpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1NyA9IC8qKgogKiBAcGFyYW0gez89fSBiaW5kaW5nUHJvcGVydHlOYW1lCiAqIEByZXR1cm4gez99CiAqLwooYmluZGluZ1Byb3BlcnR5TmFtZSkgPT4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsKLyoqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IE91dHB1dCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdPdXRwdXQnLCAoybU3KSk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKY29uc3QgybU4ID0gLyoqCiAqIEBwYXJhbSB7Pz19IGhvc3RQcm9wZXJ0eU5hbWUKICogQHJldHVybiB7P30KICovCihob3N0UHJvcGVydHlOYW1lKSA9PiAoeyBob3N0UHJvcGVydHlOYW1lIH0pOwovKioKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSG9zdEJpbmRpbmcgPSBtYWtlUHJvcERlY29yYXRvcignSG9zdEJpbmRpbmcnLCAoybU4KSk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKY29uc3QgybU5ID0gLyoqCiAqIEBwYXJhbSB7Pz19IGV2ZW50TmFtZQogKiBAcGFyYW0gez89fSBhcmdzCiAqIEByZXR1cm4gez99CiAqLwooZXZlbnROYW1lLCBhcmdzKSA9PiAoeyBldmVudE5hbWUsIGFyZ3MgfSk7Ci8qKgogKiBEZWNvcmF0b3IgdGhhdCBiaW5kcyBhIERPTSBldmVudCB0byBhIGhvc3QgbGlzdGVuZXIgYW5kIHN1cHBsaWVzIGNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuCiAqIEFuZ3VsYXIgaW52b2tlcyB0aGUgc3VwcGxpZWQgaGFuZGxlciBtZXRob2Qgd2hlbiB0aGUgaG9zdCBlbGVtZW50IGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQsCiAqIGFuZCB1cGRhdGVzIHRoZSBib3VuZCBlbGVtZW50IHdpdGggdGhlIHJlc3VsdC4KICoKICogSWYgdGhlIGhhbmRsZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIGFwcGxpZXMgYHByZXZlbnREZWZhdWx0YCBvbiB0aGUgYm91bmQgZWxlbWVudC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZQogKiB0aGF0IGF0dGFjaGVzIGEgY2xpY2sgbGlzdGVuZXIgdG8gYSBidXR0b24gYW5kIGNvdW50cyBjbGlja3MuCiAqCiAqIGBgYHRzCiAqIFxARGlyZWN0aXZlKHtzZWxlY3RvcjogJ2J1dHRvbltjb3VudGluZ10nfSkKICogY2xhc3MgQ291bnRDbGlja3MgewogKiAgIG51bWJlck9mQ2xpY2tzID0gMDsKICoKICogXEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pCiAqICAgb25DbGljayhidG4pIHsKICogICAgIGNvbnNvbGUubG9nKCdidXR0b24nLCBidG4sICdudW1iZXIgb2YgY2xpY2tzOicsIHRoaXMubnVtYmVyT2ZDbGlja3MrKyk7CiAqICB9CiAqIH0KICoKICogXEBDb21wb25lbnQoewogKiAgIHNlbGVjdG9yOiAnYXBwJywKICogICB0ZW1wbGF0ZTogJzxidXR0b24gY291bnRpbmc+SW5jcmVtZW50PC9idXR0b24+JywKICogfSkKICogY2xhc3MgQXBwIHt9CiAqCiAqIGBgYAogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmVnaXN0ZXJzIGFub3RoZXIgRE9NIGV2ZW50IGhhbmRsZXIgdGhhdCBsaXN0ZW5zIGZvciBrZXktcHJlc3MgZXZlbnRzLgogKiBgYGAgdHMKICogaW1wb3J0IHsgSG9zdExpc3RlbmVyLCBDb21wb25lbnQgfSBmcm9tICJcQGFuZ3VsYXIvY29yZSI7CiAqCiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogJ2FwcCcsCiAqICAgdGVtcGxhdGU6IGA8aDE+SGVsbG8sIHlvdSBoYXZlIHByZXNzZWQga2V5cyB7e2NvdW50ZXJ9fSBudW1iZXIgb2YgdGltZXMhPC9oMT4gUHJlc3MgYW55IGtleSB0bwogKiBpbmNyZW1lbnQgdGhlIGNvdW50ZXIuCiAqICAgPGJ1dHRvbiAoY2xpY2spPSJyZXNldENvdW50ZXIoKSI+UmVzZXQgQ291bnRlcjwvYnV0dG9uPmAKICogfSkKICogY2xhc3MgQXBwQ29tcG9uZW50IHsKICogICBjb3VudGVyID0gMDsKICogXEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSkKICogICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7CiAqICAgICB0aGlzLmNvdW50ZXIrKzsKICogICB9CiAqICAgcmVzZXRDb3VudGVyKCkgewogKiAgICAgdGhpcy5jb3VudGVyID0gMDsKICogICB9CiAqIH0KICogYGBgCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEhvc3RMaXN0ZW5lciA9IG1ha2VQcm9wRGVjb3JhdG9yKCdIb3N0TGlzdGVuZXInLCAoybU5KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UX19QT1NUX1IzX18gPSBjb21waWxlQ29tcG9uZW50OwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9DT01QSUxFX0RJUkVDVElWRV9fUE9TVF9SM19fID0gY29tcGlsZURpcmVjdGl2ZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9QSVBFX19QT1NUX1IzX18gPSBjb21waWxlUGlwZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlQgPSBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlRfX1BPU1RfUjNfXzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkUgPSBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkVfX1BPU1RfUjNfXzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9QSVBFID0gU1dJVENIX0NPTVBJTEVfUElQRV9fUE9TVF9SM19fOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1MCRmID0gLyoqCiAqIEBwYXJhbSB7P30gbmdNb2R1bGUKICogQHJldHVybiB7P30KICovCihuZ01vZHVsZSkgPT4gbmdNb2R1bGUsIMm1MSQ0ID0gLyoqCiAqIERlY29yYXRvciB0aGF0IG1hcmtzIHRoZSBmb2xsb3dpbmcgY2xhc3MgYXMgYW4gTmdNb2R1bGUsIGFuZCBzdXBwbGllcwogKiBjb25maWd1cmF0aW9uIG1ldGFkYXRhIGZvciBpdC4KICoKICogKiBUaGUgYGRlY2xhcmF0aW9uc2AgYW5kIGBlbnRyeUNvbXBvbmVudHNgIG9wdGlvbnMgY29uZmlndXJlIHRoZSBjb21waWxlcgogKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYmVsb25ncyB0byB0aGUgTmdNb2R1bGUuCiAqICogVGhlIGBwcm92aWRlcnNgIG9wdGlvbnMgY29uZmlndXJlcyB0aGUgTmdNb2R1bGUncyBpbmplY3RvciB0byBwcm92aWRlCiAqIGRlcGVuZGVuY2llcyB0aGUgTmdNb2R1bGUgbWVtYmVycy4KICogKiBUaGUgYGltcG9ydHNgIGFuZCBgZXhwb3J0c2Agb3B0aW9ucyBicmluZyBpbiBtZW1iZXJzIGZyb20gb3RoZXIgbW9kdWxlcywgYW5kIG1ha2UKICogdGhpcyBtb2R1bGUncyBtZW1iZXJzIGF2YWlsYWJsZSB0byBvdGhlcnMuCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGEKICogQHJldHVybiB7P30KICovCih0eXBlLCBtZXRhKSA9PiBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRSh0eXBlLCBtZXRhKTsKLyoqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IE5nTW9kdWxlID0gbWFrZURlY29yYXRvcignTmdNb2R1bGUnLCAoybUwJGYpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKMm1MSQ0KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NPTVBJTEVfTkdNT0RVTEVfX1BPU1RfUjNfXyA9IGNvbXBpbGVOZ01vZHVsZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRSA9IFNXSVRDSF9DT01QSUxFX05HTU9EVUxFX19QT1NUX1IzX187CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9tZXRhZGF0YS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25faW5pdC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gaW5qZWN0aW9uIHRva2VuIHRoYXQgYWxsb3dzIHlvdSB0byBwcm92aWRlIG9uZSBvciBtb3JlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KICogVGhlc2UgZnVuY3Rpb24gYXJlIGluamVjdGVkIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgYW5kIGV4ZWN1dGVkIGR1cmluZwogKiBhcHAgaW5pdGlhbGl6YXRpb24uIElmIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgcmV0dXJucyBhIFByb21pc2UsIGluaXRpYWxpemF0aW9uCiAqIGRvZXMgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBQcm9taXNlIGlzIHJlc29sdmVkLgogKgogKiBZb3UgY2FuLCBmb3IgZXhhbXBsZSwgY3JlYXRlIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGxvYWRzIGxhbmd1YWdlIGRhdGEKICogb3IgYW4gZXh0ZXJuYWwgY29uZmlndXJhdGlvbiwgYW5kIHByb3ZpZGUgdGhhdCBmdW5jdGlvbiB0byB0aGUgYEFQUF9JTklUSUFMSVpFUmAgdG9rZW4uCiAqIFRoYXQgd2F5LCB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbiBib290c3RyYXAgcHJvY2VzcywKICogYW5kIHRoZSBuZWVkZWQgZGF0YSBpcyBhdmFpbGFibGUgb24gc3RhcnR1cC4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfSU5JVElBTElaRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FwcGxpY2F0aW9uIEluaXRpYWxpemVyJyk7Ci8qKgogKiBBIGNsYXNzIHRoYXQgcmVmbGVjdHMgdGhlIHN0YXRlIG9mIHJ1bm5pbmcge1xAbGluayBBUFBfSU5JVElBTElaRVJ9cy4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEFwcGxpY2F0aW9uSW5pdFN0YXR1cyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXBwSW5pdHMKICAgICAqLwogICAgY29uc3RydWN0b3IoYXBwSW5pdHMpIHsKICAgICAgICB0aGlzLmFwcEluaXRzID0gYXBwSW5pdHM7CiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgICAgIHRoaXMuZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXMKICAgICAgICAgKiBAcGFyYW0gez99IHJlagogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlcywgcmVqKSA9PiB7CiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlczsKICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWo7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBydW5Jbml0aWFsaXplcnMoKSB7CiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXN5bmNJbml0UHJvbWlzZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcGxldGUgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yZXNvbHZlKCk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMuYXBwSW5pdHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFwcEluaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbml0UmVzdWx0ID0gdGhpcy5hcHBJbml0c1tpXSgpOwogICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZSQxKGluaXRSZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmNJbml0UHJvbWlzZXMucHVzaChpbml0UmVzdWx0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBQcm9taXNlLmFsbChhc3luY0luaXRQcm9taXNlcykKICAgICAgICAgICAgLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBjb21wbGV0ZSgpOwogICAgICAgIH0pKQogICAgICAgICAgICAuY2F0Y2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZSA9PiB7CiAgICAgICAgICAgIHRoaXMucmVqZWN0KGUpOwogICAgICAgIH0pKTsKICAgICAgICBpZiAoYXN5bmNJbml0UHJvbWlzZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQp9CkFwcGxpY2F0aW9uSW5pdFN0YXR1cy7JtWZhYyA9IGZ1bmN0aW9uIEFwcGxpY2F0aW9uSW5pdFN0YXR1c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBcHBsaWNhdGlvbkluaXRTdGF0dXMpKMm1ybVpbmplY3QoQVBQX0lOSVRJQUxJWkVSLCA4KSk7IH07CkFwcGxpY2F0aW9uSW5pdFN0YXR1cy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsIGZhY3Rvcnk6IEFwcGxpY2F0aW9uSW5pdFN0YXR1cy7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkFwcGxpY2F0aW9uSW5pdFN0YXR1cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0FQUF9JTklUSUFMSVpFUixdIH0sIHsgdHlwZTogT3B0aW9uYWwgfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyBhIHVuaXF1ZSBzdHJpbmcgaWQgYXNzaWduZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGJ5IEFuZ3VsYXIgYW5kIHVzZWQKICogcHJpbWFyaWx5IGZvciBwcmVmaXhpbmcgYXBwbGljYXRpb24gYXR0cmlidXRlcyBhbmQgQ1NTIHN0eWxlcyB3aGVuCiAqIHtcQGxpbmsgVmlld0VuY2Fwc3VsYXRpb24jRW11bGF0ZWQgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWR9IGlzIGJlaW5nIHVzZWQuCiAqCiAqIElmIHlvdSBuZWVkIHRvIGF2b2lkIHJhbmRvbWx5IGdlbmVyYXRlZCB2YWx1ZSB0byBiZSB1c2VkIGFzIGFuIGFwcGxpY2F0aW9uIGlkLCB5b3UgY2FuIHByb3ZpZGUKICogYSBjdXN0b20gdmFsdWUgdmlhIGEgREkgcHJvdmlkZXIgPCEtLSBUT0RPOiBwcm92aWRlciAtLT4gY29uZmlndXJpbmcgdGhlIHJvb3Qge1xAbGluayBJbmplY3Rvcn0KICogdXNpbmcgdGhpcyB0b2tlbi4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfSUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FwcElkJyk7Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5KCkgewogICAgcmV0dXJuIGAke19yYW5kb21DaGFyKCl9JHtfcmFuZG9tQ2hhcigpfSR7X3JhbmRvbUNoYXIoKX1gOwp9Ci8qKgogKiBQcm92aWRlcnMgdGhhdCB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIEFQUF9JRF9UT0tFTi4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfSURfUkFORE9NX1BST1ZJREVSID0gewogICAgcHJvdmlkZTogQVBQX0lELAogICAgdXNlRmFjdG9yeTogX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5LAogICAgZGVwczogKC8qKiBAdHlwZSB7P30gKi8gKFtdKSksCn07Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX3JhbmRvbUNoYXIoKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1KSk7Cn0KLyoqCiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBwbGF0Zm9ybSBpcyBpbml0aWFsaXplZC4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBQTEFURk9STV9JTklUSUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignUGxhdGZvcm0gSW5pdGlhbGl6ZXInKTsKLyoqCiAqIEEgdG9rZW4gdGhhdCBpbmRpY2F0ZXMgYW4gb3BhcXVlIHBsYXRmb3JtIGlkLgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFBMQVRGT1JNX0lEID0gbmV3IEluamVjdGlvblRva2VuKCdQbGF0Zm9ybSBJRCcpOwovKioKICogQWxsIGNhbGxiYWNrcyBwcm92aWRlZCB2aWEgdGhpcyB0b2tlbiB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgY29tcG9uZW50IHRoYXQgaXMgYm9vdHN0cmFwcGVkLgogKiBTaWduYXR1cmUgb2YgdGhlIGNhbGxiYWNrOgogKgogKiBgKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmKSA9PiB2b2lkYC4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSID0gbmV3IEluamVjdGlvblRva2VuKCdhcHBCb290c3RyYXBMaXN0ZW5lcicpOwovKioKICogQSB0b2tlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFBBQ0tBR0VfUk9PVF9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FwcGxpY2F0aW9uIFBhY2thZ2VzIFJvb3QgVVJMJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb25zb2xlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIENvbnNvbGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvZyhtZXNzYWdlKSB7CiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGUKICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTsKICAgIH0KICAgIC8vIE5vdGU6IGZvciByZXBvcnRpbmcgZXJyb3JzIHVzZSBgRE9NLmxvZ0Vycm9yKClgIGFzIGl0IGlzIHBsYXRmb3JtIHNwZWNpZmljCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgd2FybihtZXNzYWdlKSB7CiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGUKICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7CiAgICB9Cn0KQ29uc29sZS7JtWZhYyA9IGZ1bmN0aW9uIENvbnNvbGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29uc29sZSkoKTsgfTsKQ29uc29sZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBDb25zb2xlLCBmYWN0b3J5OiBDb25zb2xlLsm1ZmFjIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaTE4bi90b2tlbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBzZXQgdGhlIGxvY2FsZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgogKiBJdCBpcyB1c2VkIGZvciBpMThuIGV4dHJhY3Rpb24sIGJ5IGkxOG4gcGlwZXMgKERhdGVQaXBlLCBJMThuUGx1cmFsUGlwZSwgQ3VycmVuY3lQaXBlLAogKiBEZWNpbWFsUGlwZSBhbmQgUGVyY2VudFBpcGUpIGFuZCBieSBJQ1UgZXhwcmVzc2lvbnMuCiAqCiAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC1sb2NhbGUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBpbXBvcnQgeyBMT0NBTEVfSUQgfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJzsKICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAvYXBwLm1vZHVsZSc7CiAqCiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IExPQ0FMRV9JRCwgdXNlVmFsdWU6ICdlbi1VUycgfV0KICogfSk7CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IExPQ0FMRV9JRCQxID0gbmV3IEluamVjdGlvblRva2VuKCdMb2NhbGVJZCcpOwovKioKICogUHJvdmlkZSB0aGlzIHRva2VuIHRvIHNldCB0aGUgZGVmYXVsdCBjdXJyZW5jeSBjb2RlIHlvdXIgYXBwbGljYXRpb24gdXNlcyBmb3IKICogQ3VycmVuY3lQaXBlIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVuY3kgY29kZSBwYXNzZWQgaW50byBpdC4gVGhpcyBpcyBvbmx5IHVzZWQgYnkKICogQ3VycmVuY3lQaXBlIGFuZCBoYXMgbm8gcmVsYXRpb24gdG8gbG9jYWxlIGN1cnJlbmN5LiBEZWZhdWx0cyB0byBVU0QgaWYgbm90IGNvbmZpZ3VyZWQuCiAqCiAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC1sb2NhbGUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiA8ZGl2IGNsYXNzPSJhbGVydCBpcy1oZWxwZnVsIj4KICoKICogKipEZXByZWNhdGlvbiBub3RpY2U6KioKICoKICogVGhlIGRlZmF1bHQgY3VycmVuY3kgY29kZSBpcyBjdXJyZW50bHkgYWx3YXlzIGBVU0RgIGJ1dCB0aGlzIGlzIGRlcHJlY2F0ZWQgZnJvbSB2OS4KICoKICogKipJbiB2MTAgdGhlIGRlZmF1bHQgY3VycmVuY3kgY29kZSB3aWxsIGJlIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgbG9jYWxlLioqCiAqCiAqIElmIHlvdSBuZWVkIHRoZSBwcmV2aW91cyBiZWhhdmlvciB0aGVuIHNldCBpdCBieSBjcmVhdGluZyBhIGBERUZBVUxUX0NVUlJFTkNZX0NPREVgIHByb3ZpZGVyIGluCiAqIHlvdXIgYXBwbGljYXRpb24gYE5nTW9kdWxlYDoKICoKICogYGBgdHMKICoge3Byb3ZpZGU6IERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSwgdXNlVmFsdWU6ICdVU0QnfQogKiBgYGAKICoKICogPC9kaXY+CiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgRXhhbXBsZQogKgogKiBgYGB0eXBlc2NyaXB0CiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJzsKICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAvYXBwLm1vZHVsZSc7CiAqCiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSwgdXNlVmFsdWU6ICdFVVInIH1dCiAqIH0pOwogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBERUZBVUxUX0NVUlJFTkNZX0NPREUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0RlZmF1bHRDdXJyZW5jeUNvZGUnKTsKLyoqCiAqIFVzZSB0aGlzIHRva2VuIGF0IGJvb3RzdHJhcCB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHlvdXIgdHJhbnNsYXRpb24gZmlsZSAoYHh0YmAsCiAqIGB4bGZgIG9yIGB4bGYyYCkgd2hlbiB5b3Ugd2FudCB0byB0cmFuc2xhdGUgeW91ciBhcHBsaWNhdGlvbiBpbiBhbm90aGVyIGxhbmd1YWdlLgogKgogKiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI21lcmdlKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogaW1wb3J0IHsgVFJBTlNMQVRJT05TIH0gZnJvbSAnXEBhbmd1bGFyL2NvcmUnOwogKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7CiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnOwogKgogKiAvLyBjb250ZW50IG9mIHlvdXIgdHJhbnNsYXRpb24gZmlsZQogKiBjb25zdCB0cmFuc2xhdGlvbnMgPSAnLi4uLic7CiAqCiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRSQU5TTEFUSU9OUywgdXNlVmFsdWU6IHRyYW5zbGF0aW9ucyB9XQogKiB9KTsKICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVFJBTlNMQVRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdUcmFuc2xhdGlvbnMnKTsKLyoqCiAqIFByb3ZpZGUgdGhpcyB0b2tlbiBhdCBib290c3RyYXAgdG8gc2V0IHRoZSBmb3JtYXQgb2YgeW91ciB7XEBsaW5rIFRSQU5TTEFUSU9OU306IGB4dGJgLAogKiBgeGxmYCBvciBgeGxmMmAuCiAqCiAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jbWVyZ2UpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBpbXBvcnQgeyBUUkFOU0xBVElPTlNfRk9STUFUIH0gZnJvbSAnXEBhbmd1bGFyL2NvcmUnOwogKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7CiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnOwogKgogKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSwgewogKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBUUkFOU0xBVElPTlNfRk9STUFULCB1c2VWYWx1ZTogJ3hsZicgfV0KICogfSk7CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFRSQU5TTEFUSU9OU19GT1JNQVQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RyYW5zbGF0aW9uc0Zvcm1hdCcpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaXZ5X3N3aXRjaC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0lWWV9FTkFCTEVEX19QT1NUX1IzX18gPSB0cnVlOwovKiogQHR5cGUgez99ICovCmNvbnN0IGl2eUVuYWJsZWQgPSBTV0lUQ0hfSVZZX0VOQUJMRURfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9jb21waWxlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ29tYmluYXRpb24gb2YgTmdNb2R1bGVGYWN0b3J5IGFuZCBDb21wb25lbnRGYWN0b3J5cy4KICoKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIE1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlRmFjdG9yeQogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3JpZXMKICAgICAqLwogICAgY29uc3RydWN0b3IobmdNb2R1bGVGYWN0b3J5LCBjb21wb25lbnRGYWN0b3JpZXMpIHsKICAgICAgICB0aGlzLm5nTW9kdWxlRmFjdG9yeSA9IG5nTW9kdWxlRmFjdG9yeTsKICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcmllcyA9IGNvbXBvbmVudEZhY3RvcmllczsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18gPSAoLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsKICAgIHJldHVybiBuZXcgTmdNb2R1bGVGYWN0b3J5JDEobW9kdWxlVHlwZSk7Cn0pOwovKiogQHR5cGUgez99ICovCmNvbnN0IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZVN5bmNfX1BPU1RfUjNfXzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDb21waWxlcl9jb21waWxlTW9kdWxlQXN5bmNfX1BPU1RfUjNfXyA9ICgvKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiAobW9kdWxlVHlwZSkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTsKfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jX19QT1NUX1IzX187Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jX19QT1NUX1IzX18gPSAoLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nTW9kdWxlRmFjdG9yeSA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18obW9kdWxlVHlwZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb2R1bGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmdNb2R1bGVEZWYobW9kdWxlVHlwZSkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcmllcyA9IG1heWJlVW53cmFwRm4obW9kdWxlRGVmLmRlY2xhcmF0aW9ucykKICAgICAgICAucmVkdWNlKCgvKioKICAgICAqIEBwYXJhbSB7P30gZmFjdG9yaWVzCiAgICAgKiBAcGFyYW0gez99IGRlY2xhcmF0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZmFjdG9yaWVzLCBkZWNsYXJhdGlvbikgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnREZWYgPSBnZXRDb21wb25lbnREZWYoZGVjbGFyYXRpb24pOwogICAgICAgIGNvbXBvbmVudERlZiAmJiBmYWN0b3JpZXMucHVzaChuZXcgQ29tcG9uZW50RmFjdG9yeSQxKGNvbXBvbmVudERlZikpOwogICAgICAgIHJldHVybiBmYWN0b3JpZXM7CiAgICB9KSwgKC8qKiBAdHlwZSB7P30gKi8gKFtdKSkpOwogICAgcmV0dXJuIG5ldyBNb2R1bGVXaXRoQ29tcG9uZW50RmFjdG9yaWVzKG5nTW9kdWxlRmFjdG9yeSwgY29tcG9uZW50RmFjdG9yaWVzKTsKfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jX19QT1NUX1IzX187Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luY19fUE9TVF9SM19fID0gKC8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTsKfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmNfX1BPU1RfUjNfXzsKLyoqCiAqIExvdy1sZXZlbCBzZXJ2aWNlIGZvciBydW5uaW5nIHRoZSBhbmd1bGFyIGNvbXBpbGVyIGR1cmluZyBydW50aW1lCiAqIHRvIGNyZWF0ZSB7XEBsaW5rIENvbXBvbmVudEZhY3Rvcnl9cywgd2hpY2gKICogY2FuIGxhdGVyIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCByZW5kZXIgYSBDb21wb25lbnQgaW5zdGFuY2UuCiAqCiAqIEVhY2ggYFxATmdNb2R1bGVgIHByb3ZpZGVzIGFuIG93biBgQ29tcGlsZXJgIHRvIGl0cyBpbmplY3RvciwKICogdGhhdCB3aWxsIHVzZSB0aGUgZGlyZWN0aXZlcy9waXBlcyBvZiB0aGUgbmcgbW9kdWxlIGZvciBjb21waWxhdGlvbgogKiBvZiBjb21wb25lbnRzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQ29tcGlsZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgdGhlIGdpdmVuIE5nTW9kdWxlIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHMuIEFsbCB0ZW1wbGF0ZXMgb2YgdGhlIGNvbXBvbmVudHMgbGlzdGVkCiAgICAgICAgICogaW4gYGVudHJ5Q29tcG9uZW50c2AgaGF2ZSB0byBiZSBpbmxpbmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZVN5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlU3luYzsKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gTmdNb2R1bGUgYW5kIGFsbCBvZiBpdHMgY29tcG9uZW50cwogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZUFzeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jOwogICAgICAgIC8qKgogICAgICAgICAqIFNhbWUgYXMge1xAbGluayAjY29tcGlsZU1vZHVsZVN5bmN9IGJ1dCBhbHNvIGNyZWF0ZXMgQ29tcG9uZW50RmFjdG9yaWVzIGZvciBhbGwgY29tcG9uZW50cy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYzsKICAgICAgICAvKioKICAgICAgICAgKiBTYW1lIGFzIHtcQGxpbmsgI2NvbXBpbGVNb2R1bGVBc3luY30gYnV0IGFsc28gY3JlYXRlcyBDb21wb25lbnRGYWN0b3JpZXMgZm9yIGFsbCBjb21wb25lbnRzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmM7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFycyBhbGwgY2FjaGVzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xlYXJDYWNoZSgpIHsgfQogICAgLyoqCiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50L25nTW9kdWxlLgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbGVhckNhY2hlRm9yKHR5cGUpIHsgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpZCBmb3IgYSBnaXZlbiBOZ01vZHVsZSwgaWYgb25lIGlzIGRlZmluZWQgYW5kIGtub3duIHRvIHRoZSBjb21waWxlci4KICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0TW9kdWxlSWQobW9kdWxlVHlwZSkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9Cn0KQ29tcGlsZXIuybVmYWMgPSBmdW5jdGlvbiBDb21waWxlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDb21waWxlcikoKTsgfTsKQ29tcGlsZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQ29tcGlsZXIsIGZhY3Rvcnk6IENvbXBpbGVyLsm1ZmFjIH0pOwovKioKICogVG9rZW4gdG8gcHJvdmlkZSBDb21waWxlck9wdGlvbnMgaW4gdGhlIHBsYXRmb3JtIGluamVjdG9yLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IENPTVBJTEVSX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2NvbXBpbGVyT3B0aW9ucycpOwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpjb25zdCBwcm9taXNlID0gKCgpID0+IFByb21pc2UucmVzb2x2ZSgwKSkoKTsKZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2soZm4pIHsKICAgIGlmICh0eXBlb2YgWm9uZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyB1c2UgcHJvbWlzZSB0byBzY2hlZHVsZSBtaWNyb1Rhc2sgaW5zdGVhZCBvZiB1c2UgWm9uZQogICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgIGZuICYmIGZuLmFwcGx5KG51bGwsIG51bGwpOwogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgWm9uZS5jdXJyZW50LnNjaGVkdWxlTWljcm9UYXNrKCdzY2hlZHVsZU1pY3JvdGFzaycsIGZuKTsKICAgIH0KfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBnZXROYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSB7CiAgICBsZXQgbmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gX2dsb2JhbFsncmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107CiAgICBsZXQgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBfZ2xvYmFsWydjYW5jZWxBbmltYXRpb25GcmFtZSddOwogICAgaWYgKHR5cGVvZiBab25lICE9PSAndW5kZWZpbmVkJyAmJiBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAvLyB1c2UgdW5wYXRjaGVkIHZlcnNpb24gb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG5hdGl2ZSBkZWxlZ2F0ZSkgaWYgcG9zc2libGUKICAgICAgICAvLyB0byBhdm9pZCBhbm90aGVyIENoYW5nZSBkZXRlY3Rpb24KICAgICAgICBjb25zdCB1bnBhdGNoZWRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWVbWm9uZS5fX3N5bWJvbF9fKCdPcmlnaW5hbERlbGVnYXRlJyldOwogICAgICAgIGlmICh1bnBhdGNoZWRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAgICAgbmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdW5wYXRjaGVkUmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogICAgICAgIH0KICAgICAgICBjb25zdCB1bnBhdGNoZWRDYW5jZWxBbmltYXRpb25GcmFtZSA9IG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lW1pvbmUuX19zeW1ib2xfXygnT3JpZ2luYWxEZWxlZ2F0ZScpXTsKICAgICAgICBpZiAodW5wYXRjaGVkQ2FuY2VsQW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAgICAgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB1bnBhdGNoZWRDYW5jZWxBbmltYXRpb25GcmFtZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4geyBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3pvbmUvbmdfem9uZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIGZvciBleGVjdXRpbmcgd29yayBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNlIG9mIHRoaXMgc2VydmljZSBpcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSB3aGVuIHN0YXJ0aW5nIGEgd29yayBjb25zaXN0aW5nIG9mCiAqIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgVUkgdXBkYXRlcyBvciBlcnJvciBoYW5kbGluZyB0byBiZSBoYW5kbGVkIGJ5CiAqIEFuZ3VsYXIuIFN1Y2ggdGFza3MgY2FuIGJlIGtpY2tlZCBvZmYgdmlhIHtcQGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSBhbmQgaWYgbmVlZGVkLCB0aGVzZSB0YXNrcwogKiBjYW4gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIHZpYSB7XEBsaW5rICNydW59LgogKgogKiA8IS0tIFRPRE86IGFkZC9maXggbGlua3MgdG86CiAqICAgLSBkb2NzIGV4cGxhaW5pbmcgem9uZXMgYW5kIHRoZSB1c2Ugb2Ygem9uZXMgaW4gQW5ndWxhciBhbmQgY2hhbmdlLWRldGVjdGlvbgogKiAgIC0gbGluayB0byBydW5PdXRzaWRlQW5ndWxhci9ydW4gKHRocm91Z2hvdXQgdGhpcyBmaWxlISkKICogICAtLT4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYAogKiBpbXBvcnQge0NvbXBvbmVudCwgTmdab25lfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAqIGltcG9ydCB7TmdJZn0gZnJvbSAnXEBhbmd1bGFyL2NvbW1vbic7CiAqCiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogJ25nLXpvbmUtZGVtbycsCiAqICAgdGVtcGxhdGU6IGAKICogICAgIDxoMj5EZW1vOiBOZ1pvbmU8L2gyPgogKgogKiAgICAgPHA+UHJvZ3Jlc3M6IHt7cHJvZ3Jlc3N9fSU8L3A+CiAqICAgICA8cCAqbmdJZj0icHJvZ3Jlc3MgPj0gMTAwIj5Eb25lIHByb2Nlc3Npbmcge3tsYWJlbH19IG9mIEFuZ3VsYXIgem9uZSE8L3A+CiAqCiAqICAgICA8YnV0dG9uIChjbGljayk9InByb2Nlc3NXaXRoaW5Bbmd1bGFyWm9uZSgpIj5Qcm9jZXNzIHdpdGhpbiBBbmd1bGFyIHpvbmU8L2J1dHRvbj4KICogICAgIDxidXR0b24gKGNsaWNrKT0icHJvY2Vzc091dHNpZGVPZkFuZ3VsYXJab25lKCkiPlByb2Nlc3Mgb3V0c2lkZSBvZiBBbmd1bGFyIHpvbmU8L2J1dHRvbj4KICogICBgLAogKiB9KQogKiBleHBvcnQgY2xhc3MgTmdab25lRGVtbyB7CiAqICAgcHJvZ3Jlc3M6IG51bWJlciA9IDA7CiAqICAgbGFiZWw6IHN0cmluZzsKICoKICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge30KICoKICogICAvLyBMb29wIGluc2lkZSB0aGUgQW5ndWxhciB6b25lCiAqICAgLy8gc28gdGhlIFVJIERPRVMgcmVmcmVzaCBhZnRlciBlYWNoIHNldFRpbWVvdXQgY3ljbGUKICogICBwcm9jZXNzV2l0aGluQW5ndWxhclpvbmUoKSB7CiAqICAgICB0aGlzLmxhYmVsID0gJ2luc2lkZSc7CiAqICAgICB0aGlzLnByb2dyZXNzID0gMDsKICogICAgIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gY29uc29sZS5sb2coJ0luc2lkZSBEb25lIScpKTsKICogICB9CiAqCiAqICAgLy8gTG9vcCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUKICogICAvLyBzbyB0aGUgVUkgRE9FUyBOT1QgcmVmcmVzaCBhZnRlciBlYWNoIHNldFRpbWVvdXQgY3ljbGUKICogICBwcm9jZXNzT3V0c2lkZU9mQW5ndWxhclpvbmUoKSB7CiAqICAgICB0aGlzLmxhYmVsID0gJ291dHNpZGUnOwogKiAgICAgdGhpcy5wcm9ncmVzcyA9IDA7CiAqICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gewogKiAgICAgICB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKCgpID0+IHsKICogICAgICAgICAvLyByZWVudGVyIHRoZSBBbmd1bGFyIHpvbmUgYW5kIGRpc3BsYXkgZG9uZQogKiAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4geyBjb25zb2xlLmxvZygnT3V0c2lkZSBEb25lIScpOyB9KTsKICogICAgICAgfSk7CiAqICAgICB9KTsKICogICB9CiAqCiAqICAgX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7CiAqICAgICB0aGlzLnByb2dyZXNzICs9IDE7CiAqICAgICBjb25zb2xlLmxvZyhgQ3VycmVudCBwcm9ncmVzczogJHt0aGlzLnByb2dyZXNzfSVgKTsKICoKICogICAgIGlmICh0aGlzLnByb2dyZXNzIDwgMTAwKSB7CiAqICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrKSwgMTApOwogKiAgICAgfSBlbHNlIHsKICogICAgICAgZG9uZUNhbGxiYWNrKCk7CiAqICAgICB9CiAqICAgfQogKiB9CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdab25lIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAqLwogICAgY29uc3RydWN0b3IoeyBlbmFibGVMb25nU3RhY2tUcmFjZSA9IGZhbHNlLCBzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uID0gZmFsc2UgfSkgewogICAgICAgIHRoaXMuaGFzUGVuZGluZ01hY3JvdGFza3MgPSBmYWxzZTsKICAgICAgICB0aGlzLmhhc1BlbmRpbmdNaWNyb3Rhc2tzID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgbWljcm90YXNrcyBvciBtYWNyb3Rhc2tzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaXNTdGFibGUgPSB0cnVlOwogICAgICAgIC8qKgogICAgICAgICAqIE5vdGlmaWVzIHdoZW4gY29kZSBlbnRlcnMgQW5ndWxhciBab25lLiBUaGlzIGdldHMgZmlyZWQgZmlyc3Qgb24gVk0gVHVybi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uVW5zdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTsKICAgICAgICAvKioKICAgICAgICAgKiBOb3RpZmllcyB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgbWljcm90YXNrcyBlbnF1ZXVlZCBpbiB0aGUgY3VycmVudCBWTSBUdXJuLgogICAgICAgICAqIFRoaXMgaXMgYSBoaW50IGZvciBBbmd1bGFyIHRvIGRvIGNoYW5nZSBkZXRlY3Rpb24sIHdoaWNoIG1heSBlbnF1ZXVlIG1vcmUgbWljcm90YXNrcy4KICAgICAgICAgKiBGb3IgdGhpcyByZWFzb24gdGhpcyBldmVudCBjYW4gZmlyZSBtdWx0aXBsZSB0aW1lcyBwZXIgVk0gVHVybi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uTWljcm90YXNrRW1wdHkgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTsKICAgICAgICAvKioKICAgICAgICAgKiBOb3RpZmllcyB3aGVuIHRoZSBsYXN0IGBvbk1pY3JvdGFza0VtcHR5YCBoYXMgcnVuIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBtaWNyb3Rhc2tzLCB3aGljaAogICAgICAgICAqIGltcGxpZXMgd2UgYXJlIGFib3V0IHRvIHJlbGlucXVpc2ggVk0gdHVybi4KICAgICAgICAgKiBUaGlzIGV2ZW50IGdldHMgY2FsbGVkIGp1c3Qgb25jZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uU3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogTm90aWZpZXMgdGhhdCBhbiBlcnJvciBoYXMgYmVlbiBkZWxpdmVyZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7CiAgICAgICAgaWYgKHR5cGVvZiBab25lID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW4gdGhpcyBjb25maWd1cmF0aW9uIEFuZ3VsYXIgcmVxdWlyZXMgWm9uZS5qc2ApOwogICAgICAgIH0KICAgICAgICBab25lLmFzc2VydFpvbmVQYXRjaGVkKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNlbGYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpOwogICAgICAgIHNlbGYuX25lc3RpbmcgPSAwOwogICAgICAgIHNlbGYuX291dGVyID0gc2VsZi5faW5uZXIgPSBab25lLmN1cnJlbnQ7CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnd3RmWm9uZVNwZWMnXSkgewogICAgICAgICAgICBzZWxmLl9pbm5lciA9IHNlbGYuX2lubmVyLmZvcmsoKCgvKiogQHR5cGUgez99ICovIChab25lKSkpWyd3dGZab25lU3BlYyddKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnVGFza1RyYWNraW5nWm9uZVNwZWMnXSkgewogICAgICAgICAgICBzZWxmLl9pbm5lciA9IHNlbGYuX2lubmVyLmZvcmsobmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovIChab25lKSkpWydUYXNrVHJhY2tpbmdab25lU3BlYyddKSkpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVuYWJsZUxvbmdTdGFja1RyYWNlICYmICgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnbG9uZ1N0YWNrVHJhY2Vab25lU3BlYyddKSB7CiAgICAgICAgICAgIHNlbGYuX2lubmVyID0gc2VsZi5faW5uZXIuZm9yaygoKC8qKiBAdHlwZSB7P30gKi8gKFpvbmUpKSlbJ2xvbmdTdGFja1RyYWNlWm9uZVNwZWMnXSk7CiAgICAgICAgfQogICAgICAgIHNlbGYuc2hvdWxkQ29hbGVzY2VFdmVudENoYW5nZURldGVjdGlvbiA9IHNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb247CiAgICAgICAgc2VsZi5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSAtMTsKICAgICAgICBzZWxmLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGdldE5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSgpLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZTsKICAgICAgICBmb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvcihzZWxmKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGlzSW5Bbmd1bGFyWm9uZSgpIHsKICAgICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmdldCgnaXNBbmd1bGFyWm9uZScpID09PSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgYXNzZXJ0SW5Bbmd1bGFyWm9uZSgpIHsKICAgICAgICBpZiAoIU5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGluIEFuZ3VsYXIgWm9uZSwgYnV0IGl0IGlzIG5vdCEnKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBhc3NlcnROb3RJbkFuZ3VsYXJab25lKCkgewogICAgICAgIGlmIChOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBub3QgYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMhJyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbiBzeW5jaHJvbm91c2x5IHdpdGhpbiB0aGUgQW5ndWxhciB6b25lIGFuZCByZXR1cm5zIHZhbHVlIHJldHVybmVkIGJ5CiAgICAgKiB0aGUgZnVuY3Rpb24uCiAgICAgKgogICAgICogUnVubmluZyBmdW5jdGlvbnMgdmlhIGBydW5gIGFsbG93cyB5b3UgdG8gcmVlbnRlciBBbmd1bGFyIHpvbmUgZnJvbSBhIHRhc2sgdGhhdCB3YXMgZXhlY3V0ZWQKICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSAodHlwaWNhbGx5IHN0YXJ0ZWQgdmlhIHtcQGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSkuCiAgICAgKgogICAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb20KICAgICAqIHdpdGhpbiB0aGUgQW5ndWxhciB6b25lLgogICAgICoKICAgICAqIElmIGEgc3luY2hyb25vdXMgZXJyb3IgaGFwcGVucyBpdCB3aWxsIGJlIHJldGhyb3duIGFuZCBub3QgcmVwb3J0ZWQgdmlhIGBvbkVycm9yYC4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lci5ydW4oZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbiBzeW5jaHJvbm91c2x5IHdpdGhpbiB0aGUgQW5ndWxhciB6b25lIGFzIGEgdGFzayBhbmQgcmV0dXJucyB2YWx1ZQogICAgICogcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgogICAgICoKICAgICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkCiAgICAgKiBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUgKHR5cGljYWxseSBzdGFydGVkIHZpYSB7XEBsaW5rICNydW5PdXRzaWRlQW5ndWxhcn0pLgogICAgICoKICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tCiAgICAgKiB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS4KICAgICAqCiAgICAgKiBJZiBhIHN5bmNocm9ub3VzIGVycm9yIGhhcHBlbnMgaXQgd2lsbCBiZSByZXRocm93biBhbmQgbm90IHJlcG9ydGVkIHZpYSBgb25FcnJvcmAuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgKiBAcGFyYW0gez89fSBhcHBseUFyZ3MKICAgICAqIEBwYXJhbSB7Pz19IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJ1blRhc2soZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHpvbmUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpKSkuX2lubmVyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YXNrID0gem9uZS5zY2hlZHVsZUV2ZW50VGFzaygnTmdab25lRXZlbnQ6ICcgKyBuYW1lLCBmbiwgRU1QVFlfUEFZTE9BRCwgbm9vcCQxLCBub29wJDEpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoem9uZS5ydW5UYXNrKHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgem9uZS5jYW5jZWxUYXNrKHRhc2spOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2FtZSBhcyBgcnVuYCwgZXhjZXB0IHRoYXQgc3luY2hyb25vdXMgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIGZvcndhcmRlZCB2aWEgYG9uRXJyb3JgIGFuZCBub3QKICAgICAqIHJldGhyb3duLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5VGhpcwogICAgICogQHBhcmFtIHs/PX0gYXBwbHlBcmdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBydW5HdWFyZGVkKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lci5ydW5HdWFyZGVkKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykpKTsKICAgIH0KICAgIC8qKgogICAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSBpbiBBbmd1bGFyJ3MgcGFyZW50IHpvbmUgYW5kIHJldHVybnMgdmFsdWUgcmV0dXJuZWQgYnkKICAgICAqIHRoZSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBSdW5uaW5nIGZ1bmN0aW9ucyB2aWEge1xAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9IGFsbG93cyB5b3UgdG8gZXNjYXBlIEFuZ3VsYXIncyB6b25lIGFuZCBkbwogICAgICogd29yayB0aGF0CiAgICAgKiBkb2Vzbid0IHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UtZGV0ZWN0aW9uIG9yIGlzIHN1YmplY3QgdG8gQW5ndWxhcidzIGVycm9yIGhhbmRsaW5nLgogICAgICoKICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tCiAgICAgKiBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuCiAgICAgKgogICAgICogVXNlIHtcQGxpbmsgI3J1bn0gdG8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkbyB3b3JrIHRoYXQgdXBkYXRlcyB0aGUgYXBwbGljYXRpb24gbW9kZWwuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuT3V0c2lkZUFuZ3VsYXIoZm4pIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpKS5fb3V0ZXIucnVuKGZuKSkpOwogICAgfQp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9vcCQxKCkgeyB9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRU1QVFlfUEFZTE9BRCA9IHt9OwovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja1N0YWJsZSh6b25lKSB7CiAgICBpZiAoem9uZS5fbmVzdGluZyA9PSAwICYmICF6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzICYmICF6b25lLmlzU3RhYmxlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgem9uZS5fbmVzdGluZysrOwogICAgICAgICAgICB6b25lLm9uTWljcm90YXNrRW1wdHkuZW1pdChudWxsKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHpvbmUuX25lc3RpbmctLTsKICAgICAgICAgICAgaWYgKCF6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gem9uZS5vblN0YWJsZS5lbWl0KG51bGwpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICB6b25lLmlzU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50cyh6b25lKSB7CiAgICBpZiAoem9uZS5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgIT09IC0xKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgem9uZS5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSB6b25lLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZS5jYWxsKF9nbG9iYWwsICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICB6b25lLmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IC0xOwogICAgICAgIHVwZGF0ZU1pY3JvVGFza1N0YXR1cyh6b25lKTsKICAgICAgICBjaGVja1N0YWJsZSh6b25lKTsKICAgIH0pKTsKICAgIHVwZGF0ZU1pY3JvVGFza1N0YXR1cyh6b25lKTsKfQovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvcih6b25lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50c0RlbGVnYXRlID0gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gewogICAgICAgIGRlbGF5Q2hhbmdlRGV0ZWN0aW9uRm9yRXZlbnRzKHpvbmUpOwogICAgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXliZURlbGF5Q2hhbmdlRGV0ZWN0aW9uID0gISF6b25lLnNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb24gJiYKICAgICAgICB6b25lLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50c0RlbGVnYXRlOwogICAgem9uZS5faW5uZXIgPSB6b25lLl9pbm5lci5mb3JrKHsKICAgICAgICBuYW1lOiAnYW5ndWxhcicsCiAgICAgICAgcHJvcGVydGllczogKC8qKiBAdHlwZSB7P30gKi8gKHsgJ2lzQW5ndWxhclpvbmUnOiB0cnVlLCAnbWF5YmVEZWxheUNoYW5nZURldGVjdGlvbic6IG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24gfSkpLAogICAgICAgIG9uSW52b2tlVGFzazogKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEBwYXJhbSB7P30gdGFzawogICAgICAgICAqIEBwYXJhbSB7P30gYXBwbHlUaGlzCiAgICAgICAgICogQHBhcmFtIHs/fSBhcHBseUFyZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChkZWxlZ2F0ZSwgY3VycmVudCwgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb25FbnRlcih6b25lKTsKICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VUYXNrKHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgaWYgKG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24gJiYgdGFzay50eXBlID09PSAnZXZlbnRUYXNrJykgewogICAgICAgICAgICAgICAgICAgIG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9uTGVhdmUoem9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBvbkludm9rZTogKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0gez99IGFwcGx5VGhpcwogICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICAgICAqIEBwYXJhbSB7Pz19IHNvdXJjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvbkVudGVyKHpvbmUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZSh0YXJnZXQsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIG9uTGVhdmUoem9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBvbkhhc1Rhc2s6ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRlbGVnYXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAgICAgKiBAcGFyYW0gez99IGhhc1Rhc2tTdGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGhhc1Rhc2tTdGF0ZSkgPT4gewogICAgICAgICAgICBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRhcmdldCkgewogICAgICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBoYXNUYXNrIGV2ZW50cyB3aGljaCBvcmlnaW5hdGUgZnJvbSBvdXIgem9uZQogICAgICAgICAgICAgICAgLy8gKEEgY2hpbGQgaGFzVGFzayBldmVudCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMpCiAgICAgICAgICAgICAgICBpZiAoaGFzVGFza1N0YXRlLmNoYW5nZSA9PSAnbWljcm9UYXNrJykgewogICAgICAgICAgICAgICAgICAgIHpvbmUuX2hhc1BlbmRpbmdNaWNyb3Rhc2tzID0gaGFzVGFza1N0YXRlLm1pY3JvVGFzazsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVNaWNyb1Rhc2tTdGF0dXMoem9uZSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGFibGUoem9uZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNUYXNrU3RhdGUuY2hhbmdlID09ICdtYWNyb1Rhc2snKSB7CiAgICAgICAgICAgICAgICAgICAgem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyA9IGhhc1Rhc2tTdGF0ZS5tYWNyb1Rhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBvbkhhbmRsZUVycm9yOiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxlZ2F0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGVycm9yKSA9PiB7CiAgICAgICAgICAgIGRlbGVnYXRlLmhhbmRsZUVycm9yKHRhcmdldCwgZXJyb3IpOwogICAgICAgICAgICB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHpvbmUub25FcnJvci5lbWl0KGVycm9yKSkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSkKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez99IHpvbmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVwZGF0ZU1pY3JvVGFza1N0YXR1cyh6b25lKSB7CiAgICBpZiAoem9uZS5faGFzUGVuZGluZ01pY3JvdGFza3MgfHwKICAgICAgICAoem9uZS5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uICYmIHpvbmUubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkICE9PSAtMSkpIHsKICAgICAgICB6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzID0gdHJ1ZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHpvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MgPSBmYWxzZTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBvbkVudGVyKHpvbmUpIHsKICAgIHpvbmUuX25lc3RpbmcrKzsKICAgIGlmICh6b25lLmlzU3RhYmxlKSB7CiAgICAgICAgem9uZS5pc1N0YWJsZSA9IGZhbHNlOwogICAgICAgIHpvbmUub25VbnN0YWJsZS5lbWl0KG51bGwpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHpvbmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG9uTGVhdmUoem9uZSkgewogICAgem9uZS5fbmVzdGluZy0tOwogICAgY2hlY2tTdGFibGUoem9uZSk7Cn0KLyoqCiAqIFByb3ZpZGVzIGEgbm9vcCBpbXBsZW1lbnRhdGlvbiBvZiBgTmdab25lYCB3aGljaCBkb2VzIG5vdGhpbmcuIFRoaXMgem9uZSByZXF1aXJlcyBleHBsaWNpdCBjYWxscwogKiB0byBmcmFtZXdvcmsgdG8gcGVyZm9ybSByZW5kZXJpbmcuCiAqLwpjbGFzcyBOb29wTmdab25lIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3MgPSBmYWxzZTsKICAgICAgICB0aGlzLmhhc1BlbmRpbmdNYWNyb3Rhc2tzID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc1N0YWJsZSA9IHRydWU7CiAgICAgICAgdGhpcy5vblVuc3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25NaWNyb3Rhc2tFbXB0eSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLm9uU3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgKiBAcGFyYW0gez89fSBhcHBseUFyZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJ1bihmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsKICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuR3VhcmRlZChmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsKICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBydW5PdXRzaWRlQW5ndWxhcihmbikgewogICAgICAgIHJldHVybiBmbigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICogQHBhcmFtIHs/PX0gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuVGFzayhmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIG5hbWUpIHsKICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgfQp9Ci8qKgogKiBUaGUgVGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyB0ZXN0aW5nIGhvb2tzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20KICogdGhlIGJyb3dzZXIgYW5kIGJ5IHNlcnZpY2VzIHN1Y2ggYXMgUHJvdHJhY3Rvci4gRWFjaCBib290c3RyYXBwZWQgQW5ndWxhcgogKiBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSB3aWxsIGhhdmUgYW4gaW5zdGFuY2Ugb2YgVGVzdGFiaWxpdHkuCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBUZXN0YWJpbGl0eSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihfbmdab25lKSB7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9wZW5kaW5nQ291bnQgPSAwOwogICAgICAgIHRoaXMuX2lzWm9uZVN0YWJsZSA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBhbnkgd29yayB3YXMgZG9uZSBzaW5jZSB0aGUgbGFzdCAnd2hlblN0YWJsZScgY2FsbGJhY2suIFRoaXMgaXMKICAgICAgICAgKiB1c2VmdWwgdG8gZGV0ZWN0IGlmIHRoaXMgY291bGQgaGF2ZSBwb3RlbnRpYWxseSBkZXN0YWJpbGl6ZWQgYW5vdGhlcgogICAgICAgICAqIGNvbXBvbmVudCB3aGlsZSBpdCBpcyBzdGFiaWxpemluZy4KICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGlkV29yayA9IGZhbHNlOwogICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdOwogICAgICAgIHRoaXMudGFza1RyYWNraW5nWm9uZSA9IG51bGw7CiAgICAgICAgdGhpcy5fd2F0Y2hBbmd1bGFyRXZlbnRzKCk7CiAgICAgICAgX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLnRhc2tUcmFja2luZ1pvbmUgPQogICAgICAgICAgICAgICAgdHlwZW9mIFpvbmUgPT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogWm9uZS5jdXJyZW50LmdldCgnVGFza1RyYWNraW5nWm9uZScpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF93YXRjaEFuZ3VsYXJFdmVudHMoKSB7CiAgICAgICAgdGhpcy5fbmdab25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgbmV4dDogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fZGlkV29yayA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9pc1pvbmVTdGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNab25lU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogSW5jcmVhc2VzIHRoZSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0CiAgICAgKiBAZGVwcmVjYXRlZCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBub3cgdHJhY2tlZCB3aXRoIHpvbmVzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCArPSAxOwogICAgICAgIHRoaXMuX2RpZFdvcmsgPSB0cnVlOwogICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7CiAgICB9CiAgICAvKioKICAgICAqIERlY3JlYXNlcyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdAogICAgICogQGRlcHJlY2F0ZWQgcGVuZGluZyByZXF1ZXN0cyBhcmUgbm93IHRyYWNrZWQgd2l0aCB6b25lcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCAtPSAxOwogICAgICAgIGlmICh0aGlzLl9wZW5kaW5nQ291bnQgPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTsKICAgICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50OwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIGFuIGFzc29jaWF0ZWQgYXBwbGljYXRpb24gaXMgc3RhYmxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc1N0YWJsZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXNab25lU3RhYmxlICYmIHRoaXMuX3BlbmRpbmdDb3VudCA9PT0gMCAmJiAhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3J1bkNhbGxiYWNrc0lmUmVhZHkoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdGFibGUoKSkgewogICAgICAgICAgICAvLyBTY2hlZHVsZXMgdGhlIGNhbGwgYmFja3MgaW4gYSBuZXcgZnJhbWUgc28gdGhhdCBpdCBpcyBhbHdheXMgYXN5bmMuCiAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9jYWxsYmFja3MubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBjYiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9jYWxsYmFja3MucG9wKCkpKTsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY2IudGltZW91dElkKTsKICAgICAgICAgICAgICAgICAgICBjYi5kb25lQ2IodGhpcy5fZGlkV29yayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9kaWRXb3JrID0gZmFsc2U7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFN0aWxsIG5vdCBzdGFibGUsIHNlbmQgdXBkYXRlcy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMuZ2V0UGVuZGluZ1Rhc2tzKCk7CiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNiCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2IpID0+IHsKICAgICAgICAgICAgICAgIGlmIChjYi51cGRhdGVDYiAmJiBjYi51cGRhdGVDYihwZW5kaW5nKSkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjYi50aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX2RpZFdvcmsgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFBlbmRpbmdUYXNrcygpIHsKICAgICAgICBpZiAoIXRoaXMudGFza1RyYWNraW5nWm9uZSkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgICAgIC8vIENvcHkgdGhlIHRhc2tzIGRhdGEgc28gdGhhdCB3ZSBkb24ndCBsZWFrIHRhc2tzLgogICAgICAgIHJldHVybiB0aGlzLnRhc2tUcmFja2luZ1pvbmUubWFjcm9UYXNrcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNvdXJjZTogdC5zb3VyY2UsCiAgICAgICAgICAgICAgICAvLyBGcm9tIFRhc2tUcmFja2luZ1pvbmU6CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2Jsb2IvbWFzdGVyL2xpYi96b25lLXNwZWMvdGFzay10cmFja2luZy50cyNMNDAKICAgICAgICAgICAgICAgIGNyZWF0aW9uTG9jYXRpb246ICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKHQpKSkuY3JlYXRpb25Mb2NhdGlvbikpLAogICAgICAgICAgICAgICAgZGF0YTogdC5kYXRhCiAgICAgICAgICAgIH07CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjYgogICAgICogQHBhcmFtIHs/PX0gdGltZW91dAogICAgICogQHBhcmFtIHs/PX0gdXBkYXRlQ2IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZENhbGxiYWNrKGNiLCB0aW1lb3V0LCB1cGRhdGVDYikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdGltZW91dElkID0gLTE7CiAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCA+IDApIHsKICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2IKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChjYikgPT4gY2IudGltZW91dElkICE9PSB0aW1lb3V0SWQpKTsKICAgICAgICAgICAgICAgIGNiKHRoaXMuX2RpZFdvcmssIHRoaXMuZ2V0UGVuZGluZ1Rhc2tzKCkpOwogICAgICAgICAgICB9KSwgdGltZW91dCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh7IGRvbmVDYjogY2IsIHRpbWVvdXRJZDogdGltZW91dElkLCB1cGRhdGVDYjogdXBkYXRlQ2IgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogV2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YWJsZSB3aXRoIGEgdGltZW91dC4gSWYgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhhdAogICAgICogaGFwcGVucywgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIGEgbGlzdCBvZiB0aGUgbWFjcm8gdGFza3MgdGhhdCB3ZXJlIHBlbmRpbmcsIG90aGVyd2lzZSBudWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZG9uZUNiIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiBBbmd1bGFyIGlzIHN0YWJsZSBvciB0aGUgdGltZW91dCBleHBpcmVzCiAgICAgKiAgICB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCiAgICAgKiBAcGFyYW0gez89fSB0aW1lb3V0IE9wdGlvbmFsLiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIEFuZ3VsYXIgdG8gYmVjb21lIHN0YWJsZS4gSWYgbm90CiAgICAgKiAgICBzcGVjaWZpZWQsIHdoZW5TdGFibGUoKSB3aWxsIHdhaXQgZm9yZXZlci4KICAgICAqIEBwYXJhbSB7Pz19IHVwZGF0ZUNiIE9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZXQgb2YKICAgICAqICAgIHBlbmRpbmcgbWFjcm90YXNrcyBjaGFuZ2VzLiBJZiB0aGlzIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBkb25lQ2Igd2lsbCBub3QgYmUgaW52b2tlZAogICAgICogICAgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyB3aWxsIGJlIGlzc3VlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdoZW5TdGFibGUoZG9uZUNiLCB0aW1lb3V0LCB1cGRhdGVDYikgewogICAgICAgIGlmICh1cGRhdGVDYiAmJiAhdGhpcy50YXNrVHJhY2tpbmdab25lKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayB0cmFja2luZyB6b25lIGlzIHJlcXVpcmVkIHdoZW4gcGFzc2luZyBhbiB1cGRhdGUgY2FsbGJhY2sgdG8gJyArCiAgICAgICAgICAgICAgICAnd2hlblN0YWJsZSgpLiBJcyAiem9uZS5qcy9kaXN0L3Rhc2stdHJhY2tpbmcuanMiIGxvYWRlZD8nKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlc2UgYXJndW1lbnRzIGFyZSAnRnVuY3Rpb24nIGFib3ZlIHRvIGtlZXAgdGhlIHB1YmxpYyBBUEkgc2ltcGxlLgogICAgICAgIHRoaXMuYWRkQ2FsbGJhY2soKC8qKiBAdHlwZSB7P30gKi8gKGRvbmVDYikpLCB0aW1lb3V0LCAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlQ2IpKSk7CiAgICAgICAgdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBwZW5kaW5nIHJlcXVlc3RzCiAgICAgKiBAZGVwcmVjYXRlZCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBub3cgdHJhY2tlZCB3aXRoIHpvbmVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgcHJvdmlkZXJzIGJ5IG5hbWUKICAgICAqIEBwYXJhbSB7P30gdXNpbmcgVGhlIHJvb3QgZWxlbWVudCB0byBzZWFyY2ggZnJvbQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlciBUaGUgbmFtZSBvZiBiaW5kaW5nIHZhcmlhYmxlCiAgICAgKiBAcGFyYW0gez99IGV4YWN0TWF0Y2ggV2hldGhlciB1c2luZyBleGFjdE1hdGNoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kUHJvdmlkZXJzKHVzaW5nLCBwcm92aWRlciwgZXhhY3RNYXRjaCkgewogICAgICAgIC8vIFRPRE8oanVsaWVtcik6IGltcGxlbWVudC4KICAgICAgICByZXR1cm4gW107CiAgICB9Cn0KVGVzdGFiaWxpdHkuybVmYWMgPSBmdW5jdGlvbiBUZXN0YWJpbGl0eV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXN0YWJpbGl0eSkoybXJtWluamVjdChOZ1pvbmUpKTsgfTsKVGVzdGFiaWxpdHkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVGVzdGFiaWxpdHksIGZhY3Rvcnk6IFRlc3RhYmlsaXR5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KVGVzdGFiaWxpdHkuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE5nWm9uZSB9Cl07Ci8qKgogKiBBIGdsb2JhbCByZWdpc3RyeSBvZiB7XEBsaW5rIFRlc3RhYmlsaXR5fSBpbnN0YW5jZXMgZm9yIHNwZWNpZmljIGVsZW1lbnRzLgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgVGVzdGFiaWxpdHlSZWdpc3RyeSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fYXBwbGljYXRpb25zID0gbmV3IE1hcCgpOwogICAgICAgIF90ZXN0YWJpbGl0eUdldHRlci5hZGRUb1dpbmRvdyh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGFuIGFwcGxpY2F0aW9uIHdpdGggYSB0ZXN0YWJpbGl0eSBob29rIHNvIHRoYXQgaXQgY2FuIGJlIHRyYWNrZWQKICAgICAqIEBwYXJhbSB7P30gdG9rZW4gdG9rZW4gb2YgYXBwbGljYXRpb24sIHJvb3QgZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB0ZXN0YWJpbGl0eSBUZXN0YWJpbGl0eSBob29rCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3RlckFwcGxpY2F0aW9uKHRva2VuLCB0ZXN0YWJpbGl0eSkgewogICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5zZXQodG9rZW4sIHRlc3RhYmlsaXR5KTsKICAgIH0KICAgIC8qKgogICAgICogVW5yZWdpc3RlcnMgYW4gYXBwbGljYXRpb24uCiAgICAgKiBAcGFyYW0gez99IHRva2VuIHRva2VuIG9mIGFwcGxpY2F0aW9uLCByb290IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVucmVnaXN0ZXJBcHBsaWNhdGlvbih0b2tlbikgewogICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5kZWxldGUodG9rZW4pOwogICAgfQogICAgLyoqCiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgYXBwbGljYXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1bnJlZ2lzdGVyQWxsQXBwbGljYXRpb25zKCkgewogICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5jbGVhcigpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSB0ZXN0YWJpbGl0eSBob29rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24KICAgICAqIEBwYXJhbSB7P30gZWxlbSByb290IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFRlc3RhYmlsaXR5KGVsZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zLmdldChlbGVtKSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgdGVzdGFiaWxpdGllcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QWxsVGVzdGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9hcHBsaWNhdGlvbnMudmFsdWVzKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zKHJvb3QgZWxlbWVudHMpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRBbGxSb290RWxlbWVudHMoKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLmtleXMoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgdGVzdGFiaWxpdHkgb2YgYSBub2RlIGluIHRoZSBUcmVlCiAgICAgKiBAcGFyYW0gez99IGVsZW0gbm9kZQogICAgICogQHBhcmFtIHs/PX0gZmluZEluQW5jZXN0b3JzIHdoZXRoZXIgZmluZGluZyB0ZXN0YWJpbGl0eSBpbiBhbmNlc3RvcnMgaWYgdGVzdGFiaWxpdHkgd2FzIG5vdCBmb3VuZCBpbgogICAgICogY3VycmVudCBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kVGVzdGFiaWxpdHlJblRyZWUoZWxlbSwgZmluZEluQW5jZXN0b3JzID0gdHJ1ZSkgewogICAgICAgIHJldHVybiBfdGVzdGFiaWxpdHlHZXR0ZXIuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHRoaXMsIGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7CiAgICB9Cn0KVGVzdGFiaWxpdHlSZWdpc3RyeS7JtWZhYyA9IGZ1bmN0aW9uIFRlc3RhYmlsaXR5UmVnaXN0cnlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGVzdGFiaWxpdHlSZWdpc3RyeSkoKTsgfTsKVGVzdGFiaWxpdHlSZWdpc3RyeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUZXN0YWJpbGl0eVJlZ2lzdHJ5LCBmYWN0b3J5OiBUZXN0YWJpbGl0eVJlZ2lzdHJ5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KVGVzdGFiaWxpdHlSZWdpc3RyeS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtdOwpjbGFzcyBfTm9vcEdldFRlc3RhYmlsaXR5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSByZWdpc3RyeQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkVG9XaW5kb3cocmVnaXN0cnkpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5CiAgICAgKiBAcGFyYW0gez99IGVsZW0KICAgICAqIEBwYXJhbSB7P30gZmluZEluQW5jZXN0b3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBTZXQgdGhlIHtcQGxpbmsgR2V0VGVzdGFiaWxpdHl9IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEFuZ3VsYXIgdGVzdGluZyBmcmFtZXdvcmsuCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gZ2V0dGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRUZXN0YWJpbGl0eUdldHRlcihnZXR0ZXIpIHsKICAgIF90ZXN0YWJpbGl0eUdldHRlciA9IGdldHRlcjsKfQovKiogQHR5cGUgez99ICovCmxldCBfdGVzdGFiaWxpdHlHZXR0ZXIgPSBuZXcgX05vb3BHZXRUZXN0YWJpbGl0eSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KbGV0IF9wbGF0Zm9ybTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgY29tcGlsZU5nTW9kdWxlRmFjdG9yeSA9IGNvbXBpbGVOZ01vZHVsZUZhY3RvcnlfX1BPU1RfUjNfXzsKLyoqCiAqIEB0ZW1wbGF0ZSBNCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSBvcHRpb25zCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcGlsZU5nTW9kdWxlRmFjdG9yeV9fUE9TVF9SM19fKGluamVjdG9yLCBvcHRpb25zLCBtb2R1bGVUeXBlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TmdNb2R1bGVUeXBlKG1vZHVsZVR5cGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gaW5qZWN0b3IuZ2V0KENPTVBJTEVSX09QVElPTlMsIFtdKS5jb25jYXQob3B0aW9ucyk7CiAgICBpZiAodHlwZW9mIG5nSml0TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdKaXRNb2RlKSB7CiAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBjb21waWxlciB0byB1c2UgdGhlIHByb3ZpZGVkIG9wdGlvbnMuIFRoaXMgY2FsbCBtYXkgZmFpbCB3aGVuIG11bHRpcGxlIG1vZHVsZXMKICAgICAgICAvLyBhcmUgYm9vdHN0cmFwcGVkIHdpdGggaW5jb21wYXRpYmxlIG9wdGlvbnMsIGFzIGEgY29tcG9uZW50IGNhbiBvbmx5IGJlIGNvbXBpbGVkIGFjY29yZGluZyB0bwogICAgICAgIC8vIGEgc2luZ2xlIHNldCBvZiBvcHRpb25zLgogICAgICAgIHNldEppdE9wdGlvbnMoewogICAgICAgICAgICBkZWZhdWx0RW5jYXBzdWxhdGlvbjogX2xhc3REZWZpbmVkKGNvbXBpbGVyT3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbnMgPT4gb3B0aW9ucy5kZWZhdWx0RW5jYXBzdWxhdGlvbikpKSwKICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogX2xhc3REZWZpbmVkKGNvbXBpbGVyT3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbnMgPT4gb3B0aW9ucy5wcmVzZXJ2ZVdoaXRlc3BhY2VzKSkpLAogICAgICAgIH0pOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbW9kdWxlRmFjdG9yeSA9IG5ldyBOZ01vZHVsZUZhY3RvcnkkMShtb2R1bGVUeXBlKTsKICAgIGlmIChpc0NvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlRW1wdHkoKSkgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobW9kdWxlRmFjdG9yeSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21waWxlclByb3ZpZGVycyA9IF9tZXJnZUFycmF5cyhjb21waWxlck9wdGlvbnMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gbwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbyA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoby5wcm92aWRlcnMpKSkpKTsKICAgIC8vIEluIGNhc2UgdGhlcmUgYXJlIG5vIGNvbXBpbGVyIHByb3ZpZGVycywgd2UganVzdCByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5IGFzCiAgICAvLyB0aGVyZSB3b24ndCBiZSBhbnkgcmVzb3VyY2UgbG9hZGVyLiBUaGlzIGNhbiBoYXBwZW4gd2l0aCBJdnksIGJlY2F1c2UgQU9UIGNvbXBpbGVkCiAgICAvLyBtb2R1bGVzIGNhbiBiZSBzdGlsbCBwYXNzZWQgdGhyb3VnaCAiYm9vdHN0cmFwTW9kdWxlIi4gSW4gdGhhdCBjYXNlIHdlIHNob3VsZG4ndAogICAgLy8gdW5uZWNlc3NhcmlseSByZXF1aXJlIHRoZSBKSVQgY29tcGlsZXIuCiAgICBpZiAoY29tcGlsZXJQcm92aWRlcnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtb2R1bGVGYWN0b3J5KTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBpbGVySW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IGNvbXBpbGVyUHJvdmlkZXJzIH0pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzb3VyY2VMb2FkZXIgPSBjb21waWxlckluamVjdG9yLmdldChjb21waWxlci5SZXNvdXJjZUxvYWRlcik7CiAgICAvLyBUaGUgcmVzb3VyY2UgbG9hZGVyIGNhbiBhbHNvIHJldHVybiBhIHN0cmluZyB3aGlsZSB0aGUgInJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMiCiAgICAvLyBhbHdheXMgZXhwZWN0cyBhIHByb21pc2UuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHdyYXAgdGhlIHJldHVybmVkIHZhbHVlIGluIGEgcHJvbWlzZS4KICAgIHJldHVybiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCgvKioKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cmwgPT4gUHJvbWlzZS5yZXNvbHZlKHJlc291cmNlTG9hZGVyLmdldCh1cmwpKSkpCiAgICAgICAgLnRoZW4oKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gbW9kdWxlRmFjdG9yeSkpOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcHVibGlzaERlZmF1bHRHbG9iYWxVdGlsc19fUE9TVF9SM19fKCkgewogICAgbmdEZXZNb2RlICYmIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMoKTsKfQovKiogQHR5cGUgez99ICovCmxldCBwdWJsaXNoRGVmYXVsdEdsb2JhbFV0aWxzJDEgPSBwdWJsaXNoRGVmYXVsdEdsb2JhbFV0aWxzX19QT1NUX1IzX187Ci8qKiBAdHlwZSB7P30gKi8KbGV0IGlzQm91bmRUb01vZHVsZSA9IGlzQm91bmRUb01vZHVsZV9fUE9TVF9SM19fOwovKioKICogQHRlbXBsYXRlIEMKICogQHBhcmFtIHs/fSBjZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNCb3VuZFRvTW9kdWxlX19QT1NUX1IzX18oY2YpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGNmKSkpLmlzQm91bmRUb01vZHVsZTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQWxsb3dNdWx0aXBsZVRva2VuJyk7Ci8qKgogKiBBIHRva2VuIGZvciB0aGlyZC1wYXJ0eSBjb21wb25lbnRzIHRoYXQgY2FuIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBOZ1Byb2JlLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdQcm9iZVRva2VuIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5hbWUsIHRva2VuKSB7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYSBwbGF0Zm9ybS4KICogUGxhdGZvcm1zIGhhdmUgdG8gYmUgZWFnZXJseSBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLgogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVQbGF0Zm9ybShpbmplY3RvcikgewogICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCAmJgogICAgICAgICFfcGxhdGZvcm0uaW5qZWN0b3IuZ2V0KEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUywgZmFsc2UpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBjYW4gYmUgb25seSBvbmUgcGxhdGZvcm0uIERlc3Ryb3kgdGhlIHByZXZpb3VzIG9uZSB0byBjcmVhdGUgYSBuZXcgb25lLicpOwogICAgfQogICAgcHVibGlzaERlZmF1bHRHbG9iYWxVdGlscyQxKCk7CiAgICBfcGxhdGZvcm0gPSBpbmplY3Rvci5nZXQoUGxhdGZvcm1SZWYpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdHMgPSBpbmplY3Rvci5nZXQoUExBVEZPUk1fSU5JVElBTElaRVIsIG51bGwpOwogICAgaWYgKGluaXRzKQogICAgICAgIGluaXRzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5pdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGluaXQpID0+IGluaXQoKSkpOwogICAgcmV0dXJuIF9wbGF0Zm9ybTsKfQovKioKICogQ3JlYXRlcyBhIGZhY3RvcnkgZm9yIGEgcGxhdGZvcm0KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBwYXJlbnRQbGF0Zm9ybUZhY3RvcnkKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7Pz19IHByb3ZpZGVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlUGxhdGZvcm1GYWN0b3J5KHBhcmVudFBsYXRmb3JtRmFjdG9yeSwgbmFtZSwgcHJvdmlkZXJzID0gW10pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlc2MgPSBgUGxhdGZvcm06ICR7bmFtZX1gOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWFya2VyID0gbmV3IEluamVjdGlvblRva2VuKGRlc2MpOwogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7Pz19IGV4dHJhUHJvdmlkZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXh0cmFQcm92aWRlcnMgPSBbXSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGxhdGZvcm0gPSBnZXRQbGF0Zm9ybSgpOwogICAgICAgIGlmICghcGxhdGZvcm0gfHwgcGxhdGZvcm0uaW5qZWN0b3IuZ2V0KEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUywgZmFsc2UpKSB7CiAgICAgICAgICAgIGlmIChwYXJlbnRQbGF0Zm9ybUZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIHBhcmVudFBsYXRmb3JtRmFjdG9yeShwcm92aWRlcnMuY29uY2F0KGV4dHJhUHJvdmlkZXJzKS5jb25jYXQoeyBwcm92aWRlOiBtYXJrZXIsIHVzZVZhbHVlOiB0cnVlIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluamVjdGVkUHJvdmlkZXJzID0gcHJvdmlkZXJzLmNvbmNhdChleHRyYVByb3ZpZGVycykuY29uY2F0KHsgcHJvdmlkZTogbWFya2VyLCB1c2VWYWx1ZTogdHJ1ZSB9LCB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSU5KRUNUT1JfU0NPUEUsCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdwbGF0Zm9ybScKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY3JlYXRlUGxhdGZvcm0oSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBpbmplY3RlZFByb3ZpZGVycywgbmFtZTogZGVzYyB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFzc2VydFBsYXRmb3JtKG1hcmtlcik7CiAgICB9KTsKfQovKioKICogQ2hlY2tzIHRoYXQgdGhlcmUgY3VycmVudGx5IGlzIGEgcGxhdGZvcm0gd2hpY2ggY29udGFpbnMgdGhlIGdpdmVuIHRva2VuIGFzIGEgcHJvdmlkZXIuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gcmVxdWlyZWRUb2tlbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0UGxhdGZvcm0ocmVxdWlyZWRUb2tlbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGxhdGZvcm0gPSBnZXRQbGF0Zm9ybSgpOwogICAgaWYgKCFwbGF0Zm9ybSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGxhdGZvcm0gZXhpc3RzIScpOwogICAgfQogICAgaWYgKCFwbGF0Zm9ybS5pbmplY3Rvci5nZXQocmVxdWlyZWRUb2tlbiwgbnVsbCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgcGxhdGZvcm0gd2l0aCBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQuIFBsZWFzZSBkZXN0cm95IGl0IGZpcnN0LicpOwogICAgfQogICAgcmV0dXJuIHBsYXRmb3JtOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogKgogKiBcQHB1YmxpY0FwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UGxhdGZvcm0oKSB7CiAgICByZXR1cm4gX3BsYXRmb3JtICYmICFfcGxhdGZvcm0uZGVzdHJveWVkID8gX3BsYXRmb3JtIDogbnVsbDsKfQovKioKICogVGhlIEFuZ3VsYXIgcGxhdGZvcm0gaXMgdGhlIGVudHJ5IHBvaW50IGZvciBBbmd1bGFyIG9uIGEgd2ViIHBhZ2UuIEVhY2ggcGFnZQogKiBoYXMgZXhhY3RseSBvbmUgcGxhdGZvcm0sIGFuZCBzZXJ2aWNlcyAoc3VjaCBhcyByZWZsZWN0aW9uKSB3aGljaCBhcmUgY29tbW9uCiAqIHRvIGV2ZXJ5IEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiB0aGUgcGFnZSBhcmUgYm91bmQgaW4gaXRzIHNjb3BlLgogKgogKiBBIHBhZ2UncyBwbGF0Zm9ybSBpcyBpbml0aWFsaXplZCBpbXBsaWNpdGx5IHdoZW4gYSBwbGF0Zm9ybSBpcyBjcmVhdGVkIHZpYSBhIHBsYXRmb3JtIGZhY3RvcnkKICogKGUuZy4ge1xAbGluayBwbGF0Zm9ybUJyb3dzZXJ9KSwgb3IgZXhwbGljaXRseSBieSBjYWxsaW5nIHRoZSB7XEBsaW5rIGNyZWF0ZVBsYXRmb3JtfSBmdW5jdGlvbi4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFBsYXRmb3JtUmVmIHsKICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAqLwogICAgY29uc3RydWN0b3IoX2luamVjdG9yKSB7CiAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgdGhpcy5fbW9kdWxlcyA9IFtdOwogICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMgPSBbXTsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgXEBOZ01vZHVsZWAgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybQogICAgICogZm9yIG9mZmxpbmUgY29tcGlsYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgU2ltcGxlIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBteV9tb2R1bGUudHM6CiAgICAgKgogICAgICogXEBOZ01vZHVsZSh7CiAgICAgKiAgIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlXQogICAgICogfSkKICAgICAqIGNsYXNzIE15TW9kdWxlIHt9CiAgICAgKgogICAgICogbWFpbi50czoKICAgICAqIGltcG9ydCB7TXlNb2R1bGVOZ0ZhY3Rvcnl9IGZyb20gJy4vbXlfbW9kdWxlLm5nZmFjdG9yeSc7CiAgICAgKiBpbXBvcnQge3BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInOwogICAgICoKICAgICAqIGxldCBtb2R1bGVSZWYgPSBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KE15TW9kdWxlTmdGYWN0b3J5KTsKICAgICAqIGBgYAogICAgICogQHRlbXBsYXRlIE0KICAgICAqIEBwYXJhbSB7P30gbW9kdWxlRmFjdG9yeQogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYm9vdHN0cmFwTW9kdWxlRmFjdG9yeShtb2R1bGVGYWN0b3J5LCBvcHRpb25zKSB7CiAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBjcmVhdGUgdGhlIE5nWm9uZSBfYmVmb3JlXyB3ZSBpbnN0YW50aWF0ZSB0aGUgbW9kdWxlLAogICAgICAgIC8vIGFzIGluc3RhbnRpYXRpbmcgdGhlIG1vZHVsZSBjcmVhdGVzIHNvbWUgcHJvdmlkZXJzIGVhZ2VybHkuCiAgICAgICAgLy8gU28gd2UgY3JlYXRlIGEgbWluaSBwYXJlbnQgaW5qZWN0b3IgdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBuZXcgTmdab25lIGFuZAogICAgICAgIC8vIHBhc3MgdGhhdCBhcyBwYXJlbnQgdG8gdGhlIE5nTW9kdWxlRmFjdG9yeS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbmdab25lT3B0aW9uID0gb3B0aW9ucyA/IG9wdGlvbnMubmdab25lIDogdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZ1pvbmVFdmVudENvYWxlc2NpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLm5nWm9uZUV2ZW50Q29hbGVzY2luZykgfHwgZmFsc2U7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nWm9uZSA9IGdldE5nWm9uZShuZ1pvbmVPcHRpb24sIG5nWm9uZUV2ZW50Q29hbGVzY2luZyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3ZpZGVycyA9IFt7IHByb3ZpZGU6IE5nWm9uZSwgdXNlVmFsdWU6IG5nWm9uZSB9XTsKICAgICAgICAvLyBBdHRlbnRpb246IERvbid0IHVzZSBBcHBsaWNhdGlvblJlZi5ydW4gaGVyZSwKICAgICAgICAvLyBhcyB3ZSB3YW50IHRvIGJlIHN1cmUgdGhhdCBhbGwgcG9zc2libGUgY29uc3RydWN0b3IgY2FsbHMgYXJlIGluc2lkZSBgbmdab25lLnJ1bmAhCiAgICAgICAgcmV0dXJuIG5nWm9uZS5ydW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nWm9uZUluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBwcm92aWRlcnMsIHBhcmVudDogdGhpcy5pbmplY3RvciwgbmFtZTogbW9kdWxlRmFjdG9yeS5tb2R1bGVUeXBlLm5hbWUgfSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbW9kdWxlUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZUZhY3RvcnkuY3JlYXRlKG5nWm9uZUluamVjdG9yKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbkhhbmRsZXIgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEVycm9ySGFuZGxlciwgbnVsbCk7CiAgICAgICAgICAgIGlmICghZXhjZXB0aW9uSGFuZGxlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBFcnJvckhhbmRsZXIuIElzIHBsYXRmb3JtIG1vZHVsZSAoQnJvd3Nlck1vZHVsZSkgaW5jbHVkZWQ/Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbW9kdWxlUmVmLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiByZW1vdmUodGhpcy5fbW9kdWxlcywgbW9kdWxlUmVmKSkpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAobmdab25lKSkucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKG5nWm9uZSkpLm9uRXJyb3Iuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlcnJvcikgPT4gewogICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgcmV0dXJuIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlciwgKC8qKiBAdHlwZSB7P30gKi8gKG5nWm9uZSkpLCAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbml0U3RhdHVzID0gbW9kdWxlUmVmLmluamVjdG9yLmdldChBcHBsaWNhdGlvbkluaXRTdGF0dXMpOwogICAgICAgICAgICAgICAgaW5pdFN0YXR1cy5ydW5Jbml0aWFsaXplcnMoKTsKICAgICAgICAgICAgICAgIHJldHVybiBpbml0U3RhdHVzLmRvbmVQcm9taXNlLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChpdnlFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBgTE9DQUxFX0lEYCBwcm92aWRlciBpcyBkZWZpbmVkIGF0IGJvb3RzdHJhcCB0aGVuIHdlIHNldCB0aGUgdmFsdWUgZm9yIGl2eQogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZUlkID0gbW9kdWxlUmVmLmluamVjdG9yLmdldChMT0NBTEVfSUQkMSwgREVGQVVMVF9MT0NBTEVfSUQpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2NhbGVJZChsb2NhbGVJZCB8fCBERUZBVUxUX0xPQ0FMRV9JRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZHVsZURvQm9vdHN0cmFwKG1vZHVsZVJlZik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVJlZjsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgXEBOZ01vZHVsZWAgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0gdXNpbmcgdGhlIGdpdmVuIHJ1bnRpbWUgY29tcGlsZXIuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgU2ltcGxlIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBcQE5nTW9kdWxlKHsKICAgICAqICAgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGVdCiAgICAgKiB9KQogICAgICogY2xhc3MgTXlNb2R1bGUge30KICAgICAqCiAgICAgKiBsZXQgbW9kdWxlUmVmID0gcGxhdGZvcm1Ccm93c2VyKCkuYm9vdHN0cmFwTW9kdWxlKE15TW9kdWxlKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBNCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqIEBwYXJhbSB7Pz19IGNvbXBpbGVyT3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYm9vdHN0cmFwTW9kdWxlKG1vZHVsZVR5cGUsIGNvbXBpbGVyT3B0aW9ucyA9IFtdKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zUmVkdWNlcih7fSwgY29tcGlsZXJPcHRpb25zKTsKICAgICAgICByZXR1cm4gY29tcGlsZU5nTW9kdWxlRmFjdG9yeSh0aGlzLmluamVjdG9yLCBvcHRpb25zLCBtb2R1bGVUeXBlKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVGYWN0b3J5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtb2R1bGVGYWN0b3J5ID0+IHRoaXMuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeShtb2R1bGVGYWN0b3J5LCBvcHRpb25zKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBtb2R1bGVSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9tb2R1bGVEb0Jvb3RzdHJhcChtb2R1bGVSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXBwUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZVJlZi5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpKSk7CiAgICAgICAgaWYgKG1vZHVsZVJlZi5fYm9vdHN0cmFwQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG1vZHVsZVJlZi5fYm9vdHN0cmFwQ29tcG9uZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmID0+IGFwcFJlZi5ib290c3RyYXAoZikpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobW9kdWxlUmVmLmluc3RhbmNlLm5nRG9Cb290c3RyYXApIHsKICAgICAgICAgICAgbW9kdWxlUmVmLmluc3RhbmNlLm5nRG9Cb290c3RyYXAoYXBwUmVmKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1vZHVsZSAke3N0cmluZ2lmeShtb2R1bGVSZWYuaW5zdGFuY2UKICAgICAgICAgICAgICAgIC5jb25zdHJ1Y3Rvcil9IHdhcyBib290c3RyYXBwZWQsIGJ1dCBpdCBkb2VzIG5vdCBkZWNsYXJlICJATmdNb2R1bGUuYm9vdHN0cmFwIiBjb21wb25lbnRzIG5vciBhICJuZ0RvQm9vdHN0cmFwIiBtZXRob2QuIGAgKwogICAgICAgICAgICAgICAgYFBsZWFzZSBkZWZpbmUgb25lIG9mIHRoZXNlLmApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tb2R1bGVzLnB1c2gobW9kdWxlUmVmKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcGxhdGZvcm0gaXMgZGlzcG9zZWQuCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koY2FsbGJhY2spIHsKICAgICAgICB0aGlzLl9kZXN0cm95TGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ge1xAbGluayBJbmplY3Rvcn0sIHdoaWNoIGlzIHRoZSBwYXJlbnQgaW5qZWN0b3IgZm9yCiAgICAgKiBldmVyeSBBbmd1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIGFuZCBwcm92aWRlcyBzaW5nbGV0b24gcHJvdmlkZXJzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgIHJldHVybiB0aGlzLl9pbmplY3RvcjsKICAgIH0KICAgIC8qKgogICAgICogRGVzdHJveSB0aGUgQW5ndWxhciBwbGF0Zm9ybSBhbmQgYWxsIEFuZ3VsYXIgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHBsYXRmb3JtIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIScpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tb2R1bGVzLnNsaWNlKCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1vZHVsZSA9PiBtb2R1bGUuZGVzdHJveSgpKSk7CiAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsaXN0ZW5lciA9PiBsaXN0ZW5lcigpKSk7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRlc3Ryb3llZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkOwogICAgfQp9ClBsYXRmb3JtUmVmLsm1ZmFjID0gZnVuY3Rpb24gUGxhdGZvcm1SZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGxhdGZvcm1SZWYpKMm1ybVpbmplY3QoSW5qZWN0b3IpKTsgfTsKUGxhdGZvcm1SZWYuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogUGxhdGZvcm1SZWYsIGZhY3Rvcnk6IFBsYXRmb3JtUmVmLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KUGxhdGZvcm1SZWYuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEluamVjdG9yIH0KXTsKLyoqCiAqIEBwYXJhbSB7P30gbmdab25lT3B0aW9uCiAqIEBwYXJhbSB7P30gbmdab25lRXZlbnRDb2FsZXNjaW5nCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROZ1pvbmUobmdab25lT3B0aW9uLCBuZ1pvbmVFdmVudENvYWxlc2NpbmcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ1pvbmU7CiAgICBpZiAobmdab25lT3B0aW9uID09PSAnbm9vcCcpIHsKICAgICAgICBuZ1pvbmUgPSBuZXcgTm9vcE5nWm9uZSgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmdab25lID0gKG5nWm9uZU9wdGlvbiA9PT0gJ3pvbmUuanMnID8gdW5kZWZpbmVkIDogbmdab25lT3B0aW9uKSB8fCBuZXcgTmdab25lKHsKICAgICAgICAgICAgZW5hYmxlTG9uZ1N0YWNrVHJhY2U6IGlzRGV2TW9kZSgpLAogICAgICAgICAgICBzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uOiBuZ1pvbmVFdmVudENvYWxlc2NpbmcKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZ1pvbmU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXJyb3JIYW5kbGVyCiAqIEBwYXJhbSB7P30gbmdab25lCiAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyLCBuZ1pvbmUsIGNhbGxiYWNrKSB7CiAgICB0cnkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjaygpOwogICAgICAgIGlmIChpc1Byb21pc2UkMShyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChlKSA9PiB7CiAgICAgICAgICAgICAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGUpKSk7CiAgICAgICAgICAgICAgICAvLyByZXRocm93IGFzIHRoZSBleGNlcHRpb24gaGFuZGxlciBtaWdodCBub3QgZG8gaXQKICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IGVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlKSkpOwogICAgICAgIC8vIHJldGhyb3cgYXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIG1pZ2h0IG5vdCBkbyBpdAogICAgICAgIHRocm93IGU7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZHN0CiAqIEBwYXJhbSB7P30gb2JqcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gb3B0aW9uc1JlZHVjZXIoZHN0LCBvYmpzKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpzKSkgewogICAgICAgIGRzdCA9IG9ianMucmVkdWNlKG9wdGlvbnNSZWR1Y2VyLCBkc3QpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZHN0ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkc3QpLCAoKC8qKiBAdHlwZSB7P30gKi8gKG9ianMpKSkpOwogICAgfQogICAgcmV0dXJuIGRzdDsKfQovKioKICogQSByZWZlcmVuY2UgdG8gYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIGEgcGFnZS4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIHtcQGEgaXMtc3RhYmxlLWV4YW1wbGVzfQogKiAjIyMgaXNTdGFibGUgZXhhbXBsZXMgYW5kIGNhdmVhdHMKICoKICogTm90ZSB0d28gaW1wb3J0YW50IHBvaW50cyBhYm91dCBgaXNTdGFibGVgLCBkZW1vbnN0cmF0ZWQgaW4gdGhlIGV4YW1wbGVzIGJlbG93OgogKiAtIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlIHN0YWJsZSBpZiB5b3Ugc3RhcnQgYW55IGtpbmQKICogb2YgcmVjdXJyZW50IGFzeW5jaHJvbm91cyB0YXNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cwogKiAoZm9yIGV4YW1wbGUgZm9yIGEgcG9sbGluZyBwcm9jZXNzLCBzdGFydGVkIHdpdGggYSBgc2V0SW50ZXJ2YWxgLCBhIGBzZXRUaW1lb3V0YAogKiBvciB1c2luZyBSeEpTIG9wZXJhdG9ycyBsaWtlIGBpbnRlcnZhbGApOwogKiAtIHRoZSBgaXNTdGFibGVgIE9ic2VydmFibGUgcnVucyBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuCiAqCiAqIExldCdzIGltYWdpbmUgdGhhdCB5b3Ugc3RhcnQgYSByZWN1cnJlbnQgdGFzawogKiAoaGVyZSBpbmNyZW1lbnRpbmcgYSBjb3VudGVyLCB1c2luZyBSeEpTIGBpbnRlcnZhbGApLAogKiBhbmQgYXQgdGhlIHNhbWUgdGltZSBzdWJzY3JpYmUgdG8gYGlzU3RhYmxlYC4KICoKICogYGBgCiAqIGNvbnN0cnVjdG9yKGFwcFJlZjogQXBwbGljYXRpb25SZWYpIHsKICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICogICAgICBmaWx0ZXIoc3RhYmxlID0+IHN0YWJsZSkKICogICApLnN1YnNjcmliZSgoKSA9PiBjb25zb2xlLmxvZygnQXBwIGlzIHN0YWJsZSBub3cnKTsKICogICBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7CiAqIH0KICogYGBgCiAqIEluIHRoaXMgZXhhbXBsZSwgYGlzU3RhYmxlYCB3aWxsIG5ldmVyIGVtaXQgYHRydWVgLAogKiBhbmQgdGhlIHRyYWNlICJBcHAgaXMgc3RhYmxlIG5vdyIgd2lsbCBuZXZlciBnZXQgbG9nZ2VkLgogKgogKiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIHNvbWV0aGluZyB3aGVuIHRoZSBhcHAgaXMgc3RhYmxlLAogKiB5b3UgaGF2ZSB0byB3YWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RhYmxlCiAqIGJlZm9yZSBzdGFydGluZyB5b3VyIHBvbGxpbmcgcHJvY2Vzcy4KICoKICogYGBgCiAqIGNvbnN0cnVjdG9yKGFwcFJlZjogQXBwbGljYXRpb25SZWYpIHsKICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLAogKiAgICAgdGFwKHN0YWJsZSA9PiBjb25zb2xlLmxvZygnQXBwIGlzIHN0YWJsZSBub3cnKSksCiAqICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoMTAwMCkpCiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7CiAqIH0KICogYGBgCiAqIEluIHRoaXMgZXhhbXBsZSwgdGhlIHRyYWNlICJBcHAgaXMgc3RhYmxlIG5vdyIgd2lsbCBiZSBsb2dnZWQKICogYW5kIHRoZW4gdGhlIGNvdW50ZXIgc3RhcnRzIGluY3JlbWVudGluZyBldmVyeSBzZWNvbmQuCiAqCiAqIE5vdGUgYWxzbyB0aGF0IHRoaXMgT2JzZXJ2YWJsZSBydW5zIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSwKICogd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBpbiB0aGUgc3Vic2NyaXB0aW9uCiAqIHRvIHRoaXMgT2JzZXJ2YWJsZSB3aWxsIG5vdCB0cmlnZ2VyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLgogKgogKiBMZXQncyBpbWFnaW5lIHRoYXQgaW5zdGVhZCBvZiBsb2dnaW5nIHRoZSBjb3VudGVyIHZhbHVlLAogKiB5b3UgdXBkYXRlIGEgZmllbGQgb2YgeW91ciBjb21wb25lbnQKICogYW5kIGRpc3BsYXkgaXQgaW4gaXRzIHRlbXBsYXRlLgogKgogKiBgYGAKICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZikgewogKiAgIGFwcFJlZi5pc1N0YWJsZS5waXBlKAogKiAgICAgZmlyc3Qoc3RhYmxlID0+IHN0YWJsZSksCiAqICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoMTAwMCkpCiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiB0aGlzLnZhbHVlID0gY291bnRlcik7CiAqIH0KICogYGBgCiAqIEFzIHRoZSBgaXNTdGFibGVgIE9ic2VydmFibGUgcnVucyBvdXRzaWRlIHRoZSB6b25lLAogKiB0aGUgYHZhbHVlYCBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgcHJvcGVybHksCiAqIGJ1dCB0aGUgdGVtcGxhdGUgd2lsbCBub3QgYmUgcmVmcmVzaGVkIQogKgogKiBZb3UnbGwgaGF2ZSB0byBtYW51YWxseSB0cmlnZ2VyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUuCiAqCiAqIGBgYAogKiBjb25zdHJ1Y3RvcihhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsKICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLAogKiAgICAgc3dpdGNoTWFwKCgpID0+IGludGVydmFsKDEwMDApKQogKiAgICkuc3Vic2NyaWJlKGNvdW50ZXIgPT4gewogKiAgICAgdGhpcy52YWx1ZSA9IGNvdW50ZXI7CiAqICAgICBjZC5kZXRlY3RDaGFuZ2VzKCk7CiAqICAgfSk7CiAqIH0KICogYGBgCiAqCiAqIE9yIG1ha2UgdGhlIHN1YnNjcmlwdGlvbiBjYWxsYmFjayBydW4gaW5zaWRlIHRoZSB6b25lLgogKgogKiBgYGAKICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZiwgem9uZTogTmdab25lKSB7CiAqICAgYXBwUmVmLmlzU3RhYmxlLnBpcGUoCiAqICAgICBmaXJzdChzdGFibGUgPT4gc3RhYmxlKSwKICogICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKSkKICogICApLnN1YnNjcmliZShjb3VudGVyID0+IHpvbmUucnVuKCgpID0+IHRoaXMudmFsdWUgPSBjb3VudGVyKSk7CiAqIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBBcHBsaWNhdGlvblJlZiB7CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gX3pvbmUKICAgICAqIEBwYXJhbSB7P30gX2NvbnNvbGUKICAgICAqIEBwYXJhbSB7P30gX2luamVjdG9yCiAgICAgKiBAcGFyYW0gez99IF9leGNlcHRpb25IYW5kbGVyCiAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAqIEBwYXJhbSB7P30gX2luaXRTdGF0dXMKICAgICAqLwogICAgY29uc3RydWN0b3IoX3pvbmUsIF9jb25zb2xlLCBfaW5qZWN0b3IsIF9leGNlcHRpb25IYW5kbGVyLCBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBfaW5pdFN0YXR1cykgewogICAgICAgIHRoaXMuX3pvbmUgPSBfem9uZTsKICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7CiAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgdGhpcy5fZXhjZXB0aW9uSGFuZGxlciA9IF9leGNlcHRpb25IYW5kbGVyOwogICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgdGhpcy5faW5pdFN0YXR1cyA9IF9pbml0U3RhdHVzOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMgPSBbXTsKICAgICAgICB0aGlzLl92aWV3cyA9IFtdOwogICAgICAgIHRoaXMuX3J1bm5pbmdUaWNrID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcyA9IGZhbHNlOwogICAgICAgIHRoaXMuX3N0YWJsZSA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IGEgbGlzdCBvZiBjb21wb25lbnQgdHlwZXMgcmVnaXN0ZXJlZCB0byB0aGlzIGFwcGxpY2F0aW9uLgogICAgICAgICAqIFRoaXMgbGlzdCBpcyBwb3B1bGF0ZWQgZXZlbiBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcG9uZW50VHlwZXMgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudHMgcmVnaXN0ZXJlZCB0byB0aGlzIGFwcGxpY2F0aW9uLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOwogICAgICAgIHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMgPSBpc0Rldk1vZGUoKTsKICAgICAgICB0aGlzLl96b25lLm9uTWljcm90YXNrRW1wdHkuc3Vic2NyaWJlKHsKICAgICAgICAgICAgbmV4dDogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fem9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMudGljaygpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0N1cnJlbnRseVN0YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgICAgdGhpcy5fc3RhYmxlID0gdGhpcy5fem9uZS5pc1N0YWJsZSAmJiAhdGhpcy5fem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyAmJgogICAgICAgICAgICAgICAgIXRoaXMuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3M7CiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLl9zdGFibGUpOwogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNTdGFibGUgPSBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvYnNlcnZlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG9ic2VydmVyKSA9PiB7CiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc3Vic2NyaXB0aW9uIHRvIG9uU3RhYmxlIG91dHNpZGUgdGhlIEFuZ3VsYXIgWm9uZSBzbyB0aGF0CiAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayBpcyBydW4gb3V0c2lkZSB0aGUgQW5ndWxhciBab25lLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdGFibGVTdWI7CiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgc3RhYmxlU3ViID0gdGhpcy5fem9uZS5vblN0YWJsZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIE5nWm9uZS5hc3NlcnROb3RJbkFuZ3VsYXJab25lKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgbm8gcGVuZGluZyBtYWNyby9taWNybyB0YXNrcyBpbiB0aGUgbmV4dCB0aWNrCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWxsb3cgZm9yIE5nWm9uZSB0byB1cGRhdGUgdGhlIHN0YXRlLgogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdGFibGUgJiYgIXRoaXMuX3pvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl96b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVuc3RhYmxlU3ViID0gdGhpcy5fem9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHN0YWJsZVN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdW5zdGFibGVTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5pc1N0YWJsZSA9CiAgICAgICAgICAgIG1lcmdlKGlzQ3VycmVudGx5U3RhYmxlLCBpc1N0YWJsZS5waXBlKHNoYXJlKCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQm9vdHN0cmFwIGEgbmV3IGNvbXBvbmVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgQm9vdHN0cmFwIHByb2Nlc3MKICAgICAqCiAgICAgKiBXaGVuIGJvb3RzdHJhcHBpbmcgYSBuZXcgcm9vdCBjb21wb25lbnQgaW50byBhbiBhcHBsaWNhdGlvbiwgQW5ndWxhciBtb3VudHMgdGhlCiAgICAgKiBzcGVjaWZpZWQgYXBwbGljYXRpb24gY29tcG9uZW50IG9udG8gRE9NIGVsZW1lbnRzIGlkZW50aWZpZWQgYnkgdGhlIGNvbXBvbmVudFR5cGUncwogICAgICogc2VsZWN0b3IgYW5kIGtpY2tzIG9mZiBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuCiAgICAgKgogICAgICogT3B0aW9uYWxseSwgYSBjb21wb25lbnQgY2FuIGJlIG1vdW50ZWQgb250byBhIERPTSBlbGVtZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCiAgICAgKiBjb21wb25lbnRUeXBlJ3Mgc2VsZWN0b3IuCiAgICAgKgogICAgICogIyMjIEV4YW1wbGUKICAgICAqIHtcQGV4YW1wbGUgY29yZS90cy9wbGF0Zm9ybS9wbGF0Zm9ybS50cyByZWdpb249J2xvbmdmb3JtJ30KICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudE9yRmFjdG9yeQogICAgICogQHBhcmFtIHs/PX0gcm9vdFNlbGVjdG9yT3JOb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBib290c3RyYXAoY29tcG9uZW50T3JGYWN0b3J5LCByb290U2VsZWN0b3JPck5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX2luaXRTdGF0dXMuZG9uZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBib290c3RyYXAgYXMgdGhlcmUgYXJlIHN0aWxsIGFzeW5jaHJvbm91cyBpbml0aWFsaXplcnMgcnVubmluZy4gQm9vdHN0cmFwIGNvbXBvbmVudHMgaW4gdGhlIGBuZ0RvQm9vdHN0cmFwYCBtZXRob2Qgb2YgdGhlIHJvb3QgbW9kdWxlLicpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk7CiAgICAgICAgaWYgKGNvbXBvbmVudE9yRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvbmVudEZhY3RvcnkpIHsKICAgICAgICAgICAgY29tcG9uZW50RmFjdG9yeSA9IGNvbXBvbmVudE9yRmFjdG9yeTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnkgPQogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnRPckZhY3RvcnkpKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY29tcG9uZW50VHlwZXMucHVzaChjb21wb25lbnRGYWN0b3J5LmNvbXBvbmVudFR5cGUpOwogICAgICAgIC8vIENyZWF0ZSBhIGZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG1vZHVsZSBpZiBpdCdzIG5vdCBib3VuZCB0byBzb21lIG90aGVyCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nTW9kdWxlID0gaXNCb3VuZFRvTW9kdWxlKGNvbXBvbmVudEZhY3RvcnkpID8gdW5kZWZpbmVkIDogdGhpcy5faW5qZWN0b3IuZ2V0KE5nTW9kdWxlUmVmKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2VsZWN0b3JPck5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgfHwgY29tcG9uZW50RmFjdG9yeS5zZWxlY3RvcjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKEluamVjdG9yLk5VTEwsIFtdLCBzZWxlY3Rvck9yTm9kZSwgbmdNb2R1bGUpOwogICAgICAgIGNvbXBSZWYub25EZXN0cm95KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fdW5sb2FkQ29tcG9uZW50KGNvbXBSZWYpOwogICAgICAgIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVzdGFiaWxpdHkgPSBjb21wUmVmLmluamVjdG9yLmdldChUZXN0YWJpbGl0eSwgbnVsbCk7CiAgICAgICAgaWYgKHRlc3RhYmlsaXR5KSB7CiAgICAgICAgICAgIGNvbXBSZWYuaW5qZWN0b3IuZ2V0KFRlc3RhYmlsaXR5UmVnaXN0cnkpCiAgICAgICAgICAgICAgICAucmVnaXN0ZXJBcHBsaWNhdGlvbihjb21wUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIHRlc3RhYmlsaXR5KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbG9hZENvbXBvbmVudChjb21wUmVmKTsKICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHsKICAgICAgICAgICAgdGhpcy5fY29uc29sZS5sb2coYEFuZ3VsYXIgaXMgcnVubmluZyBpbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZS4gQ2FsbCBlbmFibGVQcm9kTW9kZSgpIHRvIGVuYWJsZSB0aGUgcHJvZHVjdGlvbiBtb2RlLmApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcFJlZjsKICAgIH0KICAgIC8qKgogICAgICogSW52b2tlIHRoaXMgbWV0aG9kIHRvIGV4cGxpY2l0bHkgcHJvY2VzcyBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBpdHMgc2lkZS1lZmZlY3RzLgogICAgICoKICAgICAqIEluIGRldmVsb3BtZW50IG1vZGUsIGB0aWNrKClgIGFsc28gcGVyZm9ybXMgYSBzZWNvbmQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSB0byBlbnN1cmUgdGhhdCBubwogICAgICogZnVydGhlciBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4gSWYgYWRkaXRpb25hbCBjaGFuZ2VzIGFyZSBwaWNrZWQgdXAgZHVyaW5nIHRoaXMgc2Vjb25kIGN5Y2xlLAogICAgICogYmluZGluZ3MgaW4gdGhlIGFwcCBoYXZlIHNpZGUtZWZmZWN0cyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiBhIHNpbmdsZSBjaGFuZ2UgZGV0ZWN0aW9uCiAgICAgKiBwYXNzLgogICAgICogSW4gdGhpcyBjYXNlLCBBbmd1bGFyIHRocm93cyBhbiBlcnJvciwgc2luY2UgYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBjYW4gb25seSBoYXZlIG9uZSBjaGFuZ2UKICAgICAqIGRldGVjdGlvbiBwYXNzIGR1cmluZyB3aGljaCBhbGwgY2hhbmdlIGRldGVjdGlvbiBtdXN0IGNvbXBsZXRlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdGljaygpIHsKICAgICAgICBpZiAodGhpcy5fcnVubmluZ1RpY2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBsaWNhdGlvblJlZi50aWNrIGlzIGNhbGxlZCByZWN1cnNpdmVseScpOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLl9ydW5uaW5nVGljayA9IHRydWU7CiAgICAgICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5fdmlld3MpIHsKICAgICAgICAgICAgICAgIHZpZXcuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9lbmZvcmNlTm9OZXdDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMuX3ZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5jaGVja05vQ2hhbmdlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIEF0dGVudGlvbjogRG9uJ3QgcmV0aHJvdyBhcyBpdCBjb3VsZCBjYW5jZWwgc3Vic2NyaXB0aW9ucyB0byBPYnNlcnZhYmxlcyEKICAgICAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9leGNlcHRpb25IYW5kbGVyLmhhbmRsZUVycm9yKGUpKSk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLl9ydW5uaW5nVGljayA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgYSB2aWV3IHNvIHRoYXQgaXQgd2lsbCBiZSBkaXJ0eSBjaGVja2VkLgogICAgICogVGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRldGFjaGVkIHdoZW4gaXQgaXMgZGVzdHJveWVkLgogICAgICogVGhpcyB3aWxsIHRocm93IGlmIHRoZSB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyLgogICAgICogQHBhcmFtIHs/fSB2aWV3UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2hWaWV3KHZpZXdSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmlldyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1JlZikpKTsKICAgICAgICB0aGlzLl92aWV3cy5wdXNoKHZpZXcpOwogICAgICAgIHZpZXcuYXR0YWNoVG9BcHBSZWYodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIERldGFjaGVzIGEgdmlldyBmcm9tIGRpcnR5IGNoZWNraW5nIGFnYWluLgogICAgICogQHBhcmFtIHs/fSB2aWV3UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2hWaWV3KHZpZXdSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmlldyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1JlZikpKTsKICAgICAgICByZW1vdmUodGhpcy5fdmlld3MsIHZpZXcpOwogICAgICAgIHZpZXcuZGV0YWNoRnJvbUFwcFJlZigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9sb2FkQ29tcG9uZW50KGNvbXBvbmVudFJlZikgewogICAgICAgIHRoaXMuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpOwogICAgICAgIHRoaXMudGljaygpOwogICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudFJlZik7CiAgICAgICAgLy8gR2V0IHRoZSBsaXN0ZW5lcnMgbGF6aWx5IHRvIHByZXZlbnQgREkgY3ljbGVzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9pbmplY3Rvci5nZXQoQVBQX0JPT1RTVFJBUF9MSVNURU5FUiwgW10pLmNvbmNhdCh0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMpOwogICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobGlzdGVuZXIpID0+IGxpc3RlbmVyKGNvbXBvbmVudFJlZikpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdW5sb2FkQ29tcG9uZW50KGNvbXBvbmVudFJlZikgewogICAgICAgIHRoaXMuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpOwogICAgICAgIHJlbW92ZSh0aGlzLmNvbXBvbmVudHMsIGNvbXBvbmVudFJlZik7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIC8vIFRPRE8oYWx4aHViKTogRGlzcG9zZSBvZiB0aGUgTmdab25lLgogICAgICAgIHRoaXMuX3ZpZXdzLnNsaWNlKCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmlldykgPT4gdmlldy5kZXN0cm95KCkpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dGFjaGVkIHZpZXdzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZpZXdDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmlld3MubGVuZ3RoOwogICAgfQp9CkFwcGxpY2F0aW9uUmVmLsm1ZmFjID0gZnVuY3Rpb24gQXBwbGljYXRpb25SZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwbGljYXRpb25SZWYpKMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChDb25zb2xlKSwgybXJtWluamVjdChJbmplY3RvciksIMm1ybVpbmplY3QoRXJyb3JIYW5kbGVyKSwgybXJtWluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1aW5qZWN0KEFwcGxpY2F0aW9uSW5pdFN0YXR1cykpOyB9OwpBcHBsaWNhdGlvblJlZi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBcHBsaWNhdGlvblJlZiwgZmFjdG9yeTogQXBwbGljYXRpb25SZWYuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpBcHBsaWNhdGlvblJlZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IENvbnNvbGUgfSwKICAgIHsgdHlwZTogSW5qZWN0b3IgfSwKICAgIHsgdHlwZTogRXJyb3JIYW5kbGVyIH0sCiAgICB7IHR5cGU6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9LAogICAgeyB0eXBlOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMgfQpdOwovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBsaXN0CiAqIEBwYXJhbSB7P30gZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbW92ZShsaXN0LCBlbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoZWwpOwogICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gYXJncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2xhc3REZWZpbmVkKGFyZ3MpIHsKICAgIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaWYgKGFyZ3NbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gYXJnc1tpXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwp9Ci8qKgogKiBAcGFyYW0gez99IHBhcnRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbWVyZ2VBcnJheXMocGFydHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgcGFydHMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwYXJ0KSA9PiBwYXJ0ICYmIHJlc3VsdC5wdXNoKC4uLnBhcnQpKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvc3lzdGVtX2pzX25nX21vZHVsZV9mYWN0b3J5X2xvYWRlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IF9TRVBBUkFUT1IgPSAnIyc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRkFDVE9SWV9DTEFTU19TVUZGSVggPSAnTmdGYWN0b3J5JzsKLyoqCiAqIENvbmZpZ3VyYXRpb24gZm9yIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuCiAqIHRva2VuLgogKgogKiBcQHB1YmxpY0FwaQogKiBAZGVwcmVjYXRlZCB0aGUgYHN0cmluZ2AgZm9ybSBvZiBgbG9hZENoaWxkcmVuYCBpcyBkZXByZWNhdGVkLCBhbmQgYFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWdgCiAqIGlzIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLiBTZWUgYExvYWRDaGlsZHJlbmAgZm9yIG1vcmUgZGV0YWlscy4KICogQGFic3RyYWN0CiAqLwpjbGFzcyBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnIHsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IERFRkFVTFRfQ09ORklHID0gewogICAgZmFjdG9yeVBhdGhQcmVmaXg6ICcnLAogICAgZmFjdG9yeVBhdGhTdWZmaXg6ICcubmdmYWN0b3J5JywKfTsKLyoqCiAqIE5nTW9kdWxlRmFjdG9yeUxvYWRlciB0aGF0IHVzZXMgU3lzdGVtSlMgdG8gbG9hZCBOZ01vZHVsZUZhY3RvcnkKICogXEBwdWJsaWNBcGkKICogQGRlcHJlY2F0ZWQgdGhlIGBzdHJpbmdgIGZvcm0gb2YgYGxvYWRDaGlsZHJlbmAgaXMgZGVwcmVjYXRlZCwgYW5kIGBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyYCBpcwogKiBwYXJ0IG9mIGl0cyBpbXBsZW1lbnRhdGlvbi4gU2VlIGBMb2FkQ2hpbGRyZW5gIGZvciBtb3JlIGRldGFpbHMuCiAqLwpjbGFzcyBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfY29tcGlsZXIKICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfY29tcGlsZXIsIGNvbmZpZykgewogICAgICAgIHRoaXMuX2NvbXBpbGVyID0gX2NvbXBpbGVyOwogICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZyB8fCBERUZBVUxUX0NPTkZJRzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsb2FkKHBhdGgpIHsKICAgICAgICByZXR1cm4gIHRoaXMubG9hZEFuZENvbXBpbGUocGF0aCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvYWRBbmRDb21waWxlKHBhdGgpIHsKICAgICAgICBsZXQgW21vZHVsZSwgZXhwb3J0TmFtZV0gPSBwYXRoLnNwbGl0KF9TRVBBUkFUT1IpOwogICAgICAgIGlmIChleHBvcnROYW1lID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgZXhwb3J0TmFtZSA9ICdkZWZhdWx0JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQobW9kdWxlKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtb2R1bGUpID0+IG1vZHVsZVtleHBvcnROYW1lXSkpCiAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0eXBlKSA9PiBjaGVja05vdEVtcHR5KHR5cGUsIG1vZHVsZSwgZXhwb3J0TmFtZSkpKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodHlwZSkgPT4gdGhpcy5fY29tcGlsZXIuY29tcGlsZU1vZHVsZUFzeW5jKHR5cGUpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvYWRGYWN0b3J5KHBhdGgpIHsKICAgICAgICBsZXQgW21vZHVsZSwgZXhwb3J0TmFtZV0gPSBwYXRoLnNwbGl0KF9TRVBBUkFUT1IpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZmFjdG9yeUNsYXNzU3VmZml4ID0gRkFDVE9SWV9DTEFTU19TVUZGSVg7CiAgICAgICAgaWYgKGV4cG9ydE5hbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBleHBvcnROYW1lID0gJ2RlZmF1bHQnOwogICAgICAgICAgICBmYWN0b3J5Q2xhc3NTdWZmaXggPSAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQodGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoUHJlZml4ICsgbW9kdWxlICsgdGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoU3VmZml4KQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtb2R1bGUpID0+IG1vZHVsZVtleHBvcnROYW1lICsgZmFjdG9yeUNsYXNzU3VmZml4XSkpCiAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmYWN0b3J5KSA9PiBjaGVja05vdEVtcHR5KGZhY3RvcnksIG1vZHVsZSwgZXhwb3J0TmFtZSkpKTsKICAgIH0KfQpTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLsm1ZmFjID0gZnVuY3Rpb24gU3lzdGVtSnNOZ01vZHVsZUxvYWRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyKSjJtcm1aW5qZWN0KENvbXBpbGVyKSwgybXJtWluamVjdChTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnLCA4KSk7IH07ClN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogU3lzdGVtSnNOZ01vZHVsZUxvYWRlciwgZmFjdG9yeTogU3lzdGVtSnNOZ01vZHVsZUxvYWRlci7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovClN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IENvbXBpbGVyIH0sCiAgICB7IHR5cGU6IFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBtb2R1bGVQYXRoCiAqIEBwYXJhbSB7P30gZXhwb3J0TmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2hlY2tOb3RFbXB0eSh2YWx1ZSwgbW9kdWxlUGF0aCwgZXhwb3J0TmFtZSkgewogICAgaWYgKCF2YWx1ZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgJyR7ZXhwb3J0TmFtZX0nIGluICcke21vZHVsZVBhdGh9J2ApOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9Ci8qKgogKiBAcGFyYW0gez99IF9uYXRpdmVOb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREZWJ1Z05vZGVSMl9fUE9TVF9SM19fKF9uYXRpdmVOb2RlKSB7CiAgICByZXR1cm4gbnVsbDsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IGdldERlYnVnTm9kZVIyID0gZ2V0RGVidWdOb2RlUjJfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3BsYXRmb3JtX2NvcmVfcHJvdmlkZXJzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgX0NPUkVfUExBVEZPUk1fUFJPVklERVJTID0gWwogICAgLy8gU2V0IGEgZGVmYXVsdCBwbGF0Zm9ybSBuYW1lIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzZXQgaXQgZXhwbGljaXRseS4KICAgIHsgcHJvdmlkZTogUExBVEZPUk1fSUQsIHVzZVZhbHVlOiAndW5rbm93bicgfSwKICAgIHsgcHJvdmlkZTogUGxhdGZvcm1SZWYsIGRlcHM6IFtJbmplY3Rvcl0gfSwKICAgIHsgcHJvdmlkZTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZGVwczogW10gfSwKICAgIHsgcHJvdmlkZTogQ29uc29sZSwgZGVwczogW10gfSwKXTsKLyoqCiAqIFRoaXMgcGxhdGZvcm0gaGFzIHRvIGJlIGluY2x1ZGVkIGluIGFueSBvdGhlciBwbGF0Zm9ybQogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IHBsYXRmb3JtQ29yZSA9IGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShudWxsLCAnY29yZScsIF9DT1JFX1BMQVRGT1JNX1BST1ZJREVSUyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfaXRlcmFibGVEaWZmZXJzRmFjdG9yeSgpIHsKICAgIHJldHVybiBkZWZhdWx0SXRlcmFibGVEaWZmZXJzOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkoKSB7CiAgICByZXR1cm4gZGVmYXVsdEtleVZhbHVlRGlmZmVyczsKfQovKioKICogQHBhcmFtIHs/PX0gbG9jYWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbG9jYWxlRmFjdG9yeShsb2NhbGUpIHsKICAgIGxvY2FsZSA9IGxvY2FsZSB8fCBnZXRHbG9iYWxMb2NhbGUoKTsKICAgIHsKICAgICAgICBzZXRMb2NhbGVJZChsb2NhbGUpOwogICAgfQogICAgcmV0dXJuIGxvY2FsZTsKfQovKioKICogV29yayBvdXQgdGhlIGxvY2FsZSBmcm9tIHRoZSBwb3RlbnRpYWwgZ2xvYmFsIHByb3BlcnRpZXMuCiAqCiAqICogQ2xvc3VyZSBDb21waWxlcjogdXNlIGBnb29nLkxPQ0FMRWAuCiAqICogSXZ5IGVuYWJsZWQ6IHVzZSBgJGxvY2FsaXplLmxvY2FsZWAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEdsb2JhbExvY2FsZSgpIHsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nSTE4bkNsb3N1cmVNb2RlICYmCiAgICAgICAgdHlwZW9mIGdvb2cgIT09ICd1bmRlZmluZWQnICYmIGdvb2cuTE9DQUxFICE9PSAnZW4nKSB7CiAgICAgICAgLy8gKiBUaGUgZGVmYXVsdCBgZ29vZy5MT0NBTEVgIHZhbHVlIGlzIGBlbmAsIHdoaWxlIEFuZ3VsYXIgdXNlZCBgZW4tVVNgLgogICAgICAgIC8vICogSW4gb3JkZXIgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHVzZSBBbmd1bGFyIGRlZmF1bHQgdmFsdWUgb3ZlcgogICAgICAgIC8vICAgQ2xvc3VyZSBDb21waWxlcidzIG9uZS4KICAgICAgICByZXR1cm4gZ29vZy5MT0NBTEU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBLRUVQIGB0eXBlb2YgJGxvY2FsaXplICE9PSAndW5kZWZpbmVkJyAmJiAkbG9jYWxpemUubG9jYWxlYCBJTiBTWU5DIFdJVEggVEhFIExPQ0FMSVpFCiAgICAgICAgLy8gQ09NUElMRS1USU1FIElOTElORVIuCiAgICAgICAgLy8KICAgICAgICAvLyAqIER1cmluZyBjb21waWxlIHRpbWUgaW5saW5pbmcgb2YgdHJhbnNsYXRpb25zIHRoZSBleHByZXNzaW9uIHdpbGwgYmUgcmVwbGFjZWQKICAgICAgICAvLyAgIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0aGF0IGlzIHRoZSBjdXJyZW50IGxvY2FsZS4gT3RoZXIgZm9ybXMgb2YgdGhpcyBleHByZXNzaW9uIGFyZSBub3QKICAgICAgICAvLyAgIGd1YXJhbnRlZWQgdG8gYmUgcmVwbGFjZWQuCiAgICAgICAgLy8KICAgICAgICAvLyAqIER1cmluZyBydW50aW1lIHRyYW5zbGF0aW9uIGV2YWx1YXRpb24sIHRoZSBkZXZlbG9wZXIgaXMgcmVxdWlyZWQgdG8gc2V0IGAkbG9jYWxpemUubG9jYWxlYAogICAgICAgIC8vICAgaWYgcmVxdWlyZWQsIG9yIGp1c3QgdG8gcHJvdmlkZSB0aGVpciBvd24gYExPQ0FMRV9JRGAgcHJvdmlkZXIuCiAgICAgICAgcmV0dXJuICggdHlwZW9mICRsb2NhbGl6ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgJGxvY2FsaXplLmxvY2FsZSkgfHwKICAgICAgICAgICAgREVGQVVMVF9MT0NBTEVfSUQ7CiAgICB9Cn0KY29uc3QgybUwJGcgPSBVU0RfQ1VSUkVOQ1lfQ09ERTsKLyoqCiAqIEEgYnVpbHQtaW4gW2RlcGVuZGVuY3kgaW5qZWN0aW9uIHRva2VuXShndWlkZS9nbG9zc2FyeSNkaS10b2tlbikKICogdGhhdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcm9vdCBpbmplY3RvciBmb3IgYm9vdHN0cmFwcGluZy4KICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBMSUNBVElPTl9NT0RVTEVfUFJPVklERVJTID0gWwogICAgewogICAgICAgIHByb3ZpZGU6IEFwcGxpY2F0aW9uUmVmLAogICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvblJlZiwKICAgICAgICBkZXBzOiBbTmdab25lLCBDb25zb2xlLCBJbmplY3RvciwgRXJyb3JIYW5kbGVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEFwcGxpY2F0aW9uSW5pdFN0YXR1c10KICAgIH0sCiAgICB7IHByb3ZpZGU6IFNDSEVEVUxFUiwgZGVwczogW05nWm9uZV0sIHVzZUZhY3Rvcnk6IHpvbmVTY2hlZHVsZXJGYWN0b3J5IH0sCiAgICB7CiAgICAgICAgcHJvdmlkZTogQXBwbGljYXRpb25Jbml0U3RhdHVzLAogICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsCiAgICAgICAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgQVBQX0lOSVRJQUxJWkVSXV0KICAgIH0sCiAgICB7IHByb3ZpZGU6IENvbXBpbGVyLCB1c2VDbGFzczogQ29tcGlsZXIsIGRlcHM6IFtdIH0sCiAgICBBUFBfSURfUkFORE9NX1BST1ZJREVSLAogICAgeyBwcm92aWRlOiBJdGVyYWJsZURpZmZlcnMsIHVzZUZhY3Rvcnk6IF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5LCBkZXBzOiBbXSB9LAogICAgeyBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsIHVzZUZhY3Rvcnk6IF9rZXlWYWx1ZURpZmZlcnNGYWN0b3J5LCBkZXBzOiBbXSB9LAogICAgewogICAgICAgIHByb3ZpZGU6IExPQ0FMRV9JRCQxLAogICAgICAgIHVzZUZhY3Rvcnk6IF9sb2NhbGVGYWN0b3J5LAogICAgICAgIGRlcHM6IFtbbmV3IEluamVjdChMT0NBTEVfSUQkMSksIG5ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKV1dCiAgICB9LAogICAgeyBwcm92aWRlOiBERUZBVUxUX0NVUlJFTkNZX0NPREUsIHVzZVZhbHVlOiDJtTAkZyB9LApdOwovKioKICogU2NoZWR1bGUgd29yayBhdCBuZXh0IGF2YWlsYWJsZSBzbG90LgogKgogKiBJbiBJdnkgdGhpcyBpcyBqdXN0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHdoZW4gYm9vdHN0cmFwcGVkCiAqIHVzaW5nIGBwbGF0Zm9ybVJlZi5ib290c3RyYXBgIHdlIG5lZWQgdG8gdXNlIGBOZ1pvbmUub25TdGFibGVgIGFzIHRoZSBzY2hlZHVsaW5nIG1lY2hhbmlzbS4KICogVGhpcyBvdmVycmlkZXMgdGhlIHNjaGVkdWxpbmcgbWVjaGFuaXNtIGluIEl2eSB0byBgTmdab25lLm9uU3RhYmxlYC4KICoKICogQHBhcmFtIHs/fSBuZ1pvbmUgTmdab25lIHRvIHVzZSBmb3Igc2NoZWR1bGluZy4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHpvbmVTY2hlZHVsZXJGYWN0b3J5KG5nWm9uZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHF1ZXVlID0gW107CiAgICBuZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChxdWV1ZS5wb3AoKSkpKCk7CiAgICAgICAgfQogICAgfSkpOwogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChmbikgewogICAgICAgIHF1ZXVlLnB1c2goZm4pOwogICAgfSk7Cn0KLyoqCiAqIENvbmZpZ3VyZXMgdGhlIHJvb3QgaW5qZWN0b3IgZm9yIGFuIGFwcCB3aXRoCiAqIHByb3ZpZGVycyBvZiBgXEBhbmd1bGFyL2NvcmVgIGRlcGVuZGVuY2llcyB0aGF0IGBBcHBsaWNhdGlvblJlZmAgbmVlZHMKICogdG8gYm9vdHN0cmFwIGNvbXBvbmVudHMuCiAqCiAqIFJlLWV4cG9ydGVkIGJ5IGBCcm93c2VyTW9kdWxlYCwgd2hpY2ggaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSBpbiB0aGUgcm9vdAogKiBgQXBwTW9kdWxlYCB3aGVuIHlvdSBjcmVhdGUgYSBuZXcgYXBwIHdpdGggdGhlIENMSSBgbmV3YCBjb21tYW5kLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQXBwbGljYXRpb25Nb2R1bGUgewogICAgLy8gSW5qZWN0IEFwcGxpY2F0aW9uUmVmIHRvIG1ha2UgaXQgZWFnZXIuLi4KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhcHBSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoYXBwUmVmKSB7IH0KfQpBcHBsaWNhdGlvbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFwcGxpY2F0aW9uTW9kdWxlIH0pOwpBcHBsaWNhdGlvbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFwcGxpY2F0aW9uTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFwcGxpY2F0aW9uTW9kdWxlKSjJtcm1aW5qZWN0KEFwcGxpY2F0aW9uUmVmKSk7IH0sIHByb3ZpZGVyczogQVBQTElDQVRJT05fTU9EVUxFX1BST1ZJREVSUyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkFwcGxpY2F0aW9uTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBBcHBsaWNhdGlvblJlZiB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlX3ByaXZhdGVfZXhwb3J0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlX3JlbmRlcjNfcHJpdmF0ZV9leHBvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NvZGVnZW5fcHJpdmF0ZV9leHBvcnRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmlmIChuZ0Rldk1vZGUpIHsKICAgIC8vIFRoaXMgaGVscGVyIGlzIHRvIGdpdmUgYSByZWFzb25hYmxlIGVycm9yIG1lc3NhZ2UgdG8gcGVvcGxlIHVwZ3JhZGluZyB0byB2OSB0aGF0IGhhdmUgbm90IHlldAogICAgLy8gaW5zdGFsbGVkIGBAYW5ndWxhci9sb2NhbGl6ZWAgaW4gdGhlaXIgYXBwLgogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIF9nbG9iYWwuJGxvY2FsaXplID0gX2dsb2JhbC4kbG9jYWxpemUgfHwgKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgbG9va3MgbGlrZSB5b3VyIGFwcGxpY2F0aW9uIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGlzIHVzaW5nIGkxOG4uXG4nICsKICAgICAgICAgICAgJ0FuZ3VsYXIgOSBpbnRyb2R1Y2VkIGEgZ2xvYmFsIGAkbG9jYWxpemUoKWAgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQuXG4nICsKICAgICAgICAgICAgJ1BsZWFzZSBydW4gYG5nIGFkZCBAYW5ndWxhci9sb2NhbGl6ZWAgZnJvbSB0aGUgQW5ndWxhciBDTEkuXG4nICsKICAgICAgICAgICAgJyhGb3Igbm9uLUNMSSBwcm9qZWN0cywgYWRkIGBpbXBvcnQgXCdAYW5ndWxhci9sb2NhbGl6ZS9pbml0XCc7YCB0byB5b3VyIGBwb2x5ZmlsbHMudHNgIGZpbGUuXG4nICsKICAgICAgICAgICAgJ0ZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYXBwbGljYXRpb25zIGFkZCB0aGUgaW1wb3J0IHRvIHlvdXIgYG1haW4uc2VydmVyLnRzYCBmaWxlLiknKTsKICAgIH0pOwp9CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KbGV0IF9ET00gPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERPTSgpIHsKICAgIHJldHVybiBfRE9NOwp9Ci8qKgogKiBAcGFyYW0gez99IGFkYXB0ZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldFJvb3REb21BZGFwdGVyKGFkYXB0ZXIpIHsKICAgIGlmICghX0RPTSkgewogICAgICAgIF9ET00gPSBhZGFwdGVyOwogICAgfQp9Ci8qIHRzbGludDpkaXNhYmxlOnJlcXVpcmVQYXJhbWV0ZXJUeXBlICovCi8qKgogKiBQcm92aWRlcyBET00gb3BlcmF0aW9ucyBpbiBhbiBlbnZpcm9ubWVudC1hZ25vc3RpYyB3YXkuCiAqCiAqIFxAc2VjdXJpdHkgVHJlYWQgY2FyZWZ1bGx5ISBJbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZGlyZWN0bHkgaXMgZGFuZ2Vyb3VzIGFuZAogKiBjYW4gaW50cm9kdWNlIFhTUyByaXNrcy4KICogQGFic3RyYWN0CiAqLwpjbGFzcyBEb21BZGFwdGVyIHsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kb21fdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyB0aGUgbWFpbiByZW5kZXJpbmcgY29udGV4dC4gSW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIERPTSBEb2N1bWVudC4KICoKICogTm90ZTogRG9jdW1lbnQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgQXBwbGljYXRpb24gQ29udGV4dCB3aGVuIEFwcGxpY2F0aW9uIGFuZCBSZW5kZXJpbmcKICogQ29udGV4dHMgYXJlIG5vdCB0aGUgc2FtZSAoZS5nLiB3aGVuIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGluIGEgV2ViIFdvcmtlcikuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgRE9DVU1FTlQkMSA9IG5ldyBJbmplY3Rpb25Ub2tlbignRG9jdW1lbnRUb2tlbicpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9sb2NhdGlvbi9wbGF0Zm9ybV9sb2NhdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyLiBJbnN0ZWFkLCB1c2UKICoge1xAbGluayBMb2NhdGlvbn0uCiAqCiAqIGBQbGF0Zm9ybUxvY2F0aW9uYCBlbmNhcHN1bGF0ZXMgYWxsIGNhbGxzIHRvIERPTSBhcGlzLCB3aGljaCBhbGxvd3MgdGhlIFJvdXRlciB0byBiZSBwbGF0Zm9ybQogKiBhZ25vc3RpYy4KICogVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBoYXZlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiBgUGxhdGZvcm1Mb2NhdGlvbmAgZm9yIHRoZSBkaWZmZXJlbnQKICogcGxhdGZvcm1zIHRoYXQgYW5ndWxhciBzdXBwb3J0cy4gRm9yIGV4YW1wbGUsIGBcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcmAgcHJvdmlkZXMgYW4KICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgdG8gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQsIHdoaWxlIGBcQGFuZ3VsYXIvcGxhdGZvcm0td2Vid29ya2VyYCBwcm92aWRlcwogKiBvbmUgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHdlYiB3b3JrZXJzLgogKgogKiBUaGUgYFBsYXRmb3JtTG9jYXRpb25gIGNsYXNzIGlzIHVzZWQgZGlyZWN0bHkgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBvZiB7XEBsaW5rIExvY2F0aW9uU3RyYXRlZ3l9CiAqIHdoZW4gdGhleSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIERPTSBhcGlzIGxpa2UgcHVzaFN0YXRlLCBwb3BTdGF0ZSwgZXRjLi4uCiAqCiAqIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0gaW4gdHVybiBpcyB1c2VkIGJ5IHRoZSB7XEBsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHdoaWNoIGlzIHVzZWQgZGlyZWN0bHkKICogYnkgdGhlIHtcQGxpbmsgUm91dGVyfSBpbiBvcmRlciB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHJvdXRlcy4gU2luY2UgYWxsIGludGVyYWN0aW9ucyBiZXR3ZWVuIHtcQGxpbmsKICogUm91dGVyfSAvCiAqIHtcQGxpbmsgTG9jYXRpb259IC8ge1xAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBhbmQgRE9NIGFwaXMgZmxvdyB0aHJvdWdoIHRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAKICogY2xhc3MgdGhleSBhcmUgYWxsIHBsYXRmb3JtIGluZGVwZW5kZW50LgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIFBsYXRmb3JtTG9jYXRpb24gewp9ClBsYXRmb3JtTG9jYXRpb24uybVmYWMgPSBmdW5jdGlvbiBQbGF0Zm9ybUxvY2F0aW9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsYXRmb3JtTG9jYXRpb24pKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbGF0Zm9ybUxvY2F0aW9uLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogdXNlQnJvd3NlclBsYXRmb3JtTG9jYXRpb24sIHRva2VuOiBQbGF0Zm9ybUxvY2F0aW9uLCBwcm92aWRlZEluOiAicGxhdGZvcm0iIH0pOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVzZUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uKCkgewogICAgcmV0dXJuIMm1ybVpbmplY3QoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24pOwp9Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEluZGljYXRlcyB3aGVuIGEgbG9jYXRpb24gaXMgaW5pdGlhbGl6ZWQuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTE9DQVRJT05fSU5JVElBTElaRUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0xvY2F0aW9uIEluaXRpYWxpemVkJyk7Ci8qKgogKiBgUGxhdGZvcm1Mb2NhdGlvbmAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIHRvIHBsYXRmb3JtIEFQSXMuCiAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uIGRldmVsb3Blci4gSW5zdGVhZCwgdXNlCiAqIHtcQGxpbmsgTG9jYXRpb259LgogKi8KY2xhc3MgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24gZXh0ZW5kcyBQbGF0Zm9ybUxvY2F0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2RvYyA9IF9kb2M7CiAgICAgICAgdGhpcy5faW5pdCgpOwogICAgfQogICAgLy8gVGhpcyBpcyBtb3ZlZCB0byBpdHMgb3duIG1ldGhvZCBzbyB0aGF0IGBNb2NrUGxhdGZvcm1Mb2NhdGlvblN0cmF0ZWd5YCBjYW4gb3ZlcndyaXRlIGl0CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbml0KCkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sb2NhdGlvbiA9IGdldERPTSgpLmdldExvY2F0aW9uKCk7CiAgICAgICAgdGhpcy5faGlzdG9yeSA9IGdldERPTSgpLmdldEhpc3RvcnkoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QmFzZUhyZWZGcm9tRE9NKCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0RE9NKCkuZ2V0QmFzZUhyZWYodGhpcy5fZG9jKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblBvcFN0YXRlKGZuKSB7CiAgICAgICAgZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCAnd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmbiwgZmFsc2UpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkhhc2hDaGFuZ2UoZm4pIHsKICAgICAgICBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsICd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZm4sIGZhbHNlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGhyZWYoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uaHJlZjsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHByb3RvY29sKCkgewogICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnByb3RvY29sOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaG9zdG5hbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uaG9zdG5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwb3J0KCkgewogICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnBvcnQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXRobmFtZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXRobmFtZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHNlYXJjaCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5zZWFyY2g7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBoYXNoKCkgewogICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLmhhc2g7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmV3UGF0aAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHBhdGhuYW1lKG5ld1BhdGgpIHsKICAgICAgICB0aGlzLmxvY2F0aW9uLnBhdGhuYW1lID0gbmV3UGF0aDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCkgewogICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHsKICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gdXJsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCkgewogICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHsKICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gdXJsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yd2FyZCgpIHsKICAgICAgICB0aGlzLl9oaXN0b3J5LmZvcndhcmQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmFjaygpIHsKICAgICAgICB0aGlzLl9oaXN0b3J5LmJhY2soKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0U3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hpc3Rvcnkuc3RhdGU7CiAgICB9Cn0KQnJvd3NlclBsYXRmb3JtTG9jYXRpb24uybVmYWMgPSBmdW5jdGlvbiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbikoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gQnJvd3NlclBsYXRmb3JtTG9jYXRpb24uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBjcmVhdGVCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiwgdG9rZW46IEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLCBwcm92aWRlZEluOiAicGxhdGZvcm0iIH0pOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN1cHBvcnRzU3RhdGUoKSB7CiAgICByZXR1cm4gISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbigpIHsKICAgIHJldHVybiBuZXcgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24oybXJtWluamVjdChET0NVTUVOVCQxKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcHJpdmF0ZV9leHBvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vdXRpbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBKb2lucyB0d28gcGFydHMgb2YgYSBVUkwgd2l0aCBhIHNsYXNoIGlmIG5lZWRlZC4KICoKICogQHBhcmFtIHs/fSBzdGFydCAgVVJMIHN0cmluZwogKiBAcGFyYW0gez99IGVuZCAgICBVUkwgc3RyaW5nCiAqCiAqCiAqIEByZXR1cm4gez99IFRoZSBqb2luZWQgVVJMIHN0cmluZy4KICovCmZ1bmN0aW9uIGpvaW5XaXRoU2xhc2goc3RhcnQsIGVuZCkgewogICAgaWYgKHN0YXJ0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIGlmIChlbmQubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgc2xhc2hlcyA9IDA7CiAgICBpZiAoc3RhcnQuZW5kc1dpdGgoJy8nKSkgewogICAgICAgIHNsYXNoZXMrKzsKICAgIH0KICAgIGlmIChlbmQuc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgc2xhc2hlcysrOwogICAgfQogICAgaWYgKHNsYXNoZXMgPT0gMikgewogICAgICAgIHJldHVybiBzdGFydCArIGVuZC5zdWJzdHJpbmcoMSk7CiAgICB9CiAgICBpZiAoc2xhc2hlcyA9PSAxKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgZW5kOwogICAgfQogICAgcmV0dXJuIHN0YXJ0ICsgJy8nICsgZW5kOwp9Ci8qKgogKiBSZW1vdmVzIGEgdHJhaWxpbmcgc2xhc2ggZnJvbSBhIFVSTCBzdHJpbmcgaWYgbmVlZGVkLgogKiBMb29rcyBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWl0aGVyIGAjYCwgYD9gLCBvciB0aGUgZW5kIG9mIHRoZQogKiBsaW5lIGFzIGAvYCBjaGFyYWN0ZXJzIGFuZCByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBpZiBvbmUgZXhpc3RzLgogKgogKiBAcGFyYW0gez99IHVybCBVUkwgc3RyaW5nLgogKgogKiBAcmV0dXJuIHs/fSBUaGUgVVJMIHN0cmluZywgbW9kaWZpZWQgaWYgbmVlZGVkLgogKi8KZnVuY3Rpb24gc3RyaXBUcmFpbGluZ1NsYXNoKHVybCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goLyN8XD98JC8pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGF0aEVuZElkeCA9IG1hdGNoICYmIG1hdGNoLmluZGV4IHx8IHVybC5sZW5ndGg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkcm9wcGVkU2xhc2hJZHggPSBwYXRoRW5kSWR4IC0gKHVybFtwYXRoRW5kSWR4IC0gMV0gPT09ICcvJyA/IDEgOiAwKTsKICAgIHJldHVybiB1cmwuc2xpY2UoMCwgZHJvcHBlZFNsYXNoSWR4KSArIHVybC5zbGljZShwYXRoRW5kSWR4KTsKfQovKioKICogTm9ybWFsaXplcyBVUkwgcGFyYW1ldGVycyBieSBwcmVwZW5kaW5nIHdpdGggYD9gIGlmIG5lZWRlZC4KICoKICogQHBhcmFtIHs/fSBwYXJhbXMgU3RyaW5nIG9mIFVSTCBwYXJhbWV0ZXJzLgogKgogKiBAcmV0dXJuIHs/fSBUaGUgbm9ybWFsaXplZCBVUkwgcGFyYW1ldGVycyBzdHJpbmcuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVRdWVyeVBhcmFtcyhwYXJhbXMpIHsKICAgIHJldHVybiBwYXJhbXMgJiYgcGFyYW1zWzBdICE9PSAnPycgPyAnPycgKyBwYXJhbXMgOiBwYXJhbXM7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vbG9jYXRpb25fc3RyYXRlZ3kudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEVuYWJsZXMgdGhlIGBMb2NhdGlvbmAgc2VydmljZSB0byByZWFkIHJvdXRlIHN0YXRlIGZyb20gdGhlIGJyb3dzZXIncyBVUkwuCiAqIEFuZ3VsYXIgcHJvdmlkZXMgdHdvIHN0cmF0ZWdpZXM6CiAqIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgYW5kIGBQYXRoTG9jYXRpb25TdHJhdGVneWAuCiAqCiAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBgUm91dGVyYCBvciBgTG9jYXRpb25gIHNlcnZpY2VzIHRvCiAqIGludGVyYWN0IHdpdGggYXBwbGljYXRpb24gcm91dGUgc3RhdGUuCiAqCiAqIEZvciBpbnN0YW5jZSwgYEhhc2hMb2NhdGlvblN0cmF0ZWd5YCBwcm9kdWNlcyBVUkxzIGxpa2UKICogPGNvZGUgY2xhc3M9Im5vLWF1dG8tbGluayI+aHR0cDovL2V4YW1wbGUuY29tIy9mb288L2NvZGU+LAogKiBhbmQgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCBwcm9kdWNlcwogKiA8Y29kZSBjbGFzcz0ibm8tYXV0by1saW5rIj5odHRwOi8vZXhhbXBsZS5jb20vZm9vPC9jb2RlPiBhcyBhbiBlcXVpdmFsZW50IFVSTC4KICoKICogU2VlIHRoZXNlIHR3byBjbGFzc2VzIGZvciBtb3JlLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIExvY2F0aW9uU3RyYXRlZ3kgewp9CkxvY2F0aW9uU3RyYXRlZ3kuybVmYWMgPSBmdW5jdGlvbiBMb2NhdGlvblN0cmF0ZWd5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExvY2F0aW9uU3RyYXRlZ3kpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBMb2NhdGlvblN0cmF0ZWd5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogcHJvdmlkZUxvY2F0aW9uU3RyYXRlZ3ksIHRva2VuOiBMb2NhdGlvblN0cmF0ZWd5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBAcGFyYW0gez99IHBsYXRmb3JtTG9jYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHByb3ZpZGVMb2NhdGlvblN0cmF0ZWd5KHBsYXRmb3JtTG9jYXRpb24pIHsKICAgIC8vIFNlZSAjMjM5MTcKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvY2F0aW9uID0gybXJtWluamVjdChET0NVTUVOVCQxKS5sb2NhdGlvbjsKICAgIHJldHVybiBuZXcgUGF0aExvY2F0aW9uU3RyYXRlZ3koybXJtWluamVjdCgoLyoqIEB0eXBlIHs/fSAqLyAoUGxhdGZvcm1Mb2NhdGlvbikpKSwgbG9jYXRpb24gJiYgbG9jYXRpb24ub3JpZ2luIHx8ICcnKTsKfQovKioKICogQSBwcmVkZWZpbmVkIFtESSB0b2tlbl0oZ3VpZGUvZ2xvc3NhcnkjZGktdG9rZW4pIGZvciB0aGUgYmFzZSBocmVmCiAqIHRvIGJlIHVzZWQgd2l0aCB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YC4KICogVGhlIGJhc2UgaHJlZiBpcyB0aGUgVVJMIHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbiBnZW5lcmF0aW5nCiAqIGFuZCByZWNvZ25pemluZyBVUkxzLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgdGhpcyB0b2tlbiB0byBjb25maWd1cmUgdGhlIHJvb3QgYXBwIGluamVjdG9yCiAqIHdpdGggYSBiYXNlIGhyZWYgdmFsdWUsIHNvIHRoYXQgdGhlIERJIGZyYW1ld29yayBjYW4gc3VwcGx5IHRoZSBkZXBlbmRlbmN5IGFueXdoZXJlIGluIHRoZSBhcHAuCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogaW1wb3J0IHtDb21wb25lbnQsIE5nTW9kdWxlfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAqIGltcG9ydCB7QVBQX0JBU0VfSFJFRn0gZnJvbSAnXEBhbmd1bGFyL2NvbW1vbic7CiAqCiAqIFxATmdNb2R1bGUoewogKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBBUFBfQkFTRV9IUkVGLCB1c2VWYWx1ZTogJy9teS9hcHAnfV0KICogfSkKICogY2xhc3MgQXBwTW9kdWxlIHt9CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEFQUF9CQVNFX0hSRUYgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2FwcEJhc2VIcmVmJyk7Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEEge1xAbGluayBMb2NhdGlvblN0cmF0ZWd5fSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge1xAbGluayBMb2NhdGlvbn0gc2VydmljZSB0bwogKiByZXByZXNlbnQgaXRzIHN0YXRlIGluIHRoZQogKiBbcGF0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheCkgb2YgdGhlCiAqIGJyb3dzZXIncyBVUkwuCiAqCiAqIElmIHlvdSdyZSB1c2luZyBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgLCB5b3UgbXVzdCBwcm92aWRlIGEge1xAbGluayBBUFBfQkFTRV9IUkVGfQogKiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LiBUaGlzIFVSTCBwcmVmaXggdGhhdCB3aWxsIGJlIHByZXNlcnZlZAogKiB3aGVuIGdlbmVyYXRpbmcgYW5kIHJlY29nbml6aW5nIFVSTHMuCiAqCiAqIEZvciBpbnN0YW5jZSwgaWYgeW91IHByb3ZpZGUgYW4gYEFQUF9CQVNFX0hSRUZgIG9mIGAnL215L2FwcCdgIGFuZCBjYWxsCiAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWUKICogYGV4YW1wbGUuY29tL215L2FwcC9mb29gLgogKgogKiBTaW1pbGFybHksIGlmIHlvdSBhZGQgYDxiYXNlIGhyZWY9Jy9teS9hcHAnLz5gIHRvIHRoZSBkb2N1bWVudCBhbmQgY2FsbAogKiBgbG9jYXRpb24uZ28oJy9mb28nKWAsIHRoZSBicm93c2VyJ3MgVVJMIHdpbGwgYmVjb21lCiAqIGBleGFtcGxlLmNvbS9teS9hcHAvZm9vYC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL2xvY2F0aW9uL3RzL3BhdGhfbG9jYXRpb25fY29tcG9uZW50LnRzIHJlZ2lvbj0nTG9jYXRpb25Db21wb25lbnQnfQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUGF0aExvY2F0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhdGlvblN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm1Mb2NhdGlvbgogICAgICogQHBhcmFtIHs/PX0gaHJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcGxhdGZvcm1Mb2NhdGlvbiwgaHJlZikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IF9wbGF0Zm9ybUxvY2F0aW9uOwogICAgICAgIGlmIChocmVmID09IG51bGwpIHsKICAgICAgICAgICAgaHJlZiA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0QmFzZUhyZWZGcm9tRE9NKCk7CiAgICAgICAgfQogICAgICAgIGlmIChocmVmID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBiYXNlIGhyZWYgc2V0LiBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgQVBQX0JBU0VfSFJFRiB0b2tlbiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LmApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9iYXNlSHJlZiA9IGhyZWY7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uUG9wU3RhdGUoZm4pIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUoZm4pOwogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QmFzZUhyZWYoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VIcmVmOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWwpIHsKICAgICAgICByZXR1cm4gam9pbldpdGhTbGFzaCh0aGlzLl9iYXNlSHJlZiwgaW50ZXJuYWwpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBpbmNsdWRlSGFzaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGF0aChpbmNsdWRlSGFzaCA9IGZhbHNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZSArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDsKICAgICAgICByZXR1cm4gaGFzaCAmJiBpbmNsdWRlSGFzaCA/IGAke3BhdGhuYW1lfSR7aGFzaH1gIDogcGF0aG5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gdGl0bGUKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIGV4dGVybmFsVXJsKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCwgcXVlcnlQYXJhbXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwgKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpOwogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgZXh0ZXJuYWxVcmwpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3J3YXJkKCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiYWNrKCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpOwogICAgfQp9ClBhdGhMb2NhdGlvblN0cmF0ZWd5Lsm1ZmFjID0gZnVuY3Rpb24gUGF0aExvY2F0aW9uU3RyYXRlZ3lfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGF0aExvY2F0aW9uU3RyYXRlZ3kpKMm1ybVpbmplY3QoUGxhdGZvcm1Mb2NhdGlvbiksIMm1ybVpbmplY3QoQVBQX0JBU0VfSFJFRiwgOCkpOyB9OwpQYXRoTG9jYXRpb25TdHJhdGVneS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBQYXRoTG9jYXRpb25TdHJhdGVneSwgZmFjdG9yeTogUGF0aExvY2F0aW9uU3RyYXRlZ3kuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpQYXRoTG9jYXRpb25TdHJhdGVneS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUGxhdGZvcm1Mb2NhdGlvbiB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0JBU0VfSFJFRixdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vaGFzaF9sb2NhdGlvbl9zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBkZXNjcmlwdGlvbgogKiBBIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0gdXNlZCB0byBjb25maWd1cmUgdGhlIHtcQGxpbmsgTG9jYXRpb259IHNlcnZpY2UgdG8KICogcmVwcmVzZW50IGl0cyBzdGF0ZSBpbiB0aGUKICogW2hhc2ggZnJhZ21lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaWZvcm1fUmVzb3VyY2VfTG9jYXRvciNTeW50YXgpCiAqIG9mIHRoZSBicm93c2VyJ3MgVVJMLgogKgogKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBjYWxsIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWUKICogYGV4YW1wbGUuY29tIy9mb29gLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEV4YW1wbGUKICoKICoge1xAZXhhbXBsZSBjb21tb24vbG9jYXRpb24vdHMvaGFzaF9sb2NhdGlvbl9jb21wb25lbnQudHMgcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCd9CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIYXNoTG9jYXRpb25TdHJhdGVneSBleHRlbmRzIExvY2F0aW9uU3RyYXRlZ3kgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybUxvY2F0aW9uCiAgICAgKiBAcGFyYW0gez89fSBfYmFzZUhyZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3BsYXRmb3JtTG9jYXRpb24sIF9iYXNlSHJlZikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IF9wbGF0Zm9ybUxvY2F0aW9uOwogICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gJyc7CiAgICAgICAgaWYgKF9iYXNlSHJlZiAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gX2Jhc2VIcmVmOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Qb3BTdGF0ZShmbikgewogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShmbik7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vbkhhc2hDaGFuZ2UoZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRCYXNlSHJlZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYmFzZUhyZWY7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IGluY2x1ZGVIYXNoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwYXRoKGluY2x1ZGVIYXNoID0gZmFsc2UpIHsKICAgICAgICAvLyB0aGUgaGFzaCB2YWx1ZSBpcyBhbHdheXMgcHJlZml4ZWQgd2l0aCBhIGAjYAogICAgICAgIC8vIGFuZCBpZiBpdCBpcyBlbXB0eSB0aGVuIGl0IHdpbGwgc3RheSBlbXB0eQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGF0aCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDsKICAgICAgICBpZiAocGF0aCA9PSBudWxsKQogICAgICAgICAgICBwYXRoID0gJyMnOwogICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGg7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHByZXBhcmVFeHRlcm5hbFVybChpbnRlcm5hbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB1cmwgPSBqb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLCBpbnRlcm5hbCk7CiAgICAgICAgcmV0dXJuIHVybC5sZW5ndGggPiAwID8gKCcjJyArIHVybCkgOiB1cmw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gdGl0bGUKICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgcGF0aCwgcXVlcnlQYXJhbXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHVybCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpOwogICAgICAgIGlmICh1cmwubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgdXJsID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IHRpdGxlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB1cmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTsKICAgICAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIHVybCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yd2FyZCgpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmFjaygpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmJhY2soKTsKICAgIH0KfQpIYXNoTG9jYXRpb25TdHJhdGVneS7JtWZhYyA9IGZ1bmN0aW9uIEhhc2hMb2NhdGlvblN0cmF0ZWd5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhhc2hMb2NhdGlvblN0cmF0ZWd5KSjJtcm1aW5qZWN0KFBsYXRmb3JtTG9jYXRpb24pLCDJtcm1aW5qZWN0KEFQUF9CQVNFX0hSRUYsIDgpKTsgfTsKSGFzaExvY2F0aW9uU3RyYXRlZ3kuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSGFzaExvY2F0aW9uU3RyYXRlZ3ksIGZhY3Rvcnk6IEhhc2hMb2NhdGlvblN0cmF0ZWd5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSGFzaExvY2F0aW9uU3RyYXRlZ3kuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24gfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FQUF9CQVNFX0hSRUYsXSB9XSB9Cl07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEEgc2VydmljZSB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGludGVyYWN0IHdpdGggYSBicm93c2VyJ3MgVVJMLgogKgogKiBEZXBlbmRpbmcgb24gdGhlIGBMb2NhdGlvblN0cmF0ZWd5YCB1c2VkLCBgTG9jYXRpb25gIHBlcnNpc3RzCiAqIHRvIHRoZSBVUkwncyBwYXRoIG9yIHRoZSBVUkwncyBoYXNoIHNlZ21lbnQuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiBJdCdzIGJldHRlciB0byB1c2UgdGhlIGBSb3V0ZXIjbmF2aWdhdGVgIHNlcnZpY2UgdG8gdHJpZ2dlciByb3V0ZSBjaGFuZ2VzLiBVc2UKICogYExvY2F0aW9uYCBvbmx5IGlmIHlvdSBuZWVkIHRvIGludGVyYWN0IHdpdGggb3IgY3JlYXRlIG5vcm1hbGl6ZWQgVVJMcyBvdXRzaWRlIG9mCiAqIHJvdXRpbmcuCiAqCiAqIGBMb2NhdGlvbmAgaXMgcmVzcG9uc2libGUgZm9yIG5vcm1hbGl6aW5nIHRoZSBVUkwgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24ncyBiYXNlIGhyZWYuCiAqIEEgbm9ybWFsaXplZCBVUkwgaXMgYWJzb2x1dGUgZnJvbSB0aGUgVVJMIGhvc3QsIGluY2x1ZGVzIHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgaHJlZiwgYW5kIGhhcyBubwogKiB0cmFpbGluZyBzbGFzaDoKICogLSBgL215L2FwcC91c2VyLzEyM2AgaXMgbm9ybWFsaXplZAogKiAtIGBteS9hcHAvdXNlci8xMjNgICoqaXMgbm90Kiogbm9ybWFsaXplZAogKiAtIGAvbXkvYXBwL3VzZXIvMTIzL2AgKippcyBub3QqKiBub3JtYWxpemVkCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0nY29tbW9uL2xvY2F0aW9uL3RzL3BhdGhfbG9jYXRpb25fY29tcG9uZW50LnRzJwogKiByZWdpb249J0xvY2F0aW9uQ29tcG9uZW50Jz48L2NvZGUtZXhhbXBsZT4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIExvY2F0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybVN0cmF0ZWd5CiAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtTG9jYXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IocGxhdGZvcm1TdHJhdGVneSwgcGxhdGZvcm1Mb2NhdGlvbikgewogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMgPSBbXTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5ID0gcGxhdGZvcm1TdHJhdGVneTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYnJvd3NlckJhc2VIcmVmID0gdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5nZXRCYXNlSHJlZigpOwogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24gPSBwbGF0Zm9ybUxvY2F0aW9uOwogICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gc3RyaXBUcmFpbGluZ1NsYXNoKF9zdHJpcEluZGV4SHRtbChicm93c2VyQmFzZUhyZWYpKTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5Lm9uUG9wU3RhdGUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldikgPT4gewogICAgICAgICAgICB0aGlzLl9zdWJqZWN0LmVtaXQoewogICAgICAgICAgICAgICAgJ3VybCc6IHRoaXMucGF0aCh0cnVlKSwKICAgICAgICAgICAgICAgICdwb3AnOiB0cnVlLAogICAgICAgICAgICAgICAgJ3N0YXRlJzogZXYuc3RhdGUsCiAgICAgICAgICAgICAgICAndHlwZSc6IGV2LnR5cGUsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyB0aGUgVVJMIHBhdGggZm9yIHRoaXMgbG9jYXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gaW5jbHVkZUhhc2ggVHJ1ZSB0byBpbmNsdWRlIGFuIGFuY2hvciBmcmFnbWVudCBpbiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbm9ybWFsaXplZCBVUkwgcGF0aC4KICAgICAqLwogICAgLy8gVE9ETzogdnNhdmtpbi4gUmVtb3ZlIHRoZSBib29sZWFuIGZsYWcgYW5kIGFsd2F5cyBpbmNsdWRlIGhhc2ggb25jZSB0aGUgZGVwcmVjYXRlZCByb3V0ZXIgaXMKICAgIC8vIHJlbW92ZWQuCiAgICBwYXRoKGluY2x1ZGVIYXNoID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wYXRoKGluY2x1ZGVIYXNoKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlcG9ydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvY2F0aW9uIGhpc3RvcnkuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYGhpc3Rvcnkuc3RhdGVgIG9iamVjdC4KICAgICAqLwogICAgZ2V0U3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0U3RhdGUoKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gcGF0aCBhbmQgY29tcGFyZXMgdG8gdGhlIGN1cnJlbnQgbm9ybWFsaXplZCBwYXRoLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcGF0aCBUaGUgZ2l2ZW4gVVJMIHBhdGguCiAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGdpdmVuIFVSTCBwYXRoIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IG5vcm1hbGl6ZWQgcGF0aCwgZmFsc2UKICAgICAqIG90aGVyd2lzZS4KICAgICAqLwogICAgaXNDdXJyZW50UGF0aEVxdWFsVG8ocGF0aCwgcXVlcnkgPSAnJykgewogICAgICAgIHJldHVybiB0aGlzLnBhdGgoKSA9PSB0aGlzLm5vcm1hbGl6ZShwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnkpKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyBhIFVSTCBwYXRoIGJ5IHN0cmlwcGluZyBhbnkgdHJhaWxpbmcgc2xhc2hlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHVybCBTdHJpbmcgcmVwcmVzZW50aW5nIGEgVVJMLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRoZSBub3JtYWxpemVkIFVSTCBzdHJpbmcuCiAgICAgKi8KICAgIG5vcm1hbGl6ZSh1cmwpIHsKICAgICAgICByZXR1cm4gTG9jYXRpb24uc3RyaXBUcmFpbGluZ1NsYXNoKF9zdHJpcEJhc2VIcmVmKHRoaXMuX2Jhc2VIcmVmLCBfc3RyaXBJbmRleEh0bWwodXJsKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBOb3JtYWxpemVzIGFuIGV4dGVybmFsIFVSTCBwYXRoLgogICAgICogSWYgdGhlIGdpdmVuIFVSTCBkb2Vzbid0IGJlZ2luIHdpdGggYSBsZWFkaW5nIHNsYXNoIChgJy8nYCksIGFkZHMgb25lCiAgICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIEFkZHMgYSBoYXNoIGlmIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgaXMKICAgICAqIGluIHVzZSwgb3IgdGhlIGBBUFBfQkFTRV9IUkVGYCBpZiB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCBpcyBpbiB1c2UuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB1cmwgU3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBBIG5vcm1hbGl6ZWQgcGxhdGZvcm0tc3BlY2lmaWMgVVJMLgogICAgICovCiAgICBwcmVwYXJlRXh0ZXJuYWxVcmwodXJsKSB7CiAgICAgICAgaWYgKHVybCAmJiB1cmxbMF0gIT09ICcvJykgewogICAgICAgICAgICB1cmwgPSAnLycgKyB1cmw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybCh1cmwpOwogICAgfQogICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgbWV0aG9kIHRvIHB1c2hTdGF0ZQogICAgLyoqCiAgICAgKiBDaGFuZ2VzIHRoZSBicm93c2VyJ3MgVVJMIHRvIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gVVJMLCBhbmQgcHVzaGVzIGEKICAgICAqIG5ldyBpdGVtIG9udG8gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHBhdGggIFVSTCBwYXRoIHRvIG5vcm1hbGl6ZS4KICAgICAqIEBwYXJhbSB7Pz19IHF1ZXJ5IFF1ZXJ5IHBhcmFtZXRlcnMuCiAgICAgKiBAcGFyYW0gez89fSBzdGF0ZSBMb2NhdGlvbiBoaXN0b3J5IHN0YXRlLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdvKHBhdGgsIHF1ZXJ5ID0gJycsIHN0YXRlID0gbnVsbCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucHVzaFN0YXRlKHN0YXRlLCAnJywgcGF0aCwgcXVlcnkpOwogICAgICAgIHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnkpKSwgc3RhdGUpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGFuZ2VzIHRoZSBicm93c2VyJ3MgVVJMIHRvIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBVUkwsIGFuZCByZXBsYWNlcwogICAgICogdGhlIHRvcCBpdGVtIG9uIHRoZSBwbGF0Zm9ybSdzIGhpc3Rvcnkgc3RhY2suCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBwYXRoICBVUkwgcGF0aCB0byBub3JtYWxpemUuCiAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHs/PX0gc3RhdGUgTG9jYXRpb24gaGlzdG9yeSBzdGF0ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShwYXRoLCBxdWVyeSA9ICcnLCBzdGF0ZSA9IG51bGwpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnJlcGxhY2VTdGF0ZShzdGF0ZSwgJycsIHBhdGgsIHF1ZXJ5KTsKICAgICAgICB0aGlzLl9ub3RpZnlVcmxDaGFuZ2VMaXN0ZW5lcnModGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5KSksIHN0YXRlKTsKICAgIH0KICAgIC8qKgogICAgICogTmF2aWdhdGVzIGZvcndhcmQgaW4gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvcndhcmQoKSB7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5mb3J3YXJkKCk7CiAgICB9CiAgICAvKioKICAgICAqIE5hdmlnYXRlcyBiYWNrIGluIHRoZSBwbGF0Zm9ybSdzIGhpc3RvcnkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiYWNrKCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuYmFjaygpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBVUkwgY2hhbmdlIGxpc3RlbmVyLiBVc2UgdG8gY2F0Y2ggdXBkYXRlcyBwZXJmb3JtZWQgYnkgdGhlIEFuZ3VsYXIKICAgICAqIGZyYW1ld29yayB0aGF0IGFyZSBub3QgZGV0ZWN0aWJsZSB0aHJvdWdoICJwb3BzdGF0ZSIgb3IgImhhc2hjaGFuZ2UiIGV2ZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjaGFuZ2UgaGFuZGxlciBmdW5jdGlvbiwgd2hpY2ggdGFrZSBhIFVSTCBhbmQgYSBsb2NhdGlvbiBoaXN0b3J5IHN0YXRlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25VcmxDaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMucHVzaChmbik7CiAgICAgICAgdGhpcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdiA9PiB7CiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh2LnVybCwgdi5zdGF0ZSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez89fSB1cmwKICAgICAqIEBwYXJhbSB7Pz19IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHVybCA9ICcnLCBzdGF0ZSkgewogICAgICAgIHRoaXMuX3VybENoYW5nZUxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmbiA9PiBmbih1cmwsIHN0YXRlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBwbGF0Zm9ybSdzIGBwb3BTdGF0ZWAgZXZlbnRzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gb25OZXh0CiAgICAgKiBAcGFyYW0gez89fSBvblRocm93CiAgICAgKiBAcGFyYW0gez89fSBvblJldHVybgogICAgICogQHJldHVybiB7P30gU3Vic2NyaWJlZCBldmVudHMuCiAgICAgKi8KICAgIHN1YnNjcmliZShvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YmplY3Quc3Vic2NyaWJlKHsgbmV4dDogb25OZXh0LCBlcnJvcjogb25UaHJvdywgY29tcGxldGU6IG9uUmV0dXJuIH0pOwogICAgfQp9CkxvY2F0aW9uLsm1ZmFjID0gZnVuY3Rpb24gTG9jYXRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTG9jYXRpb24pKMm1ybVpbmplY3QoTG9jYXRpb25TdHJhdGVneSksIMm1ybVpbmplY3QoUGxhdGZvcm1Mb2NhdGlvbikpOyB9OwovKioKICogTm9ybWFsaXplcyBVUkwgcGFyYW1ldGVycyBieSBwcmVwZW5kaW5nIHdpdGggYD9gIGlmIG5lZWRlZC4KICoKICogQHBhcmFtIHBhcmFtcyBTdHJpbmcgb2YgVVJMIHBhcmFtZXRlcnMuCiAqCiAqIEByZXR1cm4gVGhlIG5vcm1hbGl6ZWQgVVJMIHBhcmFtZXRlcnMgc3RyaW5nLgogKi8KTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMgPSBub3JtYWxpemVRdWVyeVBhcmFtczsKLyoqCiAqIEpvaW5zIHR3byBwYXJ0cyBvZiBhIFVSTCB3aXRoIGEgc2xhc2ggaWYgbmVlZGVkLgogKgogKiBAcGFyYW0gc3RhcnQgIFVSTCBzdHJpbmcKICogQHBhcmFtIGVuZCAgICBVUkwgc3RyaW5nCiAqCiAqCiAqIEByZXR1cm4gVGhlIGpvaW5lZCBVUkwgc3RyaW5nLgogKi8KTG9jYXRpb24uam9pbldpdGhTbGFzaCA9IGpvaW5XaXRoU2xhc2g7Ci8qKgogKiBSZW1vdmVzIGEgdHJhaWxpbmcgc2xhc2ggZnJvbSBhIFVSTCBzdHJpbmcgaWYgbmVlZGVkLgogKiBMb29rcyBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWl0aGVyIGAjYCwgYD9gLCBvciB0aGUgZW5kIG9mIHRoZQogKiBsaW5lIGFzIGAvYCBjaGFyYWN0ZXJzIGFuZCByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBpZiBvbmUgZXhpc3RzLgogKgogKiBAcGFyYW0gdXJsIFVSTCBzdHJpbmcuCiAqCiAqIEByZXR1cm4gVGhlIFVSTCBzdHJpbmcsIG1vZGlmaWVkIGlmIG5lZWRlZC4KICovCkxvY2F0aW9uLnN0cmlwVHJhaWxpbmdTbGFzaCA9IHN0cmlwVHJhaWxpbmdTbGFzaDsKLyoqIEBub2NvbGxhcHNlICovCkxvY2F0aW9uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBMb2NhdGlvblN0cmF0ZWd5IH0sCiAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gTG9jYXRpb24uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBjcmVhdGVMb2NhdGlvbiwgdG9rZW46IExvY2F0aW9uLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlTG9jYXRpb24oKSB7CiAgICByZXR1cm4gbmV3IExvY2F0aW9uKMm1ybVpbmplY3QoKC8qKiBAdHlwZSB7P30gKi8gKExvY2F0aW9uU3RyYXRlZ3kpKSksIMm1ybVpbmplY3QoKC8qKiBAdHlwZSB7P30gKi8gKFBsYXRmb3JtTG9jYXRpb24pKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IGJhc2VIcmVmCiAqIEBwYXJhbSB7P30gdXJsCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfc3RyaXBCYXNlSHJlZihiYXNlSHJlZiwgdXJsKSB7CiAgICByZXR1cm4gYmFzZUhyZWYgJiYgdXJsLnN0YXJ0c1dpdGgoYmFzZUhyZWYpID8gdXJsLnN1YnN0cmluZyhiYXNlSHJlZi5sZW5ndGgpIDogdXJsOwp9Ci8qKgogKiBAcGFyYW0gez99IHVybAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX3N0cmlwSW5kZXhIdG1sKHVybCkgewogICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cL2luZGV4Lmh0bWwkLywgJycpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2xvY2F0aW9uL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2kxOG4vY3VycmVuY2llcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZCi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzCi8qKgogKiBcQGludGVybmFsCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ1VSUkVOQ0lFU19FTiA9IHsKICAgICdBRFAnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0FGTic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnQUxMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdBTUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDJdLAogICAgJ0FPQSc6IFt1bmRlZmluZWQsICdLeiddLAogICAgJ0FSUyc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQVVEJzogWydBJCcsICckJ10sCiAgICAnQkFNJzogW3VuZGVmaW5lZCwgJ0tNJ10sCiAgICAnQkJEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdCRFQnOiBbdW5kZWZpbmVkLCAn4KezJ10sCiAgICAnQkhEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSwKICAgICdCSUYnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0JNRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQk5EJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdCT0InOiBbdW5kZWZpbmVkLCAnQnMnXSwKICAgICdCUkwnOiBbJ1IkJ10sCiAgICAnQlNEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdCV1AnOiBbdW5kZWZpbmVkLCAnUCddLAogICAgJ0JZTic6IFt1bmRlZmluZWQsICfRgC4nLCAyXSwKICAgICdCWVInOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0JaRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQ0FEJzogWydDQSQnLCAnJCcsIDJdLAogICAgJ0NIRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sCiAgICAnQ0xGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCA0XSwKICAgICdDTFAnOiBbdW5kZWZpbmVkLCAnJCcsIDBdLAogICAgJ0NOWSc6IFsnQ07CpScsICfCpSddLAogICAgJ0NPUCc6IFt1bmRlZmluZWQsICckJywgMl0sCiAgICAnQ1JDJzogW3VuZGVmaW5lZCwgJ+KCoScsIDJdLAogICAgJ0NVQyc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQ1VQJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdDWksnOiBbdW5kZWZpbmVkLCAnS8SNJywgMl0sCiAgICAnREpGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdES0snOiBbdW5kZWZpbmVkLCAna3InLCAyXSwKICAgICdET1AnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0VHUCc6IFt1bmRlZmluZWQsICdFwqMnXSwKICAgICdFU1AnOiBbdW5kZWZpbmVkLCAn4oKnJywgMF0sCiAgICAnRVVSJzogWyfigqwnXSwKICAgICdGSkQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0ZLUCc6IFt1bmRlZmluZWQsICfCoyddLAogICAgJ0dCUCc6IFsnwqMnXSwKICAgICdHRUwnOiBbdW5kZWZpbmVkLCAn4oK+J10sCiAgICAnR0lQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAnR05GJzogW3VuZGVmaW5lZCwgJ0ZHJywgMF0sCiAgICAnR1RRJzogW3VuZGVmaW5lZCwgJ1EnXSwKICAgICdHWUQnOiBbdW5kZWZpbmVkLCAnJCcsIDJdLAogICAgJ0hLRCc6IFsnSEskJywgJyQnXSwKICAgICdITkwnOiBbdW5kZWZpbmVkLCAnTCddLAogICAgJ0hSSyc6IFt1bmRlZmluZWQsICdrbiddLAogICAgJ0hVRic6IFt1bmRlZmluZWQsICdGdCcsIDJdLAogICAgJ0lEUic6IFt1bmRlZmluZWQsICdScCcsIDJdLAogICAgJ0lMUyc6IFsn4oKqJ10sCiAgICAnSU5SJzogWyfigrknXSwKICAgICdJUUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0lSUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnSVNLJzogW3VuZGVmaW5lZCwgJ2tyJywgMF0sCiAgICAnSVRMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdKTUQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0pPRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sCiAgICAnSlBZJzogWyfCpScsIHVuZGVmaW5lZCwgMF0sCiAgICAnS0hSJzogW3VuZGVmaW5lZCwgJ+GfmyddLAogICAgJ0tNRic6IFt1bmRlZmluZWQsICdDRicsIDBdLAogICAgJ0tQVyc6IFt1bmRlZmluZWQsICfigqknLCAwXSwKICAgICdLUlcnOiBbJ+KCqScsIHVuZGVmaW5lZCwgMF0sCiAgICAnS1dEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSwKICAgICdLWUQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0taVCc6IFt1bmRlZmluZWQsICfigrgnXSwKICAgICdMQUsnOiBbdW5kZWZpbmVkLCAn4oKtJywgMF0sCiAgICAnTEJQJzogW3VuZGVmaW5lZCwgJ0zCoycsIDBdLAogICAgJ0xLUic6IFt1bmRlZmluZWQsICdScyddLAogICAgJ0xSRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnTFRMJzogW3VuZGVmaW5lZCwgJ0x0J10sCiAgICAnTFVGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdMVkwnOiBbdW5kZWZpbmVkLCAnTHMnXSwKICAgICdMWUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLAogICAgJ01HQSc6IFt1bmRlZmluZWQsICdBcicsIDBdLAogICAgJ01HRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnTU1LJzogW3VuZGVmaW5lZCwgJ0snLCAwXSwKICAgICdNTlQnOiBbdW5kZWZpbmVkLCAn4oKuJywgMl0sCiAgICAnTVJPJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdNVVInOiBbdW5kZWZpbmVkLCAnUnMnLCAyXSwKICAgICdNWE4nOiBbJ01YJCcsICckJ10sCiAgICAnTVlSJzogW3VuZGVmaW5lZCwgJ1JNJ10sCiAgICAnTkFEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdOR04nOiBbdW5kZWZpbmVkLCAn4oKmJ10sCiAgICAnTklPJzogW3VuZGVmaW5lZCwgJ0MkJ10sCiAgICAnTk9LJzogW3VuZGVmaW5lZCwgJ2tyJywgMl0sCiAgICAnTlBSJzogW3VuZGVmaW5lZCwgJ1JzJ10sCiAgICAnTlpEJzogWydOWiQnLCAnJCddLAogICAgJ09NUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sCiAgICAnUEhQJzogW3VuZGVmaW5lZCwgJ+KCsSddLAogICAgJ1BLUic6IFt1bmRlZmluZWQsICdScycsIDJdLAogICAgJ1BMTic6IFt1bmRlZmluZWQsICd6xYInXSwKICAgICdQWUcnOiBbdW5kZWZpbmVkLCAn4oKyJywgMF0sCiAgICAnUk9OJzogW3VuZGVmaW5lZCwgJ2xlaSddLAogICAgJ1JTRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnUlVCJzogW3VuZGVmaW5lZCwgJ+KCvSddLAogICAgJ1JVUic6IFt1bmRlZmluZWQsICfRgC4nXSwKICAgICdSV0YnOiBbdW5kZWZpbmVkLCAnUkYnLCAwXSwKICAgICdTQkQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ1NFSyc6IFt1bmRlZmluZWQsICdrcicsIDJdLAogICAgJ1NHRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnU0hQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAnU0xMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdTT1MnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ1NSRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnU1NQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAnU1REJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdTVE4nOiBbdW5kZWZpbmVkLCAnRGInXSwKICAgICdTWVAnOiBbdW5kZWZpbmVkLCAnwqMnLCAwXSwKICAgICdUSEInOiBbdW5kZWZpbmVkLCAn4Li/J10sCiAgICAnVE1NJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdUTkQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLAogICAgJ1RPUCc6IFt1bmRlZmluZWQsICdUJCddLAogICAgJ1RSTCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnVFJZJzogW3VuZGVmaW5lZCwgJ+KCuiddLAogICAgJ1RURCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnVFdEJzogWydOVCQnLCAnJCcsIDJdLAogICAgJ1RaUyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sCiAgICAnVUFIJzogW3VuZGVmaW5lZCwgJ+KCtCddLAogICAgJ1VHWCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnVVNEJzogWyckJ10sCiAgICAnVVlJJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdVWVUnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ1VZVyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgNF0sCiAgICAnVVpTJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAyXSwKICAgICdWRUYnOiBbdW5kZWZpbmVkLCAnQnMnLCAyXSwKICAgICdWTkQnOiBbJ+KCqycsIHVuZGVmaW5lZCwgMF0sCiAgICAnVlVWJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdYQUYnOiBbJ0ZDRkEnLCB1bmRlZmluZWQsIDBdLAogICAgJ1hDRCc6IFsnRUMkJywgJyQnXSwKICAgICdYT0YnOiBbJ0NGQScsIHVuZGVmaW5lZCwgMF0sCiAgICAnWFBGJzogWydDRlBGJywgdW5kZWZpbmVkLCAwXSwKICAgICdYWFgnOiBbJ8KkJ10sCiAgICAnWUVSJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdaQVInOiBbdW5kZWZpbmVkLCAnUiddLAogICAgJ1pNSyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnWk1XJzogW3VuZGVmaW5lZCwgJ1pLJ10sCiAgICAnWldEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2xvY2FsZV9kYXRhX2FwaS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgTnVtYmVyRm9ybWF0U3R5bGUgPSB7CiAgICBEZWNpbWFsOiAwLAogICAgUGVyY2VudDogMSwKICAgIEN1cnJlbmN5OiAyLAogICAgU2NpZW50aWZpYzogMywKfTsKTnVtYmVyRm9ybWF0U3R5bGVbTnVtYmVyRm9ybWF0U3R5bGUuRGVjaW1hbF0gPSAnRGVjaW1hbCc7Ck51bWJlckZvcm1hdFN0eWxlW051bWJlckZvcm1hdFN0eWxlLlBlcmNlbnRdID0gJ1BlcmNlbnQnOwpOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeV0gPSAnQ3VycmVuY3knOwpOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZS5TY2llbnRpZmljXSA9ICdTY2llbnRpZmljJzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IFBsdXJhbCA9IHsKICAgIFplcm86IDAsCiAgICBPbmU6IDEsCiAgICBUd286IDIsCiAgICBGZXc6IDMsCiAgICBNYW55OiA0LAogICAgT3RoZXI6IDUsCn07ClBsdXJhbFtQbHVyYWwuWmVyb10gPSAnWmVybyc7ClBsdXJhbFtQbHVyYWwuT25lXSA9ICdPbmUnOwpQbHVyYWxbUGx1cmFsLlR3b10gPSAnVHdvJzsKUGx1cmFsW1BsdXJhbC5GZXddID0gJ0Zldyc7ClBsdXJhbFtQbHVyYWwuTWFueV0gPSAnTWFueSc7ClBsdXJhbFtQbHVyYWwuT3RoZXJdID0gJ090aGVyJzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IEZvcm1TdHlsZSA9IHsKICAgIEZvcm1hdDogMCwKICAgIFN0YW5kYWxvbmU6IDEsCn07CkZvcm1TdHlsZVtGb3JtU3R5bGUuRm9ybWF0XSA9ICdGb3JtYXQnOwpGb3JtU3R5bGVbRm9ybVN0eWxlLlN0YW5kYWxvbmVdID0gJ1N0YW5kYWxvbmUnOwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgVHJhbnNsYXRpb25XaWR0aCA9IHsKICAgIC8qKiAxIGNoYXJhY3RlciBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICdTJyAqLwogICAgTmFycm93OiAwLAogICAgLyoqIDMgY2hhcmFjdGVycyBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICdTdW4nICovCiAgICBBYmJyZXZpYXRlZDogMSwKICAgIC8qKiBGdWxsIGxlbmd0aCBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICJTdW5kYXkiICovCiAgICBXaWRlOiAyLAogICAgLyoqIDIgY2hhcmFjdGVycyBmb3IgYGVuLVVTYCwgRm9yIGV4YW1wbGU6ICJTdSIgKi8KICAgIFNob3J0OiAzLAp9OwpUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguTmFycm93XSA9ICdOYXJyb3cnOwpUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWRdID0gJ0FiYnJldmlhdGVkJzsKVHJhbnNsYXRpb25XaWR0aFtUcmFuc2xhdGlvbldpZHRoLldpZGVdID0gJ1dpZGUnOwpUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguU2hvcnRdID0gJ1Nob3J0JzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IEZvcm1hdFdpZHRoID0gewogICAgLyoqCiAgICAgKiBGb3IgYGVuLVVTYCwgJ00vZC95eSwgaDptbSBhJ2AKICAgICAqIChFeGFtcGxlOiBgNi8xNS8xNSwgOTowMyBBTWApCiAgICAgKi8KICAgIFNob3J0OiAwLAogICAgLyoqCiAgICAgKiBGb3IgYGVuLVVTYCwgYCdNTU0gZCwgeSwgaDptbTpzcyBhJ2AKICAgICAqIChFeGFtcGxlOiBgSnVuIDE1LCAyMDE1LCA5OjAzOjAxIEFNYCkKICAgICAqLwogICAgTWVkaXVtOiAxLAogICAgLyoqCiAgICAgKiBGb3IgYGVuLVVTYCwgYCdNTU1NIGQsIHksIGg6bW06c3MgYSB6J2AKICAgICAqIChFeGFtcGxlOiBgSnVuZSAxNSwgMjAxNSBhdCA5OjAzOjAxIEFNIEdNVCsxYCkKICAgICAqLwogICAgTG9uZzogMiwKICAgIC8qKgogICAgICogRm9yIGBlbi1VU2AsIGAnRUVFRSwgTU1NTSBkLCB5LCBoOm1tOnNzIGEgenp6eidgCiAgICAgKiAoRXhhbXBsZTogYE1vbmRheSwgSnVuZSAxNSwgMjAxNSBhdCA5OjAzOjAxIEFNIEdNVCswMTowMGApCiAgICAgKi8KICAgIEZ1bGw6IDMsCn07CkZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLlNob3J0XSA9ICdTaG9ydCc7CkZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLk1lZGl1bV0gPSAnTWVkaXVtJzsKRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGguTG9uZ10gPSAnTG9uZyc7CkZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLkZ1bGxdID0gJ0Z1bGwnOwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgTnVtYmVyU3ltYm9sID0gewogICAgLyoqCiAgICAgKiBEZWNpbWFsIHNlcGFyYXRvci4KICAgICAqIEZvciBgZW4tVVNgLCB0aGUgZG90IGNoYXJhY3Rlci4KICAgICAqIEV4YW1wbGUgOiAyLDM0NWAuYDY3CiAgICAgKi8KICAgIERlY2ltYWw6IDAsCiAgICAvKioKICAgICAqIEdyb3VwaW5nIHNlcGFyYXRvciwgdHlwaWNhbGx5IGZvciB0aG91c2FuZHMuCiAgICAgKiBGb3IgYGVuLVVTYCwgdGhlIGNvbW1hIGNoYXJhY3Rlci4KICAgICAqIEV4YW1wbGU6IDJgLGAzNDUuNjcKICAgICAqLwogICAgR3JvdXA6IDEsCiAgICAvKioKICAgICAqIExpc3QtaXRlbSBzZXBhcmF0b3IuCiAgICAgKiBFeGFtcGxlOiAib25lLCB0d28sIGFuZCB0aHJlZSIKICAgICAqLwogICAgTGlzdDogMiwKICAgIC8qKgogICAgICogU2lnbiBmb3IgcGVyY2VudGFnZSAob3V0IG9mIDEwMCkuCiAgICAgKiBFeGFtcGxlOiAyMy40JQogICAgICovCiAgICBQZXJjZW50U2lnbjogMywKICAgIC8qKgogICAgICogU2lnbiBmb3IgcG9zaXRpdmUgbnVtYmVycy4KICAgICAqIEV4YW1wbGU6ICsyMwogICAgICovCiAgICBQbHVzU2lnbjogNCwKICAgIC8qKgogICAgICogU2lnbiBmb3IgbmVnYXRpdmUgbnVtYmVycy4KICAgICAqIEV4YW1wbGU6IC0yMwogICAgICovCiAgICBNaW51c1NpZ246IDUsCiAgICAvKioKICAgICAqIENvbXB1dGVyIG5vdGF0aW9uIGZvciBleHBvbmVudGlhbCB2YWx1ZSAobiB0aW1lcyBhIHBvd2VyIG9mIDEwKS4KICAgICAqIEV4YW1wbGU6IDEuMkUzCiAgICAgKi8KICAgIEV4cG9uZW50aWFsOiA2LAogICAgLyoqCiAgICAgKiBIdW1hbi1yZWFkYWJsZSBmb3JtYXQgb2YgZXhwb25lbnRpYWwuCiAgICAgKiBFeGFtcGxlOiAxLjJ4MTAzCiAgICAgKi8KICAgIFN1cGVyc2NyaXB0aW5nRXhwb25lbnQ6IDcsCiAgICAvKioKICAgICAqIFNpZ24gZm9yIHBlcm1pbGxlIChvdXQgb2YgMTAwMCkuCiAgICAgKiBFeGFtcGxlOiAyMy404oCwCiAgICAgKi8KICAgIFBlck1pbGxlOiA4LAogICAgLyoqCiAgICAgKiBJbmZpbml0eSwgY2FuIGJlIHVzZWQgd2l0aCBwbHVzIGFuZCBtaW51cy4KICAgICAqIEV4YW1wbGU6IOKIniwgK+KIniwgLeKIngogICAgICovCiAgICBJbmZpbml0eTogOSwKICAgIC8qKgogICAgICogTm90IGEgbnVtYmVyLgogICAgICogRXhhbXBsZTogTmFOCiAgICAgKi8KICAgIE5hTjogMTAsCiAgICAvKioKICAgICAqIFN5bWJvbCB1c2VkIGJldHdlZW4gdGltZSB1bml0cy4KICAgICAqIEV4YW1wbGU6IDEwOjUyCiAgICAgKi8KICAgIFRpbWVTZXBhcmF0b3I6IDExLAogICAgLyoqCiAgICAgKiBEZWNpbWFsIHNlcGFyYXRvciBmb3IgY3VycmVuY3kgdmFsdWVzIChmYWxsYmFjayB0byBgRGVjaW1hbGApLgogICAgICogRXhhbXBsZTogJDIsMzQ1LjY3CiAgICAgKi8KICAgIEN1cnJlbmN5RGVjaW1hbDogMTIsCiAgICAvKioKICAgICAqIEdyb3VwIHNlcGFyYXRvciBmb3IgY3VycmVuY3kgdmFsdWVzIChmYWxsYmFjayB0byBgR3JvdXBgKS4KICAgICAqIEV4YW1wbGU6ICQyLDM0NS42NwogICAgICovCiAgICBDdXJyZW5jeUdyb3VwOiAxMywKfTsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5EZWNpbWFsXSA9ICdEZWNpbWFsJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5Hcm91cF0gPSAnR3JvdXAnOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkxpc3RdID0gJ0xpc3QnOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlBlcmNlbnRTaWduXSA9ICdQZXJjZW50U2lnbic7Ck51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuUGx1c1NpZ25dID0gJ1BsdXNTaWduJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5NaW51c1NpZ25dID0gJ01pbnVzU2lnbic7Ck51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuRXhwb25lbnRpYWxdID0gJ0V4cG9uZW50aWFsJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5TdXBlcnNjcmlwdGluZ0V4cG9uZW50XSA9ICdTdXBlcnNjcmlwdGluZ0V4cG9uZW50JzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5QZXJNaWxsZV0gPSAnUGVyTWlsbGUnOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkluZmluaXR5XSA9ICdJbmZpbml0eSc7Ck51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuTmFOXSA9ICdOYU4nOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlRpbWVTZXBhcmF0b3JdID0gJ1RpbWVTZXBhcmF0b3InOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkN1cnJlbmN5RGVjaW1hbF0gPSAnQ3VycmVuY3lEZWNpbWFsJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5DdXJyZW5jeUdyb3VwXSA9ICdDdXJyZW5jeUdyb3VwJzsKLyoqCiAqIFJldHJpZXZlcyB0aGUgbG9jYWxlIElEIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlLgogKiBUaGUgbG9hZGVkIGxvY2FsZSBjb3VsZCBiZSwgZm9yIGV4YW1wbGUsIGEgZ2xvYmFsIG9uZSByYXRoZXIgdGhhbiBhIHJlZ2lvbmFsIG9uZS4KICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSwgc3VjaCBhcyBgZnItRlJgLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxlIGNvZGUuIEZvciBleGFtcGxlLCBgZnJgLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlSWQkMShsb2NhbGUpIHsKICAgIHJldHVybiBmaW5kTG9jYWxlRGF0YShsb2NhbGUpW0xvY2FsZURhdGFJbmRleC5Mb2NhbGVJZF07Cn0KLyoqCiAqIFJldHJpZXZlcyBkYXkgcGVyaW9kIHN0cmluZ3MgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/fSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIHBlcmlvZCBzdHJpbmdzLiBGb3IgZXhhbXBsZSwgYFtBTSwgUE1dYCBmb3IgYGVuLVVTYC4KICovCmZ1bmN0aW9uIGdldExvY2FsZURheVBlcmlvZHMobG9jYWxlLCBmb3JtU3R5bGUsIHdpZHRoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFtUG1EYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKFsKICAgICAgICBkYXRhW0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzRm9ybWF0XSwgZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF5UGVyaW9kc1N0YW5kYWxvbmVdCiAgICBdKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhbVBtID0gZ2V0TGFzdERlZmluZWRWYWx1ZShhbVBtRGF0YSwgZm9ybVN0eWxlKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGFtUG0sIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIGRheXMgb2YgdGhlIHdlZWsgZm9yIHRoZSBnaXZlbiBsb2NhbGUsIHVzaW5nIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/fSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIG5hbWUgc3RyaW5ncy4KICogRm9yIGV4YW1wbGUsYFtTdW5kYXksIE1vbmRheSwgLi4uIFNhdHVyZGF5XWAgZm9yIGBlbi1VU2AuCiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVEYXlOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF5c0RhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW2RhdGFbTG9jYWxlRGF0YUluZGV4LkRheXNGb3JtYXRdLCBkYXRhW0xvY2FsZURhdGFJbmRleC5EYXlzU3RhbmRhbG9uZV1dKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXlzID0gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXlzRGF0YSwgZm9ybVN0eWxlKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGRheXMsIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIG1vbnRocyBvZiB0aGUgeWVhciBmb3IgdGhlIGdpdmVuIGxvY2FsZSwgdXNpbmcgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci4KICoKICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez99IGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS4KICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLgogKiBAcmV0dXJuIHs/fSBBbiBhcnJheSBvZiBsb2NhbGl6ZWQgbmFtZSBzdHJpbmdzLgogKiBGb3IgZXhhbXBsZSwgIGBbSmFudWFyeSwgRmVicnVhcnksIC4uLl1gIGZvciBgZW4tVVNgLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlTW9udGhOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbW9udGhzRGF0YSA9ICgvKiogQHR5cGUgez99ICovIChbZGF0YVtMb2NhbGVEYXRhSW5kZXguTW9udGhzRm9ybWF0XSwgZGF0YVtMb2NhbGVEYXRhSW5kZXguTW9udGhzU3RhbmRhbG9uZV1dKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb250aHMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKG1vbnRoc0RhdGEsIGZvcm1TdHlsZSk7CiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShtb250aHMsIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIEdyZWdvcmlhbi1jYWxlbmRhciBlcmFzIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgogKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIGVyYSBzdHJpbmdzLgogKiBGb3IgZXhhbXBsZSwgYFtBRCwgQkNdYCBmb3IgYGVuLVVTYC4KICovCmZ1bmN0aW9uIGdldExvY2FsZUVyYU5hbWVzKGxvY2FsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJhc0RhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVtMb2NhbGVEYXRhSW5kZXguRXJhc10pKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGVyYXNEYXRhLCB3aWR0aCk7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBkYXRlLXZhbHVlIGZvcm1hdGluZyBzdHJpbmcuCiAqCiAqIEBzZWUgYEZvcm1hdFdpZHRoYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdGluZyBzdHJpbmcuCiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF0ZUZvcm1hdF0sIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIGEgbG9jYWxpemVkIHRpbWUtdmFsdWUgZm9ybWF0dGluZyBzdHJpbmcuCiAqCiAqIEBzZWUgYEZvcm1hdFdpZHRoYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlVGltZUZvcm1hdChsb2NhbGUsIHdpZHRoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGRhdGFbTG9jYWxlRGF0YUluZGV4LlRpbWVGb3JtYXRdLCB3aWR0aCk7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBkYXRlLXRpbWUgZm9ybWF0dGluZyBzdHJpbmcuCiAqCiAqIEBzZWUgYEZvcm1hdFdpZHRoYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB3aWR0aCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRlVGltZUZvcm1hdERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF0ZVRpbWVGb3JtYXRdKSk7CiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXRlVGltZUZvcm1hdERhdGEsIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIGEgbG9jYWxpemVkIG51bWJlciBzeW1ib2wgdGhhdCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVycyBpbiBudW1iZXIgZm9ybWF0cy4KICogQHNlZSBgTnVtYmVyU3ltYm9sYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBUaGUgbG9jYWxlIGNvZGUuCiAqIEBwYXJhbSB7P30gc3ltYm9sIFRoZSBzeW1ib2wgdG8gbG9jYWxpemUuCiAqIEByZXR1cm4gez99IFRoZSBjaGFyYWN0ZXIgZm9yIHRoZSBsb2NhbGl6ZWQgc3ltYm9sLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgc3ltYm9sKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IGRhdGFbTG9jYWxlRGF0YUluZGV4Lk51bWJlclN5bWJvbHNdW3N5bWJvbF07CiAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoc3ltYm9sID09PSBOdW1iZXJTeW1ib2wuQ3VycmVuY3lEZWNpbWFsKSB7CiAgICAgICAgICAgIHJldHVybiBkYXRhW0xvY2FsZURhdGFJbmRleC5OdW1iZXJTeW1ib2xzXVtOdW1iZXJTeW1ib2wuRGVjaW1hbF07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gTnVtYmVyU3ltYm9sLkN1cnJlbmN5R3JvdXApIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGFbTG9jYWxlRGF0YUluZGV4Lk51bWJlclN5bWJvbHNdW051bWJlclN5bWJvbC5Hcm91cF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKfQovKioKICogUmV0cmlldmVzIGEgbnVtYmVyIGZvcm1hdCBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIE51bWJlcnMgYXJlIGZvcm1hdHRlZCB1c2luZyBwYXR0ZXJucywgbGlrZSBgIywjIyMuMDBgLiBGb3IgZXhhbXBsZSwgdGhlIHBhdHRlcm4gYCMsIyMjLjAwYAogKiB3aGVuIHVzZWQgdG8gZm9ybWF0IHRoZSBudW1iZXIgMTIzNDUuNjc4IGNvdWxkIHJlc3VsdCBpbiAiMTInMzQ1LDY3OCIuIFRoYXQgd291bGQgaGFwcGVuIGlmIHRoZQogKiBncm91cGluZyBzZXBhcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgaXMgYW4gYXBvc3Ryb3BoZSwgYW5kIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyBhIGNvbW1hLgogKgogKiA8Yj5JbXBvcnRhbnQ6PC9iPiBUaGUgY2hhcmFjdGVycyBgLmAgYCxgIGAwYCBgI2AgKGFuZCBvdGhlcnMgYmVsb3cpIGFyZSBzcGVjaWFsIHBsYWNlaG9sZGVycwogKiB0aGF0IHN0YW5kIGZvciB0aGUgZGVjaW1hbCBzZXBhcmF0b3IsIGFuZCBzbyBvbiwgYW5kIGFyZSBOT1QgcmVhbCBjaGFyYWN0ZXJzLgogKiBZb3UgbXVzdCBOT1QgInRyYW5zbGF0ZSIgdGhlIHBsYWNlaG9sZGVycy4gRm9yIGV4YW1wbGUsIGRvbid0IGNoYW5nZSBgLmAgdG8gYCxgIGV2ZW4gdGhvdWdoIGluCiAqIHlvdXIgbGFuZ3VhZ2UgdGhlIGRlY2ltYWwgcG9pbnQgaXMgd3JpdHRlbiB3aXRoIGEgY29tbWEuIFRoZSBzeW1ib2xzIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUKICogbG9jYWwgZXF1aXZhbGVudHMsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBgTnVtYmVyU3ltYm9sYCBmb3IgeW91ciBsYW5ndWFnZS4KICoKICogSGVyZSBhcmUgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyB1c2VkIGluIG51bWJlciBwYXR0ZXJuczoKICoKICogfCBTeW1ib2wgfCBNZWFuaW5nIHwKICogfC0tLS0tLS0tfC0tLS0tLS0tLXwKICogfCAuIHwgUmVwbGFjZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2hhcmFjdGVyIHVzZWQgZm9yIHRoZSBkZWNpbWFsIHBvaW50LiB8CiAqIHwgLCB8IFJlcGxhY2VkIGJ5IHRoZSAiZ3JvdXBpbmciICh0aG91c2FuZHMpIHNlcGFyYXRvci4gfAogKiB8IDAgfCBSZXBsYWNlZCBieSBhIGRpZ2l0IChvciB6ZXJvIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggZGlnaXRzKS4gfAogKiB8ICMgfCBSZXBsYWNlZCBieSBhIGRpZ2l0IChvciBub3RoaW5nIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2gpLiB8CiAqIHwgwqQgfCBSZXBsYWNlZCBieSBhIGN1cnJlbmN5IHN5bWJvbCwgc3VjaCBhcyAkIG9yIFVTRC4gfAogKiB8ICUgfCBNYXJrcyBhIHBlcmNlbnQgZm9ybWF0LiBUaGUgJSBzeW1ib2wgbWF5IGNoYW5nZSBwb3NpdGlvbiwgYnV0IG11c3QgYmUgcmV0YWluZWQuIHwKICogfCBFIHwgTWFya3MgYSBzY2llbnRpZmljIGZvcm1hdC4gVGhlIEUgc3ltYm9sIG1heSBjaGFuZ2UgcG9zaXRpb24sIGJ1dCBtdXN0IGJlIHJldGFpbmVkLiB8CiAqIHwgJyB8IFNwZWNpYWwgY2hhcmFjdGVycyB1c2VkIGFzIGxpdGVyYWwgY2hhcmFjdGVycyBhcmUgcXVvdGVkIHdpdGggQVNDSUkgc2luZ2xlIHF1b3Rlcy4gfAogKgogKiBAc2VlIGBOdW1iZXJGb3JtYXRTdHlsZWAgLyBbQ0xEUiB3ZWJzaXRlXShodHRwOi8vY2xkci51bmljb2RlLm9yZy90cmFuc2xhdGlvbi9udW1iZXItcGF0dGVybnMpIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/fSB0eXBlIFRoZSB0eXBlIG9mIG51bWVyaWMgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIChzdWNoIGFzIGBEZWNpbWFsYCBvciBgQ3VycmVuY3lgLikKICogQHJldHVybiB7P30gVGhlIGxvY2FsaXplZCBmb3JtYXQgc3RyaW5nLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgdHlwZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICByZXR1cm4gZGF0YVtMb2NhbGVEYXRhSW5kZXguTnVtYmVyRm9ybWF0c11bdHlwZV07Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgY3VycmVuY3kgdmFsdWVzIGZvciBhIGdpdmVuIGxvY2FsZS4KICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcmV0dXJuIHs/fSBUaGUgY3VycmVuY3kgdmFsdWVzLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlQ3VycmVuY2llcyhsb2NhbGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgcmV0dXJuIGRhdGFbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmNpZXNdOwp9Ci8qKgogKiBcQGFsaWFzIGNvcmUvybVnZXRMb2NhbGVQbHVyYWxDYXNlCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZ2V0TG9jYWxlUGx1cmFsQ2FzZSQxID0gZ2V0TG9jYWxlUGx1cmFsQ2FzZTsKLyoqCiAqIEBwYXJhbSB7P30gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2hlY2tGdWxsRGF0YShkYXRhKSB7CiAgICBpZiAoIWRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV0pIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZXh0cmEgbG9jYWxlIGRhdGEgZm9yIHRoZSBsb2NhbGUgIiR7ZGF0YVtMb2NhbGVEYXRhSW5kZXgKICAgICAgICAgICAgLkxvY2FsZUlkXX0iLiBVc2UgInJlZ2lzdGVyTG9jYWxlRGF0YSIgdG8gbG9hZCBuZXcgZGF0YS4gU2VlIHRoZSAiSTE4biBndWlkZSIgb24gYW5ndWxhci5pbyB0byBrbm93IG1vcmUuYCk7CiAgICB9Cn0KLyoqCiAqIFJldHJpZXZlcyBsb2NhbGUtc3BlY2lmaWMgcnVsZXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggZGF5IHBlcmlvZCB0byB1c2UKICogd2hlbiBtb3JlIHRoYW4gb25lIHBlcmlvZCBpcyBkZWZpbmVkIGZvciBhIGxvY2FsZS4KICoKICogVGhlcmUgaXMgYSBydWxlIGZvciBlYWNoIGRlZmluZWQgZGF5IHBlcmlvZC4gVGhlCiAqIGZpcnN0IHJ1bGUgaXMgYXBwbGllZCB0byB0aGUgZmlyc3QgZGF5IHBlcmlvZCBhbmQgc28gb24uCiAqIEZhbGwgYmFjayB0byBBTS9QTSB3aGVuIG5vIHJ1bGVzIGFyZSBhdmFpbGFibGUuCiAqCiAqIEEgcnVsZSBjYW4gc3BlY2lmeSBhIHBlcmlvZCBhcyB0aW1lIHJhbmdlLCBvciBhcyBhIHNpbmdsZSB0aW1lIHZhbHVlLgogKgogKiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBhdmFpbGFibGUgd2hlbiB5b3UgaGF2ZSBsb2FkZWQgdGhlIGZ1bGwgbG9jYWxlIGRhdGEuCiAqIFNlZSB0aGUgWyJJMThuIGd1aWRlIl0oZ3VpZGUvaTE4biNpMThuLXBpcGVzKS4KICoKICogQHNlZSBgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKClgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHJldHVybiB7P30gVGhlIHJ1bGVzIGZvciB0aGUgbG9jYWxlLCBhIHNpbmdsZSB0aW1lIHZhbHVlIG9yIGFycmF5IG9mICpmcm9tLXRpbWUsIHRvLXRpbWUqLAogKiBvciBudWxsIGlmIG5vIHBlcmlvZHMgYXJlIGF2YWlsYWJsZS4KICoKICovCmZ1bmN0aW9uIGdldExvY2FsZUV4dHJhRGF5UGVyaW9kUnVsZXMobG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIGNoZWNrRnVsbERhdGEoZGF0YSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydWxlcyA9IGRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV1bMiAvKiBFeHRyYURheVBlcmlvZHNSdWxlcyAqL10gfHwgW107CiAgICByZXR1cm4gcnVsZXMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcnVsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJ1bGUpID0+IHsKICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiBleHRyYWN0VGltZShydWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtleHRyYWN0VGltZShydWxlWzBdKSwgZXh0cmFjdFRpbWUocnVsZVsxXSldOwogICAgfSkpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgbG9jYWxlLXNwZWNpZmljIGRheSBwZXJpb2RzLCB3aGljaCBpbmRpY2F0ZSByb3VnaGx5IGhvdyBhIGRheSBpcyBicm9rZW4gdXAKICogaW4gZGlmZmVyZW50IGxhbmd1YWdlcy4KICogRm9yIGV4YW1wbGUsIGZvciBgZW4tVVNgLCBwZXJpb2RzIGFyZSBtb3JuaW5nLCBub29uLCBhZnRlcm5vb24sIGV2ZW5pbmcsIGFuZCBtaWRuaWdodC4KICoKICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4geW91IGhhdmUgbG9hZGVkIHRoZSBmdWxsIGxvY2FsZSBkYXRhLgogKiBTZWUgdGhlIFsiSTE4biBndWlkZSJdKGd1aWRlL2kxOG4jaTE4bi1waXBlcykuCiAqCiAqIEBzZWUgYGdldExvY2FsZUV4dHJhRGF5UGVyaW9kUnVsZXMoKWAgLyBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez99IGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS4KICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLgogKiBAcmV0dXJuIHs/fSBUaGUgdHJhbnNsYXRlZCBkYXktcGVyaW9kIHN0cmluZ3MuCiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVFeHRyYURheVBlcmlvZHMobG9jYWxlLCBmb3JtU3R5bGUsIHdpZHRoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIGNoZWNrRnVsbERhdGEoZGF0YSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXlQZXJpb2RzRGF0YSA9ICgvKiogQHR5cGUgez99ICovIChbCiAgICAgICAgZGF0YVtMb2NhbGVEYXRhSW5kZXguRXh0cmFEYXRhXVswIC8qIEV4dHJhRGF5UGVyaW9kRm9ybWF0cyAqL10sCiAgICAgICAgZGF0YVtMb2NhbGVEYXRhSW5kZXguRXh0cmFEYXRhXVsxIC8qIEV4dHJhRGF5UGVyaW9kU3RhbmRhbG9uZSAqL10KICAgIF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRheVBlcmlvZHMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKGRheVBlcmlvZHNEYXRhLCBmb3JtU3R5bGUpIHx8IFtdOwogICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF5UGVyaW9kcywgd2lkdGgpIHx8IFtdOwp9Ci8qKgogKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgZGVmaW5lZCBpbiBhbiBhcnJheSwgZ29pbmcgYmFja3dhcmRzIGZyb20gYW4gaW5kZXggcG9zaXRpb24uCiAqCiAqIFRvIGF2b2lkIHJlcGVhdGluZyB0aGUgc2FtZSBkYXRhIChhcyB3aGVuIHRoZSAiZm9ybWF0IiBhbmQgInN0YW5kYWxvbmUiIGZvcm1zIGFyZSB0aGUgc2FtZSkKICogYWRkIHRoZSBmaXJzdCB2YWx1ZSB0byB0aGUgbG9jYWxlIGRhdGEgYXJyYXlzLCBhbmQgYWRkIG90aGVyIHZhbHVlcyBvbmx5IGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KICoKICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBkYXRhIFRoZSBkYXRhIGFycmF5IHRvIHJldHJpZXZlIGZyb20uCiAqIEBwYXJhbSB7P30gaW5kZXggQSAwLWJhc2VkIGluZGV4IGludG8gdGhlIGFycmF5IHRvIHN0YXJ0IGZyb20uCiAqIEByZXR1cm4gez99IFRoZSB2YWx1ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGdpdmVuIGluZGV4IHBvc2l0aW9uLgogKi8KZnVuY3Rpb24gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXRhLCBpbmRleCkgewogICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID4gLTE7IGktLSkgewogICAgICAgIGlmICh0eXBlb2YgZGF0YVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGFbaV07CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGUgZGF0YSBBUEk6IGxvY2FsZSBkYXRhIHVuZGVmaW5lZCcpOwp9Ci8qKgogKiBFeHRyYWN0cyB0aGUgaG91cnMgYW5kIG1pbnV0ZXMgZnJvbSBhIHN0cmluZyBsaWtlICIxNTo0NSIKICogQHBhcmFtIHs/fSB0aW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleHRyYWN0VGltZSh0aW1lKSB7CiAgICBjb25zdCBbaCwgbV0gPSB0aW1lLnNwbGl0KCc6Jyk7CiAgICByZXR1cm4geyBob3VyczogK2gsIG1pbnV0ZXM6ICttIH07Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgY3VycmVuY3kgc3ltYm9sIGZvciBhIGdpdmVuIGN1cnJlbmN5IGNvZGUuCiAqCiAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGRlZmF1bHQgYGVuLVVTYCBsb2NhbGUsIHRoZSBjb2RlIGBVU0RgIGNhbgogKiBiZSByZXByZXNlbnRlZCBieSB0aGUgbmFycm93IHN5bWJvbCBgJGAgb3IgdGhlIHdpZGUgc3ltYm9sIGBVUyRgLgogKgogKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGNvZGUgVGhlIGN1cnJlbmN5IGNvZGUuCiAqIEBwYXJhbSB7P30gZm9ybWF0IFRoZSBmb3JtYXQsIGB3aWRlYCBvciBgbmFycm93YC4KICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICoKICogQHJldHVybiB7P30gVGhlIHN5bWJvbCwgb3IgdGhlIGN1cnJlbmN5IGNvZGUgaWYgbm8gc3ltYm9sIGlzIGF2YWlsYWJsZS4KICovCmZ1bmN0aW9uIGdldEN1cnJlbmN5U3ltYm9sKGNvZGUsIGZvcm1hdCwgbG9jYWxlID0gJ2VuJykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3VycmVuY3kgPSBnZXRMb2NhbGVDdXJyZW5jaWVzKGxvY2FsZSlbY29kZV0gfHwgQ1VSUkVOQ0lFU19FTltjb2RlXSB8fCBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN5bWJvbE5hcnJvdyA9IGN1cnJlbmN5WzEgLyogU3ltYm9sTmFycm93ICovXTsKICAgIGlmIChmb3JtYXQgPT09ICduYXJyb3cnICYmIHR5cGVvZiBzeW1ib2xOYXJyb3cgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIHN5bWJvbE5hcnJvdzsKICAgIH0KICAgIHJldHVybiBjdXJyZW5jeVswIC8qIFN5bWJvbCAqL10gfHwgY29kZTsKfQovLyBNb3N0IGN1cnJlbmNpZXMgaGF2ZSBjZW50cywgdGhhdCdzIHdoeSB0aGUgZGVmYXVsdCBpcyAyCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVGQVVMVF9OQl9PRl9DVVJSRU5DWV9ESUdJVFMgPSAyOwovKioKICogUmVwb3J0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGZvciBhIGdpdmVuIGN1cnJlbmN5LgogKiBUaGUgdmFsdWUgZGVwZW5kcyB1cG9uIHRoZSBwcmVzZW5jZSBvZiBjZW50cyBpbiB0aGF0IHBhcnRpY3VsYXIgY3VycmVuY3kuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gY29kZSBUaGUgY3VycmVuY3kgY29kZS4KICogQHJldHVybiB7P30gVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgdHlwaWNhbGx5IDAgb3IgMi4KICovCmZ1bmN0aW9uIGdldE51bWJlck9mQ3VycmVuY3lEaWdpdHMoY29kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZ2l0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGN1cnJlbmN5ID0gQ1VSUkVOQ0lFU19FTltjb2RlXTsKICAgIGlmIChjdXJyZW5jeSkgewogICAgICAgIGRpZ2l0cyA9IGN1cnJlbmN5WzIgLyogTmJPZkRpZ2l0cyAqL107CiAgICB9CiAgICByZXR1cm4gdHlwZW9mIGRpZ2l0cyA9PT0gJ251bWJlcicgPyBkaWdpdHMgOiBERUZBVUxUX05CX09GX0NVUlJFTkNZX0RJR0lUUzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2Zvcm1hdF9kYXRlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgSVNPODYwMV9EQVRFX1JFR0VYID0gL14oXGR7NH0pLT8oXGRcZCktPyhcZFxkKSg/OlQoXGRcZCkoPzo6PyhcZFxkKSg/Ojo/KFxkXGQpKD86XC4oXGQrKSk/KT8pPyhafChbKy1dKShcZFxkKTo/KFxkXGQpKT8pPyQvOwovLyAgICAxICAgICAgICAyICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUgICAgICAgICAgNiAgICAgICAgICA3ICAgICAgICAgIDggIDkgICAgIDEwICAgICAgMTEKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOQU1FRF9GT1JNQVRTID0ge307Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXkd5TUx3V2RFYWJCaEhtc1N6Wk8nXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpHezEsNX18eXsxLDR9fE17MSw1fXxMezEsNX18d3sxLDJ9fFd7MX18ZHsxLDJ9fEV7MSw2fXxhezEsNX18YnsxLDV9fEJ7MSw1fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18U3sxLDN9fHp7MSw0fXxaezEsNX18T3sxLDR9KSkoW1xzXFNdKikvOwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgWm9uZVdpZHRoID0gewogICAgU2hvcnQ6IDAsCiAgICBTaG9ydEdNVDogMSwKICAgIExvbmc6IDIsCiAgICBFeHRlbmRlZDogMywKfTsKWm9uZVdpZHRoW1pvbmVXaWR0aC5TaG9ydF0gPSAnU2hvcnQnOwpab25lV2lkdGhbWm9uZVdpZHRoLlNob3J0R01UXSA9ICdTaG9ydEdNVCc7ClpvbmVXaWR0aFtab25lV2lkdGguTG9uZ10gPSAnTG9uZyc7ClpvbmVXaWR0aFtab25lV2lkdGguRXh0ZW5kZWRdID0gJ0V4dGVuZGVkJzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IERhdGVUeXBlID0gewogICAgRnVsbFllYXI6IDAsCiAgICBNb250aDogMSwKICAgIERhdGU6IDIsCiAgICBIb3VyczogMywKICAgIE1pbnV0ZXM6IDQsCiAgICBTZWNvbmRzOiA1LAogICAgRnJhY3Rpb25hbFNlY29uZHM6IDYsCiAgICBEYXk6IDcsCn07CkRhdGVUeXBlW0RhdGVUeXBlLkZ1bGxZZWFyXSA9ICdGdWxsWWVhcic7CkRhdGVUeXBlW0RhdGVUeXBlLk1vbnRoXSA9ICdNb250aCc7CkRhdGVUeXBlW0RhdGVUeXBlLkRhdGVdID0gJ0RhdGUnOwpEYXRlVHlwZVtEYXRlVHlwZS5Ib3Vyc10gPSAnSG91cnMnOwpEYXRlVHlwZVtEYXRlVHlwZS5NaW51dGVzXSA9ICdNaW51dGVzJzsKRGF0ZVR5cGVbRGF0ZVR5cGUuU2Vjb25kc10gPSAnU2Vjb25kcyc7CkRhdGVUeXBlW0RhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzXSA9ICdGcmFjdGlvbmFsU2Vjb25kcyc7CkRhdGVUeXBlW0RhdGVUeXBlLkRheV0gPSAnRGF5JzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IFRyYW5zbGF0aW9uVHlwZSA9IHsKICAgIERheVBlcmlvZHM6IDAsCiAgICBEYXlzOiAxLAogICAgTW9udGhzOiAyLAogICAgRXJhczogMywKfTsKVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzXSA9ICdEYXlQZXJpb2RzJzsKVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5EYXlzXSA9ICdEYXlzJzsKVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5Nb250aHNdID0gJ01vbnRocyc7ClRyYW5zbGF0aW9uVHlwZVtUcmFuc2xhdGlvblR5cGUuRXJhc10gPSAnRXJhcyc7Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEZvcm1hdHMgYSBkYXRlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuCiAqCiAqIEBzZWUgYERhdGVQaXBlYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHZhbHVlIFRoZSBkYXRlIHRvIGZvcm1hdCwgYXMgYSBEYXRlLCBvciBhIG51bWJlciAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaCkKICogb3IgYW4gW0lTTyBkYXRlLXRpbWUgc3RyaW5nXShodHRwczovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSkuCiAqIEBwYXJhbSB7P30gZm9ybWF0IFRoZSBkYXRlLXRpbWUgY29tcG9uZW50cyB0byBpbmNsdWRlLiBTZWUgYERhdGVQaXBlYCBmb3IgZGV0YWlscy4KICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez89fSB0aW1lem9uZSBUaGUgdGltZSB6b25lLiBBIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwKICogb3IgYSBzdGFuZGFyZCBVVEMvR01UIG9yIGNvbnRpbmVudGFsIFVTIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uCiAqIElmIG5vdCBzcGVjaWZpZWQsIHVzZXMgaG9zdCBzeXN0ZW0gc2V0dGluZ3MuCiAqCiAqIEByZXR1cm4gez99IFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCiAqCiAqLwpmdW5jdGlvbiBmb3JtYXREYXRlKHZhbHVlLCBmb3JtYXQsIGxvY2FsZSwgdGltZXpvbmUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkYXRlID0gdG9EYXRlKHZhbHVlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWVkRm9ybWF0ID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCBmb3JtYXQpOwogICAgZm9ybWF0ID0gbmFtZWRGb3JtYXQgfHwgZm9ybWF0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBhcnRzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWF0Y2g7CiAgICB3aGlsZSAoZm9ybWF0KSB7CiAgICAgICAgbWF0Y2ggPSBEQVRFX0ZPUk1BVFNfU1BMSVQuZXhlYyhmb3JtYXQpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBpZiAoIXBhcnQpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcm1hdCA9IHBhcnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwYXJ0cy5wdXNoKGZvcm1hdCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkYXRlVGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICBpZiAodGltZXpvbmUpIHsKICAgICAgICBkYXRlVGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpOwogICAgICAgIGRhdGUgPSBjb252ZXJ0VGltZXpvbmVUb0xvY2FsKGRhdGUsIHRpbWV6b25lLCB0cnVlKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0ZXh0ID0gJyc7CiAgICBwYXJ0cy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZhbHVlID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0ZUZvcm1hdHRlciA9IGdldERhdGVGb3JtYXR0ZXIodmFsdWUpOwogICAgICAgIHRleHQgKz0gZGF0ZUZvcm1hdHRlciA/CiAgICAgICAgICAgIGRhdGVGb3JtYXR0ZXIoZGF0ZSwgbG9jYWxlLCBkYXRlVGltZXpvbmVPZmZzZXQpIDoKICAgICAgICAgICAgdmFsdWUgPT09ICdcJ1wnJyA/ICdcJycgOiB2YWx1ZS5yZXBsYWNlKC8oXid8JyQpL2csICcnKS5yZXBsYWNlKC8nJy9nLCAnXCcnKTsKICAgIH0pKTsKICAgIHJldHVybiB0ZXh0Owp9Ci8qKgogKiBAcGFyYW0gez99IGxvY2FsZQogKiBAcGFyYW0gez99IGZvcm1hdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCBmb3JtYXQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvY2FsZUlkID0gZ2V0TG9jYWxlSWQkMShsb2NhbGUpOwogICAgTkFNRURfRk9STUFUU1tsb2NhbGVJZF0gPSBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXSB8fCB7fTsKICAgIGlmIChOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdKSB7CiAgICAgICAgcmV0dXJuIE5BTUVEX0ZPUk1BVFNbbG9jYWxlSWRdW2Zvcm1hdF07CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZm9ybWF0VmFsdWUgPSAnJzsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgY2FzZSAnc2hvcnREYXRlJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtZWRpdW1EYXRlJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTWVkaXVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbG9uZ0RhdGUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZURhdGVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZnVsbERhdGUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZURhdGVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnc2hvcnRUaW1lJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtZWRpdW1UaW1lJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTWVkaXVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbG9uZ1RpbWUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZnVsbFRpbWUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnc2hvcnQnOgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNob3J0VGltZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ3Nob3J0VGltZScpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNob3J0RGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ3Nob3J0RGF0ZScpOwogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGZvcm1hdERhdGVUaW1lKGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpLCBbc2hvcnRUaW1lLCBzaG9ydERhdGVdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbWVkaXVtJzoKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZWRpdW1UaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnbWVkaXVtVGltZScpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lZGl1bURhdGUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdtZWRpdW1EYXRlJyk7CiAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5NZWRpdW0pLCBbbWVkaXVtVGltZSwgbWVkaXVtRGF0ZV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdsb25nJzoKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsb25nVGltZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ2xvbmdUaW1lJyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG9uZ0RhdGUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdsb25nRGF0ZScpOwogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9CiAgICAgICAgICAgICAgICBmb3JtYXREYXRlVGltZShnZXRMb2NhbGVEYXRlVGltZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLkxvbmcpLCBbbG9uZ1RpbWUsIGxvbmdEYXRlXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2Z1bGwnOgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZ1bGxUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnZnVsbFRpbWUnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmdWxsRGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ2Z1bGxEYXRlJyk7CiAgICAgICAgICAgIGZvcm1hdFZhbHVlID0KICAgICAgICAgICAgICAgIGZvcm1hdERhdGVUaW1lKGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguRnVsbCksIFtmdWxsVGltZSwgZnVsbERhdGVdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoZm9ybWF0VmFsdWUpIHsKICAgICAgICBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdID0gZm9ybWF0VmFsdWU7CiAgICB9CiAgICByZXR1cm4gZm9ybWF0VmFsdWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gc3RyCiAqIEBwYXJhbSB7P30gb3B0X3ZhbHVlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWUoc3RyLCBvcHRfdmFsdWVzKSB7CiAgICBpZiAob3B0X3ZhbHVlcykgewogICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ceyhbXn1dKyl9L2csICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1hdGNoCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChtYXRjaCwga2V5KSB7CiAgICAgICAgICAgIHJldHVybiAob3B0X3ZhbHVlcyAhPSBudWxsICYmIGtleSBpbiBvcHRfdmFsdWVzKSA/IG9wdF92YWx1ZXNba2V5XSA6IG1hdGNoOwogICAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBzdHI7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbnVtCiAqIEBwYXJhbSB7P30gZGlnaXRzCiAqIEBwYXJhbSB7Pz19IG1pbnVzU2lnbgogKiBAcGFyYW0gez89fSB0cmltCiAqIEBwYXJhbSB7Pz19IG5lZ1dyYXAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhZE51bWJlcihudW0sIGRpZ2l0cywgbWludXNTaWduID0gJy0nLCB0cmltLCBuZWdXcmFwKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmVnID0gJyc7CiAgICBpZiAobnVtIDwgMCB8fCAobmVnV3JhcCAmJiBudW0gPD0gMCkpIHsKICAgICAgICBpZiAobmVnV3JhcCkgewogICAgICAgICAgICBudW0gPSAtbnVtICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG51bSA9IC1udW07CiAgICAgICAgICAgIG5lZyA9IG1pbnVzU2lnbjsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgc3RyTnVtID0gU3RyaW5nKG51bSk7CiAgICB3aGlsZSAoc3RyTnVtLmxlbmd0aCA8IGRpZ2l0cykgewogICAgICAgIHN0ck51bSA9ICcwJyArIHN0ck51bTsKICAgIH0KICAgIGlmICh0cmltKSB7CiAgICAgICAgc3RyTnVtID0gc3RyTnVtLnN1YnN0cihzdHJOdW0ubGVuZ3RoIC0gZGlnaXRzKTsKICAgIH0KICAgIHJldHVybiBuZWcgKyBzdHJOdW07Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWlsbGlzZWNvbmRzCiAqIEBwYXJhbSB7P30gZGlnaXRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmb3JtYXRGcmFjdGlvbmFsU2Vjb25kcyhtaWxsaXNlY29uZHMsIGRpZ2l0cykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3RyTXMgPSBwYWROdW1iZXIobWlsbGlzZWNvbmRzLCAzKTsKICAgIHJldHVybiBzdHJNcy5zdWJzdHIoMCwgZGlnaXRzKTsKfQovKioKICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgaW50byBpdHMgbG9jYWxlIGRpZ2l0IHJlcHJlc2VudGF0aW9uCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez99IHNpemUKICogQHBhcmFtIHs/PX0gb2Zmc2V0CiAqIEBwYXJhbSB7Pz19IHRyaW0KICogQHBhcmFtIHs/PX0gbmVnV3JhcAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGF0ZUdldHRlcihuYW1lLCBzaXplLCBvZmZzZXQgPSAwLCB0cmltID0gZmFsc2UsIG5lZ1dyYXAgPSBmYWxzZSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcnQgPSBnZXREYXRlUGFydChuYW1lLCBkYXRlKTsKICAgICAgICBpZiAob2Zmc2V0ID4gMCB8fCBwYXJ0ID4gLW9mZnNldCkgewogICAgICAgICAgICBwYXJ0ICs9IG9mZnNldDsKICAgICAgICB9CiAgICAgICAgaWYgKG5hbWUgPT09IERhdGVUeXBlLkhvdXJzKSB7CiAgICAgICAgICAgIGlmIChwYXJ0ID09PSAwICYmIG9mZnNldCA9PT0gLTEyKSB7CiAgICAgICAgICAgICAgICBwYXJ0ID0gMTI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEZyYWN0aW9uYWxTZWNvbmRzKHBhcnQsIHNpemUpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYWxlTWludXMgPSBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuTWludXNTaWduKTsKICAgICAgICByZXR1cm4gcGFkTnVtYmVyKHBhcnQsIHNpemUsIGxvY2FsZU1pbnVzLCB0cmltLCBuZWdXcmFwKTsKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez99IHBhcnQKICogQHBhcmFtIHs/fSBkYXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREYXRlUGFydChwYXJ0LCBkYXRlKSB7CiAgICBzd2l0Y2ggKHBhcnQpIHsKICAgICAgICBjYXNlIERhdGVUeXBlLkZ1bGxZZWFyOgogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICAgIGNhc2UgRGF0ZVR5cGUuTW9udGg6CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCk7CiAgICAgICAgY2FzZSBEYXRlVHlwZS5EYXRlOgogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCk7CiAgICAgICAgY2FzZSBEYXRlVHlwZS5Ib3VyczoKICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLk1pbnV0ZXM6CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLlNlY29uZHM6CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldFNlY29uZHMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzOgogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLkRheToKICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF5KCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIERhdGVUeXBlIHZhbHVlICIke3BhcnR9Ii5gKTsKICAgIH0KfQovKioKICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgaW50byBpdHMgbG9jYWxlIHN0cmluZyByZXByZXNlbnRhdGlvbgogKiBAcGFyYW0gez99IG5hbWUKICogQHBhcmFtIHs/fSB3aWR0aAogKiBAcGFyYW0gez89fSBmb3JtCiAqIEBwYXJhbSB7Pz19IGV4dGVuZGVkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkYXRlU3RyR2V0dGVyKG5hbWUsIHdpZHRoLCBmb3JtID0gRm9ybVN0eWxlLkZvcm1hdCwgZXh0ZW5kZWQgPSBmYWxzZSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHsKICAgICAgICByZXR1cm4gZ2V0RGF0ZVRyYW5zbGF0aW9uKGRhdGUsIGxvY2FsZSwgbmFtZSwgd2lkdGgsIGZvcm0sIGV4dGVuZGVkKTsKICAgIH0pOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBsb2NhbGUgdHJhbnNsYXRpb24gb2YgYSBkYXRlIGZvciBhIGdpdmVuIGZvcm0sIHR5cGUgYW5kIHdpZHRoCiAqIEBwYXJhbSB7P30gZGF0ZQogKiBAcGFyYW0gez99IGxvY2FsZQogKiBAcGFyYW0gez99IG5hbWUKICogQHBhcmFtIHs/fSB3aWR0aAogKiBAcGFyYW0gez99IGZvcm0KICogQHBhcmFtIHs/fSBleHRlbmRlZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RGF0ZVRyYW5zbGF0aW9uKGRhdGUsIGxvY2FsZSwgbmFtZSwgd2lkdGgsIGZvcm0sIGV4dGVuZGVkKSB7CiAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICBjYXNlIFRyYW5zbGF0aW9uVHlwZS5Nb250aHM6CiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVNb250aE5hbWVzKGxvY2FsZSwgZm9ybSwgd2lkdGgpW2RhdGUuZ2V0TW9udGgoKV07CiAgICAgICAgY2FzZSBUcmFuc2xhdGlvblR5cGUuRGF5czoKICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsZURheU5hbWVzKGxvY2FsZSwgZm9ybSwgd2lkdGgpW2RhdGUuZ2V0RGF5KCldOwogICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHM6CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudEhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCk7CiAgICAgICAgICAgIGlmIChleHRlbmRlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBnZXRMb2NhbGVFeHRyYURheVBlcmlvZFJ1bGVzKGxvY2FsZSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkYXlQZXJpb2RzID0gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybSwgd2lkdGgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydWxlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVsZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShydWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JuaW5nLCBhZnRlcm5vb24sIGV2ZW5pbmcsIG5pZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnM6IGhvdXJzRnJvbSwgbWludXRlczogbWludXRlc0Zyb20gfSA9IHJ1bGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnM6IGhvdXJzVG8sIG1pbnV0ZXM6IG1pbnV0ZXNUbyB9ID0gcnVsZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRIb3VycyA+PSBob3Vyc0Zyb20gJiYgY3VycmVudE1pbnV0ZXMgPj0gbWludXRlc0Zyb20gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50SG91cnMgPCBob3Vyc1RvIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRIb3VycyA9PT0gaG91cnNUbyAmJiBjdXJyZW50TWludXRlcyA8IG1pbnV0ZXNUbykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXlQZXJpb2RzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gbm9vbiBvciBtaWRuaWdodAogICAgICAgICAgICAgICAgICAgICAgICAvLyBub29uIG9yIG1pZG5pZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMgfSA9IHJ1bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3VycyA9PT0gY3VycmVudEhvdXJzICYmIG1pbnV0ZXMgPT09IGN1cnJlbnRNaW51dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXlQZXJpb2RzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIG5vIHJ1bGVzIGZvciB0aGUgZGF5IHBlcmlvZHMsIHdlIHVzZSBhbS9wbSBieSBkZWZhdWx0CiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybSwgKC8qKiBAdHlwZSB7P30gKi8gKHdpZHRoKSkpW2N1cnJlbnRIb3VycyA8IDEyID8gMCA6IDFdOwogICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkVyYXM6CiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVFcmFOYW1lcyhsb2NhbGUsICgvKiogQHR5cGUgez99ICovICh3aWR0aCkpKVtkYXRlLmdldEZ1bGxZZWFyKCkgPD0gMCA/IDAgOiAxXTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvLyBUaGlzIGRlZmF1bHQgY2FzZSBpcyBub3QgbmVlZGVkIGJ5IFR5cGVTY3JpcHQgY29tcGlsZXIsIGFzIHRoZSBzd2l0Y2ggaXMgZXhoYXVzdGl2ZS4KICAgICAgICAgICAgLy8gSG93ZXZlciBDbG9zdXJlIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCBhbmQgcmVwb3J0cyBhbiBlcnJvciBpbiB0eXBlZCBtb2RlLgogICAgICAgICAgICAvLyBUaGUgYHRocm93IG5ldyBFcnJvcmAgYmVsb3cgd29ya3MgYXJvdW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlIHVuZXhwZWN0ZWQ6IG5ldmVyIHZhcmlhYmxlCiAgICAgICAgICAgIC8vIG1ha2VzIHN1cmUgdHNjIHN0aWxsIGNoZWNrcyB0aGlzIGNvZGUgaXMgdW5yZWFjaGFibGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdW5leHBlY3RlZCA9IG5hbWU7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCB0cmFuc2xhdGlvbiB0eXBlICR7dW5leHBlY3RlZH1gKTsKICAgIH0KfQovKioKICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgYW5kIGFuIG9mZnNldCBpbnRvIGEgdGltZXpvbmUgd2l0aCBJU084NjAxIG9yCiAqIEdNVCBmb3JtYXQgZGVwZW5kaW5nIG9uIHRoZSB3aWR0aCAoZWc6IHNob3J0ID0gKzA0MzAsIHNob3J0OkdNVCA9IEdNVCs0LCBsb25nID0gR01UKzA0OjMwLAogKiBleHRlbmRlZCA9ICswNDozMCkKICogQHBhcmFtIHs/fSB3aWR0aAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGltZVpvbmVHZXR0ZXIod2lkdGgpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgKiBAcGFyYW0gez99IG9mZnNldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSwgb2Zmc2V0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHpvbmUgPSAtMSAqIG9mZnNldDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWludXNTaWduID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvdXJzID0gem9uZSA+IDAgPyBNYXRoLmZsb29yKHpvbmUgLyA2MCkgOiBNYXRoLmNlaWwoem9uZSAvIDYwKTsKICAgICAgICBzd2l0Y2ggKHdpZHRoKSB7CiAgICAgICAgICAgIGNhc2UgWm9uZVdpZHRoLlNob3J0OgogICAgICAgICAgICAgICAgcmV0dXJuICgoem9uZSA+PSAwKSA/ICcrJyA6ICcnKSArIHBhZE51bWJlcihob3VycywgMiwgbWludXNTaWduKSArCiAgICAgICAgICAgICAgICAgICAgcGFkTnVtYmVyKE1hdGguYWJzKHpvbmUgJSA2MCksIDIsIG1pbnVzU2lnbik7CiAgICAgICAgICAgIGNhc2UgWm9uZVdpZHRoLlNob3J0R01UOgogICAgICAgICAgICAgICAgcmV0dXJuICdHTVQnICsgKCh6b25lID49IDApID8gJysnIDogJycpICsgcGFkTnVtYmVyKGhvdXJzLCAxLCBtaW51c1NpZ24pOwogICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5Mb25nOgogICAgICAgICAgICAgICAgcmV0dXJuICdHTVQnICsgKCh6b25lID49IDApID8gJysnIDogJycpICsgcGFkTnVtYmVyKGhvdXJzLCAyLCBtaW51c1NpZ24pICsgJzonICsKICAgICAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMiwgbWludXNTaWduKTsKICAgICAgICAgICAgY2FzZSBab25lV2lkdGguRXh0ZW5kZWQ6CiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdaJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoKHpvbmUgPj0gMCkgPyAnKycgOiAnJykgKyBwYWROdW1iZXIoaG91cnMsIDIsIG1pbnVzU2lnbikgKyAnOicgKwogICAgICAgICAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMiwgbWludXNTaWduKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB6b25lIHdpZHRoICIke3dpZHRofSJgKTsKICAgICAgICB9CiAgICB9KTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IEpBTlVBUlkgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRIVVJTREFZID0gNDsKLyoqCiAqIEBwYXJhbSB7P30geWVhcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmaXJzdERheU9mWWVhciA9IChuZXcgRGF0ZSh5ZWFyLCBKQU5VQVJZLCAxKSkuZ2V0RGF5KCk7CiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgMSArICgoZmlyc3REYXlPZlllYXIgPD0gVEhVUlNEQVkpID8gVEhVUlNEQVkgOiBUSFVSU0RBWSArIDcpIC0gZmlyc3REYXlPZlllYXIpOwp9Ci8qKgogKiBAcGFyYW0gez99IGRhdGV0aW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGV0aW1lKSB7CiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZXRpbWUuZ2V0RnVsbFllYXIoKSwgZGF0ZXRpbWUuZ2V0TW9udGgoKSwgZGF0ZXRpbWUuZ2V0RGF0ZSgpICsgKFRIVVJTREFZIC0gZGF0ZXRpbWUuZ2V0RGF5KCkpKTsKfQovKioKICogQHBhcmFtIHs/fSBzaXplCiAqIEBwYXJhbSB7Pz19IG1vbnRoQmFzZWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdlZWtHZXR0ZXIoc2l6ZSwgbW9udGhCYXNlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIGlmIChtb250aEJhc2VkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmJEYXlzQmVmb3JlMXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKS5nZXREYXkoKSAtIDE7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBkYXRlLmdldERhdGUoKTsKICAgICAgICAgICAgcmVzdWx0ID0gMSArIE1hdGguZmxvb3IoKHRvZGF5ICsgbmJEYXlzQmVmb3JlMXN0RGF5T2ZNb250aCkgLyA3KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3RUaHVycyA9IGdldEZpcnN0VGh1cnNkYXlPZlllYXIoZGF0ZS5nZXRGdWxsWWVhcigpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aGlzVGh1cnMgPSBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzVGh1cnMuZ2V0VGltZSgpIC0gZmlyc3RUaHVycy5nZXRUaW1lKCk7CiAgICAgICAgICAgIHJlc3VsdCA9IDEgKyBNYXRoLnJvdW5kKGRpZmYgLyA2LjA0OGU4KTsgLy8gNi4wNDhlOCBtcyBwZXIgd2VlawogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFkTnVtYmVyKHJlc3VsdCwgc2l6ZSwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgfSk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBEQVRFX0ZPUk1BVFMgPSB7fTsKLy8gQmFzZWQgb24gQ0xEUiBmb3JtYXRzOgovLyBTZWUgY29tcGxldGUgbGlzdDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlCi8vIFNlZSBhbHNvIGV4cGxhbmF0aW9uczogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lCi8vIFRPRE8ob2NvbWJlKTogc3VwcG9ydCBhbGwgbWlzc2luZyBjbGRyIGZvcm1hdHM6IFksIFUsIFEsIEQsIEYsIGUsIGMsIGosIEosIEMsIEEsIHYsIFYsIFgsIHgKLyoqCiAqIEBwYXJhbSB7P30gZm9ybWF0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREYXRlRm9ybWF0dGVyKGZvcm1hdCkgewogICAgaWYgKERBVEVfRk9STUFUU1tmb3JtYXRdKSB7CiAgICAgICAgcmV0dXJuIERBVEVfRk9STUFUU1tmb3JtYXRdOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZvcm1hdHRlcjsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgLy8gRXJhIG5hbWUgKEFEL0JDKQogICAgICAgIGNhc2UgJ0cnOgogICAgICAgIGNhc2UgJ0dHJzoKICAgICAgICBjYXNlICdHR0cnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5FcmFzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnR0dHRyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkVyYXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0dHR0dHJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRXJhcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyAxIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB5ZWFyLCBlLmcuIChBRCAxID0+IDEsIEFEIDE5OSA9PiAxOTkpCiAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnVsbFllYXIsIDEsIDAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gMiBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciwgcGFkZGVkICgwMC05OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApCiAgICAgICAgY2FzZSAneXknOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAyLCAwLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gMyBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciwgcGFkZGVkICgwMDAtOTk5KS4gKGUuZy4gQUQgMjAwMSA9PiAwMSwgQUQgMjAxMCA9PiAxMCkKICAgICAgICBjYXNlICd5eXknOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAzLCAwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIDQgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHllYXIgKGUuZy4gQUQgMSA9PiAwMDAxLCBBRCAyMDEwID0+IDIwMTApCiAgICAgICAgY2FzZSAneXl5eSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnVsbFllYXIsIDQsIDAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKDEtMTIpLCBudW1lcmljCiAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTW9udGgsIDEsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdNTSc6CiAgICAgICAgY2FzZSAnTEwnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLk1vbnRoLCAyLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKEphbnVhcnksIC4uLiksIHN0cmluZywgZm9ybWF0CiAgICAgICAgY2FzZSAnTU1NJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuTW9udGhzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnTU1NTSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLk1vbnRocywgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnTU1NTU0nOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKEphbnVhcnksIC4uLiksIHN0cmluZywgc3RhbmRhbG9uZQogICAgICAgIGNhc2UgJ0xMTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQsIEZvcm1TdHlsZS5TdGFuZGFsb25lKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnTExMTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSwgRm9ybVN0eWxlLlN0YW5kYWxvbmUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdMTExMTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93LCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFdlZWsgb2YgdGhlIHllYXIgKDEsIC4uLiA1MikKICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gd2Vla0dldHRlcigxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnd3cnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSB3ZWVrR2V0dGVyKDIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBXZWVrIG9mIHRoZSBtb250aCAoMSwgLi4uKQogICAgICAgIGNhc2UgJ1cnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSB3ZWVrR2V0dGVyKDEsIHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBEYXkgb2YgdGhlIG1vbnRoICgxLTMxKQogICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkRhdGUsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkZCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRGF0ZSwgMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIERheSBvZiB0aGUgV2VlawogICAgICAgIGNhc2UgJ0UnOgogICAgICAgIGNhc2UgJ0VFJzoKICAgICAgICBjYXNlICdFRUUnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnRUVFRSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0VFRUVFJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5cywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdFRUVFRUUnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLlNob3J0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gR2VuZXJpYyBwZXJpb2Qgb2YgdGhlIGRheSAoYW0tcG0pCiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgY2FzZSAnYWEnOgogICAgICAgIGNhc2UgJ2FhYSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdhYWFhJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYWFhYWEnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIEV4dGVuZGVkIHBlcmlvZCBvZiB0aGUgZGF5IChtaWRuaWdodCwgYXQgbmlnaHQsIC4uLiksIHN0YW5kYWxvbmUKICAgICAgICBjYXNlICdiJzoKICAgICAgICBjYXNlICdiYic6CiAgICAgICAgY2FzZSAnYmJiJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZCwgRm9ybVN0eWxlLlN0YW5kYWxvbmUsIHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdiYmJiJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2JiYmJiJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3csIEZvcm1TdHlsZS5TdGFuZGFsb25lLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gRXh0ZW5kZWQgcGVyaW9kIG9mIHRoZSBkYXkgKG1pZG5pZ2h0LCBuaWdodCwgLi4uKSwgc3RhbmRhbG9uZQogICAgICAgIGNhc2UgJ0InOgogICAgICAgIGNhc2UgJ0JCJzoKICAgICAgICBjYXNlICdCQkInOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkLCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnQkJCQic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLldpZGUsIEZvcm1TdHlsZS5Gb3JtYXQsIHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdCQkJCQic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93LCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gSG91ciBpbiBBTS9QTSwgKDEtMTIpCiAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuSG91cnMsIDEsIC0xMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2hoJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Ib3VycywgMiwgLTEyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gSG91ciBvZiB0aGUgZGF5ICgwLTIzKQogICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gSG91ciBpbiBkYXksIHBhZGRlZCAoMDAtMjMpCiAgICAgICAgY2FzZSAnSEgnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTWludXRlIG9mIHRoZSBob3VyICgwLTU5KQogICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLk1pbnV0ZXMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtbSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTWludXRlcywgMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KQogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLlNlY29uZHMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzcyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuU2Vjb25kcywgMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIEZyYWN0aW9uYWwgc2Vjb25kCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTUyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMsIDIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTU1MnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzLCAzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gVGltZXpvbmUgSVNPODYwMSBzaG9ydCBmb3JtYXQgKC0wNDMwKQogICAgICAgIGNhc2UgJ1onOgogICAgICAgIGNhc2UgJ1paJzoKICAgICAgICBjYXNlICdaWlonOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSB0aW1lWm9uZUdldHRlcihab25lV2lkdGguU2hvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBUaW1lem9uZSBJU084NjAxIGV4dGVuZGVkIGZvcm1hdCAoLTA0OjMwKQogICAgICAgIGNhc2UgJ1paWlpaJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gdGltZVpvbmVHZXR0ZXIoWm9uZVdpZHRoLkV4dGVuZGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gVGltZXpvbmUgR01UIHNob3J0IGZvcm1hdCAoR01UKzQpCiAgICAgICAgY2FzZSAnTyc6CiAgICAgICAgY2FzZSAnT08nOgogICAgICAgIGNhc2UgJ09PTyc6CiAgICAgICAgLy8gU2hvdWxkIGJlIGxvY2F0aW9uLCBidXQgZmFsbGJhY2sgdG8gZm9ybWF0IE8gaW5zdGVhZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGRhdGEgeWV0CiAgICAgICAgY2FzZSAneic6CiAgICAgICAgY2FzZSAnenonOgogICAgICAgIGNhc2UgJ3p6eic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IHRpbWVab25lR2V0dGVyKFpvbmVXaWR0aC5TaG9ydEdNVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFRpbWV6b25lIEdNVCBsb25nIGZvcm1hdCAoR01UKzA0MzApCiAgICAgICAgY2FzZSAnT09PTyc6CiAgICAgICAgY2FzZSAnWlpaWic6CiAgICAgICAgLy8gU2hvdWxkIGJlIGxvY2F0aW9uLCBidXQgZmFsbGJhY2sgdG8gZm9ybWF0IE8gaW5zdGVhZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGRhdGEgeWV0CiAgICAgICAgY2FzZSAnenp6eic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IHRpbWVab25lR2V0dGVyKFpvbmVXaWR0aC5Mb25nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBEQVRFX0ZPUk1BVFNbZm9ybWF0XSA9IGZvcm1hdHRlcjsKICAgIHJldHVybiBmb3JtYXR0ZXI7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGltZXpvbmUKICogQHBhcmFtIHs/fSBmYWxsYmFjawogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZmFsbGJhY2spIHsKICAgIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seSwgRWRnZSAxMy0xNSsKICAgIC8vIElFL0VkZ2UgZG8gbm90ICJ1bmRlcnN0YW5kIiBjb2xvbiAoYDpgKSBpbiB0aW1lem9uZQogICAgdGltZXpvbmUgPSB0aW1lem9uZS5yZXBsYWNlKC86L2csICcnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0ID0gRGF0ZS5wYXJzZSgnSmFuIDAxLCAxOTcwIDAwOjAwOjAwICcgKyB0aW1lem9uZSkgLyA2MDAwMDsKICAgIHJldHVybiBpc05hTihyZXF1ZXN0ZWRUaW1lem9uZU9mZnNldCkgPyBmYWxsYmFjayA6IHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0Owp9Ci8qKgogKiBAcGFyYW0gez99IGRhdGUKICogQHBhcmFtIHs/fSBtaW51dGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGREYXRlTWludXRlcyhkYXRlLCBtaW51dGVzKSB7CiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOwogICAgZGF0ZS5zZXRNaW51dGVzKGRhdGUuZ2V0TWludXRlcygpICsgbWludXRlcyk7CiAgICByZXR1cm4gZGF0ZTsKfQovKioKICogQHBhcmFtIHs/fSBkYXRlCiAqIEBwYXJhbSB7P30gdGltZXpvbmUKICogQHBhcmFtIHs/fSByZXZlcnNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb252ZXJ0VGltZXpvbmVUb0xvY2FsKGRhdGUsIHRpbWV6b25lLCByZXZlcnNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXZlcnNlVmFsdWUgPSByZXZlcnNlID8gLTEgOiAxOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpOwogICAgcmV0dXJuIGFkZERhdGVNaW51dGVzKGRhdGUsIHJldmVyc2VWYWx1ZSAqICh0aW1lem9uZU9mZnNldCAtIGRhdGVUaW1lem9uZU9mZnNldCkpOwp9Ci8qKgogKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGRhdGUuCiAqCiAqIFN1cHBvcnRlZCBpbnB1dCBmb3JtYXRzOgogKiAtIGBEYXRlYAogKiAtIG51bWJlcjogdGltZXN0YW1wCiAqIC0gc3RyaW5nOiBudW1lcmljIChlLmcuICIxMjM0IiksIElTTyBhbmQgZGF0ZSBzdHJpbmdzIGluIGEgZm9ybWF0IHN1cHBvcnRlZCBieQogKiAgIFtEYXRlLnBhcnNlKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvcGFyc2UpLgogKiAgIE5vdGU6IElTTyBzdHJpbmdzIHdpdGhvdXQgdGltZSByZXR1cm4gYSBkYXRlIHdpdGhvdXQgdGltZW9mZnNldC4KICoKICogVGhyb3dzIGlmIHVuYWJsZSB0byBjb252ZXJ0IHRvIGEgZGF0ZS4KICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9EYXRlKHZhbHVlKSB7CiAgICBpZiAoaXNEYXRlKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpOwogICAgfQogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyc2VkTmIgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAvLyBhbnkgc3RyaW5nIHRoYXQgb25seSBjb250YWlucyBudW1iZXJzLCBsaWtlICIxMjM0IiBidXQgbm90IGxpa2UgIjEyMzRoZWxsbyIKICAgICAgICBpZiAoIWlzTmFOKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpIC0gcGFyc2VkTmIpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWROYik7CiAgICAgICAgfQogICAgICAgIGlmICgvXihcZHs0fS1cZHsxLDJ9LVxkezEsMn0pJC8udGVzdCh2YWx1ZSkpIHsKICAgICAgICAgICAgLyogRm9yIElTTyBTdHJpbmdzIHdpdGhvdXQgdGltZSB0aGUgZGF5LCBtb250aCBhbmQgeWVhciBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBJU08gU3RyaW5nCiAgICAgICAgICAgICAgICAgIGJlZm9yZSBEYXRlIGNyZWF0aW9uIHRvIGF2b2lkIHRpbWUgb2Zmc2V0IGFuZCBlcnJvcnMgaW4gdGhlIG5ldyBEYXRlLgogICAgICAgICAgICAgICAgICBJZiB3ZSBvbmx5IHJlcGxhY2UgJy0nIHdpdGggJywnIGluIHRoZSBJU08gU3RyaW5nICgiMjAxNSwwMSwwMSIpLCBhbmQgdHJ5IHRvIGNyZWF0ZSBhIG5ldwogICAgICAgICAgICAgICAgICBkYXRlLCBzb21lIGJyb3dzZXJzIChlLmcuIElFIDkpIHdpbGwgdGhyb3cgYW4gaW52YWxpZCBEYXRlIGVycm9yLgogICAgICAgICAgICAgICAgICBJZiB3ZSBsZWF2ZSB0aGUgJy0nICgiMjAxNS0wMS0wMSIpIGFuZCB0cnkgdG8gY3JlYXRlIGEgbmV3IERhdGUoIjIwMTUtMDEtMDEiKSB0aGUgdGltZW9mZnNldAogICAgICAgICAgICAgICAgICBpcyBhcHBsaWVkLgogICAgICAgICAgICAgICAgICBOb3RlOiBJU08gbW9udGhzIGFyZSAwIGZvciBKYW51YXJ5LCAxIGZvciBGZWJydWFyeSwgLi4uICovCiAgICAgICAgICAgIGNvbnN0IFt5LCBtLCBkXSA9IHZhbHVlLnNwbGl0KCctJykubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWwKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWwpID0+ICt2YWwpKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gLSAxLCBkKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaDsKICAgICAgICBpZiAobWF0Y2ggPSB2YWx1ZS5tYXRjaChJU084NjAxX0RBVEVfUkVHRVgpKSB7CiAgICAgICAgICAgIHJldHVybiBpc29TdHJpbmdUb0RhdGUobWF0Y2gpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICBpZiAoIWlzRGF0ZShkYXRlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgIiR7dmFsdWV9IiBpbnRvIGEgZGF0ZWApOwogICAgfQogICAgcmV0dXJuIGRhdGU7Cn0KLyoqCiAqIENvbnZlcnRzIGEgZGF0ZSBpbiBJU084NjAxIHRvIGEgRGF0ZS4KICogVXNlZCBpbnN0ZWFkIG9mIGBEYXRlLnBhcnNlYCBiZWNhdXNlIG9mIGJyb3dzZXIgZGlzY3JlcGFuY2llcy4KICogQHBhcmFtIHs/fSBtYXRjaAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNvU3RyaW5nVG9EYXRlKG1hdGNoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdHpIb3VyID0gMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0ek1pbiA9IDA7CiAgICAvLyBtYXRjaFs4XSBtZWFucyB0aGF0IHRoZSBzdHJpbmcgY29udGFpbnMgIloiIChVVEMpIG9yIGEgdGltZXpvbmUgbGlrZSAiKzAxOjAwIiBvciAiKzAxMDAiCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRlU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0Z1bGxZZWFyIDogZGF0ZS5zZXRGdWxsWWVhcjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRpbWVTZXR0ZXIgPSBtYXRjaFs4XSA/IGRhdGUuc2V0VVRDSG91cnMgOiBkYXRlLnNldEhvdXJzOwogICAgLy8gaWYgdGhlcmUgaXMgYSB0aW1lem9uZSBkZWZpbmVkIGxpa2UgIiswMTowMCIgb3IgIiswMTAwIgogICAgaWYgKG1hdGNoWzldKSB7CiAgICAgICAgdHpIb3VyID0gTnVtYmVyKG1hdGNoWzldICsgbWF0Y2hbMTBdKTsKICAgICAgICB0ek1pbiA9IE51bWJlcihtYXRjaFs5XSArIG1hdGNoWzExXSk7CiAgICB9CiAgICBkYXRlU2V0dGVyLmNhbGwoZGF0ZSwgTnVtYmVyKG1hdGNoWzFdKSwgTnVtYmVyKG1hdGNoWzJdKSAtIDEsIE51bWJlcihtYXRjaFszXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaCA9IE51bWJlcihtYXRjaFs0XSB8fCAwKSAtIHR6SG91cjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG0gPSBOdW1iZXIobWF0Y2hbNV0gfHwgMCkgLSB0ek1pbjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHMgPSBOdW1iZXIobWF0Y2hbNl0gfHwgMCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtcyA9IE1hdGgucm91bmQocGFyc2VGbG9hdCgnMC4nICsgKG1hdGNoWzddIHx8IDApKSAqIDEwMDApOwogICAgdGltZVNldHRlci5jYWxsKGRhdGUsIGgsIG0sIHMsIG1zKTsKICAgIHJldHVybiBkYXRlOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvaTE4bi9mb3JtYXRfbnVtYmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTlVNQkVSX0ZPUk1BVF9SRUdFWFAgPSAvXihcZCspP1wuKChcZCspKC0oXGQrKSk/KT8kLzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBNQVhfRElHSVRTID0gMjI7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVDSU1BTF9TRVAgPSAnLic7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgWkVST19DSEFSID0gJzAnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBBVFRFUk5fU0VQID0gJzsnOwovKiogQHR5cGUgez99ICovCmNvbnN0IEdST1VQX1NFUCA9ICcsJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBESUdJVF9DSEFSID0gJyMnOwovKiogQHR5cGUgez99ICovCmNvbnN0IENVUlJFTkNZX0NIQVIgPSAnwqQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBFUkNFTlRfQ0hBUiA9ICclJzsKLyoqCiAqIFRyYW5zZm9ybXMgYSBudW1iZXIgdG8gYSBsb2NhbGUgc3RyaW5nIGJhc2VkIG9uIGEgc3R5bGUgYW5kIGEgZm9ybWF0LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7P30gcGF0dGVybgogKiBAcGFyYW0gez99IGxvY2FsZQogKiBAcGFyYW0gez99IGdyb3VwU3ltYm9sCiAqIEBwYXJhbSB7P30gZGVjaW1hbFN5bWJvbAogKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvCiAqIEBwYXJhbSB7Pz19IGlzUGVyY2VudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgZ3JvdXBTeW1ib2wsIGRlY2ltYWxTeW1ib2wsIGRpZ2l0c0luZm8sIGlzUGVyY2VudCA9IGZhbHNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZm9ybWF0dGVkVGV4dCA9ICcnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzWmVybyA9IGZhbHNlOwogICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHsKICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLkluZmluaXR5KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyc2VkTnVtYmVyID0gcGFyc2VOdW1iZXIodmFsdWUpOwogICAgICAgIGlmIChpc1BlcmNlbnQpIHsKICAgICAgICAgICAgcGFyc2VkTnVtYmVyID0gdG9QZXJjZW50KHBhcnNlZE51bWJlcik7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWluSW50ID0gcGF0dGVybi5taW5JbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtaW5GcmFjdGlvbiA9IHBhdHRlcm4ubWluRnJhYzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1heEZyYWN0aW9uID0gcGF0dGVybi5tYXhGcmFjOwogICAgICAgIGlmIChkaWdpdHNJbmZvKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFydHMgPSBkaWdpdHNJbmZvLm1hdGNoKE5VTUJFUl9GT1JNQVRfUkVHRVhQKTsKICAgICAgICAgICAgaWYgKHBhcnRzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZGlnaXRzSW5mb30gaXMgbm90IGEgdmFsaWQgZGlnaXQgaW5mb2ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWluSW50UGFydCA9IHBhcnRzWzFdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1pbkZyYWN0aW9uUGFydCA9IHBhcnRzWzNdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heEZyYWN0aW9uUGFydCA9IHBhcnRzWzVdOwogICAgICAgICAgICBpZiAobWluSW50UGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtaW5JbnQgPSBwYXJzZUludEF1dG9SYWRpeChtaW5JbnRQYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWluRnJhY3Rpb25QYXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIG1pbkZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgobWluRnJhY3Rpb25QYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWF4RnJhY3Rpb25QYXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgobWF4RnJhY3Rpb25QYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChtaW5GcmFjdGlvblBhcnQgIT0gbnVsbCAmJiBtaW5GcmFjdGlvbiA+IG1heEZyYWN0aW9uKSB7CiAgICAgICAgICAgICAgICBtYXhGcmFjdGlvbiA9IG1pbkZyYWN0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgbWluRnJhY3Rpb24sIG1heEZyYWN0aW9uKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZ2l0cyA9IHBhcnNlZE51bWJlci5kaWdpdHM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbnRlZ2VyTGVuID0gcGFyc2VkTnVtYmVyLmludGVnZXJMZW47CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4cG9uZW50ID0gcGFyc2VkTnVtYmVyLmV4cG9uZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGVjaW1hbHMgPSBbXTsKICAgICAgICBpc1plcm8gPSBkaWdpdHMuZXZlcnkoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZCA9PiAhZCkpOwogICAgICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVycwogICAgICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgbWluSW50OyBpbnRlZ2VyTGVuKyspIHsKICAgICAgICAgICAgZGlnaXRzLnVuc2hpZnQoMCk7CiAgICAgICAgfQogICAgICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVycwogICAgICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgMDsgaW50ZWdlckxlbisrKSB7CiAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApOwogICAgICAgIH0KICAgICAgICAvLyBleHRyYWN0IGRlY2ltYWxzIGRpZ2l0cwogICAgICAgIGlmIChpbnRlZ2VyTGVuID4gMCkgewogICAgICAgICAgICBkZWNpbWFscyA9IGRpZ2l0cy5zcGxpY2UoaW50ZWdlckxlbiwgZGlnaXRzLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWNpbWFscyA9IGRpZ2l0czsKICAgICAgICAgICAgZGlnaXRzID0gWzBdOwogICAgICAgIH0KICAgICAgICAvLyBmb3JtYXQgdGhlIGludGVnZXIgZGlnaXRzIHdpdGggZ3JvdXBpbmcgc2VwYXJhdG9ycwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBncm91cHMgPSBbXTsKICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA+PSBwYXR0ZXJuLmxnU2l6ZSkgewogICAgICAgICAgICBncm91cHMudW5zaGlmdChkaWdpdHMuc3BsaWNlKC1wYXR0ZXJuLmxnU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA+IHBhdHRlcm4uZ1NpemUpIHsKICAgICAgICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5nU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpOwogICAgICAgIH0KICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCkgewogICAgICAgICAgICBncm91cHMudW5zaGlmdChkaWdpdHMuam9pbignJykpOwogICAgICAgIH0KICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ3JvdXBzLmpvaW4oZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgZ3JvdXBTeW1ib2wpKTsKICAgICAgICAvLyBhcHBlbmQgdGhlIGRlY2ltYWwgZGlnaXRzCiAgICAgICAgaWYgKGRlY2ltYWxzLmxlbmd0aCkgewogICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIGRlY2ltYWxTeW1ib2wpICsgZGVjaW1hbHMuam9pbignJyk7CiAgICAgICAgfQogICAgICAgIGlmIChleHBvbmVudCkgewogICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5FeHBvbmVudGlhbCkgKyAnKycgKyBleHBvbmVudDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgPCAwICYmICFpc1plcm8pIHsKICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gcGF0dGVybi5uZWdQcmUgKyBmb3JtYXR0ZWRUZXh0ICsgcGF0dGVybi5uZWdTdWY7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gcGF0dGVybi5wb3NQcmUgKyBmb3JtYXR0ZWRUZXh0ICsgcGF0dGVybi5wb3NTdWY7CiAgICB9CiAgICByZXR1cm4gZm9ybWF0dGVkVGV4dDsKfQovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGN1cnJlbmN5IHVzaW5nIGxvY2FsZSBydWxlcy4KICoKICogQHNlZSBgZm9ybWF0TnVtYmVyKClgIC8gYERlY2ltYWxQaXBlYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHZhbHVlIFRoZSBudW1iZXIgdG8gZm9ybWF0LgogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gY3VycmVuY3kgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVuY3kgc3ltYm9sIG9yIGl0cyBuYW1lLAogKiBzdWNoIGFzICIkIiBvciAiQ2FuYWRpYW4gRG9sbGFyIi4gVXNlZCBpbiBvdXRwdXQgc3RyaW5nLCBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBvcGVyYXRpb24KICogb2YgdGhlIGZ1bmN0aW9uLgogKiBAcGFyYW0gez89fSBjdXJyZW5jeUNvZGUgVGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpCiAqIGN1cnJlbmN5IGNvZGUsIHN1Y2ggYXMgYFVTRGAgZm9yIHRoZSBVUyBkb2xsYXIgYW5kIGBFVVJgIGZvciB0aGUgZXVyby4KICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGRlY2ltYWwgcGFydC4KICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbwogKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIGN1cnJlbmN5IHZhbHVlLgogKgogKi8KZnVuY3Rpb24gZm9ybWF0Q3VycmVuY3kodmFsdWUsIGxvY2FsZSwgY3VycmVuY3ksIGN1cnJlbmN5Q29kZSwgZGlnaXRzSW5mbykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgcGF0dGVybi5taW5GcmFjID0gZ2V0TnVtYmVyT2ZDdXJyZW5jeURpZ2l0cygoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVuY3lDb2RlKSkpOwogICAgcGF0dGVybi5tYXhGcmFjID0gcGF0dGVybi5taW5GcmFjOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzID0gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkN1cnJlbmN5R3JvdXAsIE51bWJlclN5bWJvbC5DdXJyZW5jeURlY2ltYWwsIGRpZ2l0c0luZm8pOwogICAgcmV0dXJuIHJlcwogICAgICAgIC5yZXBsYWNlKENVUlJFTkNZX0NIQVIsIGN1cnJlbmN5KQogICAgICAgIC8vIGlmIHdlIGhhdmUgMiB0aW1lIHRoZSBjdXJyZW5jeSBjaGFyYWN0ZXIsIHRoZSBzZWNvbmQgb25lIGlzIGlnbm9yZWQKICAgICAgICAucmVwbGFjZShDVVJSRU5DWV9DSEFSLCAnJykKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNpbmcgYmV0d2VlbiBjdXJyZW5jeSBjaGFyYWN0ZXIgYW5kIHRoZSB2YWx1ZSBhbmQKICAgICAgICAvLyB0aGUgY3VycmVuY3kgY2hhcmFjdGVyIGlzIHN1cHJlc3NlZCBieSBwYXNzaW5nIGFuIGVtcHR5IHN0cmluZywgdGhlCiAgICAgICAgLy8gc3BhY2luZyBjaGFyYWN0ZXIgd291bGQgcmVtYWluIGFzIHBhcnQgb2YgdGhlIHN0cmluZy4gVGhlbiB3ZQogICAgICAgIC8vIHNob3VsZCByZW1vdmUgaXQuCiAgICAgICAgLnRyaW0oKTsKfQovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGEgcGVyY2VudGFnZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLgogKgogKiBAc2VlIGBmb3JtYXROdW1iZXIoKWAgLyBgRGVjaW1hbFBpcGVgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqIFxAcHVibGljQXBpCiAqCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBmb3JtYXQuCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbwogKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIHBlcmNlbnRhZ2UgdmFsdWUuCiAqCiAqLwpmdW5jdGlvbiBmb3JtYXRQZXJjZW50KHZhbHVlLCBsb2NhbGUsIGRpZ2l0c0luZm8pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdChsb2NhbGUsIE51bWJlckZvcm1hdFN0eWxlLlBlcmNlbnQpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzID0gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkdyb3VwLCBOdW1iZXJTeW1ib2wuRGVjaW1hbCwgZGlnaXRzSW5mbywgdHJ1ZSk7CiAgICByZXR1cm4gcmVzLnJlcGxhY2UobmV3IFJlZ0V4cChQRVJDRU5UX0NIQVIsICdnJyksIGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5QZXJjZW50U2lnbikpOwp9Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgdGV4dCwgd2l0aCBncm91cCBzaXppbmcsIHNlcGFyYXRvciwgYW5kIG90aGVyCiAqIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGxvY2FsZS4KICoKICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbnVtYmVyIHRvIGZvcm1hdC4KICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvCiAqIEByZXR1cm4gez99IFRoZSBmb3JtYXR0ZWQgdGV4dCBzdHJpbmcuCiAqLwpmdW5jdGlvbiBmb3JtYXROdW1iZXIodmFsdWUsIGxvY2FsZSwgZGlnaXRzSW5mbykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuRGVjaW1hbCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXR0ZXJuID0gcGFyc2VOdW1iZXJGb3JtYXQoZm9ybWF0LCBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuTWludXNTaWduKSk7CiAgICByZXR1cm4gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkdyb3VwLCBOdW1iZXJTeW1ib2wuRGVjaW1hbCwgZGlnaXRzSW5mbyk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZm9ybWF0CiAqIEBwYXJhbSB7Pz19IG1pbnVzU2lnbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VOdW1iZXJGb3JtYXQoZm9ybWF0LCBtaW51c1NpZ24gPSAnLScpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHAgPSB7CiAgICAgICAgbWluSW50OiAxLAogICAgICAgIG1pbkZyYWM6IDAsCiAgICAgICAgbWF4RnJhYzogMCwKICAgICAgICBwb3NQcmU6ICcnLAogICAgICAgIHBvc1N1ZjogJycsCiAgICAgICAgbmVnUHJlOiAnJywKICAgICAgICBuZWdTdWY6ICcnLAogICAgICAgIGdTaXplOiAwLAogICAgICAgIGxnU2l6ZTogMAogICAgfTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IGZvcm1hdC5zcGxpdChQQVRURVJOX1NFUCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwb3NpdGl2ZSA9IHBhdHRlcm5QYXJ0c1swXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5lZ2F0aXZlID0gcGF0dGVyblBhcnRzWzFdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcG9zaXRpdmVQYXJ0cyA9IHBvc2l0aXZlLmluZGV4T2YoREVDSU1BTF9TRVApICE9PSAtMSA/CiAgICAgICAgcG9zaXRpdmUuc3BsaXQoREVDSU1BTF9TRVApIDoKICAgICAgICBbCiAgICAgICAgICAgIHBvc2l0aXZlLnN1YnN0cmluZygwLCBwb3NpdGl2ZS5sYXN0SW5kZXhPZihaRVJPX0NIQVIpICsgMSksCiAgICAgICAgICAgIHBvc2l0aXZlLnN1YnN0cmluZyhwb3NpdGl2ZS5sYXN0SW5kZXhPZihaRVJPX0NIQVIpICsgMSkKICAgICAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZWdlciA9IHBvc2l0aXZlUGFydHNbMF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmcmFjdGlvbiA9IHBvc2l0aXZlUGFydHNbMV0gfHwgJyc7CiAgICBwLnBvc1ByZSA9IGludGVnZXIuc3Vic3RyKDAsIGludGVnZXIuaW5kZXhPZihESUdJVF9DSEFSKSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyYWN0aW9uLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNoID0gZnJhY3Rpb24uY2hhckF0KGkpOwogICAgICAgIGlmIChjaCA9PT0gWkVST19DSEFSKSB7CiAgICAgICAgICAgIHAubWluRnJhYyA9IHAubWF4RnJhYyA9IGkgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaCA9PT0gRElHSVRfQ0hBUikgewogICAgICAgICAgICBwLm1heEZyYWMgPSBpICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHAucG9zU3VmICs9IGNoOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdyb3VwcyA9IGludGVnZXIuc3BsaXQoR1JPVVBfU0VQKTsKICAgIHAuZ1NpemUgPSBncm91cHNbMV0gPyBncm91cHNbMV0ubGVuZ3RoIDogMDsKICAgIHAubGdTaXplID0gKGdyb3Vwc1syXSB8fCBncm91cHNbMV0pID8gKGdyb3Vwc1syXSB8fCBncm91cHNbMV0pLmxlbmd0aCA6IDA7CiAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdHJ1bmtMZW4gPSBwb3NpdGl2ZS5sZW5ndGggLSBwLnBvc1ByZS5sZW5ndGggLSBwLnBvc1N1Zi5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBvcyA9IG5lZ2F0aXZlLmluZGV4T2YoRElHSVRfQ0hBUik7CiAgICAgICAgcC5uZWdQcmUgPSBuZWdhdGl2ZS5zdWJzdHIoMCwgcG9zKS5yZXBsYWNlKC8nL2csICcnKTsKICAgICAgICBwLm5lZ1N1ZiA9IG5lZ2F0aXZlLnN1YnN0cihwb3MgKyB0cnVua0xlbikucmVwbGFjZSgvJy9nLCAnJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwLm5lZ1ByZSA9IG1pbnVzU2lnbiArIHAucG9zUHJlOwogICAgICAgIHAubmVnU3VmID0gcC5wb3NTdWY7CiAgICB9CiAgICByZXR1cm4gcDsKfQovLyBUcmFuc2Zvcm1zIGEgcGFyc2VkIG51bWJlciBpbnRvIGEgcGVyY2VudGFnZSBieSBtdWx0aXBseWluZyBpdCBieSAxMDAKLyoqCiAqIEBwYXJhbSB7P30gcGFyc2VkTnVtYmVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b1BlcmNlbnQocGFyc2VkTnVtYmVyKSB7CiAgICAvLyBpZiB0aGUgbnVtYmVyIGlzIDAsIGRvbid0IGRvIGFueXRoaW5nCiAgICBpZiAocGFyc2VkTnVtYmVyLmRpZ2l0c1swXSA9PT0gMCkgewogICAgICAgIHJldHVybiBwYXJzZWROdW1iZXI7CiAgICB9CiAgICAvLyBHZXR0aW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBkZWNpbWFscwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZnJhY3Rpb25MZW4gPSBwYXJzZWROdW1iZXIuZGlnaXRzLmxlbmd0aCAtIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuOwogICAgaWYgKHBhcnNlZE51bWJlci5leHBvbmVudCkgewogICAgICAgIHBhcnNlZE51bWJlci5leHBvbmVudCArPSAyOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGZyYWN0aW9uTGVuID09PSAwKSB7CiAgICAgICAgICAgIHBhcnNlZE51bWJlci5kaWdpdHMucHVzaCgwLCAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZnJhY3Rpb25MZW4gPT09IDEpIHsKICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmRpZ2l0cy5wdXNoKDApOwogICAgICAgIH0KICAgICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbiArPSAyOwogICAgfQogICAgcmV0dXJuIHBhcnNlZE51bWJlcjsKfQovKioKICogUGFyc2VzIGEgbnVtYmVyLgogKiBTaWduaWZpY2FudCBiaXRzIG9mIHRoaXMgcGFyc2UgYWxnb3JpdGhtIGNhbWUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTWlrZU1jbC9iaWcuanMvCiAqIEBwYXJhbSB7P30gbnVtCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwYXJzZU51bWJlcihudW0pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBudW1TdHIgPSBNYXRoLmFicyhudW0pICsgJyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZXhwb25lbnQgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZ2l0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbnRlZ2VyTGVuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgajsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB6ZXJvczsKICAgIC8vIERlY2ltYWwgcG9pbnQ/CiAgICBpZiAoKGludGVnZXJMZW4gPSBudW1TdHIuaW5kZXhPZihERUNJTUFMX1NFUCkpID4gLTEpIHsKICAgICAgICBudW1TdHIgPSBudW1TdHIucmVwbGFjZShERUNJTUFMX1NFUCwgJycpOwogICAgfQogICAgLy8gRXhwb25lbnRpYWwgZm9ybT8KICAgIGlmICgoaSA9IG51bVN0ci5zZWFyY2goL2UvaSkpID4gMCkgewogICAgICAgIC8vIFdvcmsgb3V0IHRoZSBleHBvbmVudC4KICAgICAgICBpZiAoaW50ZWdlckxlbiA8IDApCiAgICAgICAgICAgIGludGVnZXJMZW4gPSBpOwogICAgICAgIGludGVnZXJMZW4gKz0gK251bVN0ci5zbGljZShpICsgMSk7CiAgICAgICAgbnVtU3RyID0gbnVtU3RyLnN1YnN0cmluZygwLCBpKTsKICAgIH0KICAgIGVsc2UgaWYgKGludGVnZXJMZW4gPCAwKSB7CiAgICAgICAgLy8gVGhlcmUgd2FzIG5vIGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQgc28gaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICBpbnRlZ2VyTGVuID0gbnVtU3RyLmxlbmd0aDsKICAgIH0KICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcy4KICAgIGZvciAoaSA9IDA7IG51bVN0ci5jaGFyQXQoaSkgPT09IFpFUk9fQ0hBUjsgaSsrKSB7IC8qIGVtcHR5ICovCiAgICB9CiAgICBpZiAoaSA9PT0gKHplcm9zID0gbnVtU3RyLmxlbmd0aCkpIHsKICAgICAgICAvLyBUaGUgZGlnaXRzIGFyZSBhbGwgemVyby4KICAgICAgICBkaWdpdHMgPSBbMF07CiAgICAgICAgaW50ZWdlckxlbiA9IDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zCiAgICAgICAgemVyb3MtLTsKICAgICAgICB3aGlsZSAobnVtU3RyLmNoYXJBdCh6ZXJvcykgPT09IFpFUk9fQ0hBUikKICAgICAgICAgICAgemVyb3MtLTsKICAgICAgICAvLyBUcmFpbGluZyB6ZXJvcyBhcmUgaW5zaWduaWZpY2FudCBzbyBpZ25vcmUgdGhlbQogICAgICAgIGludGVnZXJMZW4gLT0gaTsKICAgICAgICBkaWdpdHMgPSBbXTsKICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBhcnJheSBvZiBkaWdpdHMgd2l0aG91dCBsZWFkaW5nL3RyYWlsaW5nIHplcm9zLgogICAgICAgIGZvciAoaiA9IDA7IGkgPD0gemVyb3M7IGkrKywgaisrKSB7CiAgICAgICAgICAgIGRpZ2l0c1tqXSA9IE51bWJlcihudW1TdHIuY2hhckF0KGkpKTsKICAgICAgICB9CiAgICB9CiAgICAvLyBJZiB0aGUgbnVtYmVyIG92ZXJmbG93cyB0aGUgbWF4aW11bSBhbGxvd2VkIGRpZ2l0cyB0aGVuIHVzZSBhbiBleHBvbmVudC4KICAgIGlmIChpbnRlZ2VyTGVuID4gTUFYX0RJR0lUUykgewogICAgICAgIGRpZ2l0cyA9IGRpZ2l0cy5zcGxpY2UoMCwgTUFYX0RJR0lUUyAtIDEpOwogICAgICAgIGV4cG9uZW50ID0gaW50ZWdlckxlbiAtIDE7CiAgICAgICAgaW50ZWdlckxlbiA9IDE7CiAgICB9CiAgICByZXR1cm4geyBkaWdpdHMsIGV4cG9uZW50LCBpbnRlZ2VyTGVuIH07Cn0KLyoqCiAqIFJvdW5kIHRoZSBwYXJzZWQgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzCiAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcGFyc2VkTnVtYmVyIGluLXBsYWNlCiAqIEBwYXJhbSB7P30gcGFyc2VkTnVtYmVyCiAqIEBwYXJhbSB7P30gbWluRnJhYwogKiBAcGFyYW0gez99IG1heEZyYWMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgbWluRnJhYywgbWF4RnJhYykgewogICAgaWYgKG1pbkZyYWMgPiBtYXhGcmFjKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uICgke21pbkZyYWN9KSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSAoJHttYXhGcmFjfSkuYCk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmRpZ2l0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBmcmFjdGlvbkxlbiA9IGRpZ2l0cy5sZW5ndGggLSBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZyYWN0aW9uU2l6ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbkZyYWMsIGZyYWN0aW9uTGVuKSwgbWF4RnJhYyk7CiAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0IHRvIHdoZXJlIHJvdW5kaW5nIGlzIHRvIG9jY3VyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcm91bmRBdCA9IGZyYWN0aW9uU2l6ZSArIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZ2l0ID0gZGlnaXRzW3JvdW5kQXRdOwogICAgaWYgKHJvdW5kQXQgPiAwKSB7CiAgICAgICAgLy8gRHJvcCBmcmFjdGlvbmFsIGRpZ2l0cyBiZXlvbmQgYHJvdW5kQXRgCiAgICAgICAgZGlnaXRzLnNwbGljZShNYXRoLm1heChwYXJzZWROdW1iZXIuaW50ZWdlckxlbiwgcm91bmRBdCkpOwogICAgICAgIC8vIFNldCBub24tZnJhY3Rpb25hbCBkaWdpdHMgYmV5b25kIGByb3VuZEF0YCB0byAwCiAgICAgICAgZm9yIChsZXQgaiA9IHJvdW5kQXQ7IGogPCBkaWdpdHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgZGlnaXRzW2pdID0gMDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXZSByb3VuZGVkIHRvIHplcm8gc28gcmVzZXQgdGhlIHBhcnNlZE51bWJlcgogICAgICAgIGZyYWN0aW9uTGVuID0gTWF0aC5tYXgoMCwgZnJhY3Rpb25MZW4pOwogICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuID0gMTsKICAgICAgICBkaWdpdHMubGVuZ3RoID0gTWF0aC5tYXgoMSwgcm91bmRBdCA9IGZyYWN0aW9uU2l6ZSArIDEpOwogICAgICAgIGRpZ2l0c1swXSA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3VuZEF0OyBpKyspCiAgICAgICAgICAgIGRpZ2l0c1tpXSA9IDA7CiAgICB9CiAgICBpZiAoZGlnaXQgPj0gNSkgewogICAgICAgIGlmIChyb3VuZEF0IC0gMSA8IDApIHsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPiByb3VuZEF0OyBrLS0pIHsKICAgICAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApOwogICAgICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBkaWdpdHMudW5zaGlmdCgxKTsKICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRpZ2l0c1tyb3VuZEF0IC0gMV0rKzsKICAgICAgICB9CiAgICB9CiAgICAvLyBQYWQgb3V0IHdpdGggemVyb3MgdG8gZ2V0IHRoZSByZXF1aXJlZCBmcmFjdGlvbiBsZW5ndGgKICAgIGZvciAoOyBmcmFjdGlvbkxlbiA8IE1hdGgubWF4KDAsIGZyYWN0aW9uU2l6ZSk7IGZyYWN0aW9uTGVuKyspCiAgICAgICAgZGlnaXRzLnB1c2goMCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZHJvcFRyYWlsaW5nWmVyb3MgPSBmcmFjdGlvblNpemUgIT09IDA7CiAgICAvLyBNaW5pbWFsIGxlbmd0aCA9IG5iIG9mIGRlY2ltYWxzIHJlcXVpcmVkICsgY3VycmVudCBuYiBvZiBpbnRlZ2VycwogICAgLy8gQW55IG51bWJlciBiZXNpZGVzIHRoYXQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmIGl0J3MgYSB0cmFpbGluZyAwCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtaW5MZW4gPSBtaW5GcmFjICsgcGFyc2VkTnVtYmVyLmludGVnZXJMZW47CiAgICAvLyBEbyBhbnkgY2FycnlpbmcsIGUuZy4gYSBkaWdpdCB3YXMgcm91bmRlZCB1cCB0byAxMAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2FycnkgPSBkaWdpdHMucmVkdWNlUmlnaHQoKC8qKgogICAgICogQHBhcmFtIHs/fSBjYXJyeQogICAgICogQHBhcmFtIHs/fSBkCiAgICAgKiBAcGFyYW0gez99IGkKICAgICAqIEBwYXJhbSB7P30gZGlnaXRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoY2FycnksIGQsIGksIGRpZ2l0cykgewogICAgICAgIGQgPSBkICsgY2Fycnk7CiAgICAgICAgZGlnaXRzW2ldID0gZCA8IDEwID8gZCA6IGQgLSAxMDsgLy8gZCAlIDEwCiAgICAgICAgaWYgKGRyb3BUcmFpbGluZ1plcm9zKSB7CiAgICAgICAgICAgIC8vIERvIG5vdCBrZWVwIG1lYW5pbmdsZXNzIGZyYWN0aW9uYWwgdHJhaWxpbmcgemVyb3MgKGUuZy4gMTUuNTIwMDAgLS0+IDE1LjUyKQogICAgICAgICAgICBpZiAoZGlnaXRzW2ldID09PSAwICYmIGkgPj0gbWluTGVuKSB7CiAgICAgICAgICAgICAgICBkaWdpdHMucG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkcm9wVHJhaWxpbmdaZXJvcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkID49IDEwID8gMSA6IDA7IC8vIE1hdGguZmxvb3IoZCAvIDEwKTsKICAgIH0pLCAwKTsKICAgIGlmIChjYXJyeSkgewogICAgICAgIGRpZ2l0cy51bnNoaWZ0KGNhcnJ5KTsKICAgICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbisrOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlSW50QXV0b1JhZGl4KHRleHQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KHRleHQpOwogICAgaWYgKGlzTmFOKHJlc3VsdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyAnICsgdGV4dCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2kxOG4vbG9jYWxpemF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIE5nTG9jYWxpemF0aW9uIHsKfQovKioKICogUmV0dXJucyB0aGUgcGx1cmFsIGNhdGVnb3J5IGZvciBhIGdpdmVuIHZhbHVlLgogKiAtICI9dmFsdWUiIHdoZW4gdGhlIGNhc2UgZXhpc3RzLAogKiAtIHRoZSBwbHVyYWwgY2F0ZWdvcnkgb3RoZXJ3aXNlCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBjYXNlcwogKiBAcGFyYW0gez99IG5nTG9jYWxpemF0aW9uCiAqIEBwYXJhbSB7Pz19IGxvY2FsZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UGx1cmFsQ2F0ZWdvcnkodmFsdWUsIGNhc2VzLCBuZ0xvY2FsaXphdGlvbiwgbG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQga2V5ID0gYD0ke3ZhbHVlfWA7CiAgICBpZiAoY2FzZXMuaW5kZXhPZihrZXkpID4gLTEpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAga2V5ID0gbmdMb2NhbGl6YXRpb24uZ2V0UGx1cmFsQ2F0ZWdvcnkodmFsdWUsIGxvY2FsZSk7CiAgICBpZiAoY2FzZXMuaW5kZXhPZihrZXkpID4gLTEpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgaWYgKGNhc2VzLmluZGV4T2YoJ290aGVyJykgPiAtMSkgewogICAgICAgIHJldHVybiAnb3RoZXInOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVyYWwgbWVzc2FnZSBmb3VuZCBmb3IgdmFsdWUgIiR7dmFsdWV9ImApOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ0xvY2FsZUxvY2FsaXphdGlvbiBleHRlbmRzIE5nTG9jYWxpemF0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqLwogICAgY29uc3RydWN0b3IobG9jYWxlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgbG9jYWxlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsdXJhbCA9IGdldExvY2FsZVBsdXJhbENhc2UkMShsb2NhbGUgfHwgdGhpcy5sb2NhbGUpKHZhbHVlKTsKICAgICAgICBzd2l0Y2ggKHBsdXJhbCkgewogICAgICAgICAgICBjYXNlIFBsdXJhbC5aZXJvOgogICAgICAgICAgICAgICAgcmV0dXJuICd6ZXJvJzsKICAgICAgICAgICAgY2FzZSBQbHVyYWwuT25lOgogICAgICAgICAgICAgICAgcmV0dXJuICdvbmUnOwogICAgICAgICAgICBjYXNlIFBsdXJhbC5Ud286CiAgICAgICAgICAgICAgICByZXR1cm4gJ3R3byc7CiAgICAgICAgICAgIGNhc2UgUGx1cmFsLkZldzoKICAgICAgICAgICAgICAgIHJldHVybiAnZmV3JzsKICAgICAgICAgICAgY2FzZSBQbHVyYWwuTWFueToKICAgICAgICAgICAgICAgIHJldHVybiAnbWFueSc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJ290aGVyJzsKICAgICAgICB9CiAgICB9Cn0KTmdMb2NhbGVMb2NhbGl6YXRpb24uybVmYWMgPSBmdW5jdGlvbiBOZ0xvY2FsZUxvY2FsaXphdGlvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0xvY2FsZUxvY2FsaXphdGlvbikoybXJtWluamVjdChMT0NBTEVfSUQkMSkpOyB9OwpOZ0xvY2FsZUxvY2FsaXphdGlvbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBOZ0xvY2FsZUxvY2FsaXphdGlvbiwgZmFjdG9yeTogTmdMb2NhbGVMb2NhbGl6YXRpb24uybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0xvY2FsZUxvY2FsaXphdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvY29va2llLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIEBwYXJhbSB7P30gY29va2llU3RyCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VDb29raWVWYWx1ZShjb29raWVTdHIsIG5hbWUpIHsKICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7CiAgICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBjb29raWVTdHIuc3BsaXQoJzsnKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlcUluZGV4ID0gY29va2llLmluZGV4T2YoJz0nKTsKICAgICAgICBjb25zdCBbY29va2llTmFtZSwgY29va2llVmFsdWVdID0gZXFJbmRleCA9PSAtMSA/IFtjb29raWUsICcnXSA6IFtjb29raWUuc2xpY2UoMCwgZXFJbmRleCksIGNvb2tpZS5zbGljZShlcUluZGV4ICsgMSldOwogICAgICAgIGlmIChjb29raWVOYW1lLnRyaW0oKSA9PT0gbmFtZSkgewogICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX2NsYXNzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQHVzYWdlTm90ZXMKICogYGBgCiAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT0iJ2ZpcnN0IHNlY29uZCciPi4uLjwvc29tZS1lbGVtZW50PgogKgogKiAgICAgPHNvbWUtZWxlbWVudCBbbmdDbGFzc109IlsnZmlyc3QnLCAnc2Vjb25kJ10iPi4uLjwvc29tZS1lbGVtZW50PgogKgogKiAgICAgPHNvbWUtZWxlbWVudCBbbmdDbGFzc109InsnZmlyc3QnOiB0cnVlLCAnc2Vjb25kJzogdHJ1ZSwgJ3RoaXJkJzogZmFsc2V9Ij4uLi48L3NvbWUtZWxlbWVudD4KICoKICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPSJzdHJpbmdFeHB8YXJyYXlFeHB8b2JqRXhwIj4uLi48L3NvbWUtZWxlbWVudD4KICoKICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPSJ7J2NsYXNzMSBjbGFzczIgY2xhc3MzJyA6IHRydWV9Ij4uLi48L3NvbWUtZWxlbWVudD4KICogYGBgCiAqCiAqIFxAZGVzY3JpcHRpb24KICoKICogQWRkcyBhbmQgcmVtb3ZlcyBDU1MgY2xhc3NlcyBvbiBhbiBIVE1MIGVsZW1lbnQuCiAqCiAqIFRoZSBDU1MgY2xhc3NlcyBhcmUgdXBkYXRlZCBhcyBmb2xsb3dzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbjoKICogLSBgc3RyaW5nYCAtIHRoZSBDU1MgY2xhc3NlcyBsaXN0ZWQgaW4gdGhlIHN0cmluZyAoc3BhY2UgZGVsaW1pdGVkKSBhcmUgYWRkZWQsCiAqIC0gYEFycmF5YCAtIHRoZSBDU1MgY2xhc3NlcyBkZWNsYXJlZCBhcyBBcnJheSBlbGVtZW50cyBhcmUgYWRkZWQsCiAqIC0gYE9iamVjdGAgLSBrZXlzIGFyZSBDU1MgY2xhc3NlcyB0aGF0IGdldCBhZGRlZCB3aGVuIHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSB2YWx1ZQogKiAgICAgICAgICAgICAgZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlLCBvdGhlcndpc2UgdGhleSBhcmUgcmVtb3ZlZC4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5nQ2xhc3MgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9pdGVyYWJsZURpZmZlcnMKICAgICAqIEBwYXJhbSB7P30gX2tleVZhbHVlRGlmZmVycwogICAgICogQHBhcmFtIHs/fSBfbmdFbAogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoX2l0ZXJhYmxlRGlmZmVycywgX2tleVZhbHVlRGlmZmVycywgX25nRWwsIF9yZW5kZXJlcikgewogICAgICAgIHRoaXMuX2l0ZXJhYmxlRGlmZmVycyA9IF9pdGVyYWJsZURpZmZlcnM7CiAgICAgICAgdGhpcy5fa2V5VmFsdWVEaWZmZXJzID0gX2tleVZhbHVlRGlmZmVyczsKICAgICAgICB0aGlzLl9uZ0VsID0gX25nRWw7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSBudWxsOwogICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDsKICAgICAgICB0aGlzLl9pbml0aWFsQ2xhc3NlcyA9IFtdOwogICAgICAgIHRoaXMuX3Jhd0NsYXNzID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGtsYXNzKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcmVtb3ZlQ2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3Nlcyk7CiAgICAgICAgdGhpcy5faW5pdGlhbENsYXNzZXMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUuc3BsaXQoL1xzKy8pIDogW107CiAgICAgICAgdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX2luaXRpYWxDbGFzc2VzKTsKICAgICAgICB0aGlzLl9hcHBseUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdDbGFzcyh2YWx1ZSkgewogICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpOwogICAgICAgIHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3Nlcyk7CiAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSBudWxsOwogICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDsKICAgICAgICB0aGlzLl9yYXdDbGFzcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5zcGxpdCgvXHMrLykgOiB2YWx1ZTsKICAgICAgICBpZiAodGhpcy5fcmF3Q2xhc3MpIHsKICAgICAgICAgICAgaWYgKGlzTGlzdExpa2VJdGVyYWJsZSQxKHRoaXMuX3Jhd0NsYXNzKSkgewogICAgICAgICAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSB0aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9yYXdDbGFzcykuY3JlYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlWYWx1ZURpZmZlciA9IHRoaXMuX2tleVZhbHVlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdEb0NoZWNrKCkgewogICAgICAgIGlmICh0aGlzLl9pdGVyYWJsZURpZmZlcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZXJhYmxlQ2hhbmdlcyA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVyLmRpZmYoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Jhd0NsYXNzKSkpOwogICAgICAgICAgICBpZiAoaXRlcmFibGVDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUl0ZXJhYmxlQ2hhbmdlcyhpdGVyYWJsZUNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuX2tleVZhbHVlRGlmZmVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5VmFsdWVDaGFuZ2VzID0gdGhpcy5fa2V5VmFsdWVEaWZmZXIuZGlmZigoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fcmF3Q2xhc3MpKSk7CiAgICAgICAgICAgIGlmIChrZXlWYWx1ZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzKGtleVZhbHVlQ2hhbmdlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSkpKTsKICAgICAgICBjaGFuZ2VzLmZvckVhY2hDaGFuZ2VkSXRlbSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWNvcmQpID0+IHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpKSk7CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB7CiAgICAgICAgICAgIGlmIChyZWNvcmQucHJldmlvdXNWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLmtleSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlJdGVyYWJsZUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWNvcmQpID0+IHsKICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQuaXRlbSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5pdGVtLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTmdDbGFzcyBjYW4gb25seSB0b2dnbGUgQ1NTIGNsYXNzZXMgZXhwcmVzc2VkIGFzIHN0cmluZ3MsIGdvdCAke3N0cmluZ2lmeShyZWNvcmQuaXRlbSl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQuaXRlbSwgZmFsc2UpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGxpZXMgYSBjb2xsZWN0aW9uIG9mIENTUyBjbGFzc2VzIHRvIHRoZSBET00gZWxlbWVudC4KICAgICAqCiAgICAgKiBGb3IgYXJndW1lbnQgb2YgdHlwZSBTZXQgYW5kIEFycmF5IENTUyBjbGFzcyBuYW1lcyBjb250YWluZWQgaW4gdGhvc2UgY29sbGVjdGlvbnMgYXJlIGFsd2F5cwogICAgICogYWRkZWQuCiAgICAgKiBGb3IgYXJndW1lbnQgb2YgdHlwZSBNYXAgQ1NTIGNsYXNzIG5hbWUgaW4gdGhlIG1hcCdzIGtleSBpcyB0b2dnbGVkIGJhc2VkIG9uIHRoZSB2YWx1ZSAoYWRkZWQKICAgICAqIGZvciB0cnV0aHkgYW5kIHJlbW92ZWQgZm9yIGZhbHN5KS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJhd0NsYXNzVmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlDbGFzc2VzKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgaWYgKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0NsYXNzVmFsKSB8fCByYXdDbGFzc1ZhbCBpbnN0YW5jZW9mIFNldCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyYXdDbGFzc1ZhbCkpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3MKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChrbGFzcykgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIHRydWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyYXdDbGFzc1ZhbCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtsYXNzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBrbGFzcyA9PiB0aGlzLl90b2dnbGVDbGFzcyhrbGFzcywgISFyYXdDbGFzc1ZhbFtrbGFzc10pKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgYSBjb2xsZWN0aW9uIG9mIENTUyBjbGFzc2VzIGZyb20gdGhlIERPTSBlbGVtZW50LiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGNsZWFudXAKICAgICAqIHB1cnBvc2VzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmF3Q2xhc3NWYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmVDbGFzc2VzKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgaWYgKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0NsYXNzVmFsKSB8fCByYXdDbGFzc1ZhbCBpbnN0YW5jZW9mIFNldCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyYXdDbGFzc1ZhbCkpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3MKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChrbGFzcykgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIGZhbHNlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmF3Q2xhc3NWYWwpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAga2xhc3MgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIGZhbHNlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICogQHBhcmFtIHs/fSBlbmFibGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdG9nZ2xlQ2xhc3Moa2xhc3MsIGVuYWJsZWQpIHsKICAgICAgICBrbGFzcyA9IGtsYXNzLnRyaW0oKTsKICAgICAgICBpZiAoa2xhc3MpIHsKICAgICAgICAgICAga2xhc3Muc3BsaXQoL1xzKy9nKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2xhc3MgPT4gewogICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsIGtsYXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCwga2xhc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQp9Ck5nQ2xhc3MuybVmYWMgPSBmdW5jdGlvbiBOZ0NsYXNzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ2xhc3MpKMm1ybVkaXJlY3RpdmVJbmplY3QoSXRlcmFibGVEaWZmZXJzKSwgybXJtWRpcmVjdGl2ZUluamVjdChLZXlWYWx1ZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMikpOyB9OwpOZ0NsYXNzLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nQ2xhc3MsIHNlbGVjdG9yczogW1siIiwgIm5nQ2xhc3MiLCAiIl1dLCBpbnB1dHM6IHsga2xhc3M6IFsiY2xhc3MiLCAia2xhc3MiXSwgbmdDbGFzczogIm5nQ2xhc3MiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0NsYXNzLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBJdGVyYWJsZURpZmZlcnMgfSwKICAgIHsgdHlwZTogS2V5VmFsdWVEaWZmZXJzIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogUmVuZGVyZXIyIH0KXTsKTmdDbGFzcy5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGtsYXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjbGFzcycsXSB9XSwKICAgIG5nQ2xhc3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ25nQ2xhc3MnLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19jb21wb25lbnRfb3V0bGV0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBJbnN0YW50aWF0ZXMgYSBzaW5nbGUge1xAbGluayBDb21wb25lbnR9IHR5cGUgYW5kIGluc2VydHMgaXRzIEhvc3QgVmlldyBpbnRvIGN1cnJlbnQgVmlldy4KICogYE5nQ29tcG9uZW50T3V0bGV0YCBwcm92aWRlcyBhIGRlY2xhcmF0aXZlIGFwcHJvYWNoIGZvciBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvbi4KICoKICogYE5nQ29tcG9uZW50T3V0bGV0YCByZXF1aXJlcyBhIGNvbXBvbmVudCB0eXBlLCBpZiBhIGZhbHN5IHZhbHVlIGlzIHNldCB0aGUgdmlldyB3aWxsIGNsZWFyIGFuZAogKiBhbnkgZXhpc3RpbmcgY29tcG9uZW50IHdpbGwgZ2V0IGRlc3Ryb3llZC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBGaW5lIHR1bmUgY29udHJvbAogKgogKiBZb3UgY2FuIGNvbnRyb2wgdGhlIGNvbXBvbmVudCBjcmVhdGlvbiBwcm9jZXNzIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgYXR0cmlidXRlczoKICoKICogKiBgbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcmA6IE9wdGlvbmFsIGN1c3RvbSB7XEBsaW5rIEluamVjdG9yfSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBwYXJlbnQgZm9yCiAqIHRoZSBDb21wb25lbnQuIERlZmF1bHRzIHRvIHRoZSBpbmplY3RvciBvZiB0aGUgY3VycmVudCB2aWV3IGNvbnRhaW5lci4KICoKICogKiBgbmdDb21wb25lbnRPdXRsZXRDb250ZW50YDogT3B0aW9uYWwgbGlzdCBvZiBwcm9qZWN0YWJsZSBub2RlcyB0byBpbnNlcnQgaW50byB0aGUgY29udGVudAogKiBzZWN0aW9uIG9mIHRoZSBjb21wb25lbnQsIGlmIGV4aXN0cy4KICoKICogKiBgbmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnlgOiBPcHRpb25hbCBtb2R1bGUgZmFjdG9yeSB0byBhbGxvdyBkeW5hbWljYWxseSBsb2FkaW5nIG90aGVyCiAqIG1vZHVsZSwgdGhlbiBsb2FkIGEgY29tcG9uZW50IGZyb20gdGhhdCBtb2R1bGUuCiAqCiAqICMjIyBTeW50YXgKICoKICogU2ltcGxlCiAqIGBgYAogKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb24iPjwvbmctY29udGFpbmVyPgogKiBgYGAKICoKICogQ3VzdG9taXplZCBpbmplY3Rvci9jb250ZW50CiAqIGBgYAogKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb247CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JFeHByZXNzaW9uOwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29udGVudE5vZGVzRXhwcmVzc2lvbjsiPgogKiA8L25nLWNvbnRhaW5lcj4KICogYGBgCiAqCiAqIEN1c3RvbWl6ZWQgbmdNb2R1bGVGYWN0b3J5CiAqIGBgYAogKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb247CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZUZhY3Rvcnk6IG1vZHVsZUZhY3Rvcnk7Ij4KICogPC9uZy1jb250YWluZXI+CiAqIGBgYAogKgogKiAjIyMgQSBzaW1wbGUgZXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0NvbXBvbmVudE91dGxldC90cy9tb2R1bGUudHMgcmVnaW9uPSdTaW1wbGVFeGFtcGxlJ30KICoKICogQSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6CiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL25nQ29tcG9uZW50T3V0bGV0L3RzL21vZHVsZS50cyByZWdpb249J0NvbXBsZXRlRXhhbXBsZSd9CiAqCiAqIFxAcHVibGljQXBpCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqLwpjbGFzcyBOZ0NvbXBvbmVudE91dGxldCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDsKICAgICAgICB0aGlzLl9tb2R1bGVSZWYgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7CiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDsKICAgICAgICBpZiAodGhpcy5uZ0NvbXBvbmVudE91dGxldCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsSW5qZWN0b3IgPSB0aGlzLm5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3IgfHwgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5wYXJlbnRJbmplY3RvcjsKICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ25nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5J10pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2R1bGVSZWYpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1vZHVsZSA9IGVsSW5qZWN0b3IuZ2V0KE5nTW9kdWxlUmVmKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2R1bGVSZWYgPSB0aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5LmNyZWF0ZShwYXJlbnRNb2R1bGUuaW5qZWN0b3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IHRoaXMuX21vZHVsZVJlZiA/IHRoaXMuX21vZHVsZVJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgOgogICAgICAgICAgICAgICAgZWxJbmplY3Rvci5nZXQoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMubmdDb21wb25lbnRPdXRsZXQpOwogICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5LCB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aCwgZWxJbmplY3RvciwgdGhpcy5uZ0NvbXBvbmVudE91dGxldENvbnRlbnQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX21vZHVsZVJlZikKICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTsKICAgIH0KfQpOZ0NvbXBvbmVudE91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIE5nQ29tcG9uZW50T3V0bGV0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ29tcG9uZW50T3V0bGV0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpKTsgfTsKTmdDb21wb25lbnRPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdDb21wb25lbnRPdXRsZXQsIHNlbGVjdG9yczogW1siIiwgIm5nQ29tcG9uZW50T3V0bGV0IiwgIiJdXSwgaW5wdXRzOiB7IG5nQ29tcG9uZW50T3V0bGV0OiAibmdDb21wb25lbnRPdXRsZXQiLCBuZ0NvbXBvbmVudE91dGxldEluamVjdG9yOiAibmdDb21wb25lbnRPdXRsZXRJbmplY3RvciIsIG5nQ29tcG9uZW50T3V0bGV0Q29udGVudDogIm5nQ29tcG9uZW50T3V0bGV0Q29udGVudCIsIG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5OiAibmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnkiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0NvbXBvbmVudE91dGxldC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9Cl07Ck5nQ29tcG9uZW50T3V0bGV0LnByb3BEZWNvcmF0b3JzID0gewogICAgbmdDb21wb25lbnRPdXRsZXQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBuZ0NvbXBvbmVudE91dGxldENvbnRlbnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3Rvcnk6IFt7IHR5cGU6IElucHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmdfZm9yX29mLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVCwgVQogKi8KY2xhc3MgTmdGb3JPZkNvbnRleHQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99ICRpbXBsaWNpdAogICAgICogQHBhcmFtIHs/fSBuZ0Zvck9mCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IGNvdW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKCRpbXBsaWNpdCwgbmdGb3JPZiwgaW5kZXgsIGNvdW50KSB7CiAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAkaW1wbGljaXQ7CiAgICAgICAgdGhpcy5uZ0Zvck9mID0gbmdGb3JPZjsKICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZmlyc3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBsYXN0KCkgewogICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSB0aGlzLmNvdW50IC0gMTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGV2ZW4oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggJSAyID09PSAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb2RkKCkgewogICAgICAgIHJldHVybiAhdGhpcy5ldmVuOwogICAgfQp9Ci8qKgogKiBBIFtzdHJ1Y3R1cmFsIGRpcmVjdGl2ZV0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKSB0aGF0IHJlbmRlcnMKICogYSB0ZW1wbGF0ZSBmb3IgZWFjaCBpdGVtIGluIGEgY29sbGVjdGlvbi4KICogVGhlIGRpcmVjdGl2ZSBpcyBwbGFjZWQgb24gYW4gZWxlbWVudCwgd2hpY2ggYmVjb21lcyB0aGUgcGFyZW50CiAqIG9mIHRoZSBjbG9uZWQgdGVtcGxhdGVzLgogKgogKiBUaGUgYG5nRm9yT2ZgIGRpcmVjdGl2ZSBpcyBnZW5lcmFsbHkgdXNlZCBpbiB0aGUKICogW3Nob3J0aGFuZCBmb3JtXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGhlLWFzdGVyaXNrLS1wcmVmaXgpIGAqbmdGb3JgLgogKiBJbiB0aGlzIGZvcm0sIHRoZSB0ZW1wbGF0ZSB0byBiZSByZW5kZXJlZCBmb3IgZWFjaCBpdGVyYXRpb24gaXMgdGhlIGNvbnRlbnQKICogb2YgYW4gYW5jaG9yIGVsZW1lbnQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHNob3J0aGFuZCBzeW50YXggd2l0aCBzb21lIG9wdGlvbnMsCiAqIGNvbnRhaW5lZCBpbiBhbiBgPGxpPmAgZWxlbWVudC4KICoKICogYGBgCiAqIDxsaSAqbmdGb3I9ImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpOyB0cmFja0J5OiB0cmFja0J5Rm4iPi4uLjwvbGk+CiAqIGBgYAogKgogKiBUaGUgc2hvcnRoYW5kIGZvcm0gZXhwYW5kcyBpbnRvIGEgbG9uZyBmb3JtIHRoYXQgdXNlcyB0aGUgYG5nRm9yT2ZgIHNlbGVjdG9yCiAqIG9uIGFuIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LgogKiBUaGUgY29udGVudCBvZiB0aGUgYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQgaXMgdGhlIGA8bGk+YCBlbGVtZW50IHRoYXQgaGVsZCB0aGUKICogc2hvcnQtZm9ybSBkaXJlY3RpdmUuCiAqCiAqIEhlcmUgaXMgdGhlIGV4cGFuZGVkIHZlcnNpb24gb2YgdGhlIHNob3J0LWZvcm0gZXhhbXBsZS4KICoKICogYGBgCiAqIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09Iml0ZW1zIiBsZXQtaT0iaW5kZXgiIFtuZ0ZvclRyYWNrQnldPSJ0cmFja0J5Rm4iPgogKiAgIDxsaT4uLi48L2xpPgogKiA8L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IGV4cGFuZHMgdGhlIHNob3J0aGFuZCBzeW50YXggYXMgaXQgY29tcGlsZXMgdGhlIHRlbXBsYXRlLgogKiBUaGUgY29udGV4dCBmb3IgZWFjaCBlbWJlZGRlZCB2aWV3IGlzIGxvZ2ljYWxseSBtZXJnZWQgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50CiAqIGNvbnRleHQgYWNjb3JkaW5nIHRvIGl0cyBsZXhpY2FsIHBvc2l0aW9uLgogKgogKiBXaGVuIHVzaW5nIHRoZSBzaG9ydGhhbmQgc3ludGF4LCBBbmd1bGFyIGFsbG93cyBvbmx5IFtvbmUgc3RydWN0dXJhbCBkaXJlY3RpdmUKICogb24gYW4gZWxlbWVudF0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI29uZS1zdHJ1Y3R1cmFsLWRpcmVjdGl2ZS1wZXItaG9zdC1lbGVtZW50KS4KICogSWYgeW91IHdhbnQgdG8gaXRlcmF0ZSBjb25kaXRpb25hbGx5LCBmb3IgZXhhbXBsZSwKICogcHV0IHRoZSBgKm5nSWZgIG9uIGEgY29udGFpbmVyIGVsZW1lbnQgdGhhdCB3cmFwcyB0aGUgYCpuZ0ZvcmAgZWxlbWVudC4KICogRm9yIGZ1dGhlciBkaXNjdXNzaW9uLCBzZWUKICogW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI29uZS1wZXItZWxlbWVudCkuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgTG9jYWwgdmFyaWFibGVzCiAqCiAqIGBOZ0Zvck9mYCBwcm92aWRlcyBleHBvcnRlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgYWxpYXNlZCB0byBsb2NhbCB2YXJpYWJsZXMuCiAqIEZvciBleGFtcGxlOgogKgogKiAgYGBgCiAqIDxsaSAqbmdGb3I9ImxldCB1c2VyIG9mIHVzZXJzOyBpbmRleCBhcyBpOyBmaXJzdCBhcyBpc0ZpcnN0Ij4KICogICAge3tpfX0ve3t1c2Vycy5sZW5ndGh9fS4ge3t1c2VyfX0gPHNwYW4gKm5nSWY9ImlzRmlyc3QiPmRlZmF1bHQ8L3NwYW4+CiAqIDwvbGk+CiAqIGBgYAogKgogKiBUaGUgZm9sbG93aW5nIGV4cG9ydGVkIHZhbHVlcyBjYW4gYmUgYWxpYXNlZCB0byBsb2NhbCB2YXJpYWJsZXM6CiAqCiAqIC0gYCRpbXBsaWNpdDogVGA6IFRoZSB2YWx1ZSBvZiB0aGUgaW5kaXZpZHVhbCBpdGVtcyBpbiB0aGUgaXRlcmFibGUgKGBuZ0Zvck9mYCkuCiAqIC0gYG5nRm9yT2Y6IE5nSXRlcmFibGU8VD5gOiBUaGUgdmFsdWUgb2YgdGhlIGl0ZXJhYmxlIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHRoZSBleHByZXNzaW9uIGlzCiAqIG1vcmUgY29tcGxleCB0aGVuIGEgcHJvcGVydHkgYWNjZXNzLCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIHRoZSBhc3luYyBwaXBlIChgdXNlclN0cmVhbXMgfAogKiBhc3luY2ApLgogKiAtIGBpbmRleDogbnVtYmVyYDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhYmxlLgogKiAtIGBjb3VudDogbnVtYmVyYDogVGhlIGxlbmd0aCBvZiB0aGUgaXRlcmFibGUuCiAqIC0gYGZpcnN0OiBib29sZWFuYDogVHJ1ZSB3aGVuIHRoZSBpdGVtIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBpdGVyYWJsZS4KICogLSBgbGFzdDogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBpdGVyYWJsZS4KICogLSBgZXZlbjogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBoYXMgYW4gZXZlbiBpbmRleCBpbiB0aGUgaXRlcmFibGUuCiAqIC0gYG9kZDogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBoYXMgYW4gb2RkIGluZGV4IGluIHRoZSBpdGVyYWJsZS4KICoKICogIyMjIENoYW5nZSBwcm9wYWdhdGlvbgogKgogKiBXaGVuIHRoZSBjb250ZW50cyBvZiB0aGUgaXRlcmF0b3IgY2hhbmdlcywgYE5nRm9yT2ZgIG1ha2VzIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIERPTToKICoKICogKiBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQsIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpcyBhZGRlZCB0byB0aGUgRE9NLgogKiAqIFdoZW4gYW4gaXRlbSBpcyByZW1vdmVkLCBpdHMgdGVtcGxhdGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uCiAqICogV2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkLCB0aGVpciByZXNwZWN0aXZlIHRlbXBsYXRlcyBhcmUgcmVvcmRlcmVkIGluIHRoZSBET00uCiAqCiAqIEFuZ3VsYXIgdXNlcyBvYmplY3QgaWRlbnRpdHkgdG8gdHJhY2sgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIHdpdGhpbiB0aGUgaXRlcmF0b3IgYW5kIHJlcHJvZHVjZQogKiB0aG9zZSBjaGFuZ2VzIGluIHRoZSBET00uIFRoaXMgaGFzIGltcG9ydGFudCBpbXBsaWNhdGlvbnMgZm9yIGFuaW1hdGlvbnMgYW5kIGFueSBzdGF0ZWZ1bAogKiBjb250cm9scyB0aGF0IGFyZSBwcmVzZW50LCBzdWNoIGFzIGA8aW5wdXQ+YCBlbGVtZW50cyB0aGF0IGFjY2VwdCB1c2VyIGlucHV0LiBJbnNlcnRlZCByb3dzIGNhbgogKiBiZSBhbmltYXRlZCBpbiwgZGVsZXRlZCByb3dzIGNhbiBiZSBhbmltYXRlZCBvdXQsIGFuZCB1bmNoYW5nZWQgcm93cyByZXRhaW4gYW55IHVuc2F2ZWQgc3RhdGUKICogc3VjaCBhcyB1c2VyIGlucHV0LgogKiBGb3IgbW9yZSBvbiBhbmltYXRpb25zLCBzZWUgW1RyYW5zaXRpb25zIGFuZCBUcmlnZ2Vyc10oZ3VpZGUvdHJhbnNpdGlvbi1hbmQtdHJpZ2dlcnMpLgogKgogKiBUaGUgaWRlbnRpdGllcyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgY2FuIGNoYW5nZSB3aGlsZSB0aGUgZGF0YSBkb2VzIG5vdC4KICogVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIGlzIHByb2R1Y2VkIGZyb20gYW4gUlBDIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0CiAqIFJQQyBpcyByZS1ydW4uIEV2ZW4gaWYgdGhlIGRhdGEgaGFzbid0IGNoYW5nZWQsIHRoZSBzZWNvbmQgcmVzcG9uc2UgcHJvZHVjZXMgb2JqZWN0cyB3aXRoCiAqIGRpZmZlcmVudCBpZGVudGl0aWVzLCBhbmQgQW5ndWxhciBtdXN0IHRlYXIgZG93biB0aGUgZW50aXJlIERPTSBhbmQgcmVidWlsZCBpdCAoYXMgaWYgYWxsIG9sZAogKiBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgYW5kIGFsbCBuZXcgZWxlbWVudHMgaW5zZXJ0ZWQpLgogKgogKiBUbyBhdm9pZCB0aGlzIGV4cGVuc2l2ZSBvcGVyYXRpb24sIHlvdSBjYW4gY3VzdG9taXplIHRoZSBkZWZhdWx0IHRyYWNraW5nIGFsZ29yaXRobS4KICogYnkgc3VwcGx5aW5nIHRoZSBgdHJhY2tCeWAgb3B0aW9uIHRvIGBOZ0Zvck9mYC4KICogYHRyYWNrQnlgIHRha2VzIGEgZnVuY3Rpb24gdGhhdCBoYXMgdHdvIGFyZ3VtZW50czogYGluZGV4YCBhbmQgYGl0ZW1gLgogKiBJZiBgdHJhY2tCeWAgaXMgZ2l2ZW4sIEFuZ3VsYXIgdHJhY2tzIGNoYW5nZXMgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uCiAqCiAqIEBzZWUgW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKQogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVCwgVQogKi8KY2xhc3MgTmdGb3JPZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gX3RlbXBsYXRlCiAgICAgKiBAcGFyYW0gez99IF9kaWZmZXJzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyLCBfdGVtcGxhdGUsIF9kaWZmZXJzKSB7CiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lciA9IF92aWV3Q29udGFpbmVyOwogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gX3RlbXBsYXRlOwogICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVyczsKICAgICAgICB0aGlzLl9uZ0Zvck9mID0gbnVsbDsKICAgICAgICB0aGlzLl9uZ0Zvck9mRGlydHkgPSB0cnVlOwogICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaXRlcmFibGUgZXhwcmVzc2lvbiwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYQogICAgICogW3RlbXBsYXRlIGlucHV0IHZhcmlhYmxlXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGVtcGxhdGUtaW5wdXQtdmFyaWFibGUpLgogICAgICogQHBhcmFtIHs/fSBuZ0Zvck9mCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdGb3JPZihuZ0Zvck9mKSB7CiAgICAgICAgdGhpcy5fbmdGb3JPZiA9IG5nRm9yT2Y7CiAgICAgICAgdGhpcy5fbmdGb3JPZkRpcnR5ID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIHRyYWNrIGNoYW5nZXMgZm9yIGl0ZW1zIGluIHRoZSBpdGVyYWJsZS4KICAgICAqCiAgICAgKiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCwgbW92ZWQsIG9yIHJlbW92ZWQgaW4gdGhlIGl0ZXJhYmxlLAogICAgICogdGhlIGRpcmVjdGl2ZSBtdXN0IHJlLXJlbmRlciB0aGUgYXBwcm9wcmlhdGUgRE9NIG5vZGVzLgogICAgICogVG8gbWluaW1pemUgY2h1cm4gaW4gdGhlIERPTSwgb25seSBub2RlcyB0aGF0IGhhdmUgY2hhbmdlZAogICAgICogYXJlIHJlLXJlbmRlcmVkLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYXNzdW1lcyB0aGF0CiAgICAgKiB0aGUgb2JqZWN0IGluc3RhbmNlIGlkZW50aWZpZXMgdGhlIG5vZGUgaW4gdGhlIGl0ZXJhYmxlLgogICAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLCB0aGUgZGlyZWN0aXZlIHVzZXMKICAgICAqIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRvIGlkZW50aWZ5IHRoZSBpdGVtIG5vZGUsCiAgICAgKiByYXRoZXIgdGhhbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdCBpdHNlbGYuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byBpbnB1dHMsCiAgICAgKiB0aGUgaXRlcmF0aW9uIGluZGV4IGFuZCB0aGUgbm9kZSBvYmplY3QgSUQuCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdGb3JUcmFja0J5KGZuKSB7CiAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIGZuICE9IG51bGwgJiYgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIC8vIFRPRE8odmljYik6IHVzZSBhIGxvZyBzZXJ2aWNlIG9uY2UgdGhlcmUgaXMgYSBwdWJsaWMgb25lIGF2YWlsYWJsZQogICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnNvbGUpKSAmJiAoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS53YXJuKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgdHJhY2tCeSBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGZuKX0uIGAgKwogICAgICAgICAgICAgICAgICAgIGBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vTmdGb3JPZiNjaGFuZ2UtcHJvcGFnYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fdHJhY2tCeUZuID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuZ0ZvclRyYWNrQnkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNrQnlGbjsKICAgIH0KICAgIC8qKgogICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRlbXBsYXRlIHRoYXQgaXMgc3RhbXBlZCBvdXQgZm9yIGVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUuCiAgICAgKiBAc2VlIFt0ZW1wbGF0ZSByZWZlcmVuY2UgdmFyaWFibGVdKGd1aWRlL3RlbXBsYXRlLXN5bnRheCN0ZW1wbGF0ZS1yZWZlcmVuY2UtdmFyaWFibGVzLS12YXItKQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG5nRm9yVGVtcGxhdGUodmFsdWUpIHsKICAgICAgICAvLyBUT0RPKFRTMi4xKTogbWFrZSBUZW1wbGF0ZVJlZjxQYXJ0aWFsPE5nRm9yUm93T2Y8VD4+PiBvbmNlIHdlIG1vdmUgdG8gVFMgdjIuMQogICAgICAgIC8vIFRoZSBjdXJyZW50IHR5cGUgaXMgdG9vIHJlc3RyaWN0aXZlOyBhIHRlbXBsYXRlIHRoYXQganVzdCB1c2VzIGluZGV4LCBmb3IgZXhhbXBsZSwKICAgICAgICAvLyBzaG91bGQgYmUgYWNjZXB0YWJsZS4KICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFwcGxpZXMgdGhlIGNoYW5nZXMgd2hlbiBuZWVkZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgaWYgKHRoaXMuX25nRm9yT2ZEaXJ0eSkgewogICAgICAgICAgICB0aGlzLl9uZ0Zvck9mRGlydHkgPSBmYWxzZTsKICAgICAgICAgICAgLy8gUmVhY3Qgb24gbmdGb3JPZiBjaGFuZ2VzIG9ubHkgb25jZSBhbGwgaW5wdXRzIGhhdmUgYmVlbiBpbml0aWFsaXplZAogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbmdGb3JPZjsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUodGhpcy5uZ0ZvclRyYWNrQnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt2YWx1ZX0nIG9mIHR5cGUgJyR7Z2V0VHlwZU5hbWUkMSh2YWx1ZSl9Jy4gTmdGb3Igb25seSBzdXBwb3J0cyBiaW5kaW5nIHRvIEl0ZXJhYmxlcyBzdWNoIGFzIEFycmF5cy5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fZGlmZmVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX25nRm9yT2YpOwogICAgICAgICAgICBpZiAoY2hhbmdlcykKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnNlcnRUdXBsZXMgPSBbXTsKICAgICAgICBjaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAqIEBwYXJhbSB7P30gYWRqdXN0ZWRQcmV2aW91c0luZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50SW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChpdGVtLCBhZGp1c3RlZFByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCkgPT4gewogICAgICAgICAgICBpZiAoaXRlbS5wcmV2aW91c0luZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIE5nRm9yT2YgaXMgbmV2ZXIgIm51bGwiIG9yICJ1bmRlZmluZWQiIGhlcmUgYmVjYXVzZSB0aGUgZGlmZmVyIGRldGVjdGVkCiAgICAgICAgICAgICAgICAvLyB0aGF0IGEgbmV3IGl0ZW0gbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgZnJvbSB0aGUgaXRlcmFibGUuIFRoaXMgaW1wbGllcyB0aGF0CiAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBpdGVyYWJsZSB2YWx1ZSBmb3IgIl9uZ0Zvck9mIi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZSwgbmV3IE5nRm9yT2ZDb250ZXh0KCgvKiogQHR5cGUgez99ICovIChudWxsKSksICgvKiogQHR5cGUgez99ICovICh0aGlzLl9uZ0Zvck9mKSksIC0xLCAtMSksIGN1cnJlbnRJbmRleCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGN1cnJlbnRJbmRleCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0dXBsZSA9IG5ldyBSZWNvcmRWaWV3VHVwbGUoaXRlbSwgdmlldyk7CiAgICAgICAgICAgICAgICBpbnNlcnRUdXBsZXMucHVzaCh0dXBsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIucmVtb3ZlKGFkanVzdGVkUHJldmlvdXNJbmRleCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFkanVzdGVkUHJldmlvdXNJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYWRqdXN0ZWRQcmV2aW91c0luZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXIuZ2V0KGFkanVzdGVkUHJldmlvdXNJbmRleCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIubW92ZSh2aWV3LCBjdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHVwbGUgPSBuZXcgUmVjb3JkVmlld1R1cGxlKGl0ZW0sICgvKiogQHR5cGUgez99ICovICh2aWV3KSkpOwogICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2godHVwbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zZXJ0VHVwbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuX3BlclZpZXdDaGFuZ2UoaW5zZXJ0VHVwbGVzW2ldLnZpZXcsIGluc2VydFR1cGxlc1tpXS5yZWNvcmQpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgdmlld1JlZiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl92aWV3Q29udGFpbmVyLmdldChpKSkpOwogICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuaW5kZXggPSBpOwogICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuY291bnQgPSBpbGVuOwogICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQubmdGb3JPZiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9uZ0Zvck9mKSk7CiAgICAgICAgfQogICAgICAgIGNoYW5nZXMuZm9yRWFjaElkZW50aXR5Q2hhbmdlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld0NvbnRhaW5lci5nZXQocmVjb3JkLmN1cnJlbnRJbmRleCkpKTsKICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9wZXJWaWV3Q2hhbmdlKHZpZXcsIHJlY29yZCkgewogICAgICAgIHZpZXcuY29udGV4dC4kaW1wbGljaXQgPSByZWNvcmQuaXRlbTsKICAgIH0KICAgIC8qKgogICAgICogQXNzZXJ0cyB0aGUgY29ycmVjdCB0eXBlIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgdGVtcGxhdGUgdGhhdCBgTmdGb3JPZmAgd2lsbCByZW5kZXIuCiAgICAgKgogICAgICogVGhlIHByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgc2lnbmFsIHRvIHRoZSBJdnkgdGVtcGxhdGUgdHlwZS1jaGVjayBjb21waWxlciB0aGF0IHRoZQogICAgICogYE5nRm9yT2ZgIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHJlbmRlcnMgaXRzIHRlbXBsYXRlIHdpdGggYSBzcGVjaWZpYyBjb250ZXh0IHR5cGUuCiAgICAgKiBAdGVtcGxhdGUgVCwgVQogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChkaXIsIGN0eCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ck5nRm9yT2YuybVmYWMgPSBmdW5jdGlvbiBOZ0Zvck9mX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nRm9yT2YpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEl0ZXJhYmxlRGlmZmVycykpOyB9OwpOZ0Zvck9mLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nRm9yT2YsIHNlbGVjdG9yczogW1siIiwgIm5nRm9yIiwgIiIsICJuZ0Zvck9mIiwgIiJdXSwgaW5wdXRzOiB7IG5nRm9yT2Y6ICJuZ0Zvck9mIiwgbmdGb3JUcmFja0J5OiAibmdGb3JUcmFja0J5IiwgbmdGb3JUZW1wbGF0ZTogIm5nRm9yVGVtcGxhdGUiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0Zvck9mLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IEl0ZXJhYmxlRGlmZmVycyB9Cl07Ck5nRm9yT2YucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ0Zvck9mOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG5nRm9yVHJhY2tCeTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBuZ0ZvclRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKioKICogQHRlbXBsYXRlIFQsIFUKICovCmNsYXNzIFJlY29yZFZpZXdUdXBsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAqLwogICAgY29uc3RydWN0b3IocmVjb3JkLCB2aWV3KSB7CiAgICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7CiAgICAgICAgdGhpcy52aWV3ID0gdmlldzsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUeXBlTmFtZSQxKHR5cGUpIHsKICAgIHJldHVybiB0eXBlWyduYW1lJ10gfHwgdHlwZW9mIHR5cGU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19pZi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSB0aGF0IGNvbmRpdGlvbmFsbHkgaW5jbHVkZXMgYSB0ZW1wbGF0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YKICogYW4gZXhwcmVzc2lvbiBjb2VyY2VkIHRvIEJvb2xlYW4uCiAqIFdoZW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUsIEFuZ3VsYXIgcmVuZGVycyB0aGUgdGVtcGxhdGUKICogcHJvdmlkZWQgaW4gYSBgdGhlbmAgY2xhdXNlLCBhbmQgd2hlbiAgZmFsc2Ugb3IgbnVsbCwKICogQW5ndWxhciByZW5kZXJzIHRoZSB0ZW1wbGF0ZSBwcm92aWRlZCBpbiBhbiBvcHRpb25hbCBgZWxzZWAgY2xhdXNlLiBUaGUgZGVmYXVsdAogKiB0ZW1wbGF0ZSBmb3IgdGhlIGBlbHNlYCBjbGF1c2UgaXMgYmxhbmsuCiAqCiAqIEEgW3Nob3J0aGFuZCBmb3JtXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGhlLWFzdGVyaXNrLS1wcmVmaXgpIG9mIHRoZSBkaXJlY3RpdmUsCiAqIGAqbmdJZj0iY29uZGl0aW9uImAsIGlzIGdlbmVyYWxseSB1c2VkLCBwcm92aWRlZAogKiBhcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIGFuY2hvciBlbGVtZW50IGZvciB0aGUgaW5zZXJ0ZWQgdGVtcGxhdGUuCiAqIEFuZ3VsYXIgZXhwYW5kcyB0aGlzIGludG8gYSBtb3JlIGV4cGxpY2l0IHZlcnNpb24sIGluIHdoaWNoIHRoZSBhbmNob3IgZWxlbWVudAogKiBpcyBjb250YWluZWQgaW4gYW4gYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuCiAqCiAqIFNpbXBsZSBmb3JtIHdpdGggc2hvcnRoYW5kIHN5bnRheDoKICoKICogYGBgCiAqIDxkaXYgKm5nSWY9ImNvbmRpdGlvbiI+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMgdHJ1ZS48L2Rpdj4KICogYGBgCiAqCiAqIFNpbXBsZSBmb3JtIHdpdGggZXhwYW5kZWQgc3ludGF4OgogKgogKiBgYGAKICogPG5nLXRlbXBsYXRlIFtuZ0lmXT0iY29uZGl0aW9uIj48ZGl2PkNvbnRlbnQgdG8gcmVuZGVyIHdoZW4gY29uZGl0aW9uIGlzCiAqIHRydWUuPC9kaXY+PC9uZy10ZW1wbGF0ZT4KICogYGBgCiAqCiAqIEZvcm0gd2l0aCBhbiAiZWxzZSIgYmxvY2s6CiAqCiAqIGBgYAogKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb247IGVsc2UgZWxzZUJsb2NrIj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvZGl2PgogKiA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS48L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogU2hvcnRoYW5kIGZvcm0gd2l0aCAidGhlbiIgYW5kICJlbHNlIiBibG9ja3M6CiAqCiAqIGBgYAogKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb247IHRoZW4gdGhlbkJsb2NrIGVsc2UgZWxzZUJsb2NrIj48L2Rpdj4KICogPG5nLXRlbXBsYXRlICN0aGVuQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMgdHJ1ZS48L25nLXRlbXBsYXRlPgogKiA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS48L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogRm9ybSB3aXRoIHN0b3JpbmcgdGhlIHZhbHVlIGxvY2FsbHk6CiAqCiAqIGBgYAogKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb24gYXMgdmFsdWU7IGVsc2UgZWxzZUJsb2NrIj57e3ZhbHVlfX08L2Rpdj4KICogPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiB2YWx1ZSBpcyBudWxsLjwvbmctdGVtcGxhdGU+CiAqIGBgYAogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGAqbmdJZmAgZGlyZWN0aXZlIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBjb25kaXRpb25hbGx5IHNob3cgYW4gaW5saW5lIHRlbXBsYXRlLAogKiBhcyBzZWVuIGluIHRoZSBmb2xsb3dpbmcgIGV4YW1wbGUuCiAqIFRoZSBkZWZhdWx0IGBlbHNlYCB0ZW1wbGF0ZSBpcyBibGFuay4KICoKICoge1xAZXhhbXBsZSBjb21tb24vbmdJZi90cy9tb2R1bGUudHMgcmVnaW9uPSdOZ0lmU2ltcGxlJ30KICoKICogIyMjIFNob3dpbmcgYW4gYWx0ZXJuYXRpdmUgdGVtcGxhdGUgdXNpbmcgYGVsc2VgCiAqCiAqIFRvIGRpc3BsYXkgYSB0ZW1wbGF0ZSB3aGVuIGBleHByZXNzaW9uYCBldmFsdWF0ZXMgdG8gZmFsc2UsIHVzZSBhbiBgZWxzZWAgdGVtcGxhdGUKICogYmluZGluZyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCiAqIFRoZSBgZWxzZWAgYmluZGluZyBwb2ludHMgdG8gYW4gYDxuZy10ZW1wbGF0ZT5gICBlbGVtZW50IGxhYmVsZWQgYCNlbHNlQmxvY2tgLgogKiBUaGUgdGVtcGxhdGUgY2FuIGJlIGRlZmluZWQgYW55d2hlcmUgaW4gdGhlIGNvbXBvbmVudCB2aWV3LCBidXQgaXMgdHlwaWNhbGx5IHBsYWNlZCByaWdodCBhZnRlcgogKiBgbmdJZmAgZm9yIHJlYWRhYmlsaXR5LgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZFbHNlJ30KICoKICogIyMjIFVzaW5nIGFuIGV4dGVybmFsIGB0aGVuYCB0ZW1wbGF0ZQogKgogKiBJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIHRoZW4tY2xhdXNlIHRlbXBsYXRlIGlzIHNwZWNpZmllZCBpbmxpbmUsIGFzIHRoZSBjb250ZW50IG9mIHRoZQogKiB0YWcgdGhhdCBjb250YWlucyB0aGUgYG5nSWZgIGRpcmVjdGl2ZS4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB0ZW1wbGF0ZSB0aGF0IGlzIGRlZmluZWQKICogZXh0ZXJuYWxseSwgYnkgcmVmZXJlbmNpbmcgYSBsYWJlbGVkIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LiBXaGVuIHlvdSBkbyB0aGlzLCB5b3UgY2FuCiAqIGNoYW5nZSB3aGljaCB0ZW1wbGF0ZSB0byB1c2UgYXQgcnVudGltZSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZUaGVuRWxzZSd9CiAqCiAqICMjIyBTdG9yaW5nIGEgY29uZGl0aW9uYWwgcmVzdWx0IGluIGEgdmFyaWFibGUKICoKICogWW91IG1pZ2h0IHdhbnQgdG8gc2hvdyBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNhbWUgb2JqZWN0LiBJZiB5b3UgYXJlIHdhaXRpbmcKICogZm9yIGFzeW5jaHJvbm91cyBkYXRhLCB0aGUgb2JqZWN0IGNhbiBiZSB1bmRlZmluZWQuCiAqIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYG5nSWZgIGFuZCBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBjb25kaXRpb24gaW4gYSBsb2NhbAogKiB2YXJpYWJsZSBhcyBzaG93biBpbiB0aGUgdGhlIGZvbGxvd2luZyBleGFtcGxlLgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZBcyd9CiAqCiAqIFRoaXMgY29kZSB1c2VzIG9ubHkgb25lIGBBc3luY1BpcGVgLCBzbyBvbmx5IG9uZSBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZC4KICogVGhlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBgdXNlclN0cmVhbXxhc3luY2AgaW4gdGhlIGxvY2FsIHZhcmlhYmxlIGB1c2VyYC4KICogWW91IGNhbiB0aGVuIGJpbmQgdGhlIGxvY2FsIGB1c2VyYCByZXBlYXRlZGx5LgogKgogKiBUaGUgY29uZGl0aW9uYWwgZGlzcGxheXMgdGhlIGRhdGEgb25seSBpZiBgdXNlclN0cmVhbWAgcmV0dXJucyBhIHZhbHVlLAogKiBzbyB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgdGhlCiAqIFtzYWZlLW5hdmlnYXRpb24tb3BlcmF0b3JdKGd1aWRlL3RlbXBsYXRlLXN5bnRheCNzYWZlLW5hdmlnYXRpb24tb3BlcmF0b3IpIChgPy5gKQogKiB0byBndWFyZCBhZ2FpbnN0IG51bGwgdmFsdWVzIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMuCiAqIFlvdSBjYW4gZGlzcGxheSBhbiBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZGF0YS4KICoKICogIyMjIFNob3J0aGFuZCBzeW50YXgKICoKICogVGhlIHNob3J0aGFuZCBzeW50YXggYCpuZ0lmYCBleHBhbmRzIGludG8gdHdvIHNlcGFyYXRlIHRlbXBsYXRlIHNwZWNpZmljYXRpb25zCiAqIGZvciB0aGUgInRoZW4iIGFuZCAiZWxzZSIgY2xhdXNlcy4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc2hvcnRoYW5kIHN0YXRlbWVudCwKICogdGhhdCBpcyBtZWFudCB0byBzaG93IGEgbG9hZGluZyBwYWdlIHdoaWxlIHdhaXRpbmcgZm9yIGRhdGEgdG8gYmUgbG9hZGVkLgogKgogKiBgYGAKICogPGRpdiBjbGFzcz0iaGVyby1saXN0IiAqbmdJZj0iaGVyb2VzIGVsc2UgbG9hZGluZyI+CiAqICAuLi4KICogPC9kaXY+CiAqCiAqIDxuZy10ZW1wbGF0ZSAjbG9hZGluZz4KICogIDxkaXY+TG9hZGluZy4uLjwvZGl2PgogKiA8L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogWW91IGNhbiBzZWUgdGhhdCB0aGUgImVsc2UiIGNsYXVzZSByZWZlcmVuY2VzIHRoZSBgPG5nLXRlbXBsYXRlPmAKICogd2l0aCB0aGUgYCNsb2FkaW5nYCBsYWJlbCwgYW5kIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlICJ0aGVuIiBjbGF1c2UKICogaXMgcHJvdmlkZWQgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIGFuY2hvciBlbGVtZW50LgogKgogKiBIb3dldmVyLCB3aGVuIEFuZ3VsYXIgZXhwYW5kcyB0aGUgc2hvcnRoYW5kIHN5bnRheCwgaXQgY3JlYXRlcwogKiBhbm90aGVyIGA8bmctdGVtcGxhdGU+YCB0YWcsIHdpdGggYG5nSWZgIGFuZCBgbmdJZkVsc2VgIGRpcmVjdGl2ZXMuCiAqIFRoZSBhbmNob3IgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlICJ0aGVuIiBjbGF1c2UgYmVjb21lcwogKiB0aGUgY29udGVudCBvZiB0aGlzIHVubGFiZWxlZCBgPG5nLXRlbXBsYXRlPmAgdGFnLgogKgogKiBgYGAKICogPG5nLXRlbXBsYXRlIFtuZ0lmXT0iaGVyb2VzIiBbbmdJZkVsc2VdPSJsb2FkaW5nIj4KICogIDxkaXYgY2xhc3M9Imhlcm8tbGlzdCI+CiAqICAgLi4uCiAqICA8L2Rpdj4KICogPC9uZy10ZW1wbGF0ZT4KICoKICogPG5nLXRlbXBsYXRlICNsb2FkaW5nPgogKiAgPGRpdj5Mb2FkaW5nLi4uPC9kaXY+CiAqIDwvbmctdGVtcGxhdGU+CiAqIGBgYAogKgogKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIGltcGxpY2l0IHRlbXBsYXRlIG9iamVjdCBoYXMgaW1wbGljYXRpb25zIGZvciB0aGUgbmVzdGluZyBvZgogKiBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMuIEZvciBtb3JlIG9uIHRoaXMgc3ViamVjdCwgc2VlCiAqIFtTdHJ1Y3R1cmFsIERpcmVjdGl2ZXNdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjb25lLXBlci1lbGVtZW50KS4KICoKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIE5nSWYgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlUmVmCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZikgewogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIgPSBfdmlld0NvbnRhaW5lcjsKICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV3IE5nSWZDb250ZXh0KCk7CiAgICAgICAgdGhpcy5fdGhlblRlbXBsYXRlUmVmID0gbnVsbDsKICAgICAgICB0aGlzLl9lbHNlVGVtcGxhdGVSZWYgPSBudWxsOwogICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0gbnVsbDsKICAgICAgICB0aGlzLl9lbHNlVmlld1JlZiA9IG51bGw7CiAgICAgICAgdGhpcy5fdGhlblRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBCb29sZWFuIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgYXMgdGhlIGNvbmRpdGlvbiBmb3Igc2hvd2luZyBhIHRlbXBsYXRlLgogICAgICogQHBhcmFtIHs/fSBjb25kaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ0lmKGNvbmRpdGlvbikgewogICAgICAgIHRoaXMuX2NvbnRleHQuJGltcGxpY2l0ID0gdGhpcy5fY29udGV4dC5uZ0lmID0gY29uZGl0aW9uOwogICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTsKICAgIH0KICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSB0byBzaG93IGlmIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4KICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ0lmVGhlbih0ZW1wbGF0ZVJlZikgewogICAgICAgIGFzc2VydFRlbXBsYXRlKCduZ0lmVGhlbicsIHRlbXBsYXRlUmVmKTsKICAgICAgICB0aGlzLl90aGVuVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjsKICAgICAgICB0aGlzLl90aGVuVmlld1JlZiA9IG51bGw7IC8vIGNsZWFyIHByZXZpb3VzIHZpZXcgaWYgYW55LgogICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTsKICAgIH0KICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSB0byBzaG93IGlmIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlUmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdJZkVsc2UodGVtcGxhdGVSZWYpIHsKICAgICAgICBhc3NlcnRUZW1wbGF0ZSgnbmdJZkVsc2UnLCB0ZW1wbGF0ZVJlZik7CiAgICAgICAgdGhpcy5fZWxzZVRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7CiAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSBudWxsOyAvLyBjbGVhciBwcmV2aW91cyB2aWV3IGlmIGFueS4KICAgICAgICB0aGlzLl91cGRhdGVWaWV3KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmlldygpIHsKICAgICAgICBpZiAodGhpcy5fY29udGV4dC4kaW1wbGljaXQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl90aGVuVmlld1JlZikgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RoZW5UZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGhlblRlbXBsYXRlUmVmLCB0aGlzLl9jb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9lbHNlVmlld1JlZikgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICAgICAgdGhpcy5fdGhlblZpZXdSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vsc2VWaWV3UmVmID0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fZWxzZVRlbXBsYXRlUmVmLCB0aGlzLl9jb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQXNzZXJ0cyB0aGUgY29ycmVjdCB0eXBlIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgdGVtcGxhdGUgdGhhdCBgTmdJZmAgd2lsbCByZW5kZXIuCiAgICAgKgogICAgICogVGhlIHByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgc2lnbmFsIHRvIHRoZSBJdnkgdGVtcGxhdGUgdHlwZS1jaGVjayBjb21waWxlciB0aGF0IHRoZQogICAgICogYE5nSWZgIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHJlbmRlcnMgaXRzIHRlbXBsYXRlIHdpdGggYSBzcGVjaWZpYyBjb250ZXh0IHR5cGUuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChkaXIsIGN0eCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ck5nSWYuybVmYWMgPSBmdW5jdGlvbiBOZ0lmX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nSWYpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpKTsgfTsKTmdJZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ0lmLCBzZWxlY3RvcnM6IFtbIiIsICJuZ0lmIiwgIiJdXSwgaW5wdXRzOiB7IG5nSWY6ICJuZ0lmIiwgbmdJZlRoZW46ICJuZ0lmVGhlbiIsIG5nSWZFbHNlOiAibmdJZkVsc2UiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0lmLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0KXTsKTmdJZi5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG5nSWY6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdJZlRoZW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdJZkVsc2U6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgTmdJZkNvbnRleHQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIHRoaXMubmdJZiA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvcGVydHkKICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0VGVtcGxhdGUocHJvcGVydHksIHRlbXBsYXRlUmVmKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpc1RlbXBsYXRlUmVmT3JOdWxsID0gISEoIXRlbXBsYXRlUmVmIHx8IHRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyk7CiAgICBpZiAoIWlzVGVtcGxhdGVSZWZPck51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cHJvcGVydHl9IG11c3QgYmUgYSBUZW1wbGF0ZVJlZiwgYnV0IHJlY2VpdmVkICcke3N0cmluZ2lmeSh0ZW1wbGF0ZVJlZil9Jy5gKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX3N3aXRjaC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBTd2l0Y2hWaWV3IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lclJlZgogICAgICogQHBhcmFtIHs/fSBfdGVtcGxhdGVSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYsIF90ZW1wbGF0ZVJlZikgewogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjsKICAgICAgICB0aGlzLl90ZW1wbGF0ZVJlZiA9IF90ZW1wbGF0ZVJlZjsKICAgICAgICB0aGlzLl9jcmVhdGVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZSgpIHsKICAgICAgICB0aGlzLl9jcmVhdGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZVJlZik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY2xlYXIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjcmVhdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbmZvcmNlU3RhdGUoY3JlYXRlZCkgewogICAgICAgIGlmIChjcmVhdGVkICYmICF0aGlzLl9jcmVhdGVkKSB7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFjcmVhdGVkICYmIHRoaXMuX2NyZWF0ZWQpIHsKICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQGRlc2NyaXB0aW9uIEEgc3RydWN0dXJhbCBkaXJlY3RpdmUgdGhhdCBhZGRzIG9yIHJlbW92ZXMgdGVtcGxhdGVzIChkaXNwbGF5aW5nIG9yIGhpZGluZyB2aWV3cykKICogd2hlbiB0aGUgbmV4dCBtYXRjaCBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHN3aXRjaCBleHByZXNzaW9uLgogKgogKiBUaGUgYFtuZ1N3aXRjaF1gIGRpcmVjdGl2ZSBvbiBhIGNvbnRhaW5lciBzcGVjaWZpZXMgYW4gZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LgogKiBUaGUgZXhwcmVzc2lvbnMgdG8gbWF0Y2ggYXJlIHByb3ZpZGVkIGJ5IGBuZ1N3aXRjaENhc2VgIGRpcmVjdGl2ZXMgb24gdmlld3Mgd2l0aGluIHRoZSBjb250YWluZXIuCiAqIC0gRXZlcnkgdmlldyB0aGF0IG1hdGNoZXMgaXMgcmVuZGVyZWQuCiAqIC0gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMsIGEgdmlldyB3aXRoIHRoZSBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmUgaXMgcmVuZGVyZWQuCiAqIC0gRWxlbWVudHMgd2l0aGluIHRoZSBgW05nU3dpdGNoXWAgc3RhdGVtZW50IGJ1dCBvdXRzaWRlIG9mIGFueSBgTmdTd2l0Y2hDYXNlYAogKiBvciBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmUgYXJlIHByZXNlcnZlZCBhdCB0aGUgbG9jYXRpb24uCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBEZWZpbmUgYSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIGRpcmVjdGl2ZSwgYW5kIHNwZWNpZnkgdGhlIHN3aXRjaCBleHByZXNzaW9uCiAqIHRvIG1hdGNoIGFnYWluc3QgYXMgYW4gYXR0cmlidXRlOgogKgogKiBgYGAKICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICogYGBgCiAqCiAqIFdpdGhpbiB0aGUgY29udGFpbmVyLCBgKm5nU3dpdGNoQ2FzZWAgc3RhdGVtZW50cyBzcGVjaWZ5IHRoZSBtYXRjaCBleHByZXNzaW9ucwogKiBhcyBhdHRyaWJ1dGVzLiBJbmNsdWRlIGAqbmdTd2l0Y2hEZWZhdWx0YCBhcyB0aGUgZmluYWwgY2FzZS4KICoKICogYGBgCiAqIDxjb250YWluZXItZWxlbWVudCBbbmdTd2l0Y2hdPSJzd2l0Y2hfZXhwcmVzc2lvbiI+CiAqICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8xIj4uLi48L3NvbWUtZWxlbWVudD4KICogLi4uCiAqICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoRGVmYXVsdD4uLi48L3NvbWUtZWxlbWVudD4KICogPC9jb250YWluZXItZWxlbWVudD4KICogYGBgCiAqCiAqICMjIyBVc2FnZSBFeGFtcGxlcwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBtb3JlIHRoYW4gb25lIGNhc2UgdG8gZGlzcGxheSB0aGUgc2FtZSB2aWV3OgogKgogKiBgYGAKICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICogICA8IS0tIHRoZSBzYW1lIHZpZXcgY2FuIGJlIHNob3duIGluIG1vcmUgdGhhbiBvbmUgY2FzZSAtLT4KICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9Im1hdGNoX2V4cHJlc3Npb25fMSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAqICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzIiPi4uLjwvc29tZS1lbGVtZW50PgogKiAgIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8zIj4uLi48L3NvbWUtb3RoZXItZWxlbWVudD4KICogICA8IS0tZGVmYXVsdCBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIG1hdGNoZXMgLS0+CiAqICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hEZWZhdWx0Pi4uLjwvc29tZS1lbGVtZW50PgogKiA8L2NvbnRhaW5lci1lbGVtZW50PgogKiBgYGAKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBjYXNlcyBjYW4gYmUgbmVzdGVkOgogKiBgYGAKICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICogICAgICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzEiPi4uLjwvc29tZS1lbGVtZW50PgogKiAgICAgICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9Im1hdGNoX2V4cHJlc3Npb25fMiI+Li4uPC9zb21lLWVsZW1lbnQ+CiAqICAgICAgIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8zIj4uLi48L3NvbWUtb3RoZXItZWxlbWVudD4KICogICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzMiPgogKiAgICAgICAgIDwhLS0gdXNlIGEgbmctY29udGFpbmVyIHRvIGdyb3VwIG11bHRpcGxlIHJvb3Qgbm9kZXMgLS0+CiAqICAgICAgICAgPGlubmVyLWVsZW1lbnQ+PC9pbm5lci1lbGVtZW50PgogKiAgICAgICAgIDxpbm5lci1vdGhlci1lbGVtZW50PjwvaW5uZXItb3RoZXItZWxlbWVudD4KICogICAgICAgPC9uZy1jb250YWluZXI+CiAqICAgICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoRGVmYXVsdD4uLi48L3NvbWUtZWxlbWVudD4KICogICAgIDwvY29udGFpbmVyLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAc2VlIGBOZ1N3aXRjaENhc2VgCiAqIEBzZWUgYE5nU3dpdGNoRGVmYXVsdGAKICogQHNlZSBbU3RydWN0dXJhbCBEaXJlY3RpdmVzXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMpCiAqCiAqLwpjbGFzcyBOZ1N3aXRjaCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9kZWZhdWx0VXNlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2Nhc2VDb3VudCA9IDA7CiAgICAgICAgdGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID0gMDsKICAgICAgICB0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ1N3aXRjaChuZXdWYWx1ZSkgewogICAgICAgIHRoaXMuX25nU3dpdGNoID0gbmV3VmFsdWU7CiAgICAgICAgaWYgKHRoaXMuX2Nhc2VDb3VudCA9PT0gMCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXModHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkQ2FzZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2FzZUNvdW50Kys7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZERlZmF1bHQodmlldykgewogICAgICAgIGlmICghdGhpcy5fZGVmYXVsdFZpZXdzKSB7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRWaWV3cyA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLl9kZWZhdWx0Vmlld3MucHVzaCh2aWV3KTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX21hdGNoQ2FzZSh2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaGVkID0gdmFsdWUgPT0gdGhpcy5fbmdTd2l0Y2g7CiAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgfHwgbWF0Y2hlZDsKICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXgrKzsKICAgICAgICBpZiAodGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID09PSB0aGlzLl9jYXNlQ291bnQpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdENhc2VzKCF0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkKTsKICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID0gMDsKICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF0Y2hlZDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdXNlRGVmYXVsdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZURlZmF1bHRDYXNlcyh1c2VEZWZhdWx0KSB7CiAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRWaWV3cyAmJiB1c2VEZWZhdWx0ICE9PSB0aGlzLl9kZWZhdWx0VXNlZCkgewogICAgICAgICAgICB0aGlzLl9kZWZhdWx0VXNlZCA9IHVzZURlZmF1bHQ7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGVmYXVsdFZpZXdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmlldyA9IHRoaXMuX2RlZmF1bHRWaWV3c1tpXTsKICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3LmVuZm9yY2VTdGF0ZSh1c2VEZWZhdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpOZ1N3aXRjaC7JtWZhYyA9IGZ1bmN0aW9uIE5nU3dpdGNoX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nU3dpdGNoKSgpOyB9OwpOZ1N3aXRjaC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1N3aXRjaCwgc2VsZWN0b3JzOiBbWyIiLCAibmdTd2l0Y2giLCAiIl1dLCBpbnB1dHM6IHsgbmdTd2l0Y2g6ICJuZ1N3aXRjaCIgfSB9KTsKTmdTd2l0Y2gucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1N3aXRjaDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqCiAqIFxAZGVzY3JpcHRpb24KICogUHJvdmlkZXMgYSBzd2l0Y2ggY2FzZSBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QgYW4gZW5jbG9zaW5nIGBuZ1N3aXRjaGAgZXhwcmVzc2lvbi4KICogV2hlbiB0aGUgZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBnaXZlbiBgTmdTd2l0Y2hDYXNlYCB0ZW1wbGF0ZSBpcyByZW5kZXJlZC4KICogSWYgbXVsdGlwbGUgbWF0Y2ggZXhwcmVzc2lvbnMgbWF0Y2ggdGhlIHN3aXRjaCBleHByZXNzaW9uIHZhbHVlLCBhbGwgb2YgdGhlbSBhcmUgZGlzcGxheWVkLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogV2l0aGluIGEgc3dpdGNoIGNvbnRhaW5lciwgYCpuZ1N3aXRjaENhc2VgIHN0YXRlbWVudHMgc3BlY2lmeSB0aGUgbWF0Y2ggZXhwcmVzc2lvbnMKICogYXMgYXR0cmlidXRlcy4gSW5jbHVkZSBgKm5nU3dpdGNoRGVmYXVsdGAgYXMgdGhlIGZpbmFsIGNhc2UuCiAqCiAqIGBgYAogKiA8Y29udGFpbmVyLWVsZW1lbnQgW25nU3dpdGNoXT0ic3dpdGNoX2V4cHJlc3Npb24iPgogKiAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8xIj4uLi48L3NvbWUtZWxlbWVudD4KICogICAuLi4KICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+CiAqIDwvY29udGFpbmVyLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBFYWNoIHN3aXRjaC1jYXNlIHN0YXRlbWVudCBjb250YWlucyBhbiBpbi1saW5lIEhUTUwgdGVtcGxhdGUgb3IgdGVtcGxhdGUgcmVmZXJlbmNlCiAqIHRoYXQgZGVmaW5lcyB0aGUgc3VidHJlZSB0byBiZSBzZWxlY3RlZCBpZiB0aGUgdmFsdWUgb2YgdGhlIG1hdGNoIGV4cHJlc3Npb24KICogbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uLgogKgogKiBVbmxpa2UgSmF2YVNjcmlwdCwgd2hpY2ggdXNlcyBzdHJpY3QgZXF1YWxpdHksIEFuZ3VsYXIgdXNlcyBsb29zZSBlcXVhbGl0eS4KICogVGhpcyBtZWFucyB0aGF0IHRoZSBlbXB0eSBzdHJpbmcsIGAiImAgbWF0Y2hlcyAwLgogKgogKiBcQHB1YmxpY0FwaQogKiBAc2VlIGBOZ1N3aXRjaGAKICogQHNlZSBgTmdTd2l0Y2hEZWZhdWx0YAogKgogKi8KY2xhc3MgTmdTd2l0Y2hDYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlUmVmCiAgICAgKiBAcGFyYW0gez99IG5nU3dpdGNoCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmLCBuZ1N3aXRjaCkgewogICAgICAgIHRoaXMubmdTd2l0Y2ggPSBuZ1N3aXRjaDsKICAgICAgICBuZ1N3aXRjaC5fYWRkQ2FzZSgpOwogICAgICAgIHRoaXMuX3ZpZXcgPSBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZik7CiAgICB9CiAgICAvKioKICAgICAqIFBlcmZvcm1zIGNhc2UgbWF0Y2hpbmcuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nRG9DaGVjaygpIHsKICAgICAgICB0aGlzLl92aWV3LmVuZm9yY2VTdGF0ZSh0aGlzLm5nU3dpdGNoLl9tYXRjaENhc2UodGhpcy5uZ1N3aXRjaENhc2UpKTsKICAgIH0KfQpOZ1N3aXRjaENhc2UuybVmYWMgPSBmdW5jdGlvbiBOZ1N3aXRjaENhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTd2l0Y2hDYXNlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1N3aXRjaCwgMSkpOyB9OwpOZ1N3aXRjaENhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTd2l0Y2hDYXNlLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1N3aXRjaENhc2UiLCAiIl1dLCBpbnB1dHM6IHsgbmdTd2l0Y2hDYXNlOiAibmdTd2l0Y2hDYXNlIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdTd2l0Y2hDYXNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IE5nU3dpdGNoLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH1dIH0KXTsKTmdTd2l0Y2hDYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgbmdTd2l0Y2hDYXNlOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICoKICogXEBkZXNjcmlwdGlvbgogKgogKiBDcmVhdGVzIGEgdmlldyB0aGF0IGlzIHJlbmRlcmVkIHdoZW4gbm8gYE5nU3dpdGNoQ2FzZWAgZXhwcmVzc2lvbnMKICogbWF0Y2ggdGhlIGBOZ1N3aXRjaGAgZXhwcmVzc2lvbi4KICogVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIHRoZSBmaW5hbCBjYXNlIGluIGFuIGBOZ1N3aXRjaGAuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBzZWUgYE5nU3dpdGNoYAogKiBAc2VlIGBOZ1N3aXRjaENhc2VgCiAqCiAqLwpjbGFzcyBOZ1N3aXRjaERlZmF1bHQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAqIEBwYXJhbSB7P30gbmdTd2l0Y2gKICAgICAqLwogICAgY29uc3RydWN0b3Iodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYsIG5nU3dpdGNoKSB7CiAgICAgICAgbmdTd2l0Y2guX2FkZERlZmF1bHQobmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYpKTsKICAgIH0KfQpOZ1N3aXRjaERlZmF1bHQuybVmYWMgPSBmdW5jdGlvbiBOZ1N3aXRjaERlZmF1bHRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTd2l0Y2hEZWZhdWx0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1N3aXRjaCwgMSkpOyB9OwpOZ1N3aXRjaERlZmF1bHQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTd2l0Y2hEZWZhdWx0LCBzZWxlY3RvcnM6IFtbIiIsICJuZ1N3aXRjaERlZmF1bHQiLCAiIl1dIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdTd2l0Y2hEZWZhdWx0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IE5nU3dpdGNoLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19wbHVyYWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPSJ2YWx1ZSI+CiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT0iPTAiPnRoZXJlIGlzIG5vdGhpbmc8L25nLXRlbXBsYXRlPgogKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9Ij0xIj50aGVyZSBpcyBvbmU8L25nLXRlbXBsYXRlPgogKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9ImZldyI+dGhlcmUgYXJlIGEgZmV3PC9uZy10ZW1wbGF0ZT4KICogPC9zb21lLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEFkZHMgLyByZW1vdmVzIERPTSBzdWItdHJlZXMgYmFzZWQgb24gYSBudW1lcmljIHZhbHVlLiBUYWlsb3JlZCBmb3IgcGx1cmFsaXphdGlvbi4KICoKICogRGlzcGxheXMgRE9NIHN1Yi10cmVlcyB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiB2YWx1ZSwgb3IgZmFpbGluZyB0aGF0LCBET00gc3ViLXRyZWVzCiAqIHRoYXQgbWF0Y2ggdGhlIHN3aXRjaCBleHByZXNzaW9uJ3MgcGx1cmFsaXphdGlvbiBjYXRlZ29yeS4KICoKICogVG8gdXNlIHRoaXMgZGlyZWN0aXZlIHlvdSBtdXN0IHByb3ZpZGUgYSBjb250YWluZXIgZWxlbWVudCB0aGF0IHNldHMgdGhlIGBbbmdQbHVyYWxdYCBhdHRyaWJ1dGUKICogdG8gYSBzd2l0Y2ggZXhwcmVzc2lvbi4gSW5uZXIgZWxlbWVudHMgd2l0aCBhIGBbbmdQbHVyYWxDYXNlXWAgd2lsbCBkaXNwbGF5IGJhc2VkIG9uIHRoZWlyCiAqIGV4cHJlc3Npb246CiAqIC0gaWYgYFtuZ1BsdXJhbENhc2VdYCBpcyBzZXQgdG8gYSB2YWx1ZSBzdGFydGluZyB3aXRoIGA9YCwgaXQgd2lsbCBvbmx5IGRpc3BsYXkgaWYgdGhlIHZhbHVlCiAqICAgbWF0Y2hlcyB0aGUgc3dpdGNoIGV4cHJlc3Npb24gZXhhY3RseSwKICogLSBvdGhlcndpc2UsIHRoZSB2aWV3IHdpbGwgYmUgdHJlYXRlZCBhcyBhICJjYXRlZ29yeSBtYXRjaCIsIGFuZCB3aWxsIG9ubHkgZGlzcGxheSBpZiBleGFjdAogKiAgIHZhbHVlIG1hdGNoZXMgYXJlbid0IGZvdW5kIGFuZCB0aGUgdmFsdWUgbWFwcyB0byBpdHMgY2F0ZWdvcnkgZm9yIHRoZSBkZWZpbmVkIGxvY2FsZS4KICoKICogU2VlIGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL2luZGV4L2NsZHItc3BlYy9wbHVyYWwtcnVsZXMKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5nUGx1cmFsIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfbG9jYWxpemF0aW9uCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9sb2NhbGl6YXRpb24pIHsKICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSBfbG9jYWxpemF0aW9uOwogICAgICAgIHRoaXMuX2Nhc2VWaWV3cyA9IHt9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdQbHVyYWwodmFsdWUpIHsKICAgICAgICB0aGlzLl9zd2l0Y2hWYWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBzd2l0Y2hWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRDYXNlKHZhbHVlLCBzd2l0Y2hWaWV3KSB7CiAgICAgICAgdGhpcy5fY2FzZVZpZXdzW3ZhbHVlXSA9IHN3aXRjaFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmlldygpIHsKICAgICAgICB0aGlzLl9jbGVhclZpZXdzKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNhc2VzID0gT2JqZWN0LmtleXModGhpcy5fY2FzZVZpZXdzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ID0gZ2V0UGx1cmFsQ2F0ZWdvcnkodGhpcy5fc3dpdGNoVmFsdWUsIGNhc2VzLCB0aGlzLl9sb2NhbGl6YXRpb24pOwogICAgICAgIHRoaXMuX2FjdGl2YXRlVmlldyh0aGlzLl9jYXNlVmlld3Nba2V5XSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2xlYXJWaWV3cygpIHsKICAgICAgICBpZiAodGhpcy5fYWN0aXZlVmlldykKICAgICAgICAgICAgdGhpcy5fYWN0aXZlVmlldy5kZXN0cm95KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hY3RpdmF0ZVZpZXcodmlldykgewogICAgICAgIGlmICh2aWV3KSB7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVZpZXcgPSB2aWV3OwogICAgICAgICAgICB0aGlzLl9hY3RpdmVWaWV3LmNyZWF0ZSgpOwogICAgICAgIH0KICAgIH0KfQpOZ1BsdXJhbC7JtWZhYyA9IGZ1bmN0aW9uIE5nUGx1cmFsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nUGx1cmFsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nTG9jYWxpemF0aW9uKSk7IH07Ck5nUGx1cmFsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nUGx1cmFsLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1BsdXJhbCIsICIiXV0sIGlucHV0czogeyBuZ1BsdXJhbDogIm5nUGx1cmFsIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdQbHVyYWwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE5nTG9jYWxpemF0aW9uIH0KXTsKTmdQbHVyYWwucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1BsdXJhbDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqCiAqIFxAZGVzY3JpcHRpb24KICoKICogQ3JlYXRlcyBhIHZpZXcgdGhhdCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHtcQGxpbmsgTmdQbHVyYWx9IHdoZW4gdGhlCiAqIGdpdmVuIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYWNjb3JkaW5nIHRvIENMRFIgcnVsZXMuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPSJ2YWx1ZSI+CiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT0iPTAiPi4uLjwvbmctdGVtcGxhdGU+CiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT0ib3RoZXIiPi4uLjwvbmctdGVtcGxhdGU+CiAqIDwvc29tZS1lbGVtZW50PgogKiBgYGAKICoKICogU2VlIHtcQGxpbmsgTmdQbHVyYWx9IGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGUuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ1BsdXJhbENhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gbmdQbHVyYWwKICAgICAqLwogICAgY29uc3RydWN0b3IodmFsdWUsIHRlbXBsYXRlLCB2aWV3Q29udGFpbmVyLCBuZ1BsdXJhbCkgewogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBTnVtYmVyID0gIWlzTmFOKE51bWJlcih2YWx1ZSkpOwogICAgICAgIG5nUGx1cmFsLmFkZENhc2UoaXNBTnVtYmVyID8gYD0ke3ZhbHVlfWAgOiB2YWx1ZSwgbmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGUpKTsKICAgIH0KfQpOZ1BsdXJhbENhc2UuybVmYWMgPSBmdW5jdGlvbiBOZ1BsdXJhbENhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdQbHVyYWxDYXNlKSjJtcm1aW5qZWN0QXR0cmlidXRlKCduZ1BsdXJhbENhc2UnKSwgybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdQbHVyYWwsIDEpKTsgfTsKTmdQbHVyYWxDYXNlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nUGx1cmFsQ2FzZSwgc2VsZWN0b3JzOiBbWyIiLCAibmdQbHVyYWxDYXNlIiwgIiJdXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk5nUGx1cmFsQ2FzZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsnbmdQbHVyYWxDYXNlJyxdIH1dIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgIHsgdHlwZTogTmdQbHVyYWwsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEhvc3QgfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX3N0eWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQHVzYWdlTm90ZXMKICoKICogU2V0IHRoZSBmb250IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQgdG8gdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLgogKgogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdTdHlsZV09InsnZm9udC1zdHlsZSc6IHN0eWxlRXhwfSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBTZXQgdGhlIHdpZHRoIG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQgdG8gYSBwaXhlbCB2YWx1ZSByZXR1cm5lZCBieSBhbiBleHByZXNzaW9uLgogKgogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdTdHlsZV09InsnbWF4LXdpZHRoLnB4Jzogd2lkdGhFeHB9Ij4uLi48L3NvbWUtZWxlbWVudD4KICogYGBgCiAqCiAqIFNldCBhIGNvbGxlY3Rpb24gb2Ygc3R5bGUgdmFsdWVzIHVzaW5nIGFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGtleS12YWx1ZSBwYWlycy4KICoKICogYGBgCiAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPSJvYmpFeHAiPi4uLjwvc29tZS1lbGVtZW50PgogKiBgYGAKICoKICogXEBkZXNjcmlwdGlvbgogKgogKiBBbiBhdHRyaWJ1dGUgZGlyZWN0aXZlIHRoYXQgdXBkYXRlcyBzdHlsZXMgZm9yIHRoZSBjb250YWluaW5nIEhUTUwgZWxlbWVudC4KICogU2V0cyBvbmUgb3IgbW9yZSBzdHlsZSBwcm9wZXJ0aWVzLCBzcGVjaWZpZWQgYXMgY29sb24tc2VwYXJhdGVkIGtleS12YWx1ZSBwYWlycy4KICogVGhlIGtleSBpcyBhIHN0eWxlIG5hbWUsIHdpdGggYW4gb3B0aW9uYWwgYC48dW5pdD5gIHN1ZmZpeAogKiAoc3VjaCBhcyAndG9wLnB4JywgJ2ZvbnQtc3R5bGUuZW0nKS4KICogVGhlIHZhbHVlIGlzIGFuIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLgogKiBUaGUgcmVzdWx0aW5nIG5vbi1udWxsIHZhbHVlLCBleHByZXNzZWQgaW4gdGhlIGdpdmVuIHVuaXQsCiAqIGlzIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBzdHlsZSBwcm9wZXJ0eS4KICogSWYgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW9uIGlzIG51bGwsIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIGlzIHJlbW92ZWQuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ1N0eWxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfbmdFbAogICAgICogQHBhcmFtIHs/fSBfZGlmZmVycwogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoX25nRWwsIF9kaWZmZXJzLCBfcmVuZGVyZXIpIHsKICAgICAgICB0aGlzLl9uZ0VsID0gX25nRWw7CiAgICAgICAgdGhpcy5fZGlmZmVycyA9IF9kaWZmZXJzOwogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgIHRoaXMuX25nU3R5bGUgPSBudWxsOwogICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdTdHlsZSh2YWx1ZXMpIHsKICAgICAgICB0aGlzLl9uZ1N0eWxlID0gdmFsdWVzOwogICAgICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlcykgewogICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQodmFsdWVzKS5jcmVhdGUoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nRG9DaGVjaygpIHsKICAgICAgICBpZiAodGhpcy5fZGlmZmVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9uZ1N0eWxlKSkpOwogICAgICAgICAgICBpZiAoY2hhbmdlcykgewogICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBuYW1lQW5kVW5pdAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFN0eWxlKG5hbWVBbmRVbml0LCB2YWx1ZSkgewogICAgICAgIGNvbnN0IFtuYW1lLCB1bml0XSA9IG5hbWVBbmRVbml0LnNwbGl0KCcuJyk7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsICYmIHVuaXQgPyBgJHt2YWx1ZX0ke3VuaXR9YCA6IHZhbHVlOwogICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCwgbmFtZSwgKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LCBuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgbnVsbCkpKTsKICAgICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB0aGlzLl9zZXRTdHlsZShyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKSkpOwogICAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSkpKTsKICAgIH0KfQpOZ1N0eWxlLsm1ZmFjID0gZnVuY3Rpb24gTmdTdHlsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ1N0eWxlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEtleVZhbHVlRGlmZmVycyksIMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSk7IH07Ck5nU3R5bGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTdHlsZSwgc2VsZWN0b3JzOiBbWyIiLCAibmdTdHlsZSIsICIiXV0sIGlucHV0czogeyBuZ1N0eWxlOiAibmdTdHlsZSIgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk5nU3R5bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogS2V5VmFsdWVEaWZmZXJzIH0sCiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9Cl07Ck5nU3R5bGUucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1N0eWxlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduZ1N0eWxlJyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmdfdGVtcGxhdGVfb3V0bGV0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEluc2VydHMgYW4gZW1iZWRkZWQgdmlldyBmcm9tIGEgcHJlcGFyZWQgYFRlbXBsYXRlUmVmYC4KICoKICogWW91IGNhbiBhdHRhY2ggYSBjb250ZXh0IG9iamVjdCB0byB0aGUgYEVtYmVkZGVkVmlld1JlZmAgYnkgc2V0dGluZyBgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XWAuCiAqIGBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdYCBzaG91bGQgYmUgYW4gb2JqZWN0LCB0aGUgb2JqZWN0J3Mga2V5cyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYmluZGluZwogKiBieSB0aGUgbG9jYWwgdGVtcGxhdGUgYGxldGAgZGVjbGFyYXRpb25zLgogKgogKiBcQHVzYWdlTm90ZXMKICogYGBgCiAqIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9InRlbXBsYXRlUmVmRXhwOyBjb250ZXh0OiBjb250ZXh0RXhwIj48L25nLWNvbnRhaW5lcj4KICogYGBgCiAqCiAqIFVzaW5nIHRoZSBrZXkgYCRpbXBsaWNpdGAgaW4gdGhlIGNvbnRleHQgb2JqZWN0IHdpbGwgc2V0IGl0cyB2YWx1ZSBhcyBkZWZhdWx0LgogKgogKiAjIyMgRXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ1RlbXBsYXRlT3V0bGV0L3RzL21vZHVsZS50cyByZWdpb249J05nVGVtcGxhdGVPdXRsZXQnfQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdUZW1wbGF0ZU91dGxldCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgdGhpcy5fdmlld1JlZiA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBjb250ZXh0IG9iamVjdCB0byBhdHRhY2ggdG8gdGhlIHtcQGxpbmsgRW1iZWRkZWRWaWV3UmVmfS4gVGhpcyBzaG91bGQgYmUgYW4KICAgICAgICAgKiBvYmplY3QsIHRoZSBvYmplY3QncyBrZXlzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBiaW5kaW5nIGJ5IHRoZSBsb2NhbCB0ZW1wbGF0ZSBgbGV0YAogICAgICAgICAqIGRlY2xhcmF0aW9ucy4KICAgICAgICAgKiBVc2luZyB0aGUga2V5IGAkaW1wbGljaXRgIGluIHRoZSBjb250ZXh0IG9iamVjdCB3aWxsIHNldCBpdHMgdmFsdWUgYXMgZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBBIHN0cmluZyBkZWZpbmluZyB0aGUgdGVtcGxhdGUgcmVmZXJlbmNlIGFuZCBvcHRpb25hbGx5IHRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIHRlbXBsYXRlLgogICAgICAgICAqLwogICAgICAgIHRoaXMubmdUZW1wbGF0ZU91dGxldCA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWNyZWF0ZVZpZXcgPSB0aGlzLl9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcyk7CiAgICAgICAgaWYgKHJlY3JlYXRlVmlldykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICBpZiAodGhpcy5fdmlld1JlZikgewogICAgICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZi5yZW1vdmUodmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92aWV3UmVmID0gdGhpcy5uZ1RlbXBsYXRlT3V0bGV0ID8KICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMubmdUZW1wbGF0ZU91dGxldCwgdGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCkgOgogICAgICAgICAgICAgICAgbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmlld1JlZiAmJiB0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFdlIG5lZWQgdG8gcmUtY3JlYXRlIGV4aXN0aW5nIGVtYmVkZGVkIHZpZXcgaWY6CiAgICAgKiAtIHRlbXBsYXRlUmVmIGhhcyBjaGFuZ2VkCiAgICAgKiAtIGNvbnRleHQgaGFzIGNoYW5nZXMKICAgICAqCiAgICAgKiBXZSBtYXJrIGNvbnRleHQgb2JqZWN0IGFzIGNoYW5nZWQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QKICAgICAqIHNoYXBlIGNoYW5nZXMgKG5ldyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCBvciBleGlzdGluZyBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkKS4KICAgICAqIEluIG90aGVyIHdvcmRzIHdlIGNvbnNpZGVyIGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzICJ0aGUgc2FtZSIgZXZlbgogICAgICogaWYgb2JqZWN0IHJlZmVyZW5jZSBjaGFuZ2VzIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM0MDcpLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Nob3VsZFJlY3JlYXRlVmlldyhjaGFuZ2VzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN0eENoYW5nZSA9IGNoYW5nZXNbJ25nVGVtcGxhdGVPdXRsZXRDb250ZXh0J107CiAgICAgICAgcmV0dXJuICEhY2hhbmdlc1snbmdUZW1wbGF0ZU91dGxldCddIHx8IChjdHhDaGFuZ2UgJiYgdGhpcy5faGFzQ29udGV4dFNoYXBlQ2hhbmdlZChjdHhDaGFuZ2UpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3R4Q2hhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFzQ29udGV4dFNoYXBlQ2hhbmdlZChjdHhDaGFuZ2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldkN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLmN1cnJlbnRWYWx1ZSB8fCB7fSk7CiAgICAgICAgaWYgKHByZXZDdHhLZXlzLmxlbmd0aCA9PT0gY3VyckN0eEtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAobGV0IHByb3BOYW1lIG9mIGN1cnJDdHhLZXlzKSB7CiAgICAgICAgICAgICAgICBpZiAocHJldkN0eEtleXMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlRXhpc3RpbmdDb250ZXh0KGN0eCkgewogICAgICAgIGZvciAobGV0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGN0eCkpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld1JlZikpLmNvbnRleHQpKSlbcHJvcE5hbWVdID0gKCgvKiogQHR5cGUgez99ICovICh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KSkpW3Byb3BOYW1lXTsKICAgICAgICB9CiAgICB9Cn0KTmdUZW1wbGF0ZU91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIE5nVGVtcGxhdGVPdXRsZXRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdUZW1wbGF0ZU91dGxldCkoybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSk7IH07Ck5nVGVtcGxhdGVPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdUZW1wbGF0ZU91dGxldCwgc2VsZWN0b3JzOiBbWyIiLCAibmdUZW1wbGF0ZU91dGxldCIsICIiXV0sIGlucHV0czogeyBuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dDogIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IiwgbmdUZW1wbGF0ZU91dGxldDogIm5nVGVtcGxhdGVPdXRsZXQiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ1RlbXBsYXRlT3V0bGV0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0KXTsKTmdUZW1wbGF0ZU91dGxldC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG5nVGVtcGxhdGVPdXRsZXRDb250ZXh0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG5nVGVtcGxhdGVPdXRsZXQ6IFt7IHR5cGU6IElucHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2ludmFsaWRfcGlwZV9hcmd1bWVudF9lcnJvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludmFsaWRQaXBlQXJndW1lbnRFcnJvcih0eXBlLCB2YWx1ZSkgewogICAgcmV0dXJuIEVycm9yKGBJbnZhbGlkUGlwZUFyZ3VtZW50OiAnJHt2YWx1ZX0nIGZvciBwaXBlICcke3N0cmluZ2lmeSh0eXBlKX0nYCk7Cn0KY2xhc3MgT2JzZXJ2YWJsZVN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3luYwogICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jLCB1cGRhdGVMYXRlc3RWYWx1ZSkgewogICAgICAgIHJldHVybiBhc3luYy5zdWJzY3JpYmUoewogICAgICAgICAgICBuZXh0OiB1cGRhdGVMYXRlc3RWYWx1ZSwKICAgICAgICAgICAgZXJyb3I6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZSkgPT4gewogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdWJzY3JpcHRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc3Bvc2Uoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KY2xhc3MgUHJvbWlzZVN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3luYwogICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jLCB1cGRhdGVMYXRlc3RWYWx1ZSkgewogICAgICAgIHJldHVybiBhc3luYy50aGVuKHVwZGF0ZUxhdGVzdFZhbHVlLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlID0+IHsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNwb3NlKHN1YnNjcmlwdGlvbikgeyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koc3Vic2NyaXB0aW9uKSB7IH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9wcm9taXNlU3RyYXRlZ3kgPSBuZXcgUHJvbWlzZVN0cmF0ZWd5KCk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgX29ic2VydmFibGVTdHJhdGVneSA9IG5ldyBPYnNlcnZhYmxlU3RyYXRlZ3koKTsKLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAZGVzY3JpcHRpb24KICoKICogVW53cmFwcyBhIHZhbHVlIGZyb20gYW4gYXN5bmNocm9ub3VzIHByaW1pdGl2ZS4KICoKICogVGhlIGBhc3luY2AgcGlwZSBzdWJzY3JpYmVzIHRvIGFuIGBPYnNlcnZhYmxlYCBvciBgUHJvbWlzZWAgYW5kIHJldHVybnMgdGhlIGxhdGVzdCB2YWx1ZSBpdCBoYXMKICogZW1pdHRlZC4gV2hlbiBhIG5ldyB2YWx1ZSBpcyBlbWl0dGVkLCB0aGUgYGFzeW5jYCBwaXBlIG1hcmtzIHRoZSBjb21wb25lbnQgdG8gYmUgY2hlY2tlZCBmb3IKICogY2hhbmdlcy4gV2hlbiB0aGUgY29tcG9uZW50IGdldHMgZGVzdHJveWVkLCB0aGUgYGFzeW5jYCBwaXBlIHVuc3Vic2NyaWJlcyBhdXRvbWF0aWNhbGx5IHRvIGF2b2lkCiAqIHBvdGVudGlhbCBtZW1vcnkgbGVha3MuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgRXhhbXBsZXMKICoKICogVGhpcyBleGFtcGxlIGJpbmRzIGEgYFByb21pc2VgIHRvIHRoZSB2aWV3LiBDbGlja2luZyB0aGUgYFJlc29sdmVgIGJ1dHRvbiByZXNvbHZlcyB0aGUKICogcHJvbWlzZS4KICoKICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvYXN5bmNfcGlwZS50cyByZWdpb249J0FzeW5jUGlwZVByb21pc2UnfQogKgogKiBJdCdzIGFsc28gcG9zc2libGUgdG8gdXNlIGBhc3luY2Agd2l0aCBPYnNlcnZhYmxlcy4gVGhlIGV4YW1wbGUgYmVsb3cgYmluZHMgdGhlIGB0aW1lYCBPYnNlcnZhYmxlCiAqIHRvIHRoZSB2aWV3LiBUaGUgT2JzZXJ2YWJsZSBjb250aW51b3VzbHkgdXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBjdXJyZW50IHRpbWUuCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2FzeW5jX3BpcGUudHMgcmVnaW9uPSdBc3luY1BpcGVPYnNlcnZhYmxlJ30KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEFzeW5jUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3JlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmVmKSB7CiAgICAgICAgdGhpcy5fcmVmID0gX3JlZjsKICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB0aGlzLl9vYmogPSBudWxsOwogICAgICAgIHRoaXMuX3N0cmF0ZWd5ID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbikgewogICAgICAgICAgICB0aGlzLl9kaXNwb3NlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKG9iaikgewogICAgICAgIGlmICghdGhpcy5fb2JqKSB7CiAgICAgICAgICAgIGlmIChvYmopIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSB0aGlzLl9sYXRlc3RWYWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAob2JqICE9PSB0aGlzLl9vYmopIHsKICAgICAgICAgICAgdGhpcy5fZGlzcG9zZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oKC8qKiBAdHlwZSB7P30gKi8gKG9iaikpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxvb3NlSWRlbnRpY2FsKHRoaXMuX2xhdGVzdFZhbHVlLCB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgIHJldHVybiBXcmFwcGVkVmFsdWUud3JhcCh0aGlzLl9sYXRlc3RWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N1YnNjcmliZShvYmopIHsKICAgICAgICB0aGlzLl9vYmogPSBvYmo7CiAgICAgICAgdGhpcy5fc3RyYXRlZ3kgPSB0aGlzLl9zZWxlY3RTdHJhdGVneShvYmopOwogICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHRoaXMuX3N0cmF0ZWd5LmNyZWF0ZVN1YnNjcmlwdGlvbihvYmosICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsdWUpID0+IHRoaXMuX3VwZGF0ZUxhdGVzdFZhbHVlKG9iaiwgdmFsdWUpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NlbGVjdFN0cmF0ZWd5KG9iaikgewogICAgICAgIGlmIChpc1Byb21pc2UkMShvYmopKSB7CiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZVN0cmF0ZWd5OwogICAgICAgIH0KICAgICAgICBpZiAoaXNPYnNlcnZhYmxlJDEob2JqKSkgewogICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVTdHJhdGVneTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEFzeW5jUGlwZSwgb2JqKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9kaXNwb3NlKCkgewogICAgICAgIHRoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N1YnNjcmlwdGlvbikpKTsKICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB0aGlzLl9vYmogPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBhc3luYwogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZUxhdGVzdFZhbHVlKGFzeW5jLCB2YWx1ZSkgewogICAgICAgIGlmIChhc3luYyA9PT0gdGhpcy5fb2JqKSB7CiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX3JlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICB9Cn0KQXN5bmNQaXBlLsm1ZmFjID0gZnVuY3Rpb24gQXN5bmNQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFzeW5jUGlwZSkoybXJtWluamVjdFBpcGVDaGFuZ2VEZXRlY3RvclJlZigpKTsgfTsKQXN5bmNQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogImFzeW5jIiwgdHlwZTogQXN5bmNQaXBlLCBwdXJlOiBmYWxzZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkFzeW5jUGlwZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9jYXNlX2NvbnZlcnNpb25fcGlwZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRyYW5zZm9ybXMgdGV4dCB0byBhbGwgbG93ZXIgY2FzZS4KICoKICogQHNlZSBgVXBwZXJDYXNlUGlwZWAKICogQHNlZSBgVGl0bGVDYXNlUGlwZWAKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgdmlldyB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBlbnRlcgogKiB0ZXh0LCBhbmQgdGhlbiB1c2VzIHRoZSBwaXBlIHRvIGNvbnZlcnQgdGhlIGlucHV0IHRleHQgdG8gYWxsIGxvd2VyIGNhc2UuCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL2xvd2VydXBwZXJfcGlwZS50cyIgcmVnaW9uPSdMb3dlclVwcGVyUGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBMb3dlckNhc2VQaXBlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHRyYW5zZm9ybSB0byBsb3dlciBjYXNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlKSB7CiAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihMb3dlckNhc2VQaXBlLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgfQp9Ckxvd2VyQ2FzZVBpcGUuybVmYWMgPSBmdW5jdGlvbiBMb3dlckNhc2VQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExvd2VyQ2FzZVBpcGUpKCk7IH07Ckxvd2VyQ2FzZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAibG93ZXJjYXNlIiwgdHlwZTogTG93ZXJDYXNlUGlwZSwgcHVyZTogdHJ1ZSB9KTsKLy8KLy8gUmVnZXggYmVsb3cgbWF0Y2hlcyBhbnkgVW5pY29kZSB3b3JkIGFuZCBjb21wYXRpYmxlIHdpdGggRVM1LiBJbiBFUzIwMTggdGhlIHNhbWUgcmVzdWx0Ci8vIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyAvXHB7TH1cUyovZ3UgYW5kIGFsc28ga25vd24gYXMgVW5pY29kZSBQcm9wZXJ0eSBFc2NhcGVzCi8vIChodHRwOi8vMmFsaXR5LmNvbS8yMDE3LzA3L3JlZ2V4cC11bmljb2RlLXByb3BlcnR5LWVzY2FwZXMuaHRtbCkuIFNpbmNlIHRoZXJlIGlzIG5vCi8vIHRyYW5zcGlsYXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGRvd24gdG8gRVM1IHdpdGhvdXQgZXh0ZXJuYWwgdG9vbCwgdGhlIG9ubHkgc29sdXRpb24gaXMKLy8gdG8gdXNlIGFscmVhZHkgdHJhbnNwaWxlZCBmb3JtLiBFeGFtcGxlIGNhbiBiZSBmb3VuZCBoZXJlIC0KLy8gaHR0cHM6Ly9tb3RoZXJlZmYuaW4vcmVnZXhwdSNpbnB1dD12YXIrcmVnZXgrJTNEKy8lNUNwJTdCTCU3RC91JTNCJnVuaWNvZGVQcm9wZXJ0eUVzY2FwZT0xCi8vCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgdW5pY29kZVdvcmRNYXRjaCA9IC8oPzpbQS1aYS16XHhBQVx4QjVceEJBXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyQzFcdTAyQzYtXHUwMkQxXHUwMkUwLVx1MDJFNFx1MDJFQ1x1MDJFRVx1MDM3MC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN0EtXHUwMzdEXHUwMzdGXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0Y1XHUwM0Y3LVx1MDQ4MVx1MDQ4QS1cdTA1MkZcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4N1x1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIwLVx1MDY0QVx1MDY2RVx1MDY2Rlx1MDY3MS1cdTA2RDNcdTA2RDVcdTA2RTVcdTA2RTZcdTA2RUVcdTA2RUZcdTA2RkEtXHUwNkZDXHUwNkZGXHUwNzEwXHUwNzEyLVx1MDcyRlx1MDc0RC1cdTA3QTVcdTA3QjFcdTA3Q0EtXHUwN0VBXHUwN0Y0XHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgxNVx1MDgxQVx1MDgyNFx1MDgyOFx1MDg0MC1cdTA4NThcdTA4NjAtXHUwODZBXHUwOEEwLVx1MDhCNFx1MDhCNi1cdTA4QkRcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQVx1MEVBQlx1MEVBRC1cdTBFQjBcdTBFQjJcdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRUM2XHUwRURDLVx1MEVERlx1MEYwMFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjZDXHUwRjg4LVx1MEY4Q1x1MTAwMC1cdTEwMkFcdTEwM0ZcdTEwNTAtXHUxMDU1XHUxMDVBLVx1MTA1RFx1MTA2MVx1MTA2NVx1MTA2Nlx1MTA2RS1cdTEwNzBcdTEwNzUtXHUxMDgxXHUxMDhFXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM4MC1cdTEzOEZcdTEzQTAtXHUxM0Y1XHUxM0Y4LVx1MTNGRFx1MTQwMS1cdTE2NkNcdTE2NkYtXHUxNjdGXHUxNjgxLVx1MTY5QVx1MTZBMC1cdTE2RUFcdTE2RjEtXHUxNkY4XHUxNzAwLVx1MTcwQ1x1MTcwRS1cdTE3MTFcdTE3MjAtXHUxNzMxXHUxNzQwLVx1MTc1MVx1MTc2MC1cdTE3NkNcdTE3NkUtXHUxNzcwXHUxNzgwLVx1MTdCM1x1MTdEN1x1MTdEQ1x1MTgyMC1cdTE4NzdcdTE4ODAtXHUxODg0XHUxODg3LVx1MThBOFx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTUwLVx1MTk2RFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOUFCXHUxOUIwLVx1MTlDOVx1MUEwMC1cdTFBMTZcdTFBMjAtXHUxQTU0XHUxQUE3XHUxQjA1LVx1MUIzM1x1MUI0NS1cdTFCNEJcdTFCODMtXHUxQkEwXHUxQkFFXHUxQkFGXHUxQkJBLVx1MUJFNVx1MUMwMC1cdTFDMjNcdTFDNEQtXHUxQzRGXHUxQzVBLVx1MUM3RFx1MUM4MC1cdTFDODhcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGMVx1MUNGNVx1MUNGNlx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkMyRVx1MkMzMC1cdTJDNUVcdTJDNjAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1XHUzMDA2XHUzMDMxLVx1MzAzNVx1MzAzQlx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJFXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkFcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCNVx1NEUwMC1cdTlGRUFcdUEwMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0FFXHVBN0IwLVx1QTdCN1x1QTdGNy1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2NVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N118XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzM1x1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXXxcdUQ4MDRbXHVEQzAzLVx1REMzN1x1REM4My1cdURDQUZcdURDRDAtXHVEQ0U4XHVERDAzLVx1REQyNlx1REQ1MC1cdURENzJcdURENzZcdUREODMtXHVEREIyXHVEREMxLVx1RERDNFx1REREQVx1REREQ1x1REUwMC1cdURFMTFcdURFMTMtXHVERTJCXHVERTgwLVx1REU4Nlx1REU4OFx1REU4QS1cdURFOERcdURFOEYtXHVERTlEXHVERTlGLVx1REVBOFx1REVCMC1cdURFREVcdURGMDUtXHVERjBDXHVERjBGXHVERjEwXHVERjEzLVx1REYyOFx1REYyQS1cdURGMzBcdURGMzJcdURGMzNcdURGMzUtXHVERjM5XHVERjNEXHVERjUwXHVERjVELVx1REY2MV18XHVEODA1W1x1REMwMC1cdURDMzRcdURDNDctXHVEQzRBXHVEQzgwLVx1RENBRlx1RENDNFx1RENDNVx1RENDN1x1REQ4MC1cdUREQUVcdURERDgtXHVERERCXHVERTAwLVx1REUyRlx1REU0NFx1REU4MC1cdURFQUFcdURGMDAtXHVERjE5XXxcdUQ4MDZbXHVEQ0EwLVx1RENERlx1RENGRlx1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTgzXHVERTg2LVx1REU4OVx1REVDMC1cdURFRjhdfFx1RDgwN1tcdURDMDAtXHVEQzA4XHVEQzBBLVx1REMyRVx1REM0MFx1REM3Mi1cdURDOEZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzMFx1REQ0Nl18XHVEODA4W1x1REMwMC1cdURGOTldfFx1RDgwOVtcdURDODAtXHVERDQzXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzldW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJFXXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURGMDAtXHVERjQ0XHVERjUwXHVERjkzLVx1REY5Rlx1REZFMFx1REZFMV18XHVEODIxW1x1REMwMC1cdURGRUNdfFx1RDgyMltcdURDMDAtXHVERUYyXXxcdUQ4MkNbXHVEQzAwLVx1REQxRVx1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODNBW1x1REMwMC1cdURDQzRcdUREMDAtXHVERDQzXXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXSlcUyovZzsKLyoqCiAqIFRyYW5zZm9ybXMgdGV4dCB0byB0aXRsZSBjYXNlLgogKiBDYXBpdGFsaXplcyB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZCwgYW5kIHRyYW5zZm9ybXMgdGhlCiAqIHJlc3Qgb2YgdGhlIHdvcmQgdG8gbG93ZXIgY2FzZS4KICogV29yZHMgYXJlIGRlbGltaXRlZCBieSBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHN1Y2ggYXMgYSBzcGFjZSwgdGFiLCBvciBsaW5lLWZlZWQgY2hhcmFjdGVyLgogKgogKiBAc2VlIGBMb3dlckNhc2VQaXBlYAogKiBAc2VlIGBVcHBlckNhc2VQaXBlYAogKgogKiBcQHVzYWdlTm90ZXMKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHZhcmlvdXMgc3RyaW5ncyBpbnRvIHRpdGxlIGNhc2UuCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL3RpdGxlY2FzZV9waXBlLnRzIiByZWdpb249J1RpdGxlQ2FzZVBpcGUnPjwvY29kZS1leGFtcGxlPgogKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgVGl0bGVDYXNlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0gdG8gdGl0bGUgY2FzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoVGl0bGVDYXNlUGlwZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSh1bmljb2RlV29yZE1hdGNoLCAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0eHQgPT4gdHh0WzBdLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpKSk7CiAgICB9Cn0KVGl0bGVDYXNlUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIFRpdGxlQ2FzZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGl0bGVDYXNlUGlwZSkoKTsgfTsKVGl0bGVDYXNlUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJ0aXRsZWNhc2UiLCB0eXBlOiBUaXRsZUNhc2VQaXBlLCBwdXJlOiB0cnVlIH0pOwovKioKICogVHJhbnNmb3JtcyB0ZXh0IHRvIGFsbCB1cHBlciBjYXNlLgogKiBAc2VlIGBMb3dlckNhc2VQaXBlYAogKiBAc2VlIGBUaXRsZUNhc2VQaXBlYAogKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgVXBwZXJDYXNlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0gdG8gdXBwZXIgY2FzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoVXBwZXJDYXNlUGlwZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKICAgIH0KfQpVcHBlckNhc2VQaXBlLsm1ZmFjID0gZnVuY3Rpb24gVXBwZXJDYXNlUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBVcHBlckNhc2VQaXBlKSgpOyB9OwpVcHBlckNhc2VQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInVwcGVyY2FzZSIsIHR5cGU6IFVwcGVyQ2FzZVBpcGUsIHB1cmU6IHRydWUgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2RhdGVfcGlwZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBjbGFuZy1mb3JtYXQgb2ZmCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEZvcm1hdHMgYSBkYXRlIHZhbHVlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuCiAqCiAqIE9ubHkgdGhlIGBlbi1VU2AgbG9jYWxlIGRhdGEgY29tZXMgd2l0aCBBbmd1bGFyLiBUbyBsb2NhbGl6ZSBkYXRlcwogKiBpbiBhbm90aGVyIGxhbmd1YWdlLCB5b3UgbXVzdCBpbXBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWxlIGRhdGEuCiAqIFNlZSB0aGUgW0kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jaTE4bi1waXBlcykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqIEBzZWUgYGZvcm1hdERhdGUoKWAKICoKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSByZXN1bHQgb2YgdGhpcyBwaXBlIGlzIG5vdCByZWV2YWx1YXRlZCB3aGVuIHRoZSBpbnB1dCBpcyBtdXRhdGVkLiBUbyBhdm9pZCB0aGUgbmVlZCB0bwogKiByZWZvcm1hdCB0aGUgZGF0ZSBvbiBldmVyeSBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB0cmVhdCB0aGUgZGF0ZSBhcyBhbiBpbW11dGFibGUgb2JqZWN0CiAqIGFuZCBjaGFuZ2UgdGhlIHJlZmVyZW5jZSB3aGVuIHRoZSBwaXBlIG5lZWRzIHRvIHJ1biBhZ2Fpbi4KICoKICogIyMjIFByZS1kZWZpbmVkIGZvcm1hdCBvcHRpb25zCiAqCiAqIEV4YW1wbGVzIGFyZSBnaXZlbiBpbiBgZW4tVVNgIGxvY2FsZS4KICoKICogLSBgJ3Nob3J0J2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXksIGg6bW0gYSdgIChgNi8xNS8xNSwgOTowMyBBTWApLgogKiAtIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSwgaDptbTpzcyBhJ2AgKGBKdW4gMTUsIDIwMTUsIDk6MDM6MDEgQU1gKS4KICogLSBgJ2xvbmcnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSwgaDptbTpzcyBhIHonYCAoYEp1bmUgMTUsIDIwMTUgYXQgOTowMzowMSBBTQogKiBHTVQrMWApLgogKiAtIGAnZnVsbCdgOiBlcXVpdmFsZW50IHRvIGAnRUVFRSwgTU1NTSBkLCB5LCBoOm1tOnNzIGEgenp6eidgIChgTW9uZGF5LCBKdW5lIDE1LCAyMDE1IGF0CiAqIDk6MDM6MDEgQU0gR01UKzAxOjAwYCkuCiAqIC0gYCdzaG9ydERhdGUnYDogZXF1aXZhbGVudCB0byBgJ00vZC95eSdgIChgNi8xNS8xNWApLgogKiAtIGAnbWVkaXVtRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTU1NIGQsIHknYCAoYEp1biAxNSwgMjAxNWApLgogKiAtIGAnbG9uZ0RhdGUnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSdgIChgSnVuZSAxNSwgMjAxNWApLgogKiAtIGAnZnVsbERhdGUnYDogZXF1aXZhbGVudCB0byBgJ0VFRUUsIE1NTU0gZCwgeSdgIChgTW9uZGF5LCBKdW5lIDE1LCAyMDE1YCkuCiAqIC0gYCdzaG9ydFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW0gYSdgIChgOTowMyBBTWApLgogKiAtIGAnbWVkaXVtVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhJ2AgKGA5OjAzOjAxIEFNYCkuCiAqIC0gYCdsb25nVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhIHonYCAoYDk6MDM6MDEgQU0gR01UKzFgKS4KICogLSBgJ2Z1bGxUaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdoOm1tOnNzIGEgenp6eidgIChgOTowMzowMSBBTSBHTVQrMDE6MDBgKS4KICoKICogIyMjIEN1c3RvbSBmb3JtYXQgb3B0aW9ucwogKgogKiBZb3UgY2FuIGNvbnN0cnVjdCBhIGZvcm1hdCBzdHJpbmcgdXNpbmcgc3ltYm9scyB0byBzcGVjaWZ5IHRoZSBjb21wb25lbnRzCiAqIG9mIGEgZGF0ZS10aW1lIHZhbHVlLCBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4KICogRm9ybWF0IGRldGFpbHMgZGVwZW5kIG9uIHRoZSBsb2NhbGUuCiAqIEZpZWxkcyBtYXJrZWQgd2l0aCAoKikgYXJlIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBleHRyYSBkYXRhIHNldCBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KICoKICogIHwgRmllbGQgdHlwZSAgICAgICAgIHwgRm9ybWF0ICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAogKiAgfCBFcmEgICAgICAgICAgICAgICAgfCBHLCBHRyAmIEdHRyB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgR0dHRyAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQW5ubyBEb21pbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBZZWFyICAgICAgICAgICAgICAgfCB5ICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLCAyMCwgMjAxLCAyMDE3LCAyMDE3MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgeXkgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDIsIDIwLCAwMSwgMTcsIDczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgICAgIHwgTnVtZXJpYzogMyBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAwMiwgMDIwLCAyMDEsIDIwMTcsIDIwMTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCB5eXl5ICAgICAgICB8IE51bWVyaWM6IDQgZGlnaXRzIG9yIG1vcmUgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgfCAwMDAyLCAwMDIwLCAwMjAxLCAyMDE3LCAyMDE3MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgTW9udGggICAgICAgICAgICAgIHwgTSAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOSwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBNTU0gICAgICAgICB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTU1NTSAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VwdGVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBNb250aCBzdGFuZGFsb25lICAgfCBMICAgICAgICAgICB8IE51bWVyaWM6IDEgZGlnaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDksIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgICAgIHwgQWJicmV2aWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXB0ZW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IFdlZWsgb2YgeWVhciAgICAgICB8IHcgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEuLi4gNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCB3dyAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMS4uLiA1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgV2VlayBvZiBtb250aCAgICAgIHwgVyAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMS4uLiA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IERheSBvZiBtb250aCAgICAgICB8IGQgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBkZCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IFdlZWsgZGF5ICAgICAgICAgICB8IEUsIEVFICYgRUVFIHwgQWJicmV2aWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFR1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUdWVzZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgRUVFRUUgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEVFRUVFRSAgICAgIHwgU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFR1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBQZXJpb2QgICAgICAgICAgICAgfCBhLCBhYSAmIGFhYSB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbS9wbSBvciBBTS9QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICAgICAgfCBXaWRlIChmYWxsYmFjayB0byBgYWAgd2hlbiBtaXNzaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW50ZSBtZXJpZGllbS9wb3N0IG1lcmlkaWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBQZXJpb2QqICAgICAgICAgICAgfCBCLCBCQiAmIEJCQiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgQkJCQiAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW0sIHBtLCBtaWRuaWdodCwgbm9vbiwgbW9ybmluZywgYWZ0ZXJub29uLCBldmVuaW5nLCBuaWdodCB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEJCQkJCICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBQZXJpb2Qgc3RhbmRhbG9uZSogfCBiLCBiYiAmIGJiYiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgYmJiYiAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW0sIHBtLCBtaWRuaWdodCwgbm9vbiwgbW9ybmluZywgYWZ0ZXJub29uLCBldmVuaW5nLCBuaWdodCB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGJiYmJiICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBIb3VyIDEtMTIgICAgICAgICAgfCBoICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgaGggICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDEsIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IEhvdXIgMC0yMyAgICAgICAgICB8IEggICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAsIDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMCwgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgTWludXRlICAgICAgICAgICAgIHwgbSAgICAgICAgICAgfCBOdW1lcmljOiBtaW5pbXVtIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOCwgNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IG1tICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA4LCA1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBTZWNvbmQgICAgICAgICAgICAgfCBzICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLi4uIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgc3MgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDAuLi4gNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IEZyYWN0aW9uYWwgc2Vjb25kcyB8IFMgICAgICAgICAgIHwgTnVtZXJpYzogMSBkaWdpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuLi4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMC4uLiA5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgU1NTICAgICAgICAgfCBOdW1lcmljOiAzIGRpZ2l0cyArIHplcm8gcGFkZGVkICg9IG1pbGxpc2Vjb25kcykgICAgICAgICAgICAgIHwgMDAwLi4uIDk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IFpvbmUgICAgICAgICAgICAgICB8IHosIHp6ICYgenp6IHwgU2hvcnQgc3BlY2lmaWMgbm9uIGxvY2F0aW9uIGZvcm1hdCAoZmFsbGJhY2sgdG8gTykgICAgICAgICAgICB8IEdNVC04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgICAgICB8IExvbmcgc3BlY2lmaWMgbm9uIGxvY2F0aW9uIGZvcm1hdCAoZmFsbGJhY2sgdG8gT09PTykgICAgICAgICAgfCBHTVQtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgWiwgWlogJiBaWlogfCBJU084NjAxIGJhc2ljIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLTA4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IFpaWlogICAgICAgIHwgTG9uZyBsb2NhbGl6ZWQgR01UIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdNVC04OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBaWlpaWiAgICAgICB8IElTTzg2MDEgZXh0ZW5kZWQgZm9ybWF0ICsgWiBpbmRpY2F0b3IgZm9yIG9mZnNldCAwICg9IFhYWFhYKSAgfCAtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTywgT08gJiBPT08gfCBTaG9ydCBsb2NhbGl6ZWQgR01UIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR01ULTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE9PT08gICAgICAgIHwgTG9uZyBsb2NhbGl6ZWQgR01UIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdNVC0wODowMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKgogKiBOb3RlIHRoYXQgdGltZXpvbmUgY29ycmVjdGlvbiBpcyBub3QgYXBwbGllZCB0byBhbiBJU08gc3RyaW5nIHRoYXQgaGFzIG5vIHRpbWUgY29tcG9uZW50LCBzdWNoIGFzICIyMDE2LTA5LTE5IgogKgogKiAjIyMgRm9ybWF0IGV4YW1wbGVzCiAqCiAqIFRoZXNlIGV4YW1wbGVzIHRyYW5zZm9ybSBhIGRhdGUgaW50byB2YXJpb3VzIGZvcm1hdHMsCiAqIGFzc3VtaW5nIHRoYXQgYGRhdGVPYmpgIGlzIGEgSmF2YVNjcmlwdCBgRGF0ZWAgb2JqZWN0IGZvcgogKiB5ZWFyOiAyMDE1LCBtb250aDogNiwgZGF5OiAxNSwgaG91cjogMjEsIG1pbnV0ZTogNDMsIHNlY29uZDogMTEsCiAqIGdpdmVuIGluIHRoZSBsb2NhbCB0aW1lIGZvciB0aGUgYGVuLVVTYCBsb2NhbGUuCiAqCiAqIGBgYAogKiB7eyBkYXRlT2JqIHwgZGF0ZSB9fSAgICAgICAgICAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1JwogKiB7eyBkYXRlT2JqIHwgZGF0ZTonbWVkaXVtJyB9fSAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1LCA5OjQzOjExIFBNJwogKiB7eyBkYXRlT2JqIHwgZGF0ZTonc2hvcnRUaW1lJyB9fSAgIC8vIG91dHB1dCBpcyAnOTo0MyBQTScKICoge3sgZGF0ZU9iaiB8IGRhdGU6J21tOnNzJyB9fSAgICAgICAvLyBvdXRwdXQgaXMgJzQzOjExJwogKiBgYGAKICoKICogIyMjIFVzYWdlIGV4YW1wbGUKICoKICogVGhlIGZvbGxvd2luZyBjb21wb25lbnQgdXNlcyBhIGRhdGUgcGlwZSB0byBkaXNwbGF5IHRoZSBjdXJyZW50IGRhdGUgaW4gZGlmZmVyZW50IGZvcm1hdHMuCiAqCiAqIGBgYAogKiBcQENvbXBvbmVudCh7CiAqICBzZWxlY3RvcjogJ2RhdGUtcGlwZScsCiAqICB0ZW1wbGF0ZTogYDxkaXY+CiAqICAgIDxwPlRvZGF5IGlzIHt7dG9kYXkgfCBkYXRlfX08L3A+CiAqICAgIDxwPk9yIGlmIHlvdSBwcmVmZXIsIHt7dG9kYXkgfCBkYXRlOidmdWxsRGF0ZSd9fTwvcD4KICogICAgPHA+VGhlIHRpbWUgaXMge3t0b2RheSB8IGRhdGU6J2g6bW0gYSB6J319PC9wPgogKiAgPC9kaXY+YAogKiB9KQogKiAvLyBHZXQgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcyBhIGRhdGUtdGltZSB2YWx1ZS4KICogZXhwb3J0IGNsYXNzIERhdGVQaXBlQ29tcG9uZW50IHsKICogICB0b2RheTogbnVtYmVyID0gRGF0ZS5ub3coKTsKICogfQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICovCi8vIGNsYW5nLWZvcm1hdCBvbgpjbGFzcyBEYXRlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGxvY2FsZSkgewogICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBkYXRlIGV4cHJlc3Npb246IGEgYERhdGVgIG9iamVjdCwgIGEgbnVtYmVyCiAgICAgKiAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaCksIG9yIGFuIElTTyBzdHJpbmcgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lKS4KICAgICAqIEBwYXJhbSB7Pz19IGZvcm1hdCBUaGUgZGF0ZS90aW1lIGNvbXBvbmVudHMgdG8gaW5jbHVkZSwgdXNpbmcgcHJlZGVmaW5lZCBvcHRpb25zIG9yIGEKICAgICAqIGN1c3RvbSBmb3JtYXQgc3RyaW5nLgogICAgICogQHBhcmFtIHs/PX0gdGltZXpvbmUgQSB0aW1lem9uZSBvZmZzZXQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwgb3IgYSBzdGFuZGFyZAogICAgICogVVRDL0dNVCBvciBjb250aW5lbnRhbCBVUyB0aW1lem9uZSBhYmJyZXZpYXRpb24uCiAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgZW5kLXVzZXIncyBsb2NhbCBzeXN0ZW0gdGltZXpvbmUuCiAgICAgKiBAcGFyYW0gez89fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogV2hlbiBub3Qgc3VwcGxpZWQsIHVzZXMgdGhlIHZhbHVlIG9mIGBMT0NBTEVfSURgLCB3aGljaCBpcyBgZW4tVVNgIGJ5IGRlZmF1bHQuCiAgICAgKiBTZWUgW1NldHRpbmcgeW91ciBhcHAgbG9jYWxlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGRhdGUgc3RyaW5nIGluIHRoZSBkZXNpcmVkIGZvcm1hdC4KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBmb3JtYXQgPSAnbWVkaXVtRGF0ZScsIHRpbWV6b25lLCBsb2NhbGUpIHsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh2YWx1ZSwgZm9ybWF0LCBsb2NhbGUgfHwgdGhpcy5sb2NhbGUsIHRpbWV6b25lKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihEYXRlUGlwZSwgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgfQogICAgfQp9CkRhdGVQaXBlLsm1ZmFjID0gZnVuY3Rpb24gRGF0ZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGF0ZVBpcGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTE9DQUxFX0lEJDEpKTsgfTsKRGF0ZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAiZGF0ZSIsIHR5cGU6IERhdGVQaXBlLCBwdXJlOiB0cnVlIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRGF0ZVBpcGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTE9DQUxFX0lEJDEsXSB9XSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2kxOG5fcGx1cmFsX3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfSU5URVJQT0xBVElPTl9SRUdFWFAgPSAvIy9nOwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBNYXBzIGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBwbHVyYWxpemVzIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEV4YW1wbGUKICoKICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvaTE4bl9waXBlLnRzIHJlZ2lvbj0nSTE4blBsdXJhbFBpcGVDb21wb25lbnQnfQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSTE4blBsdXJhbFBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9sb2NhbGl6YXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IoX2xvY2FsaXphdGlvbikgewogICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbiA9IF9sb2NhbGl6YXRpb247CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQKICAgICAqIEBwYXJhbSB7P30gcGx1cmFsTWFwIGFuIG9iamVjdCB0aGF0IG1pbWljcyB0aGUgSUNVIGZvcm1hdCwgc2VlCiAgICAgKiBodHRwOi8vdXNlcmd1aWRlLmljdS1wcm9qZWN0Lm9yZy9mb3JtYXRwYXJzZS9tZXNzYWdlcy4KICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsZSBhIGBzdHJpbmdgIGRlZmluaW5nIHRoZSBsb2NhbGUgdG8gdXNlICh1c2VzIHRoZSBjdXJyZW50IHtcQGxpbmsgTE9DQUxFX0lEfSBieQogICAgICogZGVmYXVsdCkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmFuc2Zvcm0odmFsdWUsIHBsdXJhbE1hcCwgbG9jYWxlKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICBpZiAodHlwZW9mIHBsdXJhbE1hcCAhPT0gJ29iamVjdCcgfHwgcGx1cmFsTWFwID09PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihJMThuUGx1cmFsUGlwZSwgcGx1cmFsTWFwKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IGdldFBsdXJhbENhdGVnb3J5KHZhbHVlLCBPYmplY3Qua2V5cyhwbHVyYWxNYXApLCB0aGlzLl9sb2NhbGl6YXRpb24sIGxvY2FsZSk7CiAgICAgICAgcmV0dXJuIHBsdXJhbE1hcFtrZXldLnJlcGxhY2UoX0lOVEVSUE9MQVRJT05fUkVHRVhQLCB2YWx1ZS50b1N0cmluZygpKTsKICAgIH0KfQpJMThuUGx1cmFsUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIEkxOG5QbHVyYWxQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEkxOG5QbHVyYWxQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nTG9jYWxpemF0aW9uKSk7IH07CkkxOG5QbHVyYWxQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogImkxOG5QbHVyYWwiLCB0eXBlOiBJMThuUGx1cmFsUGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkkxOG5QbHVyYWxQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBOZ0xvY2FsaXphdGlvbiB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2kxOG5fc2VsZWN0X3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAZGVzY3JpcHRpb24KICoKICogR2VuZXJpYyBzZWxlY3RvciB0aGF0IGRpc3BsYXlzIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHZhbHVlLgogKgogKiBJZiBub25lIG9mIHRoZSBrZXlzIG9mIHRoZSBgbWFwcGluZ2AgbWF0Y2ggdGhlIGB2YWx1ZWAsIHRoZW4gdGhlIGNvbnRlbnQKICogb2YgdGhlIGBvdGhlcmAga2V5IGlzIHJldHVybmVkIHdoZW4gcHJlc2VudCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2kxOG5fcGlwZS50cyByZWdpb249J0kxOG5TZWxlY3RQaXBlQ29tcG9uZW50J30KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEkxOG5TZWxlY3RQaXBlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBhIHN0cmluZyB0byBiZSBpbnRlcm5hdGlvbmFsaXplZC4KICAgICAqIEBwYXJhbSB7P30gbWFwcGluZyBhbiBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgdGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkCiAgICAgKiBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiB0aGUgcHJvdmlkZWQgYHZhbHVlYC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSwgbWFwcGluZykgewogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihJMThuU2VsZWN0UGlwZSwgbWFwcGluZyk7CiAgICAgICAgfQogICAgICAgIGlmIChtYXBwaW5nLmhhc093blByb3BlcnR5KHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbWFwcGluZ1t2YWx1ZV07CiAgICAgICAgfQogICAgICAgIGlmIChtYXBwaW5nLmhhc093blByb3BlcnR5KCdvdGhlcicpKSB7CiAgICAgICAgICAgIHJldHVybiBtYXBwaW5nWydvdGhlciddOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9Cn0KSTE4blNlbGVjdFBpcGUuybVmYWMgPSBmdW5jdGlvbiBJMThuU2VsZWN0UGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBJMThuU2VsZWN0UGlwZSkoKTsgfTsKSTE4blNlbGVjdFBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAiaTE4blNlbGVjdCIsIHR5cGU6IEkxOG5TZWxlY3RQaXBlLCBwdXJlOiB0cnVlIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9qc29uX3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAZGVzY3JpcHRpb24KICoKICogQ29udmVydHMgYSB2YWx1ZSBpbnRvIGl0cyBKU09OLWZvcm1hdCByZXByZXNlbnRhdGlvbi4gIFVzZWZ1bCBmb3IgZGVidWdnaW5nLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGZvbGxvd2luZyBjb21wb25lbnQgdXNlcyBhIEpTT04gcGlwZSB0byBjb252ZXJ0IGFuIG9iamVjdAogKiB0byBKU09OIGZvcm1hdCwgYW5kIGRpc3BsYXlzIHRoZSBzdHJpbmcgaW4gYm90aCBmb3JtYXRzIGZvciBjb21wYXJpc29uLgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9waXBlcy90cy9qc29uX3BpcGUudHMgcmVnaW9uPSdKc29uUGlwZSd9CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBKc29uUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgQSB2YWx1ZSBvZiBhbnkgdHlwZSB0byBjb252ZXJ0IGludG8gYSBKU09OLWZvcm1hdCBzdHJpbmcuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmFuc2Zvcm0odmFsdWUpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpOwogICAgfQp9Ckpzb25QaXBlLsm1ZmFjID0gZnVuY3Rpb24gSnNvblBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSnNvblBpcGUpKCk7IH07Ckpzb25QaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogImpzb24iLCB0eXBlOiBKc29uUGlwZSwgcHVyZTogZmFsc2UgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2tleXZhbHVlX3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEB0ZW1wbGF0ZSBLLCBWCiAqIEBwYXJhbSB7P30ga2V5CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1ha2VLZXlWYWx1ZVBhaXIoa2V5LCB2YWx1ZSkgewogICAgcmV0dXJuIHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9Owp9Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIFRyYW5zZm9ybXMgT2JqZWN0IG9yIE1hcCBpbnRvIGFuIGFycmF5IG9mIGtleSB2YWx1ZSBwYWlycy4KICoKICogVGhlIG91dHB1dCBhcnJheSB3aWxsIGJlIG9yZGVyZWQgYnkga2V5cy4KICogQnkgZGVmYXVsdCB0aGUgY29tcGFyYXRvciB3aWxsIGJlIGJ5IFVuaWNvZGUgcG9pbnQgdmFsdWUuCiAqIFlvdSBjYW4gb3B0aW9uYWxseSBwYXNzIGEgY29tcGFyZUZuIGlmIHlvdXIga2V5cyBhcmUgY29tcGxleCB0eXBlcy4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlcwogKgogKiBUaGlzIGV4YW1wbGVzIHNob3cgaG93IGFuIE9iamVjdCBvciBhIE1hcCBjYW4gYmUgaXRlcmF0ZWQgYnkgbmdGb3Igd2l0aCB0aGUgdXNlIG9mIHRoaXMga2V5dmFsdWUKICogcGlwZS4KICoKICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMva2V5dmFsdWVfcGlwZS50cyByZWdpb249J0tleVZhbHVlUGlwZSd9CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBLZXlWYWx1ZVBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRpZmZlcnMKICAgICAqLwogICAgY29uc3RydWN0b3IoZGlmZmVycykgewogICAgICAgIHRoaXMuZGlmZmVycyA9IGRpZmZlcnM7CiAgICAgICAgdGhpcy5rZXlWYWx1ZXMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIEssIFYKICAgICAqIEBwYXJhbSB7P30gaW5wdXQKICAgICAqIEBwYXJhbSB7Pz19IGNvbXBhcmVGbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKGlucHV0LCBjb21wYXJlRm4gPSBkZWZhdWx0Q29tcGFyYXRvcikgewogICAgICAgIGlmICghaW5wdXQgfHwgKCEoaW5wdXQgaW5zdGFuY2VvZiBNYXApICYmIHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZGlmZmVyKSB7CiAgICAgICAgICAgIC8vIG1ha2UgYSBkaWZmZXIgZm9yIHdoYXRldmVyIHR5cGUgd2UndmUgYmVlbiBwYXNzZWQgaW4KICAgICAgICAgICAgdGhpcy5kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChpbnB1dCkuY3JlYXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaWZmZXJDaGFuZ2VzID0gdGhpcy5kaWZmZXIuZGlmZigoLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpKSk7CiAgICAgICAgaWYgKGRpZmZlckNoYW5nZXMpIHsKICAgICAgICAgICAgdGhpcy5rZXlWYWx1ZXMgPSBbXTsKICAgICAgICAgICAgZGlmZmVyQ2hhbmdlcy5mb3JFYWNoSXRlbSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHIpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMua2V5VmFsdWVzLnB1c2gobWFrZUtleVZhbHVlUGFpcihyLmtleSwgKC8qKiBAdHlwZSB7P30gKi8gKHIuY3VycmVudFZhbHVlKSkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLmtleVZhbHVlcy5zb3J0KGNvbXBhcmVGbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmtleVZhbHVlczsKICAgIH0KfQpLZXlWYWx1ZVBpcGUuybVmYWMgPSBmdW5jdGlvbiBLZXlWYWx1ZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgS2V5VmFsdWVQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEtleVZhbHVlRGlmZmVycykpOyB9OwpLZXlWYWx1ZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAia2V5dmFsdWUiLCB0eXBlOiBLZXlWYWx1ZVBpcGUsIHB1cmU6IGZhbHNlIH0pOwovKiogQG5vY29sbGFwc2UgKi8KS2V5VmFsdWVQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBLZXlWYWx1ZURpZmZlcnMgfQpdOwovKioKICogQHRlbXBsYXRlIEssIFYKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUEKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGtleVZhbHVlQSwga2V5VmFsdWVCKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhID0ga2V5VmFsdWVBLmtleTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGIgPSBrZXlWYWx1ZUIua2V5OwogICAgLy8gaWYgc2FtZSBleGl0IHdpdGggMDsKICAgIGlmIChhID09PSBiKQogICAgICAgIHJldHVybiAwOwogICAgLy8gbWFrZSBzdXJlIHRoYXQgdW5kZWZpbmVkIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzb3J0LgogICAgaWYgKGEgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChiID09PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIC0xOwogICAgLy8gbWFrZSBzdXJlIHRoYXQgbnVsbHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNvcnQuCiAgICBpZiAoYSA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChiID09PSBudWxsKQogICAgICAgIHJldHVybiAtMTsKICAgIGlmICh0eXBlb2YgYSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgYiA9PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYSA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYiA9PSAnbnVtYmVyJykgewogICAgICAgIHJldHVybiBhIC0gYjsKICAgIH0KICAgIGlmICh0eXBlb2YgYSA9PSAnYm9vbGVhbicgJiYgdHlwZW9mIGIgPT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxOwogICAgfQogICAgLy8gYGFgIGFuZCBgYmAgYXJlIG9mIGRpZmZlcmVudCB0eXBlcy4gQ29tcGFyZSB0aGVpciBzdHJpbmcgdmFsdWVzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYVN0cmluZyA9IFN0cmluZyhhKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJTdHJpbmcgPSBTdHJpbmcoYik7CiAgICByZXR1cm4gYVN0cmluZyA9PSBiU3RyaW5nID8gMCA6IGFTdHJpbmcgPCBiU3RyaW5nID8gLTEgOiAxOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL251bWJlcl9waXBlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIFRyYW5zZm9ybXMgYSBudW1iZXIgaW50byBhIHN0cmluZywKICogZm9ybWF0dGVkIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMgdGhhdCBkZXRlcm1pbmUgZ3JvdXAgc2l6aW5nIGFuZAogKiBzZXBhcmF0b3IsIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljCiAqIGNvbmZpZ3VyYXRpb25zLgogKgogKiBJZiBubyBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiByb3VuZHMgb2ZmIHRvIHRoZSBuZWFyZXN0IHZhbHVlIHVzaW5nIHRoaXMKICogW3JvdW5kaW5nIG1ldGhvZF0oaHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvQXJpdGhtZXRpYy9Sb3VuZGluZykuCiAqIFRoZSBiZWhhdmlvciBkaWZmZXJzIGZyb20gdGhhdCBvZiB0aGUgSmF2YVNjcmlwdCBgYGBNYXRoLnJvdW5kKClgYGAgZnVuY3Rpb24uCiAqIEluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZSwgdGhlIHBpcGUgcm91bmRzIGRvd24gd2hlcmUKICogYGBgTWF0aC5yb3VuZCgpYGBgIHJvdW5kcyB1cDoKICoKICogYGBgaHRtbAogKiAtMi41IHwgbnVtYmVyOicxLjAtMCcKICogPiAtMwogKiBNYXRoLnJvdW5kKC0yLjUpCiAqID4gLTIKICogYGBgCiAqCiAqIEBzZWUgYGZvcm1hdE51bWJlcigpYAogKgogKiBcQHVzYWdlTm90ZXMKICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnMKICogaW50byB0ZXh0IHN0cmluZ3MsIGFjY29yZGluZyB0byB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKICogd2hlcmUgdGhlIGNhbGxlcidzIGRlZmF1bHQgbG9jYWxlIGlzIGBlbi1VU2AuCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL251bWJlcl9waXBlLnRzIiByZWdpb249J051bWJlclBpcGUnPjwvY29kZS1leGFtcGxlPgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgRGVjaW1hbFBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9sb2NhbGUKICAgICAqLwogICAgY29uc3RydWN0b3IoX2xvY2FsZSkgewogICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCiAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCiAgICAgKiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDo8YnI+CiAgICAgKiA8Y29kZT57bWluSW50ZWdlckRpZ2l0c30ue21pbkZyYWN0aW9uRGlnaXRzfS17bWF4RnJhY3Rpb25EaWdpdHN9PC9jb2RlPi4KICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgKiBEZWZhdWx0IGlzIGAxYC4KICAgICAqICAgLSBgbWluRnJhY3Rpb25EaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICogRGVmYXVsdCBpcyBgMGAuCiAgICAgKiAgIC0gYG1heEZyYWN0aW9uRGlnaXRzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAqIERlZmF1bHQgaXMgYDNgLgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LgogICAgICogU2VlIFtTZXR0aW5nIHlvdXIgYXBwIGxvY2FsZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBkaWdpdHNJbmZvLCBsb2NhbGUpIHsKICAgICAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGxvY2FsZSA9IGxvY2FsZSB8fCB0aGlzLl9sb2NhbGU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBmb3JtYXROdW1iZXIobnVtLCBsb2NhbGUsIGRpZ2l0c0luZm8pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKERlY2ltYWxQaXBlLCBlcnJvci5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9Cn0KRGVjaW1hbFBpcGUuybVmYWMgPSBmdW5jdGlvbiBEZWNpbWFsUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWNpbWFsUGlwZSkoybXJtWRpcmVjdGl2ZUluamVjdChMT0NBTEVfSUQkMSkpOyB9OwpEZWNpbWFsUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJudW1iZXIiLCB0eXBlOiBEZWNpbWFsUGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkRlY2ltYWxQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0xPQ0FMRV9JRCQxLF0gfV0gfQpdOwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgcGVyY2VudGFnZQogKiBzdHJpbmcsIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzIHRoYXQgZGV0ZXJtaW5lIGdyb3VwIHNpemluZyBhbmQKICogc2VwYXJhdG9yLCBkZWNpbWFsLXBvaW50IGNoYXJhY3RlciwgYW5kIG90aGVyIGxvY2FsZS1zcGVjaWZpYwogKiBjb25maWd1cmF0aW9ucy4KICoKICogQHNlZSBgZm9ybWF0UGVyY2VudCgpYAogKgogKiBcQHVzYWdlTm90ZXMKICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnMKICogaW50byB0ZXh0IHN0cmluZ3MsIGFjY29yZGluZyB0byB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKICogd2hlcmUgdGhlIGNhbGxlcidzIGRlZmF1bHQgbG9jYWxlIGlzIGBlbi1VU2AuCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL3BlcmNlbnRfcGlwZS50cyIgcmVnaW9uPSdQZXJjZW50UGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBQZXJjZW50UGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2xvY2FsZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfbG9jYWxlKSB7CiAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQgYXMgYSBwZXJjZW50YWdlLgogICAgICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbyBEZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9wdGlvbnMsIHNwZWNpZmllZCBieSBhIHN0cmluZwogICAgICogaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6PGJyPgogICAgICogPGNvZGU+e21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfTwvY29kZT4uCiAgICAgKiAgIC0gYG1pbkludGVnZXJEaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICogRGVmYXVsdCBpcyBgMWAuCiAgICAgKiAgIC0gYG1pbkZyYWN0aW9uRGlnaXRzYDogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAqIERlZmF1bHQgaXMgYDBgLgogICAgICogICAtIGBtYXhGcmFjdGlvbkRpZ2l0c2A6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgKiBEZWZhdWx0IGlzIGAwYC4KICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgdmFsdWUgb2YgYExPQ0FMRV9JRGAsIHdoaWNoIGlzIGBlbi1VU2AgYnkgZGVmYXVsdC4KICAgICAqIFNlZSBbU2V0dGluZyB5b3VyIGFwcCBsb2NhbGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC10aGUtbG9jYWxlLW9mLXlvdXItYXBwKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSwgZGlnaXRzSW5mbywgbG9jYWxlKSB7CiAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5fbG9jYWxlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnVtID0gc3RyVG9OdW1iZXIodmFsdWUpOwogICAgICAgICAgICByZXR1cm4gZm9ybWF0UGVyY2VudChudW0sIGxvY2FsZSwgZGlnaXRzSW5mbyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoUGVyY2VudFBpcGUsIGVycm9yLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0KfQpQZXJjZW50UGlwZS7JtWZhYyA9IGZ1bmN0aW9uIFBlcmNlbnRQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSk7IH07ClBlcmNlbnRQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInBlcmNlbnQiLCB0eXBlOiBQZXJjZW50UGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovClBlcmNlbnRQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0xPQ0FMRV9JRCQxLF0gfV0gfQpdOwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgY3VycmVuY3kgc3RyaW5nLCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcwogKiB0aGF0IGRldGVybWluZSBncm91cCBzaXppbmcgYW5kIHNlcGFyYXRvciwgZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIsCiAqIGFuZCBvdGhlciBsb2NhbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuCiAqCiAqIHtcQGEgY3VycmVuY3ktY29kZS1kZXByZWNhdGlvbn0KICogPGRpdiBjbGFzcz0iYWxlcnQgaXMtaGVscGZ1bCI+CiAqCiAqICoqRGVwcmVjYXRpb24gbm90aWNlOioqCiAqCiAqIFRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgaXMgY3VycmVudGx5IGFsd2F5cyBgVVNEYCBidXQgdGhpcyBpcyBkZXByZWNhdGVkIGZyb20gdjkuCiAqCiAqICoqSW4gdjExIHRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IGxvY2FsZSBpZGVudGlmaWVkIGJ5CiAqIHRoZSBgTE9DQUxfSURgIHRva2VuLiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkgZm9yCiAqIG1vcmUgaW5mb3JtYXRpb24uKioKICoKICogSWYgeW91IG5lZWQgdGhlIHByZXZpb3VzIGJlaGF2aW9yIHRoZW4gc2V0IGl0IGJ5IGNyZWF0aW5nIGEgYERFRkFVTFRfQ1VSUkVOQ1lfQ09ERWAgcHJvdmlkZXIgaW4KICogeW91ciBhcHBsaWNhdGlvbiBgTmdNb2R1bGVgOgogKgogKiBgYGB0cwogKiB7cHJvdmlkZTogREVGQVVMVF9DVVJSRU5DWV9DT0RFLCB1c2VWYWx1ZTogJ1VTRCd9CiAqIGBgYAogKgogKiA8L2Rpdj4KICoKICogQHNlZSBgZ2V0Q3VycmVuY3lTeW1ib2woKWAKICogQHNlZSBgZm9ybWF0Q3VycmVuY3koKWAKICoKICogXEB1c2FnZU5vdGVzCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdGhlIHBpcGUgdHJhbnNmb3JtcyBudW1iZXJzCiAqIGludG8gdGV4dCBzdHJpbmdzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsCiAqIHdoZXJlIHRoZSBjYWxsZXIncyBkZWZhdWx0IGxvY2FsZSBpcyBgZW4tVVNgLgogKgogKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvbW1vbi9waXBlcy90cy9jdXJyZW5jeV9waXBlLnRzIiByZWdpb249J0N1cnJlbmN5UGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBDdXJyZW5jeVBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9sb2NhbGUKICAgICAqIEBwYXJhbSB7Pz19IF9kZWZhdWx0Q3VycmVuY3lDb2RlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9sb2NhbGUsIF9kZWZhdWx0Q3VycmVuY3lDb2RlID0gJ1VTRCcpIHsKICAgICAgICB0aGlzLl9sb2NhbGUgPSBfbG9jYWxlOwogICAgICAgIHRoaXMuX2RlZmF1bHRDdXJyZW5jeUNvZGUgPSBfZGVmYXVsdEN1cnJlbmN5Q29kZTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQgYXMgY3VycmVuY3kuCiAgICAgKiBAcGFyYW0gez89fSBjdXJyZW5jeUNvZGUgVGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpIGN1cnJlbmN5IGNvZGUsCiAgICAgKiBzdWNoIGFzIGBVU0RgIGZvciB0aGUgVVMgZG9sbGFyIGFuZCBgRVVSYCBmb3IgdGhlIGV1cm8uIFRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgY2FuIGJlCiAgICAgKiBjb25maWd1cmVkIHVzaW5nIHRoZSBgREVGQVVMVF9DVVJSRU5DWV9DT0RFYCBpbmplY3Rpb24gdG9rZW4uCiAgICAgKiBAcGFyYW0gez89fSBkaXNwbGF5IFRoZSBmb3JtYXQgZm9yIHRoZSBjdXJyZW5jeSBpbmRpY2F0b3IuIE9uZSBvZiB0aGUgZm9sbG93aW5nOgogICAgICogICAtIGBjb2RlYDogU2hvdyB0aGUgY29kZSAoc3VjaCBhcyBgVVNEYCkuCiAgICAgKiAgIC0gYHN5bWJvbGAoZGVmYXVsdCk6IFNob3cgdGhlIHN5bWJvbCAoc3VjaCBhcyBgJGApLgogICAgICogICAtIGBzeW1ib2wtbmFycm93YDogVXNlIHRoZSBuYXJyb3cgc3ltYm9sIGZvciBsb2NhbGVzIHRoYXQgaGF2ZSB0d28gc3ltYm9scyBmb3IgdGhlaXIKICAgICAqIGN1cnJlbmN5LgogICAgICogRm9yIGV4YW1wbGUsIHRoZSBDYW5hZGlhbiBkb2xsYXIgQ0FEIGhhcyB0aGUgc3ltYm9sIGBDQSRgIGFuZCB0aGUgc3ltYm9sLW5hcnJvdyBgJGAuIElmIHRoZQogICAgICogbG9jYWxlIGhhcyBubyBuYXJyb3cgc3ltYm9sLCB1c2VzIHRoZSBzdGFuZGFyZCBzeW1ib2wgZm9yIHRoZSBsb2NhbGUuCiAgICAgKiAgIC0gU3RyaW5nOiBVc2UgdGhlIGdpdmVuIHN0cmluZyB2YWx1ZSBpbnN0ZWFkIG9mIGEgY29kZSBvciBhIHN5bWJvbC4KICAgICAqIEZvciBleGFtcGxlLCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBzdXBwcmVzcyB0aGUgY3VycmVuY3kgJiBzeW1ib2wuCiAgICAgKiAgIC0gQm9vbGVhbiAobWFya2VkIGRlcHJlY2F0ZWQgaW4gdjUpOiBgdHJ1ZWAgZm9yIHN5bWJvbCBhbmQgZmFsc2UgZm9yIGBjb2RlYC4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCiAgICAgKiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDo8YnI+CiAgICAgKiA8Y29kZT57bWluSW50ZWdlckRpZ2l0c30ue21pbkZyYWN0aW9uRGlnaXRzfS17bWF4RnJhY3Rpb25EaWdpdHN9PC9jb2RlPi4KICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgKiBEZWZhdWx0IGlzIGAxYC4KICAgICAqICAgLSBgbWluRnJhY3Rpb25EaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICogRGVmYXVsdCBpcyBgMmAuCiAgICAgKiAgIC0gYG1heEZyYWN0aW9uRGlnaXRzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAqIERlZmF1bHQgaXMgYDJgLgogICAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgbnVtYmVyIHdpbGwgYmUgZm9ybWF0dGVkIHdpdGggdGhlIHByb3BlciBhbW91bnQgb2YgZGlnaXRzLAogICAgICogZGVwZW5kaW5nIG9uIHdoYXQgdGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpIHNwZWNpZmllcy4KICAgICAqIEZvciBleGFtcGxlLCB0aGUgQ2FuYWRpYW4gZG9sbGFyIGhhcyAyIGRpZ2l0cywgd2hlcmVhcyB0aGUgQ2hpbGVhbiBwZXNvIGhhcyBub25lLgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LgogICAgICogU2VlIFtTZXR0aW5nIHlvdXIgYXBwIGxvY2FsZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBjdXJyZW5jeUNvZGUsIGRpc3BsYXkgPSAnc3ltYm9sJywgZGlnaXRzSW5mbywgbG9jYWxlKSB7CiAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5fbG9jYWxlOwogICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgIGlmICgoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZSkpICYmICgvKiogQHR5cGUgez99ICovIChjb25zb2xlLndhcm4pKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiB0aGUgY3VycmVuY3kgcGlwZSBoYXMgYmVlbiBjaGFuZ2VkIGluIEFuZ3VsYXIgdjUuIFRoZSBzeW1ib2xEaXNwbGF5IG9wdGlvbiAodGhpcmQgcGFyYW1ldGVyKSBpcyBub3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGJvb2xlYW4uIFRoZSBhY2NlcHRlZCB2YWx1ZXMgYXJlICJjb2RlIiwgInN5bWJvbCIgb3IgInN5bWJvbC1uYXJyb3ciLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpc3BsYXkgPSBkaXNwbGF5ID8gJ3N5bWJvbCcgOiAnY29kZSc7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY3VycmVuY3kgPSBjdXJyZW5jeUNvZGUgfHwgdGhpcy5fZGVmYXVsdEN1cnJlbmN5Q29kZTsKICAgICAgICBpZiAoZGlzcGxheSAhPT0gJ2NvZGUnKSB7CiAgICAgICAgICAgIGlmIChkaXNwbGF5ID09PSAnc3ltYm9sJyB8fCBkaXNwbGF5ID09PSAnc3ltYm9sLW5hcnJvdycpIHsKICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gZ2V0Q3VycmVuY3lTeW1ib2woY3VycmVuY3ksIGRpc3BsYXkgPT09ICdzeW1ib2wnID8gJ3dpZGUnIDogJ25hcnJvdycsIGxvY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJyZW5jeSA9IGRpc3BsYXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeShudW0sIGxvY2FsZSwgY3VycmVuY3ksIGN1cnJlbmN5Q29kZSwgZGlnaXRzSW5mbyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoQ3VycmVuY3lQaXBlLCBlcnJvci5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9Cn0KQ3VycmVuY3lQaXBlLsm1ZmFjID0gZnVuY3Rpb24gQ3VycmVuY3lQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEN1cnJlbmN5UGlwZSkoybXJtWRpcmVjdGl2ZUluamVjdChMT0NBTEVfSUQkMSksIMm1ybVkaXJlY3RpdmVJbmplY3QoREVGQVVMVF9DVVJSRU5DWV9DT0RFKSk7IH07CkN1cnJlbmN5UGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJjdXJyZW5jeSIsIHR5cGU6IEN1cnJlbmN5UGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkN1cnJlbmN5UGlwZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbREVGQVVMVF9DVVJSRU5DWV9DT0RFLF0gfV0gfQpdOwovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlICE9PSB2YWx1ZTsKfQovKioKICogVHJhbnNmb3JtcyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyIChpZiBuZWVkZWQpLgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdHJUb051bWJlcih2YWx1ZSkgewogICAgLy8gQ29udmVydCBzdHJpbmdzIHRvIG51bWJlcnMKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihOdW1iZXIodmFsdWUpIC0gcGFyc2VGbG9hdCh2YWx1ZSkpKSB7CiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7CiAgICB9CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgbnVtYmVyYCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcGlwZXMvc2xpY2VfcGlwZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBDcmVhdGVzIGEgbmV3IGBBcnJheWAgb3IgYFN0cmluZ2AgY29udGFpbmluZyBhIHN1YnNldCAoc2xpY2UpIG9mIHRoZSBlbGVtZW50cy4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIEFsbCBiZWhhdmlvciBpcyBiYXNlZCBvbiB0aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIEphdmFTY3JpcHQgQVBJIGBBcnJheS5wcm90b3R5cGUuc2xpY2UoKWAKICogYW5kIGBTdHJpbmcucHJvdG90eXBlLnNsaWNlKClgLgogKgogKiBXaGVuIG9wZXJhdGluZyBvbiBhbiBgQXJyYXlgLCB0aGUgcmV0dXJuZWQgYEFycmF5YCBpcyBhbHdheXMgYSBjb3B5IGV2ZW4gd2hlbiBhbGwKICogdGhlIGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5lZC4KICoKICogV2hlbiBvcGVyYXRpbmcgb24gYSBibGFuayB2YWx1ZSwgdGhlIHBpcGUgcmV0dXJucyB0aGUgYmxhbmsgdmFsdWUuCiAqCiAqICMjIyBMaXN0IEV4YW1wbGUKICoKICogVGhpcyBgbmdGb3JgIGV4YW1wbGU6CiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL3NsaWNlX3BpcGUudHMgcmVnaW9uPSdTbGljZVBpcGVfbGlzdCd9CiAqCiAqIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmc6CiAqCiAqIGBgYGh0bWwKICogPGxpPmI8L2xpPgogKiA8bGk+YzwvbGk+CiAqIGBgYAogKgogKiAjIyMgU3RyaW5nIEV4YW1wbGVzCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL3NsaWNlX3BpcGUudHMgcmVnaW9uPSdTbGljZVBpcGVfc3RyaW5nJ30KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFNsaWNlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7P30gc3RhcnQKICAgICAqIEBwYXJhbSB7Pz19IGVuZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBzdGFydCwgZW5kKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHModmFsdWUpKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihTbGljZVBpcGUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzKG9iaikgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KG9iaik7CiAgICB9Cn0KU2xpY2VQaXBlLsm1ZmFjID0gZnVuY3Rpb24gU2xpY2VQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNsaWNlUGlwZSkoKTsgfTsKU2xpY2VQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInNsaWNlIiwgdHlwZTogU2xpY2VQaXBlLCBwdXJlOiBmYWxzZSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvY29tbW9uX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBOb3RlOiBUaGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGxvY2F0aW9uIHByb3ZpZGVycywKLy8gYXMgdGhleSBuZWVkIHNvbWUgcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHRvIHdvcmsuCi8qKgogKiBFeHBvcnRzIGFsbCB0aGUgYmFzaWMgQW5ndWxhciBkaXJlY3RpdmVzIGFuZCBwaXBlcywKICogc3VjaCBhcyBgTmdJZmAsIGBOZ0Zvck9mYCwgYERlY2ltYWxQaXBlYCwgYW5kIHNvIG9uLgogKiBSZS1leHBvcnRlZCBieSBgQnJvd3Nlck1vZHVsZWAsIHdoaWNoIGlzIGluY2x1ZGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIHJvb3QKICogYEFwcE1vZHVsZWAgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcCB3aXRoIHRoZSBDTEkgYG5ld2AgY29tbWFuZC4KICoKICogKiBUaGUgYHByb3ZpZGVyc2Agb3B0aW9ucyBjb25maWd1cmUgdGhlIE5nTW9kdWxlJ3MgaW5qZWN0b3IgdG8gcHJvdmlkZQogKiBsb2NhbGl6YXRpb24gZGVwZW5kZW5jaWVzIHRvIG1lbWJlcnMuCiAqICogVGhlIGBleHBvcnRzYCBvcHRpb25zIG1ha2UgdGhlIGRlY2xhcmVkIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGF2YWlsYWJsZSBmb3IgaW1wb3J0CiAqIGJ5IG90aGVyIE5nTW9kdWxlcy4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIENvbW1vbk1vZHVsZSB7Cn0KQ29tbW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQ29tbW9uTW9kdWxlIH0pOwpDb21tb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBDb21tb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29tbW9uTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICB7IHByb3ZpZGU6IE5nTG9jYWxpemF0aW9uLCB1c2VDbGFzczogTmdMb2NhbGVMb2NhbGl6YXRpb24gfSwKICAgIF0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKENvbW1vbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtOZ0NsYXNzLAogICAgICAgIE5nQ29tcG9uZW50T3V0bGV0LAogICAgICAgIE5nRm9yT2YsCiAgICAgICAgTmdJZiwKICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LAogICAgICAgIE5nU3R5bGUsCiAgICAgICAgTmdTd2l0Y2gsCiAgICAgICAgTmdTd2l0Y2hDYXNlLAogICAgICAgIE5nU3dpdGNoRGVmYXVsdCwKICAgICAgICBOZ1BsdXJhbCwKICAgICAgICBOZ1BsdXJhbENhc2UsCiAgICAgICAgQXN5bmNQaXBlLAogICAgICAgIFVwcGVyQ2FzZVBpcGUsCiAgICAgICAgTG93ZXJDYXNlUGlwZSwKICAgICAgICBKc29uUGlwZSwKICAgICAgICBTbGljZVBpcGUsCiAgICAgICAgRGVjaW1hbFBpcGUsCiAgICAgICAgUGVyY2VudFBpcGUsCiAgICAgICAgVGl0bGVDYXNlUGlwZSwKICAgICAgICBDdXJyZW5jeVBpcGUsCiAgICAgICAgRGF0ZVBpcGUsCiAgICAgICAgSTE4blBsdXJhbFBpcGUsCiAgICAgICAgSTE4blNlbGVjdFBpcGUsCiAgICAgICAgS2V5VmFsdWVQaXBlXSwgZXhwb3J0czogW05nQ2xhc3MsCiAgICAgICAgTmdDb21wb25lbnRPdXRsZXQsCiAgICAgICAgTmdGb3JPZiwKICAgICAgICBOZ0lmLAogICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsCiAgICAgICAgTmdTdHlsZSwKICAgICAgICBOZ1N3aXRjaCwKICAgICAgICBOZ1N3aXRjaENhc2UsCiAgICAgICAgTmdTd2l0Y2hEZWZhdWx0LAogICAgICAgIE5nUGx1cmFsLAogICAgICAgIE5nUGx1cmFsQ2FzZSwKICAgICAgICBBc3luY1BpcGUsCiAgICAgICAgVXBwZXJDYXNlUGlwZSwKICAgICAgICBMb3dlckNhc2VQaXBlLAogICAgICAgIEpzb25QaXBlLAogICAgICAgIFNsaWNlUGlwZSwKICAgICAgICBEZWNpbWFsUGlwZSwKICAgICAgICBQZXJjZW50UGlwZSwKICAgICAgICBUaXRsZUNhc2VQaXBlLAogICAgICAgIEN1cnJlbmN5UGlwZSwKICAgICAgICBEYXRlUGlwZSwKICAgICAgICBJMThuUGx1cmFsUGlwZSwKICAgICAgICBJMThuU2VsZWN0UGlwZSwKICAgICAgICBLZXlWYWx1ZVBpcGVdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9wbGF0Zm9ybV9pZC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUExBVEZPUk1fQlJPV1NFUl9JRCA9ICdicm93c2VyJzsKLyoqCiAqIFJldHVybnMgd2hldGhlciBhIHBsYXRmb3JtIGlkIHJlcHJlc2VudHMgYSBicm93c2VyIHBsYXRmb3JtLgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHBsYXRmb3JtSWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpIHsKICAgIHJldHVybiBwbGF0Zm9ybUlkID09PSBQTEFURk9STV9CUk9XU0VSX0lEOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3ZlcnNpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVkVSU0lPTiQxID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3ZpZXdwb3J0X3Njcm9sbGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBEZWZpbmVzIGEgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZXIuIEltcGxlbWVudGVkIGJ5IGBCcm93c2VyVmlld3BvcnRTY3JvbGxlcmAuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgVmlld3BvcnRTY3JvbGxlciB7Cn0KLy8gRGUtc3VnYXJlZCB0cmVlLXNoYWthYmxlIGluamVjdGlvbgovLyBTZWUgIzIzOTE3Ci8qKiBAbm9jb2xsYXBzZSAqLwpWaWV3cG9ydFNjcm9sbGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgIHRva2VuOiBWaWV3cG9ydFNjcm9sbGVyLAogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gbmV3IEJyb3dzZXJWaWV3cG9ydFNjcm9sbGVyKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIHdpbmRvdywgybXJtWluamVjdChFcnJvckhhbmRsZXIpKSkKfSk7Ci8qKgogKiBNYW5hZ2VzIHRoZSBzY3JvbGwgcG9zaXRpb24gZm9yIGEgYnJvd3NlciB3aW5kb3cuCiAqLwpjbGFzcyBCcm93c2VyVmlld3BvcnRTY3JvbGxlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gd2luZG93CiAgICAgKiBAcGFyYW0gez99IGVycm9ySGFuZGxlcgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgd2luZG93LCBlcnJvckhhbmRsZXIpIHsKICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7CiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgICAgdGhpcy5vZmZzZXQgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBbMCwgMF0pOwogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIHRoZSB0b3Agb2Zmc2V0IHVzZWQgd2hlbiBzY3JvbGxpbmcgdG8gYW4gYW5jaG9yLgogICAgICogQHBhcmFtIHs/fSBvZmZzZXQgQSBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMgKGEgdHVwbGUgd2l0aCB4IGFuZCB5IHZhbHVlcykKICAgICAqIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB0b3Agb2Zmc2V0IHBvc2l0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldE9mZnNldChvZmZzZXQpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvZmZzZXQpKSB7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gb2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi4KICAgICAqIEByZXR1cm4gez99IFRoZSBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuCiAgICAgKi8KICAgIGdldFNjcm9sbFBvc2l0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnN1cHBvcnRTY3JvbGxSZXN0b3JhdGlvbigpKSB7CiAgICAgICAgICAgIHJldHVybiBbdGhpcy53aW5kb3cuc2Nyb2xsWCwgdGhpcy53aW5kb3cuc2Nyb2xsWV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gWzAsIDBdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uLgogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbiBUaGUgbmV3IHBvc2l0aW9uIGluIHNjcmVlbiBjb29yZGluYXRlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pIHsKICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICB0aGlzLndpbmRvdy5zY3JvbGxUbyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2Nyb2xscyB0byBhbiBhbmNob3IgZWxlbWVudC4KICAgICAqIEBwYXJhbSB7P30gYW5jaG9yIFRoZSBJRCBvZiB0aGUgYW5jaG9yIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzY3JvbGxUb0FuY2hvcihhbmNob3IpIHsKICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICAvLyBFc2NhcGUgYW55dGhpbmcgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYCBhcyBpdCBjYW4gdGhyb3cgZXJyb3JzIGFuZCBzdG9wIHRoZSBhcHBsaWNhdGlvbgogICAgICAgICAgICAvLyBmcm9tIHdvcmtpbmcgaWYgaW52YWxpZCB2YWx1ZXMgYXJlIHBhc3NlZC4KICAgICAgICAgICAgaWYgKHRoaXMud2luZG93LkNTUyAmJiB0aGlzLndpbmRvdy5DU1MuZXNjYXBlKSB7CiAgICAgICAgICAgICAgICBhbmNob3IgPSB0aGlzLndpbmRvdy5DU1MuZXNjYXBlKGFuY2hvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhbmNob3IgPSBhbmNob3IucmVwbGFjZSgvKFwifFwnXCB8OnxcLnxcW3xcXXwsfD0pL2csICdcXCQxJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsU2VsZWN0ZWRCeUlkID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHthbmNob3J9YCk7CiAgICAgICAgICAgICAgICBpZiAoZWxTZWxlY3RlZEJ5SWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudChlbFNlbGVjdGVkQnlJZCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxTZWxlY3RlZEJ5TmFtZSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW25hbWU9JyR7YW5jaG9yfSddYCk7CiAgICAgICAgICAgICAgICBpZiAoZWxTZWxlY3RlZEJ5TmFtZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KGVsU2VsZWN0ZWRCeU5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERpc2FibGVzIGF1dG9tYXRpYyBzY3JvbGwgcmVzdG9yYXRpb24gcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuCiAgICAgKiBAcGFyYW0gez99IHNjcm9sbFJlc3RvcmF0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRIaXN0b3J5U2Nyb2xsUmVzdG9yYXRpb24oc2Nyb2xsUmVzdG9yYXRpb24pIHsKICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnkgPSB0aGlzLndpbmRvdy5oaXN0b3J5OwogICAgICAgICAgICBpZiAoaGlzdG9yeSAmJiBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uKSB7CiAgICAgICAgICAgICAgICBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gc2Nyb2xsUmVzdG9yYXRpb247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzY3JvbGxUb0VsZW1lbnQoZWwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0ICsgdGhpcy53aW5kb3cucGFnZVhPZmZzZXQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRvcCA9IHJlY3QudG9wICsgdGhpcy53aW5kb3cucGFnZVlPZmZzZXQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CiAgICAgICAgdGhpcy53aW5kb3cuc2Nyb2xsVG8obGVmdCAtIG9mZnNldFswXSwgdG9wIC0gb2Zmc2V0WzFdKTsKICAgIH0KICAgIC8qKgogICAgICogV2Ugb25seSBzdXBwb3J0IHNjcm9sbCByZXN0b3JhdGlvbiB3aGVuIHdlIGNhbiBnZXQgYSBob2xkIG9mIHdpbmRvdy4KICAgICAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIGJlaGF2aW9yIHdoZW4gcnVubmluZyBpbiBhIHdlYiB3b3JrZXIuCiAgICAgKgogICAgICogTGlmdGluZyB0aGlzIHJlc3RyaWN0aW9uIHJpZ2h0IG5vdyB3b3VsZCByZXF1aXJlIG1vcmUgY2hhbmdlcyBpbiB0aGUgZG9tIGFkYXB0ZXIuCiAgICAgKiBTaW5jZSB3ZWJ3b3JrZXJzIGFyZW4ndCB3aWRlbHkgdXNlZCwgd2Ugd2lsbCBsaWZ0IGl0IG9uY2UgUm91dGVyU2Nyb2xsZXIgaXMKICAgICAqIGJhdHRsZS10ZXN0ZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAhIXRoaXMud2luZG93ICYmICEhdGhpcy53aW5kb3cuc2Nyb2xsVG87CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvZ2VuZXJpY19icm93c2VyX2FkYXB0ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFByb3ZpZGVzIERPTSBvcGVyYXRpb25zIGluIGFueSBicm93c2VyIGVudmlyb25tZW50LgogKgogKiBcQHNlY3VyaXR5IFRyZWFkIGNhcmVmdWxseSEgSW50ZXJhY3Rpbmcgd2l0aCB0aGUgRE9NIGRpcmVjdGx5IGlzIGRhbmdlcm91cyBhbmQKICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyIGV4dGVuZHMgRG9tQWRhcHRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdXBwb3J0c0RPTUV2ZW50cygpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvYnJvd3Nlci9icm93c2VyX2FkYXB0ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY29uc3QgybUwJDUgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+IHsKICAgIGlmIChfZ2xvYmFsWydOb2RlJ10pIHsKICAgICAgICByZXR1cm4gX2dsb2JhbFsnTm9kZSddLnByb3RvdHlwZS5jb250YWlucyB8fCAoLyoqCiAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gISEodGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KTsKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodW5kZWZpbmVkKSk7Cn07Ci8qKiBAdHlwZSB7P30gKi8KY29uc3Qgbm9kZUNvbnRhaW5zID0gKCjJtTAkNSkpKCk7Ci8qKgogKiBBIGBEb21BZGFwdGVyYCBwb3dlcmVkIGJ5IGZ1bGwgYnJvd3NlciBET00gQVBJcy4KICoKICogXEBzZWN1cml0eSBUcmVhZCBjYXJlZnVsbHkhIEludGVyYWN0aW5nIHdpdGggdGhlIERPTSBkaXJlY3RseSBpcyBkYW5nZXJvdXMgYW5kCiAqIGNhbiBpbnRyb2R1Y2UgWFNTIHJpc2tzLgogKi8KLyogdHNsaW50OmRpc2FibGU6cmVxdWlyZVBhcmFtZXRlclR5cGUgbm8tY29uc29sZSAqLwpjbGFzcyBCcm93c2VyRG9tQWRhcHRlciBleHRlbmRzIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBtYWtlQ3VycmVudCgpIHsKICAgICAgICBzZXRSb290RG9tQWRhcHRlcihuZXcgQnJvd3NlckRvbUFkYXB0ZXIoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UHJvcGVydHkoZWwsIG5hbWUpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChlbCkpKVtuYW1lXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbG9nKGVycm9yKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbG9nR3JvdXAoZXJyb3IpIHsKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUpIHsKICAgICAgICAgICAgd2luZG93LmNvbnNvbGUuZ3JvdXAgJiYgd2luZG93LmNvbnNvbGUuZ3JvdXAoZXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbG9nR3JvdXBFbmQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kICYmIHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IGV2dAogICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25BbmRDYW5jZWwoZWwsIGV2dCwgbGlzdGVuZXIpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTsKICAgICAgICAvLyBOZWVkZWQgdG8gZm9sbG93IERhcnQncyBzdWJzY3JpcHRpb24gc2VtYW50aWMsIHVudGlsIGZpeCBvZgogICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGFydC9pc3N1ZXMvZGV0YWlsP2lkPTE3NDA2CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gZXZ0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNwYXRjaEV2ZW50KGVsLCBldnQpIHsKICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2dCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFZhbHVlKGVsKSB7CiAgICAgICAgcmV0dXJuIGVsLnZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhZ05hbWUKICAgICAqIEBwYXJhbSB7Pz19IGRvYwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2MpIHsKICAgICAgICBkb2MgPSBkb2MgfHwgdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKTsKICAgICAgICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUh0bWxEb2N1bWVudCgpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCdmYWtlVGl0bGUnKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0RGVmYXVsdERvY3VtZW50KCkgewogICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc0VsZW1lbnROb2RlKG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaXNTaGFkb3dSb290KG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0R2xvYmFsRXZlbnRUYXJnZXQoZG9jLCB0YXJnZXQpIHsKICAgICAgICBpZiAodGFyZ2V0ID09PSAnd2luZG93JykgewogICAgICAgICAgICByZXR1cm4gd2luZG93OwogICAgICAgIH0KICAgICAgICBpZiAodGFyZ2V0ID09PSAnZG9jdW1lbnQnKSB7CiAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgfQogICAgICAgIGlmICh0YXJnZXQgPT09ICdib2R5JykgewogICAgICAgICAgICByZXR1cm4gZG9jLmJvZHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRIaXN0b3J5KCkgewogICAgICAgIHJldHVybiB3aW5kb3cuaGlzdG9yeTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0TG9jYXRpb24oKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEJhc2VIcmVmKGRvYykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBocmVmID0gZ2V0QmFzZUVsZW1lbnRIcmVmKCk7CiAgICAgICAgcmV0dXJuIGhyZWYgPT0gbnVsbCA/IG51bGwgOiByZWxhdGl2ZVBhdGgoaHJlZik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc2V0QmFzZUVsZW1lbnQoKSB7CiAgICAgICAgYmFzZUVsZW1lbnQgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRVc2VyQWdlbnQoKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwZXJmb3JtYW5jZU5vdygpIHsKICAgICAgICAvLyBwZXJmb3JtYW5jZS5ub3coKSBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBicm93c2Vycywgc2VlCiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNzZWFyY2g9cGVyZm9ybWFuY2Uubm93CiAgICAgICAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID8gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpIDoKICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzQ29va2llcygpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRDb29raWUobmFtZSkgewogICAgICAgIHJldHVybiBwYXJzZUNvb2tpZVZhbHVlKGRvY3VtZW50LmNvb2tpZSwgbmFtZSk7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgYmFzZUVsZW1lbnQgPSBudWxsOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEJhc2VFbGVtZW50SHJlZigpIHsKICAgIGlmICghYmFzZUVsZW1lbnQpIHsKICAgICAgICBiYXNlRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykpKTsKICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBiYXNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKfQovLyBiYXNlZCBvbiB1cmxVdGlscy5qcyBpbiBBbmd1bGFySlMgMQovKiogQHR5cGUgez99ICovCmxldCB1cmxQYXJzaW5nTm9kZTsKLyoqCiAqIEBwYXJhbSB7P30gdXJsCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWxhdGl2ZVBhdGgodXJsKSB7CiAgICBpZiAoIXVybFBhcnNpbmdOb2RlKSB7CiAgICAgICAgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICB9CiAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpOwogICAgcmV0dXJuICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6CiAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvc2VydmVyLXRyYW5zaXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFuIGlkIHRoYXQgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYmVpbmcgYm9vdHN0cmFwcGVkLCB0aGF0IHNob3VsZAogKiBtYXRjaCBhY3Jvc3MgdGhlIGNsaWVudC9zZXJ2ZXIgYm91bmRhcnkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVFJBTlNJVElPTl9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignVFJBTlNJVElPTl9JRCcpOwovKioKICogQHBhcmFtIHs/fSB0cmFuc2l0aW9uSWQKICogQHBhcmFtIHs/fSBkb2N1bWVudAogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcHBJbml0aWFsaXplckZhY3RvcnkodHJhbnNpdGlvbklkLCBkb2N1bWVudCwgaW5qZWN0b3IpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7CiAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGFwcGxpY2F0aW9uIGluaXRpYWxpemVycyB0byBiZSBjb21wbGV0ZWQgYmVmb3JlIHJlbW92aW5nIHRoZSBzdHlsZXMgc2V0IGJ5CiAgICAgICAgLy8gdGhlIHNlcnZlci4KICAgICAgICBpbmplY3Rvci5nZXQoQXBwbGljYXRpb25Jbml0U3RhdHVzKS5kb25lUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb20gPSBnZXRET00oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgc3R5bGVbbmctdHJhbnNpdGlvbl1gKSk7CiAgICAgICAgICAgIHN0eWxlcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbCA9PiBlbC5nZXRBdHRyaWJ1dGUoJ25nLXRyYW5zaXRpb24nKSA9PT0gdHJhbnNpdGlvbklkKSkKICAgICAgICAgICAgICAgIC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWwgPT4gZG9tLnJlbW92ZShlbCkpKTsKICAgICAgICB9KSk7CiAgICB9KTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUyA9IFsKICAgIHsKICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsCiAgICAgICAgdXNlRmFjdG9yeTogYXBwSW5pdGlhbGl6ZXJGYWN0b3J5LAogICAgICAgIGRlcHM6IFtUUkFOU0lUSU9OX0lELCBET0NVTUVOVCQxLCBJbmplY3Rvcl0sCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH0sCl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9icm93c2VyL3Rlc3RhYmlsaXR5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEJyb3dzZXJHZXRUZXN0YWJpbGl0eSB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBpbml0KCkgewogICAgICAgIHNldFRlc3RhYmlsaXR5R2V0dGVyKG5ldyBCcm93c2VyR2V0VGVzdGFiaWxpdHkoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVnaXN0cnkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFRvV2luZG93KHJlZ2lzdHJ5KSB7CiAgICAgICAgX2dsb2JhbFsnZ2V0QW5ndWxhclRlc3RhYmlsaXR5J10gPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmluZEluQW5jZXN0b3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZWxlbSwgZmluZEluQW5jZXN0b3JzID0gdHJ1ZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRlc3RhYmlsaXR5ID0gcmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7CiAgICAgICAgICAgIGlmICh0ZXN0YWJpbGl0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlc3RhYmlsaXR5IGZvciBlbGVtZW50LicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0ZXN0YWJpbGl0eTsKICAgICAgICB9KTsKICAgICAgICBfZ2xvYmFsWydnZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcyddID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gcmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcygpKTsKICAgICAgICBfZ2xvYmFsWydnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzJ10gPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiByZWdpc3RyeS5nZXRBbGxSb290RWxlbWVudHMoKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdoZW5BbGxTdGFibGUgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNhbGxiYWNrIC8qKiBUT0RPICM5MTAwICovKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGVzdGFiaWxpdGllcyA9IF9nbG9iYWxbJ2dldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzJ10oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY291bnQgPSB0ZXN0YWJpbGl0aWVzLmxlbmd0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZGlkV29yayA9IGZhbHNlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlY3JlbWVudCA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaWRXb3JrXwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGRpZFdvcmtfIC8qKiBUT0RPICM5MTAwICovKSB7CiAgICAgICAgICAgICAgICBkaWRXb3JrID0gZGlkV29yayB8fCBkaWRXb3JrXzsKICAgICAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRpZFdvcmspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGVzdGFiaWxpdGllcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZXN0YWJpbGl0eQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKHRlc3RhYmlsaXR5IC8qKiBUT0RPICM5MTAwICovKSB7CiAgICAgICAgICAgICAgICB0ZXN0YWJpbGl0eS53aGVuU3RhYmxlKGRlY3JlbWVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KTsKICAgICAgICBpZiAoIV9nbG9iYWxbJ2ZyYW1ld29ya1N0YWJpbGl6ZXJzJ10pIHsKICAgICAgICAgICAgX2dsb2JhbFsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXSA9IFtdOwogICAgICAgIH0KICAgICAgICBfZ2xvYmFsWydmcmFtZXdvcmtTdGFiaWxpemVycyddLnB1c2god2hlbkFsbFN0YWJsZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVnaXN0cnkKICAgICAqIEBwYXJhbSB7P30gZWxlbQogICAgICogQHBhcmFtIHs/fSBmaW5kSW5BbmNlc3RvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgZWxlbSwgZmluZEluQW5jZXN0b3JzKSB7CiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHQgPSByZWdpc3RyeS5nZXRUZXN0YWJpbGl0eShlbGVtKTsKICAgICAgICBpZiAodCAhPSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghZmluZEluQW5jZXN0b3JzKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0RE9NKCkuaXNTaGFkb3dSb290KGVsZW0pKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgKCgvKiogQHR5cGUgez99ICovIChlbGVtKSkpLmhvc3QsIHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGVsZW0ucGFyZW50RWxlbWVudCwgdHJ1ZSk7CiAgICB9Cn0KLyoqCiAqIEV4cG9ydHMgdGhlIHZhbHVlIHVuZGVyIGEgZ2l2ZW4gYG5hbWVgIGluIHRoZSBnbG9iYWwgcHJvcGVydHkgYG5nYC4gRm9yIGV4YW1wbGUgYG5nLnByb2JlYCBpZgogKiBgbmFtZWAgaXMgYCdwcm9iZSdgLgogKiBAcGFyYW0gez99IG5hbWUgTmFtZSB1bmRlciB3aGljaCBpdCB3aWxsIGJlIGV4cG9ydGVkLiBLZWVwIGluIG1pbmQgdGhpcyB3aWxsIGJlIGEgcHJvcGVydHkgb2YgdGhlCiAqIGdsb2JhbCBgbmdgIG9iamVjdC4KICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXhwb3J0LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXhwb3J0TmdWYXIobmFtZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlb2YgQ09NUElMRUQgPT09ICd1bmRlZmluZWQnIHx8ICFDT01QSUxFRCkgewogICAgICAgIC8vIE5vdGU6IHdlIGNhbid0IGV4cG9ydCBgbmdgIHdoZW4gdXNpbmcgY2xvc3VyZSBlbmhhbmNlZCBvcHRpbWl6YXRpb24gYXM6CiAgICAgICAgLy8gLSBjbG9zdXJlIGRlY2xhcmVzIGdsb2JhbHMgaXRzZWxmIGZvciBtaW5pZmllZCBuYW1lcywgd2hpY2ggc29tZXRpbWVzIGNsb2JiZXIgb3VyIGBuZ2AgZ2xvYmFsCiAgICAgICAgLy8gLSB3ZSBjYW4ndCBkZWNsYXJlIGEgY2xvc3VyZSBleHRlcm4gYXMgdGhlIG5hbWVzcGFjZSBgbmdgIGlzIGFscmVhZHkgdXNlZCB3aXRoaW4gR29vZ2xlCiAgICAgICAgLy8gICBmb3IgdHlwaW5ncyBmb3IgYW5ndWxhckpTICh2aWEgYGdvb2cucHJvdmlkZSgnbmcuLi4uJylgKS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmcgPSBfZ2xvYmFsWyduZyddID0gKCgvKiogQHR5cGUgez99ICovIChfZ2xvYmFsWyduZyddKSkpIHx8IHt9OwogICAgICAgIG5nW25hbWVdID0gdmFsdWU7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9kZWJ1Zy9uZ19wcm9iZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCDJtTAkMSQxID0gLyoqCiAqIEByZXR1cm4gez99CiAqLwooKSA9PiAoewogICAgJ0FwcGxpY2F0aW9uUmVmJzogQXBwbGljYXRpb25SZWYsCiAgICAnTmdab25lJzogTmdab25lLAp9KTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDT1JFX1RPS0VOUyA9ICgoybUwJDEkMSkpKCk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSU5TUEVDVF9HTE9CQUxfTkFNRSA9ICdwcm9iZSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ09SRV9UT0tFTlNfR0xPQkFMX05BTUUgPSAnY29yZVRva2Vucyc7Ci8qKgogKiBSZXR1cm5zIGEge1xAbGluayBEZWJ1Z0VsZW1lbnR9IGZvciB0aGUgZ2l2ZW4gbmF0aXZlIERPTSBlbGVtZW50LCBvcgogKiBudWxsIGlmIHRoZSBnaXZlbiBuYXRpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIEFuZ3VsYXIgdmlldyBhc3NvY2lhdGVkCiAqIHdpdGggaXQuCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zcGVjdE5hdGl2ZUVsZW1lbnRSMihlbGVtZW50KSB7CiAgICByZXR1cm4gZ2V0RGVidWdOb2RlUjIoKTsKfQovKioKICogQHBhcmFtIHs/fSBjb3JlVG9rZW5zCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfY3JlYXRlTmdQcm9iZVIyKGNvcmVUb2tlbnMpIHsKICAgIGV4cG9ydE5nVmFyKElOU1BFQ1RfR0xPQkFMX05BTUUsIGluc3BlY3ROYXRpdmVFbGVtZW50UjIpOwogICAgZXhwb3J0TmdWYXIoQ09SRV9UT0tFTlNfR0xPQkFMX05BTUUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgQ09SRV9UT0tFTlMpLCBfbmdQcm9iZVRva2Vuc1RvTWFwKGNvcmVUb2tlbnMgfHwgW10pKSk7CiAgICByZXR1cm4gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gaW5zcGVjdE5hdGl2ZUVsZW1lbnRSMik7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdG9rZW5zCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbmdQcm9iZVRva2Vuc1RvTWFwKHRva2VucykgewogICAgcmV0dXJuIHRva2Vucy5yZWR1Y2UoKC8qKgogICAgICogQHBhcmFtIHs/fSBwcmV2CiAgICAgKiBAcGFyYW0gez99IHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwcmV2LCB0KSA9PiAocHJldlt0Lm5hbWVdID0gdC50b2tlbiwgcHJldikpLCB7fSk7Cn0KLyoqCiAqIEluIEl2eSwgd2UgZG9uJ3Qgc3VwcG9ydCBOZ1Byb2JlIGJlY2F1c2Ugd2UgaGF2ZSBvdXIgb3duIHNldCBvZiB0ZXN0aW5nIHV0aWxpdGllcwogKiB3aXRoIG1vcmUgcm9idXN0IGZ1bmN0aW9uYWxpdHkuCiAqCiAqIFdlIHNob3VsZG4ndCBicmluZyBpbiBOZ1Byb2JlIGJlY2F1c2UgaXQgcHJldmVudHMgRGVidWdOb2RlIGFuZCBmcmllbmRzIGZyb20KICogdHJlZS1zaGFraW5nIHByb3Blcmx5LgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVMRU1FTlRfUFJPQkVfUFJPVklERVJTX19QT1NUX1IzX18gPSBbXTsKLyoqCiAqIFByb3ZpZGVycyB3aGljaCBzdXBwb3J0IGRlYnVnZ2luZyBBbmd1bGFyIGFwcGxpY2F0aW9ucyAoZS5nLiB2aWEgYG5nLnByb2JlYCkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BSRV9SM19fID0gWwogICAgewogICAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUiwKICAgICAgICB1c2VGYWN0b3J5OiBfY3JlYXRlTmdQcm9iZVIyLAogICAgICAgIGRlcHM6IFsKICAgICAgICAgICAgW05nUHJvYmVUb2tlbiwgbmV3IE9wdGlvbmFsKCldLAogICAgICAgIF0sCiAgICAgICAgbXVsdGk6IHRydWUsCiAgICB9LApdOwovKiogQHR5cGUgez99ICovCmNvbnN0IEVMRU1FTlRfUFJPQkVfUFJPVklERVJTID0gRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhlIGluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGV2ZW50LW1hbmFnZXIgcGx1Zy1pbiBzZXJ2aWNlLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEVWRU5UX01BTkFHRVJfUExVR0lOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignRXZlbnRNYW5hZ2VyUGx1Z2lucycpOwovKioKICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgZXZlbnQgbWFuYWdlbWVudCBmb3IgQW5ndWxhcgogKiB0aHJvdWdoIGEgYnJvd3NlciBwbHVnLWluLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgRXZlbnRNYW5hZ2VyIHsKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGV2ZW50LW1hbmFnZXIgc2VydmljZS4KICAgICAqIEBwYXJhbSB7P30gcGx1Z2lucwogICAgICogQHBhcmFtIHs/fSBfem9uZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihwbHVnaW5zLCBfem9uZSkgewogICAgICAgIHRoaXMuX3pvbmUgPSBfem9uZTsKICAgICAgICB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbiA9IG5ldyBNYXAoKTsKICAgICAgICBwbHVnaW5zLmZvckVhY2goKC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBwID0+IHAubWFuYWdlciA9IHRoaXMpKTsKICAgICAgICB0aGlzLl9wbHVnaW5zID0gcGx1Z2lucy5zbGljZSgpLnJldmVyc2UoKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCBldmVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci4KICAgICAqIEBwYXJhbSB7P30gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbm90aWZpY2F0aW9uIG9jY3Vycy4gUmVjZWl2ZXMgdGhlCiAgICAgKiBldmVudCBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBoYW5kbGVyLgogICAgICovCiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7CiAgICAgICAgcmV0dXJuIHBsdWdpbi5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGdsb2JhbCBoYW5kbGVyIGZvciBhbiBldmVudCBpbiBhIHRhcmdldCB2aWV3LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0IEEgdGFyZ2V0IGZvciBnbG9iYWwgZXZlbnQgbm90aWZpY2F0aW9ucy4gT25lIG9mICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCBvciAiYm9keSIuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci4KICAgICAqIEBwYXJhbSB7P30gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbm90aWZpY2F0aW9uIG9jY3Vycy4gUmVjZWl2ZXMgdGhlCiAgICAgKiBldmVudCBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBoYW5kbGVyLgogICAgICovCiAgICBhZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZXZlbnROYW1lKTsKICAgICAgICByZXR1cm4gcGx1Z2luLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBpbGF0aW9uIHpvbmUgaW4gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Wm9uZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fem9uZTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5nZXQoZXZlbnROYW1lKTsKICAgICAgICBpZiAocGx1Z2luKSB7CiAgICAgICAgICAgIHJldHVybiBwbHVnaW47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5fcGx1Z2luczsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW2ldOwogICAgICAgICAgICBpZiAocGx1Z2luLnN1cHBvcnRzKGV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luLnNldChldmVudE5hbWUsIHBsdWdpbik7CiAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZXZlbnQgbWFuYWdlciBwbHVnaW4gZm91bmQgZm9yIGV2ZW50ICR7ZXZlbnROYW1lfWApOwogICAgfQp9CkV2ZW50TWFuYWdlci7JtWZhYyA9IGZ1bmN0aW9uIEV2ZW50TWFuYWdlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFdmVudE1hbmFnZXIpKMm1ybVpbmplY3QoRVZFTlRfTUFOQUdFUl9QTFVHSU5TKSwgybXJtWluamVjdChOZ1pvbmUpKTsgfTsKRXZlbnRNYW5hZ2VyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEV2ZW50TWFuYWdlciwgZmFjdG9yeTogRXZlbnRNYW5hZ2VyLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRXZlbnRNYW5hZ2VyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRVZFTlRfTUFOQUdFUl9QTFVHSU5TLF0gfV0gfSwKICAgIHsgdHlwZTogTmdab25lIH0KXTsKLyoqCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhcmdldCA9IGdldERPTSgpLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRoaXMuX2RvYywgZWxlbWVudCk7CiAgICAgICAgaWYgKCF0YXJnZXQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBldmVudCB0YXJnZXQgJHt0YXJnZXR9IGZvciBldmVudCAke2V2ZW50TmFtZX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9zaGFyZWRfc3R5bGVzX2hvc3QudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgU2hhcmVkU3R5bGVzSG9zdCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc3R5bGVzU2V0ID0gbmV3IFNldCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0eWxlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkU3R5bGVzKHN0eWxlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhZGRpdGlvbnMgPSBuZXcgU2V0KCk7CiAgICAgICAgc3R5bGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0eWxlID0+IHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9zdHlsZXNTZXQuaGFzKHN0eWxlKSkgewogICAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzU2V0LmFkZChzdHlsZSk7CiAgICAgICAgICAgICAgICBhZGRpdGlvbnMuYWRkKHN0eWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLm9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKSB7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QWxsU3R5bGVzKCkgewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0eWxlc1NldCk7CiAgICB9Cn0KU2hhcmVkU3R5bGVzSG9zdC7JtWZhYyA9IGZ1bmN0aW9uIFNoYXJlZFN0eWxlc0hvc3RfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2hhcmVkU3R5bGVzSG9zdCkoKTsgfTsKU2hhcmVkU3R5bGVzSG9zdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTaGFyZWRTdHlsZXNIb3N0LCBmYWN0b3J5OiBTaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjIH0pOwpjbGFzcyBEb21TaGFyZWRTdHlsZXNIb3N0IGV4dGVuZHMgU2hhcmVkU3R5bGVzSG9zdCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgICAgIHRoaXMuX2hvc3ROb2RlcyA9IG5ldyBTZXQoKTsKICAgICAgICB0aGlzLl9zdHlsZU5vZGVzID0gbmV3IFNldCgpOwogICAgICAgIHRoaXMuX2hvc3ROb2Rlcy5hZGQoX2RvYy5oZWFkKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgKiBAcGFyYW0gez99IGhvc3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hZGRTdHlsZXNUb0hvc3Qoc3R5bGVzLCBob3N0KSB7CiAgICAgICAgc3R5bGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzdHlsZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlRWwgPSB0aGlzLl9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IHN0eWxlOwogICAgICAgICAgICB0aGlzLl9zdHlsZU5vZGVzLmFkZChob3N0LmFwcGVuZENoaWxkKHN0eWxlRWwpKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEhvc3QoaG9zdE5vZGUpIHsKICAgICAgICB0aGlzLl9hZGRTdHlsZXNUb0hvc3QodGhpcy5fc3R5bGVzU2V0LCBob3N0Tm9kZSk7CiAgICAgICAgdGhpcy5faG9zdE5vZGVzLmFkZChob3N0Tm9kZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUhvc3QoaG9zdE5vZGUpIHsKICAgICAgICB0aGlzLl9ob3N0Tm9kZXMuZGVsZXRlKGhvc3ROb2RlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKSB7CiAgICAgICAgdGhpcy5faG9zdE5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhvc3ROb2RlID0+IHRoaXMuX2FkZFN0eWxlc1RvSG9zdChhZGRpdGlvbnMsIGhvc3ROb2RlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9zdHlsZU5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVOb2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdHlsZU5vZGUgPT4gZ2V0RE9NKCkucmVtb3ZlKHN0eWxlTm9kZSkpKTsKICAgIH0KfQpEb21TaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjID0gZnVuY3Rpb24gRG9tU2hhcmVkU3R5bGVzSG9zdF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEb21TaGFyZWRTdHlsZXNIb3N0KSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKRG9tU2hhcmVkU3R5bGVzSG9zdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEb21TaGFyZWRTdHlsZXNIb3N0LCBmYWN0b3J5OiBEb21TaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRG9tU2hhcmVkU3R5bGVzSG9zdC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2RvbV9yZW5kZXJlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE5BTUVTUEFDRV9VUklTID0gewogICAgJ3N2Zyc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsCiAgICAneGh0bWwnOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsCiAgICAneGxpbmsnOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsCiAgICAneG1sJzogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsCiAgICAneG1sbnMnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nLAp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IENPTVBPTkVOVF9SRUdFWCA9IC8lQ09NUCUvZzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOR19ERVZfTU9ERSQxID0gdHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgISFuZ0Rldk1vZGU7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ09NUE9ORU5UX1ZBUklBQkxFID0gJyVDT01QJSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSE9TVF9BVFRSID0gYF9uZ2hvc3QtJHtDT01QT05FTlRfVkFSSUFCTEV9YDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDT05URU5UX0FUVFIgPSBgX25nY29udGVudC0ke0NPTVBPTkVOVF9WQVJJQUJMRX1gOwovKioKICogQHBhcmFtIHs/fSBjb21wb25lbnRTaG9ydElkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzaGltQ29udGVudEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7CiAgICByZXR1cm4gQ09OVEVOVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTsKfQovKioKICogQHBhcmFtIHs/fSBjb21wb25lbnRTaG9ydElkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzaGltSG9zdEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7CiAgICByZXR1cm4gSE9TVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTsKfQovKioKICogQHBhcmFtIHs/fSBjb21wSWQKICogQHBhcmFtIHs/fSBzdHlsZXMKICogQHBhcmFtIHs/fSB0YXJnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZsYXR0ZW5TdHlsZXMoY29tcElkLCBzdHlsZXMsIHRhcmdldCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2ldOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkgewogICAgICAgICAgICBmbGF0dGVuU3R5bGVzKGNvbXBJZCwgc3R5bGUsIHRhcmdldCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdHlsZSA9IHN0eWxlLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wSWQpOwogICAgICAgICAgICB0YXJnZXQucHVzaChzdHlsZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKfQovKioKICogQHBhcmFtIHs/fSBldmVudEhhbmRsZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlY29yYXRlUHJldmVudERlZmF1bHQoZXZlbnRIYW5kbGVyKSB7CiAgICAvLyBgRGVidWdOb2RlLnRyaWdnZXJFdmVudEhhbmRsZXJgIG5lZWRzIHRvIGtub3cgaWYgdGhlIGxpc3RlbmVyIHdhcyBjcmVhdGVkIHdpdGgKICAgIC8vIGRlY29yYXRlUHJldmVudERlZmF1bHQgb3IgaXMgYSBsaXN0ZW5lciBhZGRlZCBvdXRzaWRlIHRoZSBBbmd1bGFyIGNvbnRleHQgc28gaXQgY2FuIGhhbmRsZSB0aGUKICAgIC8vIHR3byBkaWZmZXJlbnRseS4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBzcGVjaWFsICdfX25nVW53cmFwX18nIHRva2VuIGlzIHBhc3NlZCB0byB0aGUgdW53cmFwCiAgICAvLyB0aGUgbGlzdGVuZXIgKHNlZSBiZWxvdykuCiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV2ZW50KSA9PiB7CiAgICAgICAgLy8gSXZ5IHVzZXMgJ19fbmdVbndyYXBfXycgYXMgYSBzcGVjaWFsIHRva2VuIHRoYXQgYWxsb3dzIHVzIHRvIHVud3JhcCB0aGUgZnVuY3Rpb24KICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSBpbnZva2VkIHByb2dyYW1tYXRpY2FsbHkgYnkgYERlYnVnTm9kZS50cmlnZ2VyRXZlbnRIYW5kbGVyYC4gVGhlIGRlYnVnX25vZGUKICAgICAgICAvLyBjYW4gaW5zcGVjdCB0aGUgbGlzdGVuZXIgdG9TdHJpbmcgY29udGVudHMgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBzcGVjaWFsIHRva2VuLiBCZWNhdXNlCiAgICAgICAgLy8gdGhlIHRva2VuIGlzIGEgc3RyaW5nIGxpdGVyYWwsIGl0IGlzIGVuc3VyZWQgdG8gbm90IGJlIG1vZGlmaWVkIGJ5IGNvbXBpbGVkIGNvZGUuCiAgICAgICAgaWYgKGV2ZW50ID09PSAnX19uZ1Vud3JhcF9fJykgewogICAgICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsb3dEZWZhdWx0QmVoYXZpb3IgPSBldmVudEhhbmRsZXIoZXZlbnQpOwogICAgICAgIGlmIChhbGxvd0RlZmF1bHRCZWhhdmlvciA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBtb3ZlIHByZXZlbnREZWZhdWx0IGludG8gZXZlbnQgcGx1Z2lucy4uLgogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfSk7Cn0KY2xhc3MgRG9tUmVuZGVyZXJGYWN0b3J5MiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXZlbnRNYW5hZ2VyCiAgICAgKiBAcGFyYW0gez99IHNoYXJlZFN0eWxlc0hvc3QKICAgICAqIEBwYXJhbSB7P30gYXBwSWQKICAgICAqLwogICAgY29uc3RydWN0b3IoZXZlbnRNYW5hZ2VyLCBzaGFyZWRTdHlsZXNIb3N0LCBhcHBJZCkgewogICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gZXZlbnRNYW5hZ2VyOwogICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCA9IHNoYXJlZFN0eWxlc0hvc3Q7CiAgICAgICAgdGhpcy5hcHBJZCA9IGFwcElkOwogICAgICAgIHRoaXMucmVuZGVyZXJCeUNvbXBJZCA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJlciA9IG5ldyBEZWZhdWx0RG9tUmVuZGVyZXIyKGV2ZW50TWFuYWdlcik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVSZW5kZXJlcihlbGVtZW50LCB0eXBlKSB7CiAgICAgICAgaWYgKCFlbGVtZW50IHx8ICF0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0eXBlLmVuY2Fwc3VsYXRpb24pIHsKICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkOiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyQnlDb21wSWQuZ2V0KHR5cGUuaWQpOwogICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gbmV3IEVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMih0aGlzLmV2ZW50TWFuYWdlciwgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LCB0eXBlLCB0aGlzLmFwcElkKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyQnlDb21wSWQuc2V0KHR5cGUuaWQsIHJlbmRlcmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuYXBwbHlUb0hvc3QoZWxlbWVudCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLk5hdGl2ZToKICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbToKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhZG93RG9tUmVuZGVyZXIodGhpcy5ldmVudE1hbmFnZXIsIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCwgZWxlbWVudCwgdHlwZSk7CiAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlckJ5Q29tcElkLmhhcyh0eXBlLmlkKSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzKHR5cGUuaWQsIHR5cGUuc3R5bGVzLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LmFkZFN0eWxlcyhzdHlsZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXJCeUNvbXBJZC5zZXQodHlwZS5pZCwgdGhpcy5kZWZhdWx0UmVuZGVyZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcmVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiZWdpbigpIHsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbmQoKSB7IH0KfQpEb21SZW5kZXJlckZhY3RvcnkyLsm1ZmFjID0gZnVuY3Rpb24gRG9tUmVuZGVyZXJGYWN0b3J5Ml9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEb21SZW5kZXJlckZhY3RvcnkyKSjJtcm1aW5qZWN0KEV2ZW50TWFuYWdlciksIMm1ybVpbmplY3QoRG9tU2hhcmVkU3R5bGVzSG9zdCksIMm1ybVpbmplY3QoQVBQX0lEKSk7IH07CkRvbVJlbmRlcmVyRmFjdG9yeTIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRG9tUmVuZGVyZXJGYWN0b3J5MiwgZmFjdG9yeTogRG9tUmVuZGVyZXJGYWN0b3J5Mi7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkRvbVJlbmRlcmVyRmFjdG9yeTIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEV2ZW50TWFuYWdlciB9LAogICAgeyB0eXBlOiBEb21TaGFyZWRTdHlsZXNIb3N0IH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0lELF0gfV0gfQpdOwpjbGFzcyBEZWZhdWx0RG9tUmVuZGVyZXIyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE1hbmFnZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoZXZlbnRNYW5hZ2VyKSB7CiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7CiAgICAgICAgdGhpcy5kYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgIC8vIEluIGNhc2VzIHdoZXJlIEl2eSAobm90IFZpZXdFbmdpbmUpIGlzIGdpdmluZyB1cyB0aGUgYWN0dWFsIG5hbWVzcGFjZSwgdGhlIGxvb2sgdXAgYnkga2V5CiAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZCwgc28gd2UganVzdCByZXR1cm4gdGhlIG5hbWVzcGFjZSBoZXJlLgogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5BTUVTUEFDRV9VUklTW25hbWVzcGFjZV0gfHwgbmFtZXNwYWNlLCBuYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUNvbW1lbnQodmFsdWUpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZVRleHQodmFsdWUpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBuZXdDaGlsZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCkgewogICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChuZXdDaGlsZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKSB7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzZWxlY3Rvck9yTm9kZQogICAgICogQHBhcmFtIHs/PX0gcHJlc2VydmVDb250ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZWxlY3RSb290RWxlbWVudChzZWxlY3Rvck9yTm9kZSwgcHJlc2VydmVDb250ZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBlbCA9IHR5cGVvZiBzZWxlY3Rvck9yTm9kZSA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yT3JOb2RlKSA6CiAgICAgICAgICAgIHNlbGVjdG9yT3JOb2RlOwogICAgICAgIGlmICghZWwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2VsZWN0b3IgIiR7c2VsZWN0b3JPck5vZGV9IiBkaWQgbm90IG1hdGNoIGFueSBlbGVtZW50c2ApOwogICAgICAgIH0KICAgICAgICBpZiAoIXByZXNlcnZlQ29udGVudCkgewogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZWw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGFyZW50Tm9kZShub2RlKSB7CiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZXh0U2libGluZyhub2RlKSB7CiAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lc3BhY2UgKyAnOicgKyBuYW1lOwogICAgICAgICAgICAvLyBUT0RPKEZXLTgxMSk6IEl2eSBtYXkgY2F1c2UgaXNzdWVzIGhlcmUgYmVjYXVzZSBpdCdzIHBhc3NpbmcgYXJvdW5kCiAgICAgICAgICAgIC8vIGZ1bGwgVVJJcyBmb3IgbmFtZXNwYWNlcywgdGhlcmVmb3JlIHRoaXMgbG9va3VwIHdpbGwgZmFpbC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VVcmkgPSBOQU1FU1BBQ0VfVVJJU1tuYW1lc3BhY2VdOwogICAgICAgICAgICBpZiAobmFtZXNwYWNlVXJpKSB7CiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVcmksIG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgIC8vIFRPRE8oRlctODExKTogSXZ5IG1heSBjYXVzZSBpc3N1ZXMgaGVyZSBiZWNhdXNlIGl0J3MgcGFzc2luZyBhcm91bmQKICAgICAgICAgICAgLy8gZnVsbCBVUklzIGZvciBuYW1lc3BhY2VzLCB0aGVyZWZvcmUgdGhpcyBsb29rdXAgd2lsbCBmYWlsLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZVVyaSA9IE5BTUVTUEFDRV9VUklTW25hbWVzcGFjZV07CiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVcmkpIHsKICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVyaSwgbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPKEZXLTgxMSk6IFNpbmNlIGl2eSBpcyBwYXNzaW5nIGFyb3VuZCBmdWxsIFVSSXMgZm9yIG5hbWVzcGFjZXMKICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgcmVzdWx0IGluIHByb3BlcnRpZXMgbGlrZSBgaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmc6Y3g9IjEyMyJgLAogICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgd3JvbmcuCiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYCR7bmFtZXNwYWNlfToke25hbWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkQ2xhc3MoZWwsIG5hbWUpIHsKICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUNsYXNzKGVsLCBuYW1lKSB7CiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShuYW1lKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBmbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0U3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSwgZmxhZ3MpIHsKICAgICAgICBpZiAoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KHN0eWxlLCB2YWx1ZSwgISEoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudCkgPyAnaW1wb3J0YW50JyA6ICcnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlW3N0eWxlXSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICogQHBhcmFtIHs/fSBmbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlU3R5bGUoZWwsIHN0eWxlLCBmbGFncykgewogICAgICAgIGlmIChmbGFncyAmIFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UpIHsKICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoc3R5bGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gSUUgcmVxdWlyZXMgJycgaW5zdGVhZCBvZiBudWxsCiAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy83OTE2CiAgICAgICAgICAgIGVsLnN0eWxlW3N0eWxlXSA9ICcnOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpIHsKICAgICAgICBOR19ERVZfTU9ERSQxICYmIGNoZWNrTm9TeW50aGV0aWNQcm9wKG5hbWUsICdwcm9wZXJ0eScpOwogICAgICAgIGVsW25hbWVdID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0VmFsdWUobm9kZSwgdmFsdWUpIHsKICAgICAgICBub2RlLm5vZGVWYWx1ZSA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbGlzdGVuKHRhcmdldCwgZXZlbnQsIGNhbGxiYWNrKSB7CiAgICAgICAgTkdfREVWX01PREUkMSAmJiBjaGVja05vU3ludGhldGljUHJvcChldmVudCwgJ2xpc3RlbmVyJyk7CiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5ldmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50LCBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50LCBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSkpKSkpOwogICAgfQp9CmNvbnN0IMm1MCQyJDEgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+ICdAJy5jaGFyQ29kZUF0KDApOwovKiogQHR5cGUgez99ICovCmNvbnN0IEFUX0NIQVJDT0RFID0gKCjJtTAkMiQxKSkoKTsKLyoqCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez99IG5hbWVLaW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja05vU3ludGhldGljUHJvcChuYW1lLCBuYW1lS2luZCkgewogICAgaWYgKG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gQVRfQ0hBUkNPREUpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIHRoZSBzeW50aGV0aWMgJHtuYW1lS2luZH0gJHtuYW1lfS4gUGxlYXNlIGluY2x1ZGUgZWl0aGVyICJCcm93c2VyQW5pbWF0aW9uc01vZHVsZSIgb3IgIk5vb3BBbmltYXRpb25zTW9kdWxlIiBpbiB5b3VyIGFwcGxpY2F0aW9uLmApOwogICAgfQp9CmNsYXNzIEVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMiBleHRlbmRzIERlZmF1bHREb21SZW5kZXJlcjIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICogQHBhcmFtIHs/fSBzaGFyZWRTdHlsZXNIb3N0CiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHBhcmFtIHs/fSBhcHBJZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGNvbXBvbmVudCwgYXBwSWQpIHsKICAgICAgICBzdXBlcihldmVudE1hbmFnZXIpOwogICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzKGFwcElkICsgJy0nICsgY29tcG9uZW50LmlkLCBjb21wb25lbnQuc3R5bGVzLCBbXSk7CiAgICAgICAgc2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMoc3R5bGVzKTsKICAgICAgICB0aGlzLmNvbnRlbnRBdHRyID0gc2hpbUNvbnRlbnRBdHRyaWJ1dGUoYXBwSWQgKyAnLScgKyBjb21wb25lbnQuaWQpOwogICAgICAgIHRoaXMuaG9zdEF0dHIgPSBzaGltSG9zdEF0dHJpYnV0ZShhcHBJZCArICctJyArIGNvbXBvbmVudC5pZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXBwbHlUb0hvc3QoZWxlbWVudCkgewogICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCB0aGlzLmhvc3RBdHRyLCAnJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUVsZW1lbnQocGFyZW50LCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsID0gc3VwZXIuY3JlYXRlRWxlbWVudChwYXJlbnQsIG5hbWUpOwogICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShlbCwgdGhpcy5jb250ZW50QXR0ciwgJycpOwogICAgICAgIHJldHVybiBlbDsKICAgIH0KfQpjbGFzcyBTaGFkb3dEb21SZW5kZXJlciBleHRlbmRzIERlZmF1bHREb21SZW5kZXJlcjIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICogQHBhcmFtIHs/fSBzaGFyZWRTdHlsZXNIb3N0CiAgICAgKiBAcGFyYW0gez99IGhvc3RFbAogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoZXZlbnRNYW5hZ2VyLCBzaGFyZWRTdHlsZXNIb3N0LCBob3N0RWwsIGNvbXBvbmVudCkgewogICAgICAgIHN1cGVyKGV2ZW50TWFuYWdlcik7CiAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0ID0gc2hhcmVkU3R5bGVzSG9zdDsKICAgICAgICB0aGlzLmhvc3RFbCA9IGhvc3RFbDsKICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgICBpZiAoY29tcG9uZW50LmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uJDEuU2hhZG93RG9tKSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoaG9zdEVsKSkpLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoaG9zdEVsKSkpLmNyZWF0ZVNoYWRvd1Jvb3QoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LmFkZEhvc3QodGhpcy5zaGFkb3dSb290KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gZmxhdHRlblN0eWxlcyhjb21wb25lbnQuaWQsIGNvbXBvbmVudC5zdHlsZXMsIFtdKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gc3R5bGVzW2ldOwogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBub2RlT3JTaGFkb3dSb290KG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSA9PT0gdGhpcy5ob3N0RWwgPyB0aGlzLnNoYWRvd1Jvb3QgOiBub2RlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0KHRoaXMuc2hhZG93Um9vdCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmFwcGVuZENoaWxkKHRoaXMubm9kZU9yU2hhZG93Um9vdChwYXJlbnQpLCBuZXdDaGlsZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZU9yU2hhZG93Um9vdChwYXJlbnQpLCBuZXdDaGlsZCwgcmVmQ2hpbGQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBvbGRDaGlsZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCkgewogICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVPclNoYWRvd1Jvb3QocGFyZW50KSwgb2xkQ2hpbGQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhcmVudE5vZGUobm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVPclNoYWRvd1Jvb3Qoc3VwZXIucGFyZW50Tm9kZSh0aGlzLm5vZGVPclNoYWRvd1Jvb3Qobm9kZSkpKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2V2ZW50cy9kb21fZXZlbnRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIERvbUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRvYykgewogICAgICAgIHN1cGVyKGRvYyk7CiAgICB9CiAgICAvLyBUaGlzIHBsdWdpbiBzaG91bGQgY29tZSBsYXN0IGluIHRoZSBsaXN0IG9mIHBsdWdpbnMsIGJlY2F1c2UgaXQgYWNjZXB0cyBhbGwKICAgIC8vIGV2ZW50cy4KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzKGV2ZW50TmFtZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgKC8qKiBAdHlwZSB7P30gKi8gKGhhbmRsZXIpKSwgZmFsc2UpOwogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoaGFuZGxlcikpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICByZXR1cm4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoY2FsbGJhY2spKSk7CiAgICB9Cn0KRG9tRXZlbnRzUGx1Z2luLsm1ZmFjID0gZnVuY3Rpb24gRG9tRXZlbnRzUGx1Z2luX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbUV2ZW50c1BsdWdpbikoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CkRvbUV2ZW50c1BsdWdpbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEb21FdmVudHNQbHVnaW4sIGZhY3Rvcnk6IERvbUV2ZW50c1BsdWdpbi7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkRvbUV2ZW50c1BsdWdpbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2V2ZW50cy9oYW1tZXJfZ2VzdHVyZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFN1cHBvcnRlZCBIYW1tZXJKUyByZWNvZ25pemVyIGV2ZW50IG5hbWVzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVWRU5UX05BTUVTID0gewogICAgLy8gcGFuCiAgICAncGFuJzogdHJ1ZSwKICAgICdwYW5zdGFydCc6IHRydWUsCiAgICAncGFubW92ZSc6IHRydWUsCiAgICAncGFuZW5kJzogdHJ1ZSwKICAgICdwYW5jYW5jZWwnOiB0cnVlLAogICAgJ3BhbmxlZnQnOiB0cnVlLAogICAgJ3BhbnJpZ2h0JzogdHJ1ZSwKICAgICdwYW51cCc6IHRydWUsCiAgICAncGFuZG93bic6IHRydWUsCiAgICAvLyBwaW5jaAogICAgJ3BpbmNoJzogdHJ1ZSwKICAgICdwaW5jaHN0YXJ0JzogdHJ1ZSwKICAgICdwaW5jaG1vdmUnOiB0cnVlLAogICAgJ3BpbmNoZW5kJzogdHJ1ZSwKICAgICdwaW5jaGNhbmNlbCc6IHRydWUsCiAgICAncGluY2hpbic6IHRydWUsCiAgICAncGluY2hvdXQnOiB0cnVlLAogICAgLy8gcHJlc3MKICAgICdwcmVzcyc6IHRydWUsCiAgICAncHJlc3N1cCc6IHRydWUsCiAgICAvLyByb3RhdGUKICAgICdyb3RhdGUnOiB0cnVlLAogICAgJ3JvdGF0ZXN0YXJ0JzogdHJ1ZSwKICAgICdyb3RhdGVtb3ZlJzogdHJ1ZSwKICAgICdyb3RhdGVlbmQnOiB0cnVlLAogICAgJ3JvdGF0ZWNhbmNlbCc6IHRydWUsCiAgICAvLyBzd2lwZQogICAgJ3N3aXBlJzogdHJ1ZSwKICAgICdzd2lwZWxlZnQnOiB0cnVlLAogICAgJ3N3aXBlcmlnaHQnOiB0cnVlLAogICAgJ3N3aXBldXAnOiB0cnVlLAogICAgJ3N3aXBlZG93bic6IHRydWUsCiAgICAvLyB0YXAKICAgICd0YXAnOiB0cnVlLAp9OwovKioKICogREkgdG9rZW4gZm9yIHByb3ZpZGluZyBbSGFtbWVySlNdKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKSBzdXBwb3J0IHRvIEFuZ3VsYXIuCiAqIEBzZWUgYEhhbW1lckdlc3R1cmVDb25maWdgCiAqCiAqIFxAbmdNb2R1bGUgSGFtbWVyTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX0dFU1RVUkVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdIYW1tZXJHZXN0dXJlQ29uZmlnJyk7Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIGEge1xAbGluayBIYW1tZXJMb2FkZXJ9IHRvIEFuZ3VsYXIuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX0xPQURFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignSGFtbWVyTG9hZGVyJyk7Ci8qKgogKiBBbiBpbmplY3RhYmxlIFtIYW1tZXJKUyBNYW5hZ2VyXShodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL2FwaS8jaGFtbWVyLm1hbmFnZXIpCiAqIGZvciBnZXN0dXJlIHJlY29nbml0aW9uLiBDb25maWd1cmVzIHNwZWNpZmljIGV2ZW50IHJlY29nbml0aW9uLgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSGFtbWVyR2VzdHVyZUNvbmZpZyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBBIHNldCBvZiBzdXBwb3J0ZWQgZXZlbnQgbmFtZXMgZm9yIGdlc3R1cmVzIHRvIGJlIHVzZWQgaW4gQW5ndWxhci4KICAgICAgICAgKiBBbmd1bGFyIHN1cHBvcnRzIGFsbCBidWlsdC1pbiByZWNvZ25pemVycywgYXMgbGlzdGVkIGluCiAgICAgICAgICogW0hhbW1lckpTIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmV2ZW50cyA9IFtdOwogICAgICAgIC8qKgogICAgICAgICAqIE1hcHMgZ2VzdHVyZSBldmVudCBuYW1lcyB0byBhIHNldCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKICAgICAgICAgKiB0aGF0IHNwZWNpZnkgb3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3Igc3BlY2lmaWMgcHJvcGVydGllcy4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBrZXkgaXMgYSBzdXBwb3J0ZWQgZXZlbnQgbmFtZSB0byBiZSBjb25maWd1cmVkLAogICAgICAgICAqIGFuZCB0aGUgb3B0aW9ucyBvYmplY3QgY29udGFpbnMgYSBzZXQgb2YgcHJvcGVydGllcywgd2l0aCBvdmVycmlkZSB2YWx1ZXMKICAgICAgICAgKiB0byBiZSBhcHBsaWVkIHRvIHRoZSBuYW1lZCByZWNvZ25pemVyIGV2ZW50LgogICAgICAgICAqIEZvciBleGFtcGxlLCB0byBkaXNhYmxlIHJlY29nbml0aW9uIG9mIHRoZSByb3RhdGUgZXZlbnQsIHNwZWNpZnkKICAgICAgICAgKiAgYHsicm90YXRlIjogeyJlbmFibGUiOiBmYWxzZX19YC4KICAgICAgICAgKgogICAgICAgICAqIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHByZXNlbnQgdGFrZSB0aGUgSGFtbWVySlMgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgICogRm9yIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBmb3Igd2hpY2ggZXZlbnRzLAogICAgICAgICAqIGFuZCB0aGVpciBhbGxvd2VkIGFuZCBkZWZhdWx0IHZhbHVlcywgc2VlCiAgICAgICAgICogW0hhbW1lckpTIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKS4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHRoaXMub3ZlcnJpZGVzID0ge307CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBbSGFtbWVySlMgTWFuYWdlcl0oaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvI2hhbW1lci5tYW5hZ2VyKQogICAgICogYW5kIGF0dGFjaGVzIGl0IHRvIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgd2lsbCByZWNvZ25pemUgZ2VzdHVyZXMuCiAgICAgKiBAcmV0dXJuIHs/fSBBIEhhbW1lckpTIGV2ZW50LW1hbmFnZXIgb2JqZWN0LgogICAgICovCiAgICBidWlsZEhhbW1lcihlbGVtZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1jID0gbmV3ICgvKiogQHR5cGUgez99ICovIChIYW1tZXIpKShlbGVtZW50LCB0aGlzLm9wdGlvbnMpOwogICAgICAgIG1jLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7CiAgICAgICAgbWMuZ2V0KCdyb3RhdGUnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7CiAgICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdGhpcy5vdmVycmlkZXMpIHsKICAgICAgICAgICAgbWMuZ2V0KGV2ZW50TmFtZSkuc2V0KHRoaXMub3ZlcnJpZGVzW2V2ZW50TmFtZV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWM7CiAgICB9Cn0KSGFtbWVyR2VzdHVyZUNvbmZpZy7JtWZhYyA9IGZ1bmN0aW9uIEhhbW1lckdlc3R1cmVDb25maWdfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFtbWVyR2VzdHVyZUNvbmZpZykoKTsgfTsKSGFtbWVyR2VzdHVyZUNvbmZpZy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIYW1tZXJHZXN0dXJlQ29uZmlnLCBmYWN0b3J5OiBIYW1tZXJHZXN0dXJlQ29uZmlnLsm1ZmFjIH0pOwovKioKICogRXZlbnQgcGx1Z2luIHRoYXQgYWRkcyBIYW1tZXIgc3VwcG9ydCB0byBhbiBhcHBsaWNhdGlvbi4KICoKICogXEBuZ01vZHVsZSBIYW1tZXJNb2R1bGUKICovCmNsYXNzIEhhbW1lckdlc3R1cmVzUGx1Z2luIGV4dGVuZHMgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAqIEBwYXJhbSB7P30gX2NvbmZpZwogICAgICogQHBhcmFtIHs/fSBjb25zb2xlCiAgICAgKiBAcGFyYW0gez89fSBsb2FkZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoZG9jLCBfY29uZmlnLCBjb25zb2xlLCBsb2FkZXIpIHsKICAgICAgICBzdXBlcihkb2MpOwogICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgdGhpcy5jb25zb2xlID0gY29uc29sZTsKICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzKGV2ZW50TmFtZSkgewogICAgICAgIGlmICghRVZFTlRfTkFNRVMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkpICYmICF0aGlzLmlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuSGFtbWVyICYmICF0aGlzLmxvYWRlcikgewogICAgICAgICAgICB0aGlzLmNvbnNvbGUud2FybihgVGhlICIke2V2ZW50TmFtZX0iIGV2ZW50IGNhbm5vdCBiZSBib3VuZCBiZWNhdXNlIEhhbW1lci5KUyBpcyBub3QgYCArCiAgICAgICAgICAgICAgICBgbG9hZGVkIGFuZCBubyBjdXN0b20gbG9hZGVyIGhhcyBiZWVuIHNwZWNpZmllZC5gKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHBhcmFtIHs/fSBoYW5kbGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTsKICAgICAgICBldmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAvLyBJZiBIYW1tZXIgaXMgbm90IHByZXNlbnQgYnV0IGEgbG9hZGVyIGlzIHNwZWNpZmllZCwgd2UgZGVmZXIgYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lcgogICAgICAgIC8vIHVudGlsIEhhbW1lciBpcyBsb2FkZWQuCiAgICAgICAgaWYgKCEoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5IYW1tZXIgJiYgdGhpcy5sb2FkZXIpIHsKICAgICAgICAgICAgLy8gVGhpcyBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kIHJldHVybnMgYSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVyLgogICAgICAgICAgICAvLyBVbnRpbCBIYW1tZXIgaXMgbG9hZGVkLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gbmVlZHMgdG8gKmNhbmNlbCogdGhlIHJlZ2lzdHJhdGlvbiByYXRoZXIKICAgICAgICAgICAgLy8gdGhhbiByZW1vdmUgYW55dGhpbmcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNhbmNlbFJlZ2lzdHJhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZXJlZ2lzdGVyID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgY2FuY2VsUmVnaXN0cmF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVyKCkKICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIElmIEhhbW1lciBpc24ndCBhY3R1YWxseSBsb2FkZWQgd2hlbiB0aGUgY3VzdG9tIGxvYWRlciByZXNvbHZlcywgZ2l2ZSB1cC4KICAgICAgICAgICAgICAgIGlmICghKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuSGFtbWVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLndhcm4oYFRoZSBjdXN0b20gSEFNTUVSX0xPQURFUiBjb21wbGV0ZWQsIGJ1dCBIYW1tZXIuSlMgaXMgbm90IHByZXNlbnQuYCk7CiAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlciA9ICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxSZWdpc3RyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBIYW1tZXIgaXMgbG9hZGVkIGFuZCB0aGUgbGlzdGVuZXIgaXMgYmVpbmcgbG9hZGVkIGZvciByZWFsLAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBjaGFuZ2VzIGZyb20gY2FuY2VsaW5nIHJlZ2lzdHJhdGlvbiB0byByZW1vdmFsLgogICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXIgPSB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAuY2F0Y2goKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLndhcm4oYFRoZSAiJHtldmVudE5hbWV9IiBldmVudCBjYW5ub3QgYmUgYm91bmQgYmVjYXVzZSB0aGUgY3VzdG9tIGAgKwogICAgICAgICAgICAgICAgICAgIGBIYW1tZXIuSlMgbG9hZGVyIGZhaWxlZC5gKTsKICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXIgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgKmV4ZWN1dGVzKiBgZGVyZWdpc3RlcmAgKGFuZCBub3QgYGRlcmVnaXN0ZXJgIGl0c2VsZikgc28gdGhhdCB3ZQogICAgICAgICAgICAvLyBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBgZGVyZWdpc3RlcmAgb25jZSB0aGUgbGlzdGVuZXIgaXMgYWRkZWQuIFVzaW5nIGEgY2xvc3VyZSBpbgogICAgICAgICAgICAvLyB0aGlzIHdheSBhbGxvd3MgdXMgdG8gYXZvaWQgYW55IGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHRyYWNrIGxpc3RlbmVyIHJlbW92YWwuCiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIENyZWF0aW5nIHRoZSBtYW5hZ2VyIGJpbmQgZXZlbnRzLCBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiBhbmd1bGFyCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWMgPSB0aGlzLl9jb25maWcuYnVpbGRIYW1tZXIoZWxlbWVudCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRPYmoKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChldmVudE9iaikgewogICAgICAgICAgICAgICAgem9uZS5ydW5HdWFyZGVkKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGV2ZW50T2JqKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG1jLm9uKGV2ZW50TmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgbWMub2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgLy8gZGVzdHJveSBtYyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1jLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBtYy5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5ldmVudHMuaW5kZXhPZihldmVudE5hbWUpID4gLTE7CiAgICB9Cn0KSGFtbWVyR2VzdHVyZXNQbHVnaW4uybVmYWMgPSBmdW5jdGlvbiBIYW1tZXJHZXN0dXJlc1BsdWdpbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJHZXN0dXJlc1BsdWdpbikoybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChIQU1NRVJfR0VTVFVSRV9DT05GSUcpLCDJtcm1aW5qZWN0KENvbnNvbGUpLCDJtcm1aW5qZWN0KEhBTU1FUl9MT0FERVIsIDgpKTsgfTsKSGFtbWVyR2VzdHVyZXNQbHVnaW4uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSGFtbWVyR2VzdHVyZXNQbHVnaW4sIGZhY3Rvcnk6IEhhbW1lckdlc3R1cmVzUGx1Z2luLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSGFtbWVyR2VzdHVyZXNQbHVnaW4uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICB7IHR5cGU6IEhhbW1lckdlc3R1cmVDb25maWcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0hBTU1FUl9HRVNUVVJFX0NPTkZJRyxdIH1dIH0sCiAgICB7IHR5cGU6IENvbnNvbGUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0hBTU1FUl9MT0FERVIsXSB9XSB9Cl07Ci8qKgogKiBJbiBJdnksIHN1cHBvcnQgZm9yIEhhbW1lciBnZXN0dXJlcyBpcyBvcHRpb25hbCwgc28gYXBwbGljYXRpb25zIG11c3QKICogaW1wb3J0IHRoZSBgSGFtbWVyTW9kdWxlYCBhdCByb290IHRvIHR1cm4gb24gc3VwcG9ydC4gVGhpcyBtZWFucyB0aGF0CiAqIEhhbW1lci1zcGVjaWZpYyBjb2RlIGNhbiBiZSB0cmVlLXNoYWtlbiBhd2F5IGlmIG5vdCBuZWVkZWQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX1BST1ZJREVSU19fUE9TVF9SM19fID0gW107Ci8qKgogKiBJbiBWaWV3IEVuZ2luZSwgc3VwcG9ydCBmb3IgSGFtbWVyIGdlc3R1cmVzIGlzIGJ1aWx0LWluIGJ5IGRlZmF1bHQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX1BST1ZJREVSU19fUFJFX1IzX18gPSBbCiAgICB7CiAgICAgICAgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLAogICAgICAgIHVzZUNsYXNzOiBIYW1tZXJHZXN0dXJlc1BsdWdpbiwKICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICBkZXBzOiBbRE9DVU1FTlQkMSwgSEFNTUVSX0dFU1RVUkVfQ09ORklHLCBDb25zb2xlLCBbbmV3IE9wdGlvbmFsKCksIEhBTU1FUl9MT0FERVJdXQogICAgfSwKICAgIHsgcHJvdmlkZTogSEFNTUVSX0dFU1RVUkVfQ09ORklHLCB1c2VDbGFzczogSGFtbWVyR2VzdHVyZUNvbmZpZywgZGVwczogW10gfSwKXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBIQU1NRVJfUFJPVklERVJTID0gSEFNTUVSX1BST1ZJREVSU19fUE9TVF9SM19fOwovKioKICogQWRkcyBzdXBwb3J0IGZvciBIYW1tZXJKUy4KICoKICogSW1wb3J0IHRoaXMgbW9kdWxlIGF0IHRoZSByb290IG9mIHlvdXIgYXBwbGljYXRpb24gc28gdGhhdCBBbmd1bGFyIGNhbiB3b3JrIHdpdGgKICogSGFtbWVySlMgdG8gZGV0ZWN0IGdlc3R1cmUgZXZlbnRzLgogKgogKiBOb3RlIHRoYXQgYXBwbGljYXRpb25zIHN0aWxsIG5lZWQgdG8gaW5jbHVkZSB0aGUgSGFtbWVySlMgc2NyaXB0IGl0c2VsZi4gVGhpcyBtb2R1bGUKICogc2ltcGx5IHNldHMgdXAgdGhlIGNvb3JkaW5hdGlvbiBsYXllciBiZXR3ZWVuIEhhbW1lckpTIGFuZCBBbmd1bGFyJ3MgRXZlbnRNYW5hZ2VyLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSGFtbWVyTW9kdWxlIHsKfQpIYW1tZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIYW1tZXJNb2R1bGUgfSk7CkhhbW1lck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhhbW1lck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogSEFNTUVSX1BST1ZJREVSU19fUFJFX1IzX18gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9kb20vZXZlbnRzL2tleV9ldmVudHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERlZmluZXMgc3VwcG9ydGVkIG1vZGlmaWVycyBmb3Iga2V5IGV2ZW50cy4KICogQHR5cGUgez99CiAqLwpjb25zdCBNT0RJRklFUl9LRVlTID0gWydhbHQnLCAnY29udHJvbCcsICdtZXRhJywgJ3NoaWZ0J107Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgPSAzOwovLyBNYXAgdG8gY29udmVydCBzb21lIGtleSBvciBrZXlJZGVudGlmaWVyIHZhbHVlcyB0byB3aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgZ2V0RXZlbnRLZXkKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfa2V5TWFwID0gewogICAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGhlcmUgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWF0Y2ggdGhlIFczQyBzdGFuZGFyZAogICAgLy8gY2YgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLWtleS8KICAgICdcYic6ICdCYWNrc3BhY2UnLAogICAgJ1x0JzogJ1RhYicsCiAgICAnXHg3Ric6ICdEZWxldGUnLAogICAgJ1x4MUInOiAnRXNjYXBlJywKICAgICdEZWwnOiAnRGVsZXRlJywKICAgICdFc2MnOiAnRXNjYXBlJywKICAgICdMZWZ0JzogJ0Fycm93TGVmdCcsCiAgICAnUmlnaHQnOiAnQXJyb3dSaWdodCcsCiAgICAnVXAnOiAnQXJyb3dVcCcsCiAgICAnRG93bic6ICdBcnJvd0Rvd24nLAogICAgJ01lbnUnOiAnQ29udGV4dE1lbnUnLAogICAgJ1Njcm9sbCc6ICdTY3JvbGxMb2NrJywKICAgICdXaW4nOiAnT1MnCn07Ci8vIFRoZXJlIGlzIGEgYnVnIGluIENocm9tZSBmb3IgbnVtZXJpYyBrZXlwYWQga2V5czoKLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE1NTY1NAovLyAxLCAyLCAzIC4uLiBhcmUgcmVwb3J0ZWQgYXMgQSwgQiwgQyAuLi4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfY2hyb21lTnVtS2V5UGFkTWFwID0gewogICAgJ0EnOiAnMScsCiAgICAnQic6ICcyJywKICAgICdDJzogJzMnLAogICAgJ0QnOiAnNCcsCiAgICAnRSc6ICc1JywKICAgICdGJzogJzYnLAogICAgJ0cnOiAnNycsCiAgICAnSCc6ICc4JywKICAgICdJJzogJzknLAogICAgJ0onOiAnKicsCiAgICAnSyc6ICcrJywKICAgICdNJzogJy0nLAogICAgJ04nOiAnLicsCiAgICAnTyc6ICcvJywKICAgICdceDYwJzogJzAnLAogICAgJ1x4OTAnOiAnTnVtTG9jaycKfTsKY29uc3QgybUwJDMkMSA9IC8qKgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwooZXZlbnQpID0+IGV2ZW50LmFsdEtleSwgybUxJDEgPSAvKioKICogQHBhcmFtIHs/fSBldmVudAogKiBAcmV0dXJuIHs/fQogKi8KKGV2ZW50KSA9PiBldmVudC5jdHJsS2V5LCDJtTIkMiA9IC8qKgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwooZXZlbnQpID0+IGV2ZW50Lm1ldGFLZXksIMm1MyQyID0gLyoqCiAqIEBwYXJhbSB7P30gZXZlbnQKICogQHJldHVybiB7P30KICovCihldmVudCkgPT4gZXZlbnQuc2hpZnRLZXk7Ci8qKgogKiBSZXRyaWV2ZXMgbW9kaWZpZXJzIGZyb20ga2V5LWV2ZW50IG9iamVjdHMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTU9ESUZJRVJfS0VZX0dFVFRFUlMgPSB7CiAgICAnYWx0JzogKMm1MCQzJDEpLAogICAgJ2NvbnRyb2wnOiAoybUxJDEpLAogICAgJ21ldGEnOiAoybUyJDIpLAogICAgJ3NoaWZ0JzogKMm1MyQyKQp9OwovKioKICogXEBwdWJsaWNBcGkKICogQSBicm93c2VyIHBsdWctaW4gdGhhdCBwcm92aWRlcyBzdXBwb3J0IGZvciBoYW5kbGluZyBvZiBrZXkgZXZlbnRzIGluIEFuZ3VsYXIuCiAqLwpjbGFzcyBLZXlFdmVudHNQbHVnaW4gZXh0ZW5kcyBFdmVudE1hbmFnZXJQbHVnaW4gewogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBhbiBpbnN0YW5jZSBvZiB0aGUgYnJvd3NlciBwbHVnLWluLgogICAgICogQHBhcmFtIHs/fSBkb2MgVGhlIGRvY3VtZW50IGluIHdoaWNoIGtleSBldmVudHMgd2lsbCBiZSBkZXRlY3RlZC4KICAgICAqLwogICAgY29uc3RydWN0b3IoZG9jKSB7CiAgICAgICAgc3VwZXIoZG9jKTsKICAgIH0KICAgIC8qKgogICAgICogUmVwb3J0cyB3aGV0aGVyIGEgbmFtZWQga2V5IGV2ZW50IGlzIHN1cHBvcnRlZC4KICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIHF1ZXJ5LgogICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgbmFtZWQga2V5IGV2ZW50IGlzIHN1cHBvcnRlZC4KICAgICAqLwogICAgc3VwcG9ydHMoZXZlbnROYW1lKSB7CiAgICAgICAgcmV0dXJuIEtleUV2ZW50c1BsdWdpbi5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpICE9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCBhbmQga2V5IGV2ZW50LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zLgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSBldmVudCB0byBsaXN0ZW4gZm9yLgogICAgICogQHBhcmFtIHs/fSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBub3RpZmljYXRpb24gb2NjdXJzLiBSZWNlaXZlcyB0aGUKICAgICAqIGV2ZW50IG9iamVjdCBhcyBhbiBhcmd1bWVudC4KICAgICAqIEByZXR1cm4gez99IFRoZSBrZXkgZXZlbnQgdGhhdCB3YXMgcmVnaXN0ZXJlZC4KICAgICAqLwogICAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyc2VkRXZlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSkpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3V0c2lkZUhhbmRsZXIgPSBLZXlFdmVudHNQbHVnaW4uZXZlbnRDYWxsYmFjayhwYXJzZWRFdmVudFsnZnVsbEtleSddLCBoYW5kbGVyLCB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpKTsKICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBnZXRET00oKS5vbkFuZENhbmNlbChlbGVtZW50LCBwYXJzZWRFdmVudFsnZG9tRXZlbnROYW1lJ10sIG91dHNpZGVIYW5kbGVyKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcnRzID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy4nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZG9tRXZlbnROYW1lID0gcGFydHMuc2hpZnQoKTsKICAgICAgICBpZiAoKHBhcnRzLmxlbmd0aCA9PT0gMCkgfHwgIShkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ID0gS2V5RXZlbnRzUGx1Z2luLl9ub3JtYWxpemVLZXkoKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzLnBvcCgpKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZnVsbEtleSA9ICcnOwogICAgICAgIE1PRElGSUVSX0tFWVMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2RpZmllck5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1vZGlmaWVyTmFtZSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJ0cy5pbmRleE9mKG1vZGlmaWVyTmFtZSk7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgZnVsbEtleSArPSBtb2RpZmllck5hbWUgKyAnLic7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgZnVsbEtleSArPSBrZXk7CiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSAwIHx8IGtleS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgLy8gcmV0dXJuaW5nIG51bGwgaW5zdGVhZCBvZiB0aHJvd2luZyB0byBsZXQgYW5vdGhlciBwbHVnaW4gcHJvY2VzcyB0aGUgZXZlbnQKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgICAgICByZXN1bHRbJ2RvbUV2ZW50TmFtZSddID0gZG9tRXZlbnROYW1lOwogICAgICAgIHJlc3VsdFsnZnVsbEtleSddID0gZnVsbEtleTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZ2V0RXZlbnRGdWxsS2V5KGV2ZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmdWxsS2V5ID0gJyc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBrZXkgPSBnZXRFdmVudEtleShldmVudCk7CiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGtleSA9PT0gJyAnKSB7CiAgICAgICAgICAgIGtleSA9ICdzcGFjZSc7IC8vIGZvciByZWFkYWJpbGl0eQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChrZXkgPT09ICcuJykgewogICAgICAgICAgICBrZXkgPSAnZG90JzsgLy8gYmVjYXVzZSAnLicgaXMgdXNlZCBhcyBhIHNlcGFyYXRvciBpbiBldmVudCBuYW1lcwogICAgICAgIH0KICAgICAgICBNT0RJRklFUl9LRVlTLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbW9kaWZpZXJOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtb2RpZmllck5hbWUgPT4gewogICAgICAgICAgICBpZiAobW9kaWZpZXJOYW1lICE9IGtleSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJHZXR0ZXIgPSBNT0RJRklFUl9LRVlfR0VUVEVSU1ttb2RpZmllck5hbWVdOwogICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyR2V0dGVyKGV2ZW50KSkgewogICAgICAgICAgICAgICAgICAgIGZ1bGxLZXkgKz0gbW9kaWZpZXJOYW1lICsgJy4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGZ1bGxLZXkgKz0ga2V5OwogICAgICAgIHJldHVybiBmdWxsS2V5OwogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIGEgaGFuZGxlciBjYWxsYmFjayBmb3IgYSBrZXkgZXZlbnQuCiAgICAgKiBAcGFyYW0gez99IGZ1bGxLZXkgVGhlIGV2ZW50IG5hbWUgdGhhdCBjb21iaW5lcyBhbGwgc2ltdWx0YW5lb3VzIGtleXN0cm9rZXMuCiAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRoYXQgcmVzcG9uZHMgdG8gdGhlIGtleSBldmVudC4KICAgICAqIEBwYXJhbSB7P30gem9uZSBUaGUgem9uZSBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgICovCiAgICBzdGF0aWMgZXZlbnRDYWxsYmFjayhmdWxsS2V5LCBoYW5kbGVyLCB6b25lKSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXZlbnQgLyoqIFRPRE8gIzkxMDAgKi8pID0+IHsKICAgICAgICAgICAgaWYgKEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpID09PSBmdWxsS2V5KSB7CiAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gaGFuZGxlcihldmVudCkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGtleU5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBfbm9ybWFsaXplS2V5KGtleU5hbWUpIHsKICAgICAgICAvLyBUT0RPOiBzd2l0Y2ggdG8gYSBNYXAgaWYgdGhlIG1hcHBpbmcgZ3Jvd3MgdG9vIG11Y2gKICAgICAgICBzd2l0Y2ggKGtleU5hbWUpIHsKICAgICAgICAgICAgY2FzZSAnZXNjJzoKICAgICAgICAgICAgICAgIHJldHVybiAnZXNjYXBlJzsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBrZXlOYW1lOwogICAgICAgIH0KICAgIH0KfQpLZXlFdmVudHNQbHVnaW4uybVmYWMgPSBmdW5jdGlvbiBLZXlFdmVudHNQbHVnaW5fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgS2V5RXZlbnRzUGx1Z2luKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKS2V5RXZlbnRzUGx1Z2luLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEtleUV2ZW50c1BsdWdpbiwgZmFjdG9yeTogS2V5RXZlbnRzUGx1Z2luLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KS2V5RXZlbnRzUGx1Z2luLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ci8qKgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRFdmVudEtleShldmVudCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGtleSA9IGV2ZW50LmtleTsKICAgIGlmIChrZXkgPT0gbnVsbCkgewogICAgICAgIGtleSA9IGV2ZW50LmtleUlkZW50aWZpZXI7CiAgICAgICAgLy8ga2V5SWRlbnRpZmllciBpcyBkZWZpbmVkIGluIHRoZSBvbGQgZHJhZnQgb2YgRE9NIExldmVsIDMgRXZlbnRzIGltcGxlbWVudGVkIGJ5IENocm9tZSBhbmQKICAgICAgICAvLyBTYWZhcmkgY2YKICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA3L1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDA3MTIyMS9ldmVudHMuaHRtbCNFdmVudHMtS2V5Ym9hcmRFdmVudHMtSW50ZXJmYWNlcwogICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJ1VuaWRlbnRpZmllZCc7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnVSsnKSkgewogICAgICAgICAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGtleS5zdWJzdHJpbmcoMiksIDE2KSk7CiAgICAgICAgICAgIGlmIChldmVudC5sb2NhdGlvbiA9PT0gRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgJiYgX2Nocm9tZU51bUtleVBhZE1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDaHJvbWUgZm9yIG51bWVyaWMga2V5cGFkIGtleXM6CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTU1NjU0CiAgICAgICAgICAgICAgICAvLyAxLCAyLCAzIC4uLiBhcmUgcmVwb3J0ZWQgYXMgQSwgQiwgQyAuLi4KICAgICAgICAgICAgICAgIGtleSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoX2Nocm9tZU51bUtleVBhZE1hcCkpKVtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9rZXlNYXBba2V5XSB8fCBrZXk7Cn0KLyoqCiAqIERvbVNhbml0aXplciBoZWxwcyBwcmV2ZW50aW5nIENyb3NzIFNpdGUgU2NyaXB0aW5nIFNlY3VyaXR5IGJ1Z3MgKFhTUykgYnkgc2FuaXRpemluZwogKiB2YWx1ZXMgdG8gYmUgc2FmZSB0byB1c2UgaW4gdGhlIGRpZmZlcmVudCBET00gY29udGV4dHMuCiAqCiAqIEZvciBleGFtcGxlLCB3aGVuIGJpbmRpbmcgYSBVUkwgaW4gYW4gYDxhIFtocmVmXT0ic29tZVZhbHVlIj5gIGh5cGVybGluaywgYHNvbWVWYWx1ZWAgd2lsbCBiZQogKiBzYW5pdGl6ZWQgc28gdGhhdCBhbiBhdHRhY2tlciBjYW5ub3QgaW5qZWN0IGUuZy4gYSBgamF2YXNjcmlwdDpgIFVSTCB0aGF0IHdvdWxkIGV4ZWN1dGUgY29kZSBvbgogKiB0aGUgd2Vic2l0ZS4KICoKICogSW4gc3BlY2lmaWMgc2l0dWF0aW9ucywgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgc2FuaXRpemF0aW9uLCBmb3IgZXhhbXBsZSBpZiB0aGUKICogYXBwbGljYXRpb24gZ2VudWluZWx5IG5lZWRzIHRvIHByb2R1Y2UgYSBgamF2YXNjcmlwdDpgIHN0eWxlIGxpbmsgd2l0aCBhIGR5bmFtaWMgdmFsdWUgaW4gaXQuCiAqIFVzZXJzIGNhbiBieXBhc3Mgc2VjdXJpdHkgYnkgY29uc3RydWN0aW5nIGEgdmFsdWUgd2l0aCBvbmUgb2YgdGhlIGBieXBhc3NTZWN1cml0eVRydXN0Li4uYAogKiBtZXRob2RzLCBhbmQgdGhlbiBiaW5kaW5nIHRvIHRoYXQgdmFsdWUgZnJvbSB0aGUgdGVtcGxhdGUuCiAqCiAqIFRoZXNlIHNpdHVhdGlvbnMgc2hvdWxkIGJlIHZlcnkgcmFyZSwgYW5kIGV4dHJhb3JkaW5hcnkgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIGNyZWF0aW5nIGEKICogQ3Jvc3MgU2l0ZSBTY3JpcHRpbmcgKFhTUykgc2VjdXJpdHkgYnVnIQogKgogKiBXaGVuIHVzaW5nIGBieXBhc3NTZWN1cml0eVRydXN0Li4uYCwgbWFrZSBzdXJlIHRvIGNhbGwgdGhlIG1ldGhvZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBhbmQgYXMKICogY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHNvdXJjZSBvZiB0aGUgdmFsdWUsIHRvIG1ha2UgaXQgZWFzeSB0byB2ZXJpZnkgbm8gc2VjdXJpdHkgYnVnIGlzCiAqIGNyZWF0ZWQgYnkgaXRzIHVzZS4KICoKICogSXQgaXMgbm90IHJlcXVpcmVkIChhbmQgbm90IHJlY29tbWVuZGVkKSB0byBieXBhc3Mgc2VjdXJpdHkgaWYgdGhlIHZhbHVlIGlzIHNhZmUsIGUuZy4gYSBVUkwgdGhhdAogKiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc3VzcGljaW91cyBwcm90b2NvbCwgb3IgYW4gSFRNTCBzbmlwcGV0IHRoYXQgZG9lcyBub3QgY29udGFpbiBkYW5nZXJvdXMKICogY29kZS4gVGhlIHNhbml0aXplciBsZWF2ZXMgc2FmZSB2YWx1ZXMgaW50YWN0LgogKgogKiBcQHNlY3VyaXR5IENhbGxpbmcgYW55IG9mIHRoZSBgYnlwYXNzU2VjdXJpdHlUcnVzdC4uLmAgQVBJcyBkaXNhYmxlcyBBbmd1bGFyJ3MgYnVpbHQtaW4KICogc2FuaXRpemF0aW9uIGZvciB0aGUgdmFsdWUgcGFzc2VkIGluLiBDYXJlZnVsbHkgY2hlY2sgYW5kIGF1ZGl0IGFsbCB2YWx1ZXMgYW5kIGNvZGUgcGF0aHMgZ29pbmcKICogaW50byB0aGlzIGNhbGwuIE1ha2Ugc3VyZSBhbnkgdXNlciBkYXRhIGlzIGFwcHJvcHJpYXRlbHkgZXNjYXBlZCBmb3IgdGhpcyBzZWN1cml0eSBjb250ZXh0LgogKiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUgW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgRG9tU2FuaXRpemVyIHsKfQpEb21TYW5pdGl6ZXIuybVmYWMgPSBmdW5jdGlvbiBEb21TYW5pdGl6ZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRG9tU2FuaXRpemVyKSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gRG9tU2FuaXRpemVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRG9tU2FuaXRpemVyX0ZhY3RvcnkoKSB7IHJldHVybiDJtcm1aW5qZWN0KERvbVNhbml0aXplckltcGwpOyB9LCB0b2tlbjogRG9tU2FuaXRpemVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkb21TYW5pdGl6ZXJJbXBsRmFjdG9yeShpbmplY3RvcikgewogICAgcmV0dXJuIG5ldyBEb21TYW5pdGl6ZXJJbXBsKGluamVjdG9yLmdldChET0NVTUVOVCQxKSk7Cn0KY2xhc3MgRG9tU2FuaXRpemVySW1wbCBleHRlbmRzIERvbVNhbml0aXplciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2FuaXRpemUoY3R4LCB2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBzd2l0Y2ggKGN0eCkgewogICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5OT05FOgogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5IVE1MOgogICAgICAgICAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codmFsdWUsICJIVE1MIiAvKiBIdG1sICovKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBTYWZlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIF9zYW5pdGl6ZUh0bWwodGhpcy5fZG9jLCBTdHJpbmcodmFsdWUpKTsKICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuU1RZTEU6CiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgIlN0eWxlIiAvKiBTdHlsZSAqLykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBfc2FuaXRpemVTdHlsZSgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlNDUklQVDoKICAgICAgICAgICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHZhbHVlLCAiU2NyaXB0IiAvKiBTY3JpcHQgKi8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgc2NyaXB0IGNvbnRleHQnKTsKICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuVVJMOgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdldFNhbml0aXphdGlvbkJ5cGFzc1R5cGUodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codmFsdWUsICJVUkwiIC8qIFVybCAqLykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBfc2FuaXRpemVVcmwoU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTDoKICAgICAgICAgICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHZhbHVlLCAiUmVzb3VyY2VVUkwiIC8qIFJlc291cmNlVXJsICovKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBTYWZlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKScpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIFNlY3VyaXR5Q29udGV4dCAke2N0eH0gKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBieXBhc3NTZWN1cml0eVRydXN0SHRtbCh2YWx1ZSkgewogICAgICAgIHJldHVybiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdEh0bWwodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBieXBhc3NTZWN1cml0eVRydXN0U3R5bGUodmFsdWUpIHsKICAgICAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQodmFsdWUpIHsKICAgICAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTY3JpcHQodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBieXBhc3NTZWN1cml0eVRydXN0VXJsKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0VXJsKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0UmVzb3VyY2VVcmwodmFsdWUpOwogICAgfQp9CkRvbVNhbml0aXplckltcGwuybVmYWMgPSBmdW5jdGlvbiBEb21TYW5pdGl6ZXJJbXBsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbVNhbml0aXplckltcGwpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KRG9tU2FuaXRpemVySW1wbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gRG9tU2FuaXRpemVySW1wbC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIERvbVNhbml0aXplckltcGxfRmFjdG9yeSgpIHsgcmV0dXJuIGRvbVNhbml0aXplckltcGxGYWN0b3J5KMm1ybVpbmplY3QoSU5KRUNUT1IpKTsgfSwgdG9rZW46IERvbVNhbml0aXplckltcGwsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbml0RG9tQWRhcHRlcigpIHsKICAgIEJyb3dzZXJEb21BZGFwdGVyLm1ha2VDdXJyZW50KCk7CiAgICBCcm93c2VyR2V0VGVzdGFiaWxpdHkuaW5pdCgpOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXJyb3JIYW5kbGVyKCkgewogICAgcmV0dXJuIG5ldyBFcnJvckhhbmRsZXIoKTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9kb2N1bWVudCgpIHsKICAgIC8vIFRlbGwgaXZ5IGFib3V0IHRoZSBnbG9iYWwgZG9jdW1lbnQKICAgIHNldERvY3VtZW50KGRvY3VtZW50KTsKICAgIHJldHVybiBkb2N1bWVudDsKfQpjb25zdCDJtTAkNCQxID0gUExBVEZPUk1fQlJPV1NFUl9JRDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJTlRFUk5BTF9CUk9XU0VSX1BMQVRGT1JNX1BST1ZJREVSUyA9IFsKICAgIHsgcHJvdmlkZTogUExBVEZPUk1fSUQsIHVzZVZhbHVlOiDJtTAkNCQxIH0sCiAgICB7IHByb3ZpZGU6IFBMQVRGT1JNX0lOSVRJQUxJWkVSLCB1c2VWYWx1ZTogaW5pdERvbUFkYXB0ZXIsIG11bHRpOiB0cnVlIH0sCiAgICB7IHByb3ZpZGU6IERPQ1VNRU5UJDEsIHVzZUZhY3Rvcnk6IF9kb2N1bWVudCwgZGVwczogW10gfSwKXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBCUk9XU0VSX1NBTklUSVpBVElPTl9QUk9WSURFUlNfX1BPU1RfUjNfXyA9IFtdOwovKioKICogXEBzZWN1cml0eSBSZXBsYWNpbmcgYnVpbHQtaW4gc2FuaXRpemF0aW9uIHByb3ZpZGVycyBleHBvc2VzIHRoZSBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuCiAqIEF0dGFja2VyLWNvbnRyb2xsZWQgZGF0YSBpbnRyb2R1Y2VkIGJ5IGFuIHVuc2FuaXRpemVkIHByb3ZpZGVyIGNvdWxkIGV4cG9zZSB5b3VyCiAqIGFwcGxpY2F0aW9uIHRvIFhTUyByaXNrcy4gRm9yIG1vcmUgZGV0YWlsLCBzZWUgdGhlIFtTZWN1cml0eSBHdWlkZV0oaHR0cDovL2cuY28vbmcvc2VjdXJpdHkpLgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUyA9IEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSU19fUE9TVF9SM19fOwovKioKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBwbGF0Zm9ybUJyb3dzZXIgPSBjcmVhdGVQbGF0Zm9ybUZhY3RvcnkocGxhdGZvcm1Db3JlLCAnYnJvd3NlcicsIElOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBCUk9XU0VSX01PRFVMRV9QUk9WSURFUlMgPSBbCiAgICBCUk9XU0VSX1NBTklUSVpBVElPTl9QUk9WSURFUlMsCiAgICB7IHByb3ZpZGU6IElOSkVDVE9SX1NDT1BFLCB1c2VWYWx1ZTogJ3Jvb3QnIH0sCiAgICB7IHByb3ZpZGU6IEVycm9ySGFuZGxlciwgdXNlRmFjdG9yeTogZXJyb3JIYW5kbGVyLCBkZXBzOiBbXSB9LAogICAgewogICAgICAgIHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUywKICAgICAgICB1c2VDbGFzczogRG9tRXZlbnRzUGx1Z2luLAogICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgIGRlcHM6IFtET0NVTUVOVCQxLCBOZ1pvbmUsIFBMQVRGT1JNX0lEXQogICAgfSwKICAgIHsgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCB1c2VDbGFzczogS2V5RXZlbnRzUGx1Z2luLCBtdWx0aTogdHJ1ZSwgZGVwczogW0RPQ1VNRU5UJDFdIH0sCiAgICBIQU1NRVJfUFJPVklERVJTLAogICAgewogICAgICAgIHByb3ZpZGU6IERvbVJlbmRlcmVyRmFjdG9yeTIsCiAgICAgICAgdXNlQ2xhc3M6IERvbVJlbmRlcmVyRmFjdG9yeTIsCiAgICAgICAgZGVwczogW0V2ZW50TWFuYWdlciwgRG9tU2hhcmVkU3R5bGVzSG9zdCwgQVBQX0lEXQogICAgfSwKICAgIHsgcHJvdmlkZTogUmVuZGVyZXJGYWN0b3J5MiwgdXNlRXhpc3Rpbmc6IERvbVJlbmRlcmVyRmFjdG9yeTIgfSwKICAgIHsgcHJvdmlkZTogU2hhcmVkU3R5bGVzSG9zdCwgdXNlRXhpc3Rpbmc6IERvbVNoYXJlZFN0eWxlc0hvc3QgfSwKICAgIHsgcHJvdmlkZTogRG9tU2hhcmVkU3R5bGVzSG9zdCwgdXNlQ2xhc3M6IERvbVNoYXJlZFN0eWxlc0hvc3QsIGRlcHM6IFtET0NVTUVOVCQxXSB9LAogICAgeyBwcm92aWRlOiBUZXN0YWJpbGl0eSwgdXNlQ2xhc3M6IFRlc3RhYmlsaXR5LCBkZXBzOiBbTmdab25lXSB9LAogICAgeyBwcm92aWRlOiBFdmVudE1hbmFnZXIsIHVzZUNsYXNzOiBFdmVudE1hbmFnZXIsIGRlcHM6IFtFVkVOVF9NQU5BR0VSX1BMVUdJTlMsIE5nWm9uZV0gfSwKICAgIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLApdOwovKioKICogRXhwb3J0cyByZXF1aXJlZCBpbmZyYXN0cnVjdHVyZSBmb3IgYWxsIEFuZ3VsYXIgYXBwcy4KICogSW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbGwgQW5ndWxhciBhcHBzIGNyZWF0ZWQgd2l0aCB0aGUgQ0xJCiAqIGBuZXdgIGNvbW1hbmQuCiAqIFJlLWV4cG9ydHMgYENvbW1vbk1vZHVsZWAgYW5kIGBBcHBsaWNhdGlvbk1vZHVsZWAsIG1ha2luZyB0aGVpcgogKiBleHBvcnRzIGFuZCBwcm92aWRlcnMgYXZhaWxhYmxlIHRvIGFsbCBhcHBzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQnJvd3Nlck1vZHVsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50TW9kdWxlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHBhcmVudE1vZHVsZSkgewogICAgICAgIGlmIChwYXJlbnRNb2R1bGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm93c2VyTW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gY29tbW9uIGRpcmVjdGl2ZXMgc3VjaCBhcyBOZ0lmIGFuZCBOZ0ZvciBmcm9tIGEgbGF6eSBsb2FkZWQgbW9kdWxlLCBpbXBvcnQgQ29tbW9uTW9kdWxlIGluc3RlYWQuYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIGEgYnJvd3Nlci1iYXNlZCBhcHAgdG8gdHJhbnNpdGlvbiBmcm9tIGEgc2VydmVyLXJlbmRlcmVkIGFwcCwgaWYKICAgICAqIG9uZSBpcyBwcmVzZW50IG9uIHRoZSBwYWdlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcGFyYW1zIEFuIG9iamVjdCBjb250YWluaW5nIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBhcHAgdG8gdHJhbnNpdGlvbi4KICAgICAqIFRoZSBJRCBtdXN0IG1hdGNoIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIHZlcnNpb25zIG9mIHRoZSBhcHAuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcmVjb25maWd1cmVkIGBCcm93c2VyTW9kdWxlYCB0byBpbXBvcnQgaW50byB0aGUgYXBwJ3Mgcm9vdCBgQXBwTW9kdWxlYC4KICAgICAqLwogICAgc3RhdGljIHdpdGhTZXJ2ZXJUcmFuc2l0aW9uKHBhcmFtcykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5nTW9kdWxlOiBCcm93c2VyTW9kdWxlLAogICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogQVBQX0lELCB1c2VWYWx1ZTogcGFyYW1zLmFwcElkIH0sCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IFRSQU5TSVRJT05fSUQsIHVzZUV4aXN0aW5nOiBBUFBfSUQgfSwKICAgICAgICAgICAgICAgIFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUywKICAgICAgICAgICAgXSwKICAgICAgICB9OwogICAgfQp9CkJyb3dzZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBCcm93c2VyTW9kdWxlIH0pOwpCcm93c2VyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJvd3Nlck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCcm93c2VyTW9kdWxlKSjJtcm1aW5qZWN0KEJyb3dzZXJNb2R1bGUsIDEyKSk7IH0sIHByb3ZpZGVyczogQlJPV1NFUl9NT0RVTEVfUFJPVklERVJTLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBBcHBsaWNhdGlvbk1vZHVsZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpCcm93c2VyTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2tpcFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtCcm93c2VyTW9kdWxlLF0gfV0gfQpdOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShCcm93c2VyTW9kdWxlLCB7IGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsIEFwcGxpY2F0aW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvbWV0YS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogRmFjdG9yeSB0byBjcmVhdGUgTWV0YSBzZXJ2aWNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlTWV0YSgpIHsKICAgIHJldHVybiBuZXcgTWV0YSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsKfQovKioKICogQSBzZXJ2aWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGFuZCBhZGQgbWV0YSB0YWdzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTWV0YSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgdGhpcy5fZG9jID0gX2RvYzsKICAgICAgICB0aGlzLl9kb20gPSBnZXRET00oKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAqIEBwYXJhbSB7Pz19IGZvcmNlQ3JlYXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFRhZyh0YWcsIGZvcmNlQ3JlYXRpb24gPSBmYWxzZSkgewogICAgICAgIGlmICghdGFnKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVFbGVtZW50KHRhZywgZm9yY2VDcmVhdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFncwogICAgICogQHBhcmFtIHs/PX0gZm9yY2VDcmVhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkVGFncyh0YWdzLCBmb3JjZUNyZWF0aW9uID0gZmFsc2UpIHsKICAgICAgICBpZiAoIXRhZ3MpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdGFncy5yZWR1Y2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZXN1bHQsIHRhZykgPT4gewogICAgICAgICAgICBpZiAodGFnKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQodGFnLCBmb3JjZUNyZWF0aW9uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KSwgW10pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGF0dHJTZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VGFnKGF0dHJTZWxlY3RvcikgewogICAgICAgIGlmICghYXR0clNlbGVjdG9yKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jLnF1ZXJ5U2VsZWN0b3IoYG1ldGFbJHthdHRyU2VsZWN0b3J9XWApIHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXR0clNlbGVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRUYWdzKGF0dHJTZWxlY3RvcikgewogICAgICAgIGlmICghYXR0clNlbGVjdG9yKQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxpc3QgLypOb2RlTGlzdCovID0gdGhpcy5fZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoYG1ldGFbJHthdHRyU2VsZWN0b3J9XWApOwogICAgICAgIHJldHVybiBsaXN0ID8gW10uc2xpY2UuY2FsbChsaXN0KSA6IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVwZGF0ZVRhZyh0YWcsIHNlbGVjdG9yKSB7CiAgICAgICAgaWYgKCF0YWcpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgfHwgdGhpcy5fcGFyc2VTZWxlY3Rvcih0YWcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZ2V0VGFnKHNlbGVjdG9yKSkpOwogICAgICAgIGlmIChtZXRhKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModGFnLCBtZXRhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9yQ3JlYXRlRWxlbWVudCh0YWcsIHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGF0dHJTZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlVGFnKGF0dHJTZWxlY3RvcikgewogICAgICAgIHRoaXMucmVtb3ZlVGFnRWxlbWVudCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5nZXRUYWcoYXR0clNlbGVjdG9yKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVUYWdFbGVtZW50KG1ldGEpIHsKICAgICAgICBpZiAobWV0YSkgewogICAgICAgICAgICB0aGlzLl9kb20ucmVtb3ZlKG1ldGEpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHBhcmFtIHs/PX0gZm9yY2VDcmVhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE9yQ3JlYXRlRWxlbWVudChtZXRhLCBmb3JjZUNyZWF0aW9uID0gZmFsc2UpIHsKICAgICAgICBpZiAoIWZvcmNlQ3JlYXRpb24pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuX3BhcnNlU2VsZWN0b3IobWV0YSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLmdldFRhZyhzZWxlY3RvcikpKTsKICAgICAgICAgICAgLy8gSXQncyBhbGxvd2VkIHRvIGhhdmUgbXVsdGlwbGUgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lIHNvIGl0J3Mgbm90IGVub3VnaCB0bwogICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHRoYXQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBwYWdlLiBXZSBhbHNvIG5lZWQgdG8KICAgICAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCBoYXMgdGFnIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKGVsZW0gJiYgdGhpcy5fY29udGFpbnNBdHRyaWJ1dGVzKG1ldGEsIGVsZW0pKQogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdtZXRhJykpKTsKICAgICAgICB0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXMobWV0YSwgZWxlbWVudCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLl9kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKICAgICAgICBoZWFkLmFwcGVuZENoaWxkKGVsZW1lbnQpOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModGFnLCBlbCkgewogICAgICAgIE9iamVjdC5rZXlzKHRhZykuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocHJvcCkgPT4gZWwuc2V0QXR0cmlidXRlKHByb3AsIHRhZ1twcm9wXSkpKTsKICAgICAgICByZXR1cm4gZWw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3BhcnNlU2VsZWN0b3IodGFnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF0dHIgPSB0YWcubmFtZSA/ICduYW1lJyA6ICdwcm9wZXJ0eSc7CiAgICAgICAgcmV0dXJuIGAke2F0dHJ9PSIke3RhZ1thdHRyXX0iYDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdGFnCiAgICAgKiBAcGFyYW0gez99IGVsZW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jb250YWluc0F0dHJpYnV0ZXModGFnLCBlbGVtKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhZykuZXZlcnkoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoa2V5KSA9PiBlbGVtLmdldEF0dHJpYnV0ZShrZXkpID09PSB0YWdba2V5XSkpOwogICAgfQp9Ck1ldGEuybVmYWMgPSBmdW5jdGlvbiBNZXRhX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldGEpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KTWV0YS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gTWV0YS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGNyZWF0ZU1ldGEsIHRva2VuOiBNZXRhLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9icm93c2VyL3RpdGxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBGYWN0b3J5IHRvIGNyZWF0ZSBUaXRsZSBzZXJ2aWNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVGl0bGUoKSB7CiAgICByZXR1cm4gbmV3IFRpdGxlKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOwp9Ci8qKgogKiBBIHNlcnZpY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgYW5kIHNldCB0aGUgdGl0bGUgb2YgYSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAqCiAqIFNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuJ3QgYmUgYm9vdHN0cmFwcGVkIG9uIHRoZSBlbnRpcmUgSFRNTCBkb2N1bWVudCAoYDxodG1sPmAgdGFnKQogKiBpdCBpcyBub3QgcG9zc2libGUgdG8gYmluZCB0byB0aGUgYHRleHRgIHByb3BlcnR5IG9mIHRoZSBgSFRNTFRpdGxlRWxlbWVudGAgZWxlbWVudHMKICogKHJlcHJlc2VudGluZyB0aGUgYDx0aXRsZT5gIHRhZykuIEluc3RlYWQsIHRoaXMgc2VydmljZSBjYW4gYmUgdXNlZCB0byBzZXQgYW5kIGdldCB0aGUgY3VycmVudAogKiB0aXRsZSB2YWx1ZS4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFRpdGxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRUaXRsZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jLnRpdGxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAgICAgKiBAcGFyYW0gez99IG5ld1RpdGxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRUaXRsZShuZXdUaXRsZSkgewogICAgICAgIHRoaXMuX2RvYy50aXRsZSA9IG5ld1RpdGxlIHx8ICcnOwogICAgfQp9ClRpdGxlLsm1ZmFjID0gZnVuY3Rpb24gVGl0bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGl0bGUpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KVGl0bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFRpdGxlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogY3JlYXRlVGl0bGUsIHRva2VuOiBUaXRsZSwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwovKioKICogQHBhcmFtIHs/fSB0ZXh0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1bmVzY2FwZUh0bWwodGV4dCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdW5lc2NhcGVkVGV4dCA9IHsKICAgICAgICAnJmE7JzogJyYnLAogICAgICAgICcmcTsnOiAnIicsCiAgICAgICAgJyZzOyc6ICdcJycsCiAgICAgICAgJyZsOyc6ICc8JywKICAgICAgICAnJmc7JzogJz4nLAogICAgfTsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoLyZbXjtdKzsvZywgKC8qKgogICAgICogQHBhcmFtIHs/fSBzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzID0+IHVuZXNjYXBlZFRleHRbc10pKTsKfQovKioKICogQSBrZXkgdmFsdWUgc3RvcmUgdGhhdCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUgdG8gdGhlIGFwcGxpY2F0aW9uCiAqIG9uIHRoZSBjbGllbnQgc2lkZS4KICoKICogYFRyYW5zZmVyU3RhdGVgIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGFuIGluamVjdGFibGUgdG9rZW4uIFRvIHVzZSBpdCBpbXBvcnQKICogYFNlcnZlclRyYW5zZmVyU3RhdGVNb2R1bGVgIG9uIHRoZSBzZXJ2ZXIgYW5kIGBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZWAgb24gdGhlIGNsaWVudC4KICoKICogVGhlIHZhbHVlcyBpbiB0aGUgc3RvcmUgYXJlIHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkIHVzaW5nIEpTT04uc3RyaW5naWZ5L0pTT04ucGFyc2UuIFNvIG9ubHkKICogYm9vbGVhbiwgbnVtYmVyLCBzdHJpbmcsIG51bGwgYW5kIG5vbi1jbGFzcyBvYmplY3RzIHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWx6aWVkIGluIGEKICogbm9uLWxvc3N5IG1hbm5lci4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFRyYW5zZmVyU3RhdGUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zdG9yZSA9IHt9OwogICAgICAgIHRoaXMub25TZXJpYWxpemVDYWxsYmFja3MgPSB7fTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBpbml0U3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBpbml0KGluaXRTdGF0ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0cmFuc2ZlclN0YXRlID0gbmV3IFRyYW5zZmVyU3RhdGUoKTsKICAgICAgICB0cmFuc2ZlclN0YXRlLnN0b3JlID0gaW5pdFN0YXRlOwogICAgICAgIHJldHVybiB0cmFuc2ZlclN0YXRlOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBrZXkuIFJldHVybiBgZGVmYXVsdFZhbHVlYCBpZiBrZXkgaXMgbm90IGZvdW5kLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IGRlZmF1bHRWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KGtleSwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVba2V5XSAhPT0gdW5kZWZpbmVkID8gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuc3RvcmVba2V5XSkpIDogZGVmYXVsdFZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBrZXkuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldChrZXksIHZhbHVlKSB7CiAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIGtleSBmcm9tIHRoZSBzdG9yZS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlKGtleSkgewogICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlW2tleV07CiAgICB9CiAgICAvKioKICAgICAqIFRlc3Qgd2hldGhlciBhIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBoYXNLZXkoa2V5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzT3duUHJvcGVydHkoa2V5KTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBwcm92aWRlIHRoZSB2YWx1ZSBmb3IgYSBrZXkgd2hlbiBgdG9Kc29uYCBpcyBjYWxsZWQuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU2VyaWFsaXplKGtleSwgY2FsbGJhY2spIHsKICAgICAgICB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzW2tleV0gPSBjYWxsYmFjazsKICAgIH0KICAgIC8qKgogICAgICogU2VyaWFsaXplIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdG9yZSB0byBKU09OLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9Kc29uKCkgewogICAgICAgIC8vIENhbGwgdGhlIG9uU2VyaWFsaXplIGNhbGxiYWNrcyBhbmQgcHV0IHRob3NlIHZhbHVlcyBpbnRvIHRoZSBzdG9yZS4KICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1trZXldKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIGluIG9uU2VyaWFsaXplIGNhbGxiYWNrOiAnLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZSk7CiAgICB9Cn0KVHJhbnNmZXJTdGF0ZS7JtWZhYyA9IGZ1bmN0aW9uIFRyYW5zZmVyU3RhdGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVHJhbnNmZXJTdGF0ZSkoKTsgfTsKVHJhbnNmZXJTdGF0ZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUcmFuc2ZlclN0YXRlLCBmYWN0b3J5OiBUcmFuc2ZlclN0YXRlLsm1ZmFjIH0pOwovKioKICogQHBhcmFtIHs/fSBkb2MKICogQHBhcmFtIHs/fSBhcHBJZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5pdFRyYW5zZmVyU3RhdGUoZG9jLCBhcHBJZCkgewogICAgLy8gTG9jYXRlIHRoZSBzY3JpcHQgdGFnIHdpdGggdGhlIEpTT04gZGF0YSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAvLyBUaGUgaWQgb2YgdGhlIHNjcmlwdCB0YWcgaXMgc2V0IHRvIHRoZSBBbmd1bGFyIGFwcElkICsgJ3N0YXRlJy4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChhcHBJZCArICctc3RhdGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbml0aWFsU3RhdGUgPSB7fTsKICAgIGlmIChzY3JpcHQgJiYgc2NyaXB0LnRleHRDb250ZW50KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaW5pdGlhbFN0YXRlID0gSlNPTi5wYXJzZSh1bmVzY2FwZUh0bWwoc2NyaXB0LnRleHRDb250ZW50KSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIHdoaWxlIHJlc3RvcmluZyBUcmFuc2ZlclN0YXRlIGZvciBhcHAgJyArIGFwcElkLCBlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gVHJhbnNmZXJTdGF0ZS5pbml0KGluaXRpYWxTdGF0ZSk7Cn0KLyoqCiAqIE5nTW9kdWxlIHRvIGluc3RhbGwgb24gdGhlIGNsaWVudCBzaWRlIHdoaWxlIHVzaW5nIHRoZSBgVHJhbnNmZXJTdGF0ZWAgdG8gdHJhbnNmZXIgc3RhdGUgZnJvbQogKiBzZXJ2ZXIgdG8gY2xpZW50LgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUgewp9CkJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUgfSk7CkJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVHJhbnNmZXJTdGF0ZSwgdXNlRmFjdG9yeTogaW5pdFRyYW5zZmVyU3RhdGUsIGRlcHM6IFtET0NVTUVOVCQxLCBBUFBfSURdIH1dIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvcHJpdmF0ZV9leHBvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL3ZlcnNpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVkVSU0lPTiQyID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7Cgp2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCi8qKgoqIEBsaWNlbnNlIEFuZ3VsYXIgdjkuMS4wLW5leHQuNCs2MS5zaGEtZTU1MjU5MS53aXRoLWxvY2FsLWNoYW5nZXMKKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KKiBMaWNlbnNlOiBNSVQKKi8KKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAKICAgICAgICBmYWN0b3J5KCk7Cn0oKGZ1bmN0aW9uICgpIHsKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIHZhciBab25lJDEgPSAoZnVuY3Rpb24gKGdsb2JhbCkgewogICAgICAgIHZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbFsncGVyZm9ybWFuY2UnXTsKICAgICAgICBmdW5jdGlvbiBtYXJrKG5hbWUpIHsgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2VbJ21hcmsnXSAmJiBwZXJmb3JtYW5jZVsnbWFyayddKG5hbWUpOyB9CiAgICAgICAgZnVuY3Rpb24gcGVyZm9ybWFuY2VNZWFzdXJlKG5hbWUsIGxhYmVsKSB7CiAgICAgICAgICAgIHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10gJiYgcGVyZm9ybWFuY2VbJ21lYXN1cmUnXShuYW1lLCBsYWJlbCk7CiAgICAgICAgfQogICAgICAgIG1hcmsoJ1pvbmUnKTsKICAgICAgICAvLyBJbml0aWFsaXplIGJlZm9yZSBpdCdzIGFjY2Vzc2VkIGJlbG93LgogICAgICAgIC8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lCiAgICAgICAgLy8gc3ltYm9sIHByZWZpeCB3aXRoIGEgY3VzdG9tIG9uZSBpZiBuZWVkZWQuCiAgICAgICAgdmFyIHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJzsKICAgICAgICBmdW5jdGlvbiBfX3N5bWJvbF9fKG5hbWUpIHsgcmV0dXJuIHN5bWJvbFByZWZpeCArIG5hbWU7IH0KICAgICAgICB2YXIgY2hlY2tEdXBsaWNhdGUgPSBnbG9iYWxbX19zeW1ib2xfXygnZm9yY2VEdXBsaWNhdGVab25lQ2hlY2snKV0gPT09IHRydWU7CiAgICAgICAgaWYgKGdsb2JhbFsnWm9uZSddKSB7CiAgICAgICAgICAgIC8vIGlmIGdsb2JhbFsnWm9uZSddIGFscmVhZHkgZXhpc3RzIChtYXliZSB6b25lLmpzIHdhcyBhbHJlYWR5IGxvYWRlZCBvcgogICAgICAgICAgICAvLyBzb21lIG90aGVyIGxpYiBhbHNvIHJlZ2lzdGVyZWQgYSBnbG9iYWwgb2JqZWN0IG5hbWVkIFpvbmUpLCB3ZSBtYXkgbmVlZAogICAgICAgICAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLgogICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgLy8gd2UgaGF2ZSB0d28gd2ViIHBhZ2VzLCBwYWdlMSBpbmNsdWRlcyB6b25lLmpzLCBwYWdlMiBkb2Vzbid0LgogICAgICAgICAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLAogICAgICAgICAgICAvLyBidXQgd2hlbiB1c2VyIGxvYWQgcGFnZTIgYWdhaW4sIGVycm9yIG9jY3VycyBiZWNhdXNlIGdsb2JhbFsnWm9uZSddIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAvLyBzbyB3ZSBhZGQgYSBmbGFnIHRvIGxldCB1c2VyIGNob29zZSB3aGV0aGVyIHRvIHRocm93IHRoaXMgZXJyb3Igb3Igbm90LgogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLgogICAgICAgICAgICBpZiAoY2hlY2tEdXBsaWNhdGUgfHwgdHlwZW9mIGdsb2JhbFsnWm9uZSddLl9fc3ltYm9sX18gIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWm9uZSBhbHJlYWR5IGxvYWRlZC4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxbJ1pvbmUnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgWm9uZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gWm9uZShwYXJlbnQsIHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB0aGlzLl9uYW1lID0gem9uZVNwZWMgPyB6b25lU3BlYy5uYW1lIHx8ICd1bm5hbWVkJyA6ICc8cm9vdD4nOwogICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHpvbmVTcGVjICYmIHpvbmVTcGVjLnByb3BlcnRpZXMgfHwge307CiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUgPQogICAgICAgICAgICAgICAgICAgIG5ldyBab25lRGVsZWdhdGUodGhpcywgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5fem9uZURlbGVnYXRlLCB6b25lU3BlYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZS5hc3NlcnRab25lUGF0Y2hlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChnbG9iYWxbJ1Byb21pc2UnXSAhPT0gcGF0Y2hlc1snWm9uZUF3YXJlUHJvbWlzZSddKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lLmpzIGhhcyBkZXRlY3RlZCB0aGF0IFpvbmVBd2FyZVByb21pc2UgYCh3aW5kb3d8Z2xvYmFsKS5Qcm9taXNlYCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBiZWVuIG92ZXJ3cml0dGVuLlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICdNb3N0IGxpa2VseSBjYXVzZSBpcyB0aGF0IGEgUHJvbWlzZSBwb2x5ZmlsbCBoYXMgYmVlbiBsb2FkZWQgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuICcgKwogICAgICAgICAgICAgICAgICAgICAgICAnSWYgeW91IG11c3QgbG9hZCBvbmUsIGRvIHNvIGJlZm9yZSBsb2FkaW5nIHpvbmUuanMuKScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgInJvb3QiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoem9uZS5wYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gem9uZTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgImN1cnJlbnQiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9jdXJyZW50Wm9uZUZyYW1lLnpvbmU7IH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgImN1cnJlbnRUYXNrIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfY3VycmVudFRhc2s7IH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2ggPSBmdW5jdGlvbiAobmFtZSwgZm4pIHsKICAgICAgICAgICAgICAgIGlmIChwYXRjaGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdBbHJlYWR5IGxvYWRlZCBwYXRjaDogJyArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFnbG9iYWxbJ19fWm9uZV9kaXNhYmxlXycgKyBuYW1lXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBwZXJmTmFtZSA9ICdab25lOicgKyBuYW1lOwogICAgICAgICAgICAgICAgICAgIG1hcmsocGVyZk5hbWUpOwogICAgICAgICAgICAgICAgICAgIHBhdGNoZXNbbmFtZV0gPSBmbihnbG9iYWwsIFpvbmUsIF9hcGkpOwogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlTWVhc3VyZShwZXJmTmFtZSwgcGVyZk5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZS5wcm90b3R5cGUsICJwYXJlbnQiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lLnByb3RvdHlwZSwgIm5hbWUiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBab25lLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgem9uZSA9IHRoaXMuZ2V0Wm9uZVdpdGgoa2V5KTsKICAgICAgICAgICAgICAgIGlmICh6b25lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB6b25lLl9wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmdldFpvbmVXaXRoID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmZvcmsgPSBmdW5jdGlvbiAoem9uZVNwZWMpIHsKICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lU3BlYyByZXF1aXJlZCEnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuZm9yayh0aGlzLCB6b25lU3BlYyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGZ1bmN0aW9uIGdvdDogJyArIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgdmFyIHpvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5ydW5HdWFyZGVkKF9jYWxsYmFjaywgdGhpcywgYXJndW1lbnRzLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSB7CiAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IF9jdXJyZW50Wm9uZUZyYW1lLnBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUucnVuR3VhcmRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKGFwcGx5VGhpcyA9PT0gdm9pZCAwKSB7IGFwcGx5VGhpcyA9IG51bGw7IH0KICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAodGFzay56b25lICE9IHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgdGFzayBjYW4gb25seSBiZSBydW4gaW4gdGhlIHpvbmUgb2YgY3JlYXRpb24hIChDcmVhdGlvbjogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrLnpvbmUgfHwgTk9fWk9ORSkubmFtZSArICc7IEV4ZWN1dGlvbjogJyArIHRoaXMubmFtZSArICcpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy83NzgsIHNvbWV0aW1lcyBldmVudFRhc2sKICAgICAgICAgICAgICAgIC8vIHdpbGwgcnVuIGluIG5vdFNjaGVkdWxlZChjYW5jZWxlZCkgc3RhdGUsIHdlIHNob3VsZCBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAvLyBydW4gc3VjaCBraW5kIG9mIHRhc2sgYnV0IGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PT0gbm90U2NoZWR1bGVkICYmICh0YXNrLnR5cGUgPT09IGV2ZW50VGFzayB8fCB0YXNrLnR5cGUgPT09IG1hY3JvVGFzaykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcmVFbnRyeUd1YXJkID0gdGFzay5zdGF0ZSAhPSBydW5uaW5nOwogICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHRhc2suX3RyYW5zaXRpb25UbyhydW5uaW5nLCBzY2hlZHVsZWQpOwogICAgICAgICAgICAgICAgdGFzay5ydW5Db3VudCsrOwogICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzVGFzayA9IF9jdXJyZW50VGFzazsKICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHRhc2s7CiAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFzay50eXBlID09IG1hY3JvVGFzayAmJiB0YXNrLmRhdGEgJiYgIXRhc2suZGF0YS5pc1BlcmlvZGljKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FuY2VsRm4gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlVGFzayh0aGlzLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCByZXNldCB0aGUgc3RhdGUgdG8gc2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgIT09IG5vdFNjaGVkdWxlZCAmJiB0YXNrLnN0YXRlICE9PSB1bmtub3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnR5cGUgPT0gZXZlbnRUYXNrIHx8ICh0YXNrLmRhdGEgJiYgdGFzay5kYXRhLmlzUGVyaW9kaWMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgcnVubmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJ1bkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8obm90U2NoZWR1bGVkLCBydW5uaW5nLCBub3RTY2hlZHVsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50OwogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHByZXZpb3VzVGFzazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVUYXNrID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgIGlmICh0YXNrLnpvbmUgJiYgdGFzay56b25lICE9PSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRhc2sgd2FzIHJlc2NoZWR1bGVkLCB0aGUgbmV3Wm9uZQogICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgdGhlIGNoaWxkcmVuIG9mIHRoZSBvcmlnaW5hbCB6b25lCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdab25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdab25lID09PSB0YXNrLnpvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCJjYW4gbm90IHJlc2NoZWR1bGUgdGFzayB0byAiICsgdGhpcy5uYW1lICsgIiB3aGljaCBpcyBkZXNjZW5kYW50cyBvZiB0aGUgb3JpZ2luYWwgem9uZSAiICsgdGFzay56b25lLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTsKICAgICAgICAgICAgICAgIHZhciB6b25lRGVsZWdhdGVzID0gW107CiAgICAgICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gem9uZURlbGVnYXRlczsKICAgICAgICAgICAgICAgIHRhc2suX3pvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0YXNrID0gdGhpcy5fem9uZURlbGVnYXRlLnNjaGVkdWxlVGFzayh0aGlzLCB0YXNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgc2V0IHRhc2sncyBzdGF0ZSB0byB1bmtub3duIHdoZW4gc2NoZWR1bGVUYXNrIHRocm93IGVycm9yCiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZXJyIG1heSBmcm9tIHJlc2NoZWR1bGUsIHNvIHRoZSBmcm9tU3RhdGUgbWF5YmUgbm90U2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHVua25vd24sIHNjaGVkdWxpbmcsIG5vdFNjaGVkdWxlZCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc2hvdWxkIHdlIGNoZWNrIHRoZSByZXN1bHQgZnJvbSBoYW5kbGVFcnJvcj8KICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGFzay5fem9uZURlbGVnYXRlcyA9PT0gem9uZURlbGVnYXRlcykgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2hlY2sgYmVjYXVzZSBpbnRlcm5hbGx5IHRoZSBkZWxlZ2F0ZSBjYW4gcmVzY2hlZHVsZSB0aGUgdGFzay4KICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PSBzY2hlZHVsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgc2NoZWR1bGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2sgPSBmdW5jdGlvbiAoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlTWFjcm9UYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWFjcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlRXZlbnRUYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2soZXZlbnRUYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIGNhbmNlbGxlZCBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICsgJzsgRXhlY3V0aW9uOiAnICsgdGhpcy5uYW1lICsgJyknKTsKICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsIHRhc2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3VycyB3aGVuIGNhbmNlbFRhc2ssIHRyYW5zaXQgdGhlIHN0YXRlIHRvIHVua25vd24KICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgLTEpOwogICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgY2FuY2VsaW5nKTsKICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLl91cGRhdGVUYXNrQ291bnQgPSBmdW5jdGlvbiAodGFzaywgY291bnQpIHsKICAgICAgICAgICAgICAgIHZhciB6b25lRGVsZWdhdGVzID0gdGFzay5fem9uZURlbGVnYXRlczsKICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRhc2suX3pvbmVEZWxlZ2F0ZXMgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgem9uZURlbGVnYXRlc1tpXS5fdXBkYXRlVGFza0NvdW50KHRhc2sudHlwZSwgY291bnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gWm9uZTsKICAgICAgICB9KCkpOwogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgIFpvbmUuX19zeW1ib2xfXyA9IF9fc3ltYm9sX187CiAgICAgICAgdmFyIERFTEVHQVRFX1pTID0gewogICAgICAgICAgICBuYW1lOiAnJywKICAgICAgICAgICAgb25IYXNUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgaGFzVGFza1N0YXRlKSB7IHJldHVybiBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTsgfSwKICAgICAgICAgICAgb25TY2hlZHVsZVRhc2s6IGZ1bmN0aW9uIChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCB0YXNrKSB7IHJldHVybiBkZWxlZ2F0ZS5zY2hlZHVsZVRhc2sodGFyZ2V0LCB0YXNrKTsgfSwKICAgICAgICAgICAgb25JbnZva2VUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsgcmV0dXJuIGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7IH0sCiAgICAgICAgICAgIG9uQ2FuY2VsVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBfLCB0YXJnZXQsIHRhc2spIHsgcmV0dXJuIGRlbGVnYXRlLmNhbmNlbFRhc2sodGFyZ2V0LCB0YXNrKTsgfQogICAgICAgIH07CiAgICAgICAgdmFyIFpvbmVEZWxlZ2F0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gWm9uZURlbGVnYXRlKHpvbmUsIHBhcmVudERlbGVnYXRlLCB6b25lU3BlYykgewogICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvdW50cyA9IHsgJ21pY3JvVGFzayc6IDAsICdtYWNyb1Rhc2snOiAwLCAnZXZlbnRUYXNrJzogMCB9OwogICAgICAgICAgICAgICAgdGhpcy56b25lID0gem9uZTsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudERlbGVnYXRlID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICB0aGlzLl9mb3JrWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYyAmJiB6b25lU3BlYy5vbkZvcmsgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9mb3JrWlMpOwogICAgICAgICAgICAgICAgdGhpcy5fZm9ya0RsZ3QgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fZm9ya0RsZ3QpOwogICAgICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID0KICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmNlcHRaUyA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW50ZXJjZXB0WlMpOwogICAgICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0RGxndCA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW50ZXJjZXB0RGxndCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZSA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdEN1cnJab25lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlWlMpOwogICAgICAgICAgICAgICAgdGhpcy5faW52b2tlRGxndCA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlRGxndCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VDdXJyWm9uZSA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JaUyk7CiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPSB6b25lU3BlYyAmJgogICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JEbGd0KTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2hhbmRsZUVycm9yQ3VyclpvbmUpOwogICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza1pTKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0RsZ3QgPSB6b25lU3BlYyAmJgogICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0RsZ3QpOwogICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUgPSB6b25lU3BlYyAmJgogICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrWlMpOwogICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0RsZ3QgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrRGxndCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2taUyk7CiAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2tEbGd0KTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLl9jYW5jZWxUYXNrQ3VyclpvbmUpOwogICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0ID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gbnVsbDsKICAgICAgICAgICAgICAgIHZhciB6b25lU3BlY0hhc1Rhc2sgPSB6b25lU3BlYyAmJiB6b25lU3BlYy5vbkhhc1Rhc2s7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50SGFzVGFzayA9IHBhcmVudERlbGVnYXRlICYmIHBhcmVudERlbGVnYXRlLl9oYXNUYXNrWlM7CiAgICAgICAgICAgICAgICBpZiAoem9uZVNwZWNIYXNUYXNrIHx8IHBhcmVudEhhc1Rhc2spIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlcG9ydCBoYXNUYXNrLCB0aGFuIHRoaXMgWlMgbmVlZHMgdG8gZG8gcmVmIGNvdW50aW5nIG9uIHRhc2tzLiBJbiBzdWNoCiAgICAgICAgICAgICAgICAgICAgLy8gYSBjYXNlIGFsbCB0YXNrIHJlbGF0ZWQgaW50ZXJjZXB0b3JzIG11c3QgZ28gdGhyb3VnaCB0aGlzIFpELiBXZSBjYW4ndCBzaG9ydCBjaXJjdWl0IGl0LgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyA9IHpvbmVTcGVjSGFzVGFzayA/IHpvbmVTcGVjIDogREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gdGhpczsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrQ3VyclpvbmUgPSB6b25lOwogICAgICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25TY2hlZHVsZVRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPSBERUxFR0FURV9aUzsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkludm9rZVRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID0gREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkNhbmNlbFRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID0gREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5mb3JrID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ya1pTID8KICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKSA6CiAgICAgICAgICAgICAgICAgICAgbmV3IFpvbmUodGFyZ2V0Wm9uZSwgem9uZVNwZWMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBjYWxsYmFjaywgc291cmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlMgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTLm9uSW50ZXJjZXB0KHRoaXMuX2ludGVyY2VwdERsZ3QsIHRoaXMuX2ludGVyY2VwdEN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgc291cmNlKSA6CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlWlMgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTLm9uSW52b2tlKHRoaXMuX2ludm9rZURsZ3QsIHRoaXMuX2ludm9rZUN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgOgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KGFwcGx5VGhpcywgYXBwbHlBcmdzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBlcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUVycm9yWlMgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMub25IYW5kbGVFcnJvcih0aGlzLl9oYW5kbGVFcnJvckRsZ3QsIHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUsIHRhcmdldFpvbmUsIGVycm9yKSA6CiAgICAgICAgICAgICAgICAgICAgdHJ1ZTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5zY2hlZHVsZVRhc2sgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgdGFzaykgewogICAgICAgICAgICAgICAgdmFyIHJldHVyblRhc2sgPSB0YXNrOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NjaGVkdWxlVGFza1pTKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1Rhc2taUykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spOwogICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogICAgICAgICAgICAgICAgICAgIGlmICghcmV0dXJuVGFzaykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzayA9IHRhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5zY2hlZHVsZUZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFzay50eXBlID09IG1pY3JvVGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taUyA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTLm9uSW52b2tlVGFzayh0aGlzLl9pbnZva2VUYXNrRGxndCwgdGhpcy5faW52b2tlVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgOgogICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgdGFzaykgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCwgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghdGFzay5jYW5jZWxGbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVGFzayBpcyBub3QgY2FuY2VsYWJsZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRhc2suY2FuY2VsRm4odGFzayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaGFzVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBpc0VtcHR5KSB7CiAgICAgICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlCiAgICAgICAgICAgICAgICAvLyBjYW4gc3RpbGwgdHJpZ2dlciBoYXNUYXNrIGNhbGxiYWNrCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMub25IYXNUYXNrKHRoaXMuX2hhc1Rhc2tEbGd0LCB0aGlzLl9oYXNUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIGlzRW1wdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IodGFyZ2V0Wm9uZSwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuX3VwZGF0ZVRhc2tDb3VudCA9IGZ1bmN0aW9uICh0eXBlLCBjb3VudCkgewogICAgICAgICAgICAgICAgdmFyIGNvdW50cyA9IHRoaXMuX3Rhc2tDb3VudHM7CiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IGNvdW50c1t0eXBlXTsKICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gY291bnRzW3R5cGVdID0gcHJldiArIGNvdW50OwogICAgICAgICAgICAgICAgaWYgKG5leHQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb3JlIHRhc2tzIGV4ZWN1dGVkIHRoZW4gd2VyZSBzY2hlZHVsZWQuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocHJldiA9PSAwIHx8IG5leHQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0VtcHR5ID0gewogICAgICAgICAgICAgICAgICAgICAgICBtaWNyb1Rhc2s6IGNvdW50c1snbWljcm9UYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICBtYWNyb1Rhc2s6IGNvdW50c1snbWFjcm9UYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhc2s6IGNvdW50c1snZXZlbnRUYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHR5cGUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzVGFzayh0aGlzLnpvbmUsIGlzRW1wdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gWm9uZURlbGVnYXRlOwogICAgICAgIH0oKSk7CiAgICAgICAgdmFyIFpvbmVUYXNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmdW5jdGlvbiBab25lVGFzayh0eXBlLCBzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZUZuLCBjYW5jZWxGbikgewogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICB0aGlzLl96b25lID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMucnVuQ291bnQgPSAwOwogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGVzID0gbnVsbDsKICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnbm90U2NoZWR1bGVkJzsKICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlRm4gPSBzY2hlZHVsZUZuOwogICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxGbiA9IGNhbmNlbEZuOwogICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgaXMgbm90IGRlZmluZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24gb3B0aW9ucyBzaG91bGQgaGF2ZSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBldmVudFRhc2sgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnVzZUcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVUYXNrLmludm9rZVRhc2suY2FsbChnbG9iYWwsIHNlbGYsIHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBab25lVGFzay5pbnZva2VUYXNrID0gZnVuY3Rpb24gKHRhc2ssIHRhcmdldCwgYXJncykgewogICAgICAgICAgICAgICAgaWYgKCF0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFzayA9IHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzKys7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay56b25lLnJ1blRhc2sodGFzaywgdGFyZ2V0LCBhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgIGlmIChfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lVGFzay5wcm90b3R5cGUsICJ6b25lIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl96b25lOyB9LAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVUYXNrLnByb3RvdHlwZSwgInN0YXRlIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9zdGF0ZTsgfSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS5jYW5jZWxTY2hlZHVsZVJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHNjaGVkdWxpbmcpOyB9OwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgWm9uZVRhc2sucHJvdG90eXBlLl90cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiAodG9TdGF0ZSwgZnJvbVN0YXRlMSwgZnJvbVN0YXRlMikgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBmcm9tU3RhdGUxIHx8IHRoaXMuX3N0YXRlID09PSBmcm9tU3RhdGUyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB0b1N0YXRlOwogICAgICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlID09IG5vdFNjaGVkdWxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGVzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlICsgIiAnIiArIHRoaXMuc291cmNlICsgIic6IGNhbiBub3QgdHJhbnNpdGlvbiB0byAnIiArIHRvU3RhdGUgKyAiJywgZXhwZWN0aW5nIHN0YXRlICciICsgZnJvbVN0YXRlMSArICInIiArIChmcm9tU3RhdGUyID8gJyBvciBcJycgKyBmcm9tU3RhdGUyICsgJ1wnJyA6ICcnKSArICIsIHdhcyAnIiArIHRoaXMuX3N0YXRlICsgIicuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdHlwZW9mIHRoaXMuZGF0YS5oYW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmhhbmRsZUlkLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBhZGQgdG9KU09OIG1ldGhvZCB0byBwcmV2ZW50IGN5Y2xpYyBlcnJvciB3aGVuCiAgICAgICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spCiAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSwKICAgICAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLAogICAgICAgICAgICAgICAgICAgIHpvbmU6IHRoaXMuem9uZS5uYW1lLAogICAgICAgICAgICAgICAgICAgIHJ1bkNvdW50OiB0aGlzLnJ1bkNvdW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gWm9uZVRhc2s7CiAgICAgICAgfSgpKTsKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLy8gIE1JQ1JPVEFTSyBRVUVVRQogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIHZhciBzeW1ib2xTZXRUaW1lb3V0ID0gX19zeW1ib2xfXygnc2V0VGltZW91dCcpOwogICAgICAgIHZhciBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpOwogICAgICAgIHZhciBzeW1ib2xUaGVuID0gX19zeW1ib2xfXygndGhlbicpOwogICAgICAgIHZhciBfbWljcm9UYXNrUXVldWUgPSBbXTsKICAgICAgICB2YXIgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlOwogICAgICAgIHZhciBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2U7CiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2sodGFzaykgewogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkCiAgICAgICAgICAgIC8vIHdlIG11c3QgYm9vdHN0cmFwIHRoZSBpbml0aWFsIHRhc2sgY3JlYXRpb24gYnkgbWFudWFsbHkgc2NoZWR1bGluZyB0aGUgZHJhaW4KICAgICAgICAgICAgaWYgKF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPT09IDAgJiYgX21pY3JvVGFza1F1ZXVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuCiAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxbc3ltYm9sUHJvbWlzZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlID0gZ2xvYmFsW3N5bWJvbFByb21pc2VdLnJlc29sdmUoMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlW3N5bWJvbFRoZW5dOwogICAgICAgICAgICAgICAgICAgIGlmICghbmF0aXZlVGhlbikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXRpdmUgUHJvbWlzZSBpcyBub3QgcGF0Y2hhYmxlLCB3ZSBuZWVkIHRvIHVzZSBgdGhlbmAgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNzdWUgMTA3OAogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlWyd0aGVuJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRoZW4uY2FsbChuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UsIGRyYWluTWljcm9UYXNrUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW3N5bWJvbFNldFRpbWVvdXRdKGRyYWluTWljcm9UYXNrUXVldWUsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhc2sgJiYgX21pY3JvVGFza1F1ZXVlLnB1c2godGFzayk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRyYWluTWljcm9UYXNrUXVldWUoKSB7CiAgICAgICAgICAgIGlmICghX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSkgewogICAgICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB3aGlsZSAoX21pY3JvVGFza1F1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTsKICAgICAgICAgICAgICAgICAgICBfbWljcm9UYXNrUXVldWUgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcXVldWVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hcGkub25VbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfYXBpLm1pY3JvdGFza0RyYWluRG9uZSgpOwogICAgICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vLyAgQk9PVFNUUkFQCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgdmFyIE5PX1pPTkUgPSB7IG5hbWU6ICdOTyBaT05FJyB9OwogICAgICAgIHZhciBub3RTY2hlZHVsZWQgPSAnbm90U2NoZWR1bGVkJywgc2NoZWR1bGluZyA9ICdzY2hlZHVsaW5nJywgc2NoZWR1bGVkID0gJ3NjaGVkdWxlZCcsIHJ1bm5pbmcgPSAncnVubmluZycsIGNhbmNlbGluZyA9ICdjYW5jZWxpbmcnLCB1bmtub3duID0gJ3Vua25vd24nOwogICAgICAgIHZhciBtaWNyb1Rhc2sgPSAnbWljcm9UYXNrJywgbWFjcm9UYXNrID0gJ21hY3JvVGFzaycsIGV2ZW50VGFzayA9ICdldmVudFRhc2snOwogICAgICAgIHZhciBwYXRjaGVzID0ge307CiAgICAgICAgdmFyIF9hcGkgPSB7CiAgICAgICAgICAgIHN5bWJvbDogX19zeW1ib2xfXywKICAgICAgICAgICAgY3VycmVudFpvbmVGcmFtZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gX2N1cnJlbnRab25lRnJhbWU7IH0sCiAgICAgICAgICAgIG9uVW5oYW5kbGVkRXJyb3I6IG5vb3AsCiAgICAgICAgICAgIG1pY3JvdGFza0RyYWluRG9uZTogbm9vcCwKICAgICAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLAogICAgICAgICAgICBzaG93VW5jYXVnaHRFcnJvcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gIVpvbmVbX19zeW1ib2xfXygnaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvcicpXTsgfSwKICAgICAgICAgICAgcGF0Y2hFdmVudFRhcmdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgIHBhdGNoT25Qcm9wZXJ0aWVzOiBub29wLAogICAgICAgICAgICBwYXRjaE1ldGhvZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgYmluZEFyZ3VtZW50czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgIHBhdGNoVGhlbjogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgcGF0Y2hNYWNyb1Rhc2s6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgIHNldE5hdGl2ZVByb21pc2U6IGZ1bmN0aW9uIChOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgTmF0aXZlUHJvbWlzZS5yZXNvbHZlIHN0YXRpYyBmdW5jdGlvbgogICAgICAgICAgICAgICAgLy8gaXMgbm90IHJlYWR5IHlldCwgKHN1Y2ggYXMgY29yZS1qcy9lczYucHJvbWlzZSkKICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaGVyZS4KICAgICAgICAgICAgICAgIGlmIChOYXRpdmVQcm9taXNlICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlLnJlc29sdmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UgPSBOYXRpdmVQcm9taXNlLnJlc29sdmUoMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGNoRXZlbnRQcm90b3R5cGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgIGlzSUVPckVkZ2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9LAogICAgICAgICAgICBnZXRHbG9iYWxPYmplY3RzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmRlZmluZWQ7IH0sCiAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSwKICAgICAgICAgICAgT2JqZWN0Q3JlYXRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmRlZmluZWQ7IH0sCiAgICAgICAgICAgIEFycmF5U2xpY2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9LAogICAgICAgICAgICBwYXRjaENsYXNzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICB3cmFwV2l0aEN1cnJlbnRab25lOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfSwKICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICBfcmVkZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgcGF0Y2hDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0KICAgICAgICB9OwogICAgICAgIHZhciBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBudWxsLCB6b25lOiBuZXcgWm9uZShudWxsLCBudWxsKSB9OwogICAgICAgIHZhciBfY3VycmVudFRhc2sgPSBudWxsOwogICAgICAgIHZhciBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID0gMDsKICAgICAgICBmdW5jdGlvbiBub29wKCkgeyB9CiAgICAgICAgcGVyZm9ybWFuY2VNZWFzdXJlKCdab25lJywgJ1pvbmUnKTsKICAgICAgICByZXR1cm4gZ2xvYmFsWydab25lJ10gPSBab25lOwogICAgfSkodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIHx8IGNvbW1vbmpzR2xvYmFsKTsKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIFpvbmUuX19sb2FkX3BhdGNoKCdab25lQXdhcmVQcm9taXNlJywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7CiAgICAgICAgdmFyIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgdmFyIE9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgICAgIGZ1bmN0aW9uIHJlYWRhYmxlT2JqZWN0VG9TdHJpbmcob2JqKSB7CiAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lOwogICAgICAgICAgICAgICAgcmV0dXJuIChjbGFzc05hbWUgPyBjbGFzc05hbWUgOiAnJykgKyAnOiAnICsgSlNPTi5zdHJpbmdpZnkob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqID8gb2JqLnRvU3RyaW5nKCkgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgICAgICB9CiAgICAgICAgdmFyIF9fc3ltYm9sX18gPSBhcGkuc3ltYm9sOwogICAgICAgIHZhciBfdW5jYXVnaHRQcm9taXNlRXJyb3JzID0gW107CiAgICAgICAgdmFyIGlzRGlzYWJsZVdyYXBwaW5nVW5jYXVnaHRQcm9taXNlUmVqZWN0aW9uID0gZ2xvYmFsW19fc3ltYm9sX18oJ0RJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04nKV0gPT09IHRydWU7CiAgICAgICAgdmFyIHN5bWJvbFByb21pc2UgPSBfX3N5bWJvbF9fKCdQcm9taXNlJyk7CiAgICAgICAgdmFyIHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7CiAgICAgICAgdmFyIGNyZWF0aW9uVHJhY2UgPSAnX19jcmVhdGlvblRyYWNlX18nOwogICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGFwaS5zaG93VW5jYXVnaHRFcnJvcigpKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVqZWN0aW9uID0gZSAmJiBlLnJlamVjdGlvbjsKICAgICAgICAgICAgICAgIGlmIChyZWplY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246JywgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24ubWVzc2FnZSA6IHJlamVjdGlvbiwgJzsgWm9uZTonLCBlLnpvbmUubmFtZSwgJzsgVGFzazonLCBlLnRhc2sgJiYgZS50YXNrLnNvdXJjZSwgJzsgVmFsdWU6JywgcmVqZWN0aW9uLCByZWplY3Rpb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlamVjdGlvbi5zdGFjayA6IHVuZGVmaW5lZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhcGkubWljcm90YXNrRHJhaW5Eb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB1bmNhdWdodFByb21pc2VFcnJvciA9IF91bmNhdWdodFByb21pc2VFcnJvcnMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZS5ydW5HdWFyZGVkKGZ1bmN0aW9uICgpIHsgdGhyb3cgdW5jYXVnaHRQcm9taXNlRXJyb3I7IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkUmVqZWN0aW9uKGVycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2hpbGUgKF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBfbG9vcF8xKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0wgPSBfX3N5bWJvbF9fKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlKSB7CiAgICAgICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yKGUpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBab25lW1VOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTF07CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHsgcmV0dXJuIHZhbHVlICYmIHZhbHVlLnRoZW47IH0KICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVzb2x1dGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0KICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVqZWN0aW9uKHJlamVjdGlvbikgeyByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTsgfQogICAgICAgIHZhciBzeW1ib2xTdGF0ZSA9IF9fc3ltYm9sX18oJ3N0YXRlJyk7CiAgICAgICAgdmFyIHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTsKICAgICAgICB2YXIgc3ltYm9sRmluYWxseSA9IF9fc3ltYm9sX18oJ2ZpbmFsbHknKTsKICAgICAgICB2YXIgc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlID0gX19zeW1ib2xfXygncGFyZW50UHJvbWlzZVZhbHVlJyk7CiAgICAgICAgdmFyIHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpOwogICAgICAgIHZhciBzb3VyY2UgPSAnUHJvbWlzZS50aGVuJzsKICAgICAgICB2YXIgVU5SRVNPTFZFRCA9IG51bGw7CiAgICAgICAgdmFyIFJFU09MVkVEID0gdHJ1ZTsKICAgICAgICB2YXIgUkVKRUNURUQgPSBmYWxzZTsKICAgICAgICB2YXIgUkVKRUNURURfTk9fQ0FUQ0ggPSAwOwogICAgICAgIGZ1bmN0aW9uIG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRG8gbm90IHJldHVybiB2YWx1ZSBvciB5b3Ugd2lsbCBicmVhayB0aGUgUHJvbWlzZSBzcGVjLgogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICB2YXIgb25jZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0NhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlcih3cmFwcGVkRnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEZ1bmN0aW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIFRZUEVfRVJST1IgPSAnUHJvbWlzZSByZXNvbHZlZCB3aXRoIGl0c2VsZic7CiAgICAgICAgdmFyIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wgPSBfX3N5bWJvbF9fKCdjdXJyZW50VGFza1RyYWNlJyk7CiAgICAgICAgLy8gUHJvbWlzZSBSZXNvbHV0aW9uCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBvbmNlV3JhcHBlciA9IG9uY2UoKTsKICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFRZUEVfRVJST1IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gVU5SRVNPTFZFRCkgewogICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgZ2V0IHZhbHVlLnRoZW4gb25jZSBiYXNlZCBvbiBwcm9taXNlIHNwZWMuCiAgICAgICAgICAgICAgICB2YXIgdGhlbiA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoZnVuY3Rpb24gKCkgeyByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTsgfSkoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdmFsdWUgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlICYmCiAgICAgICAgICAgICAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkoc3ltYm9sU3RhdGUpICYmIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgIHZhbHVlW3N5bWJvbFN0YXRlXSAhPT0gVU5SRVNPTFZFRCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2YWx1ZVtzeW1ib2xTdGF0ZV0sIHZhbHVlW3N5bWJvbFZhbHVlXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgZmFsc2UpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoZnVuY3Rpb24gKCkgeyByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTsgfSkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IHN0YXRlOwogICAgICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdOwogICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sRmluYWxseV0gPT09IHN5bWJvbEZpbmFsbHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRVNPTFZFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIGlzIHJlc29sdmVkLCBzaG91bGQgaWdub3JlIHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBwcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VTdGF0ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGFzayBpbmZvcm1hdGlvbiBpbiB2YWx1ZSB3aGVuIGVycm9yIG9jY3Vycywgc28gd2UgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2UKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEICYmIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbG9uZ1N0YWNrVHJhY2Vab25lIGlzIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYWNlID0gWm9uZS5jdXJyZW50VGFzayAmJiBab25lLmN1cnJlbnRUYXNrLmRhdGEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpvbmUuY3VycmVudFRhc2suZGF0YVtjcmVhdGlvblRyYWNlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGtlZXAgdGhlIGxvbmcgc3RhY2sgdHJhY2UgaW50byBlcnJvciB3aGVuIGluIGxvbmdTdGFja1RyYWNlWm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkodmFsdWUsIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB0cmFjZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT0gMCAmJiBzdGF0ZSA9PSBSRUpFQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IFJFSkVDVEVEX05PX0NBVENIOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5jYXVnaHRQcm9taXNlRXJyb3IgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZGlzYWJsZSB3cmFwcGluZyB1bmNhdWdodCBwcm9taXNlIHJlamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSByZWplY3RlZCB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHZhbHVlIGluc3RlYWQgb2Ygd3JhcHBpbmcgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgdGhyb3dzIGEgbmV3IEVycm9yIHRvIHByaW50IG1vcmUgcmVhZGFibGUgZXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3QgaGVyZSB0byBhdHRhY2ggdGhlIHN0YWNrIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jYXVnaHQgKGluIHByb21pc2UpOiAnICsgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgJiYgdmFsdWUuc3RhY2sgPyAnXG4nICsgdmFsdWUuc3RhY2sgOiAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci5wcm9taXNlID0gcHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGFzayA9IFpvbmUuY3VycmVudFRhc2s7CiAgICAgICAgICAgICAgICAgICAgICAgIF91bmNhdWdodFByb21pc2VFcnJvcnMucHVzaCh1bmNhdWdodFByb21pc2VFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zY2hlZHVsZU1pY3JvVGFzaygpOyAvLyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBydW5uaW5nCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlc29sdmluZyBhbiBhbHJlYWR5IHJlc29sdmVkIHByb21pc2UgaXMgYSBub29wLgogICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgdmFyIFJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIgPSBfX3N5bWJvbF9fKCdyZWplY3Rpb25IYW5kbGVkSGFuZGxlcicpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHByb21pc2UpIHsKICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sU3RhdGVdID09PSBSRUpFQ1RFRF9OT19DQVRDSCkgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgbm8gY2F0Y2ggc3RhdHVzCiAgICAgICAgICAgICAgICAvLyBhbmQgcXVldWUubGVuZ3RoID4gMCwgbWVhbnMgdGhlcmUgaXMgYSBlcnJvciBoYW5kbGVyCiAgICAgICAgICAgICAgICAvLyBoZXJlIHRvIGhhbmRsZSB0aGUgcmVqZWN0ZWQgcHJvbWlzZSwgd2Ugc2hvdWxkIHRyaWdnZXIKICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MucmVqZWN0aW9uaGFuZGxlZCBldmVudEhhbmRsZXIgb3Igbm9kZWpzIHJlamVjdGlvbkhhbmRsZWQKICAgICAgICAgICAgICAgIC8vIGV2ZW50SGFuZGxlcgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IFpvbmVbUkVKRUNUSU9OX0hBTkRMRURfSEFORExFUl07CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHsgcmVqZWN0aW9uOiBwcm9taXNlW3N5bWJvbFZhbHVlXSwgcHJvbWlzZTogcHJvbWlzZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IFJFSkVDVEVEOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdW5jYXVnaHRQcm9taXNlRXJyb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IF91bmNhdWdodFByb21pc2VFcnJvcnNbaV0ucHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBfdW5jYXVnaHRQcm9taXNlRXJyb3JzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgewogICAgICAgICAgICBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKTsKICAgICAgICAgICAgdmFyIHByb21pc2VTdGF0ZSA9IHByb21pc2Vbc3ltYm9sU3RhdGVdOwogICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBwcm9taXNlU3RhdGUgPwogICAgICAgICAgICAgICAgKHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJykgPyBvbkZ1bGZpbGxlZCA6IGZvcndhcmRSZXNvbHV0aW9uIDoKICAgICAgICAgICAgICAgICh0eXBlb2Ygb25SZWplY3RlZCA9PT0gJ2Z1bmN0aW9uJykgPyBvblJlamVjdGVkIDogZm9yd2FyZFJlamVjdGlvbjsKICAgICAgICAgICAgem9uZS5zY2hlZHVsZU1pY3JvVGFzayhzb3VyY2UsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFByb21pc2VWYWx1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdOwogICAgICAgICAgICAgICAgICAgIHZhciBpc0ZpbmFsbHlQcm9taXNlID0gISFjaGFpblByb21pc2UgJiYgc3ltYm9sRmluYWxseSA9PT0gY2hhaW5Qcm9taXNlW3N5bWJvbEZpbmFsbHldOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpbmFsbHlQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIGdlbmVyYXRlZCBmcm9tIGZpbmFsbHkgY2FsbCwga2VlcCBwYXJlbnQgcHJvbWlzZSdzIHN0YXRlIGFuZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlXSA9IHBhcmVudFByb21pc2VWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5Qcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VTdGF0ZV0gPSBwcm9taXNlU3RhdGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgcGFzcyB2YWx1ZSB0byBmaW5hbGx5IGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gem9uZS5ydW4oZGVsZWdhdGUsIHVuZGVmaW5lZCwgaXNGaW5hbGx5UHJvbWlzZSAmJiBkZWxlZ2F0ZSAhPT0gZm9yd2FyZFJlamVjdGlvbiAmJiBkZWxlZ2F0ZSAhPT0gZm9yd2FyZFJlc29sdXRpb24gPwogICAgICAgICAgICAgICAgICAgICAgICBbXSA6CiAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRQcm9taXNlVmFsdWVdKTsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjaGFpblByb21pc2UsIHRydWUsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3Vycywgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhpcyBlcnJvcgogICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGNoYWluUHJvbWlzZSwgZmFsc2UsIGVycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgY2hhaW5Qcm9taXNlKTsKICAgICAgICB9CiAgICAgICAgdmFyIFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkcgPSAnZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9JzsKICAgICAgICB2YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB2YXIgWm9uZUF3YXJlUHJvbWlzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZShleGVjdXRvcikgewogICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKCEocHJvbWlzZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGFuIGluc3RhbmNlb2YgUHJvbWlzZS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gVU5SRVNPTFZFRDsKICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gW107IC8vIHF1ZXVlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBleGVjdXRvciAmJiBleGVjdXRvcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVTT0xWRUQpLCBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVKRUNURUQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkc7IH07CiAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKG5ldyB0aGlzKG51bGwpLCBSRVNPTFZFRCwgdmFsdWUpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lQXdhcmVQcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKG5ldyB0aGlzKG51bGwpLCBSRUpFQ1RFRCwgZXJyb3IpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lQXdhcmVQcm9taXNlLnJhY2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHZhciByZWplY3Q7CiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyB0aGlzKGZ1bmN0aW9uIChyZXMsIHJlaikgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXM7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvblJlc29sdmUodmFsdWUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0KGVycm9yKSB7IHJlamVjdChlcnJvcik7IH0KICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgdmFsdWVzXzEgPSB2YWx1ZXM7IF9pIDwgdmFsdWVzXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzXzFbX2ldOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNUaGVuYWJsZSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlc29sdmUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UuYWxsID0gZnVuY3Rpb24gKHZhbHVlcykgeyByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5hbGxXaXRoQ2FsbGJhY2sodmFsdWVzKTsgfTsKICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5hbGxTZXR0bGVkID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICAgICAgdmFyIFAgPSB0aGlzICYmIHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSA/IHRoaXMgOiBab25lQXdhcmVQcm9taXNlOwogICAgICAgICAgICAgICAgcmV0dXJuIFAuYWxsV2l0aENhbGxiYWNrKHZhbHVlcywgewogICAgICAgICAgICAgICAgICAgIHRoZW5DYWxsYmFjazogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfSk7IH0sCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogZnVuY3Rpb24gKGVycikgeyByZXR1cm4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KTsgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrID0gZnVuY3Rpb24gKHZhbHVlcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIHZhciByZXNvbHZlOwogICAgICAgICAgICAgICAgdmFyIHJlamVjdDsKICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gbmV3IHRoaXMoZnVuY3Rpb24gKHJlcywgcmVqKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlczsKICAgICAgICAgICAgICAgICAgICByZWplY3QgPSByZWo7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0IDIgdG8gcHJldmVudCBwcmVtYXR1cmVseSByZXNvbHZpbmcgaWYgLnRoZW4gaXMgY2FsbGVkIGltbWVkaWF0ZWx5LgogICAgICAgICAgICAgICAgdmFyIHVucmVzb2x2ZWRDb3VudCA9IDI7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWVJbmRleCA9IDA7CiAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRWYWx1ZXMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RoZW5hYmxlKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXNfMS5yZXNvbHZlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGN1clZhbHVlSW5kZXggPSB2YWx1ZUluZGV4OwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFZhbHVlc1tjdXJWYWx1ZUluZGV4XSA9IGNhbGxiYWNrID8gY2FsbGJhY2sudGhlbkNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5yZXNvbHZlZENvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2suZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHRoZW5FcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoZW5FcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICB2YWx1ZUluZGV4Kys7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHZhbHVlc18yID0gdmFsdWVzOyBfaSA8IHZhbHVlc18yLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc18yW19pXTsKICAgICAgICAgICAgICAgICAgICBfbG9vcF8yKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVucmVzb2x2ZWRDb3VudCB6ZXJvLWJhc2VkIGFnYWluLgogICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50IC09IDI7CiAgICAgICAgICAgICAgICBpZiAodW5yZXNvbHZlZENvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVBd2FyZVByb21pc2UucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1Byb21pc2UnOyB9LAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVBd2FyZVByb21pc2UucHJvdG90eXBlLCBTeW1ib2wuc3BlY2llcywgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBab25lQXdhcmVQcm9taXNlOyB9LAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgewogICAgICAgICAgICAgICAgdmFyIEMgPSB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTsKICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIEMgPSB0aGlzLmNvbnN0cnVjdG9yIHx8IFpvbmVBd2FyZVByb21pc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY2hhaW5Qcm9taXNlID0gbmV3IEMobm9vcCk7CiAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xWYWx1ZV0ucHVzaCh6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHRoaXMsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2ggPSBmdW5jdGlvbiAob25SZWplY3RlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSA9IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHsKICAgICAgICAgICAgICAgIHZhciBDID0gdGhpcy5jb25zdHJ1Y3RvcltTeW1ib2wuc3BlY2llc107CiAgICAgICAgICAgICAgICBpZiAoIUMgfHwgdHlwZW9mIEMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBDID0gWm9uZUF3YXJlUHJvbWlzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTsKICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9IHN5bWJvbEZpbmFsbHk7CiAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xWYWx1ZV0ucHVzaCh6b25lLCBjaGFpblByb21pc2UsIG9uRmluYWxseSwgb25GaW5hbGx5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHRoaXMsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GaW5hbGx5LCBvbkZpbmFsbHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2U7CiAgICAgICAgfSgpKTsKICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgYWdncmVzc2l2ZSBvcHRpbWl6ZXJzIGRyb3BwaW5nIHNlZW1pbmdseSB1bnVzZWQgcHJvcGVydGllcy4KICAgICAgICAvLyBFLmcuIENsb3N1cmUgQ29tcGlsZXIgaW4gYWR2YW5jZWQgbW9kZS4KICAgICAgICBab25lQXdhcmVQcm9taXNlWydyZXNvbHZlJ10gPSBab25lQXdhcmVQcm9taXNlLnJlc29sdmU7CiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsncmVqZWN0J10gPSBab25lQXdhcmVQcm9taXNlLnJlamVjdDsKICAgICAgICBab25lQXdhcmVQcm9taXNlWydyYWNlJ10gPSBab25lQXdhcmVQcm9taXNlLnJhY2U7CiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsnYWxsJ10gPSBab25lQXdhcmVQcm9taXNlLmFsbDsKICAgICAgICB2YXIgTmF0aXZlUHJvbWlzZSA9IGdsb2JhbFtzeW1ib2xQcm9taXNlXSA9IGdsb2JhbFsnUHJvbWlzZSddOwogICAgICAgIHZhciBaT05FX0FXQVJFX1BST01JU0UgPSBab25lLl9fc3ltYm9sX18oJ1pvbmVBd2FyZVByb21pc2UnKTsKICAgICAgICB2YXIgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdQcm9taXNlJyk7CiAgICAgICAgaWYgKCFkZXNjIHx8IGRlc2MuY29uZmlndXJhYmxlKSB7CiAgICAgICAgICAgIGRlc2MgJiYgZGVsZXRlIGRlc2Mud3JpdGFibGU7CiAgICAgICAgICAgIGRlc2MgJiYgZGVsZXRlIGRlc2MudmFsdWU7CiAgICAgICAgICAgIGlmICghZGVzYykgewogICAgICAgICAgICAgICAgZGVzYyA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IHNldCBab25lQXdhcmVQcm9taXNlLCB1c2UgcGF0Y2hlZCBvbmUKICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gbmF0aXZlIG9uZS4KICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxbWk9ORV9BV0FSRV9QUk9NSVNFXSA/IGdsb2JhbFtaT05FX0FXQVJFX1BST01JU0VdIDogZ2xvYmFsW3N5bWJvbFByb21pc2VdOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkZXNjLnNldCA9IGZ1bmN0aW9uIChOZXdOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICBpZiAoTmV3TmF0aXZlUHJvbWlzZSA9PT0gWm9uZUF3YXJlUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBOZXdOYXRpdmVQcm9taXNlIGlzIFpvbmVBd2FyZVByb21pc2UKICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIGdsb2JhbAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFtaT05FX0FXQVJFX1BST01JU0VdID0gTmV3TmF0aXZlUHJvbWlzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBOZXdOYXRpdmVQcm9taXNlIGlzIG5vdCBab25lQXdhcmVQcm9taXNlCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGU6IGFmdGVyIGxvYWQgem9uZS5qcywgc29tZSBsaWJyYXJ5IGp1c3QKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZXM2LXByb21pc2UgdG8gZ2xvYmFsLCBpZiB3ZSBzZXQgaXQgdG8gZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHksIGFzc2VydFpvbmVQYXRjaGVkIHdpbGwgZmFpbCBhbmQgYW5ndWxhcgogICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbm90IGxvYWRlZCwgc28gd2UganVzdCBzZXQgdGhlIE5ld05hdGl2ZVByb21pc2UKICAgICAgICAgICAgICAgICAgICAvLyB0byBnbG9iYWxbc3ltYm9sUHJvbWlzZV0sIHNvIHRoZSByZXN1bHQgaXMganVzdCBsaWtlCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9hZCBFUzYgUHJvbWlzZSBiZWZvcmUgem9uZS5qcwogICAgICAgICAgICAgICAgICAgIGdsb2JhbFtzeW1ib2xQcm9taXNlXSA9IE5ld05hdGl2ZVByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFOZXdOYXRpdmVQcm9taXNlLnByb3RvdHlwZVtzeW1ib2xUaGVuXSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFRoZW4oTmV3TmF0aXZlUHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFwaS5zZXROYXRpdmVQcm9taXNlKE5ld05hdGl2ZVByb21pc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShnbG9iYWwsICdQcm9taXNlJywgZGVzYyk7CiAgICAgICAgfQogICAgICAgIGdsb2JhbFsnUHJvbWlzZSddID0gWm9uZUF3YXJlUHJvbWlzZTsKICAgICAgICB2YXIgc3ltYm9sVGhlblBhdGNoZWQgPSBfX3N5bWJvbF9fKCd0aGVuUGF0Y2hlZCcpOwogICAgICAgIGZ1bmN0aW9uIHBhdGNoVGhlbihDdG9yKSB7CiAgICAgICAgICAgIHZhciBwcm90byA9IEN0b3IucHJvdG90eXBlOwogICAgICAgICAgICB2YXIgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTsKICAgICAgICAgICAgaWYgKHByb3AgJiYgKHByb3Aud3JpdGFibGUgPT09IGZhbHNlIHx8ICFwcm9wLmNvbmZpZ3VyYWJsZSkpIHsKICAgICAgICAgICAgICAgIC8vIGNoZWNrIEN0b3IucHJvdG90eXBlLnRoZW4gcHJvcGVydHlEZXNjcmlwdG9yIGlzIHdyaXRhYmxlIG9yIG5vdAogICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG9yaWdpbmFsVGhlbiA9IHByb3RvLnRoZW47CiAgICAgICAgICAgIC8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC4KICAgICAgICAgICAgcHJvdG9bc3ltYm9sVGhlbl0gPSBvcmlnaW5hbFRoZW47CiAgICAgICAgICAgIEN0b3IucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25SZXNvbHZlLCBvblJlamVjdCkgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciB3cmFwcGVkID0gbmV3IFpvbmVBd2FyZVByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyBvcmlnaW5hbFRoZW4uY2FsbChfdGhpcywgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBDdG9yW3N5bWJvbFRoZW5QYXRjaGVkXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGFwaS5wYXRjaFRoZW4gPSBwYXRjaFRoZW47CiAgICAgICAgZnVuY3Rpb24gem9uZWlmeShmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdFByb21pc2UgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdFByb21pc2UgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY3RvciA9IHJlc3VsdFByb21pc2UuY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICBpZiAoIWN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0Y2hUaGVuKGN0b3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgIHBhdGNoVGhlbihOYXRpdmVQcm9taXNlKTsKICAgICAgICAgICAgdmFyIGZldGNoXzEgPSBnbG9iYWxbJ2ZldGNoJ107CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2hfMSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBnbG9iYWxbYXBpLnN5bWJvbCgnZmV0Y2gnKV0gPSBmZXRjaF8xOwogICAgICAgICAgICAgICAgZ2xvYmFsWydmZXRjaCddID0gem9uZWlmeShmZXRjaF8xKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUaGlzIGlzIG5vdCBwYXJ0IG9mIHB1YmxpYyBBUEksIGJ1dCBpdCBpcyB1c2VmdWwgZm9yIHRlc3RzLCBzbyB3ZSBleHBvc2UgaXQuCiAgICAgICAgUHJvbWlzZVtab25lLl9fc3ltYm9sX18oJ3VuY2F1Z2h0UHJvbWlzZUVycm9ycycpXSA9IF91bmNhdWdodFByb21pc2VFcnJvcnM7CiAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2U7CiAgICB9KTsKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogU3VwcHJlc3MgY2xvc3VyZSBjb21waWxlciBlcnJvcnMgYWJvdXQgdW5rbm93biAnWm9uZScgdmFyaWFibGUKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFycyxnbG9iYWxUaGlzLG1pc3NpbmdSZXF1aXJlfQogICAgICovCiAgICAvLy8gPHJlZmVyZW5jZSB0eXBlcz0ibm9kZSIvPgogICAgLy8gaXNzdWUgIzk4OSwgdG8gcmVkdWNlIGJ1bmRsZSBzaXplLCB1c2Ugc2hvcnQgbmFtZQogICAgLyoqIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgKi8KICAgIHZhciBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgLyoqIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAqLwogICAgdmFyIE9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgLyoqIE9iamVjdC5nZXRQcm90b3R5cGVPZiAqLwogICAgdmFyIE9iamVjdEdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mOwogICAgLyoqIE9iamVjdC5jcmVhdGUgKi8KICAgIHZhciBPYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlOwogICAgLyoqIEFycmF5LnByb3RvdHlwZS5zbGljZSAqLwogICAgdmFyIEFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CiAgICAvKiogYWRkRXZlbnRMaXN0ZW5lciBzdHJpbmcgY29uc3QgKi8KICAgIHZhciBBRERfRVZFTlRfTElTVEVORVJfU1RSID0gJ2FkZEV2ZW50TGlzdGVuZXInOwogICAgLyoqIHJlbW92ZUV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovCiAgICB2YXIgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiA9ICdyZW1vdmVFdmVudExpc3RlbmVyJzsKICAgIC8qKiB6b25lU3ltYm9sIGFkZEV2ZW50TGlzdGVuZXIgKi8KICAgIHZhciBaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVIgPSBab25lLl9fc3ltYm9sX18oQUREX0VWRU5UX0xJU1RFTkVSX1NUUik7CiAgICAvKiogem9uZVN5bWJvbCByZW1vdmVFdmVudExpc3RlbmVyICovCiAgICB2YXIgWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gWm9uZS5fX3N5bWJvbF9fKFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIpOwogICAgLyoqIHRydWUgc3RyaW5nIGNvbnN0ICovCiAgICB2YXIgVFJVRV9TVFIgPSAndHJ1ZSc7CiAgICAvKiogZmFsc2Ugc3RyaW5nIGNvbnN0ICovCiAgICB2YXIgRkFMU0VfU1RSID0gJ2ZhbHNlJzsKICAgIC8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqLwogICAgdmFyIFpPTkVfU1lNQk9MX1BSRUZJWCA9IFpvbmUuX19zeW1ib2xfXygnJyk7CiAgICBmdW5jdGlvbiB3cmFwV2l0aEN1cnJlbnRab25lKGNhbGxiYWNrLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7CiAgICB9CiAgICBmdW5jdGlvbiBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSB7CiAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTsKICAgIH0KICAgIHZhciB6b25lU3ltYm9sID0gWm9uZS5fX3N5bWJvbF9fOwogICAgdmFyIGlzV2luZG93RXhpc3RzID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7CiAgICB2YXIgaW50ZXJuYWxXaW5kb3cgPSBpc1dpbmRvd0V4aXN0cyA/IHdpbmRvdyA6IHVuZGVmaW5lZDsKICAgIHZhciBfZ2xvYmFsID0gaXNXaW5kb3dFeGlzdHMgJiYgaW50ZXJuYWxXaW5kb3cgfHwgdHlwZW9mIHNlbGYgPT09ICdvYmplY3QnICYmIHNlbGYgfHwgY29tbW9uanNHbG9iYWw7CiAgICB2YXIgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnOwogICAgdmFyIE5VTExfT05fUFJPUF9WQUxVRSA9IFtudWxsXTsKICAgIGZ1bmN0aW9uIGJpbmRBcmd1bWVudHMoYXJncywgc291cmNlKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGFyZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2ldID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBhcmdzW2ldID0gd3JhcFdpdGhDdXJyZW50Wm9uZShhcmdzW2ldLCBzb3VyY2UgKyAnXycgKyBpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJnczsKICAgIH0KICAgIGZ1bmN0aW9uIHBhdGNoUHJvdG90eXBlKHByb3RvdHlwZSwgZm5OYW1lcykgewogICAgICAgIHZhciBzb3VyY2UgPSBwcm90b3R5cGUuY29uc3RydWN0b3JbJ25hbWUnXTsKICAgICAgICB2YXIgX2xvb3BfMyA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgIHZhciBuYW1lXzEgPSBmbk5hbWVzW2ldOwogICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBwcm90b3R5cGVbbmFtZV8xXTsKICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlRGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIG5hbWVfMSk7CiAgICAgICAgICAgICAgICBpZiAoIWlzUHJvcGVydHlXcml0YWJsZShwcm90b3R5cGVEZXNjKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGludWUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJvdG90eXBlW25hbWVfMV0gPSAoZnVuY3Rpb24gKGRlbGVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGNoZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5hcHBseSh0aGlzLCBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgc291cmNlICsgJy4nICsgbmFtZV8xKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocGF0Y2hlZCwgZGVsZWdhdGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRjaGVkOwogICAgICAgICAgICAgICAgfSkoZGVsZWdhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZuTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgX2xvb3BfMyhpKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBpc1Byb3BlcnR5V3JpdGFibGUocHJvcGVydHlEZXNjKSB7CiAgICAgICAgaWYgKCFwcm9wZXJ0eURlc2MpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcm9wZXJ0eURlc2Mud3JpdGFibGUgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICEodHlwZW9mIHByb3BlcnR5RGVzYy5nZXQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHByb3BlcnR5RGVzYy5zZXQgPT09ICd1bmRlZmluZWQnKTsKICAgIH0KICAgIHZhciBpc1dlYldvcmtlciA9ICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSk7CiAgICAvLyBNYWtlIHN1cmUgdG8gYWNjZXNzIGBwcm9jZXNzYCB0aHJvdWdoIGBfZ2xvYmFsYCBzbyB0aGF0IFdlYlBhY2sgZG9lcyBub3QgYWNjaWRlbnRhbGx5IGJyb3dzZXJpZnkKICAgIC8vIHRoaXMgY29kZS4KICAgIHZhciBpc05vZGUgPSAoISgnbncnIGluIF9nbG9iYWwpICYmIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAge30udG9TdHJpbmcuY2FsbChfZ2xvYmFsLnByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpOwogICAgdmFyIGlzQnJvd3NlciA9ICFpc05vZGUgJiYgIWlzV2ViV29ya2VyICYmICEhKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93WydIVE1MRWxlbWVudCddKTsKICAgIC8vIHdlIGFyZSBpbiBlbGVjdHJvbiBvZiBudywgc28gd2UgYXJlIGJvdGggYnJvd3NlciBhbmQgbm9kZWpzCiAgICAvLyBNYWtlIHN1cmUgdG8gYWNjZXNzIGBwcm9jZXNzYCB0aHJvdWdoIGBfZ2xvYmFsYCBzbyB0aGF0IFdlYlBhY2sgZG9lcyBub3QgYWNjaWRlbnRhbGx5IGJyb3dzZXJpZnkKICAgIC8vIHRoaXMgY29kZS4KICAgIHZhciBpc01peCA9IHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAge30udG9TdHJpbmcuY2FsbChfZ2xvYmFsLnByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScgJiYgIWlzV2ViV29ya2VyICYmCiAgICAgICAgISEoaXNXaW5kb3dFeGlzdHMgJiYgaW50ZXJuYWxXaW5kb3dbJ0hUTUxFbGVtZW50J10pOwogICAgdmFyIHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307CiAgICB2YXIgd3JhcEZuID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTExLCBpbiBJRSwgc29tZXRpbWVzCiAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudAogICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgX2dsb2JhbC5ldmVudDsKICAgICAgICBpZiAoIWV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50LnR5cGVdOwogICAgICAgIGlmICghZXZlbnROYW1lU3ltYm9sKSB7CiAgICAgICAgICAgIGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50LnR5cGVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnQudHlwZSk7CiAgICAgICAgfQogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsOwogICAgICAgIHZhciBsaXN0ZW5lciA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdOwogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKGlzQnJvd3NlciAmJiB0YXJnZXQgPT09IGludGVybmFsV2luZG93ICYmIGV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgLy8gd2luZG93Lm9uZXJyb3IgaGF2ZSBkaWZmZXJlbnQgc2lnbml0dXJlCiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HbG9iYWxFdmVudEhhbmRsZXJzL29uZXJyb3Ijd2luZG93Lm9uZXJyb3IKICAgICAgICAgICAgLy8gYW5kIG9uZXJyb3IgY2FsbGJhY2sgd2lsbCBwcmV2ZW50IGRlZmF1bHQgd2hlbiBjYWxsYmFjayByZXR1cm4gdHJ1ZQogICAgICAgICAgICB2YXIgZXJyb3JFdmVudCA9IGV2ZW50OwogICAgICAgICAgICByZXN1bHQgPSBsaXN0ZW5lciAmJgogICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBlcnJvckV2ZW50Lm1lc3NhZ2UsIGVycm9yRXZlbnQuZmlsZW5hbWUsIGVycm9yRXZlbnQubGluZW5vLCBlcnJvckV2ZW50LmNvbG5vLCBlcnJvckV2ZW50LmVycm9yKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXIgJiYgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSB1bmRlZmluZWQgJiYgIXJlc3VsdCkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICAgIGZ1bmN0aW9uIHBhdGNoUHJvcGVydHkob2JqLCBwcm9wLCBwcm90b3R5cGUpIHsKICAgICAgICB2YXIgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApOwogICAgICAgIGlmICghZGVzYyAmJiBwcm90b3R5cGUpIHsKICAgICAgICAgICAgLy8gd2hlbiBwYXRjaCB3aW5kb3cgb2JqZWN0LCB1c2UgcHJvdG90eXBlIHRvIGNoZWNrIHByb3AgZXhpc3Qgb3Igbm90CiAgICAgICAgICAgIHZhciBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgcHJvcCk7CiAgICAgICAgICAgIGlmIChwcm90b3R5cGVEZXNjKSB7CiAgICAgICAgICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBpZiB0aGUgZGVzY3JpcHRvciBub3QgZXhpc3RzIG9yIGlzIG5vdCBjb25maWd1cmFibGUKICAgICAgICAvLyBqdXN0IHJldHVybgogICAgICAgIGlmICghZGVzYyB8fCAhZGVzYy5jb25maWd1cmFibGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpOwogICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkob25Qcm9wUGF0Y2hlZFN5bWJvbCkgJiYgb2JqW29uUHJvcFBhdGNoZWRTeW1ib2xdKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gQSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGNhbm5vdCBoYXZlIGdldHRlci9zZXR0ZXIgYW5kIGJlIHdyaXRhYmxlCiAgICAgICAgLy8gZGVsZXRpbmcgdGhlIHdyaXRhYmxlIGFuZCB2YWx1ZSBwcm9wZXJ0aWVzIGF2b2lkcyB0aGlzIGVycm9yOgogICAgICAgIC8vCiAgICAgICAgLy8gVHlwZUVycm9yOiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBtdXN0IG5vdCBzcGVjaWZ5IGEgdmFsdWUgb3IgYmUgd3JpdGFibGUgd2hlbiBhCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlciBoYXMgYmVlbiBzcGVjaWZpZWQKICAgICAgICBkZWxldGUgZGVzYy53cml0YWJsZTsKICAgICAgICBkZWxldGUgZGVzYy52YWx1ZTsKICAgICAgICB2YXIgb3JpZ2luYWxEZXNjR2V0ID0gZGVzYy5nZXQ7CiAgICAgICAgdmFyIG9yaWdpbmFsRGVzY1NldCA9IGRlc2Muc2V0OwogICAgICAgIC8vIHN1YnN0cigyKSBjdXogJ29uY2xpY2snIC0+ICdjbGljaycsIGV0YwogICAgICAgIHZhciBldmVudE5hbWUgPSBwcm9wLnN1YnN0cigyKTsKICAgICAgICB2YXIgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWV2ZW50TmFtZVN5bWJvbCkgewogICAgICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnROYW1lKTsKICAgICAgICB9CiAgICAgICAgZGVzYy5zZXQgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHsKICAgICAgICAgICAgLy8gaW4gc29tZSBvZiB3aW5kb3dzJ3Mgb25wcm9wZXJ0eSBjYWxsYmFjaywgdGhpcyBpcyB1bmRlZmluZWQKICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjaGVjayBpdAogICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsKICAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgb2JqID09PSBfZ2xvYmFsKSB7CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBfZ2xvYmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHByZXZpb3VzVmFsdWUgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTsKICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUpIHsKICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgd3JhcEZuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpc3N1ZSAjOTc4LCB3aGVuIG9ubG9hZCBoYW5kbGVyIHdhcyBhZGRlZCBiZWZvcmUgbG9hZGluZyB6b25lLmpzCiAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZW1vdmUgaXQgd2l0aCBvcmlnaW5hbERlc2NTZXQKICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVzY1NldCkgewogICAgICAgICAgICAgICAgb3JpZ2luYWxEZXNjU2V0LmFwcGx5KHRhcmdldCwgTlVMTF9PTl9QUk9QX1ZBTFVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXSA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4sIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRhcmdldFtldmVudE5hbWVTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gVGhlIGdldHRlciB3b3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB1bmFzc2lnbmVkIHByb3BlcnRpZXMgYnV0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuCiAgICAgICAgLy8gdW5hc3NpZ25lZCBwcm9wZXJ0eSBpcyBudWxsCiAgICAgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIGluIHNvbWUgb2Ygd2luZG93cydzIG9ucHJvcGVydHkgY2FsbGJhY2ssIHRoaXMgaXMgdW5kZWZpbmVkCiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaXQKICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7CiAgICAgICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0gX2dsb2JhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF07CiAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdpbmFsRGVzY0dldCkgewogICAgICAgICAgICAgICAgLy8gcmVzdWx0IHdpbGwgYmUgbnVsbCB3aGVuIHVzZSBpbmxpbmUgZXZlbnQgYXR0cmlidXRlLAogICAgICAgICAgICAgICAgLy8gc3VjaCBhcyA8YnV0dG9uIG9uY2xpY2s9ImZ1bmMoKTsiPk9LPC9idXR0b24+CiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBvbmNsaWNrIGZ1bmN0aW9uIGlzIGludGVybmFsIHJhdyB1bmNvbXBpbGVkIGhhbmRsZXIKICAgICAgICAgICAgICAgIC8vIHRoZSBvbmNsaWNrIHdpbGwgYmUgZXZhbHVhdGVkIHdoZW4gZmlyc3QgdGltZSBldmVudCB3YXMgdHJpZ2dlcmVkIG9yCiAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzUyNQogICAgICAgICAgICAgICAgLy8gc28gd2Ugc2hvdWxkIHVzZSBvcmlnaW5hbCBuYXRpdmUgZ2V0IHRvIHJldHJpZXZlIHRoZSBoYW5kbGVyCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvcmlnaW5hbERlc2NHZXQgJiYgb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjLnNldC5jYWxsKHRoaXMsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKHByb3ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfTsKICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpOwogICAgICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXRjaE9uUHJvcGVydGllcyhvYmosIHByb3BlcnRpZXMsIHByb3RvdHlwZSkgewogICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcGF0Y2hQcm9wZXJ0eShvYmosICdvbicgKyBwcm9wZXJ0aWVzW2ldLCBwcm90b3R5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgb25Qcm9wZXJ0aWVzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICBpZiAocHJvcC5zdWJzdHIoMCwgMikgPT0gJ29uJykgewogICAgICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBwYXRjaFByb3BlcnR5KG9iaiwgb25Qcm9wZXJ0aWVzW2pdLCBwcm90b3R5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgdmFyIG9yaWdpbmFsSW5zdGFuY2VLZXkgPSB6b25lU3ltYm9sKCdvcmlnaW5hbEluc3RhbmNlJyk7CiAgICAvLyB3cmFwIHNvbWUgbmF0aXZlIEFQSSBvbiBgd2luZG93YAogICAgZnVuY3Rpb24gcGF0Y2hDbGFzcyhjbGFzc05hbWUpIHsKICAgICAgICB2YXIgT3JpZ2luYWxDbGFzcyA9IF9nbG9iYWxbY2xhc3NOYW1lXTsKICAgICAgICBpZiAoIU9yaWdpbmFsQ2xhc3MpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBrZWVwIG9yaWdpbmFsIGNsYXNzIGluIGdsb2JhbAogICAgICAgIF9nbG9iYWxbem9uZVN5bWJvbChjbGFzc05hbWUpXSA9IE9yaWdpbmFsQ2xhc3M7CiAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgYSA9IGJpbmRBcmd1bWVudHMoYXJndW1lbnRzLCBjbGFzc05hbWUpOwogICAgICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSwgYVsyXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZyBsaXN0IHRvbyBsb25nLicpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBhdHRhY2ggb3JpZ2luYWwgZGVsZWdhdGUgdG8gcGF0Y2hlZCBmdW5jdGlvbgogICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpOwogICAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBPcmlnaW5hbENsYXNzKGZ1bmN0aW9uICgpIHsgfSk7CiAgICAgICAgdmFyIHByb3A7CiAgICAgICAgZm9yIChwcm9wIGluIGluc3RhbmNlKSB7CiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDcyMQogICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnWE1MSHR0cFJlcXVlc3QnICYmIHByb3AgPT09ICdyZXNwb25zZUJsb2InKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIChmdW5jdGlvbiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGVbcHJvcF0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdLmFwcGx5KHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0sIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGUsIHByb3AsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdID0gd3JhcFdpdGhDdXJyZW50Wm9uZShmbiwgY2xhc3NOYW1lICsgJy4nICsgcHJvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpbiB3cmFwcGVkIGZ1bmN0aW9uIHNvIHdlIGNhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBpdCBpbiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBvbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0sIGZuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0gPSBmbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdOyB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0ocHJvcCkpOwogICAgICAgIH0KICAgICAgICBmb3IgKHByb3AgaW4gT3JpZ2luYWxDbGFzcykgewogICAgICAgICAgICBpZiAocHJvcCAhPT0gJ3Byb3RvdHlwZScgJiYgT3JpZ2luYWxDbGFzcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdW3Byb3BdID0gT3JpZ2luYWxDbGFzc1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhdGNoTWV0aG9kKHRhcmdldCwgbmFtZSwgcGF0Y2hGbikgewogICAgICAgIHZhciBwcm90byA9IHRhcmdldDsKICAgICAgICB3aGlsZSAocHJvdG8gJiYgIXByb3RvLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0R2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb3RvICYmIHRhcmdldFtuYW1lXSkgewogICAgICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuCiAgICAgICAgICAgIHByb3RvID0gdGFyZ2V0OwogICAgICAgIH0KICAgICAgICB2YXIgZGVsZWdhdGVOYW1lID0gem9uZVN5bWJvbChuYW1lKTsKICAgICAgICB2YXIgZGVsZWdhdGUgPSBudWxsOwogICAgICAgIGlmIChwcm90byAmJiAhKGRlbGVnYXRlID0gcHJvdG9bZGVsZWdhdGVOYW1lXSkpIHsKICAgICAgICAgICAgZGVsZWdhdGUgPSBwcm90b1tkZWxlZ2F0ZU5hbWVdID0gcHJvdG9bbmFtZV07CiAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcHJvdG9bbmFtZV0gaXMgd3JpdGFibGUKICAgICAgICAgICAgLy8gc29tZSBwcm9wZXJ0eSBpcyByZWFkb25seSBpbiBzYWZhcmksIHN1Y2ggYXMgSHRtbENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRvQmxvYgogICAgICAgICAgICB2YXIgZGVzYyA9IHByb3RvICYmIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSk7CiAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5V3JpdGFibGUoZGVzYykpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRjaERlbGVnYXRlXzEgPSBwYXRjaEZuKGRlbGVnYXRlLCBkZWxlZ2F0ZU5hbWUsIG5hbWUpOwogICAgICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRjaERlbGVnYXRlXzEodGhpcywgYXJndW1lbnRzKTsgfTsKICAgICAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tuYW1lXSwgZGVsZWdhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKICAgIH0KICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24sIHN1cHBvcnQgY2FuY2VsIHRhc2sgbGF0ZXIgaWYgbmVjZXNzYXJ5CiAgICBmdW5jdGlvbiBwYXRjaE1hY3JvVGFzayhvYmosIGZ1bmNOYW1lLCBtZXRhQ3JlYXRvcikgewogICAgICAgIHZhciBzZXROYXRpdmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gdGFzay5kYXRhOwogICAgICAgICAgICBkYXRhLmFyZ3NbZGF0YS5jYklkeF0gPSBmdW5jdGlvbiAoKSB7IHRhc2suaW52b2tlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CiAgICAgICAgICAgIHNldE5hdGl2ZS5hcHBseShkYXRhLnRhcmdldCwgZGF0YS5hcmdzKTsKICAgICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgICAgfQogICAgICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKG9iaiwgZnVuY05hbWUsIGZ1bmN0aW9uIChkZWxlZ2F0ZSkgeyByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIG1ldGEgPSBtZXRhQ3JlYXRvcihzZWxmLCBhcmdzKTsKICAgICAgICAgICAgaWYgKG1ldGEuY2JJZHggPj0gMCAmJiB0eXBlb2YgYXJnc1ttZXRhLmNiSWR4XSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lKG1ldGEubmFtZSwgYXJnc1ttZXRhLmNiSWR4XSwgbWV0YSwgc2NoZWR1bGVUYXNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGNhdXNlIGFuIGVycm9yIGJ5IGNhbGxpbmcgaXQgZGlyZWN0bHkuCiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OyB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBvcmlnaW5hbCkgewogICAgICAgIHBhdGNoZWRbem9uZVN5bWJvbCgnT3JpZ2luYWxEZWxlZ2F0ZScpXSA9IG9yaWdpbmFsOwogICAgfQogICAgdmFyIGlzRGV0ZWN0ZWRJRU9yRWRnZSA9IGZhbHNlOwogICAgdmFyIGllT3JFZGdlID0gZmFsc2U7CiAgICBmdW5jdGlvbiBpc0lFKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciB1YSA9IGludGVybmFsV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgICAgIGlmICh1YS5pbmRleE9mKCdNU0lFICcpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdUcmlkZW50LycpICE9PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzSUVPckVkZ2UoKSB7CiAgICAgICAgaWYgKGlzRGV0ZWN0ZWRJRU9yRWRnZSkgewogICAgICAgICAgICByZXR1cm4gaWVPckVkZ2U7CiAgICAgICAgfQogICAgICAgIGlzRGV0ZWN0ZWRJRU9yRWRnZSA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIHVhID0gaW50ZXJuYWxXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBpZU9yRWRnZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZU9yRWRnZTsKICAgIH0KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8vIG92ZXJyaWRlIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB0byBtYWtlIHpvbmUuanMgcGF0Y2hlZCBmdW5jdGlvbgogICAgLy8gbG9vayBsaWtlIG5hdGl2ZSBmdW5jdGlvbgogICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3RvU3RyaW5nJywgZnVuY3Rpb24gKGdsb2JhbCkgewogICAgICAgIC8vIHBhdGNoIEZ1bmMucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmUKICAgICAgICB2YXIgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nOwogICAgICAgIHZhciBPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wgPSB6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyk7CiAgICAgICAgdmFyIFBST01JU0VfU1lNQk9MID0gem9uZVN5bWJvbCgnUHJvbWlzZScpOwogICAgICAgIHZhciBFUlJPUl9TWU1CT0wgPSB6b25lU3ltYm9sKCdFcnJvcicpOwogICAgICAgIHZhciBuZXdGdW5jdGlvblRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsRGVsZWdhdGUgPSB0aGlzW09SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTF07CiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxEZWxlZ2F0ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwob3JpZ2luYWxEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzID09PSBQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hdGl2ZVByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV9TWU1CT0xdOwogICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVQcm9taXNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmF0aXZlRXJyb3IgPSBnbG9iYWxbRVJST1JfU1lNQk9MXTsKICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG5hdGl2ZUVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKHRoaXMpOwogICAgICAgIH07CiAgICAgICAgbmV3RnVuY3Rpb25Ub1N0cmluZ1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdID0gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nOwogICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IG5ld0Z1bmN0aW9uVG9TdHJpbmc7CiAgICAgICAgLy8gcGF0Y2ggT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyB0byBsZXQgdGhlbSBsb29rIGxpa2UgbmF0aXZlCiAgICAgICAgdmFyIG9yaWdpbmFsT2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgICAgIHZhciBQUk9NSVNFX09CSkVDVF9UT19TVFJJTkcgPSAnW29iamVjdCBQcm9taXNlXSc7CiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk7CiAgICAgICAgfTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgdmFyIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTsKICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHBhc3NpdmVTdXBwb3J0ZWQgPSB0cnVlOyB9IH0pOwogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpOwogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAvLyBhbiBpZGVudGlmaWVyIHRvIHRlbGwgWm9uZVRhc2sgZG8gbm90IGNyZWF0ZSBhIG5ldyBpbnZva2UgY2xvc3VyZQogICAgdmFyIE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHsKICAgICAgICB1c2VHOiB0cnVlCiAgICB9OwogICAgdmFyIHpvbmVTeW1ib2xFdmVudE5hbWVzJDEgPSB7fTsKICAgIHZhciBnbG9iYWxTb3VyY2VzID0ge307CiAgICB2YXIgRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCA9IG5ldyBSZWdFeHAoJ14nICsgWk9ORV9TWU1CT0xfUFJFRklYICsgJyhcXHcrKSh0cnVlfGZhbHNlKSQnKTsKICAgIHZhciBJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MID0gem9uZVN5bWJvbCgncHJvcGFnYXRpb25TdG9wcGVkJyk7CiAgICBmdW5jdGlvbiBwcmVwYXJlRXZlbnROYW1lcyhldmVudE5hbWUsIGV2ZW50TmFtZVRvU3RyaW5nKSB7CiAgICAgICAgdmFyIGZhbHNlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBGQUxTRV9TVFI7CiAgICAgICAgdmFyIHRydWVFdmVudE5hbWUgPSAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKSArIFRSVUVfU1RSOwogICAgICAgIHZhciBzeW1ib2wgPSBaT05FX1NZTUJPTF9QUkVGSVggKyBmYWxzZUV2ZW50TmFtZTsKICAgICAgICB2YXIgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7CiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdID0ge307CiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7CiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIGFwaXMsIHBhdGNoT3B0aW9ucykgewogICAgICAgIHZhciBBRERfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5hZGQpIHx8IEFERF9FVkVOVF9MSVNURU5FUl9TVFI7CiAgICAgICAgdmFyIFJFTU9WRV9FVkVOVF9MSVNURU5FUiA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJtKSB8fCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSOwogICAgICAgIHZhciBMSVNURU5FUlNfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5saXN0ZW5lcnMpIHx8ICdldmVudExpc3RlbmVycyc7CiAgICAgICAgdmFyIFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm1BbGwpIHx8ICdyZW1vdmVBbGxMaXN0ZW5lcnMnOwogICAgICAgIHZhciB6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lciA9IHpvbmVTeW1ib2woQUREX0VWRU5UX0xJU1RFTkVSKTsKICAgICAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIEFERF9FVkVOVF9MSVNURU5FUiArICc6JzsKICAgICAgICB2YXIgUFJFUEVORF9FVkVOVF9MSVNURU5FUiA9ICdwcmVwZW5kTGlzdGVuZXInOwogICAgICAgIHZhciBQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIFBSRVBFTkRfRVZFTlRfTElTVEVORVIgKyAnOic7CiAgICAgICAgdmFyIGludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBldmVudCkgewogICAgICAgICAgICAvLyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBjaGVjayBpc1JlbW92ZWQgd2hpY2ggaXMgc2V0CiAgICAgICAgICAgIC8vIGJ5IHJlbW92ZUV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgaWYgKHRhc2suaXNSZW1vdmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gdGFzay5jYWxsYmFjazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgZGVsZWdhdGUuaGFuZGxlRXZlbnQpIHsKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlCiAgICAgICAgICAgICAgICB0YXNrLmNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBkZWxlZ2F0ZS5oYW5kbGVFdmVudChldmVudCk7IH07CiAgICAgICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpbnZva2Ugc3RhdGljIHRhc2suaW52b2tlCiAgICAgICAgICAgIHRhc2suaW52b2tlKHRhc2ssIHRhcmdldCwgW2V2ZW50XSk7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGFzay5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5vbmNlKSB7CiAgICAgICAgICAgICAgICAvLyBpZiBvcHRpb25zLm9uY2UgaXMgdHJ1ZSwgYWZ0ZXIgaW52b2tlIG9uY2UgcmVtb3ZlIGxpc3RlbmVyIGhlcmUKICAgICAgICAgICAgICAgIC8vIG9ubHkgYnJvd3NlciBuZWVkIHRvIGRvIHRoaXMsIG5vZGVqcyBldmVudEVtaXR0ZXIgd2lsbCBjYWwgcmVtb3ZlTGlzdGVuZXIKICAgICAgICAgICAgICAgIC8vIGluc2lkZSBFdmVudEVtaXR0ZXIub25jZQogICAgICAgICAgICAgICAgdmFyIGRlbGVnYXRlXzEgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgdGFyZ2V0W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uY2FsbCh0YXJnZXQsIGV2ZW50LnR5cGUsIGRlbGVnYXRlXzEsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2UKICAgICAgICB2YXIgZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTExLCBpbiBJRSwgc29tZXRpbWVzCiAgICAgICAgICAgIC8vIGV2ZW50IHdpbGwgYmUgdW5kZWZpbmVkLCBzbyB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cuZXZlbnQKICAgICAgICAgICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50OwogICAgICAgICAgICBpZiAoIWV2ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXZlbnQudGFyZ2V0IGlzIG5lZWRlZCBmb3IgU2Ftc3VuZyBUViBhbmQgU291cmNlQnVmZmVyCiAgICAgICAgICAgIC8vIHx8IGdsb2JhbCBpcyBuZWVkZWQgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvMTkwCiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsOwogICAgICAgICAgICB2YXIgdGFza3MgPSB0YXJnZXRbem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudC50eXBlXVtGQUxTRV9TVFJdXTsKICAgICAgICAgICAgaWYgKHRhc2tzKSB7CiAgICAgICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlCiAgICAgICAgICAgICAgICAvLyBmb3IgcGVyZm9ybWFuY2UgY29uY2VybiwgaWYgdGFzay5sZW5ndGggPT09IDEsIGp1c3QgaW52b2tlCiAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy84MzYKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSB0YXNrcyBhcnJheSBiZWZvcmUgaW52b2tlLCB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB3aWxsIHJlbW92ZSBpdHNlbGYgb3Igb3RoZXIgbGlzdGVuZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29weVRhc2tzID0gdGFza3Muc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHlUYXNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnRbSU1NRURJQVRFX1BST1BBR0FUSU9OX1NZTUJPTF0gPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZVRhc2soY29weVRhc2tzW2ldLCB0YXJnZXQsIGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8vIGdsb2JhbCBzaGFyZWQgem9uZUF3YXJlQ2FsbGJhY2sgdG8gaGFuZGxlIGFsbCBldmVudCBjYWxsYmFjayB3aXRoIGNhcHR1cmUgPSB0cnVlCiAgICAgICAgdmFyIGdsb2JhbFpvbmVBd2FyZUNhcHR1cmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXMKICAgICAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudAogICAgICAgICAgICBldmVudCA9IGV2ZW50IHx8IF9nbG9iYWwuZXZlbnQ7CiAgICAgICAgICAgIGlmICghZXZlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBldmVudC50YXJnZXQgaXMgbmVlZGVkIGZvciBTYW1zdW5nIFRWIGFuZCBTb3VyY2VCdWZmZXIKICAgICAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTAKICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMgfHwgZXZlbnQudGFyZ2V0IHx8IF9nbG9iYWw7CiAgICAgICAgICAgIHZhciB0YXNrcyA9IHRhcmdldFt6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdW1RSVUVfU1RSXV07CiAgICAgICAgICAgIGlmICh0YXNrcykgewogICAgICAgICAgICAgICAgLy8gaW52b2tlIGFsbCB0YXNrcyB3aGljaCBhdHRhY2hlZCB0byBjdXJyZW50IHRhcmdldCB3aXRoIGdpdmVuIGV2ZW50LnR5cGUgYW5kIGNhcHR1cmUgPSBmYWxzZQogICAgICAgICAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIGNvbmNlcm4sIGlmIHRhc2subGVuZ3RoID09PSAxLCBqdXN0IGludm9rZQogICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGludm9rZVRhc2sodGFza3NbMF0sIHRhcmdldCwgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvODM2CiAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgd2lsbCByZW1vdmUgaXRzZWxmIG9yIG90aGVyIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3B5VGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50W0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VUYXNrKGNvcHlUYXNrc1tpXSwgdGFyZ2V0LCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0TWV0aG9kcyhvYmosIHBhdGNoT3B0aW9ucykgewogICAgICAgICAgICBpZiAoIW9iaikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnVzZUcgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdXNlR2xvYmFsQ2FsbGJhY2sgPSBwYXRjaE9wdGlvbnMudXNlRzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdmFsaWRhdGVIYW5kbGVyID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy52aDsKICAgICAgICAgICAgdmFyIGNoZWNrRHVwbGljYXRlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuY2hrRHVwICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlID0gcGF0Y2hPcHRpb25zLmNoa0R1cDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmV0dXJuVGFyZ2V0ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVyblRhcmdldCA9IHBhdGNoT3B0aW9ucy5ydDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcHJvdG8gPSBvYmo7CiAgICAgICAgICAgIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkoQUREX0VWRU5UX0xJU1RFTkVSKSkgewogICAgICAgICAgICAgICAgcHJvdG8gPSBPYmplY3RHZXRQcm90b3R5cGVPZihwcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwcm90byAmJiBvYmpbQUREX0VWRU5UX0xJU1RFTkVSXSkgewogICAgICAgICAgICAgICAgLy8gc29tZWhvdyB3ZSBkaWQgbm90IGZpbmQgaXQsIGJ1dCB3ZSBjYW4gc2VlIGl0LiBUaGlzIGhhcHBlbnMgb24gSUUgZm9yIFdpbmRvdyBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgcHJvdG8gPSBvYmo7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwcm90bykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm90b1t6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lcl0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZXZlbnROYW1lVG9TdHJpbmcgPSBwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLmV2ZW50TmFtZVRvU3RyaW5nOwogICAgICAgICAgICAvLyBhIHNoYXJlZCBnbG9iYWwgdGFza0RhdGEgdG8gcGFzcyBkYXRhIGZvciBzY2hlZHVsZUV2ZW50VGFzawogICAgICAgICAgICAvLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGp1c3QgZm9yIHBhc3Mgc29tZSBkYXRhCiAgICAgICAgICAgIHZhciB0YXNrRGF0YSA9IHt9OwogICAgICAgICAgICB2YXIgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lciA9IHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSA9IHByb3RvW0FERF9FVkVOVF9MSVNURU5FUl07CiAgICAgICAgICAgIHZhciBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChSRU1PVkVfRVZFTlRfTElTVEVORVIpXSA9CiAgICAgICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdOwogICAgICAgICAgICB2YXIgbmF0aXZlTGlzdGVuZXJzID0gcHJvdG9bem9uZVN5bWJvbChMSVNURU5FUlNfRVZFTlRfTElTVEVORVIpXSA9CiAgICAgICAgICAgICAgICBwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdOwogICAgICAgICAgICB2YXIgbmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzID0gcHJvdG9bem9uZVN5bWJvbChSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUildID0KICAgICAgICAgICAgICAgIHByb3RvW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgdmFyIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyOwogICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciA9IHByb3RvW3pvbmVTeW1ib2wocGF0Y2hPcHRpb25zLnByZXBlbmQpXSA9CiAgICAgICAgICAgICAgICAgICAgcHJvdG9bcGF0Y2hPcHRpb25zLnByZXBlbmRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGlzIHV0aWwgZnVuY3Rpb24gd2lsbCBidWlsZCBhbiBvcHRpb24gb2JqZWN0IHdpdGggcGFzc2l2ZSBvcHRpb24KICAgICAgICAgICAgICogdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBpbnB1dCBmcm9tIHRoZSB1c2VyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRFdmVudExpc3RlbmVyT3B0aW9ucyhvcHRpb25zLCBwYXNzaXZlKSB7CiAgICAgICAgICAgICAgICBpZiAoIXBhc3NpdmVTdXBwb3J0ZWQgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgcGFzc2l2ZSBidXQgdXNlciB3YW50IHRvIHBhc3MgYW4gb2JqZWN0IGFzIG9wdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5vdCB3b3JrIG9uIHNvbWUgb2xkIGJyb3dzZXIsIHNvIHdlIGp1c3QgcGFzcyBhIGJvb2xlYW4KICAgICAgICAgICAgICAgICAgICAvLyBhcyB1c2VDYXB0dXJlIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIW9wdGlvbnMuY2FwdHVyZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcGFzc2l2ZVN1cHBvcnRlZCB8fCAhcGFzc2l2ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjYXB0dXJlOiBvcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXNzaXZlOiB0cnVlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMucGFzc2l2ZSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGN1c3RvbVNjaGVkdWxlR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB0YXNrIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSwKICAgICAgICAgICAgICAgIC8vIGp1c3QgcmV0dXJuLCBiZWNhdXNlIHdlIHVzZSB0aGUgc2hhcmVkIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGhlcmUuCiAgICAgICAgICAgICAgICBpZiAodGFza0RhdGEuaXNFeGlzdGluZykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVBZGRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2tEYXRhLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFza0RhdGEub3B0aW9ucyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjdXN0b21DYW5jZWxHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgLy8gaWYgdGFzayBpcyBub3QgbWFya2VkIGFzIGlzUmVtb3ZlZCwgdGhpcyBjYWxsIGlzIGRpcmVjdGx5CiAgICAgICAgICAgICAgICAvLyBmcm9tIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2ssIHdlIHNob3VsZCByZW1vdmUgdGhlIHRhc2sKICAgICAgICAgICAgICAgIC8vIGZyb20gdGFza3NMaXN0IG9mIHRhcmdldCBmaXJzdAogICAgICAgICAgICAgICAgaWYgKCF0YXNrLmlzUmVtb3ZlZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVt0YXNrLmV2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbEV2ZW50TmFtZSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykgewogICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW3Rhc2suY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nVGFza3MgPSBzeW1ib2xFdmVudE5hbWUgJiYgdGFzay50YXJnZXRbc3ltYm9sRXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4aXN0aW5nVGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFzayA9PT0gdGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3Muc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpc1JlbW92ZWQgdG8gZGF0YSBmb3IgZmFzdGVyIGludm9rZVRhc2sgY2hlY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmlzUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUgaGF2ZSBnb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2sgYW5kIHJlbW92ZSB0aGUgdGFzayBjYWNoZSBmcm9tIHRhcmdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmFsbFJlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnRhcmdldFtzeW1ib2xFdmVudE5hbWVdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBpZiBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSwKICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgcmVhbGx5IHJlbW92ZSB0aGUgZ2xvYmFsIGV2ZW50IGNhbGxiYWNrLAogICAgICAgICAgICAgICAgLy8gaWYgbm90LCByZXR1cm4KICAgICAgICAgICAgICAgIGlmICghdGFzay5hbGxSZW1vdmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrLnRhcmdldCwgdGFzay5ldmVudE5hbWUsIHRhc2suY2FwdHVyZSA/IGdsb2JhbFpvbmVBd2FyZUNhcHR1cmVDYWxsYmFjayA6IGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrLCB0YXNrLm9wdGlvbnMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGVQcmVwZW5kID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lci5jYWxsKHRhc2tEYXRhLnRhcmdldCwgdGFza0RhdGEuZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFza0RhdGEub3B0aW9ucyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjdXN0b21DYW5jZWxOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrLnRhcmdldCwgdGFzay5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrLm9wdGlvbnMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGUgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbVNjaGVkdWxlR2xvYmFsIDogY3VzdG9tU2NoZWR1bGVOb25HbG9iYWw7CiAgICAgICAgICAgIHZhciBjdXN0b21DYW5jZWwgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbUNhbmNlbEdsb2JhbCA6IGN1c3RvbUNhbmNlbE5vbkdsb2JhbDsKICAgICAgICAgICAgdmFyIGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlID0gZnVuY3Rpb24gKHRhc2ssIGRlbGVnYXRlKSB7CiAgICAgICAgICAgICAgICB2YXIgdHlwZU9mRGVsZWdhdGUgPSB0eXBlb2YgZGVsZWdhdGU7CiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVPZkRlbGVnYXRlID09PSAnZnVuY3Rpb24nICYmIHRhc2suY2FsbGJhY2sgPT09IGRlbGVnYXRlKSB8fAogICAgICAgICAgICAgICAgICAgICh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgdGFzay5vcmlnaW5hbERlbGVnYXRlID09PSBkZWxlZ2F0ZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjb21wYXJlID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuZGlmZikgPyBwYXRjaE9wdGlvbnMuZGlmZiA6IGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlOwogICAgICAgICAgICB2YXIgYmxhY2tMaXN0ZWRFdmVudHMgPSBab25lW3pvbmVTeW1ib2woJ0JMQUNLX0xJU1RFRF9FVkVOVFMnKV07CiAgICAgICAgICAgIHZhciBwYXNzaXZlRXZlbnRzID0gX2dsb2JhbFt6b25lU3ltYm9sKCdQQVNTSVZFX0VWRU5UUycpXTsKICAgICAgICAgICAgdmFyIG1ha2VBZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChuYXRpdmVMaXN0ZW5lciwgYWRkU291cmNlLCBjdXN0b21TY2hlZHVsZUZuLCBjdXN0b21DYW5jZWxGbiwgcmV0dXJuVGFyZ2V0LCBwcmVwZW5kKSB7CiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0ID09PSB2b2lkIDApIHsgcmV0dXJuVGFyZ2V0ID0gZmFsc2U7IH0KICAgICAgICAgICAgICAgIGlmIChwcmVwZW5kID09PSB2b2lkIDApIHsgcHJlcGVuZCA9IGZhbHNlOyB9CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlmICghZGVsZWdhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpc05vZGUgJiYgZXZlbnROYW1lID09PSAndW5jYXVnaHRFeGNlcHRpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHBhdGNoIHVuY2F1Z2h0RXhjZXB0aW9uIG9mIG5vZGVqcyB0byBwcmV2ZW50IGVuZGxlc3MgbG9vcAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIHRoZSBiaW5kIGRlbGVnYXRlIGZ1bmN0aW9uIGZvciBoYW5kbGVFdmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgaGVyZSB0byBpbXByb3ZlIGFkZEV2ZW50TGlzdGVuZXIgcGVyZm9ybWFuY2UKICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGNyZWF0ZSB0aGUgYmluZCBkZWxlZ2F0ZSB3aGVuIGludm9rZQogICAgICAgICAgICAgICAgICAgIHZhciBpc0hhbmRsZUV2ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpc0hhbmRsZUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSGFuZGxlciAmJiAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZUxpc3RlbmVyLCBkZWxlZ2F0ZSwgdGFyZ2V0LCBhcmd1bWVudHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhc3NpdmUgPSBwYXNzaXZlU3VwcG9ydGVkICYmICEhcGFzc2l2ZUV2ZW50cyAmJiBwYXNzaXZlRXZlbnRzLmluZGV4T2YoZXZlbnROYW1lKSAhPT0gLTE7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zKGFyZ3VtZW50c1syXSwgcGFzc2l2ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJsYWNrTGlzdGVkRXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGJsYWNrIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibGFja0xpc3RlZEV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gYmxhY2tMaXN0ZWRFdmVudHNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2l2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuY2FsbCh0YXJnZXQsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjYXB0dXJlID0gIW9wdGlvbnMgPyBmYWxzZSA6IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB0cnVlIDogb3B0aW9ucy5jYXB0dXJlOwogICAgICAgICAgICAgICAgICAgIHZhciBvbmNlID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgPyBvcHRpb25zLm9uY2UgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN5bWJvbEV2ZW50TmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lLCBldmVudE5hbWVUb1N0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW2NhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNFeGlzdGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSB0YXNrIHJlZ2lzdGVyZWQKICAgICAgICAgICAgICAgICAgICAgICAgaXNFeGlzdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUoZXhpc3RpbmdUYXNrc1tpXSwgZGVsZWdhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgY2FsbGJhY2ssIHNhbWUgY2FwdHVyZSwgc2FtZSBldmVudCBuYW1lLCBqdXN0IHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTsKICAgICAgICAgICAgICAgICAgICB2YXIgY29uc3RydWN0b3JOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yWyduYW1lJ107CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldFNvdXJjZSA9IGdsb2JhbFNvdXJjZXNbY29uc3RydWN0b3JOYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRhcmdldFNvdXJjZVtldmVudE5hbWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBjb25zdHJ1Y3Rvck5hbWUgKyBhZGRTb3VyY2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBuZXcgb2JqZWN0IGFzIHRhc2suZGF0YSB0byBwYXNzIHRob3NlIHRoaW5ncwogICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgdXNlIHRoZSBnbG9iYWwgc2hhcmVkIG9uZQogICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgIGlmIChvbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBvbmNlIG9wdGlvbnMsIHdlIGRvbid0IHBhc3MgaXQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmF0aXZlIGFkZEV2ZW50TGlzdGVuZXIsIGluc3RlYWQgd2Uga2VlcCB0aGUgb25jZSBzZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBoYW5kbGUgb3Vyc2VsdmVzLgogICAgICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLm9uY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLmNhcHR1cmUgPSBjYXB0dXJlOwogICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5pc0V4aXN0aW5nID0gaXNFeGlzdGluZzsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHVzZUdsb2JhbENhbGxiYWNrID8gT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGFza0RhdGEgaW50byBkYXRhIHRvIGFsbG93IG9uU2NoZWR1bGVFdmVudFRhc2sgdG8gYWNjZXNzIHRoZSB0YXNrIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IHRhc2tEYXRhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBkZWxlZ2F0ZSwgZGF0YSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4pOwogICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciB0YXNrRGF0YS50YXJnZXQgdG8gYXZvaWQgbWVtb3J5IGxlYWsKICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSwgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjA0NDIKICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgdXAgdGFza0RhdGEgYmVjYXVzZSBpdCBpcyBhIGdsb2JhbCBvYmplY3QKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRhc2tEYXRhID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBzYXZlIHRob3NlIGluZm9ybWF0aW9uIHRvIHRhc2sgaW4gY2FzZQogICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIG1heSBjYWxsIHRhc2suem9uZS5jYW5jZWxUYXNrKCkgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICBpZiAob25jZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISghcGFzc2l2ZVN1cHBvcnRlZCAmJiB0eXBlb2YgdGFzay5vcHRpb25zID09PSAnYm9vbGVhbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzdXBwb3J0IHBhc3NpdmUsIGFuZCB3ZSBwYXNzIGFuIG9wdGlvbiBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWRkRXZlbnRMaXN0ZW5lciwgd2Ugc2hvdWxkIHNhdmUgdGhlIG9wdGlvbnMgdG8gdGFzawogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0YXNrLnRhcmdldCA9IHRhcmdldDsKICAgICAgICAgICAgICAgICAgICB0YXNrLmNhcHR1cmUgPSBjYXB0dXJlOwogICAgICAgICAgICAgICAgICAgIHRhc2suZXZlbnROYW1lID0gZXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0hhbmRsZUV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgZGVsZWdhdGUgZm9yIGNvbXBhcmUgdG8gY2hlY2sgZHVwbGljYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXBlbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5wdXNoKHRhc2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy51bnNoaWZ0KHRhc2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVBZGRFdmVudExpc3RlbmVyLCBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQpOwogICAgICAgICAgICBpZiAobmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIHByb3RvW1BSRVBFTkRfRVZFTlRfTElTVEVORVJdID0gbWFrZUFkZExpc3RlbmVyKG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLCBQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSwgY3VzdG9tU2NoZWR1bGVQcmVwZW5kLCBjdXN0b21DYW5jZWwsIHJldHVyblRhcmdldCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgdmFyIGNhcHR1cmUgPSAhb3B0aW9ucyA/IGZhbHNlIDogdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IHRydWUgOiBvcHRpb25zLmNhcHR1cmU7CiAgICAgICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICBpZiAoIWRlbGVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUhhbmRsZXIgJiYKICAgICAgICAgICAgICAgICAgICAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIsIGRlbGVnYXRlLCB0YXJnZXQsIGFyZ3VtZW50cykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWU7CiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykgewogICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4aXN0aW5nVGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nVGFzayA9IGV4aXN0aW5nVGFza3NbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlKGV4aXN0aW5nVGFzaywgZGVsZWdhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpc1JlbW92ZWQgdG8gZGF0YSBmb3IgZmFzdGVyIGludm9rZVRhc2sgY2hlY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFzay5pc1JlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suYWxsUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0YXJnZXQsIHdlIGhhdmUgYW4gZXZlbnQgbGlzdGVuZXIgd2hpY2ggaXMgYWRkZWQgYnkgb25fcHJvcGVydHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzIHRhcmdldC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7fSwgc28gd2UgbmVlZCB0byBjbGVhciB0aGlzIGludGVybmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgdG9vIGlmIGFsbCBkZWxlZ2F0ZXMgYWxsIHJlbW92ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9uUHJvcGVydHlTeW1ib2wgPSBaT05FX1NZTUJPTF9QUkVGSVggKyAnT05fUFJPUEVSVFknICsgZXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbb25Qcm9wZXJ0eVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFzay56b25lLmNhbmNlbFRhc2soZXhpc3RpbmdUYXNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gaXNzdWUgOTMwLCBkaWRuJ3QgZmluZCB0aGUgZXZlbnQgbmFtZSBvciBjYWxsYmFjawogICAgICAgICAgICAgICAgLy8gZnJvbSB6b25lIGtlcHQgZXhpc3RpbmdUYXNrcywgdGhlIGNhbGxiYWNrIG1heWJlCiAgICAgICAgICAgICAgICAvLyBhZGRlZCBvdXRzaWRlIG9mIHpvbmUsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgLy8gdG8gdHJ5IHRvIHJlbW92ZSBpdC4KICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsOwogICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKGV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gW107CiAgICAgICAgICAgICAgICB2YXIgdGFza3MgPSBmaW5kRXZlbnRUYXNrcyh0YXJnZXQsIGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc1tpXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGRlbGVnYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHByb3RvW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgaWYgKCFldmVudE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gRVZFTlRfTkFNRV9TWU1CT0xfUkVHWC5leGVjKHByb3ApOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0TmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBub2RlanMgRXZlbnRFbWl0dGVyLCByZW1vdmVMaXN0ZW5lciBldmVudCBpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIGZvciBtb25pdG9yaW5nIHRoZSByZW1vdmVMaXN0ZW5lciBjYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBqdXN0IGtlZXAgcmVtb3ZlTGlzdGVuZXIgZXZlbnRMaXN0ZW5lciB1bnRpbAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXZlbnRMaXN0ZW5lcnMgYXJlIHJlbW92ZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2dE5hbWUgJiYgZXZ0TmFtZSAhPT0gJ3JlbW92ZUxpc3RlbmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0uY2FsbCh0aGlzLCBldnROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIgZmluYWxseQogICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbEV2ZW50TmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbENhcHR1cmVFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW1RSVUVfU1RSXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZVRhc2tzID0gdGFza3Muc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3ZlVGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHJlbW92ZVRhc2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgdGFzay5vcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVRhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlVGFza3MgPSBjYXB0dXJlVGFza3Muc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3ZlVGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHJlbW92ZVRhc2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgdGFzay5vcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gZm9yIG5hdGl2ZSB0b1N0cmluZyBwYXRjaAogICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lcik7CiAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyKTsKICAgICAgICAgICAgaWYgKG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycykgewogICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmF0aXZlTGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlTGlzdGVuZXJzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFwaXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHBhdGNoRXZlbnRUYXJnZXRNZXRob2RzKGFwaXNbaV0sIHBhdGNoT3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQogICAgZnVuY3Rpb24gZmluZEV2ZW50VGFza3ModGFyZ2V0LCBldmVudE5hbWUpIHsKICAgICAgICBpZiAoIWV2ZW50TmFtZSkgewogICAgICAgICAgICB2YXIgZm91bmRUYXNrcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHRhcmdldCkgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gRVZFTlRfTkFNRV9TWU1CT0xfUkVHWC5leGVjKHByb3ApOwogICAgICAgICAgICAgICAgdmFyIGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTsKICAgICAgICAgICAgICAgIGlmIChldnROYW1lICYmICghZXZlbnROYW1lIHx8IGV2dE5hbWUgPT09IGV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFza3MgPSB0YXJnZXRbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFza3MucHVzaCh0YXNrc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kVGFza3M7CiAgICAgICAgfQogICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWUgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV07CiAgICAgICAgaWYgKCFzeW1ib2xFdmVudE5hbWUpIHsKICAgICAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lKTsKICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdOwogICAgICAgIH0KICAgICAgICB2YXIgY2FwdHVyZUZhbHNlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW0ZBTFNFX1NUUl1dOwogICAgICAgIHZhciBjYXB0dXJlVHJ1ZVRhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZVtUUlVFX1NUUl1dOwogICAgICAgIGlmICghY2FwdHVyZUZhbHNlVGFza3MpIHsKICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3MgPyBjYXB0dXJlVHJ1ZVRhc2tzLnNsaWNlKCkgOiBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBjYXB0dXJlVHJ1ZVRhc2tzID8gY2FwdHVyZUZhbHNlVGFza3MuY29uY2F0KGNhcHR1cmVUcnVlVGFza3MpIDoKICAgICAgICAgICAgICAgIGNhcHR1cmVGYWxzZVRhc2tzLnNsaWNlKCk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcGF0Y2hFdmVudFByb3RvdHlwZShnbG9iYWwsIGFwaSkgewogICAgICAgIHZhciBFdmVudCA9IGdsb2JhbFsnRXZlbnQnXTsKICAgICAgICBpZiAoRXZlbnQgJiYgRXZlbnQucHJvdG90eXBlKSB7CiAgICAgICAgICAgIGFwaS5wYXRjaE1ldGhvZChFdmVudC5wcm90b3R5cGUsICdzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24nLCBmdW5jdGlvbiAoZGVsZWdhdGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICBzZWxmW0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY2FsbCB0aGUgbmF0aXZlIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbgogICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBpbiBzb21lIGh5YnJpZCBhcHBsaWNhdGlvbiwgc29tZSBwYXJ0IG9mCiAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgem9uZSwgc29tZSBhcmUgbm90CiAgICAgICAgICAgICAgICBkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICAgICAgfTsgfSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gcGF0Y2hDYWxsYmFja3MoYXBpLCB0YXJnZXQsIHRhcmdldE5hbWUsIG1ldGhvZCwgY2FsbGJhY2tzKSB7CiAgICAgICAgdmFyIHN5bWJvbCA9IFpvbmUuX19zeW1ib2xfXyhtZXRob2QpOwogICAgICAgIGlmICh0YXJnZXRbc3ltYm9sXSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBuYXRpdmVEZWxlZ2F0ZSA9IHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF07CiAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBmdW5jdGlvbiAobmFtZSwgb3B0cywgb3B0aW9ucykgewogICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLnByb3RvdHlwZSkgewogICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRhcmdldE5hbWUgKyAiLiIgKyBtZXRob2QgKyAiOjoiICsgY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9wdHMucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm90b3R5cGUuaGFzT3duUHJvcGVydHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKGRlc2NyaXB0b3IudmFsdWUsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGkuX3JlZGVmaW5lUHJvcGVydHkob3B0cy5wcm90b3R5cGUsIGNhbGxiYWNrLCBkZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b3R5cGVbY2FsbGJhY2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGVbY2FsbGJhY2tdID0gYXBpLndyYXBXaXRoQ3VycmVudFpvbmUocHJvdG90eXBlW2NhbGxiYWNrXSwgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b3R5cGVbY2FsbGJhY2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVtjYWxsYmFja10gPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShwcm90b3R5cGVbY2FsbGJhY2tdLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuYXRpdmVEZWxlZ2F0ZS5jYWxsKHRhcmdldCwgbmFtZSwgb3B0cywgb3B0aW9ucyk7CiAgICAgICAgfTsKICAgICAgICBhcGkuYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHRhcmdldFttZXRob2RdLCBuYXRpdmVEZWxlZ2F0ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICB2YXIgZ2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TmFtZXMgPSBbCiAgICAgICAgJ2Fib3J0JywKICAgICAgICAnYW5pbWF0aW9uY2FuY2VsJywKICAgICAgICAnYW5pbWF0aW9uZW5kJywKICAgICAgICAnYW5pbWF0aW9uaXRlcmF0aW9uJywKICAgICAgICAnYXV4Y2xpY2snLAogICAgICAgICdiZWZvcmVpbnB1dCcsCiAgICAgICAgJ2JsdXInLAogICAgICAgICdjYW5jZWwnLAogICAgICAgICdjYW5wbGF5JywKICAgICAgICAnY2FucGxheXRocm91Z2gnLAogICAgICAgICdjaGFuZ2UnLAogICAgICAgICdjb21wb3NpdGlvbnN0YXJ0JywKICAgICAgICAnY29tcG9zaXRpb251cGRhdGUnLAogICAgICAgICdjb21wb3NpdGlvbmVuZCcsCiAgICAgICAgJ2N1ZWNoYW5nZScsCiAgICAgICAgJ2NsaWNrJywKICAgICAgICAnY2xvc2UnLAogICAgICAgICdjb250ZXh0bWVudScsCiAgICAgICAgJ2N1cmVjaGFuZ2UnLAogICAgICAgICdkYmxjbGljaycsCiAgICAgICAgJ2RyYWcnLAogICAgICAgICdkcmFnZW5kJywKICAgICAgICAnZHJhZ2VudGVyJywKICAgICAgICAnZHJhZ2V4aXQnLAogICAgICAgICdkcmFnbGVhdmUnLAogICAgICAgICdkcmFnb3ZlcicsCiAgICAgICAgJ2Ryb3AnLAogICAgICAgICdkdXJhdGlvbmNoYW5nZScsCiAgICAgICAgJ2VtcHRpZWQnLAogICAgICAgICdlbmRlZCcsCiAgICAgICAgJ2Vycm9yJywKICAgICAgICAnZm9jdXMnLAogICAgICAgICdmb2N1c2luJywKICAgICAgICAnZm9jdXNvdXQnLAogICAgICAgICdnb3Rwb2ludGVyY2FwdHVyZScsCiAgICAgICAgJ2lucHV0JywKICAgICAgICAnaW52YWxpZCcsCiAgICAgICAgJ2tleWRvd24nLAogICAgICAgICdrZXlwcmVzcycsCiAgICAgICAgJ2tleXVwJywKICAgICAgICAnbG9hZCcsCiAgICAgICAgJ2xvYWRzdGFydCcsCiAgICAgICAgJ2xvYWRlZGRhdGEnLAogICAgICAgICdsb2FkZWRtZXRhZGF0YScsCiAgICAgICAgJ2xvc3Rwb2ludGVyY2FwdHVyZScsCiAgICAgICAgJ21vdXNlZG93bicsCiAgICAgICAgJ21vdXNlZW50ZXInLAogICAgICAgICdtb3VzZWxlYXZlJywKICAgICAgICAnbW91c2Vtb3ZlJywKICAgICAgICAnbW91c2VvdXQnLAogICAgICAgICdtb3VzZW92ZXInLAogICAgICAgICdtb3VzZXVwJywKICAgICAgICAnbW91c2V3aGVlbCcsCiAgICAgICAgJ29yaWVudGF0aW9uY2hhbmdlJywKICAgICAgICAncGF1c2UnLAogICAgICAgICdwbGF5JywKICAgICAgICAncGxheWluZycsCiAgICAgICAgJ3BvaW50ZXJjYW5jZWwnLAogICAgICAgICdwb2ludGVyZG93bicsCiAgICAgICAgJ3BvaW50ZXJlbnRlcicsCiAgICAgICAgJ3BvaW50ZXJsZWF2ZScsCiAgICAgICAgJ3BvaW50ZXJsb2NrY2hhbmdlJywKICAgICAgICAnbW96cG9pbnRlcmxvY2tjaGFuZ2UnLAogICAgICAgICd3ZWJraXRwb2ludGVybG9ja2VyY2hhbmdlJywKICAgICAgICAncG9pbnRlcmxvY2tlcnJvcicsCiAgICAgICAgJ21venBvaW50ZXJsb2NrZXJyb3InLAogICAgICAgICd3ZWJraXRwb2ludGVybG9ja2Vycm9yJywKICAgICAgICAncG9pbnRlcm1vdmUnLAogICAgICAgICdwb2ludG91dCcsCiAgICAgICAgJ3BvaW50ZXJvdmVyJywKICAgICAgICAncG9pbnRlcnVwJywKICAgICAgICAncHJvZ3Jlc3MnLAogICAgICAgICdyYXRlY2hhbmdlJywKICAgICAgICAncmVzZXQnLAogICAgICAgICdyZXNpemUnLAogICAgICAgICdzY3JvbGwnLAogICAgICAgICdzZWVrZWQnLAogICAgICAgICdzZWVraW5nJywKICAgICAgICAnc2VsZWN0JywKICAgICAgICAnc2VsZWN0aW9uY2hhbmdlJywKICAgICAgICAnc2VsZWN0c3RhcnQnLAogICAgICAgICdzaG93JywKICAgICAgICAnc29ydCcsCiAgICAgICAgJ3N0YWxsZWQnLAogICAgICAgICdzdWJtaXQnLAogICAgICAgICdzdXNwZW5kJywKICAgICAgICAndGltZXVwZGF0ZScsCiAgICAgICAgJ3ZvbHVtZWNoYW5nZScsCiAgICAgICAgJ3RvdWNoY2FuY2VsJywKICAgICAgICAndG91Y2htb3ZlJywKICAgICAgICAndG91Y2hzdGFydCcsCiAgICAgICAgJ3RvdWNoZW5kJywKICAgICAgICAndHJhbnNpdGlvbmNhbmNlbCcsCiAgICAgICAgJ3RyYW5zaXRpb25lbmQnLAogICAgICAgICd3YWl0aW5nJywKICAgICAgICAnd2hlZWwnCiAgICBdOwogICAgdmFyIGRvY3VtZW50RXZlbnROYW1lcyA9IFsKICAgICAgICAnYWZ0ZXJzY3JpcHRleGVjdXRlJywgJ2JlZm9yZXNjcmlwdGV4ZWN1dGUnLCAnRE9NQ29udGVudExvYWRlZCcsICdmcmVlemUnLCAnZnVsbHNjcmVlbmNoYW5nZScsCiAgICAgICAgJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsICdtc2Z1bGxzY3JlZW5jaGFuZ2UnLCAnZnVsbHNjcmVlbmVycm9yJywKICAgICAgICAnbW96ZnVsbHNjcmVlbmVycm9yJywgJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvcicsICdtc2Z1bGxzY3JlZW5lcnJvcicsICdyZWFkeXN0YXRlY2hhbmdlJywKICAgICAgICAndmlzaWJpbGl0eWNoYW5nZScsICdyZXN1bWUnCiAgICBdOwogICAgdmFyIHdpbmRvd0V2ZW50TmFtZXMgPSBbCiAgICAgICAgJ2Fic29sdXRlZGV2aWNlb3JpZW50YXRpb24nLAogICAgICAgICdhZnRlcmlucHV0JywKICAgICAgICAnYWZ0ZXJwcmludCcsCiAgICAgICAgJ2FwcGluc3RhbGxlZCcsCiAgICAgICAgJ2JlZm9yZWluc3RhbGxwcm9tcHQnLAogICAgICAgICdiZWZvcmVwcmludCcsCiAgICAgICAgJ2JlZm9yZXVubG9hZCcsCiAgICAgICAgJ2RldmljZWxpZ2h0JywKICAgICAgICAnZGV2aWNlbW90aW9uJywKICAgICAgICAnZGV2aWNlb3JpZW50YXRpb24nLAogICAgICAgICdkZXZpY2VvcmllbnRhdGlvbmFic29sdXRlJywKICAgICAgICAnZGV2aWNlcHJveGltaXR5JywKICAgICAgICAnaGFzaGNoYW5nZScsCiAgICAgICAgJ2xhbmd1YWdlY2hhbmdlJywKICAgICAgICAnbWVzc2FnZScsCiAgICAgICAgJ21vemJlZm9yZXBhaW50JywKICAgICAgICAnb2ZmbGluZScsCiAgICAgICAgJ29ubGluZScsCiAgICAgICAgJ3BhaW50JywKICAgICAgICAncGFnZXNob3cnLAogICAgICAgICdwYWdlaGlkZScsCiAgICAgICAgJ3BvcHN0YXRlJywKICAgICAgICAncmVqZWN0aW9uaGFuZGxlZCcsCiAgICAgICAgJ3N0b3JhZ2UnLAogICAgICAgICd1bmhhbmRsZWRyZWplY3Rpb24nLAogICAgICAgICd1bmxvYWQnLAogICAgICAgICd1c2VycHJveGltaXR5JywKICAgICAgICAndnJkaXNwbGF5Y29ubmVjdGVkJywKICAgICAgICAndnJkaXNwbGF5ZGlzY29ubmVjdGVkJywKICAgICAgICAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScKICAgIF07CiAgICB2YXIgaHRtbEVsZW1lbnRFdmVudE5hbWVzID0gWwogICAgICAgICdiZWZvcmVjb3B5JywgJ2JlZm9yZWN1dCcsICdiZWZvcmVwYXN0ZScsICdjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdkcmFnc3RhcnQnLCAnbG9hZGVuZCcsCiAgICAgICAgJ2FuaW1hdGlvbnN0YXJ0JywgJ3NlYXJjaCcsICd0cmFuc2l0aW9ucnVuJywgJ3RyYW5zaXRpb25zdGFydCcsICd3ZWJraXRhbmltYXRpb25lbmQnLAogICAgICAgICd3ZWJraXRhbmltYXRpb25pdGVyYXRpb24nLCAnd2Via2l0YW5pbWF0aW9uc3RhcnQnLCAnd2Via2l0dHJhbnNpdGlvbmVuZCcKICAgIF07CiAgICB2YXIgbWVkaWFFbGVtZW50RXZlbnROYW1lcyA9IFsnZW5jcnlwdGVkJywgJ3dhaXRpbmdmb3JrZXknLCAnbXNuZWVka2V5JywgJ21vemludGVycnVwdGJlZ2luJywgJ21vemludGVycnVwdGVuZCddOwogICAgdmFyIGllRWxlbWVudEV2ZW50TmFtZXMgPSBbCiAgICAgICAgJ2FjdGl2YXRlJywKICAgICAgICAnYWZ0ZXJ1cGRhdGUnLAogICAgICAgICdhcmlhcmVxdWVzdCcsCiAgICAgICAgJ2JlZm9yZWFjdGl2YXRlJywKICAgICAgICAnYmVmb3JlZGVhY3RpdmF0ZScsCiAgICAgICAgJ2JlZm9yZWVkaXRmb2N1cycsCiAgICAgICAgJ2JlZm9yZXVwZGF0ZScsCiAgICAgICAgJ2NlbGxjaGFuZ2UnLAogICAgICAgICdjb250cm9sc2VsZWN0JywKICAgICAgICAnZGF0YWF2YWlsYWJsZScsCiAgICAgICAgJ2RhdGFzZXRjaGFuZ2VkJywKICAgICAgICAnZGF0YXNldGNvbXBsZXRlJywKICAgICAgICAnZXJyb3J1cGRhdGUnLAogICAgICAgICdmaWx0ZXJjaGFuZ2UnLAogICAgICAgICdsYXlvdXRjb21wbGV0ZScsCiAgICAgICAgJ2xvc2VjYXB0dXJlJywKICAgICAgICAnbW92ZScsCiAgICAgICAgJ21vdmVlbmQnLAogICAgICAgICdtb3Zlc3RhcnQnLAogICAgICAgICdwcm9wZXJ0eWNoYW5nZScsCiAgICAgICAgJ3Jlc2l6ZWVuZCcsCiAgICAgICAgJ3Jlc2l6ZXN0YXJ0JywKICAgICAgICAncm93ZW50ZXInLAogICAgICAgICdyb3dleGl0JywKICAgICAgICAncm93c2RlbGV0ZScsCiAgICAgICAgJ3Jvd3NpbnNlcnRlZCcsCiAgICAgICAgJ2NvbW1hbmQnLAogICAgICAgICdjb21wYXNzbmVlZHNjYWxpYnJhdGlvbicsCiAgICAgICAgJ2RlYWN0aXZhdGUnLAogICAgICAgICdoZWxwJywKICAgICAgICAnbXNjb250ZW50em9vbScsCiAgICAgICAgJ21zbWFuaXB1bGF0aW9uc3RhdGVjaGFuZ2VkJywKICAgICAgICAnbXNnZXN0dXJlY2hhbmdlJywKICAgICAgICAnbXNnZXN0dXJlZG91YmxldGFwJywKICAgICAgICAnbXNnZXN0dXJlZW5kJywKICAgICAgICAnbXNnZXN0dXJlaG9sZCcsCiAgICAgICAgJ21zZ2VzdHVyZXN0YXJ0JywKICAgICAgICAnbXNnZXN0dXJldGFwJywKICAgICAgICAnbXNnb3Rwb2ludGVyY2FwdHVyZScsCiAgICAgICAgJ21zaW5lcnRpYXN0YXJ0JywKICAgICAgICAnbXNsb3N0cG9pbnRlcmNhcHR1cmUnLAogICAgICAgICdtc3BvaW50ZXJjYW5jZWwnLAogICAgICAgICdtc3BvaW50ZXJkb3duJywKICAgICAgICAnbXNwb2ludGVyZW50ZXInLAogICAgICAgICdtc3BvaW50ZXJob3ZlcicsCiAgICAgICAgJ21zcG9pbnRlcmxlYXZlJywKICAgICAgICAnbXNwb2ludGVybW92ZScsCiAgICAgICAgJ21zcG9pbnRlcm91dCcsCiAgICAgICAgJ21zcG9pbnRlcm92ZXInLAogICAgICAgICdtc3BvaW50ZXJ1cCcsCiAgICAgICAgJ3BvaW50ZXJvdXQnLAogICAgICAgICdtc3NpdGVtb2RlanVtcGxpc3RpdGVtcmVtb3ZlZCcsCiAgICAgICAgJ21zdGh1bWJuYWlsY2xpY2snLAogICAgICAgICdzdG9wJywKICAgICAgICAnc3RvcmFnZWNvbW1pdCcKICAgIF07CiAgICB2YXIgd2ViZ2xFdmVudE5hbWVzID0gWyd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsICd3ZWJnbGNvbnRleHRsb3N0JywgJ3dlYmdsY29udGV4dGNyZWF0aW9uZXJyb3InXTsKICAgIHZhciBmb3JtRXZlbnROYW1lcyA9IFsnYXV0b2NvbXBsZXRlJywgJ2F1dG9jb21wbGV0ZWVycm9yJ107CiAgICB2YXIgZGV0YWlsRXZlbnROYW1lcyA9IFsndG9nZ2xlJ107CiAgICB2YXIgZnJhbWVFdmVudE5hbWVzID0gWydsb2FkJ107CiAgICB2YXIgZnJhbWVTZXRFdmVudE5hbWVzID0gWydibHVyJywgJ2Vycm9yJywgJ2ZvY3VzJywgJ2xvYWQnLCAncmVzaXplJywgJ3Njcm9sbCcsICdtZXNzYWdlZXJyb3InXTsKICAgIHZhciBtYXJxdWVlRXZlbnROYW1lcyA9IFsnYm91bmNlJywgJ2ZpbmlzaCcsICdzdGFydCddOwogICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnROYW1lcyA9IFsKICAgICAgICAnbG9hZHN0YXJ0JywgJ3Byb2dyZXNzJywgJ2Fib3J0JywgJ2Vycm9yJywgJ2xvYWQnLCAncHJvZ3Jlc3MnLCAndGltZW91dCcsICdsb2FkZW5kJywKICAgICAgICAncmVhZHlzdGF0ZWNoYW5nZScKICAgIF07CiAgICB2YXIgSURCSW5kZXhFdmVudE5hbWVzID0gWyd1cGdyYWRlbmVlZGVkJywgJ2NvbXBsZXRlJywgJ2Fib3J0JywgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnYmxvY2tlZCcsICd2ZXJzaW9uY2hhbmdlJywgJ2Nsb3NlJ107CiAgICB2YXIgd2Vic29ja2V0RXZlbnROYW1lcyA9IFsnY2xvc2UnLCAnZXJyb3InLCAnb3BlbicsICdtZXNzYWdlJ107CiAgICB2YXIgd29ya2VyRXZlbnROYW1lcyA9IFsnZXJyb3InLCAnbWVzc2FnZSddOwogICAgdmFyIGV2ZW50TmFtZXMgPSBnbG9iYWxFdmVudEhhbmRsZXJzRXZlbnROYW1lcy5jb25jYXQod2ViZ2xFdmVudE5hbWVzLCBmb3JtRXZlbnROYW1lcywgZGV0YWlsRXZlbnROYW1lcywgZG9jdW1lbnRFdmVudE5hbWVzLCB3aW5kb3dFdmVudE5hbWVzLCBodG1sRWxlbWVudEV2ZW50TmFtZXMsIGllRWxlbWVudEV2ZW50TmFtZXMpOwogICAgZnVuY3Rpb24gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcykgewogICAgICAgIGlmICghaWdub3JlUHJvcGVydGllcyB8fCBpZ25vcmVQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzOwogICAgICAgIH0KICAgICAgICB2YXIgdGlwID0gaWdub3JlUHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24gKGlwKSB7IHJldHVybiBpcC50YXJnZXQgPT09IHRhcmdldDsgfSk7CiAgICAgICAgaWYgKCF0aXAgfHwgdGlwLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzOwogICAgICAgIH0KICAgICAgICB2YXIgdGFyZ2V0SWdub3JlUHJvcGVydGllcyA9IHRpcFswXS5pZ25vcmVQcm9wZXJ0aWVzOwogICAgICAgIHJldHVybiBvblByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChvcCkgeyByZXR1cm4gdGFyZ2V0SWdub3JlUHJvcGVydGllcy5pbmRleE9mKG9wKSA9PT0gLTE7IH0pOwogICAgfQogICAgZnVuY3Rpb24gcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMsIHByb3RvdHlwZSkgewogICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGFyZ2V0IGlzIGF2YWlsYWJsZSwgc29tZXRpbWVzIHRhcmdldCB3aWxsIGJlIHVuZGVmaW5lZAogICAgICAgIC8vIGJlY2F1c2UgZGlmZmVyZW50IGJyb3dzZXIgb3Igc29tZSAzcmQgcGFydHkgcGx1Z2luLgogICAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGZpbHRlcmVkUHJvcGVydGllcyA9IGZpbHRlclByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgIHBhdGNoT25Qcm9wZXJ0aWVzKHRhcmdldCwgZmlsdGVyZWRQcm9wZXJ0aWVzLCBwcm90b3R5cGUpOwogICAgfQogICAgZnVuY3Rpb24gcHJvcGVydHlEZXNjcmlwdG9yUGF0Y2goYXBpLCBfZ2xvYmFsKSB7CiAgICAgICAgaWYgKGlzTm9kZSAmJiAhaXNNaXgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50cycpXSkgewogICAgICAgICAgICAvLyBldmVudHMgYXJlIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5IGxlZ2FjeSBwYXRjaC4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgc3VwcG9ydHNXZWJTb2NrZXQgPSB0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJzsKICAgICAgICB2YXIgaWdub3JlUHJvcGVydGllcyA9IF9nbG9iYWxbJ19fWm9uZV9pZ25vcmVfb25fcHJvcGVydGllcyddOwogICAgICAgIC8vIGZvciBicm93c2VycyB0aGF0IHdlIGNhbiBwYXRjaCB0aGUgZGVzY3JpcHRvcjogIENocm9tZSAmIEZpcmVmb3gKICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgIHZhciBpbnRlcm5hbFdpbmRvd18xID0gd2luZG93OwogICAgICAgICAgICB2YXIgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gaXNJRSA/IFt7IHRhcmdldDogaW50ZXJuYWxXaW5kb3dfMSwgaWdub3JlUHJvcGVydGllczogWydlcnJvciddIH1dIDogW107CiAgICAgICAgICAgIC8vIGluIElFL0VkZ2UsIG9uUHJvcCBub3QgZXhpc3QgaW4gd2luZG93IG9iamVjdCwgYnV0IGluIFdpbmRvd1Byb3RvdHlwZQogICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHBhc3MgV2luZG93UHJvdG90eXBlIHRvIGNoZWNrIG9uUHJvcCBleGlzdCBvciBub3QKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoaW50ZXJuYWxXaW5kb3dfMSwgZXZlbnROYW1lcy5jb25jYXQoWydtZXNzYWdlZXJyb3InXSksIGlnbm9yZVByb3BlcnRpZXMgPyBpZ25vcmVQcm9wZXJ0aWVzLmNvbmNhdChpZ25vcmVFcnJvclByb3BlcnRpZXMpIDogaWdub3JlUHJvcGVydGllcywgT2JqZWN0R2V0UHJvdG90eXBlT2YoaW50ZXJuYWxXaW5kb3dfMSkpOwogICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhEb2N1bWVudC5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICBpZiAodHlwZW9mIGludGVybmFsV2luZG93XzFbJ1NWR0VsZW1lbnQnXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKGludGVybmFsV2luZG93XzFbJ1NWR0VsZW1lbnQnXS5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKEVsZW1lbnQucHJvdG90eXBlLCBldmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTEVsZW1lbnQucHJvdG90eXBlLCBldmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUsIG1lZGlhRWxlbWVudEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MRnJhbWVTZXRFbGVtZW50LnByb3RvdHlwZSwgd2luZG93RXZlbnROYW1lcy5jb25jYXQoZnJhbWVTZXRFdmVudE5hbWVzKSwgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKEhUTUxCb2R5RWxlbWVudC5wcm90b3R5cGUsIHdpbmRvd0V2ZW50TmFtZXMuY29uY2F0KGZyYW1lU2V0RXZlbnROYW1lcyksIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgZnJhbWVFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBmcmFtZUV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICB2YXIgSFRNTE1hcnF1ZWVFbGVtZW50XzEgPSBpbnRlcm5hbFdpbmRvd18xWydIVE1MTWFycXVlZUVsZW1lbnQnXTsKICAgICAgICAgICAgaWYgKEhUTUxNYXJxdWVlRWxlbWVudF8xKSB7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MTWFycXVlZUVsZW1lbnRfMS5wcm90b3R5cGUsIG1hcnF1ZWVFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgV29ya2VyXzEgPSBpbnRlcm5hbFdpbmRvd18xWydXb3JrZXInXTsKICAgICAgICAgICAgaWYgKFdvcmtlcl8xKSB7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhXb3JrZXJfMS5wcm90b3R5cGUsIHdvcmtlckV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBYTUxIdHRwUmVxdWVzdCA9IF9nbG9iYWxbJ1hNTEh0dHBSZXF1ZXN0J107CiAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0KSB7CiAgICAgICAgICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUgaW4gU2VydmljZVdvcmtlciwgc28gd2UgbmVlZCB0byBjaGVjayBoZXJlCiAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwgWE1MSHR0cFJlcXVlc3RFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSBfZ2xvYmFsWydYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0J107CiAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQpIHsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCAmJiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgWE1MSHR0cFJlcXVlc3RFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBJREJJbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCSW5kZXgucHJvdG90eXBlLCBJREJJbmRleEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhJREJSZXF1ZXN0LnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCT3BlbkRCUmVxdWVzdC5wcm90b3R5cGUsIElEQkluZGV4RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQkRhdGFiYXNlLnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCVHJhbnNhY3Rpb24ucHJvdG90eXBlLCBJREJJbmRleEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhJREJDdXJzb3IucHJvdG90eXBlLCBJREJJbmRleEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgICBpZiAoc3VwcG9ydHNXZWJTb2NrZXQpIHsKICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoV2ViU29ja2V0LnByb3RvdHlwZSwgd2Vic29ja2V0RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3V0aWwnLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHsKICAgICAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMgPSBwYXRjaE9uUHJvcGVydGllczsKICAgICAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDsKICAgICAgICBhcGkuYmluZEFyZ3VtZW50cyA9IGJpbmRBcmd1bWVudHM7CiAgICAgICAgYXBpLnBhdGNoTWFjcm9UYXNrID0gcGF0Y2hNYWNyb1Rhc2s7CiAgICAgICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgdG8KICAgICAgICAvLyBkZWZpbmUgd2hpY2ggZXZlbnRzIHdpbGwgbm90IGJlIHBhdGNoZWQgYnkgYFpvbmUuanNgLgogICAgICAgIC8vIEluIG5ld2VyIHZlcnNpb24gKD49MC45LjApLCB3ZSBjaGFuZ2UgdGhlIGVudiBuYW1lIHRvIGBfX3pvbmVfc3ltYm9sX19VTlBBVENIRURfRVZFTlRTYCB0byBrZWVwCiAgICAgICAgLy8gdGhlIG5hbWUgY29uc2lzdGVudCB3aXRoIGFuZ3VsYXIgcmVwby4KICAgICAgICAvLyBUaGUgIGBfX3pvbmVfc3ltYm9sX19CTEFDS19MSVNURURfRVZFTlRTYCBpcyBkZXByZWNhdGVkLCBidXQgaXQgaXMgc3RpbGwgYmUgc3VwcG9ydGVkIGZvcgogICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgIHZhciBTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnQkxBQ0tfTElTVEVEX0VWRU5UUycpOwogICAgICAgIHZhciBTWU1CT0xfVU5QQVRDSEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnVU5QQVRDSEVEX0VWRU5UUycpOwogICAgICAgIGlmIChnbG9iYWxbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdKSB7CiAgICAgICAgICAgIGdsb2JhbFtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU10gPSBnbG9iYWxbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSkgewogICAgICAgICAgICBab25lW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSA9IFpvbmVbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdID0KICAgICAgICAgICAgICAgIGdsb2JhbFtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU107CiAgICAgICAgfQogICAgICAgIGFwaS5wYXRjaEV2ZW50UHJvdG90eXBlID0gcGF0Y2hFdmVudFByb3RvdHlwZTsKICAgICAgICBhcGkucGF0Y2hFdmVudFRhcmdldCA9IHBhdGNoRXZlbnRUYXJnZXQ7CiAgICAgICAgYXBpLmlzSUVPckVkZ2UgPSBpc0lFT3JFZGdlOwogICAgICAgIGFwaS5PYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdERlZmluZVByb3BlcnR5OwogICAgICAgIGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgYXBpLk9iamVjdENyZWF0ZSA9IE9iamVjdENyZWF0ZTsKICAgICAgICBhcGkuQXJyYXlTbGljZSA9IEFycmF5U2xpY2U7CiAgICAgICAgYXBpLnBhdGNoQ2xhc3MgPSBwYXRjaENsYXNzOwogICAgICAgIGFwaS53cmFwV2l0aEN1cnJlbnRab25lID0gd3JhcFdpdGhDdXJyZW50Wm9uZTsKICAgICAgICBhcGkuZmlsdGVyUHJvcGVydGllcyA9IGZpbHRlclByb3BlcnRpZXM7CiAgICAgICAgYXBpLmF0dGFjaE9yaWdpblRvUGF0Y2hlZCA9IGF0dGFjaE9yaWdpblRvUGF0Y2hlZDsKICAgICAgICBhcGkuX3JlZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgYXBpLnBhdGNoQ2FsbGJhY2tzID0gcGF0Y2hDYWxsYmFja3M7CiAgICAgICAgYXBpLmdldEdsb2JhbE9iamVjdHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoeyBnbG9iYWxTb3VyY2VzOiBnbG9iYWxTb3VyY2VzLCB6b25lU3ltYm9sRXZlbnROYW1lczogem9uZVN5bWJvbEV2ZW50TmFtZXMkMSwgZXZlbnROYW1lczogZXZlbnROYW1lcywgaXNCcm93c2VyOiBpc0Jyb3dzZXIsIGlzTWl4OiBpc01peCwgaXNOb2RlOiBpc05vZGUsIFRSVUVfU1RSOiBUUlVFX1NUUiwKICAgICAgICAgICAgRkFMU0VfU1RSOiBGQUxTRV9TVFIsIFpPTkVfU1lNQk9MX1BSRUZJWDogWk9ORV9TWU1CT0xfUFJFRklYLCBBRERfRVZFTlRfTElTVEVORVJfU1RSOiBBRERfRVZFTlRfTElTVEVORVJfU1RSLCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSOiBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSIH0pOyB9OwogICAgfSk7CiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKgogICAgICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIENocm9tZSBhbmQgQ2hyb21lIG1vYmlsZSwgdG8gZW5hYmxlCiAgICAgKiB0aGluZ3MgbGlrZSByZWRlZmluaW5nIGBjcmVhdGVkQ2FsbGJhY2tgIG9uIGFuIGVsZW1lbnQuCiAgICAgKi8KICAgIHZhciB6b25lU3ltYm9sJDE7CiAgICB2YXIgX2RlZmluZVByb3BlcnR5OwogICAgdmFyIF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICB2YXIgX2NyZWF0ZTsKICAgIHZhciB1bmNvbmZpZ3VyYWJsZXNLZXk7CiAgICBmdW5jdGlvbiBwcm9wZXJ0eVBhdGNoKCkgewogICAgICAgIHpvbmVTeW1ib2wkMSA9IFpvbmUuX19zeW1ib2xfXzsKICAgICAgICBfZGVmaW5lUHJvcGVydHkgPSBPYmplY3Rbem9uZVN5bWJvbCQxKCdkZWZpbmVQcm9wZXJ0eScpXSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgICAgICBfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0W3pvbmVTeW1ib2wkMSgnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJyldID0KICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgICAgICBfY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKICAgICAgICB1bmNvbmZpZ3VyYWJsZXNLZXkgPSB6b25lU3ltYm9sJDEoJ3VuY29uZmlndXJhYmxlcycpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIGRlc2MpIHsKICAgICAgICAgICAgaWYgKGlzVW5jb25maWd1cmFibGUob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGFzc2lnbiB0byByZWFkIG9ubHkgcHJvcGVydHkgXCcnICsgcHJvcCArICdcJyBvZiAnICsgb2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb3JpZ2luYWxDb25maWd1cmFibGVGbGFnID0gZGVzYy5jb25maWd1cmFibGU7CiAgICAgICAgICAgIGlmIChwcm9wICE9PSAncHJvdG90eXBlJykgewogICAgICAgICAgICAgICAgZGVzYyA9IHJld3JpdGVEZXNjcmlwdG9yKG9iaiwgcHJvcCwgZGVzYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF90cnlEZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MsIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyk7CiAgICAgICAgfTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmosIHByb3BzKSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHByb3BzW3Byb3BdKTsgfSk7CiAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfTsKICAgICAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKG9iaiwgcHJvdG8pIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm90byA9PT0gJ29iamVjdCcgJiYgIU9iamVjdC5pc0Zyb3plbihwcm90bykpIHsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3RvKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvdG9bcHJvcF0gPSByZXdyaXRlRGVzY3JpcHRvcihvYmosIHByb3AsIHByb3RvW3Byb3BdKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlKG9iaiwgcHJvdG8pOwogICAgICAgIH07CiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIChvYmosIHByb3ApIHsKICAgICAgICAgICAgdmFyIGRlc2MgPSBfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7CiAgICAgICAgICAgIGlmIChkZXNjICYmIGlzVW5jb25maWd1cmFibGUob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVzYzsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gX3JlZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKSB7CiAgICAgICAgdmFyIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyA9IGRlc2MuY29uZmlndXJhYmxlOwogICAgICAgIGRlc2MgPSByZXdyaXRlRGVzY3JpcHRvcihvYmosIHByb3AsIGRlc2MpOwogICAgICAgIHJldHVybiBfdHJ5RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjLCBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWcpOwogICAgfQogICAgZnVuY3Rpb24gaXNVbmNvbmZpZ3VyYWJsZShvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gb2JqICYmIG9ialt1bmNvbmZpZ3VyYWJsZXNLZXldICYmIG9ialt1bmNvbmZpZ3VyYWJsZXNLZXldW3Byb3BdOwogICAgfQogICAgZnVuY3Rpb24gcmV3cml0ZURlc2NyaXB0b3Iob2JqLCBwcm9wLCBkZXNjKSB7CiAgICAgICAgLy8gaXNzdWUtOTI3LCBpZiB0aGUgZGVzYyBpcyBmcm96ZW4sIGRvbid0IHRyeSB0byBjaGFuZ2UgdGhlIGRlc2MKICAgICAgICBpZiAoIU9iamVjdC5pc0Zyb3plbihkZXNjKSkgewogICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICghZGVzYy5jb25maWd1cmFibGUpIHsKICAgICAgICAgICAgLy8gaXNzdWUtOTI3LCBpZiB0aGUgb2JqIGlzIGZyb3plbiwgZG9uJ3QgdHJ5IHRvIHNldCB0aGUgZGVzYyB0byBvYmoKICAgICAgICAgICAgaWYgKCFvYmpbdW5jb25maWd1cmFibGVzS2V5XSAmJiAhT2JqZWN0LmlzRnJvemVuKG9iaikpIHsKICAgICAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eShvYmosIHVuY29uZmlndXJhYmxlc0tleSwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmpbdW5jb25maWd1cmFibGVzS2V5XSkgewogICAgICAgICAgICAgICAgb2JqW3VuY29uZmlndXJhYmxlc0tleV1bcHJvcF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZXNjOwogICAgfQogICAgZnVuY3Rpb24gX3RyeURlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgZGVzYywgb3JpZ2luYWxDb25maWd1cmFibGVGbGFnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaWYgKGRlc2MuY29uZmlndXJhYmxlKSB7CiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGVycm9ycywgd2hlbiB0aGUgY29uZmlndXJhYmxlIGZsYWcgd2FzIGxpa2VseSBzZXQgYnkgcmV3cml0ZURlc2NyaXB0b3IoKSwgbGV0J3MKICAgICAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggdGhlIG9yaWdpbmFsIGZsYWcgdmFsdWUKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxDb25maWd1cmFibGVGbGFnID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRlc2MuY29uZmlndXJhYmxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHZhciBkZXNjSnNvbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0pzb24gPSBKU09OLnN0cmluZ2lmeShkZXNjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NKc29uID0gZGVzYy50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQXR0ZW1wdGluZyB0byBjb25maWd1cmUgJyIgKyBwcm9wICsgIicgd2l0aCBkZXNjcmlwdG9yICciICsgZGVzY0pzb24gKyAiJyBvbiBvYmplY3QgJyIgKyBvYmogKyAiJyBhbmQgZ290IGVycm9yLCBnaXZpbmcgdXA6ICIgKyBlcnJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGV2ZW50VGFyZ2V0TGVnYWN5UGF0Y2goX2dsb2JhbCwgYXBpKSB7CiAgICAgICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgZXZlbnROYW1lcyA9IF9hLmV2ZW50TmFtZXMsIGdsb2JhbFNvdXJjZXMgPSBfYS5nbG9iYWxTb3VyY2VzLCB6b25lU3ltYm9sRXZlbnROYW1lcyA9IF9hLnpvbmVTeW1ib2xFdmVudE5hbWVzLCBUUlVFX1NUUiA9IF9hLlRSVUVfU1RSLCBGQUxTRV9TVFIgPSBfYS5GQUxTRV9TVFIsIFpPTkVfU1lNQk9MX1BSRUZJWCA9IF9hLlpPTkVfU1lNQk9MX1BSRUZJWDsKICAgICAgICB2YXIgV1RGX0lTU1VFXzU1NSA9ICdBbmNob3IsQXJlYSxBdWRpbyxCUixCYXNlLEJhc2VGb250LEJvZHksQnV0dG9uLENhbnZhcyxDb250ZW50LERMaXN0LERpcmVjdG9yeSxEaXYsRW1iZWQsRmllbGRTZXQsRm9udCxGb3JtLEZyYW1lLEZyYW1lU2V0LEhSLEhlYWQsSGVhZGluZyxIdG1sLElGcmFtZSxJbWFnZSxJbnB1dCxLZXlnZW4sTEksTGFiZWwsTGVnZW5kLExpbmssTWFwLE1hcnF1ZWUsTWVkaWEsTWVudSxNZXRhLE1ldGVyLE1vZCxPTGlzdCxPYmplY3QsT3B0R3JvdXAsT3B0aW9uLE91dHB1dCxQYXJhZ3JhcGgsUHJlLFByb2dyZXNzLFF1b3RlLFNjcmlwdCxTZWxlY3QsU291cmNlLFNwYW4sU3R5bGUsVGFibGVDYXB0aW9uLFRhYmxlQ2VsbCxUYWJsZUNvbCxUYWJsZSxUYWJsZVJvdyxUYWJsZVNlY3Rpb24sVGV4dEFyZWEsVGl0bGUsVHJhY2ssVUxpc3QsVW5rbm93bixWaWRlbyc7CiAgICAgICAgdmFyIE5PX0VWRU5UX1RBUkdFVCA9ICdBcHBsaWNhdGlvbkNhY2hlLEV2ZW50U291cmNlLEZpbGVSZWFkZXIsSW5wdXRNZXRob2RDb250ZXh0LE1lZGlhQ29udHJvbGxlcixNZXNzYWdlUG9ydCxOb2RlLFBlcmZvcm1hbmNlLFNWR0VsZW1lbnRJbnN0YW5jZSxTaGFyZWRXb3JrZXIsVGV4dFRyYWNrLFRleHRUcmFja0N1ZSxUZXh0VHJhY2tMaXN0LFdlYktpdE5hbWVkRmxvdyxXaW5kb3csV29ya2VyLFdvcmtlckdsb2JhbFNjb3BlLFhNTEh0dHBSZXF1ZXN0LFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsWE1MSHR0cFJlcXVlc3RVcGxvYWQsSURCUmVxdWVzdCxJREJPcGVuREJSZXF1ZXN0LElEQkRhdGFiYXNlLElEQlRyYW5zYWN0aW9uLElEQkN1cnNvcixEQkluZGV4LFdlYlNvY2tldCcKICAgICAgICAgICAgLnNwbGl0KCcsJyk7CiAgICAgICAgdmFyIEVWRU5UX1RBUkdFVCA9ICdFdmVudFRhcmdldCc7CiAgICAgICAgdmFyIGFwaXMgPSBbXTsKICAgICAgICB2YXIgaXNXdGYgPSBfZ2xvYmFsWyd3dGYnXTsKICAgICAgICB2YXIgV1RGX0lTU1VFXzU1NV9BUlJBWSA9IFdURl9JU1NVRV81NTUuc3BsaXQoJywnKTsKICAgICAgICBpZiAoaXNXdGYpIHsKICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvdHJhY2luZy1mcmFtZXdvcmsvaXNzdWVzLzU1NQogICAgICAgICAgICBhcGlzID0gV1RGX0lTU1VFXzU1NV9BUlJBWS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuICdIVE1MJyArIHYgKyAnRWxlbWVudCc7IH0pLmNvbmNhdChOT19FVkVOVF9UQVJHRVQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChfZ2xvYmFsW0VWRU5UX1RBUkdFVF0pIHsKICAgICAgICAgICAgYXBpcy5wdXNoKEVWRU5UX1RBUkdFVCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBOb3RlOiBFdmVudFRhcmdldCBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBicm93c2VycywKICAgICAgICAgICAgLy8gaWYgaXQncyBub3QgYXZhaWxhYmxlLCB3ZSBpbnN0ZWFkIHBhdGNoIHRoZSBBUElzIGluIHRoZSBJREwgdGhhdCBpbmhlcml0IGZyb20gRXZlbnRUYXJnZXQKICAgICAgICAgICAgYXBpcyA9IE5PX0VWRU5UX1RBUkdFVDsKICAgICAgICB9CiAgICAgICAgdmFyIGlzRGlzYWJsZUlFQ2hlY2sgPSBfZ2xvYmFsWydfX1pvbmVfZGlzYWJsZV9JRV9jaGVjayddIHx8IGZhbHNlOwogICAgICAgIHZhciBpc0VuYWJsZUNyb3NzQ29udGV4dENoZWNrID0gX2dsb2JhbFsnX19ab25lX2VuYWJsZV9jcm9zc19jb250ZXh0X2NoZWNrJ10gfHwgZmFsc2U7CiAgICAgICAgdmFyIGllT3JFZGdlID0gYXBpLmlzSUVPckVkZ2UoKTsKICAgICAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuYWRkRXZlbnRMaXN0ZW5lcjonOwogICAgICAgIHZhciBGVU5DVElPTl9XUkFQUEVSID0gJ1tvYmplY3QgRnVuY3Rpb25XcmFwcGVyXSc7CiAgICAgICAgdmFyIEJST1dTRVJfVE9PTFMgPSAnZnVuY3Rpb24gX19CUk9XU0VSVE9PTFNfQ09OU09MRV9TQUZFRlVOQygpIHsgW25hdGl2ZSBjb2RlXSB9JzsKICAgICAgICB2YXIgcG9pbnRlckV2ZW50c01hcCA9IHsKICAgICAgICAgICAgJ01TUG9pbnRlckNhbmNlbCc6ICdwb2ludGVyY2FuY2VsJywKICAgICAgICAgICAgJ01TUG9pbnRlckRvd24nOiAncG9pbnRlcmRvd24nLAogICAgICAgICAgICAnTVNQb2ludGVyRW50ZXInOiAncG9pbnRlcmVudGVyJywKICAgICAgICAgICAgJ01TUG9pbnRlckhvdmVyJzogJ3BvaW50ZXJob3ZlcicsCiAgICAgICAgICAgICdNU1BvaW50ZXJMZWF2ZSc6ICdwb2ludGVybGVhdmUnLAogICAgICAgICAgICAnTVNQb2ludGVyTW92ZSc6ICdwb2ludGVybW92ZScsCiAgICAgICAgICAgICdNU1BvaW50ZXJPdXQnOiAncG9pbnRlcm91dCcsCiAgICAgICAgICAgICdNU1BvaW50ZXJPdmVyJzogJ3BvaW50ZXJvdmVyJywKICAgICAgICAgICAgJ01TUG9pbnRlclVwJzogJ3BvaW50ZXJ1cCcKICAgICAgICB9OwogICAgICAgIC8vICBwcmVkZWZpbmUgYWxsIF9fem9uZV9zeW1ib2xfXyArIGV2ZW50TmFtZSArIHRydWUvZmFsc2Ugc3RyaW5nCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVzW2ldOwogICAgICAgICAgICB2YXIgZmFsc2VFdmVudE5hbWUgPSBldmVudE5hbWUgKyBGQUxTRV9TVFI7CiAgICAgICAgICAgIHZhciB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7CiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBaT05FX1NZTUJPTF9QUkVGSVggKyBmYWxzZUV2ZW50TmFtZTsKICAgICAgICAgICAgdmFyIHN5bWJvbENhcHR1cmUgPSBaT05FX1NZTUJPTF9QUkVGSVggKyB0cnVlRXZlbnROYW1lOwogICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307CiAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bRkFMU0VfU1RSXSA9IHN5bWJvbDsKICAgICAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXVtUUlVFX1NUUl0gPSBzeW1ib2xDYXB0dXJlOwogICAgICAgIH0KICAgICAgICAvLyAgcHJlZGVmaW5lIGFsbCB0YXNrLnNvdXJjZSBzdHJpbmcKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFdURl9JU1NVRV81NTVfQVJSQVkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHRhcmdldCA9IFdURl9JU1NVRV81NTVfQVJSQVlbaV07CiAgICAgICAgICAgIHZhciB0YXJnZXRzID0gZ2xvYmFsU291cmNlc1t0YXJnZXRdID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZXZlbnROYW1lcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNbal07CiAgICAgICAgICAgICAgICB0YXJnZXRzW2V2ZW50TmFtZV0gPSB0YXJnZXQgKyBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFICsgZXZlbnROYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBjaGVja0lFQW5kQ3Jvc3NDb250ZXh0ID0gZnVuY3Rpb24gKG5hdGl2ZURlbGVnYXRlLCBkZWxlZ2F0ZSwgdGFyZ2V0LCBhcmdzKSB7CiAgICAgICAgICAgIGlmICghaXNEaXNhYmxlSUVDaGVjayAmJiBpZU9yRWRnZSkgewogICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlQ3Jvc3NDb250ZXh0Q2hlY2spIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdFN0cmluZyA9IGRlbGVnYXRlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGVzdFN0cmluZyA9PT0gRlVOQ1RJT05fV1JBUFBFUiB8fCB0ZXN0U3RyaW5nID09IEJST1dTRVJfVE9PTFMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWxlZ2F0ZS5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWxlZ2F0ZS5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3RTdHJpbmcgPSBkZWxlZ2F0ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmICgodGVzdFN0cmluZyA9PT0gRlVOQ1RJT05fV1JBUFBFUiB8fCB0ZXN0U3RyaW5nID09IEJST1dTRVJfVE9PTFMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZURlbGVnYXRlLmFwcGx5KHRhcmdldCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNFbmFibGVDcm9zc0NvbnRleHRDaGVjaykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRGVsZWdhdGUuYXBwbHkodGFyZ2V0LCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICB2YXIgYXBpVHlwZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFwaXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHR5cGUgPSBfZ2xvYmFsW2FwaXNbaV1dOwogICAgICAgICAgICBhcGlUeXBlcy5wdXNoKHR5cGUgJiYgdHlwZS5wcm90b3R5cGUpOwogICAgICAgIH0KICAgICAgICAvLyB2aCBpcyB2YWxpZGF0ZUhhbmRsZXIgdG8gY2hlY2sgZXZlbnQgaGFuZGxlcgogICAgICAgIC8vIGlzIHZhbGlkIG9yIG5vdChmb3Igc2VjdXJpdHkgY2hlY2spCiAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgYXBpVHlwZXMsIHsKICAgICAgICAgICAgdmg6IGNoZWNrSUVBbmRDcm9zc0NvbnRleHQsCiAgICAgICAgICAgIHRyYW5zZmVyRXZlbnROYW1lOiBmdW5jdGlvbiAoZXZlbnROYW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlckV2ZW50TmFtZSA9IHBvaW50ZXJFdmVudHNNYXBbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgIHJldHVybiBwb2ludGVyRXZlbnROYW1lIHx8IGV2ZW50TmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSA9ICEhX2dsb2JhbFtFVkVOVF9UQVJHRVRdOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLy8gd2UgaGF2ZSB0byBwYXRjaCB0aGUgaW5zdGFuY2Ugc2luY2UgdGhlIHByb3RvIGlzIG5vbi1jb25maWd1cmFibGUKICAgIGZ1bmN0aW9uIGFwcGx5KGFwaSwgX2dsb2JhbCkgewogICAgICAgIHZhciBfYSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCksIEFERF9FVkVOVF9MSVNURU5FUl9TVFIgPSBfYS5BRERfRVZFTlRfTElTVEVORVJfU1RSLCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSID0gX2EuUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUjsKICAgICAgICB2YXIgV1MgPSBfZ2xvYmFsLldlYlNvY2tldDsKICAgICAgICAvLyBPbiBTYWZhcmkgd2luZG93LkV2ZW50VGFyZ2V0IGRvZXNuJ3QgZXhpc3Qgc28gbmVlZCB0byBwYXRjaCBXUyBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAgICAgIC8vIE9uIG9sZGVyIENocm9tZSwgbm8gbmVlZCBzaW5jZSBFdmVudFRhcmdldCB3YXMgYWxyZWFkeSBwYXRjaGVkCiAgICAgICAgaWYgKCFfZ2xvYmFsLkV2ZW50VGFyZ2V0KSB7CiAgICAgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIFtXUy5wcm90b3R5cGVdKTsKICAgICAgICB9CiAgICAgICAgX2dsb2JhbC5XZWJTb2NrZXQgPSBmdW5jdGlvbiAoeCwgeSkgewogICAgICAgICAgICB2YXIgc29ja2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBuZXcgV1MoeCwgeSkgOiBuZXcgV1MoeCk7CiAgICAgICAgICAgIHZhciBwcm94eVNvY2tldDsKICAgICAgICAgICAgdmFyIHByb3h5U29ja2V0UHJvdG87CiAgICAgICAgICAgIC8vIFNhZmFyaSA3LjAgaGFzIG5vbi1jb25maWd1cmFibGUgb3duICdvbm1lc3NhZ2UnIGFuZCBmcmllbmRzIHByb3BlcnRpZXMgb24gdGhlIHNvY2tldCBpbnN0YW5jZQogICAgICAgICAgICB2YXIgb25tZXNzYWdlRGVzYyA9IGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc29ja2V0LCAnb25tZXNzYWdlJyk7CiAgICAgICAgICAgIGlmIChvbm1lc3NhZ2VEZXNjICYmIG9ubWVzc2FnZURlc2MuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcHJveHlTb2NrZXQgPSBhcGkuT2JqZWN0Q3JlYXRlKHNvY2tldCk7CiAgICAgICAgICAgICAgICAvLyBzb2NrZXQgaGF2ZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciAnb25vcGVuJywgJ29ubWVzc2FnZScsICdvbmNsb3NlJywgJ29uZXJyb3InCiAgICAgICAgICAgICAgICAvLyBidXQgcHJveHlTb2NrZXQgbm90LCBzbyB3ZSB3aWxsIGtlZXAgc29ja2V0IGFzIHByb3RvdHlwZSBhbmQgcGFzcyBpdCB0bwogICAgICAgICAgICAgICAgLy8gcGF0Y2hPblByb3BlcnRpZXMgbWV0aG9kCiAgICAgICAgICAgICAgICBwcm94eVNvY2tldFByb3RvID0gc29ja2V0OwogICAgICAgICAgICAgICAgW0FERF9FVkVOVF9MSVNURU5FUl9TVFIsIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIsICdzZW5kJywgJ2Nsb3NlJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBwcm94eVNvY2tldFtwcm9wTmFtZV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXBpLkFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09IEFERF9FVkVOVF9MSVNURU5FUl9TVFIgfHwgcHJvcE5hbWUgPT09IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBhcmdzLmxlbmd0aCA+IDAgPyBhcmdzWzBdIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVN5bWJvbCA9IFpvbmUuX19zeW1ib2xfXygnT05fUFJPUEVSVFknICsgZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRbcHJvcGVydHlTeW1ib2xdID0gcHJveHlTb2NrZXRbcHJvcGVydHlTeW1ib2xdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXRbcHJvcE5hbWVdLmFwcGx5KHNvY2tldCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gd2UgY2FuIHBhdGNoIHRoZSByZWFsIHNvY2tldAogICAgICAgICAgICAgICAgcHJveHlTb2NrZXQgPSBzb2NrZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBpLnBhdGNoT25Qcm9wZXJ0aWVzKHByb3h5U29ja2V0LCBbJ2Nsb3NlJywgJ2Vycm9yJywgJ21lc3NhZ2UnLCAnb3BlbiddLCBwcm94eVNvY2tldFByb3RvKTsKICAgICAgICAgICAgcmV0dXJuIHByb3h5U29ja2V0OwogICAgICAgIH07CiAgICAgICAgdmFyIGdsb2JhbFdlYlNvY2tldCA9IF9nbG9iYWxbJ1dlYlNvY2tldCddOwogICAgICAgIGZvciAodmFyIHByb3AgaW4gV1MpIHsKICAgICAgICAgICAgZ2xvYmFsV2ViU29ja2V0W3Byb3BdID0gV1NbcHJvcF07CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gcHJvcGVydHlEZXNjcmlwdG9yTGVnYWN5UGF0Y2goYXBpLCBfZ2xvYmFsKSB7CiAgICAgICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgaXNOb2RlID0gX2EuaXNOb2RlLCBpc01peCA9IF9hLmlzTWl4OwogICAgICAgIGlmIChpc05vZGUgJiYgIWlzTWl4KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFjYW5QYXRjaFZpYVByb3BlcnR5RGVzY3JpcHRvcihhcGksIF9nbG9iYWwpKSB7CiAgICAgICAgICAgIHZhciBzdXBwb3J0c1dlYlNvY2tldCA9IHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnOwogICAgICAgICAgICAvLyBTYWZhcmksIEFuZHJvaWQgYnJvd3NlcnMgKEplbGx5IEJlYW4pCiAgICAgICAgICAgIHBhdGNoVmlhQ2FwdHVyaW5nQWxsVGhlRXZlbnRzKGFwaSk7CiAgICAgICAgICAgIGFwaS5wYXRjaENsYXNzKCdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICBpZiAoc3VwcG9ydHNXZWJTb2NrZXQpIHsKICAgICAgICAgICAgICAgIGFwcGx5KGFwaSwgX2dsb2JhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50cycpXSA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2FuUGF0Y2hWaWFQcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBfZ2xvYmFsKSB7CiAgICAgICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgaXNCcm93c2VyID0gX2EuaXNCcm93c2VyLCBpc01peCA9IF9hLmlzTWl4OwogICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzTWl4KSAmJgogICAgICAgICAgICAhYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsICdvbmNsaWNrJykgJiYKICAgICAgICAgICAgdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIC8vIFdlYktpdCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM0MzY0CiAgICAgICAgICAgIC8vIElETCBpbnRlcmZhY2UgYXR0cmlidXRlcyBhcmUgbm90IGNvbmZpZ3VyYWJsZQogICAgICAgICAgICB2YXIgZGVzYyA9IGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdvbmNsaWNrJyk7CiAgICAgICAgICAgIGlmIChkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSBvbmNsaWNrIHRvIGRldGVjdCB3aGV0aGVyIHdlIGNhbiBwYXRjaCB2aWEgcHJvcGVydHlEZXNjcmlwdG9yCiAgICAgICAgICAgIC8vIGJlY2F1c2UgWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZSBpbiBzZXJ2aWNlIHdvcmtlcgogICAgICAgICAgICBpZiAoZGVzYykgewogICAgICAgICAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCAnb25jbGljaycsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0gfSk7CiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gISFkaXYub25jbGljazsKICAgICAgICAgICAgICAgIGFwaS5PYmplY3REZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ29uY2xpY2snLCBkZXNjKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0ID0gX2dsb2JhbFsnWE1MSHR0cFJlcXVlc3QnXTsKICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7CiAgICAgICAgICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUgaW4gc2VydmljZSB3b3JrZXIKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgT05fUkVBRFlfU1RBVEVfQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7CiAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlOwogICAgICAgIHZhciB4aHJEZXNjID0gYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgT05fUkVBRFlfU1RBVEVfQ0hBTkdFKTsKICAgICAgICAvLyBhZGQgZW51bWVyYWJsZSBhbmQgY29uZmlndXJhYmxlIGhlcmUgYmVjYXVzZSBpbiBvcGVyYQogICAgICAgIC8vIGJ5IGRlZmF1bHQgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9ucmVhZHlzdGF0ZWNoYW5nZSBpcyB1bmRlZmluZWQKICAgICAgICAvLyB3aXRob3V0IGFkZGluZyBlbnVtZXJhYmxlIGFuZCBjb25maWd1cmFibGUgd2lsbCBjYXVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UKICAgICAgICAvLyBub24tY29uZmlndXJhYmxlCiAgICAgICAgLy8gYW5kIGlmIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vbnJlYWR5c3RhdGVjaGFuZ2UgaXMgdW5kZWZpbmVkLAogICAgICAgIC8vIHdlIHNob3VsZCBzZXQgYSByZWFsIGRlc2MgaW5zdGVhZCBhIGZha2Ugb25lCiAgICAgICAgaWYgKHhockRlc2MpIHsKICAgICAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCBPTl9SRUFEWV9TVEFURV9DSEFOR0UsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0gfSk7CiAgICAgICAgICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEhcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZTsKICAgICAgICAgICAgLy8gcmVzdG9yZSBvcmlnaW5hbCBkZXNjCiAgICAgICAgICAgIGFwaS5PYmplY3REZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgT05fUkVBRFlfU1RBVEVfQ0hBTkdFLCB4aHJEZXNjIHx8IHt9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciBTWU1CT0xfRkFLRV9PTlJFQURZU1RBVEVDSEFOR0VfMSA9IGFwaS5zeW1ib2woJ2Zha2UnKTsKICAgICAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCBPTl9SRUFEWV9TVEFURV9DSEFOR0UsIHsKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbU1lNQk9MX0ZBS0VfT05SRUFEWVNUQVRFQ0hBTkdFXzFdOyB9LAogICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsgdGhpc1tTWU1CT0xfRkFLRV9PTlJFQURZU1RBVEVDSEFOR0VfMV0gPSB2YWx1ZTsgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICB2YXIgZGV0ZWN0RnVuYyA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICAgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGRldGVjdEZ1bmM7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSByZXFbU1lNQk9MX0ZBS0VfT05SRUFEWVNUQVRFQ0hBTkdFXzFdID09PSBkZXRlY3RGdW5jOwogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICB9CiAgICAvLyBXaGVuZXZlciBhbnkgZXZlbnRMaXN0ZW5lciBmaXJlcywgd2UgY2hlY2sgdGhlIGV2ZW50TGlzdGVuZXIgdGFyZ2V0IGFuZCBhbGwgcGFyZW50cwogICAgLy8gZm9yIGBvbndoYXRldmVyYCBwcm9wZXJ0aWVzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB6b25lLWJvdW5kIGZ1bmN0aW9ucwogICAgLy8gLSBDaHJvbWUgKGZvciBub3cpCiAgICBmdW5jdGlvbiBwYXRjaFZpYUNhcHR1cmluZ0FsbFRoZUV2ZW50cyhhcGkpIHsKICAgICAgICB2YXIgZXZlbnROYW1lcyA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCkuZXZlbnROYW1lczsKICAgICAgICB2YXIgdW5ib3VuZEtleSA9IGFwaS5zeW1ib2woJ3VuYm91bmQnKTsKICAgICAgICB2YXIgX2xvb3BfNCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGV2ZW50TmFtZXNbaV07CiAgICAgICAgICAgIHZhciBvbnByb3BlcnR5ID0gJ29uJyArIHByb3BlcnR5OwogICAgICAgICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIocHJvcGVydHksIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgdmFyIGVsdCA9IGV2ZW50LnRhcmdldCwgYm91bmQsIHNvdXJjZTsKICAgICAgICAgICAgICAgIGlmIChlbHQpIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBlbHQuY29uc3RydWN0b3JbJ25hbWUnXSArICcuJyArIG9ucHJvcGVydHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSAndW5rbm93bi4nICsgb25wcm9wZXJ0eTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChlbHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZWx0W29ucHJvcGVydHldICYmICFlbHRbb25wcm9wZXJ0eV1bdW5ib3VuZEtleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShlbHRbb25wcm9wZXJ0eV0sIHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kW3VuYm91bmRLZXldID0gZWx0W29ucHJvcGVydHldOwogICAgICAgICAgICAgICAgICAgICAgICBlbHRbb25wcm9wZXJ0eV0gPSBib3VuZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHRydWUpOwogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIF9sb29wXzQoaSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gcmVnaXN0ZXJFbGVtZW50UGF0Y2goX2dsb2JhbCwgYXBpKSB7CiAgICAgICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgaXNCcm93c2VyID0gX2EuaXNCcm93c2VyLCBpc01peCA9IF9hLmlzTWl4OwogICAgICAgIGlmICgoIWlzQnJvd3NlciAmJiAhaXNNaXgpIHx8ICEoJ3JlZ2lzdGVyRWxlbWVudCcgaW4gX2dsb2JhbC5kb2N1bWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgY2FsbGJhY2tzID0gWydjcmVhdGVkQ2FsbGJhY2snLCAnYXR0YWNoZWRDYWxsYmFjaycsICdkZXRhY2hlZENhbGxiYWNrJywgJ2F0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayddOwogICAgICAgIGFwaS5wYXRjaENhbGxiYWNrcyhhcGksIGRvY3VtZW50LCAnRG9jdW1lbnQnLCAncmVnaXN0ZXJFbGVtZW50JywgY2FsbGJhY2tzKTsKICAgIH0KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIChmdW5jdGlvbiAoX2dsb2JhbCkgewogICAgICAgIHZhciBzeW1ib2xQcmVmaXggPSBfZ2xvYmFsWydfX1pvbmVfc3ltYm9sX3ByZWZpeCddIHx8ICdfX3pvbmVfc3ltYm9sX18nOwogICAgICAgIGZ1bmN0aW9uIF9fc3ltYm9sX18obmFtZSkgeyByZXR1cm4gc3ltYm9sUHJlZml4ICsgbmFtZTsgfQogICAgICAgIF9nbG9iYWxbX19zeW1ib2xfXygnbGVnYWN5UGF0Y2gnKV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBab25lID0gX2dsb2JhbFsnWm9uZSddOwogICAgICAgICAgICBab25lLl9fbG9hZF9wYXRjaCgnZGVmaW5lUHJvcGVydHknLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHsKICAgICAgICAgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eSA9IF9yZWRlZmluZVByb3BlcnR5OwogICAgICAgICAgICAgICAgcHJvcGVydHlQYXRjaCgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3JlZ2lzdGVyRWxlbWVudCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgICAgICAgICAgcmVnaXN0ZXJFbGVtZW50UGF0Y2goZ2xvYmFsLCBhcGkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ0V2ZW50VGFyZ2V0TGVnYWN5JywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7CiAgICAgICAgICAgICAgICBldmVudFRhcmdldExlZ2FjeVBhdGNoKGdsb2JhbCwgYXBpKTsKICAgICAgICAgICAgICAgIHByb3BlcnR5RGVzY3JpcHRvckxlZ2FjeVBhdGNoKGFwaSwgZ2xvYmFsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgIH0pKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8KICAgICAgICB3aW5kb3cgOgogICAgICAgIHR5cGVvZiBjb21tb25qc0dsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBjb21tb25qc0dsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSk7CiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICB2YXIgdGFza1N5bWJvbCA9IHpvbmVTeW1ib2woJ3pvbmVUYXNrJyk7CiAgICBmdW5jdGlvbiBwYXRjaFRpbWVyKHdpbmRvdywgc2V0TmFtZSwgY2FuY2VsTmFtZSwgbmFtZVN1ZmZpeCkgewogICAgICAgIHZhciBzZXROYXRpdmUgPSBudWxsOwogICAgICAgIHZhciBjbGVhck5hdGl2ZSA9IG51bGw7CiAgICAgICAgc2V0TmFtZSArPSBuYW1lU3VmZml4OwogICAgICAgIGNhbmNlbE5hbWUgKz0gbmFtZVN1ZmZpeDsKICAgICAgICB2YXIgdGFza3NCeUhhbmRsZUlkID0ge307CiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0YXNrLmRhdGE7CiAgICAgICAgICAgIGZ1bmN0aW9uIHRpbWVyKCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaXNzdWUtOTM0LCB0YXNrIHdpbGwgYmUgY2FuY2VsbGVkCiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpdCBpcyBhIHBlcmlvZGljIHRhc2sgc3VjaCBhcwogICAgICAgICAgICAgICAgICAgIC8vIHNldEludGVydmFsCiAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFzay5kYXRhICYmIHRhc2suZGF0YS5pc1BlcmlvZGljKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuaGFuZGxlSWQgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBub24tbm9kZWpzIGVudiwgd2UgcmVtb3ZlIHRpbWVySWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gbG9jYWwgY2FjaGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbZGF0YS5oYW5kbGVJZF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YS5oYW5kbGVJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSB0YXNrIHJlZmVyZW5jZSBmcm9tIHRpbWVyIG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5oYW5kbGVJZFt0YXNrU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5hcmdzWzBdID0gdGltZXI7CiAgICAgICAgICAgIGRhdGEuaGFuZGxlSWQgPSBzZXROYXRpdmUuYXBwbHkod2luZG93LCBkYXRhLmFyZ3MpOwogICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHsgcmV0dXJuIGNsZWFyTmF0aXZlKHRhc2suZGF0YS5oYW5kbGVJZCk7IH0KICAgICAgICBzZXROYXRpdmUgPQogICAgICAgICAgICBwYXRjaE1ldGhvZCh3aW5kb3csIHNldE5hbWUsIGZ1bmN0aW9uIChkZWxlZ2F0ZSkgeyByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gewogICAgICAgICAgICAgICAgICAgICAgICBpc1BlcmlvZGljOiBuYW1lU3VmZml4ID09PSAnSW50ZXJ2YWwnLAogICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogKG5hbWVTdWZmaXggPT09ICdUaW1lb3V0JyB8fCBuYW1lU3VmZml4ID09PSAnSW50ZXJ2YWwnKSA/IGFyZ3NbMV0gfHwgMCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3MKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoc2V0TmFtZSwgYXJnc1swXSwgb3B0aW9ucywgc2NoZWR1bGVUYXNrLCBjbGVhclRhc2spOwogICAgICAgICAgICAgICAgICAgIGlmICghdGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gTm9kZS5qcyBtdXN0IGFkZGl0aW9uYWxseSBzdXBwb3J0IHRoZSByZWYgYW5kIHVucmVmIGZ1bmN0aW9ucy4KICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gdGFzay5kYXRhLmhhbmRsZUlkOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uIG5vZGVqcyBlbnYsIHdlIHNhdmUgaGFuZGxlSWQ6IHRhc2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwcGluZyBpbiBsb2NhbCBjYWNoZSBmb3IgY2xlYXJUaW1lb3V0CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzQnlIYW5kbGVJZFtoYW5kbGVdID0gdGFzazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub2RlanMgZW52LCB3ZSBzYXZlIHRhc2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGluIHRpbWVySWQgT2JqZWN0IGZvciBjbGVhclRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gdGFzazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBoYW5kbGUgaXMgbnVsbCwgYmVjYXVzZSBzb21lIHBvbHlmaWxsIG9yIGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvLyBtYXkgcmV0dXJuIHVuZGVmaW5lZCBmcm9tIHNldFRpbWVvdXQvc2V0SW50ZXJ2YWwvc2V0SW1tZWRpYXRlL3JlcXVlc3RBbmltYXRpb25GcmFtZQogICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgJiYgaGFuZGxlLnJlZiAmJiBoYW5kbGUudW5yZWYgJiYgdHlwZW9mIGhhbmRsZS5yZWYgPT09ICdmdW5jdGlvbicgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGhhbmRsZS51bnJlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlZiA9IGhhbmRsZS5yZWYuYmluZChoYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnVucmVmID0gaGFuZGxlLnVucmVmLmJpbmQoaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUgPT09ICdudW1iZXInIHx8IGhhbmRsZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlIGFuIGVycm9yIGJ5IGNhbGxpbmcgaXQgZGlyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHdpbmRvdywgYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07IH0pOwogICAgICAgIGNsZWFyTmF0aXZlID0KICAgICAgICAgICAgcGF0Y2hNZXRob2Qod2luZG93LCBjYW5jZWxOYW1lLCBmdW5jdGlvbiAoZGVsZWdhdGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgaWQgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgdmFyIHRhc2s7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgIC8vIG5vbiBub2RlanMgZW52LgogICAgICAgICAgICAgICAgICAgIHRhc2sgPSB0YXNrc0J5SGFuZGxlSWRbaWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZWpzIGVudi4KICAgICAgICAgICAgICAgICAgICB0YXNrID0gaWQgJiYgaWRbdGFza1N5bWJvbF07CiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgZW52aXJvbm1lbnRzLgogICAgICAgICAgICAgICAgICAgIGlmICghdGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrID0gaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0ZSAhPT0gJ25vdFNjaGVkdWxlZCcgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2suY2FuY2VsRm4gJiYgdGFzay5kYXRhLmlzUGVyaW9kaWMgfHwgdGFzay5ydW5Db3VudCA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFt0YXNrU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNhbmNlbCBhbHJlYWR5IGNhbmNlbGVkIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUuY2FuY2VsVGFzayh0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LgogICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmFwcGx5KHdpbmRvdywgYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07IH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gcGF0Y2hDdXN0b21FbGVtZW50cyhfZ2xvYmFsLCBhcGkpIHsKICAgICAgICB2YXIgX2EgPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpLCBpc0Jyb3dzZXIgPSBfYS5pc0Jyb3dzZXIsIGlzTWl4ID0gX2EuaXNNaXg7CiAgICAgICAgaWYgKCghaXNCcm93c2VyICYmICFpc01peCkgfHwgIV9nbG9iYWxbJ2N1c3RvbUVsZW1lbnRzJ10gfHwgISgnY3VzdG9tRWxlbWVudHMnIGluIF9nbG9iYWwpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IFsnY29ubmVjdGVkQ2FsbGJhY2snLCAnZGlzY29ubmVjdGVkQ2FsbGJhY2snLCAnYWRvcHRlZENhbGxiYWNrJywgJ2F0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayddOwogICAgICAgIGFwaS5wYXRjaENhbGxiYWNrcyhhcGksIF9nbG9iYWwuY3VzdG9tRWxlbWVudHMsICdjdXN0b21FbGVtZW50cycsICdkZWZpbmUnLCBjYWxsYmFja3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gZXZlbnRUYXJnZXRQYXRjaChfZ2xvYmFsLCBhcGkpIHsKICAgICAgICBpZiAoWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50VGFyZ2V0JyldKSB7CiAgICAgICAgICAgIC8vIEV2ZW50VGFyZ2V0IGlzIGFscmVhZHkgcGF0Y2hlZC4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgX2EgPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpLCBldmVudE5hbWVzID0gX2EuZXZlbnROYW1lcywgem9uZVN5bWJvbEV2ZW50TmFtZXMgPSBfYS56b25lU3ltYm9sRXZlbnROYW1lcywgVFJVRV9TVFIgPSBfYS5UUlVFX1NUUiwgRkFMU0VfU1RSID0gX2EuRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVggPSBfYS5aT05FX1NZTUJPTF9QUkVGSVg7CiAgICAgICAgLy8gIHByZWRlZmluZSBhbGwgX196b25lX3N5bWJvbF9fICsgZXZlbnROYW1lICsgdHJ1ZS9mYWxzZSBzdHJpbmcKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNbaV07CiAgICAgICAgICAgIHZhciBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjsKICAgICAgICAgICAgdmFyIHRydWVFdmVudE5hbWUgPSBldmVudE5hbWUgKyBUUlVFX1NUUjsKICAgICAgICAgICAgdmFyIHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lOwogICAgICAgICAgICB2YXIgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7CiAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSB7fTsKICAgICAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXVtGQUxTRV9TVFJdID0gc3ltYm9sOwogICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7CiAgICAgICAgfQogICAgICAgIHZhciBFVkVOVF9UQVJHRVQgPSBfZ2xvYmFsWydFdmVudFRhcmdldCddOwogICAgICAgIGlmICghRVZFTlRfVEFSR0VUIHx8ICFFVkVOVF9UQVJHRVQucHJvdG90eXBlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgW0VWRU5UX1RBUkdFVCAmJiBFVkVOVF9UQVJHRVQucHJvdG90eXBlXSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKSB7CiAgICAgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUoZ2xvYmFsLCBhcGkpOwogICAgfQogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2xlZ2FjeScsIGZ1bmN0aW9uIChnbG9iYWwpIHsKICAgICAgICB2YXIgbGVnYWN5UGF0Y2ggPSBnbG9iYWxbWm9uZS5fX3N5bWJvbF9fKCdsZWdhY3lQYXRjaCcpXTsKICAgICAgICBpZiAobGVnYWN5UGF0Y2gpIHsKICAgICAgICAgICAgbGVnYWN5UGF0Y2goKTsKICAgICAgICB9CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCd0aW1lcnMnLCBmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICAgICAgdmFyIHNldCA9ICdzZXQnOwogICAgICAgIHZhciBjbGVhciA9ICdjbGVhcic7CiAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdUaW1lb3V0Jyk7CiAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdJbnRlcnZhbCcpOwogICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCBmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpOwogICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnbW96UmVxdWVzdCcsICdtb3pDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTsKICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ3dlYmtpdFJlcXVlc3QnLCAnd2Via2l0Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCdibG9ja2luZycsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUpIHsKICAgICAgICB2YXIgYmxvY2tpbmdNZXRob2RzID0gWydhbGVydCcsICdwcm9tcHQnLCAnY29uZmlybSddOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tpbmdNZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBuYW1lXzIgPSBibG9ja2luZ01ldGhvZHNbaV07CiAgICAgICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgbmFtZV8yLCBmdW5jdGlvbiAoZGVsZWdhdGUsIHN5bWJvbCwgbmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5ydW4oZGVsZWdhdGUsIGdsb2JhbCwgYXJncywgbmFtZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgIHBhdGNoRXZlbnQoZ2xvYmFsLCBhcGkpOwogICAgICAgIGV2ZW50VGFyZ2V0UGF0Y2goZ2xvYmFsLCBhcGkpOwogICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXIKICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCA9IGdsb2JhbFsnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddOwogICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ICYmIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQucHJvdG90eXBlKSB7CiAgICAgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KGdsb2JhbCwgW1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQucHJvdG90eXBlXSk7CiAgICAgICAgfQogICAgICAgIHBhdGNoQ2xhc3MoJ011dGF0aW9uT2JzZXJ2ZXInKTsKICAgICAgICBwYXRjaENsYXNzKCdXZWJLaXRNdXRhdGlvbk9ic2VydmVyJyk7CiAgICAgICAgcGF0Y2hDbGFzcygnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInKTsKICAgICAgICBwYXRjaENsYXNzKCdGaWxlUmVhZGVyJyk7CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCdvbl9wcm9wZXJ0eScsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgIHByb3BlcnR5RGVzY3JpcHRvclBhdGNoKGFwaSwgZ2xvYmFsKTsKICAgIH0pOwogICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2N1c3RvbUVsZW1lbnRzJywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7CiAgICAgICAgcGF0Y2hDdXN0b21FbGVtZW50cyhnbG9iYWwsIGFwaSk7CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCdYSFInLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lKSB7CiAgICAgICAgLy8gVHJlYXQgWE1MSHR0cFJlcXVlc3QgYXMgYSBtYWNyb3Rhc2suCiAgICAgICAgcGF0Y2hYSFIoZ2xvYmFsKTsKICAgICAgICB2YXIgWEhSX1RBU0sgPSB6b25lU3ltYm9sKCd4aHJUYXNrJyk7CiAgICAgICAgdmFyIFhIUl9TWU5DID0gem9uZVN5bWJvbCgneGhyU3luYycpOwogICAgICAgIHZhciBYSFJfTElTVEVORVIgPSB6b25lU3ltYm9sKCd4aHJMaXN0ZW5lcicpOwogICAgICAgIHZhciBYSFJfU0NIRURVTEVEID0gem9uZVN5bWJvbCgneGhyU2NoZWR1bGVkJyk7CiAgICAgICAgdmFyIFhIUl9VUkwgPSB6b25lU3ltYm9sKCd4aHJVUkwnKTsKICAgICAgICB2YXIgWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQgPSB6b25lU3ltYm9sKCd4aHJFcnJvckJlZm9yZVNjaGVkdWxlZCcpOwogICAgICAgIGZ1bmN0aW9uIHBhdGNoWEhSKHdpbmRvdykgewogICAgICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0J107CiAgICAgICAgICAgIGlmICghWE1MSHR0cFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUgaW4gc2VydmljZSB3b3JrZXIKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7CiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRQZW5kaW5nVGFzayh0YXJnZXQpIHsgcmV0dXJuIHRhcmdldFtYSFJfVEFTS107IH0KICAgICAgICAgICAgdmFyIG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RQcm90b3R5cGVbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgdmFyIG9yaVJlbW92ZUxpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RQcm90b3R5cGVbWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgaWYgKCFvcmlBZGRMaXN0ZW5lcikgewogICAgICAgICAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRfMSA9IHdpbmRvd1snWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddOwogICAgICAgICAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRfMSkgewogICAgICAgICAgICAgICAgICAgIHZhciBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldF8xLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGVbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGVbWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgUkVBRFlfU1RBVEVfQ0hBTkdFID0gJ3JlYWR5c3RhdGVjaGFuZ2UnOwogICAgICAgICAgICB2YXIgU0NIRURVTEVEID0gJ3NjaGVkdWxlZCc7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHRhc2suZGF0YTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBkYXRhLnRhcmdldDsKICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVyCiAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSB0YXJnZXRbWEhSX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lciA9IHRhcmdldFtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdOwogICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gdGFyZ2V0W1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBsaXN0ZW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbmV3TGlzdGVuZXIgPSB0YXJnZXRbWEhSX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgPT09IHRhcmdldC5ET05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBvbiBzb21lIGJyb3dzZXJzIFhNTEh0dHBSZXF1ZXN0IHdpbGwgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkeVN0YXRlPTQgbXVsdGlwbGUgdGltZXMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGFzayBzdGF0ZSBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHhociBoYXMgcmVnaXN0ZXJlZCBvbmxvYWQgbGlzdGVuZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZSB0YXNrIHNob3VsZCBpbnZva2UgYWZ0ZXIgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmxvYWQgbGlzdGVuZXJzIGZpbmlzaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFRhc2tzICYmIGxvYWRUYXNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaUludm9rZV8xID0gdGFzay5pbnZva2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pbnZva2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gbG9hZCB0aGUgdGFza3MgYWdhaW4sIGJlY2F1c2UgaW4gb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBsaXN0ZW5lciwgdGhleSBtYXkgcmVtb3ZlIHRoZW1zZWx2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRUYXNrcyA9IHRhcmdldFtab25lLl9fc3ltYm9sX18oJ2xvYWRmYWxzZScpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2FkVGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkVGFza3NbaV0gPT09IHRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFza3Muc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpSW52b2tlXzEuY2FsbCh0YXNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2tzLnB1c2godGFzayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRhLmFib3J0ZWQgJiYgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Igb2NjdXJzIHdoZW4geGhyLnNlbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIuY2FsbCh0YXJnZXQsIFJFQURZX1NUQVRFX0NIQU5HRSwgbmV3TGlzdGVuZXIpOwogICAgICAgICAgICAgICAgdmFyIHN0b3JlZFRhc2sgPSB0YXJnZXRbWEhSX1RBU0tdOwogICAgICAgICAgICAgICAgaWYgKCFzdG9yZWRUYXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9UQVNLXSA9IHRhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZW5kTmF0aXZlLmFwcGx5KHRhcmdldCwgZGF0YS5hcmdzKTsKICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwbGFjZWhvbGRlckNhbGxiYWNrKCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyVGFzayh0YXNrKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHRhc2suZGF0YTsKICAgICAgICAgICAgICAgIC8vIE5vdGUgLSBpZGVhbGx5LCB3ZSB3b3VsZCBjYWxsIGRhdGEudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgaGVyZSwgYnV0IGl0J3MgdG9vIGxhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgaXQgZnJvbSBmaXJpbmcuIFNvIGluc3RlYWQsIHdlIHN0b3JlIGluZm8gZm9yIHRoZSBldmVudCBsaXN0ZW5lci4KICAgICAgICAgICAgICAgIGRhdGEuYWJvcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoZGF0YS50YXJnZXQsIGRhdGEuYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG9wZW5OYXRpdmUgPSBwYXRjaE1ldGhvZChYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgJ29wZW4nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykgewogICAgICAgICAgICAgICAgc2VsZltYSFJfU1lOQ10gPSBhcmdzWzJdID09IGZhbHNlOwogICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICByZXR1cm4gb3Blbk5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICAgICAgfTsgfSk7CiAgICAgICAgICAgIHZhciBYTUxIVFRQUkVRVUVTVF9TT1VSQ0UgPSAnWE1MSHR0cFJlcXVlc3Quc2VuZCc7CiAgICAgICAgICAgIHZhciBmZXRjaFRhc2tBYm9ydGluZyA9IHpvbmVTeW1ib2woJ2ZldGNoVGFza0Fib3J0aW5nJyk7CiAgICAgICAgICAgIHZhciBmZXRjaFRhc2tTY2hlZHVsaW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrU2NoZWR1bGluZycpOwogICAgICAgICAgICB2YXIgc2VuZE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnc2VuZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza1NjaGVkdWxpbmddID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYSBmZXRjaCBpcyBzY2hlZHVsaW5nLCBzbyB3ZSBhcmUgdXNpbmcgeGhyIHRvIHBvbHlmaWxsIGZldGNoCiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJlY2F1c2Ugd2UgYWxyZWFkeSBzY2hlZHVsZSBtYWNyb1Rhc2sgZm9yIGZldGNoLCB3ZSBzaG91bGQKICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc2NoZWR1bGUgYSBtYWNyb1Rhc2sgZm9yIHhociBhZ2FpbgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNlbGZbWEhSX1NZTkNdKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIFhIUiBpcyBzeW5jIHRoZXJlIGlzIG5vIHRhc2sgdG8gc2NoZWR1bGUsIGp1c3QgZXhlY3V0ZSB0aGUgY29kZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyB0YXJnZXQ6IHNlbGYsIHVybDogc2VsZltYSFJfVVJMXSwgaXNQZXJpb2RpYzogZmFsc2UsIGFyZ3M6IGFyZ3MsIGFib3J0ZWQ6IGZhbHNlIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShYTUxIVFRQUkVRVUVTVF9TT1VSQ0UsIHBsYWNlaG9sZGVyQ2FsbGJhY2ssIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiAmJiBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJiAhb3B0aW9ucy5hYm9ydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGludm9rZSB0YXNrIGluc3RlYWQgb2YgbGVhdmluZyBhIHNjaGVkdWxlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG1hY3JvVGFzawogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsgfSk7CiAgICAgICAgICAgIHZhciBhYm9ydE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnYWJvcnQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBmaW5kUGVuZGluZ1Rhc2soc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGFzayAmJiB0eXBlb2YgdGFzay50eXBlID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAgLy8gRml4ICM1NjksIGNhbGwgYWJvcnQgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGRvbmUgd2lsbCBjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vIG1hY3JvVGFzayB0YXNrIGNvdW50IGJlIG5lZ2F0aXZlIG51bWJlcgogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbmNlbEZuID09IG51bGwgfHwgKHRhc2suZGF0YSAmJiB0YXNrLmRhdGEuYWJvcnRlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUuY2FuY2VsVGFzayh0YXNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKFpvbmUuY3VycmVudFtmZXRjaFRhc2tBYm9ydGluZ10gPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvcnQgaXMgY2FsbGVkIGZyb20gZmV0Y2ggcG9seWZpbGwsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgYWJvcnQgb2YgWEhSLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhYm9ydE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRyeWluZyB0byBhYm9ydCBhbiBYSFIgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCBzbyB0aGVyZSBpcyBubwogICAgICAgICAgICAgICAgLy8gdGFzawogICAgICAgICAgICAgICAgLy8gdG8gY2FuY2VsLiBEbyBub3RoaW5nLgogICAgICAgICAgICB9OyB9KTsKICAgICAgICB9CiAgICB9KTsKICAgIFpvbmUuX19sb2FkX3BhdGNoKCdnZW9sb2NhdGlvbicsIGZ1bmN0aW9uIChnbG9iYWwpIHsKICAgICAgICAvLy8gR0VPX0xPQ0FUSU9OCiAgICAgICAgaWYgKGdsb2JhbFsnbmF2aWdhdG9yJ10gJiYgZ2xvYmFsWyduYXZpZ2F0b3InXS5nZW9sb2NhdGlvbikgewogICAgICAgICAgICBwYXRjaFByb3RvdHlwZShnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uLCBbJ2dldEN1cnJlbnRQb3NpdGlvbicsICd3YXRjaFBvc2l0aW9uJ10pOwogICAgICAgIH0KICAgIH0pOwogICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1Byb21pc2VSZWplY3Rpb25FdmVudCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUpIHsKICAgICAgICAvLyBoYW5kbGUgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uCiAgICAgICAgZnVuY3Rpb24gZmluZFByb21pc2VSZWplY3Rpb25IYW5kbGVyKGV2dE5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7CiAgICAgICAgICAgICAgICBldmVudFRhc2tzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50VGFzaykgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgaGFzIGFkZGVkIHVuaGFuZGxlZHJlamVjdGlvbiBldmVudCBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgdmFyIFByb21pc2VSZWplY3Rpb25FdmVudCA9IGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J107CiAgICAgICAgICAgICAgICAgICAgaWYgKFByb21pc2VSZWplY3Rpb25FdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IFByb21pc2VSZWplY3Rpb25FdmVudChldnROYW1lLCB7IHByb21pc2U6IGUucHJvbWlzZSwgcmVhc29uOiBlLnJlamVjdGlvbiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXNrLmludm9rZShldnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2xvYmFsWydQcm9taXNlUmVqZWN0aW9uRXZlbnQnXSkgewogICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyJyldID0KICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigndW5oYW5kbGVkcmVqZWN0aW9uJyk7CiAgICAgICAgICAgIFpvbmVbem9uZVN5bWJvbCgncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKV0gPQogICAgICAgICAgICAgICAgZmluZFByb21pc2VSZWplY3Rpb25IYW5kbGVyKCdyZWplY3Rpb25oYW5kbGVkJyk7CiAgICAgICAgfQogICAgfSk7Cn0pKSk7CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvc3JjL2FuaW1hdGlvbl9idWlsZGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBbiBpbmplY3RhYmxlIHNlcnZpY2UgdGhhdCBwcm9kdWNlcyBhbiBhbmltYXRpb24gc2VxdWVuY2UgcHJvZ3JhbW1hdGljYWxseSB3aXRoaW4gYW4KICogQW5ndWxhciBjb21wb25lbnQgb3IgZGlyZWN0aXZlLgogKiBQcm92aWRlZCBieSB0aGUgYEJyb3dzZXJBbmltYXRpb25zTW9kdWxlYCBvciBgTm9vcEFuaW1hdGlvbnNNb2R1bGVgLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVG8gdXNlIHRoaXMgc2VydmljZSwgYWRkIGl0IHRvIHlvdXIgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBhcyBhIGRlcGVuZGVuY3kuCiAqIFRoZSBzZXJ2aWNlIGlzIGluc3RhbnRpYXRlZCBhbG9uZyB3aXRoIHlvdXIgY29tcG9uZW50LgogKgogKiBBcHBzIGRvIG5vdCB0eXBpY2FsbHkgbmVlZCB0byBjcmVhdGUgdGhlaXIgb3duIGFuaW1hdGlvbiBwbGF5ZXJzLCBidXQgaWYgeW91CiAqIGRvIG5lZWQgdG8sIGZvbGxvdyB0aGVzZSBzdGVwczoKICoKICogMS4gVXNlIHRoZSBgYnVpbGQoKWAgbWV0aG9kIHRvIGNyZWF0ZSBhIHByb2dyYW1tYXRpYyBhbmltYXRpb24gdXNpbmcgdGhlCiAqIGBhbmltYXRlKClgIGZ1bmN0aW9uLiBUaGUgbWV0aG9kIHJldHVybnMgYW4gYEFuaW1hdGlvbkZhY3RvcnlgIGluc3RhbmNlLgogKgogKiAyLiBVc2UgdGhlIGZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBhbiBgQW5pbWF0aW9uUGxheWVyYCBhbmQgYXR0YWNoIGl0IHRvIGEgRE9NIGVsZW1lbnQuCiAqCiAqIDMuIFVzZSB0aGUgcGxheWVyIG9iamVjdCB0byBjb250cm9sIHRoZSBhbmltYXRpb24gcHJvZ3JhbW1hdGljYWxseS4KICoKICogRm9yIGV4YW1wbGU6CiAqCiAqIGBgYHRzCiAqIC8vIGltcG9ydCB0aGUgc2VydmljZSBmcm9tIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlCiAqIGltcG9ydCB7QW5pbWF0aW9uQnVpbGRlcn0gZnJvbSAnXEBhbmd1bGFyL2FuaW1hdGlvbnMnOwogKiAvLyByZXF1aXJlIHRoZSBzZXJ2aWNlIGFzIGEgZGVwZW5kZW5jeQogKiBjbGFzcyBNeUNtcCB7CiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcikge30KICoKICogICBtYWtlQW5pbWF0aW9uKGVsZW1lbnQ6IGFueSkgewogKiAgICAgLy8gZmlyc3QgZGVmaW5lIGEgcmV1c2FibGUgYW5pbWF0aW9uCiAqICAgICBjb25zdCBteUFuaW1hdGlvbiA9IHRoaXMuX2J1aWxkZXIuYnVpbGQoWwogKiAgICAgICBzdHlsZSh7IHdpZHRoOiAwIH0pLAogKiAgICAgICBhbmltYXRlKDEwMDAsIHN0eWxlKHsgd2lkdGg6ICcxMDBweCcgfSkpCiAqICAgICBdKTsKICoKICogICAgIC8vIHVzZSB0aGUgcmV0dXJuZWQgZmFjdG9yeSBvYmplY3QgdG8gY3JlYXRlIGEgcGxheWVyCiAqICAgICBjb25zdCBwbGF5ZXIgPSBteUFuaW1hdGlvbi5jcmVhdGUoZWxlbWVudCk7CiAqCiAqICAgICBwbGF5ZXIucGxheSgpOwogKiAgIH0KICogfQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBBbmltYXRpb25CdWlsZGVyIHsKfQovKioKICogQSBmYWN0b3J5IG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBgQW5pbWF0aW9uQnVpbGRlcmAuYGJ1aWxkKClgIG1ldGhvZC4KICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBBbmltYXRpb25GYWN0b3J5IHsKfQovKioKICogU3BlY2lmaWVzIGF1dG9tYXRpYyBzdHlsaW5nLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEFVVE9fU1RZTEUgPSAnKic7Ci8qKgogKiBDcmVhdGVzIGEgbmFtZWQgYW5pbWF0aW9uIHRyaWdnZXIsIGNvbnRhaW5pbmcgYSAgbGlzdCBvZiBgc3RhdGUoKWAKICogYW5kIGB0cmFuc2l0aW9uKClgIGVudHJpZXMgdG8gYmUgZXZhbHVhdGVkIHdoZW4gdGhlIGV4cHJlc3Npb24KICogYm91bmQgdG8gdGhlIHRyaWdnZXIgY2hhbmdlcy4KICoKICogXEB1c2FnZU5vdGVzCiAqIERlZmluZSBhbiBhbmltYXRpb24gdHJpZ2dlciBpbiB0aGUgYGFuaW1hdGlvbnNgIHNlY3Rpb24gb2YgYFxAQ29tcG9uZW50YCBtZXRhZGF0YS4KICogSW4gdGhlIHRlbXBsYXRlLCByZWZlcmVuY2UgdGhlIHRyaWdnZXIgYnkgbmFtZSBhbmQgYmluZCBpdCB0byBhIHRyaWdnZXIgZXhwcmVzc2lvbiB0aGF0CiAqIGV2YWx1YXRlcyB0byBhIGRlZmluZWQgYW5pbWF0aW9uIHN0YXRlLCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKICoKICogYFtcQHRyaWdnZXJOYW1lXT0iZXhwcmVzc2lvbiJgCiAqCiAqIEFuaW1hdGlvbiB0cmlnZ2VyIGJpbmRpbmdzIGNvbnZlcnQgYWxsIHZhbHVlcyB0byBzdHJpbmdzLCBhbmQgdGhlbiBtYXRjaCB0aGUKICogcHJldmlvdXMgYW5kIGN1cnJlbnQgdmFsdWVzIGFnYWluc3QgYW55IGxpbmtlZCB0cmFuc2l0aW9ucy4KICogQm9vbGVhbnMgY2FuIGJlIHNwZWNpZmllZCBhcyBgMWAgb3IgYHRydWVgIGFuZCBgMGAgb3IgYGZhbHNlYC4KICoKICogIyMjIFVzYWdlIEV4YW1wbGUKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYW4gYW5pbWF0aW9uIHRyaWdnZXIgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZAogKiBuYW1lIHZhbHVlLgogKiBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2Ygc3RhdGUgYW5kCiAqIHRyYW5zaXRpb24gZGVjbGFyYXRpb25zLgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogIm15LWNvbXBvbmVudCIsCiAqICAgdGVtcGxhdGVVcmw6ICJteS1jb21wb25lbnQtdHBsLmh0bWwiLAogKiAgIGFuaW1hdGlvbnM6IFsKICogICAgIHRyaWdnZXIoIm15QW5pbWF0aW9uVHJpZ2dlciIsIFsKICogICAgICAgc3RhdGUoLi4uKSwKICogICAgICAgc3RhdGUoLi4uKSwKICogICAgICAgdHJhbnNpdGlvbiguLi4pLAogKiAgICAgICB0cmFuc2l0aW9uKC4uLikKICogICAgIF0pCiAqICAgXQogKiB9KQogKiBjbGFzcyBNeUNvbXBvbmVudCB7CiAqICAgbXlTdGF0dXNFeHAgPSAic29tZXRoaW5nIjsKICogfQogKiBgYGAKICoKICogVGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCBtYWtlcyB1c2Ugb2YgdGhlIGRlZmluZWQgdHJpZ2dlcgogKiBieSBiaW5kaW5nIHRvIGFuIGVsZW1lbnQgd2l0aGluIGl0cyB0ZW1wbGF0ZSBjb2RlLgogKgogKiBgYGBodG1sCiAqIDwhLS0gc29tZXdoZXJlIGluc2lkZSBvZiBteS1jb21wb25lbnQtdHBsLmh0bWwgLS0+CiAqIDxkaXYgW1xAbXlBbmltYXRpb25UcmlnZ2VyXT0ibXlTdGF0dXNFeHAiPi4uLjwvZGl2PgogKiBgYGAKICoKICogIyMjIFVzaW5nIGFuIGlubGluZSBmdW5jdGlvbgogKiBUaGUgYHRyYW5zaXRpb25gIGFuaW1hdGlvbiBtZXRob2QgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuIGlubGluZSBmdW5jdGlvbiB3aGljaCBjYW4gZGVjaWRlCiAqIGlmIGl0cyBhc3NvY2lhdGVkIGFuaW1hdGlvbiBzaG91bGQgYmUgcnVuLgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIC8vIHRoaXMgbWV0aG9kIGlzIHJ1biBlYWNoIHRpbWUgdGhlIGBteUFuaW1hdGlvblRyaWdnZXJgIHRyaWdnZXIgdmFsdWUgY2hhbmdlcy4KICogZnVuY3Rpb24gbXlJbmxpbmVNYXRjaGVyRm4oZnJvbVN0YXRlOiBzdHJpbmcsIHRvU3RhdGU6IHN0cmluZywgZWxlbWVudDogYW55LCBwYXJhbXM6IHtba2V5OgogKiBzdHJpbmddOiBhbnl9KTogYm9vbGVhbiB7CiAqICAgLy8gbm90aWNlIHRoYXQgYGVsZW1lbnRgIGFuZCBgcGFyYW1zYCBhcmUgYWxzbyBhdmFpbGFibGUgaGVyZQogKiAgIHJldHVybiB0b1N0YXRlID09ICd5ZXMtcGxlYXNlLWFuaW1hdGUnOwogKiB9CiAqICAvCiAqICAgc2VsZWN0b3I6ICdteS1jb21wb25lbnQnLAogKiAgIHRlbXBsYXRlVXJsOiAnbXktY29tcG9uZW50LXRwbC5odG1sJywKICogICBhbmltYXRpb25zOiBbCiAqICAgICB0cmlnZ2VyKCdteUFuaW1hdGlvblRyaWdnZXInLCBbCiAqICAgICAgIHRyYW5zaXRpb24obXlJbmxpbmVNYXRjaGVyRm4sIFsKICogICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIHNlcXVlbmNlIGNvZGUKICogICAgICAgXSksCiAqICAgICBdKQogKiAgIF0KICogfSkKICogY2xhc3MgTXlDb21wb25lbnQgewogKiAgIG15U3RhdHVzRXhwID0gInllcy1wbGVhc2UtYW5pbWF0ZSI7CiAqIH0KICogYGBgCiAqCiAqICMjIyBEaXNhYmxpbmcgQW5pbWF0aW9ucwogKiBXaGVuIHRydWUsIHRoZSBzcGVjaWFsIGFuaW1hdGlvbiBjb250cm9sIGJpbmRpbmcgYFxALmRpc2FibGVkYCBiaW5kaW5nIHByZXZlbnRzCiAqIGFsbCBhbmltYXRpb25zIGZyb20gcmVuZGVyaW5nLgogKiBQbGFjZSB0aGUgIGBcQC5kaXNhYmxlZGAgYmluZGluZyBvbiBhbiBlbGVtZW50IHRvIGRpc2FibGUKICogYW5pbWF0aW9ucyBvbiB0aGUgZWxlbWVudCBpdHNlbGYsIGFzIHdlbGwgYXMgYW55IGlubmVyIGFuaW1hdGlvbiB0cmlnZ2VycwogKiB3aXRoaW4gdGhlIGVsZW1lbnQuCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHRoaXMgZmVhdHVyZToKICoKICogYGBgdHlwZXNjcmlwdCAvCiAqICAgc2VsZWN0b3I6ICdteS1jb21wb25lbnQnLAogKiAgIHRlbXBsYXRlOiBgCiAqICAgICA8ZGl2IFtcQC5kaXNhYmxlZF09ImlzRGlzYWJsZWQiPgogKiAgICAgICA8ZGl2IFtcQGNoaWxkQW5pbWF0aW9uXT0iZXhwIj48L2Rpdj4KICogICAgIDwvZGl2PgogKiAgIGAsCiAqICAgYW5pbWF0aW9uczogWwogKiAgICAgdHJpZ2dlcigiY2hpbGRBbmltYXRpb24iLCBbCiAqICAgICAgIC8vIC4uLgogKiAgICAgXSkKICogICBdCiAqIH0pCiAqIGNsYXNzIE15Q29tcG9uZW50IHsKICogICBpc0Rpc2FibGVkID0gdHJ1ZTsKICogICBleHAgPSAnLi4uJzsKICogfQogKiBgYGAKICoKICogV2hlbiBgXEAuZGlzYWJsZWRgIGlzIHRydWUsIGl0IHByZXZlbnRzIHRoZSBgXEBjaGlsZEFuaW1hdGlvbmAgdHJpZ2dlciBmcm9tIGFuaW1hdGluZywKICogYWxvbmcgd2l0aCBhbnkgaW5uZXIgYW5pbWF0aW9ucy4KICoKICogIyMjIERpc2FibGUgYW5pbWF0aW9ucyBhcHBsaWNhdGlvbi13aWRlCiAqIFdoZW4gYW4gYXJlYSBvZiB0aGUgdGVtcGxhdGUgaXMgc2V0IHRvIGhhdmUgYW5pbWF0aW9ucyBkaXNhYmxlZCwKICogKiphbGwqKiBpbm5lciBjb21wb25lbnRzIGhhdmUgdGhlaXIgYW5pbWF0aW9ucyBkaXNhYmxlZCBhcyB3ZWxsLgogKiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBkaXNhYmxlIGFsbCBhbmltYXRpb25zIGZvciBhbiBhcHAKICogYnkgcGxhY2luZyBhIGhvc3QgYmluZGluZyBzZXQgb24gYFxALmRpc2FibGVkYCBvbiB0aGUgdG9wbW9zdCBBbmd1bGFyIGNvbXBvbmVudC4KICoKICogYGBgdHlwZXNjcmlwdAogKiBpbXBvcnQge0NvbXBvbmVudCwgSG9zdEJpbmRpbmd9IGZyb20gJ1xAYW5ndWxhci9jb3JlJzsKICogIC8KICogICBzZWxlY3RvcjogJ2FwcC1jb21wb25lbnQnLAogKiAgIHRlbXBsYXRlVXJsOiAnYXBwLmNvbXBvbmVudC5odG1sJywKICogfSkKICogY2xhc3MgQXBwQ29tcG9uZW50IHsKICogXEBIb3N0QmluZGluZygnQC5kaXNhYmxlZCcpCiAqICAgcHVibGljIGFuaW1hdGlvbnNEaXNhYmxlZCA9IHRydWU7CiAqIH0KICogYGBgCiAqCiAqICMjIyBPdmVycmlkaW5nIGRpc2FibGVtZW50IG9mIGlubmVyIGFuaW1hdGlvbnMKICogRGVzcGl0ZSBpbm5lciBhbmltYXRpb25zIGJlaW5nIGRpc2FibGVkLCBhIHBhcmVudCBhbmltYXRpb24gY2FuIGBxdWVyeSgpYAogKiBmb3IgaW5uZXIgZWxlbWVudHMgbG9jYXRlZCBpbiBkaXNhYmxlZCBhcmVhcyBvZiB0aGUgdGVtcGxhdGUgYW5kIHN0aWxsIGFuaW1hdGUKICogdGhlbSBpZiBuZWVkZWQuIFRoaXMgaXMgYWxzbyB0aGUgY2FzZSBmb3Igd2hlbiBhIHN1YiBhbmltYXRpb24gaXMKICogcXVlcmllZCBieSBhIHBhcmVudCBhbmQgdGhlbiBsYXRlciBhbmltYXRlZCB1c2luZyBgYW5pbWF0ZUNoaWxkKClgLgogKgogKiAjIyMgRGV0ZWN0aW5nIHdoZW4gYW4gYW5pbWF0aW9uIGlzIGRpc2FibGVkCiAqIElmIGEgcmVnaW9uIG9mIHRoZSBET00gKG9yIHRoZSBlbnRpcmUgYXBwbGljYXRpb24pIGhhcyBpdHMgYW5pbWF0aW9ucyBkaXNhYmxlZCwgdGhlIGFuaW1hdGlvbgogKiB0cmlnZ2VyIGNhbGxiYWNrcyBzdGlsbCBmaXJlLCBidXQgZm9yIHplcm8gc2Vjb25kcy4gV2hlbiB0aGUgY2FsbGJhY2sgZmlyZXMsIGl0IHByb3ZpZGVzCiAqIGFuIGluc3RhbmNlIG9mIGFuIGBBbmltYXRpb25FdmVudGAuIElmIGFuaW1hdGlvbnMgYXJlIGRpc2FibGVkLAogKiB0aGUgYC5kaXNhYmxlZGAgZmxhZyBvbiB0aGUgZXZlbnQgaXMgdHJ1ZS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBuYW1lIEFuIGlkZW50aWZ5aW5nIHN0cmluZy4KICogQHBhcmFtIHs/fSBkZWZpbml0aW9ucyAgQW4gYW5pbWF0aW9uIGRlZmluaXRpb24gb2JqZWN0LCBjb250YWluaW5nIGFuIGFycmF5IG9mIGBzdGF0ZSgpYAogKiBhbmQgYHRyYW5zaXRpb24oKWAgZGVjbGFyYXRpb25zLgogKgogKiBAcmV0dXJuIHs/fSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHRyaWdnZXIgZGF0YS4KICoKICovCmZ1bmN0aW9uIHRyaWdnZXIobmFtZSwgZGVmaW5pdGlvbnMpIHsKICAgIHJldHVybiB7IHR5cGU6IDcgLyogVHJpZ2dlciAqLywgbmFtZSwgZGVmaW5pdGlvbnMsIG9wdGlvbnM6IHt9IH07Cn0KLyoqCiAqIERlZmluZXMgYW4gYW5pbWF0aW9uIHN0ZXAgdGhhdCBjb21iaW5lcyBzdHlsaW5nIGluZm9ybWF0aW9uIHdpdGggdGltaW5nIGluZm9ybWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogQ2FsbCB3aXRoaW4gYW4gYW5pbWF0aW9uIGBzZXF1ZW5jZSgpYCwgYHtcQGxpbmsgYW5pbWF0aW9ucy9ncm91cCBncm91cCgpfWAsIG9yCiAqIGB0cmFuc2l0aW9uKClgIGNhbGwgdG8gc3BlY2lmeSBhbiBhbmltYXRpb24gc3RlcAogKiB0aGF0IGFwcGxpZXMgZ2l2ZW4gc3R5bGUgZGF0YSB0byB0aGUgcGFyZW50IGFuaW1hdGlvbiBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdGltZS4KICoKICogIyMjIFN5bnRheCBFeGFtcGxlcwogKiAqKlRpbWluZyBleGFtcGxlcyoqCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyB2YXJpb3VzIGB0aW1pbmdzYCBzcGVjaWZpY2F0aW9ucy4KICogLSBgYW5pbWF0ZSg1MDApYCA6IER1cmF0aW9uIGlzIDUwMCBtaWxsaXNlY29uZHMuCiAqIC0gYGFuaW1hdGUoIjFzIilgIDogRHVyYXRpb24gaXMgMTAwMCBtaWxsaXNlY29uZHMuCiAqIC0gYGFuaW1hdGUoIjEwMG1zIDAuNXMiKWAgOiBEdXJhdGlvbiBpcyAxMDAgbWlsbGlzZWNvbmRzLCBkZWxheSBpcyA1MDAgbWlsbGlzZWNvbmRzLgogKiAtIGBhbmltYXRlKCI1cyBlYXNlLWluIilgIDogRHVyYXRpb24gaXMgNTAwMCBtaWxsaXNlY29uZHMsIGVhc2luZyBpbi4KICogLSBgYW5pbWF0ZSgiNXMgMTBtcyBjdWJpYy1iZXppZXIoLjE3LC42NywuODgsLjEpIilgIDogRHVyYXRpb24gaXMgNTAwMCBtaWxsaXNlY29uZHMsIGRlbGF5IGlzIDEwCiAqIG1pbGxpc2Vjb25kcywgZWFzaW5nIGFjY29yZGluZyB0byBhIGJlemllciBjdXJ2ZS4KICoKICogKipTdHlsZSBleGFtcGxlcyoqCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjYWxscyBgc3R5bGUoKWAgdG8gc2V0IGEgc2luZ2xlIENTUyBzdHlsZS4KICogYGBgdHlwZXNjcmlwdAogKiBhbmltYXRlKDUwMCwgc3R5bGUoeyBiYWNrZ3JvdW5kOiAicmVkIiB9KSkKICogYGBgCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjYWxscyBga2V5ZnJhbWVzKClgIHRvIHNldCBhIENTUyBzdHlsZQogKiB0byBkaWZmZXJlbnQgdmFsdWVzIGZvciBzdWNjZXNzaXZlIGtleWZyYW1lcy4KICogYGBgdHlwZXNjcmlwdAogKiBhbmltYXRlKDUwMCwga2V5ZnJhbWVzKAogKiAgWwogKiAgIHN0eWxlKHsgYmFja2dyb3VuZDogImJsdWUiIH0pKSwKICogICBzdHlsZSh7IGJhY2tncm91bmQ6ICJyZWQiIH0pKQogKiAgXSkKICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gdGltaW5ncyBTZXRzIGBBbmltYXRlVGltaW5nc2AgZm9yIHRoZSBwYXJlbnQgYW5pbWF0aW9uLgogKiBBIHN0cmluZyBpbiB0aGUgZm9ybWF0ICJkdXJhdGlvbiBbZGVsYXldIFtlYXNpbmddIi4KICogIC0gRHVyYXRpb24gYW5kIGRlbGF5IGFyZSBleHByZXNzZWQgYXMgYSBudW1iZXIgYW5kIG9wdGlvbmFsIHRpbWUgdW5pdCwKICogc3VjaCBhcyAiMXMiIG9yICIxMG1zIiBmb3Igb25lIHNlY29uZCBhbmQgMTAgbWlsbGlzZWNvbmRzLCByZXNwZWN0aXZlbHkuCiAqIFRoZSBkZWZhdWx0IHVuaXQgaXMgbWlsbGlzZWNvbmRzLgogKiAgLSBUaGUgZWFzaW5nIHZhbHVlIGNvbnRyb2xzIGhvdyB0aGUgYW5pbWF0aW9uIGFjY2VsZXJhdGVzIGFuZCBkZWNlbGVyYXRlcwogKiBkdXJpbmcgaXRzIHJ1bnRpbWUuIFZhbHVlIGlzIG9uZSBvZiAgYGVhc2VgLCBgZWFzZS1pbmAsIGBlYXNlLW91dGAsCiAqIGBlYXNlLWluLW91dGAsIG9yIGEgYGN1YmljLWJlemllcigpYCBmdW5jdGlvbiBjYWxsLgogKiBJZiBub3Qgc3VwcGxpZWQsIG5vIGVhc2luZyBpcyBhcHBsaWVkLgogKgogKiBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyAiMXMgMTAwbXMgZWFzZS1vdXQiIHNwZWNpZmllcyBhIGR1cmF0aW9uIG9mCiAqIDEwMDAgbWlsbGlzZWNvbmRzLCBhbmQgZGVsYXkgb2YgMTAwIG1zLCBhbmQgdGhlICJlYXNlLW91dCIgZWFzaW5nIHN0eWxlLAogKiB3aGljaCBkZWNlbGVyYXRlcyBuZWFyIHRoZSBlbmQgb2YgdGhlIGR1cmF0aW9uLgogKiBAcGFyYW0gez89fSBzdHlsZXMgU2V0cyBBbmltYXRpb25TdHlsZXMgZm9yIHRoZSBwYXJlbnQgYW5pbWF0aW9uLgogKiBBIGZ1bmN0aW9uIGNhbGwgdG8gZWl0aGVyIGBzdHlsZSgpYCBvciBga2V5ZnJhbWVzKClgCiAqIHRoYXQgcmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgQ1NTIHN0eWxlIGVudHJpZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgcGFyZW50IGFuaW1hdGlvbi4KICogV2hlbiBudWxsLCB1c2VzIHRoZSBzdHlsZXMgZnJvbSB0aGUgZGVzdGluYXRpb24gc3RhdGUuCiAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gZGVzY3JpYmluZyBhbiBhbmltYXRpb24gc3RlcCB0aGF0IHdpbGwgY29tcGxldGUgYW4gYW5pbWF0aW9uOwogKiBzZWUgIkFuaW1hdGluZyB0byB0aGUgZmluYWwgc3RhdGUiIGluIGB0cmFuc2l0aW9ucygpYC4KICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBhbmltYXRpb24gc3RlcC4KICoKICovCmZ1bmN0aW9uIGFuaW1hdGUodGltaW5ncywgc3R5bGVzID0gbnVsbCkgewogICAgcmV0dXJuIHsgdHlwZTogNCAvKiBBbmltYXRlICovLCBzdHlsZXMsIHRpbWluZ3MgfTsKfQovKioKICogRGVmaW5lcyBhIGxpc3Qgb2YgYW5pbWF0aW9uIHN0ZXBzIHRvIGJlIHJ1biBzZXF1ZW50aWFsbHksIG9uZSBieSBvbmUuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBXaGVuIHlvdSBwYXNzIGFuIGFycmF5IG9mIHN0ZXBzIHRvIGEKICogYHRyYW5zaXRpb24oKWAgY2FsbCwgdGhlIHN0ZXBzIHJ1biBzZXF1ZW50aWFsbHkgYnkgZGVmYXVsdC4KICogQ29tcGFyZSB0aGlzIHRvIHRoZSBge1xAbGluayBhbmltYXRpb25zL2dyb3VwIGdyb3VwKCl9YCBjYWxsLCB3aGljaCBydW5zIGFuaW1hdGlvbiBzdGVwcyBpbgogKiBwYXJhbGxlbC4KICoKICogV2hlbiBhIHNlcXVlbmNlIGlzIHVzZWQgd2l0aGluIGEgYHtcQGxpbmsgYW5pbWF0aW9ucy9ncm91cCBncm91cCgpfWAgb3IgYSBgdHJhbnNpdGlvbigpYCBjYWxsLAogKiBleGVjdXRpb24gY29udGludWVzIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIG9ubHkgYWZ0ZXIgZWFjaCBvZiB0aGUgaW5uZXIgYW5pbWF0aW9uCiAqIHN0ZXBzIGhhdmUgY29tcGxldGVkLgogKgogKiBcQHB1YmxpY0FwaQogKgogKiBAcGFyYW0gez99IHN0ZXBzIEFuIGFycmF5IG9mIGFuaW1hdGlvbiBzdGVwIG9iamVjdHMuCiAqIC0gU3RlcHMgZGVmaW5lZCBieSBgc3R5bGUoKWAgY2FsbHMgYXBwbHkgdGhlIHN0eWxpbmcgZGF0YSBpbW1lZGlhdGVseS4KICogLSBTdGVwcyBkZWZpbmVkIGJ5IGBhbmltYXRlKClgIGNhbGxzIGFwcGx5IHRoZSBzdHlsaW5nIGRhdGEgb3ZlciB0aW1lCiAqICAgYXMgc3BlY2lmaWVkIGJ5IHRoZSB0aW1pbmcgZGF0YS4KICoKICogYGBgdHlwZXNjcmlwdAogKiBzZXF1ZW5jZShbCiAqICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLAogKiAgIGFuaW1hdGUoIjFzIiwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKQogKiBdKQogKiBgYGAKICoKICogQHBhcmFtIHs/PX0gb3B0aW9ucyBBbiBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGEgZGVsYXkgYW5kCiAqIGRldmVsb3Blci1kZWZpbmVkIHBhcmFtZXRlcnMgdGhhdCBwcm92aWRlIHN0eWxpbmcgZGVmYXVsdHMgYW5kCiAqIGNhbiBiZSBvdmVycmlkZGVuIG9uIGludm9jYXRpb24uCiAqCiAqIEByZXR1cm4gez99IEFuIG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgc2VxdWVuY2UgZGF0YS4KICoKICovCmZ1bmN0aW9uIHNlcXVlbmNlKHN0ZXBzLCBvcHRpb25zID0gbnVsbCkgewogICAgcmV0dXJuIHsgdHlwZTogMiAvKiBTZXF1ZW5jZSAqLywgc3RlcHMsIG9wdGlvbnMgfTsKfQovKioKICogRGVjbGFyZXMgYSBrZXkvdmFsdWUgb2JqZWN0IGNvbnRhaW5pbmcgQ1NTIHByb3BlcnRpZXMvc3R5bGVzIHRoYXQKICogY2FuIHRoZW4gYmUgdXNlZCBmb3IgYW4gYW5pbWF0aW9uIGBzdGF0ZWAsIHdpdGhpbiBhbiBhbmltYXRpb24gYHNlcXVlbmNlYCwKICogb3IgYXMgc3R5bGluZyBkYXRhIGZvciBjYWxscyB0byBgYW5pbWF0ZSgpYCBhbmQgYGtleWZyYW1lcygpYC4KICoKICogXEB1c2FnZU5vdGVzCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgY3JlYXRlIGFuaW1hdGlvbiBzdHlsZXMgdGhhdCBjb2xsZWN0IGEgc2V0IG9mCiAqIENTUyBwcm9wZXJ0eSB2YWx1ZXM6CiAqCiAqIGBgYHR5cGVzY3JpcHQKICogLy8gc3RyaW5nIHZhbHVlcyBmb3IgQ1NTIHByb3BlcnRpZXMKICogc3R5bGUoeyBiYWNrZ3JvdW5kOiAicmVkIiwgY29sb3I6ICJibHVlIiB9KQogKgogKiAvLyBudW1lcmljYWwgcGl4ZWwgdmFsdWVzCiAqIHN0eWxlKHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAwIH0pCiAqIGBgYAogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcyBhdXRvLXN0eWxpbmcgdG8gYWxsb3cgYSBjb21wb25lbnQgdG8gYW5pbWF0ZSBmcm9tCiAqIGEgaGVpZ2h0IG9mIDAgdXAgdG8gdGhlIGhlaWdodCBvZiB0aGUgcGFyZW50IGVsZW1lbnQ6CiAqCiAqIGBgYAogKiBzdHlsZSh7IGhlaWdodDogMCB9KSwKICogYW5pbWF0ZSgiMXMiLCBzdHlsZSh7IGhlaWdodDogIioiIH0pKQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICoKICogQHBhcmFtIHs/fSB0b2tlbnMgQSBzZXQgb2YgQ1NTIHN0eWxlcyBvciBIVE1MIHN0eWxlcyBhc3NvY2lhdGVkIHdpdGggYW4gYW5pbWF0aW9uIHN0YXRlLgogKiBUaGUgdmFsdWUgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgogKiAtIEEga2V5LXZhbHVlIHN0eWxlIHBhaXIgYXNzb2NpYXRpbmcgYSBDU1MgcHJvcGVydHkgd2l0aCBhIHZhbHVlLgogKiAtIEFuIGFycmF5IG9mIGtleS12YWx1ZSBzdHlsZSBwYWlycy4KICogLSBBbiBhc3RlcmlzayAoKiksIHRvIHVzZSBhdXRvLXN0eWxpbmcsIHdoZXJlIHN0eWxlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBlbGVtZW50CiAqIGJlaW5nIGFuaW1hdGVkIGFuZCBhcHBsaWVkIHRvIHRoZSBhbmltYXRpb24gd2hlbiBpdCBzdGFydHMuCiAqCiAqIEF1dG8tc3R5bGluZyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gbGF5b3V0IG9yIG90aGVyCiAqIGVudmlyb25tZW50YWwgZmFjdG9ycy4KICoKICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzdHlsZSBkYXRhLgogKgogKi8KZnVuY3Rpb24gc3R5bGUodG9rZW5zKSB7CiAgICByZXR1cm4geyB0eXBlOiA2IC8qIFN0eWxlICovLCBzdHlsZXM6IHRva2Vucywgb2Zmc2V0OiBudWxsIH07Cn0KLyoqCiAqIERlY2xhcmVzIGFuIGFuaW1hdGlvbiBzdGF0ZSB3aXRoaW4gYSB0cmlnZ2VyIGF0dGFjaGVkIHRvIGFuIGVsZW1lbnQuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBVc2UgdGhlIGB0cmlnZ2VyKClgIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIHN0YXRlcyB0byBhbiBhbmltYXRpb24gdHJpZ2dlci4KICogVXNlIHRoZSBgdHJhbnNpdGlvbigpYCBmdW5jdGlvbiB0byBhbmltYXRlIGJldHdlZW4gc3RhdGVzLgogKiBXaGVuIGEgc3RhdGUgaXMgYWN0aXZlIHdpdGhpbiBhIGNvbXBvbmVudCwgaXRzIGFzc29jaWF0ZWQgc3R5bGVzIHBlcnNpc3Qgb24gdGhlIGVsZW1lbnQsCiAqIGV2ZW4gd2hlbiB0aGUgYW5pbWF0aW9uIGVuZHMuCiAqCiAqIFxAcHVibGljQXBpCiAqCiAqIEBwYXJhbSB7P30gbmFtZSBPbmUgb3IgbW9yZSBuYW1lcyBmb3IgdGhlIGRlZmluZWQgc3RhdGUgaW4gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgogKiBUaGUgZm9sbG93aW5nIHJlc2VydmVkIHN0YXRlIG5hbWVzIGNhbiBiZSBzdXBwbGllZCB0byBkZWZpbmUgYSBzdHlsZSBmb3Igc3BlY2lmaWMgdXNlCiAqIGNhc2VzOgogKgogKiAtIGB2b2lkYCBZb3UgY2FuIGFzc29jaWF0ZSBzdHlsZXMgd2l0aCB0aGlzIG5hbWUgdG8gYmUgdXNlZCB3aGVuCiAqIHRoZSBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhbiBgbmdJZmAgZXZhbHVhdGVzCiAqIHRvIGZhbHNlLCB0aGUgc3RhdGUgb2YgdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBpcyB2b2lkLgogKiAgLSBgKmAgKGFzdGVyaXNrKSBJbmRpY2F0ZXMgdGhlIGRlZmF1bHQgc3RhdGUuIFlvdSBjYW4gYXNzb2NpYXRlIHN0eWxlcyB3aXRoIHRoaXMgbmFtZQogKiB0byBiZSB1c2VkIGFzIHRoZSBmYWxsYmFjayB3aGVuIHRoZSBzdGF0ZSB0aGF0IGlzIGJlaW5nIGFuaW1hdGVkIGlzIG5vdCBkZWNsYXJlZAogKiB3aXRoaW4gdGhlIHRyaWdnZXIuCiAqCiAqIEBwYXJhbSB7P30gc3R5bGVzIEEgc2V0IG9mIENTUyBzdHlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdGUsIGNyZWF0ZWQgdXNpbmcgdGhlCiAqIGBzdHlsZSgpYCBmdW5jdGlvbi4KICogVGhpcyBzZXQgb2Ygc3R5bGVzIHBlcnNpc3RzIG9uIHRoZSBlbGVtZW50IG9uY2UgdGhlIHN0YXRlIGhhcyBiZWVuIHJlYWNoZWQuCiAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHN0YXRlIHdoZW4gaXQgaXMgaW52b2tlZC4KICogMCBvciBtb3JlIGtleS12YWx1ZSBwYWlycy4KICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBuZXcgc3RhdGUgZGF0YS4KICoKICovCmZ1bmN0aW9uIHN0YXRlKG5hbWUsIHN0eWxlcywgb3B0aW9ucykgewogICAgcmV0dXJuIHsgdHlwZTogMCAvKiBTdGF0ZSAqLywgbmFtZSwgc3R5bGVzLCBvcHRpb25zIH07Cn0KLyoqCiAqIERlY2xhcmVzIGFuIGFuaW1hdGlvbiB0cmFuc2l0aW9uIGFzIGEgc2VxdWVuY2Ugb2YgYW5pbWF0aW9uIHN0ZXBzIHRvIHJ1biB3aGVuIGEgZ2l2ZW4KICogY29uZGl0aW9uIGlzIHNhdGlzZmllZC4gVGhlIGNvbmRpdGlvbiBpcyBhIEJvb2xlYW4gZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzCiAqIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBhbmltYXRpb24gc3RhdGVzLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNpdGlvbiBzaG91bGQgb2NjdXIuCiAqIFdoZW4gdGhlIHN0YXRlIGNyaXRlcmlhIG9mIGEgZGVmaW5lZCB0cmFuc2l0aW9uIGFyZSBtZXQsIHRoZSBhc3NvY2lhdGVkIGFuaW1hdGlvbiBpcwogKiB0cmlnZ2VyZWQuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBUaGUgdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIGEgY29tcG9uZW50IGJpbmRzIGFuIGFuaW1hdGlvbiB0cmlnZ2VyIHRvIGFuIGVsZW1lbnQuCiAqCiAqIGBgYEhUTUwKICogPCEtLSBzb21ld2hlcmUgaW5zaWRlIG9mIG15LWNvbXBvbmVudC10cGwuaHRtbCAtLT4KICogPGRpdiBbXEBteUFuaW1hdGlvblRyaWdnZXJdPSJteVN0YXR1c0V4cCI+Li4uPC9kaXY+CiAqIGBgYAogKgogKiBBbGwgdHJhbnNpdGlvbnMgYXJlIGRlZmluZWQgd2l0aGluIGFuIGFuaW1hdGlvbiB0cmlnZ2VyLAogKiBhbG9uZyB3aXRoIG5hbWVkIHN0YXRlcyB0aGF0IHRoZSB0cmFuc2l0aW9ucyBjaGFuZ2UgdG8gYW5kIGZyb20uCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogdHJpZ2dlcigibXlBbmltYXRpb25UcmlnZ2VyIiwgWwogKiAgLy8gZGVmaW5lIHN0YXRlcwogKiAgc3RhdGUoIm9uIiwgc3R5bGUoeyBiYWNrZ3JvdW5kOiAiZ3JlZW4iIH0pKSwKICogIHN0YXRlKCJvZmYiLCBzdHlsZSh7IGJhY2tncm91bmQ6ICJncmV5IiB9KSksCiAqICAuLi5dCiAqIGBgYAogKgogKiBOb3RlIHRoYXQgd2hlbiB5b3UgY2FsbCB0aGUgYHNlcXVlbmNlKClgIGZ1bmN0aW9uIHdpdGhpbiBhIGB7XEBsaW5rIGFuaW1hdGlvbnMvZ3JvdXAgZ3JvdXAoKX1gCiAqIG9yIGEgYHRyYW5zaXRpb24oKWAgY2FsbCwgZXhlY3V0aW9uIGRvZXMgbm90IGNvbnRpbnVlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uCiAqIHVudGlsIGVhY2ggb2YgdGhlIGlubmVyIGFuaW1hdGlvbiBzdGVwcyBoYXZlIGNvbXBsZXRlZC4KICoKICogIyMjIFN5bnRheCBleGFtcGxlcwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGRlZmluZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIHRoZSB0d28gZGVmaW5lZCBzdGF0ZXMgKGFuZCBkZWZhdWx0IHN0YXRlcyksCiAqIHVzaW5nIHZhcmlvdXMgb3B0aW9uczoKICoKICogYGBgdHlwZXNjcmlwdAogKiAvLyBUcmFuc2l0aW9uIG9jY3VycyB3aGVuIHRoZSBzdGF0ZSB2YWx1ZQogKiAvLyBib3VuZCB0byAibXlBbmltYXRpb25UcmlnZ2VyIiBjaGFuZ2VzIGZyb20gIm9uIiB0byAib2ZmIgogKiB0cmFuc2l0aW9uKCJvbiA9PiBvZmYiLCBhbmltYXRlKDUwMCkpCiAqIC8vIFJ1biB0aGUgc2FtZSBhbmltYXRpb24gZm9yIGJvdGggZGlyZWN0aW9ucwogKiB0cmFuc2l0aW9uKCJvbiA8PT4gb2ZmIiwgYW5pbWF0ZSg1MDApKQogKiAvLyBEZWZpbmUgbXVsdGlwbGUgc3RhdGUtY2hhbmdlIHBhaXJzIHNlcGFyYXRlZCBieSBjb21tYXMKICogdHJhbnNpdGlvbigib24gPT4gb2ZmLCBvZmYgPT4gdm9pZCIsIGFuaW1hdGUoNTAwKSkKICogYGBgCiAqCiAqICMjIyBTcGVjaWFsIHZhbHVlcyBmb3Igc3RhdGUtY2hhbmdlIGV4cHJlc3Npb25zCiAqCiAqIC0gQ2F0Y2gtYWxsIHN0YXRlIGNoYW5nZSBmb3Igd2hlbiBhbiBlbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIHBhZ2UgYW5kIHRoZQogKiBkZXN0aW5hdGlvbiBzdGF0ZSBpcyB1bmtub3duOgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIHRyYW5zaXRpb24oInZvaWQgPT4gKiIsIFsKICogIHN0eWxlKHsgb3BhY2l0eTogMCB9KSwKICogIGFuaW1hdGUoNTAwKQogKiAgXSkKICogYGBgCiAqCiAqIC0gQ2FwdHVyZSBhIHN0YXRlIGNoYW5nZSBiZXR3ZWVuIGFueSBzdGF0ZXM6CiAqCiAqICBgdHJhbnNpdGlvbigiKiA9PiAqIiwgYW5pbWF0ZSgiMXMgMHMiKSlgCiAqCiAqIC0gRW50cnkgYW5kIGV4aXQgdHJhbnNpdGlvbnM6CiAqCiAqIGBgYHR5cGVzY3JpcHQKICogdHJhbnNpdGlvbigiOmVudGVyIiwgWwogKiAgIHN0eWxlKHsgb3BhY2l0eTogMCB9KSwKICogICBhbmltYXRlKDUwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKQogKiAgIF0pLAogKiB0cmFuc2l0aW9uKCI6bGVhdmUiLCBbCiAqICAgYW5pbWF0ZSg1MDAsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSkKICogICBdKQogKiBgYGAKICoKICogLSBVc2UgYDppbmNyZW1lbnRgIGFuZCBgOmRlY3JlbWVudGAgdG8gaW5pdGlhdGUgdHJhbnNpdGlvbnM6CiAqCiAqIGBgYHR5cGVzY3JpcHQKICogdHJhbnNpdGlvbigiOmluY3JlbWVudCIsIGdyb3VwKFsKICogIHF1ZXJ5KCc6ZW50ZXInLCBbCiAqICAgICBzdHlsZSh7IGxlZnQ6ICcxMDAlJyB9KSwKICogICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1vdXQnLCBzdHlsZSgnKicpKQogKiAgIF0pLAogKiAgcXVlcnkoJzpsZWF2ZScsIFsKICogICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1vdXQnLCBzdHlsZSh7IGxlZnQ6ICctMTAwJScgfSkpCiAqICBdKQogKiBdKSkKICoKICogdHJhbnNpdGlvbigiOmRlY3JlbWVudCIsIGdyb3VwKFsKICogIHF1ZXJ5KCc6ZW50ZXInLCBbCiAqICAgICBzdHlsZSh7IGxlZnQ6ICcxMDAlJyB9KSwKICogICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1vdXQnLCBzdHlsZSgnKicpKQogKiAgIF0pLAogKiAgcXVlcnkoJzpsZWF2ZScsIFsKICogICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1vdXQnLCBzdHlsZSh7IGxlZnQ6ICctMTAwJScgfSkpCiAqICBdKQogKiBdKSkKICogYGBgCiAqCiAqICMjIyBTdGF0ZS1jaGFuZ2UgZnVuY3Rpb25zCiAqCiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGBmcm9tU3RhdGVgIHNwZWNpZmllZCBhcyBhIHN0YXRlLWNoYW5nZSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYW4KICogYW5pbWF0aW9uIHdoZW4gdHJ1ZToKICoKICogYGBgdHlwZXNjcmlwdAogKiB0cmFuc2l0aW9uKChmcm9tU3RhdGUsIHRvU3RhdGUpID0+CiAqICB7CiAqICAgcmV0dXJuIGZyb21TdGF0ZSA9PSAib2ZmIiAmJiB0b1N0YXRlID09ICJvbiI7CiAqICB9LAogKiAgYW5pbWF0ZSgiMXMgMHMiKSkKICogYGBgCiAqCiAqICMjIyBBbmltYXRpbmcgdG8gdGhlIGZpbmFsIHN0YXRlCiAqCiAqIElmIHRoZSBmaW5hbCBzdGVwIGluIGEgdHJhbnNpdGlvbiBpcyBhIGNhbGwgdG8gYGFuaW1hdGUoKWAgdGhhdCB1c2VzIGEgdGltaW5nIHZhbHVlCiAqIHdpdGggbm8gc3R5bGUgZGF0YSwgdGhhdCBzdGVwIGlzIGF1dG9tYXRpY2FsbHkgY29uc2lkZXJlZCB0aGUgZmluYWwgYW5pbWF0aW9uIGFyYywKICogZm9yIHRoZSBlbGVtZW50IHRvIHJlYWNoIHRoZSBmaW5hbCBzdGF0ZS4gQW5ndWxhciBhdXRvbWF0aWNhbGx5IGFkZHMgb3IgcmVtb3ZlcwogKiBDU1Mgc3R5bGVzIHRvIGVuc3VyZSB0aGF0IHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb3JyZWN0IGZpbmFsIHN0YXRlLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIHRyYW5zaXRpb24gdGhhdCBzdGFydHMgYnkgaGlkaW5nIHRoZSBlbGVtZW50LAogKiB0aGVuIG1ha2VzIHN1cmUgdGhhdCBpdCBhbmltYXRlcyBwcm9wZXJseSB0byB3aGF0ZXZlciBzdGF0ZSBpcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0cmlnZ2VyOgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIHRyYW5zaXRpb24oInZvaWQgPT4gKiIsIFsKICogICBzdHlsZSh7IG9wYWNpdHk6IDAgfSksCiAqICAgYW5pbWF0ZSg1MDApCiAqICBdKQogKiBgYGAKICogIyMjIEJvb2xlYW4gdmFsdWUgbWF0Y2hpbmcKICogSWYgYSB0cmlnZ2VyIGJpbmRpbmcgdmFsdWUgaXMgYSBCb29sZWFuLCBpdCBjYW4gYmUgbWF0Y2hlZCB1c2luZyBhIHRyYW5zaXRpb24gZXhwcmVzc2lvbgogKiB0aGF0IGNvbXBhcmVzIHRydWUgYW5kIGZhbHNlIG9yIDEgYW5kIDAuIEZvciBleGFtcGxlOgogKgogKiBgYGAKICogLy8gaW4gdGhlIHRlbXBsYXRlCiAqIDxkaXYgW1xAb3BlbkNsb3NlXT0ib3BlbiA/IHRydWUgOiBmYWxzZSI+Li4uPC9kaXY+CiAqIC8vIGluIHRoZSBjb21wb25lbnQgbWV0YWRhdGEKICogdHJpZ2dlcignb3BlbkNsb3NlJywgWwogKiAgIHN0YXRlKCd0cnVlJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksCiAqICAgc3RhdGUoJ2ZhbHNlJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnIH0pKSwKICogICB0cmFuc2l0aW9uKCdmYWxzZSA8PT4gdHJ1ZScsIGFuaW1hdGUoNTAwKSkKICogXSkKICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqCiAqIEBwYXJhbSB7P30gc3RhdGVDaGFuZ2VFeHByIEEgQm9vbGVhbiBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50CiAqIGFuaW1hdGlvbiBzdGF0ZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2l0aW9uIHNob3VsZCBvY2N1ci4gTm90ZSB0aGF0ICAidHJ1ZSIgYW5kICJmYWxzZSIKICogbWF0Y2ggMSBhbmQgMCwgcmVzcGVjdGl2ZWx5LiBBbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBlYWNoIHRpbWUgYSBzdGF0ZSBjaGFuZ2Ugb2NjdXJzIGluIHRoZQogKiBhbmltYXRpb24gdHJpZ2dlciBlbGVtZW50LgogKiBUaGUgYW5pbWF0aW9uIHN0ZXBzIHJ1biB3aGVuIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLgogKgogKiAtIEEgc3RhdGUtY2hhbmdlIHN0cmluZyB0YWtlcyB0aGUgZm9ybSAic3RhdGUxID0+IHN0YXRlMiIsIHdoZXJlIGVhY2ggc2lkZSBpcyBhIGRlZmluZWQgYW5pbWF0aW9uCiAqIHN0YXRlLCBvciBhbiBhc3Rlcml4ICgqKSB0byByZWZlciB0byBhIGR5bmFtaWMgc3RhcnQgb3IgZW5kIHN0YXRlLgogKiAgIC0gVGhlIGV4cHJlc3Npb24gc3RyaW5nIGNhbiBjb250YWluIG11bHRpcGxlIGNvbW1hLXNlcGFyYXRlZCBzdGF0ZW1lbnRzOwogKiBmb3IgZXhhbXBsZSAic3RhdGUxID0+IHN0YXRlMiwgc3RhdGUzID0+IHN0YXRlNCIuCiAqICAgLSBTcGVjaWFsIHZhbHVlcyBgOmVudGVyYCBhbmQgYDpsZWF2ZWAgaW5pdGlhdGUgYSB0cmFuc2l0aW9uIG9uIHRoZSBlbnRyeSBhbmQgZXhpdCBzdGF0ZXMsCiAqIGVxdWl2YWxlbnQgdG8gICJ2b2lkID0+ICoiICBhbmQgIiogPT4gdm9pZCIuCiAqICAgLSBTcGVjaWFsIHZhbHVlcyBgOmluY3JlbWVudGAgYW5kIGA6ZGVjcmVtZW50YCBpbml0aWF0ZSBhIHRyYW5zaXRpb24gd2hlbiBhIG51bWVyaWMgdmFsdWUgaGFzCiAqIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgaW4gdmFsdWUuCiAqIC0gQSBmdW5jdGlvbiBpcyBleGVjdXRlZCBlYWNoIHRpbWUgYSBzdGF0ZSBjaGFuZ2Ugb2NjdXJzIGluIHRoZSBhbmltYXRpb24gdHJpZ2dlciBlbGVtZW50LgogKiBUaGUgYW5pbWF0aW9uIHN0ZXBzIHJ1biB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUuCiAqCiAqIEBwYXJhbSB7P30gc3RlcHMgT25lIG9yIG1vcmUgYW5pbWF0aW9uIG9iamVjdHMsIGFzIHJldHVybmVkIGJ5IHRoZSBgYW5pbWF0ZSgpYCBvcgogKiBgc2VxdWVuY2UoKWAgZnVuY3Rpb24sIHRoYXQgZm9ybSBhIHRyYW5zZm9ybWF0aW9uIGZyb20gb25lIHN0YXRlIHRvIGFub3RoZXIuCiAqIEEgc2VxdWVuY2UgaXMgdXNlZCBieSBkZWZhdWx0IHdoZW4geW91IHBhc3MgYW4gYXJyYXkuCiAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QgdGhhdCBjYW4gY29udGFpbiBhIGRlbGF5IHZhbHVlIGZvciB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvbiwKICogYW5kIGFkZGl0aW9uYWwgZGV2ZWxvcGVyLWRlZmluZWQgcGFyYW1ldGVycy4gUHJvdmlkZWQgdmFsdWVzIGZvciBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQKICogYXMgZGVmYXVsdHMsIGFuZCBvdmVycmlkZSB2YWx1ZXMgY2FuIGJlIHBhc3NlZCB0byB0aGUgY2FsbGVyIG9uIGludm9jYXRpb24uCiAqIEByZXR1cm4gez99IEFuIG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgdHJhbnNpdGlvbiBkYXRhLgogKgogKi8KZnVuY3Rpb24gdHJhbnNpdGlvbihzdGF0ZUNoYW5nZUV4cHIsIHN0ZXBzLCBvcHRpb25zID0gbnVsbCkgewogICAgcmV0dXJuIHsgdHlwZTogMSAvKiBUcmFuc2l0aW9uICovLCBleHByOiBzdGF0ZUNoYW5nZUV4cHIsIGFuaW1hdGlvbjogc3RlcHMsIG9wdGlvbnMgfTsKfQovKioKICogRXhlY3V0ZXMgYSBxdWVyaWVkIGlubmVyIGFuaW1hdGlvbiBlbGVtZW50IHdpdGhpbiBhbiBhbmltYXRpb24gc2VxdWVuY2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBFYWNoIHRpbWUgYW4gYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBpbiBBbmd1bGFyLCB0aGUgcGFyZW50IGFuaW1hdGlvbgogKiBoYXMgcHJpb3JpdHkgYW5kIGFueSBjaGlsZCBhbmltYXRpb25zIGFyZSBibG9ja2VkLiBJbiBvcmRlcgogKiBmb3IgYSBjaGlsZCBhbmltYXRpb24gdG8gcnVuLCB0aGUgcGFyZW50IGFuaW1hdGlvbiBtdXN0IHF1ZXJ5IGVhY2ggb2YgdGhlIGVsZW1lbnRzCiAqIGNvbnRhaW5pbmcgY2hpbGQgYW5pbWF0aW9ucywgYW5kIHJ1biB0aGVtIHVzaW5nIHRoaXMgZnVuY3Rpb24uCiAqCiAqIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIGBxdWVyeSgpYCBhbmQgaXQgd2lsbCBvbmx5IHdvcmsKICogd2l0aCBhbmltYXRpb25zIHRoYXQgYXJlIGFzc2lnbmVkIHVzaW5nIHRoZSBBbmd1bGFyIGFuaW1hdGlvbiBsaWJyYXJ5LiBDU1Mga2V5ZnJhbWVzCiAqIGFuZCB0cmFuc2l0aW9ucyBhcmUgbm90IGhhbmRsZWQgYnkgdGhpcyBBUEkuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QgdGhhdCBjYW4gY29udGFpbiBhIGRlbGF5IHZhbHVlIGZvciB0aGUgc3RhcnQgb2YgdGhlCiAqIGFuaW1hdGlvbiwgYW5kIGFkZGl0aW9uYWwgb3ZlcnJpZGUgdmFsdWVzIGZvciBkZXZlbG9wZXItZGVmaW5lZCBwYXJhbWV0ZXJzLgogKiBAcmV0dXJuIHs/fSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGNoaWxkIGFuaW1hdGlvbiBkYXRhLgogKgogKi8KZnVuY3Rpb24gYW5pbWF0ZUNoaWxkKG9wdGlvbnMgPSBudWxsKSB7CiAgICByZXR1cm4geyB0eXBlOiA5IC8qIEFuaW1hdGVDaGlsZCAqLywgb3B0aW9ucyB9Owp9Ci8qKgogKiBGaW5kcyBvbmUgb3IgbW9yZSBpbm5lciBlbGVtZW50cyB3aXRoaW4gdGhlIGN1cnJlbnQgZWxlbWVudCB0aGF0IGlzCiAqIGJlaW5nIGFuaW1hdGVkIHdpdGhpbiBhIHNlcXVlbmNlLiBVc2Ugd2l0aCBgYW5pbWF0ZSgpYC4KICoKICogXEB1c2FnZU5vdGVzCiAqIFRva2VucyBjYW4gYmUgbWVyZ2VkIGludG8gYSBjb21iaW5lZCBxdWVyeSBzZWxlY3RvciBzdHJpbmcuIEZvciBleGFtcGxlOgogKgogKiBgYGB0eXBlc2NyaXB0CiAqICBxdWVyeSgnOnNlbGYsIC5yZWNvcmQ6ZW50ZXIsIC5yZWNvcmQ6bGVhdmUsIFxAc3ViVHJpZ2dlcicsIFsuLi5dKQogKiBgYGAKICoKICogVGhlIGBxdWVyeSgpYCBmdW5jdGlvbiBjb2xsZWN0cyBtdWx0aXBsZSBlbGVtZW50cyBhbmQgd29ya3MgaW50ZXJuYWxseSBieSB1c2luZwogKiBgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsYC4gVXNlIHRoZSBgbGltaXRgIGZpZWxkIG9mIGFuIG9wdGlvbnMgb2JqZWN0IHRvIGxpbWl0CiAqIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY29sbGVjdGVkLiBGb3IgZXhhbXBsZToKICoKICogYGBganMKICogcXVlcnkoJ2RpdicsIFsKICogICBhbmltYXRlKC4uLiksCiAqICAgYW5pbWF0ZSguLi4pCiAqIF0sIHsgbGltaXQ6IDEgfSkKICogYGBgCiAqCiAqIEJ5IGRlZmF1bHQsIHRocm93cyBhbiBlcnJvciB3aGVuIHplcm8gaXRlbXMgYXJlIGZvdW5kLiBTZXQgdGhlCiAqIGBvcHRpb25hbGAgZmxhZyB0byBpZ25vcmUgdGhpcyBlcnJvci4gRm9yIGV4YW1wbGU6CiAqCiAqIGBgYGpzCiAqIHF1ZXJ5KCcuc29tZS1lbGVtZW50LXRoYXQtbWF5LW5vdC1iZS10aGVyZScsIFsKICogICBhbmltYXRlKC4uLiksCiAqICAgYW5pbWF0ZSguLi4pCiAqIF0sIHsgb3B0aW9uYWw6IHRydWUgfSkKICogYGBgCiAqCiAqICMjIyBVc2FnZSBFeGFtcGxlCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBxdWVyaWVzIGZvciBpbm5lciBlbGVtZW50cyBhbmQgYW5pbWF0ZXMgdGhlbQogKiBpbmRpdmlkdWFsbHkgdXNpbmcgYGFuaW1hdGUoKWAuCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogXEBDb21wb25lbnQoewogKiAgIHNlbGVjdG9yOiAnaW5uZXInLAogKiAgIHRlbXBsYXRlOiBgCiAqICAgICA8ZGl2IFtcQHF1ZXJ5QW5pbWF0aW9uXT0iZXhwIj4KICogICAgICAgPGgxPlRpdGxlPC9oMT4KICogICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAqICAgICAgICAgQmxhaCBibGFoIGJsYWgKICogICAgICAgPC9kaXY+CiAqICAgICA8L2Rpdj4KICogICBgLAogKiAgIGFuaW1hdGlvbnM6IFsKICogICAgdHJpZ2dlcigncXVlcnlBbmltYXRpb24nLCBbCiAqICAgICAgdHJhbnNpdGlvbignKiA9PiBnb0FuaW1hdGUnLCBbCiAqICAgICAgICAvLyBoaWRlIHRoZSBpbm5lciBlbGVtZW50cwogKiAgICAgICAgcXVlcnkoJ2gxJywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKSwKICogICAgICAgIHF1ZXJ5KCcuY29udGVudCcsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSksCiAqCiAqICAgICAgICAvLyBhbmltYXRlIHRoZSBpbm5lciBlbGVtZW50cyBpbiwgb25lIGJ5IG9uZQogKiAgICAgICAgcXVlcnkoJ2gxJywgYW5pbWF0ZSgxMDAwLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpKSwKICogICAgICAgIHF1ZXJ5KCcuY29udGVudCcsIGFuaW1hdGUoMTAwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKSksCiAqICAgICAgXSkKICogICAgXSkKICogIF0KICogfSkKICogY2xhc3MgQ21wIHsKICogICBleHAgPSAnJzsKICoKICogICBnb0FuaW1hdGUoKSB7CiAqICAgICB0aGlzLmV4cCA9ICdnb0FuaW1hdGUnOwogKiAgIH0KICogfQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBzZWxlY3RvciBUaGUgZWxlbWVudCB0byBxdWVyeSwgb3IgYSBzZXQgb2YgZWxlbWVudHMgdGhhdCBjb250YWluIEFuZ3VsYXItc3BlY2lmaWMKICogY2hhcmFjdGVyaXN0aWNzLCBzcGVjaWZpZWQgd2l0aCBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHRva2Vucy4KICogIC0gYHF1ZXJ5KCI6ZW50ZXIiKWAgb3IgYHF1ZXJ5KCI6bGVhdmUiKWAgOiBRdWVyeSBmb3IgbmV3bHkgaW5zZXJ0ZWQvcmVtb3ZlZCBlbGVtZW50cy4KICogIC0gYHF1ZXJ5KCI6YW5pbWF0aW5nIilgIDogUXVlcnkgYWxsIGN1cnJlbnRseSBhbmltYXRpbmcgZWxlbWVudHMuCiAqICAtIGBxdWVyeSgiXEB0cmlnZ2VyTmFtZSIpYCA6IFF1ZXJ5IGVsZW1lbnRzIHRoYXQgY29udGFpbiBhbiBhbmltYXRpb24gdHJpZ2dlci4KICogIC0gYHF1ZXJ5KCJcQCoiKWAgOiBRdWVyeSBhbGwgZWxlbWVudHMgdGhhdCBjb250YWluIGFuIGFuaW1hdGlvbiB0cmlnZ2Vycy4KICogIC0gYHF1ZXJ5KCI6c2VsZiIpYCA6IEluY2x1ZGUgdGhlIGN1cnJlbnQgZWxlbWVudCBpbnRvIHRoZSBhbmltYXRpb24gc2VxdWVuY2UuCiAqCiAqIEBwYXJhbSB7P30gYW5pbWF0aW9uIE9uZSBvciBtb3JlIGFuaW1hdGlvbiBzdGVwcyB0byBhcHBseSB0byB0aGUgcXVlcmllZCBlbGVtZW50IG9yIGVsZW1lbnRzLgogKiBBbiBhcnJheSBpcyB0cmVhdGVkIGFzIGFuIGFuaW1hdGlvbiBzZXF1ZW5jZS4KICogQHBhcmFtIHs/PX0gb3B0aW9ucyBBbiBvcHRpb25zIG9iamVjdC4gVXNlIHRoZSAnbGltaXQnIGZpZWxkIHRvIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YKICogaXRlbXMgdG8gY29sbGVjdC4KICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBxdWVyeSBkYXRhLgogKgogKi8KZnVuY3Rpb24gcXVlcnkoc2VsZWN0b3IsIGFuaW1hdGlvbiwgb3B0aW9ucyA9IG51bGwpIHsKICAgIHJldHVybiB7IHR5cGU6IDExIC8qIFF1ZXJ5ICovLCBzZWxlY3RvciwgYW5pbWF0aW9uLCBvcHRpb25zIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvc3JjL3V0aWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqIEBwYXJhbSB7P30gY2IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNjaGVkdWxlTWljcm9UYXNrJDEoY2IpIHsKICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGNiKTsKfQovKioKICogQW4gZW1wdHkgcHJvZ3JhbW1hdGljIGNvbnRyb2xsZXIgZm9yIHJldXNhYmxlIGFuaW1hdGlvbnMuCiAqIFVzZWQgaW50ZXJuYWxseSB3aGVuIGFuaW1hdGlvbnMgYXJlIGRpc2FibGVkLCB0byBhdm9pZAogKiBjaGVja2luZyBmb3IgdGhlIG51bGwgY2FzZSB3aGVuIGFuIGFuaW1hdGlvbiBwbGF5ZXIgaXMgZXhwZWN0ZWQuCiAqCiAqIEBzZWUgYGFuaW1hdGUoKWAKICogQHNlZSBgQW5pbWF0aW9uUGxheWVyYAogKiBAc2VlIGBHcm91cFBsYXllcmAKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5vb3BBbmltYXRpb25QbGF5ZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBkdXJhdGlvbgogICAgICogQHBhcmFtIHs/PX0gZGVsYXkKICAgICAqLwogICAgY29uc3RydWN0b3IoZHVyYXRpb24gPSAwLCBkZWxheSA9IDApIHsKICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTsKICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zID0gW107CiAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zID0gW107CiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5wYXJlbnRQbGF5ZXIgPSBudWxsOwogICAgICAgIHRoaXMudG90YWxUaW1lID0gZHVyYXRpb24gKyBkZWxheTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbkZpbmlzaCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25TdGFydChmbikgewogICAgICAgIHRoaXMuX29uU3RhcnRGbnMucHVzaChmbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRG9uZShmbikgewogICAgICAgIHRoaXMuX29uRG9uZUZucy5wdXNoKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25EZXN0cm95KGZuKSB7CiAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLnB1c2goZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBoYXNTdGFydGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbml0KCkgeyB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBsYXkoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWQoKSkgewogICAgICAgICAgICB0aGlzLl9vblN0YXJ0KCk7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlck1pY3JvdGFzaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJpZ2dlck1pY3JvdGFzaygpIHsKICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayQxKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuX29uRmluaXNoKCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vblN0YXJ0KCkgewogICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGF1c2UoKSB7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzdGFydCgpIHsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5pc2goKSB7CiAgICAgICAgdGhpcy5fb25GaW5pc2goKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAoIXRoaXMuaGFzU3RhcnRlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vblN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5maW5pc2goKTsKICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveUZucyA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQoKSB7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0UG9zaXRpb24ocG9zaXRpb24pIHsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRQb3NpdGlvbigpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBwaGFzZU5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyaWdnZXJDYWxsYmFjayhwaGFzZU5hbWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0aG9kcyA9IHBoYXNlTmFtZSA9PSAnc3RhcnQnID8gdGhpcy5fb25TdGFydEZucyA6IHRoaXMuX29uRG9uZUZuczsKICAgICAgICBtZXRob2RzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICBtZXRob2RzLmxlbmd0aCA9IDA7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvc3JjL3BsYXllcnMvYW5pbWF0aW9uX2dyb3VwX3BsYXllci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBwcm9ncmFtbWF0aWMgY29udHJvbGxlciBmb3IgYSBncm91cCBvZiByZXVzYWJsZSBhbmltYXRpb25zLgogKiBVc2VkIGludGVybmFsbHkgdG8gY29udHJvbCBhbmltYXRpb25zLgogKgogKiBAc2VlIGBBbmltYXRpb25QbGF5ZXJgCiAqIEBzZWUgYHtcQGxpbmsgYW5pbWF0aW9ucy9ncm91cCBncm91cCgpfWAKICoKICovCmNsYXNzIEFuaW1hdGlvbkdyb3VwUGxheWVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcGxheWVycwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcGxheWVycykgewogICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTsKICAgICAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMgPSBbXTsKICAgICAgICB0aGlzLnBhcmVudFBsYXllciA9IG51bGw7CiAgICAgICAgdGhpcy50b3RhbFRpbWUgPSAwOwogICAgICAgIHRoaXMucGxheWVycyA9IF9wbGF5ZXJzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZG9uZUNvdW50ID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRlc3Ryb3lDb3VudCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdGFydENvdW50ID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnBsYXllcnMubGVuZ3RoOwogICAgICAgIGlmICh0b3RhbCA9PSAwKSB7CiAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrJDEoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fb25GaW5pc2goKSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIHBsYXllci5vbkRvbmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICgrK2RvbmVDb3VudCA9PSB0b3RhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkZpbmlzaCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHBsYXllci5vbkRlc3Ryb3koKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICgrK2Rlc3Ryb3lDb3VudCA9PSB0b3RhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBwbGF5ZXIub25TdGFydCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCsrc3RhcnRDb3VudCA9PSB0b3RhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHRoaXMudG90YWxUaW1lID0gdGhpcy5wbGF5ZXJzLnJlZHVjZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0aW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0aW1lLCBwbGF5ZXIpID0+IE1hdGgubWF4KHRpbWUsIHBsYXllci50b3RhbFRpbWUpKSwgMCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25GaW5pc2goKSB7CiAgICAgICAgaWYgKCF0aGlzLl9maW5pc2hlZCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGluaXQoKSB7CiAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5ZXIgPT4gcGxheWVyLmluaXQoKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblN0YXJ0KGZuKSB7CiAgICAgICAgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vblN0YXJ0KCkgewogICAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Eb25lKGZuKSB7CiAgICAgICAgdGhpcy5fb25Eb25lRm5zLnB1c2goZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koZm4pIHsKICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaChmbik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBsYXkoKSB7CiAgICAgICAgaWYgKCF0aGlzLnBhcmVudFBsYXllcikgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb25TdGFydCgpOwogICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheWVyID0+IHBsYXllci5wbGF5KCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGF1c2UoKSB7CiAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5ZXIgPT4gcGxheWVyLnBhdXNlKCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzdGFydCgpIHsKICAgICAgICB0aGlzLnBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXllciA9PiBwbGF5ZXIucmVzdGFydCgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmlzaCgpIHsKICAgICAgICB0aGlzLl9vbkZpbmlzaCgpOwogICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheWVyID0+IHBsYXllci5maW5pc2goKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuX29uRGVzdHJveSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uRGVzdHJveSgpIHsKICAgICAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9vbkZpbmlzaCgpOwogICAgICAgICAgICB0aGlzLnBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gcGxheWVyLmRlc3Ryb3koKSkpOwogICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zID0gW107CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNldCgpIHsKICAgICAgICB0aGlzLnBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXllciA9PiBwbGF5ZXIucmVzZXQoKSkpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFBvc2l0aW9uKHApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGltZUF0UG9zaXRpb24gPSBwICogdGhpcy50b3RhbFRpbWU7CiAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcGxheWVyLnRvdGFsVGltZSA/IE1hdGgubWluKDEsIHRpbWVBdFBvc2l0aW9uIC8gcGxheWVyLnRvdGFsVGltZSkgOiAxOwogICAgICAgICAgICBwbGF5ZXIuc2V0UG9zaXRpb24ocG9zaXRpb24pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UG9zaXRpb24oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtaW4gPSAwOwogICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwID0gcGxheWVyLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKHAsIG1pbik7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBtaW47CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJlZm9yZURlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICBpZiAocGxheWVyLmJlZm9yZURlc3Ryb3kpIHsKICAgICAgICAgICAgICAgIHBsYXllci5iZWZvcmVEZXN0cm95KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcGhhc2VOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmlnZ2VyQ2FsbGJhY2socGhhc2VOYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1ldGhvZHMgPSBwaGFzZU5hbWUgPT0gJ3N0YXJ0JyA/IHRoaXMuX29uU3RhcnRGbnMgOiB0aGlzLl9vbkRvbmVGbnM7CiAgICAgICAgbWV0aG9kcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgbWV0aG9kcy5sZW5ndGggPSAwOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL3NyYy9wcml2YXRlX2V4cG9ydC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IMm1UFJFX1NUWUxFID0gJyEnOwoKLyoqCiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjkuMS4yCiAqIChjKSAyMDEwLTIwMjAgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvLwogKiBMaWNlbnNlOiBNSVQKICovCmZ1bmN0aW9uIGlzQnJvd3NlcigpIHsKICAgIHJldHVybiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNOb2RlKCkgewogICAgLy8gQ2hlY2tpbmcgb25seSBmb3IgYHByb2Nlc3NgIGlzbid0IGVub3VnaCB0byBpZGVudGlmeSB3aGV0aGVyIG9yIG5vdCB3ZSdyZSBpbiBhIE5vZGUKICAgIC8vIGVudmlyb25tZW50LCBiZWNhdXNlIFdlYnBhY2sgYnkgZGVmYXVsdCB3aWxsIHBvbHlmaWxsIHRoZSBgcHJvY2Vzc2AuIFdoaWxlIHdlIGNhbiBkaXNjZXJuCiAgICAvLyB0aGF0IFdlYnBhY2sgcG9seWZpbGxlZCBpdCBieSBsb29raW5nIGF0IGBwcm9jZXNzLmJyb3dzZXJgLCBpdCdzIHZlcnkgV2VicGFjay1zcGVjaWZpYyBhbmQKICAgIC8vIG1pZ2h0IG5vdCBiZSBmdXR1cmUtcHJvb2YuIEluc3RlYWQgd2UgbG9vayBhdCB0aGUgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiBgcHJvY2Vzc2Agd2hpY2gKICAgIC8vIGlzIGBbb2JqZWN0IHByb2Nlc3NdYCBpbiBOb2RlIGFuZCBgW29iamVjdCBPYmplY3RdYCB3aGVuIHBvbHlmaWxsZWQuCiAgICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJzsKfQovKioKICogQHBhcmFtIHs/fSBwbGF5ZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBvcHRpbWl6ZUdyb3VwUGxheWVyKHBsYXllcnMpIHsKICAgIHN3aXRjaCAocGxheWVycy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiBuZXcgTm9vcEFuaW1hdGlvblBsYXllcigpOwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuIHBsYXllcnNbMF07CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25Hcm91cFBsYXllcihwbGF5ZXJzKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBkcml2ZXIKICogQHBhcmFtIHs/fSBub3JtYWxpemVyCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IGtleWZyYW1lcwogKiBAcGFyYW0gez89fSBwcmVTdHlsZXMKICogQHBhcmFtIHs/PX0gcG9zdFN0eWxlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9ybWFsaXplS2V5ZnJhbWVzKGRyaXZlciwgbm9ybWFsaXplciwgZWxlbWVudCwga2V5ZnJhbWVzLCBwcmVTdHlsZXMgPSB7fSwgcG9zdFN0eWxlcyA9IHt9KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXlmcmFtZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2aW91c09mZnNldCA9IC0xOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByZXZpb3VzS2V5ZnJhbWUgPSBudWxsOwogICAga2V5ZnJhbWVzLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBrZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAga2YgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvZmZzZXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoa2ZbJ29mZnNldCddKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzU2FtZU9mZnNldCA9IG9mZnNldCA9PSBwcmV2aW91c09mZnNldDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEtleWZyYW1lID0gKGlzU2FtZU9mZnNldCAmJiBwcmV2aW91c0tleWZyYW1lKSB8fCB7fTsKICAgICAgICBPYmplY3Qua2V5cyhrZikuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbm9ybWFsaXplZFByb3AgPSBwcm9wOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBub3JtYWxpemVkVmFsdWUgPSBrZltwcm9wXTsKICAgICAgICAgICAgaWYgKHByb3AgIT09ICdvZmZzZXQnKSB7CiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZXIubm9ybWFsaXplUHJvcGVydHlOYW1lKG5vcm1hbGl6ZWRQcm9wLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgc3dpdGNoIChub3JtYWxpemVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIMm1UFJFX1NUWUxFOgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBwcmVTdHlsZXNbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUT19TVFlMRToKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlID0gcG9zdFN0eWxlc1twcm9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZXIubm9ybWFsaXplU3R5bGVWYWx1ZShwcm9wLCBub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBub3JtYWxpemVkS2V5ZnJhbWVbbm9ybWFsaXplZFByb3BdID0gbm9ybWFsaXplZFZhbHVlOwogICAgICAgIH0pKTsKICAgICAgICBpZiAoIWlzU2FtZU9mZnNldCkgewogICAgICAgICAgICBub3JtYWxpemVkS2V5ZnJhbWVzLnB1c2gobm9ybWFsaXplZEtleWZyYW1lKTsKICAgICAgICB9CiAgICAgICAgcHJldmlvdXNLZXlmcmFtZSA9IG5vcm1hbGl6ZWRLZXlmcmFtZTsKICAgICAgICBwcmV2aW91c09mZnNldCA9IG9mZnNldDsKICAgIH0pKTsKICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IExJTkVfU1RBUlQgPSAnXG4gLSAnOwogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGFuaW1hdGUgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiR7TElORV9TVEFSVH0ke2Vycm9ycy5qb2luKExJTkVfU1RBUlQpfWApOwogICAgfQogICAgcmV0dXJuIG5vcm1hbGl6ZWRLZXlmcmFtZXM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGxheWVyCiAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAqIEBwYXJhbSB7P30gZXZlbnQKICogQHBhcmFtIHs/fSBjYWxsYmFjawogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbGlzdGVuT25QbGF5ZXIocGxheWVyLCBldmVudE5hbWUsIGV2ZW50LCBjYWxsYmFjaykgewogICAgc3dpdGNoIChldmVudE5hbWUpIHsKICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgIHBsYXllci5vblN0YXJ0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IGNhbGxiYWNrKGV2ZW50ICYmIGNvcHlBbmltYXRpb25FdmVudChldmVudCwgJ3N0YXJ0JywgcGxheWVyKSkpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZG9uZSc6CiAgICAgICAgICAgIHBsYXllci5vbkRvbmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gY2FsbGJhY2soZXZlbnQgJiYgY29weUFuaW1hdGlvbkV2ZW50KGV2ZW50LCAnZG9uZScsIHBsYXllcikpKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2Rlc3Ryb3knOgogICAgICAgICAgICBwbGF5ZXIub25EZXN0cm95KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IGNhbGxiYWNrKGV2ZW50ICYmIGNvcHlBbmltYXRpb25FdmVudChldmVudCwgJ2Rlc3Ryb3knLCBwbGF5ZXIpKSkpOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBlCiAqIEBwYXJhbSB7P30gcGhhc2VOYW1lCiAqIEBwYXJhbSB7P30gcGxheWVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb3B5QW5pbWF0aW9uRXZlbnQoZSwgcGhhc2VOYW1lLCBwbGF5ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRvdGFsVGltZSA9IHBsYXllci50b3RhbFRpbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaXNhYmxlZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAocGxheWVyKSkpLmRpc2FibGVkID8gdHJ1ZSA6IGZhbHNlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXZlbnQgPSBtYWtlQW5pbWF0aW9uRXZlbnQoZS5lbGVtZW50LCBlLnRyaWdnZXJOYW1lLCBlLmZyb21TdGF0ZSwgZS50b1N0YXRlLCBwaGFzZU5hbWUgfHwgZS5waGFzZU5hbWUsIHRvdGFsVGltZSA9PSB1bmRlZmluZWQgPyBlLnRvdGFsVGltZSA6IHRvdGFsVGltZSwgZGlzYWJsZWQpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0YSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZSkpKVsnX2RhdGEnXTsKICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50KSkpWydfZGF0YSddID0gZGF0YTsKICAgIH0KICAgIHJldHVybiBldmVudDsKfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICogQHBhcmFtIHs/fSB0b1N0YXRlCiAqIEBwYXJhbSB7Pz19IHBoYXNlTmFtZQogKiBAcGFyYW0gez89fSB0b3RhbFRpbWUKICogQHBhcmFtIHs/PX0gZGlzYWJsZWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1ha2VBbmltYXRpb25FdmVudChlbGVtZW50LCB0cmlnZ2VyTmFtZSwgZnJvbVN0YXRlLCB0b1N0YXRlLCBwaGFzZU5hbWUgPSAnJywgdG90YWxUaW1lID0gMCwgZGlzYWJsZWQpIHsKICAgIHJldHVybiB7IGVsZW1lbnQsIHRyaWdnZXJOYW1lLCBmcm9tU3RhdGUsIHRvU3RhdGUsIHBoYXNlTmFtZSwgdG90YWxUaW1lLCBkaXNhYmxlZDogISFkaXNhYmxlZCB9Owp9Ci8qKgogKiBAcGFyYW0gez99IG1hcAogKiBAcGFyYW0gez99IGtleQogKiBAcGFyYW0gez99IGRlZmF1bHRWYWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0T3JTZXRBc0luTWFwKG1hcCwga2V5LCBkZWZhdWx0VmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2YWx1ZTsKICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHsKICAgICAgICB2YWx1ZSA9IG1hcC5nZXQoa2V5KTsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSA9IGRlZmF1bHRWYWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdmFsdWUgPSBtYXBba2V5XTsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIHZhbHVlID0gbWFwW2tleV0gPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbW1hbmQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlVGltZWxpbmVDb21tYW5kKGNvbW1hbmQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNlcGFyYXRvclBvcyA9IGNvbW1hbmQuaW5kZXhPZignOicpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaWQgPSBjb21tYW5kLnN1YnN0cmluZygxLCBzZXBhcmF0b3JQb3MpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWN0aW9uID0gY29tbWFuZC5zdWJzdHIoc2VwYXJhdG9yUG9zICsgMSk7CiAgICByZXR1cm4gW2lkLCBhY3Rpb25dOwp9Ci8qKiBAdHlwZSB7P30gKi8KbGV0IF9jb250YWlucyA9ICgvKioKICogQHBhcmFtIHs/fSBlbG0xCiAqIEBwYXJhbSB7P30gZWxtMgogKiBAcmV0dXJuIHs/fQogKi8KKGVsbTEsIGVsbTIpID0+IGZhbHNlKTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgX21hdGNoZXMgPSAoLyoqCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IHNlbGVjdG9yCiAqIEByZXR1cm4gez99CiAqLwooZWxlbWVudCwgc2VsZWN0b3IpID0+IGZhbHNlKTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgX3F1ZXJ5ID0gKC8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBzZWxlY3RvcgogKiBAcGFyYW0gez99IG11bHRpCiAqIEByZXR1cm4gez99CiAqLwooZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKSA9PiB7CiAgICByZXR1cm4gW107Cn0pOwovLyBEZWZpbmUgdXRpbGl0eSBtZXRob2RzIGZvciBicm93c2VycyBhbmQgcGxhdGZvcm0tc2VydmVyKGRvbWlubykgd2hlcmUgRWxlbWVudAovLyBhbmQgdXRpbGl0eSBtZXRob2RzIGV4aXN0LgovKiogQHR5cGUgez99ICovCmNvbnN0IF9pc05vZGUgPSBpc05vZGUoKTsKaWYgKF9pc05vZGUgfHwgdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyB0aGlzIGlzIHdlbGwgc3VwcG9ydGVkIGluIGFsbCBicm93c2VycwogICAgX2NvbnRhaW5zID0gKC8qKgogICAgICogQHBhcmFtIHs/fSBlbG0xCiAgICAgKiBAcGFyYW0gez99IGVsbTIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChlbG0xLCBlbG0yKSA9PiB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChlbG0xLmNvbnRhaW5zKGVsbTIpKSk7CiAgICB9KTsKICAgIF9tYXRjaGVzID0gKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICBpZiAoX2lzTm9kZSB8fCBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZWxlbWVudCwgc2VsZWN0b3IpID0+IGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm90byA9ICgvKiogQHR5cGUgez99ICovIChFbGVtZW50LnByb3RvdHlwZSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZuID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8IHByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fCBwcm90by5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fCBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7CiAgICAgICAgICAgIGlmIChmbikgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiBmbi5hcHBseShlbGVtZW50LCBbc2VsZWN0b3JdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX21hdGNoZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KSkoKTsKICAgIF9xdWVyeSA9ICgvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHBhcmFtIHs/fSBtdWx0aQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdOwogICAgICAgIGlmIChtdWx0aSkgewogICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsbSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgICAgIGlmIChlbG0pIHsKICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbG0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udGFpbnNWZW5kb3JQcmVmaXgocHJvcCkgewogICAgLy8gV2Via2l0IGlzIHRoZSBvbmx5IHJlYWwgcG9wdWxhciB2ZW5kb3IgcHJlZml4IG5vd2FkYXlzCiAgICAvLyBjYzogaHR0cDovL3Nob3VsZGlwcmVmaXguY29tLwogICAgcmV0dXJuIHByb3Auc3Vic3RyaW5nKDEsIDYpID09ICdlYmtpdCc7IC8vIHdlYmtpdCBvciBXZWJraXQKfQovKiogQHR5cGUgez99ICovCmxldCBfQ0FDSEVEX0JPRFkgPSBudWxsOwovKiogQHR5cGUgez99ICovCmxldCBfSVNfV0VCS0lUID0gZmFsc2U7Ci8qKgogKiBAcGFyYW0gez99IHByb3AKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKSB7CiAgICBpZiAoIV9DQUNIRURfQk9EWSkgewogICAgICAgIF9DQUNIRURfQk9EWSA9IGdldEJvZHlOb2RlKCkgfHwge307CiAgICAgICAgX0lTX1dFQktJVCA9ICgvKiogQHR5cGUgez99ICovIChfQ0FDSEVEX0JPRFkpKS5zdHlsZSA/ICgnV2Via2l0QXBwZWFyYW5jZScgaW4gKC8qKiBAdHlwZSB7P30gKi8gKF9DQUNIRURfQk9EWSkpLnN0eWxlKSA6IGZhbHNlOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHJlc3VsdCA9IHRydWU7CiAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKF9DQUNIRURfQk9EWSkpLnN0eWxlICYmICFjb250YWluc1ZlbmRvclByZWZpeChwcm9wKSkgewogICAgICAgIHJlc3VsdCA9IHByb3AgaW4gKC8qKiBAdHlwZSB7P30gKi8gKF9DQUNIRURfQk9EWSkpLnN0eWxlOwogICAgICAgIGlmICghcmVzdWx0ICYmIF9JU19XRUJLSVQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYW1lbFByb3AgPSAnV2Via2l0JyArIHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnN1YnN0cigxKTsKICAgICAgICAgICAgcmVzdWx0ID0gY2FtZWxQcm9wIGluICgvKiogQHR5cGUgez99ICovIChfQ0FDSEVEX0JPRFkpKS5zdHlsZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Qm9keU5vZGUoKSB7CiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IG1hdGNoZXNFbGVtZW50ID0gX21hdGNoZXM7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgY29udGFpbnNFbGVtZW50ID0gX2NvbnRhaW5zOwovKiogQHR5cGUgez99ICovCmNvbnN0IGludm9rZVF1ZXJ5ID0gX3F1ZXJ5OwovKioKICogQHBhcmFtIHs/fSBvYmplY3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGh5cGVuYXRlUHJvcHNPYmplY3Qob2JqZWN0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdPYmogPSB7fTsKICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHByb3AgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdQcm9wID0gcHJvcC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKTsKICAgICAgICBuZXdPYmpbbmV3UHJvcF0gPSBvYmplY3RbcHJvcF07CiAgICB9KSk7CiAgICByZXR1cm4gbmV3T2JqOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci9hbmltYXRpb25fZHJpdmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTm9vcEFuaW1hdGlvbkRyaXZlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmFsaWRhdGVTdHlsZVByb3BlcnR5KHByb3ApIHsKICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHlsZVByb3BlcnR5KHByb3ApOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1hdGNoZXNFbGVtZW50KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG1hdGNoZXNFbGVtZW50KGVsZW1lbnQsIHNlbGVjdG9yKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbG0xCiAgICAgKiBAcGFyYW0gez99IGVsbTIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNvbnRhaW5zRWxlbWVudChlbG0xLCBlbG0yKSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zRWxlbWVudChlbG0xLCBlbG0yKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgKiBAcGFyYW0gez99IG11bHRpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBxdWVyeShlbGVtZW50LCBzZWxlY3RvciwgbXVsdGkpIHsKICAgICAgICByZXR1cm4gaW52b2tlUXVlcnkoZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY29tcHV0ZVN0eWxlKGVsZW1lbnQsIHByb3AsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgJyc7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAqIEBwYXJhbSB7P30gZGVsYXkKICAgICAqIEBwYXJhbSB7P30gZWFzaW5nCiAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnMKICAgICAqIEBwYXJhbSB7Pz19IHNjcnViYmVyQWNjZXNzUmVxdWVzdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhbmltYXRlKGVsZW1lbnQsIGtleWZyYW1lcywgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIHByZXZpb3VzUGxheWVycyA9IFtdLCBzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZCkgewogICAgICAgIHJldHVybiBuZXcgTm9vcEFuaW1hdGlvblBsYXllcihkdXJhdGlvbiwgZGVsYXkpOwogICAgfQp9Ck5vb3BBbmltYXRpb25Ecml2ZXIuybVmYWMgPSBmdW5jdGlvbiBOb29wQW5pbWF0aW9uRHJpdmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5vb3BBbmltYXRpb25Ecml2ZXIpKCk7IH07Ck5vb3BBbmltYXRpb25Ecml2ZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTm9vcEFuaW1hdGlvbkRyaXZlciwgZmFjdG9yeTogTm9vcEFuaW1hdGlvbkRyaXZlci7JtWZhYyB9KTsKLyoqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgQW5pbWF0aW9uRHJpdmVyIHsKfQpBbmltYXRpb25Ecml2ZXIuTk9PUCA9IG5ldyBOb29wQW5pbWF0aW9uRHJpdmVyKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3V0aWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBPTkVfU0VDT05EID0gMTAwMDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTVUJTVElUVVRJT05fRVhQUl9TVEFSVCA9ICd7eyc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1VCU1RJVFVUSU9OX0VYUFJfRU5EID0gJ319JzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFTlRFUl9DTEFTU05BTUUgPSAnbmctZW50ZXInOwovKiogQHR5cGUgez99ICovCmNvbnN0IExFQVZFX0NMQVNTTkFNRSA9ICduZy1sZWF2ZSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfVFJJR0dFUl9DTEFTU05BTUUgPSAnbmctdHJpZ2dlcic7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfVFJJR0dFUl9TRUxFQ1RPUiA9ICcubmctdHJpZ2dlcic7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfQU5JTUFUSU5HX0NMQVNTTkFNRSA9ICduZy1hbmltYXRpbmcnOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX0FOSU1BVElOR19TRUxFQ1RPUiA9ICcubmctYW5pbWF0aW5nJzsKLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVUaW1pbmdWYWx1ZSh2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXRjaGVzID0gdmFsdWUubWF0Y2goL14oLT9bXC5cZF0rKShtP3MpLyk7CiAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPCAyKQogICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIF9jb252ZXJ0VGltZVZhbHVlVG9NUyhwYXJzZUZsb2F0KG1hdGNoZXNbMV0pLCBtYXRjaGVzWzJdKTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHVuaXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9jb252ZXJ0VGltZVZhbHVlVG9NUyh2YWx1ZSwgdW5pdCkgewogICAgc3dpdGNoICh1bml0KSB7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIE9ORV9TRUNPTkQ7CiAgICAgICAgZGVmYXVsdDogLy8gbXMgb3Igc29tZXRoaW5nIGVsc2UKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRpbWluZ3MKICogQHBhcmFtIHs/fSBlcnJvcnMKICogQHBhcmFtIHs/PX0gYWxsb3dOZWdhdGl2ZVZhbHVlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVzb2x2ZVRpbWluZyh0aW1pbmdzLCBlcnJvcnMsIGFsbG93TmVnYXRpdmVWYWx1ZXMpIHsKICAgIHJldHVybiB0aW1pbmdzLmhhc093blByb3BlcnR5KCdkdXJhdGlvbicpID8KICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGltaW5ncykpIDoKICAgICAgICBwYXJzZVRpbWVFeHByZXNzaW9uKCgvKiogQHR5cGUgez99ICovICh0aW1pbmdzKSksIGVycm9ycywgYWxsb3dOZWdhdGl2ZVZhbHVlcyk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXhwCiAqIEBwYXJhbSB7P30gZXJyb3JzCiAqIEBwYXJhbSB7Pz19IGFsbG93TmVnYXRpdmVWYWx1ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlVGltZUV4cHJlc3Npb24oZXhwLCBlcnJvcnMsIGFsbG93TmVnYXRpdmVWYWx1ZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlZ2V4ID0gL14oLT9bXC5cZF0rKShtP3MpKD86XHMrKC0/W1wuXGRdKykobT9zKSk/KD86XHMrKFstYS16XSsoPzpcKC4rP1wpKT8pKT8kL2k7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZHVyYXRpb247CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZGVsYXkgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGVhc2luZyA9ICcnOwogICAgaWYgKHR5cGVvZiBleHAgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBleHAubWF0Y2gocmVnZXgpOwogICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBUaGUgcHJvdmlkZWQgdGltaW5nIHZhbHVlICIke2V4cH0iIGlzIGludmFsaWQuYCk7CiAgICAgICAgICAgIHJldHVybiB7IGR1cmF0aW9uOiAwLCBkZWxheTogMCwgZWFzaW5nOiAnJyB9OwogICAgICAgIH0KICAgICAgICBkdXJhdGlvbiA9IF9jb252ZXJ0VGltZVZhbHVlVG9NUyhwYXJzZUZsb2F0KG1hdGNoZXNbMV0pLCBtYXRjaGVzWzJdKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVsYXlNYXRjaCA9IG1hdGNoZXNbM107CiAgICAgICAgaWYgKGRlbGF5TWF0Y2ggIT0gbnVsbCkgewogICAgICAgICAgICBkZWxheSA9IF9jb252ZXJ0VGltZVZhbHVlVG9NUyhwYXJzZUZsb2F0KGRlbGF5TWF0Y2gpLCBtYXRjaGVzWzRdKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVhc2luZ1ZhbCA9IG1hdGNoZXNbNV07CiAgICAgICAgaWYgKGVhc2luZ1ZhbCkgewogICAgICAgICAgICBlYXNpbmcgPSBlYXNpbmdWYWw7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgZHVyYXRpb24gPSBleHA7CiAgICB9CiAgICBpZiAoIWFsbG93TmVnYXRpdmVWYWx1ZXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbnRhaW5zRXJyb3JzID0gZmFsc2U7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdGFydEluZGV4ID0gZXJyb3JzLmxlbmd0aDsKICAgICAgICBpZiAoZHVyYXRpb24gPCAwKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBEdXJhdGlvbiB2YWx1ZXMgYmVsb3cgMCBhcmUgbm90IGFsbG93ZWQgZm9yIHRoaXMgYW5pbWF0aW9uIHN0ZXAuYCk7CiAgICAgICAgICAgIGNvbnRhaW5zRXJyb3JzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5IDwgMCkgewogICAgICAgICAgICBlcnJvcnMucHVzaChgRGVsYXkgdmFsdWVzIGJlbG93IDAgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGlzIGFuaW1hdGlvbiBzdGVwLmApOwogICAgICAgICAgICBjb250YWluc0Vycm9ycyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChjb250YWluc0Vycm9ycykgewogICAgICAgICAgICBlcnJvcnMuc3BsaWNlKHN0YXJ0SW5kZXgsIDAsIGBUaGUgcHJvdmlkZWQgdGltaW5nIHZhbHVlICIke2V4cH0iIGlzIGludmFsaWQuYCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcgfTsKfQovKioKICogQHBhcmFtIHs/fSBvYmoKICogQHBhcmFtIHs/PX0gZGVzdGluYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvcHlPYmoob2JqLCBkZXN0aW5hdGlvbiA9IHt9KSB7CiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9wID0+IHsKICAgICAgICBkZXN0aW5hdGlvbltwcm9wXSA9IG9ialtwcm9wXTsKICAgIH0pKTsKICAgIHJldHVybiBkZXN0aW5hdGlvbjsKfQovKioKICogQHBhcmFtIHs/fSBzdHlsZXMKICogQHBhcmFtIHs/fSByZWFkUHJvdG90eXBlCiAqIEBwYXJhbSB7Pz19IGRlc3RpbmF0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb3B5U3R5bGVzKHN0eWxlcywgcmVhZFByb3RvdHlwZSwgZGVzdGluYXRpb24gPSB7fSkgewogICAgaWYgKHJlYWRQcm90b3R5cGUpIHsKICAgICAgICAvLyB3ZSBtYWtlIHVzZSBvZiBhIGZvci1pbiBsb29wIHNvIHRoYXQgdGhlCiAgICAgICAgLy8gcHJvdG90eXBpY2FsbHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlCiAgICAgICAgLy8gcmV2ZWFsZWQgZnJvbSB0aGUgYmFja0ZpbGwgbWFwCiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzdHlsZXMpIHsKICAgICAgICAgICAgZGVzdGluYXRpb25bcHJvcF0gPSBzdHlsZXNbcHJvcF07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29weU9iaihzdHlsZXMsIGRlc3RpbmF0aW9uKTsKICAgIH0KICAgIHJldHVybiBkZXN0aW5hdGlvbjsKfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30ga2V5CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFN0eWxlQXR0cmlidXRlU3RyaW5nKGVsZW1lbnQsIGtleSwgdmFsdWUpIHsKICAgIC8vIFJldHVybiB0aGUga2V5LXZhbHVlIHBhaXIgc3RyaW5nIHRvIGJlIGFkZGVkIHRvIHRoZSBzdHlsZSBhdHRyaWJ1dGUgZm9yIHRoZQogICAgLy8gZ2l2ZW4gQ1NTIHN0eWxlIGtleS4KICAgIGlmICh2YWx1ZSkgewogICAgICAgIHJldHVybiBrZXkgKyAnOicgKyB2YWx1ZSArICc7JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB3cml0ZVN0eWxlQXR0cmlidXRlKGVsZW1lbnQpIHsKICAgIC8vIFJlYWQgdGhlIHN0eWxlIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGFuZCBtYW51YWxseSByZWZsZWN0IGl0IHRvIHRoZQogICAgLy8gc3R5bGUgYXR0cmlidXRlLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIERvbWlubyBvbiBwbGF0Zm9ybS1zZXJ2ZXIgZG9lc24ndAogICAgLy8gdW5kZXJzdGFuZCB0aGUgZnVsbCBzZXQgb2YgYWxsb3dlZCBDU1MgcHJvcGVydGllcyBhbmQgZG9lc24ndCByZWZsZWN0IHNvbWUKICAgIC8vIG9mIHRoZW0gYXV0b21hdGljYWxseS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBzdHlsZUF0dHJWYWx1ZSA9ICcnOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50LnN0eWxlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IGVsZW1lbnQuc3R5bGUuaXRlbShpKTsKICAgICAgICBzdHlsZUF0dHJWYWx1ZSArPSBnZXRTdHlsZUF0dHJpYnV0ZVN0cmluZyhlbGVtZW50LCBrZXksIGVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShrZXkpKTsKICAgIH0KICAgIGZvciAoY29uc3Qga2V5IGluIGVsZW1lbnQuc3R5bGUpIHsKICAgICAgICAvLyBTa2lwIGludGVybmFsIERvbWlubyBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSByZWZsZWN0ZWQuCiAgICAgICAgaWYgKCFlbGVtZW50LnN0eWxlLmhhc093blByb3BlcnR5KGtleSkgfHwga2V5LnN0YXJ0c1dpdGgoJ18nKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhc2hLZXkgPSBjYW1lbENhc2VUb0Rhc2hDYXNlJDEoa2V5KTsKICAgICAgICBzdHlsZUF0dHJWYWx1ZSArPSBnZXRTdHlsZUF0dHJpYnV0ZVN0cmluZyhlbGVtZW50LCBkYXNoS2V5LCBlbGVtZW50LnN0eWxlW2tleV0pOwogICAgfQogICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVBdHRyVmFsdWUpOwp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBzdHlsZXMKICogQHBhcmFtIHs/PX0gZm9ybWVyU3R5bGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzLCBmb3JtZXJTdHlsZXMpIHsKICAgIGlmIChlbGVtZW50WydzdHlsZSddKSB7CiAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNhbWVsUHJvcCA9IGRhc2hDYXNlVG9DYW1lbENhc2UocHJvcCk7CiAgICAgICAgICAgIGlmIChmb3JtZXJTdHlsZXMgJiYgIWZvcm1lclN0eWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgZm9ybWVyU3R5bGVzW3Byb3BdID0gZWxlbWVudC5zdHlsZVtjYW1lbFByb3BdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbY2FtZWxQcm9wXSA9IHN0eWxlc1twcm9wXTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gT24gdGhlIHNlcnZlciBzZXQgdGhlICdzdHlsZScgYXR0cmlidXRlIHNpbmNlIGl0J3Mgbm90IGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkLgogICAgICAgIGlmIChpc05vZGUoKSkgewogICAgICAgICAgICB3cml0ZVN0eWxlQXR0cmlidXRlKGVsZW1lbnQpOwogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gc3R5bGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlcmFzZVN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHsKICAgIGlmIChlbGVtZW50WydzdHlsZSddKSB7CiAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNhbWVsUHJvcCA9IGRhc2hDYXNlVG9DYW1lbENhc2UocHJvcCk7CiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbY2FtZWxQcm9wXSA9ICcnOwogICAgICAgIH0pKTsKICAgICAgICAvLyBPbiB0aGUgc2VydmVyIHNldCB0aGUgJ3N0eWxlJyBhdHRyaWJ1dGUgc2luY2UgaXQncyBub3QgYXV0b21hdGljYWxseSByZWZsZWN0ZWQuCiAgICAgICAgaWYgKGlzTm9kZSgpKSB7CiAgICAgICAgICAgIHdyaXRlU3R5bGVBdHRyaWJ1dGUoZWxlbWVudCk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHN0ZXBzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBub3JtYWxpemVBbmltYXRpb25FbnRyeShzdGVwcykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoc3RlcHMpKSB7CiAgICAgICAgaWYgKHN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICByZXR1cm4gc3RlcHNbMF07CiAgICAgICAgcmV0dXJuIHNlcXVlbmNlKHN0ZXBzKTsKICAgIH0KICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoc3RlcHMpKTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IG9wdGlvbnMKICogQHBhcmFtIHs/fSBlcnJvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVQYXJhbXModmFsdWUsIG9wdGlvbnMsIGVycm9ycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMgfHwge307CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXRjaGVzID0gZXh0cmFjdFN0eWxlUGFyYW1zKHZhbHVlKTsKICAgIGlmIChtYXRjaGVzLmxlbmd0aCkgewogICAgICAgIG1hdGNoZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YXJOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2YXJOYW1lID0+IHsKICAgICAgICAgICAgaWYgKCFwYXJhbXMuaGFzT3duUHJvcGVydHkodmFyTmFtZSkpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbG9jYWwgYW5pbWF0aW9uIHBhcmFtICR7dmFyTmFtZX0gaW4gdGhlIGdpdmVuIGxpc3Qgb2YgdmFsdWVzYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQQVJBTV9SRUdFWCA9IG5ldyBSZWdFeHAoYCR7U1VCU1RJVFVUSU9OX0VYUFJfU1RBUlR9XFxzKiguKz8pXFxzKiR7U1VCU1RJVFVUSU9OX0VYUFJfRU5EfWAsICdnJyk7Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleHRyYWN0U3R5bGVQYXJhbXModmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJhbXMgPSBbXTsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaDsKICAgICAgICB3aGlsZSAobWF0Y2ggPSBQQVJBTV9SRUdFWC5leGVjKHZhbHVlKSkgewogICAgICAgICAgICBwYXJhbXMucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAobWF0Y2hbMV0pKSk7CiAgICAgICAgfQogICAgICAgIFBBUkFNX1JFR0VYLmxhc3RJbmRleCA9IDA7CiAgICB9CiAgICByZXR1cm4gcGFyYW1zOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7P30gcGFyYW1zCiAqIEBwYXJhbSB7P30gZXJyb3JzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0ZVBhcmFtcyh2YWx1ZSwgcGFyYW1zLCBlcnJvcnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG9yaWdpbmFsID0gdmFsdWUudG9TdHJpbmcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0ciA9IG9yaWdpbmFsLnJlcGxhY2UoUEFSQU1fUkVHRVgsICgvKioKICAgICAqIEBwYXJhbSB7P30gXwogICAgICogQHBhcmFtIHs/fSB2YXJOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoXywgdmFyTmFtZSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbG9jYWxWYWwgPSBwYXJhbXNbdmFyTmFtZV07CiAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHRoZSB2YWx1ZSB3YXMgbmV2ZXIgb3ZlcnJpZGRlbiBieSB0aGUgZGF0YSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIKICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eSh2YXJOYW1lKSkgewogICAgICAgICAgICBlcnJvcnMucHVzaChgUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBwYXJhbSAke3Zhck5hbWV9YCk7CiAgICAgICAgICAgIGxvY2FsVmFsID0gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsb2NhbFZhbC50b1N0cmluZygpOwogICAgfSkpOwogICAgLy8gd2UgZG8gdGhpcyB0byBhc3NlcnQgdGhhdCBudW1lcmljIHZhbHVlcyBzdGF5IGFzIHRoZXkgYXJlCiAgICByZXR1cm4gc3RyID09IG9yaWdpbmFsID8gdmFsdWUgOiBzdHI7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaXRlcmF0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYXJyID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaXRlbSA9IGl0ZXJhdG9yLm5leHQoKTsKICAgIHdoaWxlICghaXRlbS5kb25lKSB7CiAgICAgICAgYXJyLnB1c2goaXRlbS52YWx1ZSk7CiAgICAgICAgaXRlbSA9IGl0ZXJhdG9yLm5leHQoKTsKICAgIH0KICAgIHJldHVybiBhcnI7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBEQVNIX0NBU0VfUkVHRVhQID0gLy0rKFthLXowLTldKS9nOwovKioKICogQHBhcmFtIHs/fSBpbnB1dAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGFzaENhc2VUb0NhbWVsQ2FzZShpbnB1dCkgewogICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoREFTSF9DQVNFX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHsuLi4/fSBtCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoLi4ubSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5wdXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNhbWVsQ2FzZVRvRGFzaENhc2UkMShpbnB1dCkgewogICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZHVyYXRpb24KICogQHBhcmFtIHs/fSBkZWxheQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb3dQcmV2aW91c1BsYXllclN0eWxlc01lcmdlKGR1cmF0aW9uLCBkZWxheSkgewogICAgcmV0dXJuIGR1cmF0aW9uID09PSAwIHx8IGRlbGF5ID09PSAwOwp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICogQHBhcmFtIHs/fSBwcmV2aW91c1N0eWxlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmFsYW5jZVByZXZpb3VzU3R5bGVzSW50b0tleWZyYW1lcyhlbGVtZW50LCBrZXlmcmFtZXMsIHByZXZpb3VzU3R5bGVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c1N0eWxlUHJvcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c1N0eWxlcyk7CiAgICBpZiAocHJldmlvdXNTdHlsZVByb3BzLmxlbmd0aCAmJiBrZXlmcmFtZXMubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdGFydGluZ0tleWZyYW1lID0ga2V5ZnJhbWVzWzBdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWlzc2luZ1N0eWxlUHJvcHMgPSBbXTsKICAgICAgICBwcmV2aW91c1N0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgaWYgKCFzdGFydGluZ0tleWZyYW1lLmhhc093blByb3BlcnR5KHByb3ApKSB7CiAgICAgICAgICAgICAgICBtaXNzaW5nU3R5bGVQcm9wcy5wdXNoKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXJ0aW5nS2V5ZnJhbWVbcHJvcF0gPSBwcmV2aW91c1N0eWxlc1twcm9wXTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKG1pc3NpbmdTdHlsZVByb3BzLmxlbmd0aCkgewogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBrZXlmcmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBrZiA9IGtleWZyYW1lc1tpXTsKICAgICAgICAgICAgICAgIG1pc3NpbmdTdHlsZVByb3BzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAocHJvcCkgewogICAgICAgICAgICAgICAgICAgIGtmW3Byb3BdID0gY29tcHV0ZVN0eWxlKGVsZW1lbnQsIHByb3ApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGtleWZyYW1lczsKfQovKioKICogQHBhcmFtIHs/fSB2aXNpdG9yCiAqIEBwYXJhbSB7P30gbm9kZQogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZpc2l0RHNsTm9kZSh2aXNpdG9yLCBub2RlLCBjb250ZXh0KSB7CiAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgIGNhc2UgNyAvKiBUcmlnZ2VyICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFRyaWdnZXIobm9kZSwgY29udGV4dCk7CiAgICAgICAgY2FzZSAwIC8qIFN0YXRlICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFN0YXRlKG5vZGUsIGNvbnRleHQpOwogICAgICAgIGNhc2UgMSAvKiBUcmFuc2l0aW9uICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFRyYW5zaXRpb24obm9kZSwgY29udGV4dCk7CiAgICAgICAgY2FzZSAyIC8qIFNlcXVlbmNlICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFNlcXVlbmNlKG5vZGUsIGNvbnRleHQpOwogICAgICAgIGNhc2UgMyAvKiBHcm91cCAqLzoKICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRHcm91cChub2RlLCBjb250ZXh0KTsKICAgICAgICBjYXNlIDQgLyogQW5pbWF0ZSAqLzoKICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbmltYXRlKG5vZGUsIGNvbnRleHQpOwogICAgICAgIGNhc2UgNSAvKiBLZXlmcmFtZXMgKi86CiAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZnJhbWVzKG5vZGUsIGNvbnRleHQpOwogICAgICAgIGNhc2UgNiAvKiBTdHlsZSAqLzoKICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdHlsZShub2RlLCBjb250ZXh0KTsKICAgICAgICBjYXNlIDggLyogUmVmZXJlbmNlICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZmVyZW5jZShub2RlLCBjb250ZXh0KTsKICAgICAgICBjYXNlIDkgLyogQW5pbWF0ZUNoaWxkICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFuaW1hdGVDaGlsZChub2RlLCBjb250ZXh0KTsKICAgICAgICBjYXNlIDEwIC8qIEFuaW1hdGVSZWYgKi86CiAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QW5pbWF0ZVJlZihub2RlLCBjb250ZXh0KTsKICAgICAgICBjYXNlIDExIC8qIFF1ZXJ5ICovOgogICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFF1ZXJ5KG5vZGUsIGNvbnRleHQpOwogICAgICAgIGNhc2UgMTIgLyogU3RhZ2dlciAqLzoKICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdGFnZ2VyKG5vZGUsIGNvbnRleHQpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgYW5pbWF0aW9uIG1ldGFkYXRhIG5vZGUgIyR7bm9kZS50eXBlfWApOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBwcm9wCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21wdXRlU3R5bGUoZWxlbWVudCwgcHJvcCkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkpKSlbcHJvcF07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl90cmFuc2l0aW9uX2V4cHIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQU5ZX1NUQVRFID0gJyonOwovKioKICogQHBhcmFtIHs/fSB0cmFuc2l0aW9uVmFsdWUKICogQHBhcmFtIHs/fSBlcnJvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlVHJhbnNpdGlvbkV4cHIodHJhbnNpdGlvblZhbHVlLCBlcnJvcnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGV4cHJlc3Npb25zID0gW107CiAgICBpZiAodHlwZW9mIHRyYW5zaXRpb25WYWx1ZSA9PSAnc3RyaW5nJykgewogICAgICAgIHRyYW5zaXRpb25WYWx1ZS5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdHIgPT4gcGFyc2VJbm5lclRyYW5zaXRpb25TdHIoc3RyLCBleHByZXNzaW9ucywgZXJyb3JzKSkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZXhwcmVzc2lvbnMucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAodHJhbnNpdGlvblZhbHVlKSkpOwogICAgfQogICAgcmV0dXJuIGV4cHJlc3Npb25zOwp9Ci8qKgogKiBAcGFyYW0gez99IGV2ZW50U3RyCiAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbnMKICogQHBhcmFtIHs/fSBlcnJvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlSW5uZXJUcmFuc2l0aW9uU3RyKGV2ZW50U3RyLCBleHByZXNzaW9ucywgZXJyb3JzKSB7CiAgICBpZiAoZXZlbnRTdHJbMF0gPT0gJzonKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQW5pbWF0aW9uQWxpYXMoZXZlbnRTdHIsIGVycm9ycyk7CiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZXZlbnRTdHIgPSByZXN1bHQ7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXRjaCA9IGV2ZW50U3RyLm1hdGNoKC9eKFwqfFstXHddKylccyooPD9bPS1dPilccyooXCp8Wy1cd10rKSQvKTsKICAgIGlmIChtYXRjaCA9PSBudWxsIHx8IG1hdGNoLmxlbmd0aCA8IDQpIHsKICAgICAgICBlcnJvcnMucHVzaChgVGhlIHByb3ZpZGVkIHRyYW5zaXRpb24gZXhwcmVzc2lvbiAiJHtldmVudFN0cn0iIGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmcm9tU3RhdGUgPSBtYXRjaFsxXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNlcGFyYXRvciA9IG1hdGNoWzJdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdG9TdGF0ZSA9IG1hdGNoWzNdOwogICAgZXhwcmVzc2lvbnMucHVzaChtYWtlTGFtYmRhRnJvbVN0YXRlcyhmcm9tU3RhdGUsIHRvU3RhdGUpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzRnVsbEFueVN0YXRlRXhwciA9IGZyb21TdGF0ZSA9PSBBTllfU1RBVEUgJiYgdG9TdGF0ZSA9PSBBTllfU1RBVEU7CiAgICBpZiAoc2VwYXJhdG9yWzBdID09ICc8JyAmJiAhaXNGdWxsQW55U3RhdGVFeHByKSB7CiAgICAgICAgZXhwcmVzc2lvbnMucHVzaChtYWtlTGFtYmRhRnJvbVN0YXRlcyh0b1N0YXRlLCBmcm9tU3RhdGUpKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBhbGlhcwogKiBAcGFyYW0gez99IGVycm9ycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VBbmltYXRpb25BbGlhcyhhbGlhcywgZXJyb3JzKSB7CiAgICBzd2l0Y2ggKGFsaWFzKSB7CiAgICAgICAgY2FzZSAnOmVudGVyJzoKICAgICAgICAgICAgcmV0dXJuICd2b2lkID0+IConOwogICAgICAgIGNhc2UgJzpsZWF2ZSc6CiAgICAgICAgICAgIHJldHVybiAnKiA9PiB2b2lkJzsKICAgICAgICBjYXNlICc6aW5jcmVtZW50JzoKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b1N0YXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZnJvbVN0YXRlLCB0b1N0YXRlKSA9PiBwYXJzZUZsb2F0KHRvU3RhdGUpID4gcGFyc2VGbG9hdChmcm9tU3RhdGUpKTsKICAgICAgICBjYXNlICc6ZGVjcmVtZW50JzoKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b1N0YXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZnJvbVN0YXRlLCB0b1N0YXRlKSA9PiBwYXJzZUZsb2F0KHRvU3RhdGUpIDwgcGFyc2VGbG9hdChmcm9tU3RhdGUpKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBlcnJvcnMucHVzaChgVGhlIHRyYW5zaXRpb24gYWxpYXMgdmFsdWUgIiR7YWxpYXN9IiBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICAgIHJldHVybiAnKiA9PiAqJzsKICAgIH0KfQovLyBETyBOT1QgUkVGQUNUT1IgLi4uIGtlZXAgdGhlIGZvbGxvdyBzZXQgaW5zdGFudGlhdGlvbnMKLy8gd2l0aCB0aGUgdmFsdWVzIGludGFjdCAoY2xvc3VyZSBjb21waWxlciBmb3Igc29tZSByZWFzb24KLy8gcmVtb3ZlcyBmb2xsb3ctdXAgbGluZXMgdGhhdCBhZGQgdGhlIHZhbHVlcyBvdXRzaWRlIG9mCi8vIHRoZSBjb25zdHJ1Y3Rvci4uLgovKiogQHR5cGUgez99ICovCmNvbnN0IFRSVUVfQk9PTEVBTl9WQUxVRVMgPSBuZXcgU2V0KFsndHJ1ZScsICcxJ10pOwovKiogQHR5cGUgez99ICovCmNvbnN0IEZBTFNFX0JPT0xFQU5fVkFMVUVTID0gbmV3IFNldChbJ2ZhbHNlJywgJzAnXSk7Ci8qKgogKiBAcGFyYW0gez99IGxocwogKiBAcGFyYW0gez99IHJocwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWFrZUxhbWJkYUZyb21TdGF0ZXMobGhzLCByaHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IExIU19NQVRDSF9CT09MRUFOID0gVFJVRV9CT09MRUFOX1ZBTFVFUy5oYXMobGhzKSB8fCBGQUxTRV9CT09MRUFOX1ZBTFVFUy5oYXMobGhzKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJIU19NQVRDSF9CT09MRUFOID0gVFJVRV9CT09MRUFOX1ZBTFVFUy5oYXMocmhzKSB8fCBGQUxTRV9CT09MRUFOX1ZBTFVFUy5oYXMocmhzKTsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGZyb21TdGF0ZQogICAgICogQHBhcmFtIHs/fSB0b1N0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZnJvbVN0YXRlLCB0b1N0YXRlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBsaHNNYXRjaCA9IGxocyA9PSBBTllfU1RBVEUgfHwgbGhzID09IGZyb21TdGF0ZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJoc01hdGNoID0gcmhzID09IEFOWV9TVEFURSB8fCByaHMgPT0gdG9TdGF0ZTsKICAgICAgICBpZiAoIWxoc01hdGNoICYmIExIU19NQVRDSF9CT09MRUFOICYmIHR5cGVvZiBmcm9tU3RhdGUgPT09ICdib29sZWFuJykgewogICAgICAgICAgICBsaHNNYXRjaCA9IGZyb21TdGF0ZSA/IFRSVUVfQk9PTEVBTl9WQUxVRVMuaGFzKGxocykgOiBGQUxTRV9CT09MRUFOX1ZBTFVFUy5oYXMobGhzKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFyaHNNYXRjaCAmJiBSSFNfTUFUQ0hfQk9PTEVBTiAmJiB0eXBlb2YgdG9TdGF0ZSA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgIHJoc01hdGNoID0gdG9TdGF0ZSA/IFRSVUVfQk9PTEVBTl9WQUxVRVMuaGFzKHJocykgOiBGQUxTRV9CT09MRUFOX1ZBTFVFUy5oYXMocmhzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxoc01hdGNoICYmIHJoc01hdGNoOwogICAgfSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl9hc3RfYnVpbGRlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IFNFTEZfVE9LRU4gPSAnOnNlbGYnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNFTEZfVE9LRU5fUkVHRVggPSBuZXcgUmVnRXhwKGBccyoke1NFTEZfVE9LRU59XHMqLD9gLCAnZycpOwovKgogKiBbVmFsaWRhdGlvbl0KICogVGhlIHZpc2l0b3IgY29kZSBiZWxvdyB3aWxsIHRyYXZlcnNlIHRoZSBhbmltYXRpb24gQVNUIGdlbmVyYXRlZCBieSB0aGUgYW5pbWF0aW9uIHZlcmIgZnVuY3Rpb25zCiAqICh0aGUgb3V0cHV0IGlzIGEgdHJlZSBvZiBvYmplY3RzKSBhbmQgYXR0ZW1wdCB0byBwZXJmb3JtIGEgc2VyaWVzIG9mIHZhbGlkYXRpb25zIG9uIHRoZSBkYXRhLiBUaGUKICogZm9sbG93aW5nIGNvcm5lci1jYXNlcyB3aWxsIGJlIHZhbGlkYXRlZDoKICoKICogMS4gT3ZlcmxhcCBvZiBhbmltYXRpb25zCiAqIEdpdmVuIHRoYXQgYSBDU1MgcHJvcGVydHkgY2Fubm90IGJlIGFuaW1hdGVkIGluIG1vcmUgdGhhbiBvbmUgcGxhY2UgYXQgdGhlIHNhbWUgdGltZSwgaXQncwogKiBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlaGF2aW9yIGlzIGRldGVjdGVkIGFuZCB2YWxpZGF0ZWQuIFRoZSB3YXkgaW4gd2hpY2ggdGhpcyBvY2N1cnMgaXMgdGhhdAogKiBlYWNoIHRpbWUgYSBzdHlsZSBwcm9wZXJ0eSBpcyBleGFtaW5lZCwgYSBzdHJpbmctbWFwIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IHdpbGwgYmUgdXBkYXRlZCB3aXRoCiAqIHRoZSBzdGFydCBhbmQgZW5kIHRpbWVzIGZvciB3aGVuIHRoZSBwcm9wZXJ0eSBpcyB1c2VkIHdpdGhpbiBhbiBhbmltYXRpb24gc3RlcC4KICoKICogSWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIHBhcmFsbGVsIGFuaW1hdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgKHRoZXNlIGFyZSBpbnZva2VkIGJ5IHRoZQogKiBncm91cCgpKSBvbiB0aGUgc2FtZSBlbGVtZW50IHRoZW4gdGhlIHZhbGlkYXRvciB3aWxsIHRocm93IGFuIGVycm9yLiBTaW5jZSB0aGUgc3RhcnQvZW5kIHRpbWluZwogKiB2YWx1ZXMgYXJlIGNvbGxlY3RlZCBmb3IgZWFjaCBwcm9wZXJ0eSB0aGVuIGlmIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGVwIGlzIGFuaW1hdGluZyB0aGUgc2FtZQogKiBwcm9wZXJ0eSBhbmQgaXRzIHRpbWluZyB2YWx1ZXMgZmFsbCBhbnl3aGVyZSBpbnRvIHRoZSB3aW5kb3cgb2YgdGltZSB0aGF0IHRoZSBwcm9wZXJ0eSBpcwogKiBjdXJyZW50bHkgYmVpbmcgYW5pbWF0ZWQgd2l0aGluIHRoZW4gdGhpcyBpcyB3aGF0IGNhdXNlcyBhbiBlcnJvci4KICoKICogMi4gVGltaW5nIHZhbHVlcwogKiBUaGUgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgdG8gc2VlIGlmIGEgdGltaW5nIHZhbHVlIG9mIGBkdXJhdGlvbiBkZWxheSBlYXNpbmdgIG9yCiAqIGBkdXJhdGlvbk51bWJlcmAgaXMgdmFsaWQgb3Igbm90LgogKgogKiAobm90ZSB0aGF0IHVwb24gdmFsaWRhdGlvbiB0aGUgY29kZSBiZWxvdyB3aWxsIHJlcGxhY2UgdGhlIHRpbWluZyBkYXRhIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcKICoge2R1cmF0aW9uLGRlbGF5LGVhc2luZ30uCiAqCiAqIDMuIE9mZnNldCBWYWxpZGF0aW9uCiAqIEVhY2ggb2YgdGhlIHN0eWxlKCkgY2FsbHMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhbiBvZmZzZXQgdmFsdWUgd2hlbiBwbGFjZWQgaW5zaWRlIG9mIGtleWZyYW1lcygpLgogKiBPZmZzZXRzIHdpdGhpbiBrZXlmcmFtZXMoKSBhcmUgY29uc2lkZXJlZCB2YWxpZCB3aGVuOgogKgogKiAgIC0gTm8gb2Zmc2V0cyBhcmUgdXNlZCBhdCBhbGwKICogICAtIEVhY2ggc3R5bGUoKSBlbnRyeSBjb250YWlucyBhbiBvZmZzZXQgdmFsdWUKICogICAtIEVhY2ggb2Zmc2V0IGlzIGJldHdlZW4gMCBhbmQgMQogKiAgIC0gRWFjaCBvZmZzZXQgaXMgZ3JlYXRlciB0byBvciBlcXVhbCB0aGFuIHRoZSBwcmV2aW91cyBvbmUKICoKICogT3RoZXJ3aXNlIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLgogKi8KLyoqCiAqIEBwYXJhbSB7P30gZHJpdmVyCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHBhcmFtIHs/fSBlcnJvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJ1aWxkQW5pbWF0aW9uQXN0KGRyaXZlciwgbWV0YWRhdGEsIGVycm9ycykgewogICAgcmV0dXJuIG5ldyBBbmltYXRpb25Bc3RCdWlsZGVyVmlzaXRvcihkcml2ZXIpLmJ1aWxkKG1ldGFkYXRhLCBlcnJvcnMpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUk9PVF9TRUxFQ1RPUiA9ICcnOwpjbGFzcyBBbmltYXRpb25Bc3RCdWlsZGVyVmlzaXRvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RyaXZlcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZHJpdmVyKSB7CiAgICAgICAgdGhpcy5fZHJpdmVyID0gX2RyaXZlcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ1aWxkKG1ldGFkYXRhLCBlcnJvcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBBbmltYXRpb25Bc3RCdWlsZGVyQ29udGV4dChlcnJvcnMpOwogICAgICAgIHRoaXMuX3Jlc2V0Q29udGV4dFN0eWxlVGltaW5nU3RhdGUoY29udGV4dCk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh2aXNpdERzbE5vZGUodGhpcywgbm9ybWFsaXplQW5pbWF0aW9uRW50cnkobWV0YWRhdGEpLCBjb250ZXh0KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVzZXRDb250ZXh0U3R5bGVUaW1pbmdTdGF0ZShjb250ZXh0KSB7CiAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3RvciA9IFJPT1RfU0VMRUNUT1I7CiAgICAgICAgY29udGV4dC5jb2xsZWN0ZWRTdHlsZXMgPSB7fTsKICAgICAgICBjb250ZXh0LmNvbGxlY3RlZFN0eWxlc1tST09UX1NFTEVDVE9SXSA9IHt9OwogICAgICAgIGNvbnRleHQuY3VycmVudFRpbWUgPSAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0VHJpZ2dlcihtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcXVlcnlDb3VudCA9IGNvbnRleHQucXVlcnlDb3VudCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkZXBDb3VudCA9IGNvbnRleHQuZGVwQ291bnQgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGF0ZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdHJhbnNpdGlvbnMgPSBbXTsKICAgICAgICBpZiAobWV0YWRhdGEubmFtZS5jaGFyQXQoMCkgPT0gJ0AnKSB7CiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goJ2FuaW1hdGlvbiB0cmlnZ2VycyBjYW5ub3QgYmUgcHJlZml4ZWQgd2l0aCBhbiBgQGAgc2lnbiAoZS5nLiB0cmlnZ2VyKFwnQGZvb1wnLCBbLi4uXSkpJyk7CiAgICAgICAgfQogICAgICAgIG1ldGFkYXRhLmRlZmluaXRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZWYgPT4gewogICAgICAgICAgICB0aGlzLl9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKGNvbnRleHQpOwogICAgICAgICAgICBpZiAoZGVmLnR5cGUgPT0gMCAvKiBTdGF0ZSAqLykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gc3RhdGVEZWYubmFtZTsKICAgICAgICAgICAgICAgIG5hbWUudG9TdHJpbmcoKS5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBuID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZURlZi5uYW1lID0gbjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZXMucHVzaCh0aGlzLnZpc2l0U3RhdGUoc3RhdGVEZWYsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHN0YXRlRGVmLm5hbWUgPSBuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRlZi50eXBlID09IDEgLyogVHJhbnNpdGlvbiAqLykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMudmlzaXRUcmFuc2l0aW9uKCgvKiogQHR5cGUgez99ICovIChkZWYpKSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICBxdWVyeUNvdW50ICs9IHRyYW5zaXRpb24ucXVlcnlDb3VudDsKICAgICAgICAgICAgICAgIGRlcENvdW50ICs9IHRyYW5zaXRpb24uZGVwQ291bnQ7CiAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5wdXNoKHRyYW5zaXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaCgnb25seSBzdGF0ZSgpIGFuZCB0cmFuc2l0aW9uKCkgZGVmaW5pdGlvbnMgY2FuIHNpdCBpbnNpZGUgb2YgYSB0cmlnZ2VyKCknKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiA3IC8qIFRyaWdnZXIgKi8sCiAgICAgICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsCiAgICAgICAgICAgIHN0YXRlcywKICAgICAgICAgICAgdHJhbnNpdGlvbnMsCiAgICAgICAgICAgIHF1ZXJ5Q291bnQsCiAgICAgICAgICAgIGRlcENvdW50LAogICAgICAgICAgICBvcHRpb25zOiBudWxsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdFN0YXRlKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0eWxlQXN0ID0gdGhpcy52aXNpdFN0eWxlKG1ldGFkYXRhLnN0eWxlcywgY29udGV4dCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFzdFBhcmFtcyA9IChtZXRhZGF0YS5vcHRpb25zICYmIG1ldGFkYXRhLm9wdGlvbnMucGFyYW1zKSB8fCBudWxsOwogICAgICAgIGlmIChzdHlsZUFzdC5jb250YWluc0R5bmFtaWNTdHlsZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtaXNzaW5nU3VicyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhc3RQYXJhbXMgfHwge307CiAgICAgICAgICAgIHN0eWxlQXN0LnN0eWxlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFsdWUgPT4gewogICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0JDEodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlc09iaiA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlc09iaikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFN0eWxlUGFyYW1zKHN0eWxlc09ialtwcm9wXSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3ViCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBzdWIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuaGFzT3duUHJvcGVydHkoc3ViKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdTdWJzLmFkZChzdWIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmIChtaXNzaW5nU3Vicy5zaXplKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW5nU3Vic0FyciA9IGl0ZXJhdG9yVG9BcnJheShtaXNzaW5nU3Vicy52YWx1ZXMoKSk7CiAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKGBzdGF0ZSgiJHttZXRhZGF0YQogICAgICAgICAgICAgICAgICAgIC5uYW1lfSIsIC4uLikgbXVzdCBkZWZpbmUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB0aGUgZm9sbG93aW5nIHN0eWxlIHN1YnN0aXR1dGlvbnM6ICR7bWlzc2luZ1N1YnNBcnIuam9pbignLCAnKX1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAwIC8qIFN0YXRlICovLAogICAgICAgICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLAogICAgICAgICAgICBzdHlsZTogc3R5bGVBc3QsCiAgICAgICAgICAgIG9wdGlvbnM6IGFzdFBhcmFtcyA/IHsgcGFyYW1zOiBhc3RQYXJhbXMgfSA6IG51bGwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0VHJhbnNpdGlvbihtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQucXVlcnlDb3VudCA9IDA7CiAgICAgICAgY29udGV4dC5kZXBDb3VudCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHZpc2l0RHNsTm9kZSh0aGlzLCBub3JtYWxpemVBbmltYXRpb25FbnRyeShtZXRhZGF0YS5hbmltYXRpb24pLCBjb250ZXh0KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWF0Y2hlcnMgPSBwYXJzZVRyYW5zaXRpb25FeHByKG1ldGFkYXRhLmV4cHIsIGNvbnRleHQuZXJyb3JzKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAxIC8qIFRyYW5zaXRpb24gKi8sCiAgICAgICAgICAgIG1hdGNoZXJzLAogICAgICAgICAgICBhbmltYXRpb24sCiAgICAgICAgICAgIHF1ZXJ5Q291bnQ6IGNvbnRleHQucXVlcnlDb3VudCwKICAgICAgICAgICAgZGVwQ291bnQ6IGNvbnRleHQuZGVwQ291bnQsCiAgICAgICAgICAgIG9wdGlvbnM6IG5vcm1hbGl6ZUFuaW1hdGlvbk9wdGlvbnMobWV0YWRhdGEub3B0aW9ucykKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0U2VxdWVuY2UobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAyIC8qIFNlcXVlbmNlICovLAogICAgICAgICAgICBzdGVwczogbWV0YWRhdGEuc3RlcHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzID0+IHZpc2l0RHNsTm9kZSh0aGlzLCBzLCBjb250ZXh0KSkpLAogICAgICAgICAgICBvcHRpb25zOiBub3JtYWxpemVBbmltYXRpb25PcHRpb25zKG1ldGFkYXRhLm9wdGlvbnMpCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdEdyb3VwKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gY29udGV4dC5jdXJyZW50VGltZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZ1cnRoZXN0VGltZSA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0ZXBzID0gbWV0YWRhdGEuc3RlcHMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0ZXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0ZXAgPT4gewogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lID0gY3VycmVudFRpbWU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5uZXJBc3QgPSB2aXNpdERzbE5vZGUodGhpcywgc3RlcCwgY29udGV4dCk7CiAgICAgICAgICAgIGZ1cnRoZXN0VGltZSA9IE1hdGgubWF4KGZ1cnRoZXN0VGltZSwgY29udGV4dC5jdXJyZW50VGltZSk7CiAgICAgICAgICAgIHJldHVybiBpbm5lckFzdDsKICAgICAgICB9KSk7CiAgICAgICAgY29udGV4dC5jdXJyZW50VGltZSA9IGZ1cnRoZXN0VGltZTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAzIC8qIEdyb3VwICovLAogICAgICAgICAgICBzdGVwcywKICAgICAgICAgICAgb3B0aW9uczogbm9ybWFsaXplQW5pbWF0aW9uT3B0aW9ucyhtZXRhZGF0YS5vcHRpb25zKQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRBbmltYXRlKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRpbWluZ0FzdCA9IGNvbnN0cnVjdFRpbWluZ0FzdChtZXRhZGF0YS50aW1pbmdzLCBjb250ZXh0LmVycm9ycyk7CiAgICAgICAgY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSB0aW1pbmdBc3Q7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdHlsZUFzdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN0eWxlTWV0YWRhdGEgPSBtZXRhZGF0YS5zdHlsZXMgPyBtZXRhZGF0YS5zdHlsZXMgOiBzdHlsZSh7fSk7CiAgICAgICAgaWYgKHN0eWxlTWV0YWRhdGEudHlwZSA9PSA1IC8qIEtleWZyYW1lcyAqLykgewogICAgICAgICAgICBzdHlsZUFzdCA9IHRoaXMudmlzaXRLZXlmcmFtZXMoKC8qKiBAdHlwZSB7P30gKi8gKHN0eWxlTWV0YWRhdGEpKSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdHlsZU1ldGFkYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKG1ldGFkYXRhLnN0eWxlcykpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc3R5bGVNZXRhZGF0YSkgewogICAgICAgICAgICAgICAgaXNFbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdHlsZURhdGEgPSB7fTsKICAgICAgICAgICAgICAgIGlmICh0aW1pbmdBc3QuZWFzaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGVEYXRhWydlYXNpbmcnXSA9IHRpbWluZ0FzdC5lYXNpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHlsZU1ldGFkYXRhID0gc3R5bGUobmV3U3R5bGVEYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lICs9IHRpbWluZ0FzdC5kdXJhdGlvbiArIHRpbWluZ0FzdC5kZWxheTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBfc3R5bGVBc3QgPSB0aGlzLnZpc2l0U3R5bGUoc3R5bGVNZXRhZGF0YSwgY29udGV4dCk7CiAgICAgICAgICAgIF9zdHlsZUFzdC5pc0VtcHR5U3RlcCA9IGlzRW1wdHk7CiAgICAgICAgICAgIHN0eWxlQXN0ID0gX3N0eWxlQXN0OwogICAgICAgIH0KICAgICAgICBjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncyA9IG51bGw7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogNCAvKiBBbmltYXRlICovLAogICAgICAgICAgICB0aW1pbmdzOiB0aW1pbmdBc3QsCiAgICAgICAgICAgIHN0eWxlOiBzdHlsZUFzdCwKICAgICAgICAgICAgb3B0aW9uczogbnVsbAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRTdHlsZShtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhc3QgPSB0aGlzLl9tYWtlU3R5bGVBc3QobWV0YWRhdGEsIGNvbnRleHQpOwogICAgICAgIHRoaXMuX3ZhbGlkYXRlU3R5bGVBc3QoYXN0LCBjb250ZXh0KTsKICAgICAgICByZXR1cm4gYXN0OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbWFrZVN0eWxlQXN0KG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnN0eWxlcykpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChtZXRhZGF0YS5zdHlsZXMpKSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVUdXBsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3R5bGVUdXBsZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN0eWxlVHVwbGUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVUdXBsZSA9PSBBVVRPX1NUWUxFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKHN0eWxlVHVwbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgVGhlIHByb3ZpZGVkIHN0eWxlIHN0cmluZyB2YWx1ZSAke3N0eWxlVHVwbGV9IGlzIG5vdCBhbGxvd2VkLmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKHN0eWxlVHVwbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdHlsZXMucHVzaChtZXRhZGF0YS5zdHlsZXMpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbnRhaW5zRHluYW1pY1N0eWxlcyA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY29sbGVjdGVkRWFzaW5nID0gbnVsbDsKICAgICAgICBzdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZURhdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0eWxlRGF0YSA9PiB7CiAgICAgICAgICAgIGlmIChpc09iamVjdCQxKHN0eWxlRGF0YSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTWFwID0gKC8qKiBAdHlwZSB7P30gKi8gKHN0eWxlRGF0YSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWFzaW5nID0gc3R5bGVNYXBbJ2Vhc2luZyddOwogICAgICAgICAgICAgICAgaWYgKGVhc2luZykgewogICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZEVhc2luZyA9ICgvKiogQHR5cGUgez99ICovIChlYXNpbmcpKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc3R5bGVNYXBbJ2Vhc2luZyddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjb250YWluc0R5bmFtaWNTdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHN0eWxlTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzdHlsZU1hcFtwcm9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5kZXhPZihTVUJTVElUVVRJT05fRVhQUl9TVEFSVCkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNEeW5hbWljU3R5bGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6IDYgLyogU3R5bGUgKi8sCiAgICAgICAgICAgIHN0eWxlcywKICAgICAgICAgICAgZWFzaW5nOiBjb2xsZWN0ZWRFYXNpbmcsCiAgICAgICAgICAgIG9mZnNldDogbWV0YWRhdGEub2Zmc2V0LAogICAgICAgICAgICBjb250YWluc0R5bmFtaWNTdHlsZXMsCiAgICAgICAgICAgIG9wdGlvbnM6IG51bGwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3ZhbGlkYXRlU3R5bGVBc3QoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRpbWluZ3MgPSBjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5nczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGVuZFRpbWUgPSBjb250ZXh0LmN1cnJlbnRUaW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3RhcnRUaW1lID0gY29udGV4dC5jdXJyZW50VGltZTsKICAgICAgICBpZiAodGltaW5ncyAmJiBzdGFydFRpbWUgPiAwKSB7CiAgICAgICAgICAgIHN0YXJ0VGltZSAtPSB0aW1pbmdzLmR1cmF0aW9uICsgdGltaW5ncy5kZWxheTsKICAgICAgICB9CiAgICAgICAgYXN0LnN0eWxlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHR1cGxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0dXBsZSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdHVwbGUgPT0gJ3N0cmluZycpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHR1cGxlKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZHJpdmVyLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goYFRoZSBwcm92aWRlZCBhbmltYXRpb24gcHJvcGVydHkgIiR7cHJvcH0iIGlzIG5vdCBhIHN1cHBvcnRlZCBDU1MgcHJvcGVydHkgZm9yIGFuaW1hdGlvbnNgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0ZWRTdHlsZXMgPSBjb250ZXh0LmNvbGxlY3RlZFN0eWxlc1soLyoqIEB0eXBlIHs/fSAqLyAoY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3RvcikpXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3RlZEVudHJ5ID0gY29sbGVjdGVkU3R5bGVzW3Byb3BdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHVwZGF0ZUNvbGxlY3RlZFN0eWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0ZWRFbnRyeSkgewogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgIT0gZW5kVGltZSAmJiBzdGFydFRpbWUgPj0gY29sbGVjdGVkRW50cnkuc3RhcnRUaW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUgPD0gY29sbGVjdGVkRW50cnkuZW5kVGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKGBUaGUgQ1NTIHByb3BlcnR5ICIke3Byb3B9IiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJHtjb2xsZWN0ZWRFbnRyeS5zdGFydFRpbWV9bXMiIGFuZCAiJHtjb2xsZWN0ZWRFbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuZFRpbWV9bXMiIGlzIGFsc28gYmVpbmcgYW5pbWF0ZWQgaW4gYSBwYXJhbGxlbCBhbmltYXRpb24gYmV0d2VlbiB0aGUgdGltZXMgb2YgIiR7c3RhcnRUaW1lfW1zIiBhbmQgIiR7ZW5kVGltZX1tcyJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGVjdGVkU3R5bGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGNob29zZSB0aGUgc21hbGxlciBzdGFydCB0aW1lIHZhbHVlIHNpbmNlIHdlCiAgICAgICAgICAgICAgICAgICAgLy8gd2FudCB0byBoYXZlIGEgcmVjb3JkIG9mIHRoZSBlbnRpcmUgYW5pbWF0aW9uIHdpbmRvdyB3aGVyZQogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdHlsZSBwcm9wZXJ0eSBpcyBiZWluZyBhbmltYXRlZCBpbiBiZXR3ZWVuCiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gY29sbGVjdGVkRW50cnkuc3RhcnRUaW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUNvbGxlY3RlZFN0eWxlKSB7CiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkU3R5bGVzW3Byb3BdID0geyBzdGFydFRpbWUsIGVuZFRpbWUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0eWxlUGFyYW1zKHR1cGxlW3Byb3BdLCBjb250ZXh0Lm9wdGlvbnMsIGNvbnRleHQuZXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdEtleWZyYW1lcyhtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhc3QgPSB7IHR5cGU6IDUgLyogS2V5ZnJhbWVzICovLCBzdHlsZXM6IFtdLCBvcHRpb25zOiBudWxsIH07CiAgICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncykgewogICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKGBrZXlmcmFtZXMoKSBtdXN0IGJlIHBsYWNlZCBpbnNpZGUgb2YgYSBjYWxsIHRvIGFuaW1hdGUoKWApOwogICAgICAgICAgICByZXR1cm4gYXN0OwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgTUFYX0tFWUZSQU1FX09GRlNFVCA9IDE7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0b3RhbEtleWZyYW1lc1dpdGhPZmZzZXRzID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2Zmc2V0c091dE9mT3JkZXIgPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGtleWZyYW1lc091dE9mUmFuZ2UgPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByZXZpb3VzT2Zmc2V0ID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ZnJhbWVzID0gbWV0YWRhdGEuc3RlcHMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3R5bGVzID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMuX21ha2VTdHlsZUFzdChzdHlsZXMsIGNvbnRleHQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvZmZzZXRWYWwgPSBzdHlsZS5vZmZzZXQgIT0gbnVsbCA/IHN0eWxlLm9mZnNldCA6IGNvbnN1bWVPZmZzZXQoc3R5bGUuc3R5bGVzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgaWYgKG9mZnNldFZhbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0b3RhbEtleWZyYW1lc1dpdGhPZmZzZXRzKys7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzdHlsZS5vZmZzZXQgPSBvZmZzZXRWYWw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5ZnJhbWVzT3V0T2ZSYW5nZSA9IGtleWZyYW1lc091dE9mUmFuZ2UgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiAxOwogICAgICAgICAgICBvZmZzZXRzT3V0T2ZPcmRlciA9IG9mZnNldHNPdXRPZk9yZGVyIHx8IG9mZnNldCA8IHByZXZpb3VzT2Zmc2V0OwogICAgICAgICAgICBwcmV2aW91c09mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKG9mZnNldCk7CiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKGtleWZyYW1lc091dE9mUmFuZ2UpIHsKICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgUGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBrZXlmcmFtZSBvZmZzZXRzIGFyZSBiZXR3ZWVuIDAgYW5kIDFgKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldHNPdXRPZk9yZGVyKSB7CiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goYFBsZWFzZSBlbnN1cmUgdGhhdCBhbGwga2V5ZnJhbWUgb2Zmc2V0cyBhcmUgaW4gb3JkZXJgKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxlbmd0aCA9IG1ldGFkYXRhLnN0ZXBzLmxlbmd0aDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGdlbmVyYXRlZE9mZnNldCA9IDA7CiAgICAgICAgaWYgKHRvdGFsS2V5ZnJhbWVzV2l0aE9mZnNldHMgPiAwICYmIHRvdGFsS2V5ZnJhbWVzV2l0aE9mZnNldHMgPCBsZW5ndGgpIHsKICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgTm90IGFsbCBzdHlsZSgpIHN0ZXBzIHdpdGhpbiB0aGUgZGVjbGFyZWQga2V5ZnJhbWVzKCkgY29udGFpbiBvZmZzZXRzYCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRvdGFsS2V5ZnJhbWVzV2l0aE9mZnNldHMgPT0gMCkgewogICAgICAgICAgICBnZW5lcmF0ZWRPZmZzZXQgPSBNQVhfS0VZRlJBTUVfT0ZGU0VUIC8gKGxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGltaXQgPSBsZW5ndGggLSAxOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IGNvbnRleHQuY3VycmVudFRpbWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRBbmltYXRlVGltaW5ncyA9ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncykpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbmltYXRlRHVyYXRpb24gPSBjdXJyZW50QW5pbWF0ZVRpbWluZ3MuZHVyYXRpb247CiAgICAgICAga2V5ZnJhbWVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2YKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChrZiwgaSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlbmVyYXRlZE9mZnNldCA+IDAgPyAoaSA9PSBsaW1pdCA/IDEgOiAoZ2VuZXJhdGVkT2Zmc2V0ICogaSkpIDogb2Zmc2V0c1tpXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkdXJhdGlvblVwVG9UaGlzRnJhbWUgPSBvZmZzZXQgKiBhbmltYXRlRHVyYXRpb247CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbWUgPSBjdXJyZW50VGltZSArIGN1cnJlbnRBbmltYXRlVGltaW5ncy5kZWxheSArIGR1cmF0aW9uVXBUb1RoaXNGcmFtZTsKICAgICAgICAgICAgY3VycmVudEFuaW1hdGVUaW1pbmdzLmR1cmF0aW9uID0gZHVyYXRpb25VcFRvVGhpc0ZyYW1lOwogICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVN0eWxlQXN0KGtmLCBjb250ZXh0KTsKICAgICAgICAgICAga2Yub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICBhc3Quc3R5bGVzLnB1c2goa2YpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gYXN0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0UmVmZXJlbmNlKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogOCAvKiBSZWZlcmVuY2UgKi8sCiAgICAgICAgICAgIGFuaW1hdGlvbjogdmlzaXREc2xOb2RlKHRoaXMsIG5vcm1hbGl6ZUFuaW1hdGlvbkVudHJ5KG1ldGFkYXRhLmFuaW1hdGlvbiksIGNvbnRleHQpLAogICAgICAgICAgICBvcHRpb25zOiBub3JtYWxpemVBbmltYXRpb25PcHRpb25zKG1ldGFkYXRhLm9wdGlvbnMpCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdEFuaW1hdGVDaGlsZChtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQuZGVwQ291bnQrKzsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiA5IC8qIEFuaW1hdGVDaGlsZCAqLywKICAgICAgICAgICAgb3B0aW9uczogbm9ybWFsaXplQW5pbWF0aW9uT3B0aW9ucyhtZXRhZGF0YS5vcHRpb25zKQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRBbmltYXRlUmVmKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogMTAgLyogQW5pbWF0ZVJlZiAqLywKICAgICAgICAgICAgYW5pbWF0aW9uOiB0aGlzLnZpc2l0UmVmZXJlbmNlKG1ldGFkYXRhLmFuaW1hdGlvbiwgY29udGV4dCksCiAgICAgICAgICAgIG9wdGlvbnM6IG5vcm1hbGl6ZUFuaW1hdGlvbk9wdGlvbnMobWV0YWRhdGEub3B0aW9ucykKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0UXVlcnkobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50U2VsZWN0b3IgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3RvcikpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcHRpb25zID0gKC8qKiBAdHlwZSB7P30gKi8gKChtZXRhZGF0YS5vcHRpb25zIHx8IHt9KSkpOwogICAgICAgIGNvbnRleHQucXVlcnlDb3VudCsrOwogICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5ID0gbWV0YWRhdGE7CiAgICAgICAgY29uc3QgW3NlbGVjdG9yLCBpbmNsdWRlU2VsZl0gPSBub3JtYWxpemVTZWxlY3RvcihtZXRhZGF0YS5zZWxlY3Rvcik7CiAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3RvciA9CiAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yLmxlbmd0aCA/IChwYXJlbnRTZWxlY3RvciArICcgJyArIHNlbGVjdG9yKSA6IHNlbGVjdG9yOwogICAgICAgIGdldE9yU2V0QXNJbk1hcChjb250ZXh0LmNvbGxlY3RlZFN0eWxlcywgY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3Rvciwge30pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbmltYXRpb24gPSB2aXNpdERzbE5vZGUodGhpcywgbm9ybWFsaXplQW5pbWF0aW9uRW50cnkobWV0YWRhdGEuYW5pbWF0aW9uKSwgY29udGV4dCk7CiAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnkgPSBudWxsOwogICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5U2VsZWN0b3IgPSBwYXJlbnRTZWxlY3RvcjsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAxMSAvKiBRdWVyeSAqLywKICAgICAgICAgICAgc2VsZWN0b3IsCiAgICAgICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0IHx8IDAsCiAgICAgICAgICAgIG9wdGlvbmFsOiAhIW9wdGlvbnMub3B0aW9uYWwsCiAgICAgICAgICAgIGluY2x1ZGVTZWxmLAogICAgICAgICAgICBhbmltYXRpb24sCiAgICAgICAgICAgIG9yaWdpbmFsU2VsZWN0b3I6IG1ldGFkYXRhLnNlbGVjdG9yLAogICAgICAgICAgICBvcHRpb25zOiBub3JtYWxpemVBbmltYXRpb25PcHRpb25zKG1ldGFkYXRhLm9wdGlvbnMpCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdFN0YWdnZXIobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICBpZiAoIWNvbnRleHQuY3VycmVudFF1ZXJ5KSB7CiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goYHN0YWdnZXIoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBvZiBxdWVyeSgpYCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1pbmdzID0gbWV0YWRhdGEudGltaW5ncyA9PT0gJ2Z1bGwnID8KICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgZGVsYXk6IDAsIGVhc2luZzogJ2Z1bGwnIH0gOgogICAgICAgICAgICByZXNvbHZlVGltaW5nKG1ldGFkYXRhLnRpbWluZ3MsIGNvbnRleHQuZXJyb3JzLCB0cnVlKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAxMiAvKiBTdGFnZ2VyICovLAogICAgICAgICAgICBhbmltYXRpb246IHZpc2l0RHNsTm9kZSh0aGlzLCBub3JtYWxpemVBbmltYXRpb25FbnRyeShtZXRhZGF0YS5hbmltYXRpb24pLCBjb250ZXh0KSwKICAgICAgICAgICAgdGltaW5ncywKICAgICAgICAgICAgb3B0aW9uczogbnVsbAogICAgICAgIH07CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBoYXNBbXBlcnNhbmQgPSBzZWxlY3Rvci5zcGxpdCgvXHMqLFxzKi8pLmZpbmQoKC8qKgogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9rZW4gPT4gdG9rZW4gPT0gU0VMRl9UT0tFTikpID8gdHJ1ZSA6IGZhbHNlOwogICAgaWYgKGhhc0FtcGVyc2FuZCkgewogICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShTRUxGX1RPS0VOX1JFR0VYLCAnJyk7CiAgICB9CiAgICAvLyB0aGUgOmVudGVyIGFuZCA6bGVhdmUgc2VsZWN0b3JzIGFyZSBmaWxsZWQgaW4gYXQgcnVudGltZSBkdXJpbmcgdGltZWxpbmUgYnVpbGRpbmcKICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvQFwqL2csIE5HX1RSSUdHRVJfU0VMRUNUT1IpCiAgICAgICAgLnJlcGxhY2UoL0BcdysvZywgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWF0Y2ggPT4gTkdfVFJJR0dFUl9TRUxFQ1RPUiArICctJyArIG1hdGNoLnN1YnN0cigxKSkpCiAgICAgICAgLnJlcGxhY2UoLzphbmltYXRpbmcvZywgTkdfQU5JTUFUSU5HX1NFTEVDVE9SKTsKICAgIHJldHVybiBbc2VsZWN0b3IsIGhhc0FtcGVyc2FuZF07Cn0KLyoqCiAqIEBwYXJhbSB7P30gb2JqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBub3JtYWxpemVQYXJhbXMob2JqKSB7CiAgICByZXR1cm4gb2JqID8gY29weU9iaihvYmopIDogbnVsbDsKfQpjbGFzcyBBbmltYXRpb25Bc3RCdWlsZGVyQ29udGV4dCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVycm9ycykgewogICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgIHRoaXMucXVlcnlDb3VudCA9IDA7CiAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNpdGlvbiA9IG51bGw7CiAgICAgICAgdGhpcy5jdXJyZW50UXVlcnkgPSBudWxsOwogICAgICAgIHRoaXMuY3VycmVudFF1ZXJ5U2VsZWN0b3IgPSBudWxsOwogICAgICAgIHRoaXMuY3VycmVudEFuaW1hdGVUaW1pbmdzID0gbnVsbDsKICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gMDsKICAgICAgICB0aGlzLmNvbGxlY3RlZFN0eWxlcyA9IHt9OwogICAgICAgIHRoaXMub3B0aW9ucyA9IG51bGw7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gc3R5bGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb25zdW1lT2Zmc2V0KHN0eWxlcykgewogICAgaWYgKHR5cGVvZiBzdHlsZXMgPT0gJ3N0cmluZycpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgb2Zmc2V0ID0gbnVsbDsKICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlcykpIHsKICAgICAgICBzdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZVR1cGxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdHlsZVR1cGxlID0+IHsKICAgICAgICAgICAgaWYgKGlzT2JqZWN0JDEoc3R5bGVUdXBsZSkgJiYgc3R5bGVUdXBsZS5oYXNPd25Qcm9wZXJ0eSgnb2Zmc2V0JykpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9ICgvKiogQHR5cGUgez99ICovIChzdHlsZVR1cGxlKSk7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwYXJzZUZsb2F0KCgvKiogQHR5cGUgez99ICovIChvYmpbJ29mZnNldCddKSkpOwogICAgICAgICAgICAgICAgZGVsZXRlIG9ialsnb2Zmc2V0J107CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICBlbHNlIGlmIChpc09iamVjdCQxKHN0eWxlcykgJiYgc3R5bGVzLmhhc093blByb3BlcnR5KCdvZmZzZXQnKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvYmogPSBzdHlsZXM7CiAgICAgICAgb2Zmc2V0ID0gcGFyc2VGbG9hdCgoLyoqIEB0eXBlIHs/fSAqLyAob2JqWydvZmZzZXQnXSkpKTsKICAgICAgICBkZWxldGUgb2JqWydvZmZzZXQnXTsKICAgIH0KICAgIHJldHVybiBvZmZzZXQ7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzT2JqZWN0JDEodmFsdWUpIHsKICAgIHJldHVybiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7P30gZXJyb3JzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb25zdHJ1Y3RUaW1pbmdBc3QodmFsdWUsIGVycm9ycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHRpbWluZ3MgPSBudWxsOwogICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdkdXJhdGlvbicpKSB7CiAgICAgICAgdGltaW5ncyA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgfQogICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGR1cmF0aW9uID0gcmVzb2x2ZVRpbWluZyh2YWx1ZSwgZXJyb3JzKS5kdXJhdGlvbjsKICAgICAgICByZXR1cm4gbWFrZVRpbWluZ0FzdChkdXJhdGlvbiwgMCwgJycpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3RyVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzRHluYW1pYyA9IHN0clZhbHVlLnNwbGl0KC9ccysvKS5zb21lKCgvKioKICAgICAqIEBwYXJhbSB7P30gdgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdiA9PiB2LmNoYXJBdCgwKSA9PSAneycgJiYgdi5jaGFyQXQoMSkgPT0gJ3snKSk7CiAgICBpZiAoaXNEeW5hbWljKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFzdCA9ICgvKiogQHR5cGUgez99ICovIChtYWtlVGltaW5nQXN0KDAsIDAsICcnKSkpOwogICAgICAgIGFzdC5keW5hbWljID0gdHJ1ZTsKICAgICAgICBhc3Quc3RyVmFsdWUgPSBzdHJWYWx1ZTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGFzdCkpOwogICAgfQogICAgdGltaW5ncyA9IHRpbWluZ3MgfHwgcmVzb2x2ZVRpbWluZyhzdHJWYWx1ZSwgZXJyb3JzKTsKICAgIHJldHVybiBtYWtlVGltaW5nQXN0KHRpbWluZ3MuZHVyYXRpb24sIHRpbWluZ3MuZGVsYXksIHRpbWluZ3MuZWFzaW5nKTsKfQovKioKICogQHBhcmFtIHs/fSBvcHRpb25zCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBub3JtYWxpemVBbmltYXRpb25PcHRpb25zKG9wdGlvbnMpIHsKICAgIGlmIChvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IGNvcHlPYmoob3B0aW9ucyk7CiAgICAgICAgaWYgKG9wdGlvbnNbJ3BhcmFtcyddKSB7CiAgICAgICAgICAgIG9wdGlvbnNbJ3BhcmFtcyddID0gKC8qKiBAdHlwZSB7P30gKi8gKG5vcm1hbGl6ZVBhcmFtcyhvcHRpb25zWydwYXJhbXMnXSkpKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICB9CiAgICByZXR1cm4gb3B0aW9uczsKfQovKioKICogQHBhcmFtIHs/fSBkdXJhdGlvbgogKiBAcGFyYW0gez99IGRlbGF5CiAqIEBwYXJhbSB7P30gZWFzaW5nCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYWtlVGltaW5nQXN0KGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nKSB7CiAgICByZXR1cm4geyBkdXJhdGlvbiwgZGVsYXksIGVhc2luZyB9Owp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICogQHBhcmFtIHs/fSBwcmVTdHlsZVByb3BzCiAqIEBwYXJhbSB7P30gcG9zdFN0eWxlUHJvcHMKICogQHBhcmFtIHs/fSBkdXJhdGlvbgogKiBAcGFyYW0gez99IGRlbGF5CiAqIEBwYXJhbSB7Pz19IGVhc2luZwogKiBAcGFyYW0gez89fSBzdWJUaW1lbGluZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVGltZWxpbmVJbnN0cnVjdGlvbihlbGVtZW50LCBrZXlmcmFtZXMsIHByZVN0eWxlUHJvcHMsIHBvc3RTdHlsZVByb3BzLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZyA9IG51bGwsIHN1YlRpbWVsaW5lID0gZmFsc2UpIHsKICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogMSAvKiBUaW1lbGluZUFuaW1hdGlvbiAqLywKICAgICAgICBlbGVtZW50LAogICAgICAgIGtleWZyYW1lcywKICAgICAgICBwcmVTdHlsZVByb3BzLAogICAgICAgIHBvc3RTdHlsZVByb3BzLAogICAgICAgIGR1cmF0aW9uLAogICAgICAgIGRlbGF5LAogICAgICAgIHRvdGFsVGltZTogZHVyYXRpb24gKyBkZWxheSwKICAgICAgICBlYXNpbmcsCiAgICAgICAgc3ViVGltZWxpbmUKICAgIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2VsZW1lbnRfaW5zdHJ1Y3Rpb25fbWFwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEVsZW1lbnRJbnN0cnVjdGlvbk1hcCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY29uc3VtZShlbGVtZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbnN0cnVjdGlvbnMgPSB0aGlzLl9tYXAuZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmIChpbnN0cnVjdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShlbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGluc3RydWN0aW9ucyA9IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhcHBlbmQoZWxlbWVudCwgaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBleGlzdGluZ0luc3RydWN0aW9ucyA9IHRoaXMuX21hcC5nZXQoZWxlbWVudCk7CiAgICAgICAgaWYgKCFleGlzdGluZ0luc3RydWN0aW9ucykgewogICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGVsZW1lbnQsIGV4aXN0aW5nSW5zdHJ1Y3Rpb25zID0gW10pOwogICAgICAgIH0KICAgICAgICBleGlzdGluZ0luc3RydWN0aW9ucy5wdXNoKC4uLmluc3RydWN0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaGFzKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhlbGVtZW50KTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xlYXIoKSB7CiAgICAgICAgdGhpcy5fbWFwLmNsZWFyKCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl90aW1lbGluZV9idWlsZGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgT05FX0ZSQU1FX0lOX01JTExJU0VDT05EUyA9IDE7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRU5URVJfVE9LRU4gPSAnOmVudGVyJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFTlRFUl9UT0tFTl9SRUdFWCA9IG5ldyBSZWdFeHAoRU5URVJfVE9LRU4sICdnJyk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTEVBVkVfVE9LRU4gPSAnOmxlYXZlJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBMRUFWRV9UT0tFTl9SRUdFWCA9IG5ldyBSZWdFeHAoTEVBVkVfVE9LRU4sICdnJyk7Ci8qCiAqIFRoZSBjb2RlIHdpdGhpbiB0aGlzIGZpbGUgYWltcyB0byBnZW5lcmF0ZSB3ZWItYW5pbWF0aW9ucy1jb21wYXRpYmxlIGtleWZyYW1lcyBmcm9tIEFuZ3VsYXIncwogKiBhbmltYXRpb24gRFNMIGNvZGUuCiAqCiAqIFRoZSBjb2RlIGJlbG93IHdpbGwgYmUgY29udmVydGVkIGZyb206CiAqCiAqIGBgYAogKiBzZXF1ZW5jZShbCiAqICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLAogKiAgIGFuaW1hdGUoMTAwMCwgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKQogKiBdKQogKiBgYGAKICoKICogVG86CiAqIGBgYAogKiBrZXlmcmFtZXMgPSBbeyBvcGFjaXR5OiAwLCBvZmZzZXQ6IDAgfSwgeyBvcGFjaXR5OiAxLCBvZmZzZXQ6IDEgfV0KICogZHVyYXRpb24gPSAxMDAwCiAqIGRlbGF5ID0gMAogKiBlYXNpbmcgPSAnJwogKiBgYGAKICoKICogRm9yIHRoaXMgb3BlcmF0aW9uIHRvIGNvdmVyIHRoZSBjb21iaW5hdGlvbiBvZiBhbmltYXRpb24gdmVyYnMgKHN0eWxlLCBhbmltYXRlLCBncm91cCwgZXRjLi4uKSBhCiAqIGNvbWJpbmF0aW9uIG9mIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSwgQVNUIHRyYXZlcnNhbCBhbmQgbWVyZ2Utc29ydC1saWtlIGFsZ29yaXRobXMgYXJlIHVzZWQuCiAqCiAqIFtBU1QgVHJhdmVyc2FsXQogKiBFYWNoIG9mIHRoZSBhbmltYXRpb24gdmVyYnMsIHdoZW4gZXhlY3V0ZWQsIHdpbGwgcmV0dXJuIGFuIHN0cmluZy1tYXAgb2JqZWN0IHJlcHJlc2VudGluZyB3aGF0CiAqIHR5cGUgb2YgYWN0aW9uIGl0IGlzIChzdHlsZSwgYW5pbWF0ZSwgZ3JvdXAsIGV0Yy4uLikgYW5kIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhpcyBtZWFucwogKiB0aGF0IHdoZW4gZnVuY3Rpb25hbCBjb21wb3NpdGlvbiBtaXggb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGV2YWx1YXRlZCAobGlrZSBpbiB0aGUgZXhhbXBsZSBhYm92ZSkKICogdGhlbiBpdCB3aWxsIGVuZCB1cCBwcm9kdWNpbmcgYSB0cmVlIG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBhbmltYXRpb24gaXRzZWxmLgogKgogKiBXaGVuIHRoaXMgYW5pbWF0aW9uIG9iamVjdCB0cmVlIGlzIHByb2Nlc3NlZCBieSB0aGUgdmlzaXRvciBjb2RlIGJlbG93IGl0IHdpbGwgdmlzaXQgZWFjaCBvZiB0aGUKICogdmVyYiBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgdmlzaXRvci4gQW5kIGR1cmluZyBlYWNoIHZpc2l0IGl0IHdpbGwgYnVpbGQgdGhlIGNvbnRleHQgb2YgdGhlCiAqIGFuaW1hdGlvbiBrZXlmcmFtZXMgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYFRpbWVsaW5lQnVpbGRlcmAuCiAqCiAqIFtUaW1lbGluZUJ1aWxkZXJdCiAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIHRoZSBzdHlsZXMgYW5kIGJ1aWxkaW5nIGEgc2VyaWVzIG9mIGtleWZyYW1lIG9iamVjdHMgZm9yIGEKICogdGltZWxpbmUgYmV0d2VlbiBhIHN0YXJ0IGFuZCBlbmQgdGltZS4gVGhlIGJ1aWxkZXIgc3RhcnRzIG9mZiB3aXRoIGFuIGluaXRpYWwgdGltZWxpbmUgYW5kIGVhY2gKICogdGltZSB0aGUgQVNUIGNvbWVzIGFjcm9zcyBhIGBncm91cCgpYCwgYGtleWZyYW1lcygpYCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2lodGluIGEKICogYHNlcXVlbmNlKClgIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBhIHN1YiB0aW1lbGluZSBmb3IgZWFjaCBzdGVwIGFzIHdlbGwgYXMgYSBuZXcgb25lIGFmdGVyCiAqIHRoZXkgYXJlIGNvbXBsZXRlLgogKgogKiBBcyB0aGUgQVNUIGlzIHRyYXZlcnNlZCwgdGhlIHRpbWluZyBzdGF0ZSBvbiBlYWNoIG9mIHRoZSB0aW1lbGluZXMgd2lsbCBiZSBpbmNyZW1lbnRlZC4gSWYgYSBzdWIKICogdGltZWxpbmUgd2FzIGNyZWF0ZWQgKGJhc2VkIG9uIG9uZSBvZiB0aGUgY2FzZXMgYWJvdmUpIHRoZW4gdGhlIHBhcmVudCB0aW1lbGluZSB3aWxsIGF0dGVtcHQgdG8KICogbWVyZ2UgdGhlIHN0eWxlcyB1c2VkIHdpdGhpbiB0aGUgc3ViIHRpbWVsaW5lcyBpbnRvIGl0c2VsZiAob25seSB3aXRoIGdyb3VwKCkgdGhpcyB3aWxsIGhhcHBlbikuCiAqIFRoaXMgaGFwcGVucyB3aXRoIGEgbWVyZ2Ugb3BlcmF0aW9uIChtdWNoIGxpa2UgaG93IHRoZSBtZXJnZSB3b3JrcyBpbiBtZXJnZXNvcnQpIGFuZCBpdCB3aWxsIG9ubHkKICogY29weSB0aGUgbW9zdCByZWNlbnRseSB1c2VkIHN0eWxlcyBmcm9tIHRoZSBzdWIgdGltZWxpbmVzIGludG8gdGhlIHBhcmVudCB0aW1lbGluZS4gVGhpcyBlbnN1cmVzCiAqIHRoYXQgaWYgdGhlIHN0eWxlcyBhcmUgdXNlZCBsYXRlciBvbiBpbiBhbm90aGVyIHBoYXNlIG9mIHRoZSBhbmltYXRpb24gdGhlbiB0aGV5IHdpbGwgYmUgdGhlIG1vc3QKICogdXAtdG8tZGF0ZSB2YWx1ZXMuCiAqCiAqIFtIb3cgTWlzc2luZyBTdHlsZXMgQXJlIFVwZGF0ZWRdCiAqIEVhY2ggdGltZWxpbmUgaGFzIGEgYGJhY2tGaWxsYCBwcm9wZXJ0eSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiBuZXcgc3R5bGVzIGludG8KICogYWxyZWFkeSBwcm9jZXNzZWQga2V5ZnJhbWVzIGlmIGEgbmV3IHN0eWxlIHNob3dzIHVwIGxhdGVyIHdpdGhpbiB0aGUgYW5pbWF0aW9uIHNlcXVlbmNlLgogKgogKiBgYGAKICogc2VxdWVuY2UoWwogKiAgIHN0eWxlKHsgd2lkdGg6IDAgfSksCiAqICAgYW5pbWF0ZSgxMDAwLCBzdHlsZSh7IHdpZHRoOiAxMDAgfSkpLAogKiAgIGFuaW1hdGUoMTAwMCwgc3R5bGUoeyB3aWR0aDogMjAwIH0pKSwKICogICBhbmltYXRlKDEwMDAsIHN0eWxlKHsgd2lkdGg6IDMwMCB9KSkKICogICBhbmltYXRlKDEwMDAsIHN0eWxlKHsgd2lkdGg6IDQwMCwgaGVpZ2h0OiA0MDAgfSkpIC8vIG5vdGljZSBob3cgYGhlaWdodGAgZG9lc24ndCBleGlzdCBhbnl3aGVyZQogKiBlbHNlCiAqIF0pCiAqIGBgYAogKgogKiBXaGF0IGlzIGhhcHBlbmluZyBoZXJlIGlzIHRoYXQgdGhlIGBoZWlnaHRgIHZhbHVlIGlzIGFkZGVkIGxhdGVyIGluIHRoZSBzZXF1ZW5jZSwgYnV0IGlzIG1pc3NpbmcKICogZnJvbSBhbGwgcHJldmlvdXMgYW5pbWF0aW9uIHN0ZXBzLiBUaGVyZWZvcmUgd2hlbiBhIGtleWZyYW1lIGlzIGNyZWF0ZWQgaXQgd291bGQgYWxzbyBiZSBtaXNzaW5nCiAqIGZyb20gYWxsIHByZXZpb3VzIGtleWZyYW1lcyB1cCB1bnRpbCB3aGVyZSBpdCBpcyBmaXJzdCB1c2VkLiBGb3IgdGhlIHRpbWVsaW5lIGtleWZyYW1lIGdlbmVyYXRpb24KICogdG8gcHJvcGVybHkgZmlsbCBpbiB0aGUgc3R5bGUgaXQgd2lsbCBwbGFjZSB0aGUgcHJldmlvdXMgdmFsdWUgKHRoZSB2YWx1ZSBmcm9tIHRoZSBwYXJlbnQKICogdGltZWxpbmUpIG9yIGEgZGVmYXVsdCB2YWx1ZSBvZiBgKmAgaW50byB0aGUgYmFja0ZpbGwgb2JqZWN0LiBHaXZlbiB0aGF0IGVhY2ggb2YgdGhlIGtleWZyYW1lCiAqIHN0eWxlcyBhcmUgb2JqZWN0cyB0aGF0IHByb3RvdHlwaWNhbGx5IGluaGVydCBmcm9tIHRoZSBiYWNrRmlsbCBvYmplY3QsIHRoaXMgbWVhbnMgdGhhdCBpZiBhCiAqIHZhbHVlIGlzIGFkZGVkIGludG8gdGhlIGJhY2tGaWxsIHRoZW4gaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZSBhbnkgbWlzc2luZyB2YWx1ZXMgdG8gYWxsCiAqIGtleWZyYW1lcy4gVGhlcmVmb3JlIHRoZSBtaXNzaW5nIGBoZWlnaHRgIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgZmlsbGVkIGludG8gdGhlIGFscmVhZHkKICogcHJvY2Vzc2VkIGtleWZyYW1lcy4KICoKICogV2hlbiBhIHN1Yi10aW1lbGluZSBpcyBjcmVhdGVkIGl0IHdpbGwgaGF2ZSBpdHMgb3duIGJhY2tGaWxsIHByb3BlcnR5LiBUaGlzIGlzIGRvbmUgc28gdGhhdAogKiBzdHlsZXMgcHJlc2VudCB3aXRoaW4gdGhlIHN1Yi10aW1lbGluZSBkbyBub3QgYWNjaWRlbnRhbGx5IHNlZXAgaW50byB0aGUgcHJldmlvdXMvZnV0dXJlIHRpbWVsaW5lCiAqIGtleWZyYW1lcwogKgogKiAoRm9yIHByb3RvdHlwaWNhbGx5LWluaGVyaXRlZCBjb250ZW50cyB0byBiZSBkZXRlY3RlZCBhIGBmb3IoaSBpbiBvYmopYCBsb29wIG11c3QgYmUgdXNlZC4pCiAqCiAqIFtWYWxpZGF0aW9uXQogKiBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW9uLiBUaGF0IGZ1bmN0aW9uYWxpdHkgaGFwcGVucyB3aXRoIHdpdGhpbgogKiB0aGUgYEFuaW1hdGlvblZhbGlkYXRvclZpc2l0b3JgIGNvZGUuCiAqLwovKioKICogQHBhcmFtIHs/fSBkcml2ZXIKICogQHBhcmFtIHs/fSByb290RWxlbWVudAogKiBAcGFyYW0gez99IGFzdAogKiBAcGFyYW0gez99IGVudGVyQ2xhc3NOYW1lCiAqIEBwYXJhbSB7P30gbGVhdmVDbGFzc05hbWUKICogQHBhcmFtIHs/PX0gc3RhcnRpbmdTdHlsZXMKICogQHBhcmFtIHs/PX0gZmluYWxTdHlsZXMKICogQHBhcmFtIHs/PX0gb3B0aW9ucwogKiBAcGFyYW0gez89fSBzdWJJbnN0cnVjdGlvbnMKICogQHBhcmFtIHs/PX0gZXJyb3JzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBidWlsZEFuaW1hdGlvblRpbWVsaW5lcyhkcml2ZXIsIHJvb3RFbGVtZW50LCBhc3QsIGVudGVyQ2xhc3NOYW1lLCBsZWF2ZUNsYXNzTmFtZSwgc3RhcnRpbmdTdHlsZXMgPSB7fSwgZmluYWxTdHlsZXMgPSB7fSwgb3B0aW9ucywgc3ViSW5zdHJ1Y3Rpb25zLCBlcnJvcnMgPSBbXSkgewogICAgcmV0dXJuIG5ldyBBbmltYXRpb25UaW1lbGluZUJ1aWxkZXJWaXNpdG9yKCkuYnVpbGRLZXlmcmFtZXMoZHJpdmVyLCByb290RWxlbWVudCwgYXN0LCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIHN0YXJ0aW5nU3R5bGVzLCBmaW5hbFN0eWxlcywgb3B0aW9ucywgc3ViSW5zdHJ1Y3Rpb25zLCBlcnJvcnMpOwp9CmNsYXNzIEFuaW1hdGlvblRpbWVsaW5lQnVpbGRlclZpc2l0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRyaXZlcgogICAgICogQHBhcmFtIHs/fSByb290RWxlbWVudAogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gZW50ZXJDbGFzc05hbWUKICAgICAqIEBwYXJhbSB7P30gbGVhdmVDbGFzc05hbWUKICAgICAqIEBwYXJhbSB7P30gc3RhcnRpbmdTdHlsZXMKICAgICAqIEBwYXJhbSB7P30gZmluYWxTdHlsZXMKICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICogQHBhcmFtIHs/PX0gc3ViSW5zdHJ1Y3Rpb25zCiAgICAgKiBAcGFyYW0gez89fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ1aWxkS2V5ZnJhbWVzKGRyaXZlciwgcm9vdEVsZW1lbnQsIGFzdCwgZW50ZXJDbGFzc05hbWUsIGxlYXZlQ2xhc3NOYW1lLCBzdGFydGluZ1N0eWxlcywgZmluYWxTdHlsZXMsIG9wdGlvbnMsIHN1Ykluc3RydWN0aW9ucywgZXJyb3JzID0gW10pIHsKICAgICAgICBzdWJJbnN0cnVjdGlvbnMgPSBzdWJJbnN0cnVjdGlvbnMgfHwgbmV3IEVsZW1lbnRJbnN0cnVjdGlvbk1hcCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEFuaW1hdGlvblRpbWVsaW5lQ29udGV4dChkcml2ZXIsIHJvb3RFbGVtZW50LCBzdWJJbnN0cnVjdGlvbnMsIGVudGVyQ2xhc3NOYW1lLCBsZWF2ZUNsYXNzTmFtZSwgZXJyb3JzLCBbXSk7CiAgICAgICAgY29udGV4dC5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5zZXRTdHlsZXMoW3N0YXJ0aW5nU3R5bGVzXSwgbnVsbCwgY29udGV4dC5lcnJvcnMsIG9wdGlvbnMpOwogICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBhc3QsIGNvbnRleHQpOwogICAgICAgIC8vIHRoaXMgY2hlY2tzIHRvIHNlZSBpZiBhbiBhY3R1YWwgYW5pbWF0aW9uIGhhcHBlbmVkCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRpbWVsaW5lcyA9IGNvbnRleHQudGltZWxpbmVzLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0aW1lbGluZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdGltZWxpbmUgPT4gdGltZWxpbmUuY29udGFpbnNBbmltYXRpb24oKSkpOwogICAgICAgIGlmICh0aW1lbGluZXMubGVuZ3RoICYmIE9iamVjdC5rZXlzKGZpbmFsU3R5bGVzKS5sZW5ndGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0bCA9IHRpbWVsaW5lc1t0aW1lbGluZXMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIGlmICghdGwuYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKSkgewogICAgICAgICAgICAgICAgdGwuc2V0U3R5bGVzKFtmaW5hbFN0eWxlc10sIG51bGwsIGNvbnRleHQuZXJyb3JzLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGltZWxpbmVzLmxlbmd0aCA/IHRpbWVsaW5lcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGltZWxpbmUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRpbWVsaW5lID0+IHRpbWVsaW5lLmJ1aWxkS2V5ZnJhbWVzKCkpKSA6CiAgICAgICAgICAgIFtjcmVhdGVUaW1lbGluZUluc3RydWN0aW9uKHJvb3RFbGVtZW50LCBbXSwgW10sIFtdLCAwLCAwLCAnJywgZmFsc2UpXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRUcmlnZ2VyKGFzdCwgY29udGV4dCkgewogICAgICAgIC8vIHRoZXNlIHZhbHVlcyBhcmUgbm90IHZpc2l0ZWQgaW4gdGhpcyBBU1QKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRTdGF0ZShhc3QsIGNvbnRleHQpIHsKICAgICAgICAvLyB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB2aXNpdGVkIGluIHRoaXMgQVNUCiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0VHJhbnNpdGlvbihhc3QsIGNvbnRleHQpIHsKICAgICAgICAvLyB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB2aXNpdGVkIGluIHRoaXMgQVNUCiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0QW5pbWF0ZUNoaWxkKGFzdCwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50SW5zdHJ1Y3Rpb25zID0gY29udGV4dC5zdWJJbnN0cnVjdGlvbnMuY29uc3VtZShjb250ZXh0LmVsZW1lbnQpOwogICAgICAgIGlmIChlbGVtZW50SW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gY29udGV4dC5jcmVhdGVTdWJDb250ZXh0KGFzdC5vcHRpb25zKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gdGhpcy5fdmlzaXRTdWJJbnN0cnVjdGlvbnMoZWxlbWVudEluc3RydWN0aW9ucywgaW5uZXJDb250ZXh0LCAoLyoqIEB0eXBlIHs/fSAqLyAoaW5uZXJDb250ZXh0Lm9wdGlvbnMpKSk7CiAgICAgICAgICAgIGlmIChzdGFydFRpbWUgIT0gZW5kVGltZSkgewogICAgICAgICAgICAgICAgLy8gd2UgZG8gdGhpcyBvbiB0aGUgdXBwZXIgY29udGV4dCBiZWNhdXNlIHdlIGNyZWF0ZWQgYSBzdWIgY29udGV4dCBmb3IKICAgICAgICAgICAgICAgIC8vIHRoZSBzdWIgY2hpbGQgYW5pbWF0aW9ucwogICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoZW5kVGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBhc3Q7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0QW5pbWF0ZVJlZihhc3QsIGNvbnRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gY29udGV4dC5jcmVhdGVTdWJDb250ZXh0KGFzdC5vcHRpb25zKTsKICAgICAgICBpbm5lckNvbnRleHQudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCk7CiAgICAgICAgdGhpcy52aXNpdFJlZmVyZW5jZShhc3QuYW5pbWF0aW9uLCBpbm5lckNvbnRleHQpOwogICAgICAgIGNvbnRleHQudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKGlubmVyQ29udGV4dC5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUpOwogICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gYXN0OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBpbnN0cnVjdGlvbnMKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdmlzaXRTdWJJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZnVydGhlc3RUaW1lID0gc3RhcnRUaW1lOwogICAgICAgIC8vIHRoaXMgaXMgYSBzcGVjaWFsLWNhc2UgZm9yIHdoZW4gYSB1c2VyIHdhbnRzIHRvIHNraXAgYSBzdWIKICAgICAgICAvLyBhbmltYXRpb24gZnJvbSBiZWluZyBmaXJlZCBlbnRpcmVseS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uICE9IG51bGwgPyByZXNvbHZlVGltaW5nVmFsdWUob3B0aW9ucy5kdXJhdGlvbikgOiBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWxheSA9IG9wdGlvbnMuZGVsYXkgIT0gbnVsbCA/IHJlc29sdmVUaW1pbmdWYWx1ZShvcHRpb25zLmRlbGF5KSA6IG51bGw7CiAgICAgICAgaWYgKGR1cmF0aW9uICE9PSAwKSB7CiAgICAgICAgICAgIGluc3RydWN0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbnN0cnVjdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UaW1pbmdzID0gY29udGV4dC5hcHBlbmRJbnN0cnVjdGlvblRvVGltZWxpbmUoaW5zdHJ1Y3Rpb24sIGR1cmF0aW9uLCBkZWxheSk7CiAgICAgICAgICAgICAgICBmdXJ0aGVzdFRpbWUgPQogICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGZ1cnRoZXN0VGltZSwgaW5zdHJ1Y3Rpb25UaW1pbmdzLmR1cmF0aW9uICsgaW5zdHJ1Y3Rpb25UaW1pbmdzLmRlbGF5KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnVydGhlc3RUaW1lOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdFJlZmVyZW5jZShhc3QsIGNvbnRleHQpIHsKICAgICAgICBjb250ZXh0LnVwZGF0ZU9wdGlvbnMoYXN0Lm9wdGlvbnMsIHRydWUpOwogICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBhc3QuYW5pbWF0aW9uLCBjb250ZXh0KTsKICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRTZXF1ZW5jZShhc3QsIGNvbnRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3ViQ29udGV4dENvdW50ID0gY29udGV4dC5zdWJDb250ZXh0Q291bnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjdHggPSBjb250ZXh0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcHRpb25zID0gYXN0Lm9wdGlvbnM7CiAgICAgICAgaWYgKG9wdGlvbnMgJiYgKG9wdGlvbnMucGFyYW1zIHx8IG9wdGlvbnMuZGVsYXkpKSB7CiAgICAgICAgICAgIGN0eCA9IGNvbnRleHQuY3JlYXRlU3ViQ29udGV4dChvcHRpb25zKTsKICAgICAgICAgICAgY3R4LnRyYW5zZm9ybUludG9OZXdUaW1lbGluZSgpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5kZWxheSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoY3R4LnByZXZpb3VzTm9kZS50eXBlID09IDYgLyogU3R5bGUgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjdHguY3VycmVudFRpbWVsaW5lLnNuYXBzaG90Q3VycmVudFN0eWxlcygpOwogICAgICAgICAgICAgICAgICAgIGN0eC5wcmV2aW91c05vZGUgPSBERUZBVUxUX05PT1BfUFJFVklPVVNfTk9ERTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gcmVzb2x2ZVRpbWluZ1ZhbHVlKG9wdGlvbnMuZGVsYXkpOwogICAgICAgICAgICAgICAgY3R4LmRlbGF5TmV4dFN0ZXAoZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhc3Quc3RlcHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGFzdC5zdGVwcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzID0+IHZpc2l0RHNsTm9kZSh0aGlzLCBzLCBjdHgpKSk7CiAgICAgICAgICAgIC8vIHRoaXMgaXMgaGVyZSBqdXN0IGluY2FzZSB0aGUgaW5uZXIgc3RlcHMgb25seSBjb250YWluIG9yIGVuZCB3aXRoIGEgc3R5bGUoKSBjYWxsCiAgICAgICAgICAgIGN0eC5jdXJyZW50VGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBzb21lIGFuaW1hdGlvbiBmdW5jdGlvbiB3aXRoaW4gdGhlIHNlcXVlbmNlCiAgICAgICAgICAgIC8vIGVuZGVkIHVwIGNyZWF0aW5nIGEgc3ViIHRpbWVsaW5lICh3aGljaCBtZWFucyB0aGUgY3VycmVudAogICAgICAgICAgICAvLyB0aW1lbGluZSBjYW5ub3Qgb3ZlcmxhcCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgc2VxdWVuY2UpCiAgICAgICAgICAgIGlmIChjdHguc3ViQ29udGV4dENvdW50ID4gc3ViQ29udGV4dENvdW50KSB7CiAgICAgICAgICAgICAgICBjdHgudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBhc3Q7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0R3JvdXAoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlubmVyVGltZWxpbmVzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmdXJ0aGVzdFRpbWUgPSBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVsYXkgPSBhc3Qub3B0aW9ucyAmJiBhc3Qub3B0aW9ucy5kZWxheSA/IHJlc29sdmVUaW1pbmdWYWx1ZShhc3Qub3B0aW9ucy5kZWxheSkgOiAwOwogICAgICAgIGFzdC5zdGVwcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHMgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlubmVyQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlU3ViQ29udGV4dChhc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGlmIChkZWxheSkgewogICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0LmRlbGF5TmV4dFN0ZXAoZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBzLCBpbm5lckNvbnRleHQpOwogICAgICAgICAgICBmdXJ0aGVzdFRpbWUgPSBNYXRoLm1heChmdXJ0aGVzdFRpbWUsIGlubmVyQ29udGV4dC5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUpOwogICAgICAgICAgICBpbm5lclRpbWVsaW5lcy5wdXNoKGlubmVyQ29udGV4dC5jdXJyZW50VGltZWxpbmUpOwogICAgICAgIH0pKTsKICAgICAgICAvLyB0aGlzIG9wZXJhdGlvbiBpcyBydW4gYWZ0ZXIgdGhlIEFTVCBsb29wIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgICAgICAgLy8gaWYgdGhlIHBhcmVudCB0aW1lbGluZSdzIGNvbGxlY3RlZCBzdHlsZXMgd2VyZSB1cGRhdGVkIHRoZW4KICAgICAgICAvLyBpdCB3b3VsZCBwYXNzIGluIGludmFsaWQgZGF0YSBpbnRvIHRoZSBuZXctdG8tYmUgZm9ya2VkIGl0ZW1zCiAgICAgICAgaW5uZXJUaW1lbGluZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0aW1lbGluZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdGltZWxpbmUgPT4gY29udGV4dC5jdXJyZW50VGltZWxpbmUubWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyh0aW1lbGluZSkpKTsKICAgICAgICBjb250ZXh0LnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShmdXJ0aGVzdFRpbWUpOwogICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gYXN0OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Zpc2l0VGltaW5nKGFzdCwgY29udGV4dCkgewogICAgICAgIGlmICgoKC8qKiBAdHlwZSB7P30gKi8gKGFzdCkpKS5keW5hbWljKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGFzdCkpKS5zdHJWYWx1ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1pbmdWYWx1ZSA9IGNvbnRleHQucGFyYW1zID8gaW50ZXJwb2xhdGVQYXJhbXMoc3RyVmFsdWUsIGNvbnRleHQucGFyYW1zLCBjb250ZXh0LmVycm9ycykgOiBzdHJWYWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUaW1pbmcodGltaW5nVmFsdWUsIGNvbnRleHQuZXJyb3JzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB7IGR1cmF0aW9uOiBhc3QuZHVyYXRpb24sIGRlbGF5OiBhc3QuZGVsYXksIGVhc2luZzogYXN0LmVhc2luZyB9OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRBbmltYXRlKGFzdCwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1pbmdzID0gY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSB0aGlzLl92aXNpdFRpbWluZyhhc3QudGltaW5ncywgY29udGV4dCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRpbWVsaW5lID0gY29udGV4dC5jdXJyZW50VGltZWxpbmU7CiAgICAgICAgaWYgKHRpbWluZ3MuZGVsYXkpIHsKICAgICAgICAgICAgY29udGV4dC5pbmNyZW1lbnRUaW1lKHRpbWluZ3MuZGVsYXkpOwogICAgICAgICAgICB0aW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0eWxlID0gYXN0LnN0eWxlOwogICAgICAgIGlmIChzdHlsZS50eXBlID09IDUgLyogS2V5ZnJhbWVzICovKSB7CiAgICAgICAgICAgIHRoaXMudmlzaXRLZXlmcmFtZXMoc3R5bGUsIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29udGV4dC5pbmNyZW1lbnRUaW1lKHRpbWluZ3MuZHVyYXRpb24pOwogICAgICAgICAgICB0aGlzLnZpc2l0U3R5bGUoKC8qKiBAdHlwZSB7P30gKi8gKHN0eWxlKSksIGNvbnRleHQpOwogICAgICAgICAgICB0aW1lbGluZS5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKTsKICAgICAgICB9CiAgICAgICAgY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSBudWxsOwogICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gYXN0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdFN0eWxlKGFzdCwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1lbGluZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1pbmdzID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY3VycmVudEFuaW1hdGVUaW1pbmdzKSk7CiAgICAgICAgLy8gdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3Igd2hlbiBhIHN0eWxlKCkgY2FsbAogICAgICAgIC8vIGRpcmVjdGx5IGZvbGxvd3MgIGFuIGFuaW1hdGUoKSBjYWxsIChidXQgbm90IGluc2lkZSBvZiBhbiBhbmltYXRlKCkgY2FsbCkKICAgICAgICBpZiAoIXRpbWluZ3MgJiYgdGltZWxpbmUuZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCkgewogICAgICAgICAgICB0aW1lbGluZS5mb3J3YXJkRnJhbWUoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVhc2luZyA9ICh0aW1pbmdzICYmIHRpbWluZ3MuZWFzaW5nKSB8fCBhc3QuZWFzaW5nOwogICAgICAgIGlmIChhc3QuaXNFbXB0eVN0ZXApIHsKICAgICAgICAgICAgdGltZWxpbmUuYXBwbHlFbXB0eVN0ZXAoZWFzaW5nKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRpbWVsaW5lLnNldFN0eWxlcyhhc3Quc3R5bGVzLCBlYXNpbmcsIGNvbnRleHQuZXJyb3JzLCBjb250ZXh0Lm9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlzaXRLZXlmcmFtZXMoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRBbmltYXRlVGltaW5ncyA9ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncykpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFydFRpbWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY3VycmVudFRpbWVsaW5lKSkpLmR1cmF0aW9uOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGN1cnJlbnRBbmltYXRlVGltaW5ncy5kdXJhdGlvbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gY29udGV4dC5jcmVhdGVTdWJDb250ZXh0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlubmVyVGltZWxpbmUgPSBpbm5lckNvbnRleHQuY3VycmVudFRpbWVsaW5lOwogICAgICAgIGlubmVyVGltZWxpbmUuZWFzaW5nID0gY3VycmVudEFuaW1hdGVUaW1pbmdzLmVhc2luZzsKICAgICAgICBhc3Quc3R5bGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RlcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RlcCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RlcC5vZmZzZXQgfHwgMDsKICAgICAgICAgICAgaW5uZXJUaW1lbGluZS5mb3J3YXJkVGltZShvZmZzZXQgKiBkdXJhdGlvbik7CiAgICAgICAgICAgIGlubmVyVGltZWxpbmUuc2V0U3R5bGVzKHN0ZXAuc3R5bGVzLCBzdGVwLmVhc2luZywgY29udGV4dC5lcnJvcnMsIGNvbnRleHQub3B0aW9ucyk7CiAgICAgICAgICAgIGlubmVyVGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgfSkpOwogICAgICAgIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgcGFyZW50IHRpbWVsaW5lIGdldHMgYWxsIHRoZSBzdHlsZXMgZnJvbQogICAgICAgIC8vIHRoZSBjaGlsZCBldmVuIGlmIHRoZSBuZXcgdGltZWxpbmUgYmVsb3cgaXMgbm90IHVzZWQKICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKGlubmVyVGltZWxpbmUpOwogICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgd2luZG93IGJldHdlZW4gdGhpcyB0aW1lbGluZSBhbmQgdGhlIHN1YiB0aW1lbGluZQogICAgICAgIC8vIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgc3R5bGVzIHdpdGhpbiBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGV5IHdlcmUgYmVmb3JlCiAgICAgICAgY29udGV4dC50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoc3RhcnRUaW1lICsgZHVyYXRpb24pOwogICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gYXN0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aXNpdFF1ZXJ5KGFzdCwgY29udGV4dCkgewogICAgICAgIC8vIGluIHRoZSBldmVudCB0aGF0IHRoZSBmaXJzdCBzdGVwIGJlZm9yZSB0aGlzIGlzIGEgc3R5bGUgc3RlcCB3ZSBuZWVkCiAgICAgICAgLy8gdG8gZW5zdXJlIHRoZSBzdHlsZXMgYXJlIGFwcGxpZWQgYmVmb3JlIHRoZSBjaGlsZHJlbiBhcmUgYW5pbWF0ZWQKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gY29udGV4dC5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKGFzdC5vcHRpb25zIHx8IHt9KSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWxheSA9IG9wdGlvbnMuZGVsYXkgPyByZXNvbHZlVGltaW5nVmFsdWUob3B0aW9ucy5kZWxheSkgOiAwOwogICAgICAgIGlmIChkZWxheSAmJgogICAgICAgICAgICAoY29udGV4dC5wcmV2aW91c05vZGUudHlwZSA9PT0gNiAvKiBTdHlsZSAqLyB8fAogICAgICAgICAgICAgICAgKHN0YXJ0VGltZSA9PSAwICYmIGNvbnRleHQuY3VycmVudFRpbWVsaW5lLmdldEN1cnJlbnRTdHlsZVByb3BlcnRpZXMoKS5sZW5ndGgpKSkgewogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBERUZBVUxUX05PT1BfUFJFVklPVVNfTk9ERTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmdXJ0aGVzdFRpbWUgPSBzdGFydFRpbWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsbXMgPSBjb250ZXh0Lmludm9rZVF1ZXJ5KGFzdC5zZWxlY3RvciwgYXN0Lm9yaWdpbmFsU2VsZWN0b3IsIGFzdC5saW1pdCwgYXN0LmluY2x1ZGVTZWxmLCBvcHRpb25zLm9wdGlvbmFsID8gdHJ1ZSA6IGZhbHNlLCBjb250ZXh0LmVycm9ycyk7CiAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlUb3RhbCA9IGVsbXMubGVuZ3RoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2FtZUVsZW1lbnRUaW1lbGluZSA9IG51bGw7CiAgICAgICAgZWxtcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChlbGVtZW50LCBpKSA9PiB7CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5SW5kZXggPSBpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlubmVyQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlU3ViQ29udGV4dChhc3Qub3B0aW9ucywgZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChkZWxheSkgewogICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0LmRlbGF5TmV4dFN0ZXAoZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSBjb250ZXh0LmVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50VGltZWxpbmUgPSBpbm5lckNvbnRleHQuY3VycmVudFRpbWVsaW5lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBhc3QuYW5pbWF0aW9uLCBpbm5lckNvbnRleHQpOwogICAgICAgICAgICAvLyB0aGlzIGlzIGhlcmUganVzdCBpbmNhc2UgdGhlIGlubmVyIHN0ZXBzIG9ubHkgY29udGFpbiBvciBlbmQKICAgICAgICAgICAgLy8gd2l0aCBhIHN0eWxlKCkgY2FsbCAod2hpY2ggaXMgaGVyZSB0byBzaWduYWwgdGhhdCB0aGlzIGlzIGEgcHJlcGFyYXRvcnkKICAgICAgICAgICAgLy8gY2FsbCB0byBzdHlsZSBhbiBlbGVtZW50IGJlZm9yZSBpdCBpcyBhbmltYXRlZCBhZ2FpbikKICAgICAgICAgICAgaW5uZXJDb250ZXh0LmN1cnJlbnRUaW1lbGluZS5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gaW5uZXJDb250ZXh0LmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZTsKICAgICAgICAgICAgZnVydGhlc3RUaW1lID0gTWF0aC5tYXgoZnVydGhlc3RUaW1lLCBlbmRUaW1lKTsKICAgICAgICB9KSk7CiAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlJbmRleCA9IDA7CiAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlUb3RhbCA9IDA7CiAgICAgICAgY29udGV4dC50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoZnVydGhlc3RUaW1lKTsKICAgICAgICBpZiAoc2FtZUVsZW1lbnRUaW1lbGluZSkgewogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHNhbWVFbGVtZW50VGltZWxpbmUpOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICB9CiAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBhc3Q7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpc2l0U3RhZ2dlcihhc3QsIGNvbnRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LnBhcmVudENvbnRleHQpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGwgPSBjb250ZXh0LmN1cnJlbnRUaW1lbGluZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGltaW5ncyA9IGFzdC50aW1pbmdzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGguYWJzKHRpbWluZ3MuZHVyYXRpb24pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXhUaW1lID0gZHVyYXRpb24gKiAoY29udGV4dC5jdXJyZW50UXVlcnlUb3RhbCAtIDEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGVsYXkgPSBkdXJhdGlvbiAqIGNvbnRleHQuY3VycmVudFF1ZXJ5SW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdGFnZ2VyVHJhbnNmb3JtZXIgPSB0aW1pbmdzLmR1cmF0aW9uIDwgMCA/ICdyZXZlcnNlJyA6IHRpbWluZ3MuZWFzaW5nOwogICAgICAgIHN3aXRjaCAoc3RhZ2dlclRyYW5zZm9ybWVyKSB7CiAgICAgICAgICAgIGNhc2UgJ3JldmVyc2UnOgogICAgICAgICAgICAgICAgZGVsYXkgPSBtYXhUaW1lIC0gZGVsYXk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZnVsbCc6CiAgICAgICAgICAgICAgICBkZWxheSA9IHBhcmVudENvbnRleHQuY3VycmVudFN0YWdnZXJUaW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1lbGluZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lOwogICAgICAgIGlmIChkZWxheSkgewogICAgICAgICAgICB0aW1lbGluZS5kZWxheU5leHRTdGVwKGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0aW5nVGltZSA9IHRpbWVsaW5lLmN1cnJlbnRUaW1lOwogICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBhc3QuYW5pbWF0aW9uLCBjb250ZXh0KTsKICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgICAgICAvLyB0aW1lID0gZHVyYXRpb24gKyBkZWxheQogICAgICAgIC8vIHRoZSByZWFzb24gd2h5IHRoaXMgY29tcHV0YXRpb24gaXMgc28gY29tcGxleCBpcyBiZWNhdXNlCiAgICAgICAgLy8gdGhlIGlubmVyIHRpbWVsaW5lIG1heSBlaXRoZXIgaGF2ZSBhIGRlbGF5IHZhbHVlIG9yIGEgc3RyZXRjaGVkCiAgICAgICAgLy8ga2V5ZnJhbWUgZGVwZW5kaW5nIG9uIGlmIGEgc3VidGltZWxpbmUgaXMgbm90IHVzZWQgb3IgaXMgdXNlZC4KICAgICAgICBwYXJlbnRDb250ZXh0LmN1cnJlbnRTdGFnZ2VyVGltZSA9CiAgICAgICAgICAgICh0bC5jdXJyZW50VGltZSAtIHN0YXJ0aW5nVGltZSkgKyAodGwuc3RhcnRUaW1lIC0gcGFyZW50Q29udGV4dC5jdXJyZW50VGltZWxpbmUuc3RhcnRUaW1lKTsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IERFRkFVTFRfTk9PUF9QUkVWSU9VU19OT0RFID0gKC8qKiBAdHlwZSB7P30gKi8gKHt9KSk7CmNsYXNzIEFuaW1hdGlvblRpbWVsaW5lQ29udGV4dCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RyaXZlcgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHN1Ykluc3RydWN0aW9ucwogICAgICogQHBhcmFtIHs/fSBfZW50ZXJDbGFzc05hbWUKICAgICAqIEBwYXJhbSB7P30gX2xlYXZlQ2xhc3NOYW1lCiAgICAgKiBAcGFyYW0gez99IGVycm9ycwogICAgICogQHBhcmFtIHs/fSB0aW1lbGluZXMKICAgICAqIEBwYXJhbSB7Pz19IGluaXRpYWxUaW1lbGluZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZHJpdmVyLCBlbGVtZW50LCBzdWJJbnN0cnVjdGlvbnMsIF9lbnRlckNsYXNzTmFtZSwgX2xlYXZlQ2xhc3NOYW1lLCBlcnJvcnMsIHRpbWVsaW5lcywgaW5pdGlhbFRpbWVsaW5lKSB7CiAgICAgICAgdGhpcy5fZHJpdmVyID0gX2RyaXZlcjsKICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgIHRoaXMuc3ViSW5zdHJ1Y3Rpb25zID0gc3ViSW5zdHJ1Y3Rpb25zOwogICAgICAgIHRoaXMuX2VudGVyQ2xhc3NOYW1lID0gX2VudGVyQ2xhc3NOYW1lOwogICAgICAgIHRoaXMuX2xlYXZlQ2xhc3NOYW1lID0gX2xlYXZlQ2xhc3NOYW1lOwogICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgIHRoaXMudGltZWxpbmVzID0gdGltZWxpbmVzOwogICAgICAgIHRoaXMucGFyZW50Q29udGV4dCA9IG51bGw7CiAgICAgICAgdGhpcy5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSBudWxsOwogICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gREVGQVVMVF9OT09QX1BSRVZJT1VTX05PREU7CiAgICAgICAgdGhpcy5zdWJDb250ZXh0Q291bnQgPSAwOwogICAgICAgIHRoaXMub3B0aW9ucyA9IHt9OwogICAgICAgIHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggPSAwOwogICAgICAgIHRoaXMuY3VycmVudFF1ZXJ5VG90YWwgPSAwOwogICAgICAgIHRoaXMuY3VycmVudFN0YWdnZXJUaW1lID0gMDsKICAgICAgICB0aGlzLmN1cnJlbnRUaW1lbGluZSA9IGluaXRpYWxUaW1lbGluZSB8fCBuZXcgVGltZWxpbmVCdWlsZGVyKHRoaXMuX2RyaXZlciwgZWxlbWVudCwgMCk7CiAgICAgICAgdGltZWxpbmVzLnB1c2godGhpcy5jdXJyZW50VGltZWxpbmUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGFyYW1zKCkgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucGFyYW1zOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqIEBwYXJhbSB7Pz19IHNraXBJZkV4aXN0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdXBkYXRlT3B0aW9ucyhvcHRpb25zLCBza2lwSWZFeGlzdHMpIHsKICAgICAgICBpZiAoIW9wdGlvbnMpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvcHRpb25zVG9VcGRhdGUgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgLy8gTk9URTogdGhpcyB3aWxsIGdldCBwYXRjaGVkIHVwIHdoZW4gb3RoZXIgYW5pbWF0aW9uIG1ldGhvZHMgc3VwcG9ydCBkdXJhdGlvbiBvdmVycmlkZXMKICAgICAgICBpZiAobmV3T3B0aW9ucy5kdXJhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9uc1RvVXBkYXRlKSkpLmR1cmF0aW9uID0gcmVzb2x2ZVRpbWluZ1ZhbHVlKG5ld09wdGlvbnMuZHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAobmV3T3B0aW9ucy5kZWxheSAhPSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnNUb1VwZGF0ZS5kZWxheSA9IHJlc29sdmVUaW1pbmdWYWx1ZShuZXdPcHRpb25zLmRlbGF5KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IG5ld09wdGlvbnMucGFyYW1zOwogICAgICAgIGlmIChuZXdQYXJhbXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGFyYW1zVG9VcGRhdGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9uc1RvVXBkYXRlLnBhcmFtcykpOwogICAgICAgICAgICBpZiAoIXBhcmFtc1RvVXBkYXRlKSB7CiAgICAgICAgICAgICAgICBwYXJhbXNUb1VwZGF0ZSA9IHRoaXMub3B0aW9ucy5wYXJhbXMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBPYmplY3Qua2V5cyhuZXdQYXJhbXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5hbWUgPT4gewogICAgICAgICAgICAgICAgaWYgKCFza2lwSWZFeGlzdHMgfHwgIXBhcmFtc1RvVXBkYXRlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVG9VcGRhdGVbbmFtZV0gPSBpbnRlcnBvbGF0ZVBhcmFtcyhuZXdQYXJhbXNbbmFtZV0sIHBhcmFtc1RvVXBkYXRlLCB0aGlzLmVycm9ycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY29weU9wdGlvbnMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb2xkUGFyYW1zID0gdGhpcy5vcHRpb25zLnBhcmFtczsKICAgICAgICAgICAgaWYgKG9sZFBhcmFtcykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gb3B0aW9uc1sncGFyYW1zJ10gPSB7fTsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9sZFBhcmFtcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG5hbWUgPT4gewogICAgICAgICAgICAgICAgICAgIHBhcmFtc1tuYW1lXSA9IG9sZFBhcmFtc1tuYW1lXTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHBhcmFtIHs/PX0gZWxlbWVudAogICAgICogQHBhcmFtIHs/PX0gbmV3VGltZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlU3ViQ29udGV4dChvcHRpb25zID0gbnVsbCwgZWxlbWVudCwgbmV3VGltZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YXJnZXQgPSBlbGVtZW50IHx8IHRoaXMuZWxlbWVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBBbmltYXRpb25UaW1lbGluZUNvbnRleHQodGhpcy5fZHJpdmVyLCB0YXJnZXQsIHRoaXMuc3ViSW5zdHJ1Y3Rpb25zLCB0aGlzLl9lbnRlckNsYXNzTmFtZSwgdGhpcy5fbGVhdmVDbGFzc05hbWUsIHRoaXMuZXJyb3JzLCB0aGlzLnRpbWVsaW5lcywgdGhpcy5jdXJyZW50VGltZWxpbmUuZm9yayh0YXJnZXQsIG5ld1RpbWUgfHwgMCkpOwogICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gdGhpcy5wcmV2aW91c05vZGU7CiAgICAgICAgY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSB0aGlzLmN1cnJlbnRBbmltYXRlVGltaW5nczsKICAgICAgICBjb250ZXh0Lm9wdGlvbnMgPSB0aGlzLl9jb3B5T3B0aW9ucygpOwogICAgICAgIGNvbnRleHQudXBkYXRlT3B0aW9ucyhvcHRpb25zKTsKICAgICAgICBjb250ZXh0LmN1cnJlbnRRdWVyeUluZGV4ID0gdGhpcy5jdXJyZW50UXVlcnlJbmRleDsKICAgICAgICBjb250ZXh0LmN1cnJlbnRRdWVyeVRvdGFsID0gdGhpcy5jdXJyZW50UXVlcnlUb3RhbDsKICAgICAgICBjb250ZXh0LnBhcmVudENvbnRleHQgPSB0aGlzOwogICAgICAgIHRoaXMuc3ViQ29udGV4dENvdW50Kys7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IG5ld1RpbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybUludG9OZXdUaW1lbGluZShuZXdUaW1lKSB7CiAgICAgICAgdGhpcy5wcmV2aW91c05vZGUgPSBERUZBVUxUX05PT1BfUFJFVklPVVNfTk9ERTsKICAgICAgICB0aGlzLmN1cnJlbnRUaW1lbGluZSA9IHRoaXMuY3VycmVudFRpbWVsaW5lLmZvcmsodGhpcy5lbGVtZW50LCBuZXdUaW1lKTsKICAgICAgICB0aGlzLnRpbWVsaW5lcy5wdXNoKHRoaXMuY3VycmVudFRpbWVsaW5lKTsKICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGltZWxpbmU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb24KICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAqIEBwYXJhbSB7P30gZGVsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFwcGVuZEluc3RydWN0aW9uVG9UaW1lbGluZShpbnN0cnVjdGlvbiwgZHVyYXRpb24sIGRlbGF5KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHVwZGF0ZWRUaW1pbmdzID0gewogICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gIT0gbnVsbCA/IGR1cmF0aW9uIDogaW5zdHJ1Y3Rpb24uZHVyYXRpb24sCiAgICAgICAgICAgIGRlbGF5OiB0aGlzLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSArIChkZWxheSAhPSBudWxsID8gZGVsYXkgOiAwKSArIGluc3RydWN0aW9uLmRlbGF5LAogICAgICAgICAgICBlYXNpbmc6ICcnCiAgICAgICAgfTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBTdWJUaW1lbGluZUJ1aWxkZXIodGhpcy5fZHJpdmVyLCBpbnN0cnVjdGlvbi5lbGVtZW50LCBpbnN0cnVjdGlvbi5rZXlmcmFtZXMsIGluc3RydWN0aW9uLnByZVN0eWxlUHJvcHMsIGluc3RydWN0aW9uLnBvc3RTdHlsZVByb3BzLCB1cGRhdGVkVGltaW5ncywgaW5zdHJ1Y3Rpb24uc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWUpOwogICAgICAgIHRoaXMudGltZWxpbmVzLnB1c2goYnVpbGRlcik7CiAgICAgICAgcmV0dXJuIHVwZGF0ZWRUaW1pbmdzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRpbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGluY3JlbWVudFRpbWUodGltZSkgewogICAgICAgIHRoaXMuY3VycmVudFRpbWVsaW5lLmZvcndhcmRUaW1lKHRoaXMuY3VycmVudFRpbWVsaW5lLmR1cmF0aW9uICsgdGltZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZGVsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlbGF5TmV4dFN0ZXAoZGVsYXkpIHsKICAgICAgICAvLyBuZWdhdGl2ZSBkZWxheXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkCiAgICAgICAgaWYgKGRlbGF5ID4gMCkgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lbGluZS5kZWxheU5leHRTdGVwKGRlbGF5KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAqIEBwYXJhbSB7P30gb3JpZ2luYWxTZWxlY3RvcgogICAgICogQHBhcmFtIHs/fSBsaW1pdAogICAgICogQHBhcmFtIHs/fSBpbmNsdWRlU2VsZgogICAgICogQHBhcmFtIHs/fSBvcHRpb25hbAogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGludm9rZVF1ZXJ5KHNlbGVjdG9yLCBvcmlnaW5hbFNlbGVjdG9yLCBsaW1pdCwgaW5jbHVkZVNlbGYsIG9wdGlvbmFsLCBlcnJvcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTsKICAgICAgICBpZiAoaW5jbHVkZVNlbGYpIHsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7IC8vIGlmIDpzZWxmIGlzIG9ubHkgdXNlZCB0aGVuIHRoZSBzZWxlY3RvciBpcyBlbXB0eQogICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoRU5URVJfVE9LRU5fUkVHRVgsICcuJyArIHRoaXMuX2VudGVyQ2xhc3NOYW1lKTsKICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKExFQVZFX1RPS0VOX1JFR0VYLCAnLicgKyB0aGlzLl9sZWF2ZUNsYXNzTmFtZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbXVsdGkgPSBsaW1pdCAhPSAxOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IHRoaXMuX2RyaXZlci5xdWVyeSh0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSk7CiAgICAgICAgICAgIGlmIChsaW1pdCAhPT0gMCkgewogICAgICAgICAgICAgICAgZWxlbWVudHMgPSBsaW1pdCA8IDAgPyBlbGVtZW50cy5zbGljZShlbGVtZW50cy5sZW5ndGggKyBsaW1pdCwgZWxlbWVudHMubGVuZ3RoKSA6CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuc2xpY2UoMCwgbGltaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5lbGVtZW50cyk7CiAgICAgICAgfQogICAgICAgIGlmICghb3B0aW9uYWwgJiYgcmVzdWx0cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICBlcnJvcnMucHVzaChgXGBxdWVyeSgiJHtvcmlnaW5hbFNlbGVjdG9yfSIpXGAgcmV0dXJuZWQgemVybyBlbGVtZW50cy4gKFVzZSBcYHF1ZXJ5KCIke29yaWdpbmFsU2VsZWN0b3J9IiwgeyBvcHRpb25hbDogdHJ1ZSB9KVxgIGlmIHlvdSB3aXNoIHRvIGFsbG93IHRoaXMuKWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KfQpjbGFzcyBUaW1lbGluZUJ1aWxkZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9kcml2ZXIKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzdGFydFRpbWUKICAgICAqIEBwYXJhbSB7Pz19IF9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAKICAgICAqLwogICAgY29uc3RydWN0b3IoX2RyaXZlciwgZWxlbWVudCwgc3RhcnRUaW1lLCBfZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKSB7CiAgICAgICAgdGhpcy5fZHJpdmVyID0gX2RyaXZlcjsKICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgIHRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOwogICAgICAgIHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cCA9IF9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXA7CiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDA7CiAgICAgICAgdGhpcy5fcHJldmlvdXNLZXlmcmFtZSA9IHt9OwogICAgICAgIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSA9IHt9OwogICAgICAgIHRoaXMuX2tleWZyYW1lcyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLl9zdHlsZVN1bW1hcnkgPSB7fTsKICAgICAgICB0aGlzLl9wZW5kaW5nU3R5bGVzID0ge307CiAgICAgICAgdGhpcy5fYmFja0ZpbGwgPSB7fTsKICAgICAgICB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUgPSBudWxsOwogICAgICAgIGlmICghdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cCA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcyA9IE9iamVjdC5jcmVhdGUodGhpcy5fYmFja0ZpbGwsIHt9KTsKICAgICAgICB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAuZ2V0KGVsZW1lbnQpKSk7CiAgICAgICAgaWYgKCF0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcykgewogICAgICAgICAgICB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcyA9IHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXM7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cC5zZXQoZWxlbWVudCwgdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2xvYWRLZXlmcmFtZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb250YWluc0FuaW1hdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX2tleWZyYW1lcy5zaXplKSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEN1cnJlbnRTdHlsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2N1cnJlbnRLZXlmcmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjdXJyZW50VGltZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydFRpbWUgKyB0aGlzLmR1cmF0aW9uOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZWxheU5leHRTdGVwKGRlbGF5KSB7CiAgICAgICAgLy8gaW4gdGhlIGV2ZW50IHRoYXQgYSBzdHlsZSgpIHN0ZXAgaXMgcGxhY2VkIHJpZ2h0IGJlZm9yZSBhIHN0YWdnZXIoKQogICAgICAgIC8vIGFuZCB0aGF0IHN0eWxlKCkgc3RlcCBpcyB0aGUgdmVyeSBmaXJzdCBzdHlsZSgpIHZhbHVlIGluIHRoZSBhbmltYXRpb24KICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGtleWZyYW1lIFswLCBjb3B5LCAxXSBzbyB0aGF0IHRoZSBkZWxheQogICAgICAgIC8vIHByb3Blcmx5IGFwcGxpZXMgdGhlIHN0eWxlKCkgdmFsdWVzIHRvIHdvcmsgd2l0aCB0aGUgc3RhZ2dlci4uLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBoYXNQcmVTdHlsZVN0ZXAgPSB0aGlzLl9rZXlmcmFtZXMuc2l6ZSA9PSAxICYmIE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdTdHlsZXMpLmxlbmd0aDsKICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiB8fCBoYXNQcmVTdHlsZVN0ZXApIHsKICAgICAgICAgICAgdGhpcy5mb3J3YXJkVGltZSh0aGlzLmN1cnJlbnRUaW1lICsgZGVsYXkpOwogICAgICAgICAgICBpZiAoaGFzUHJlU3R5bGVTdGVwKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90Q3VycmVudFN0eWxlcygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSArPSBkZWxheTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/PX0gY3VycmVudFRpbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvcmsoZWxlbWVudCwgY3VycmVudFRpbWUpIHsKICAgICAgICB0aGlzLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpOwogICAgICAgIHJldHVybiBuZXcgVGltZWxpbmVCdWlsZGVyKHRoaXMuX2RyaXZlciwgZWxlbWVudCwgY3VycmVudFRpbWUgfHwgdGhpcy5jdXJyZW50VGltZSwgdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9sb2FkS2V5ZnJhbWUoKSB7CiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRLZXlmcmFtZSkgewogICAgICAgICAgICB0aGlzLl9wcmV2aW91c0tleWZyYW1lID0gdGhpcy5fY3VycmVudEtleWZyYW1lOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jdXJyZW50S2V5ZnJhbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fa2V5ZnJhbWVzLmdldCh0aGlzLmR1cmF0aW9uKSkpOwogICAgICAgIGlmICghdGhpcy5fY3VycmVudEtleWZyYW1lKSB7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSA9IE9iamVjdC5jcmVhdGUodGhpcy5fYmFja0ZpbGwsIHt9KTsKICAgICAgICAgICAgdGhpcy5fa2V5ZnJhbWVzLnNldCh0aGlzLmR1cmF0aW9uLCB0aGlzLl9jdXJyZW50S2V5ZnJhbWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yd2FyZEZyYW1lKCkgewogICAgICAgIHRoaXMuZHVyYXRpb24gKz0gT05FX0ZSQU1FX0lOX01JTExJU0VDT05EUzsKICAgICAgICB0aGlzLl9sb2FkS2V5ZnJhbWUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0aW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3J3YXJkVGltZSh0aW1lKSB7CiAgICAgICAgdGhpcy5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKTsKICAgICAgICB0aGlzLmR1cmF0aW9uID0gdGltZTsKICAgICAgICB0aGlzLl9sb2FkS2V5ZnJhbWUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZVN0eWxlKHByb3AsIHZhbHVlKSB7CiAgICAgICAgdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlc1twcm9wXSA9IHZhbHVlOwogICAgICAgIHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzW3Byb3BdID0gdmFsdWU7CiAgICAgICAgdGhpcy5fc3R5bGVTdW1tYXJ5W3Byb3BdID0geyB0aW1lOiB0aGlzLmN1cnJlbnRUaW1lLCB2YWx1ZSB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhbGxvd09ubHlUaW1lbGluZVN0eWxlcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudEVtcHR5U3RlcEtleWZyYW1lICE9PSB0aGlzLl9jdXJyZW50S2V5ZnJhbWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWFzaW5nCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhcHBseUVtcHR5U3RlcChlYXNpbmcpIHsKICAgICAgICBpZiAoZWFzaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWVbJ2Vhc2luZyddID0gZWFzaW5nOwogICAgICAgIH0KICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGFuaW1hdGUoZHVyYXRpb24pOgogICAgICAgIC8vIGFsbCBtaXNzaW5nIHN0eWxlcyBhcmUgZmlsbGVkIHdpdGggYSBgKmAgdmFsdWUgdGhlbgogICAgICAgIC8vIGlmIGFueSBkZXN0aW5hdGlvbiBzdHlsZXMgYXJlIGZpbGxlZCBpbiBsYXRlciBvbiB0aGUgc2FtZQogICAgICAgIC8vIGtleWZyYW1lIHRoZW4gdGhleSB3aWxsIG92ZXJyaWRlIHRoZSBvdmVycmlkZGVuIHN0eWxlcwogICAgICAgIC8vIFdlIHVzZSBgX2dsb2JhbFRpbWVsaW5lU3R5bGVzYCBoZXJlIGJlY2F1c2UgdGhlcmUgbWF5IGJlCiAgICAgICAgLy8gc3R5bGVzIGluIHByZXZpb3VzIGtleWZyYW1lcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGlzIHRpbWVsaW5lCiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgIHRoaXMuX2JhY2tGaWxsW3Byb3BdID0gdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXNbcHJvcF0gfHwgQVVUT19TVFlMRTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudEtleWZyYW1lW3Byb3BdID0gQVVUT19TVFlMRTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fY3VycmVudEVtcHR5U3RlcEtleWZyYW1lID0gdGhpcy5fY3VycmVudEtleWZyYW1lOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlucHV0CiAgICAgKiBAcGFyYW0gez99IGVhc2luZwogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFN0eWxlcyhpbnB1dCwgZWFzaW5nLCBlcnJvcnMsIG9wdGlvbnMpIHsKICAgICAgICBpZiAoZWFzaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWVbJ2Vhc2luZyddID0gZWFzaW5nOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyYW1zID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5wYXJhbXMpIHx8IHt9OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzJDEoaW5wdXQsIHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzKTsKICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsID0gaW50ZXJwb2xhdGVQYXJhbXMoc3R5bGVzW3Byb3BdLCBwYXJhbXMsIGVycm9ycyk7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTdHlsZXNbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgIGlmICghdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgdGhpcy5fYmFja0ZpbGxbcHJvcF0gPSB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXNbcHJvcF0gOgogICAgICAgICAgICAgICAgICAgIEFVVE9fU1RZTEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3R5bGUocHJvcCwgdmFsKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5fcGVuZGluZ1N0eWxlczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhzdHlsZXMpOwogICAgICAgIGlmIChwcm9wcy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMuX3BlbmRpbmdTdHlsZXMgPSB7fTsKICAgICAgICBwcm9wcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHN0eWxlc1twcm9wXTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudEtleWZyYW1lW3Byb3BdID0gdmFsOwogICAgICAgIH0pKTsKICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRLZXlmcmFtZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudEtleWZyYW1lW3Byb3BdID0gdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlc1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc25hcHNob3RDdXJyZW50U3R5bGVzKCkgewogICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlc1twcm9wXTsKICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1N0eWxlc1twcm9wXSA9IHZhbDsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3R5bGUocHJvcCwgdmFsKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEZpbmFsS2V5ZnJhbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2tleWZyYW1lcy5nZXQodGhpcy5kdXJhdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gW107CiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLl9jdXJyZW50S2V5ZnJhbWUpIHsKICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHByb3ApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvcGVydGllczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0aW1lbGluZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyh0aW1lbGluZSkgewogICAgICAgIE9iamVjdC5rZXlzKHRpbWVsaW5lLl9zdHlsZVN1bW1hcnkpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGV0YWlsczAgPSB0aGlzLl9zdHlsZVN1bW1hcnlbcHJvcF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGV0YWlsczEgPSB0aW1lbGluZS5fc3R5bGVTdW1tYXJ5W3Byb3BdOwogICAgICAgICAgICBpZiAoIWRldGFpbHMwIHx8IGRldGFpbHMxLnRpbWUgPiBkZXRhaWxzMC50aW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTdHlsZShwcm9wLCBkZXRhaWxzMS52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ1aWxkS2V5ZnJhbWVzKCkgewogICAgICAgIHRoaXMuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZVN0eWxlUHJvcHMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBvc3RTdHlsZVByb3BzID0gbmV3IFNldCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0VtcHR5ID0gdGhpcy5fa2V5ZnJhbWVzLnNpemUgPT09IDEgJiYgdGhpcy5kdXJhdGlvbiA9PT0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZpbmFsS2V5ZnJhbWVzID0gW107CiAgICAgICAgdGhpcy5fa2V5ZnJhbWVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWUKICAgICAgICAgKiBAcGFyYW0gez99IHRpbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChrZXlmcmFtZSwgdGltZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZpbmFsS2V5ZnJhbWUgPSBjb3B5U3R5bGVzKGtleWZyYW1lLCB0cnVlKTsKICAgICAgICAgICAgT2JqZWN0LmtleXMoZmluYWxLZXlmcmFtZSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbmFsS2V5ZnJhbWVbcHJvcF07CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gybVQUkVfU1RZTEUpIHsKICAgICAgICAgICAgICAgICAgICBwcmVTdHlsZVByb3BzLmFkZChwcm9wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09IEFVVE9fU1RZTEUpIHsKICAgICAgICAgICAgICAgICAgICBwb3N0U3R5bGVQcm9wcy5hZGQocHJvcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKCFpc0VtcHR5KSB7CiAgICAgICAgICAgICAgICBmaW5hbEtleWZyYW1lWydvZmZzZXQnXSA9IHRpbWUgLyB0aGlzLmR1cmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsS2V5ZnJhbWVzLnB1c2goZmluYWxLZXlmcmFtZSk7CiAgICAgICAgfSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmVQcm9wcyA9IHByZVN0eWxlUHJvcHMuc2l6ZSA/IGl0ZXJhdG9yVG9BcnJheShwcmVTdHlsZVByb3BzLnZhbHVlcygpKSA6IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb3N0UHJvcHMgPSBwb3N0U3R5bGVQcm9wcy5zaXplID8gaXRlcmF0b3JUb0FycmF5KHBvc3RTdHlsZVByb3BzLnZhbHVlcygpKSA6IFtdOwogICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgYSAwLXNlY29uZCBhbmltYXRpb24gKHdoaWNoIGlzIGRlc2lnbmVkIGp1c3QgdG8gcGxhY2Ugc3R5bGVzIG9uc2NyZWVuKQogICAgICAgIGlmIChpc0VtcHR5KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2YwID0gZmluYWxLZXlmcmFtZXNbMF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2YxID0gY29weU9iaihrZjApOwogICAgICAgICAgICBrZjBbJ29mZnNldCddID0gMDsKICAgICAgICAgICAga2YxWydvZmZzZXQnXSA9IDE7CiAgICAgICAgICAgIGZpbmFsS2V5ZnJhbWVzID0gW2tmMCwga2YxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRpbWVsaW5lSW5zdHJ1Y3Rpb24odGhpcy5lbGVtZW50LCBmaW5hbEtleWZyYW1lcywgcHJlUHJvcHMsIHBvc3RQcm9wcywgdGhpcy5kdXJhdGlvbiwgdGhpcy5zdGFydFRpbWUsIHRoaXMuZWFzaW5nLCBmYWxzZSk7CiAgICB9Cn0KY2xhc3MgU3ViVGltZWxpbmVCdWlsZGVyIGV4dGVuZHMgVGltZWxpbmVCdWlsZGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkcml2ZXIKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAqIEBwYXJhbSB7P30gcHJlU3R5bGVQcm9wcwogICAgICogQHBhcmFtIHs/fSBwb3N0U3R5bGVQcm9wcwogICAgICogQHBhcmFtIHs/fSB0aW1pbmdzCiAgICAgKiBAcGFyYW0gez89fSBfc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWUKICAgICAqLwogICAgY29uc3RydWN0b3IoZHJpdmVyLCBlbGVtZW50LCBrZXlmcmFtZXMsIHByZVN0eWxlUHJvcHMsIHBvc3RTdHlsZVByb3BzLCB0aW1pbmdzLCBfc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWUgPSBmYWxzZSkgewogICAgICAgIHN1cGVyKGRyaXZlciwgZWxlbWVudCwgdGltaW5ncy5kZWxheSk7CiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICB0aGlzLmtleWZyYW1lcyA9IGtleWZyYW1lczsKICAgICAgICB0aGlzLnByZVN0eWxlUHJvcHMgPSBwcmVTdHlsZVByb3BzOwogICAgICAgIHRoaXMucG9zdFN0eWxlUHJvcHMgPSBwb3N0U3R5bGVQcm9wczsKICAgICAgICB0aGlzLl9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSA9IF9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZTsKICAgICAgICB0aGlzLnRpbWluZ3MgPSB7IGR1cmF0aW9uOiB0aW1pbmdzLmR1cmF0aW9uLCBkZWxheTogdGltaW5ncy5kZWxheSwgZWFzaW5nOiB0aW1pbmdzLmVhc2luZyB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb250YWluc0FuaW1hdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5rZXlmcmFtZXMubGVuZ3RoID4gMTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYnVpbGRLZXlmcmFtZXMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBrZXlmcmFtZXMgPSB0aGlzLmtleWZyYW1lczsKICAgICAgICBsZXQgeyBkZWxheSwgZHVyYXRpb24sIGVhc2luZyB9ID0gdGhpcy50aW1pbmdzOwogICAgICAgIGlmICh0aGlzLl9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSAmJiBkZWxheSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld0tleWZyYW1lcyA9IFtdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IGR1cmF0aW9uICsgZGVsYXk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdHYXAgPSBkZWxheSAvIHRvdGFsVGltZTsKICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHN0YXJ0aW5nIGtleWZyYW1lIG5vdyBzdGFydHMgb25jZSB0aGUgZGVsYXkgaXMgZG9uZQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld0ZpcnN0S2V5ZnJhbWUgPSBjb3B5U3R5bGVzKGtleWZyYW1lc1swXSwgZmFsc2UpOwogICAgICAgICAgICBuZXdGaXJzdEtleWZyYW1lWydvZmZzZXQnXSA9IDA7CiAgICAgICAgICAgIG5ld0tleWZyYW1lcy5wdXNoKG5ld0ZpcnN0S2V5ZnJhbWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZEZpcnN0S2V5ZnJhbWUgPSBjb3B5U3R5bGVzKGtleWZyYW1lc1swXSwgZmFsc2UpOwogICAgICAgICAgICBvbGRGaXJzdEtleWZyYW1lWydvZmZzZXQnXSA9IHJvdW5kT2Zmc2V0KHN0YXJ0aW5nR2FwKTsKICAgICAgICAgICAgbmV3S2V5ZnJhbWVzLnB1c2gob2xkRmlyc3RLZXlmcmFtZSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgV2hlbiB0aGUga2V5ZnJhbWUgaXMgc3RyZXRjaGVkIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgZGVsYXkgYmVmb3JlIHRoZSBhbmltYXRpb24KICAgICAgICAgICAgICAgICAgICBzdGFydHMgaXMgZ29uZS4gSW5zdGVhZCB0aGUgZmlyc3Qga2V5ZnJhbWUgaXMgcGxhY2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uCiAgICAgICAgICAgICAgICAgICAgYW5kIGl0IGlzIHRoZW4gY29waWVkIHRvIHdoZXJlIGl0IHN0YXJ0cyB3aGVuIHRoZSBvcmlnaW5hbCBkZWxheSBpcyBvdmVyLiBUaGlzIGJhc2ljYWxseQogICAgICAgICAgICAgICAgICAgIG1lYW5zIG5vdGhpbmcgYW5pbWF0ZXMgZHVyaW5nIHRoYXQgZGVsYXksIGJ1dCB0aGUgc3R5bGVzIGFyZSBzdGlsbCByZW5kZXJlcmVkLiBGb3IgdGhpcwogICAgICAgICAgICAgICAgICAgIHRvIHdvcmsgdGhlIG9yaWdpbmFsIG9mZnNldCB2YWx1ZXMgdGhhdCBleGlzdCBpbiB0aGUgb3JpZ2luYWwga2V5ZnJhbWVzIG11c3QgYmUgIndhcnBlZCIKICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZXkgY2FuIHRha2UgdGhlIG5ldyBrZXlmcmFtZSArIGRlbGF5IGludG8gYWNjb3VudC4KICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZGVsYXk9MTAwMCwgZHVyYXRpb249MTAwMCwga2V5ZnJhbWVzID0gMCAuNSAxCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHR1cm5zIGludG8KICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZGVsYXk9MCwgZHVyYXRpb249MjAwMCwga2V5ZnJhbWVzID0gMCAuMzMgLjY2IDEKICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIC8vIG9mZnNldHMgYmV0d2VlbiAxIC4uLiBuIC0xIGFyZSBhbGwgd2FycGVkIGJ5IHRoZSBrZXlmcmFtZSBzdHJldGNoCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGltaXQgPSBrZXlmcmFtZXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbGltaXQ7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGtmID0gY29weVN0eWxlcyhrZXlmcmFtZXNbaV0sIGZhbHNlKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9mZnNldCA9ICgvKiogQHR5cGUgez99ICovIChrZlsnb2Zmc2V0J10pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVBdEtleWZyYW1lID0gZGVsYXkgKyBvbGRPZmZzZXQgKiBkdXJhdGlvbjsKICAgICAgICAgICAgICAgIGtmWydvZmZzZXQnXSA9IHJvdW5kT2Zmc2V0KHRpbWVBdEtleWZyYW1lIC8gdG90YWxUaW1lKTsKICAgICAgICAgICAgICAgIG5ld0tleWZyYW1lcy5wdXNoKGtmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB0aGUgbmV3IHN0YXJ0aW5nIGtleWZyYW1lIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgc3RhcnQKICAgICAgICAgICAgZHVyYXRpb24gPSB0b3RhbFRpbWU7CiAgICAgICAgICAgIGRlbGF5ID0gMDsKICAgICAgICAgICAgZWFzaW5nID0gJyc7CiAgICAgICAgICAgIGtleWZyYW1lcyA9IG5ld0tleWZyYW1lczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRpbWVsaW5lSW5zdHJ1Y3Rpb24odGhpcy5lbGVtZW50LCBrZXlmcmFtZXMsIHRoaXMucHJlU3R5bGVQcm9wcywgdGhpcy5wb3N0U3R5bGVQcm9wcywgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIHRydWUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG9mZnNldAogKiBAcGFyYW0gez89fSBkZWNpbWFsUG9pbnRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByb3VuZE9mZnNldChvZmZzZXQsIGRlY2ltYWxQb2ludHMgPSAzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtdWx0ID0gTWF0aC5wb3coMTAsIGRlY2ltYWxQb2ludHMgLSAxKTsKICAgIHJldHVybiBNYXRoLnJvdW5kKG9mZnNldCAqIG11bHQpIC8gbXVsdDsKfQovKioKICogQHBhcmFtIHs/fSBpbnB1dAogKiBAcGFyYW0gez99IGFsbFN0eWxlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmxhdHRlblN0eWxlcyQxKGlucHV0LCBhbGxTdHlsZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0eWxlcyA9IHt9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGFsbFByb3BlcnRpZXM7CiAgICBpbnB1dC5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRva2VuID0+IHsKICAgICAgICBpZiAodG9rZW4gPT09ICcqJykgewogICAgICAgICAgICBhbGxQcm9wZXJ0aWVzID0gYWxsUHJvcGVydGllcyB8fCBPYmplY3Qua2V5cyhhbGxTdHlsZXMpOwogICAgICAgICAgICBhbGxQcm9wZXJ0aWVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgc3R5bGVzW3Byb3BdID0gQVVUT19TVFlMRTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29weVN0eWxlcygoLyoqIEB0eXBlIHs/fSAqLyAodG9rZW4pKSwgZmFsc2UsIHN0eWxlcyk7CiAgICAgICAgfQogICAgfSkpOwogICAgcmV0dXJuIHN0eWxlczsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9kc2wvc3R5bGVfbm9ybWFsaXphdGlvbi9hbmltYXRpb25fc3R5bGVfbm9ybWFsaXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIEFuaW1hdGlvblN0eWxlTm9ybWFsaXplciB7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL3N0eWxlX25vcm1hbGl6YXRpb24vd2ViX2FuaW1hdGlvbnNfc3R5bGVfbm9ybWFsaXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBXZWJBbmltYXRpb25zU3R5bGVOb3JtYWxpemVyIGV4dGVuZHMgQW5pbWF0aW9uU3R5bGVOb3JtYWxpemVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eU5hbWUKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBub3JtYWxpemVQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lLCBlcnJvcnMpIHsKICAgICAgICByZXR1cm4gZGFzaENhc2VUb0NhbWVsQ2FzZShwcm9wZXJ0eU5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHVzZXJQcm92aWRlZFByb3BlcnR5CiAgICAgKiBAcGFyYW0gez99IG5vcm1hbGl6ZWRQcm9wZXJ0eQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5vcm1hbGl6ZVN0eWxlVmFsdWUodXNlclByb3ZpZGVkUHJvcGVydHksIG5vcm1hbGl6ZWRQcm9wZXJ0eSwgdmFsdWUsIGVycm9ycykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdW5pdCA9ICcnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHJWYWwgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgICBpZiAoRElNRU5TSU9OQUxfUFJPUF9NQVBbbm9ybWFsaXplZFByb3BlcnR5XSAmJiB2YWx1ZSAhPT0gMCAmJiB2YWx1ZSAhPT0gJzAnKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICB1bml0ID0gJ3B4JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbEFuZFN1ZmZpeE1hdGNoID0gdmFsdWUubWF0Y2goL15bKy1dP1tcZFwuXSsoW2Etel0qKSQvKTsKICAgICAgICAgICAgICAgIGlmICh2YWxBbmRTdWZmaXhNYXRjaCAmJiB2YWxBbmRTdWZmaXhNYXRjaFsxXS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGBQbGVhc2UgcHJvdmlkZSBhIENTUyB1bml0IHZhbHVlIGZvciAke3VzZXJQcm92aWRlZFByb3BlcnR5fToke3ZhbHVlfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHJWYWwgKyB1bml0OwogICAgfQp9CmNvbnN0IMm1MCQxJDIgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+IG1ha2VCb29sZWFuTWFwKCd3aWR0aCxoZWlnaHQsbWluV2lkdGgsbWluSGVpZ2h0LG1heFdpZHRoLG1heEhlaWdodCxsZWZ0LHRvcCxib3R0b20scmlnaHQsZm9udFNpemUsb3V0bGluZVdpZHRoLG91dGxpbmVPZmZzZXQscGFkZGluZ1RvcCxwYWRkaW5nTGVmdCxwYWRkaW5nQm90dG9tLHBhZGRpbmdSaWdodCxtYXJnaW5Ub3AsbWFyZ2luTGVmdCxtYXJnaW5Cb3R0b20sbWFyZ2luUmlnaHQsYm9yZGVyUmFkaXVzLGJvcmRlcldpZHRoLGJvcmRlclRvcFdpZHRoLGJvcmRlckxlZnRXaWR0aCxib3JkZXJSaWdodFdpZHRoLGJvcmRlckJvdHRvbVdpZHRoLHRleHRJbmRlbnQscGVyc3BlY3RpdmUnCiAgICAuc3BsaXQoJywnKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRElNRU5TSU9OQUxfUFJPUF9NQVAgPSAoKMm1MCQxJDIpKSgpOwovKioKICogQHBhcmFtIHs/fSBrZXlzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYWtlQm9vbGVhbk1hcChrZXlzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXAgPSB7fTsKICAgIGtleXMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAga2V5ID0+IG1hcFtrZXldID0gdHJ1ZSkpOwogICAgcmV0dXJuIG1hcDsKfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICogQHBhcmFtIHs/fSB0b1N0YXRlCiAqIEBwYXJhbSB7P30gaXNSZW1vdmFsVHJhbnNpdGlvbgogKiBAcGFyYW0gez99IGZyb21TdHlsZXMKICogQHBhcmFtIHs/fSB0b1N0eWxlcwogKiBAcGFyYW0gez99IHRpbWVsaW5lcwogKiBAcGFyYW0gez99IHF1ZXJpZWRFbGVtZW50cwogKiBAcGFyYW0gez99IHByZVN0eWxlUHJvcHMKICogQHBhcmFtIHs/fSBwb3N0U3R5bGVQcm9wcwogKiBAcGFyYW0gez99IHRvdGFsVGltZQogKiBAcGFyYW0gez89fSBlcnJvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZVRyYW5zaXRpb25JbnN0cnVjdGlvbihlbGVtZW50LCB0cmlnZ2VyTmFtZSwgZnJvbVN0YXRlLCB0b1N0YXRlLCBpc1JlbW92YWxUcmFuc2l0aW9uLCBmcm9tU3R5bGVzLCB0b1N0eWxlcywgdGltZWxpbmVzLCBxdWVyaWVkRWxlbWVudHMsIHByZVN0eWxlUHJvcHMsIHBvc3RTdHlsZVByb3BzLCB0b3RhbFRpbWUsIGVycm9ycykgewogICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiAwIC8qIFRyYW5zaXRpb25BbmltYXRpb24gKi8sCiAgICAgICAgZWxlbWVudCwKICAgICAgICB0cmlnZ2VyTmFtZSwKICAgICAgICBpc1JlbW92YWxUcmFuc2l0aW9uLAogICAgICAgIGZyb21TdGF0ZSwKICAgICAgICBmcm9tU3R5bGVzLAogICAgICAgIHRvU3RhdGUsCiAgICAgICAgdG9TdHlsZXMsCiAgICAgICAgdGltZWxpbmVzLAogICAgICAgIHF1ZXJpZWRFbGVtZW50cywKICAgICAgICBwcmVTdHlsZVByb3BzLAogICAgICAgIHBvc3RTdHlsZVByb3BzLAogICAgICAgIHRvdGFsVGltZSwKICAgICAgICBlcnJvcnMKICAgIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl90cmFuc2l0aW9uX2ZhY3RvcnkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFTVBUWV9PQkpFQ1QgPSB7fTsKY2xhc3MgQW5pbWF0aW9uVHJhbnNpdGlvbkZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF90cmlnZ2VyTmFtZQogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gX3N0YXRlU3R5bGVzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF90cmlnZ2VyTmFtZSwgYXN0LCBfc3RhdGVTdHlsZXMpIHsKICAgICAgICB0aGlzLl90cmlnZ2VyTmFtZSA9IF90cmlnZ2VyTmFtZTsKICAgICAgICB0aGlzLmFzdCA9IGFzdDsKICAgICAgICB0aGlzLl9zdGF0ZVN0eWxlcyA9IF9zdGF0ZVN0eWxlczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjdXJyZW50U3RhdGUKICAgICAqIEBwYXJhbSB7P30gbmV4dFN0YXRlCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXRjaChjdXJyZW50U3RhdGUsIG5leHRTdGF0ZSwgZWxlbWVudCwgcGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIG9uZU9yTW9yZVRyYW5zaXRpb25zTWF0Y2godGhpcy5hc3QubWF0Y2hlcnMsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbGVtZW50LCBwYXJhbXMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlTmFtZQogICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBidWlsZFN0eWxlcyhzdGF0ZU5hbWUsIHBhcmFtcywgZXJyb3JzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJhY2t1cFN0YXRlU3R5bGVyID0gdGhpcy5fc3RhdGVTdHlsZXNbJyonXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhdGVTdHlsZXIgPSB0aGlzLl9zdGF0ZVN0eWxlc1tzdGF0ZU5hbWVdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiYWNrdXBTdHlsZXMgPSBiYWNrdXBTdGF0ZVN0eWxlciA/IGJhY2t1cFN0YXRlU3R5bGVyLmJ1aWxkU3R5bGVzKHBhcmFtcywgZXJyb3JzKSA6IHt9OwogICAgICAgIHJldHVybiBzdGF0ZVN0eWxlciA/IHN0YXRlU3R5bGVyLmJ1aWxkU3R5bGVzKHBhcmFtcywgZXJyb3JzKSA6IGJhY2t1cFN0eWxlczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkcml2ZXIKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBjdXJyZW50U3RhdGUKICAgICAqIEBwYXJhbSB7P30gbmV4dFN0YXRlCiAgICAgKiBAcGFyYW0gez99IGVudGVyQ2xhc3NOYW1lCiAgICAgKiBAcGFyYW0gez99IGxlYXZlQ2xhc3NOYW1lCiAgICAgKiBAcGFyYW0gez89fSBjdXJyZW50T3B0aW9ucwogICAgICogQHBhcmFtIHs/PX0gbmV4dE9wdGlvbnMKICAgICAqIEBwYXJhbSB7Pz19IHN1Ykluc3RydWN0aW9ucwogICAgICogQHBhcmFtIHs/PX0gc2tpcEFzdEJ1aWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBidWlsZChkcml2ZXIsIGVsZW1lbnQsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIGN1cnJlbnRPcHRpb25zLCBuZXh0T3B0aW9ucywgc3ViSW5zdHJ1Y3Rpb25zLCBza2lwQXN0QnVpbGQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyYW5zaXRpb25BbmltYXRpb25QYXJhbXMgPSB0aGlzLmFzdC5vcHRpb25zICYmIHRoaXMuYXN0Lm9wdGlvbnMucGFyYW1zIHx8IEVNUFRZX09CSkVDVDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3VycmVudEFuaW1hdGlvblBhcmFtcyA9IGN1cnJlbnRPcHRpb25zICYmIGN1cnJlbnRPcHRpb25zLnBhcmFtcyB8fCBFTVBUWV9PQkpFQ1Q7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZVN0eWxlcyA9IHRoaXMuYnVpbGRTdHlsZXMoY3VycmVudFN0YXRlLCBjdXJyZW50QW5pbWF0aW9uUGFyYW1zLCBlcnJvcnMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXh0QW5pbWF0aW9uUGFyYW1zID0gbmV4dE9wdGlvbnMgJiYgbmV4dE9wdGlvbnMucGFyYW1zIHx8IEVNUFRZX09CSkVDVDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dFN0YXRlU3R5bGVzID0gdGhpcy5idWlsZFN0eWxlcyhuZXh0U3RhdGUsIG5leHRBbmltYXRpb25QYXJhbXMsIGVycm9ycyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHF1ZXJpZWRFbGVtZW50cyA9IG5ldyBTZXQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJlU3R5bGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBvc3RTdHlsZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNSZW1vdmFsID0gbmV4dFN0YXRlID09PSAndm9pZCc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB7IHBhcmFtczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0cmFuc2l0aW9uQW5pbWF0aW9uUGFyYW1zKSwgbmV4dEFuaW1hdGlvblBhcmFtcykgfTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGltZWxpbmVzID0gc2tpcEFzdEJ1aWxkID8KICAgICAgICAgICAgW10gOgogICAgICAgICAgICBidWlsZEFuaW1hdGlvblRpbWVsaW5lcyhkcml2ZXIsIGVsZW1lbnQsIHRoaXMuYXN0LmFuaW1hdGlvbiwgZW50ZXJDbGFzc05hbWUsIGxlYXZlQ2xhc3NOYW1lLCBjdXJyZW50U3RhdGVTdHlsZXMsIG5leHRTdGF0ZVN0eWxlcywgYW5pbWF0aW9uT3B0aW9ucywgc3ViSW5zdHJ1Y3Rpb25zLCBlcnJvcnMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdG90YWxUaW1lID0gMDsKICAgICAgICB0aW1lbGluZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0bAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdGwgPT4gewogICAgICAgICAgICB0b3RhbFRpbWUgPSBNYXRoLm1heCh0bC5kdXJhdGlvbiArIHRsLmRlbGF5LCB0b3RhbFRpbWUpOwogICAgICAgIH0pKTsKICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gY3JlYXRlVHJhbnNpdGlvbkluc3RydWN0aW9uKGVsZW1lbnQsIHRoaXMuX3RyaWdnZXJOYW1lLCBjdXJyZW50U3RhdGUsIG5leHRTdGF0ZSwgaXNSZW1vdmFsLCBjdXJyZW50U3RhdGVTdHlsZXMsIG5leHRTdGF0ZVN0eWxlcywgW10sIFtdLCBwcmVTdHlsZU1hcCwgcG9zdFN0eWxlTWFwLCB0b3RhbFRpbWUsIGVycm9ycyk7CiAgICAgICAgfQogICAgICAgIHRpbWVsaW5lcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0bCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxtID0gdGwuZWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVQcm9wcyA9IGdldE9yU2V0QXNJbk1hcChwcmVTdHlsZU1hcCwgZWxtLCB7fSk7CiAgICAgICAgICAgIHRsLnByZVN0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiBwcmVQcm9wc1twcm9wXSA9IHRydWUpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3N0UHJvcHMgPSBnZXRPclNldEFzSW5NYXAocG9zdFN0eWxlTWFwLCBlbG0sIHt9KTsKICAgICAgICAgICAgdGwucG9zdFN0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiBwb3N0UHJvcHNbcHJvcF0gPSB0cnVlKSk7CiAgICAgICAgICAgIGlmIChlbG0gIT09IGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHF1ZXJpZWRFbGVtZW50cy5hZGQoZWxtKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcXVlcmllZEVsZW1lbnRzTGlzdCA9IGl0ZXJhdG9yVG9BcnJheShxdWVyaWVkRWxlbWVudHMudmFsdWVzKCkpOwogICAgICAgIHJldHVybiBjcmVhdGVUcmFuc2l0aW9uSW5zdHJ1Y3Rpb24oZWxlbWVudCwgdGhpcy5fdHJpZ2dlck5hbWUsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBpc1JlbW92YWwsIGN1cnJlbnRTdGF0ZVN0eWxlcywgbmV4dFN0YXRlU3R5bGVzLCB0aW1lbGluZXMsIHF1ZXJpZWRFbGVtZW50c0xpc3QsIHByZVN0eWxlTWFwLCBwb3N0U3R5bGVNYXAsIHRvdGFsVGltZSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWF0Y2hGbnMKICogQHBhcmFtIHs/fSBjdXJyZW50U3RhdGUKICogQHBhcmFtIHs/fSBuZXh0U3RhdGUKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gcGFyYW1zCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBvbmVPck1vcmVUcmFuc2l0aW9uc01hdGNoKG1hdGNoRm5zLCBjdXJyZW50U3RhdGUsIG5leHRTdGF0ZSwgZWxlbWVudCwgcGFyYW1zKSB7CiAgICByZXR1cm4gbWF0Y2hGbnMuc29tZSgoLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmbiA9PiBmbihjdXJyZW50U3RhdGUsIG5leHRTdGF0ZSwgZWxlbWVudCwgcGFyYW1zKSkpOwp9CmNsYXNzIEFuaW1hdGlvblN0YXRlU3R5bGVzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdFBhcmFtcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdHlsZXMsIGRlZmF1bHRQYXJhbXMpIHsKICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsKICAgICAgICB0aGlzLmRlZmF1bHRQYXJhbXMgPSBkZWZhdWx0UGFyYW1zOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmFtcwogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ1aWxkU3R5bGVzKHBhcmFtcywgZXJyb3JzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpbmFsU3R5bGVzID0ge307CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbWJpbmVkUGFyYW1zID0gY29weU9iaih0aGlzLmRlZmF1bHRQYXJhbXMpOwogICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGtleSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXNba2V5XTsKICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbWJpbmVkUGFyYW1zW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnN0eWxlcy5zdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmFsdWUgPT4gewogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVPYmogPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlT2JqKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCB2YWwgPSBzdHlsZU9ialtwcm9wXTsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gaW50ZXJwb2xhdGVQYXJhbXModmFsLCBjb21iaW5lZFBhcmFtcywgZXJyb3JzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmluYWxTdHlsZXNbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGZpbmFsU3R5bGVzOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL2RzbC9hbmltYXRpb25fdHJpZ2dlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gYXN0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBidWlsZFRyaWdnZXIobmFtZSwgYXN0KSB7CiAgICByZXR1cm4gbmV3IEFuaW1hdGlvblRyaWdnZXIobmFtZSwgYXN0KTsKfQovKioKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEFuaW1hdGlvblRyaWdnZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5hbWUsIGFzdCkgewogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgdGhpcy5hc3QgPSBhc3Q7CiAgICAgICAgdGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzID0gW107CiAgICAgICAgdGhpcy5zdGF0ZXMgPSB7fTsKICAgICAgICBhc3Quc3RhdGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhc3QgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYXJhbXMgPSAoYXN0Lm9wdGlvbnMgJiYgYXN0Lm9wdGlvbnMucGFyYW1zKSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5zdGF0ZXNbYXN0Lm5hbWVdID0gbmV3IEFuaW1hdGlvblN0YXRlU3R5bGVzKGFzdC5zdHlsZSwgZGVmYXVsdFBhcmFtcyk7CiAgICAgICAgfSkpOwogICAgICAgIGJhbGFuY2VQcm9wZXJ0aWVzKHRoaXMuc3RhdGVzLCAndHJ1ZScsICcxJyk7CiAgICAgICAgYmFsYW5jZVByb3BlcnRpZXModGhpcy5zdGF0ZXMsICdmYWxzZScsICcwJyk7CiAgICAgICAgYXN0LnRyYW5zaXRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhc3QgPT4gewogICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25GYWN0b3JpZXMucHVzaChuZXcgQW5pbWF0aW9uVHJhbnNpdGlvbkZhY3RvcnkobmFtZSwgYXN0LCB0aGlzLnN0YXRlcykpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLmZhbGxiYWNrVHJhbnNpdGlvbiA9IGNyZWF0ZUZhbGxiYWNrVHJhbnNpdGlvbihuYW1lLCB0aGlzLnN0YXRlcyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250YWluc1F1ZXJpZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXN0LnF1ZXJ5Q291bnQgPiAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRTdGF0ZQogICAgICogQHBhcmFtIHs/fSBuZXh0U3RhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1hdGNoVHJhbnNpdGlvbihjdXJyZW50U3RhdGUsIG5leHRTdGF0ZSwgZWxlbWVudCwgcGFyYW1zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzLmZpbmQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZiA9PiBmLm1hdGNoKGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbGVtZW50LCBwYXJhbXMpKSk7CiAgICAgICAgcmV0dXJuIGVudHJ5IHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY3VycmVudFN0YXRlCiAgICAgKiBAcGFyYW0gez99IHBhcmFtcwogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1hdGNoU3R5bGVzKGN1cnJlbnRTdGF0ZSwgcGFyYW1zLCBlcnJvcnMpIHsKICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RyYW5zaXRpb24uYnVpbGRTdHlsZXMoY3VycmVudFN0YXRlLCBwYXJhbXMsIGVycm9ycyk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICogQHBhcmFtIHs/fSBzdGF0ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrVHJhbnNpdGlvbih0cmlnZ2VyTmFtZSwgc3RhdGVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXRjaGVycyA9IFsoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRvU3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmcm9tU3RhdGUsIHRvU3RhdGUpID0+IHRydWUpXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFuaW1hdGlvbiA9IHsgdHlwZTogMiAvKiBTZXF1ZW5jZSAqLywgc3RlcHM6IFtdLCBvcHRpb25zOiBudWxsIH07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0cmFuc2l0aW9uID0gewogICAgICAgIHR5cGU6IDEgLyogVHJhbnNpdGlvbiAqLywKICAgICAgICBhbmltYXRpb24sCiAgICAgICAgbWF0Y2hlcnMsCiAgICAgICAgb3B0aW9uczogbnVsbCwKICAgICAgICBxdWVyeUNvdW50OiAwLAogICAgICAgIGRlcENvdW50OiAwCiAgICB9OwogICAgcmV0dXJuIG5ldyBBbmltYXRpb25UcmFuc2l0aW9uRmFjdG9yeSh0cmlnZ2VyTmFtZSwgdHJhbnNpdGlvbiwgc3RhdGVzKTsKfQovKioKICogQHBhcmFtIHs/fSBvYmoKICogQHBhcmFtIHs/fSBrZXkxCiAqIEBwYXJhbSB7P30ga2V5MgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmFsYW5jZVByb3BlcnRpZXMob2JqLCBrZXkxLCBrZXkyKSB7CiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleTEpKSB7CiAgICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5MikpIHsKICAgICAgICAgICAgb2JqW2tleTJdID0gb2JqW2tleTFdOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkyKSkgewogICAgICAgIG9ialtrZXkxXSA9IG9ialtrZXkyXTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdGltZWxpbmVfYW5pbWF0aW9uX2VuZ2luZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IEVNUFRZX0lOU1RSVUNUSU9OX01BUCA9IG5ldyBFbGVtZW50SW5zdHJ1Y3Rpb25NYXAoKTsKY2xhc3MgVGltZWxpbmVBbmltYXRpb25FbmdpbmUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGJvZHlOb2RlCiAgICAgKiBAcGFyYW0gez99IF9kcml2ZXIKICAgICAqIEBwYXJhbSB7P30gX25vcm1hbGl6ZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoYm9keU5vZGUsIF9kcml2ZXIsIF9ub3JtYWxpemVyKSB7CiAgICAgICAgdGhpcy5ib2R5Tm9kZSA9IGJvZHlOb2RlOwogICAgICAgIHRoaXMuX2RyaXZlciA9IF9kcml2ZXI7CiAgICAgICAgdGhpcy5fbm9ybWFsaXplciA9IF9ub3JtYWxpemVyOwogICAgICAgIHRoaXMuX2FuaW1hdGlvbnMgPSB7fTsKICAgICAgICB0aGlzLl9wbGF5ZXJzQnlJZCA9IHt9OwogICAgICAgIHRoaXMucGxheWVycyA9IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3RlcihpZCwgbWV0YWRhdGEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFzdCA9IGJ1aWxkQW5pbWF0aW9uQXN0KHRoaXMuX2RyaXZlciwgbWV0YWRhdGEsIGVycm9ycyk7CiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnVpbGQgdGhlIGFuaW1hdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6ICR7ZXJyb3JzLmpvaW4oJ1xuJyl9YCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25zW2lkXSA9IGFzdDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGkKICAgICAqIEBwYXJhbSB7P30gcHJlU3R5bGVzCiAgICAgKiBAcGFyYW0gez89fSBwb3N0U3R5bGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYnVpbGRQbGF5ZXIoaSwgcHJlU3R5bGVzLCBwb3N0U3R5bGVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnQgPSBpLmVsZW1lbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleWZyYW1lcyA9IG5vcm1hbGl6ZUtleWZyYW1lcyh0aGlzLl9kcml2ZXIsIHRoaXMuX25vcm1hbGl6ZXIsIGVsZW1lbnQsIGkua2V5ZnJhbWVzLCBwcmVTdHlsZXMsIHBvc3RTdHlsZXMpOwogICAgICAgIHJldHVybiB0aGlzLl9kcml2ZXIuYW5pbWF0ZShlbGVtZW50LCBrZXlmcmFtZXMsIGkuZHVyYXRpb24sIGkuZGVsYXksIGkuZWFzaW5nLCBbXSwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlKGlkLCBlbGVtZW50LCBvcHRpb25zID0ge30pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFzdCA9IHRoaXMuX2FuaW1hdGlvbnNbaWRdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5zdHJ1Y3Rpb25zOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhdXRvU3R5bGVzTWFwID0gbmV3IE1hcCgpOwogICAgICAgIGlmIChhc3QpIHsKICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zID0gYnVpbGRBbmltYXRpb25UaW1lbGluZXModGhpcy5fZHJpdmVyLCBlbGVtZW50LCBhc3QsIEVOVEVSX0NMQVNTTkFNRSwgTEVBVkVfQ0xBU1NOQU1FLCB7fSwge30sIG9wdGlvbnMsIEVNUFRZX0lOU1RSVUNUSU9OX01BUCwgZXJyb3JzKTsKICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluc3QKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGluc3QgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gZ2V0T3JTZXRBc0luTWFwKGF1dG9TdHlsZXNNYXAsIGluc3QuZWxlbWVudCwge30pOwogICAgICAgICAgICAgICAgaW5zdC5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvcCA9PiBzdHlsZXNbcHJvcF0gPSBudWxsKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKCdUaGUgcmVxdWVzdGVkIGFuaW1hdGlvbiBkb2VzblwndCBleGlzdCBvciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCcpOwogICAgICAgICAgICBpbnN0cnVjdGlvbnMgPSBbXTsKICAgICAgICB9CiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY3JlYXRlIHRoZSBhbmltYXRpb24gZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiAke2Vycm9ycy5qb2luKCdcbicpfWApOwogICAgICAgIH0KICAgICAgICBhdXRvU3R5bGVzTWFwLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoc3R5bGVzLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICBzdHlsZXNbcHJvcF0gPSB0aGlzLl9kcml2ZXIuY29tcHV0ZVN0eWxlKGVsZW1lbnQsIHByb3AsIEFVVE9fU1RZTEUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbGF5ZXJzID0gaW5zdHJ1Y3Rpb25zLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBhdXRvU3R5bGVzTWFwLmdldChpLmVsZW1lbnQpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGRQbGF5ZXIoaSwge30sIHN0eWxlcyk7CiAgICAgICAgfSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbGF5ZXIgPSBvcHRpbWl6ZUdyb3VwUGxheWVyKHBsYXllcnMpOwogICAgICAgIHRoaXMuX3BsYXllcnNCeUlkW2lkXSA9IHBsYXllcjsKICAgICAgICBwbGF5ZXIub25EZXN0cm95KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuZGVzdHJveShpZCkpKTsKICAgICAgICB0aGlzLnBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgIHJldHVybiBwbGF5ZXI7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koaWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5fZ2V0UGxheWVyKGlkKTsKICAgICAgICBwbGF5ZXIuZGVzdHJveSgpOwogICAgICAgIGRlbGV0ZSB0aGlzLl9wbGF5ZXJzQnlJZFtpZF07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wbGF5ZXJzLmluZGV4T2YocGxheWVyKTsKICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICB0aGlzLnBsYXllcnMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0UGxheWVyKGlkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMuX3BsYXllcnNCeUlkW2lkXTsKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIHRoZSB0aW1lbGluZSBwbGF5ZXIgcmVmZXJlbmNlZCBieSAke2lkfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGxheWVyOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsaXN0ZW4oaWQsIGVsZW1lbnQsIGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICAvLyB0cmlnZ2VyTmFtZSwgZnJvbVN0YXRlLCB0b1N0YXRlIGFyZSBhbGwgaWdub3JlZCBmb3IgdGltZWxpbmUgYW5pbWF0aW9ucwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiYXNlRXZlbnQgPSBtYWtlQW5pbWF0aW9uRXZlbnQoZWxlbWVudCwgJycsICcnLCAnJyk7CiAgICAgICAgbGlzdGVuT25QbGF5ZXIodGhpcy5fZ2V0UGxheWVyKGlkKSwgZXZlbnROYW1lLCBiYXNlRXZlbnQsIGNhbGxiYWNrKTsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4geyB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGNvbW1hbmQKICAgICAqIEBwYXJhbSB7P30gYXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY29tbWFuZChpZCwgZWxlbWVudCwgY29tbWFuZCwgYXJncykgewogICAgICAgIGlmIChjb21tYW5kID09ICdyZWdpc3RlcicpIHsKICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihpZCwgKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3NbMF0pKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ2NyZWF0ZScpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKC8qKiBAdHlwZSB7P30gKi8gKChhcmdzWzBdIHx8IHt9KSkpOwogICAgICAgICAgICB0aGlzLmNyZWF0ZShpZCwgZWxlbWVudCwgb3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMuX2dldFBsYXllcihpZCk7CiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CiAgICAgICAgICAgIGNhc2UgJ3BsYXknOgogICAgICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdwYXVzZSc6CiAgICAgICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyZXNldCc6CiAgICAgICAgICAgICAgICBwbGF5ZXIucmVzZXQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyZXN0YXJ0JzoKICAgICAgICAgICAgICAgIHBsYXllci5yZXN0YXJ0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZmluaXNoJzoKICAgICAgICAgICAgICAgIHBsYXllci5maW5pc2goKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdpbml0JzoKICAgICAgICAgICAgICAgIHBsYXllci5pbml0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0UG9zaXRpb24nOgogICAgICAgICAgICAgICAgcGxheWVyLnNldFBvc2l0aW9uKHBhcnNlRmxvYXQoKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3NbMF0pKSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2Rlc3Ryb3knOgogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KGlkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUVVFVUVEX0NMQVNTTkFNRSA9ICduZy1hbmltYXRlLXF1ZXVlZCc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUVVFVUVEX1NFTEVDVE9SID0gJy5uZy1hbmltYXRlLXF1ZXVlZCc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRElTQUJMRURfQ0xBU1NOQU1FID0gJ25nLWFuaW1hdGUtZGlzYWJsZWQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IERJU0FCTEVEX1NFTEVDVE9SID0gJy5uZy1hbmltYXRlLWRpc2FibGVkJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTVEFSX0NMQVNTTkFNRSA9ICduZy1zdGFyLWluc2VydGVkJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTVEFSX1NFTEVDVE9SID0gJy5uZy1zdGFyLWluc2VydGVkJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFTVBUWV9QTEFZRVJfQVJSQVkgPSBbXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOVUxMX1JFTU9WQUxfU1RBVEUgPSB7CiAgICBuYW1lc3BhY2VJZDogJycsCiAgICBzZXRGb3JSZW1vdmFsOiBmYWxzZSwKICAgIHNldEZvck1vdmU6IGZhbHNlLAogICAgaGFzQW5pbWF0aW9uOiBmYWxzZSwKICAgIHJlbW92ZWRCZWZvcmVRdWVyaWVkOiBmYWxzZQp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IE5VTExfUkVNT1ZFRF9RVUVSSUVEX1NUQVRFID0gewogICAgbmFtZXNwYWNlSWQ6ICcnLAogICAgc2V0Rm9yTW92ZTogZmFsc2UsCiAgICBzZXRGb3JSZW1vdmFsOiBmYWxzZSwKICAgIGhhc0FuaW1hdGlvbjogZmFsc2UsCiAgICByZW1vdmVkQmVmb3JlUXVlcmllZDogdHJ1ZQp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IFJFTU9WQUxfRkxBRyA9ICdfX25nX3JlbW92ZWQnOwpjbGFzcyBTdGF0ZVZhbHVlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbnB1dAogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlSWQKICAgICAqLwogICAgY29uc3RydWN0b3IoaW5wdXQsIG5hbWVzcGFjZUlkID0gJycpIHsKICAgICAgICB0aGlzLm5hbWVzcGFjZUlkID0gbmFtZXNwYWNlSWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzT2JqID0gaW5wdXQgJiYgaW5wdXQuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlID0gaXNPYmogPyBpbnB1dFsndmFsdWUnXSA6IGlucHV0OwogICAgICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVUcmlnZ2VyVmFsdWUodmFsdWUpOwogICAgICAgIGlmIChpc09iaikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb3B5T2JqKCgvKiogQHR5cGUgez99ICovIChpbnB1dCkpKTsKICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnNbJ3ZhbHVlJ107CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucGFyYW1zKSB7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYXJhbXMgPSB7fTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXJhbXMoKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLm9wdGlvbnMucGFyYW1zKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWJzb3JiT3B0aW9ucyhvcHRpb25zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IG9wdGlvbnMucGFyYW1zOwogICAgICAgIGlmIChuZXdQYXJhbXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvbGRQYXJhbXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5vcHRpb25zLnBhcmFtcykpOwogICAgICAgICAgICBPYmplY3Qua2V5cyhuZXdQYXJhbXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgaWYgKG9sZFBhcmFtc1twcm9wXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgb2xkUGFyYW1zW3Byb3BdID0gbmV3UGFyYW1zW3Byb3BdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVk9JRF9WQUxVRSA9ICd2b2lkJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBERUZBVUxUX1NUQVRFX1ZBTFVFID0gbmV3IFN0YXRlVmFsdWUoVk9JRF9WQUxVRSk7CmNsYXNzIEFuaW1hdGlvblRyYW5zaXRpb25OYW1lc3BhY2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcGFyYW0gez99IGhvc3RFbGVtZW50CiAgICAgKiBAcGFyYW0gez99IF9lbmdpbmUKICAgICAqLwogICAgY29uc3RydWN0b3IoaWQsIGhvc3RFbGVtZW50LCBfZW5naW5lKSB7CiAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWxlbWVudDsKICAgICAgICB0aGlzLl9lbmdpbmUgPSBfZW5naW5lOwogICAgICAgIHRoaXMucGxheWVycyA9IFtdOwogICAgICAgIHRoaXMuX3RyaWdnZXJzID0ge307CiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTsKICAgICAgICB0aGlzLl9lbGVtZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpOwogICAgICAgIHRoaXMuX2hvc3RDbGFzc05hbWUgPSAnbmctdG5zLScgKyBpZDsKICAgICAgICBhZGRDbGFzcyhob3N0RWxlbWVudCwgdGhpcy5faG9zdENsYXNzTmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHBoYXNlCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsaXN0ZW4oZWxlbWVudCwgbmFtZSwgcGhhc2UsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKCF0aGlzLl90cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsaXN0ZW4gb24gdGhlIGFuaW1hdGlvbiB0cmlnZ2VyIGV2ZW50ICIke3BoYXNlfSIgYmVjYXVzZSB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIiR7bmFtZX0iIGRvZXNuXCd0IGV4aXN0IWApOwogICAgICAgIH0KICAgICAgICBpZiAocGhhc2UgPT0gbnVsbCB8fCBwaGFzZS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsaXN0ZW4gb24gdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke25hbWV9IiBiZWNhdXNlIHRoZSBwcm92aWRlZCBldmVudCBpcyB1bmRlZmluZWQhYCk7CiAgICAgICAgfQogICAgICAgIGlmICghaXNUcmlnZ2VyRXZlbnRWYWxpZChwaGFzZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIiR7cGhhc2V9IiBmb3IgdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke25hbWV9IiBpcyBub3Qgc3VwcG9ydGVkIWApOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0T3JTZXRBc0luTWFwKHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMsIGVsZW1lbnQsIFtdKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0YSA9IHsgbmFtZSwgcGhhc2UsIGNhbGxiYWNrIH07CiAgICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyaWdnZXJzV2l0aFN0YXRlcyA9IGdldE9yU2V0QXNJbk1hcCh0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LCBlbGVtZW50LCB7fSk7CiAgICAgICAgaWYgKCF0cmlnZ2Vyc1dpdGhTdGF0ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgTkdfVFJJR0dFUl9DTEFTU05BTUUpOwogICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBOR19UUklHR0VSX0NMQVNTTkFNRSArICctJyArIG5hbWUpOwogICAgICAgICAgICB0cmlnZ2Vyc1dpdGhTdGF0ZXNbbmFtZV0gPSBERUZBVUxUX1NUQVRFX1ZBTFVFOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvLyB0aGUgZXZlbnQgbGlzdGVuZXIgaXMgcmVtb3ZlZCBBRlRFUiB0aGUgZmx1c2ggaGFzIG9jY3VycmVkIHN1Y2gKICAgICAgICAgICAgLy8gdGhhdCBsZWF2ZSBhbmltYXRpb25zIGNhbGxiYWNrcyBjYW4gZmlyZSAob3RoZXJ3aXNlIGlmIHRoZSBub2RlCiAgICAgICAgICAgIC8vIGlzIHJlbW92ZWQgaW4gYmV0d2VlbiB0aGVuIHRoZSBsaXN0ZW5lcnMgd291bGQgYmUgZGVyZWdpc3RlcmVkKQogICAgICAgICAgICB0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGRhdGEpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdHJpZ2dlcnNbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHJpZ2dlcnNXaXRoU3RhdGVzW25hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyKG5hbWUsIGFzdCkgewogICAgICAgIGlmICh0aGlzLl90cmlnZ2Vyc1tuYW1lXSkgewogICAgICAgICAgICAvLyB0aHJvdwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl90cmlnZ2Vyc1tuYW1lXSA9IGFzdDsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0VHJpZ2dlcihuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLl90cmlnZ2Vyc1tuYW1lXTsKICAgICAgICBpZiAoIXRyaWdnZXIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgIiR7bmFtZX0iIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJpZ2dlcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHRyaWdnZXJOYW1lCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0VG9GYWxsYmFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJpZ2dlcihlbGVtZW50LCB0cmlnZ2VyTmFtZSwgdmFsdWUsIGRlZmF1bHRUb0ZhbGxiYWNrID0gdHJ1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5fZ2V0VHJpZ2dlcih0cmlnZ2VyTmFtZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBUcmFuc2l0aW9uQW5pbWF0aW9uUGxheWVyKHRoaXMuaWQsIHRyaWdnZXJOYW1lLCBlbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRyaWdnZXJzV2l0aFN0YXRlcyA9IHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmICghdHJpZ2dlcnNXaXRoU3RhdGVzKSB7CiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIE5HX1RSSUdHRVJfQ0xBU1NOQU1FKTsKICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgTkdfVFJJR0dFUl9DTEFTU05BTUUgKyAnLScgKyB0cmlnZ2VyTmFtZSk7CiAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQuc2V0KGVsZW1lbnQsIHRyaWdnZXJzV2l0aFN0YXRlcyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmcm9tU3RhdGUgPSB0cmlnZ2Vyc1dpdGhTdGF0ZXNbdHJpZ2dlck5hbWVdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0b1N0YXRlID0gbmV3IFN0YXRlVmFsdWUodmFsdWUsIHRoaXMuaWQpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc09iaiA9IHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KCd2YWx1ZScpOwogICAgICAgIGlmICghaXNPYmogJiYgZnJvbVN0YXRlKSB7CiAgICAgICAgICAgIHRvU3RhdGUuYWJzb3JiT3B0aW9ucyhmcm9tU3RhdGUub3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIHRyaWdnZXJzV2l0aFN0YXRlc1t0cmlnZ2VyTmFtZV0gPSB0b1N0YXRlOwogICAgICAgIGlmICghZnJvbVN0YXRlKSB7CiAgICAgICAgICAgIGZyb21TdGF0ZSA9IERFRkFVTFRfU1RBVEVfVkFMVUU7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1JlbW92YWwgPSB0b1N0YXRlLnZhbHVlID09PSBWT0lEX1ZBTFVFOwogICAgICAgIC8vIG5vcm1hbGx5IHRoaXMgaXNuJ3QgcmVhY2hlZCBieSBoZXJlLCBob3dldmVyLCBpZiBhbiBvYmplY3QgZXhwcmVzc2lvbgogICAgICAgIC8vIGlzIHBhc3NlZCBpbiB0aGVuIGl0IG1heSBiZSBhIG5ldyBvYmplY3QgZWFjaCB0aW1lLiBDb21wYXJpbmcgdGhlIHZhbHVlCiAgICAgICAgLy8gaXMgaW1wb3J0YW50IHNpbmNlIHRoYXQgd2lsbCBzdGF5IHRoZSBzYW1lIGRlc3BpdGUgdGhlcmUgYmVpbmcgYSBuZXcgb2JqZWN0LgogICAgICAgIC8vIFRoZSByZW1vdmFsIGFyYyBoZXJlIGlzIHNwZWNpYWwgY2FzZWQgYmVjYXVzZSB0aGUgc2FtZSBlbGVtZW50IGlzIHRyaWdnZXJlZAogICAgICAgIC8vIHR3aWNlIGluIHRoZSBldmVudCB0aGF0IGl0IGNvbnRhaW5zIGFuaW1hdGlvbnMgb24gdGhlIG91dGVyL2lubmVyIHBvcnRpb25zCiAgICAgICAgLy8gb2YgdGhlIGhvc3QgY29udGFpbmVyCiAgICAgICAgaWYgKCFpc1JlbW92YWwgJiYgZnJvbVN0YXRlLnZhbHVlID09PSB0b1N0YXRlLnZhbHVlKSB7CiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBkZXNwaXRlIHRoZSB2YWx1ZSBub3QgY2hhbmdpbmcsIHNvbWUgaW5uZXIgcGFyYW1zCiAgICAgICAgICAgIC8vIGhhdmUgY2hhbmdlZCB3aGljaCBtZWFucyB0aGF0IHRoZSBhbmltYXRpb24gZmluYWwgc3R5bGVzIG5lZWQgdG8gYmUgYXBwbGllZAogICAgICAgICAgICBpZiAoIW9iakVxdWFscyhmcm9tU3RhdGUucGFyYW1zLCB0b1N0YXRlLnBhcmFtcykpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZnJvbVN0eWxlcyA9IHRyaWdnZXIubWF0Y2hTdHlsZXMoZnJvbVN0YXRlLnZhbHVlLCBmcm9tU3RhdGUucGFyYW1zLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdG9TdHlsZXMgPSB0cmlnZ2VyLm1hdGNoU3R5bGVzKHRvU3RhdGUudmFsdWUsIHRvU3RhdGUucGFyYW1zLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmdpbmUucmVwb3J0RXJyb3IoZXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5hZnRlckZsdXNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VTdHlsZXMoZWxlbWVudCwgZnJvbVN0eWxlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlcyhlbGVtZW50LCB0b1N0eWxlcyk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsYXllcnNPbkVsZW1lbnQgPSBnZXRPclNldEFzSW5NYXAodGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQsIGVsZW1lbnQsIFtdKTsKICAgICAgICBwbGF5ZXJzT25FbGVtZW50LmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgcGxheWVyIGlmIGl0IGlzIHF1ZXVlZCBvbiB0aGUgRVhBQ1Qgc2FtZSB0cmlnZ2VyL25hbWVzcGFjZQogICAgICAgICAgICAvLyB3ZSBvbmx5IGFsc28gZGVhbCB3aXRoIHF1ZXVlZCBwbGF5ZXJzIGhlcmUgYmVjYXVzZSBpZiB0aGUgYW5pbWF0aW9uIGhhcwogICAgICAgICAgICAvLyBzdGFydGVkIHRoZW4gd2Ugd2FudCB0byBrZWVwIHRoZSBwbGF5ZXIgYWxpdmUgdW50aWwgdGhlIGZsdXNoIGhhcHBlbnMKICAgICAgICAgICAgLy8gKHdoaWNoIGlzIHdoZXJlIHRoZSBwcmV2aW91c1BsYXllcnMgYXJlIHBhc3NlZCBpbnRvIHRoZSBuZXcgcGFseWVyKQogICAgICAgICAgICBpZiAocGxheWVyLm5hbWVzcGFjZUlkID09IHRoaXMuaWQgJiYgcGxheWVyLnRyaWdnZXJOYW1lID09IHRyaWdnZXJOYW1lICYmIHBsYXllci5xdWV1ZWQpIHsKICAgICAgICAgICAgICAgIHBsYXllci5kZXN0cm95KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0cmFuc2l0aW9uID0gdHJpZ2dlci5tYXRjaFRyYW5zaXRpb24oZnJvbVN0YXRlLnZhbHVlLCB0b1N0YXRlLnZhbHVlLCBlbGVtZW50LCB0b1N0YXRlLnBhcmFtcyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpc0ZhbGxiYWNrVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgIGlmICghdHJhbnNpdGlvbikgewogICAgICAgICAgICBpZiAoIWRlZmF1bHRUb0ZhbGxiYWNrKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0cmFuc2l0aW9uID0gdHJpZ2dlci5mYWxsYmFja1RyYW5zaXRpb247CiAgICAgICAgICAgIGlzRmFsbGJhY2tUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZW5naW5lLnRvdGFsUXVldWVkUGxheWVycysrOwogICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBlbGVtZW50LCB0cmlnZ2VyTmFtZSwgdHJhbnNpdGlvbiwgZnJvbVN0YXRlLCB0b1N0YXRlLCBwbGF5ZXIsIGlzRmFsbGJhY2tUcmFuc2l0aW9uIH0pOwogICAgICAgIGlmICghaXNGYWxsYmFja1RyYW5zaXRpb24pIHsKICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgUVVFVUVEX0NMQVNTTkFNRSk7CiAgICAgICAgICAgIHBsYXllci5vblN0YXJ0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFFVRVVFRF9DTEFTU05BTUUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHBsYXllci5vbkRvbmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMucGxheWVycy5pbmRleE9mKHBsYXllcik7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBsYXllcnMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLl9lbmdpbmUucGxheWVyc0J5RWxlbWVudC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbGF5ZXJzLmluZGV4T2YocGxheWVyKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMucGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgcGxheWVyc09uRWxlbWVudC5wdXNoKHBsYXllcik7CiAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXJlZ2lzdGVyKG5hbWUpIHsKICAgICAgICBkZWxldGUgdGhpcy5fdHJpZ2dlcnNbbmFtZV07CiAgICAgICAgdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlTWFwCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoc3RhdGVNYXAsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgZGVsZXRlIHN0YXRlTWFwW25hbWVdOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLl9lbGVtZW50TGlzdGVuZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXJzCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobGlzdGVuZXJzLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuc2V0KGVsZW1lbnQsIGxpc3RlbmVycy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubmFtZSAhPSBuYW1lOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbGVhckVsZW1lbnRDYWNoZShlbGVtZW50KSB7CiAgICAgICAgdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgdGhpcy5fZWxlbWVudExpc3RlbmVycy5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnRQbGF5ZXJzID0gdGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmIChlbGVtZW50UGxheWVycykgewogICAgICAgICAgICBlbGVtZW50UGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBsYXllciA9PiBwbGF5ZXIuZGVzdHJveSgpKSk7CiAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LmRlbGV0ZShlbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJvb3RFbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2Vycyhyb290RWxlbWVudCwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2VuZ2luZS5kcml2ZXIucXVlcnkocm9vdEVsZW1lbnQsIE5HX1RSSUdHRVJfU0VMRUNUT1IsIHRydWUpOwogICAgICAgIC8vIGVtdWxhdGUgYSBsZWF2ZSBhbmltYXRpb24gZm9yIGFsbCBpbm5lciBub2RlcyB3aXRoaW4gdGhpcyBub2RlLgogICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBhbmltYXRpb25zIGZvdW5kIGZvciBhbnkgb2YgdGhlIG5vZGVzIHRoZW4gY2xlYXIgdGhlIGNhY2hlCiAgICAgICAgLy8gZm9yIHRoZSBlbGVtZW50LgogICAgICAgIGVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbG0gPT4gewogICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgYW4gaW5uZXIgcmVtb3ZlKCkgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGtpY2tlZCBvZmYKICAgICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBvbiB0aGlzIGVsZW1lbnQuLi4KICAgICAgICAgICAgaWYgKGVsbVtSRU1PVkFMX0ZMQUddKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZXMgPSB0aGlzLl9lbmdpbmUuZmV0Y2hOYW1lc3BhY2VzQnlFbGVtZW50KGVsbSk7CiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VzLnNpemUpIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5zCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBucyA9PiBucy50cmlnZ2VyTGVhdmVBbmltYXRpb24oZWxtLCBjb250ZXh0LCBmYWxzZSwgdHJ1ZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJFbGVtZW50Q2FjaGUoZWxtKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICAvLyBJZiB0aGUgY2hpbGQgZWxlbWVudHMgd2VyZSByZW1vdmVkIGFsb25nIHdpdGggdGhlIHBhcmVudCwgdGhlaXIgYW5pbWF0aW9ucyBtaWdodCBub3QKICAgICAgICAvLyBoYXZlIGNvbXBsZXRlZC4gQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBjYWNoZSBzbyB3ZSBkb24ndCBlbmQgdXAgd2l0aCBhIG1lbW9yeSBsZWFrLgogICAgICAgIHRoaXMuX2VuZ2luZS5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbG0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVsbSA9PiB0aGlzLmNsZWFyRWxlbWVudENhY2hlKGVsbSkpKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHBhcmFtIHs/PX0gZGVzdHJveUFmdGVyQ29tcGxldGUKICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRUb0ZhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmlnZ2VyTGVhdmVBbmltYXRpb24oZWxlbWVudCwgY29udGV4dCwgZGVzdHJveUFmdGVyQ29tcGxldGUsIGRlZmF1bHRUb0ZhbGxiYWNrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyaWdnZXJTdGF0ZXMgPSB0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldChlbGVtZW50KTsKICAgICAgICBpZiAodHJpZ2dlclN0YXRlcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSBbXTsKICAgICAgICAgICAgT2JqZWN0LmtleXModHJpZ2dlclN0YXRlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRyaWdnZXJOYW1lID0+IHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgaXMgaGVyZSBpbiB0aGUgZXZlbnQgdGhhdCBhbiBlbGVtZW50IGlzIHJlbW92ZWQKICAgICAgICAgICAgICAgIC8vIHR3aWNlIChib3RoIG9uIHRoZSBob3N0IGxldmVsIGFuZCB0aGUgY29tcG9uZW50IGxldmVsKQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXJzW3RyaWdnZXJOYW1lXSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnRyaWdnZXIoZWxlbWVudCwgdHJpZ2dlck5hbWUsIFZPSURfVkFMVUUsIGRlZmF1bHRUb0ZhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAocGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5tYXJrRWxlbWVudEFzUmVtb3ZlZCh0aGlzLmlkLCBlbGVtZW50LCB0cnVlLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIGlmIChkZXN0cm95QWZ0ZXJDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICAgIG9wdGltaXplR3JvdXBQbGF5ZXIocGxheWVycykub25Eb25lKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX2VuZ2luZS5wcm9jZXNzTGVhdmVOb2RlKGVsZW1lbnQpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcHJlcGFyZUxlYXZlQW5pbWF0aW9uTGlzdGVuZXJzKGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQoZWxlbWVudCk7CiAgICAgICAgaWYgKGxpc3RlbmVycykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpc2l0ZWRUcmlnZ2VycyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBsaXN0ZW5lciA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyTmFtZSA9IGxpc3RlbmVyLm5hbWU7CiAgICAgICAgICAgICAgICBpZiAodmlzaXRlZFRyaWdnZXJzLmhhcyh0cmlnZ2VyTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmlzaXRlZFRyaWdnZXJzLmFkZCh0cmlnZ2VyTmFtZSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5fdHJpZ2dlcnNbdHJpZ2dlck5hbWVdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRyaWdnZXIuZmFsbGJhY2tUcmFuc2l0aW9uOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFN0YXRlcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldChlbGVtZW50KSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZnJvbVN0YXRlID0gZWxlbWVudFN0YXRlc1t0cmlnZ2VyTmFtZV0gfHwgREVGQVVMVF9TVEFURV9WQUxVRTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRvU3RhdGUgPSBuZXcgU3RhdGVWYWx1ZShWT0lEX1ZBTFVFKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBUcmFuc2l0aW9uQW5pbWF0aW9uUGxheWVyKHRoaXMuaWQsIHRyaWdnZXJOYW1lLCBlbGVtZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZS50b3RhbFF1ZXVlZFBsYXllcnMrKzsKICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwKICAgICAgICAgICAgICAgICAgICBmcm9tU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgdG9TdGF0ZSwKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgaXNGYWxsYmFja1RyYW5zaXRpb246IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlTm9kZShlbGVtZW50LCBjb250ZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVuZ2luZSA9IHRoaXMuX2VuZ2luZTsKICAgICAgICBpZiAoZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCkgewogICAgICAgICAgICB0aGlzLl9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2VycyhlbGVtZW50LCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IGEgKiA9PiBWT0lEIGFuaW1hdGlvbiB3YXMgZGV0ZWN0ZWQgYW5kIGtpY2tlZCBvZmYKICAgICAgICBpZiAodGhpcy50cmlnZ2VyTGVhdmVBbmltYXRpb24oZWxlbWVudCwgY29udGV4dCwgdHJ1ZSkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBmaW5kIHRoZSBwbGF5ZXIgdGhhdCBpcyBhbmltYXRpbmcgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZQogICAgICAgIC8vIHJlbW92YWwgaXMgZGVsYXllZCB1bnRpbCB0aGF0IHBsYXllciBoYXMgY29tcGxldGVkCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb250YWluc1BvdGVudGlhbFBhcmVudFRyYW5zaXRpb24gPSBmYWxzZTsKICAgICAgICBpZiAoZW5naW5lLnRvdGFsQW5pbWF0aW9ucykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQbGF5ZXJzID0gZW5naW5lLnBsYXllcnMubGVuZ3RoID8gZW5naW5lLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmdldChlbGVtZW50KSA6IFtdOwogICAgICAgICAgICAvLyB3aGVuIHRoaXMgYGlmIHN0YXRlbWVudGAgZG9lcyBub3QgY29udGludWUgZm9yd2FyZCBpdCBtZWFucyB0aGF0CiAgICAgICAgICAgIC8vIGEgcHJldmlvdXMgYW5pbWF0aW9uIHF1ZXJ5IGhhcyBzZWxlY3RlZCB0aGUgY3VycmVudCBlbGVtZW50IGFuZAogICAgICAgICAgICAvLyBpcyBhbmltYXRpbmcgaXQuIEluIHRoaXMgc2l0dWF0aW9uIHdhbnQgdG8gY29udGludWUgZm9yd2FyZHMgYW5kCiAgICAgICAgICAgIC8vIGFsbG93IHRoZSBlbGVtZW50IHRvIGJlIHF1ZXVlZCB1cCBmb3IgYW5pbWF0aW9uIGxhdGVyLgogICAgICAgICAgICBpZiAoY3VycmVudFBsYXllcnMgJiYgY3VycmVudFBsYXllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb250YWluc1BvdGVudGlhbFBhcmVudFRyYW5zaXRpb24gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSBlbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldChwYXJlbnQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VycykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc1BvdGVudGlhbFBhcmVudFRyYW5zaXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBrbm93IHRoYXQgdGhlIGVsZW1lbnQgd2lsbCBlaXRoZXIgZ2V0IHJlbW92ZWQKICAgICAgICAvLyBkdXJpbmcgZmx1c2ggb3Igd2lsbCBiZSBwaWNrZWQgdXAgYnkgYSBwYXJlbnQgcXVlcnkuIEVpdGhlciB3YXkKICAgICAgICAvLyB3ZSBuZWVkIHRvIGZpcmUgdGhlIGxpc3RlbmVycyBmb3IgdGhpcyBlbGVtZW50IHdoZW4gaXQgRE9FUyBnZXQKICAgICAgICAvLyByZW1vdmVkIChvbmNlIHRoZSBxdWVyeSBwYXJlbnQgYW5pbWF0aW9uIGlzIGRvbmUgb3IgYWZ0ZXIgZmx1c2gpCiAgICAgICAgdGhpcy5wcmVwYXJlTGVhdmVBbmltYXRpb25MaXN0ZW5lcnMoZWxlbWVudCk7CiAgICAgICAgLy8gd2hldGhlciBvciBub3QgYSBwYXJlbnQgaGFzIGFuIGFuaW1hdGlvbiB3ZSBuZWVkIHRvIGRlbGF5IHRoZSBkZWZlcnJhbCBvZiB0aGUgbGVhdmUKICAgICAgICAvLyBvcGVyYXRpb24gdW50aWwgd2UgaGF2ZSBtb3JlIGluZm9ybWF0aW9uICh3aGljaCB3ZSBkbyBhZnRlciBmbHVzaCgpIGhhcyBiZWVuIGNhbGxlZCkKICAgICAgICBpZiAoY29udGFpbnNQb3RlbnRpYWxQYXJlbnRUcmFuc2l0aW9uKSB7CiAgICAgICAgICAgIGVuZ2luZS5tYXJrRWxlbWVudEFzUmVtb3ZlZCh0aGlzLmlkLCBlbGVtZW50LCBmYWxzZSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlbW92YWxGbGFnID0gZWxlbWVudFtSRU1PVkFMX0ZMQUddOwogICAgICAgICAgICBpZiAoIXJlbW92YWxGbGFnIHx8IHJlbW92YWxGbGFnID09PSBOVUxMX1JFTU9WQUxfU1RBVEUpIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYWZ0ZXIgdGhlIGZsdXNoIGhhcyBvY2N1cnJlZCBzdWNoCiAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBjYWxsYmFja3MgY2FuIGJlIGZpcmVkCiAgICAgICAgICAgICAgICBlbmdpbmUuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmNsZWFyRWxlbWVudENhY2hlKGVsZW1lbnQpKSk7CiAgICAgICAgICAgICAgICBlbmdpbmUuZGVzdHJveUlubmVyQW5pbWF0aW9ucyhlbGVtZW50KTsKICAgICAgICAgICAgICAgIGVuZ2luZS5fb25SZW1vdmFsQ29tcGxldGUoZWxlbWVudCwgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGluc2VydE5vZGUoZWxlbWVudCwgcGFyZW50KSB7CiAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgdGhpcy5faG9zdENsYXNzTmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWljcm90YXNrSWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRyYWluUXVldWVkVHJhbnNpdGlvbnMobWljcm90YXNrSWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gW107CiAgICAgICAgdGhpcy5fcXVldWUuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbnRyeQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZW50cnkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGVudHJ5LnBsYXllcjsKICAgICAgICAgICAgaWYgKHBsYXllci5kZXN0cm95ZWQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVudHJ5LmVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChsaXN0ZW5lcikgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5uYW1lID09IGVudHJ5LnRyaWdnZXJOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZUV2ZW50ID0gbWFrZUFuaW1hdGlvbkV2ZW50KGVsZW1lbnQsIGVudHJ5LnRyaWdnZXJOYW1lLCBlbnRyeS5mcm9tU3RhdGUudmFsdWUsIGVudHJ5LnRvU3RhdGUudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGJhc2VFdmVudCkpKVsnX2RhdGEnXSA9IG1pY3JvdGFza0lkOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5PblBsYXllcihlbnRyeS5wbGF5ZXIsIGxpc3RlbmVyLnBoYXNlLCBiYXNlRXZlbnQsIGxpc3RlbmVyLmNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllci5tYXJrZWRGb3JEZXN0cm95KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIGNhbiBkZXN0cm95IHRoZSBlbGVtZW50IHByb3Blcmx5IHNpbmNlIHRoZSBldmVudCBsaXN0ZW5lcnMgaGF2ZQogICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gYm91bmQgdG8gdGhlIHBsYXllcgogICAgICAgICAgICAgICAgICAgIHBsYXllci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChlbnRyeSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTsKICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zLnNvcnQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYQogICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGEsIGIpID0+IHsKICAgICAgICAgICAgLy8gaWYgZGVwQ291bnQgPT0gMCB0aGVtIG1vdmUgdG8gZnJvbnQKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIGEgY29udGFpbnMgYiB0aGVuIG1vdmUgYmFjawogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGQwID0gYS50cmFuc2l0aW9uLmFzdC5kZXBDb3VudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkMSA9IGIudHJhbnNpdGlvbi5hc3QuZGVwQ291bnQ7CiAgICAgICAgICAgIGlmIChkMCA9PSAwIHx8IGQxID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBkMCAtIGQxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmUuZHJpdmVyLmNvbnRhaW5zRWxlbWVudChhLmVsZW1lbnQsIGIuZWxlbWVudCkgPyAxIDogLTE7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koY29udGV4dCkgewogICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHAgPT4gcC5kZXN0cm95KCkpKTsKICAgICAgICB0aGlzLl9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2Vycyh0aGlzLmhvc3RFbGVtZW50LCBjb250ZXh0KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50Q29udGFpbnNEYXRhKGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbnRhaW5zRGF0YSA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLl9lbGVtZW50TGlzdGVuZXJzLmhhcyhlbGVtZW50KSkKICAgICAgICAgICAgY29udGFpbnNEYXRhID0gdHJ1ZTsKICAgICAgICBjb250YWluc0RhdGEgPQogICAgICAgICAgICAodGhpcy5fcXVldWUuZmluZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVudHJ5ID0+IGVudHJ5LmVsZW1lbnQgPT09IGVsZW1lbnQpKSA/IHRydWUgOiBmYWxzZSkgfHwgY29udGFpbnNEYXRhOwogICAgICAgIHJldHVybiBjb250YWluc0RhdGE7CiAgICB9Cn0KY2xhc3MgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYm9keU5vZGUKICAgICAqIEBwYXJhbSB7P30gZHJpdmVyCiAgICAgKiBAcGFyYW0gez99IF9ub3JtYWxpemVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGJvZHlOb2RlLCBkcml2ZXIsIF9ub3JtYWxpemVyKSB7CiAgICAgICAgdGhpcy5ib2R5Tm9kZSA9IGJvZHlOb2RlOwogICAgICAgIHRoaXMuZHJpdmVyID0gZHJpdmVyOwogICAgICAgIHRoaXMuX25vcm1hbGl6ZXIgPSBfbm9ybWFsaXplcjsKICAgICAgICB0aGlzLnBsYXllcnMgPSBbXTsKICAgICAgICB0aGlzLm5ld0hvc3RFbGVtZW50cyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLnBsYXllcnNCeUVsZW1lbnQgPSBuZXcgTWFwKCk7CiAgICAgICAgdGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudCA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLnN0YXRlc0J5RWxlbWVudCA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLmRpc2FibGVkTm9kZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgdGhpcy50b3RhbEFuaW1hdGlvbnMgPSAwOwogICAgICAgIHRoaXMudG90YWxRdWV1ZWRQbGF5ZXJzID0gMDsKICAgICAgICB0aGlzLl9uYW1lc3BhY2VMb29rdXAgPSB7fTsKICAgICAgICB0aGlzLl9uYW1lc3BhY2VMaXN0ID0gW107CiAgICAgICAgdGhpcy5fZmx1c2hGbnMgPSBbXTsKICAgICAgICB0aGlzLl93aGVuUXVpZXRGbnMgPSBbXTsKICAgICAgICB0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50ID0gbmV3IE1hcCgpOwogICAgICAgIHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cyA9IFtdOwogICAgICAgIHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cyA9IFtdOwogICAgICAgIC8vIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNvZGUgdGhhdCB1c2VzIHRoaXMgZW5naW5lCiAgICAgICAgdGhpcy5vblJlbW92YWxDb21wbGV0ZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChlbGVtZW50LCBjb250ZXh0KSA9PiB7IH0pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uUmVtb3ZhbENvbXBsZXRlKGVsZW1lbnQsIGNvbnRleHQpIHsKICAgICAgICB0aGlzLm9uUmVtb3ZhbENvbXBsZXRlKGVsZW1lbnQsIGNvbnRleHQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcXVldWVkUGxheWVycygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGxheWVycyA9IFtdOwogICAgICAgIHRoaXMuX25hbWVzcGFjZUxpc3QuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbnMgPT4gewogICAgICAgICAgICBucy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIucXVldWVkKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHBsYXllcnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZU5hbWVzcGFjZShuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbnMgPSBuZXcgQW5pbWF0aW9uVHJhbnNpdGlvbk5hbWVzcGFjZShuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQsIHRoaXMpOwogICAgICAgIGlmIChob3N0RWxlbWVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHRoaXMuX2JhbGFuY2VOYW1lc3BhY2VMaXN0KG5zLCBob3N0RWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBkZWZlciB0aGlzIGxhdGVyIHVudGlsIGZsdXNoIGR1cmluZyB3aGVuIHRoZSBob3N0IGVsZW1lbnQgaGFzCiAgICAgICAgICAgIC8vIGJlZW4gaW5zZXJ0ZWQgc28gdGhhdCB3ZSBrbm93IGV4YWN0bHkgd2hlcmUgdG8gcGxhY2UgaXQgaW4KICAgICAgICAgICAgLy8gdGhlIG5hbWVzcGFjZSBsaXN0CiAgICAgICAgICAgIHRoaXMubmV3SG9zdEVsZW1lbnRzLnNldChob3N0RWxlbWVudCwgbnMpOwogICAgICAgICAgICAvLyBnaXZlbiB0aGF0IHRoaXMgaG9zdCBlbGVtZW50IGlzIGFwYXJ0IG9mIHRoZSBhbmltYXRpb24gY29kZSwgaXQKICAgICAgICAgICAgLy8gbWF5IG9yIG1heSBub3QgYmUgaW5zZXJ0ZWQgYnkgYSBwYXJlbnQgbm9kZSB0aGF0IGlzIGFuIG9mIGFuCiAgICAgICAgICAgIC8vIGFuaW1hdGlvbiByZW5kZXJlciB0eXBlLiBJZiB0aGlzIGhhcHBlbnMgdGhlbiB3ZSBjYW4gc3RpbGwgaGF2ZQogICAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhpcyBpdGVtIHdoZW4gd2UgcXVlcnkgZm9yIDplbnRlciBub2Rlcy4gSWYgdGhlIHBhcmVudAogICAgICAgICAgICAvLyBpcyBhIHJlbmRlcmVyIHRoZW4gdGhlIHNldCBkYXRhLXN0cnVjdHVyZSB3aWxsIG5vcm1hbGl6ZSB0aGUgZW50cnkKICAgICAgICAgICAgdGhpcy5jb2xsZWN0RW50ZXJFbGVtZW50KGhvc3RFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWVzcGFjZUxvb2t1cFtuYW1lc3BhY2VJZF0gPSBuczsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gbnMKICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9iYWxhbmNlTmFtZXNwYWNlTGlzdChucywgaG9zdEVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGltaXQgPSB0aGlzLl9uYW1lc3BhY2VMaXN0Lmxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGxpbWl0ID49IDApIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxpbWl0OyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmV4dE5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUxpc3RbaV07CiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY29udGFpbnNFbGVtZW50KG5leHROYW1lc3BhY2UuaG9zdEVsZW1lbnQsIGhvc3RFbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX25hbWVzcGFjZUxpc3Quc3BsaWNlKGkgKyAxLCAwLCBucyk7CiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX25hbWVzcGFjZUxpc3Quc3BsaWNlKDAsIDAsIG5zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlTGlzdC5wdXNoKG5zKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudC5zZXQoaG9zdEVsZW1lbnQsIG5zKTsKICAgICAgICByZXR1cm4gbnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyKG5hbWVzcGFjZUlkLCBob3N0RWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbnMgPSB0aGlzLl9uYW1lc3BhY2VMb29rdXBbbmFtZXNwYWNlSWRdOwogICAgICAgIGlmICghbnMpIHsKICAgICAgICAgICAgbnMgPSB0aGlzLmNyZWF0ZU5hbWVzcGFjZShuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSB0cmlnZ2VyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3RlclRyaWdnZXIobmFtZXNwYWNlSWQsIG5hbWUsIHRyaWdnZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5zID0gdGhpcy5fbmFtZXNwYWNlTG9va3VwW25hbWVzcGFjZUlkXTsKICAgICAgICBpZiAobnMgJiYgbnMucmVnaXN0ZXIobmFtZSwgdHJpZ2dlcikpIHsKICAgICAgICAgICAgdGhpcy50b3RhbEFuaW1hdGlvbnMrKzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveShuYW1lc3BhY2VJZCwgY29udGV4dCkgewogICAgICAgIGlmICghbmFtZXNwYWNlSWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbnMgPSB0aGlzLl9mZXRjaE5hbWVzcGFjZShuYW1lc3BhY2VJZCk7CiAgICAgICAgdGhpcy5hZnRlckZsdXNoKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudC5kZWxldGUobnMuaG9zdEVsZW1lbnQpOwogICAgICAgICAgICBkZWxldGUgdGhpcy5fbmFtZXNwYWNlTG9va3VwW25hbWVzcGFjZUlkXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX25hbWVzcGFjZUxpc3QuaW5kZXhPZihucyk7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VMaXN0LnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gbnMuZGVzdHJveShjb250ZXh0KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBpZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2ZldGNoTmFtZXNwYWNlKGlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWVzcGFjZUxvb2t1cFtpZF07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmV0Y2hOYW1lc3BhY2VzQnlFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAvLyBub3JtYWxseSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgbmFtZXNwYWNlIHBlciBlbGVtZW50LCBob3dldmVyCiAgICAgICAgLy8gaWYgQHRyaWdnZXJzIGFyZSBwbGFjZWQgb24gYm90aCB0aGUgY29tcG9uZW50IGVsZW1lbnQgYW5kIHRoZW4KICAgICAgICAvLyBpdHMgaG9zdCBlbGVtZW50ICh3aXRoaW4gdGhlIGNvbXBvbmVudCBjb2RlKSB0aGVuIHRoZXJlIHdpbGwgYmUKICAgICAgICAvLyB0d28gbmFtZXNwYWNlcyByZXR1cm5lZC4gV2UgdXNlIGEgc2V0IGhlcmUgdG8gc2ltcGx5IHRoZSBkZWR1cGUKICAgICAgICAvLyBvZiBuYW1lc3BhY2VzIGluY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgdHJpZ2dlcnMgYm90aCB0aGUgZWxtIGFuZCBob3N0CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5hbWVzcGFjZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnRTdGF0ZXMgPSB0aGlzLnN0YXRlc0J5RWxlbWVudC5nZXQoZWxlbWVudCk7CiAgICAgICAgaWYgKGVsZW1lbnRTdGF0ZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudFN0YXRlcyk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbnNJZCA9IGVsZW1lbnRTdGF0ZXNba2V5c1tpXV0ubmFtZXNwYWNlSWQ7CiAgICAgICAgICAgICAgICBpZiAobnNJZCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBucyA9IHRoaXMuX2ZldGNoTmFtZXNwYWNlKG5zSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChucykgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLmFkZChucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuYW1lc3BhY2VzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJpZ2dlcihuYW1lc3BhY2VJZCwgZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsKICAgICAgICBpZiAoaXNFbGVtZW50Tm9kZShlbGVtZW50KSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy5fZmV0Y2hOYW1lc3BhY2UobmFtZXNwYWNlSWQpOwogICAgICAgICAgICBpZiAobnMpIHsKICAgICAgICAgICAgICAgIG5zLnRyaWdnZXIoZWxlbWVudCwgbmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IGluc2VydEJlZm9yZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5zZXJ0Tm9kZShuYW1lc3BhY2VJZCwgZWxlbWVudCwgcGFyZW50LCBpbnNlcnRCZWZvcmUpIHsKICAgICAgICBpZiAoIWlzRWxlbWVudE5vZGUoZWxlbWVudCkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHdoZW4gYW4gZWxlbWVudCBpcyByZW1vdmVkIGFuZCByZWluc2VydGVkIChtb3ZlIG9wZXJhdGlvbikKICAgICAgICAvLyB3aGVuIHRoaXMgb2NjdXJzIHdlIGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgZWxlbWVudCBmb3IgZGVsZXRpb24gbGF0ZXIKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGV0YWlscyA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50W1JFTU9WQUxfRkxBR10pKTsKICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLnNldEZvclJlbW92YWwpIHsKICAgICAgICAgICAgZGV0YWlscy5zZXRGb3JSZW1vdmFsID0gZmFsc2U7CiAgICAgICAgICAgIGRldGFpbHMuc2V0Rm9yTW92ZSA9IHRydWU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTsKICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGluIHRoZSBldmVudCB0aGF0IHRoZSBuYW1lc3BhY2VJZCBpcyBibGFuayB0aGVuIHRoZSBjYWxsZXIKICAgICAgICAvLyBjb2RlIGRvZXMgbm90IGNvbnRhaW4gYW55IGFuaW1hdGlvbiBjb2RlIGluIGl0LCBidXQgaXQgaXMKICAgICAgICAvLyBqdXN0IGJlaW5nIGNhbGxlZCBzbyB0aGF0IHRoZSBub2RlIGlzIG1hcmtlZCBhcyBiZWluZyBpbnNlcnRlZAogICAgICAgIGlmIChuYW1lc3BhY2VJZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy5fZmV0Y2hOYW1lc3BhY2UobmFtZXNwYWNlSWQpOwogICAgICAgICAgICAvLyBUaGlzIGlmLXN0YXRlbWVudCBpcyBhIHdvcmthcm91bmQgZm9yIHJvdXRlciBpc3N1ZSAjMjE5NDcuCiAgICAgICAgICAgIC8vIFRoZSByb3V0ZXIgc29tZXRpbWVzIGhpdHMgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB3aGlsZSBhIHJvdXRlCiAgICAgICAgICAgIC8vIGlzIGJlaW5nIGluc3RhbnRpYXRlZCBhIG5ldyBuYXZpZ2F0aW9uIGFycml2ZXMsIHRyaWdnZXJpbmcgbGVhdmUKICAgICAgICAgICAgLy8gYW5pbWF0aW9uIG9mIERPTSB0aGF0IGhhcyBub3QgYmVlbiBmdWxseSBpbml0aWFsaXplZCwgdW50aWwgdGhpcwogICAgICAgICAgICAvLyBpcyByZXNvbHZlZCwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZW4gRE9NIGlzIG5vdCBpbiBhCiAgICAgICAgICAgIC8vIGNvbnNpc3RlbnQgc3RhdGUgZHVyaW5nIHRoZSBhbmltYXRpb24uCiAgICAgICAgICAgIGlmIChucykgewogICAgICAgICAgICAgICAgbnMuaW5zZXJ0Tm9kZShlbGVtZW50LCBwYXJlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIG9ubHkgKmRpcmVjdGl2ZXMgYW5kIGhvc3QgZWxlbWVudHMgYXJlIGluc2VydGVkIGJlZm9yZQogICAgICAgIGlmIChpbnNlcnRCZWZvcmUpIHsKICAgICAgICAgICAgdGhpcy5jb2xsZWN0RW50ZXJFbGVtZW50KGVsZW1lbnQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb2xsZWN0RW50ZXJFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICB0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMucHVzaChlbGVtZW50KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXJrRWxlbWVudEFzRGlzYWJsZWQoZWxlbWVudCwgdmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkTm9kZXMuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkTm9kZXMuYWRkKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgRElTQUJMRURfQ0xBU1NOQU1FKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmRpc2FibGVkTm9kZXMuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWROb2Rlcy5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIERJU0FCTEVEX0NMQVNTTkFNRSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gaXNIb3N0RWxlbWVudAogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVOb2RlKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBpc0hvc3RFbGVtZW50LCBjb250ZXh0KSB7CiAgICAgICAgaWYgKGlzRWxlbWVudE5vZGUoZWxlbWVudCkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBucyA9IG5hbWVzcGFjZUlkID8gdGhpcy5fZmV0Y2hOYW1lc3BhY2UobmFtZXNwYWNlSWQpIDogbnVsbDsKICAgICAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICAgICAgICBucy5yZW1vdmVOb2RlKGVsZW1lbnQsIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5tYXJrRWxlbWVudEFzUmVtb3ZlZChuYW1lc3BhY2VJZCwgZWxlbWVudCwgZmFsc2UsIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0hvc3RFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBob3N0TlMgPSB0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50LmdldChlbGVtZW50KTsKICAgICAgICAgICAgICAgIGlmIChob3N0TlMgJiYgaG9zdE5TLmlkICE9PSBuYW1lc3BhY2VJZCkgewogICAgICAgICAgICAgICAgICAgIGhvc3ROUy5yZW1vdmVOb2RlKGVsZW1lbnQsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9vblJlbW92YWxDb21wbGV0ZShlbGVtZW50LCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/PX0gaGFzQW5pbWF0aW9uCiAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXJrRWxlbWVudEFzUmVtb3ZlZChuYW1lc3BhY2VJZCwgZWxlbWVudCwgaGFzQW5pbWF0aW9uLCBjb250ZXh0KSB7CiAgICAgICAgdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgZWxlbWVudFtSRU1PVkFMX0ZMQUddID0KICAgICAgICAgICAgeyBuYW1lc3BhY2VJZCwgc2V0Rm9yUmVtb3ZhbDogY29udGV4dCwgaGFzQW5pbWF0aW9uLCByZW1vdmVkQmVmb3JlUXVlcmllZDogZmFsc2UgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gcGhhc2UKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxpc3RlbihuYW1lc3BhY2VJZCwgZWxlbWVudCwgbmFtZSwgcGhhc2UsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKGlzRWxlbWVudE5vZGUoZWxlbWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoTmFtZXNwYWNlKG5hbWVzcGFjZUlkKS5saXN0ZW4oZWxlbWVudCwgbmFtZSwgcGhhc2UsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgKiBAcGFyYW0gez99IHN1YlRpbWVsaW5lcwogICAgICogQHBhcmFtIHs/fSBlbnRlckNsYXNzTmFtZQogICAgICogQHBhcmFtIHs/fSBsZWF2ZUNsYXNzTmFtZQogICAgICogQHBhcmFtIHs/PX0gc2tpcEJ1aWxkQXN0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYnVpbGRJbnN0cnVjdGlvbihlbnRyeSwgc3ViVGltZWxpbmVzLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIHNraXBCdWlsZEFzdCkgewogICAgICAgIHJldHVybiBlbnRyeS50cmFuc2l0aW9uLmJ1aWxkKHRoaXMuZHJpdmVyLCBlbnRyeS5lbGVtZW50LCBlbnRyeS5mcm9tU3RhdGUudmFsdWUsIGVudHJ5LnRvU3RhdGUudmFsdWUsIGVudGVyQ2xhc3NOYW1lLCBsZWF2ZUNsYXNzTmFtZSwgZW50cnkuZnJvbVN0YXRlLm9wdGlvbnMsIGVudHJ5LnRvU3RhdGUub3B0aW9ucywgc3ViVGltZWxpbmVzLCBza2lwQnVpbGRBc3QpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lckVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3lJbm5lckFuaW1hdGlvbnMoY29udGFpbmVyRWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZWxlbWVudHMgPSB0aGlzLmRyaXZlci5xdWVyeShjb250YWluZXJFbGVtZW50LCBOR19UUklHR0VSX1NFTEVDVE9SLCB0cnVlKTsKICAgICAgICBlbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVsZW1lbnQgPT4gdGhpcy5kZXN0cm95QWN0aXZlQW5pbWF0aW9uc0ZvckVsZW1lbnQoZWxlbWVudCkpKTsKICAgICAgICBpZiAodGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudC5zaXplID09IDApCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBlbGVtZW50cyA9IHRoaXMuZHJpdmVyLnF1ZXJ5KGNvbnRhaW5lckVsZW1lbnQsIE5HX0FOSU1BVElOR19TRUxFQ1RPUiwgdHJ1ZSk7CiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50ID0+IHRoaXMuZmluaXNoQWN0aXZlUXVlcmllZEFuaW1hdGlvbk9uRWxlbWVudChlbGVtZW50KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3lBY3RpdmVBbmltYXRpb25zRm9yRWxlbWVudChlbGVtZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmIChwbGF5ZXJzKSB7CiAgICAgICAgICAgIHBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB3aGVuIGFuIGVsZW1lbnQgaXMgc2V0IGZvciBkZXN0cnVjdGlvbiwgYnV0IGhhc24ndCBzdGFydGVkLgogICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzaXR1YXRpb24gd2Ugd2FudCB0byBkZWxheSB0aGUgZGVzdHJ1Y3Rpb24gdW50aWwgdGhlIGZsdXNoIG9jY3VycwogICAgICAgICAgICAgICAgLy8gc28gdGhhdCBhbnkgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBwbGF5ZXIgYXJlIHRyaWdnZXJlZC4KICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIucXVldWVkKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLm1hcmtlZEZvckRlc3Ryb3kgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5pc2hBY3RpdmVRdWVyaWVkQW5pbWF0aW9uT25FbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGxheWVycyA9IHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmIChwbGF5ZXJzKSB7CiAgICAgICAgICAgIHBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gcGxheWVyLmZpbmlzaCgpKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3aGVuUmVuZGVyaW5nRG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVzb2x2ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1pemVHcm91cFBsYXllcih0aGlzLnBsYXllcnMpLm9uRG9uZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9jZXNzTGVhdmVOb2RlKGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGV0YWlscyA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50W1JFTU9WQUxfRkxBR10pKTsKICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLnNldEZvclJlbW92YWwpIHsKICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHByZXZlbnQgaXQgZnJvbSByZW1vdmluZyBpdCB0d2ljZQogICAgICAgICAgICBlbGVtZW50W1JFTU9WQUxfRkxBR10gPSBOVUxMX1JFTU9WQUxfU1RBVEU7CiAgICAgICAgICAgIGlmIChkZXRhaWxzLm5hbWVzcGFjZUlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lJbm5lckFuaW1hdGlvbnMoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBucyA9IHRoaXMuX2ZldGNoTmFtZXNwYWNlKGRldGFpbHMubmFtZXNwYWNlSWQpOwogICAgICAgICAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICAgICAgICAgICAgbnMuY2xlYXJFbGVtZW50Q2FjaGUoZWxlbWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fb25SZW1vdmFsQ29tcGxldGUoZWxlbWVudCwgZGV0YWlscy5zZXRGb3JSZW1vdmFsKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLm1hdGNoZXNFbGVtZW50KGVsZW1lbnQsIERJU0FCTEVEX1NFTEVDVE9SKSkgewogICAgICAgICAgICB0aGlzLm1hcmtFbGVtZW50QXNEaXNhYmxlZChlbGVtZW50LCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZHJpdmVyLnF1ZXJ5KGVsZW1lbnQsIERJU0FCTEVEX1NFTEVDVE9SLCB0cnVlKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5vZGUgPT4gewogICAgICAgICAgICB0aGlzLm1hcmtFbGVtZW50QXNEaXNhYmxlZChub2RlLCBmYWxzZSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBtaWNyb3Rhc2tJZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmx1c2gobWljcm90YXNrSWQgPSAtMSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGxheWVycyA9IFtdOwogICAgICAgIGlmICh0aGlzLm5ld0hvc3RFbGVtZW50cy5zaXplKSB7CiAgICAgICAgICAgIHRoaXMubmV3SG9zdEVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5zCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5zLCBlbGVtZW50KSA9PiB0aGlzLl9iYWxhbmNlTmFtZXNwYWNlTGlzdChucywgZWxlbWVudCkpKTsKICAgICAgICAgICAgdGhpcy5uZXdIb3N0RWxlbWVudHMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudG90YWxBbmltYXRpb25zICYmIHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsbSA9IHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50c1tpXTsKICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsbSwgU1RBUl9DTEFTU05BTUUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9uYW1lc3BhY2VMaXN0Lmxlbmd0aCAmJgogICAgICAgICAgICAodGhpcy50b3RhbFF1ZXVlZFBsYXllcnMgfHwgdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLmxlbmd0aCkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjbGVhbnVwRm5zID0gW107CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJzID0gdGhpcy5fZmx1c2hBbmltYXRpb25zKGNsZWFudXBGbnMsIG1pY3JvdGFza0lkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xlYW51cEZucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNsZWFudXBGbnNbaV0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbaV07CiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMZWF2ZU5vZGUoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy50b3RhbFF1ZXVlZFBsYXllcnMgPSAwOwogICAgICAgIHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGggPSAwOwogICAgICAgIHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGggPSAwOwogICAgICAgIHRoaXMuX2ZsdXNoRm5zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICB0aGlzLl9mbHVzaEZucyA9IFtdOwogICAgICAgIGlmICh0aGlzLl93aGVuUXVpZXRGbnMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIHdlIG1vdmUgdGhlc2Ugb3ZlciB0byBhIHZhcmlhYmxlIHNvIHRoYXQKICAgICAgICAgICAgLy8gaWYgYW55IG5ldyBjYWxsYmFja3MgYXJlIHJlZ2lzdGVyZWQgaW4gYW5vdGhlcgogICAgICAgICAgICAvLyBmbHVzaCB0aGV5IGRvIG5vdCBwb3B1bGF0ZSB0aGUgZXhpc3Rpbmcgc2V0CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcXVpZXRGbnMgPSB0aGlzLl93aGVuUXVpZXRGbnM7CiAgICAgICAgICAgIHRoaXMuX3doZW5RdWlldEZucyA9IFtdOwogICAgICAgICAgICBpZiAocGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIG9wdGltaXplR3JvdXBQbGF5ZXIocGxheWVycykub25Eb25lKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBxdWlldEZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBxdWlldEZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcG9ydEVycm9yKGVycm9ycykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHByb2Nlc3MgYW5pbWF0aW9ucyBkdWUgdG8gdGhlIGZvbGxvd2luZyBmYWlsZWQgdHJpZ2dlciB0cmFuc2l0aW9uc1xuICR7ZXJyb3JzLmpvaW4oJ1xuJyl9YCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNsZWFudXBGbnMKICAgICAqIEBwYXJhbSB7P30gbWljcm90YXNrSWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mbHVzaEFuaW1hdGlvbnMoY2xlYW51cEZucywgbWljcm90YXNrSWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3ViVGltZWxpbmVzID0gbmV3IEVsZW1lbnRJbnN0cnVjdGlvbk1hcCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBza2lwcGVkUGxheWVycyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBza2lwcGVkUGxheWVyc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcXVldWVkSW5zdHJ1Y3Rpb25zID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHF1ZXJpZWRFbGVtZW50cyA9IG5ldyBNYXAoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsUHJlU3R5bGVFbGVtZW50cyA9IG5ldyBNYXAoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsUG9zdFN0eWxlRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpc2FibGVkRWxlbWVudHNTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgdGhpcy5kaXNhYmxlZE5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm9kZSA9PiB7CiAgICAgICAgICAgIGRpc2FibGVkRWxlbWVudHNTZXQuYWRkKG5vZGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5vZGVzVGhhdEFyZURpc2FibGVkID0gdGhpcy5kcml2ZXIucXVlcnkobm9kZSwgUVVFVUVEX1NFTEVDVE9SLCB0cnVlKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlc1RoYXRBcmVEaXNhYmxlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZGlzYWJsZWRFbGVtZW50c1NldC5hZGQobm9kZXNUaGF0QXJlRGlzYWJsZWRbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBib2R5Tm9kZSA9IHRoaXMuYm9keU5vZGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsbFRyaWdnZXJFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5zdGF0ZXNCeUVsZW1lbnQua2V5cygpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW50ZXJOb2RlTWFwID0gYnVpbGRSb290TWFwKGFsbFRyaWdnZXJFbGVtZW50cywgdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzKTsKICAgICAgICAvLyB0aGlzIG11c3Qgb2NjdXIgYmVmb3JlIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGJ1aWx0IGJlbG93IHN1Y2ggdGhhdAogICAgICAgIC8vIHRoZSA6ZW50ZXIgcXVlcmllcyBtYXRjaCB0aGUgZWxlbWVudHMgKHNpbmNlIHRoZSB0aW1lbGluZSBxdWVyaWVzCiAgICAgICAgLy8gYXJlIGZpcmVkIGR1cmluZyBpbnN0cnVjdGlvbiBidWlsZGluZykuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVudGVyTm9kZU1hcElkcyA9IG5ldyBNYXAoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIGVudGVyTm9kZU1hcC5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVzCiAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobm9kZXMsIHJvb3QpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBFTlRFUl9DTEFTU05BTUUgKyBpKys7CiAgICAgICAgICAgIGVudGVyTm9kZU1hcElkcy5zZXQocm9vdCwgY2xhc3NOYW1lKTsKICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiBhZGRDbGFzcyhub2RlLCBjbGFzc05hbWUpKSk7CiAgICAgICAgfSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbGxMZWF2ZU5vZGVzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lcmdlZExlYXZlTm9kZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxlYXZlTm9kZXNXaXRob3V0QW5pbWF0aW9ucyA9IG5ldyBTZXQoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbaV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50W1JFTU9WQUxfRkxBR10pKTsKICAgICAgICAgICAgaWYgKGRldGFpbHMgJiYgZGV0YWlscy5zZXRGb3JSZW1vdmFsKSB7CiAgICAgICAgICAgICAgICBhbGxMZWF2ZU5vZGVzLnB1c2goZWxlbWVudCk7CiAgICAgICAgICAgICAgICBtZXJnZWRMZWF2ZU5vZGVzLmFkZChlbGVtZW50KTsKICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzLmhhc0FuaW1hdGlvbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnF1ZXJ5KGVsZW1lbnQsIFNUQVJfU0VMRUNUT1IsIHRydWUpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxtCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBlbG0gPT4gbWVyZ2VkTGVhdmVOb2Rlcy5hZGQoZWxtKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbGVhdmVOb2Rlc1dpdGhvdXRBbmltYXRpb25zLmFkZChlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGVhdmVOb2RlTWFwSWRzID0gbmV3IE1hcCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsZWF2ZU5vZGVNYXAgPSBidWlsZFJvb3RNYXAoYWxsVHJpZ2dlckVsZW1lbnRzLCBBcnJheS5mcm9tKG1lcmdlZExlYXZlTm9kZXMpKTsKICAgICAgICBsZWF2ZU5vZGVNYXAuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlcwogICAgICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG5vZGVzLCByb290KSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gTEVBVkVfQ0xBU1NOQU1FICsgaSsrOwogICAgICAgICAgICBsZWF2ZU5vZGVNYXBJZHMuc2V0KHJvb3QsIGNsYXNzTmFtZSk7CiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5vZGUgPT4gYWRkQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKSkpOwogICAgICAgIH0pKTsKICAgICAgICBjbGVhbnVwRm5zLnB1c2goKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBlbnRlck5vZGVNYXAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZXMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobm9kZXMsIHJvb3QpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChlbnRlck5vZGVNYXBJZHMuZ2V0KHJvb3QpKSk7CiAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbm9kZSA9PiByZW1vdmVDbGFzcyhub2RlLCBjbGFzc05hbWUpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgbGVhdmVOb2RlTWFwLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVzCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5vZGVzLCByb290KSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAobGVhdmVOb2RlTWFwSWRzLmdldChyb290KSkpOwogICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG5vZGUgPT4gcmVtb3ZlQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGFsbExlYXZlTm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWxlbWVudCA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMZWF2ZU5vZGUoZWxlbWVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsbFBsYXllcnMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb25lb3VzVHJhbnNpdGlvbnMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fbmFtZXNwYWNlTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy5fbmFtZXNwYWNlTGlzdFtpXTsKICAgICAgICAgICAgbnMuZHJhaW5RdWV1ZWRUcmFuc2l0aW9ucyhtaWNyb3Rhc2tJZCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGVudHJ5LnBsYXllcjsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbnRyeS5lbGVtZW50OwogICAgICAgICAgICAgICAgYWxsUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnRbUkVNT1ZBTF9GTEFHXSkpOwogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYW5pbWF0aW9ucyBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuLi4KICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLnNldEZvck1vdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJc09ycGhhbmVkID0gIWJvZHlOb2RlIHx8ICF0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQoYm9keU5vZGUsIGVsZW1lbnQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGVhdmVDbGFzc05hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAobGVhdmVOb2RlTWFwSWRzLmdldChlbGVtZW50KSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW50ZXJDbGFzc05hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZW50ZXJOb2RlTWFwSWRzLmdldChlbGVtZW50KSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fYnVpbGRJbnN0cnVjdGlvbihlbnRyeSwgc3ViVGltZWxpbmVzLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIG5vZGVJc09ycGhhbmVkKSkpOwogICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uLmVycm9ycyAmJiBpbnN0cnVjdGlvbi5lcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb25lb3VzVHJhbnNpdGlvbnMucHVzaChpbnN0cnVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIGVsZW1lbnQgbWF5IG5vdCBiZSBhcGFydCBvZiB0aGUgRE9NLCBpdCBtYXkKICAgICAgICAgICAgICAgIC8vIHN0aWxsIGJlIGFkZGVkIGF0IGEgbGF0ZXIgcG9pbnQgKGR1ZSB0byB0aGUgbWVjaGFuaWNzIG9mIGNvbnRlbnQKICAgICAgICAgICAgICAgIC8vIHByb2plY3Rpb24gYW5kL29yIGR5bmFtaWMgY29tcG9uZW50IGluc2VydGlvbikgdGhlcmVmb3JlIGl0J3MKICAgICAgICAgICAgICAgIC8vIGltcG9ydGFudCB3ZSBzdGlsbCBzdHlsZSB0aGUgZWxlbWVudC4KICAgICAgICAgICAgICAgIGlmIChub2RlSXNPcnBoYW5lZCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllci5vblN0YXJ0KCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IGVyYXNlU3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLmZyb21TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRTdHlsZXMoZWxlbWVudCwgaW5zdHJ1Y3Rpb24udG9TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGlmIGEgdW5tYXRjaGVkIHRyYW5zaXRpb24gaXMgcXVldWVkIHRvIGdvIHRoZW4gaXQgU0hPVUxEIE5PVCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIGFuIGFuaW1hdGlvbiBhbmQgY2FuY2VsIHRoZSBwcmV2aW91c2x5IHJ1bm5pbmcgYW5pbWF0aW9ucy4KICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZhbGxiYWNrVHJhbnNpdGlvbikgewogICAgICAgICAgICAgICAgICAgIHBsYXllci5vblN0YXJ0KCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IGVyYXNlU3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLmZyb21TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRTdHlsZXMoZWxlbWVudCwgaW5zdHJ1Y3Rpb24udG9TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBpZiBhIHBhcmVudCBhbmltYXRpb24gdXNlcyB0aGlzIGFuaW1hdGlvbiBhcyBhIHN1YiB0cmlnZ2VyCiAgICAgICAgICAgICAgICAvLyB0aGVuIGl0IHdpbGwgaW5zdHJ1Y3QgdGhlIHRpbWVsaW5lIGJ1aWxkZXIgdG8gbm90IGFkZCBhIHBsYXllciBkZWxheSwgYnV0CiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIHN0cmV0Y2ggdGhlIGZpcnN0IGtleWZyYW1lIGdhcCB1cCB1bnRpbCB0aGUgYW5pbWF0aW9uIHN0YXJ0cy4gVGhlCiAgICAgICAgICAgICAgICAvLyByZWFzb24gdGhpcyBpcyBpbXBvcnRhbnQgaXMgdG8gcHJldmVudCBleHRyYSBpbml0aWFsaXphdGlvbiBzdHlsZXMgZnJvbSBiZWluZwogICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQgYnkgdGhlIHVzZXIgaW4gdGhlIGFuaW1hdGlvbi4KICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLnRpbWVsaW5lcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGwKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRsID0+IHRsLnN0cmV0Y2hTdGFydGluZ0tleWZyYW1lID0gdHJ1ZSkpOwogICAgICAgICAgICAgICAgc3ViVGltZWxpbmVzLmFwcGVuZChlbGVtZW50LCBpbnN0cnVjdGlvbi50aW1lbGluZXMpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHVwbGUgPSB7IGluc3RydWN0aW9uLCBwbGF5ZXIsIGVsZW1lbnQgfTsKICAgICAgICAgICAgICAgIHF1ZXVlZEluc3RydWN0aW9ucy5wdXNoKHR1cGxlKTsKICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLnF1ZXJpZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZWxlbWVudCA9PiBnZXRPclNldEFzSW5NYXAocXVlcmllZEVsZW1lbnRzLCBlbGVtZW50LCBbXSkucHVzaChwbGF5ZXIpKSk7CiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5wcmVTdHlsZVByb3BzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdHJpbmdNYXAKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHN0cmluZ01hcCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHN0cmluZ01hcCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRWYWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYWxsUHJlU3R5bGVFbGVtZW50cy5nZXQoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXRWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByZVN0eWxlRWxlbWVudHMuc2V0KGVsZW1lbnQsIHNldFZhbCA9IG5ldyBTZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCA9PiBzZXRWYWwuYWRkKHByb3ApKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ucG9zdFN0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0cmluZ01hcAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoc3RyaW5nTWFwLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoc3RyaW5nTWFwKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IHNldFZhbCA9ICgvKiogQHR5cGUgez99ICovIChhbGxQb3N0U3R5bGVFbGVtZW50cy5nZXQoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNldFZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhbGxQb3N0U3R5bGVFbGVtZW50cy5zZXQoZWxlbWVudCwgc2V0VmFsID0gbmV3IFNldCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBwcm9wID0+IHNldFZhbC5hZGQocHJvcCkpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb25lb3VzVHJhbnNpdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgICAgIGVycm9uZW91c1RyYW5zaXRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluc3RydWN0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbnN0cnVjdGlvbiA9PiB7CiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgQCR7aW5zdHJ1Y3Rpb24udHJpZ2dlck5hbWV9IGhhcyBmYWlsZWQgZHVlIHRvOlxuYCk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoaW5zdHJ1Y3Rpb24uZXJyb3JzKSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlcnJvciA9PiBlcnJvcnMucHVzaChgLSAke2Vycm9yfVxuYCkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBhbGxQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5kZXN0cm95KCkpKTsKICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvcnMpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsUHJldmlvdXNQbGF5ZXJzTWFwID0gbmV3IE1hcCgpOwogICAgICAgIC8vIHRoaXMgbWFwIHdvcmtzIHRvIHRlbGwgd2hpY2ggZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUgaXMgY29udGFpbmVkIGJ5CiAgICAgICAgLy8gd2hpY2ggYW5pbWF0aW9uLiBGdXJ0aGVyIGRvd24gYmVsb3cgdGhpcyBtYXAgd2lsbCBnZXQgcG9wdWxhdGVkIG9uY2UKICAgICAgICAvLyB0aGUgcGxheWVycyBhcmUgYnVpbHQgYW5kIGluIGRvaW5nIHNvIGl0IGNhbiBlZmZpY2llbnRseSBmaWd1cmUgb3V0CiAgICAgICAgLy8gaWYgYSBzdWIgcGxheWVyIGlzIHNraXBwZWQgZHVlIHRvIGEgcGFyZW50IHBsYXllciBoYXZpbmcgcHJpb3JpdHkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW1hdGlvbkVsZW1lbnRNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgcXVldWVkSW5zdHJ1Y3Rpb25zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZW50cnkuZWxlbWVudDsKICAgICAgICAgICAgaWYgKHN1YlRpbWVsaW5lcy5oYXMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgIGFuaW1hdGlvbkVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIGVsZW1lbnQpOwogICAgICAgICAgICAgICAgdGhpcy5fYmVmb3JlQW5pbWF0aW9uQnVpbGQoZW50cnkucGxheWVyLm5hbWVzcGFjZUlkLCBlbnRyeS5pbnN0cnVjdGlvbiwgYWxsUHJldmlvdXNQbGF5ZXJzTWFwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICBza2lwcGVkUGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcGxheWVyLmVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQbGF5ZXJzID0gdGhpcy5fZ2V0UHJldmlvdXNQbGF5ZXJzKGVsZW1lbnQsIGZhbHNlLCBwbGF5ZXIubmFtZXNwYWNlSWQsIHBsYXllci50cmlnZ2VyTmFtZSwgbnVsbCk7CiAgICAgICAgICAgIHByZXZpb3VzUGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcmV2UGxheWVyID0+IHsKICAgICAgICAgICAgICAgIGdldE9yU2V0QXNJbk1hcChhbGxQcmV2aW91c1BsYXllcnNNYXAsIGVsZW1lbnQsIFtdKS5wdXNoKHByZXZQbGF5ZXIpOwogICAgICAgICAgICAgICAgcHJldlBsYXllci5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3Igbm9kZXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQgKGVpdGhlciBieSkKICAgICAgICAvLyBoYXZpbmcgdGhlaXIgb3duIGxlYXZlIGFuaW1hdGlvbnMgb3IgYnkgYmVpbmcgcXVlcmllZCBpbiBhIGNvbnRhaW5lcgogICAgICAgIC8vIHRoYXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgYSBwYXJlbnQgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgaWRlYQogICAgICAgIC8vIGhlcmUgaXMgdGhhdCAqIHN0eWxlcyBtdXN0IGJlIGlkZW50aWNhbCB0byAhIHN0eWxlcyBiZWNhdXNlIG9mCiAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKCogaXMgYWxzbyBmaWxsZWQgaW4gYnkgZGVmYXVsdCBpbiBtYW55IHBsYWNlcykuCiAgICAgICAgLy8gT3RoZXJ3aXNlICogc3R5bGVzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHZhbHVlIG9yIGF1dG8gc2luY2UgdGhlIGVsZW1lbnQKICAgICAgICAvLyB0aGF0IGlzIGJlaW5nIGdldENvbXB1dGVkU3R5bGUnZCB3aWxsIG5vdCBiZSB2aXNpYmxlIChzaW5jZSAqID0gZGVzdGluYXRpb24pCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlcGxhY2VOb2RlcyA9IGFsbExlYXZlTm9kZXMuZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5vZGUgPT4gewogICAgICAgICAgICByZXR1cm4gcmVwbGFjZVBvc3RTdHlsZXNBc1ByZShub2RlLCBhbGxQcmVTdHlsZUVsZW1lbnRzLCBhbGxQb3N0U3R5bGVFbGVtZW50cyk7CiAgICAgICAgfSkpOwogICAgICAgIC8vIFBPU1QgU1RBR0U6IGZpbGwgdGhlICogc3R5bGVzCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBvc3RTdHlsZXNNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsbExlYXZlUXVlcmllZE5vZGVzID0gY2xvYWtBbmRDb21wdXRlU3R5bGVzKHBvc3RTdHlsZXNNYXAsIHRoaXMuZHJpdmVyLCBsZWF2ZU5vZGVzV2l0aG91dEFuaW1hdGlvbnMsIGFsbFBvc3RTdHlsZUVsZW1lbnRzLCBBVVRPX1NUWUxFKTsKICAgICAgICBhbGxMZWF2ZVF1ZXJpZWROb2Rlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5vZGUgPT4gewogICAgICAgICAgICBpZiAocmVwbGFjZVBvc3RTdHlsZXNBc1ByZShub2RlLCBhbGxQcmVTdHlsZUVsZW1lbnRzLCBhbGxQb3N0U3R5bGVFbGVtZW50cykpIHsKICAgICAgICAgICAgICAgIHJlcGxhY2VOb2Rlcy5wdXNoKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIC8vIFBSRSBTVEFHRTogZmlsbCB0aGUgISBzdHlsZXMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJlU3R5bGVzTWFwID0gbmV3IE1hcCgpOwogICAgICAgIGVudGVyTm9kZU1hcC5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVzCiAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobm9kZXMsIHJvb3QpID0+IHsKICAgICAgICAgICAgY2xvYWtBbmRDb21wdXRlU3R5bGVzKHByZVN0eWxlc01hcCwgdGhpcy5kcml2ZXIsIG5ldyBTZXQobm9kZXMpLCBhbGxQcmVTdHlsZUVsZW1lbnRzLCDJtVBSRV9TVFlMRSk7CiAgICAgICAgfSkpOwogICAgICAgIHJlcGxhY2VOb2Rlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5vZGUgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc3QgPSBwb3N0U3R5bGVzTWFwLmdldChub2RlKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmUgPSBwcmVTdHlsZXNNYXAuZ2V0KG5vZGUpOwogICAgICAgICAgICBwb3N0U3R5bGVzTWFwLnNldChub2RlLCAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwb3N0KSwgcHJlKSkpKTsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RQbGF5ZXJzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN1YlBsYXllcnMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgTk9fUEFSRU5UX0FOSU1BVElPTl9FTEVNRU5UX0RFVEVDVEVEID0ge307CiAgICAgICAgcXVldWVkSW5zdHJ1Y3Rpb25zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgY29uc3QgeyBlbGVtZW50LCBwbGF5ZXIsIGluc3RydWN0aW9uIH0gPSBlbnRyeTsKICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IGl0IHdhcyBuZXZlciBjb25zdW1lZCBieSBhIHBhcmVudCBhbmltYXRpb24gd2hpY2gKICAgICAgICAgICAgLy8gbWVhbnMgdGhhdCBpdCBpcyBpbmRlcGVuZGVudCBhbmQgdGhlcmVmb3JlIHNob3VsZCBiZSBzZXQgZm9yIGFuaW1hdGlvbgogICAgICAgICAgICBpZiAoc3ViVGltZWxpbmVzLmhhcyhlbGVtZW50KSkgewogICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkRWxlbWVudHNTZXQuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRTdHlsZXMoZWxlbWVudCwgaW5zdHJ1Y3Rpb24udG9TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIub3ZlcnJpZGVUb3RhbFRpbWUoaW5zdHJ1Y3Rpb24udG90YWxUaW1lKTsKICAgICAgICAgICAgICAgICAgICBza2lwcGVkUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGZsb3cgdXAgdGhlIERPTSBhbmQgcXVlcnkgdGhlIG1hcCB0byBmaWd1cmUgb3V0CiAgICAgICAgICAgICAgICAvLyBpZiBhIHBhcmVudCBhbmltYXRpb24gaGFzIHByaW9yaXR5IG92ZXIgaXQuIEluIHRoZSBzaXR1YXRpb24KICAgICAgICAgICAgICAgIC8vIHRoYXQgYSBwYXJlbnQgaXMgZGV0ZWN0ZWQgdGhlbiBpdCB3aWxsIGNhbmNlbCB0aGUgbG9vcC4gSWYKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgZGV0ZWN0ZWQsIG9yIGl0IHRha2VzIGEgZmV3IGhvcHMgdG8gZmluZCBhIHBhcmVudCwKICAgICAgICAgICAgICAgIC8vIHRoZW4gaXQgd2lsbCBmaWxsIGluIHRoZSBtaXNzaW5nIG5vZGVzIGFuZCBzaWduYWwgdGhlbSBhcyBoYXZpbmcKICAgICAgICAgICAgICAgIC8vIGEgZGV0ZWN0ZWQgcGFyZW50IChvciBhIE5PX1BBUkVOVCB2YWx1ZSB2aWEgYSBzcGVjaWFsIGNvbnN0YW50KS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwYXJlbnRXaXRoQW5pbWF0aW9uID0gTk9fUEFSRU5UX0FOSU1BVElPTl9FTEVNRU5UX0RFVEVDVEVEOwogICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvbkVsZW1lbnRNYXAuc2l6ZSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IGVsbSA9IGVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudHNUb0FkZCA9IFtdOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbG0gPSBlbG0ucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVjdGVkUGFyZW50ID0gYW5pbWF0aW9uRWxlbWVudE1hcC5nZXQoZWxtKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVjdGVkUGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRXaXRoQW5pbWF0aW9uID0gZGV0ZWN0ZWRQYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzVG9BZGQucHVzaChlbG0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXJlbnRzVG9BZGQuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9PiBhbmltYXRpb25FbGVtZW50TWFwLnNldChwYXJlbnQsIHBhcmVudFdpdGhBbmltYXRpb24pKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbm5lclBsYXllciA9IHRoaXMuX2J1aWxkQW5pbWF0aW9uKHBsYXllci5uYW1lc3BhY2VJZCwgaW5zdHJ1Y3Rpb24sIGFsbFByZXZpb3VzUGxheWVyc01hcCwgc2tpcHBlZFBsYXllcnNNYXAsIHByZVN0eWxlc01hcCwgcG9zdFN0eWxlc01hcCk7CiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0UmVhbFBsYXllcihpbm5lclBsYXllcik7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50V2l0aEFuaW1hdGlvbiA9PT0gTk9fUEFSRU5UX0FOSU1BVElPTl9FTEVNRU5UX0RFVEVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdFBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBsYXllcnMgPSB0aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHBhcmVudFdpdGhBbmltYXRpb24pOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQbGF5ZXJzICYmIHBhcmVudFBsYXllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5wYXJlbnRQbGF5ZXIgPSBvcHRpbWl6ZUdyb3VwUGxheWVyKHBhcmVudFBsYXllcnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBza2lwcGVkUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlcmFzZVN0eWxlcyhlbGVtZW50LCBpbnN0cnVjdGlvbi5mcm9tU3R5bGVzKTsKICAgICAgICAgICAgICAgIHBsYXllci5vbkRlc3Ryb3koKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gc2V0U3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLnRvU3R5bGVzKSkpOwogICAgICAgICAgICAgICAgLy8gdGhlcmUgc3RpbGwgbWlnaHQgYmUgYSBhbmNlc3RvciBwbGF5ZXIgYW5pbWF0aW5nIHRoaXMKICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgdGhlcmVmb3JlIHdlIHdpbGwgc3RpbGwgYWRkIGl0IGFzIGEgc3ViIHBsYXllcgogICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBpdHMgYW5pbWF0aW9uIG1heSBiZSBkaXNhYmxlZAogICAgICAgICAgICAgICAgc3ViUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWRFbGVtZW50c1NldC5oYXMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBza2lwcGVkUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN1YiBwbGF5ZXJzJyBjb3JyZXNwb25kaW5nIGlubmVyIGFuaW1hdGlvbiBwbGF5ZXIKICAgICAgICBzdWJQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAvLyBldmVuIGlmIGFueSBwbGF5ZXJzIGFyZSBub3QgZm91bmQgZm9yIGEgc3ViIGFuaW1hdGlvbiB0aGVuIGl0CiAgICAgICAgICAgIC8vIHdpbGwgc3RpbGwgY29tcGxldGUgaXRzZWxmIGFmdGVyIHRoZSBuZXh0IHRpY2sgc2luY2UgaXQncyBOb29wCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxheWVyc0ZvckVsZW1lbnQgPSBza2lwcGVkUGxheWVyc01hcC5nZXQocGxheWVyLmVsZW1lbnQpOwogICAgICAgICAgICBpZiAocGxheWVyc0ZvckVsZW1lbnQgJiYgcGxheWVyc0ZvckVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbm5lclBsYXllciA9IG9wdGltaXplR3JvdXBQbGF5ZXIocGxheWVyc0ZvckVsZW1lbnQpOwogICAgICAgICAgICAgICAgcGxheWVyLnNldFJlYWxQbGF5ZXIoaW5uZXJQbGF5ZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIC8vIHRoZSByZWFzb24gd2h5IHdlIGRvbid0IGFjdHVhbGx5IHBsYXkgdGhlIGFuaW1hdGlvbiBpcwogICAgICAgIC8vIGJlY2F1c2UgYWxsIHRoYXQgYSBza2lwcGVkIHBsYXllciBpcyBkZXNpZ25lZCB0byBkbyBpcyB0bwogICAgICAgIC8vIGZpcmUgdGhlIHN0YXJ0L2RvbmUgdHJhbnNpdGlvbiBjYWxsYmFjayBldmVudHMKICAgICAgICBza2lwcGVkUGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgaWYgKHBsYXllci5wYXJlbnRQbGF5ZXIpIHsKICAgICAgICAgICAgICAgIHBsYXllci5zeW5jUGxheWVyRXZlbnRzKHBsYXllci5wYXJlbnRQbGF5ZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICAvLyBydW4gdGhyb3VnaCBhbGwgb2YgdGhlIHF1ZXVlZCByZW1vdmFscyBhbmQgc2VlIGlmIHRoZXkKICAgICAgICAvLyB3ZXJlIHBpY2tlZCB1cCBieSBhIHF1ZXJ5LiBJZiBub3QgdGhlbiBwZXJmb3JtIHRoZSByZW1vdmFsCiAgICAgICAgLy8gb3BlcmF0aW9uIHJpZ2h0IGF3YXkgdW5sZXNzIGEgcGFyZW50IGFuaW1hdGlvbiBpcyBvbmdvaW5nLgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTGVhdmVOb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhbGxMZWF2ZU5vZGVzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudFtSRU1PVkFMX0ZMQUddKSk7CiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIExFQVZFX0NMQVNTTkFNRSk7CiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhlIGVsZW1lbnQgaGFzIGEgcmVtb3ZhbCBhbmltYXRpb24gdGhhdCBpcyBiZWluZwogICAgICAgICAgICAvLyB0YWtlbiBjYXJlIG9mIGFuZCB0aGVyZWZvcmUgdGhlIGlubmVyIGVsZW1lbnRzIHdpbGwgaGFuZyBhcm91bmQKICAgICAgICAgICAgLy8gdW50aWwgdGhhdCBhbmltYXRpb24gaXMgb3ZlciAob3IgdGhlIHBhcmVudCBxdWVyaWVkIGFuaW1hdGlvbikKICAgICAgICAgICAgaWYgKGRldGFpbHMgJiYgZGV0YWlscy5oYXNBbmltYXRpb24pCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGxheWVycyA9IFtdOwogICAgICAgICAgICAvLyBpZiB0aGlzIGVsZW1lbnQgaXMgcXVlcmllZCBvciBpZiBpdCBjb250YWlucyBxdWVyaWVkIGNoaWxkcmVuCiAgICAgICAgICAgIC8vIHRoZW4gd2Ugd2FudCBmb3IgdGhlIGVsZW1lbnQgbm90IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGFnZQogICAgICAgICAgICAvLyB1bnRpbCB0aGUgcXVlcmllZCBhbmltYXRpb25zIGhhdmUgZmluaXNoZWQKICAgICAgICAgICAgaWYgKHF1ZXJpZWRFbGVtZW50cy5zaXplKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcXVlcmllZFBsYXllclJlc3VsdHMgPSBxdWVyaWVkRWxlbWVudHMuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgaWYgKHF1ZXJpZWRQbGF5ZXJSZXN1bHRzICYmIHF1ZXJpZWRQbGF5ZXJSZXN1bHRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllcnMucHVzaCguLi5xdWVyaWVkUGxheWVyUmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcXVlcmllZElubmVyRWxlbWVudHMgPSB0aGlzLmRyaXZlci5xdWVyeShlbGVtZW50LCBOR19BTklNQVRJTkdfU0VMRUNUT1IsIHRydWUpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBxdWVyaWVkSW5uZXJFbGVtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgcXVlcmllZFBsYXllcnMgPSBxdWVyaWVkRWxlbWVudHMuZ2V0KHF1ZXJpZWRJbm5lckVsZW1lbnRzW2pdKTsKICAgICAgICAgICAgICAgICAgICBpZiAocXVlcmllZFBsYXllcnMgJiYgcXVlcmllZFBsYXllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcnMucHVzaCguLi5xdWVyaWVkUGxheWVycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWN0aXZlUGxheWVycyA9IHBsYXllcnMuZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwID0+ICFwLmRlc3Ryb3llZCkpOwogICAgICAgICAgICBpZiAoYWN0aXZlUGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJlbW92ZU5vZGVzQWZ0ZXJBbmltYXRpb25Eb25lKHRoaXMsIGVsZW1lbnQsIGFjdGl2ZVBsYXllcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGVhdmVOb2RlKGVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHRoaXMgaXMgcmVxdWlyZWQgc28gdGhlIGNsZWFudXAgbWV0aG9kIGRvZXNuJ3QgcmVtb3ZlIHRoZW0KICAgICAgICBhbGxMZWF2ZU5vZGVzLmxlbmd0aCA9IDA7CiAgICAgICAgcm9vdFBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgIHRoaXMucGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgIHBsYXllci5vbkRvbmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wbGF5ZXJzLmluZGV4T2YocGxheWVyKTsKICAgICAgICAgICAgICAgIHRoaXMucGxheWVycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiByb290UGxheWVyczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50Q29udGFpbnNEYXRhKG5hbWVzcGFjZUlkLCBlbGVtZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb250YWluc0RhdGEgPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGV0YWlscyA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50W1JFTU9WQUxfRkxBR10pKTsKICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLnNldEZvclJlbW92YWwpCiAgICAgICAgICAgIGNvbnRhaW5zRGF0YSA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMucGxheWVyc0J5RWxlbWVudC5oYXMoZWxlbWVudCkpCiAgICAgICAgICAgIGNvbnRhaW5zRGF0YSA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuaGFzKGVsZW1lbnQpKQogICAgICAgICAgICBjb250YWluc0RhdGEgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLnN0YXRlc0J5RWxlbWVudC5oYXMoZWxlbWVudCkpCiAgICAgICAgICAgIGNvbnRhaW5zRGF0YSA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoTmFtZXNwYWNlKG5hbWVzcGFjZUlkKS5lbGVtZW50Q29udGFpbnNEYXRhKGVsZW1lbnQpIHx8IGNvbnRhaW5zRGF0YTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWZ0ZXJGbHVzaChjYWxsYmFjaykgewogICAgICAgIHRoaXMuX2ZsdXNoRm5zLnB1c2goY2FsbGJhY2spOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoY2FsbGJhY2spIHsKICAgICAgICB0aGlzLl93aGVuUXVpZXRGbnMucHVzaChjYWxsYmFjayk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gaXNRdWVyaWVkRWxlbWVudAogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7Pz19IHRyaWdnZXJOYW1lCiAgICAgKiBAcGFyYW0gez89fSB0b1N0YXRlVmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRQcmV2aW91c1BsYXllcnMoZWxlbWVudCwgaXNRdWVyaWVkRWxlbWVudCwgbmFtZXNwYWNlSWQsIHRyaWdnZXJOYW1lLCB0b1N0YXRlVmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBsYXllcnMgPSBbXTsKICAgICAgICBpZiAoaXNRdWVyaWVkRWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHF1ZXJpZWRFbGVtZW50UGxheWVycyA9IHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICBpZiAocXVlcmllZEVsZW1lbnRQbGF5ZXJzKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJzID0gcXVlcmllZEVsZW1lbnRQbGF5ZXJzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQbGF5ZXJzID0gdGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldChlbGVtZW50KTsKICAgICAgICAgICAgaWYgKGVsZW1lbnRQbGF5ZXJzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc1JlbW92YWxBbmltYXRpb24gPSAhdG9TdGF0ZVZhbHVlIHx8IHRvU3RhdGVWYWx1ZSA9PSBWT0lEX1ZBTFVFOwogICAgICAgICAgICAgICAgZWxlbWVudFBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLnF1ZXVlZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNSZW1vdmFsQW5pbWF0aW9uICYmIHBsYXllci50cmlnZ2VyTmFtZSAhPSB0cmlnZ2VyTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuYW1lc3BhY2VJZCB8fCB0cmlnZ2VyTmFtZSkgewogICAgICAgICAgICBwbGF5ZXJzID0gcGxheWVycy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJZCAmJiBuYW1lc3BhY2VJZCAhPSBwbGF5ZXIubmFtZXNwYWNlSWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKHRyaWdnZXJOYW1lICYmIHRyaWdnZXJOYW1lICE9IHBsYXllci50cmlnZ2VyTmFtZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGxheWVyczsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb24KICAgICAqIEBwYXJhbSB7P30gYWxsUHJldmlvdXNQbGF5ZXJzTWFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYmVmb3JlQW5pbWF0aW9uQnVpbGQobmFtZXNwYWNlSWQsIGluc3RydWN0aW9uLCBhbGxQcmV2aW91c1BsYXllcnNNYXApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdHJpZ2dlck5hbWUgPSBpbnN0cnVjdGlvbi50cmlnZ2VyTmFtZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpbnN0cnVjdGlvbi5lbGVtZW50OwogICAgICAgIC8vIHdoZW4gYSByZW1vdmFsIGFuaW1hdGlvbiBvY2N1cnMsIEFMTCBwcmV2aW91cyBwbGF5ZXJzIGFyZSBjb2xsZWN0ZWQKICAgICAgICAvLyBhbmQgZGVzdHJveWVkIChldmVuIGlmIHRoZXkgYXJlIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgbmFtZXNwYWNlKQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YXJnZXROYW1lU3BhY2VJZCA9IGluc3RydWN0aW9uLmlzUmVtb3ZhbFRyYW5zaXRpb24gPyB1bmRlZmluZWQgOiBuYW1lc3BhY2VJZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGFyZ2V0VHJpZ2dlck5hbWUgPSBpbnN0cnVjdGlvbi5pc1JlbW92YWxUcmFuc2l0aW9uID8gdW5kZWZpbmVkIDogdHJpZ2dlck5hbWU7CiAgICAgICAgZm9yIChjb25zdCB0aW1lbGluZUluc3RydWN0aW9uIG9mIGluc3RydWN0aW9uLnRpbWVsaW5lcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aW1lbGluZUluc3RydWN0aW9uLmVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNRdWVyaWVkRWxlbWVudCA9IGVsZW1lbnQgIT09IHJvb3RFbGVtZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSBnZXRPclNldEFzSW5NYXAoYWxsUHJldmlvdXNQbGF5ZXJzTWFwLCBlbGVtZW50LCBbXSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQbGF5ZXJzID0gdGhpcy5fZ2V0UHJldmlvdXNQbGF5ZXJzKGVsZW1lbnQsIGlzUXVlcmllZEVsZW1lbnQsIHRhcmdldE5hbWVTcGFjZUlkLCB0YXJnZXRUcmlnZ2VyTmFtZSwgaW5zdHJ1Y3Rpb24udG9TdGF0ZSk7CiAgICAgICAgICAgIHByZXZpb3VzUGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByZWFsUGxheWVyID0gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAocGxheWVyKSkpLmdldFJlYWxQbGF5ZXIoKSkpOwogICAgICAgICAgICAgICAgaWYgKHJlYWxQbGF5ZXIuYmVmb3JlRGVzdHJveSkgewogICAgICAgICAgICAgICAgICAgIHJlYWxQbGF5ZXIuYmVmb3JlRGVzdHJveSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8vIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBzbyB0aGF0IHRoZSBQUkUvUE9TVCBzdHlsZXMgY2FuIGJlCiAgICAgICAgLy8gY29tcHV0ZWQgcHJvcGVybHkgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBwcmV2aW91cyBhbmltYXRpb24KICAgICAgICBlcmFzZVN0eWxlcyhyb290RWxlbWVudCwgaW5zdHJ1Y3Rpb24uZnJvbVN0eWxlcyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgKiBAcGFyYW0gez99IGluc3RydWN0aW9uCiAgICAgKiBAcGFyYW0gez99IGFsbFByZXZpb3VzUGxheWVyc01hcAogICAgICogQHBhcmFtIHs/fSBza2lwcGVkUGxheWVyc01hcAogICAgICogQHBhcmFtIHs/fSBwcmVTdHlsZXNNYXAKICAgICAqIEBwYXJhbSB7P30gcG9zdFN0eWxlc01hcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2J1aWxkQW5pbWF0aW9uKG5hbWVzcGFjZUlkLCBpbnN0cnVjdGlvbiwgYWxsUHJldmlvdXNQbGF5ZXJzTWFwLCBza2lwcGVkUGxheWVyc01hcCwgcHJlU3R5bGVzTWFwLCBwb3N0U3R5bGVzTWFwKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyaWdnZXJOYW1lID0gaW5zdHJ1Y3Rpb24udHJpZ2dlck5hbWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gaW5zdHJ1Y3Rpb24uZWxlbWVudDsKICAgICAgICAvLyB3ZSBmaXJzdCBydW4gdGhpcyBzbyB0aGF0IHRoZSBwcmV2aW91cyBhbmltYXRpb24gcGxheWVyCiAgICAgICAgLy8gZGF0YSBjYW4gYmUgcGFzc2VkIGludG8gdGhlIHN1Y2Nlc3NpdmUgYW5pbWF0aW9uIHBsYXllcnMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsUXVlcmllZFBsYXllcnMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsQ29uc3VtZWRFbGVtZW50cyA9IG5ldyBTZXQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsU3ViRWxlbWVudHMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsbE5ld1BsYXllcnMgPSBpbnN0cnVjdGlvbi50aW1lbGluZXMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRpbWVsaW5lSW5zdHJ1Y3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRpbWVsaW5lSW5zdHJ1Y3Rpb24gPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aW1lbGluZUluc3RydWN0aW9uLmVsZW1lbnQ7CiAgICAgICAgICAgIGFsbENvbnN1bWVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwogICAgICAgICAgICAvLyBGSVhNRSAobWF0c2tvKTogbWFrZSBzdXJlIHRvLWJlLXJlbW92ZWQgYW5pbWF0aW9ucyBhcmUgcmVtb3ZlZCBwcm9wZXJseQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBlbGVtZW50W1JFTU9WQUxfRkxBR107CiAgICAgICAgICAgIGlmIChkZXRhaWxzICYmIGRldGFpbHMucmVtb3ZlZEJlZm9yZVF1ZXJpZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vb3BBbmltYXRpb25QbGF5ZXIodGltZWxpbmVJbnN0cnVjdGlvbi5kdXJhdGlvbiwgdGltZWxpbmVJbnN0cnVjdGlvbi5kZWxheSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNRdWVyaWVkRWxlbWVudCA9IGVsZW1lbnQgIT09IHJvb3RFbGVtZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGxheWVycyA9IGZsYXR0ZW5Hcm91cFBsYXllcnMoKGFsbFByZXZpb3VzUGxheWVyc01hcC5nZXQoZWxlbWVudCkgfHwgRU1QVFlfUExBWUVSX0FSUkFZKQogICAgICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcCA9PiBwLmdldFJlYWxQbGF5ZXIoKSkpKQogICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcCA9PiB7CiAgICAgICAgICAgICAgICAvLyB0aGUgYGVsZW1lbnRgIGlzIG5vdCBhcGFydCBvZiB0aGUgQW5pbWF0aW9uUGxheWVyIGRlZmluaXRpb24sIGJ1dAogICAgICAgICAgICAgICAgLy8gTW9jay9XZWJBbmltYXRpb25zCiAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGVsZW1lbnQgd2l0aGluIHRoZWlyIGltcGxlbWVudGF0aW9uLiBUaGlzIHdpbGwgYmUgYWRkZWQgaW4gQW5ndWxhcjUgdG8KICAgICAgICAgICAgICAgIC8vIEFuaW1hdGlvblBsYXllcgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcHAgPSAoLyoqIEB0eXBlIHs/fSAqLyAocCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIHBwLmVsZW1lbnQgPyBwcC5lbGVtZW50ID09PSBlbGVtZW50IDogZmFsc2U7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVTdHlsZXMgPSBwcmVTdHlsZXNNYXAuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc3RTdHlsZXMgPSBwb3N0U3R5bGVzTWFwLmdldChlbGVtZW50KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXlmcmFtZXMgPSBub3JtYWxpemVLZXlmcmFtZXModGhpcy5kcml2ZXIsIHRoaXMuX25vcm1hbGl6ZXIsIGVsZW1lbnQsIHRpbWVsaW5lSW5zdHJ1Y3Rpb24ua2V5ZnJhbWVzLCBwcmVTdHlsZXMsIHBvc3RTdHlsZXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMuX2J1aWxkUGxheWVyKHRpbWVsaW5lSW5zdHJ1Y3Rpb24sIGtleWZyYW1lcywgcHJldmlvdXNQbGF5ZXJzKTsKICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHRoaXMgcGFydGljdWxhciBwbGF5ZXIgYmVsb25ncyB0byBhIHN1YiB0cmlnZ2VyLiBJdCBpcwogICAgICAgICAgICAvLyBpbXBvcnRhbnQgdGhhdCB3ZSBtYXRjaCB0aGlzIHBsYXllciB1cCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIChAdHJpZ2dlci5saXN0ZW5lcikKICAgICAgICAgICAgaWYgKHRpbWVsaW5lSW5zdHJ1Y3Rpb24uc3ViVGltZWxpbmUgJiYgc2tpcHBlZFBsYXllcnNNYXApIHsKICAgICAgICAgICAgICAgIGFsbFN1YkVsZW1lbnRzLmFkZChlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNRdWVyaWVkRWxlbWVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFBsYXllciA9IG5ldyBUcmFuc2l0aW9uQW5pbWF0aW9uUGxheWVyKG5hbWVzcGFjZUlkLCB0cmlnZ2VyTmFtZSwgZWxlbWVudCk7CiAgICAgICAgICAgICAgICB3cmFwcGVkUGxheWVyLnNldFJlYWxQbGF5ZXIocGxheWVyKTsKICAgICAgICAgICAgICAgIGFsbFF1ZXJpZWRQbGF5ZXJzLnB1c2god3JhcHBlZFBsYXllcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgICAgICB9KSk7CiAgICAgICAgYWxsUXVlcmllZFBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgIGdldE9yU2V0QXNJbk1hcCh0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LCBwbGF5ZXIuZWxlbWVudCwgW10pLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgcGxheWVyLm9uRG9uZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBkZWxldGVPclVuc2V0SW5NYXAodGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudCwgcGxheWVyLmVsZW1lbnQsIHBsYXllcikpKTsKICAgICAgICB9KSk7CiAgICAgICAgYWxsQ29uc3VtZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVsZW1lbnQgPT4gYWRkQ2xhc3MoZWxlbWVudCwgTkdfQU5JTUFUSU5HX0NMQVNTTkFNRSkpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGxheWVyID0gb3B0aW1pemVHcm91cFBsYXllcihhbGxOZXdQbGF5ZXJzKTsKICAgICAgICBwbGF5ZXIub25EZXN0cm95KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgYWxsQ29uc3VtZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbGVtZW50ID0+IHJlbW92ZUNsYXNzKGVsZW1lbnQsIE5HX0FOSU1BVElOR19DTEFTU05BTUUpKSk7CiAgICAgICAgICAgIHNldFN0eWxlcyhyb290RWxlbWVudCwgaW5zdHJ1Y3Rpb24udG9TdHlsZXMpOwogICAgICAgIH0pKTsKICAgICAgICAvLyB0aGlzIGJhc2ljYWxseSBtYWtlcyBhbGwgb2YgdGhlIGNhbGxiYWNrcyBmb3Igc3ViIGVsZW1lbnQgYW5pbWF0aW9ucwogICAgICAgIC8vIGJlIGRlcGVuZGVudCBvbiB0aGUgdXBwZXIgcGxheWVycyBmb3Igd2hlbiB0aGV5IGZpbmlzaAogICAgICAgIGFsbFN1YkVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZWxlbWVudCA9PiB7CiAgICAgICAgICAgIGdldE9yU2V0QXNJbk1hcChza2lwcGVkUGxheWVyc01hcCwgZWxlbWVudCwgW10pLnB1c2gocGxheWVyKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb24KICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzCiAgICAgKiBAcGFyYW0gez99IHByZXZpb3VzUGxheWVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2J1aWxkUGxheWVyKGluc3RydWN0aW9uLCBrZXlmcmFtZXMsIHByZXZpb3VzUGxheWVycykgewogICAgICAgIGlmIChrZXlmcmFtZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIuYW5pbWF0ZShpbnN0cnVjdGlvbi5lbGVtZW50LCBrZXlmcmFtZXMsIGluc3RydWN0aW9uLmR1cmF0aW9uLCBpbnN0cnVjdGlvbi5kZWxheSwgaW5zdHJ1Y3Rpb24uZWFzaW5nLCBwcmV2aW91c1BsYXllcnMpOwogICAgICAgIH0KICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHdoZW4gYW4gZW1wdHkgdHJhbnNpdGlvbnxkZWZpbml0aW9uIGlzIHByb3ZpZGVkCiAgICAgICAgLy8gLi4uIHRoZXJlIGlzIG5vIHBvaW50IGluIHJlbmRlcmluZyBhbiBlbXB0eSBhbmltYXRpb24KICAgICAgICByZXR1cm4gbmV3IE5vb3BBbmltYXRpb25QbGF5ZXIoaW5zdHJ1Y3Rpb24uZHVyYXRpb24sIGluc3RydWN0aW9uLmRlbGF5KTsKICAgIH0KfQpjbGFzcyBUcmFuc2l0aW9uQW5pbWF0aW9uUGxheWVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICogQHBhcmFtIHs/fSB0cmlnZ2VyTmFtZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5hbWVzcGFjZUlkLCB0cmlnZ2VyTmFtZSwgZWxlbWVudCkgewogICAgICAgIHRoaXMubmFtZXNwYWNlSWQgPSBuYW1lc3BhY2VJZDsKICAgICAgICB0aGlzLnRyaWdnZXJOYW1lID0gdHJpZ2dlck5hbWU7CiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICB0aGlzLl9wbGF5ZXIgPSBuZXcgTm9vcEFuaW1hdGlvblBsYXllcigpOwogICAgICAgIHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllciA9IGZhbHNlOwogICAgICAgIHRoaXMuX3F1ZXVlZENhbGxiYWNrcyA9IHt9OwogICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5tYXJrZWRGb3JEZXN0cm95ID0gZmFsc2U7CiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMucXVldWVkID0gdHJ1ZTsKICAgICAgICB0aGlzLnRvdGFsVGltZSA9IDA7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRSZWFsUGxheWVyKHBsYXllcikgewogICAgICAgIGlmICh0aGlzLl9jb250YWluc1JlYWxQbGF5ZXIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLl9wbGF5ZXIgPSBwbGF5ZXI7CiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fcXVldWVkQ2FsbGJhY2tzKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBoYXNlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwaGFzZSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3F1ZXVlZENhbGxiYWNrc1twaGFzZV0uZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNhbGxiYWNrID0+IGxpc3Rlbk9uUGxheWVyKHBsYXllciwgcGhhc2UsIHVuZGVmaW5lZCwgY2FsbGJhY2spKSk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX3F1ZXVlZENhbGxiYWNrcyA9IHt9OwogICAgICAgIHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllciA9IHRydWU7CiAgICAgICAgdGhpcy5vdmVycmlkZVRvdGFsVGltZShwbGF5ZXIudG90YWxUaW1lKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkucXVldWVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFJlYWxQbGF5ZXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXllcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0b3RhbFRpbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG92ZXJyaWRlVG90YWxUaW1lKHRvdGFsVGltZSkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS50b3RhbFRpbWUgPSB0b3RhbFRpbWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzeW5jUGxheWVyRXZlbnRzKHBsYXllcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3BsYXllcikpOwogICAgICAgIGlmIChwLnRyaWdnZXJDYWxsYmFjaykgewogICAgICAgICAgICBwbGF5ZXIub25TdGFydCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAocC50cmlnZ2VyQ2FsbGJhY2spKSgnc3RhcnQnKSkpOwogICAgICAgIH0KICAgICAgICBwbGF5ZXIub25Eb25lKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuZmluaXNoKCkpKTsKICAgICAgICBwbGF5ZXIub25EZXN0cm95KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuZGVzdHJveSgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9xdWV1ZUV2ZW50KG5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgZ2V0T3JTZXRBc0luTWFwKHRoaXMuX3F1ZXVlZENhbGxiYWNrcywgbmFtZSwgW10pLnB1c2goY2FsbGJhY2spOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRvbmUoZm4pIHsKICAgICAgICBpZiAodGhpcy5xdWV1ZWQpIHsKICAgICAgICAgICAgdGhpcy5fcXVldWVFdmVudCgnZG9uZScsIGZuKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGxheWVyLm9uRG9uZShmbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU3RhcnQoZm4pIHsKICAgICAgICBpZiAodGhpcy5xdWV1ZWQpIHsKICAgICAgICAgICAgdGhpcy5fcXVldWVFdmVudCgnc3RhcnQnLCBmbik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BsYXllci5vblN0YXJ0KGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25EZXN0cm95KGZuKSB7CiAgICAgICAgaWYgKHRoaXMucXVldWVkKSB7CiAgICAgICAgICAgIHRoaXMuX3F1ZXVlRXZlbnQoJ2Rlc3Ryb3knLCBmbik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BsYXllci5vbkRlc3Ryb3koZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbml0KCkgewogICAgICAgIHRoaXMuX3BsYXllci5pbml0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVldWVkID8gZmFsc2UgOiB0aGlzLl9wbGF5ZXIuaGFzU3RhcnRlZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwbGF5KCkgewogICAgICAgICF0aGlzLnF1ZXVlZCAmJiB0aGlzLl9wbGF5ZXIucGxheSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwYXVzZSgpIHsKICAgICAgICAhdGhpcy5xdWV1ZWQgJiYgdGhpcy5fcGxheWVyLnBhdXNlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc3RhcnQoKSB7CiAgICAgICAgIXRoaXMucXVldWVkICYmIHRoaXMuX3BsYXllci5yZXN0YXJ0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmlzaCgpIHsKICAgICAgICB0aGlzLl9wbGF5ZXIuZmluaXNoKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgdGhpcy5fcGxheWVyLmRlc3Ryb3koKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQoKSB7CiAgICAgICAgIXRoaXMucXVldWVkICYmIHRoaXMuX3BsYXllci5yZXNldCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFBvc2l0aW9uKHApIHsKICAgICAgICBpZiAoIXRoaXMucXVldWVkKSB7CiAgICAgICAgICAgIHRoaXMuX3BsYXllci5zZXRQb3NpdGlvbihwKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFBvc2l0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXVlZCA/IDAgOiB0aGlzLl9wbGF5ZXIuZ2V0UG9zaXRpb24oKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBwaGFzZU5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyaWdnZXJDYWxsYmFjayhwaGFzZU5hbWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9wbGF5ZXIpKTsKICAgICAgICBpZiAocC50cmlnZ2VyQ2FsbGJhY2spIHsKICAgICAgICAgICAgcC50cmlnZ2VyQ2FsbGJhY2socGhhc2VOYW1lKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWFwCiAqIEBwYXJhbSB7P30ga2V5CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlbGV0ZU9yVW5zZXRJbk1hcChtYXAsIGtleSwgdmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXJyZW50VmFsdWVzOwogICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkgewogICAgICAgIGN1cnJlbnRWYWx1ZXMgPSBtYXAuZ2V0KGtleSk7CiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZXMpIHsKICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRWYWx1ZXMuaW5kZXhPZih2YWx1ZSk7CiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWVzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIG1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGN1cnJlbnRWYWx1ZXMgPSBtYXBba2V5XTsKICAgICAgICBpZiAoY3VycmVudFZhbHVlcykgewogICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudFZhbHVlcy5pbmRleE9mKHZhbHVlKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGN1cnJlbnRWYWx1ZXM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVRyaWdnZXJWYWx1ZSh2YWx1ZSkgewogICAgLy8gd2UgdXNlIGAhPSBudWxsYCBoZXJlIGJlY2F1c2UgaXQncyB0aGUgbW9zdCBzaW1wbGUKICAgIC8vIHdheSB0byB0ZXN0IGFnYWluc3QgYSAiZmFsc3kiIHZhbHVlIHdpdGhvdXQgbWl4aW5nCiAgICAvLyBpbiBlbXB0eSBzdHJpbmdzIG9yIGEgemVybyB2YWx1ZS4gRE8gTk9UIE9QVElNSVpFLgogICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNFbGVtZW50Tm9kZShub2RlKSB7CiAgICByZXR1cm4gbm9kZSAmJiBub2RlWydub2RlVHlwZSddID09PSAxOwp9Ci8qKgogKiBAcGFyYW0gez99IGV2ZW50TmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNUcmlnZ2VyRXZlbnRWYWxpZChldmVudE5hbWUpIHsKICAgIHJldHVybiBldmVudE5hbWUgPT0gJ3N0YXJ0JyB8fCBldmVudE5hbWUgPT0gJ2RvbmUnOwp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/PX0gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsb2FrRWxlbWVudChlbGVtZW50LCB2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb2xkVmFsdWUgPSBlbGVtZW50LnN0eWxlLmRpc3BsYXk7CiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnbm9uZSc7CiAgICByZXR1cm4gb2xkVmFsdWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWVzTWFwCiAqIEBwYXJhbSB7P30gZHJpdmVyCiAqIEBwYXJhbSB7P30gZWxlbWVudHMKICogQHBhcmFtIHs/fSBlbGVtZW50UHJvcHNNYXAKICogQHBhcmFtIHs/fSBkZWZhdWx0U3R5bGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsb2FrQW5kQ29tcHV0ZVN0eWxlcyh2YWx1ZXNNYXAsIGRyaXZlciwgZWxlbWVudHMsIGVsZW1lbnRQcm9wc01hcCwgZGVmYXVsdFN0eWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjbG9ha1ZhbHMgPSBbXTsKICAgIGVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50ID0+IGNsb2FrVmFscy5wdXNoKGNsb2FrRWxlbWVudChlbGVtZW50KSkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZhaWxlZEVsZW1lbnRzID0gW107CiAgICBlbGVtZW50UHJvcHNNYXAuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3BzCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwcm9wcywgZWxlbWVudCkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTsKICAgICAgICBwcm9wcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3R5bGVzW3Byb3BdID0gZHJpdmVyLmNvbXB1dGVTdHlsZShlbGVtZW50LCBwcm9wLCBkZWZhdWx0U3R5bGUpOwogICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBkZXRlY3QgdGhpcyBiZWNhdXNlIGEgc3ViIGVsZW1lbnQgY291bGQgYmUgcmVtb3ZlZAogICAgICAgICAgICAvLyBieSBhIHBhcmVudCBhbmltYXRpb24gZWxlbWVudCBiZWluZyBkZXRhY2hlZC4KICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgZWxlbWVudFtSRU1PVkFMX0ZMQUddID0gTlVMTF9SRU1PVkVEX1FVRVJJRURfU1RBVEU7CiAgICAgICAgICAgICAgICBmYWlsZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHZhbHVlc01hcC5zZXQoZWxlbWVudCwgc3R5bGVzKTsKICAgIH0pKTsKICAgIC8vIHdlIHVzZSBhIGluZGV4IHZhcmlhYmxlIGhlcmUgc2luY2UgU2V0LmZvckVhY2goYSwgaSkgZG9lcyBub3QgcmV0dXJuCiAgICAvLyBhbiBpbmRleCB2YWx1ZSBmb3IgdGhlIGNsb3N1cmUgKGJ1dCBpbnN0ZWFkIGp1c3QgdGhlIHZhbHVlKQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSAwOwogICAgZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVsZW1lbnQgPT4gY2xvYWtFbGVtZW50KGVsZW1lbnQsIGNsb2FrVmFsc1tpKytdKSkpOwogICAgcmV0dXJuIGZhaWxlZEVsZW1lbnRzOwp9Ci8qClNpbmNlIHRoZSBBbmd1bGFyIHJlbmRlcmVyIGNvZGUgd2lsbCByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGluc2VydGVkCm5vZGVzIGluIGFsbCBhcmVhcyBvZiBhIERPTSB0cmVlLCBpdCdzIHVwIHRvIHRoaXMgYWxnb3JpdGhtIHRvIGZpZ3VyZQpvdXQgd2hpY2ggbm9kZXMgYXJlIHJvb3RzIGZvciBlYWNoIGFuaW1hdGlvbiBAdHJpZ2dlci4KCkJ5IHBsYWNpbmcgZWFjaCBpbnNlcnRlZCBub2RlIGludG8gYSBTZXQgYW5kIHRyYXZlcnNpbmcgdXB3YXJkcywgaXQKaXMgcG9zc2libGUgdG8gZmluZCB0aGUgQHRyaWdnZXIgZWxlbWVudHMgYW5kIHdlbGwgYW55IGRpcmVjdCAqc3RhcgppbnNlcnRpb24gbm9kZXMsIGlmIGEgQHRyaWdnZXIgcm9vdCBpcyBmb3VuZCB0aGVuIHRoZSBlbnRlciBlbGVtZW50CmlzIHBsYWNlZCBpbnRvIHRoZSBNYXBbQHRyaWdnZXJdIHNwb3QuCiAqLwovKioKICogQHBhcmFtIHs/fSByb290cwogKiBAcGFyYW0gez99IG5vZGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBidWlsZFJvb3RNYXAocm9vdHMsIG5vZGVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290TWFwID0gbmV3IE1hcCgpOwogICAgcm9vdHMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHJvb3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJvb3QgPT4gcm9vdE1hcC5zZXQocm9vdCwgW10pKSk7CiAgICBpZiAobm9kZXMubGVuZ3RoID09IDApCiAgICAgICAgcmV0dXJuIHJvb3RNYXA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOVUxMX05PREUgPSAxOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgbm9kZVNldCA9IG5ldyBTZXQobm9kZXMpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbG9jYWxSb290TWFwID0gbmV3IE1hcCgpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJvb3Qobm9kZSkgewogICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgcmV0dXJuIE5VTExfTk9ERTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJvb3QgPSBsb2NhbFJvb3RNYXAuZ2V0KG5vZGUpOwogICAgICAgIGlmIChyb290KQogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgIGlmIChyb290TWFwLmhhcyhwYXJlbnQpKSB7IC8vIG5nSWYgaW5zaWRlIEB0cmlnZ2VyCiAgICAgICAgICAgIHJvb3QgPSBwYXJlbnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5vZGVTZXQuaGFzKHBhcmVudCkpIHsgLy8gbmdJZiBpbnNpZGUgbmdJZgogICAgICAgICAgICByb290ID0gTlVMTF9OT0RFOwogICAgICAgIH0KICAgICAgICBlbHNlIHsgLy8gcmVjdXJzZSB1cHdhcmRzCiAgICAgICAgICAgIHJvb3QgPSBnZXRSb290KHBhcmVudCk7CiAgICAgICAgfQogICAgICAgIGxvY2FsUm9vdE1hcC5zZXQobm9kZSwgcm9vdCk7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBub2Rlcy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbm9kZSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3QgPSBnZXRSb290KG5vZGUpOwogICAgICAgIGlmIChyb290ICE9PSBOVUxMX05PREUpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RNYXAuZ2V0KHJvb3QpKSkucHVzaChub2RlKTsKICAgICAgICB9CiAgICB9KSk7CiAgICByZXR1cm4gcm9vdE1hcDsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IENMQVNTRVNfQ0FDSEVfS0VZID0gJyQkY2xhc3Nlcyc7Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBjbGFzc05hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7CiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNsYXNzZXMgPSBlbGVtZW50W0NMQVNTRVNfQ0FDSEVfS0VZXTsKICAgICAgICBpZiAoIWNsYXNzZXMpIHsKICAgICAgICAgICAgY2xhc3NlcyA9IGVsZW1lbnRbQ0xBU1NFU19DQUNIRV9LRVldID0ge307CiAgICAgICAgfQogICAgICAgIGNsYXNzZXNbY2xhc3NOYW1lXSA9IHRydWU7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IGNsYXNzTmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7CiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHsKICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY2xhc3NlcyA9IGVsZW1lbnRbQ0xBU1NFU19DQUNIRV9LRVldOwogICAgICAgIGlmIChjbGFzc2VzKSB7CiAgICAgICAgICAgIGRlbGV0ZSBjbGFzc2VzW2NsYXNzTmFtZV07CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGVuZ2luZQogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBwbGF5ZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW1vdmVOb2Rlc0FmdGVyQW5pbWF0aW9uRG9uZShlbmdpbmUsIGVsZW1lbnQsIHBsYXllcnMpIHsKICAgIG9wdGltaXplR3JvdXBQbGF5ZXIocGxheWVycykub25Eb25lKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IGVuZ2luZS5wcm9jZXNzTGVhdmVOb2RlKGVsZW1lbnQpKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGxheWVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmxhdHRlbkdyb3VwUGxheWVycyhwbGF5ZXJzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmaW5hbFBsYXllcnMgPSBbXTsKICAgIF9mbGF0dGVuR3JvdXBQbGF5ZXJzUmVjdXIocGxheWVycywgZmluYWxQbGF5ZXJzKTsKICAgIHJldHVybiBmaW5hbFBsYXllcnM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGxheWVycwogKiBAcGFyYW0gez99IGZpbmFsUGxheWVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2ZsYXR0ZW5Hcm91cFBsYXllcnNSZWN1cihwbGF5ZXJzLCBmaW5hbFBsYXllcnMpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxheWVycy5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJzW2ldOwogICAgICAgIGlmIChwbGF5ZXIgaW5zdGFuY2VvZiBBbmltYXRpb25Hcm91cFBsYXllcikgewogICAgICAgICAgICBfZmxhdHRlbkdyb3VwUGxheWVyc1JlY3VyKHBsYXllci5wbGF5ZXJzLCBmaW5hbFBsYXllcnMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmluYWxQbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG9iakVxdWFscyhhLCBiKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBrMSA9IE9iamVjdC5rZXlzKGEpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgazIgPSBPYmplY3Qua2V5cyhiKTsKICAgIGlmIChrMS5sZW5ndGggIT0gazIubGVuZ3RoKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgazEubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvcCA9IGsxW2ldOwogICAgICAgIGlmICghYi5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBhW3Byb3BdICE9PSBiW3Byb3BdKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gYWxsUHJlU3R5bGVFbGVtZW50cwogKiBAcGFyYW0gez99IGFsbFBvc3RTdHlsZUVsZW1lbnRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXBsYWNlUG9zdFN0eWxlc0FzUHJlKGVsZW1lbnQsIGFsbFByZVN0eWxlRWxlbWVudHMsIGFsbFBvc3RTdHlsZUVsZW1lbnRzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwb3N0RW50cnkgPSBhbGxQb3N0U3R5bGVFbGVtZW50cy5nZXQoZWxlbWVudCk7CiAgICBpZiAoIXBvc3RFbnRyeSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcHJlRW50cnkgPSBhbGxQcmVTdHlsZUVsZW1lbnRzLmdldChlbGVtZW50KTsKICAgIGlmIChwcmVFbnRyeSkgewogICAgICAgIHBvc3RFbnRyeS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRhdGEgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHByZUVudHJ5KSkuYWRkKGRhdGEpKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBhbGxQcmVTdHlsZUVsZW1lbnRzLnNldChlbGVtZW50LCBwb3N0RW50cnkpOwogICAgfQogICAgYWxsUG9zdFN0eWxlRWxlbWVudHMuZGVsZXRlKGVsZW1lbnQpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL2FuaW1hdGlvbl9lbmdpbmVfbmV4dC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBBbmltYXRpb25FbmdpbmUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGJvZHlOb2RlCiAgICAgKiBAcGFyYW0gez99IF9kcml2ZXIKICAgICAqIEBwYXJhbSB7P30gbm9ybWFsaXplcgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5Tm9kZSwgX2RyaXZlciwgbm9ybWFsaXplcikgewogICAgICAgIHRoaXMuYm9keU5vZGUgPSBib2R5Tm9kZTsKICAgICAgICB0aGlzLl9kcml2ZXIgPSBfZHJpdmVyOwogICAgICAgIHRoaXMuX3RyaWdnZXJDYWNoZSA9IHt9OwogICAgICAgIC8vIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNvZGUgdGhhdCB1c2VzIHRoaXMgZW5naW5lCiAgICAgICAgdGhpcy5vblJlbW92YWxDb21wbGV0ZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChlbGVtZW50LCBjb250ZXh0KSA9PiB7IH0pOwogICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUgPSBuZXcgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZShib2R5Tm9kZSwgX2RyaXZlciwgbm9ybWFsaXplcik7CiAgICAgICAgdGhpcy5fdGltZWxpbmVFbmdpbmUgPSBuZXcgVGltZWxpbmVBbmltYXRpb25FbmdpbmUoYm9keU5vZGUsIF9kcml2ZXIsIG5vcm1hbGl6ZXIpOwogICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUub25SZW1vdmFsQ29tcGxldGUgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZWxlbWVudCwgY29udGV4dCkgPT4gdGhpcy5vblJlbW92YWxDb21wbGV0ZShlbGVtZW50LCBjb250ZXh0KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50SWQKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJUcmlnZ2VyKGNvbXBvbmVudElkLCBuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQsIG5hbWUsIG1ldGFkYXRhKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29tcG9uZW50SWQgKyAnLScgKyBuYW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJDYWNoZVtjYWNoZUtleV07CiAgICAgICAgaWYgKCF0cmlnZ2VyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXN0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGJ1aWxkQW5pbWF0aW9uQXN0KHRoaXMuX2RyaXZlciwgKC8qKiBAdHlwZSB7P30gKi8gKG1ldGFkYXRhKSksIGVycm9ycykpKTsKICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke25hbWV9IiBoYXMgZmFpbGVkIHRvIGJ1aWxkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yczpcbiAtICR7ZXJyb3JzLmpvaW4oJ1xuIC0gJyl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJpZ2dlciA9IGJ1aWxkVHJpZ2dlcihuYW1lLCBhc3QpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ2FjaGVbY2FjaGVLZXldID0gdHJpZ2dlcjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5yZWdpc3RlclRyaWdnZXIobmFtZXNwYWNlSWQsIG5hbWUsIHRyaWdnZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgKiBAcGFyYW0gez99IGhvc3RFbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3RlcihuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQpIHsKICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyKG5hbWVzcGFjZUlkLCBob3N0RWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveShuYW1lc3BhY2VJZCwgY29udGV4dCkgewogICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUuZGVzdHJveShuYW1lc3BhY2VJZCwgY29udGV4dCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gaW5zZXJ0QmVmb3JlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkluc2VydChuYW1lc3BhY2VJZCwgZWxlbWVudCwgcGFyZW50LCBpbnNlcnRCZWZvcmUpIHsKICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5naW5lLmluc2VydE5vZGUobmFtZXNwYWNlSWQsIGVsZW1lbnQsIHBhcmVudCwgaW5zZXJ0QmVmb3JlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEBwYXJhbSB7Pz19IGlzSG9zdEVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uUmVtb3ZlKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBjb250ZXh0LCBpc0hvc3RFbGVtZW50KSB7CiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5yZW1vdmVOb2RlKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBpc0hvc3RFbGVtZW50IHx8IGZhbHNlLCBjb250ZXh0KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGRpc2FibGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc2FibGVBbmltYXRpb25zKGVsZW1lbnQsIGRpc2FibGUpIHsKICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5naW5lLm1hcmtFbGVtZW50QXNEaXNhYmxlZChlbGVtZW50LCBkaXNhYmxlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5CiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9jZXNzKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpIHsKICAgICAgICBpZiAocHJvcGVydHkuY2hhckF0KDApID09ICdAJykgewogICAgICAgICAgICBjb25zdCBbaWQsIGFjdGlvbl0gPSBwYXJzZVRpbWVsaW5lQ29tbWFuZChwcm9wZXJ0eSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXJncyA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICB0aGlzLl90aW1lbGluZUVuZ2luZS5jb21tYW5kKGlkLCBlbGVtZW50LCBhY3Rpb24sIGFyZ3MpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS50cmlnZ2VyKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHBhcmFtIHs/fSBldmVudFBoYXNlCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsaXN0ZW4obmFtZXNwYWNlSWQsIGVsZW1lbnQsIGV2ZW50TmFtZSwgZXZlbnRQaGFzZSwgY2FsbGJhY2spIHsKICAgICAgICAvLyBAQGxpc3RlbgogICAgICAgIGlmIChldmVudE5hbWUuY2hhckF0KDApID09ICdAJykgewogICAgICAgICAgICBjb25zdCBbaWQsIGFjdGlvbl0gPSBwYXJzZVRpbWVsaW5lQ29tbWFuZChldmVudE5hbWUpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVFbmdpbmUubGlzdGVuKGlkLCBlbGVtZW50LCBhY3Rpb24sIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUubGlzdGVuKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBldmVudE5hbWUsIGV2ZW50UGhhc2UsIGNhbGxiYWNrKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gbWljcm90YXNrSWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZsdXNoKG1pY3JvdGFza0lkID0gLTEpIHsKICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5naW5lLmZsdXNoKG1pY3JvdGFza0lkKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBsYXllcnMoKSB7CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5wbGF5ZXJzKSkpCiAgICAgICAgICAgIC5jb25jYXQoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RpbWVsaW5lRW5naW5lLnBsYXllcnMpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdoZW5SZW5kZXJpbmdEb25lKCkgewogICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uRW5naW5lLndoZW5SZW5kZXJpbmdEb25lKCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3NwZWNpYWxfY2FzZWRfc3R5bGVzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGBTcGVjaWFsQ2FzZWRTdHlsZXNgIGlmIGFuZCB3aGVuIGFueSBzcGVjaWFsIChub24gYW5pbWF0ZWFibGUpIHN0eWxlcyBhcmUKICogZGV0ZWN0ZWQuCiAqCiAqIEluIENTUyB0aGVyZSBleGlzdCBwcm9wZXJ0aWVzIHRoYXQgY2Fubm90IGJlIGFuaW1hdGVkIHdpdGhpbiBhIGtleWZyYW1lIGFuaW1hdGlvbgogKiAod2hldGhlciBpdCBiZSB2aWEgQ1NTIGtleWZyYW1lcyBvciB3ZWItYW5pbWF0aW9ucykgYW5kIHRoZSBhbmltYXRpb24gaW1wbGVtZW50YXRpb24KICogd2lsbCBpZ25vcmUgdGhlbS4gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBkZXRlY3QgdGhvc2Ugc3BlY2lhbCBjYXNlZCBzdHlsZXMgYW5kCiAqIHJldHVybiBhIGNvbnRhaW5lciB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KICoKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gc3R5bGVzCiAqIEByZXR1cm4gez99IGFuIGluc3RhbmNlIG9mIGBTcGVjaWFsQ2FzZWRTdHlsZXNgIGlmIGFueSBzcGVjaWFsIHN0eWxlcyBhcmUgZGV0ZWN0ZWQgb3RoZXJ3aXNlIGBudWxsYAogKi8KZnVuY3Rpb24gcGFja2FnZU5vbkFuaW1hdGFibGVTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgc3RhcnRTdHlsZXMgPSBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGVuZFN0eWxlcyA9IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZXMpICYmIHN0eWxlcy5sZW5ndGgpIHsKICAgICAgICBzdGFydFN0eWxlcyA9IGZpbHRlck5vbkFuaW1hdGFibGVTdHlsZXMoc3R5bGVzWzBdKTsKICAgICAgICBpZiAoc3R5bGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgZW5kU3R5bGVzID0gZmlsdGVyTm9uQW5pbWF0YWJsZVN0eWxlcyhzdHlsZXNbc3R5bGVzLmxlbmd0aCAtIDFdKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChzdHlsZXMpIHsKICAgICAgICBzdGFydFN0eWxlcyA9IGZpbHRlck5vbkFuaW1hdGFibGVTdHlsZXMoc3R5bGVzKTsKICAgIH0KICAgIHJldHVybiAoc3RhcnRTdHlsZXMgfHwgZW5kU3R5bGVzKSA/IG5ldyBTcGVjaWFsQ2FzZWRTdHlsZXMoZWxlbWVudCwgc3RhcnRTdHlsZXMsIGVuZFN0eWxlcykgOgogICAgICAgIG51bGw7Cn0KLyoqCiAqIERlc2lnbmVkIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyBhIGtleWZyYW1lLWJhc2VkIGFuaW1hdGlvbiB0byBhcHBseSBhbnkgc3BlY2lhbC1jYXNlZCBzdHlsZXMuCiAqCiAqIFdoZW4gc3RhcnRlZCAod2hlbiB0aGUgYHN0YXJ0KClgIG1ldGhvZCBpcyBydW4pIHRoZW4gdGhlIHByb3ZpZGVkIGBzdGFydFN0eWxlc2AKICogd2lsbCBiZSBhcHBsaWVkLiBXaGVuIGZpbmlzaGVkICh3aGVuIHRoZSBgZmluaXNoKClgIG1ldGhvZCBpcyBjYWxsZWQpIHRoZQogKiBgZW5kU3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgYXMgd2VsbCBhbnkgYW55IHN0YXJ0aW5nIHN0eWxlcy4gRmluYWxseSB3aGVuCiAqIGBkZXN0cm95KClgIGlzIGNhbGxlZCB0aGVuIGFsbCBzdHlsZXMgd2lsbCBiZSByZW1vdmVkLgogKi8KY2xhc3MgU3BlY2lhbENhc2VkU3R5bGVzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBfc3RhcnRTdHlsZXMKICAgICAqIEBwYXJhbSB7P30gX2VuZFN0eWxlcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX3N0YXJ0U3R5bGVzLCBfZW5kU3R5bGVzKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudCA9IF9lbGVtZW50OwogICAgICAgIHRoaXMuX3N0YXJ0U3R5bGVzID0gX3N0YXJ0U3R5bGVzOwogICAgICAgIHRoaXMuX2VuZFN0eWxlcyA9IF9lbmRTdHlsZXM7CiAgICAgICAgdGhpcy5fc3RhdGUgPSAwIC8qIFBlbmRpbmcgKi87CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbml0aWFsU3R5bGVzID0gU3BlY2lhbENhc2VkU3R5bGVzLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuZ2V0KF9lbGVtZW50KTsKICAgICAgICBpZiAoIWluaXRpYWxTdHlsZXMpIHsKICAgICAgICAgICAgU3BlY2lhbENhc2VkU3R5bGVzLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuc2V0KF9lbGVtZW50LCBpbml0aWFsU3R5bGVzID0ge30pOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pbml0aWFsU3R5bGVzID0gaW5pdGlhbFN0eWxlczsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhcnQoKSB7CiAgICAgICAgaWYgKHRoaXMuX3N0YXRlIDwgMSAvKiBTdGFydGVkICovKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFydFN0eWxlcykgewogICAgICAgICAgICAgICAgc2V0U3R5bGVzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX3N0YXJ0U3R5bGVzLCB0aGlzLl9pbml0aWFsU3R5bGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDEgLyogU3RhcnRlZCAqLzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmlzaCgpIHsKICAgICAgICB0aGlzLnN0YXJ0KCk7CiAgICAgICAgaWYgKHRoaXMuX3N0YXRlIDwgMiAvKiBGaW5pc2hlZCAqLykgewogICAgICAgICAgICBzZXRTdHlsZXModGhpcy5fZWxlbWVudCwgdGhpcy5faW5pdGlhbFN0eWxlcyk7CiAgICAgICAgICAgIGlmICh0aGlzLl9lbmRTdHlsZXMpIHsKICAgICAgICAgICAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB0aGlzLl9lbmRTdHlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fZW5kU3R5bGVzID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDEgLyogU3RhcnRlZCAqLzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5maW5pc2goKTsKICAgICAgICBpZiAodGhpcy5fc3RhdGUgPCAzIC8qIERlc3Ryb3llZCAqLykgewogICAgICAgICAgICBTcGVjaWFsQ2FzZWRTdHlsZXMuaW5pdGlhbFN0eWxlc0J5RWxlbWVudC5kZWxldGUodGhpcy5fZWxlbWVudCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFydFN0eWxlcykgewogICAgICAgICAgICAgICAgZXJhc2VTdHlsZXModGhpcy5fZWxlbWVudCwgdGhpcy5fc3RhcnRTdHlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fZW5kU3R5bGVzID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZW5kU3R5bGVzKSB7CiAgICAgICAgICAgICAgICBlcmFzZVN0eWxlcyh0aGlzLl9lbGVtZW50LCB0aGlzLl9lbmRTdHlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fZW5kU3R5bGVzID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRTdHlsZXModGhpcy5fZWxlbWVudCwgdGhpcy5faW5pdGlhbFN0eWxlcyk7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMyAvKiBEZXN0cm95ZWQgKi87CiAgICAgICAgfQogICAgfQp9ClNwZWNpYWxDYXNlZFN0eWxlcy5pbml0aWFsU3R5bGVzQnlFbGVtZW50ID0gbmV3IFdlYWtNYXAoKTsKLyoqCiAqIEBwYXJhbSB7P30gc3R5bGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaWx0ZXJOb25BbmltYXRhYmxlU3R5bGVzKHN0eWxlcykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHJlc3VsdCA9IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHN0eWxlcyk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpXTsKICAgICAgICBpZiAoaXNOb25BbmltYXRhYmxlU3R5bGUocHJvcCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9OwogICAgICAgICAgICByZXN1bHRbcHJvcF0gPSBzdHlsZXNbcHJvcF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogQHBhcmFtIHs/fSBwcm9wCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc05vbkFuaW1hdGFibGVTdHlsZShwcm9wKSB7CiAgICByZXR1cm4gcHJvcCA9PT0gJ2Rpc3BsYXknIHx8IHByb3AgPT09ICdwb3NpdGlvbic7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL2Nzc19rZXlmcmFtZXMvZWxlbWVudF9hbmltYXRpb25fc3R5bGVfaGFuZGxlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICogQHR5cGUgez99CiAqLwpjb25zdCBFTEFQU0VEX1RJTUVfTUFYX0RFQ0lNQUxfUExBQ0VTID0gMzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBBTklNQVRJT05fUFJPUCA9ICdhbmltYXRpb24nOwovKiogQHR5cGUgez99ICovCmNvbnN0IEFOSU1BVElPTkVORF9FVkVOVCA9ICdhbmltYXRpb25lbmQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IE9ORV9TRUNPTkQkMSA9IDEwMDA7CmNsYXNzIEVsZW1lbnRBbmltYXRpb25TdHlsZUhhbmRsZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50CiAgICAgKiBAcGFyYW0gez99IF9uYW1lCiAgICAgKiBAcGFyYW0gez99IF9kdXJhdGlvbgogICAgICogQHBhcmFtIHs/fSBfZGVsYXkKICAgICAqIEBwYXJhbSB7P30gX2Vhc2luZwogICAgICogQHBhcmFtIHs/fSBfZmlsbE1vZGUKICAgICAqIEBwYXJhbSB7P30gX29uRG9uZUZuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50LCBfbmFtZSwgX2R1cmF0aW9uLCBfZGVsYXksIF9lYXNpbmcsIF9maWxsTW9kZSwgX29uRG9uZUZuKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudCA9IF9lbGVtZW50OwogICAgICAgIHRoaXMuX25hbWUgPSBfbmFtZTsKICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IF9kdXJhdGlvbjsKICAgICAgICB0aGlzLl9kZWxheSA9IF9kZWxheTsKICAgICAgICB0aGlzLl9lYXNpbmcgPSBfZWFzaW5nOwogICAgICAgIHRoaXMuX2ZpbGxNb2RlID0gX2ZpbGxNb2RlOwogICAgICAgIHRoaXMuX29uRG9uZUZuID0gX29uRG9uZUZuOwogICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gMDsKICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IDA7CiAgICAgICAgdGhpcy5fZXZlbnRGbiA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChlKSA9PiB0aGlzLl9oYW5kbGVDYWxsYmFjayhlKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFwcGx5KCkgewogICAgICAgIGFwcGx5S2V5ZnJhbWVBbmltYXRpb24odGhpcy5fZWxlbWVudCwgYCR7dGhpcy5fZHVyYXRpb259bXMgJHt0aGlzLl9lYXNpbmd9ICR7dGhpcy5fZGVsYXl9bXMgMSBub3JtYWwgJHt0aGlzLl9maWxsTW9kZX0gJHt0aGlzLl9uYW1lfWApOwogICAgICAgIGFkZFJlbW92ZUFuaW1hdGlvbkV2ZW50KHRoaXMuX2VsZW1lbnQsIHRoaXMuX2V2ZW50Rm4sIGZhbHNlKTsKICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwYXVzZSgpIHsKICAgICAgICBwbGF5UGF1c2VBbmltYXRpb24odGhpcy5fZWxlbWVudCwgdGhpcy5fbmFtZSwgJ3BhdXNlZCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXN1bWUoKSB7CiAgICAgICAgcGxheVBhdXNlQW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWUsICdydW5uaW5nJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4Rm9yQW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWUpOwogICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb24gKiB0aGlzLl9kdXJhdGlvbjsKICAgICAgICBzZXRBbmltYXRpb25TdHlsZSh0aGlzLl9lbGVtZW50LCAnRGVsYXknLCBgLSR7dGhpcy5fcG9zaXRpb259bXNgLCBpbmRleCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFBvc2l0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYW5kbGVDYWxsYmFjayhldmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBldmVudC5fbmdUZXN0TWFudWFsVGltZXN0YW1wIHx8IERhdGUubm93KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gcGFyc2VGbG9hdChldmVudC5lbGFwc2VkVGltZS50b0ZpeGVkKEVMQVBTRURfVElNRV9NQVhfREVDSU1BTF9QTEFDRVMpKSAqIE9ORV9TRUNPTkQkMTsKICAgICAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PSB0aGlzLl9uYW1lICYmCiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVzdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSwgMCkgPj0gdGhpcy5fZGVsYXkgJiYgZWxhcHNlZFRpbWUgPj0gdGhpcy5fZHVyYXRpb24pIHsKICAgICAgICAgICAgdGhpcy5maW5pc2goKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmlzaCgpIHsKICAgICAgICBpZiAodGhpcy5fZmluaXNoZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fb25Eb25lRm4oKTsKICAgICAgICBhZGRSZW1vdmVBbmltYXRpb25FdmVudCh0aGlzLl9lbGVtZW50LCB0aGlzLl9ldmVudEZuLCB0cnVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmZpbmlzaCgpOwogICAgICAgIHJlbW92ZUtleWZyYW1lQW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gc3RhdHVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwbGF5UGF1c2VBbmltYXRpb24oZWxlbWVudCwgbmFtZSwgc3RhdHVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleEZvckFuaW1hdGlvbihlbGVtZW50LCBuYW1lKTsKICAgIHNldEFuaW1hdGlvblN0eWxlKGVsZW1lbnQsICdQbGF5U3RhdGUnLCBzdGF0dXMsIGluZGV4KTsKfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5S2V5ZnJhbWVBbmltYXRpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFuaW0gPSBnZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCAnJykudHJpbSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGluZGV4ID0gMDsKICAgIGlmIChhbmltLmxlbmd0aCkgewogICAgICAgIGluZGV4ID0gY291bnRDaGFycyhhbmltLCAnLCcpICsgMTsKICAgICAgICB2YWx1ZSA9IGAke2FuaW19LCAke3ZhbHVlfWA7CiAgICB9CiAgICBzZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCAnJywgdmFsdWUpOwogICAgcmV0dXJuIGluZGV4Owp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW1vdmVLZXlmcmFtZUFuaW1hdGlvbihlbGVtZW50LCBuYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhbmltID0gZ2V0QW5pbWF0aW9uU3R5bGUoZWxlbWVudCwgJycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdG9rZW5zID0gYW5pbS5zcGxpdCgnLCcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXggPSBmaW5kTWF0Y2hpbmdUb2tlbkluZGV4KHRva2VucywgbmFtZSk7CiAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgIHRva2Vucy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRva2Vucy5qb2luKCcsJyk7CiAgICAgICAgc2V0QW5pbWF0aW9uU3R5bGUoZWxlbWVudCwgJycsIG5ld1ZhbHVlKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZpbmRJbmRleEZvckFuaW1hdGlvbihlbGVtZW50LCB2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYW5pbSA9IGdldEFuaW1hdGlvblN0eWxlKGVsZW1lbnQsICcnKTsKICAgIGlmIChhbmltLmluZGV4T2YoJywnKSA+IDApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9rZW5zID0gYW5pbS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBmaW5kTWF0Y2hpbmdUb2tlbkluZGV4KHRva2VucywgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGZpbmRNYXRjaGluZ1Rva2VuSW5kZXgoW2FuaW1dLCB2YWx1ZSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdG9rZW5zCiAqIEBwYXJhbSB7P30gc2VhcmNoVG9rZW4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZpbmRNYXRjaGluZ1Rva2VuSW5kZXgodG9rZW5zLCBzZWFyY2hUb2tlbikgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAodG9rZW5zW2ldLmluZGV4T2Yoc2VhcmNoVG9rZW4pID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9Ci8qKgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBmbgogKiBAcGFyYW0gez99IGRvUmVtb3ZlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGRSZW1vdmVBbmltYXRpb25FdmVudChlbGVtZW50LCBmbiwgZG9SZW1vdmUpIHsKICAgIGRvUmVtb3ZlID8gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEFOSU1BVElPTkVORF9FVkVOVCwgZm4pIDoKICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoQU5JTUFUSU9ORU5EX0VWRU5ULCBmbik7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IG5hbWUKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez89fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0QW5pbWF0aW9uU3R5bGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIGluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcm9wID0gQU5JTUFUSU9OX1BST1AgKyBuYW1lOwogICAgaWYgKGluZGV4ICE9IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBlbGVtZW50LnN0eWxlW3Byb3BdOwogICAgICAgIGlmIChvbGRWYWx1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBvbGRWYWx1ZS5zcGxpdCgnLCcpOwogICAgICAgICAgICB0b2tlbnNbaW5kZXhdID0gdmFsdWU7CiAgICAgICAgICAgIHZhbHVlID0gdG9rZW5zLmpvaW4oJywnKTsKICAgICAgICB9CiAgICB9CiAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IG5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEFuaW1hdGlvblN0eWxlKGVsZW1lbnQsIG5hbWUpIHsKICAgIHJldHVybiBlbGVtZW50LnN0eWxlW0FOSU1BVElPTl9QUk9QICsgbmFtZV07Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBjaGFyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb3VudENoYXJzKHZhbHVlLCBjaGFyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY291bnQgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjID0gdmFsdWUuY2hhckF0KGkpOwogICAgICAgIGlmIChjID09PSBjaGFyKQogICAgICAgICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci9jc3Nfa2V5ZnJhbWVzL2Nzc19rZXlmcmFtZXNfcGxheWVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVGQVVMVF9GSUxMX01PREUgPSAnZm9yd2FyZHMnOwovKiogQHR5cGUgez99ICovCmNvbnN0IERFRkFVTFRfRUFTSU5HID0gJ2xpbmVhcic7CmNsYXNzIENzc0tleWZyYW1lc1BsYXllciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTmFtZQogICAgICogQHBhcmFtIHs/fSBfZHVyYXRpb24KICAgICAqIEBwYXJhbSB7P30gX2RlbGF5CiAgICAgKiBAcGFyYW0gez99IGVhc2luZwogICAgICogQHBhcmFtIHs/fSBfZmluYWxTdHlsZXMKICAgICAqIEBwYXJhbSB7Pz19IF9zcGVjaWFsU3R5bGVzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGtleWZyYW1lcywgYW5pbWF0aW9uTmFtZSwgX2R1cmF0aW9uLCBfZGVsYXksIGVhc2luZywgX2ZpbmFsU3R5bGVzLCBfc3BlY2lhbFN0eWxlcykgewogICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgICAgdGhpcy5rZXlmcmFtZXMgPSBrZXlmcmFtZXM7CiAgICAgICAgdGhpcy5hbmltYXRpb25OYW1lID0gYW5pbWF0aW9uTmFtZTsKICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IF9kdXJhdGlvbjsKICAgICAgICB0aGlzLl9kZWxheSA9IF9kZWxheTsKICAgICAgICB0aGlzLl9maW5hbFN0eWxlcyA9IF9maW5hbFN0eWxlczsKICAgICAgICB0aGlzLl9zcGVjaWFsU3R5bGVzID0gX3NwZWNpYWxTdHlsZXM7CiAgICAgICAgdGhpcy5fb25Eb25lRm5zID0gW107CiAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdOwogICAgICAgIHRoaXMuX29uRGVzdHJveUZucyA9IFtdOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmN1cnJlbnRTbmFwc2hvdCA9IHt9OwogICAgICAgIHRoaXMuX3N0YXRlID0gMDsKICAgICAgICB0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBERUZBVUxUX0VBU0lORzsKICAgICAgICB0aGlzLnRvdGFsVGltZSA9IF9kdXJhdGlvbiArIF9kZWxheTsKICAgICAgICB0aGlzLl9idWlsZFN0eWxlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblN0YXJ0KGZuKSB7CiAgICAgICAgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Eb25lKGZuKSB7CiAgICAgICAgdGhpcy5fb25Eb25lRm5zLnB1c2goZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koZm4pIHsKICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaChmbik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID49IDQgLyogREVTVFJPWUVEICovKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5fc3RhdGUgPSA0IC8qIERFU1RST1lFRCAqLzsKICAgICAgICB0aGlzLl9zdHlsZXIuZGVzdHJveSgpOwogICAgICAgIHRoaXMuX2ZsdXNoU3RhcnRGbnMoKTsKICAgICAgICB0aGlzLl9mbHVzaERvbmVGbnMoKTsKICAgICAgICBpZiAodGhpcy5fc3BlY2lhbFN0eWxlcykgewogICAgICAgICAgICB0aGlzLl9zcGVjaWFsU3R5bGVzLmRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mbHVzaERvbmVGbnMoKSB7CiAgICAgICAgdGhpcy5fb25Eb25lRm5zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mbHVzaFN0YXJ0Rm5zKCkgewogICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmluaXNoKCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIGlmICh0aGlzLl9zdGF0ZSA+PSAzIC8qIEZJTklTSEVEICovKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5fc3RhdGUgPSAzIC8qIEZJTklTSEVEICovOwogICAgICAgIHRoaXMuX3N0eWxlci5maW5pc2goKTsKICAgICAgICB0aGlzLl9mbHVzaFN0YXJ0Rm5zKCk7CiAgICAgICAgaWYgKHRoaXMuX3NwZWNpYWxTdHlsZXMpIHsKICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcy5maW5pc2goKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZmx1c2hEb25lRm5zKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFBvc2l0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fc3R5bGVyLnNldFBvc2l0aW9uKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UG9zaXRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlci5nZXRQb3NpdGlvbigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBoYXNTdGFydGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSA+PSAyIC8qIFNUQVJURUQgKi87CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGluaXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID49IDEgLyogSU5JVElBTElaRUQgKi8pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLl9zdGF0ZSA9IDEgLyogSU5JVElBTElaRUQgKi87CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsbSA9IHRoaXMuZWxlbWVudDsKICAgICAgICB0aGlzLl9zdHlsZXIuYXBwbHkoKTsKICAgICAgICBpZiAodGhpcy5fZGVsYXkpIHsKICAgICAgICAgICAgdGhpcy5fc3R5bGVyLnBhdXNlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwbGF5KCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgdGhpcy5fZmx1c2hTdGFydEZucygpOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDIgLyogU1RBUlRFRCAqLzsKICAgICAgICAgICAgaWYgKHRoaXMuX3NwZWNpYWxTdHlsZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NwZWNpYWxTdHlsZXMuc3RhcnQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9zdHlsZXIucmVzdW1lKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhdXNlKCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIHRoaXMuX3N0eWxlci5wYXVzZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXN0YXJ0KCkgewogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICB0aGlzLnBsYXkoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQoKSB7CiAgICAgICAgdGhpcy5fc3R5bGVyLmRlc3Ryb3koKTsKICAgICAgICB0aGlzLl9idWlsZFN0eWxlcigpOwogICAgICAgIHRoaXMuX3N0eWxlci5hcHBseSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2J1aWxkU3R5bGVyKCkgewogICAgICAgIHRoaXMuX3N0eWxlciA9IG5ldyBFbGVtZW50QW5pbWF0aW9uU3R5bGVIYW5kbGVyKHRoaXMuZWxlbWVudCwgdGhpcy5hbmltYXRpb25OYW1lLCB0aGlzLl9kdXJhdGlvbiwgdGhpcy5fZGVsYXksIHRoaXMuZWFzaW5nLCBERUZBVUxUX0ZJTExfTU9ERSwgKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5maW5pc2goKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHBoYXNlTmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJpZ2dlckNhbGxiYWNrKHBoYXNlTmFtZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRob2RzID0gcGhhc2VOYW1lID09ICdzdGFydCcgPyB0aGlzLl9vblN0YXJ0Rm5zIDogdGhpcy5fb25Eb25lRm5zOwogICAgICAgIG1ldGhvZHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgIG1ldGhvZHMubGVuZ3RoID0gMDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmVmb3JlRGVzdHJveSgpIHsKICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0ge307CiAgICAgICAgaWYgKHRoaXMuaGFzU3RhcnRlZCgpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmluaXNoZWQgPSB0aGlzLl9zdGF0ZSA+PSAzIC8qIEZJTklTSEVEICovOwogICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9maW5hbFN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSAnb2Zmc2V0JykgewogICAgICAgICAgICAgICAgICAgIHN0eWxlc1twcm9wXSA9IGZpbmlzaGVkID8gdGhpcy5fZmluYWxTdHlsZXNbcHJvcF0gOiBjb21wdXRlU3R5bGUodGhpcy5lbGVtZW50LCBwcm9wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmN1cnJlbnRTbmFwc2hvdCA9IHN0eWxlczsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvY3NzX2tleWZyYW1lcy9kaXJlY3Rfc3R5bGVfcGxheWVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIERpcmVjdFN0eWxlUGxheWVyIGV4dGVuZHMgTm9vcEFuaW1hdGlvblBsYXllciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqLwogICAgY29uc3RydWN0b3IoZWxlbWVudCwgc3R5bGVzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgIHRoaXMuX3N0YXJ0aW5nU3R5bGVzID0ge307CiAgICAgICAgdGhpcy5fX2luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fc3R5bGVzID0gaHlwZW5hdGVQcm9wc09iamVjdChzdHlsZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbml0KCkgewogICAgICAgIGlmICh0aGlzLl9faW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3N0YXJ0aW5nU3R5bGVzKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5fX2luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9zdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9zdGFydGluZ1N0eWxlcykpW3Byb3BdID0gdGhpcy5lbGVtZW50LnN0eWxlW3Byb3BdOwogICAgICAgIH0pKTsKICAgICAgICBzdXBlci5pbml0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBsYXkoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9zdGFydGluZ1N0eWxlcykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N0eWxlcykKICAgICAgICAgICAgLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdGhpcy5fc3R5bGVzW3Byb3BdKSkpOwogICAgICAgIHN1cGVyLnBsYXkoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3N0YXJ0aW5nU3R5bGVzKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fc3RhcnRpbmdTdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fc3RhcnRpbmdTdHlsZXMpKVtwcm9wXTsKICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX3N0YXJ0aW5nU3R5bGVzID0gbnVsbDsKICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL2Nzc19rZXlmcmFtZXMvY3NzX2tleWZyYW1lc19kcml2ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBLRVlGUkFNRVNfTkFNRV9QUkVGSVggPSAnZ2VuX2Nzc19rZl8nOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRBQl9TUEFDRSA9ICcgJzsKY2xhc3MgQ3NzS2V5ZnJhbWVzRHJpdmVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuX2NvdW50ID0gMDsKICAgICAgICB0aGlzLl9oZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpOwogICAgICAgIHRoaXMuX3dhcm5pbmdJc3N1ZWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2YWxpZGF0ZVN0eWxlUHJvcGVydHkocHJvcCkgewogICAgICAgIHJldHVybiB2YWxpZGF0ZVN0eWxlUHJvcGVydHkocHJvcCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWF0Y2hlc0VsZW1lbnQoZWxlbWVudCwgc2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gbWF0Y2hlc0VsZW1lbnQoZWxlbWVudCwgc2VsZWN0b3IpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsbTEKICAgICAqIEBwYXJhbSB7P30gZWxtMgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY29udGFpbnNFbGVtZW50KGVsbTEsIGVsbTIpIHsKICAgICAgICByZXR1cm4gY29udGFpbnNFbGVtZW50KGVsbTEsIGVsbTIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAqIEBwYXJhbSB7P30gbXVsdGkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHF1ZXJ5KGVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSkgewogICAgICAgIHJldHVybiBpbnZva2VRdWVyeShlbGVtZW50LCBzZWxlY3RvciwgbXVsdGkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb21wdXRlU3R5bGUoZWxlbWVudCwgcHJvcCwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpKSkpW3Byb3BdKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYnVpbGRLZXlmcmFtZUVsZW1lbnQoZWxlbWVudCwgbmFtZSwga2V5ZnJhbWVzKSB7CiAgICAgICAga2V5ZnJhbWVzID0ga2V5ZnJhbWVzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAga2YgPT4gaHlwZW5hdGVQcm9wc09iamVjdChrZikpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGtleWZyYW1lU3RyID0gYEBrZXlmcmFtZXMgJHtuYW1lfSB7XG5gOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdGFiID0gJyc7CiAgICAgICAga2V5ZnJhbWVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2YKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGtmID0+IHsKICAgICAgICAgICAgdGFiID0gVEFCX1NQQUNFOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHBhcnNlRmxvYXQoa2ZbJ29mZnNldCddKTsKICAgICAgICAgICAga2V5ZnJhbWVTdHIgKz0gYCR7dGFifSR7b2Zmc2V0ICogMTAwfSUge1xuYDsKICAgICAgICAgICAgdGFiICs9IFRBQl9TUEFDRTsKICAgICAgICAgICAgT2JqZWN0LmtleXMoa2YpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBrZltwcm9wXTsKICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ29mZnNldCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYXNlICdlYXNpbmcnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lU3RyICs9IGAke3RhYn1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiAke3ZhbHVlfTtcbmA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lU3RyICs9IGAke3RhYn0ke3Byb3B9OiAke3ZhbHVlfTtcbmA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBrZXlmcmFtZVN0ciArPSBgJHt0YWJ9fVxuYDsKICAgICAgICB9KSk7CiAgICAgICAga2V5ZnJhbWVTdHIgKz0gYH1cbmA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtmRWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICBrZkVsbS5pbm5lckhUTUwgPSBrZXlmcmFtZVN0cjsKICAgICAgICByZXR1cm4ga2ZFbG07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAqIEBwYXJhbSB7P30gZGVsYXkKICAgICAqIEBwYXJhbSB7P30gZWFzaW5nCiAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnMKICAgICAqIEBwYXJhbSB7Pz19IHNjcnViYmVyQWNjZXNzUmVxdWVzdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhbmltYXRlKGVsZW1lbnQsIGtleWZyYW1lcywgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIHByZXZpb3VzUGxheWVycyA9IFtdLCBzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZCkgewogICAgICAgIGlmIChzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZCkgewogICAgICAgICAgICB0aGlzLl9ub3RpZnlGYXVsdHlTY3J1YmJlcigpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNDc3NLZXlmcmFtZVBsYXllcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAocHJldmlvdXNQbGF5ZXJzLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXllciA9PiBwbGF5ZXIgaW5zdGFuY2VvZiBDc3NLZXlmcmFtZXNQbGF5ZXIpKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c1N0eWxlcyA9IHt9OwogICAgICAgIGlmIChhbGxvd1ByZXZpb3VzUGxheWVyU3R5bGVzTWVyZ2UoZHVyYXRpb24sIGRlbGF5KSkgewogICAgICAgICAgICBwcmV2aW91c0Nzc0tleWZyYW1lUGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgc3R5bGVzID0gcGxheWVyLmN1cnJlbnRTbmFwc2hvdDsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3AgPT4gcHJldmlvdXNTdHlsZXNbcHJvcF0gPSBzdHlsZXNbcHJvcF0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBrZXlmcmFtZXMgPSBiYWxhbmNlUHJldmlvdXNTdHlsZXNJbnRvS2V5ZnJhbWVzKGVsZW1lbnQsIGtleWZyYW1lcywgcHJldmlvdXNTdHlsZXMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaW5hbFN0eWxlcyA9IGZsYXR0ZW5LZXlmcmFtZXNJbnRvU3R5bGVzKGtleWZyYW1lcyk7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYW5pbWF0aW9uIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gYXBwbHlpbmcKICAgICAgICAvLyBzdHlsZXMgYW5kIHdhaXRpbmcgZm9yIGFuIGV2ZW50IHRvIGdldCBmaXJlZC4gVGhpcyBjYXVzZXMgbGFnLgogICAgICAgIC8vIEl0J3MgYmV0dGVyIHRvIGp1c3QgZGlyZWN0bHkgYXBwbHkgdGhlIHN0eWxlcyB0byB0aGUgZWxlbWVudAogICAgICAgIC8vIHZpYSB0aGUgZGlyZWN0IHN0eWxpbmcgYW5pbWF0aW9uIHBsYXllci4KICAgICAgICBpZiAoZHVyYXRpb24gPT0gMCkgewogICAgICAgICAgICByZXR1cm4gbmV3IERpcmVjdFN0eWxlUGxheWVyKGVsZW1lbnQsIGZpbmFsU3R5bGVzKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW1hdGlvbk5hbWUgPSBgJHtLRVlGUkFNRVNfTkFNRV9QUkVGSVh9JHt0aGlzLl9jb3VudCsrfWA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtmRWxtID0gdGhpcy5idWlsZEtleWZyYW1lRWxlbWVudChlbGVtZW50LCBhbmltYXRpb25OYW1lLCBrZXlmcmFtZXMpOwogICAgICAgICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJykpKS5hcHBlbmRDaGlsZChrZkVsbSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNwZWNpYWxTdHlsZXMgPSBwYWNrYWdlTm9uQW5pbWF0YWJsZVN0eWxlcyhlbGVtZW50LCBrZXlmcmFtZXMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbGF5ZXIgPSBuZXcgQ3NzS2V5ZnJhbWVzUGxheWVyKGVsZW1lbnQsIGtleWZyYW1lcywgYW5pbWF0aW9uTmFtZSwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGZpbmFsU3R5bGVzLCBzcGVjaWFsU3R5bGVzKTsKICAgICAgICBwbGF5ZXIub25EZXN0cm95KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHJlbW92ZUVsZW1lbnQoa2ZFbG0pKSk7CiAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9ub3RpZnlGYXVsdHlTY3J1YmJlcigpIHsKICAgICAgICBpZiAoIXRoaXMuX3dhcm5pbmdJc3N1ZWQpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdAYW5ndWxhci9hbmltYXRpb25zOiBwbGVhc2UgbG9hZCB0aGUgd2ViLWFuaW1hdGlvbnMuanMgcG9seWZpbGwgdG8gYWxsb3cgcHJvZ3JhbW1hdGljIGFjY2Vzcy4uLlxuJywgJyAgdmlzaXQgaHR0cDovL2JpdC5seS9JV3VrYW0gdG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyB0aGUgd2ViLWFuaW1hdGlvbi1qcyBwb2x5ZmlsbC4nKTsKICAgICAgICAgICAgdGhpcy5fd2FybmluZ0lzc3VlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGtleWZyYW1lcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmxhdHRlbktleWZyYW1lc0ludG9TdHlsZXMoa2V5ZnJhbWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZmxhdEtleWZyYW1lcyA9IHt9OwogICAgaWYgKGtleWZyYW1lcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBrZnMgPSBBcnJheS5pc0FycmF5KGtleWZyYW1lcykgPyBrZXlmcmFtZXMgOiBba2V5ZnJhbWVzXTsKICAgICAgICBrZnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAga2YgPT4gewogICAgICAgICAgICBPYmplY3Qua2V5cyhrZikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAnb2Zmc2V0JyB8fCBwcm9wID09ICdlYXNpbmcnKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGZsYXRLZXlmcmFtZXNbcHJvcF0gPSBrZltwcm9wXTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBmbGF0S2V5ZnJhbWVzOwp9Ci8qKgogKiBAcGFyYW0gez99IG5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQobm9kZSkgewogICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci93ZWJfYW5pbWF0aW9ucy93ZWJfYW5pbWF0aW9uc19wbGF5ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgV2ViQW5pbWF0aW9uc1BsYXllciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICogQHBhcmFtIHs/PX0gX3NwZWNpYWxTdHlsZXMKICAgICAqLwogICAgY29uc3RydWN0b3IoZWxlbWVudCwga2V5ZnJhbWVzLCBvcHRpb25zLCBfc3BlY2lhbFN0eWxlcykgewogICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgICAgdGhpcy5rZXlmcmFtZXMgPSBrZXlmcmFtZXM7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICB0aGlzLl9zcGVjaWFsU3R5bGVzID0gX3NwZWNpYWxTdHlsZXM7CiAgICAgICAgdGhpcy5fb25Eb25lRm5zID0gW107CiAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdOwogICAgICAgIHRoaXMuX29uRGVzdHJveUZucyA9IFtdOwogICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgdGhpcy50aW1lID0gMDsKICAgICAgICB0aGlzLnBhcmVudFBsYXllciA9IG51bGw7CiAgICAgICAgdGhpcy5jdXJyZW50U25hcHNob3QgPSB7fTsKICAgICAgICB0aGlzLl9kdXJhdGlvbiA9ICgvKiogQHR5cGUgez99ICovIChvcHRpb25zWydkdXJhdGlvbiddKSk7CiAgICAgICAgdGhpcy5fZGVsYXkgPSAoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9uc1snZGVsYXknXSkpIHx8IDA7CiAgICAgICAgdGhpcy50aW1lID0gdGhpcy5fZHVyYXRpb24gKyB0aGlzLl9kZWxheTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbkZpbmlzaCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5pdCgpIHsKICAgICAgICB0aGlzLl9idWlsZFBsYXllcigpOwogICAgICAgIHRoaXMuX3ByZXBhcmVQbGF5ZXJCZWZvcmVTdGFydCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2J1aWxkUGxheWVyKCkgewogICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ZnJhbWVzID0gdGhpcy5rZXlmcmFtZXM7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRvbVBsYXllciA9CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJXZWJBbmltYXRpb24odGhpcy5lbGVtZW50LCBrZXlmcmFtZXMsIHRoaXMub3B0aW9ucyk7CiAgICAgICAgdGhpcy5fZmluYWxLZXlmcmFtZSA9IGtleWZyYW1lcy5sZW5ndGggPyBrZXlmcmFtZXNba2V5ZnJhbWVzLmxlbmd0aCAtIDFdIDoge307CiAgICAgICAgdGhpcy5kb21QbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignZmluaXNoJywgKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5fb25GaW5pc2goKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3ByZXBhcmVQbGF5ZXJCZWZvcmVTdGFydCgpIHsKICAgICAgICAvLyB0aGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgdGhlIHBsYXllciBkb2Vzbid0IHN0YXJ0IHRvIGFuaW1hdGUgcmlnaHQgYXdheQogICAgICAgIGlmICh0aGlzLl9kZWxheSkgewogICAgICAgICAgICB0aGlzLl9yZXNldERvbVBsYXllclN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmRvbVBsYXllci5wYXVzZSgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdHJpZ2dlcldlYkFuaW1hdGlvbihlbGVtZW50LCBrZXlmcmFtZXMsIG9wdGlvbnMpIHsKICAgICAgICAvLyBqc2NvbXBpbGVyIGRvZXNuJ3Qgc2VlbSB0byBrbm93IGFuaW1hdGUgaXMgYSBuYXRpdmUgcHJvcGVydHkgYmVjYXVzZSBpdCdzIG5vdCBmdWxseQogICAgICAgIC8vIHN1cHBvcnRlZCB5ZXQgYWNyb3NzIGNvbW1vbiBicm93c2VycyAod2UgcG9seWZpbGwgaXQgZm9yIEVkZ2UvU2FmYXJpKSBbQ0wgIzE0MzYzMDkyOV0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnRbJ2FuaW1hdGUnXShrZXlmcmFtZXMsIG9wdGlvbnMpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU3RhcnQoZm4pIHsKICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zLnB1c2goZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRvbmUoZm4pIHsKICAgICAgICB0aGlzLl9vbkRvbmVGbnMucHVzaChmbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShmbikgewogICAgICAgIHRoaXMuX29uRGVzdHJveUZucy5wdXNoKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGxheSgpIHsKICAgICAgICB0aGlzLl9idWlsZFBsYXllcigpOwogICAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zID0gW107CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fc3BlY2lhbFN0eWxlcykgewogICAgICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcy5zdGFydCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZG9tUGxheWVyLnBsYXkoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGF1c2UoKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgdGhpcy5kb21QbGF5ZXIucGF1c2UoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmluaXNoKCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIGlmICh0aGlzLl9zcGVjaWFsU3R5bGVzKSB7CiAgICAgICAgICAgIHRoaXMuX3NwZWNpYWxTdHlsZXMuZmluaXNoKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX29uRmluaXNoKCk7CiAgICAgICAgdGhpcy5kb21QbGF5ZXIuZmluaXNoKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc2V0KCkgewogICAgICAgIHRoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKTsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZXNldERvbVBsYXllclN0YXRlKCkgewogICAgICAgIGlmICh0aGlzLmRvbVBsYXllcikgewogICAgICAgICAgICB0aGlzLmRvbVBsYXllci5jYW5jZWwoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc3RhcnQoKSB7CiAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgIHRoaXMucGxheSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBoYXNTdGFydGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKTsKICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3NwZWNpYWxTdHlsZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NwZWNpYWxTdHlsZXMuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveUZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMgPSBbXTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0UG9zaXRpb24ocCkgewogICAgICAgIHRoaXMuZG9tUGxheWVyLmN1cnJlbnRUaW1lID0gcCAqIHRoaXMudGltZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UG9zaXRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9tUGxheWVyLmN1cnJlbnRUaW1lIC8gdGhpcy50aW1lOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdG90YWxUaW1lKCkgewogICAgICAgIHJldHVybiB0aGlzLl9kZWxheSArIHRoaXMuX2R1cmF0aW9uOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiZWZvcmVEZXN0cm95KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTsKICAgICAgICBpZiAodGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fZmluYWxLZXlmcmFtZSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSAnb2Zmc2V0JykgewogICAgICAgICAgICAgICAgICAgIHN0eWxlc1twcm9wXSA9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID8gdGhpcy5fZmluYWxLZXlmcmFtZVtwcm9wXSA6IGNvbXB1dGVTdHlsZSh0aGlzLmVsZW1lbnQsIHByb3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VycmVudFNuYXBzaG90ID0gc3R5bGVzOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHBoYXNlTmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJpZ2dlckNhbGxiYWNrKHBoYXNlTmFtZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRob2RzID0gcGhhc2VOYW1lID09ICdzdGFydCcgPyB0aGlzLl9vblN0YXJ0Rm5zIDogdGhpcy5fb25Eb25lRm5zOwogICAgICAgIG1ldGhvZHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgIG1ldGhvZHMubGVuZ3RoID0gMDsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnNfZHJpdmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIFdlYkFuaW1hdGlvbnNEcml2ZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5faXNOYXRpdmVJbXBsID0gL1x7XHMqXFtuYXRpdmVccytjb2RlXF1ccypcfS8udGVzdChnZXRFbGVtZW50QW5pbWF0ZUZuKCkudG9TdHJpbmcoKSk7CiAgICAgICAgdGhpcy5fY3NzS2V5ZnJhbWVzRHJpdmVyID0gbmV3IENzc0tleWZyYW1lc0RyaXZlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKSB7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXRjaGVzRWxlbWVudChlbGVtZW50LCBzZWxlY3RvcikgewogICAgICAgIHJldHVybiBtYXRjaGVzRWxlbWVudChlbGVtZW50LCBzZWxlY3Rvcik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxtMQogICAgICogQHBhcmFtIHs/fSBlbG0yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb250YWluc0VsZW1lbnQoZWxtMSwgZWxtMikgewogICAgICAgIHJldHVybiBjb250YWluc0VsZW1lbnQoZWxtMSwgZWxtMik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHBhcmFtIHs/fSBtdWx0aQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcXVlcnkoZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKSB7CiAgICAgICAgcmV0dXJuIGludm9rZVF1ZXJ5KGVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0VmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNvbXB1dGVTdHlsZShlbGVtZW50LCBwcm9wLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkpKSlbcHJvcF0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdXBwb3J0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG92ZXJyaWRlV2ViQW5pbWF0aW9uc1N1cHBvcnQoc3VwcG9ydGVkKSB7CiAgICAgICAgdGhpcy5faXNOYXRpdmVJbXBsID0gc3VwcG9ydGVkOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzCiAgICAgKiBAcGFyYW0gez99IGR1cmF0aW9uCiAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgKiBAcGFyYW0gez99IGVhc2luZwogICAgICogQHBhcmFtIHs/PX0gcHJldmlvdXNQbGF5ZXJzCiAgICAgKiBAcGFyYW0gez89fSBzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYW5pbWF0ZShlbGVtZW50LCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMgPSBbXSwgc2NydWJiZXJBY2Nlc3NSZXF1ZXN0ZWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXNlS2V5ZnJhbWVzID0gIXNjcnViYmVyQWNjZXNzUmVxdWVzdGVkICYmICF0aGlzLl9pc05hdGl2ZUltcGw7CiAgICAgICAgaWYgKHVzZUtleWZyYW1lcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3NzS2V5ZnJhbWVzRHJpdmVyLmFuaW1hdGUoZWxlbWVudCwga2V5ZnJhbWVzLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgcHJldmlvdXNQbGF5ZXJzKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpbGwgPSBkZWxheSA9PSAwID8gJ2JvdGgnIDogJ2ZvcndhcmRzJzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGxheWVyT3B0aW9ucyA9IHsgZHVyYXRpb24sIGRlbGF5LCBmaWxsIH07CiAgICAgICAgLy8gd2UgY2hlY2sgZm9yIHRoaXMgdG8gYXZvaWQgaGF2aW5nIGEgbnVsbHx1bmRlZmluZWQgdmFsdWUgYmUgcHJlc2VudAogICAgICAgIC8vIGZvciB0aGUgZWFzaW5nICh3aGljaCByZXN1bHRzIGluIGFuIGVycm9yIGZvciBjZXJ0YWluIGJyb3dzZXJzICM5NzUyKQogICAgICAgIGlmIChlYXNpbmcpIHsKICAgICAgICAgICAgcGxheWVyT3B0aW9uc1snZWFzaW5nJ10gPSBlYXNpbmc7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c1N0eWxlcyA9IHt9OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c1dlYkFuaW1hdGlvblBsYXllcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAocHJldmlvdXNQbGF5ZXJzLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXllciA9PiBwbGF5ZXIgaW5zdGFuY2VvZiBXZWJBbmltYXRpb25zUGxheWVyKSkpKTsKICAgICAgICBpZiAoYWxsb3dQcmV2aW91c1BsYXllclN0eWxlc01lcmdlKGR1cmF0aW9uLCBkZWxheSkpIHsKICAgICAgICAgICAgcHJldmlvdXNXZWJBbmltYXRpb25QbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBzdHlsZXMgPSBwbGF5ZXIuY3VycmVudFNuYXBzaG90OwogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvcCA9PiBwcmV2aW91c1N0eWxlc1twcm9wXSA9IHN0eWxlc1twcm9wXSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGtleWZyYW1lcyA9IGtleWZyYW1lcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdHlsZXMgPT4gY29weVN0eWxlcyhzdHlsZXMsIGZhbHNlKSkpOwogICAgICAgIGtleWZyYW1lcyA9IGJhbGFuY2VQcmV2aW91c1N0eWxlc0ludG9LZXlmcmFtZXMoZWxlbWVudCwga2V5ZnJhbWVzLCBwcmV2aW91c1N0eWxlcyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNwZWNpYWxTdHlsZXMgPSBwYWNrYWdlTm9uQW5pbWF0YWJsZVN0eWxlcyhlbGVtZW50LCBrZXlmcmFtZXMpOwogICAgICAgIHJldHVybiBuZXcgV2ViQW5pbWF0aW9uc1BsYXllcihlbGVtZW50LCBrZXlmcmFtZXMsIHBsYXllck9wdGlvbnMsIHNwZWNpYWxTdHlsZXMpOwogICAgfQp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3VwcG9ydHNXZWJBbmltYXRpb25zKCkgewogICAgcmV0dXJuIHR5cGVvZiBnZXRFbGVtZW50QW5pbWF0ZUZuKCkgPT09ICdmdW5jdGlvbic7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRFbGVtZW50QW5pbWF0ZUZuKCkgewogICAgcmV0dXJuIChpc0Jyb3dzZXIoKSAmJiAoKC8qKiBAdHlwZSB7P30gKi8gKEVsZW1lbnQpKSkucHJvdG90eXBlWydhbmltYXRlJ10pIHx8IHt9Owp9CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KY2xhc3MgQnJvd3NlckFuaW1hdGlvbkJ1aWxkZXIgZXh0ZW5kcyBBbmltYXRpb25CdWlsZGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSByb290UmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHJvb3RSZW5kZXJlciwgZG9jKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9uZXh0QW5pbWF0aW9uSWQgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0eXBlRGF0YSA9ICgvKiogQHR5cGUgez99ICovICh7IGlkOiAnMCcsIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uJDEuTm9uZSwgc3R5bGVzOiBbXSwgZGF0YTogeyBhbmltYXRpb246IFtdIH0gfSkpOwogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RSZW5kZXJlci5jcmVhdGVSZW5kZXJlcihkb2MuYm9keSwgdHlwZURhdGEpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBidWlsZChhbmltYXRpb24pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9uZXh0QW5pbWF0aW9uSWQudG9TdHJpbmcoKTsKICAgICAgICB0aGlzLl9uZXh0QW5pbWF0aW9uSWQrKzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW50cnkgPSBBcnJheS5pc0FycmF5KGFuaW1hdGlvbikgPyBzZXF1ZW5jZShhbmltYXRpb24pIDogYW5pbWF0aW9uOwogICAgICAgIGlzc3VlQW5pbWF0aW9uQ29tbWFuZCh0aGlzLl9yZW5kZXJlciwgbnVsbCwgaWQsICdyZWdpc3RlcicsIFtlbnRyeV0pOwogICAgICAgIHJldHVybiBuZXcgQnJvd3NlckFuaW1hdGlvbkZhY3RvcnkoaWQsIHRoaXMuX3JlbmRlcmVyKTsKICAgIH0KfQpCcm93c2VyQW5pbWF0aW9uQnVpbGRlci7JtWZhYyA9IGZ1bmN0aW9uIEJyb3dzZXJBbmltYXRpb25CdWlsZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEJyb3dzZXJBbmltYXRpb25CdWlsZGVyKSjJtcm1aW5qZWN0KFJlbmRlcmVyRmFjdG9yeTIpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKQnJvd3NlckFuaW1hdGlvbkJ1aWxkZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQnJvd3NlckFuaW1hdGlvbkJ1aWxkZXIsIGZhY3Rvcnk6IEJyb3dzZXJBbmltYXRpb25CdWlsZGVyLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KQnJvd3NlckFuaW1hdGlvbkJ1aWxkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFJlbmRlcmVyRmFjdG9yeTIgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwpjbGFzcyBCcm93c2VyQW5pbWF0aW9uRmFjdG9yeSBleHRlbmRzIEFuaW1hdGlvbkZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9pZAogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoX2lkLCBfcmVuZGVyZXIpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2lkID0gX2lkOwogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZShlbGVtZW50LCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZW5kZXJlckFuaW1hdGlvblBsYXllcih0aGlzLl9pZCwgZWxlbWVudCwgb3B0aW9ucyB8fCB7fSwgdGhpcy5fcmVuZGVyZXIpOwogICAgfQp9CmNsYXNzIFJlbmRlcmVyQW5pbWF0aW9uUGxheWVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpZAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGlkLCBlbGVtZW50LCBvcHRpb25zLCBfcmVuZGVyZXIpIHsKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICB0aGlzLnBhcmVudFBsYXllciA9IG51bGw7CiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMudG90YWxUaW1lID0gMDsKICAgICAgICB0aGlzLl9jb21tYW5kKCdjcmVhdGUnLCBvcHRpb25zKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbGlzdGVuKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudCwgYEBAJHt0aGlzLmlkfToke2V2ZW50TmFtZX1gLCBjYWxsYmFjayk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNvbW1hbmQKICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NvbW1hbmQoY29tbWFuZCwgLi4uYXJncykgewogICAgICAgIHJldHVybiBpc3N1ZUFuaW1hdGlvbkNvbW1hbmQodGhpcy5fcmVuZGVyZXIsIHRoaXMuZWxlbWVudCwgdGhpcy5pZCwgY29tbWFuZCwgYXJncyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRG9uZShmbikgewogICAgICAgIHRoaXMuX2xpc3RlbignZG9uZScsIGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25TdGFydChmbikgewogICAgICAgIHRoaXMuX2xpc3Rlbignc3RhcnQnLCBmbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShmbikgewogICAgICAgIHRoaXMuX2xpc3RlbignZGVzdHJveScsIGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5pdCgpIHsKICAgICAgICB0aGlzLl9jb21tYW5kKCdpbml0Jyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBsYXkoKSB7CiAgICAgICAgdGhpcy5fY29tbWFuZCgncGxheScpOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwYXVzZSgpIHsKICAgICAgICB0aGlzLl9jb21tYW5kKCdwYXVzZScpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXN0YXJ0KCkgewogICAgICAgIHRoaXMuX2NvbW1hbmQoJ3Jlc3RhcnQnKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmluaXNoKCkgewogICAgICAgIHRoaXMuX2NvbW1hbmQoJ2ZpbmlzaCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuX2NvbW1hbmQoJ2Rlc3Ryb3knKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQoKSB7CiAgICAgICAgdGhpcy5fY29tbWFuZCgncmVzZXQnKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRQb3NpdGlvbihwKSB7CiAgICAgICAgdGhpcy5fY29tbWFuZCgnc2V0UG9zaXRpb24nLCBwKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UG9zaXRpb24oKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gaWQKICogQHBhcmFtIHs/fSBjb21tYW5kCiAqIEBwYXJhbSB7P30gYXJncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNzdWVBbmltYXRpb25Db21tYW5kKHJlbmRlcmVyLCBlbGVtZW50LCBpZCwgY29tbWFuZCwgYXJncykgewogICAgcmV0dXJuIHJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnQsIGBAQCR7aWR9OiR7Y29tbWFuZH1gLCBhcmdzKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zL3NyYy9hbmltYXRpb25fcmVuZGVyZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBBTklNQVRJT05fUFJFRklYID0gJ0AnOwovKiogQHR5cGUgez99ICovCmNvbnN0IERJU0FCTEVfQU5JTUFUSU9OU19GTEFHID0gJ0AuZGlzYWJsZWQnOwpjbGFzcyBBbmltYXRpb25SZW5kZXJlckZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlbGVnYXRlCiAgICAgKiBAcGFyYW0gez99IGVuZ2luZQogICAgICogQHBhcmFtIHs/fSBfem9uZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZW5naW5lLCBfem9uZSkgewogICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTsKICAgICAgICB0aGlzLl96b25lID0gX3pvbmU7CiAgICAgICAgdGhpcy5fY3VycmVudElkID0gMDsKICAgICAgICB0aGlzLl9taWNyb3Rhc2tJZCA9IDE7CiAgICAgICAgdGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyID0gW107CiAgICAgICAgdGhpcy5fcmVuZGVyZXJDYWNoZSA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLl9jZFJlY3VyRGVwdGggPSAwOwogICAgICAgIHRoaXMucHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgwKTsKICAgICAgICBlbmdpbmUub25SZW1vdmFsQ29tcGxldGUgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxlZ2F0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGVsZW1lbnQsIGRlbGVnYXRlKSA9PiB7CiAgICAgICAgICAgIC8vIE5vdGU6IGlmIGFuIGNvbXBvbmVudCBlbGVtZW50IGhhcyBhIGxlYXZlIGFuaW1hdGlvbiwgYW5kIHRoZSBjb21wb25lbnQKICAgICAgICAgICAgLy8gYSBob3N0IGxlYXZlIGFuaW1hdGlvbiwgdGhlIHZpZXcgZW5naW5lIHdpbGwgY2FsbCBgcmVtb3ZlQ2hpbGRgIGZvciB0aGUgcGFyZW50CiAgICAgICAgICAgIC8vIGNvbXBvbmVudCByZW5kZXJlciBhcyB3ZWxsIGFzIGZvciB0aGUgY2hpbGQgY29tcG9uZW50IHJlbmRlcmVyLgogICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgYWxyZWFkeSByZW1vdmVkIHRoZSBlbGVtZW50LgogICAgICAgICAgICBpZiAoZGVsZWdhdGUgJiYgZGVsZWdhdGUucGFyZW50Tm9kZShlbGVtZW50KSkgewogICAgICAgICAgICAgICAgZGVsZWdhdGUucmVtb3ZlQ2hpbGQoZWxlbWVudC5wYXJlbnROb2RlLCBlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGhvc3RFbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZVJlbmRlcmVyKGhvc3RFbGVtZW50LCB0eXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IEVNUFRZX05BTUVTUEFDRV9JRCA9ICcnOwogICAgICAgIC8vIGNhY2hlIHRoZSBkZWxlZ2F0ZXMgdG8gZmluZCBvdXQgd2hpY2ggY2FjaGVkIGRlbGVnYXRlIGNhbgogICAgICAgIC8vIGJlIHVzZWQgYnkgd2hpY2ggY2FjaGVkIHJlbmRlcmVyCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVSZW5kZXJlcihob3N0RWxlbWVudCwgdHlwZSk7CiAgICAgICAgaWYgKCFob3N0RWxlbWVudCB8fCAhdHlwZSB8fCAhdHlwZS5kYXRhIHx8ICF0eXBlLmRhdGFbJ2FuaW1hdGlvbiddKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXJDYWNoZS5nZXQoZGVsZWdhdGUpOwogICAgICAgICAgICBpZiAoIXJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICByZW5kZXJlciA9IG5ldyBCYXNlQW5pbWF0aW9uUmVuZGVyZXIoRU1QVFlfTkFNRVNQQUNFX0lELCBkZWxlZ2F0ZSwgdGhpcy5lbmdpbmUpOwogICAgICAgICAgICAgICAgLy8gb25seSBjYWNoZSB0aGlzIHJlc3VsdCB3aGVuIHRoZSBiYXNlIHJlbmRlcmVyIGlzIHVzZWQKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyQ2FjaGUuc2V0KGRlbGVnYXRlLCByZW5kZXJlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSB0eXBlLmlkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYW1lc3BhY2VJZCA9IHR5cGUuaWQgKyAnLScgKyB0aGlzLl9jdXJyZW50SWQ7CiAgICAgICAgdGhpcy5fY3VycmVudElkKys7CiAgICAgICAgdGhpcy5lbmdpbmUucmVnaXN0ZXIobmFtZXNwYWNlSWQsIGhvc3RFbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVnaXN0ZXJUcmlnZ2VyID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHRyaWdnZXIpID0+IHsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJpZ2dlcikpIHsKICAgICAgICAgICAgICAgIHRyaWdnZXIuZm9yRWFjaChyZWdpc3RlclRyaWdnZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUucmVnaXN0ZXJUcmlnZ2VyKGNvbXBvbmVudElkLCBuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQsIHRyaWdnZXIubmFtZSwgdHJpZ2dlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW5pbWF0aW9uVHJpZ2dlcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodHlwZS5kYXRhWydhbmltYXRpb24nXSkpOwogICAgICAgIGFuaW1hdGlvblRyaWdnZXJzLmZvckVhY2gocmVnaXN0ZXJUcmlnZ2VyKTsKICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvblJlbmRlcmVyKHRoaXMsIG5hbWVzcGFjZUlkLCBkZWxlZ2F0ZSwgdGhpcy5lbmdpbmUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiZWdpbigpIHsKICAgICAgICB0aGlzLl9jZFJlY3VyRGVwdGgrKzsKICAgICAgICBpZiAodGhpcy5kZWxlZ2F0ZS5iZWdpbikgewogICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmJlZ2luKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NjaGVkdWxlQ291bnRUYXNrKCkgewogICAgICAgIC8vIGFsd2F5cyB1c2UgcHJvbWlzZSB0byBzY2hlZHVsZSBtaWNyb3Rhc2sgaW5zdGVhZCBvZiB1c2UgWm9uZQogICAgICAgIHRoaXMucHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fbWljcm90YXNrSWQrKzsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gY291bnQKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2NoZWR1bGVMaXN0ZW5lckNhbGxiYWNrKGNvdW50LCBmbiwgZGF0YSkgewogICAgICAgIGlmIChjb3VudCA+PSAwICYmIGNvdW50IDwgdGhpcy5fbWljcm90YXNrSWQpIHsKICAgICAgICAgICAgdGhpcy5fem9uZS5ydW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gZm4oZGF0YSkpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXIuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0dXBsZQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdHVwbGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZm4sIGRhdGFdID0gdHVwbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXIgPSBbXTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXIucHVzaChbZm4sIGRhdGFdKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZW5kKCkgewogICAgICAgIHRoaXMuX2NkUmVjdXJEZXB0aC0tOwogICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBhbmltYXRpb25zIGZyb20gcnVubmluZyB0d2ljZSB3aGVuIGFuIGlubmVyCiAgICAgICAgLy8gY29tcG9uZW50IGRvZXMgQ0Qgd2hlbiBhIHBhcmVudCBjb21wb25lbnQgaW5zdGVhZCBoYXMgaW5zZXJ0ZWQgaXQKICAgICAgICBpZiAodGhpcy5fY2RSZWN1ckRlcHRoID09IDApIHsKICAgICAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZUNvdW50VGFzaygpOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZmx1c2godGhpcy5fbWljcm90YXNrSWQpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmRlbGVnYXRlLmVuZCkgewogICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmVuZCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgd2hlblJlbmRlcmluZ0RvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLndoZW5SZW5kZXJpbmdEb25lKCk7CiAgICB9Cn0KQW5pbWF0aW9uUmVuZGVyZXJGYWN0b3J5Lsm1ZmFjID0gZnVuY3Rpb24gQW5pbWF0aW9uUmVuZGVyZXJGYWN0b3J5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeSkoybXJtWluamVjdChSZW5kZXJlckZhY3RvcnkyKSwgybXJtWluamVjdChBbmltYXRpb25FbmdpbmUpLCDJtcm1aW5qZWN0KE5nWm9uZSkpOyB9OwpBbmltYXRpb25SZW5kZXJlckZhY3RvcnkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQW5pbWF0aW9uUmVuZGVyZXJGYWN0b3J5LCBmYWN0b3J5OiBBbmltYXRpb25SZW5kZXJlckZhY3RvcnkuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpBbmltYXRpb25SZW5kZXJlckZhY3RvcnkuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFJlbmRlcmVyRmFjdG9yeTIgfSwKICAgIHsgdHlwZTogQW5pbWF0aW9uRW5naW5lIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9Cl07CmNsYXNzIEJhc2VBbmltYXRpb25SZW5kZXJlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAqIEBwYXJhbSB7P30gZW5naW5lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5hbWVzcGFjZUlkLCBkZWxlZ2F0ZSwgZW5naW5lKSB7CiAgICAgICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5hbWVzcGFjZUlkOwogICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTsKICAgICAgICB0aGlzLmRlc3Ryb3lOb2RlID0gdGhpcy5kZWxlZ2F0ZS5kZXN0cm95Tm9kZSA/ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChuKSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoZGVsZWdhdGUuZGVzdHJveU5vZGUpKShuKSkgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGF0YSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5kYXRhOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuZW5naW5lLmRlc3Ryb3kodGhpcy5uYW1lc3BhY2VJZCwgdGhpcy5kZWxlZ2F0ZSk7CiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5kZXN0cm95KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSkgewogICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlQ29tbWVudCh2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVUZXh0KHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlVGV4dCh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKSB7CiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTsKICAgICAgICB0aGlzLmVuZ2luZS5vbkluc2VydCh0aGlzLm5hbWVzcGFjZUlkLCBuZXdDaGlsZCwgcGFyZW50LCBmYWxzZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICB0aGlzLmRlbGVnYXRlLmluc2VydEJlZm9yZShwYXJlbnQsIG5ld0NoaWxkLCByZWZDaGlsZCk7CiAgICAgICAgdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCwgbmV3Q2hpbGQsIHBhcmVudCwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkCiAgICAgKiBAcGFyYW0gez99IGlzSG9zdEVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpIHsKICAgICAgICB0aGlzLmVuZ2luZS5vblJlbW92ZSh0aGlzLm5hbWVzcGFjZUlkLCBvbGRDaGlsZCwgdGhpcy5kZWxlZ2F0ZSwgaXNIb3N0RWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JPck5vZGUKICAgICAqIEBwYXJhbSB7Pz19IHByZXNlcnZlQ29udGVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2VsZWN0Um9vdEVsZW1lbnQoc2VsZWN0b3JPck5vZGUsIHByZXNlcnZlQ29udGVudCkgewogICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLnNlbGVjdFJvb3RFbGVtZW50KHNlbGVjdG9yT3JOb2RlLCBwcmVzZXJ2ZUNvbnRlbnQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhcmVudE5vZGUobm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUobm9kZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmV4dFNpYmxpbmcobm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nKG5vZGUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0QXR0cmlidXRlKGVsLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICB0aGlzLmRlbGVnYXRlLnJlbW92ZUF0dHJpYnV0ZShlbCwgbmFtZSwgbmFtZXNwYWNlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRDbGFzcyhlbCwgbmFtZSkgewogICAgICAgIHRoaXMuZGVsZWdhdGUuYWRkQ2xhc3MoZWwsIG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUNsYXNzKGVsLCBuYW1lKSB7CiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDbGFzcyhlbCwgbmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRTdHlsZShlbCwgc3R5bGUsIHZhbHVlLCBmbGFncykgewogICAgICAgIHRoaXMuZGVsZWdhdGUuc2V0U3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSwgZmxhZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IHN0eWxlCiAgICAgKiBAcGFyYW0gez89fSBmbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlU3R5bGUoZWwsIHN0eWxlLCBmbGFncykgewogICAgICAgIHRoaXMuZGVsZWdhdGUucmVtb3ZlU3R5bGUoZWwsIHN0eWxlLCBmbGFncyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09IEFOSU1BVElPTl9QUkVGSVggJiYgbmFtZSA9PSBESVNBQkxFX0FOSU1BVElPTlNfRkxBRykgewogICAgICAgICAgICB0aGlzLmRpc2FibGVBbmltYXRpb25zKGVsLCAhIXZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0VmFsdWUobm9kZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFZhbHVlKG5vZGUsIHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsaXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjayk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzYWJsZUFuaW1hdGlvbnMoZWxlbWVudCwgdmFsdWUpIHsKICAgICAgICB0aGlzLmVuZ2luZS5kaXNhYmxlQW5pbWF0aW9ucyhlbGVtZW50LCB2YWx1ZSk7CiAgICB9Cn0KY2xhc3MgQW5pbWF0aW9uUmVuZGVyZXIgZXh0ZW5kcyBCYXNlQW5pbWF0aW9uUmVuZGVyZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAqIEBwYXJhbSB7P30gZW5naW5lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGZhY3RvcnksIG5hbWVzcGFjZUlkLCBkZWxlZ2F0ZSwgZW5naW5lKSB7CiAgICAgICAgc3VwZXIobmFtZXNwYWNlSWQsIGRlbGVnYXRlLCBlbmdpbmUpOwogICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CiAgICAgICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5hbWVzcGFjZUlkOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSBBTklNQVRJT05fUFJFRklYKSB7CiAgICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgxKSA9PSAnLicgJiYgbmFtZSA9PSBESVNBQkxFX0FOSU1BVElPTlNfRkxBRykgewogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhdmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVBbmltYXRpb25zKGVsLCAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5wcm9jZXNzKHRoaXMubmFtZXNwYWNlSWQsIGVsLCBuYW1lLnN1YnN0cigxKSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICBpZiAoZXZlbnROYW1lLmNoYXJBdCgwKSA9PSBBTklNQVRJT05fUFJFRklYKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlc29sdmVFbGVtZW50RnJvbVRhcmdldCh0YXJnZXQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBuYW1lID0gZXZlbnROYW1lLnN1YnN0cigxKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGhhc2UgPSAnJzsKICAgICAgICAgICAgLy8gQGxpc3RlbmVyLnBoYXNlIGlzIGZvciB0cmlnZ2VyIGFuaW1hdGlvbiBjYWxsYmFja3MKICAgICAgICAgICAgLy8gQEBsaXN0ZW5lciBpcyBmb3IgYW5pbWF0aW9uIGJ1aWxkZXIgY2FsbGJhY2tzCiAgICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSAhPSBBTklNQVRJT05fUFJFRklYKSB7CiAgICAgICAgICAgICAgICBbbmFtZSwgcGhhc2VdID0gcGFyc2VUcmlnZ2VyQ2FsbGJhY2tOYW1lKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5saXN0ZW4odGhpcy5uYW1lc3BhY2VJZCwgZWxlbWVudCwgbmFtZSwgcGhhc2UsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY291bnRJZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQpKSlbJ19kYXRhJ10gfHwgLTE7CiAgICAgICAgICAgICAgICB0aGlzLmZhY3Rvcnkuc2NoZWR1bGVMaXN0ZW5lckNhbGxiYWNrKGNvdW50SWQsIGNhbGxiYWNrLCBldmVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjayk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlRWxlbWVudEZyb21UYXJnZXQodGFyZ2V0KSB7CiAgICBzd2l0Y2ggKHRhcmdldCkgewogICAgICAgIGNhc2UgJ2JvZHknOgogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTsKICAgICAgICBjYXNlICdkb2N1bWVudCc6CiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgICAgICBjYXNlICd3aW5kb3cnOgogICAgICAgICAgICByZXR1cm4gd2luZG93OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlVHJpZ2dlckNhbGxiYWNrTmFtZSh0cmlnZ2VyTmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZG90SW5kZXggPSB0cmlnZ2VyTmFtZS5pbmRleE9mKCcuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0cmlnZ2VyID0gdHJpZ2dlck5hbWUuc3Vic3RyaW5nKDAsIGRvdEluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBoYXNlID0gdHJpZ2dlck5hbWUuc3Vic3RyKGRvdEluZGV4ICsgMSk7CiAgICByZXR1cm4gW3RyaWdnZXIsIHBoYXNlXTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zL3NyYy9wcm92aWRlcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZSBleHRlbmRzIEFuaW1hdGlvbkVuZ2luZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKiBAcGFyYW0gez99IGRyaXZlcgogICAgICogQHBhcmFtIHs/fSBub3JtYWxpemVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRvYywgZHJpdmVyLCBub3JtYWxpemVyKSB7CiAgICAgICAgc3VwZXIoZG9jLmJvZHksIGRyaXZlciwgbm9ybWFsaXplcik7CiAgICB9Cn0KSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZS7JtWZhYyA9IGZ1bmN0aW9uIEluamVjdGFibGVBbmltYXRpb25FbmdpbmVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZSkoybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChBbmltYXRpb25Ecml2ZXIpLCDJtcm1aW5qZWN0KEFuaW1hdGlvblN0eWxlTm9ybWFsaXplcikpOyB9OwpJbmplY3RhYmxlQW5pbWF0aW9uRW5naW5lLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEluamVjdGFibGVBbmltYXRpb25FbmdpbmUsIGZhY3Rvcnk6IEluamVjdGFibGVBbmltYXRpb25FbmdpbmUuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpJbmplY3RhYmxlQW5pbWF0aW9uRW5naW5lLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgeyB0eXBlOiBBbmltYXRpb25Ecml2ZXIgfSwKICAgIHsgdHlwZTogQW5pbWF0aW9uU3R5bGVOb3JtYWxpemVyIH0KXTsKLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnN0YW50aWF0ZVN1cHBvcnRlZEFuaW1hdGlvbkRyaXZlcigpIHsKICAgIHJldHVybiBzdXBwb3J0c1dlYkFuaW1hdGlvbnMoKSA/IG5ldyBXZWJBbmltYXRpb25zRHJpdmVyKCkgOiBuZXcgQ3NzS2V5ZnJhbWVzRHJpdmVyKCk7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnN0YW50aWF0ZURlZmF1bHRTdHlsZU5vcm1hbGl6ZXIoKSB7CiAgICByZXR1cm4gbmV3IFdlYkFuaW1hdGlvbnNTdHlsZU5vcm1hbGl6ZXIoKTsKfQovKioKICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IGVuZ2luZQogKiBAcGFyYW0gez99IHpvbmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluc3RhbnRpYXRlUmVuZGVyZXJGYWN0b3J5KHJlbmRlcmVyLCBlbmdpbmUsIHpvbmUpIHsKICAgIHJldHVybiBuZXcgQW5pbWF0aW9uUmVuZGVyZXJGYWN0b3J5KHJlbmRlcmVyLCBlbmdpbmUsIHpvbmUpOwp9Ci8qKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEFOSU1BVElPTl9NT0RVTEVfVFlQRSA9IG5ldyBJbmplY3Rpb25Ub2tlbignQW5pbWF0aW9uTW9kdWxlVHlwZScpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNIQVJFRF9BTklNQVRJT05fUFJPVklERVJTID0gWwogICAgeyBwcm92aWRlOiBBbmltYXRpb25CdWlsZGVyLCB1c2VDbGFzczogQnJvd3NlckFuaW1hdGlvbkJ1aWxkZXIgfSwKICAgIHsgcHJvdmlkZTogQW5pbWF0aW9uU3R5bGVOb3JtYWxpemVyLCB1c2VGYWN0b3J5OiBpbnN0YW50aWF0ZURlZmF1bHRTdHlsZU5vcm1hbGl6ZXIgfSwKICAgIHsgcHJvdmlkZTogQW5pbWF0aW9uRW5naW5lLCB1c2VDbGFzczogSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZSB9LCB7CiAgICAgICAgcHJvdmlkZTogUmVuZGVyZXJGYWN0b3J5MiwKICAgICAgICB1c2VGYWN0b3J5OiBpbnN0YW50aWF0ZVJlbmRlcmVyRmFjdG9yeSwKICAgICAgICBkZXBzOiBbRG9tUmVuZGVyZXJGYWN0b3J5MiwgQW5pbWF0aW9uRW5naW5lLCBOZ1pvbmVdCiAgICB9Cl07Ci8qKgogKiBTZXBhcmF0ZSBwcm92aWRlcnMgZnJvbSB0aGUgYWN0dWFsIG1vZHVsZSBzbyB0aGF0IHdlIGNhbiBkbyBhIGxvY2FsIG1vZGlmaWNhdGlvbiBpbiBHb29nbGUzIHRvCiAqIGluY2x1ZGUgdGhlbSBpbiB0aGUgQnJvd3Nlck1vZHVsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBCUk9XU0VSX0FOSU1BVElPTlNfUFJPVklERVJTID0gWwogICAgeyBwcm92aWRlOiBBbmltYXRpb25Ecml2ZXIsIHVzZUZhY3Rvcnk6IGluc3RhbnRpYXRlU3VwcG9ydGVkQW5pbWF0aW9uRHJpdmVyIH0sCiAgICB7IHByb3ZpZGU6IEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgdXNlVmFsdWU6ICdCcm93c2VyQW5pbWF0aW9ucycgfSwgLi4uU0hBUkVEX0FOSU1BVElPTl9QUk9WSURFUlMKXTsKLyoqCiAqIFNlcGFyYXRlIHByb3ZpZGVycyBmcm9tIHRoZSBhY3R1YWwgbW9kdWxlIHNvIHRoYXQgd2UgY2FuIGRvIGEgbG9jYWwgbW9kaWZpY2F0aW9uIGluIEdvb2dsZTMgdG8KICogaW5jbHVkZSB0aGVtIGluIHRoZSBCcm93c2VyVGVzdGluZ01vZHVsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBCUk9XU0VSX05PT1BfQU5JTUFUSU9OU19QUk9WSURFUlMgPSBbCiAgICB7IHByb3ZpZGU6IEFuaW1hdGlvbkRyaXZlciwgdXNlQ2xhc3M6IE5vb3BBbmltYXRpb25Ecml2ZXIgfSwKICAgIHsgcHJvdmlkZTogQU5JTUFUSU9OX01PRFVMRV9UWVBFLCB1c2VWYWx1ZTogJ05vb3BBbmltYXRpb25zJyB9LCAuLi5TSEFSRURfQU5JTUFUSU9OX1BST1ZJREVSUwpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zL3NyYy9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEV4cG9ydHMgYEJyb3dzZXJNb2R1bGVgIHdpdGggYWRkaXRpb25hbCBbZGVwZW5kZW5jeS1pbmplY3Rpb24gcHJvdmlkZXJzXShndWlkZS9nbG9zc2FyeSNwcm92aWRlcikKICogZm9yIHVzZSB3aXRoIGFuaW1hdGlvbnMuIFNlZSBbQW5pbWF0aW9uc10oZ3VpZGUvYW5pbWF0aW9ucykuCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB7Cn0KQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9KTsKQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBCcm93c2VyQW5pbWF0aW9uc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBCUk9XU0VSX0FOSU1BVElPTlNfUFJPVklERVJTLCBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLCB7IGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtCcm93c2VyTW9kdWxlXTsgfSB9KTsgfSkoKTsKLyoqCiAqIEEgbnVsbCBwbGF5ZXIgdGhhdCBtdXN0IGJlIGltcG9ydGVkIHRvIGFsbG93IGRpc2FibGluZyBvZiBhbmltYXRpb25zLgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTm9vcEFuaW1hdGlvbnNNb2R1bGUgewp9Ck5vb3BBbmltYXRpb25zTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTm9vcEFuaW1hdGlvbnNNb2R1bGUgfSk7Ck5vb3BBbmltYXRpb25zTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTm9vcEFuaW1hdGlvbnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTm9vcEFuaW1hdGlvbnNNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogQlJPV1NFUl9OT09QX0FOSU1BVElPTlNfUFJPVklERVJTLCBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE5vb3BBbmltYXRpb25zTW9kdWxlLCB7IGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtCcm93c2VyTW9kdWxlXTsgfSB9KTsgfSkoKTsKCi8qKgogKiBAbGljZW5zZSBOZ1J4IDkuMS4wCiAqIChjKSAyMDE1LTIwMTggQnJhbmRvbiBSb2JlcnRzLCBNaWtlIFJ5YW4sIFJvYiBXb3JtYWxkLCBWaWN0b3IgU2F2a2luCiAqIExpY2Vuc2U6IE1JVAogKi8KZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIGNvbmZpZykgewogICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXR1cm4gZGVmaW5lVHlwZSh0eXBlLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHsuLi4/fSBhcmdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoLi4uYXJncykgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKC4uLmFyZ3MpKSwgeyB0eXBlIH0pKSkpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYXMgPSBjb25maWcgPyBjb25maWcuX2FzIDogJ2VtcHR5JzsKICAgIHN3aXRjaCAoYXMpIHsKICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlKHR5cGUsICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+ICh7IHR5cGUgfSkpKTsKICAgICAgICBjYXNlICdwcm9wcyc6CiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlKHR5cGUsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHByb3BzKSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdHlwZSB9KSkpKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29uZmlnLicpOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgUAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcHJvcHMoKSB7CiAgICByZXR1cm4geyBfYXM6ICdwcm9wcycsIF9wOiAoLyoqIEB0eXBlIHs/fSAqLyAodW5kZWZpbmVkKSkgfTsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gY3JlYXRvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGVmaW5lVHlwZSh0eXBlLCBjcmVhdG9yKSB7CiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0b3IsICd0eXBlJywgewogICAgICAgIHZhbHVlOiB0eXBlLAogICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKICAgIH0pOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9hY3Rpb25zX3N1YmplY3QudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJTklUID0gKC8qKiBAdHlwZSB7P30gKi8gKCdAbmdyeC9zdG9yZS9pbml0JykpOwpjbGFzcyBBY3Rpb25zU3ViamVjdCBleHRlbmRzIEJlaGF2aW9yU3ViamVjdCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcih7IHR5cGU6IElOSVQgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZXh0KGFjdGlvbikgewogICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYAogICAgICAgIERpc3BhdGNoIGV4cGVjdGVkIGFuIG9iamVjdCwgaW5zdGVhZCBpdCByZWNlaXZlZCBhIGZ1bmN0aW9uLgogICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgY3JlYXRlQWN0aW9uIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbgogICAgICAgIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYWN0aW9uLiBGb3IgZXhhbXBsZSwgc29tZUFjdGlvbiBzaG91bGQgYmUgc29tZUFjdGlvbigpLmApOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgYWN0aW9uID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBY3Rpb25zIG11c3QgYmUgb2JqZWN0c2ApOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEFjdGlvbnMgbXVzdCBoYXZlIGEgdHlwZSBwcm9wZXJ0eWApOwogICAgICAgIH0KICAgICAgICBzdXBlci5uZXh0KGFjdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNvbXBsZXRlKCkgewogICAgICAgIC8qIG5vb3AgKi8KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgc3VwZXIuY29tcGxldGUoKTsKICAgIH0KfQpBY3Rpb25zU3ViamVjdC7JtWZhYyA9IGZ1bmN0aW9uIEFjdGlvbnNTdWJqZWN0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFjdGlvbnNTdWJqZWN0KSgpOyB9OwpBY3Rpb25zU3ViamVjdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBY3Rpb25zU3ViamVjdCwgZmFjdG9yeTogQWN0aW9uc1N1YmplY3QuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpBY3Rpb25zU3ViamVjdC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtdOwovKiogQHR5cGUgez99ICovCmNvbnN0IEFDVElPTlNfU1VCSkVDVF9QUk9WSURFUlMgPSBbQWN0aW9uc1N1YmplY3RdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgX1JPT1RfU1RPUkVfR1VBUkQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEludGVybmFsIFJvb3QgR3VhcmQnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfSU5JVElBTF9TVEFURSA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgSW5pdGlhbCBTdGF0ZScpOwovKiogQHR5cGUgez99ICovCmNvbnN0IElOSVRJQUxfU1RBVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEluaXRpYWwgU3RhdGUnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBSRURVQ0VSX0ZBQ1RPUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIFJlZHVjZXIgRmFjdG9yeScpOwovKiogQHR5cGUgez99ICovCmNvbnN0IF9SRURVQ0VSX0ZBQ1RPUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEludGVybmFsIFJlZHVjZXIgRmFjdG9yeSBQcm92aWRlcicpOwovKiogQHR5cGUgez99ICovCmNvbnN0IElOSVRJQUxfUkVEVUNFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEluaXRpYWwgUmVkdWNlcnMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfSU5JVElBTF9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgSW5pdGlhbCBSZWR1Y2VycycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNUT1JFX0ZFQVRVUkVTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBTdG9yZSBGZWF0dXJlcycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IF9TVE9SRV9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgU3RvcmUgUmVkdWNlcnMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfRkVBVFVSRV9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgRmVhdHVyZSBSZWR1Y2VycycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IF9GRUFUVVJFX0NPTkZJR1MgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEludGVybmFsIEZlYXR1cmUgQ29uZmlncycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IF9TVE9SRV9GRUFUVVJFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgU3RvcmUgRmVhdHVyZXMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfRkVBVFVSRV9SRURVQ0VSU19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgRmVhdHVyZSBSZWR1Y2VycyBUb2tlbicpOwovKiogQHR5cGUgez99ICovCmNvbnN0IEZFQVRVUkVfUkVEVUNFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEZlYXR1cmUgUmVkdWNlcnMnKTsKLyoqCiAqIFVzZXItZGVmaW5lZCBtZXRhIHJlZHVjZXJzIGZyb20gU3RvcmVNb2R1bGUuZm9yUm9vdCgpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVVNFUl9QUk9WSURFRF9NRVRBX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBVc2VyIFByb3ZpZGVkIE1ldGEgUmVkdWNlcnMnKTsKLyoqCiAqIE1ldGEgcmVkdWNlcnMgZGVmaW5lZCBlaXRoZXIgaW50ZXJuYWxseSBieSBcQG5ncngvc3RvcmUgb3IgYnkgbGlicmFyeSBhdXRob3JzCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUVUQV9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgTWV0YSBSZWR1Y2VycycpOwovKioKICogQ29uY2F0cyB0aGUgdXNlciBwcm92aWRlZCBtZXRhIHJlZHVjZXJzIGFuZCB0aGUgbWV0YSByZWR1Y2VycyBwcm92aWRlZCBvbiB0aGUgbXVsdGkKICogaW5qZWN0aW9uIHRva2VuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgX1JFU09MVkVEX01FVEFfUkVEVUNFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEludGVybmFsIFJlc29sdmVkIE1ldGEgUmVkdWNlcnMnKTsKLyoqCiAqIFJ1bnRpbWUgY2hlY2tzIGRlZmluZWQgYnkgdGhlIHVzZXIgdmlhIGFuIEluamVjdGlvblRva2VuCiAqIERlZmF1bHRzIHRvIGBfVVNFUl9SVU5USU1FX0NIRUNLU2AKICogQHR5cGUgez99CiAqLwpjb25zdCBVU0VSX1JVTlRJTUVfQ0hFQ0tTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBVc2VyIFJ1bnRpbWUgQ2hlY2tzIENvbmZpZycpOwovKioKICogUnVudGltZSBjaGVja3MgZGVmaW5lZCBieSB0aGUgdXNlciB2aWEgZm9yUm9vdCgpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgX1VTRVJfUlVOVElNRV9DSEVDS1MgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEludGVybmFsIFVzZXIgUnVudGltZSBDaGVja3MgQ29uZmlnJyk7Ci8qKgogKiBSdW50aW1lIGNoZWNrcyBjdXJyZW50bHkgaW4gdXNlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgX0FDVElWRV9SVU5USU1FX0NIRUNLUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgUnVudGltZSBDaGVja3MnKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IHJlZHVjZXJzCiAqIEBwYXJhbSB7Pz19IGluaXRpYWxTdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzLCBpbml0aWFsU3RhdGUgPSB7fSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmaW5hbFJlZHVjZXJzID0ge307CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHJlZHVjZXJLZXlzW2ldOwogICAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBmaW5hbFJlZHVjZXJzW2tleV0gPSByZWR1Y2Vyc1trZXldOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29tYmluYXRpb24oc3RhdGUsIGFjdGlvbikgewogICAgICAgIHN0YXRlID0gc3RhdGUgPT09IHVuZGVmaW5lZCA/IGluaXRpYWxTdGF0ZSA6IHN0YXRlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSB7fTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXkgPSBmaW5hbFJlZHVjZXJLZXlzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW2tleV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pOwogICAgICAgICAgICBuZXh0U3RhdGVba2V5XSA9IG5leHRTdGF0ZUZvcktleTsKICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlOwogICAgfSk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gb2JqZWN0CiAqIEBwYXJhbSB7P30ga2V5VG9SZW1vdmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG9taXQob2JqZWN0LCBrZXlUb1JlbW92ZSkgewogICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkKICAgICAgICAuZmlsdGVyKCgvKioKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBrZXkgPT4ga2V5ICE9PSBrZXlUb1JlbW92ZSkpCiAgICAgICAgLnJlZHVjZSgoLyoqCiAgICAgKiBAcGFyYW0gez99IHJlc3VsdAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChyZXN1bHQsIGtleSkgPT4gT2JqZWN0LmFzc2lnbihyZXN1bHQsIHsgW2tleV06IG9iamVjdFtrZXldIH0pKSwge30pOwp9Ci8qKgogKiBAcGFyYW0gey4uLj99IGZ1bmN0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcG9zZSguLi5mdW5jdGlvbnMpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGFyZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKGFyZykgewogICAgICAgIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBhcmc7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsYXN0ID0gZnVuY3Rpb25zW2Z1bmN0aW9ucy5sZW5ndGggLSAxXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzdCA9IGZ1bmN0aW9ucy5zbGljZSgwLCAtMSk7CiAgICAgICAgcmV0dXJuIHJlc3QucmVkdWNlUmlnaHQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9zZWQKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29tcG9zZWQsIGZuKSA9PiBmbihjb21wb3NlZCkpLCBsYXN0KGFyZykpOwogICAgfSk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBULCBWCiAqIEBwYXJhbSB7P30gcmVkdWNlckZhY3RvcnkKICogQHBhcmFtIHs/PX0gbWV0YVJlZHVjZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSZWR1Y2VyRmFjdG9yeShyZWR1Y2VyRmFjdG9yeSwgbWV0YVJlZHVjZXJzKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhUmVkdWNlcnMpICYmIG1ldGFSZWR1Y2Vycy5sZW5ndGggPiAwKSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZWR1Y2VyRmFjdG9yeSkpKSA9IGNvbXBvc2UuYXBwbHkobnVsbCwgWwogICAgICAgICAgICAuLi5tZXRhUmVkdWNlcnMsCiAgICAgICAgICAgIHJlZHVjZXJGYWN0b3J5LAogICAgICAgIF0pOwogICAgfQogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcnMKICAgICAqIEBwYXJhbSB7Pz19IGluaXRpYWxTdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJlZHVjZXJzLCBpbml0aWFsU3RhdGUpID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJGYWN0b3J5KHJlZHVjZXJzKTsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZSA9PT0gdW5kZWZpbmVkID8gKCgvKiogQHR5cGUgez99ICovIChpbml0aWFsU3RhdGUpKSkgOiBzdGF0ZTsKICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICAgICAgfSk7CiAgICB9KTsKfQovKioKICogQHRlbXBsYXRlIFQsIFYKICogQHBhcmFtIHs/PX0gbWV0YVJlZHVjZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVGZWF0dXJlUmVkdWNlckZhY3RvcnkobWV0YVJlZHVjZXJzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWR1Y2VyRmFjdG9yeSA9IEFycmF5LmlzQXJyYXkobWV0YVJlZHVjZXJzKSAmJiBtZXRhUmVkdWNlcnMubGVuZ3RoID4gMAogICAgICAgID8gY29tcG9zZSguLi5tZXRhUmVkdWNlcnMpCiAgICAgICAgOiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocikgPT4gcik7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSByZWR1Y2VyCiAgICAgKiBAcGFyYW0gez89fSBpbml0aWFsU3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChyZWR1Y2VyLCBpbml0aWFsU3RhdGUpID0+IHsKICAgICAgICByZWR1Y2VyID0gcmVkdWNlckZhY3RvcnkocmVkdWNlcik7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIHN0YXRlID0gc3RhdGUgPT09IHVuZGVmaW5lZCA/IGluaXRpYWxTdGF0ZSA6IHN0YXRlOwogICAgICAgICAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsKICAgICAgICB9KTsKICAgIH0pOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9yZWR1Y2VyX21hbmFnZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgUmVkdWNlck9ic2VydmFibGUgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKfQovKioKICogQGFic3RyYWN0CiAqLwpjbGFzcyBSZWR1Y2VyTWFuYWdlckRpc3BhdGNoZXIgZXh0ZW5kcyBBY3Rpb25zU3ViamVjdCB7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVUERBVEUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoJ0BuZ3J4L3N0b3JlL3VwZGF0ZS1yZWR1Y2VycycpKTsKY2xhc3MgUmVkdWNlck1hbmFnZXIgZXh0ZW5kcyBCZWhhdmlvclN1YmplY3QgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRpc3BhdGNoZXIKICAgICAqIEBwYXJhbSB7P30gaW5pdGlhbFN0YXRlCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJzCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJGYWN0b3J5CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRpc3BhdGNoZXIsIGluaXRpYWxTdGF0ZSwgcmVkdWNlcnMsIHJlZHVjZXJGYWN0b3J5KSB7CiAgICAgICAgc3VwZXIocmVkdWNlckZhY3RvcnkocmVkdWNlcnMsIGluaXRpYWxTdGF0ZSkpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7CiAgICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7CiAgICAgICAgdGhpcy5yZWR1Y2VycyA9IHJlZHVjZXJzOwogICAgICAgIHRoaXMucmVkdWNlckZhY3RvcnkgPSByZWR1Y2VyRmFjdG9yeTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmZWF0dXJlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRGZWF0dXJlKGZlYXR1cmUpIHsKICAgICAgICB0aGlzLmFkZEZlYXR1cmVzKFtmZWF0dXJlXSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEZlYXR1cmVzKGZlYXR1cmVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZHVjZXJzID0gZmVhdHVyZXMucmVkdWNlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJEaWN0CiAgICAgICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWR1Y2VyRGljdCwgeyByZWR1Y2VycywgcmVkdWNlckZhY3RvcnksIG1ldGFSZWR1Y2VycywgaW5pdGlhbFN0YXRlLCBrZXkgfSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlZHVjZXIgPSB0eXBlb2YgcmVkdWNlcnMgPT09ICdmdW5jdGlvbicKICAgICAgICAgICAgICAgID8gY3JlYXRlRmVhdHVyZVJlZHVjZXJGYWN0b3J5KG1ldGFSZWR1Y2VycykocmVkdWNlcnMsIGluaXRpYWxTdGF0ZSkKICAgICAgICAgICAgICAgIDogY3JlYXRlUmVkdWNlckZhY3RvcnkocmVkdWNlckZhY3RvcnksIG1ldGFSZWR1Y2VycykocmVkdWNlcnMsIGluaXRpYWxTdGF0ZSk7CiAgICAgICAgICAgIHJlZHVjZXJEaWN0W2tleV0gPSByZWR1Y2VyOwogICAgICAgICAgICByZXR1cm4gcmVkdWNlckRpY3Q7CiAgICAgICAgfSksICgvKiogQHR5cGUgez99ICovICh7fSkpKTsKICAgICAgICB0aGlzLmFkZFJlZHVjZXJzKHJlZHVjZXJzKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmZWF0dXJlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVGZWF0dXJlKGZlYXR1cmUpIHsKICAgICAgICB0aGlzLnJlbW92ZUZlYXR1cmVzKFtmZWF0dXJlXSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUZlYXR1cmVzKGZlYXR1cmVzKSB7CiAgICAgICAgdGhpcy5yZW1vdmVSZWR1Y2VycyhmZWF0dXJlcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcCA9PiBwLmtleSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkUmVkdWNlcihrZXksIHJlZHVjZXIpIHsKICAgICAgICB0aGlzLmFkZFJlZHVjZXJzKHsgW2tleV06IHJlZHVjZXIgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFJlZHVjZXJzKHJlZHVjZXJzKSB7CiAgICAgICAgdGhpcy5yZWR1Y2VycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yZWR1Y2VycyksIHJlZHVjZXJzKTsKICAgICAgICB0aGlzLnVwZGF0ZVJlZHVjZXJzKE9iamVjdC5rZXlzKHJlZHVjZXJzKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZUtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlUmVkdWNlcihmZWF0dXJlS2V5KSB7CiAgICAgICAgdGhpcy5yZW1vdmVSZWR1Y2VycyhbZmVhdHVyZUtleV0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVLZXlzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVSZWR1Y2VycyhmZWF0dXJlS2V5cykgewogICAgICAgIGZlYXR1cmVLZXlzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBrZXkgPT4gewogICAgICAgICAgICB0aGlzLnJlZHVjZXJzID0gKC8qKiBAdHlwZSB7P30gKi8gKG9taXQodGhpcy5yZWR1Y2Vycywga2V5KSAvKlRPRE8oIzgyMykqLykpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnVwZGF0ZVJlZHVjZXJzKGZlYXR1cmVLZXlzKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZUtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVwZGF0ZVJlZHVjZXJzKGZlYXR1cmVLZXlzKSB7CiAgICAgICAgdGhpcy5uZXh0KHRoaXMucmVkdWNlckZhY3RvcnkodGhpcy5yZWR1Y2VycywgdGhpcy5pbml0aWFsU3RhdGUpKTsKICAgICAgICB0aGlzLmRpc3BhdGNoZXIubmV4dCgoLyoqIEB0eXBlIHs/fSAqLyAoewogICAgICAgICAgICB0eXBlOiBVUERBVEUsCiAgICAgICAgICAgIGZlYXR1cmVzOiBmZWF0dXJlS2V5cywKICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICB9Cn0KUmVkdWNlck1hbmFnZXIuybVmYWMgPSBmdW5jdGlvbiBSZWR1Y2VyTWFuYWdlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSZWR1Y2VyTWFuYWdlcikoybXJtWluamVjdChSZWR1Y2VyTWFuYWdlckRpc3BhdGNoZXIpLCDJtcm1aW5qZWN0KElOSVRJQUxfU1RBVEUpLCDJtcm1aW5qZWN0KElOSVRJQUxfUkVEVUNFUlMpLCDJtcm1aW5qZWN0KFJFRFVDRVJfRkFDVE9SWSkpOyB9OwpSZWR1Y2VyTWFuYWdlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBSZWR1Y2VyTWFuYWdlciwgZmFjdG9yeTogUmVkdWNlck1hbmFnZXIuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpSZWR1Y2VyTWFuYWdlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUmVkdWNlck1hbmFnZXJEaXNwYXRjaGVyIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbSU5JVElBTF9TVEFURSxdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbSU5JVElBTF9SRURVQ0VSUyxdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbUkVEVUNFUl9GQUNUT1JZLF0gfV0gfQpdOwovKiogQHR5cGUgez99ICovCmNvbnN0IFJFRFVDRVJfTUFOQUdFUl9QUk9WSURFUlMgPSBbCiAgICBSZWR1Y2VyTWFuYWdlciwKICAgIHsgcHJvdmlkZTogUmVkdWNlck9ic2VydmFibGUsIHVzZUV4aXN0aW5nOiBSZWR1Y2VyTWFuYWdlciB9LAogICAgeyBwcm92aWRlOiBSZWR1Y2VyTWFuYWdlckRpc3BhdGNoZXIsIHVzZUV4aXN0aW5nOiBBY3Rpb25zU3ViamVjdCB9LApdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvc2Nhbm5lZF9hY3Rpb25zX3N1YmplY3QudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgU2Nhbm5lZEFjdGlvbnNTdWJqZWN0IGV4dGVuZHMgU3ViamVjdCB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgIH0KfQpTY2FubmVkQWN0aW9uc1N1YmplY3QuybVmYWMgPSBmdW5jdGlvbiBTY2FubmVkQWN0aW9uc1N1YmplY3RfRmFjdG9yeSh0KSB7IHJldHVybiDJtVNjYW5uZWRBY3Rpb25zU3ViamVjdF9CYXNlRmFjdG9yeSh0IHx8IFNjYW5uZWRBY3Rpb25zU3ViamVjdCk7IH07ClNjYW5uZWRBY3Rpb25zU3ViamVjdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTY2FubmVkQWN0aW9uc1N1YmplY3QsIGZhY3Rvcnk6IFNjYW5uZWRBY3Rpb25zU3ViamVjdC7JtWZhYyB9KTsKY29uc3QgybVTY2FubmVkQWN0aW9uc1N1YmplY3RfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShTY2FubmVkQWN0aW9uc1N1YmplY3QpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNDQU5ORURfQUNUSU9OU19TVUJKRUNUX1BST1ZJREVSUyA9IFsKICAgIFNjYW5uZWRBY3Rpb25zU3ViamVjdCwKXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3N0YXRlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAYWJzdHJhY3QKICovCmNsYXNzIFN0YXRlT2JzZXJ2YWJsZSBleHRlbmRzIE9ic2VydmFibGUgewp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgU3RhdGUgZXh0ZW5kcyBCZWhhdmlvclN1YmplY3QgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIkCiAgICAgKiBAcGFyYW0gez99IHNjYW5uZWRBY3Rpb25zCiAgICAgKiBAcGFyYW0gez99IGluaXRpYWxTdGF0ZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihhY3Rpb25zJCwgcmVkdWNlciQsIHNjYW5uZWRBY3Rpb25zLCBpbml0aWFsU3RhdGUpIHsKICAgICAgICBzdXBlcihpbml0aWFsU3RhdGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhY3Rpb25zT25RdWV1ZSQgPSBhY3Rpb25zJC5waXBlKG9ic2VydmVPbihxdWV1ZSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB3aXRoTGF0ZXN0UmVkdWNlciQgPSBhY3Rpb25zT25RdWV1ZSQucGlwZSh3aXRoTGF0ZXN0RnJvbShyZWR1Y2VyJCkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzZWVkID0geyBzdGF0ZTogaW5pdGlhbFN0YXRlIH07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXRlQW5kQWN0aW9uJCA9IHdpdGhMYXRlc3RSZWR1Y2VyJC5waXBlKHNjYW4ocmVkdWNlU3RhdGUsIHNlZWQpKTsKICAgICAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uID0gc3RhdGVBbmRBY3Rpb24kLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IHN0YXRlLCBhY3Rpb24gfSkgPT4gewogICAgICAgICAgICB0aGlzLm5leHQoc3RhdGUpOwogICAgICAgICAgICBzY2FubmVkQWN0aW9ucy5uZXh0KGFjdGlvbik7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgdGhpcy5jb21wbGV0ZSgpOwogICAgfQp9ClN0YXRlLsm1ZmFjID0gZnVuY3Rpb24gU3RhdGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RhdGUpKMm1ybVpbmplY3QoQWN0aW9uc1N1YmplY3QpLCDJtcm1aW5qZWN0KFJlZHVjZXJPYnNlcnZhYmxlKSwgybXJtWluamVjdChTY2FubmVkQWN0aW9uc1N1YmplY3QpLCDJtcm1aW5qZWN0KElOSVRJQUxfU1RBVEUpKTsgfTsKU3RhdGUuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogU3RhdGUsIGZhY3Rvcnk6IFN0YXRlLsm1ZmFjIH0pOwpTdGF0ZS5JTklUID0gSU5JVDsKLyoqIEBub2NvbGxhcHNlICovClN0YXRlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBBY3Rpb25zU3ViamVjdCB9LAogICAgeyB0eXBlOiBSZWR1Y2VyT2JzZXJ2YWJsZSB9LAogICAgeyB0eXBlOiBTY2FubmVkQWN0aW9uc1N1YmplY3QgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtJTklUSUFMX1NUQVRFLF0gfV0gfQpdOwovKioKICogQHRlbXBsYXRlIFQsIFYKICogQHBhcmFtIHs/PX0gc3RhdGVBY3Rpb25QYWlyCiAqIEBwYXJhbSB7Pz19IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVkdWNlU3RhdGUoc3RhdGVBY3Rpb25QYWlyID0geyBzdGF0ZTogdW5kZWZpbmVkIH0sIFthY3Rpb24sIHJlZHVjZXJdKSB7CiAgICBjb25zdCB7IHN0YXRlIH0gPSBzdGF0ZUFjdGlvblBhaXI7CiAgICByZXR1cm4geyBzdGF0ZTogcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSwgYWN0aW9uIH07Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTVEFURV9QUk9WSURFUlMgPSBbCiAgICBTdGF0ZSwKICAgIHsgcHJvdmlkZTogU3RhdGVPYnNlcnZhYmxlLCB1c2VFeGlzdGluZzogU3RhdGUgfSwKXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3N0b3JlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgU3RvcmUgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZSQKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uc09ic2VydmVyCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJNYW5hZ2VyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHN0YXRlJCwgYWN0aW9uc09ic2VydmVyLCByZWR1Y2VyTWFuYWdlcikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5hY3Rpb25zT2JzZXJ2ZXIgPSBhY3Rpb25zT2JzZXJ2ZXI7CiAgICAgICAgdGhpcy5yZWR1Y2VyTWFuYWdlciA9IHJlZHVjZXJNYW5hZ2VyOwogICAgICAgIHRoaXMuc291cmNlID0gc3RhdGUkOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgUHJvcHMsIEsKICAgICAqIEBwYXJhbSB7P30gcGF0aE9yTWFwRm4KICAgICAqIEBwYXJhbSB7Li4uP30gcGF0aHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNlbGVjdChwYXRoT3JNYXBGbiwgLi4ucGF0aHMpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChzZWxlY3QpKSkuY2FsbChudWxsLCBwYXRoT3JNYXBGbiwgLi4ucGF0aHMpKHRoaXMpOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgUgogICAgICogQHBhcmFtIHs/fSBvcGVyYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbGlmdChvcGVyYXRvcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdG9yZSA9IG5ldyBTdG9yZSh0aGlzLCB0aGlzLmFjdGlvbnNPYnNlcnZlciwgdGhpcy5yZWR1Y2VyTWFuYWdlcik7CiAgICAgICAgc3RvcmUub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gc3RvcmU7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzcGF0Y2goYWN0aW9uKSB7CiAgICAgICAgdGhpcy5hY3Rpb25zT2JzZXJ2ZXIubmV4dChhY3Rpb24pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmV4dChhY3Rpb24pIHsKICAgICAgICB0aGlzLmFjdGlvbnNPYnNlcnZlci5uZXh0KGFjdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlcnJvcihlcnIpIHsKICAgICAgICB0aGlzLmFjdGlvbnNPYnNlcnZlci5lcnJvcihlcnIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmFjdGlvbnNPYnNlcnZlci5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgU3RhdGUsIEFjdGlvbnMKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFJlZHVjZXIoa2V5LCByZWR1Y2VyKSB7CiAgICAgICAgdGhpcy5yZWR1Y2VyTWFuYWdlci5hZGRSZWR1Y2VyKGtleSwgcmVkdWNlcik7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBLZXkKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVSZWR1Y2VyKGtleSkgewogICAgICAgIHRoaXMucmVkdWNlck1hbmFnZXIucmVtb3ZlUmVkdWNlcihrZXkpOwogICAgfQp9ClN0b3JlLsm1ZmFjID0gZnVuY3Rpb24gU3RvcmVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RvcmUpKMm1ybVpbmplY3QoU3RhdGVPYnNlcnZhYmxlKSwgybXJtWluamVjdChBY3Rpb25zU3ViamVjdCksIMm1ybVpbmplY3QoUmVkdWNlck1hbmFnZXIpKTsgfTsKU3RvcmUuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogU3RvcmUsIGZhY3Rvcnk6IFN0b3JlLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KU3RvcmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFN0YXRlT2JzZXJ2YWJsZSB9LAogICAgeyB0eXBlOiBBY3Rpb25zU3ViamVjdCB9LAogICAgeyB0eXBlOiBSZWR1Y2VyTWFuYWdlciB9Cl07Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1RPUkVfUFJPVklERVJTID0gW1N0b3JlXTsKLyoqCiAqIEB0ZW1wbGF0ZSBULCBQcm9wcywgSwogKiBAcGFyYW0gez99IHBhdGhPck1hcEZuCiAqIEBwYXJhbSB7Pz19IHByb3BzT3JQYXRoCiAqIEBwYXJhbSB7Li4uP30gcGF0aHMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNlbGVjdChwYXRoT3JNYXBGbiwgcHJvcHNPclBhdGgsIC4uLnBhdGhzKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2UkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RPcGVyYXRvcihzb3VyY2UkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXBwZWQkOwogICAgICAgIGlmICh0eXBlb2YgcGF0aE9yTWFwRm4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGF0aFNsaWNlcyA9IFsoLyoqIEB0eXBlIHs/fSAqLyAocHJvcHNPclBhdGgpKSwgLi4ucGF0aHNdLmZpbHRlcihCb29sZWFuKTsKICAgICAgICAgICAgbWFwcGVkJCA9IHNvdXJjZSQucGlwZShwbHVjayhwYXRoT3JNYXBGbiwgLi4ucGF0aFNsaWNlcykpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGF0aE9yTWFwRm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgbWFwcGVkJCA9IHNvdXJjZSQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc291cmNlID0+IHBhdGhPck1hcEZuKHNvdXJjZSwgKC8qKiBAdHlwZSB7P30gKi8gKHByb3BzT3JQYXRoKSkpKSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5leHBlY3RlZCB0eXBlICcke3R5cGVvZiBwYXRoT3JNYXBGbn0nIGluIHNlbGVjdCBvcGVyYXRvcixgICsKICAgICAgICAgICAgICAgIGAgZXhwZWN0ZWQgJ3N0cmluZycgb3IgJ2Z1bmN0aW9uJ2ApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFwcGVkJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpOwogICAgfSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzRXF1YWxDaGVjayhhLCBiKSB7CiAgICByZXR1cm4gYSA9PT0gYjsKfQovKioKICogQHBhcmFtIHs/fSBhcmdzCiAqIEBwYXJhbSB7P30gbGFzdEFyZ3VtZW50cwogKiBAcGFyYW0gez99IGNvbXBhcmF0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQXJndW1lbnRzQ2hhbmdlZChhcmdzLCBsYXN0QXJndW1lbnRzLCBjb21wYXJhdG9yKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWNvbXBhcmF0b3IoYXJnc1tpXSwgbGFzdEFyZ3VtZW50c1tpXSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Ci8qKgogKiBAcGFyYW0gez99IHByb2plY3Rpb25GbgogKiBAcGFyYW0gez89fSBpc0FyZ3VtZW50c0VxdWFsCiAqIEBwYXJhbSB7Pz19IGlzUmVzdWx0RXF1YWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlZmF1bHRNZW1vaXplKHByb2plY3Rpb25GbiwgaXNBcmd1bWVudHNFcXVhbCA9IGlzRXF1YWxDaGVjaywgaXNSZXN1bHRFcXVhbCA9IGlzRXF1YWxDaGVjaykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGxhc3RBcmd1bWVudHMgPSBudWxsOwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSBhbnl0aGluZyBjb3VsZCBiZSB0aGUgcmVzdWx0LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGxhc3RSZXN1bHQgPSBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG92ZXJyaWRlUmVzdWx0OwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICBsYXN0QXJndW1lbnRzID0gbnVsbDsKICAgICAgICBsYXN0UmVzdWx0ID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gcmVzdWx0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRSZXN1bHQocmVzdWx0ID0gdW5kZWZpbmVkKSB7CiAgICAgICAgb3ZlcnJpZGVSZXN1bHQgPSB7IHJlc3VsdCB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjbGVhclJlc3VsdCgpIHsKICAgICAgICBvdmVycmlkZVJlc3VsdCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgYW55dGhpbmcgY291bGQgYmUgdGhlIHJlc3VsdC4KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7CiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlUmVzdWx0LnJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaWYgKCFsYXN0QXJndW1lbnRzKSB7CiAgICAgICAgICAgIGxhc3RSZXN1bHQgPSBwcm9qZWN0aW9uRm4uYXBwbHkobnVsbCwgKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3VtZW50cykpKTsKICAgICAgICAgICAgbGFzdEFyZ3VtZW50cyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmICghaXNBcmd1bWVudHNDaGFuZ2VkKGFyZ3VtZW50cywgbGFzdEFyZ3VtZW50cywgaXNBcmd1bWVudHNFcXVhbCkpIHsKICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdSZXN1bHQgPSBwcm9qZWN0aW9uRm4uYXBwbHkobnVsbCwgKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3VtZW50cykpKTsKICAgICAgICBsYXN0QXJndW1lbnRzID0gYXJndW1lbnRzOwogICAgICAgIGlmIChpc1Jlc3VsdEVxdWFsKGxhc3RSZXN1bHQsIG5ld1Jlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGxhc3RSZXN1bHQgPSBuZXdSZXN1bHQ7CiAgICAgICAgcmV0dXJuIG5ld1Jlc3VsdDsKICAgIH0KICAgIHJldHVybiB7IG1lbW9pemVkLCByZXNldCwgc2V0UmVzdWx0LCBjbGVhclJlc3VsdCB9Owp9Ci8qKgogKiBAcGFyYW0gey4uLj99IGlucHV0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVTZWxlY3RvciguLi5pbnB1dCkgewogICAgcmV0dXJuIGNyZWF0ZVNlbGVjdG9yRmFjdG9yeShkZWZhdWx0TWVtb2l6ZSkoLi4uaW5wdXQpOwp9Ci8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gc2VsZWN0b3JzCiAqIEBwYXJhbSB7P30gcHJvcHMKICogQHBhcmFtIHs/fSBtZW1vaXplZFByb2plY3RvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGVmYXVsdFN0YXRlRm4oc3RhdGUsIHNlbGVjdG9ycywgcHJvcHMsIG1lbW9pemVkUHJvamVjdG9yKSB7CiAgICBpZiAocHJvcHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhcmdzID0gKCgvKiogQHR5cGUgez99ICovIChzZWxlY3RvcnMpKSkubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmbiA9PiBmbihzdGF0ZSkpKTsKICAgICAgICByZXR1cm4gbWVtb2l6ZWRQcm9qZWN0b3IubWVtb2l6ZWQuYXBwbHkobnVsbCwgYXJncyk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhcmdzID0gKCgvKiogQHR5cGUgez99ICovIChzZWxlY3RvcnMpKSkubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZuID0+IGZuKHN0YXRlLCBwcm9wcykpKTsKICAgIHJldHVybiBtZW1vaXplZFByb2plY3Rvci5tZW1vaXplZC5hcHBseShudWxsLCBbLi4uYXJncywgcHJvcHNdKTsKfQovKioKICogQHBhcmFtIHs/fSBtZW1vaXplCiAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yRmFjdG9yeShtZW1vaXplLCBvcHRpb25zID0gewogICAgc3RhdGVGbjogZGVmYXVsdFN0YXRlRm4sCn0pIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gey4uLj99IGlucHV0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoLi4uaW5wdXQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGFyZ3MgPSBpbnB1dDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkgewogICAgICAgICAgICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBhcmdzOwogICAgICAgICAgICBhcmdzID0gWy4uLmhlYWQsIC4uLnRhaWxdOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2VsZWN0b3JzID0gYXJncy5zbGljZSgwLCBhcmdzLmxlbmd0aCAtIDEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm9qZWN0b3IgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lbW9pemVkU2VsZWN0b3JzID0gc2VsZWN0b3JzLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHNlbGVjdG9yKSA9PiBzZWxlY3Rvci5yZWxlYXNlICYmIHR5cGVvZiBzZWxlY3Rvci5yZWxlYXNlID09PSAnZnVuY3Rpb24nKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lbW9pemVkUHJvamVjdG9yID0gbWVtb2l6ZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHsuLi4/fSBzZWxlY3RvcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uICguLi5zZWxlY3RvcnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByb2plY3Rvci5hcHBseShudWxsLCBzZWxlY3RvcnMpOwogICAgICAgIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWVtb2l6ZWRTdGF0ZSA9IGRlZmF1bHRNZW1vaXplKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKHN0YXRlLCBwcm9wcykgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zdGF0ZUZuLmFwcGx5KG51bGwsIFsKICAgICAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICAgICAgc2VsZWN0b3JzLAogICAgICAgICAgICAgICAgcHJvcHMsCiAgICAgICAgICAgICAgICBtZW1vaXplZFByb2plY3RvciwKICAgICAgICAgICAgXSk7CiAgICAgICAgfSkpOwogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgICAgbWVtb2l6ZWRTdGF0ZS5yZXNldCgpOwogICAgICAgICAgICBtZW1vaXplZFByb2plY3Rvci5yZXNldCgpOwogICAgICAgICAgICBtZW1vaXplZFNlbGVjdG9ycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2VsZWN0b3IgPT4gc2VsZWN0b3IucmVsZWFzZSgpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG1lbW9pemVkU3RhdGUubWVtb2l6ZWQsIHsKICAgICAgICAgICAgcmVsZWFzZSwKICAgICAgICAgICAgcHJvamVjdG9yOiBtZW1vaXplZFByb2plY3Rvci5tZW1vaXplZCwKICAgICAgICAgICAgc2V0UmVzdWx0OiBtZW1vaXplZFN0YXRlLnNldFJlc3VsdCwKICAgICAgICAgICAgY2xlYXJSZXN1bHQ6IG1lbW9pemVkU3RhdGUuY2xlYXJSZXN1bHQsCiAgICAgICAgfSk7CiAgICB9KTsKfQovKioKICogQHBhcmFtIHs/fSBmZWF0dXJlTmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlRmVhdHVyZVNlbGVjdG9yKGZlYXR1cmVOYW1lKSB7CiAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IoKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZlYXR1cmVTdGF0ZSA9IHN0YXRlW2ZlYXR1cmVOYW1lXTsKICAgICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgIShmZWF0dXJlTmFtZSBpbiBzdGF0ZSkpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKGBAbmdyeC9zdG9yZTogVGhlIGZlYXR1cmUgbmFtZSBcIiR7ZmVhdHVyZU5hbWV9XCIgZG9lcyBgICsKICAgICAgICAgICAgICAgICdub3QgZXhpc3QgaW4gdGhlIHN0YXRlLCB0aGVyZWZvcmUgY3JlYXRlRmVhdHVyZVNlbGVjdG9yICcgKwogICAgICAgICAgICAgICAgJ2Nhbm5vdCBhY2Nlc3MgaXQuICBCZSBzdXJlIGl0IGlzIGltcG9ydGVkIGluIGEgbG9hZGVkIG1vZHVsZSAnICsKICAgICAgICAgICAgICAgIGB1c2luZyBTdG9yZU1vZHVsZS5mb3JSb290KCcke2ZlYXR1cmVOYW1lfScsIC4uLikgb3IgYCArCiAgICAgICAgICAgICAgICBgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgnJHtmZWF0dXJlTmFtZX0nLCAuLi4pLiAgSWYgdGhlIGRlZmF1bHQgYCArCiAgICAgICAgICAgICAgICAnc3RhdGUgaXMgaW50ZW5kZWQgdG8gYmUgdW5kZWZpbmVkLCBhcyBpcyB0aGUgY2FzZSB3aXRoIHJvdXRlciAnICsKICAgICAgICAgICAgICAgICdzdGF0ZSwgdGhpcyBkZXZlbG9wbWVudC1vbmx5IHdhcm5pbmcgbWVzc2FnZSBjYW4gYmUgaWdub3JlZC4nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZlYXR1cmVTdGF0ZTsKICAgIH0pLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVTdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGZlYXR1cmVTdGF0ZSkgPT4gZmVhdHVyZVN0YXRlKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL21ldGEtcmVkdWNlcnMvdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBSVU5USU1FX0NIRUNLX1VSTCA9ICdodHRwczovL25ncnguaW8vZ3VpZGUvc3RvcmUvY29uZmlndXJhdGlvbi9ydW50aW1lLWNoZWNrcyc7Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVbmRlZmluZWQodGFyZ2V0KSB7CiAgICByZXR1cm4gdGFyZ2V0ID09PSB1bmRlZmluZWQ7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc051bGwodGFyZ2V0KSB7CiAgICByZXR1cm4gdGFyZ2V0ID09PSBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNBcnJheSQxKHRhcmdldCkgewogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KTsKfQovKioKICogQHBhcmFtIHs/fSB0YXJnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzU3RyaW5nKHRhcmdldCkgewogICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNCb29sZWFuKHRhcmdldCkgewogICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJzsKfQovKioKICogQHBhcmFtIHs/fSB0YXJnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzTnVtYmVyKHRhcmdldCkgewogICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdudW1iZXInOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNPYmplY3RMaWtlKHRhcmdldCkgewogICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIHRhcmdldCAhPT0gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSB0YXJnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzT2JqZWN0JDIodGFyZ2V0KSB7CiAgICByZXR1cm4gaXNPYmplY3RMaWtlKHRhcmdldCkgJiYgIWlzQXJyYXkkMSh0YXJnZXQpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh0YXJnZXQpIHsKICAgIGlmICghaXNPYmplY3QkMih0YXJnZXQpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdGFyZ2V0UHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCk7CiAgICByZXR1cm4gdGFyZ2V0UHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHRhcmdldFByb3RvdHlwZSA9PT0gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSB0YXJnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzRnVuY3Rpb24kMSh0YXJnZXQpIHsKICAgIHJldHVybiB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzT3duUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpIHsKICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9tZXRhLXJlZHVjZXJzL2ltbXV0YWJpbGl0eV9yZWR1Y2VyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IHJlZHVjZXIKICogQHBhcmFtIHs/fSBjaGVja3MKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGltbXV0YWJpbGl0eUNoZWNrTWV0YVJlZHVjZXIocmVkdWNlciwgY2hlY2tzKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFjdCA9IGNoZWNrcy5hY3Rpb24oYWN0aW9uKSA/IGZyZWV6ZShhY3Rpb24pIDogYWN0aW9uOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3QpOwogICAgICAgIHJldHVybiBjaGVja3Muc3RhdGUoKSA/IGZyZWV6ZShuZXh0U3RhdGUpIDogbmV4dFN0YXRlOwogICAgfSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmcmVlemUodGFyZ2V0KSB7CiAgICBPYmplY3QuZnJlZXplKHRhcmdldCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0YXJnZXRJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiQxKHRhcmdldCk7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9wID0+IHsKICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkodGFyZ2V0LCBwcm9wKSAmJgogICAgICAgICAgICAodGFyZ2V0SXNGdW5jdGlvbgogICAgICAgICAgICAgICAgPyBwcm9wICE9PSAnY2FsbGVyJyAmJiBwcm9wICE9PSAnY2FsbGVlJyAmJiBwcm9wICE9PSAnYXJndW1lbnRzJwogICAgICAgICAgICAgICAgOiB0cnVlKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3BWYWx1ZSA9IHRhcmdldFtwcm9wXTsKICAgICAgICAgICAgaWYgKChpc09iamVjdExpa2UocHJvcFZhbHVlKSB8fCBpc0Z1bmN0aW9uJDEocHJvcFZhbHVlKSkgJiYKICAgICAgICAgICAgICAgICFPYmplY3QuaXNGcm96ZW4ocHJvcFZhbHVlKSkgewogICAgICAgICAgICAgICAgZnJlZXplKHByb3BWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KSk7CiAgICByZXR1cm4gdGFyZ2V0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9tZXRhLXJlZHVjZXJzL3NlcmlhbGl6YXRpb25fcmVkdWNlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHBhcmFtIHs/fSByZWR1Y2VyCiAqIEBwYXJhbSB7P30gY2hlY2tzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXJpYWxpemF0aW9uQ2hlY2tNZXRhUmVkdWNlcihyZWR1Y2VyLCBjaGVja3MpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgICAgICBpZiAoY2hlY2tzLmFjdGlvbihhY3Rpb24pKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdW5zZXJpYWxpemFibGVBY3Rpb24gPSBnZXRVbnNlcmlhbGl6YWJsZShhY3Rpb24pOwogICAgICAgICAgICB0aHJvd0lmVW5zZXJpYWxpemFibGUodW5zZXJpYWxpemFibGVBY3Rpb24sICdhY3Rpb24nKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICAgICAgaWYgKGNoZWNrcy5zdGF0ZSgpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdW5zZXJpYWxpemFibGVTdGF0ZSA9IGdldFVuc2VyaWFsaXphYmxlKG5leHRTdGF0ZSk7CiAgICAgICAgICAgIHRocm93SWZVbnNlcmlhbGl6YWJsZSh1bnNlcmlhbGl6YWJsZVN0YXRlLCAnc3RhdGUnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTsKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez89fSB0YXJnZXQKICogQHBhcmFtIHs/PX0gcGF0aAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VW5zZXJpYWxpemFibGUodGFyZ2V0LCBwYXRoID0gW10pIHsKICAgIC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIGFuZCBudWxsLCBlLmcuIGEgcmVkdWNlciB0aGF0IHJldHVybnMgdW5kZWZpbmVkCiAgICBpZiAoKGlzVW5kZWZpbmVkKHRhcmdldCkgfHwgaXNOdWxsKHRhcmdldCkpICYmIHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGF0aDogWydyb290J10sCiAgICAgICAgICAgIHZhbHVlOiB0YXJnZXQsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YXJnZXQpOwogICAgcmV0dXJuIGtleXMucmVkdWNlKCgvKioKICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJlc3VsdCwga2V5KSA9PiB7CiAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRhcmdldCkpKVtrZXldOwogICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwKICAgICAgICAgICAgaXNOdWxsKHZhbHVlKSB8fAogICAgICAgICAgICBpc051bWJlcih2YWx1ZSkgfHwKICAgICAgICAgICAgaXNCb29sZWFuKHZhbHVlKSB8fAogICAgICAgICAgICBpc1N0cmluZyh2YWx1ZSkgfHwKICAgICAgICAgICAgaXNBcnJheSQxKHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gZ2V0VW5zZXJpYWxpemFibGUodmFsdWUsIFsuLi5wYXRoLCBrZXldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGF0aDogWy4uLnBhdGgsIGtleV0sCiAgICAgICAgICAgIHZhbHVlLAogICAgICAgIH07CiAgICB9KSwgZmFsc2UpOwp9Ci8qKgogKiBAcGFyYW0gez99IHVuc2VyaWFsaXphYmxlCiAqIEBwYXJhbSB7P30gY29udGV4dAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGhyb3dJZlVuc2VyaWFsaXphYmxlKHVuc2VyaWFsaXphYmxlLCBjb250ZXh0KSB7CiAgICBpZiAodW5zZXJpYWxpemFibGUgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdW5zZXJpYWxpemFibGVQYXRoID0gdW5zZXJpYWxpemFibGUucGF0aC5qb2luKCcuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgRGV0ZWN0ZWQgdW5zZXJpYWxpemFibGUgJHtjb250ZXh0fSBhdCAiJHt1bnNlcmlhbGl6YWJsZVBhdGh9Ii4gJHtSVU5USU1FX0NIRUNLX1VSTH0jc3RyaWN0JHtjb250ZXh0fXNlcmlhbGl6YWJpbGl0eWApOwogICAgZXJyb3IudmFsdWUgPSB1bnNlcmlhbGl6YWJsZS52YWx1ZTsKICAgIGVycm9yLnVuc2VyaWFsaXphYmxlUGF0aCA9IHVuc2VyaWFsaXphYmxlUGF0aDsKICAgIHRocm93IGVycm9yOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9tZXRhLXJlZHVjZXJzL2luTmdab25lQXNzZXJ0X3JlZHVjZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gcmVkdWNlcgogKiBAcGFyYW0gez99IGNoZWNrcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5OZ1pvbmVBc3NlcnRNZXRhUmVkdWNlcihyZWR1Y2VyLCBjaGVja3MpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgICAgICBpZiAoY2hlY2tzLmFjdGlvbihhY3Rpb24pICYmICFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gJyR7YWN0aW9uLnR5cGV9JyBydW5uaW5nIG91dHNpZGUgTmdab25lLiAke1JVTlRJTUVfQ0hFQ0tfVVJMfSNzdHJpY3RhY3Rpb253aXRoaW5uZ3pvbmVgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICB9KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvbWV0YS1yZWR1Y2Vycy9pbmRleC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvcnVudGltZV9jaGVja3MudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7Pz19IHJ1bnRpbWVDaGVja3MKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUFjdGl2ZVJ1bnRpbWVDaGVja3MocnVudGltZUNoZWNrcykgewogICAgaWYgKGlzRGV2TW9kZSgpKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBzdHJpY3RTdGF0ZVNlcmlhbGl6YWJpbGl0eTogZmFsc2UsIHN0cmljdEFjdGlvblNlcmlhbGl6YWJpbGl0eTogZmFsc2UsIHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5OiB0cnVlLCBzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6IHRydWUsIHN0cmljdEFjdGlvbldpdGhpbk5nWm9uZTogZmFsc2UgfSwgcnVudGltZUNoZWNrcyk7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiBmYWxzZSwKICAgICAgICBzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHk6IGZhbHNlLAogICAgICAgIHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5OiBmYWxzZSwKICAgICAgICBzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6IGZhbHNlLAogICAgICAgIHN0cmljdEFjdGlvbldpdGhpbk5nWm9uZTogZmFsc2UsCiAgICB9Owp9Ci8qKgogKiBAcGFyYW0gez99IF9fMAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlU2VyaWFsaXphdGlvbkNoZWNrTWV0YVJlZHVjZXIoeyBzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHksIHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5LCB9KSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSByZWR1Y2VyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWR1Y2VyID0+IHN0cmljdEFjdGlvblNlcmlhbGl6YWJpbGl0eSB8fCBzdHJpY3RTdGF0ZVNlcmlhbGl6YWJpbGl0eQogICAgICAgID8gc2VyaWFsaXphdGlvbkNoZWNrTWV0YVJlZHVjZXIocmVkdWNlciwgewogICAgICAgICAgICBhY3Rpb246ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFjdGlvbiA9PiBzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHkgJiYgIWlnbm9yZU5ncnhBY3Rpb24oYWN0aW9uKSksCiAgICAgICAgICAgIHN0YXRlOiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBzdHJpY3RTdGF0ZVNlcmlhbGl6YWJpbGl0eSksCiAgICAgICAgfSkKICAgICAgICA6IHJlZHVjZXIpOwp9Ci8qKgogKiBAcGFyYW0gez99IF9fMAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlSW1tdXRhYmlsaXR5Q2hlY2tNZXRhUmVkdWNlcih7IHN0cmljdEFjdGlvbkltbXV0YWJpbGl0eSwgc3RyaWN0U3RhdGVJbW11dGFiaWxpdHksIH0pIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZHVjZXIgPT4gc3RyaWN0QWN0aW9uSW1tdXRhYmlsaXR5IHx8IHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5CiAgICAgICAgPyBpbW11dGFiaWxpdHlDaGVja01ldGFSZWR1Y2VyKHJlZHVjZXIsIHsKICAgICAgICAgICAgYWN0aW9uOiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBhY3Rpb24gPT4gc3RyaWN0QWN0aW9uSW1tdXRhYmlsaXR5ICYmICFpZ25vcmVOZ3J4QWN0aW9uKGFjdGlvbikpLAogICAgICAgICAgICBzdGF0ZTogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gc3RyaWN0U3RhdGVJbW11dGFiaWxpdHkpLAogICAgICAgIH0pCiAgICAgICAgOiByZWR1Y2VyKTsKfQovKioKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlnbm9yZU5ncnhBY3Rpb24oYWN0aW9uKSB7CiAgICByZXR1cm4gYWN0aW9uLnR5cGUuc3RhcnRzV2l0aCgnQG5ncngnKTsKfQovKioKICogQHBhcmFtIHs/fSBfXzAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUluTmdab25lQ2hlY2tNZXRhUmVkdWNlcih7IHN0cmljdEFjdGlvbldpdGhpbk5nWm9uZSwgfSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVkdWNlciA9PiBzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmUKICAgICAgICA/IGluTmdab25lQXNzZXJ0TWV0YVJlZHVjZXIocmVkdWNlciwgewogICAgICAgICAgICBhY3Rpb246ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFjdGlvbiA9PiBzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmUgJiYgIWlnbm9yZU5ncnhBY3Rpb24oYWN0aW9uKSksCiAgICAgICAgfSkKICAgICAgICA6IHJlZHVjZXIpOwp9Ci8qKgogKiBAcGFyYW0gez89fSBydW50aW1lQ2hlY2tzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwcm92aWRlUnVudGltZUNoZWNrcyhydW50aW1lQ2hlY2tzKSB7CiAgICByZXR1cm4gWwogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogX1VTRVJfUlVOVElNRV9DSEVDS1MsCiAgICAgICAgICAgIHVzZVZhbHVlOiBydW50aW1lQ2hlY2tzLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBwcm92aWRlOiBVU0VSX1JVTlRJTUVfQ0hFQ0tTLAogICAgICAgICAgICB1c2VGYWN0b3J5OiBfcnVudGltZUNoZWNrc0ZhY3RvcnksCiAgICAgICAgICAgIGRlcHM6IFtfVVNFUl9SVU5USU1FX0NIRUNLU10sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHByb3ZpZGU6IF9BQ1RJVkVfUlVOVElNRV9DSEVDS1MsCiAgICAgICAgICAgIGRlcHM6IFtVU0VSX1JVTlRJTUVfQ0hFQ0tTXSwKICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlQWN0aXZlUnVudGltZUNoZWNrcywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUywKICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgIGRlcHM6IFtfQUNUSVZFX1JVTlRJTUVfQ0hFQ0tTXSwKICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlSW1tdXRhYmlsaXR5Q2hlY2tNZXRhUmVkdWNlciwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUywKICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgIGRlcHM6IFtfQUNUSVZFX1JVTlRJTUVfQ0hFQ0tTXSwKICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlU2VyaWFsaXphdGlvbkNoZWNrTWV0YVJlZHVjZXIsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHByb3ZpZGU6IE1FVEFfUkVEVUNFUlMsCiAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICBkZXBzOiBbX0FDVElWRV9SVU5USU1FX0NIRUNLU10sCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGNyZWF0ZUluTmdab25lQ2hlY2tNZXRhUmVkdWNlciwKICAgICAgICB9LAogICAgXTsKfQovKioKICogQHBhcmFtIHs/fSBydW50aW1lQ2hlY2tzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfcnVudGltZUNoZWNrc0ZhY3RvcnkocnVudGltZUNoZWNrcykgewogICAgcmV0dXJuIHJ1bnRpbWVDaGVja3M7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3N0b3JlX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBTdG9yZVJvb3RNb2R1bGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIkCiAgICAgKiBAcGFyYW0gez99IHNjYW5uZWRBY3Rpb25zJAogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICogQHBhcmFtIHs/fSBndWFyZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihhY3Rpb25zJCwgcmVkdWNlciQsIHNjYW5uZWRBY3Rpb25zJCwgc3RvcmUsIGd1YXJkKSB7CiAgICB9Cn0KU3RvcmVSb290TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogU3RvcmVSb290TW9kdWxlIH0pOwpTdG9yZVJvb3RNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBTdG9yZVJvb3RNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RvcmVSb290TW9kdWxlKSjJtcm1aW5qZWN0KEFjdGlvbnNTdWJqZWN0KSwgybXJtWluamVjdChSZWR1Y2VyT2JzZXJ2YWJsZSksIMm1ybVpbmplY3QoU2Nhbm5lZEFjdGlvbnNTdWJqZWN0KSwgybXJtWluamVjdChTdG9yZSksIMm1ybVpbmplY3QoX1JPT1RfU1RPUkVfR1VBUkQsIDgpKTsgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovClN0b3JlUm9vdE1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQWN0aW9uc1N1YmplY3QgfSwKICAgIHsgdHlwZTogUmVkdWNlck9ic2VydmFibGUgfSwKICAgIHsgdHlwZTogU2Nhbm5lZEFjdGlvbnNTdWJqZWN0IH0sCiAgICB7IHR5cGU6IFN0b3JlIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtfUk9PVF9TVE9SRV9HVUFSRCxdIH1dIH0KXTsKY2xhc3MgU3RvcmVGZWF0dXJlTW9kdWxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmZWF0dXJlcwogICAgICogQHBhcmFtIHs/fSBmZWF0dXJlUmVkdWNlcnMKICAgICAqIEBwYXJhbSB7P30gcmVkdWNlck1hbmFnZXIKICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICovCiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlcywgZmVhdHVyZVJlZHVjZXJzLCByZWR1Y2VyTWFuYWdlciwgcm9vdCkgewogICAgICAgIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKICAgICAgICB0aGlzLmZlYXR1cmVSZWR1Y2VycyA9IGZlYXR1cmVSZWR1Y2VyczsKICAgICAgICB0aGlzLnJlZHVjZXJNYW5hZ2VyID0gcmVkdWNlck1hbmFnZXI7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZlYXRzID0gZmVhdHVyZXMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmUKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZmVhdHVyZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmZWF0dXJlUmVkdWNlckNvbGxlY3Rpb24gPSBmZWF0dXJlUmVkdWNlcnMuc2hpZnQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWR1Y2VycyA9ICgvKiogQHR5cGUgez99ICovIChmZWF0dXJlUmVkdWNlckNvbGxlY3Rpb24gLypUT0RPKCM4MjMpKi8pKVtpbmRleF07CiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZlYXR1cmUpLCB7IHJlZHVjZXJzLCBpbml0aWFsU3RhdGU6IF9pbml0aWFsU3RhdGVGYWN0b3J5KGZlYXR1cmUuaW5pdGlhbFN0YXRlKSB9KTsKICAgICAgICB9KSk7CiAgICAgICAgcmVkdWNlck1hbmFnZXIuYWRkRmVhdHVyZXMoZmVhdHMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLnJlZHVjZXJNYW5hZ2VyLnJlbW92ZUZlYXR1cmVzKHRoaXMuZmVhdHVyZXMpOwogICAgfQp9ClN0b3JlRmVhdHVyZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFN0b3JlRmVhdHVyZU1vZHVsZSB9KTsKU3RvcmVGZWF0dXJlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gU3RvcmVGZWF0dXJlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFN0b3JlRmVhdHVyZU1vZHVsZSkoybXJtWluamVjdChfU1RPUkVfRkVBVFVSRVMpLCDJtcm1aW5qZWN0KEZFQVRVUkVfUkVEVUNFUlMpLCDJtcm1aW5qZWN0KFJlZHVjZXJNYW5hZ2VyKSwgybXJtWluamVjdChTdG9yZVJvb3RNb2R1bGUpKTsgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovClN0b3JlRmVhdHVyZU1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW19TVE9SRV9GRUFUVVJFUyxdIH1dIH0sCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtGRUFUVVJFX1JFRFVDRVJTLF0gfV0gfSwKICAgIHsgdHlwZTogUmVkdWNlck1hbmFnZXIgfSwKICAgIHsgdHlwZTogU3RvcmVSb290TW9kdWxlIH0KXTsKY2xhc3MgU3RvcmVNb2R1bGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJzCiAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBmb3JSb290KHJlZHVjZXJzLCBjb25maWcgPSB7fSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5nTW9kdWxlOiBTdG9yZVJvb3RNb2R1bGUsCiAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9ST09UX1NUT1JFX0dVQVJELAogICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9wcm92aWRlRm9yUm9vdEd1YXJkLAogICAgICAgICAgICAgICAgICAgIGRlcHM6IFtbU3RvcmUsIG5ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKV1dLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogX0lOSVRJQUxfU1RBVEUsIHVzZVZhbHVlOiBjb25maWcuaW5pdGlhbFN0YXRlIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSU5JVElBTF9TVEFURSwKICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBfaW5pdGlhbFN0YXRlRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICBkZXBzOiBbX0lOSVRJQUxfU1RBVEVdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogX0lOSVRJQUxfUkVEVUNFUlMsIHVzZVZhbHVlOiByZWR1Y2VycyB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9TVE9SRV9SRURVQ0VSUywKICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogcmVkdWNlcnMgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbiA/IHJlZHVjZXJzIDogX0lOSVRJQUxfUkVEVUNFUlMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IElOSVRJQUxfUkVEVUNFUlMsCiAgICAgICAgICAgICAgICAgICAgZGVwczogW0luamVjdG9yLCBfSU5JVElBTF9SRURVQ0VSUywgW25ldyBJbmplY3QoX1NUT1JFX1JFRFVDRVJTKV1dLAogICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jcmVhdGVTdG9yZVJlZHVjZXJzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBVU0VSX1BST1ZJREVEX01FVEFfUkVEVUNFUlMsCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZy5tZXRhUmVkdWNlcnMgPyBjb25maWcubWV0YVJlZHVjZXJzIDogW10sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9SRVNPTFZFRF9NRVRBX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgIGRlcHM6IFtNRVRBX1JFRFVDRVJTLCBVU0VSX1BST1ZJREVEX01FVEFfUkVEVUNFUlNdLAogICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jb25jYXRNZXRhUmVkdWNlcnMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9SRURVQ0VSX0ZBQ1RPUlksCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZy5yZWR1Y2VyRmFjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy5yZWR1Y2VyRmFjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICA6IGNvbWJpbmVSZWR1Y2VycywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogUkVEVUNFUl9GQUNUT1JZLAogICAgICAgICAgICAgICAgICAgIGRlcHM6IFtfUkVEVUNFUl9GQUNUT1JZLCBfUkVTT0xWRURfTUVUQV9SRURVQ0VSU10sCiAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlUmVkdWNlckZhY3RvcnksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQUNUSU9OU19TVUJKRUNUX1BST1ZJREVSUywKICAgICAgICAgICAgICAgIFJFRFVDRVJfTUFOQUdFUl9QUk9WSURFUlMsCiAgICAgICAgICAgICAgICBTQ0FOTkVEX0FDVElPTlNfU1VCSkVDVF9QUk9WSURFUlMsCiAgICAgICAgICAgICAgICBTVEFURV9QUk9WSURFUlMsCiAgICAgICAgICAgICAgICBTVE9SRV9QUk9WSURFUlMsCiAgICAgICAgICAgICAgICBwcm92aWRlUnVudGltZUNoZWNrcyhjb25maWcucnVudGltZUNoZWNrcyksCiAgICAgICAgICAgIF0sCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmZWF0dXJlTmFtZQogICAgICogQHBhcmFtIHs/fSByZWR1Y2VycwogICAgICogQHBhcmFtIHs/PX0gY29uZmlnCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZm9yRmVhdHVyZShmZWF0dXJlTmFtZSwgcmVkdWNlcnMsIGNvbmZpZyA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmdNb2R1bGU6IFN0b3JlRmVhdHVyZU1vZHVsZSwKICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX0ZFQVRVUkVfQ09ORklHUywKICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBTVE9SRV9GRUFUVVJFUywKICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZlYXR1cmVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VyRmFjdG9yeTogIShjb25maWcgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgJiYgY29uZmlnLnJlZHVjZXJGYWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy5yZWR1Y2VyRmFjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb21iaW5lUmVkdWNlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFSZWR1Y2VyczogIShjb25maWcgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgJiYgY29uZmlnLm1ldGFSZWR1Y2VycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcubWV0YVJlZHVjZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsU3RhdGU6ICEoY29uZmlnIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4pICYmIGNvbmZpZy5pbml0aWFsU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLmluaXRpYWxTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX1NUT1JFX0ZFQVRVUkVTLAogICAgICAgICAgICAgICAgICAgIGRlcHM6IFtJbmplY3RvciwgX0ZFQVRVUkVfQ09ORklHUywgU1RPUkVfRkVBVFVSRVNdLAogICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jcmVhdGVGZWF0dXJlU3RvcmUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBfRkVBVFVSRV9SRURVQ0VSUywgbXVsdGk6IHRydWUsIHVzZVZhbHVlOiByZWR1Y2VycyB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9GRUFUVVJFX1JFRFVDRVJTX1RPS0VOLAogICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiByZWR1Y2VycyBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuID8gcmVkdWNlcnMgOiBfRkVBVFVSRV9SRURVQ0VSUywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRkVBVFVSRV9SRURVQ0VSUywKICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBkZXBzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIEluamVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICBfRkVBVFVSRV9SRURVQ0VSUywKICAgICAgICAgICAgICAgICAgICAgICAgW25ldyBJbmplY3QoX0ZFQVRVUkVfUkVEVUNFUlNfVE9LRU4pXSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jcmVhdGVGZWF0dXJlUmVkdWNlcnMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICB9Cn0KU3RvcmVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTdG9yZU1vZHVsZSB9KTsKU3RvcmVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBTdG9yZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTdG9yZU1vZHVsZSkoKTsgfSB9KTsKLyoqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSByZWR1Y2VycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2NyZWF0ZVN0b3JlUmVkdWNlcnMoaW5qZWN0b3IsIHJlZHVjZXJzKSB7CiAgICByZXR1cm4gcmVkdWNlcnMgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbiA/IGluamVjdG9yLmdldChyZWR1Y2VycykgOiByZWR1Y2VyczsKfQovKioKICogQHBhcmFtIHs/fSBpbmplY3RvcgogKiBAcGFyYW0gez99IGNvbmZpZ3MKICogQHBhcmFtIHs/fSBmZWF0dXJlU3RvcmVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfY3JlYXRlRmVhdHVyZVN0b3JlKGluamVjdG9yLCBjb25maWdzLCBmZWF0dXJlU3RvcmVzKSB7CiAgICByZXR1cm4gZmVhdHVyZVN0b3Jlcy5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSBmZWF0CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZmVhdCwgaW5kZXgpID0+IHsKICAgICAgICBpZiAoY29uZmlnc1tpbmRleF0gaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbmYgPSBpbmplY3Rvci5nZXQoY29uZmlnc1tpbmRleF0pOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAga2V5OiBmZWF0LmtleSwKICAgICAgICAgICAgICAgIHJlZHVjZXJGYWN0b3J5OiBjb25mLnJlZHVjZXJGYWN0b3J5CiAgICAgICAgICAgICAgICAgICAgPyBjb25mLnJlZHVjZXJGYWN0b3J5CiAgICAgICAgICAgICAgICAgICAgOiBjb21iaW5lUmVkdWNlcnMsCiAgICAgICAgICAgICAgICBtZXRhUmVkdWNlcnM6IGNvbmYubWV0YVJlZHVjZXJzID8gY29uZi5tZXRhUmVkdWNlcnMgOiBbXSwKICAgICAgICAgICAgICAgIGluaXRpYWxTdGF0ZTogY29uZi5pbml0aWFsU3RhdGUsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBmZWF0OwogICAgfSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30gcmVkdWNlckNvbGxlY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9jcmVhdGVGZWF0dXJlUmVkdWNlcnMoaW5qZWN0b3IsIHJlZHVjZXJDb2xsZWN0aW9uKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWR1Y2VycyA9IHJlZHVjZXJDb2xsZWN0aW9uLm1hcCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZHVjZXIgPT4gewogICAgICAgIHJldHVybiByZWR1Y2VyIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4gPyBpbmplY3Rvci5nZXQocmVkdWNlcikgOiByZWR1Y2VyOwogICAgfSkpOwogICAgcmV0dXJuIHJlZHVjZXJzOwp9Ci8qKgogKiBAcGFyYW0gez99IGluaXRpYWxTdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2luaXRpYWxTdGF0ZUZhY3RvcnkoaW5pdGlhbFN0YXRlKSB7CiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybiBpbml0aWFsU3RhdGUoKTsKICAgIH0KICAgIHJldHVybiBpbml0aWFsU3RhdGU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWV0YVJlZHVjZXJzCiAqIEBwYXJhbSB7P30gdXNlclByb3ZpZGVkTWV0YVJlZHVjZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfY29uY2F0TWV0YVJlZHVjZXJzKG1ldGFSZWR1Y2VycywgdXNlclByb3ZpZGVkTWV0YVJlZHVjZXJzKSB7CiAgICByZXR1cm4gbWV0YVJlZHVjZXJzLmNvbmNhdCh1c2VyUHJvdmlkZWRNZXRhUmVkdWNlcnMpOwp9Ci8qKgogKiBAcGFyYW0gez99IHN0b3JlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfcHJvdmlkZUZvclJvb3RHdWFyZChzdG9yZSkgewogICAgaWYgKHN0b3JlKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU3RvcmVNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gRmVhdHVyZSBtb2R1bGVzIHNob3VsZCB1c2UgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgpIGluc3RlYWQuYCk7CiAgICB9CiAgICByZXR1cm4gJ2d1YXJkZWQnOwp9Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEFzc29jaWF0ZXMgYWN0aW9ucyB3aXRoIGEgZ2l2ZW4gc3RhdGUgY2hhbmdlIGZ1bmN0aW9uLgogKiBBIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiBtdXN0IGJlIHByb3ZpZGVkIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KICoKICogQHBhcmFtIHsuLi4/fSBhcmdzIGBBY3Rpb25DcmVhdG9yYCdzIGZvbGxvd2VkIGJ5IGEgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uLgogKgogKiAqKlRvIG1haW50YWluIHR5cGUtc2FmZXR5Kio6IHBhc3MgMTAgb3IgbGVzcyBgQWN0aW9uQ3JlYXRvcmAncy4KICogQHJldHVybiB7P30gYW4gYXNzb2NpYXRpb24gb2YgYWN0aW9uIHR5cGVzIHdpdGggYSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24uCiAqLwpmdW5jdGlvbiBvbiguLi5hcmdzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWR1Y2VyID0gKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3MucG9wKCkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHR5cGVzID0gYXJncy5yZWR1Y2UoKC8qKgogICAgICogQHBhcmFtIHs/fSByZXN1bHQKICAgICAqIEBwYXJhbSB7P30gY3JlYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJlc3VsdCwgY3JlYXRvcikgPT4gWy4uLnJlc3VsdCwgKCgvKiogQHR5cGUgez99ICovIChjcmVhdG9yKSkpLnR5cGVdKSwgKC8qKiBAdHlwZSB7P30gKi8gKFtdKSkpOwogICAgcmV0dXJuIHsgcmVkdWNlciwgdHlwZXMgfTsKfQovKioKICogXEBkZXNjcmlwdGlvbgogKiBDcmVhdGVzIGEgcmVkdWNlciBmdW5jdGlvbiB0byBoYW5kbGUgc3RhdGUgdHJhbnNpdGlvbnMuCiAqCiAqIFJlZHVjZXIgY3JlYXRvcnMgcmVkdWNlIHRoZSBleHBsaWNpdG5lc3Mgb2YgcmVkdWNlciBmdW5jdGlvbnMgd2l0aCBzd2l0Y2ggc3RhdGVtZW50cy4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIC0gTXVzdCBiZSB1c2VkIHdpdGggYEFjdGlvbkNyZWF0b3JgJ3MgKHJldHVybmVkIGJ5IGBjcmVhdGVBY3Rpb25gKS4gIENhbm5vdCBiZSB1c2VkIHdpdGggY2xhc3MtYmFzZWQgYWN0aW9uIGNyZWF0b3JzLgogKiAtIEFuIGFjdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbnMuIEluIHRoaXMgY2FzZSB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KICogLSBUaGUgcmV0dXJuZWQgYEFjdGlvblJlZHVjZXJgIHNob3VsZCBhZGRpdGlvbmFsbHkgYmUgcmV0dXJuZWQgZnJvbSBhbiBleHBvcnRlZCBgcmVkdWNlcmAgZnVuY3Rpb24uCiAqIFRoaXMgaXMgYmVjYXVzZSBbZnVuY3Rpb24gY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWRdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9hb3QtY29tcGlsZXIjZnVuY3Rpb24tY2FsbHMtYXJlLW5vdC1zdXBwb3J0ZWQpIGJ5IHRoZSBBT1QgY29tcGlsZXIuCiAqCiAqICoqRGVjbGFyaW5nIGEgcmVkdWNlciBjcmVhdG9yIHdpdGggYW4gZXhwb3J0ZWQgcmVkdWNlciBmdW5jdGlvbioqCiAqCiAqIGBgYHRzCiAqIGNvbnN0IGZlYXR1cmVSZWR1Y2VyID0gY3JlYXRlUmVkdWNlcigKICogICBpbml0aWFsU3RhdGUsCiAqICAgb24oCiAqICAgICBmZWF0dXJlQWN0aW9ucy5hY3Rpb25PbmUsCiAqICAgICBmZWF0dXJlQWN0aW9ucy5hY3Rpb25Ud28sCiAqICAgICAoc3RhdGUsIHsgdXBkYXRlZFZhbHVlIH0pID0+ICh7IC4uLnN0YXRlLCBwcm9wOiB1cGRhdGVkVmFsdWUgfSkKICogICApLAogKiAgIG9uKGZlYXR1cmVBY3Rpb25zLmFjdGlvblRocmVlLCAoKSA9PiBpbml0aWFsU3RhdGUpOwogKiApOwogKgogKiBleHBvcnQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZTogU3RhdGUgfCB1bmRlZmluZWQsIGFjdGlvbjogQWN0aW9uKSB7CiAqICAgcmV0dXJuIGZlYXR1cmVSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pOwogKiB9CiAqIGBgYAogKiBAdGVtcGxhdGUgUywgQQogKiBAcGFyYW0gez99IGluaXRpYWxTdGF0ZSBQcm92aWRlcyBhIHN0YXRlIHZhbHVlIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIGB1bmRlZmluZWRgLCBhcyBpdCBpcyBpbml0aWFsbHkuCiAqIEBwYXJhbSB7Li4uP30gb25zIEFzc29jaWF0aW9ucyBiZXR3ZWVuIGFjdGlvbnMgYW5kIHN0YXRlIGNoYW5nZXMuCiAqIEByZXR1cm4gez99IEEgcmVkdWNlciBmdW5jdGlvbi4KICoKICovCmZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCAuLi5vbnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgIGZvciAobGV0IG9uIG9mIG9ucykgewogICAgICAgIGZvciAobGV0IHR5cGUgb2Ygb24udHlwZXMpIHsKICAgICAgICAgICAgaWYgKG1hcC5oYXModHlwZSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVkdWNlciA9ICgvKiogQHR5cGUgez99ICovIChtYXAuZ2V0KHR5cGUpKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXdSZWR1Y2VyID0gKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiBvbi5yZWR1Y2VyKGV4aXN0aW5nUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSwgYWN0aW9uKSk7CiAgICAgICAgICAgICAgICBtYXAuc2V0KHR5cGUsIG5ld1JlZHVjZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbWFwLnNldCh0eXBlLCBvbi5yZWR1Y2VyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez89fSBzdGF0ZQogICAgICogQHBhcmFtIHs/PX0gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWR1Y2VyID0gbWFwLmdldChhY3Rpb24udHlwZSk7CiAgICAgICAgcmV0dXJuIHJlZHVjZXIgPyByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIDogc3RhdGU7CiAgICB9KTsKfQoKLyoqCiAqIEBsaWNlbnNlIE5nUnggOS4xLjAKICogKGMpIDIwMTUtMjAxOCBCcmFuZG9uIFJvYmVydHMsIE1pa2UgUnlhbiwgUm9iIFdvcm1hbGQsIFZpY3RvciBTYXZraW4KICogTGljZW5zZTogTUlUCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IERFRkFVTFRfRUZGRUNUX0NPTkZJRyA9IHsKICAgIGRpc3BhdGNoOiB0cnVlLAogICAgdXNlRWZmZWN0c0Vycm9ySGFuZGxlcjogdHJ1ZSwKfTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDUkVBVEVfRUZGRUNUX01FVEFEQVRBX0tFWSA9ICdfX0BuZ3J4L2VmZmVjdHNfY3JlYXRlX18nOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RfY3JlYXRvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBkZXNjcmlwdGlvbgogKiBDcmVhdGVzIGFuIGVmZmVjdCBmcm9tIGFuIGBPYnNlcnZhYmxlYCBhbmQgYW4gYEVmZmVjdENvbmZpZ2AuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAqKiBNYXBwaW5nIHRvIGEgZGlmZmVyZW50IGFjdGlvbiAqKgogKiBgYGB0cwogKiBlZmZlY3ROYW1lJCA9IGNyZWF0ZUVmZmVjdCgKICogICAoKSA9PiB0aGlzLmFjdGlvbnMkLnBpcGUoCiAqICAgICBvZlR5cGUoRmVhdHVyZUFjdGlvbnMuYWN0aW9uT25lKSwKICogICAgIG1hcCgoKSA9PiBGZWF0dXJlQWN0aW9ucy5hY3Rpb25Ud28oKSkKICogICApCiAqICk7CiAqIGBgYAogKgogKiAgKiogTm9uLWRpc3BhdGNoaW5nIGVmZmVjdHMgKioKICogYGBgdHMKICogZWZmZWN0TmFtZSQgPSBjcmVhdGVFZmZlY3QoCiAqICAgKCkgPT4gdGhpcy5hY3Rpb25zJC5waXBlKAogKiAgICAgb2ZUeXBlKEZlYXR1cmVBY3Rpb25zLmFjdGlvbk9uZSksCiAqICAgICB0YXAoKCkgPT4gY29uc29sZS5sb2coJ0FjdGlvbiBPbmUgRGlzcGF0Y2hlZCcpKQogKiAgICksCiAqICAgeyBkaXNwYXRjaDogZmFsc2UgfQogKiAgIC8vIEZlYXR1cmVBY3Rpb25zLmFjdGlvbk9uZSBpcyBub3QgZGlzcGF0Y2hlZAogKiApOwogKiBgYGAKICogQHRlbXBsYXRlIEMsIERULCBPVCwgUgogKiBAcGFyYW0gez99IHNvdXJjZSBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gYE9ic2VydmFibGVgLgogKiBAcGFyYW0gez89fSBjb25maWcgQSBgUGFydGlhbDxFZmZlY3RDb25maWc+YCB0byBjb25maWd1cmUgdGhlIGVmZmVjdC4gIEJ5IGRlZmF1bHQsIGBkaXNwYXRjaGAgaXMgdHJ1ZSBhbmQgYHVzZUVmZmVjdHNFcnJvckhhbmRsZXJgIGlzIHRydWUuCiAqIEByZXR1cm4gez99IElmIGBFZmZlY3RDb25maWdgI2BkaXNwYXRjaGAgaXMgdHJ1ZSwgcmV0dXJucyBgT2JzZXJ2YWJsZTxBY3Rpb24+YC4gIEVsc2UsIHJldHVybnMgYE9ic2VydmFibGU8dW5rbm93bj5gLgogKgogKi8KZnVuY3Rpb24gY3JlYXRlRWZmZWN0KHNvdXJjZSwgY29uZmlnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlZmZlY3QgPSBzb3VyY2UoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0VGRkVDVF9DT05GSUcpLCBjb25maWcpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVmZmVjdCwgQ1JFQVRFX0VGRkVDVF9NRVRBREFUQV9LRVksIHsKICAgICAgICB2YWx1ZSwKICAgIH0pOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChlZmZlY3QpKTsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBpbnN0YW5jZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Q3JlYXRlRWZmZWN0TWV0YWRhdGEoaW5zdGFuY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5zdGFuY2UpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXRhZGF0YSA9IHByb3BlcnR5TmFtZXMKICAgICAgICAuZmlsdGVyKCgvKioKICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9wZXJ0eU5hbWUgPT4gaW5zdGFuY2VbcHJvcGVydHlOYW1lXSAmJgogICAgICAgIGluc3RhbmNlW3Byb3BlcnR5TmFtZV0uaGFzT3duUHJvcGVydHkoQ1JFQVRFX0VGRkVDVF9NRVRBREFUQV9LRVkpKSkKICAgICAgICAubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9wZXJ0eU5hbWUgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRhRGF0YSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoaW5zdGFuY2VbcHJvcGVydHlOYW1lXSkpKVtDUkVBVEVfRUZGRUNUX01FVEFEQVRBX0tFWV07CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBwcm9wZXJ0eU5hbWUgfSwgbWV0YURhdGEpOwogICAgfSkpOwogICAgcmV0dXJuIG1ldGFkYXRhOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRTb3VyY2VGb3JJbnN0YW5jZShpbnN0YW5jZSkgewogICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvZWZmZWN0X2RlY29yYXRvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE1FVEFEQVRBX0tFWSA9ICdfX0BuZ3J4L2VmZmVjdHNfXyc7Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRFZmZlY3REZWNvcmF0b3JNZXRhZGF0YShpbnN0YW5jZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZWZmZWN0c0RlY29yYXRvcnMgPSBjb21wb3NlKGdldEVmZmVjdE1ldGFkYXRhRW50cmllcywgZ2V0U291cmNlRm9ySW5zdGFuY2UpKGluc3RhbmNlKTsKICAgIHJldHVybiBlZmZlY3RzRGVjb3JhdG9yczsKfQovKioKICogVHlwZSBndWFyZCB0byBkZXRlbWluZSB3aGV0aGVyIE1FVEFEQVRBX0tFWSBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIENsYXNzCiAqIGNvbnN0cnVjdG9yCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gc291cmNlUHJvdG8KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc01ldGFkYXRhRW50cmllcyhzb3VyY2VQcm90bykgewogICAgcmV0dXJuIHNvdXJjZVByb3RvLmNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KE1FVEFEQVRBX0tFWSk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gc291cmNlUHJvdG8KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEVmZmVjdE1ldGFkYXRhRW50cmllcyhzb3VyY2VQcm90bykgewogICAgcmV0dXJuIGhhc01ldGFkYXRhRW50cmllcyhzb3VyY2VQcm90bykKICAgICAgICA/IHNvdXJjZVByb3RvLmNvbnN0cnVjdG9yW01FVEFEQVRBX0tFWV0KICAgICAgICA6IFtdOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRTb3VyY2VNZXRhZGF0YShpbnN0YW5jZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZWZmZWN0cyA9IFsKICAgICAgICBnZXRFZmZlY3REZWNvcmF0b3JNZXRhZGF0YSwKICAgICAgICBnZXRDcmVhdGVFZmZlY3RNZXRhZGF0YSwKICAgIF07CiAgICByZXR1cm4gZWZmZWN0cy5yZWR1Y2UoKC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2VzCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHNvdXJjZXMsIHNvdXJjZSkgPT4gc291cmNlcy5jb25jYXQoc291cmNlKGluc3RhbmNlKSkpLCBbXSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvZWZmZWN0c19yZXNvbHZlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHBhcmFtIHs/fSBzb3VyY2VJbnN0YW5jZQogKiBAcGFyYW0gez99IGdsb2JhbEVycm9ySGFuZGxlcgogKiBAcGFyYW0gez99IGVmZmVjdHNFcnJvckhhbmRsZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1lcmdlRWZmZWN0cyhzb3VyY2VJbnN0YW5jZSwgZ2xvYmFsRXJyb3JIYW5kbGVyLCBlZmZlY3RzRXJyb3JIYW5kbGVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzb3VyY2VOYW1lID0gZ2V0U291cmNlRm9ySW5zdGFuY2Uoc291cmNlSW5zdGFuY2UpLmNvbnN0cnVjdG9yLm5hbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvYnNlcnZhYmxlcyQgPSBnZXRTb3VyY2VNZXRhZGF0YShzb3VyY2VJbnN0YW5jZSkubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoeyBwcm9wZXJ0eU5hbWUsIGRpc3BhdGNoLCB1c2VFZmZlY3RzRXJyb3JIYW5kbGVyLCB9KSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gdHlwZW9mIHNvdXJjZUluc3RhbmNlW3Byb3BlcnR5TmFtZV0gPT09ICdmdW5jdGlvbicKICAgICAgICAgICAgPyBzb3VyY2VJbnN0YW5jZVtwcm9wZXJ0eU5hbWVdKCkKICAgICAgICAgICAgOiBzb3VyY2VJbnN0YW5jZVtwcm9wZXJ0eU5hbWVdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlZmZlY3RBY3Rpb24kID0gdXNlRWZmZWN0c0Vycm9ySGFuZGxlcgogICAgICAgICAgICA/IGVmZmVjdHNFcnJvckhhbmRsZXIob2JzZXJ2YWJsZSQsIGdsb2JhbEVycm9ySGFuZGxlcikKICAgICAgICAgICAgOiBvYnNlcnZhYmxlJDsKICAgICAgICBpZiAoZGlzcGF0Y2ggPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBlZmZlY3RBY3Rpb24kLnBpcGUoaWdub3JlRWxlbWVudHMoKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRlcmlhbGl6ZWQkID0gZWZmZWN0QWN0aW9uJC5waXBlKG1hdGVyaWFsaXplKCkpOwogICAgICAgIHJldHVybiBtYXRlcmlhbGl6ZWQkLnBpcGUobWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vdGlmaWNhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG5vdGlmaWNhdGlvbikgPT4gKHsKICAgICAgICAgICAgZWZmZWN0OiBzb3VyY2VJbnN0YW5jZVtwcm9wZXJ0eU5hbWVdLAogICAgICAgICAgICBub3RpZmljYXRpb24sCiAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgc291cmNlSW5zdGFuY2UsCiAgICAgICAgfSkpKSk7CiAgICB9KSk7CiAgICByZXR1cm4gbWVyZ2UoLi4ub2JzZXJ2YWJsZXMkKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RzX2Vycm9yX2hhbmRsZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBNQVhfTlVNQkVSX09GX1JFVFJZX0FUVEVNUFRTID0gMTA7Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IG9ic2VydmFibGUkCiAqIEBwYXJhbSB7P30gZXJyb3JIYW5kbGVyCiAqIEBwYXJhbSB7Pz19IHJldHJ5QXR0ZW1wdExlZnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlZmF1bHRFZmZlY3RzRXJyb3JIYW5kbGVyKG9ic2VydmFibGUkLCBlcnJvckhhbmRsZXIsIHJldHJ5QXR0ZW1wdExlZnQgPSBNQVhfTlVNQkVSX09GX1JFVFJZX0FUVEVNUFRTKSB7CiAgICByZXR1cm4gb2JzZXJ2YWJsZSQucGlwZShjYXRjaEVycm9yKCgvKioKICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVycm9yID0+IHsKICAgICAgICBpZiAoZXJyb3JIYW5kbGVyKQogICAgICAgICAgICBlcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpOwogICAgICAgIGlmIChyZXRyeUF0dGVtcHRMZWZ0IDw9IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGUkOyAvLyBsYXN0IGF0dGVtcHQKICAgICAgICB9CiAgICAgICAgLy8gUmV0dXJuIG9ic2VydmFibGUgdGhhdCBwcm9kdWNlcyB0aGlzIHBhcnRpY3VsYXIgZWZmZWN0CiAgICAgICAgcmV0dXJuIGRlZmF1bHRFZmZlY3RzRXJyb3JIYW5kbGVyKG9ic2VydmFibGUkLCBlcnJvckhhbmRsZXIsIHJldHJ5QXR0ZW1wdExlZnQgLSAxKTsKICAgIH0pKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvYWN0aW9ucy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHRlbXBsYXRlIFYKICovCmNsYXNzIEFjdGlvbnMgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gc291cmNlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBSCiAgICAgKiBAcGFyYW0gez99IG9wZXJhdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsaWZ0KG9wZXJhdG9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgQWN0aW9ucygpOwogICAgICAgIG9ic2VydmFibGUuc291cmNlID0gdGhpczsKICAgICAgICBvYnNlcnZhYmxlLm9wZXJhdG9yID0gb3BlcmF0b3I7CiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7CiAgICB9Cn0KQWN0aW9ucy7JtWZhYyA9IGZ1bmN0aW9uIEFjdGlvbnNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQWN0aW9ucykoybXJtWluamVjdChTY2FubmVkQWN0aW9uc1N1YmplY3QpKTsgfTsKQWN0aW9ucy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBY3Rpb25zLCBmYWN0b3J5OiBBY3Rpb25zLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KQWN0aW9ucy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogT2JzZXJ2YWJsZSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbU2Nhbm5lZEFjdGlvbnNTdWJqZWN0LF0gfV0gfQpdOwovKioKICogQHBhcmFtIHsuLi4/fSBhbGxvd2VkVHlwZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG9mVHlwZSguLi5hbGxvd2VkVHlwZXMpIHsKICAgIHJldHVybiBmaWx0ZXIoKC8qKgogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChhY3Rpb24pID0+IGFsbG93ZWRUeXBlcy5zb21lKCgvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZU9yQWN0aW9uQ3JlYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PiB7CiAgICAgICAgaWYgKHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAvLyBDb21wYXJpbmcgdGhlIHN0cmluZyB0byB0eXBlCiAgICAgICAgICAgIHJldHVybiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBhY3Rpb24udHlwZTsKICAgICAgICB9CiAgICAgICAgLy8gV2UgYXJlIGZpbHRlcmluZyBieSBBY3Rpb25DcmVhdG9yCiAgICAgICAgcmV0dXJuIHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZSA9PT0gYWN0aW9uLnR5cGU7CiAgICB9KSkpKTsKfQovKioKICogQHBhcmFtIHs/fSBvdXRwdXQKICogQHBhcmFtIHs/fSByZXBvcnRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVwb3J0SW52YWxpZEFjdGlvbnMob3V0cHV0LCByZXBvcnRlcikgewogICAgaWYgKG91dHB1dC5ub3RpZmljYXRpb24ua2luZCA9PT0gJ04nKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFjdGlvbiA9IG91dHB1dC5ub3RpZmljYXRpb24udmFsdWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzSW52YWxpZEFjdGlvbiA9ICFpc0FjdGlvbihhY3Rpb24pOwogICAgICAgIGlmIChpc0ludmFsaWRBY3Rpb24pIHsKICAgICAgICAgICAgcmVwb3J0ZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBFZmZlY3QgJHtnZXRFZmZlY3ROYW1lKG91dHB1dCl9IGRpc3BhdGNoZWQgYW4gaW52YWxpZCBhY3Rpb246ICR7c3RyaW5naWZ5JDEoYWN0aW9uKX1gKSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGFjdGlvbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNBY3Rpb24oYWN0aW9uKSB7CiAgICByZXR1cm4gKHR5cGVvZiBhY3Rpb24gIT09ICdmdW5jdGlvbicgJiYKICAgICAgICBhY3Rpb24gJiYKICAgICAgICBhY3Rpb24udHlwZSAmJgogICAgICAgIHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3N0cmluZycpOwp9Ci8qKgogKiBAcGFyYW0gez99IF9fMAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RWZmZWN0TmFtZSh7IHByb3BlcnR5TmFtZSwgc291cmNlSW5zdGFuY2UsIHNvdXJjZU5hbWUsIH0pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTWV0aG9kID0gdHlwZW9mIHNvdXJjZUluc3RhbmNlW3Byb3BlcnR5TmFtZV0gPT09ICdmdW5jdGlvbic7CiAgICByZXR1cm4gYCIke3NvdXJjZU5hbWV9LiR7U3RyaW5nKHByb3BlcnR5TmFtZSl9JHtpc01ldGhvZCA/ICcoKScgOiAnJ30iYDsKfQovKioKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN0cmluZ2lmeSQxKGFjdGlvbikgewogICAgdHJ5IHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYWN0aW9uKTsKICAgIH0KICAgIGNhdGNoIChfYSkgewogICAgICAgIHJldHVybiBhY3Rpb247CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvbGlmZWN5Y2xlX2hvb2tzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3Qgb25JZGVudGlmeUVmZmVjdHNLZXkgPSAnbmdyeE9uSWRlbnRpZnlFZmZlY3RzJzsKLyoqCiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzT25JZGVudGlmeUVmZmVjdHMoaW5zdGFuY2UpIHsKICAgIHJldHVybiBpc0Z1bmN0aW9uJDIoaW5zdGFuY2UsIG9uSWRlbnRpZnlFZmZlY3RzS2V5KTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IG9uUnVuRWZmZWN0c0tleSA9ICduZ3J4T25SdW5FZmZlY3RzJzsKLyoqCiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzT25SdW5FZmZlY3RzKGluc3RhbmNlKSB7CiAgICByZXR1cm4gaXNGdW5jdGlvbiQyKGluc3RhbmNlLCBvblJ1bkVmZmVjdHNLZXkpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3Qgb25Jbml0RWZmZWN0cyA9ICduZ3J4T25Jbml0RWZmZWN0cyc7Ci8qKgogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc09uSW5pdEVmZmVjdHMoaW5zdGFuY2UpIHsKICAgIHJldHVybiBpc0Z1bmN0aW9uJDIoaW5zdGFuY2UsIG9uSW5pdEVmZmVjdHMpOwp9Ci8qKgogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEBwYXJhbSB7P30gZnVuY3Rpb25OYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0Z1bmN0aW9uJDIoaW5zdGFuY2UsIGZ1bmN0aW9uTmFtZSkgewogICAgcmV0dXJuIChpbnN0YW5jZSAmJgogICAgICAgIGZ1bmN0aW9uTmFtZSBpbiBpbnN0YW5jZSAmJgogICAgICAgIHR5cGVvZiBpbnN0YW5jZVtmdW5jdGlvbk5hbWVdID09PSAnZnVuY3Rpb24nKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy90b2tlbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfUk9PVF9FRkZFQ1RTX0dVQVJEID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9lZmZlY3RzIEludGVybmFsIFJvb3QgR3VhcmQnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJTU1FRElBVEVfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbmdyeC9lZmZlY3RzOiBJbW1lZGlhdGUgRWZmZWN0cycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFVTRVJfUFJPVklERURfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbmdyeC9lZmZlY3RzOiBVc2VyIFByb3ZpZGVkIEVmZmVjdHMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfUk9PVF9FRkZFQ1RTID0gbmV3IEluamVjdGlvblRva2VuKCduZ3J4L2VmZmVjdHM6IEludGVybmFsIFJvb3QgRWZmZWN0cycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFJPT1RfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbmdyeC9lZmZlY3RzOiBSb290IEVmZmVjdHMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfRkVBVFVSRV9FRkZFQ1RTID0gbmV3IEluamVjdGlvblRva2VuKCduZ3J4L2VmZmVjdHM6IEludGVybmFsIEZlYXR1cmUgRWZmZWN0cycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IEZFQVRVUkVfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbmdyeC9lZmZlY3RzOiBGZWF0dXJlIEVmZmVjdHMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFRkZFQ1RTX0VSUk9SX0hBTkRMRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ25ncngvZWZmZWN0czogRWZmZWN0cyBFcnJvciBIYW5kbGVyJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL2VmZmVjdF9zb3VyY2VzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEVmZmVjdFNvdXJjZXMgZXh0ZW5kcyBTdWJqZWN0IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvckhhbmRsZXIKICAgICAqIEBwYXJhbSB7P30gZWZmZWN0c0Vycm9ySGFuZGxlcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihlcnJvckhhbmRsZXIsIGVmZmVjdHNFcnJvckhhbmRsZXIpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOwogICAgICAgIHRoaXMuZWZmZWN0c0Vycm9ySGFuZGxlciA9IGVmZmVjdHNFcnJvckhhbmRsZXI7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWZmZWN0U291cmNlSW5zdGFuY2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEVmZmVjdHMoZWZmZWN0U291cmNlSW5zdGFuY2UpIHsKICAgICAgICB0aGlzLm5leHQoZWZmZWN0U291cmNlSW5zdGFuY2UpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b0FjdGlvbnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGlwZShncm91cEJ5KGdldFNvdXJjZUZvckluc3RhbmNlKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlJAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc291cmNlJCA9PiB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UkLnBpcGUoZ3JvdXBCeShlZmZlY3RzSW5zdGFuY2UpKTsKICAgICAgICB9KSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZSQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNvdXJjZSQgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVmZmVjdCQgPSBzb3VyY2UkLnBpcGUoZXhoYXVzdE1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlSW5zdGFuY2UKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNvdXJjZUluc3RhbmNlID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlRWZmZWN0U291cmNlKHRoaXMuZXJyb3JIYW5kbGVyLCB0aGlzLmVmZmVjdHNFcnJvckhhbmRsZXIpKHNvdXJjZUluc3RhbmNlKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG91dHB1dAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3V0cHV0ID0+IHsKICAgICAgICAgICAgICAgIHJlcG9ydEludmFsaWRBY3Rpb25zKG91dHB1dCwgdGhpcy5lcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5ub3RpZmljYXRpb247CiAgICAgICAgICAgIH0pKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBub3RpZmljYXRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChub3RpZmljYXRpb24pID0+IG5vdGlmaWNhdGlvbi5raW5kID09PSAnTicpKSwgZGVtYXRlcmlhbGl6ZSgpKTsKICAgICAgICAgICAgLy8gc3RhcnQgdGhlIHN0cmVhbSB3aXRoIGFuIElOSVQgYWN0aW9uCiAgICAgICAgICAgIC8vIGRvIHRoaXMgb25seSBmb3IgdGhlIGZpcnN0IEVmZmVjdCBpbnN0YW5jZQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluaXQkID0gc291cmNlJC5waXBlKHRha2UoMSksIGZpbHRlcihpc09uSW5pdEVmZmVjdHMpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbnN0YW5jZSA9PiBpbnN0YW5jZS5uZ3J4T25Jbml0RWZmZWN0cygpKSkpOwogICAgICAgICAgICByZXR1cm4gbWVyZ2UoZWZmZWN0JCwgaW5pdCQpOwogICAgICAgIH0pKSk7CiAgICB9Cn0KRWZmZWN0U291cmNlcy7JtWZhYyA9IGZ1bmN0aW9uIEVmZmVjdFNvdXJjZXNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRWZmZWN0U291cmNlcykoybXJtWluamVjdChFcnJvckhhbmRsZXIpLCDJtcm1aW5qZWN0KEVGRkVDVFNfRVJST1JfSEFORExFUikpOyB9OwpFZmZlY3RTb3VyY2VzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEVmZmVjdFNvdXJjZXMsIGZhY3Rvcnk6IEVmZmVjdFNvdXJjZXMuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpFZmZlY3RTb3VyY2VzLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFcnJvckhhbmRsZXIgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtFRkZFQ1RTX0VSUk9SX0hBTkRMRVIsXSB9XSB9Cl07Ci8qKgogKiBAcGFyYW0gez99IHNvdXJjZUluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlZmZlY3RzSW5zdGFuY2Uoc291cmNlSW5zdGFuY2UpIHsKICAgIGlmIChpc09uSWRlbnRpZnlFZmZlY3RzKHNvdXJjZUluc3RhbmNlKSkgewogICAgICAgIHJldHVybiBzb3VyY2VJbnN0YW5jZS5uZ3J4T25JZGVudGlmeUVmZmVjdHMoKTsKICAgIH0KICAgIHJldHVybiAnJzsKfQovKioKICogQHBhcmFtIHs/fSBlcnJvckhhbmRsZXIKICogQHBhcmFtIHs/fSBlZmZlY3RzRXJyb3JIYW5kbGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlRWZmZWN0U291cmNlKGVycm9ySGFuZGxlciwgZWZmZWN0c0Vycm9ySGFuZGxlcikgewogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gc291cmNlSW5zdGFuY2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNvdXJjZUluc3RhbmNlID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWVyZ2VkRWZmZWN0cyQgPSBtZXJnZUVmZmVjdHMoc291cmNlSW5zdGFuY2UsIGVycm9ySGFuZGxlciwgZWZmZWN0c0Vycm9ySGFuZGxlcik7CiAgICAgICAgaWYgKGlzT25SdW5FZmZlY3RzKHNvdXJjZUluc3RhbmNlKSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlSW5zdGFuY2UubmdyeE9uUnVuRWZmZWN0cyhtZXJnZWRFZmZlY3RzJCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXJnZWRFZmZlY3RzJDsKICAgIH0pOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL2VmZmVjdHNfcnVubmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEVmZmVjdHNSdW5uZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVmZmVjdFNvdXJjZXMKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqLwogICAgY29uc3RydWN0b3IoZWZmZWN0U291cmNlcywgc3RvcmUpIHsKICAgICAgICB0aGlzLmVmZmVjdFNvdXJjZXMgPSBlZmZlY3RTb3VyY2VzOwogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb24gPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGFydCgpIHsKICAgICAgICBpZiAoIXRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbikgewogICAgICAgICAgICB0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb24gPSB0aGlzLmVmZmVjdFNvdXJjZXMKICAgICAgICAgICAgICAgIC50b0FjdGlvbnMoKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN0b3JlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy5lZmZlY3RzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgfQp9CkVmZmVjdHNSdW5uZXIuybVmYWMgPSBmdW5jdGlvbiBFZmZlY3RzUnVubmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEVmZmVjdHNSdW5uZXIpKMm1ybVpbmplY3QoRWZmZWN0U291cmNlcyksIMm1ybVpbmplY3QoU3RvcmUpKTsgfTsKRWZmZWN0c1J1bm5lci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBFZmZlY3RzUnVubmVyLCBmYWN0b3J5OiBFZmZlY3RzUnVubmVyLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRWZmZWN0c1J1bm5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWZmZWN0U291cmNlcyB9LAogICAgeyB0eXBlOiBTdG9yZSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL2VmZmVjdHNfcm9vdF9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBST09UX0VGRkVDVFNfSU5JVCA9ICdAbmdyeC9lZmZlY3RzL2luaXQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IHJvb3RFZmZlY3RzSW5pdCA9IGNyZWF0ZUFjdGlvbihST09UX0VGRkVDVFNfSU5JVCk7CmNsYXNzIEVmZmVjdHNSb290TW9kdWxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2VzCiAgICAgKiBAcGFyYW0gez99IHJ1bm5lcgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICogQHBhcmFtIHs/fSByb290RWZmZWN0cwogICAgICogQHBhcmFtIHs/fSBzdG9yZVJvb3RNb2R1bGUKICAgICAqIEBwYXJhbSB7P30gc3RvcmVGZWF0dXJlTW9kdWxlCiAgICAgKiBAcGFyYW0gez99IGd1YXJkCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHNvdXJjZXMsIHJ1bm5lciwgc3RvcmUsIHJvb3RFZmZlY3RzLCBzdG9yZVJvb3RNb2R1bGUsIHN0b3JlRmVhdHVyZU1vZHVsZSwgZ3VhcmQpIHsKICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOwogICAgICAgIHJ1bm5lci5zdGFydCgpOwogICAgICAgIHJvb3RFZmZlY3RzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWZmZWN0U291cmNlSW5zdGFuY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVmZmVjdFNvdXJjZUluc3RhbmNlID0+IHNvdXJjZXMuYWRkRWZmZWN0cyhlZmZlY3RTb3VyY2VJbnN0YW5jZSkpKTsKICAgICAgICBzdG9yZS5kaXNwYXRjaCh7IHR5cGU6IFJPT1RfRUZGRUNUU19JTklUIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVmZmVjdFNvdXJjZUluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRFZmZlY3RzKGVmZmVjdFNvdXJjZUluc3RhbmNlKSB7CiAgICAgICAgdGhpcy5zb3VyY2VzLmFkZEVmZmVjdHMoZWZmZWN0U291cmNlSW5zdGFuY2UpOwogICAgfQp9CkVmZmVjdHNSb290TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRWZmZWN0c1Jvb3RNb2R1bGUgfSk7CkVmZmVjdHNSb290TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRWZmZWN0c1Jvb3RNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRWZmZWN0c1Jvb3RNb2R1bGUpKMm1ybVpbmplY3QoRWZmZWN0U291cmNlcyksIMm1ybVpbmplY3QoRWZmZWN0c1J1bm5lciksIMm1ybVpbmplY3QoU3RvcmUpLCDJtcm1aW5qZWN0KFJPT1RfRUZGRUNUUyksIMm1ybVpbmplY3QoU3RvcmVSb290TW9kdWxlLCA4KSwgybXJtWluamVjdChTdG9yZUZlYXR1cmVNb2R1bGUsIDgpLCDJtcm1aW5qZWN0KF9ST09UX0VGRkVDVFNfR1VBUkQsIDgpKTsgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkVmZmVjdHNSb290TW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFZmZlY3RTb3VyY2VzIH0sCiAgICB7IHR5cGU6IEVmZmVjdHNSdW5uZXIgfSwKICAgIHsgdHlwZTogU3RvcmUgfSwKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW1JPT1RfRUZGRUNUUyxdIH1dIH0sCiAgICB7IHR5cGU6IFN0b3JlUm9vdE1vZHVsZSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogU3RvcmVGZWF0dXJlTW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbX1JPT1RfRUZGRUNUU19HVUFSRCxdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvZWZmZWN0c19mZWF0dXJlX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBFZmZlY3RzRmVhdHVyZU1vZHVsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICogQHBhcmFtIHs/fSBlZmZlY3RTb3VyY2VHcm91cHMKICAgICAqIEBwYXJhbSB7P30gc3RvcmVSb290TW9kdWxlCiAgICAgKiBAcGFyYW0gez99IHN0b3JlRmVhdHVyZU1vZHVsZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihyb290LCBlZmZlY3RTb3VyY2VHcm91cHMsIHN0b3JlUm9vdE1vZHVsZSwgc3RvcmVGZWF0dXJlTW9kdWxlKSB7CiAgICAgICAgZWZmZWN0U291cmNlR3JvdXBzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZ3JvdXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdyb3VwID0+IGdyb3VwLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWZmZWN0U291cmNlSW5zdGFuY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVmZmVjdFNvdXJjZUluc3RhbmNlID0+IHJvb3QuYWRkRWZmZWN0cyhlZmZlY3RTb3VyY2VJbnN0YW5jZSkpKSkpOwogICAgfQp9CkVmZmVjdHNGZWF0dXJlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRWZmZWN0c0ZlYXR1cmVNb2R1bGUgfSk7CkVmZmVjdHNGZWF0dXJlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRWZmZWN0c0ZlYXR1cmVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRWZmZWN0c0ZlYXR1cmVNb2R1bGUpKMm1ybVpbmplY3QoRWZmZWN0c1Jvb3RNb2R1bGUpLCDJtcm1aW5qZWN0KEZFQVRVUkVfRUZGRUNUUyksIMm1ybVpbmplY3QoU3RvcmVSb290TW9kdWxlLCA4KSwgybXJtWluamVjdChTdG9yZUZlYXR1cmVNb2R1bGUsIDgpKTsgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkVmZmVjdHNGZWF0dXJlTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFZmZlY3RzUm9vdE1vZHVsZSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRkVBVFVSRV9FRkZFQ1RTLF0gfV0gfSwKICAgIHsgdHlwZTogU3RvcmVSb290TW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBTdG9yZUZlYXR1cmVNb2R1bGUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvZWZmZWN0c19tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgRWZmZWN0c01vZHVsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IGZlYXR1cmVFZmZlY3RzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZm9yRmVhdHVyZShmZWF0dXJlRWZmZWN0cyA9IFtdKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmdNb2R1bGU6IEVmZmVjdHNGZWF0dXJlTW9kdWxlLAogICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgIGZlYXR1cmVFZmZlY3RzLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9GRUFUVVJFX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGZlYXR1cmVFZmZlY3RzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBVU0VSX1BST1ZJREVEX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IFtdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGRUFUVVJFX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlRWZmZWN0cywKICAgICAgICAgICAgICAgICAgICBkZXBzOiBbSW5qZWN0b3IsIF9GRUFUVVJFX0VGRkVDVFMsIFVTRVJfUFJPVklERURfRUZGRUNUU10sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IHJvb3RFZmZlY3RzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZm9yUm9vdChyb290RWZmZWN0cyA9IFtdKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmdNb2R1bGU6IEVmZmVjdHNSb290TW9kdWxlLAogICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBfUk9PVF9FRkZFQ1RTX0dVQVJELAogICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9wcm92aWRlRm9yUm9vdEd1YXJkJDEsCiAgICAgICAgICAgICAgICAgICAgZGVwczogW1tFZmZlY3RzUnVubmVyLCBuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCldXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRUZGRUNUU19FUlJPUl9IQU5ETEVSLAogICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBkZWZhdWx0RWZmZWN0c0Vycm9ySGFuZGxlciwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBFZmZlY3RzUnVubmVyLAogICAgICAgICAgICAgICAgRWZmZWN0U291cmNlcywKICAgICAgICAgICAgICAgIEFjdGlvbnMsCiAgICAgICAgICAgICAgICByb290RWZmZWN0cywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBfUk9PVF9FRkZFQ1RTLAogICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBbcm9vdEVmZmVjdHNdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBVU0VSX1BST1ZJREVEX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IFtdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBST09UX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlRWZmZWN0cywKICAgICAgICAgICAgICAgICAgICBkZXBzOiBbSW5qZWN0b3IsIF9ST09UX0VGRkVDVFMsIFVTRVJfUFJPVklERURfRUZGRUNUU10sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICB9Cn0KRWZmZWN0c01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEVmZmVjdHNNb2R1bGUgfSk7CkVmZmVjdHNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBFZmZlY3RzTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEVmZmVjdHNNb2R1bGUpKCk7IH0gfSk7Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30gZWZmZWN0R3JvdXBzCiAqIEBwYXJhbSB7P30gdXNlclByb3ZpZGVkRWZmZWN0R3JvdXBzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVFZmZlY3RzKGluamVjdG9yLCBlZmZlY3RHcm91cHMsIHVzZXJQcm92aWRlZEVmZmVjdEdyb3VwcykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWVyZ2VkRWZmZWN0cyA9IFtdOwogICAgZm9yIChsZXQgZWZmZWN0R3JvdXAgb2YgZWZmZWN0R3JvdXBzKSB7CiAgICAgICAgbWVyZ2VkRWZmZWN0cy5wdXNoKC4uLmVmZmVjdEdyb3VwKTsKICAgIH0KICAgIGZvciAobGV0IHVzZXJQcm92aWRlZEVmZmVjdEdyb3VwIG9mIHVzZXJQcm92aWRlZEVmZmVjdEdyb3VwcykgewogICAgICAgIG1lcmdlZEVmZmVjdHMucHVzaCguLi51c2VyUHJvdmlkZWRFZmZlY3RHcm91cCk7CiAgICB9CiAgICByZXR1cm4gY3JlYXRlRWZmZWN0SW5zdGFuY2VzKGluamVjdG9yLCBtZXJnZWRFZmZlY3RzKTsKfQovKioKICogQHBhcmFtIHs/fSBpbmplY3RvcgogKiBAcGFyYW0gez99IGVmZmVjdHMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUVmZmVjdEluc3RhbmNlcyhpbmplY3RvciwgZWZmZWN0cykgewogICAgcmV0dXJuIGVmZmVjdHMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gZWZmZWN0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlZmZlY3QgPT4gaW5qZWN0b3IuZ2V0KGVmZmVjdCkpKTsKfQovKioKICogQHBhcmFtIHs/fSBydW5uZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9wcm92aWRlRm9yUm9vdEd1YXJkJDEocnVubmVyKSB7CiAgICBpZiAocnVubmVyKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRWZmZWN0c01vZHVsZS5mb3JSb290KCkgY2FsbGVkIHR3aWNlLiBGZWF0dXJlIG1vZHVsZXMgc2hvdWxkIHVzZSBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoKSBpbnN0ZWFkLmApOwogICAgfQogICAgcmV0dXJuICdndWFyZGVkJzsKfQoKLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyoqCiAqIFVzZXIgaGFzIGNsaWNrZWQgb24gYSBidXR0b24gaW4gdGhlIGhlYWRlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi4KICovCmNvbnN0IGNoYW5nZVBsdWdpbiA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFBsdWdpbiBDaGFuZ2VkJywgcHJvcHMoKSk7Ci8qKgogKiBQbHVnaW4gaW5mb3JtYXRpb24gaW4gdGhlIGhhc2ggaXMgY2hhbmdlZCBieSB1c2VyIGFjdGlvbi4KICogZS5nLiwgdXNlciBjYW4gdXNlIGJyb3dzZXIgbmF2aWdhdGlvbiBidXR0b24gdG8gY2hhbmdlIHRoZSBoYXNoLgogKi8KY29uc3QgcGx1Z2luVXJsSGFzaENoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tDb3JlXSBQbHVnaW4gVXJsIEhhc2ggQ2hhbmdlZCcsIHByb3BzKCkpOwpjb25zdCBjb3JlTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gTG9hZGVkJyk7CmNvbnN0IG1hbnVhbFJlbG9hZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFVzZXIgVHJpZ2dlcmVkIFJlbG9hZCcpOwpjb25zdCByZWxvYWQgPSBjcmVhdGVBY3Rpb24oJ1tDb3JlXSBBdXRvIFJlbG9hZCcpOwpjb25zdCBwbHVnaW5zTGlzdGluZ1JlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFBsdWdpbkxpc3RpbmcgRmV0Y2ggUmVxdWVzdGVkJyk7CmNvbnN0IHBsdWdpbnNMaXN0aW5nTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGx1Z2luTGlzdGluZyBGZXRjaCBTdWNjZXNzZnVsJywgcHJvcHMoKSk7CmNvbnN0IHBsdWdpbnNMaXN0aW5nRmFpbGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGx1Z2luTGlzdGluZyBGZXRjaCBGYWlsZWQnKTsKLyoqCiAqIEFjdGlvbiBmb3Igd2hlbiBFbnZpcm9ubWVudCBkYXRhIGhhcyBiZWVuIGxvYWRlZCBmcm9tIHRoZSBXZWJBcHAgc2VydmVyLgogKi8KY29uc3QgZW52aXJvbm1lbnRMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tDb3JlXSBFbnZpcm9ubWVudCBGZXRjaCBTdWNjZXNzZnVsJywgcHJvcHMoKSk7Ci8qKgogKiBBY3Rpb24gZm9yIHdoZW4gdXNlciB3YW50cyB0byBlbmFibGUvZGlzYWJsZSByZWxvYWQuCiAqLwpjb25zdCB0b2dnbGVSZWxvYWRFbmFibGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUmVsb2FkIEVuYWJsZSBUb2dnbGVkJyk7Ci8qKgogKiBBY3Rpb24gZm9yIHdoZW4gdXNlciB3YW50cyB0byBjaGFuZ2UgdGhlIHJlbG9hZCBwZXJpb2QuCiAqLwpjb25zdCBjaGFuZ2VSZWxvYWRQZXJpb2QgPSBjcmVhdGVBY3Rpb24oJ1tDb3JlXSBSZWxvYWQgUGVyaW9kIENoYW5nZScsIHByb3BzKCkpOwovKioKICogQWN0aW9uIGZvciB3aGVuIHVzZXIgd2FudHMgdG8gYW4gaXRlbSBjb3VudCBpbiBhIHBhZ2Ugb2YgYSBwYWdpbmF0ZWQgdmlldy4KICovCmNvbnN0IGNoYW5nZVBhZ2VTaXplID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGFnZSBTaXplIENoYW5nZScsIHByb3BzKCkpOwovKioKICogQWN0aW9uIGZvciB3aGVuIHVzZXIgd2FudHMgdG8gY2hhbmdlIHRoZSBydW5zIHNlbGVjdGlvbiBpbiB0aGUgdGYtcnVucy1zZWxlY3Rvci4KICoKICogQWN0aW9uIGlzIHJlc2VydmVkIGZvciB0aGUgd3JhcHBlciBmb3IgdGhlIFBvbHltZXIgYmFzZWQgdGYtcnVucy1zZWxlY3Rvci4KICovCmNvbnN0IHBvbHltZXJJbnRlcm9wUnVuU2VsZWN0aW9uQ2hhbmdlZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFJ1biBTZWxlY3Rpb24gQ2hhbmdlZCcsIHByb3BzKCkpOwpjb25zdCBmZXRjaFJ1blN1Y2NlZWRlZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFJ1biBGZXRjaCBTdWNjZXNzZnVsJywgcHJvcHMoKSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2tleWNvZGVzL2tleWNvZGVzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgVEFCID0gOTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFTlRFUiA9IDEzOwovKiogQHR5cGUgez99ICovCmNvbnN0IEVTQ0FQRSA9IDI3OwovKiogQHR5cGUgez99ICovCmNvbnN0IFNQQUNFID0gMzI7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUEFHRV9VUCA9IDMzOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBBR0VfRE9XTiA9IDM0OwovKiogQHR5cGUgez99ICovCmNvbnN0IEVORCA9IDM1OwovKiogQHR5cGUgez99ICovCmNvbnN0IEhPTUUgPSAzNjsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBMRUZUX0FSUk9XID0gMzc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVVBfQVJST1cgPSAzODsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBSSUdIVF9BUlJPVyA9IDM5OwovKiogQHR5cGUgez99ICovCmNvbnN0IERPV05fQVJST1cgPSA0MDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBaRVJPID0gNDg7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTklORSA9IDU3OwovKiogQHR5cGUgez99ICovCmNvbnN0IEEgPSA2NTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBaID0gOTA7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2tleWNvZGVzL21vZGlmaWVycy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIENoZWNrcyB3aGV0aGVyIGEgbW9kaWZpZXIga2V5IGlzIHByZXNzZWQuCiAqIEBwYXJhbSB7P30gZXZlbnQgRXZlbnQgdG8gYmUgY2hlY2tlZC4KICogQHBhcmFtIHsuLi4/fSBtb2RpZmllcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc01vZGlmaWVyS2V5KGV2ZW50LCAuLi5tb2RpZmllcnMpIHsKICAgIGlmIChtb2RpZmllcnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG1vZGlmaWVycy5zb21lKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1vZGlmaWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtb2RpZmllciA9PiBldmVudFttb2RpZmllcl0pKTsKICAgIH0KICAgIHJldHVybiBldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5Owp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqIENvZXJjZXMgYSBkYXRhLWJvdW5kIHZhbHVlICh0eXBpY2FsbHkgYSBzdHJpbmcpIHRvIGEgYm9vbGVhbi4gKi8KZnVuY3Rpb24gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KZnVuY3Rpb24gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIGZhbGxiYWNrVmFsdWUgPSAwKSB7CiAgICByZXR1cm4gX2lzTnVtYmVyVmFsdWUodmFsdWUpID8gTnVtYmVyKHZhbHVlKSA6IGZhbGxiYWNrVmFsdWU7Cn0KLyoqCiAqIFdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGNvbnNpZGVyZWQgYSBudW1iZXIuCiAqIEBkb2NzLXByaXZhdGUKICovCmZ1bmN0aW9uIF9pc051bWJlclZhbHVlKHZhbHVlKSB7CiAgICAvLyBwYXJzZUZsb2F0KHZhbHVlKSBoYW5kbGVzIG1vc3Qgb2YgdGhlIGNhc2VzIHdlJ3JlIGludGVyZXN0ZWQgaW4gKGl0IHRyZWF0cyBudWxsLCBlbXB0eSBzdHJpbmcsCiAgICAvLyBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMgYXMgTmFOLCB3aGVyZSBOdW1iZXIganVzdCB1c2VzIDApIGJ1dCBpdCBjb25zaWRlcnMgdGhlIHN0cmluZwogICAgLy8gJzEyM2hlbGxvJyB0byBiZSBhIHZhbGlkIG51bWJlci4gVGhlcmVmb3JlIHdlIGFsc28gY2hlY2sgaWYgTnVtYmVyKHZhbHVlKSBpcyBOYU4uCiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBjb2VyY2VBcnJheSh2YWx1ZSkgewogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqIENvZXJjZXMgYSB2YWx1ZSB0byBhIENTUyBwaXhlbCB2YWx1ZS4gKi8KZnVuY3Rpb24gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogYCR7dmFsdWV9cHhgOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIENvZXJjZXMgYW4gRWxlbWVudFJlZiBvciBhbiBFbGVtZW50IGludG8gYW4gZWxlbWVudC4KICogVXNlZnVsIGZvciBBUElzIHRoYXQgY2FuIGFjY2VwdCBlaXRoZXIgYSByZWYgb3IgdGhlIG5hdGl2ZSBlbGVtZW50IGl0c2VsZi4KICovCmZ1bmN0aW9uIGNvZXJjZUVsZW1lbnQoZWxlbWVudE9yUmVmKSB7CiAgICByZXR1cm4gZWxlbWVudE9yUmVmIGluc3RhbmNlb2YgRWxlbWVudFJlZiA/IGVsZW1lbnRPclJlZi5uYXRpdmVFbGVtZW50IDogZWxlbWVudE9yUmVmOwp9CgpsZXQgaGFzVjhCcmVha0l0ZXJhdG9yOwovLyBXZSBuZWVkIGEgdHJ5L2NhdGNoIGFyb3VuZCB0aGUgcmVmZXJlbmNlIHRvIGBJbnRsYCwgYmVjYXVzZSBhY2Nlc3NpbmcgaXQgaW4gc29tZSBjYXNlcyBjYW4KLy8gY2F1c2UgSUUgdG8gdGhyb3cuIFRoZXNlIGNhc2VzIGFyZSB0aWVkIHRvIHBhcnRpY3VsYXIgdmVyc2lvbnMgb2YgV2luZG93cyBhbmQgY2FuIGhhcHBlbiBpZgovLyB0aGUgY29uc3VtZXIgaXMgcHJvdmlkaW5nIGEgcG9seWZpbGxlZCBgTWFwYC4gU2VlOgovLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L0NoYWtyYUNvcmUvaXNzdWVzLzMxODkKLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTU2ODcKdHJ5IHsKICAgIGhhc1Y4QnJlYWtJdGVyYXRvciA9ICh0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCcgJiYgKCgvKiogQHR5cGUgez99ICovIChJbnRsKSkpLnY4QnJlYWtJdGVyYXRvcik7Cn0KY2F0Y2ggKF9hKSB7CiAgICBoYXNWOEJyZWFrSXRlcmF0b3IgPSBmYWxzZTsKfQovKioKICogU2VydmljZSB0byBkZXRlY3QgdGhlIGN1cnJlbnQgcGxhdGZvcm0gYnkgY29tcGFyaW5nIHRoZSB1c2VyQWdlbnQgc3RyaW5ncyBhbmQKICogY2hlY2tpbmcgYnJvd3Nlci1zcGVjaWZpYyBnbG9iYWwgcHJvcGVydGllcy4KICovCmNsYXNzIFBsYXRmb3JtIHsKICAgIC8qKgogICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAgcmVtb3ZlIG9wdGlvbmFsIGRlY29yYXRvcgogICAgICogQHBhcmFtIHs/PX0gX3BsYXRmb3JtSWQKICAgICAqLwogICAgY29uc3RydWN0b3IoX3BsYXRmb3JtSWQpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUlkID0gX3BsYXRmb3JtSWQ7CiAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgdGhlIEFuZ3VsYXIgcGxhdGZvcm0gY2hlY2sgYmVjYXVzZSBpZiB0aGUgRG9jdW1lbnQgaXMgc2hpbW1lZAogICAgICAgIC8vIHdpdGhvdXQgdGhlIG5hdmlnYXRvciwgdGhlIGZvbGxvd2luZyBjaGVja3Mgd2lsbCBmYWlsLiBUaGlzIGlzIHByZWZlcnJlZCBiZWNhdXNlCiAgICAgICAgLy8gc29tZXRpbWVzIHRoZSBEb2N1bWVudCBtYXkgYmUgc2hpbW1lZCB3aXRob3V0IHRoZSB1c2VyJ3Mga25vd2xlZGdlIG9yIGludGVudGlvbgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIEFuZ3VsYXIgYXBwbGljYXRpb24gaXMgYmVpbmcgcmVuZGVyZWQgaW4gdGhlIGJyb3dzZXIuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5pc0Jyb3dzZXIgPSB0aGlzLl9wbGF0Zm9ybUlkID8KICAgICAgICAgICAgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5fcGxhdGZvcm1JZCkgOiB0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnICYmICEhZG9jdW1lbnQ7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY3VycmVudCBicm93c2VyIGlzIE1pY3Jvc29mdCBFZGdlLgogICAgICAgICAqLwogICAgICAgIHRoaXMuRURHRSA9IHRoaXMuaXNCcm93c2VyICYmIC8oZWRnZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBpcyBNaWNyb3NvZnQgVHJpZGVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLlRSSURFTlQgPSB0aGlzLmlzQnJvd3NlciAmJiAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgIC8vIEVkZ2VIVE1MIGFuZCBUcmlkZW50IG1vY2sgQmxpbmsgc3BlY2lmaWMgdGhpbmdzIGFuZCBuZWVkIHRvIGJlIGV4Y2x1ZGVkIGZyb20gdGhpcyBjaGVjay4KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHJlbmRlcmluZyBlbmdpbmUgaXMgQmxpbmsuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5CTElOSyA9IHRoaXMuaXNCcm93c2VyICYmICghISgoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5jaHJvbWUgfHwgaGFzVjhCcmVha0l0ZXJhdG9yKSAmJgogICAgICAgICAgICB0eXBlb2YgQ1NTICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5FREdFICYmICF0aGlzLlRSSURFTlQpOwogICAgICAgIC8vIFdlYmtpdCBpcyBwYXJ0IG9mIHRoZSB1c2VyQWdlbnQgaW4gRWRnZUhUTUwsIEJsaW5rIGFuZCBUcmlkZW50LiBUaGVyZWZvcmUgd2UgbmVlZCB0bwogICAgICAgIC8vIGVuc3VyZSB0aGF0IFdlYmtpdCBydW5zIHN0YW5kYWxvbmUgYW5kIGlzIG5vdCB1c2VkIGFzIGFub3RoZXIgZW5naW5lJ3MgYmFzZS4KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHJlbmRlcmluZyBlbmdpbmUgaXMgV2ViS2l0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuV0VCS0lUID0gdGhpcy5pc0Jyb3dzZXIgJiYKICAgICAgICAgICAgL0FwcGxlV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhdGhpcy5CTElOSyAmJiAhdGhpcy5FREdFICYmICF0aGlzLlRSSURFTlQ7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBBcHBsZSBpT1MuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5JT1MgPSB0aGlzLmlzQnJvd3NlciAmJiAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJgogICAgICAgICAgICAhKCdNU1N0cmVhbScgaW4gd2luZG93KTsKICAgICAgICAvLyBJdCdzIGRpZmZpY3VsdCB0byBkZXRlY3QgdGhlIHBsYWluIEdlY2tvIGVuZ2luZSwgYmVjYXVzZSBtb3N0IG9mIHRoZSBicm93c2VycyBpZGVudGlmeQogICAgICAgIC8vIHRoZW0gc2VsZiBhcyBHZWNrby1saWtlIGJyb3dzZXJzIGFuZCBtb2RpZnkgdGhlIHVzZXJBZ2VudCdzIGFjY29yZGluZyB0byB0aGF0LgogICAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY292ZXIgb25lIGV4cGxpY2l0IEZpcmVmb3ggY2FzZSwgd2UgY2FuIHNpbXBseSBjaGVjayBmb3IgRmlyZWZveAogICAgICAgIC8vIGluc3RlYWQgb2YgaGF2aW5nIGFuIHVuc3RhYmxlIGNoZWNrIGZvciBHZWNrby4KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgaXMgRmlyZWZveC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLkZJUkVGT1ggPSB0aGlzLmlzQnJvd3NlciAmJiAvKGZpcmVmb3h8bWluZWZpZWxkKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBBbmRyb2lkLgogICAgICAgICAqLwogICAgICAgIC8vIFRyaWRlbnQgb24gbW9iaWxlIGFkZHMgdGhlIGFuZHJvaWQgcGxhdGZvcm0gdG8gdGhlIHVzZXJBZ2VudCB0byB0cmljayBkZXRlY3Rpb25zLgogICAgICAgIHRoaXMuQU5EUk9JRCA9IHRoaXMuaXNCcm93c2VyICYmIC9hbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhdGhpcy5UUklERU5UOwogICAgICAgIC8vIFNhZmFyaSBicm93c2VycyB3aWxsIGluY2x1ZGUgdGhlIFNhZmFyaSBrZXl3b3JkIGluIHRoZWlyIHVzZXJBZ2VudC4gU29tZSBicm93c2VycyBtYXkgZmFrZQogICAgICAgIC8vIHRoaXMgYW5kIGp1c3QgcGxhY2UgdGhlIFNhZmFyaSBrZXl3b3JkIGluIHRoZSB1c2VyQWdlbnQuIFRvIGJlIG1vcmUgc2FmZSBhYm91dCBTYWZhcmkgZXZlcnkKICAgICAgICAvLyBTYWZhcmkgYnJvd3NlciBzaG91bGQgYWxzbyB1c2UgV2Via2l0IGFzIGl0cyBsYXlvdXQgZW5naW5lLgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBTYWZhcmkuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5TQUZBUkkgPSB0aGlzLmlzQnJvd3NlciAmJiAvc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiB0aGlzLldFQktJVDsKICAgIH0KfQpQbGF0Zm9ybS7JtWZhYyA9IGZ1bmN0aW9uIFBsYXRmb3JtX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsYXRmb3JtKSjJtcm1aW5qZWN0KFBMQVRGT1JNX0lELCA4KSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpQbGF0Zm9ybS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogT2JqZWN0LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW1BMQVRGT1JNX0lELF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gUGxhdGZvcm0uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBQbGF0Zm9ybV9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IFBsYXRmb3JtKMm1ybVpbmplY3QoUExBVEZPUk1fSUQsIDgpKTsgfSwgdG9rZW46IFBsYXRmb3JtLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3BsYXRmb3JtL3BsYXRmb3JtLW1vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBQbGF0Zm9ybU1vZHVsZSB7Cn0KUGxhdGZvcm1Nb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBQbGF0Zm9ybU1vZHVsZSB9KTsKUGxhdGZvcm1Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBQbGF0Zm9ybU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQbGF0Zm9ybU1vZHVsZSkoKTsgfSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvcGxhdGZvcm0vZmVhdHVyZXMvaW5wdXQtdHlwZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBDYWNoZWQgcmVzdWx0IFNldCBvZiBpbnB1dCB0eXBlcyBzdXBwb3J0IGJ5IHRoZSBjdXJyZW50IGJyb3dzZXIuCiAqIEB0eXBlIHs/fQogKi8KbGV0IHN1cHBvcnRlZElucHV0VHlwZXM7Ci8qKgogKiBUeXBlcyBvZiBgPGlucHV0PmAgdGhhdCAqbWlnaHQqIGJlIHN1cHBvcnRlZC4KICogQHR5cGUgez99CiAqLwpjb25zdCBjYW5kaWRhdGVJbnB1dFR5cGVzID0gWwogICAgLy8gYGNvbG9yYCBtdXN0IGNvbWUgZmlyc3QuIENocm9tZSA1NiBzaG93cyBhIHdhcm5pbmcgaWYgd2UgY2hhbmdlIHRoZSB0eXBlIHRvIGBjb2xvcmAgYWZ0ZXIKICAgIC8vIGZpcnN0IGNoYW5naW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlOgogICAgLy8gVGhlIHNwZWNpZmllZCB2YWx1ZSAiIiBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQuCiAgICAvLyBUaGUgZm9ybWF0IGlzICIjcnJnZ2JiIiB3aGVyZSByciwgZ2csIGJiIGFyZSB0d28tZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVycy4KICAgICdjb2xvcicsCiAgICAnYnV0dG9uJywKICAgICdjaGVja2JveCcsCiAgICAnZGF0ZScsCiAgICAnZGF0ZXRpbWUtbG9jYWwnLAogICAgJ2VtYWlsJywKICAgICdmaWxlJywKICAgICdoaWRkZW4nLAogICAgJ2ltYWdlJywKICAgICdtb250aCcsCiAgICAnbnVtYmVyJywKICAgICdwYXNzd29yZCcsCiAgICAncmFkaW8nLAogICAgJ3JhbmdlJywKICAgICdyZXNldCcsCiAgICAnc2VhcmNoJywKICAgICdzdWJtaXQnLAogICAgJ3RlbCcsCiAgICAndGV4dCcsCiAgICAndGltZScsCiAgICAndXJsJywKICAgICd3ZWVrJywKXTsKLyoqCiAqIEByZXR1cm4gez99IFRoZSBpbnB1dCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLgogKi8KZnVuY3Rpb24gZ2V0U3VwcG9ydGVkSW5wdXRUeXBlcygpIHsKICAgIC8vIFJlc3VsdCBpcyBjYWNoZWQuCiAgICBpZiAoc3VwcG9ydGVkSW5wdXRUeXBlcykgewogICAgICAgIHJldHVybiBzdXBwb3J0ZWRJbnB1dFR5cGVzOwogICAgfQogICAgLy8gV2UgY2FuJ3QgY2hlY2sgaWYgYW4gaW5wdXQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHVudGlsIHdlJ3JlIG9uIHRoZSBicm93c2VyLCBzbyBzYXkgdGhhdAogICAgLy8gZXZlcnl0aGluZyBpcyBzdXBwb3J0ZWQgd2hlbiBub3Qgb24gdGhlIGJyb3dzZXIuIFdlIGRvbid0IHVzZSBgUGxhdGZvcm1gIGhlcmUgc2luY2UgaXQncwogICAgLy8ganVzdCBhIGhlbHBlciBmdW5jdGlvbiBhbmQgY2FuJ3QgaW5qZWN0IGl0LgogICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ29iamVjdCcgfHwgIWRvY3VtZW50KSB7CiAgICAgICAgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IG5ldyBTZXQoY2FuZGlkYXRlSW5wdXRUeXBlcyk7CiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZElucHV0VHlwZXM7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZmVhdHVyZVRlc3RJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICBzdXBwb3J0ZWRJbnB1dFR5cGVzID0gbmV3IFNldChjYW5kaWRhdGVJbnB1dFR5cGVzLmZpbHRlcigoLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2YWx1ZSA9PiB7CiAgICAgICAgZmVhdHVyZVRlc3RJbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCB2YWx1ZSk7CiAgICAgICAgcmV0dXJuIGZlYXR1cmVUZXN0SW5wdXQudHlwZSA9PT0gdmFsdWU7CiAgICB9KSkpOwogICAgcmV0dXJuIHN1cHBvcnRlZElucHV0VHlwZXM7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvcGxhdGZvcm0vZmVhdHVyZXMvcGFzc2l2ZS1saXN0ZW5lcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBDYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgdGhlIHVzZXIncyBicm93c2VyIHN1cHBvcnRzIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzLgogKiBAdHlwZSB7P30KICovCmxldCBzdXBwb3J0c1Bhc3NpdmVFdmVudHM7Ci8qKgogKiBDaGVja3Mgd2hldGhlciB0aGUgdXNlcidzIGJyb3dzZXIgc3VwcG9ydHMgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMuCiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN1cHBvcnRzUGFzc2l2ZUV2ZW50TGlzdGVuZXJzKCkgewogICAgaWYgKHN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9PSBudWxsICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywgewogICAgICAgICAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBzdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSB0cnVlKQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSBzdXBwb3J0c1Bhc3NpdmVFdmVudHMgfHwgZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cHBvcnRzUGFzc2l2ZUV2ZW50czsKfQovKioKICogTm9ybWFsaXplcyBhbiBgQWRkRXZlbnRMaXN0ZW5lcmAgb2JqZWN0IHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBwYXNzZWQKICogdG8gYGFkZEV2ZW50TGlzdGVuZXJgIG9uIGFueSBicm93c2VyLCBubyBtYXR0ZXIgd2hldGhlciBpdCBzdXBwb3J0cyB0aGUKICogYG9wdGlvbnNgIHBhcmFtZXRlci4KICogQHBhcmFtIHs/fSBvcHRpb25zIE9iamVjdCB0byBiZSBub3JtYWxpemVkLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyhvcHRpb25zKSB7CiAgICByZXR1cm4gc3VwcG9ydHNQYXNzaXZlRXZlbnRMaXN0ZW5lcnMoKSA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZTsKfQovKioKICogQ2FjaGVkIHJlc3VsdCBvZiB0aGUgd2F5IHRoZSBicm93c2VyIGhhbmRsZXMgdGhlIGhvcml6b250YWwgc2Nyb2xsIGF4aXMgaW4gUlRMIG1vZGUuCiAqIEB0eXBlIHs/fQogKi8KbGV0IHJ0bFNjcm9sbEF4aXNUeXBlOwovKioKICogQ2hlY2sgd2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyBzY3JvbGwgYmVoYXZpb3JzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3VwcG9ydHNTY3JvbGxCZWhhdmlvcigpIHsKICAgIHJldHVybiAhISh0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgJ3Njcm9sbEJlaGF2aW9yJyBpbiAoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuc3R5bGUpOwp9Ci8qKgogKiBDaGVja3MgdGhlIHR5cGUgb2YgUlRMIHNjcm9sbCBheGlzIHVzZWQgYnkgdGhpcyBicm93c2VyLiBBcyBvZiB0aW1lIG9mIHdyaXRpbmcsIENocm9tZSBpcyBOT1JNQUwsCiAqIEZpcmVmb3ggJiBTYWZhcmkgYXJlIE5FR0FURUQsIGFuZCBJRSAmIEVkZ2UgYXJlIElOVkVSVEVELgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UnRsU2Nyb2xsQXhpc1R5cGUoKSB7CiAgICAvLyBXZSBjYW4ndCBjaGVjayB1bmxlc3Mgd2UncmUgb24gdGhlIGJyb3dzZXIuIEp1c3QgYXNzdW1lICdub3JtYWwnIGlmIHdlJ3JlIG5vdC4KICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8ICFkb2N1bWVudCkgewogICAgICAgIHJldHVybiAwIC8qIE5PUk1BTCAqLzsKICAgIH0KICAgIGlmIChydGxTY3JvbGxBeGlzVHlwZSA9PSBudWxsKSB7CiAgICAgICAgLy8gQ3JlYXRlIGEgMXB4IHdpZGUgc2Nyb2xsaW5nIGNvbnRhaW5lciBhbmQgYSAycHggd2lkZSBjb250ZW50IGVsZW1lbnQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluZXJTdHlsZSA9IHNjcm9sbENvbnRhaW5lci5zdHlsZTsKICAgICAgICBzY3JvbGxDb250YWluZXIuZGlyID0gJ3J0bCc7CiAgICAgICAgY29udGFpbmVyU3R5bGUuaGVpZ2h0ID0gJzFweCc7CiAgICAgICAgY29udGFpbmVyU3R5bGUud2lkdGggPSAnMXB4JzsKICAgICAgICBjb250YWluZXJTdHlsZS5vdmVyZmxvdyA9ICdhdXRvJzsKICAgICAgICBjb250YWluZXJTdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CiAgICAgICAgY29udGFpbmVyU3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsKICAgICAgICBjb250YWluZXJTdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGVudFN0eWxlID0gY29udGVudC5zdHlsZTsKICAgICAgICBjb250ZW50U3R5bGUud2lkdGggPSAnMnB4JzsKICAgICAgICBjb250ZW50U3R5bGUuaGVpZ2h0ID0gJzFweCc7CiAgICAgICAgc2Nyb2xsQ29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2Nyb2xsQ29udGFpbmVyKTsKICAgICAgICBydGxTY3JvbGxBeGlzVHlwZSA9IDAgLyogTk9STUFMICovOwogICAgICAgIC8vIFRoZSB2aWV3cG9ydCBzdGFydHMgc2Nyb2xsZWQgYWxsIHRoZSB3YXkgdG8gdGhlIHJpZ2h0IGluIFJUTCBtb2RlLiBJZiB3ZSBhcmUgaW4gYSBOT1JNQUwKICAgICAgICAvLyBicm93c2VyIHRoaXMgd291bGQgbWVhbiB0aGF0IHRoZSBzY3JvbGxMZWZ0IHNob3VsZCBiZSAxLiBJZiBpdCdzIHplcm8gaW5zdGVhZCB3ZSBrbm93IHdlJ3JlCiAgICAgICAgLy8gZGVhbGluZyB3aXRoIG9uZSBvZiB0aGUgb3RoZXIgdHdvIHR5cGVzIG9mIGJyb3dzZXJzLgogICAgICAgIGlmIChzY3JvbGxDb250YWluZXIuc2Nyb2xsTGVmdCA9PT0gMCkgewogICAgICAgICAgICAvLyBJbiBhIE5FR0FURUQgYnJvd3NlciB0aGUgc2Nyb2xsTGVmdCBpcyBhbHdheXMgc29tZXdoZXJlIGluIFstbWF4U2Nyb2xsQW1vdW50LCAwXS4gRm9yIGFuCiAgICAgICAgICAgIC8vIElOVkVSVEVEIGJyb3dzZXIgaXQgaXMgYWx3YXlzIHNvbWV3aGVyZSBpbiBbMCwgbWF4U2Nyb2xsQW1vdW50XS4gV2UgY2FuIGRldGVybWluZSB3aGljaCBieQogICAgICAgICAgICAvLyBzZXR0aW5nIHRvIHRoZSBzY3JvbGxMZWZ0IHRvIDEuIFRoaXMgaXMgcGFzdCB0aGUgbWF4IGZvciBhIE5FR0FURUQgYnJvd3Nlciwgc28gaXQgd2lsbAogICAgICAgICAgICAvLyByZXR1cm4gMCB3aGVuIHdlIHJlYWQgaXQgYWdhaW4uCiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMTsKICAgICAgICAgICAgcnRsU2Nyb2xsQXhpc1R5cGUgPQogICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQgPT09IDAgPyAxIC8qIE5FR0FURUQgKi8gOiAyIC8qIElOVkVSVEVEICovOwogICAgICAgIH0KICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoc2Nyb2xsQ29udGFpbmVyLnBhcmVudE5vZGUpKS5yZW1vdmVDaGlsZChzY3JvbGxDb250YWluZXIpOwogICAgfQogICAgcmV0dXJuIHJ0bFNjcm9sbEF4aXNUeXBlOwp9CgpjbGFzcyBNdXRhdGlvbk9ic2VydmVyRmFjdG9yeSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZShjYWxsYmFjaykgewogICAgICAgIHJldHVybiB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spOwogICAgfQp9Ck11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5Lsm1ZmFjID0gZnVuY3Rpb24gTXV0YXRpb25PYnNlcnZlckZhY3RvcnlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTXV0YXRpb25PYnNlcnZlckZhY3RvcnkpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBNdXRhdGlvbk9ic2VydmVyRmFjdG9yeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5X0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgTXV0YXRpb25PYnNlcnZlckZhY3RvcnkoKTsgfSwgdG9rZW46IE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBBbiBpbmplY3RhYmxlIHNlcnZpY2UgdGhhdCBhbGxvd3Mgd2F0Y2hpbmcgZWxlbWVudHMgZm9yIGNoYW5nZXMgdG8gdGhlaXIgY29udGVudC4KICovCmNsYXNzIENvbnRlbnRPYnNlcnZlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX211dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9tdXRhdGlvbk9ic2VydmVyRmFjdG9yeSkgewogICAgICAgIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5ID0gX211dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5OwogICAgICAgIC8qKgogICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBleGlzdGluZyBNdXRhdGlvbk9ic2VydmVycyBzbyB0aGV5IGNhbiBiZSByZXVzZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cyA9IG5ldyBNYXAoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChfLCBlbGVtZW50KSA9PiB0aGlzLl9jbGVhbnVwT2JzZXJ2ZXIoZWxlbWVudCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50T3JSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9ic2VydmUoZWxlbWVudE9yUmVmKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnRPclJlZik7CiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9vYnNlcnZlRWxlbWVudChlbGVtZW50KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBzdHJlYW0uc3Vic2NyaWJlKG9ic2VydmVyKTsKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fdW5vYnNlcnZlRWxlbWVudChlbGVtZW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBPYnNlcnZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBieSB1c2luZyB0aGUgZXhpc3RpbmcgTXV0YXRpb25PYnNlcnZlciBpZiBhdmFpbGFibGUsIG9yIGNyZWF0aW5nIGEKICAgICAqIG5ldyBvbmUgaWYgbm90LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29ic2VydmVFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICBpZiAoIXRoaXMuX29ic2VydmVkRWxlbWVudHMuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuX211dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5LmNyZWF0ZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbXV0YXRpb25zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtdXRhdGlvbnMgPT4gc3RyZWFtLm5leHQobXV0YXRpb25zKSkpOwogICAgICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgewogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX29ic2VydmVkRWxlbWVudHMuc2V0KGVsZW1lbnQsIHsgb2JzZXJ2ZXIsIHN0cmVhbSwgY291bnQ6IDEgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQoZWxlbWVudCkpKS5jb3VudCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KGVsZW1lbnQpKSkuc3RyZWFtOwogICAgfQogICAgLyoqCiAgICAgKiBVbi1vYnNlcnZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2xlYW5zIHVwIHRoZSB1bmRlcmx5aW5nIE11dGF0aW9uT2JzZXJ2ZXIgaWYgbm9ib2R5IGVsc2UgaXMKICAgICAqIG9ic2VydmluZyB0aGlzIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdW5vYnNlcnZlRWxlbWVudChlbGVtZW50KSB7CiAgICAgICAgaWYgKHRoaXMuX29ic2VydmVkRWxlbWVudHMuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmdldChlbGVtZW50KSkpLmNvdW50LS07CiAgICAgICAgICAgIGlmICghKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KGVsZW1lbnQpKSkuY291bnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFudXBPYnNlcnZlcihlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2xlYW4gdXAgdGhlIHVuZGVybHlpbmcgTXV0YXRpb25PYnNlcnZlciBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NsZWFudXBPYnNlcnZlcihlbGVtZW50KSB7CiAgICAgICAgaWYgKHRoaXMuX29ic2VydmVkRWxlbWVudHMuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JzZXJ2ZXIsIHN0cmVhbSB9ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KGVsZW1lbnQpKSk7CiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbS5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmRlbGV0ZShlbGVtZW50KTsKICAgICAgICB9CiAgICB9Cn0KQ29udGVudE9ic2VydmVyLsm1ZmFjID0gZnVuY3Rpb24gQ29udGVudE9ic2VydmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENvbnRlbnRPYnNlcnZlcikoybXJtWluamVjdChNdXRhdGlvbk9ic2VydmVyRmFjdG9yeSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KQ29udGVudE9ic2VydmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBNdXRhdGlvbk9ic2VydmVyRmFjdG9yeSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBDb250ZW50T2JzZXJ2ZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBDb250ZW50T2JzZXJ2ZXJfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBDb250ZW50T2JzZXJ2ZXIoybXJtWluamVjdChNdXRhdGlvbk9ic2VydmVyRmFjdG9yeSkpOyB9LCB0b2tlbjogQ29udGVudE9ic2VydmVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBEaXJlY3RpdmUgdGhhdCB0cmlnZ2VycyBhIGNhbGxiYWNrIHdoZW5ldmVyIHRoZSBjb250ZW50IG9mCiAqIGl0cyBhc3NvY2lhdGVkIGVsZW1lbnQgaGFzIGNoYW5nZWQuCiAqLwpjbGFzcyBDZGtPYnNlcnZlQ29udGVudCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2NvbnRlbnRPYnNlcnZlcgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9jb250ZW50T2JzZXJ2ZXIsIF9lbGVtZW50UmVmLCBfbmdab25lKSB7CiAgICAgICAgdGhpcy5fY29udGVudE9ic2VydmVyID0gX2NvbnRlbnRPYnNlcnZlcjsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIGZvciBlYWNoIGNoYW5nZSBpbiB0aGUgZWxlbWVudCdzIGNvbnRlbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5ldmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIG9ic2VydmluZyBjb250ZW50IGlzIGRpc2FibGVkLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAogICAgICogdG8gZGlzY29ubmVjdCB0aGUgdW5kZXJseWluZyBNdXRhdGlvbk9ic2VydmVyIHVudGlsIGl0IGlzIG5lZWRlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkgewogICAgICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB0aGlzLl9kaXNhYmxlZCA/IHRoaXMuX3Vuc3Vic2NyaWJlKCkgOiB0aGlzLl9zdWJzY3JpYmUoKTsKICAgIH0KICAgIC8qKgogICAgICogRGVib3VuY2UgaW50ZXJ2YWwgZm9yIGVtaXR0aW5nIHRoZSBjaGFuZ2VzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRlYm91bmNlKCkgeyByZXR1cm4gdGhpcy5fZGVib3VuY2U7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGRlYm91bmNlKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fZGVib3VuY2UgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gJiYgIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N1YnNjcmliZSgpIHsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jb250ZW50T2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICAvLyBUT0RPKG1tYWxlcmJhKTogV2Ugc2hvdWxkbid0IGJlIGVtaXR0aW5nIG9uIHRoaXMgQE91dHB1dCgpIG91dHNpZGUgdGhlIHpvbmUuCiAgICAgICAgLy8gQ29uc2lkZXIgYnJpbmluZyBpdCBiYWNrIGluc2lkZSB0aGUgem9uZSBuZXh0IHRpbWUgd2UncmUgbWFraW5nIGJyZWFraW5nIGNoYW5nZXMuCiAgICAgICAgLy8gQnJpbmdpbmcgaXQgYmFjayBpbnNpZGUgY2FuIGNhdXNlIHRoaW5ncyBsaWtlIGluZmluaXRlIGNoYW5nZSBkZXRlY3Rpb24gbG9vcHMgYW5kIGNoYW5nZWQKICAgICAgICAvLyBhZnRlciBjaGVja2VkIGVycm9ycyBpZiBwZW9wbGUncyBjb2RlIGlzbid0IGhhbmRsaW5nIGl0IHByb3Blcmx5LgogICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPQogICAgICAgICAgICAgICAgKHRoaXMuZGVib3VuY2UgPyBzdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZSkpIDogc3RyZWFtKS5zdWJzY3JpYmUodGhpcy5ldmVudCk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICB9Cn0KQ2RrT2JzZXJ2ZUNvbnRlbnQuybVmYWMgPSBmdW5jdGlvbiBDZGtPYnNlcnZlQ29udGVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtPYnNlcnZlQ29udGVudCkoybXJtWRpcmVjdGl2ZUluamVjdChDb250ZW50T2JzZXJ2ZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSkpOyB9OwpDZGtPYnNlcnZlQ29udGVudC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtPYnNlcnZlQ29udGVudCwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrT2JzZXJ2ZUNvbnRlbnQiLCAiIl1dLCBpbnB1dHM6IHsgZGlzYWJsZWQ6IFsiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsICJkaXNhYmxlZCJdLCBkZWJvdW5jZTogImRlYm91bmNlIiB9LCBvdXRwdXRzOiB7IGV2ZW50OiAiY2RrT2JzZXJ2ZUNvbnRlbnQiIH0sIGV4cG9ydEFzOiBbImNka09ic2VydmVDb250ZW50Il0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpDZGtPYnNlcnZlQ29udGVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ29udGVudE9ic2VydmVyIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogTmdab25lIH0KXTsKQ2RrT2JzZXJ2ZUNvbnRlbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBldmVudDogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2Nka09ic2VydmVDb250ZW50JyxdIH1dLAogICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka09ic2VydmVDb250ZW50RGlzYWJsZWQnLF0gfV0sCiAgICBkZWJvdW5jZTogW3sgdHlwZTogSW5wdXQgfV0KfTsKY2xhc3MgT2JzZXJ2ZXJzTW9kdWxlIHsKfQpPYnNlcnZlcnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBPYnNlcnZlcnNNb2R1bGUgfSk7Ck9ic2VydmVyc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE9ic2VydmVyc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBPYnNlcnZlcnNNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW011dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5XSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoT2JzZXJ2ZXJzTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0Nka09ic2VydmVDb250ZW50XSwgZXhwb3J0czogW0Nka09ic2VydmVDb250ZW50XSB9KTsgfSkoKTsKCmNvbnN0IElEX0RFTElNSU5BVE9SID0gJyAnOwovKioKICogQWRkcyB0aGUgZ2l2ZW4gSUQgdG8gdGhlIHNwZWNpZmllZCBBUklBIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LgogKiBVc2VkIGZvciBhdHRyaWJ1dGVzIHN1Y2ggYXMgYXJpYS1sYWJlbGxlZGJ5LCBhcmlhLW93bnMsIGV0Yy4KICogQHBhcmFtIHs/fSBlbAogKiBAcGFyYW0gez99IGF0dHIKICogQHBhcmFtIHs/fSBpZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWRkQXJpYVJlZmVyZW5jZWRJZChlbCwgYXR0ciwgaWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlkcyA9IGdldEFyaWFSZWZlcmVuY2VJZHMoZWwsIGF0dHIpOwogICAgaWYgKGlkcy5zb21lKCgvKioKICAgICAqIEBwYXJhbSB7P30gZXhpc3RpbmdJZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZXhpc3RpbmdJZCA9PiBleGlzdGluZ0lkLnRyaW0oKSA9PSBpZC50cmltKCkpKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlkcy5wdXNoKGlkLnRyaW0oKSk7CiAgICBlbC5zZXRBdHRyaWJ1dGUoYXR0ciwgaWRzLmpvaW4oSURfREVMSU1JTkFUT1IpKTsKfQovKioKICogUmVtb3ZlcyB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIEFSSUEgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQuCiAqIFVzZWQgZm9yIGF0dHJpYnV0ZXMgc3VjaCBhcyBhcmlhLWxhYmVsbGVkYnksIGFyaWEtb3ducywgZXRjLgogKiBAcGFyYW0gez99IGVsCiAqIEBwYXJhbSB7P30gYXR0cgogKiBAcGFyYW0gez99IGlkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW1vdmVBcmlhUmVmZXJlbmNlZElkKGVsLCBhdHRyLCBpZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaWRzID0gZ2V0QXJpYVJlZmVyZW5jZUlkcyhlbCwgYXR0cik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmaWx0ZXJlZElkcyA9IGlkcy5maWx0ZXIoKC8qKgogICAgICogQHBhcmFtIHs/fSB2YWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZhbCA9PiB2YWwgIT0gaWQudHJpbSgpKSk7CiAgICBpZiAoZmlsdGVyZWRJZHMubGVuZ3RoKSB7CiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHIsIGZpbHRlcmVkSWRzLmpvaW4oSURfREVMSU1JTkFUT1IpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTsKICAgIH0KfQovKioKICogR2V0cyB0aGUgbGlzdCBvZiBJRHMgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gQVJJQSBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudC4KICogVXNlZCBmb3IgYXR0cmlidXRlcyBzdWNoIGFzIGFyaWEtbGFiZWxsZWRieSwgYXJpYS1vd25zLCBldGMuCiAqIEBwYXJhbSB7P30gZWwKICogQHBhcmFtIHs/fSBhdHRyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRBcmlhUmVmZXJlbmNlSWRzKGVsLCBhdHRyKSB7CiAgICAvLyBHZXQgc3RyaW5nIGFycmF5IG9mIGFsbCBpbmRpdmlkdWFsIGlkcyAod2hpdGVzcGFjZSBkZWxpbWluYXRlZCkgaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQogICAgcmV0dXJuIChlbC5nZXRBdHRyaWJ1dGUoYXR0cikgfHwgJycpLm1hdGNoKC9cUysvZykgfHwgW107Cn0KLyoqCiAqIElEIHVzZWQgZm9yIHRoZSBib2R5IGNvbnRhaW5lciB3aGVyZSBhbGwgbWVzc2FnZXMgYXJlIGFwcGVuZGVkLgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1FU1NBR0VTX0NPTlRBSU5FUl9JRCA9ICdjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXInOwovKioKICogSUQgcHJlZml4IHVzZWQgZm9yIGVhY2ggY3JlYXRlZCBtZXNzYWdlIGVsZW1lbnQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ0RLX0RFU0NSSUJFREJZX0lEX1BSRUZJWCA9ICdjZGstZGVzY3JpYmVkYnktbWVzc2FnZSc7Ci8qKgogKiBBdHRyaWJ1dGUgZ2l2ZW4gdG8gZWFjaCBob3N0IGVsZW1lbnQgdGhhdCBpcyBkZXNjcmliZWQgYnkgYSBtZXNzYWdlIGVsZW1lbnQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ0RLX0RFU0NSSUJFREJZX0hPU1RfQVRUUklCVVRFID0gJ2Nkay1kZXNjcmliZWRieS1ob3N0JzsKLyoqCiAqIEdsb2JhbCBpbmNyZW1lbnRhbCBpZGVudGlmaWVyIGZvciBlYWNoIHJlZ2lzdGVyZWQgbWVzc2FnZSBlbGVtZW50LgogKiBAdHlwZSB7P30KICovCmxldCBuZXh0SWQgPSAwOwovKioKICogR2xvYmFsIG1hcCBvZiBhbGwgcmVnaXN0ZXJlZCBtZXNzYWdlIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHBsYWNlZCBpbnRvIHRoZSBkb2N1bWVudC4KICogQHR5cGUgez99CiAqLwpjb25zdCBtZXNzYWdlUmVnaXN0cnkgPSBuZXcgTWFwKCk7Ci8qKgogKiBDb250YWluZXIgZm9yIGFsbCByZWdpc3RlcmVkIG1lc3NhZ2VzLgogKiBAdHlwZSB7P30KICovCmxldCBtZXNzYWdlc0NvbnRhaW5lciA9IG51bGw7Ci8qKgogKiBVdGlsaXR5IHRoYXQgY3JlYXRlcyB2aXN1YWxseSBoaWRkZW4gZWxlbWVudHMgd2l0aCBhIG1lc3NhZ2UgY29udGVudC4gVXNlZnVsIGZvciBlbGVtZW50cyB0aGF0CiAqIHdhbnQgdG8gdXNlIGFyaWEtZGVzY3JpYmVkYnkgdG8gZnVydGhlciBkZXNjcmliZSB0aGVtc2VsdmVzIHdpdGhvdXQgYWRkaW5nIGFkZGl0aW9uYWwgdmlzdWFsCiAqIGNvbnRlbnQuCiAqLwpjbGFzcyBBcmlhRGVzY3JpYmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoX2RvY3VtZW50KSB7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEFkZHMgdG8gdGhlIGhvc3QgZWxlbWVudCBhbiBhcmlhLWRlc2NyaWJlZGJ5IHJlZmVyZW5jZSB0byBhIGhpZGRlbiBlbGVtZW50IHRoYXQgY29udGFpbnMKICAgICAqIHRoZSBtZXNzYWdlLiBJZiB0aGUgc2FtZSBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiBpdCB3aWxsIHJldXNlIHRoZSBjcmVhdGVkCiAgICAgKiBtZXNzYWdlIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gez99IGhvc3RFbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc2NyaWJlKGhvc3RFbGVtZW50LCBtZXNzYWdlKSB7CiAgICAgICAgaWYgKCF0aGlzLl9jYW5CZURlc2NyaWJlZChob3N0RWxlbWVudCwgbWVzc2FnZSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGFuIElELgogICAgICAgICAgICB0aGlzLl9zZXRNZXNzYWdlSWQobWVzc2FnZSk7CiAgICAgICAgICAgIG1lc3NhZ2VSZWdpc3RyeS5zZXQobWVzc2FnZSwgeyBtZXNzYWdlRWxlbWVudDogbWVzc2FnZSwgcmVmZXJlbmNlQ291bnQ6IDAgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFtZXNzYWdlUmVnaXN0cnkuaGFzKG1lc3NhZ2UpKSB7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VFbGVtZW50KG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX2lzRWxlbWVudERlc2NyaWJlZEJ5TWVzc2FnZShob3N0RWxlbWVudCwgbWVzc2FnZSkpIHsKICAgICAgICAgICAgdGhpcy5fYWRkTWVzc2FnZVJlZmVyZW5jZShob3N0RWxlbWVudCwgbWVzc2FnZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIHRoZSBob3N0IGVsZW1lbnQncyBhcmlhLWRlc2NyaWJlZGJ5IHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudAogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVEZXNjcmlwdGlvbihob3N0RWxlbWVudCwgbWVzc2FnZSkgewogICAgICAgIGlmICghdGhpcy5faXNFbGVtZW50Tm9kZShob3N0RWxlbWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKGhvc3RFbGVtZW50LCBtZXNzYWdlKSkgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVNZXNzYWdlUmVmZXJlbmNlKGhvc3RFbGVtZW50LCBtZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgYSBzdHJpbmcsIGl0IG1lYW5zIHRoYXQgaXQncyBvbmUgdGhhdCB3ZSBjcmVhdGVkIGZvciB0aGUKICAgICAgICAvLyBjb25zdW1lciBzbyB3ZSBjYW4gcmVtb3ZlIGl0IHNhZmVseSwgb3RoZXJ3aXNlIHdlIHNob3VsZCBsZWF2ZSBpdCBpbiBwbGFjZS4KICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE1lc3NhZ2UgPSBtZXNzYWdlUmVnaXN0cnkuZ2V0KG1lc3NhZ2UpOwogICAgICAgICAgICBpZiAocmVnaXN0ZXJlZE1lc3NhZ2UgJiYgcmVnaXN0ZXJlZE1lc3NhZ2UucmVmZXJlbmNlQ291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RlbGV0ZU1lc3NhZ2VFbGVtZW50KG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChtZXNzYWdlc0NvbnRhaW5lciAmJiBtZXNzYWdlc0NvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICB0aGlzLl9kZWxldGVNZXNzYWdlc0NvbnRhaW5lcigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVW5yZWdpc3RlcnMgYWxsIGNyZWF0ZWQgbWVzc2FnZSBlbGVtZW50cyBhbmQgcmVtb3ZlcyB0aGUgbWVzc2FnZSBjb250YWluZXIuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVzY3JpYmVkRWxlbWVudHMgPSB0aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtDREtfREVTQ1JJQkVEQllfSE9TVF9BVFRSSUJVVEV9XWApOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzY3JpYmVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ2RrRGVzY3JpYmVkQnlSZWZlcmVuY2VJZHMoZGVzY3JpYmVkRWxlbWVudHNbaV0pOwogICAgICAgICAgICBkZXNjcmliZWRFbGVtZW50c1tpXS5yZW1vdmVBdHRyaWJ1dGUoQ0RLX0RFU0NSSUJFREJZX0hPU1RfQVRUUklCVVRFKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lc3NhZ2VzQ29udGFpbmVyKSB7CiAgICAgICAgICAgIHRoaXMuX2RlbGV0ZU1lc3NhZ2VzQ29udGFpbmVyKCk7CiAgICAgICAgfQogICAgICAgIG1lc3NhZ2VSZWdpc3RyeS5jbGVhcigpOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgaW4gdGhlIHZpc3VhbGx5IGhpZGRlbiBtZXNzYWdlIGNvbnRhaW5lciBlbGVtZW50IHdpdGggdGhlIG1lc3NhZ2UKICAgICAqIGFzIGl0cyBjb250ZW50IGFuZCBhZGRzIGl0IHRvIHRoZSBtZXNzYWdlIHJlZ2lzdHJ5LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZU1lc3NhZ2VFbGVtZW50KG1lc3NhZ2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICB0aGlzLl9zZXRNZXNzYWdlSWQobWVzc2FnZUVsZW1lbnQpOwogICAgICAgIG1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICB0aGlzLl9jcmVhdGVNZXNzYWdlc0NvbnRhaW5lcigpOwogICAgICAgICgvKiogQHR5cGUgez99ICovIChtZXNzYWdlc0NvbnRhaW5lcikpLmFwcGVuZENoaWxkKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICBtZXNzYWdlUmVnaXN0cnkuc2V0KG1lc3NhZ2UsIHsgbWVzc2FnZUVsZW1lbnQsIHJlZmVyZW5jZUNvdW50OiAwIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBBc3NpZ25zIGEgdW5pcXVlIElEIHRvIGFuIGVsZW1lbnQsIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgYWxyZWFkeS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRNZXNzYWdlSWQoZWxlbWVudCkgewogICAgICAgIGlmICghZWxlbWVudC5pZCkgewogICAgICAgICAgICBlbGVtZW50LmlkID0gYCR7Q0RLX0RFU0NSSUJFREJZX0lEX1BSRUZJWH0tJHtuZXh0SWQrK31gOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVsZXRlcyB0aGUgbWVzc2FnZSBlbGVtZW50IGZyb20gdGhlIGdsb2JhbCBtZXNzYWdlcyBjb250YWluZXIuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZGVsZXRlTWVzc2FnZUVsZW1lbnQobWVzc2FnZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWdpc3RlcmVkTWVzc2FnZSA9IG1lc3NhZ2VSZWdpc3RyeS5nZXQobWVzc2FnZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gcmVnaXN0ZXJlZE1lc3NhZ2UgJiYgcmVnaXN0ZXJlZE1lc3NhZ2UubWVzc2FnZUVsZW1lbnQ7CiAgICAgICAgaWYgKG1lc3NhZ2VzQ29udGFpbmVyICYmIG1lc3NhZ2VFbGVtZW50KSB7CiAgICAgICAgICAgIG1lc3NhZ2VzQ29udGFpbmVyLnJlbW92ZUNoaWxkKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgbWVzc2FnZVJlZ2lzdHJ5LmRlbGV0ZShtZXNzYWdlKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgZ2xvYmFsIGNvbnRhaW5lciBmb3IgYWxsIGFyaWEtZGVzY3JpYmVkYnkgbWVzc2FnZXMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZU1lc3NhZ2VzQ29udGFpbmVyKCkgewogICAgICAgIGlmICghbWVzc2FnZXNDb250YWluZXIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVFeGlzdGluZ0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKE1FU1NBR0VTX0NPTlRBSU5FUl9JRCk7CiAgICAgICAgICAgIC8vIFdoZW4gZ29pbmcgZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQsIHdlIG1heSBlbmQgdXAgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUncwogICAgICAgICAgICAvLyBhbHJlYWR5IGEgY29udGFpbmVyIG9uIHRoZSBwYWdlLCBidXQgd2UgZG9uJ3QgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdC4gQ2xlYXIgdGhlCiAgICAgICAgICAgIC8vIG9sZCBjb250YWluZXIgc28gd2UgZG9uJ3QgZ2V0IGR1cGxpY2F0ZXMuIERvaW5nIHRoaXMsIGluc3RlYWQgb2YgZW1wdHlpbmcgdGhlIHByZXZpb3VzCiAgICAgICAgICAgIC8vIGNvbnRhaW5lciwgc2hvdWxkIGJlIHNsaWdodGx5IGZhc3Rlci4KICAgICAgICAgICAgaWYgKHByZUV4aXN0aW5nQ29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAocHJlRXhpc3RpbmdDb250YWluZXIucGFyZW50Tm9kZSkpLnJlbW92ZUNoaWxkKHByZUV4aXN0aW5nQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZXNzYWdlc0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBtZXNzYWdlc0NvbnRhaW5lci5pZCA9IE1FU1NBR0VTX0NPTlRBSU5FUl9JRDsKICAgICAgICAgICAgbWVzc2FnZXNDb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgIG1lc3NhZ2VzQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVzc2FnZXNDb250YWluZXIpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVsZXRlcyB0aGUgZ2xvYmFsIG1lc3NhZ2VzIGNvbnRhaW5lci4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZGVsZXRlTWVzc2FnZXNDb250YWluZXIoKSB7CiAgICAgICAgaWYgKG1lc3NhZ2VzQ29udGFpbmVyICYmIG1lc3NhZ2VzQ29udGFpbmVyLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgbWVzc2FnZXNDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlc0NvbnRhaW5lcik7CiAgICAgICAgICAgIG1lc3NhZ2VzQ29udGFpbmVyID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgYWxsIGNkay1kZXNjcmliZWRieSBtZXNzYWdlcyB0aGF0IGFyZSBob3N0ZWQgdGhyb3VnaCB0aGUgZWxlbWVudC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmVDZGtEZXNjcmliZWRCeVJlZmVyZW5jZUlkcyhlbGVtZW50KSB7CiAgICAgICAgLy8gUmVtb3ZlIGFsbCBhcmlhLWRlc2NyaWJlZGJ5IHJlZmVyZW5jZSBJRHMgdGhhdCBhcmUgcHJlZml4ZWQgYnkgQ0RLX0RFU0NSSUJFREJZX0lEX1BSRUZJWAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcmlnaW5hbFJlZmVyZW5jZUlkcyA9IGdldEFyaWFSZWZlcmVuY2VJZHMoZWxlbWVudCwgJ2FyaWEtZGVzY3JpYmVkYnknKQogICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpZCA9PiBpZC5pbmRleE9mKENES19ERVNDUklCRURCWV9JRF9QUkVGSVgpICE9IDApKTsKICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIG9yaWdpbmFsUmVmZXJlbmNlSWRzLmpvaW4oJyAnKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZHMgYSBtZXNzYWdlIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB1c2luZyBhcmlhLWRlc2NyaWJlZGJ5IGFuZCBpbmNyZW1lbnRzIHRoZSByZWdpc3RlcmVkCiAgICAgKiBtZXNzYWdlJ3MgcmVmZXJlbmNlIGNvdW50LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkTWVzc2FnZVJlZmVyZW5jZShlbGVtZW50LCBtZXNzYWdlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRNZXNzYWdlID0gKC8qKiBAdHlwZSB7P30gKi8gKG1lc3NhZ2VSZWdpc3RyeS5nZXQobWVzc2FnZSkpKTsKICAgICAgICAvLyBBZGQgdGhlIGFyaWEtZGVzY3JpYmVkYnkgcmVmZXJlbmNlIGFuZCBzZXQgdGhlCiAgICAgICAgLy8gZGVzY3JpYmVkYnlfaG9zdCBhdHRyaWJ1dGUgdG8gbWFyayB0aGUgZWxlbWVudC4KICAgICAgICBhZGRBcmlhUmVmZXJlbmNlZElkKGVsZW1lbnQsICdhcmlhLWRlc2NyaWJlZGJ5JywgcmVnaXN0ZXJlZE1lc3NhZ2UubWVzc2FnZUVsZW1lbnQuaWQpOwogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKENES19ERVNDUklCRURCWV9IT1NUX0FUVFJJQlVURSwgJycpOwogICAgICAgIHJlZ2lzdGVyZWRNZXNzYWdlLnJlZmVyZW5jZUNvdW50Kys7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgYSBtZXNzYWdlIHJlZmVyZW5jZSBmcm9tIHRoZSBlbGVtZW50IHVzaW5nIGFyaWEtZGVzY3JpYmVkYnkKICAgICAqIGFuZCBkZWNyZW1lbnRzIHRoZSByZWdpc3RlcmVkIG1lc3NhZ2UncyByZWZlcmVuY2UgY291bnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmVNZXNzYWdlUmVmZXJlbmNlKGVsZW1lbnQsIG1lc3NhZ2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE1lc3NhZ2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAobWVzc2FnZVJlZ2lzdHJ5LmdldChtZXNzYWdlKSkpOwogICAgICAgIHJlZ2lzdGVyZWRNZXNzYWdlLnJlZmVyZW5jZUNvdW50LS07CiAgICAgICAgcmVtb3ZlQXJpYVJlZmVyZW5jZWRJZChlbGVtZW50LCAnYXJpYS1kZXNjcmliZWRieScsIHJlZ2lzdGVyZWRNZXNzYWdlLm1lc3NhZ2VFbGVtZW50LmlkKTsKICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShDREtfREVTQ1JJQkVEQllfSE9TVF9BVFRSSUJVVEUpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4gZGVzY3JpYmVkIGJ5IHRoZSBwcm92aWRlZCBtZXNzYWdlIElELgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKGVsZW1lbnQsIG1lc3NhZ2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWRzID0gZ2V0QXJpYVJlZmVyZW5jZUlkcyhlbGVtZW50LCAnYXJpYS1kZXNjcmliZWRieScpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWdpc3RlcmVkTWVzc2FnZSA9IG1lc3NhZ2VSZWdpc3RyeS5nZXQobWVzc2FnZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHJlZ2lzdGVyZWRNZXNzYWdlICYmIHJlZ2lzdGVyZWRNZXNzYWdlLm1lc3NhZ2VFbGVtZW50LmlkOwogICAgICAgIHJldHVybiAhIW1lc3NhZ2VJZCAmJiByZWZlcmVuY2VJZHMuaW5kZXhPZihtZXNzYWdlSWQpICE9IC0xOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBtZXNzYWdlIGNhbiBiZSBkZXNjcmliZWQgb24gYSBwYXJ0aWN1bGFyIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYW5CZURlc2NyaWJlZChlbGVtZW50LCBtZXNzYWdlKSB7CiAgICAgICAgaWYgKCF0aGlzLl9pc0VsZW1lbnROb2RlKGVsZW1lbnQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIC8vIFdlJ2QgaGF2ZSB0byBtYWtlIHNvbWUgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQncyB0ZXh0LCBpZiB0aGUgY29uc3VtZXIKICAgICAgICAgICAgLy8gcGFzc2VkIGluIGFuIGVsZW1lbnQuIEFzc3VtZSB0aGF0IGlmIGFuIGVsZW1lbnQgaXMgcGFzc2VkIGluLCB0aGUgY29uc3VtZXIgaGFzIHZlcmlmaWVkCiAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYSBkZXNjcmlwdGlvbi4KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0cmltbWVkTWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/ICcnIDogYCR7bWVzc2FnZX1gLnRyaW0oKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXJpYUxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTsKICAgICAgICAvLyBXZSBzaG91bGRuJ3Qgc2V0IGRlc2NyaXB0aW9ucyBpZiB0aGV5J3JlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGBhcmlhLWxhYmVsYCBvZiB0aGUKICAgICAgICAvLyBlbGVtZW50LCBiZWNhdXNlIHNjcmVlbiByZWFkZXJzIHdpbGwgZW5kIHVwIHJlYWRpbmcgb3V0IHRoZSBzYW1lIHRleHQgdHdpY2UgaW4gYSByb3cuCiAgICAgICAgcmV0dXJuIHRyaW1tZWRNZXNzYWdlID8gKCFhcmlhTGFiZWwgfHwgYXJpYUxhYmVsLnRyaW0oKSAhPT0gdHJpbW1lZE1lc3NhZ2UpIDogZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiBFbGVtZW50IG5vZGUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNFbGVtZW50Tm9kZShlbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQubm9kZVR5cGUgPT09IHRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERTsKICAgIH0KfQpBcmlhRGVzY3JpYmVyLsm1ZmFjID0gZnVuY3Rpb24gQXJpYURlc2NyaWJlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBcmlhRGVzY3JpYmVyKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovCkFyaWFEZXNjcmliZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIEFyaWFEZXNjcmliZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBBcmlhRGVzY3JpYmVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgQXJpYURlc2NyaWJlcijJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfSwgdG9rZW46IEFyaWFEZXNjcmliZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKLyoqCiAqIFRoaXMgY2xhc3MgbWFuYWdlcyBrZXlib2FyZCBldmVudHMgZm9yIHNlbGVjdGFibGUgbGlzdHMuIElmIHlvdSBwYXNzIGl0IGEgcXVlcnkgbGlzdAogKiBvZiBpdGVtcywgaXQgd2lsbCBzZXQgdGhlIGFjdGl2ZSBpdGVtIGNvcnJlY3RseSB3aGVuIGFycm93IGV2ZW50cyBvY2N1ci4KICogQHRlbXBsYXRlIFQKICovCmNsYXNzIExpc3RLZXlNYW5hZ2VyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfaXRlbXMKICAgICAqLwogICAgY29uc3RydWN0b3IoX2l0ZW1zKSB7CiAgICAgICAgdGhpcy5faXRlbXMgPSBfaXRlbXM7CiAgICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5fYWN0aXZlSXRlbSA9IG51bGw7CiAgICAgICAgdGhpcy5fd3JhcCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2xldHRlcktleVN0cmVhbSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgdGhpcy5fdHlwZWFoZWFkU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIHRoaXMuX3ZlcnRpY2FsID0gdHJ1ZTsKICAgICAgICB0aGlzLl9hbGxvd2VkTW9kaWZpZXJLZXlzID0gW107CiAgICAgICAgLyoqCiAgICAgICAgICogUHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBpdGVtIHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICogYnkgdGhlIGtleSBtYW5hZ2VyLiBCeSBkZWZhdWx0LCBkaXNhYmxlZCBpdGVtcyBhcmUgc2tpcHBlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9za2lwUHJlZGljYXRlRm4gPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoaXRlbSkgPT4gaXRlbS5kaXNhYmxlZCk7CiAgICAgICAgLy8gQnVmZmVyIGZvciB0aGUgbGV0dGVycyB0aGF0IHRoZSB1c2VyIGhhcyBwcmVzc2VkIHdoZW4gdGhlIHR5cGVhaGVhZCBvcHRpb24gaXMgdHVybmVkIG9uLgogICAgICAgIHRoaXMuX3ByZXNzZWRMZXR0ZXJzID0gW107CiAgICAgICAgLyoqCiAgICAgICAgICogU3RyZWFtIHRoYXQgZW1pdHMgYW55IHRpbWUgdGhlIFRBQiBrZXkgaXMgcHJlc3NlZCwgc28gY29tcG9uZW50cyBjYW4gcmVhY3QKICAgICAgICAgKiB3aGVuIGZvY3VzIGlzIHNoaWZ0ZWQgb2ZmIG9mIHRoZSBsaXN0LgogICAgICAgICAqLwogICAgICAgIHRoaXMudGFiT3V0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgYWN0aXZlIGl0ZW0gb2YgdGhlIGxpc3QgbWFuYWdlciBjaGFuZ2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvLyBXZSBhbGxvdyBmb3IgdGhlIGl0ZW1zIHRvIGJlIGFuIGFycmF5IGJlY2F1c2UsIGluIHNvbWUgY2FzZXMsIHRoZSBjb25zdW1lciBtYXkKICAgICAgICAvLyBub3QgaGF2ZSBhY2Nlc3MgdG8gYSBRdWVyeUxpc3Qgb2YgdGhlIGl0ZW1zIHRoZXkgd2FudCB0byBtYW5hZ2UgKGUuZy4gd2hlbiB0aGUKICAgICAgICAvLyBpdGVtcyBhcmVuJ3QgYmVpbmcgY29sbGVjdGVkIHZpYSBgVmlld0NoaWxkcmVuYCBvciBgQ29udGVudENoaWxkcmVuYCkuCiAgICAgICAgaWYgKF9pdGVtcyBpbnN0YW5jZW9mIFF1ZXJ5TGlzdCkgewogICAgICAgICAgICBfaXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5ld0l0ZW1zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobmV3SXRlbXMpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVJdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1BcnJheSA9IG5ld0l0ZW1zLnRvQXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBpdGVtQXJyYXkuaW5kZXhPZih0aGlzLl9hY3RpdmVJdGVtKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5kZXggPiAtMSAmJiBuZXdJbmRleCAhPT0gdGhpcy5fYWN0aXZlSXRlbUluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IG5ld0luZGV4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBpdGVtcyBzaG91bGQgYmUgc2tpcHBlZCBieSB0aGUKICAgICAqIGxpc3Qga2V5IG1hbmFnZXIuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZSBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBzaG91bGQgYmUgc2tpcHBlZC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHNraXBQcmVkaWNhdGUocHJlZGljYXRlKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fc2tpcFByZWRpY2F0ZUZuID0gcHJlZGljYXRlOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIHdyYXBwaW5nIG1vZGUsIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGUgYWN0aXZlIGl0ZW0gd2lsbCB3cmFwIHRvCiAgICAgKiB0aGUgb3RoZXIgZW5kIG9mIGxpc3Qgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/PX0gc2hvdWxkV3JhcCBXaGV0aGVyIHRoZSBsaXN0IHNob3VsZCB3cmFwIHdoZW4gcmVhY2hpbmcgdGhlIGVuZC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhXcmFwKHNob3VsZFdyYXAgPSB0cnVlKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fd3JhcCA9IHNob3VsZFdyYXA7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIENvbmZpZ3VyZXMgd2hldGhlciB0aGUga2V5IG1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSB0aGUgc2VsZWN0aW9uIHZlcnRpY2FsbHkuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez89fSBlbmFibGVkIFdoZXRoZXIgdmVydGljYWwgc2VsZWN0aW9uIHNob3VsZCBiZSBlbmFibGVkLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aFZlcnRpY2FsT3JpZW50YXRpb24oZW5hYmxlZCA9IHRydWUpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl92ZXJ0aWNhbCA9IGVuYWJsZWQ7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIENvbmZpZ3VyZXMgdGhlIGtleSBtYW5hZ2VyIHRvIG1vdmUgdGhlIHNlbGVjdGlvbiBob3Jpem9udGFsbHkuCiAgICAgKiBQYXNzaW5nIGluIGBudWxsYCB3aWxsIGRpc2FibGUgaG9yaXpvbnRhbCBtb3ZlbWVudC4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aW9uIERpcmVjdGlvbiBpbiB3aGljaCB0aGUgc2VsZWN0aW9uIGNhbiBiZSBtb3ZlZC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhIb3Jpem9udGFsT3JpZW50YXRpb24oZGlyZWN0aW9uKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5faG9yaXpvbnRhbCA9IGRpcmVjdGlvbjsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogTW9kaWZpZXIga2V5cyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBoZWxkIGRvd24gYW5kIHdob3NlIGRlZmF1bHQgYWN0aW9ucyB3aWxsIGJlIHByZXZlbnRlZAogICAgICogYXMgdGhlIHVzZXIgaXMgcHJlc3NpbmcgdGhlIGFycm93IGtleXMuIERlZmF1bHRzIHRvIG5vdCBhbGxvd2luZyBhbnkgbW9kaWZpZXIga2V5cy4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30ga2V5cwogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aEFsbG93ZWRNb2RpZmllcktleXMoa2V5cykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FsbG93ZWRNb2RpZmllcktleXMgPSBrZXlzOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBUdXJucyBvbiB0eXBlYWhlYWQgbW9kZSB3aGljaCBhbGxvd3MgdXNlcnMgdG8gc2V0IHRoZSBhY3RpdmUgaXRlbSBieSB0eXBpbmcuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez89fSBkZWJvdW5jZUludGVydmFsIFRpbWUgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYmVmb3JlIHNldHRpbmcgdGhlIGFjdGl2ZSBpdGVtLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aFR5cGVBaGVhZChkZWJvdW5jZUludGVydmFsID0gMjAwKSB7CiAgICAgICAgaWYgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2l0ZW1zLmxlbmd0aCAmJiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9pdGVtcy5zb21lKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGl0ZW0gPT4gdHlwZW9mIGl0ZW0uZ2V0TGFiZWwgIT09ICdmdW5jdGlvbicpKSkgewogICAgICAgICAgICB0aHJvdyBFcnJvcignTGlzdEtleU1hbmFnZXIgaXRlbXMgaW4gdHlwZWFoZWFkIG1vZGUgbXVzdCBpbXBsZW1lbnQgdGhlIGBnZXRMYWJlbGAgbWV0aG9kLicpOwogICAgICAgIH0KICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl90eXBlYWhlYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAvLyBEZWJvdW5jZSB0aGUgcHJlc3NlcyBvZiBub24tbmF2aWdhdGlvbmFsIGtleXMsIGNvbGxlY3QgdGhlIG9uZXMgdGhhdCBjb3JyZXNwb25kIHRvIGxldHRlcnMKICAgICAgICAvLyBhbmQgY29udmVydCB0aG9zZSBsZXR0ZXJzIGJhY2sgaW50byBhIHN0cmluZy4gQWZ0ZXJ3YXJkcyBmaW5kIHRoZSBmaXJzdCBpdGVtIHRoYXQgc3RhcnRzCiAgICAgICAgLy8gd2l0aCB0aGF0IHN0cmluZyBhbmQgc2VsZWN0IGl0LgogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2xldHRlcktleVN0cmVhbS5waXBlKHRhcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBsZXR0ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxldHRlciA9PiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wcmVzc2VkTGV0dGVycy5wdXNoKGxldHRlcikpKSwgZGVib3VuY2VUaW1lKGRlYm91bmNlSW50ZXJ2YWwpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcHJlc3NlZExldHRlcnMubGVuZ3RoID4gMCkpLCBtYXAoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcHJlc3NlZExldHRlcnMuam9pbignJykpKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlucHV0U3RyaW5nCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbnB1dFN0cmluZyA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXRlbXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9nZXRJdGVtc0FycmF5KCk7CiAgICAgICAgICAgIC8vIFN0YXJ0IGF0IDEgYmVjYXVzZSB3ZSB3YW50IHRvIHN0YXJ0IHNlYXJjaGluZyBhdCB0aGUgaXRlbSBpbW1lZGlhdGVseQogICAgICAgICAgICAvLyBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgYWN0aXZlIGl0ZW0uCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaXRlbXMubGVuZ3RoICsgMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9hY3RpdmVJdGVtSW5kZXggKyBpKSAlIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAoISgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3NraXBQcmVkaWNhdGVGbihpdGVtKSAmJgogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChpdGVtLmdldExhYmVsKSkoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKS5pbmRleE9mKGlucHV0U3RyaW5nKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuc2V0QWN0aXZlSXRlbShpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcHJlc3NlZExldHRlcnMgPSBbXTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0QWN0aXZlSXRlbShpdGVtKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSB0aGlzLl9hY3RpdmVJdGVtSW5kZXg7CiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJdGVtKGl0ZW0pOwogICAgICAgIGlmICh0aGlzLl9hY3RpdmVJdGVtSW5kZXggIT09IHByZXZpb3VzSW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5jaGFuZ2UubmV4dCh0aGlzLl9hY3RpdmVJdGVtSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgYWN0aXZlIGl0ZW0gZGVwZW5kaW5nIG9uIHRoZSBrZXkgZXZlbnQgcGFzc2VkIGluLgogICAgICogQHBhcmFtIHs/fSBldmVudCBLZXlib2FyZCBldmVudCB0byBiZSB1c2VkIGZvciBkZXRlcm1pbmluZyB3aGljaCBlbGVtZW50IHNob3VsZCBiZSBhY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbktleWRvd24oZXZlbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1vZGlmaWVycyA9IFsnYWx0S2V5JywgJ2N0cmxLZXknLCAnbWV0YUtleScsICdzaGlmdEtleSddOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc01vZGlmaWVyQWxsb3dlZCA9IG1vZGlmaWVycy5ldmVyeSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2RpZmllcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbW9kaWZpZXIgPT4gewogICAgICAgICAgICByZXR1cm4gIWV2ZW50W21vZGlmaWVyXSB8fCB0aGlzLl9hbGxvd2VkTW9kaWZpZXJLZXlzLmluZGV4T2YobW9kaWZpZXIpID4gLTE7CiAgICAgICAgfSkpOwogICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewogICAgICAgICAgICBjYXNlIFRBQjoKICAgICAgICAgICAgICAgIHRoaXMudGFiT3V0Lm5leHQoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY2FzZSBET1dOX0FSUk9XOgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZlcnRpY2FsICYmIGlzTW9kaWZpZXJBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFVQX0FSUk9XOgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZlcnRpY2FsICYmIGlzTW9kaWZpZXJBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBSSUdIVF9BUlJPVzoKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ob3Jpem9udGFsICYmIGlzTW9kaWZpZXJBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faG9yaXpvbnRhbCA9PT0gJ3J0bCcgPyB0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpIDogdGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIExFRlRfQVJST1c6CiAgICAgICAgICAgICAgICBpZiAodGhpcy5faG9yaXpvbnRhbCAmJiBpc01vZGlmaWVyQWxsb3dlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvcml6b250YWwgPT09ICdydGwnID8gdGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpIDogdGhpcy5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmIChpc01vZGlmaWVyQWxsb3dlZCB8fCBoYXNNb2RpZmllcktleShldmVudCwgJ3NoaWZ0S2V5JykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHVzZSB0aGUgYGV2ZW50LmtleWAgd2hpY2ggYWxzbyBtYXBzIGl0IHRvIHRoZSB1c2VyJ3Mga2V5Ym9hcmQgbGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGZhbGwgYmFjayB0byByZXNvbHZpbmcgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdmlhIHRoZSBrZXlDb2RlLgogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sZXR0ZXJLZXlTdHJlYW0ubmV4dChldmVudC5rZXkudG9Mb2NhbGVVcHBlckNhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChrZXlDb2RlID49IEEgJiYga2V5Q29kZSA8PSBaKSB8fCAoa2V5Q29kZSA+PSBaRVJPICYmIGtleUNvZGUgPD0gTklORSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQoU3RyaW5nLmZyb21DaGFyQ29kZShrZXlDb2RlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHJldHVybiBoZXJlLCBpbiBvcmRlciB0byBhdm9pZCBwcmV2ZW50aW5nCiAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBhY3Rpb24gb2Ygbm9uLW5hdmlnYXRpb25hbCBrZXlzLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wcmVzc2VkTGV0dGVycyA9IFtdOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgYWN0aXZlSXRlbUluZGV4KCkgewogICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVJdGVtSW5kZXg7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBhY3RpdmUgaXRlbS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBhY3RpdmVJdGVtKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVJdGVtOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IHR5cGluZyBpbnRvIHRoZSBtYW5hZ2VyIHVzaW5nIHRoZSB0eXBlYWhlYWQgZmVhdHVyZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGlzVHlwaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wcmVzc2VkTGV0dGVycy5sZW5ndGggPiAwOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBhY3RpdmUgaXRlbSB0byB0aGUgZmlyc3QgZW5hYmxlZCBpdGVtIGluIHRoZSBsaXN0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0Rmlyc3RJdGVtQWN0aXZlKCkgewogICAgICAgIHRoaXMuX3NldEFjdGl2ZUl0ZW1CeUluZGV4KDAsIDEpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBhY3RpdmUgaXRlbSB0byB0aGUgbGFzdCBlbmFibGVkIGl0ZW0gaW4gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRMYXN0SXRlbUFjdGl2ZSgpIHsKICAgICAgICB0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCh0aGlzLl9pdGVtcy5sZW5ndGggLSAxLCAtMSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGFjdGl2ZSBpdGVtIHRvIHRoZSBuZXh0IGVuYWJsZWQgaXRlbSBpbiB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldE5leHRJdGVtQWN0aXZlKCkgewogICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA8IDAgPyB0aGlzLnNldEZpcnN0SXRlbUFjdGl2ZSgpIDogdGhpcy5fc2V0QWN0aXZlSXRlbUJ5RGVsdGEoMSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGFjdGl2ZSBpdGVtIHRvIGEgcHJldmlvdXMgZW5hYmxlZCBpdGVtIGluIHRoZSBsaXN0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0UHJldmlvdXNJdGVtQWN0aXZlKCkgewogICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA8IDAgJiYgdGhpcy5fd3JhcCA/IHRoaXMuc2V0TGFzdEl0ZW1BY3RpdmUoKQogICAgICAgICAgICA6IHRoaXMuX3NldEFjdGl2ZUl0ZW1CeURlbHRhKC0xKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cGRhdGVBY3RpdmVJdGVtKGl0ZW0pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXRlbUFycmF5ID0gdGhpcy5fZ2V0SXRlbXNBcnJheSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleCA9IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyA/IGl0ZW0gOiBpdGVtQXJyYXkuaW5kZXhPZihpdGVtKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWN0aXZlSXRlbSA9IGl0ZW1BcnJheVtpbmRleF07CiAgICAgICAgLy8gRXhwbGljaXRseSBjaGVjayBmb3IgYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBiZWNhdXNlIG90aGVyIGZhbHN5IHZhbHVlcyBhcmUgdmFsaWQuCiAgICAgICAgdGhpcy5fYWN0aXZlSXRlbSA9IGFjdGl2ZUl0ZW0gPT0gbnVsbCA/IG51bGwgOiBhY3RpdmVJdGVtOwogICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IGluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBhY3RpdmUgaXRlbSwgZ2l2ZW4gYSBsaXN0IG9mIGl0ZW1zIGFuZCB0aGUgZGVsdGEgYmV0d2VlbiB0aGUKICAgICAqIGN1cnJlbnRseSBhY3RpdmUgaXRlbSBhbmQgdGhlIG5ldyBhY3RpdmUgaXRlbS4gSXQgd2lsbCBjYWxjdWxhdGUgZGlmZmVyZW50bHkKICAgICAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdyYXAgbW9kZSBpcyB0dXJuZWQgb24uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBkZWx0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldEFjdGl2ZUl0ZW1CeURlbHRhKGRlbHRhKSB7CiAgICAgICAgdGhpcy5fd3JhcCA/IHRoaXMuX3NldEFjdGl2ZUluV3JhcE1vZGUoZGVsdGEpIDogdGhpcy5fc2V0QWN0aXZlSW5EZWZhdWx0TW9kZShkZWx0YSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGFjdGl2ZSBpdGVtIHByb3Blcmx5IGdpdmVuICJ3cmFwIiBtb2RlLiBJbiBvdGhlciB3b3JkcywgaXQgd2lsbCBjb250aW51ZSB0byBtb3ZlCiAgICAgKiBkb3duIHRoZSBsaXN0IHVudGlsIGl0IGZpbmRzIGFuIGl0ZW0gdGhhdCBpcyBub3QgZGlzYWJsZWQsIGFuZCBpdCB3aWxsIHdyYXAgaWYgaXQKICAgICAqIGVuY291bnRlcnMgZWl0aGVyIGVuZCBvZiB0aGUgbGlzdC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGRlbHRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0QWN0aXZlSW5XcmFwTW9kZShkZWx0YSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2dldEl0ZW1zQXJyYXkoKTsKICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCArIChkZWx0YSAqIGkpICsgaXRlbXMubGVuZ3RoKSAlIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdOwogICAgICAgICAgICBpZiAoIXRoaXMuX3NraXBQcmVkaWNhdGVGbihpdGVtKSkgewogICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKGluZGV4KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgYWN0aXZlIGl0ZW0gcHJvcGVybHkgZ2l2ZW4gdGhlIGRlZmF1bHQgbW9kZS4gSW4gb3RoZXIgd29yZHMsIGl0IHdpbGwKICAgICAqIGNvbnRpbnVlIHRvIG1vdmUgZG93biB0aGUgbGlzdCB1bnRpbCBpdCBmaW5kcyBhbiBpdGVtIHRoYXQgaXMgbm90IGRpc2FibGVkLiBJZgogICAgICogaXQgZW5jb3VudGVycyBlaXRoZXIgZW5kIG9mIHRoZSBsaXN0LCBpdCB3aWxsIHN0b3AgYW5kIG5vdCB3cmFwLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZGVsdGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRBY3RpdmVJbkRlZmF1bHRNb2RlKGRlbHRhKSB7CiAgICAgICAgdGhpcy5fc2V0QWN0aXZlSXRlbUJ5SW5kZXgodGhpcy5fYWN0aXZlSXRlbUluZGV4ICsgZGVsdGEsIGRlbHRhKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgYWN0aXZlIGl0ZW0gdG8gdGhlIGZpcnN0IGVuYWJsZWQgaXRlbSBzdGFydGluZyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkLiBJZiB0aGUKICAgICAqIGl0ZW0gaXMgZGlzYWJsZWQsIGl0IHdpbGwgbW92ZSBpbiB0aGUgZmFsbGJhY2tEZWx0YSBkaXJlY3Rpb24gdW50aWwgaXQgZWl0aGVyCiAgICAgKiBmaW5kcyBhbiBlbmFibGVkIGl0ZW0gb3IgZW5jb3VudGVycyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gZmFsbGJhY2tEZWx0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldEFjdGl2ZUl0ZW1CeUluZGV4KGluZGV4LCBmYWxsYmFja0RlbHRhKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNBcnJheSgpOwogICAgICAgIGlmICghaXRlbXNbaW5kZXhdKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHRoaXMuX3NraXBQcmVkaWNhdGVGbihpdGVtc1tpbmRleF0pKSB7CiAgICAgICAgICAgIGluZGV4ICs9IGZhbGxiYWNrRGVsdGE7CiAgICAgICAgICAgIGlmICghaXRlbXNbaW5kZXhdKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKGluZGV4KTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaXRlbXMgYXMgYW4gYXJyYXkuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEl0ZW1zQXJyYXkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zIGluc3RhbmNlb2YgUXVlcnlMaXN0ID8gdGhpcy5faXRlbXMudG9BcnJheSgpIDogdGhpcy5faXRlbXM7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciBleHRlbmRzIExpc3RLZXlNYW5hZ2VyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0QWN0aXZlSXRlbShpbmRleCkgewogICAgICAgIGlmICh0aGlzLmFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtLnNldEluYWN0aXZlU3R5bGVzKCk7CiAgICAgICAgfQogICAgICAgIHN1cGVyLnNldEFjdGl2ZUl0ZW0oaW5kZXgpOwogICAgICAgIGlmICh0aGlzLmFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtLnNldEFjdGl2ZVN0eWxlcygpOwogICAgICAgIH0KICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIEZvY3VzS2V5TWFuYWdlciBleHRlbmRzIExpc3RLZXlNYW5hZ2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5fb3JpZ2luID0gJ3Byb2dyYW0nOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBmb2N1cyBvcmlnaW4gdGhhdCB3aWxsIGJlIHBhc3NlZCBpbiB0byB0aGUgaXRlbXMgZm9yIGFueSBzdWJzZXF1ZW50IGBmb2N1c2AgY2FsbHMuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IG9yaWdpbiBGb2N1cyBvcmlnaW4gdG8gYmUgdXNlZCB3aGVuIGZvY3VzaW5nIGl0ZW1zLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgc2V0Rm9jdXNPcmlnaW4ob3JpZ2luKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3JpZ2luID0gb3JpZ2luOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldEFjdGl2ZUl0ZW0oaXRlbSkgewogICAgICAgIHN1cGVyLnNldEFjdGl2ZUl0ZW0oaXRlbSk7CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSXRlbSkgewogICAgICAgICAgICB0aGlzLmFjdGl2ZUl0ZW0uZm9jdXModGhpcy5fb3JpZ2luKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9pbnRlcmFjdGl2aXR5LWNoZWNrZXIvaW50ZXJhY3Rpdml0eS1jaGVja2VyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIFRoZSBJbnRlcmFjdGl2aXR5Q2hlY2tlciBsZWFucyBoZWF2aWx5IG9uIHRoZSBhbGx5LmpzIGFjY2Vzc2liaWxpdHkgdXRpbGl0aWVzLgovLyBNZXRob2RzIGxpa2UgYGlzVGFiYmFibGVgIGFyZSBvbmx5IGNvdmVyaW5nIHNwZWNpZmljIGVkZ2UtY2FzZXMgZm9yIHRoZSBicm93c2VycyB3aGljaCBhcmUKLy8gc3VwcG9ydGVkLgovKioKICogVXRpbGl0eSBmb3IgY2hlY2tpbmcgdGhlIGludGVyYWN0aXZpdHkgb2YgYW4gZWxlbWVudCwgc3VjaCBhcyB3aGV0aGVyIGlzIGlzIGZvY3VzYWJsZSBvcgogKiB0YWJiYWJsZS4KICovCmNsYXNzIEludGVyYWN0aXZpdHlDaGVja2VyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAqLwogICAgY29uc3RydWN0b3IoX3BsYXRmb3JtKSB7CiAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIGRpc2FibGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBFbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkLgogICAgICovCiAgICBpc0Rpc2FibGVkKGVsZW1lbnQpIHsKICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNhcHR1cmUgc29tZSBjYXNlcywgc3VjaCBhcyBhIG5vbi1mb3JtIGNvbnRyb2wgd2l0aCBhIGRpc2FibGVkIGF0dHJpYnV0ZSBvcgogICAgICAgIC8vIGEgZm9ybSBjb250cm9sIGluc2lkZSBvZiBhIGRpc2FibGVkIGZvcm0sIGJ1dCBzaG91bGQgY2FwdHVyZSB0aGUgbW9zdCBjb21tb24gY2FzZXMuCiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyB2aXNpYmxlIGZvciB0aGUgcHVycG9zZXMgb2YgaW50ZXJhY3Rpdml0eS4KICAgICAqCiAgICAgKiBUaGlzIHdpbGwgY2FwdHVyZSBzdGF0ZXMgbGlrZSBgZGlzcGxheTogbm9uZWAgYW5kIGB2aXNpYmlsaXR5OiBoaWRkZW5gLCBidXQgbm90IHRoaW5ncyBsaWtlCiAgICAgKiBiZWluZyBjbGlwcGVkIGJ5IGFuIGBvdmVyZmxvdzogaGlkZGVuYCBwYXJlbnQgb3IgYmVpbmcgb3V0c2lkZSB0aGUgdmlld3BvcnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHZpc2libGUuCiAgICAgKi8KICAgIGlzVmlzaWJsZShlbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIGhhc0dlb21ldHJ5KGVsZW1lbnQpICYmIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkudmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBjYW4gYmUgcmVhY2hlZCB2aWEgVGFiIGtleS4KICAgICAqIEFzc3VtZXMgdGhhdCB0aGUgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgd2l0aCBpc0ZvY3VzYWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICogQHJldHVybiB7P30gV2hldGhlciB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZS4KICAgICAqLwogICAgaXNUYWJiYWJsZShlbGVtZW50KSB7CiAgICAgICAgLy8gTm90aGluZyBpcyB0YWJiYWJsZSBvbiB0aGUgc2VydmVyIPCfmI4KICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmcmFtZUVsZW1lbnQgPSBnZXRGcmFtZUVsZW1lbnQoZ2V0V2luZG93KGVsZW1lbnQpKTsKICAgICAgICBpZiAoZnJhbWVFbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZnJhbWVUeXBlID0gZnJhbWVFbGVtZW50ICYmIGZyYW1lRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAvLyBGcmFtZSBlbGVtZW50cyBpbmhlcml0IHRoZWlyIHRhYmluZGV4IG9udG8gYWxsIGNoaWxkIGVsZW1lbnRzLgogICAgICAgICAgICBpZiAoZ2V0VGFiSW5kZXhWYWx1ZShmcmFtZUVsZW1lbnQpID09PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlYmtpdCBhbmQgQmxpbmsgY29uc2lkZXIgYW55dGhpbmcgaW5zaWRlIG9mIGFuIDxvYmplY3Q+IGVsZW1lbnQgYXMgbm9uLXRhYmJhYmxlLgogICAgICAgICAgICBpZiAoKHRoaXMuX3BsYXRmb3JtLkJMSU5LIHx8IHRoaXMuX3BsYXRmb3JtLldFQktJVCkgJiYgZnJhbWVUeXBlID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlYmtpdCBhbmQgQmxpbmsgZGlzYWJsZSB0YWJiaW5nIHRvIGFuIGVsZW1lbnQgaW5zaWRlIG9mIGFuIGludmlzaWJsZSBmcmFtZS4KICAgICAgICAgICAgaWYgKCh0aGlzLl9wbGF0Zm9ybS5CTElOSyB8fCB0aGlzLl9wbGF0Zm9ybS5XRUJLSVQpICYmICF0aGlzLmlzVmlzaWJsZShmcmFtZUVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRhYkluZGV4VmFsdWUgPSBnZXRUYWJJbmRleFZhbHVlKGVsZW1lbnQpOwogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykpIHsKICAgICAgICAgICAgcmV0dXJuIHRhYkluZGV4VmFsdWUgIT09IC0xOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpZnJhbWUnKSB7CiAgICAgICAgICAgIC8vIFRoZSBmcmFtZXMgbWF5IGJlIHRhYmJhYmxlIGRlcGVuZGluZyBvbiBjb250ZW50LCBidXQgaXQncyBub3QgcG9zc2libHkgdG8gcmVsaWFibHkKICAgICAgICAgICAgLy8gaW52ZXN0aWdhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYW1lcy4KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdhdWRpbycpIHsKICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udHJvbHMnKSkgewogICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCBhbiA8YXVkaW8+IGVsZW1lbnQgd2l0aG91dCB0aGUgY29udHJvbHMgZW5hYmxlZCBpcyBub3QgdGFiYmFibGUuCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fcGxhdGZvcm0uQkxJTkspIHsKICAgICAgICAgICAgICAgIC8vIEluIEJsaW5rIDxhdWRpbyBjb250cm9scz4gZWxlbWVudHMgYXJlIGFsd2F5cyB0YWJiYWJsZS4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3ZpZGVvJykgewogICAgICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250cm9scycpICYmIHRoaXMuX3BsYXRmb3JtLlRSSURFTlQpIHsKICAgICAgICAgICAgICAgIC8vIEluIFRyaWRlbnQgYSA8dmlkZW8+IGVsZW1lbnQgd2l0aG91dCB0aGUgY29udHJvbHMgZW5hYmxlZCBpcyBub3QgdGFiYmFibGUuCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fcGxhdGZvcm0uQkxJTksgfHwgdGhpcy5fcGxhdGZvcm0uRklSRUZPWCkgewogICAgICAgICAgICAgICAgLy8gSW4gQ2hyb21lIGFuZCBGaXJlZm94IDx2aWRlbyBjb250cm9scz4gZWxlbWVudHMgYXJlIGFsd2F5cyB0YWJiYWJsZS4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ29iamVjdCcgJiYgKHRoaXMuX3BsYXRmb3JtLkJMSU5LIHx8IHRoaXMuX3BsYXRmb3JtLldFQktJVCkpIHsKICAgICAgICAgICAgLy8gSW4gYWxsIEJsaW5rIGFuZCBXZWJLaXQgYmFzZWQgYnJvd3NlcnMgPG9iamVjdD4gZWxlbWVudHMgYXJlIG5ldmVyIHRhYmJhYmxlLgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEluIGlPUyB0aGUgYnJvd3NlciBvbmx5IGNvbnNpZGVycyBzb21lIHNwZWNpZmljIGVsZW1lbnRzIGFzIHRhYmJhYmxlLgogICAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybS5XRUJLSVQgJiYgdGhpcy5fcGxhdGZvcm0uSU9TICYmICFpc1BvdGVudGlhbGx5VGFiYmFibGVJT1MoZWxlbWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZWxlbWVudC50YWJJbmRleCA+PSAwOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBjYW4gYmUgZm9jdXNlZCBieSB0aGUgdXNlci4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICogQHJldHVybiB7P30gV2hldGhlciB0aGUgZWxlbWVudCBpcyBmb2N1c2FibGUuCiAgICAgKi8KICAgIGlzRm9jdXNhYmxlKGVsZW1lbnQpIHsKICAgICAgICAvLyBQZXJmb3JtIGNoZWNrcyBpbiBvcmRlciBvZiBsZWZ0IHRvIG1vc3QgZXhwZW5zaXZlLgogICAgICAgIC8vIEFnYWluLCBuYWl2ZSBhcHByb2FjaCB0aGF0IGRvZXMgbm90IGNhcHR1cmUgbWFueSBlZGdlIGNhc2VzIGFuZCBicm93c2VyIHF1aXJrcy4KICAgICAgICByZXR1cm4gaXNQb3RlbnRpYWxseUZvY3VzYWJsZShlbGVtZW50KSAmJiAhdGhpcy5pc0Rpc2FibGVkKGVsZW1lbnQpICYmIHRoaXMuaXNWaXNpYmxlKGVsZW1lbnQpOwogICAgfQp9CkludGVyYWN0aXZpdHlDaGVja2VyLsm1ZmFjID0gZnVuY3Rpb24gSW50ZXJhY3Rpdml0eUNoZWNrZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSW50ZXJhY3Rpdml0eUNoZWNrZXIpKMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfTsKLyoqIEBub2NvbGxhcHNlICovCkludGVyYWN0aXZpdHlDaGVja2VyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBQbGF0Zm9ybSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBJbnRlcmFjdGl2aXR5Q2hlY2tlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIEludGVyYWN0aXZpdHlDaGVja2VyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgSW50ZXJhY3Rpdml0eUNoZWNrZXIoybXJtWluamVjdChQbGF0Zm9ybSkpOyB9LCB0b2tlbjogSW50ZXJhY3Rpdml0eUNoZWNrZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKLyoqCiAqIFJldHVybnMgdGhlIGZyYW1lIGVsZW1lbnQgZnJvbSBhIHdpbmRvdyBvYmplY3QuIFNpbmNlIGJyb3dzZXJzIGxpa2UgTVMgRWRnZSB0aHJvdyBlcnJvcnMgaWYKICogdGhlIGZyYW1lRWxlbWVudCBwcm9wZXJ0eSBpcyBiZWluZyBhY2Nlc3NlZCBmcm9tIGEgZGlmZmVyZW50IGhvc3QgYWRkcmVzcywgdGhpcyBwcm9wZXJ0eQogKiBzaG91bGQgYmUgYWNjZXNzZWQgY2FyZWZ1bGx5LgogKiBAcGFyYW0gez99IHdpbmRvdwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50KHdpbmRvdykgewogICAgdHJ5IHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdy5mcmFtZUVsZW1lbnQpKTsKICAgIH0KICAgIGNhdGNoIChfYSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaGFzIGFueSBnZW9tZXRyeSAvIHJlY3RhbmdsZXMuCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzR2VvbWV0cnkoZWxlbWVudCkgewogICAgLy8gVXNlIGxvZ2ljIGZyb20galF1ZXJ5IHRvIGNoZWNrIGZvciBhbiBpbnZpc2libGUgZWxlbWVudC4KICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iL21hc3Rlci9zcmMvY3NzL2hpZGRlblZpc2libGVTZWxlY3RvcnMuanMjTDEyCiAgICByZXR1cm4gISEoZWxlbWVudC5vZmZzZXRXaWR0aCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCB8fAogICAgICAgICh0eXBlb2YgZWxlbWVudC5nZXRDbGllbnRSZWN0cyA9PT0gJ2Z1bmN0aW9uJyAmJiBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSk7Cn0KLyoqCiAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50J3MKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc05hdGl2ZUZvcm1FbGVtZW50KGVsZW1lbnQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiBub2RlTmFtZSA9PT0gJ2lucHV0JyB8fAogICAgICAgIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fAogICAgICAgIG5vZGVOYW1lID09PSAnYnV0dG9uJyB8fAogICAgICAgIG5vZGVOYW1lID09PSAndGV4dGFyZWEnOwp9Ci8qKgogKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBhbiBgPGlucHV0IHR5cGU9ImhpZGRlbiI+YC4KICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0hpZGRlbklucHV0KGVsZW1lbnQpIHsKICAgIHJldHVybiBpc0lucHV0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LnR5cGUgPT0gJ2hpZGRlbic7Cn0KLyoqCiAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIGFuIGFuY2hvciB0aGF0IGhhcyBhbiBocmVmIGF0dHJpYnV0ZS4KICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0FuY2hvcldpdGhIcmVmKGVsZW1lbnQpIHsKICAgIHJldHVybiBpc0FuY2hvckVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2hyZWYnKTsKfQovKioKICogR2V0cyB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgYW4gaW5wdXQgZWxlbWVudC4KICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0lucHV0RWxlbWVudChlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdpbnB1dCc7Cn0KLyoqCiAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIGFuIGFuY2hvciBlbGVtZW50LgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQW5jaG9yRWxlbWVudChlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdhJzsKfQovKioKICogR2V0cyB3aGV0aGVyIGFuIGVsZW1lbnQgaGFzIGEgdmFsaWQgdGFiaW5kZXguCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzVmFsaWRUYWJJbmRleChlbGVtZW50KSB7CiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpIHx8IGVsZW1lbnQudGFiSW5kZXggPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0YWJJbmRleCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpOwogICAgLy8gSUUxMSBwYXJzZXMgdGFiaW5kZXg9IiIgYXMgdGhlIHZhbHVlICItMzI3NjgiCiAgICBpZiAodGFiSW5kZXggPT0gJy0zMjc2OCcpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gISEodGFiSW5kZXggJiYgIWlzTmFOKHBhcnNlSW50KHRhYkluZGV4LCAxMCkpKTsKfQovKioKICogUmV0dXJucyB0aGUgcGFyc2VkIHRhYmluZGV4IGZyb20gdGhlIGVsZW1lbnQgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUKICogZXZhbHVhdGVkIHRhYmluZGV4IGZyb20gdGhlIGJyb3dzZXJzIGRlZmF1bHRzLgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFRhYkluZGV4VmFsdWUoZWxlbWVudCkgewogICAgaWYgKCFoYXNWYWxpZFRhYkluZGV4KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBTZWUgYnJvd3NlciBpc3N1ZSBpbiBHZWNrbyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTI4MDU0CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0YWJJbmRleCA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpIHx8ICcnLCAxMCk7CiAgICByZXR1cm4gaXNOYU4odGFiSW5kZXgpID8gLTEgOiB0YWJJbmRleDsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIHBvdGVudGlhbGx5IHRhYmJhYmxlIG9uIGlPUwogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzUG90ZW50aWFsbHlUYWJiYWJsZUlPUyhlbGVtZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5wdXRUeXBlID0gbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnR5cGU7CiAgICByZXR1cm4gaW5wdXRUeXBlID09PSAndGV4dCcKICAgICAgICB8fCBpbnB1dFR5cGUgPT09ICdwYXNzd29yZCcKICAgICAgICB8fCBub2RlTmFtZSA9PT0gJ3NlbGVjdCcKICAgICAgICB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJzsKfQovKioKICogR2V0cyB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgcG90ZW50aWFsbHkgZm9jdXNhYmxlIHdpdGhvdXQgdGFraW5nIGN1cnJlbnQgdmlzaWJsZS9kaXNhYmxlZCBzdGF0ZQogKiBpbnRvIGFjY291bnQuCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQb3RlbnRpYWxseUZvY3VzYWJsZShlbGVtZW50KSB7CiAgICAvLyBJbnB1dHMgYXJlIHBvdGVudGlhbGx5IGZvY3VzYWJsZSAqdW5sZXNzKiB0aGV5J3JlIHR5cGU9ImhpZGRlbiIuCiAgICBpZiAoaXNIaWRkZW5JbnB1dChlbGVtZW50KSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBpc05hdGl2ZUZvcm1FbGVtZW50KGVsZW1lbnQpIHx8CiAgICAgICAgaXNBbmNob3JXaXRoSHJlZihlbGVtZW50KSB8fAogICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSB8fAogICAgICAgIGhhc1ZhbGlkVGFiSW5kZXgoZWxlbWVudCk7Cn0KLyoqCiAqIEdldHMgdGhlIHBhcmVudCB3aW5kb3cgb2YgYSBET00gbm9kZSB3aXRoIHJlZ2FyZHMgb2YgYmVpbmcgaW5zaWRlIG9mIGFuIGlmcmFtZS4KICogQHBhcmFtIHs/fSBub2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkgewogICAgLy8gb3duZXJEb2N1bWVudCBpcyBudWxsIGlmIGBub2RlYCBpdHNlbGYgKmlzKiBhIGRvY3VtZW50LgogICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvZm9jdXMtdHJhcC9mb2N1cy10cmFwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBDbGFzcyB0aGF0IGFsbG93cyBmb3IgdHJhcHBpbmcgZm9jdXMgd2l0aGluIGEgRE9NIGVsZW1lbnQuCiAqCiAqIFRoaXMgY2xhc3MgY3VycmVudGx5IHVzZXMgYSByZWxhdGl2ZWx5IHNpbXBsZSBhcHByb2FjaCB0byBmb2N1cyB0cmFwcGluZy4KICogSXQgYXNzdW1lcyB0aGF0IHRoZSB0YWIgb3JkZXIgaXMgdGhlIHNhbWUgYXMgRE9NIG9yZGVyLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS4KICogVGhpbmdzIGxpa2UgYHRhYkluZGV4ID4gMGAsIGZsZXggYG9yZGVyYCwgYW5kIHNoYWRvdyByb290cyBjYW4gY2F1c2UgdG8gdHdvIHRvIG1pc2FsaWduLgogKgogKiBAZGVwcmVjYXRlZCBVc2UgYENvbmZpZ3VyYWJsZUZvY3VzVHJhcGAgaW5zdGVhZC4KICogXEBicmVha2luZy1jaGFuZ2UgZm9yIDExLjAuMCBSZW1vdmUgdGhpcyBjbGFzcy4KICovCmNsYXNzIEZvY3VzVHJhcCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gX2NoZWNrZXIKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7Pz19IGRlZmVyQW5jaG9ycwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX2NoZWNrZXIsIF9uZ1pvbmUsIF9kb2N1bWVudCwgZGVmZXJBbmNob3JzID0gZmFsc2UpIHsKICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7CiAgICAgICAgdGhpcy5fY2hlY2tlciA9IF9jaGVja2VyOwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgdGhpcy5faGFzQXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBhbmNob3JzLiBOZWVkIHRvIGJlIHJlZ3VsYXIgZnVuY3Rpb25zIHNvIHRoYXQgd2UgY2FuIHVuYmluZCB0aGVtIGxhdGVyLgogICAgICAgIHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lciA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuZm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KCkpOwogICAgICAgIHRoaXMuZW5kQW5jaG9yTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSk7CiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7CiAgICAgICAgaWYgKCFkZWZlckFuY2hvcnMpIHsKICAgICAgICAgICAgdGhpcy5hdHRhY2hBbmNob3JzKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBmb2N1cyB0cmFwIGlzIGFjdGl2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBlbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fZW5hYmxlZDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZW5hYmxlZCh2YWx1ZSkgewogICAgICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZTsKICAgICAgICBpZiAodGhpcy5fc3RhcnRBbmNob3IgJiYgdGhpcy5fZW5kQW5jaG9yKSB7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHZhbHVlLCB0aGlzLl9zdGFydEFuY2hvcik7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHZhbHVlLCB0aGlzLl9lbmRBbmNob3IpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVzdHJveXMgdGhlIGZvY3VzIHRyYXAgYnkgY2xlYW5pbmcgdXAgdGhlIGFuY2hvcnMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFydEFuY2hvciA9IHRoaXMuX3N0YXJ0QW5jaG9yOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbmRBbmNob3IgPSB0aGlzLl9lbmRBbmNob3I7CiAgICAgICAgaWYgKHN0YXJ0QW5jaG9yKSB7CiAgICAgICAgICAgIHN0YXJ0QW5jaG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5zdGFydEFuY2hvckxpc3RlbmVyKTsKICAgICAgICAgICAgaWYgKHN0YXJ0QW5jaG9yLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgIHN0YXJ0QW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3RhcnRBbmNob3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlbmRBbmNob3IpIHsKICAgICAgICAgICAgZW5kQW5jaG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5lbmRBbmNob3JMaXN0ZW5lcik7CiAgICAgICAgICAgIGlmIChlbmRBbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgZW5kQW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZW5kQW5jaG9yKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9zdGFydEFuY2hvciA9IHRoaXMuX2VuZEFuY2hvciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEluc2VydHMgdGhlIGFuY2hvcnMgaW50byB0aGUgRE9NLiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5CiAgICAgKiBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBjYW4gYmUgZGVmZXJyZWQgZm9yIGNhc2VzIGxpa2UgZGlyZWN0aXZlcyB3aXRoIGAqbmdJZmAuCiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBmb2N1cyB0cmFwIG1hbmFnZWQgdG8gYXR0YWNoIHN1Y2Nlc3NmdWx5LiBUaGlzIG1heSBub3QgYmUgdGhlIGNhc2UKICAgICAqIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBpc24ndCBjdXJyZW50bHkgaW4gdGhlIERPTS4KICAgICAqLwogICAgYXR0YWNoQW5jaG9ycygpIHsKICAgICAgICAvLyBJZiB3ZSdyZSBub3Qgb24gdGhlIGJyb3dzZXIsIHRoZXJlIGNhbiBiZSBubyBmb2N1cyB0byB0cmFwLgogICAgICAgIGlmICh0aGlzLl9oYXNBdHRhY2hlZCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9zdGFydEFuY2hvcikgewogICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRBbmNob3IgPSB0aGlzLl9jcmVhdGVBbmNob3IoKTsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9zdGFydEFuY2hvcikpLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5zdGFydEFuY2hvckxpc3RlbmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuX2VuZEFuY2hvcikgewogICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5jaG9yID0gdGhpcy5fY3JlYXRlQW5jaG9yKCk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZW5kQW5jaG9yKSkuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmVuZEFuY2hvckxpc3RlbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N0YXJ0QW5jaG9yKSksIHRoaXMuX2VsZW1lbnQpOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbmRBbmNob3IpKSwgdGhpcy5fZWxlbWVudC5uZXh0U2libGluZyk7CiAgICAgICAgICAgIHRoaXMuX2hhc0F0dGFjaGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0F0dGFjaGVkOwogICAgfQogICAgLyoqCiAgICAgKiBXYWl0cyBmb3IgdGhlIHpvbmUgdG8gc3RhYmlsaXplLCB0aGVuIGVpdGhlciBmb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgdGhlCiAgICAgKiB1c2VyIHNwZWNpZmllZCwgb3IgdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fSBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBib29sZWFuLCBkZXBlbmRpbmcKICAgICAqIG9uIHdoZXRoZXIgZm9jdXMgd2FzIG1vdmVkIHN1Y2Nlc3NmdWx5LgogICAgICovCiAgICBmb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXNvbHZlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNvbHZlID0+IHsKICAgICAgICAgICAgdGhpcy5fZXhlY3V0ZU9uU3RhYmxlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHJlc29sdmUodGhpcy5mb2N1c0luaXRpYWxFbGVtZW50KCkpKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBXYWl0cyBmb3IgdGhlIHpvbmUgdG8gc3RhYmlsaXplLCB0aGVuIGZvY3VzZXMKICAgICAqIHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50IHdpdGhpbiB0aGUgZm9jdXMgdHJhcCByZWdpb24uCiAgICAgKiBAcmV0dXJuIHs/fSBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBib29sZWFuLCBkZXBlbmRpbmcKICAgICAqIG9uIHdoZXRoZXIgZm9jdXMgd2FzIG1vdmVkIHN1Y2Nlc3NmdWx5LgogICAgICovCiAgICBmb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50V2hlblJlYWR5KCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXNvbHZlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNvbHZlID0+IHsKICAgICAgICAgICAgdGhpcy5fZXhlY3V0ZU9uU3RhYmxlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHJlc29sdmUodGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KCkpKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBXYWl0cyBmb3IgdGhlIHpvbmUgdG8gc3RhYmlsaXplLCB0aGVuIGZvY3VzZXMKICAgICAqIHRoZSBsYXN0IHRhYmJhYmxlIGVsZW1lbnQgd2l0aGluIHRoZSBmb2N1cyB0cmFwIHJlZ2lvbi4KICAgICAqIEByZXR1cm4gez99IFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIGJvb2xlYW4sIGRlcGVuZGluZwogICAgICogb24gd2hldGhlciBmb2N1cyB3YXMgbW92ZWQgc3VjY2Vzc2Z1bHkuCiAgICAgKi8KICAgIGZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudFdoZW5SZWFkeSgpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVzb2x2ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGVPblN0YWJsZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiByZXNvbHZlKHRoaXMuZm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KCkpKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHNwZWNpZmllZCBib3VuZGFyeSBlbGVtZW50IG9mIHRoZSB0cmFwcGVkIHJlZ2lvbi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGJvdW5kIFRoZSBib3VuZGFyeSB0byBnZXQgKHN0YXJ0IG9yIGVuZCBvZiB0cmFwcGVkIHJlZ2lvbikuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgYm91bmRhcnkgZWxlbWVudC4KICAgICAqLwogICAgX2dldFJlZ2lvbkJvdW5kYXJ5KGJvdW5kKSB7CiAgICAgICAgLy8gQ29udGFpbnMgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiBzZWxlY3RvciwgZm9yIHRlbXBvcmFyeSBiYWNrd2FyZHMgY29tcGFyYWJpbGl0eS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1hcmtlcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbY2RrLWZvY3VzLXJlZ2lvbi0ke2JvdW5kfV0sIGAgKwogICAgICAgICAgICBgW2Nka0ZvY3VzUmVnaW9uJHtib3VuZH1dLCBgICsKICAgICAgICAgICAgYFtjZGstZm9jdXMtJHtib3VuZH1dYCkpKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAgICBpZiAobWFya2Vyc1tpXS5oYXNBdHRyaWJ1dGUoYGNkay1mb2N1cy0ke2JvdW5kfWApKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLSR7Ym91bmR9JywgYCArCiAgICAgICAgICAgICAgICAgICAgYHVzZSAnY2RrRm9jdXNSZWdpb24ke2JvdW5kfScgaW5zdGVhZC4gVGhlIGRlcHJlY2F0ZWQgYCArCiAgICAgICAgICAgICAgICAgICAgYGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgaW4gOC4wLjAuYCwgbWFya2Vyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobWFya2Vyc1tpXS5oYXNBdHRyaWJ1dGUoYGNkay1mb2N1cy1yZWdpb24tJHtib3VuZH1gKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCB1c2Ugb2YgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgJ2Nkay1mb2N1cy1yZWdpb24tJHtib3VuZH0nLCBgICsKICAgICAgICAgICAgICAgICAgICBgdXNlICdjZGtGb2N1c1JlZ2lvbiR7Ym91bmR9JyBpbnN0ZWFkLiBUaGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgYCArCiAgICAgICAgICAgICAgICAgICAgYHdpbGwgYmUgcmVtb3ZlZCBpbiA4LjAuMC5gLCBtYXJrZXJzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYm91bmQgPT0gJ3N0YXJ0JykgewogICAgICAgICAgICByZXR1cm4gbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzWzBdIDogdGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQodGhpcy5fZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXJrZXJzLmxlbmd0aCA/CiAgICAgICAgICAgIG1hcmtlcnNbbWFya2Vycy5sZW5ndGggLSAxXSA6IHRoaXMuX2dldExhc3RUYWJiYWJsZUVsZW1lbnQodGhpcy5fZWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgZm9jdXNlZCB3aGVuIHRoZSBmb2N1cyB0cmFwIGlzIGluaXRpYWxpemVkLgogICAgICogQHJldHVybiB7P30gV2hldGhlciBmb2N1cyB3YXMgbW92ZWQgc3VjY2Vzc2Z1bHkuCiAgICAgKi8KICAgIGZvY3VzSW5pdGlhbEVsZW1lbnQoKSB7CiAgICAgICAgLy8gQ29udGFpbnMgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiBzZWxlY3RvciwgZm9yIHRlbXBvcmFyeSBiYWNrd2FyZHMgY29tcGFyYWJpbGl0eS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVkaXJlY3RUb0VsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbY2RrLWZvY3VzLWluaXRpYWxdLCBgICsKICAgICAgICAgICAgYFtjZGtGb2N1c0luaXRpYWxdYCkpKTsKICAgICAgICBpZiAocmVkaXJlY3RUb0VsZW1lbnQpIHsKICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAgICBpZiAocmVkaXJlY3RUb0VsZW1lbnQuaGFzQXR0cmlidXRlKGBjZGstZm9jdXMtaW5pdGlhbGApKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLWluaXRpYWwnLCBgICsKICAgICAgICAgICAgICAgICAgICBgdXNlICdjZGtGb2N1c0luaXRpYWwnIGluc3RlYWQuIFRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZSBgICsKICAgICAgICAgICAgICAgICAgICBgd2lsbCBiZSByZW1vdmVkIGluIDguMC4wYCwgcmVkaXJlY3RUb0VsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdhcm4gdGhlIGNvbnN1bWVyIGlmIHRoZSBlbGVtZW50IHRoZXkndmUgcG9pbnRlZCB0bwogICAgICAgICAgICAvLyBpc24ndCBmb2N1c2FibGUsIHdoZW4gbm90IGluIHByb2R1Y3Rpb24gbW9kZS4KICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICF0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHJlZGlyZWN0VG9FbGVtZW50KSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBFbGVtZW50IG1hdGNoaW5nICdbY2RrRm9jdXNJbml0aWFsXScgaXMgbm90IGZvY3VzYWJsZS5gLCByZWRpcmVjdFRvRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVkaXJlY3RUb0VsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKTsKICAgIH0KICAgIC8qKgogICAgICogRm9jdXNlcyB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudCB3aXRoaW4gdGhlIGZvY3VzIHRyYXAgcmVnaW9uLgogICAgICogQHJldHVybiB7P30gV2hldGhlciBmb2N1cyB3YXMgbW92ZWQgc3VjY2Vzc2Z1bHkuCiAgICAgKi8KICAgIGZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZGlyZWN0VG9FbGVtZW50ID0gdGhpcy5fZ2V0UmVnaW9uQm91bmRhcnkoJ3N0YXJ0Jyk7CiAgICAgICAgaWYgKHJlZGlyZWN0VG9FbGVtZW50KSB7CiAgICAgICAgICAgIHJlZGlyZWN0VG9FbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhIXJlZGlyZWN0VG9FbGVtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBGb2N1c2VzIHRoZSBsYXN0IHRhYmJhYmxlIGVsZW1lbnQgd2l0aGluIHRoZSBmb2N1cyB0cmFwIHJlZ2lvbi4KICAgICAqIEByZXR1cm4gez99IFdoZXRoZXIgZm9jdXMgd2FzIG1vdmVkIHN1Y2Nlc3NmdWx5LgogICAgICovCiAgICBmb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnQoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZGlyZWN0VG9FbGVtZW50ID0gdGhpcy5fZ2V0UmVnaW9uQm91bmRhcnkoJ2VuZCcpOwogICAgICAgIGlmIChyZWRpcmVjdFRvRWxlbWVudCkgewogICAgICAgICAgICByZWRpcmVjdFRvRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gISFyZWRpcmVjdFRvRWxlbWVudDsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZvY3VzIHRyYXAgaGFzIHN1Y2Nlc3NmdWx5IGJlZW4gYXR0YWNoZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBoYXNBdHRhY2hlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzQXR0YWNoZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudCBmcm9tIGEgRE9NIHN1YnRyZWUgKGluY2x1c2l2ZSkuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSByb290CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQocm9vdCkgewogICAgICAgIGlmICh0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHJvb3QpICYmIHRoaXMuX2NoZWNrZXIuaXNUYWJiYWJsZShyb290KSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICAgICAgLy8gSXRlcmF0ZSBpbiBET00gb3JkZXIuIE5vdGUgdGhhdCBJRSBkb2Vzbid0IGhhdmUgYGNoaWxkcmVuYCBmb3IgU1ZHIHNvIHdlIGZhbGwKICAgICAgICAvLyBiYWNrIHRvIGBjaGlsZE5vZGVzYCB3aGljaCBpbmNsdWRlcyB0ZXh0IG5vZGVzLCBjb21tZW50cyBldGMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjaGlsZHJlbiA9IHJvb3QuY2hpbGRyZW4gfHwgcm9vdC5jaGlsZE5vZGVzOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdGFiYmFibGVDaGlsZCA9IGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSB0aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREUgPwogICAgICAgICAgICAgICAgdGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQoKC8qKiBAdHlwZSB7P30gKi8gKGNoaWxkcmVuW2ldKSkpIDoKICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIGlmICh0YWJiYWJsZUNoaWxkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGFiYmFibGVDaGlsZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBsYXN0IHRhYmJhYmxlIGVsZW1lbnQgZnJvbSBhIERPTSBzdWJ0cmVlIChpbmNsdXNpdmUpLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldExhc3RUYWJiYWJsZUVsZW1lbnQocm9vdCkgewogICAgICAgIGlmICh0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHJvb3QpICYmIHRoaXMuX2NoZWNrZXIuaXNUYWJiYWJsZShyb290KSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICAgICAgLy8gSXRlcmF0ZSBpbiByZXZlcnNlIERPTSBvcmRlci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNoaWxkcmVuID0gcm9vdC5jaGlsZHJlbiB8fCByb290LmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHRhYmJhYmxlQ2hpbGQgPSBjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gdGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFID8KICAgICAgICAgICAgICAgIHRoaXMuX2dldExhc3RUYWJiYWJsZUVsZW1lbnQoKC8qKiBAdHlwZSB7P30gKi8gKGNoaWxkcmVuW2ldKSkpIDoKICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIGlmICh0YWJiYWJsZUNoaWxkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGFiYmFibGVDaGlsZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhbmNob3IgZWxlbWVudC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY3JlYXRlQW5jaG9yKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbmNob3IgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICB0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleCh0aGlzLl9lbmFibGVkLCBhbmNob3IpOwogICAgICAgIGFuY2hvci5jbGFzc0xpc3QuYWRkKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7CiAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5hZGQoJ2Nkay1mb2N1cy10cmFwLWFuY2hvcicpOwogICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICByZXR1cm4gYW5jaG9yOwogICAgfQogICAgLyoqCiAgICAgKiBUb2dnbGVzIHRoZSBgdGFiaW5kZXhgIG9mIGFuIGFuY2hvciwgYmFzZWQgb24gdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGZvY3VzIHRyYXAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBpc0VuYWJsZWQgV2hldGhlciB0aGUgZm9jdXMgdHJhcCBpcyBlbmFibGVkLgogICAgICogQHBhcmFtIHs/fSBhbmNob3IgQW5jaG9yIG9uIHdoaWNoIHRvIHRvZ2dsZSB0aGUgdGFiaW5kZXguCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdG9nZ2xlQW5jaG9yVGFiSW5kZXgoaXNFbmFibGVkLCBhbmNob3IpIHsKICAgICAgICAvLyBSZW1vdmUgdGhlIHRhYmluZGV4IGNvbXBsZXRlbHksIHJhdGhlciB0aGFuIHNldHRpbmcgaXQgdG8gLTEsIGJlY2F1c2UgaWYgdGhlCiAgICAgICAgLy8gZWxlbWVudCBoYXMgYSB0YWJpbmRleCwgdGhlIHVzZXIgbWlnaHQgc3RpbGwgaGl0IGl0IHdoZW4gbmF2aWdhdGluZyB3aXRoIHRoZSBhcnJvdyBrZXlzLgogICAgICAgIGlzRW5hYmxlZCA/IGFuY2hvci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSA6IGFuY2hvci5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7CiAgICB9CiAgICAvKioKICAgICAqIFRvZ2dsZXMgdGhlYHRhYmluZGV4YCBvZiBib3RoIGFuY2hvcnMgdG8gZWl0aGVyIHRyYXAgVGFiIGZvY3VzIG9yIGFsbG93IGl0IHRvIGVzY2FwZS4KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSB7P30gZW5hYmxlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9nZ2xlQW5jaG9ycyhlbmFibGVkKSB7CiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0QW5jaG9yICYmIHRoaXMuX2VuZEFuY2hvcikgewogICAgICAgICAgICB0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleChlbmFibGVkLCB0aGlzLl9zdGFydEFuY2hvcik7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KGVuYWJsZWQsIHRoaXMuX2VuZEFuY2hvcik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlcyBhIGZ1bmN0aW9uIHdoZW4gdGhlIHpvbmUgaXMgc3RhYmxlLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9leGVjdXRlT25TdGFibGUoZm4pIHsKICAgICAgICBpZiAodGhpcy5fbmdab25lLmlzU3RhYmxlKSB7CiAgICAgICAgICAgIGZuKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm4pOwogICAgICAgIH0KICAgIH0KfQovKioKICogRmFjdG9yeSB0aGF0IGFsbG93cyBlYXN5IGluc3RhbnRpYXRpb24gb2YgZm9jdXMgdHJhcHMuCiAqIEBkZXByZWNhdGVkIFVzZSBgQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeWAgaW5zdGVhZC4KICogXEBicmVha2luZy1jaGFuZ2UgZm9yIDExLjAuMCBSZW1vdmUgdGhpcyBjbGFzcy4KICovCmNsYXNzIEZvY3VzVHJhcEZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9jaGVja2VyCiAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9jaGVja2VyLCBfbmdab25lLCBfZG9jdW1lbnQpIHsKICAgICAgICB0aGlzLl9jaGVja2VyID0gX2NoZWNrZXI7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZvY3VzLXRyYXBwZWQgcmVnaW9uIGFyb3VuZCB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgZWxlbWVudCBhcm91bmQgd2hpY2ggZm9jdXMgd2lsbCBiZSB0cmFwcGVkLgogICAgICogQHBhcmFtIHs/PX0gZGVmZXJDYXB0dXJlRWxlbWVudHMgRGVmZXJzIHRoZSBjcmVhdGlvbiBvZiBmb2N1cy1jYXB0dXJpbmcgZWxlbWVudHMgdG8gYmUgZG9uZQogICAgICogICAgIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgogICAgICogQHJldHVybiB7P30gVGhlIGNyZWF0ZWQgZm9jdXMgdHJhcCBpbnN0YW5jZS4KICAgICAqLwogICAgY3JlYXRlKGVsZW1lbnQsIGRlZmVyQ2FwdHVyZUVsZW1lbnRzID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gbmV3IEZvY3VzVHJhcChlbGVtZW50LCB0aGlzLl9jaGVja2VyLCB0aGlzLl9uZ1pvbmUsIHRoaXMuX2RvY3VtZW50LCBkZWZlckNhcHR1cmVFbGVtZW50cyk7CiAgICB9Cn0KRm9jdXNUcmFwRmFjdG9yeS7JtWZhYyA9IGZ1bmN0aW9uIEZvY3VzVHJhcEZhY3RvcnlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRm9jdXNUcmFwRmFjdG9yeSkoybXJtWluamVjdChJbnRlcmFjdGl2aXR5Q2hlY2tlciksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpGb2N1c1RyYXBGYWN0b3J5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBJbnRlcmFjdGl2aXR5Q2hlY2tlciB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gRm9jdXNUcmFwRmFjdG9yeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIEZvY3VzVHJhcEZhY3RvcnlfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBGb2N1c1RyYXBGYWN0b3J5KMm1ybVpbmplY3QoSW50ZXJhY3Rpdml0eUNoZWNrZXIpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9LCB0b2tlbjogRm9jdXNUcmFwRmFjdG9yeSwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwovKioKICogRGlyZWN0aXZlIGZvciB0cmFwcGluZyBmb2N1cyB3aXRoaW4gYSByZWdpb24uCiAqLwpjbGFzcyBDZGtUcmFwRm9jdXMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9mb2N1c1RyYXBGYWN0b3J5CiAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX2ZvY3VzVHJhcEZhY3RvcnksIF9kb2N1bWVudCkgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB0aGlzLl9mb2N1c1RyYXBGYWN0b3J5ID0gX2ZvY3VzVHJhcEZhY3Rvcnk7CiAgICAgICAgLyoqCiAgICAgICAgICogUHJldmlvdXNseSBmb2N1c2VkIGVsZW1lbnQgdG8gcmVzdG9yZSBmb2N1cyB0byB1cG9uIGRlc3Ryb3kgd2hlbiB1c2luZyBhdXRvQ2FwdHVyZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBudWxsOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0cnVlKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgZm9jdXMgdHJhcCBpcyBhY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuZm9jdXNUcmFwLmVuYWJsZWQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGVuYWJsZWQodmFsdWUpIHsgdGhpcy5mb2N1c1RyYXAuZW5hYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgZGlyZWN0aXZlIHNob3VsZCBhdXRvbWF0aWFsbHkgbW92ZSBmb2N1cyBpbnRvIHRoZSB0cmFwcGVkIHJlZ2lvbiB1cG9uCiAgICAgKiBpbml0aWFsaXphdGlvbiBhbmQgcmV0dXJuIGZvY3VzIHRvIHRoZSBwcmV2aW91cyBhY3RpdmVFbGVtZW50IHVwb24gZGVzdHJ1Y3Rpb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgYXV0b0NhcHR1cmUoKSB7IHJldHVybiB0aGlzLl9hdXRvQ2FwdHVyZTsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgYXV0b0NhcHR1cmUodmFsdWUpIHsgdGhpcy5fYXV0b0NhcHR1cmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTsKICAgICAgICAvLyBJZiB3ZSBzdG9yZWQgYSBwcmV2aW91c2x5IGZvY3VzZWQgZWxlbWVudCB3aGVuIHVzaW5nIGF1dG9DYXB0dXJlLCByZXR1cm4gZm9jdXMgdG8gdGhhdAogICAgICAgIC8vIGVsZW1lbnQgbm93IHRoYXQgdGhlIHRyYXBwZWQgcmVnaW9uIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzbHlGb2N1c2VkRWxlbWVudC5mb2N1cygpOwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlckNvbnRlbnRJbml0KCkgewogICAgICAgIHRoaXMuZm9jdXNUcmFwLmF0dGFjaEFuY2hvcnMoKTsKICAgICAgICBpZiAodGhpcy5hdXRvQ2FwdHVyZSkgewogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpOwogICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgaWYgKCF0aGlzLmZvY3VzVHJhcC5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmF0dGFjaEFuY2hvcnMoKTsKICAgICAgICB9CiAgICB9Cn0KQ2RrVHJhcEZvY3VzLsm1ZmFjID0gZnVuY3Rpb24gQ2RrVHJhcEZvY3VzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka1RyYXBGb2N1cykoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c1RyYXBGYWN0b3J5KSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSk7IH07CkNka1RyYXBGb2N1cy7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtUcmFwRm9jdXMsIHNlbGVjdG9yczogW1siIiwgImNka1RyYXBGb2N1cyIsICIiXV0sIGlucHV0czogeyBlbmFibGVkOiBbImNka1RyYXBGb2N1cyIsICJlbmFibGVkIl0sIGF1dG9DYXB0dXJlOiBbImNka1RyYXBGb2N1c0F1dG9DYXB0dXJlIiwgImF1dG9DYXB0dXJlIl0gfSwgZXhwb3J0QXM6IFsiY2RrVHJhcEZvY3VzIl0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpDZGtUcmFwRm9jdXMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogRm9jdXNUcmFwRmFjdG9yeSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07CkNka1RyYXBGb2N1cy5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGVuYWJsZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka1RyYXBGb2N1cycsXSB9XSwKICAgIGF1dG9DYXB0dXJlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZScsXSB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLXRyYXAvY29uZmlndXJhYmxlLWZvY3VzLXRyYXAudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENsYXNzIHRoYXQgYWxsb3dzIGZvciB0cmFwcGluZyBmb2N1cyB3aXRoaW4gYSBET00gZWxlbWVudC4KICoKICogVGhpcyBjbGFzcyB1c2VzIGEgc3RyYXRlZ3kgcGF0dGVybiB0aGF0IGRldGVybWluZXMgaG93IGl0IHRyYXBzIGZvY3VzLgogKiBTZWUgRm9jdXNUcmFwSW5lcnRTdHJhdGVneS4KICovCmNsYXNzIENvbmZpZ3VyYWJsZUZvY3VzVHJhcCBleHRlbmRzIEZvY3VzVHJhcCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gX2NoZWNrZXIKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzVHJhcE1hbmFnZXIKICAgICAqIEBwYXJhbSB7P30gX2luZXJ0U3RyYXRlZ3kKICAgICAqIEBwYXJhbSB7P30gY29uZmlnCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50LCBfY2hlY2tlciwgX25nWm9uZSwgX2RvY3VtZW50LCBfZm9jdXNUcmFwTWFuYWdlciwgX2luZXJ0U3RyYXRlZ3ksIGNvbmZpZykgewogICAgICAgIHN1cGVyKF9lbGVtZW50LCBfY2hlY2tlciwgX25nWm9uZSwgX2RvY3VtZW50LCBjb25maWcuZGVmZXIpOwogICAgICAgIHRoaXMuX2ZvY3VzVHJhcE1hbmFnZXIgPSBfZm9jdXNUcmFwTWFuYWdlcjsKICAgICAgICB0aGlzLl9pbmVydFN0cmF0ZWd5ID0gX2luZXJ0U3RyYXRlZ3k7CiAgICAgICAgdGhpcy5fZm9jdXNUcmFwTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgRm9jdXNUcmFwIGlzIGVuYWJsZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGVuYWJsZWQodmFsdWUpIHsKICAgICAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7CiAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fZm9jdXNUcmFwTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVHJhcE1hbmFnZXIuZGVyZWdpc3Rlcih0aGlzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE5vdGlmaWVzIHRoZSBGb2N1c1RyYXBNYW5hZ2VyIHRoYXQgdGhpcyBGb2N1c1RyYXAgd2lsbCBiZSBkZXN0cm95ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuX2ZvY3VzVHJhcE1hbmFnZXIuZGVyZWdpc3Rlcih0aGlzKTsKICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWFuYWdlZEZvY3VzVHJhcC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9lbmFibGUoKSB7CiAgICAgICAgdGhpcy5faW5lcnRTdHJhdGVneS5wcmV2ZW50Rm9jdXModGhpcyk7CiAgICAgICAgdGhpcy50b2dnbGVBbmNob3JzKHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hbmFnZWRGb2N1c1RyYXAuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZGlzYWJsZSgpIHsKICAgICAgICB0aGlzLl9pbmVydFN0cmF0ZWd5LmFsbG93Rm9jdXModGhpcyk7CiAgICAgICAgdGhpcy50b2dnbGVBbmNob3JzKGZhbHNlKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLXRyYXAvcG9seWZpbGwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBJRSAxMSBjb21wYXRpYmxlIGNsb3Nlc3QgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBhYmxlIHRvIHN0YXJ0IGZyb20gbm9uLUVsZW1lbnQgTm9kZXMuCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IHNlbGVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjbG9zZXN0KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTm9kZSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXJyID0gZWxlbWVudDsKICAgIHdoaWxlIChjdXJyICE9IG51bGwgJiYgIShjdXJyIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKICAgICAgICBjdXJyID0gY3Vyci5wYXJlbnROb2RlOwogICAgfQogICAgcmV0dXJuIGN1cnIgJiYgKC8qKiBAdHlwZSB7P30gKi8gKChoYXNOYXRpdmVDbG9zZXN0ID8KICAgICAgICBjdXJyLmNsb3Nlc3Qoc2VsZWN0b3IpIDogcG9seWZpbGxDbG9zZXN0KGN1cnIsIHNlbGVjdG9yKSkpKTsKfQovKioKICogUG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGhvdXQgRWxlbWVudC5jbG9zZXN0LgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSBzZWxlY3RvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcG9seWZpbGxDbG9zZXN0KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3VyciA9IGVsZW1lbnQ7CiAgICB3aGlsZSAoY3VyciAhPSBudWxsICYmICEoY3VyciBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgbWF0Y2hlcyhjdXJyLCBzZWxlY3RvcikpKSB7CiAgICAgICAgY3VyciA9IGN1cnIucGFyZW50Tm9kZTsKICAgIH0KICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKGN1cnIgfHwgbnVsbCkpKTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IGhhc05hdGl2ZUNsb3Nlc3QgPSB0eXBlb2YgRWxlbWVudCAhPSAndW5kZWZpbmVkJyAmJiAhIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q7Ci8qKgogKiBJRSAxMSBjb21wYXRpYmxlIG1hdGNoZXMgaW1wbGVtZW50YXRpb24uCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IHNlbGVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXRjaGVzKGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzID8KICAgICAgICBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpIDoKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSlbJ21zTWF0Y2hlc1NlbGVjdG9yJ10oc2VsZWN0b3IpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvZm9jdXMtdHJhcC9ldmVudC1saXN0ZW5lci1pbmVydC1zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogTGlnaHR3ZWlnaHQgRm9jdXNUcmFwSW5lcnRTdHJhdGVneSB0aGF0IGFkZHMgYSBkb2N1bWVudCBmb2N1cyBldmVudAogKiBsaXN0ZW5lciB0byByZWRpcmVjdCBmb2N1cyBiYWNrIGluc2lkZSB0aGUgRm9jdXNUcmFwLgogKi8KY2xhc3MgRXZlbnRMaXN0ZW5lckZvY3VzVHJhcEluZXJ0U3RyYXRlZ3kgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXMgZXZlbnQgaGFuZGxlci4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9saXN0ZW5lciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEFkZHMgYSBkb2N1bWVudCBldmVudCBsaXN0ZW5lciB0aGF0IGtlZXBzIGZvY3VzIGluc2lkZSB0aGUgRm9jdXNUcmFwLgogICAgICogQHBhcmFtIHs/fSBmb2N1c1RyYXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHByZXZlbnRGb2N1cyhmb2N1c1RyYXApIHsKICAgICAgICAvLyBFbnN1cmUgdGhlcmUncyBvbmx5IG9uZSBsaXN0ZW5lciBwZXIgZG9jdW1lbnQKICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXIpIHsKICAgICAgICAgICAgZm9jdXNUcmFwLl9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsICgvKiogQHR5cGUgez99ICovICh0aGlzLl9saXN0ZW5lcikpLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZSkgPT4gdGhpcy5fdHJhcEZvY3VzKGZvY3VzVHJhcCwgZSkpOwogICAgICAgIGZvY3VzVHJhcC5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgZm9jdXNUcmFwLl9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgvKiogQHR5cGUgez99ICovICh0aGlzLl9saXN0ZW5lcikpLCB0cnVlKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGFkZGVkIGluIHByZXZlbnRGb2N1cy4KICAgICAqIEBwYXJhbSB7P30gZm9jdXNUcmFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhbGxvd0ZvY3VzKGZvY3VzVHJhcCkgewogICAgICAgIGlmICghdGhpcy5fbGlzdGVuZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmb2N1c1RyYXAuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2xpc3RlbmVyKSksIHRydWUpOwogICAgICAgIHRoaXMuX2xpc3RlbmVyID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogUmVmb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBGb2N1c1RyYXAgaWYgdGhlIGZvY3VzIGV2ZW50IHRhcmdldCB3YXMgb3V0c2lkZQogICAgICogdGhlIEZvY3VzVHJhcC4KICAgICAqCiAgICAgKiBUaGlzIGlzIGFuIGV2ZW50IGxpc3RlbmVyIGNhbGxiYWNrLiBUaGUgZXZlbnQgbGlzdGVuZXIgaXMgYWRkZWQgaW4gcnVuT3V0c2lkZUFuZ3VsYXIsCiAgICAgKiBzbyBhbGwgdGhpcyBjb2RlIHJ1bnMgb3V0c2lkZSBBbmd1bGFyIGFzIHdlbGwuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBmb2N1c1RyYXAKICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90cmFwRm9jdXMoZm9jdXNUcmFwLCBldmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YXJnZXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvY3VzVHJhcFJvb3QgPSBmb2N1c1RyYXAuX2VsZW1lbnQ7CiAgICAgICAgLy8gRG9uJ3QgcmVmb2N1cyBpZiB0YXJnZXQgd2FzIGluIGFuIG92ZXJsYXksIGJlY2F1c2UgdGhlIG92ZXJsYXkgbWlnaHQgYmUgYXNzb2NpYXRlZAogICAgICAgIC8vIHdpdGggYW4gZWxlbWVudCBpbnNpZGUgdGhlIEZvY3VzVHJhcCwgZXguIG1hdC1zZWxlY3QuCiAgICAgICAgaWYgKCFmb2N1c1RyYXBSb290LmNvbnRhaW5zKHRhcmdldCkgJiYgY2xvc2VzdCh0YXJnZXQsICdkaXYuY2RrLW92ZXJsYXktcGFuZScpID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFNvbWUgbGVnYWN5IEZvY3VzVHJhcCB1c2FnZXMgaGF2ZSBsb2dpYyB0aGF0IGZvY3VzZXMgc29tZSBlbGVtZW50IG9uIHRoZSBwYWdlCiAgICAgICAgICAgIC8vIGp1c3QgYmVmb3JlIEZvY3VzVHJhcCBpcyBkZXN0cm95ZWQuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2FpdAogICAgICAgICAgICAvLyB0byBiZSBzdXJlIEZvY3VzVHJhcCBpcyBzdGlsbCBlbmFibGVkIGJlZm9yZSByZWZvY3VzaW5nLgogICAgICAgICAgICBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgZm9jdXMgd2Fzbid0IHB1dCBiYWNrIGludG8gdGhlIGZvY3VzIHRyYXAgd2hpbGUgdGhlIHRpbWVvdXQgd2FzIHBlbmRpbmcuCiAgICAgICAgICAgICAgICBpZiAoZm9jdXNUcmFwLmVuYWJsZWQgJiYgIWZvY3VzVHJhcFJvb3QuY29udGFpbnMoZm9jdXNUcmFwLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIGZvY3VzVHJhcC5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9mb2N1cy10cmFwL2NvbmZpZ3VyYWJsZS1mb2N1cy10cmFwLWNvbmZpZy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIENvbmZpZ3VyYXRpb24gZm9yIGNyZWF0aW5nIGEgQ29uZmlndXJhYmxlRm9jdXNUcmFwLgogKi8KY2xhc3MgQ29uZmlndXJhYmxlRm9jdXNUcmFwQ29uZmlnIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gZGVmZXIgdGhlIGNyZWF0aW9uIG9mIEZvY3VzVHJhcCBlbGVtZW50cyB0byBiZQogICAgICAgICAqIGRvbmUgbWFudWFsbHkgYnkgdGhlIHVzZXIuIERlZmF1bHQgaXMgdG8gY3JlYXRlIHRoZW0KICAgICAgICAgKiBhdXRvbWF0aWNhbGx5LgogICAgICAgICAqLwogICAgICAgIHRoaXMuZGVmZXIgPSBmYWxzZTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC1pbmVydC1zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhlIGluamVjdGlvbiB0b2tlbiB1c2VkIHRvIHNwZWNpZnkgdGhlIGluZXJ0IHN0cmF0ZWd5LgogKiBAdHlwZSB7P30KICovCmNvbnN0IEZPQ1VTX1RSQVBfSU5FUlRfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0ZPQ1VTX1RSQVBfSU5FUlRfU1RSQVRFR1knKTsKLyoqCiAqIEluamVjdGFibGUgdGhhdCBlbnN1cmVzIG9ubHkgdGhlIG1vc3QgcmVjZW50bHkgZW5hYmxlZCBGb2N1c1RyYXAgaXMgYWN0aXZlLgogKi8KY2xhc3MgRm9jdXNUcmFwTWFuYWdlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvLyBBIHN0YWNrIG9mIHRoZSBGb2N1c1RyYXBzIG9uIHRoZSBwYWdlLiBPbmx5IHRoZSBGb2N1c1RyYXAgYXQgdGhlCiAgICAgICAgLy8gdG9wIG9mIHRoZSBzdGFjayBpcyBhY3RpdmUuCiAgICAgICAgdGhpcy5fZm9jdXNUcmFwU3RhY2sgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogRGlzYWJsZXMgdGhlIEZvY3VzVHJhcCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kIHRoZW4gcHVzaGVzCiAgICAgKiB0aGUgbmV3IEZvY3VzVHJhcCBvbnRvIHRoZSBzdGFjay4KICAgICAqIEBwYXJhbSB7P30gZm9jdXNUcmFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlcihmb2N1c1RyYXApIHsKICAgICAgICAvLyBEZWR1cGUgZm9jdXNUcmFwcyB0aGF0IHJlZ2lzdGVyIG11bHRpcGxlIHRpbWVzLgogICAgICAgIHRoaXMuX2ZvY3VzVHJhcFN0YWNrID0gdGhpcy5fZm9jdXNUcmFwU3RhY2suZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZ0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZnQpID0+IGZ0ICE9PSBmb2N1c1RyYXApKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN0YWNrID0gdGhpcy5fZm9jdXNUcmFwU3RhY2s7CiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5fZGlzYWJsZSgpOwogICAgICAgIH0KICAgICAgICBzdGFjay5wdXNoKGZvY3VzVHJhcCk7CiAgICAgICAgZm9jdXNUcmFwLl9lbmFibGUoKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyB0aGUgRm9jdXNUcmFwIGZyb20gdGhlIHN0YWNrLCBhbmQgYWN0aXZhdGVzIHRoZQogICAgICogRm9jdXNUcmFwIHRoYXQgaXMgdGhlIG5ldyB0b3Agb2YgdGhlIHN0YWNrLgogICAgICogQHBhcmFtIHs/fSBmb2N1c1RyYXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlcmVnaXN0ZXIoZm9jdXNUcmFwKSB7CiAgICAgICAgZm9jdXNUcmFwLl9kaXNhYmxlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5fZm9jdXNUcmFwU3RhY2s7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGkgPSBzdGFjay5pbmRleE9mKGZvY3VzVHJhcCk7CiAgICAgICAgaWYgKGkgIT09IC0xKSB7CiAgICAgICAgICAgIHN0YWNrLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0uX2VuYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CkZvY3VzVHJhcE1hbmFnZXIuybVmYWMgPSBmdW5jdGlvbiBGb2N1c1RyYXBNYW5hZ2VyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvY3VzVHJhcE1hbmFnZXIpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBGb2N1c1RyYXBNYW5hZ2VyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRm9jdXNUcmFwTWFuYWdlcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEZvY3VzVHJhcE1hbmFnZXIoKTsgfSwgdG9rZW46IEZvY3VzVHJhcE1hbmFnZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9mb2N1cy10cmFwL2NvbmZpZ3VyYWJsZS1mb2N1cy10cmFwLWZhY3RvcnkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEZhY3RvcnkgdGhhdCBhbGxvd3MgZWFzeSBpbnN0YW50aWF0aW9uIG9mIGNvbmZpZ3VyYWJsZSBmb2N1cyB0cmFwcy4KICovCmNsYXNzIENvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9jaGVja2VyCiAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzVHJhcE1hbmFnZXIKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKiBAcGFyYW0gez89fSBfaW5lcnRTdHJhdGVneQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfY2hlY2tlciwgX25nWm9uZSwgX2ZvY3VzVHJhcE1hbmFnZXIsIF9kb2N1bWVudCwgX2luZXJ0U3RyYXRlZ3kpIHsKICAgICAgICB0aGlzLl9jaGVja2VyID0gX2NoZWNrZXI7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyID0gX2ZvY3VzVHJhcE1hbmFnZXI7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgLy8gVE9ETyBzcGxpdCB1cCB0aGUgc3RyYXRlZ2llcyBpbnRvIGRpZmZlcmVudCBtb2R1bGVzLCBzaW1pbGFyIHRvIERhdGVBZGFwdGVyLgogICAgICAgIHRoaXMuX2luZXJ0U3RyYXRlZ3kgPSBfaW5lcnRTdHJhdGVneSB8fCBuZXcgRXZlbnRMaXN0ZW5lckZvY3VzVHJhcEluZXJ0U3RyYXRlZ3koKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZShlbGVtZW50LCBjb25maWcgPSBuZXcgQ29uZmlndXJhYmxlRm9jdXNUcmFwQ29uZmlnKCkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbmZpZ09iamVjdDsKICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgIGNvbmZpZ09iamVjdCA9IG5ldyBDb25maWd1cmFibGVGb2N1c1RyYXBDb25maWcoKTsKICAgICAgICAgICAgY29uZmlnT2JqZWN0LmRlZmVyID0gY29uZmlnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29uZmlnT2JqZWN0ID0gY29uZmlnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IENvbmZpZ3VyYWJsZUZvY3VzVHJhcChlbGVtZW50LCB0aGlzLl9jaGVja2VyLCB0aGlzLl9uZ1pvbmUsIHRoaXMuX2RvY3VtZW50LCB0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLCB0aGlzLl9pbmVydFN0cmF0ZWd5LCBjb25maWdPYmplY3QpOwogICAgfQp9CkNvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkuybVmYWMgPSBmdW5jdGlvbiBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkpKMm1ybVpbmplY3QoSW50ZXJhY3Rpdml0eUNoZWNrZXIpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRm9jdXNUcmFwTWFuYWdlciksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoRk9DVVNfVFJBUF9JTkVSVF9TVFJBVEVHWSwgOCkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogSW50ZXJhY3Rpdml0eUNoZWNrZXIgfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IEZvY3VzVHJhcE1hbmFnZXIgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0ZPQ1VTX1RSQVBfSU5FUlRfU1RSQVRFR1ksXSB9XSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeV9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IENvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkoybXJtWluamVjdChJbnRlcmFjdGl2aXR5Q2hlY2tlciksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChGb2N1c1RyYXBNYW5hZ2VyKSwgybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChGT0NVU19UUkFQX0lORVJUX1NUUkFURUdZLCA4KSk7IH0sIHRva2VuOiBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvbGl2ZS1hbm5vdW5jZXIvbGl2ZS1hbm5vdW5jZXItdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTElWRV9BTk5PVU5DRVJfRUxFTUVOVF9UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignbGl2ZUFubm91bmNlckVsZW1lbnQnLCB7CiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiBMSVZFX0FOTk9VTkNFUl9FTEVNRU5UX1RPS0VOX0ZBQ1RPUlksCn0pOwovKioKICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU5fRkFDVE9SWSgpIHsKICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIExpdmVBbm5vdW5jZXIuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTElWRV9BTk5PVU5DRVJfREVGQVVMVF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdMSVZFX0FOTk9VTkNFUl9ERUZBVUxUX09QVElPTlMnKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9saXZlLWFubm91bmNlci9saXZlLWFubm91bmNlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBMaXZlQW5ub3VuY2VyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50VG9rZW4KICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7Pz19IF9kZWZhdWx0T3B0aW9ucwogICAgICovCiAgICBjb25zdHJ1Y3RvcihlbGVtZW50VG9rZW4sIF9uZ1pvbmUsIF9kb2N1bWVudCwgX2RlZmF1bHRPcHRpb25zKSB7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucyA9IF9kZWZhdWx0T3B0aW9uczsKICAgICAgICAvLyBXZSBpbmplY3QgdGhlIGxpdmUgZWxlbWVudCBhbmQgZG9jdW1lbnQgYXMgYGFueWAgYmVjYXVzZSB0aGUgY29uc3RydWN0b3Igc2lnbmF0dXJlIGNhbm5vdAogICAgICAgIC8vIHJlZmVyZW5jZSBicm93c2VyIGdsb2JhbHMgKEhUTUxFbGVtZW50LCBEb2N1bWVudCkgb24gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLCBzaW5jZSBoYXZpbmcKICAgICAgICAvLyBhIGNsYXNzIGRlY29yYXRvciBjYXVzZXMgVHlwZVNjcmlwdCB0byBwcmVzZXJ2ZSB0aGUgY29uc3RydWN0b3Igc2lnbmF0dXJlIHR5cGVzLgogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIHRoaXMuX2xpdmVFbGVtZW50ID0gZWxlbWVudFRva2VuIHx8IHRoaXMuX2NyZWF0ZUxpdmVFbGVtZW50KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICogQHBhcmFtIHsuLi4/fSBhcmdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhbm5vdW5jZShtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwb2xpdGVuZXNzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZHVyYXRpb247CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnbnVtYmVyJykgewogICAgICAgICAgICBkdXJhdGlvbiA9IGFyZ3NbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBbcG9saXRlbmVzcywgZHVyYXRpb25dID0gYXJnczsKICAgICAgICB9CiAgICAgICAgdGhpcy5jbGVhcigpOwogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpOwogICAgICAgIGlmICghcG9saXRlbmVzcykgewogICAgICAgICAgICBwb2xpdGVuZXNzID0KICAgICAgICAgICAgICAgIChkZWZhdWx0T3B0aW9ucyAmJiBkZWZhdWx0T3B0aW9ucy5wb2xpdGVuZXNzKSA/IGRlZmF1bHRPcHRpb25zLnBvbGl0ZW5lc3MgOiAncG9saXRlJzsKICAgICAgICB9CiAgICAgICAgaWYgKGR1cmF0aW9uID09IG51bGwgJiYgZGVmYXVsdE9wdGlvbnMpIHsKICAgICAgICAgICAgZHVyYXRpb24gPSBkZWZhdWx0T3B0aW9ucy5kdXJhdGlvbjsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETzogZW5zdXJlIGNoYW5naW5nIHRoZSBwb2xpdGVuZXNzIHdvcmtzIG9uIGFsbCBlbnZpcm9ubWVudHMgd2Ugc3VwcG9ydC4KICAgICAgICB0aGlzLl9saXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIHBvbGl0ZW5lc3MpOwogICAgICAgIC8vIFRoaXMgMTAwbXMgdGltZW91dCBpcyBuZWNlc3NhcnkgZm9yIHNvbWUgYnJvd3NlciArIHNjcmVlbi1yZWFkZXIgY29tYmluYXRpb25zOgogICAgICAgIC8vIC0gQm90aCBKQVdTIGFuZCBOVkRBIG92ZXIgSUUxMSB3aWxsIG5vdCBhbm5vdW5jZSBhbnl0aGluZyB3aXRob3V0IGEgbm9uLXplcm8gdGltZW91dC4KICAgICAgICAvLyAtIFdpdGggQ2hyb21lIGFuZCBJRTExIHdpdGggTlZEQSBvciBKQVdTLCBhIHJlcGVhdGVkIChpZGVudGljYWwpIG1lc3NhZ2Ugd29uJ3QgYmUgcmVhZCBhCiAgICAgICAgLy8gICBzZWNvbmQgdGltZSB3aXRob3V0IGNsZWFyaW5nIGFuZCB0aGVuIHVzaW5nIGEgbm9uLXplcm8gZGVsYXkuCiAgICAgICAgLy8gKHVzaW5nIEpBV1MgMTcgYXQgdGltZSBvZiB0aGlzIHdyaXRpbmcpLgogICAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlc29sdmUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlc29sdmUgPT4gewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZXZpb3VzVGltZW91dCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9saXZlRWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzVGltZW91dCA9IHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5jbGVhcigpKSwgZHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCAxMDApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgdGV4dCBmcm9tIHRoZSBhbm5vdW5jZXIgZWxlbWVudC4gQ2FuIGJlIHVzZWQgdG8gcHJldmVudAogICAgICogc2NyZWVuIHJlYWRlcnMgZnJvbSByZWFkaW5nIHRoZSB0ZXh0IG91dCBhZ2FpbiB3aGlsZSB0aGUgdXNlciBpcyBnb2luZwogICAgICogdGhyb3VnaCB0aGUgcGFnZSBsYW5kbWFya3MuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbGVhcigpIHsKICAgICAgICBpZiAodGhpcy5fbGl2ZUVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fbGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpOwogICAgICAgIGlmICh0aGlzLl9saXZlRWxlbWVudCAmJiB0aGlzLl9saXZlRWxlbWVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHRoaXMuX2xpdmVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fbGl2ZUVsZW1lbnQpOwogICAgICAgICAgICB0aGlzLl9saXZlRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZUxpdmVFbGVtZW50KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50Q2xhc3MgPSAnY2RrLWxpdmUtYW5ub3VuY2VyLWVsZW1lbnQnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRzID0gdGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlbGVtZW50Q2xhc3MpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsaXZlRWwgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAvLyBSZW1vdmUgYW55IG9sZCBjb250YWluZXJzLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjb21pbmcgaW4gZnJvbSBhIHNlcnZlci1zaWRlLXJlbmRlcmVkIHBhZ2UuCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c0VsZW1lbnRzW2ldLnBhcmVudE5vZGUpKS5yZW1vdmVDaGlsZChwcmV2aW91c0VsZW1lbnRzW2ldKTsKICAgICAgICB9CiAgICAgICAgbGl2ZUVsLmNsYXNzTGlzdC5hZGQoZWxlbWVudENsYXNzKTsKICAgICAgICBsaXZlRWwuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpOwogICAgICAgIGxpdmVFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYXRvbWljJywgJ3RydWUnKTsKICAgICAgICBsaXZlRWwuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaXZlRWwpOwogICAgICAgIHJldHVybiBsaXZlRWw7CiAgICB9Cn0KTGl2ZUFubm91bmNlci7JtWZhYyA9IGZ1bmN0aW9uIExpdmVBbm5vdW5jZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTGl2ZUFubm91bmNlcikoybXJtWluamVjdChMSVZFX0FOTk9VTkNFUl9FTEVNRU5UX1RPS0VOLCA4KSwgybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KExJVkVfQU5OT1VOQ0VSX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KTGl2ZUFubm91bmNlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0xJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU4sXSB9XSB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0xJVkVfQU5OT1VOQ0VSX0RFRkFVTFRfT1BUSU9OUyxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIExpdmVBbm5vdW5jZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBMaXZlQW5ub3VuY2VyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgTGl2ZUFubm91bmNlcijJtcm1aW5qZWN0KExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU4sIDgpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoTElWRV9BTk5PVU5DRVJfREVGQVVMVF9PUFRJT05TLCA4KSk7IH0sIHRva2VuOiBMaXZlQW5ub3VuY2VyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBBIGRpcmVjdGl2ZSB0aGF0IHdvcmtzIHNpbWlsYXJseSB0byBhcmlhLWxpdmUsIGJ1dCB1c2VzIHRoZSBMaXZlQW5ub3VuY2VyIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5CiAqIHdpdGggYSB3aWRlciByYW5nZSBvZiBicm93c2VycyBhbmQgc2NyZWVuIHJlYWRlcnMuCiAqLwpjbGFzcyBDZGtBcmlhTGl2ZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2xpdmVBbm5vdW5jZXIKICAgICAqIEBwYXJhbSB7P30gX2NvbnRlbnRPYnNlcnZlcgogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfbGl2ZUFubm91bmNlciwgX2NvbnRlbnRPYnNlcnZlciwgX25nWm9uZSkgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB0aGlzLl9saXZlQW5ub3VuY2VyID0gX2xpdmVBbm5vdW5jZXI7CiAgICAgICAgdGhpcy5fY29udGVudE9ic2VydmVyID0gX2NvbnRlbnRPYnNlcnZlcjsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIHRoaXMuX3BvbGl0ZW5lc3MgPSAnb2ZmJzsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGFyaWEtbGl2ZSBwb2xpdGVuZXNzIGxldmVsIHRvIHVzZSB3aGVuIGFubm91bmNpbmcgbWVzc2FnZXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcG9saXRlbmVzcygpIHsgcmV0dXJuIHRoaXMuX3BvbGl0ZW5lc3M7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHBvbGl0ZW5lc3ModmFsdWUpIHsKICAgICAgICB0aGlzLl9wb2xpdGVuZXNzID0gdmFsdWUgPT09ICdwb2xpdGUnIHx8IHZhbHVlID09PSAnYXNzZXJ0aXZlJyA/IHZhbHVlIDogJ29mZic7CiAgICAgICAgaWYgKHRoaXMuX3BvbGl0ZW5lc3MgPT09ICdvZmYnKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudE9ic2VydmVyCiAgICAgICAgICAgICAgICAgICAgLm9ic2VydmUodGhpcy5fZWxlbWVudFJlZikKICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIHRleHRDb250ZW50IGhlcmUsIHJhdGhlciB0aGFuIGlubmVyVGV4dCwgaW4gb3JkZXIgdG8gYXZvaWQgYSByZWZsb3cuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUZXh0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgTXV0YXRpb25PYnNlcnZlcmAgZmlyZXMgYWxzbyBmb3IgYXR0cmlidXRlCiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGFubm91bmNlLgogICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VGV4dCAhPT0gdGhpcy5fcHJldmlvdXNBbm5vdW5jZWRUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UoZWxlbWVudFRleHQsIHRoaXMuX3BvbGl0ZW5lc3MpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0Fubm91bmNlZFRleHQgPSBlbGVtZW50VGV4dDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgfQp9CkNka0FyaWFMaXZlLsm1ZmFjID0gZnVuY3Rpb24gQ2RrQXJpYUxpdmVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrQXJpYUxpdmUpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTGl2ZUFubm91bmNlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ29udGVudE9ic2VydmVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpKTsgfTsKQ2RrQXJpYUxpdmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQXJpYUxpdmUsIHNlbGVjdG9yczogW1siIiwgImNka0FyaWFMaXZlIiwgIiJdXSwgaW5wdXRzOiB7IHBvbGl0ZW5lc3M6IFsiY2RrQXJpYUxpdmUiLCAicG9saXRlbmVzcyJdIH0sIGV4cG9ydEFzOiBbImNka0FyaWFMaXZlIl0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpDZGtBcmlhTGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBMaXZlQW5ub3VuY2VyIH0sCiAgICB7IHR5cGU6IENvbnRlbnRPYnNlcnZlciB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfQpdOwpDZGtBcmlhTGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHBvbGl0ZW5lc3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0FyaWFMaXZlJyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvZmFrZS1tb3VzZWRvd24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBTY3JlZW5yZWFkZXJzIHdpbGwgb2Z0ZW4gZmlyZSBmYWtlIG1vdXNlZG93biBldmVudHMgd2hlbiBhIGZvY3VzYWJsZSBlbGVtZW50CiAqIGlzIGFjdGl2YXRlZCB1c2luZyB0aGUga2V5Ym9hcmQuIFdlIGNhbiB0eXBpY2FsbHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVzZSBmYWtlZAogKiBtb3VzZWRvd24gZXZlbnRzIGFuZCByZWFsIG1vdXNlZG93biBldmVudHMgdXNpbmcgdGhlICJidXR0b25zIiBwcm9wZXJ0eS4gV2hpbGUKICogcmVhbCBtb3VzZWRvd25zIHdpbGwgaW5kaWNhdGUgdGhlIG1vdXNlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIChlLmcuICIxIiBmb3IKICogdGhlIGxlZnQgbW91c2UgYnV0dG9uKSwgZmFrZWQgbW91c2Vkb3ducyB3aWxsIHVzdWFsbHkgc2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSB0byAwLgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50KSB7CiAgICByZXR1cm4gZXZlbnQuYnV0dG9ucyA9PT0gMDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLW1vbml0b3IvZm9jdXMtbW9uaXRvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBUaGlzIGlzIHRoZSB2YWx1ZSB1c2VkIGJ5IEFuZ3VsYXJKUyBNYXRlcmlhbC4gVGhyb3VnaCB0cmlhbCBhbmQgZXJyb3IgKG9uIGlQaG9uZSA2UykgdGhleSBmb3VuZAovLyB0aGF0IGEgdmFsdWUgb2YgYXJvdW5kIDY1MG1zIHNlZW1zIGFwcHJvcHJpYXRlLgovKiogQHR5cGUgez99ICovCmNvbnN0IFRPVUNIX0JVRkZFUl9NUyA9IDY1MDsKLyoqCiAqIEluamVjdGlvblRva2VuIGZvciBGb2N1c01vbml0b3JPcHRpb25zLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEZPQ1VTX01PTklUT1JfREVGQVVMVF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdjZGstZm9jdXMtbW9uaXRvci1kZWZhdWx0LW9wdGlvbnMnKTsKLyoqCiAqIEV2ZW50IGxpc3RlbmVyIG9wdGlvbnMgdGhhdCBlbmFibGUgY2FwdHVyaW5nIGFuZCBhbHNvCiAqIG1hcmsgdGhlIGxpc3RlbmVyIGFzIHBhc3NpdmUgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgaXQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7CiAgICBwYXNzaXZlOiB0cnVlLAogICAgY2FwdHVyZTogdHJ1ZQp9KTsKLyoqCiAqIE1vbml0b3JzIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBmb2N1cyBldmVudHMuCiAqLwpjbGFzcyBGb2N1c01vbml0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqLwogICAgY29uc3RydWN0b3IoX25nWm9uZSwgX3BsYXRmb3JtLCAKICAgIC8qKiBAYnJlYWtpbmctY2hhbmdlIDExLjAuMCBtYWtlIGRvY3VtZW50IHJlcXVpcmVkICovCiAgICBkb2N1bWVudCwgb3B0aW9ucykgewogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGZvY3VzIG9yaWdpbiB0aGF0IHRoZSBuZXh0IGZvY3VzIGV2ZW50IGlzIGEgcmVzdWx0IG9mLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX29yaWdpbiA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgd2luZG93IGhhcyBqdXN0IGJlZW4gZm9jdXNlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl93aW5kb3dGb2N1c2VkID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGVsZW1lbnRzIGJlaW5nIG1vbml0b3JlZCB0byB0aGVpciBpbmZvLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2VsZW1lbnRJbmZvID0gbmV3IE1hcCgpOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY3VycmVudGx5IGJlaW5nIG1vbml0b3JlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQgPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGxpc3RlbmVyIGZvciBga2V5ZG93bmAgZXZlbnRzIG9uIHRoZSBkb2N1bWVudC4KICAgICAgICAgKiBOZWVkcyB0byBiZSBhbiBhcnJvdyBmdW5jdGlvbiBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgY29udGV4dCB3aGVuIGl0IGdldHMgYm91bmQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIE9uIGtleWRvd24gcmVjb3JkIHRoZSBvcmlnaW4gYW5kIGNsZWFyIGFueSB0b3VjaCBldmVudCB0aGF0IG1heSBiZSBpbiBwcm9ncmVzcy4KICAgICAgICAgICAgdGhpcy5fbGFzdFRvdWNoVGFyZ2V0ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fc2V0T3JpZ2luRm9yQ3VycmVudEV2ZW50UXVldWUoJ2tleWJvYXJkJyk7CiAgICAgICAgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgbGlzdGVuZXIgZm9yIGBtb3VzZWRvd25gIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQuCiAgICAgICAgICogTmVlZHMgdG8gYmUgYW4gYXJyb3cgZnVuY3Rpb24gaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGNvbnRleHQgd2hlbiBpdCBnZXRzIGJvdW5kLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgIC8vIE9uIG1vdXNlZG93biByZWNvcmQgdGhlIG9yaWdpbiBvbmx5IGlmIHRoZXJlIGlzIG5vdCB0b3VjaAogICAgICAgICAgICAvLyB0YXJnZXQsIHNpbmNlIGEgbW91c2Vkb3duIGNhbiBoYXBwZW4gYXMgYSByZXN1bHQgb2YgYSB0b3VjaCBldmVudC4KICAgICAgICAgICAgaWYgKCF0aGlzLl9sYXN0VG91Y2hUYXJnZXQpIHsKICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMgc2NyZWVuIHJlYWRlcnMgZmlyZSBmYWtlIGBtb3VzZWRvd25gIGV2ZW50cyBpbnN0ZWFkIG9mIGBrZXlkb3duYC4KICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGZvY3VzIHNvdXJjZSB0byBga2V5Ym9hcmRgIGlmIHdlIGRldGVjdCBvbmUgb2YgdGhlbS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpID8gJ2tleWJvYXJkJyA6ICdtb3VzZSc7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRPcmlnaW5Gb3JDdXJyZW50RXZlbnRRdWV1ZShzb3VyY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgbGlzdGVuZXIgZm9yIGB0b3VjaHN0YXJ0YCBldmVudHMgb24gdGhlIGRvY3VtZW50LgogICAgICAgICAqIE5lZWRzIHRvIGJlIGFuIGFycm93IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBjb250ZXh0IHdoZW4gaXQgZ2V0cyBib3VuZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9kb2N1bWVudFRvdWNoc3RhcnRMaXN0ZW5lciA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgLy8gV2hlbiB0aGUgdG91Y2hzdGFydCBldmVudCBmaXJlcyB0aGUgZm9jdXMgZXZlbnQgaXMgbm90IHlldCBpbiB0aGUgZXZlbnQgcXVldWUuIFRoaXMgbWVhbnMKICAgICAgICAgICAgLy8gd2UgY2FuJ3QgcmVseSBvbiB0aGUgdHJpY2sgdXNlZCBhYm92ZSAoc2V0dGluZyB0aW1lb3V0IG9mIDFtcykuIEluc3RlYWQgd2Ugd2FpdCA2NTBtcyB0bwogICAgICAgICAgICAvLyBzZWUgaWYgYSBmb2N1cyBoYXBwZW5zLgogICAgICAgICAgICBpZiAodGhpcy5fdG91Y2hUaW1lb3V0SWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoVGltZW91dElkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGxpc3RlbmVyIGlzIGJvdW5kIG9uIHRoZSBgZG9jdW1lbnRgIGxldmVsLCBhbnkgZXZlbnRzIGNvbWluZyBmcm9tIHRoZSBzaGFkb3cgRE9NCiAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSB0aGVpciBgdGFyZ2V0YCBzZXQgdG8gdGhlIHNoYWRvdyByb290LiBJZiBhdmFpbGFibGUsIHVzZSBgY29tcG9zZWRQYXRoYCB0bwogICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHRoZSBldmVudCB0YXJnZXQuCiAgICAgICAgICAgIHRoaXMuX2xhc3RUb3VjaFRhcmdldCA9IGV2ZW50LmNvbXBvc2VkUGF0aCA/IGV2ZW50LmNvbXBvc2VkUGF0aCgpWzBdIDogZXZlbnQudGFyZ2V0OwogICAgICAgICAgICB0aGlzLl90b3VjaFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fbGFzdFRvdWNoVGFyZ2V0ID0gbnVsbCksIFRPVUNIX0JVRkZFUl9NUyk7CiAgICAgICAgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgbGlzdGVuZXIgZm9yIGBmb2N1c2AgZXZlbnRzIG9uIHRoZSB3aW5kb3cuCiAgICAgICAgICogTmVlZHMgdG8gYmUgYW4gYXJyb3cgZnVuY3Rpb24gaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGNvbnRleHQgd2hlbiBpdCBnZXRzIGJvdW5kLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3dpbmRvd0ZvY3VzTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIE1ha2UgYSBub3RlIG9mIHdoZW4gdGhlIHdpbmRvdyByZWdhaW5zIGZvY3VzLCBzbyB3ZSBjYW4KICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgb3JpZ2luIGluZm8gZm9yIHRoZSBmb2N1c2VkIGVsZW1lbnQuCiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0ZvY3VzZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl93aW5kb3dGb2N1c1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fd2luZG93Rm9jdXNlZCA9IGZhbHNlKSk7CiAgICAgICAgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgbGlzdGVuZXIgZm9yIGBmb2N1c2AgYW5kICdibHVyJyBldmVudHMgb24gdGhlIGRvY3VtZW50LgogICAgICAgICAqIE5lZWRzIHRvIGJlIGFuIGFycm93IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBjb250ZXh0IHdoZW4gaXQgZ2V0cyBib3VuZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9kb2N1bWVudEZvY3VzQW5kQmx1ckxpc3RlbmVyID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gZXZlbnQudHlwZSA9PT0gJ2ZvY3VzJyA/IHRoaXMuX29uRm9jdXMgOiB0aGlzLl9vbkJsdXI7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FsayB1cCB0aGUgYW5jZXN0b3IgY2hhaW4gaW4gb3JkZXIgdG8gc3VwcG9ydCBgY2hlY2tDaGlsZHJlbmAuCiAgICAgICAgICAgIGZvciAobGV0IGVsID0gdGFyZ2V0OyBlbDsgZWwgPSBlbC5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQsIGVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgdGhpcy5fZGV0ZWN0aW9uTW9kZSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGV0ZWN0aW9uTW9kZSkgfHwgMCAvKiBJTU1FRElBVEUgKi87CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/PX0gY2hlY2tDaGlsZHJlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbW9uaXRvcihlbGVtZW50LCBjaGVja0NoaWxkcmVuID0gZmFsc2UpIHsKICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHdlJ3JlIG5vdCBvbiB0aGUgYnJvd3NlciBwbGF0Zm9ybS4KICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50KTsKICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBhbHJlYWR5IG1vbml0b3JpbmcgdGhpcyBlbGVtZW50LgogICAgICAgIGlmICh0aGlzLl9lbGVtZW50SW5mby5oYXMobmF0aXZlRWxlbWVudCkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYWNoZWRJbmZvID0gdGhpcy5fZWxlbWVudEluZm8uZ2V0KG5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoY2FjaGVkSW5mbykpLmNoZWNrQ2hpbGRyZW4gPSBjaGVja0NoaWxkcmVuOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNhY2hlZEluZm8pKS5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpOwogICAgICAgIH0KICAgICAgICAvLyBDcmVhdGUgbW9uaXRvcmVkIGVsZW1lbnQgaW5mby4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5mbyA9IHsKICAgICAgICAgICAgY2hlY2tDaGlsZHJlbjogY2hlY2tDaGlsZHJlbiwKICAgICAgICAgICAgc3ViamVjdDogbmV3IFN1YmplY3QoKQogICAgICAgIH07CiAgICAgICAgdGhpcy5fZWxlbWVudEluZm8uc2V0KG5hdGl2ZUVsZW1lbnQsIGluZm8pOwogICAgICAgIHRoaXMuX2luY3JlbWVudE1vbml0b3JlZEVsZW1lbnRDb3VudCgpOwogICAgICAgIHJldHVybiBpbmZvLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RvcE1vbml0b3JpbmcoZWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudEluZm8gPSB0aGlzLl9lbGVtZW50SW5mby5nZXQobmF0aXZlRWxlbWVudCk7CiAgICAgICAgaWYgKGVsZW1lbnRJbmZvKSB7CiAgICAgICAgICAgIGVsZW1lbnRJbmZvLnN1YmplY3QuY29tcGxldGUoKTsKICAgICAgICAgICAgdGhpcy5fc2V0Q2xhc3NlcyhuYXRpdmVFbGVtZW50KTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudEluZm8uZGVsZXRlKG5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICB0aGlzLl9kZWNyZW1lbnRNb25pdG9yZWRFbGVtZW50Q291bnQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvY3VzVmlhKGVsZW1lbnQsIG9yaWdpbiwgb3B0aW9ucykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50KTsKICAgICAgICB0aGlzLl9zZXRPcmlnaW5Gb3JDdXJyZW50RXZlbnRRdWV1ZShvcmlnaW4pOwogICAgICAgIC8vIGBmb2N1c2AgaXNuJ3QgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIKICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUVsZW1lbnQuZm9jdXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgLy8gQ2FzdCB0aGUgZWxlbWVudCB0byBgYW55YCwgYmVjYXVzZSB0aGUgVFMgdHlwaW5ncyBkb24ndCBoYXZlIHRoZSBgb3B0aW9uc2AgcGFyYW1ldGVyIHlldC4KICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChuYXRpdmVFbGVtZW50KSkpLmZvY3VzKG9wdGlvbnMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudEluZm8uZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5mbwogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKF9pbmZvLCBlbGVtZW50KSA9PiB0aGlzLnN0b3BNb25pdG9yaW5nKGVsZW1lbnQpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFjY2VzcyBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIGRvY3VtZW50IHJlZmVyZW5jZQogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXREb2N1bWVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0V2luZG93KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2MgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGNsYXNzTmFtZQogICAgICogQHBhcmFtIHs/fSBzaG91bGRTZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUsIHNob3VsZFNldCkgewogICAgICAgIGlmIChzaG91bGRTZXQpIHsKICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0Rm9jdXNPcmlnaW4oZXZlbnQpIHsKICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkZXRlY3QgYSBjYXVzZSBmb3IgdGhlIGZvY3VzIGV2ZW50LCBpdCdzIGR1ZSB0byBvbmUgb2YgdGhyZWUgcmVhc29uczoKICAgICAgICAvLyAxKSBUaGUgd2luZG93IGhhcyBqdXN0IHJlZ2FpbmVkIGZvY3VzLCBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8gcmVzdG9yZSB0aGUgZm9jdXNlZCBzdGF0ZSBvZgogICAgICAgIC8vICAgIHRoZSBlbGVtZW50IGZyb20gYmVmb3JlIHRoZSB3aW5kb3cgYmx1cnJlZC4KICAgICAgICAvLyAyKSBJdCB3YXMgY2F1c2VkIGJ5IGEgdG91Y2ggZXZlbnQsIGluIHdoaWNoIGNhc2Ugd2UgbWFyayB0aGUgb3JpZ2luIGFzICd0b3VjaCcuCiAgICAgICAgLy8gMykgVGhlIGVsZW1lbnQgd2FzIHByb2dyYW1tYXRpY2FsbHkgZm9jdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgbWFyayB0aGUgb3JpZ2luIGFzCiAgICAgICAgLy8gICAgJ3Byb2dyYW0nLgogICAgICAgIGlmICh0aGlzLl9vcmlnaW4pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0ZvY3VzZWQgJiYgdGhpcy5fbGFzdEZvY3VzT3JpZ2luKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYXN0Rm9jdXNPcmlnaW47CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuX3dhc0NhdXNlZEJ5VG91Y2goZXZlbnQpKSB7CiAgICAgICAgICAgIHJldHVybiAndG91Y2gnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICdwcm9ncmFtJzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGZvY3VzIGNsYXNzZXMgb24gdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGdpdmVuIGZvY3VzIG9yaWdpbi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdXBkYXRlIHRoZSBjbGFzc2VzIG9uLgogICAgICogQHBhcmFtIHs/PX0gb3JpZ2luIFRoZSBmb2N1cyBvcmlnaW4uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0Q2xhc3NlcyhlbGVtZW50LCBvcmlnaW4pIHsKICAgICAgICB0aGlzLl90b2dnbGVDbGFzcyhlbGVtZW50LCAnY2RrLWZvY3VzZWQnLCAhIW9yaWdpbik7CiAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3MoZWxlbWVudCwgJ2Nkay10b3VjaC1mb2N1c2VkJywgb3JpZ2luID09PSAndG91Y2gnKTsKICAgICAgICB0aGlzLl90b2dnbGVDbGFzcyhlbGVtZW50LCAnY2RrLWtleWJvYXJkLWZvY3VzZWQnLCBvcmlnaW4gPT09ICdrZXlib2FyZCcpOwogICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKGVsZW1lbnQsICdjZGstbW91c2UtZm9jdXNlZCcsIG9yaWdpbiA9PT0gJ21vdXNlJyk7CiAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3MoZWxlbWVudCwgJ2Nkay1wcm9ncmFtLWZvY3VzZWQnLCBvcmlnaW4gPT09ICdwcm9ncmFtJyk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIG9yaWdpbiBhbmQgc2NoZWR1bGVzIGFuIGFzeW5jIGZ1bmN0aW9uIHRvIGNsZWFyIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IHF1ZXVlLgogICAgICogSWYgdGhlIGRldGVjdGlvbiBtb2RlIGlzICdldmVudHVhbCcsIHRoZSBvcmlnaW4gaXMgbmV2ZXIgY2xlYXJlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9yaWdpbiBUaGUgb3JpZ2luIHRvIHNldC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRPcmlnaW5Gb3JDdXJyZW50RXZlbnRRdWV1ZShvcmlnaW4pIHsKICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CiAgICAgICAgICAgIGlmICh0aGlzLl9kZXRlY3Rpb25Nb2RlID09PSAwIC8qIElNTUVESUFURSAqLykgewogICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBmb2N1cyBvcmlnaW4gd29uJ3QgYmUgdmFsaWQgaW4gRmlyZWZveCBiZWNhdXNlIEZpcmVmb3ggc2VlbXMgdG8gZm9jdXMgKm9uZSoKICAgICAgICAgICAgICAgIC8vIHRpY2sgYWZ0ZXIgdGhlIGludGVyYWN0aW9uIGV2ZW50IGZpcmVkLiBUbyBlbnN1cmUgdGhlIGZvY3VzIG9yaWdpbiBpcyBhbHdheXMgY29ycmVjdCwKICAgICAgICAgICAgICAgIC8vIHRoZSBmb2N1cyBvcmlnaW4gd2lsbCBiZSBkZXRlcm1pbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgdGljay4KICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpblRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fb3JpZ2luID0gbnVsbCksIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZm9jdXMgZXZlbnQgd2FzIGNhdXNlZCBieSBhIHRvdWNoc3RhcnQgZXZlbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBldmVudCBUaGUgZm9jdXMgZXZlbnQgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBldmVudCB3YXMgY2F1c2VkIGJ5IGEgdG91Y2guCiAgICAgKi8KICAgIF93YXNDYXVzZWRCeVRvdWNoKGV2ZW50KSB7CiAgICAgICAgLy8gTm90ZShtbWFsZXJiYSk6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHF1aXRlIHBlcmZlY3QsIHRoZXJlIGlzIGEgc21hbGwgZWRnZSBjYXNlLgogICAgICAgIC8vIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZG9tIHN0cnVjdHVyZToKICAgICAgICAvLwogICAgICAgIC8vIDxkaXYgI3BhcmVudCB0YWJpbmRleD0iMCIgY2RrRm9jdXNDbGFzc2VzPgogICAgICAgIC8vICAgPGRpdiAjY2hpbGQgKGNsaWNrKT0iI3BhcmVudC5mb2N1cygpIj48L2Rpdj4KICAgICAgICAvLyA8L2Rpdj4KICAgICAgICAvLwogICAgICAgIC8vIElmIHRoZSB1c2VyIHRvdWNoZXMgdGhlICNjaGlsZCBlbGVtZW50IGFuZCB0aGUgI3BhcmVudCBpcyBwcm9ncmFtbWF0aWNhbGx5IGZvY3VzZWQgYXMgYQogICAgICAgIC8vIHJlc3VsdCwgdGhpcyBjb2RlIHdpbGwgc3RpbGwgY29uc2lkZXIgaXQgdG8gaGF2ZSBiZWVuIGNhdXNlZCBieSB0aGUgdG91Y2ggZXZlbnQgYW5kIHdpbGwKICAgICAgICAvLyBhcHBseSB0aGUgY2RrLXRvdWNoLWZvY3VzZWQgY2xhc3MgcmF0aGVyIHRoYW4gdGhlIGNkay1wcm9ncmFtLWZvY3VzZWQgY2xhc3MuIFRoaXMgaXMgYQogICAgICAgIC8vIHJlbGF0aXZlbHkgc21hbGwgZWRnZS1jYXNlIHRoYXQgY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgdXNpbmcKICAgICAgICAvLyBmb2N1c1ZpYShwYXJlbnRFbCwgJ3Byb2dyYW0nKSB0byBmb2N1cyB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgLy8KICAgICAgICAvLyBJZiB3ZSBkZWNpZGUgdGhhdCB3ZSBhYnNvbHV0ZWx5IG11c3QgaGFuZGxlIHRoaXMgY2FzZSBjb3JyZWN0bHksIHdlIGNhbiBkbyBzbyBieSBsaXN0ZW5pbmcKICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IGZvY3VzIGV2ZW50IGFmdGVyIHRoZSB0b3VjaHN0YXJ0LCBhbmQgdGhlbiB0aGUgZmlyc3QgYmx1ciBldmVudCBhZnRlciB0aGF0CiAgICAgICAgLy8gZm9jdXMgZXZlbnQuIFdoZW4gdGhhdCBibHVyIGV2ZW50IGZpcmVzIHdlIGtub3cgdGhhdCB3aGF0ZXZlciBmb2xsb3dzIGlzIG5vdCBhIHJlc3VsdCBvZiB0aGUKICAgICAgICAvLyB0b3VjaHN0YXJ0LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZm9jdXNUYXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RUb3VjaFRhcmdldCBpbnN0YW5jZW9mIE5vZGUgJiYgZm9jdXNUYXJnZXQgaW5zdGFuY2VvZiBOb2RlICYmCiAgICAgICAgICAgIChmb2N1c1RhcmdldCA9PT0gdGhpcy5fbGFzdFRvdWNoVGFyZ2V0IHx8IGZvY3VzVGFyZ2V0LmNvbnRhaW5zKHRoaXMuX2xhc3RUb3VjaFRhcmdldCkpOwogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGVzIGZvY3VzIGV2ZW50cyBvbiBhIHJlZ2lzdGVyZWQgZWxlbWVudC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGV2ZW50IFRoZSBmb2N1cyBldmVudC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgbW9uaXRvcmVkIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25Gb2N1cyhldmVudCwgZWxlbWVudCkgewogICAgICAgIC8vIE5PVEUobW1hbGVyYmEpOiBXZSBjdXJyZW50bHkgc2V0IHRoZSBjbGFzc2VzIGJhc2VkIG9uIHRoZSBmb2N1cyBvcmlnaW4gb2YgdGhlIG1vc3QgcmVjZW50CiAgICAgICAgLy8gZm9jdXMgZXZlbnQgYWZmZWN0aW5nIHRoZSBtb25pdG9yZWQgZWxlbWVudC4gSWYgd2Ugd2FudCB0byB1c2UgdGhlIG9yaWdpbiBvZiB0aGUgZmlyc3QgZXZlbnQKICAgICAgICAvLyBpbnN0ZWFkIHdlIHNob3VsZCBjaGVjayBmb3IgdGhlIGNkay1mb2N1c2VkIGNsYXNzIGhlcmUgYW5kIHJldHVybiBpZiB0aGUgZWxlbWVudCBhbHJlYWR5IGhhcwogICAgICAgIC8vIGl0LiAoVGhpcyBvbmx5IG1hdHRlcnMgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBpbmNsdWRlc0NoaWxkcmVuID0gdHJ1ZSkuCiAgICAgICAgLy8gTk9URShtbWFsZXJiYSk6IFdlIGN1cnJlbnRseSBzZXQgdGhlIGNsYXNzZXMgYmFzZWQgb24gdGhlIGZvY3VzIG9yaWdpbiBvZiB0aGUgbW9zdCByZWNlbnQKICAgICAgICAvLyBmb2N1cyBldmVudCBhZmZlY3RpbmcgdGhlIG1vbml0b3JlZCBlbGVtZW50LiBJZiB3ZSB3YW50IHRvIHVzZSB0aGUgb3JpZ2luIG9mIHRoZSBmaXJzdCBldmVudAogICAgICAgIC8vIGluc3RlYWQgd2Ugc2hvdWxkIGNoZWNrIGZvciB0aGUgY2RrLWZvY3VzZWQgY2xhc3MgaGVyZSBhbmQgcmV0dXJuIGlmIHRoZSBlbGVtZW50IGFscmVhZHkgaGFzCiAgICAgICAgLy8gaXQuIChUaGlzIG9ubHkgbWF0dGVycyBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGluY2x1ZGVzQ2hpbGRyZW4gPSB0cnVlKS4KICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGNvdW50aW5nIGNoaWxkLWVsZW1lbnQtZm9jdXMgYXMgZm9jdXNlZCwgbWFrZSBzdXJlIHRoYXQgdGhlIGV2ZW50IHRhcmdldCBpcyB0aGUKICAgICAgICAvLyBtb25pdG9yZWQgZWxlbWVudCBpdHNlbGYuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnRJbmZvID0gdGhpcy5fZWxlbWVudEluZm8uZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmICghZWxlbWVudEluZm8gfHwgKCFlbGVtZW50SW5mby5jaGVja0NoaWxkcmVuICYmIGVsZW1lbnQgIT09IGV2ZW50LnRhcmdldCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5fZ2V0Rm9jdXNPcmlnaW4oZXZlbnQpOwogICAgICAgIHRoaXMuX3NldENsYXNzZXMoZWxlbWVudCwgb3JpZ2luKTsKICAgICAgICB0aGlzLl9lbWl0T3JpZ2luKGVsZW1lbnRJbmZvLnN1YmplY3QsIG9yaWdpbik7CiAgICAgICAgdGhpcy5fbGFzdEZvY3VzT3JpZ2luID0gb3JpZ2luOwogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGVzIGJsdXIgZXZlbnRzIG9uIGEgcmVnaXN0ZXJlZCBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBldmVudCBUaGUgYmx1ciBldmVudC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgbW9uaXRvcmVkIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25CbHVyKGV2ZW50LCBlbGVtZW50KSB7CiAgICAgICAgLy8gSWYgd2UgYXJlIGNvdW50aW5nIGNoaWxkLWVsZW1lbnQtZm9jdXMgYXMgZm9jdXNlZCwgbWFrZSBzdXJlIHRoYXQgd2UgYXJlbid0IGp1c3QgYmx1cnJpbmcgaW4KICAgICAgICAvLyBvcmRlciB0byBmb2N1cyBhbm90aGVyIGNoaWxkIG9mIHRoZSBtb25pdG9yZWQgZWxlbWVudC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudEluZm8gPSB0aGlzLl9lbGVtZW50SW5mby5nZXQoZWxlbWVudCk7CiAgICAgICAgaWYgKCFlbGVtZW50SW5mbyB8fCAoZWxlbWVudEluZm8uY2hlY2tDaGlsZHJlbiAmJiBldmVudC5yZWxhdGVkVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSAmJgogICAgICAgICAgICBlbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX3NldENsYXNzZXMoZWxlbWVudCk7CiAgICAgICAgdGhpcy5fZW1pdE9yaWdpbihlbGVtZW50SW5mby5zdWJqZWN0LCBudWxsKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gc3ViamVjdAogICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9lbWl0T3JpZ2luKHN1YmplY3QsIG9yaWdpbikgewogICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gc3ViamVjdC5uZXh0KG9yaWdpbikpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbmNyZW1lbnRNb25pdG9yZWRFbGVtZW50Q291bnQoKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgZ2xvYmFsIGxpc3RlbmVycyB3aGVuIGZpcnN0IGVsZW1lbnQgaXMgbW9uaXRvcmVkLgogICAgICAgIGlmICgrK3RoaXMuX21vbml0b3JlZEVsZW1lbnRDb3VudCA9PSAxICYmIHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAvLyBOb3RlOiB3ZSBsaXN0ZW4gdG8gZXZlbnRzIGluIHRoZSBjYXB0dXJlIHBoYXNlIHNvIHdlCiAgICAgICAgICAgIC8vIGNhbiBkZXRlY3QgdGhlbSBldmVuIGlmIHRoZSB1c2VyIHN0b3BzIHByb3BhZ2F0aW9uLgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2RvY3VtZW50Rm9jdXNBbmRCbHVyTGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fZG9jdW1lbnRGb2N1c0FuZEJsdXJMaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9kb2N1bWVudEtleWRvd25MaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duTGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fZG9jdW1lbnRUb3VjaHN0YXJ0TGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl93aW5kb3dGb2N1c0xpc3RlbmVyKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9kZWNyZW1lbnRNb25pdG9yZWRFbGVtZW50Q291bnQoKSB7CiAgICAgICAgLy8gVW5yZWdpc3RlciBnbG9iYWwgbGlzdGVuZXJzIHdoZW4gbGFzdCBlbGVtZW50IGlzIHVubW9uaXRvcmVkLgogICAgICAgIGlmICghLS10aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7CiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fZG9jdW1lbnRGb2N1c0FuZEJsdXJMaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX2RvY3VtZW50Rm9jdXNBbmRCbHVyTGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9kb2N1bWVudEtleWRvd25MaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fZG9jdW1lbnRNb3VzZWRvd25MaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2RvY3VtZW50VG91Y2hzdGFydExpc3RlbmVyLCBjYXB0dXJlRXZlbnRMaXN0ZW5lck9wdGlvbnMpOwogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl93aW5kb3dGb2N1c0xpc3RlbmVyKTsKICAgICAgICAgICAgLy8gQ2xlYXIgdGltZW91dHMgZm9yIGFsbCBwb3RlbnRpYWxseSBwZW5kaW5nIHRpbWVvdXRzIHRvIHByZXZlbnQgdGhlIGxlYWtzLgogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fd2luZG93Rm9jdXNUaW1lb3V0SWQpOwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hUaW1lb3V0SWQpOwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3JpZ2luVGltZW91dElkKTsKICAgICAgICB9CiAgICB9Cn0KRm9jdXNNb25pdG9yLsm1ZmFjID0gZnVuY3Rpb24gRm9jdXNNb25pdG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvY3VzTW9uaXRvcikoybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChET0NVTUVOVCQxLCA4KSwgybXJtWluamVjdChGT0NVU19NT05JVE9SX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KRm9jdXNNb25pdG9yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRk9DVVNfTU9OSVRPUl9ERUZBVUxUX09QVElPTlMsXSB9XSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBGb2N1c01vbml0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBGb2N1c01vbml0b3JfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBGb2N1c01vbml0b3IoybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChET0NVTUVOVCQxLCA4KSwgybXJtWluamVjdChGT0NVU19NT05JVE9SX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9LCB0b2tlbjogRm9jdXNNb25pdG9yLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBEaXJlY3RpdmUgdGhhdCBkZXRlcm1pbmVzIGhvdyBhIHBhcnRpY3VsYXIgZWxlbWVudCB3YXMgZm9jdXNlZCAodmlhIGtleWJvYXJkLCBtb3VzZSwgdG91Y2gsIG9yCiAqIHByb2dyYW1tYXRpY2FsbHkpIGFuZCBhZGRzIGNvcnJlc3BvbmRpbmcgY2xhc3NlcyB0byB0aGUgZWxlbWVudC4KICoKICogVGhlcmUgYXJlIHR3byB2YXJpYW50cyBvZiB0aGlzIGRpcmVjdGl2ZToKICogMSkgY2RrTW9uaXRvckVsZW1lbnRGb2N1czogZG9lcyBub3QgY29uc2lkZXIgYW4gZWxlbWVudCB0byBiZSBmb2N1c2VkIGlmIG9uZSBvZiBpdHMgY2hpbGRyZW4gaXMKICogICAgZm9jdXNlZC4KICogMikgY2RrTW9uaXRvclN1YnRyZWVGb2N1czogY29uc2lkZXJzIGFuIGVsZW1lbnQgZm9jdXNlZCBpZiBpdCBvciBhbnkgb2YgaXRzIGNoaWxkcmVuIGFyZSBmb2N1c2VkLgogKi8KY2xhc3MgQ2RrTW9uaXRvckZvY3VzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfZm9jdXNNb25pdG9yCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfZm9jdXNNb25pdG9yKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvciA9IF9mb2N1c01vbml0b3I7CiAgICAgICAgdGhpcy5jZGtGb2N1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uID0gdGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY2RrTW9uaXRvclN1YnRyZWVGb2N1cycpKQogICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3JpZ2luID0+IHRoaXMuY2RrRm9jdXNDaGFuZ2UuZW1pdChvcmlnaW4pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICB0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KQ2RrTW9uaXRvckZvY3VzLsm1ZmFjID0gZnVuY3Rpb24gQ2RrTW9uaXRvckZvY3VzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka01vbml0b3JGb2N1cykoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpKTsgfTsKQ2RrTW9uaXRvckZvY3VzLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka01vbml0b3JGb2N1cywgc2VsZWN0b3JzOiBbWyIiLCAiY2RrTW9uaXRvckVsZW1lbnRGb2N1cyIsICIiXSwgWyIiLCAiY2RrTW9uaXRvclN1YnRyZWVGb2N1cyIsICIiXV0sIG91dHB1dHM6IHsgY2RrRm9jdXNDaGFuZ2U6ICJjZGtGb2N1c0NoYW5nZSIgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkNka01vbml0b3JGb2N1cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfQpdOwpDZGtNb25pdG9yRm9jdXMucHJvcERlY29yYXRvcnMgPSB7CiAgICBjZGtGb2N1c0NoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dCn07Ci8qKgogKiBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgYm9keSB3aGVuIGluIGJsYWNrLW9uLXdoaXRlIGhpZ2gtY29udHJhc3QgbW9kZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBCTEFDS19PTl9XSElURV9DU1NfQ0xBU1MgPSAnY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUnOwovKioKICogQ1NTIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50IGJvZHkgd2hlbiBpbiB3aGl0ZS1vbi1ibGFjayBoaWdoLWNvbnRyYXN0IG1vZGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgV0hJVEVfT05fQkxBQ0tfQ1NTX0NMQVNTID0gJ2Nkay1oaWdoLWNvbnRyYXN0LXdoaXRlLW9uLWJsYWNrJzsKLyoqCiAqIENTUyBjbGFzcyBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCBib2R5IHdoZW4gaW4gaGlnaC1jb250cmFzdCBtb2RlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEhJR0hfQ09OVFJBU1RfTU9ERV9BQ1RJVkVfQ1NTX0NMQVNTID0gJ2Nkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSc7Ci8qKgogKiBTZXJ2aWNlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBicm93c2VyIGlzIGN1cnJlbnRseSBpbiBhIGhpZ2gtY29uc3RyYXN0LW1vZGUgZW52aXJvbm1lbnQuCiAqCiAqIE1pY3Jvc29mdCBXaW5kb3dzIHN1cHBvcnRzIGFuIGFjY2Vzc2liaWxpdHkgZmVhdHVyZSBjYWxsZWQgIkhpZ2ggQ29udHJhc3QgTW9kZSIuIFRoaXMgbW9kZQogKiBjaGFuZ2VzIHRoZSBhcHBlYXJhbmNlIG9mIGFsbCBhcHBsaWNhdGlvbnMsIGluY2x1ZGluZyB3ZWIgYXBwbGljYXRpb25zLCB0byBkcmFtYXRpY2FsbHkgaW5jcmVhc2UKICogY29udHJhc3QuCiAqCiAqIElFLCBFZGdlLCBhbmQgRmlyZWZveCBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIG1vZGUuIENocm9tZSBkb2VzIG5vdCBzdXBwb3J0IFdpbmRvd3MgSGlnaCBDb250cmFzdAogKiBNb2RlLiBUaGlzIHNlcnZpY2UgZG9lcyBub3QgZGV0ZWN0IGhpZ2gtY29udHJhc3QgbW9kZSBhcyBhZGRlZCBieSB0aGUgQ2hyb21lICJIaWdoIENvbnRyYXN0IgogKiBicm93c2VyIGV4dGVuc2lvbi4KICovCmNsYXNzIEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9wbGF0Zm9ybSwgZG9jdW1lbnQpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGhpZ2gtY29uc3RyYXN0LW1vZGUgZm9yIHRoZSBwYWdlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0SGlnaENvbnRyYXN0TW9kZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICByZXR1cm4gMCAvKiBOT05FICovOwogICAgICAgIH0KICAgICAgICAvLyBDcmVhdGUgYSB0ZXN0IGVsZW1lbnQgd2l0aCBhbiBhcmJpdHJhcnkgYmFja2dyb3VuZC1jb2xvciB0aGF0IGlzIG5laXRoZXIgYmxhY2sgbm9yCiAgICAgICAgLy8gd2hpdGU7IGhpZ2gtY29udHJhc3QgbW9kZSB3aWxsIGNvZXJjZSB0aGUgY29sb3IgdG8gZWl0aGVyIGJsYWNrIG9yIHdoaXRlLiBBbHNvIGVuc3VyZSB0aGF0CiAgICAgICAgLy8gYXBwZW5kaW5nIHRoZSB0ZXN0IGVsZW1lbnQgdG8gdGhlIERPTSBkb2VzIG5vdCBhZmZlY3QgbGF5b3V0IGJ5IGFic29sdXRlbHkgcG9zaXRpb25pbmcgaXQKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVzdEVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICB0ZXN0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiKDEsMiwzKSc7CiAgICAgICAgdGVzdEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdEVsZW1lbnQpOwogICAgICAgIC8vIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLCBjb2xsYXBzaW5nIHNwYWNlcyB0byBub3JtYWxpemUgYmV0d2VlbgogICAgICAgIC8vIGJyb3dzZXJzLiBPbmNlIHdlIGdldCB0aGlzIGNvbG9yLCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgdGVzdCBlbGVtZW50LiBBY2Nlc3MgdGhlIGB3aW5kb3dgCiAgICAgICAgLy8gdmlhIHRoZSBkb2N1bWVudCBzbyB3ZSBjYW4gZmFrZSBpdCBpbiB0ZXN0cy4gTm90ZSB0aGF0IHdlIGhhdmUgZXh0cmEgbnVsbCBjaGVja3MsIGJlY2F1c2UKICAgICAgICAvLyB0aGlzIGxvZ2ljIHdpbGwgbGlrZWx5IHJ1biBkdXJpbmcgYXBwIGJvb3RzdHJhcCBhbmQgdGhyb3dpbmcgY2FuIGJyZWFrIHRoZSBlbnRpcmUgYXBwLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2N1bWVudFdpbmRvdyA9IHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IChkb2N1bWVudFdpbmRvdyAmJiBkb2N1bWVudFdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSA/CiAgICAgICAgICAgIGRvY3VtZW50V2luZG93LmdldENvbXB1dGVkU3R5bGUodGVzdEVsZW1lbnQpIDogbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IChjb21wdXRlZFN0eWxlICYmIGNvbXB1dGVkU3R5bGUuYmFja2dyb3VuZENvbG9yIHx8ICcnKS5yZXBsYWNlKC8gL2csICcnKTsKICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlc3RFbGVtZW50KTsKICAgICAgICBzd2l0Y2ggKGNvbXB1dGVkQ29sb3IpIHsKICAgICAgICAgICAgY2FzZSAncmdiKDAsMCwwKSc6IHJldHVybiAyIC8qIFdISVRFX09OX0JMQUNLICovOwogICAgICAgICAgICBjYXNlICdyZ2IoMjU1LDI1NSwyNTUpJzogcmV0dXJuIDEgLyogQkxBQ0tfT05fV0hJVEUgKi87CiAgICAgICAgfQogICAgICAgIHJldHVybiAwIC8qIE5PTkUgKi87CiAgICB9CiAgICAvKioKICAgICAqIEFwcGxpZXMgQ1NTIGNsYXNzZXMgaW5kaWNhdGluZyBoaWdoLWNvbnRyYXN0IG1vZGUgdG8gZG9jdW1lbnQgYm9keSAoYnJvd3Nlci1vbmx5KS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUJvZHlIaWdoQ29udHJhc3RNb2RlQ3NzQ2xhc3NlcygpIHsKICAgICAgICBpZiAodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyICYmIHRoaXMuX2RvY3VtZW50LmJvZHkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBib2R5Q2xhc3NlcyA9IHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0OwogICAgICAgICAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBgY2xhc3NMaXN0YCBvcGVyYXRpb25zIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzCiAgICAgICAgICAgIGJvZHlDbGFzc2VzLnJlbW92ZShISUdIX0NPTlRSQVNUX01PREVfQUNUSVZFX0NTU19DTEFTUyk7CiAgICAgICAgICAgIGJvZHlDbGFzc2VzLnJlbW92ZShCTEFDS19PTl9XSElURV9DU1NfQ0xBU1MpOwogICAgICAgICAgICBib2R5Q2xhc3Nlcy5yZW1vdmUoV0hJVEVfT05fQkxBQ0tfQ1NTX0NMQVNTKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5nZXRIaWdoQ29udHJhc3RNb2RlKCk7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAxIC8qIEJMQUNLX09OX1dISVRFICovKSB7CiAgICAgICAgICAgICAgICBib2R5Q2xhc3Nlcy5hZGQoSElHSF9DT05UUkFTVF9NT0RFX0FDVElWRV9DU1NfQ0xBU1MpOwogICAgICAgICAgICAgICAgYm9keUNsYXNzZXMuYWRkKEJMQUNLX09OX1dISVRFX0NTU19DTEFTUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gMiAvKiBXSElURV9PTl9CTEFDSyAqLykgewogICAgICAgICAgICAgICAgYm9keUNsYXNzZXMuYWRkKEhJR0hfQ09OVFJBU1RfTU9ERV9BQ1RJVkVfQ1NTX0NMQVNTKTsKICAgICAgICAgICAgICAgIGJvZHlDbGFzc2VzLmFkZChXSElURV9PTl9CTEFDS19DU1NfQ0xBU1MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CkhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvci7JtWZhYyA9IGZ1bmN0aW9uIEhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IpKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovCkhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gSGlnaENvbnRyYXN0TW9kZURldGVjdG9yLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gSGlnaENvbnRyYXN0TW9kZURldGVjdG9yX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgSGlnaENvbnRyYXN0TW9kZURldGVjdG9yKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfSwgdG9rZW46IEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ExMXktbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEExMXlNb2R1bGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGhpZ2hDb250cmFzdE1vZGVEZXRlY3RvcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihoaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IpIHsKICAgICAgICBoaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IuX2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCk7CiAgICB9Cn0KQTExeU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEExMXlNb2R1bGUgfSk7CkExMXlNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBMTF5TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEExMXlNb2R1bGUpKMm1ybVpbmplY3QoSGlnaENvbnRyYXN0TW9kZURldGVjdG9yKSk7IH0sIGltcG9ydHM6IFtbUGxhdGZvcm1Nb2R1bGUsIE9ic2VydmVyc01vZHVsZV1dIH0pOwovKiogQG5vY29sbGFwc2UgKi8KQTExeU1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogSGlnaENvbnRyYXN0TW9kZURldGVjdG9yIH0KXTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQTExeU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtBcmlhTGl2ZSwKICAgICAgICBDZGtUcmFwRm9jdXMsCiAgICAgICAgQ2RrTW9uaXRvckZvY3VzXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW1BsYXRmb3JtTW9kdWxlLCBPYnNlcnZlcnNNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ2RrQXJpYUxpdmUsCiAgICAgICAgQ2RrVHJhcEZvY3VzLAogICAgICAgIENka01vbml0b3JGb2N1c107IH0gfSk7IH0pKCk7Cgpjb25zdCBESVJfRE9DVU1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2Nkay1kaXItZG9jJywgewogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogRElSX0RPQ1VNRU5UX0ZBQ1RPUlksCn0pOwovKioKICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIERJUl9ET0NVTUVOVF9GQUNUT1JZKCkgewogICAgcmV0dXJuIGluamVjdChET0NVTUVOVCQxKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9iaWRpL2RpcmVjdGlvbmFsaXR5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaGUgZGlyZWN0aW9uYWxpdHkgKExUUiAvIFJUTCkgY29udGV4dCBmb3IgdGhlIGFwcGxpY2F0aW9uIChvciBhIHN1YnRyZWUgb2YgaXQpLgogKiBFeHBvc2VzIHRoZSBjdXJyZW50IGRpcmVjdGlvbiBhbmQgYSBzdHJlYW0gb2YgZGlyZWN0aW9uIGNoYW5nZXMuCiAqLwpjbGFzcyBEaXJlY3Rpb25hbGl0eSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IF9kb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jdW1lbnQpIHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3VycmVudCAnbHRyJyBvciAncnRsJyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnZhbHVlID0gJ2x0cic7CiAgICAgICAgLyoqCiAgICAgICAgICogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbmV2ZXIgdGhlICdsdHInIC8gJ3J0bCcgc3RhdGUgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICBpZiAoX2RvY3VtZW50KSB7CiAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSAnYXV0bycgdmFsdWUgLQogICAgICAgICAgICAvLyBXZSBzdGlsbCBuZWVkIHRvIGFjY291bnQgZm9yIGRpcj0iYXV0byIuCiAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgSFRNTEVsZW1lbmV0LmRpciBpcyBhbHNvICJhdXRvIiB3aGVuIHRoYXQncyBzZXQgdG8gdGhlIGF0dHJpYnV0ZSwKICAgICAgICAgICAgLy8gYnV0IGdldENvbXB1dGVkU3R5bGUgcmV0dXJuIGVpdGhlciAibHRyIiBvciAicnRsIi4gYXZvaWRpbmcgZ2V0Q29tcHV0ZWRTdHlsZSBmb3Igbm93CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm9keURpciA9IF9kb2N1bWVudC5ib2R5ID8gX2RvY3VtZW50LmJvZHkuZGlyIDogbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBodG1sRGlyID0gX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyIDogbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGJvZHlEaXIgfHwgaHRtbERpcjsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh2YWx1ZSA9PT0gJ2x0cicgfHwgdmFsdWUgPT09ICdydGwnKSA/IHZhbHVlIDogJ2x0cic7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLmNoYW5nZS5jb21wbGV0ZSgpOwogICAgfQp9CkRpcmVjdGlvbmFsaXR5Lsm1ZmFjID0gZnVuY3Rpb24gRGlyZWN0aW9uYWxpdHlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGlyZWN0aW9uYWxpdHkpKMm1ybVpbmplY3QoRElSX0RPQ1VNRU5ULCA4KSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpEaXJlY3Rpb25hbGl0eS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RJUl9ET0NVTUVOVCxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIERpcmVjdGlvbmFsaXR5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRGlyZWN0aW9uYWxpdHlfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBEaXJlY3Rpb25hbGl0eSjJtcm1aW5qZWN0KERJUl9ET0NVTUVOVCwgOCkpOyB9LCB0b2tlbjogRGlyZWN0aW9uYWxpdHksIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYmlkaS9kaXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERpcmVjdGl2ZSB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgb2YgZGlyZWN0aW9uIG9mIHBhcnQgb2YgdGhlIERPTS4KICoKICogUHJvdmlkZXMgaXRzZWxmIGFzIERpcmVjdGlvbmFsaXR5IHN1Y2ggdGhhdCBkZXNjZW5kYW50IGRpcmVjdGl2ZXMgb25seSBuZWVkIHRvIGV2ZXIgaW5qZWN0CiAqIERpcmVjdGlvbmFsaXR5IHRvIGdldCB0aGUgY2xvc2VzdCBkaXJlY3Rpb24uCiAqLwpjbGFzcyBEaXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXplZCBkaXJlY3Rpb24gdGhhdCBhY2NvdW50cyBmb3IgaW52YWxpZC91bnN1cHBvcnRlZCB2YWx1ZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGlyID0gJ2x0cic7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgYHZhbHVlYCBoYXMgYmVlbiBzZXQgdG8gaXRzIGluaXRpYWwgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5jaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGlyKCkgeyByZXR1cm4gdGhpcy5fZGlyOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBkaXIodmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fZGlyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSB2YWx1ZSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTsKICAgICAgICB0aGlzLl9yYXdEaXIgPSB2YWx1ZTsKICAgICAgICB0aGlzLl9kaXIgPSAobm9ybWFsaXplZFZhbHVlID09PSAnbHRyJyB8fCBub3JtYWxpemVkVmFsdWUgPT09ICdydGwnKSA/IG5vcm1hbGl6ZWRWYWx1ZSA6ICdsdHInOwogICAgICAgIGlmIChvbGQgIT09IHRoaXMuX2RpciAmJiB0aGlzLl9pc0luaXRpYWxpemVkKSB7CiAgICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5fZGlyKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEN1cnJlbnQgbGF5b3V0IGRpcmVjdGlvbiBvZiB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuZGlyOyB9CiAgICAvKioKICAgICAqIEluaXRpYWxpemUgb25jZSBkZWZhdWx0IHZhbHVlIGhhcyBiZWVuIHNldC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5jaGFuZ2UuY29tcGxldGUoKTsKICAgIH0KfQpEaXIuybVmYWMgPSBmdW5jdGlvbiBEaXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGlyKSgpOyB9OwpEaXIuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRGlyLCBzZWxlY3RvcnM6IFtbIiIsICJkaXIiLCAiIl1dLCBob3N0VmFyczogMSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBEaXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhdHRyaWJ1dGUoImRpciIsIGN0eC5fcmF3RGlyKTsKICAgIH0gfSwgaW5wdXRzOiB7IGRpcjogImRpciIgfSwgb3V0cHV0czogeyBjaGFuZ2U6ICJkaXJDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbImRpciJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IERpcmVjdGlvbmFsaXR5LCB1c2VFeGlzdGluZzogRGlyIH1dKV0gfSk7CkRpci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGNoYW5nZTogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2RpckNoYW5nZScsXSB9XSwKICAgIGRpcjogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYmlkaS9iaWRpLW1vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBCaWRpTW9kdWxlIHsKfQpCaWRpTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQmlkaU1vZHVsZSB9KTsKQmlkaU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEJpZGlNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQmlkaU1vZHVsZSkoKTsgfSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQmlkaU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtEaXJdLCBleHBvcnRzOiBbRGlyXSB9KTsgfSkoKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBBbmd1bGFyIENvbXBvbmVudCBEZXZlbG9wbWVudCBLaXQuICovCmNvbnN0IFZFUlNJT04kMyA9IG5ldyBWZXJzaW9uKCc5LjIuMScpOwoKY29uc3QgX2MwID0gWyIqIiwgW1sibWF0LW9wdGlvbiJdLCBbIm5nLWNvbnRhaW5lciJdXV07CmNvbnN0IF9jMSA9IFsiKiIsICJtYXQtb3B0aW9uLCBuZy1jb250YWluZXIiXTsKZnVuY3Rpb24gTWF0T3B0aW9uX21hdF9wc2V1ZG9fY2hlY2tib3hfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50KDAsICJtYXQtcHNldWRvLWNoZWNrYm94IiwgMyk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1cHJvcGVydHkoInN0YXRlIiwgY3R4X3IwLnNlbGVjdGVkID8gImNoZWNrZWQiIDogInVuY2hlY2tlZCIpKCJkaXNhYmxlZCIsIGN0eF9yMC5kaXNhYmxlZCk7Cn0gfQpjb25zdCBfYzIgPSBbIioiXTsKY29uc3QgVkVSU0lPTiQ0ID0gbmV3IFZlcnNpb24oJzkuMi4xJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9jb21tb24tYmVoYXZpb3JzL2NvbW1vbi1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gUHJpdmF0ZSB2ZXJzaW9uIGNvbnN0YW50IHRvIGNpcmN1bXZlbnQgdGVzdC9idWlsZCBpc3N1ZXMsCi8vIGkuZS4gYXZvaWQgY29yZSB0byBkZXBlbmQgb24gdGhlIEBhbmd1bGFyL21hdGVyaWFsIHByaW1hcnkgZW50cnktcG9pbnQKLy8gQ2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgTWF0ZXJpYWwgcHJpbWFyeSBlbnRyeS1wb2ludCBubyBsb25nZXIKLy8gcmUtZXhwb3J0cyBhbGwgc2Vjb25kYXJ5IGVudHJ5LXBvaW50cwovKiogQHR5cGUgez99ICovCmNvbnN0IFZFUlNJT04kMSQxID0gbmV3IFZlcnNpb24oJzkuMi4xJyk7Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gTUFURVJJQUxfU0FOSVRZX0NIRUNLU19GQUNUT1JZKCkgewogICAgcmV0dXJuIHRydWU7Cn0KLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNvbmZpZ3VyZXMgd2hldGhlciB0aGUgTWF0ZXJpYWwgc2FuaXR5IGNoZWNrcyBhcmUgZW5hYmxlZC4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRFUklBTF9TQU5JVFlfQ0hFQ0tTID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtc2FuaXR5LWNoZWNrcycsIHsKICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgIGZhY3Rvcnk6IE1BVEVSSUFMX1NBTklUWV9DSEVDS1NfRkFDVE9SWSwKfSk7Ci8qKgogKiBNb2R1bGUgdGhhdCBjYXB0dXJlcyBhbnl0aGluZyB0aGF0IHNob3VsZCBiZSBsb2FkZWQgYW5kL29yIHJ1biBmb3IgKmFsbCogQW5ndWxhciBNYXRlcmlhbAogKiBjb21wb25lbnRzLiBUaGlzIGluY2x1ZGVzIEJpZGksIGV0Yy4KICoKICogVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGltcG9ydGVkIHRvIGVhY2ggdG9wLWxldmVsIGNvbXBvbmVudCBtb2R1bGUgKGUuZy4sIE1hdFRhYnNNb2R1bGUpLgogKi8KY2xhc3MgTWF0Q29tbW9uTW9kdWxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBoaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IKICAgICAqIEBwYXJhbSB7P30gc2FuaXR5Q2hlY2tzCiAgICAgKiBAcGFyYW0gez89fSBkb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihoaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IsIHNhbml0eUNoZWNrcywgCiAgICAvKiogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgbWFrZSBkb2N1bWVudCByZXF1aXJlZCAqLwogICAgZG9jdW1lbnQpIHsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHdlJ3ZlIGRvbmUgdGhlIGdsb2JhbCBzYW5pdHkgY2hlY2tzIChlLmcuIGEgdGhlbWUgaXMgbG9hZGVkLCB0aGVyZSBpcyBhIGRvY3R5cGUpLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2hhc0RvbmVHbG9iYWxDaGVja3MgPSBmYWxzZTsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgIC8vIFdoaWxlIEExMXlNb2R1bGUgYWxzbyBkb2VzIHRoaXMsIHdlIHJlcGVhdCBpdCBoZXJlIHRvIGF2b2lkIGltcG9ydGluZyBBMTF5TW9kdWxlCiAgICAgICAgLy8gaW4gTWF0Q29tbW9uTW9kdWxlLgogICAgICAgIGhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvci5fYXBwbHlCb2R5SGlnaENvbnRyYXN0TW9kZUNzc0NsYXNzZXMoKTsKICAgICAgICAvLyBOb3RlIHRoYXQgYF9zYW5pdHlDaGVja3NgIGlzIHR5cGVkIHRvIGBhbnlgLCBiZWNhdXNlIEFvVAogICAgICAgIC8vIHRocm93cyBhbiBlcnJvciBpZiB3ZSB1c2UgdGhlIGBTYW5pdHlDaGVja3NgIHR5cGUgZGlyZWN0bHkuCiAgICAgICAgdGhpcy5fc2FuaXR5Q2hlY2tzID0gc2FuaXR5Q2hlY2tzOwogICAgICAgIGlmICghdGhpcy5faGFzRG9uZUdsb2JhbENoZWNrcykgewogICAgICAgICAgICB0aGlzLl9jaGVja0RvY3R5cGVJc0RlZmluZWQoKTsKICAgICAgICAgICAgdGhpcy5fY2hlY2tUaGVtZUlzUHJlc2VudCgpOwogICAgICAgICAgICB0aGlzLl9jaGVja0Nka1ZlcnNpb25NYXRjaCgpOwogICAgICAgICAgICB0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFjY2VzcyBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIGRvY3VtZW50IHJlZmVyZW5jZQogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXREb2N1bWVudCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZG9jID0gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBkb2MgPT09ICdvYmplY3QnICYmIGRvYyA/IGRvYyA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0V2luZG93KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2MgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB3aW4gPSAoZG9jID09PSBudWxsIHx8IGRvYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jLmRlZmF1bHRWaWV3KSB8fCB3aW5kb3c7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW4gPT09ICdvYmplY3QnICYmIHdpbiA/IHdpbiA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgYW55IHNhbml0eSBjaGVja3MgYXJlIGVuYWJsZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrc0FyZUVuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIGlzRGV2TW9kZSgpICYmICF0aGlzLl9pc1Rlc3RFbnYoKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgY29kZSBpcyBydW5uaW5nIGluIHRlc3RzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pc1Rlc3RFbnYoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdpbmRvdyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9nZXRXaW5kb3coKSkpOwogICAgICAgIHJldHVybiB3aW5kb3cgJiYgKHdpbmRvdy5fX2thcm1hX18gfHwgd2luZG93Lmphc21pbmUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrRG9jdHlwZUlzRGVmaW5lZCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNFbmFibGVkID0gdGhpcy5fY2hlY2tzQXJlRW5hYmxlZCgpICYmCiAgICAgICAgICAgICh0aGlzLl9zYW5pdHlDaGVja3MgPT09IHRydWUgfHwgKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9zYW5pdHlDaGVja3MpKSkuZG9jdHlwZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICBpZiAoaXNFbmFibGVkICYmIGRvY3VtZW50ICYmICFkb2N1bWVudC5kb2N0eXBlKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ3VycmVudCBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGEgZG9jdHlwZS4gVGhpcyBtYXkgY2F1c2UgJyArCiAgICAgICAgICAgICAgICAnc29tZSBBbmd1bGFyIE1hdGVyaWFsIGNvbXBvbmVudHMgbm90IHRvIGJlaGF2ZSBhcyBleHBlY3RlZC4nKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tUaGVtZUlzUHJlc2VudCgpIHsKICAgICAgICAvLyBXZSBuZWVkIHRvIGFzc2VydCB0aGF0IHRoZSBgYm9keWAgaXMgZGVmaW5lZCwgYmVjYXVzZSB0aGVzZSBjaGVja3MgcnVuIHZlcnkgZWFybHkKICAgICAgICAvLyBhbmQgdGhlIGBib2R5YCB3b24ndCBiZSBkZWZpbmVkIGlmIHRoZSBjb25zdW1lciBwdXQgdGhlaXIgc2NyaXB0cyBpbiB0aGUgYGhlYWRgLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gIXRoaXMuX2NoZWNrc0FyZUVuYWJsZWQoKSB8fAogICAgICAgICAgICAodGhpcy5fc2FuaXR5Q2hlY2tzID09PSBmYWxzZSB8fCAhKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9zYW5pdHlDaGVja3MpKSkudGhlbWUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgaWYgKGlzRGlzYWJsZWQgfHwgIWRvY3VtZW50IHx8ICFkb2N1bWVudC5ib2R5IHx8CiAgICAgICAgICAgIHR5cGVvZiBnZXRDb21wdXRlZFN0eWxlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWF0LXRoZW1lLWxvYWRlZC1tYXJrZXInKTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlc3RFbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGVzdEVsZW1lbnQpOwogICAgICAgIC8vIEluIHNvbWUgc2l0dWF0aW9ucyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhlIHRlc3QgZWxlbWVudCBjYW4gYmUgbnVsbC4gRm9yIGV4YW1wbGUgaW4KICAgICAgICAvLyBGaXJlZm94LCB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgbnVsbCBpZiBhbiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluc2lkZSBvZiBhIGhpZGRlbiBpZnJhbWUuCiAgICAgICAgLy8gU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NDgzOTcKICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZSAmJiBjb21wdXRlZFN0eWxlLmRpc3BsYXkgIT09ICdub25lJykgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIEFuZ3VsYXIgTWF0ZXJpYWwgY29yZSB0aGVtZS4gTW9zdCBNYXRlcmlhbCAnICsKICAgICAgICAgICAgICAgICdjb21wb25lbnRzIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gRm9yIG1vcmUgaW5mbyByZWZlciAnICsKICAgICAgICAgICAgICAgICd0byB0aGUgdGhlbWluZyBndWlkZTogaHR0cHM6Ly9tYXRlcmlhbC5hbmd1bGFyLmlvL2d1aWRlL3RoZW1pbmcnKTsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0RWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXRlcmlhbCB2ZXJzaW9uIG1hdGNoZXMgdGhlIGNkayB2ZXJzaW9uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrQ2RrVmVyc2lvbk1hdGNoKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSB0aGlzLl9jaGVja3NBcmVFbmFibGVkKCkgJiYKICAgICAgICAgICAgKHRoaXMuX3Nhbml0eUNoZWNrcyA9PT0gdHJ1ZSB8fCAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Nhbml0eUNoZWNrcykpKS52ZXJzaW9uKTsKICAgICAgICBpZiAoaXNFbmFibGVkICYmIFZFUlNJT04kMSQxLmZ1bGwgIT09IFZFUlNJT04kMy5mdWxsKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIEFuZ3VsYXIgTWF0ZXJpYWwgdmVyc2lvbiAoJyArIFZFUlNJT04kMSQxLmZ1bGwgKyAnKSBkb2VzIG5vdCBtYXRjaCAnICsKICAgICAgICAgICAgICAgICd0aGUgQW5ndWxhciBDREsgdmVyc2lvbiAoJyArIFZFUlNJT04kMy5mdWxsICsgJykuXG4nICsKICAgICAgICAgICAgICAgICdQbGVhc2UgZW5zdXJlIHRoZSB2ZXJzaW9ucyBvZiB0aGVzZSB0d28gcGFja2FnZXMgZXhhY3RseSBtYXRjaC4nKTsKICAgICAgICB9CiAgICB9Cn0KTWF0Q29tbW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0Q29tbW9uTW9kdWxlIH0pOwpNYXRDb21tb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRDb21tb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0Q29tbW9uTW9kdWxlKSjJtcm1aW5qZWN0KEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvciksIMm1ybVpbmplY3QoTUFURVJJQUxfU0FOSVRZX0NIRUNLUywgOCksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCkpOyB9LCBpbXBvcnRzOiBbW0JpZGlNb2R1bGVdLAogICAgICAgIEJpZGlNb2R1bGVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0Q29tbW9uTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBIaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVEVSSUFMX1NBTklUWV9DSEVDS1MsXSB9XSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0Q29tbW9uTW9kdWxlLCB7IGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtCaWRpTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0JpZGlNb2R1bGVdOyB9IH0pOyB9KSgpOwovKioKICogTWl4aW4gdG8gYXVnbWVudCBhIGRpcmVjdGl2ZSB3aXRoIGEgYGRpc2FibGVkYCBwcm9wZXJ0eS4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBiYXNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtaXhpbkRpc2FibGVkKGJhc2UpIHsKICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpc2FibGVkKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICB9Owp9Ci8qKgogKiBNaXhpbiB0byBhdWdtZW50IGEgZGlyZWN0aXZlIHdpdGggYSBgY29sb3JgIHByb3BlcnR5LgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGJhc2UKICogQHBhcmFtIHs/PX0gZGVmYXVsdENvbG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtaXhpbkNvbG9yKGJhc2UsIGRlZmF1bHRDb2xvcikgewogICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHsuLi4/fSBhcmdzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICBzdXBlciguLi5hcmdzKTsKICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGNvbG9yIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBmcm9tIHRoZSBtaXhpbi4KICAgICAgICAgICAgdGhpcy5jb2xvciA9IGRlZmF1bHRDb2xvcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY29sb3IoKSB7IHJldHVybiB0aGlzLl9jb2xvcjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBjb2xvcih2YWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbG9yUGFsZXR0ZSA9IHZhbHVlIHx8IGRlZmF1bHRDb2xvcjsKICAgICAgICAgICAgaWYgKGNvbG9yUGFsZXR0ZSAhPT0gdGhpcy5fY29sb3IpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb2xvcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGBtYXQtJHt0aGlzLl9jb2xvcn1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb2xvclBhbGV0dGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChgbWF0LSR7Y29sb3JQYWxldHRlfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fY29sb3IgPSBjb2xvclBhbGV0dGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Owp9Ci8qKgogKiBNaXhpbiB0byBhdWdtZW50IGEgZGlyZWN0aXZlIHdpdGggYSBgZGlzYWJsZVJpcHBsZWAgcHJvcGVydHkuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gYmFzZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWl4aW5EaXNhYmxlUmlwcGxlKGJhc2UpIHsKICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgcmlwcGxlIGVmZmVjdCBpcyBkaXNhYmxlZCBvciBub3QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZVJpcHBsZSgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZVJpcHBsZSh2YWx1ZSkgeyB0aGlzLl9kaXNhYmxlUmlwcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgfTsKfQovKioKICogTWl4aW4gdG8gYXVnbWVudCBhIGRpcmVjdGl2ZSB3aXRoIGEgYHRhYkluZGV4YCBwcm9wZXJ0eS4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBiYXNlCiAqIEBwYXJhbSB7Pz19IGRlZmF1bHRUYWJJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWl4aW5UYWJJbmRleChiYXNlLCBkZWZhdWx0VGFiSW5kZXggPSAwKSB7CiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3MKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgICB0aGlzLl90YWJJbmRleCA9IGRlZmF1bHRUYWJJbmRleDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdGFiSW5kZXgoKSB7IHJldHVybiB0aGlzLmRpc2FibGVkID8gLTEgOiB0aGlzLl90YWJJbmRleDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0YWJJbmRleCh2YWx1ZSkgewogICAgICAgICAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIHRhYkluZGV4IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgdmFsdWUuCiAgICAgICAgICAgIHRoaXMuX3RhYkluZGV4ID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogZGVmYXVsdFRhYkluZGV4OwogICAgICAgIH0KICAgIH07Cn0KLyoqCiAqIE1peGluIHRvIGF1Z21lbnQgYSBkaXJlY3RpdmUgd2l0aCB1cGRhdGVFcnJvclN0YXRlIG1ldGhvZC4KICogRm9yIGNvbXBvbmVudCB3aXRoIGBlcnJvclN0YXRlYCBhbmQgbmVlZCB0byB1cGRhdGUgYGVycm9yU3RhdGVgLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGJhc2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1peGluRXJyb3JTdGF0ZShiYXNlKSB7CiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3MKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGFuIGVycm9yIHN0YXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5lcnJvclN0YXRlID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgc3RhdGUgb2YgdGhlIGlucHV0IGNoYW5nZXMgc3VjaCB0aGF0IHRoZSB3cmFwcGluZwogICAgICAgICAgICAgKiBgTWF0Rm9ybUZpZWxkYCBuZWVkcyB0byBydW4gY2hhbmdlIGRldGVjdGlvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVFcnJvclN0YXRlKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5lcnJvclN0YXRlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3BhcmVudEZvcm1Hcm91cCB8fCB0aGlzLl9wYXJlbnRGb3JtOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXIgPSB0aGlzLmVycm9yU3RhdGVNYXRjaGVyIHx8IHRoaXMuX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5uZ0NvbnRyb2wgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5uZ0NvbnRyb2wuY29udHJvbCkpIDogbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IG1hdGNoZXIuaXNFcnJvclN0YXRlKGNvbnRyb2wsIHBhcmVudCk7CiAgICAgICAgICAgIGlmIChuZXdTdGF0ZSAhPT0gb2xkU3RhdGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JTdGF0ZSA9IG5ld1N0YXRlOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvY29tbW9uLWJlaGF2aW9ycy9pbmRleC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvZGF0ZXRpbWUvZGF0ZS1hZGFwdGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBJbmplY3Rpb25Ub2tlbiBmb3IgZGF0ZXBpY2tlciB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGRlZmF1bHQgbG9jYWxlIGNvZGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX0RBVEVfTE9DQUxFID0gbmV3IEluamVjdGlvblRva2VuKCdNQVRfREFURV9MT0NBTEUnLCB7CiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiBNQVRfREFURV9MT0NBTEVfRkFDVE9SWSwKfSk7Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gTUFUX0RBVEVfTE9DQUxFX0ZBQ1RPUlkoKSB7CiAgICByZXR1cm4gaW5qZWN0KExPQ0FMRV9JRCQxKTsKfQovKioKICogQWRhcHRzIHR5cGUgYERgIHRvIGJlIHVzYWJsZSBhcyBhIGRhdGUgYnkgY2RrLWJhc2VkIGNvbXBvbmVudHMgdGhhdCB3b3JrIHdpdGggZGF0ZXMuCiAqIEBhYnN0cmFjdAogKiBAdGVtcGxhdGUgRAogKi8KY2xhc3MgRGF0ZUFkYXB0ZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5fbG9jYWxlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEEgc3RyZWFtIHRoYXQgZW1pdHMgd2hlbiB0aGUgbG9jYWxlIGNoYW5nZXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbG9jYWxlQ2hhbmdlcygpIHsgcmV0dXJuIHRoaXMuX2xvY2FsZUNoYW5nZXM7IH0KICAgIC8qKgogICAgICogQXR0ZW1wdHMgdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0byBhIHZhbGlkIGRhdGUgb2JqZWN0LiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHBhcnNpbmcgaW4gdGhhdAogICAgICogZGVzZXJpYWxpemUgc2hvdWxkIG9ubHkgYWNjZXB0IG5vbi1hbWJpZ3VvdXMsIGxvY2FsZS1pbmRlcGVuZGVudCBmb3JtYXRzIChlLmcuIGEgSVNPIDg2MDEKICAgICAqIHN0cmluZykuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IGFueSBkZXNlcmlhbGl6YXRpb24sIGl0IHNpbXBseSBjaGVja3MgdGhhdAogICAgICogdGhlIGdpdmVuIHZhbHVlIGlzIGFscmVhZHkgYSB2YWxpZCBkYXRlIG9iamVjdCBvciBudWxsLiBUaGUgYDxtYXQtZGF0ZXBpY2tlcj5gIHdpbGwgY2FsbCB0aGlzCiAgICAgKiBtZXRob2Qgb24gYWxsIG9mIGl0cyBgXEBJbnB1dCgpYCBwcm9wZXJ0aWVzIHRoYXQgYWNjZXB0IGRhdGVzLiBJdCBpcyB0aGVyZWZvcmUgcG9zc2libGUgdG8KICAgICAqIHN1cHBvcnQgcGFzc2luZyB2YWx1ZXMgZnJvbSB5b3VyIGJhY2tlbmQgZGlyZWN0bHkgdG8gdGhlc2UgcHJvcGVydGllcyBieSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kCiAgICAgKiB0byBhbHNvIGRlc2VyaWFsaXplIHRoZSBmb3JtYXQgdXNlZCBieSB5b3VyIGJhY2tlbmQuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBkZXNlcmlhbGl6ZWQgaW50byBhIGRhdGUgb2JqZWN0LgogICAgICogQHJldHVybiB7P30gVGhlIGRlc2VyaWFsaXplZCBkYXRlIG9iamVjdCwgZWl0aGVyIGEgdmFsaWQgZGF0ZSwgbnVsbCBpZiB0aGUgdmFsdWUgY2FuIGJlCiAgICAgKiAgICAgZGVzZXJpYWxpemVkIGludG8gYSBudWxsIGRhdGUgKGUuZy4gdGhlIGVtcHR5IHN0cmluZyksIG9yIGFuIGludmFsaWQgZGF0ZS4KICAgICAqLwogICAgZGVzZXJpYWxpemUodmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB0aGlzLmlzRGF0ZUluc3RhbmNlKHZhbHVlKSAmJiB0aGlzLmlzVmFsaWQodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBsb2NhbGUgdXNlZCBmb3IgYWxsIGRhdGVzLgogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgVGhlIG5ldyBsb2NhbGUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRMb2NhbGUobG9jYWxlKSB7CiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgdGhpcy5fbG9jYWxlQ2hhbmdlcy5uZXh0KCk7CiAgICB9CiAgICAvKioKICAgICAqIENvbXBhcmVzIHR3byBkYXRlcy4KICAgICAqIEBwYXJhbSB7P30gZmlyc3QgVGhlIGZpcnN0IGRhdGUgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7P30gc2Vjb25kIFRoZSBzZWNvbmQgZGF0ZSB0byBjb21wYXJlLgogICAgICogQHJldHVybiB7P30gMCBpZiB0aGUgZGF0ZXMgYXJlIGVxdWFsLCBhIG51bWJlciBsZXNzIHRoYW4gMCBpZiB0aGUgZmlyc3QgZGF0ZSBpcyBlYXJsaWVyLAogICAgICogICAgIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwIGlmIHRoZSBmaXJzdCBkYXRlIGlzIGxhdGVyLgogICAgICovCiAgICBjb21wYXJlRGF0ZShmaXJzdCwgc2Vjb25kKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0WWVhcihmaXJzdCkgLSB0aGlzLmdldFllYXIoc2Vjb25kKSB8fAogICAgICAgICAgICB0aGlzLmdldE1vbnRoKGZpcnN0KSAtIHRoaXMuZ2V0TW9udGgoc2Vjb25kKSB8fAogICAgICAgICAgICB0aGlzLmdldERhdGUoZmlyc3QpIC0gdGhpcy5nZXREYXRlKHNlY29uZCk7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyBpZiB0d28gZGF0ZXMgYXJlIGVxdWFsLgogICAgICogQHBhcmFtIHs/fSBmaXJzdCBUaGUgZmlyc3QgZGF0ZSB0byBjaGVjay4KICAgICAqIEBwYXJhbSB7P30gc2Vjb25kIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm4gez99IFdoZXRoZXIgdGhlIHR3byBkYXRlcyBhcmUgZXF1YWwuCiAgICAgKiAgICAgTnVsbCBkYXRlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCB0byBvdGhlciBudWxsIGRhdGVzLgogICAgICovCiAgICBzYW1lRGF0ZShmaXJzdCwgc2Vjb25kKSB7CiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBmaXJzdFZhbGlkID0gdGhpcy5pc1ZhbGlkKGZpcnN0KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc2Vjb25kVmFsaWQgPSB0aGlzLmlzVmFsaWQoc2Vjb25kKTsKICAgICAgICAgICAgaWYgKGZpcnN0VmFsaWQgJiYgc2Vjb25kVmFsaWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5jb21wYXJlRGF0ZShmaXJzdCwgc2Vjb25kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmlyc3RWYWxpZCA9PSBzZWNvbmRWYWxpZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpcnN0ID09IHNlY29uZDsKICAgIH0KICAgIC8qKgogICAgICogQ2xhbXAgdGhlIGdpdmVuIGRhdGUgYmV0d2VlbiBtaW4gYW5kIG1heCBkYXRlcy4KICAgICAqIEBwYXJhbSB7P30gZGF0ZSBUaGUgZGF0ZSB0byBjbGFtcC4KICAgICAqIEBwYXJhbSB7Pz19IG1pbiBUaGUgbWluaW11bSB2YWx1ZSB0byBhbGxvdy4gSWYgbnVsbCBvciBvbWl0dGVkIG5vIG1pbiBpcyBlbmZvcmNlZC4KICAgICAqIEBwYXJhbSB7Pz19IG1heCBUaGUgbWF4aW11bSB2YWx1ZSB0byBhbGxvdy4gSWYgbnVsbCBvciBvbWl0dGVkIG5vIG1heCBpcyBlbmZvcmNlZC4KICAgICAqIEByZXR1cm4gez99IGBtaW5gIGlmIGBkYXRlYCBpcyBsZXNzIHRoYW4gYG1pbmAsIGBtYXhgIGlmIGRhdGUgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLAogICAgICogICAgIG90aGVyd2lzZSBgZGF0ZWAuCiAgICAgKi8KICAgIGNsYW1wRGF0ZShkYXRlLCBtaW4sIG1heCkgewogICAgICAgIGlmIChtaW4gJiYgdGhpcy5jb21wYXJlRGF0ZShkYXRlLCBtaW4pIDwgMCkgewogICAgICAgICAgICByZXR1cm4gbWluOwogICAgICAgIH0KICAgICAgICBpZiAobWF4ICYmIHRoaXMuY29tcGFyZURhdGUoZGF0ZSwgbWF4KSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIG1heDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2RhdGV0aW1lL2RhdGUtZm9ybWF0cy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE1BVF9EQVRFX0ZPUk1BVFMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1kYXRlLWZvcm1hdHMnKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2RhdGV0aW1lL25hdGl2ZS1kYXRlLWFkYXB0ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gVE9ETyhtbWFsZXJiYSk6IFJlbW92ZSB3aGVuIHdlIG5vIGxvbmdlciBzdXBwb3J0IHNhZmFyaSA5LgovKioKICogV2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgSW50bCBBUEkuCiAqIEB0eXBlIHs/fQogKi8KbGV0IFNVUFBPUlRTX0lOVExfQVBJOwovLyBXZSBuZWVkIGEgdHJ5L2NhdGNoIGFyb3VuZCB0aGUgcmVmZXJlbmNlIHRvIGBJbnRsYCwgYmVjYXVzZSBhY2Nlc3NpbmcgaXQgaW4gc29tZSBjYXNlcyBjYW4KLy8gY2F1c2UgSUUgdG8gdGhyb3cuIFRoZXNlIGNhc2VzIGFyZSB0aWVkIHRvIHBhcnRpY3VsYXIgdmVyc2lvbnMgb2YgV2luZG93cyBhbmQgY2FuIGhhcHBlbiBpZgovLyB0aGUgY29uc3VtZXIgaXMgcHJvdmlkaW5nIGEgcG9seWZpbGxlZCBgTWFwYC4gU2VlOgovLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L0NoYWtyYUNvcmUvaXNzdWVzLzMxODkKLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTU2ODcKdHJ5IHsKICAgIFNVUFBPUlRTX0lOVExfQVBJID0gdHlwZW9mIEludGwgIT0gJ3VuZGVmaW5lZCc7Cn0KY2F0Y2ggKF9hKSB7CiAgICBTVVBQT1JUU19JTlRMX0FQSSA9IGZhbHNlOwp9Ci8qKgogKiBUaGUgZGVmYXVsdCBtb250aCBuYW1lcyB0byB1c2UgaWYgSW50bCBBUEkgaXMgbm90IGF2YWlsYWJsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBERUZBVUxUX01PTlRIX05BTUVTID0gewogICAgJ2xvbmcnOiBbCiAgICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywKICAgICAgICAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcicKICAgIF0sCiAgICAnc2hvcnQnOiBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sCiAgICAnbmFycm93JzogWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddCn07CmNvbnN0IMm1MCQ5ID0gLyoqCiAqIEBwYXJhbSB7P30gaQogKiBAcmV0dXJuIHs/fQogKi8KaSA9PiBTdHJpbmcoaSArIDEpOwovKioKICogVGhlIGRlZmF1bHQgZGF0ZSBuYW1lcyB0byB1c2UgaWYgSW50bCBBUEkgaXMgbm90IGF2YWlsYWJsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBERUZBVUxUX0RBVEVfTkFNRVMgPSByYW5nZSgzMSwgKMm1MCQ5KSk7Ci8qKgogKiBUaGUgZGVmYXVsdCBkYXkgb2YgdGhlIHdlZWsgbmFtZXMgdG8gdXNlIGlmIEludGwgQVBJIGlzIG5vdCBhdmFpbGFibGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgREVGQVVMVF9EQVlfT0ZfV0VFS19OQU1FUyA9IHsKICAgICdsb25nJzogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLAogICAgJ3Nob3J0JzogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSwKICAgICduYXJyb3cnOiBbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXQp9OwovKioKICogTWF0Y2hlcyBzdHJpbmdzIHRoYXQgaGF2ZSB0aGUgZm9ybSBvZiBhIHZhbGlkIFJGQyAzMzM5IHN0cmluZwogKiAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkpLiBOb3RlIHRoYXQgdGhlIHN0cmluZyBtYXkgbm90IGFjdHVhbGx5IGJlIGEgdmFsaWQgZGF0ZQogKiBiZWNhdXNlIHRoZSByZWdleCB3aWxsIG1hdGNoIHN0cmluZ3MgYW4gd2l0aCBvdXQgb2YgYm91bmRzIG1vbnRoLCBkYXRlLCBldGMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSVNPXzg2MDFfUkVHRVggPSAvXlxkezR9LVxkezJ9LVxkezJ9KD86VFxkezJ9OlxkezJ9OlxkezJ9KD86XC5cZCspPyg/Olp8KD86KD86XCt8LSlcZHsyfTpcZHsyfSkpPyk/JC87Ci8qKgogKiBDcmVhdGVzIGFuIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHZhbHVlcy4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBsZW5ndGgKICogQHBhcmFtIHs/fSB2YWx1ZUZ1bmN0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByYW5nZShsZW5ndGgsIHZhbHVlRnVuY3Rpb24pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkobGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB2YWx1ZXNBcnJheVtpXSA9IHZhbHVlRnVuY3Rpb24oaSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWVzQXJyYXk7Cn0KLyoqCiAqIEFkYXB0cyB0aGUgbmF0aXZlIEpTIERhdGUgZm9yIHVzZSB3aXRoIGNkay1iYXNlZCBjb21wb25lbnRzIHRoYXQgd29yayB3aXRoIGRhdGVzLgogKi8KY2xhc3MgTmF0aXZlRGF0ZUFkYXB0ZXIgZXh0ZW5kcyBEYXRlQWRhcHRlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWF0RGF0ZUxvY2FsZQogICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybQogICAgICovCiAgICBjb25zdHJ1Y3RvcihtYXREYXRlTG9jYWxlLCBwbGF0Zm9ybSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byB1c2UgYHRpbWVab25lOiAndXRjJ2Agd2l0aCBgSW50bC5EYXRlVGltZUZvcm1hdGAgd2hlbiBmb3JtYXR0aW5nIGRhdGVzLgogICAgICAgICAqIFdpdGhvdXQgdGhpcyBgSW50bC5EYXRlVGltZUZvcm1hdGAgc29tZXRpbWVzIGNob29zZXMgdGhlIHdyb25nIHRpbWVab25lLCB3aGljaCBjYW4gdGhyb3cgb2ZmCiAgICAgICAgICogdGhlIHJlc3VsdC4gKGUuZy4gaW4gdGhlIGVuLVVTIGxvY2FsZSBgbmV3IERhdGUoMTgwMCwgNywgMTQpLnRvTG9jYWxlRGF0ZVN0cmluZygpYAogICAgICAgICAqIHdpbGwgcHJvZHVjZSBgJzgvMTMvMTgwMCdgLgogICAgICAgICAqCiAgICAgICAgICogVE9ETyhtbWFsZXJiYSk6IGRyb3AgdGhpcyB2YXJpYWJsZS4gSXQncyBub3QgYmVpbmcgdXNlZCBpbiB0aGUgY29kZSByaWdodCBub3cuIFdlJ3JlIG5vdwogICAgICAgICAqIGdldHRpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZyb20gaXRzIHV0YyByZXByZXNlbnRhdGlvbi4gV2UncmUga2VlcGluZwogICAgICAgICAqIGl0IGhlcmUgZm9yIHNvbWV0aW1lLCBqdXN0IGZvciBwcmVjYXV0aW9uLCBpbiBjYXNlIHdlIGRlY2lkZSB0byByZXZlcnQgc29tZSBvZiB0aGVzZSBjaGFuZ2VzCiAgICAgICAgICogdGhvdWdoLgogICAgICAgICAqLwogICAgICAgIHRoaXMudXNlVXRjRm9yRGlzcGxheSA9IHRydWU7CiAgICAgICAgc3VwZXIuc2V0TG9jYWxlKG1hdERhdGVMb2NhbGUpOwogICAgICAgIC8vIElFIGRvZXMgaXRzIG93biB0aW1lIHpvbmUgY29ycmVjdGlvbiwgc28gd2UgZGlzYWJsZSB0aGlzIG9uIElFLgogICAgICAgIHRoaXMudXNlVXRjRm9yRGlzcGxheSA9ICFwbGF0Zm9ybS5UUklERU5UOwogICAgICAgIHRoaXMuX2NsYW1wRGF0ZSA9IHBsYXRmb3JtLlRSSURFTlQgfHwgcGxhdGZvcm0uRURHRTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRZZWFyKGRhdGUpIHsKICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldE1vbnRoKGRhdGUpIHsKICAgICAgICByZXR1cm4gZGF0ZS5nZXRNb250aCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldERhdGUoZGF0ZSkgewogICAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXREYXlPZldlZWsoZGF0ZSkgewogICAgICAgIHJldHVybiBkYXRlLmdldERheSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0eWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRNb250aE5hbWVzKHN0eWxlKSB7CiAgICAgICAgaWYgKFNVUFBPUlRTX0lOVExfQVBJKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIHsgbW9udGg6IHN0eWxlLCB0aW1lWm9uZTogJ3V0YycgfSk7CiAgICAgICAgICAgIHJldHVybiByYW5nZSgxMiwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGkgPT4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KGR0ZiwgbmV3IERhdGUoMjAxNywgaSwgMSkpKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREVGQVVMVF9NT05USF9OQU1FU1tzdHlsZV07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldERhdGVOYW1lcygpIHsKICAgICAgICBpZiAoU1VQUE9SVFNfSU5UTF9BUEkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSwgeyBkYXk6ICdudW1lcmljJywgdGltZVpvbmU6ICd1dGMnIH0pOwogICAgICAgICAgICByZXR1cm4gcmFuZ2UoMzEsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpID0+IHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChkdGYsIG5ldyBEYXRlKDIwMTcsIDAsIGkgKyAxKSkpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBERUZBVUxUX0RBVEVfTkFNRVM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldERheU9mV2Vla05hbWVzKHN0eWxlKSB7CiAgICAgICAgaWYgKFNVUFBPUlRTX0lOVExfQVBJKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIHsgd2Vla2RheTogc3R5bGUsIHRpbWVab25lOiAndXRjJyB9KTsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlKDcsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpID0+IHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChkdGYsIG5ldyBEYXRlKDIwMTcsIDAsIGkgKyAxKSkpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBERUZBVUxUX0RBWV9PRl9XRUVLX05BTUVTW3N0eWxlXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRZZWFyTmFtZShkYXRlKSB7CiAgICAgICAgaWYgKFNVUFBPUlRTX0lOVExfQVBJKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIHsgeWVhcjogJ251bWVyaWMnLCB0aW1lWm9uZTogJ3V0YycgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0aGlzLl9mb3JtYXQoZHRmLCBkYXRlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcy5nZXRZZWFyKGRhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Rmlyc3REYXlPZldlZWsoKSB7CiAgICAgICAgLy8gV2UgY2FuJ3QgdGVsbCB1c2luZyBuYXRpdmUgSlMgRGF0ZSB3aGF0IHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaXMsIHdlIGRlZmF1bHQgdG8gU3VuZGF5LgogICAgICAgIHJldHVybiAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldE51bURheXNJbk1vbnRoKGRhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlKHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKGRhdGUpLCB0aGlzLmdldE1vbnRoKGRhdGUpICsgMSwgMCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsb25lKGRhdGUpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHllYXIKICAgICAqIEBwYXJhbSB7P30gbW9udGgKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewogICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIG1vbnRoIGFuZCBkYXRlIChleGNlcHQgdXBwZXIgYm91bmQgb24gZGF0ZSB3aGljaCB3ZSBoYXZlIHRvIGNoZWNrIGFmdGVyCiAgICAgICAgLy8gY3JlYXRpbmcgdGhlIERhdGUpLgogICAgICAgIGlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkgewogICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBtb250aCBpbmRleCAiJHttb250aH0iLiBNb250aCBpbmRleCBoYXMgdG8gYmUgYmV0d2VlbiAwIGFuZCAxMS5gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRhdGUgPCAxKSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgIiR7ZGF0ZX0iLiBEYXRlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gMC5gKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHllYXIsIG1vbnRoLCBkYXRlKTsKICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBkYXRlIHdhc24ndCBhYm92ZSB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBtb250aCwgY2F1c2luZyB0aGUgbW9udGggdG8gb3ZlcmZsb3cKICAgICAgICBpZiAocmVzdWx0LmdldE1vbnRoKCkgIT0gbW9udGgpIHsKICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZGF0ZSAiJHtkYXRlfSIgZm9yIG1vbnRoIHdpdGggaW5kZXggIiR7bW9udGh9Ii5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9kYXkoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhcnNlKHZhbHVlKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBubyB3YXkgdXNpbmcgdGhlIG5hdGl2ZSBKUyBEYXRlIHRvIHNldCB0aGUgcGFyc2UgZm9ybWF0IG9yIGxvY2FsZSwgc28gd2UgaWdub3JlIHRoZXNlCiAgICAgICAgLy8gcGFyYW1ldGVycy4KICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKERhdGUucGFyc2UodmFsdWUpKSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHBhcmFtIHs/fSBkaXNwbGF5Rm9ybWF0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3JtYXQoZGF0ZSwgZGlzcGxheUZvcm1hdCkgewogICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKGRhdGUpKSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKCdOYXRpdmVEYXRlQWRhcHRlcjogQ2Fubm90IGZvcm1hdCBpbnZhbGlkIGRhdGUuJyk7CiAgICAgICAgfQogICAgICAgIGlmIChTVVBQT1JUU19JTlRMX0FQSSkgewogICAgICAgICAgICAvLyBPbiBJRSBhbmQgRWRnZSB0aGUgaTE4biBBUEkgd2lsbCB0aHJvdyBhIGhhcmQgZXJyb3IgdGhhdCBjYW4gY3Jhc2ggdGhlIGVudGlyZSBhcHAKICAgICAgICAgICAgLy8gaWYgd2UgYXR0ZW1wdCB0byBmb3JtYXQgYSBkYXRlIHdob3NlIHllYXIgaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuIDk5OTkuCiAgICAgICAgICAgIGlmICh0aGlzLl9jbGFtcERhdGUgJiYgKGRhdGUuZ2V0RnVsbFllYXIoKSA8IDEgfHwgZGF0ZS5nZXRGdWxsWWVhcigpID4gOTk5OSkpIHsKICAgICAgICAgICAgICAgIGRhdGUgPSB0aGlzLmNsb25lKGRhdGUpOwogICAgICAgICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihNYXRoLm1heCgxLCBNYXRoLm1pbig5OTk5LCBkYXRlLmdldEZ1bGxZZWFyKCkpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGlzcGxheUZvcm1hdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGlzcGxheUZvcm1hdCksIHsgdGltZVpvbmU6ICd1dGMnIH0pOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCBkaXNwbGF5Rm9ybWF0KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChkdGYsIGRhdGUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKGRhdGUudG9EYXRlU3RyaW5nKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEBwYXJhbSB7P30geWVhcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZENhbGVuZGFyWWVhcnMoZGF0ZSwgeWVhcnMpIHsKICAgICAgICByZXR1cm4gdGhpcy5hZGRDYWxlbmRhck1vbnRocyhkYXRlLCB5ZWFycyAqIDEyKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcGFyYW0gez99IG1vbnRocwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkQ2FsZW5kYXJNb250aHMoZGF0ZSwgbW9udGhzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZXdEYXRlID0gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIoZGF0ZSksIHRoaXMuZ2V0TW9udGgoZGF0ZSkgKyBtb250aHMsIHRoaXMuZ2V0RGF0ZShkYXRlKSk7CiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0byB3aW5kIHVwIGluIHRoZSB3cm9uZyBtb250aCBpZiB0aGUgb3JpZ2luYWwgbW9udGggaGFzIG1vcmUgZGF5cyB0aGFuIHRoZSBuZXcKICAgICAgICAvLyBtb250aC4gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gZ28gdG8gdGhlIGxhc3QgZGF5IG9mIHRoZSBkZXNpcmVkIG1vbnRoLgogICAgICAgIC8vIE5vdGU6IHRoZSBhZGRpdGlvbmFsICsgMTIgJSAxMiBlbnN1cmVzIHdlIGVuZCB1cCB3aXRoIGEgcG9zaXRpdmUgbnVtYmVyLCBzaW5jZSBKUyAlIGRvZXNuJ3QKICAgICAgICAvLyBndWFyYW50ZWUgdGhpcy4KICAgICAgICBpZiAodGhpcy5nZXRNb250aChuZXdEYXRlKSAhPSAoKHRoaXMuZ2V0TW9udGgoZGF0ZSkgKyBtb250aHMpICUgMTIgKyAxMikgJSAxMikgewogICAgICAgICAgICBuZXdEYXRlID0gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIobmV3RGF0ZSksIHRoaXMuZ2V0TW9udGgobmV3RGF0ZSksIDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3RGF0ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcGFyYW0gez99IGRheXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZENhbGVuZGFyRGF5cyhkYXRlLCBkYXlzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKGRhdGUpLCB0aGlzLmdldE1vbnRoKGRhdGUpLCB0aGlzLmdldERhdGUoZGF0ZSkgKyBkYXlzKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b0lzbzg2MDEoZGF0ZSkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwKICAgICAgICAgICAgdGhpcy5fMmRpZ2l0KGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLAogICAgICAgICAgICB0aGlzLl8yZGlnaXQoZGF0ZS5nZXRVVENEYXRlKCkpCiAgICAgICAgXS5qb2luKCctJyk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHZhbHVlIGlmIGdpdmVuIGEgdmFsaWQgRGF0ZSBvciBudWxsLiBEZXNlcmlhbGl6ZXMgdmFsaWQgSVNPIDg2MDEgc3RyaW5ncwogICAgICogKGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMzM5LnR4dCkgaW50byB2YWxpZCBEYXRlcyBhbmQgZW1wdHkgc3RyaW5nIGludG8gbnVsbC4gUmV0dXJucyBhbgogICAgICogaW52YWxpZCBkYXRlIGZvciBhbGwgb3RoZXIgdmFsdWVzLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzZXJpYWxpemUodmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgYERhdGVgIGNvbnN0cnVjdG9yIGFjY2VwdHMgZm9ybWF0cyBvdGhlciB0aGFuIElTTyA4NjAxLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUKICAgICAgICAgICAgLy8gc3RyaW5nIGlzIHRoZSByaWdodCBmb3JtYXQgZmlyc3QuCiAgICAgICAgICAgIGlmIChJU09fODYwMV9SRUdFWC50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKGRhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGlzRGF0ZUluc3RhbmNlKG9iaikgewogICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEYXRlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGlzVmFsaWQoZGF0ZSkgewogICAgICAgIHJldHVybiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnZhbGlkKCkgewogICAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGF0ZSBidXQgYWxsb3dzIHRoZSBtb250aCBhbmQgZGF0ZSB0byBvdmVyZmxvdy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHllYXIKICAgICAqIEBwYXJhbSB7P30gbW9udGgKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3coeWVhciwgbW9udGgsIGRhdGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGRhdGUpOwogICAgICAgIC8vIFdlIG5lZWQgdG8gY29ycmVjdCBmb3IgdGhlIGZhY3QgdGhhdCBKUyBuYXRpdmUgRGF0ZSB0cmVhdHMgeWVhcnMgaW4gcmFuZ2UgWzAsIDk5XSBhcwogICAgICAgIC8vIGFiYnJldmlhdGlvbnMgZm9yIDE5eHguCiAgICAgICAgaWYgKHllYXIgPj0gMCAmJiB5ZWFyIDwgMTAwKSB7CiAgICAgICAgICAgIHJlc3VsdC5zZXRGdWxsWWVhcih0aGlzLmdldFllYXIocmVzdWx0KSAtIDE5MDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBQYWRzIGEgbnVtYmVyIHRvIG1ha2UgaXQgdHdvIGRpZ2l0cy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG4gVGhlIG51bWJlciB0byBwYWQuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcGFkZGVkIG51bWJlci4KICAgICAqLwogICAgXzJkaWdpdChuKSB7CiAgICAgICAgcmV0dXJuICgnMDAnICsgbikuc2xpY2UoLTIpOwogICAgfQogICAgLyoqCiAgICAgKiBTdHJpcCBvdXQgdW5pY29kZSBMVFIgYW5kIFJUTCBjaGFyYWN0ZXJzLiBFZGdlIGFuZCBJRSBpbnNlcnQgdGhlc2UgaW50byBmb3JtYXR0ZWQgZGF0ZXMgd2hpbGUKICAgICAqIG90aGVyIGJyb3dzZXJzIGRvIG5vdC4gV2UgcmVtb3ZlIHRoZW0gdG8gbWFrZSBvdXRwdXQgY29uc2lzdGVudCBhbmQgYmVjYXVzZSB0aGV5IGludGVyZmVyZSB3aXRoCiAgICAgKiBkYXRlIHBhcnNpbmcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBzdHIgVGhlIHN0cmluZyB0byBzdHJpcCBkaXJlY3Rpb24gY2hhcmFjdGVycyBmcm9tLgogICAgICogQHJldHVybiB7P30gVGhlIHN0cmlwcGVkIHN0cmluZy4KICAgICAqLwogICAgX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHN0cikgewogICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1x1MjAwZVx1MjAwZl0vZywgJycpOwogICAgfQogICAgLyoqCiAgICAgKiBXaGVuIGNvbnZlcnRpbmcgRGF0ZSBvYmplY3QgdG8gc3RyaW5nLCBqYXZhc2NyaXB0IGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgcmV0dXJuIHdyb25nCiAgICAgKiByZXN1bHRzIGJlY2F1c2UgaXQgYXBwbGllcyBpdHMgaW50ZXJuYWwgRFNUIHJ1bGVzLiBUaGUgRFNUIHJ1bGVzIGFyb3VuZCB0aGUgd29ybGQgY2hhbmdlCiAgICAgKiB2ZXJ5IGZyZXF1ZW50bHksIGFuZCB0aGUgY3VycmVudCB2YWxpZCBydWxlIGlzIG5vdCBhbHdheXMgdmFsaWQgaW4gcHJldmlvdXMgeWVhcnMgdGhvdWdoLgogICAgICogV2Ugd29yayBhcm91bmQgdGhpcyBwcm9ibGVtIGJ1aWxkaW5nIGEgbmV3IERhdGUgb2JqZWN0IHdoaWNoIGhhcyBpdHMgaW50ZXJuYWwgVVRDCiAgICAgKiByZXByZXNlbnRhdGlvbiB3aXRoIHRoZSBsb2NhbCBkYXRlIGFuZCB0aW1lLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZHRmIEludGwuRGF0ZVRpbWVGb3JtYXQgb2JqZWN0LCBjb250YWluZyB0aGUgZGVzaXJlZCBzdHJpbmcgZm9ybWF0LiBJdCBtdXN0IGhhdmUKICAgICAqICAgIHRpbWVab25lIHNldCB0byAndXRjJyB0byB3b3JrIGZpbmUuCiAgICAgKiBAcGFyYW0gez99IGRhdGUgRGF0ZSBmcm9tIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYWNjb3JkaW5nIHRvIGR0ZgogICAgICogQHJldHVybiB7P30gQSBEYXRlIG9iamVjdCB3aXRoIGl0cyBVVEMgcmVwcmVzZW50YXRpb24gYmFzZWQgb24gdGhlIHBhc3NlZCBpbiBkYXRlIGluZm8KICAgICAqLwogICAgX2Zvcm1hdChkdGYsIGRhdGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpKTsKICAgICAgICByZXR1cm4gZHRmLmZvcm1hdChkKTsKICAgIH0KfQpOYXRpdmVEYXRlQWRhcHRlci7JtWZhYyA9IGZ1bmN0aW9uIE5hdGl2ZURhdGVBZGFwdGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5hdGl2ZURhdGVBZGFwdGVyKSjJtcm1aW5qZWN0KE1BVF9EQVRFX0xPQ0FMRSwgOCksIMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfTsKTmF0aXZlRGF0ZUFkYXB0ZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTmF0aXZlRGF0ZUFkYXB0ZXIsIGZhY3Rvcnk6IE5hdGl2ZURhdGVBZGFwdGVyLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmF0aXZlRGF0ZUFkYXB0ZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfREFURV9MT0NBTEUsXSB9XSB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9kYXRldGltZS9uYXRpdmUtZGF0ZS1mb3JtYXRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE1BVF9OQVRJVkVfREFURV9GT1JNQVRTID0gewogICAgcGFyc2U6IHsKICAgICAgICBkYXRlSW5wdXQ6IG51bGwsCiAgICB9LAogICAgZGlzcGxheTogewogICAgICAgIGRhdGVJbnB1dDogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnIH0sCiAgICAgICAgbW9udGhZZWFyTGFiZWw6IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JyB9LAogICAgICAgIGRhdGVBMTF5TGFiZWw6IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9LAogICAgICAgIG1vbnRoWWVhckExMXlMYWJlbDogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfSwKICAgIH0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2RhdGV0aW1lL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE5hdGl2ZURhdGVNb2R1bGUgewp9Ck5hdGl2ZURhdGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBOYXRpdmVEYXRlTW9kdWxlIH0pOwpOYXRpdmVEYXRlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTmF0aXZlRGF0ZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOYXRpdmVEYXRlTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICB7IHByb3ZpZGU6IERhdGVBZGFwdGVyLCB1c2VDbGFzczogTmF0aXZlRGF0ZUFkYXB0ZXIgfSwKICAgIF0sIGltcG9ydHM6IFtbUGxhdGZvcm1Nb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTmF0aXZlRGF0ZU1vZHVsZSwgeyBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbUGxhdGZvcm1Nb2R1bGVdOyB9IH0pOyB9KSgpOwpjb25zdCDJtTAkMSQzID0gTUFUX05BVElWRV9EQVRFX0ZPUk1BVFM7CmNsYXNzIE1hdE5hdGl2ZURhdGVNb2R1bGUgewp9Ck1hdE5hdGl2ZURhdGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXROYXRpdmVEYXRlTW9kdWxlIH0pOwpNYXROYXRpdmVEYXRlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0TmF0aXZlRGF0ZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXROYXRpdmVEYXRlTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiDJtTAkMSQzIH1dLCBpbXBvcnRzOiBbW05hdGl2ZURhdGVNb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0TmF0aXZlRGF0ZU1vZHVsZSwgeyBpbXBvcnRzOiBbTmF0aXZlRGF0ZU1vZHVsZV0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9lcnJvci9lcnJvci1vcHRpb25zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBFcnJvciBzdGF0ZSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyB3aGVuIGEgY29udHJvbCBpcyBpbnZhbGlkIGFuZCBkaXJ0eS4KICovCmNsYXNzIFNob3dPbkRpcnR5RXJyb3JTdGF0ZU1hdGNoZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAqIEBwYXJhbSB7P30gZm9ybQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaXNFcnJvclN0YXRlKGNvbnRyb2wsIGZvcm0pIHsKICAgICAgICByZXR1cm4gISEoY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgKGNvbnRyb2wuZGlydHkgfHwgKGZvcm0gJiYgZm9ybS5zdWJtaXR0ZWQpKSk7CiAgICB9Cn0KU2hvd09uRGlydHlFcnJvclN0YXRlTWF0Y2hlci7JtWZhYyA9IGZ1bmN0aW9uIFNob3dPbkRpcnR5RXJyb3JTdGF0ZU1hdGNoZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2hvd09uRGlydHlFcnJvclN0YXRlTWF0Y2hlcikoKTsgfTsKU2hvd09uRGlydHlFcnJvclN0YXRlTWF0Y2hlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyLCBmYWN0b3J5OiBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyLsm1ZmFjIH0pOwovKioKICogUHJvdmlkZXIgdGhhdCBkZWZpbmVzIGhvdyBmb3JtIGNvbnRyb2xzIGJlaGF2ZSB3aXRoIHJlZ2FyZHMgdG8gZGlzcGxheWluZyBlcnJvciBtZXNzYWdlcy4KICovCmNsYXNzIEVycm9yU3RhdGVNYXRjaGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcGFyYW0gez99IGZvcm0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGlzRXJyb3JTdGF0ZShjb250cm9sLCBmb3JtKSB7CiAgICAgICAgcmV0dXJuICEhKGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIChjb250cm9sLnRvdWNoZWQgfHwgKGZvcm0gJiYgZm9ybS5zdWJtaXR0ZWQpKSk7CiAgICB9Cn0KRXJyb3JTdGF0ZU1hdGNoZXIuybVmYWMgPSBmdW5jdGlvbiBFcnJvclN0YXRlTWF0Y2hlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFcnJvclN0YXRlTWF0Y2hlcikoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIEVycm9yU3RhdGVNYXRjaGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRXJyb3JTdGF0ZU1hdGNoZXJfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBFcnJvclN0YXRlTWF0Y2hlcigpOyB9LCB0b2tlbjogRXJyb3JTdGF0ZU1hdGNoZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2dlc3R1cmVzL2dlc3R1cmUtY29uZmlnLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlIG9wdGlvbnMgdG8gdGhlIEhhbW1lcmpzIGluc3RhbmNlLgogKiBNb3JlIGluZm8gYXQgaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvLgogKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgYmVpbmcgdXNlZC4gVG8gYmUgcmVtb3ZlZC4KICogXEBicmVha2luZy1jaGFuZ2UgMTAuMC4wCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX0hBTU1FUl9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdNQVRfSEFNTUVSX09QVElPTlMnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBBTkdVTEFSX01BVEVSSUFMX1NVUFBPUlRFRF9IQU1NRVJfR0VTVFVSRVMgPSBbCiAgICAnbG9uZ3ByZXNzJywKICAgICdzbGlkZScsCiAgICAnc2xpZGVzdGFydCcsCiAgICAnc2xpZGVlbmQnLAogICAgJ3NsaWRlcmlnaHQnLAogICAgJ3NsaWRlbGVmdCcKXTsKY29uc3QgybUwJDIkMiA9IC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4geyB9LCDJtTEkNSA9IC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4geyB9OwovKioKICogRmFrZSBIYW1tZXJJbnN0YW5jZSB0aGF0IGlzIHVzZWQgd2hlbiBhIEhhbW1lciBpbnN0YW5jZSBpcyByZXF1ZXN0ZWQgd2hlbiBIYW1tZXJKUyBoYXMgbm90CiAqIGJlZW4gbG9hZGVkIG9uIHRoZSBwYWdlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IG5vb3BIYW1tZXJJbnN0YW5jZSA9IHsKICAgIG9uOiAoybUwJDIkMiksCiAgICBvZmY6ICjJtTEkNSksCn07Ci8qKgogKiBBZGp1c3RzIGNvbmZpZ3VyYXRpb24gb2Ygb3VyIGdlc3R1cmUgbGlicmFyeSwgSGFtbWVyLgogKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgYmVpbmcgdXNlZC4gVG8gYmUgcmVtb3ZlZC4KICogXEBicmVha2luZy1jaGFuZ2UgMTAuMC4wCiAqLwpjbGFzcyBHZXN0dXJlQ29uZmlnIGV4dGVuZHMgSGFtbWVyR2VzdHVyZUNvbmZpZyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IF9oYW1tZXJPcHRpb25zCiAgICAgKiBAcGFyYW0gez89fSBfY29tbW9uTW9kdWxlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9oYW1tZXJPcHRpb25zLCBfY29tbW9uTW9kdWxlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9oYW1tZXJPcHRpb25zID0gX2hhbW1lck9wdGlvbnM7CiAgICAgICAgLyoqCiAgICAgICAgICogTGlzdCBvZiBuZXcgZXZlbnQgbmFtZXMgdG8gYWRkIHRvIHRoZSBnZXN0dXJlIHN1cHBvcnQgbGlzdAogICAgICAgICAqLwogICAgICAgIHRoaXMuZXZlbnRzID0gQU5HVUxBUl9NQVRFUklBTF9TVVBQT1JURURfSEFNTUVSX0dFU1RVUkVTOwogICAgfQogICAgLyoqCiAgICAgKiBCdWlsZHMgSGFtbWVyIGluc3RhbmNlIG1hbnVhbGx5IHRvIGFkZCBjdXN0b20gcmVjb2duaXplcnMgdGhhdCBtYXRjaCB0aGUgTWF0ZXJpYWwgRGVzaWduIHNwZWMuCiAgICAgKgogICAgICogT3VyIGdlc3R1cmUgbmFtZXMgY29tZSBmcm9tIHRoZSBNYXRlcmlhbCBEZXNpZ24gZ2VzdHVyZXMgc3BlYzoKICAgICAqIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduLyNnZXN0dXJlcy10b3VjaC1tZWNoYW5pY3MKICAgICAqCiAgICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIGRlZmF1bHQgcmVjb2duaXplcnMgY2FuIGJlIGZvdW5kIGluIEhhbW1lciBkb2NzOgogICAgICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9yZWNvZ25pemVyLXBhbi8KICAgICAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vcmVjb2duaXplci1wcmVzcy8KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCB0byB3aGljaCB0byBhc3NpZ24gdGhlIG5ldyBIYW1tZXJKUyBnZXN0dXJlcy4KICAgICAqIEByZXR1cm4gez99IE5ld2x5LWNyZWF0ZWQgSGFtbWVySlMgaW5zdGFuY2UuCiAgICAgKi8KICAgIGJ1aWxkSGFtbWVyKGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaGFtbWVyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyAoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5IYW1tZXIgOiBudWxsOwogICAgICAgIGlmICghaGFtbWVyKSB7CiAgICAgICAgICAgIC8vIElmIEhhbW1lckpTIGlzIG5vdCBsb2FkZWQgaGVyZSwgcmV0dXJuIHRoZSBub29wIEhhbW1lckluc3RhbmNlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0bwogICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBvbWl0dGluZyBIYW1tZXJKUyBjb21wbGV0ZWx5IHdpbGwgbm90IGNhdXNlIGFueSBlcnJvcnMgd2hpbGUgKmFsc28qIHN1cHBvcnRpbmcKICAgICAgICAgICAgLy8gdGhlIGxhenktbG9hZGluZyBvZiBIYW1tZXJKUyB2aWEgdGhlIEhBTU1FUl9MT0FERVIgdG9rZW4gaW50cm9kdWNlZCBpbiBBbmd1bGFyIDYuMS4KICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSBjYW4ndCBkZXBlbmQgb24gSEFNTUVSX0xPQURFUidzIGV4aXN0YW5jZSB1bnRpbCA3LjAsIHdlIGhhdmUgdG8gYWx3YXlzIHNldAogICAgICAgICAgICAvLyBgdGhpcy5ldmVudHNgIHRvIHRoZSBzZXQgd2Ugc3VwcG9ydCwgaW5zdGVhZCBvZiBjb25kaXRpb25hbGx5IHNldHRpbmcgaXQgdG8gYFtdYCBpZgogICAgICAgICAgICAvLyBgSEFNTUVSX0xPQURFUmAgaXMgcHJlc2VudCAoYW5kIHRoZW4gdGhyb3dpbmcgYW4gRXJyb3IgaGVyZSBpZiBgd2luZG93LkhhbW1lcmAgaXMKICAgICAgICAgICAgLy8gdW5kZWZpbmVkKS4KICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAgICByZXR1cm4gbm9vcEhhbW1lckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWMgPSBuZXcgaGFtbWVyKGVsZW1lbnQsIHRoaXMuX2hhbW1lck9wdGlvbnMgfHwgdW5kZWZpbmVkKTsKICAgICAgICAvLyBEZWZhdWx0IEhhbW1lciBSZWNvZ25pemVycy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFuID0gbmV3IGhhbW1lci5QYW4oKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3dpcGUgPSBuZXcgaGFtbWVyLlN3aXBlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXNzID0gbmV3IGhhbW1lci5QcmVzcygpOwogICAgICAgIC8vIE5vdGljZSB0aGF0IGEgSGFtbWVySlMgcmVjb2duaXplciBjYW4gb25seSBkZXBlbmQgb24gb25lIG90aGVyIHJlY29nbml6ZXIgb25jZS4KICAgICAgICAvLyBPdGhlcndpc2UgdGhlIHByZXZpb3VzIGByZWNvZ25pemVXaXRoYCB3aWxsIGJlIGRyb3BwZWQuCiAgICAgICAgLy8gVE9ETzogQ29uZmlybSB0aHJlc2hvbGQgbnVtYmVycyB3aXRoIE1hdGVyaWFsIERlc2lnbiBVWCBUZWFtCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNsaWRlID0gdGhpcy5fY3JlYXRlUmVjb2duaXplcihwYW4sIHsgZXZlbnQ6ICdzbGlkZScsIHRocmVzaG9sZDogMCB9LCBzd2lwZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxvbmdwcmVzcyA9IHRoaXMuX2NyZWF0ZVJlY29nbml6ZXIocHJlc3MsIHsgZXZlbnQ6ICdsb25ncHJlc3MnLCB0aW1lOiA1MDAgfSk7CiAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBkZWZhdWx0IGBwYW5gIGV2ZW50IHRvIHVzZSB0aGUgc3dpcGUgZXZlbnQuCiAgICAgICAgcGFuLnJlY29nbml6ZVdpdGgoc3dpcGUpOwogICAgICAgIC8vIFNpbmNlIHRoZSBzbGlkZSBldmVudCB0aHJlc2hvbGQgaXMgc2V0IHRvIHplcm8sIHRoZSBzbGlkZSByZWNvZ25pemVyIGNhbiBmaXJlIGFuZAogICAgICAgIC8vIGFjY2lkZW50YWxseSByZXNldCB0aGUgbG9uZ3ByZXNzIHJlY29nbml6ZXIuIEluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0d28KICAgICAgICAvLyByZWNvZ25pemVycyBjYW4gcnVuIHNpbXVsdGFuZW91c2x5IGJ1dCBkb24ndCBhZmZlY3QgZWFjaCBvdGhlciwgd2UgYWxsb3cgdGhlIHNsaWRlCiAgICAgICAgLy8gcmVjb2duaXplciB0byByZWNvZ25pemUgd2hpbGUgYSBsb25ncHJlc3MgaXMgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2hhbW1lcmpzL2hhbW1lci5qcy9ibG9iL21hc3Rlci9zcmMvbWFuYWdlci5qcyNMMTIzLUwxMjQKICAgICAgICBsb25ncHJlc3MucmVjb2duaXplV2l0aChzbGlkZSk7CiAgICAgICAgLy8gQWRkIGN1c3RvbWl6ZWQgZ2VzdHVyZXMgdG8gSGFtbWVyIG1hbmFnZXIKICAgICAgICBtYy5hZGQoW3N3aXBlLCBwcmVzcywgcGFuLCBzbGlkZSwgbG9uZ3ByZXNzXSk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChtYykpOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlY29nbml6ZXIsIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBkZWZhdWx0IHJlY29nbml6ZXJzIG9mIEhhbW1lckpTCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBiYXNlCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqIEBwYXJhbSB7Li4uP30gaW5oZXJpdGFuY2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY3JlYXRlUmVjb2duaXplcihiYXNlLCBvcHRpb25zLCAuLi5pbmhlcml0YW5jZXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29nbml6ZXIgPSBuZXcgKCgvKiogQHR5cGUgez99ICovIChiYXNlLmNvbnN0cnVjdG9yKSkpKG9wdGlvbnMpOwogICAgICAgIGluaGVyaXRhbmNlcy5wdXNoKGJhc2UpOwogICAgICAgIGluaGVyaXRhbmNlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGl0ZW0gPT4gcmVjb2duaXplci5yZWNvZ25pemVXaXRoKGl0ZW0pKSk7CiAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7CiAgICB9Cn0KR2VzdHVyZUNvbmZpZy7JtWZhYyA9IGZ1bmN0aW9uIEdlc3R1cmVDb25maWdfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR2VzdHVyZUNvbmZpZykoybXJtWluamVjdChNQVRfSEFNTUVSX09QVElPTlMsIDgpLCDJtcm1aW5qZWN0KE1hdENvbW1vbk1vZHVsZSwgOCkpOyB9OwpHZXN0dXJlQ29uZmlnLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEdlc3R1cmVDb25maWcsIGZhY3Rvcnk6IEdlc3R1cmVDb25maWcuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpHZXN0dXJlQ29uZmlnLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0hBTU1FUl9PUFRJT05TLF0gfV0gfSwKICAgIHsgdHlwZTogTWF0Q29tbW9uTW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9saW5lL2xpbmUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFNoYXJlZCBkaXJlY3RpdmUgdG8gY291bnQgbGluZXMgaW5zaWRlIGEgdGV4dCBhcmVhLCBzdWNoIGFzIGEgbGlzdCBpdGVtLgogKiBMaW5lIGVsZW1lbnRzIGNhbiBiZSBleHRyYWN0ZWQgd2l0aCBhIFxAQ29udGVudENoaWxkcmVuKE1hdExpbmUpIHF1ZXJ5LCB0aGVuCiAqIGNvdW50ZWQgYnkgY2hlY2tpbmcgdGhlIHF1ZXJ5IGxpc3QncyBsZW5ndGguCiAqLwpjbGFzcyBNYXRMaW5lIHsKfQpNYXRMaW5lLsm1ZmFjID0gZnVuY3Rpb24gTWF0TGluZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRMaW5lKSgpOyB9OwpNYXRMaW5lLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdExpbmUsIHNlbGVjdG9yczogW1siIiwgIm1hdC1saW5lIiwgIiJdLCBbIiIsICJtYXRMaW5lIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1saW5lIl0gfSk7CmNsYXNzIE1hdExpbmVNb2R1bGUgewp9Ck1hdExpbmVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRMaW5lTW9kdWxlIH0pOwpNYXRMaW5lTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0TGluZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRMaW5lTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW01hdENvbW1vbk1vZHVsZV0sCiAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0TGluZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtNYXRMaW5lXSwgaW1wb3J0czogW01hdENvbW1vbk1vZHVsZV0sIGV4cG9ydHM6IFtNYXRMaW5lLAogICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7IH0pKCk7Ci8qKgogKiBSZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IGxhdW5jaGVkIHJpcHBsZSBlbGVtZW50LgogKi8KY2xhc3MgUmlwcGxlUmVmIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAqLwogICAgY29uc3RydWN0b3IoX3JlbmRlcmVyLCBlbGVtZW50LCBjb25maWcpIHsKICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICAgICAgIC8qKgogICAgICAgICAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHJpcHBsZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnN0YXRlID0gMyAvKiBISURERU4gKi87CiAgICB9CiAgICAvKioKICAgICAqIEZhZGVzIG91dCB0aGUgcmlwcGxlIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmYWRlT3V0KCkgewogICAgICAgIHRoaXMuX3JlbmRlcmVyLmZhZGVPdXRSaXBwbGUodGhpcyk7CiAgICB9Cn0KLyoqCiAqIERlZmF1bHQgcmlwcGxlIGFuaW1hdGlvbiBjb25maWd1cmF0aW9uIGZvciByaXBwbGVzIHdpdGhvdXQgYW4gZXhwbGljaXQKICogYW5pbWF0aW9uIGNvbmZpZyBzcGVjaWZpZWQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZGVmYXVsdFJpcHBsZUFuaW1hdGlvbkNvbmZpZyA9IHsKICAgIGVudGVyRHVyYXRpb246IDQ1MCwKICAgIGV4aXREdXJhdGlvbjogNDAwCn07Ci8qKgogKiBUaW1lb3V0IGZvciBpZ25vcmluZyBtb3VzZSBldmVudHMuIE1vdXNlIGV2ZW50cyB3aWxsIGJlIHRlbXBvcmFyeSBpZ25vcmVkIGFmdGVyIHRvdWNoCiAqIGV2ZW50cyB0byBhdm9pZCBzeW50aGV0aWMgbW91c2UgZXZlbnRzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IGlnbm9yZU1vdXNlRXZlbnRzVGltZW91dCA9IDgwMDsKLyoqCiAqIE9wdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGFyZSBib3VuZCBieSB0aGUgcmlwcGxlIHJlbmRlcmVyLgogKiBAdHlwZSB7P30KICovCmNvbnN0IHBhc3NpdmVFdmVudE9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KTsKLyoqCiAqIEV2ZW50cyB0aGF0IHNpZ25hbCB0aGF0IHRoZSBwb2ludGVyIGlzIGRvd24uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgcG9pbnRlckRvd25FdmVudHMgPSBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J107Ci8qKgogKiBFdmVudHMgdGhhdCBzaWduYWwgdGhhdCB0aGUgcG9pbnRlciBpcyB1cC4KICogQHR5cGUgez99CiAqLwpjb25zdCBwb2ludGVyVXBFdmVudHMgPSBbJ21vdXNldXAnLCAnbW91c2VsZWF2ZScsICd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCddOwovKioKICogSGVscGVyIHNlcnZpY2UgdGhhdCBwZXJmb3JtcyBET00gbWFuaXB1bGF0aW9ucy4gTm90IGludGVuZGVkIHRvIGJlIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS4KICogVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEgcmVmZXJlbmNlIHRvIHRoZSByaXBwbGUgZGlyZWN0aXZlJ3MgaG9zdCBlbGVtZW50IGFuZCBhIG1hcCBvZiBET00KICogZXZlbnQgaGFuZGxlcnMgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcnMgcmlwcGxlIGFuaW1hdGlvbnMuCiAqIFRoaXMgd2lsbCBldmVudHVhbGx5IGJlY29tZSBhIGN1c3RvbSByZW5kZXJlciBvbmNlIEFuZ3VsYXIgc3VwcG9ydCBleGlzdHMuCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBSaXBwbGVSZW5kZXJlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3RhcmdldAogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPckVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAqLwogICAgY29uc3RydWN0b3IoX3RhcmdldCwgX25nWm9uZSwgZWxlbWVudE9yRWxlbWVudFJlZiwgcGxhdGZvcm0pIHsKICAgICAgICB0aGlzLl90YXJnZXQgPSBfdGFyZ2V0OwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgZG93biBvciBub3QuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faXNQb2ludGVyRG93biA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFNldCBvZiBjdXJyZW50bHkgYWN0aXZlIHJpcHBsZSByZWZlcmVuY2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2FjdGl2ZVJpcHBsZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBwb2ludGVyLXVwIGV2ZW50IGxpc3RlbmVycyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkID0gZmFsc2U7CiAgICAgICAgLy8gT25seSBkbyBhbnl0aGluZyBpZiB3ZSdyZSBvbiB0aGUgYnJvd3Nlci4KICAgICAgICBpZiAocGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnRPckVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRmFkZXMgaW4gYSByaXBwbGUgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLgogICAgICogQHBhcmFtIHs/fSB4IENvb3JkaW5hdGUgd2l0aGluIHRoZSBlbGVtZW50LCBhbG9uZyB0aGUgWCBheGlzIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSByaXBwbGUuCiAgICAgKiBAcGFyYW0gez99IHkgQ29vcmRpbmF0ZSB3aXRoaW4gdGhlIGVsZW1lbnQsIGFsb25nIHRoZSBZIGF4aXMgYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHJpcHBsZS4KICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZyBFeHRyYSByaXBwbGUgb3B0aW9ucy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZhZGVJblJpcHBsZSh4LCB5LCBjb25maWcgPSB7fSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5fY29udGFpbmVyUmVjdCA9CiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclJlY3QgfHwgdGhpcy5fY29udGFpbmVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW5pbWF0aW9uQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UmlwcGxlQW5pbWF0aW9uQ29uZmlnKSwgY29uZmlnLmFuaW1hdGlvbik7CiAgICAgICAgaWYgKGNvbmZpZy5jZW50ZXJlZCkgewogICAgICAgICAgICB4ID0gY29udGFpbmVyUmVjdC5sZWZ0ICsgY29udGFpbmVyUmVjdC53aWR0aCAvIDI7CiAgICAgICAgICAgIHkgPSBjb250YWluZXJSZWN0LnRvcCArIGNvbnRhaW5lclJlY3QuaGVpZ2h0IC8gMjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJhZGl1cyA9IGNvbmZpZy5yYWRpdXMgfHwgZGlzdGFuY2VUb0Z1cnRoZXN0Q29ybmVyKHgsIHksIGNvbnRhaW5lclJlY3QpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvZmZzZXRYID0geCAtIGNvbnRhaW5lclJlY3QubGVmdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IHkgLSBjb250YWluZXJSZWN0LnRvcDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBhbmltYXRpb25Db25maWcuZW50ZXJEdXJhdGlvbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmlwcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgcmlwcGxlLmNsYXNzTGlzdC5hZGQoJ21hdC1yaXBwbGUtZWxlbWVudCcpOwogICAgICAgIHJpcHBsZS5zdHlsZS5sZWZ0ID0gYCR7b2Zmc2V0WCAtIHJhZGl1c31weGA7CiAgICAgICAgcmlwcGxlLnN0eWxlLnRvcCA9IGAke29mZnNldFkgLSByYWRpdXN9cHhgOwogICAgICAgIHJpcHBsZS5zdHlsZS5oZWlnaHQgPSBgJHtyYWRpdXMgKiAyfXB4YDsKICAgICAgICByaXBwbGUuc3R5bGUud2lkdGggPSBgJHtyYWRpdXMgKiAyfXB4YDsKICAgICAgICAvLyBJZiBhIGN1c3RvbSBjb2xvciBoYXMgYmVlbiBzcGVjaWZpZWQsIHNldCBpdCBhcyBpbmxpbmUgc3R5bGUuIElmIG5vIGNvbG9yIGlzCiAgICAgICAgLy8gc2V0LCB0aGUgZGVmYXVsdCBjb2xvciB3aWxsIGJlIGFwcGxpZWQgdGhyb3VnaCB0aGUgcmlwcGxlIHRoZW1lIHN0eWxlcy4KICAgICAgICBpZiAoY29uZmlnLmNvbG9yICE9IG51bGwpIHsKICAgICAgICAgICAgcmlwcGxlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbmZpZy5jb2xvcjsKICAgICAgICB9CiAgICAgICAgcmlwcGxlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGAke2R1cmF0aW9ufW1zYDsKICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHJpcHBsZSk7CiAgICAgICAgLy8gQnkgZGVmYXVsdCB0aGUgYnJvd3NlciBkb2VzIG5vdCByZWNhbGN1bGF0ZSB0aGUgc3R5bGVzIG9mIGR5bmFtaWNhbGx5IGNyZWF0ZWQKICAgICAgICAvLyByaXBwbGUgZWxlbWVudHMuIFRoaXMgaXMgY3JpdGljYWwgYmVjYXVzZSB0aGVuIHRoZSBgc2NhbGVgIHdvdWxkIG5vdCBhbmltYXRlIHByb3Blcmx5LgogICAgICAgIGVuZm9yY2VTdHlsZVJlY2FsY3VsYXRpb24ocmlwcGxlKTsKICAgICAgICByaXBwbGUuc3R5bGUudHJhbnNmb3JtID0gJ3NjYWxlKDEpJzsKICAgICAgICAvLyBFeHBvc2VkIHJlZmVyZW5jZSB0byB0aGUgcmlwcGxlIHRoYXQgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmlwcGxlUmVmID0gbmV3IFJpcHBsZVJlZih0aGlzLCByaXBwbGUsIGNvbmZpZyk7CiAgICAgICAgcmlwcGxlUmVmLnN0YXRlID0gMCAvKiBGQURJTkdfSU4gKi87CiAgICAgICAgLy8gQWRkIHRoZSByaXBwbGUgcmVmZXJlbmNlIHRvIHRoZSBsaXN0IG9mIGFsbCBhY3RpdmUgcmlwcGxlcy4KICAgICAgICB0aGlzLl9hY3RpdmVSaXBwbGVzLmFkZChyaXBwbGVSZWYpOwogICAgICAgIGlmICghY29uZmlnLnBlcnNpc3RlbnQpIHsKICAgICAgICAgICAgdGhpcy5fbW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZSA9IHJpcHBsZVJlZjsKICAgICAgICB9CiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHJpcHBsZSBlbGVtZW50IHRvIGJlIGNvbXBsZXRlbHkgZmFkZWQgaW4uCiAgICAgICAgLy8gT25jZSBpdCdzIGZhZGVkIGluLCB0aGUgcmlwcGxlIGNhbiBiZSBoaWRkZW4gaW1tZWRpYXRlbHkgaWYgdGhlIG1vdXNlIGlzIHJlbGVhc2VkLgogICAgICAgIHRoaXMuX3J1blRpbWVvdXRPdXRzaWRlWm9uZSgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNNb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlID0gcmlwcGxlUmVmID09PSB0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlOwogICAgICAgICAgICByaXBwbGVSZWYuc3RhdGUgPSAxIC8qIFZJU0lCTEUgKi87CiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRpbWVyIHJ1bnMgb3V0IHdoaWxlIHRoZSB1c2VyIGhhcyBrZXB0IHRoZWlyIHBvaW50ZXIgZG93biwgd2Ugd2FudCB0bwogICAgICAgICAgICAvLyBrZWVwIG9ubHkgdGhlIHBlcnNpc3RlbnQgcmlwcGxlcyBhbmQgdGhlIGxhdGVzdCB0cmFuc2llbnQgcmlwcGxlLiBXZSBkbyB0aGlzLAogICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgc3RhY2tlZCB0cmFuc2llbnQgcmlwcGxlcyB0byBhcHBlYXIgYWZ0ZXIgdGhlaXIgZW50ZXIKICAgICAgICAgICAgLy8gYW5pbWF0aW9uIGhhcyBmaW5pc2hlZC4KICAgICAgICAgICAgaWYgKCFjb25maWcucGVyc2lzdGVudCAmJiAoIWlzTW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZSB8fCAhdGhpcy5faXNQb2ludGVyRG93bikpIHsKICAgICAgICAgICAgICAgIHJpcHBsZVJlZi5mYWRlT3V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgZHVyYXRpb24pOwogICAgICAgIHJldHVybiByaXBwbGVSZWY7CiAgICB9CiAgICAvKioKICAgICAqIEZhZGVzIG91dCBhIHJpcHBsZSByZWZlcmVuY2UuCiAgICAgKiBAcGFyYW0gez99IHJpcHBsZVJlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmFkZU91dFJpcHBsZShyaXBwbGVSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgd2FzQWN0aXZlID0gdGhpcy5fYWN0aXZlUmlwcGxlcy5kZWxldGUocmlwcGxlUmVmKTsKICAgICAgICBpZiAocmlwcGxlUmVmID09PSB0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlKSB7CiAgICAgICAgICAgIHRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGUgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGNhY2hlZCBib3VuZGluZyByZWN0IGlmIHdlIGhhdmUgbm8gbW9yZSByaXBwbGVzLgogICAgICAgIGlmICghdGhpcy5fYWN0aXZlUmlwcGxlcy5zaXplKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclJlY3QgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBGb3IgcmlwcGxlcyB0aGF0IGFyZSBub3QgYWN0aXZlIGFueW1vcmUsIGRvbid0IHJlLXJ1biB0aGUgZmFkZS1vdXQgYW5pbWF0aW9uLgogICAgICAgIGlmICghd2FzQWN0aXZlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJpcHBsZUVsID0gcmlwcGxlUmVmLmVsZW1lbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW1hdGlvbkNvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJpcHBsZUFuaW1hdGlvbkNvbmZpZyksIHJpcHBsZVJlZi5jb25maWcuYW5pbWF0aW9uKTsKICAgICAgICByaXBwbGVFbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHthbmltYXRpb25Db25maWcuZXhpdER1cmF0aW9ufW1zYDsKICAgICAgICByaXBwbGVFbC5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgIHJpcHBsZVJlZi5zdGF0ZSA9IDIgLyogRkFESU5HX09VVCAqLzsKICAgICAgICAvLyBPbmNlIHRoZSByaXBwbGUgZmFkZWQgb3V0LCB0aGUgcmlwcGxlIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCBmcm9tIHRoZSBET00uCiAgICAgICAgdGhpcy5fcnVuVGltZW91dE91dHNpZGVab25lKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgcmlwcGxlUmVmLnN0YXRlID0gMyAvKiBISURERU4gKi87CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChyaXBwbGVFbC5wYXJlbnROb2RlKSkucmVtb3ZlQ2hpbGQocmlwcGxlRWwpOwogICAgICAgIH0pLCBhbmltYXRpb25Db25maWcuZXhpdER1cmF0aW9uKTsKICAgIH0KICAgIC8qKgogICAgICogRmFkZXMgb3V0IGFsbCBjdXJyZW50bHkgYWN0aXZlIHJpcHBsZXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmYWRlT3V0QWxsKCkgewogICAgICAgIHRoaXMuX2FjdGl2ZVJpcHBsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByaXBwbGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJpcHBsZSA9PiByaXBwbGUuZmFkZU91dCgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdXAgdGhlIHRyaWdnZXIgZXZlbnQgbGlzdGVuZXJzCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPckVsZW1lbnRSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldHVwVHJpZ2dlckV2ZW50cyhlbGVtZW50T3JFbGVtZW50UmVmKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnRPckVsZW1lbnRSZWYpOwogICAgICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50ID09PSB0aGlzLl90cmlnZ2VyRWxlbWVudCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSBhbGwgcHJldmlvdXNseSByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSB0cmlnZ2VyIGVsZW1lbnQuCiAgICAgICAgdGhpcy5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpOwogICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gZWxlbWVudDsKICAgICAgICB0aGlzLl9yZWdpc3RlckV2ZW50cyhwb2ludGVyRG93bkV2ZW50cyk7CiAgICB9CiAgICAvKioKICAgICAqIEhhbmRsZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnRzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhbmRsZUV2ZW50KGV2ZW50KSB7CiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7CiAgICAgICAgICAgIHRoaXMuX29uTW91c2Vkb3duKCgvKiogQHR5cGUgez99ICovIChldmVudCkpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7CiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hTdGFydCgoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9vblBvaW50ZXJVcCgpOwogICAgICAgIH0KICAgICAgICAvLyBJZiBwb2ludGVyLXVwIGV2ZW50cyBoYXZlbid0IGJlZW4gcmVnaXN0ZXJlZCB5ZXQsIGRvIHNvIG5vdy4KICAgICAgICAvLyBXZSBkbyB0aGlzIG9uLWRlbWFuZCBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRvdGFsIG51bWJlciBvZiBldmVudCBsaXN0ZW5lcnMKICAgICAgICAvLyByZWdpc3RlcmVkIGJ5IHRoZSByaXBwbGVzLCB3aGljaCBzcGVlZHMgdXAgdGhlIHJlbmRlcmluZyB0aW1lIGZvciBsYXJnZSBVSXMuCiAgICAgICAgaWYgKCF0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKHBvaW50ZXJVcEV2ZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJVcEV2ZW50c1JlZ2lzdGVyZWQgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRnVuY3Rpb24gYmVpbmcgY2FsbGVkIHdoZW5ldmVyIHRoZSB0cmlnZ2VyIGlzIGJlaW5nIHByZXNzZWQgdXNpbmcgbW91c2UuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uTW91c2Vkb3duKGV2ZW50KSB7CiAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgd2lsbCBmaXJlIGZha2UgbW91c2UgZXZlbnRzIGZvciBzcGFjZS9lbnRlci4gU2tpcCBsYXVuY2hpbmcgYQogICAgICAgIC8vIHJpcHBsZSBpbiB0aGlzIGNhc2UgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG5vbi1zY3JlZW4tcmVhZGVyIGV4cGVyaWVuY2UuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzRmFrZU1vdXNlZG93biA9IGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1N5bnRoZXRpY0V2ZW50ID0gdGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudCAmJgogICAgICAgICAgICBEYXRlLm5vdygpIDwgdGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudCArIGlnbm9yZU1vdXNlRXZlbnRzVGltZW91dDsKICAgICAgICBpZiAoIXRoaXMuX3RhcmdldC5yaXBwbGVEaXNhYmxlZCAmJiAhaXNGYWtlTW91c2Vkb3duICYmICFpc1N5bnRoZXRpY0V2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2lzUG9pbnRlckRvd24gPSB0cnVlOwogICAgICAgICAgICB0aGlzLmZhZGVJblJpcHBsZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCB0aGlzLl90YXJnZXQucmlwcGxlQ29uZmlnKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEZ1bmN0aW9uIGJlaW5nIGNhbGxlZCB3aGVuZXZlciB0aGUgdHJpZ2dlciBpcyBiZWluZyBwcmVzc2VkIHVzaW5nIHRvdWNoLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vblRvdWNoU3RhcnQoZXZlbnQpIHsKICAgICAgICBpZiAoIXRoaXMuX3RhcmdldC5yaXBwbGVEaXNhYmxlZCkgewogICAgICAgICAgICAvLyBTb21lIGJyb3dzZXJzIGZpcmUgbW91c2UgZXZlbnRzIGFmdGVyIGEgYHRvdWNoc3RhcnRgIGV2ZW50LiBUaG9zZSBzeW50aGV0aWMgbW91c2UKICAgICAgICAgICAgLy8gZXZlbnRzIHdpbGwgbGF1bmNoIGEgc2Vjb25kIHJpcHBsZSBpZiB3ZSBkb24ndCBpZ25vcmUgbW91c2UgZXZlbnRzIGZvciBhIHNwZWNpZmljCiAgICAgICAgICAgIC8vIHRpbWUgYWZ0ZXIgYSB0b3VjaHN0YXJ0IGV2ZW50LgogICAgICAgICAgICB0aGlzLl9sYXN0VG91Y2hTdGFydEV2ZW50ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgdGhpcy5faXNQb2ludGVyRG93biA9IHRydWU7CiAgICAgICAgICAgIC8vIFVzZSBgY2hhbmdlZFRvdWNoZXNgIHNvIHdlIHNraXAgYW55IHRvdWNoZXMgd2hlcmUgdGhlIHVzZXIgcHV0CiAgICAgICAgICAgIC8vIHRoZWlyIGZpbmdlciBkb3duLCBidXQgdXNlZCBhbm90aGVyIGZpbmdlciB0byB0YXAgdGhlIGVsZW1lbnQgYWdhaW4uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMuZmFkZUluUmlwcGxlKHRvdWNoZXNbaV0uY2xpZW50WCwgdG91Y2hlc1tpXS5jbGllbnRZLCB0aGlzLl90YXJnZXQucmlwcGxlQ29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRnVuY3Rpb24gYmVpbmcgY2FsbGVkIHdoZW5ldmVyIHRoZSB0cmlnZ2VyIGlzIGJlaW5nIHJlbGVhc2VkLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vblBvaW50ZXJVcCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2lzUG9pbnRlckRvd24pIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pc1BvaW50ZXJEb3duID0gZmFsc2U7CiAgICAgICAgLy8gRmFkZS1vdXQgYWxsIHJpcHBsZXMgdGhhdCBhcmUgdmlzaWJsZSBhbmQgbm90IHBlcnNpc3RlbnQuCiAgICAgICAgdGhpcy5fYWN0aXZlUmlwcGxlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJpcHBsZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmlwcGxlID0+IHsKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgb25seSByaXBwbGVzIHRoYXQgYXJlIGNvbXBsZXRlbHkgdmlzaWJsZSB3aWxsIGZhZGUgb3V0IG9uIHBvaW50ZXIgcmVsZWFzZS4KICAgICAgICAgICAgLy8gSWYgdGhlIGB0ZXJtaW5hdGVPblBvaW50ZXJVcGAgb3B0aW9uIGlzIHNldCwgcmlwcGxlcyB0aGF0IHN0aWxsIGZhZGUgaW4gd2lsbCBhbHNvIGZhZGUgb3V0LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IHJpcHBsZS5zdGF0ZSA9PT0gMSAvKiBWSVNJQkxFICovIHx8CiAgICAgICAgICAgICAgICByaXBwbGUuY29uZmlnLnRlcm1pbmF0ZU9uUG9pbnRlclVwICYmIHJpcHBsZS5zdGF0ZSA9PT0gMCAvKiBGQURJTkdfSU4gKi87CiAgICAgICAgICAgIGlmICghcmlwcGxlLmNvbmZpZy5wZXJzaXN0ZW50ICYmIGlzVmlzaWJsZSkgewogICAgICAgICAgICAgICAgcmlwcGxlLmZhZGVPdXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogUnVucyBhIHRpbWVvdXQgb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lIHRvIGF2b2lkIHRyaWdnZXJpbmcgdGhlIGNoYW5nZSBkZXRlY3Rpb24uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHBhcmFtIHs/PX0gZGVsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9ydW5UaW1lb3V0T3V0c2lkZVpvbmUoZm4sIGRlbGF5ID0gMCkgewogICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBzZXRUaW1lb3V0KGZuLCBkZWxheSkpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycyBmb3IgYSBnaXZlbiBsaXN0IG9mIGV2ZW50cy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGV2ZW50VHlwZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZWdpc3RlckV2ZW50cyhldmVudFR5cGVzKSB7CiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgZXZlbnRUeXBlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodHlwZSkgPT4gewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RyaWdnZXJFbGVtZW50KSkuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLCBwYXNzaXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIHRyaWdnZXIgZWxlbWVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmVUcmlnZ2VyRXZlbnRzKCkgewogICAgICAgIGlmICh0aGlzLl90cmlnZ2VyRWxlbWVudCkgewogICAgICAgICAgICBwb2ludGVyRG93bkV2ZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodHlwZSkgPT4gewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RyaWdnZXJFbGVtZW50KSkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLCBwYXNzaXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAodGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgcG9pbnRlclVwRXZlbnRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAodHlwZSkgPT4gewogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl90cmlnZ2VyRWxlbWVudCkpLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcywgcGFzc2l2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEVuZm9yY2VzIGEgc3R5bGUgcmVjYWxjdWxhdGlvbiBvZiBhIERPTSBlbGVtZW50IGJ5IGNvbXB1dGluZyBpdHMgc3R5bGVzLgogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGVuZm9yY2VTdHlsZVJlY2FsY3VsYXRpb24oZWxlbWVudCkgewogICAgLy8gRW5mb3JjZSBhIHN0eWxlIHJlY2FsY3VsYXRpb24gYnkgY2FsbGluZyBgZ2V0Q29tcHV0ZWRTdHlsZWAgYW5kIGFjY2Vzc2luZyBhbnkgcHJvcGVydHkuCiAgICAvLyBDYWxsaW5nIGBnZXRQcm9wZXJ0eVZhbHVlYCBpcyBpbXBvcnRhbnQgdG8gbGV0IG9wdGltaXplcnMga25vdyB0aGF0IHRoaXMgaXMgbm90IGEgbm9vcC4KICAgIC8vIFNlZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzVkNTJmYjA4MWIzNTcwYzgxZTNhCiAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdvcGFjaXR5Jyk7Cn0KLyoqCiAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHBvaW50ICh4LCB5KSB0byB0aGUgZnVydGhlc3QgY29ybmVyIG9mIGEgcmVjdGFuZ2xlLgogKiBAcGFyYW0gez99IHgKICogQHBhcmFtIHs/fSB5CiAqIEBwYXJhbSB7P30gcmVjdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGlzdGFuY2VUb0Z1cnRoZXN0Q29ybmVyKHgsIHksIHJlY3QpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpc3RYID0gTWF0aC5tYXgoTWF0aC5hYnMoeCAtIHJlY3QubGVmdCksIE1hdGguYWJzKHggLSByZWN0LnJpZ2h0KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaXN0WSA9IE1hdGgubWF4KE1hdGguYWJzKHkgLSByZWN0LnRvcCksIE1hdGguYWJzKHkgLSByZWN0LmJvdHRvbSkpOwogICAgcmV0dXJuIE1hdGguc3FydChkaXN0WCAqIGRpc3RYICsgZGlzdFkgKiBkaXN0WSk7Cn0KLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGdsb2JhbCByaXBwbGUgb3B0aW9ucy4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtcmlwcGxlLWdsb2JhbC1vcHRpb25zJyk7CmNsYXNzIE1hdFJpcHBsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtCiAgICAgKiBAcGFyYW0gez89fSBnbG9iYWxPcHRpb25zCiAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgbmdab25lLCBwbGF0Zm9ybSwgZ2xvYmFsT3B0aW9ucywgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgdGhpcy5fYW5pbWF0aW9uTW9kZSA9IF9hbmltYXRpb25Nb2RlOwogICAgICAgIC8qKgogICAgICAgICAqIElmIHNldCwgdGhlIHJhZGl1cyBpbiBwaXhlbHMgb2YgZm9yZWdyb3VuZCByaXBwbGVzIHdoZW4gZnVsbHkgZXhwYW5kZWQuIElmIHVuc2V0LCB0aGUgcmFkaXVzCiAgICAgICAgICogd2lsbCBiZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSByaXBwbGUgdG8gdGhlIGZ1cnRoZXN0IGNvcm5lciBvZiB0aGUgaG9zdCBlbGVtZW50J3MKICAgICAgICAgKiBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5yYWRpdXMgPSAwOwogICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciByaXBwbGUgZGlyZWN0aXZlIGlzIGluaXRpYWxpemVkIGFuZCB0aGUgaW5wdXQgYmluZGluZ3MgYXJlIHNldC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZ2xvYmFsT3B0aW9ucyA9IGdsb2JhbE9wdGlvbnMgfHwge307CiAgICAgICAgdGhpcy5fcmlwcGxlUmVuZGVyZXIgPSBuZXcgUmlwcGxlUmVuZGVyZXIodGhpcywgbmdab25lLCBfZWxlbWVudFJlZiwgcGxhdGZvcm0pOwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIGNsaWNrIGV2ZW50cyB3aWxsIG5vdCB0cmlnZ2VyIHRoZSByaXBwbGUuIFJpcHBsZXMgY2FuIGJlIHN0aWxsIGxhdW5jaGVkIG1hbnVhbGx5CiAgICAgKiBieSB1c2luZyB0aGUgYGxhdW5jaCgpYCBtZXRob2QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlOwogICAgICAgIHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgZWxlbWVudCB0aGF0IHRyaWdnZXJzIHRoZSByaXBwbGUgd2hlbiBjbGljayBldmVudHMgYXJlIHJlY2VpdmVkLgogICAgICogRGVmYXVsdHMgdG8gdGhlIGRpcmVjdGl2ZSdzIGhvc3QgZWxlbWVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0cmlnZ2VyKCkgeyByZXR1cm4gdGhpcy5fdHJpZ2dlciB8fCB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0cmlnZ2VyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgdHJpZ2dlcih0cmlnZ2VyKSB7CiAgICAgICAgdGhpcy5fdHJpZ2dlciA9IHRyaWdnZXI7CiAgICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25Jbml0KCkgewogICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9yaXBwbGVSZW5kZXJlci5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpOwogICAgfQogICAgLyoqCiAgICAgKiBGYWRlcyBvdXQgYWxsIGN1cnJlbnRseSBzaG93aW5nIHJpcHBsZSBlbGVtZW50cy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZhZGVPdXRBbGwoKSB7CiAgICAgICAgdGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbCgpOwogICAgfQogICAgLyoqCiAgICAgKiBSaXBwbGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkaXJlY3RpdmUncyBpbnB1dCB2YWx1ZXMuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFJpcHBsZVRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJpcHBsZUNvbmZpZygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjZW50ZXJlZDogdGhpcy5jZW50ZXJlZCwKICAgICAgICAgICAgcmFkaXVzOiB0aGlzLnJhZGl1cywKICAgICAgICAgICAgY29sb3I6IHRoaXMuY29sb3IsCiAgICAgICAgICAgIGFuaW1hdGlvbjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2dsb2JhbE9wdGlvbnMuYW5pbWF0aW9uKSwgKHRoaXMuX2FuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycgPyB7IGVudGVyRHVyYXRpb246IDAsIGV4aXREdXJhdGlvbjogMCB9IDoge30pKSwgdGhpcy5hbmltYXRpb24pLAogICAgICAgICAgICB0ZXJtaW5hdGVPblBvaW50ZXJVcDogdGhpcy5fZ2xvYmFsT3B0aW9ucy50ZXJtaW5hdGVPblBvaW50ZXJVcCwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHJpcHBsZXMgb24gcG9pbnRlci1kb3duIGFyZSBkaXNhYmxlZCBvciBub3QuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFJpcHBsZVRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJpcHBsZURpc2FibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICEhdGhpcy5fZ2xvYmFsT3B0aW9ucy5kaXNhYmxlZDsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB1cCB0aGUgdHJpZ2dlciBldmVudCBsaXN0ZW5lcnMgaWYgcmlwcGxlcyBhcmUgZW5hYmxlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCkgewogICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9pc0luaXRpYWxpemVkKSB7CiAgICAgICAgICAgIHRoaXMuX3JpcHBsZVJlbmRlcmVyLnNldHVwVHJpZ2dlckV2ZW50cyh0aGlzLnRyaWdnZXIpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTGF1bmNoZXMgYSBtYW51YWwgcmlwcGxlIGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZWQgb3IganVzdCBieSB0aGUgcmlwcGxlIGNvbmZpZy4KICAgICAqIEBwYXJhbSB7P30gY29uZmlnT3JYCiAgICAgKiBAcGFyYW0gez89fSB5CiAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxhdW5jaChjb25maWdPclgsIHkgPSAwLCBjb25maWcpIHsKICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09yWCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JpcHBsZVJlbmRlcmVyLmZhZGVJblJpcHBsZShjb25maWdPclgsIHksIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yaXBwbGVDb25maWcpLCBjb25maWcpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yaXBwbGVSZW5kZXJlci5mYWRlSW5SaXBwbGUoMCwgMCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnJpcHBsZUNvbmZpZyksIGNvbmZpZ09yWCkpOwogICAgICAgIH0KICAgIH0KfQpNYXRSaXBwbGUuybVmYWMgPSBmdW5jdGlvbiBNYXRSaXBwbGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UmlwcGxlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9SSVBQTEVfR0xPQkFMX09QVElPTlMsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwpNYXRSaXBwbGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0UmlwcGxlLCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtcmlwcGxlIiwgIiJdLCBbIiIsICJtYXRSaXBwbGUiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXJpcHBsZSJdLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRSaXBwbGVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1yaXBwbGUtdW5ib3VuZGVkIiwgY3R4LnVuYm91bmRlZCk7CiAgICB9IH0sIGlucHV0czogeyByYWRpdXM6IFsibWF0UmlwcGxlUmFkaXVzIiwgInJhZGl1cyJdLCBkaXNhYmxlZDogWyJtYXRSaXBwbGVEaXNhYmxlZCIsICJkaXNhYmxlZCJdLCB0cmlnZ2VyOiBbIm1hdFJpcHBsZVRyaWdnZXIiLCAidHJpZ2dlciJdLCBjb2xvcjogWyJtYXRSaXBwbGVDb2xvciIsICJjb2xvciJdLCB1bmJvdW5kZWQ6IFsibWF0UmlwcGxlVW5ib3VuZGVkIiwgInVuYm91bmRlZCJdLCBjZW50ZXJlZDogWyJtYXRSaXBwbGVDZW50ZXJlZCIsICJjZW50ZXJlZCJdLCBhbmltYXRpb246IFsibWF0UmlwcGxlQW5pbWF0aW9uIiwgImFuaW1hdGlvbiJdIH0sIGV4cG9ydEFzOiBbIm1hdFJpcHBsZSJdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0UmlwcGxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUyxdIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Ck1hdFJpcHBsZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGNvbG9yOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRSaXBwbGVDb2xvcicsXSB9XSwKICAgIHVuYm91bmRlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0UmlwcGxlVW5ib3VuZGVkJyxdIH1dLAogICAgY2VudGVyZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFJpcHBsZUNlbnRlcmVkJyxdIH1dLAogICAgcmFkaXVzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRSaXBwbGVSYWRpdXMnLF0gfV0sCiAgICBhbmltYXRpb246IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFJpcHBsZUFuaW1hdGlvbicsXSB9XSwKICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRSaXBwbGVEaXNhYmxlZCcsXSB9XSwKICAgIHRyaWdnZXI6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFJpcHBsZVRyaWdnZXInLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL3JpcHBsZS9pbmRleC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBNYXRSaXBwbGVNb2R1bGUgewp9Ck1hdFJpcHBsZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFJpcHBsZU1vZHVsZSB9KTsKTWF0UmlwcGxlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0UmlwcGxlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFJpcHBsZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tNYXRDb21tb25Nb2R1bGUsIFBsYXRmb3JtTW9kdWxlXSwKICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRSaXBwbGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0UmlwcGxlXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdENvbW1vbk1vZHVsZSwKICAgICAgICBQbGF0Zm9ybU1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRSaXBwbGUsCiAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL3NlbGVjdGlvbi9wc2V1ZG8tY2hlY2tib3gvcHNldWRvLWNoZWNrYm94LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBDb21wb25lbnQgdGhhdCBzaG93cyBhIHNpbXBsaWZpZWQgY2hlY2tib3ggd2l0aG91dCBpbmNsdWRpbmcgYW55IGtpbmQgb2YgInJlYWwiIGNoZWNrYm94LgogKiBNZWFudCB0byBiZSB1c2VkIHdoZW4gdGhlIGNoZWNrYm94IGlzIHB1cmVseSBkZWNvcmF0aXZlIGFuZCBhIGxhcmdlIG51bWJlciBvZiB0aGVtIHdpbGwgYmUKICogaW5jbHVkZWQsIHN1Y2ggYXMgZm9yIHRoZSBvcHRpb25zIGluIGEgbXVsdGktc2VsZWN0LiBVc2VzIG5vIFNWR3Mgb3IgY29tcGxleCBhbmltYXRpb25zLgogKiBOb3RlIHRoYXQgdGhlbWluZyBpcyBtZWFudCB0byBiZSBoYW5kbGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgZS5nLgogKiBgbWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3hgLgogKgogKiBOb3RlIHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCBiZSBjb21wbGV0ZWx5IGludmlzaWJsZSB0byBzY3JlZW4tcmVhZGVyIHVzZXJzLiBUaGlzIGlzICpub3QqCiAqIGludGVyY2hhbmdlYWJsZSB3aXRoIGA8bWF0LWNoZWNrYm94PmAgYW5kIHNob3VsZCAqbm90KiBiZSB1c2VkIGlmIHRoZSB1c2VyIHdvdWxkIGRpcmVjdGx5CiAqIGludGVyYWN0IHdpdGggdGhlIGNoZWNrYm94LiBUaGUgcHNldWRvLWNoZWNrYm94IHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsCiAqIG9mIG1vcmUgY29tcGxleCBjb21wb25lbnRzIHRoYXQgYXBwcm9wcmlhdGVseSBoYW5kbGUgc2VsZWN0ZWQgLyBjaGVja2VkIHN0YXRlLgogKiBcQGRvY3MtcHJpdmF0ZQogKi8KY2xhc3MgTWF0UHNldWRvQ2hlY2tib3ggewogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHRoaXMuX2FuaW1hdGlvbk1vZGUgPSBfYW5pbWF0aW9uTW9kZTsKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5IHN0YXRlIG9mIHRoZSBjaGVja2JveC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnN0YXRlID0gJ3VuY2hlY2tlZCc7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOwogICAgfQp9Ck1hdFBzZXVkb0NoZWNrYm94Lsm1ZmFjID0gZnVuY3Rpb24gTWF0UHNldWRvQ2hlY2tib3hfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UHNldWRvQ2hlY2tib3gpKMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSk7IH07Ck1hdFBzZXVkb0NoZWNrYm94Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFBzZXVkb0NoZWNrYm94LCBzZWxlY3RvcnM6IFtbIm1hdC1wc2V1ZG8tY2hlY2tib3giXV0sIGhvc3RBdHRyczogWzEsICJtYXQtcHNldWRvLWNoZWNrYm94Il0sIGhvc3RWYXJzOiA4LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFBzZXVkb0NoZWNrYm94X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUiLCBjdHguc3RhdGUgPT09ICJpbmRldGVybWluYXRlIikoIm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCIsIGN0eC5zdGF0ZSA9PT0gImNoZWNrZWQiKSgibWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiKTsKICAgIH0gfSwgaW5wdXRzOiB7IHN0YXRlOiAic3RhdGUiLCBkaXNhYmxlZDogImRpc2FibGVkIiB9LCBkZWNsczogMCwgdmFyczogMCwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFBzZXVkb0NoZWNrYm94X1RlbXBsYXRlKHJmLCBjdHgpIHsgfSwgc3R5bGVzOiBbIi5tYXQtcHNldWRvLWNoZWNrYm94e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyOjJweCBzb2xpZDtib3JkZXItcmFkaXVzOjJweDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjA7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7Y29udGVudDpcIlwiO2JvcmRlci1ib3R0b206MnB4IHNvbGlkIGN1cnJlbnRDb2xvcjt0cmFuc2l0aW9uOm9wYWNpdHkgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHNldWRvLWNoZWNrYm94e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGU6OmFmdGVye3RvcDo1cHg7bGVmdDoxcHg7d2lkdGg6MTBweDtvcGFjaXR5OjE7Ym9yZGVyLXJhZGl1czoycHh9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZDo6YWZ0ZXJ7dG9wOjIuNHB4O2xlZnQ6MXB4O3dpZHRoOjhweDtoZWlnaHQ6M3B4O2JvcmRlci1sZWZ0OjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MTtib3gtc2l6aW5nOmNvbnRlbnQtYm94fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdFBzZXVkb0NoZWNrYm94LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQpdOwpNYXRQc2V1ZG9DaGVja2JveC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHN0YXRlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvc2VsZWN0aW9uL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlIHsKfQpNYXRQc2V1ZG9DaGVja2JveE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlIH0pOwpNYXRQc2V1ZG9DaGVja2JveE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlKSgpOyB9IH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRQc2V1ZG9DaGVja2JveE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtNYXRQc2V1ZG9DaGVja2JveF0sIGV4cG9ydHM6IFtNYXRQc2V1ZG9DaGVja2JveF0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9vcHRpb24vb3B0Z3JvdXAudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRPcHRncm91cC4KLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBNYXRPcHRncm91cEJhc2Ugewp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgX01hdE9wdGdyb3VwTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlZChNYXRPcHRncm91cEJhc2UpOwovLyBDb3VudGVyIGZvciB1bmlxdWUgZ3JvdXAgaWRzLgovKiogQHR5cGUgez99ICovCmxldCBfdW5pcXVlT3B0Z3JvdXBJZENvdW50ZXIgPSAwOwovKioKICogQ29tcG9uZW50IHRoYXQgaXMgdXNlZCB0byBncm91cCBpbnN0YW5jZXMgb2YgYG1hdC1vcHRpb25gLgogKi8KY2xhc3MgTWF0T3B0Z3JvdXAgZXh0ZW5kcyBfTWF0T3B0Z3JvdXBNaXhpbkJhc2UgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAvKioKICAgICAgICAgKiBVbmlxdWUgaWQgZm9yIHRoZSB1bmRlcmx5aW5nIGxhYmVsLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2xhYmVsSWQgPSBgbWF0LW9wdGdyb3VwLWxhYmVsLSR7X3VuaXF1ZU9wdGdyb3VwSWRDb3VudGVyKyt9YDsKICAgIH0KfQpNYXRPcHRncm91cC7JtWZhYyA9IGZ1bmN0aW9uIE1hdE9wdGdyb3VwX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRPcHRncm91cF9CYXNlRmFjdG9yeSh0IHx8IE1hdE9wdGdyb3VwKTsgfTsKTWF0T3B0Z3JvdXAuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0T3B0Z3JvdXAsIHNlbGVjdG9yczogW1sibWF0LW9wdGdyb3VwIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJncm91cCIsIDEsICJtYXQtb3B0Z3JvdXAiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0T3B0Z3JvdXBfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtbGFiZWxsZWRieSIsIGN0eC5fbGFiZWxJZCk7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LW9wdGdyb3VwLWRpc2FibGVkIiwgY3R4LmRpc2FibGVkKTsKICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBsYWJlbDogImxhYmVsIiB9LCBleHBvcnRBczogWyJtYXRPcHRncm91cCJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMSwgZGVjbHM6IDQsIHZhcnM6IDIsIGNvbnN0czogW1sxLCAibWF0LW9wdGdyb3VwLWxhYmVsIiwgMywgImlkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0T3B0Z3JvdXBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXByb2plY3Rpb25EZWYoX2MwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJsYWJlbCIsIDApOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMywgMSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1cHJvcGVydHkoImlkIiwgY3R4Ll9sYWJlbElkKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIiwgY3R4LmxhYmVsLCAiICIpOwogICAgfSB9LCBzdHlsZXM6IFsiLm1hdC1vcHRncm91cC1sYWJlbHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1vcHRncm91cC1sYWJlbFtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAtbGFiZWx7dGV4dC1hbGlnbjpyaWdodH0ubWF0LW9wdGdyb3VwLWxhYmVsIC5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MTZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1vcHRncm91cC1sYWJlbCAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1vcHRncm91cC1sYWJlbCAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Ck1hdE9wdGdyb3VwLnByb3BEZWNvcmF0b3JzID0gewogICAgbGFiZWw6IFt7IHR5cGU6IElucHV0IH1dCn07CmNvbnN0IMm1TWF0T3B0Z3JvdXBfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRPcHRncm91cCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9vcHRpb24vb3B0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBPcHRpb24gSURzIG5lZWQgdG8gYmUgdW5pcXVlIGFjcm9zcyBjb21wb25lbnRzLCBzbyB0aGlzIGNvdW50ZXIgZXhpc3RzIG91dHNpZGUgb2YKICogdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLgogKiBAdHlwZSB7P30KICovCmxldCBfdW5pcXVlSWRDb3VudGVyID0gMDsKLyoqCiAqIEV2ZW50IG9iamVjdCBlbWl0dGVkIGJ5IE1hdE9wdGlvbiB3aGVuIHNlbGVjdGVkIG9yIGRlc2VsZWN0ZWQuCiAqLwpjbGFzcyBNYXRPcHRpb25TZWxlY3Rpb25DaGFuZ2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICogQHBhcmFtIHs/PX0gaXNVc2VySW5wdXQKICAgICAqLwogICAgY29uc3RydWN0b3Ioc291cmNlLCBpc1VzZXJJbnB1dCA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IGlzVXNlcklucHV0OwogICAgfQp9Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSBwYXJlbnQgY29tcG9uZW50IHRvIG9wdGlvbnMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuKCdNQVRfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQnKTsKLyoqCiAqIFNpbmdsZSBvcHRpb24gaW5zaWRlIG9mIGEgYDxtYXQtc2VsZWN0PmAgZWxlbWVudC4KICovCmNsYXNzIE1hdE9wdGlvbiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgKiBAcGFyYW0gez99IF9wYXJlbnQKICAgICAqIEBwYXJhbSB7P30gZ3JvdXAKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnQsIF9jaGFuZ2VEZXRlY3RvclJlZiwgX3BhcmVudCwgZ3JvdXApIHsKICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7CiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDsKICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7CiAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX21vc3RSZWNlbnRWaWV3VmFsdWUgPSAnJzsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSBvcHRpb24uCiAgICAgICAgICovCiAgICAgICAgdGhpcy5pZCA9IGBtYXQtb3B0aW9uLSR7X3VuaXF1ZUlkQ291bnRlcisrfWA7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZC4KICAgICAgICAgKi8KICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeAogICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIG9wdGlvbiBjaGFuZ2VzIGFuZCBhbnkgcGFyZW50cyBoYXZlIHRvIGJlIG5vdGlmaWVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHdyYXBwaW5nIGNvbXBvbmVudCBpcyBpbiBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBtdWx0aXBsZSgpIHsgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQubXVsdGlwbGU7IH0KICAgIC8qKgogICAgICogV2hldGhlciBvciBub3QgdGhlIG9wdGlvbiBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZDsgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiAodGhpcy5ncm91cCAmJiB0aGlzLmdyb3VwLmRpc2FibGVkKSB8fCB0aGlzLl9kaXNhYmxlZDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgcmlwcGxlcyBmb3IgdGhlIG9wdGlvbiBhcmUgZGlzYWJsZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGlzYWJsZVJpcHBsZSgpIHsgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuZGlzYWJsZVJpcHBsZTsgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgb3B0aW9uIGlzIGN1cnJlbnRseSBhY3RpdmUgYW5kIHJlYWR5IHRvIGJlIHNlbGVjdGVkLgogICAgICogQW4gYWN0aXZlIG9wdGlvbiBkaXNwbGF5cyBzdHlsZXMgYXMgaWYgaXQgaXMgZm9jdXNlZCwgYnV0IHRoZQogICAgICogZm9jdXMgaXMgYWN0dWFsbHkgcmV0YWluZWQgc29tZXdoZXJlIGVsc2UuIFRoaXMgY29tZXMgaW4gaGFuZHkKICAgICAqIGZvciBjb21wb25lbnRzIGxpa2UgYXV0b2NvbXBsZXRlIHdoZXJlIGZvY3VzIG11c3QgcmVtYWluIG9uIHRoZSBpbnB1dC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBhY3RpdmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGRpc3BsYXllZCB2YWx1ZSBvZiB0aGUgb3B0aW9uLiBJdCBpcyBuZWNlc3NhcnkgdG8gc2hvdyB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluIHRoZQogICAgICogc2VsZWN0J3MgdHJpZ2dlci4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB2aWV3VmFsdWUoKSB7CiAgICAgICAgLy8gVE9ETyhrYXJhKTogQWRkIGlucHV0IHByb3BlcnR5IGFsdGVybmF0aXZlIGZvciBub2RlIGVudnMuCiAgICAgICAgcmV0dXJuICh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7CiAgICB9CiAgICAvKioKICAgICAqIFNlbGVjdHMgdGhlIG9wdGlvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNlbGVjdCgpIHsKICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIHRoaXMuX2VtaXRTZWxlY3Rpb25DaGFuZ2VFdmVudCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVzZWxlY3RzIHRoZSBvcHRpb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXNlbGVjdCgpIHsKICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIHRoaXMuX2VtaXRTZWxlY3Rpb25DaGFuZ2VFdmVudCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyBmb2N1cyBvbnRvIHRoaXMgb3B0aW9uLgogICAgICogQHBhcmFtIHs/PX0gX29yaWdpbgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9jdXMoX29yaWdpbiwgb3B0aW9ucykgewogICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmVuJ3QgdXNpbmcgYF9vcmlnaW5gLCBidXQgd2UgbmVlZCB0byBrZWVwIGl0IGJlY2F1c2Ugc29tZSBpbnRlcm5hbCBjb25zdW1lcnMKICAgICAgICAvLyB1c2UgYE1hdE9wdGlvbmAgaW4gYSBgRm9jdXNLZXlNYW5hZ2VyYCBhbmQgd2UgbmVlZCBpdCB0byBtYXRjaCBgRm9jdXNhYmxlT3B0aW9uYC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEhvc3RFbGVtZW50KCk7CiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LmZvY3VzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMob3B0aW9ucyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIGRpc3BsYXkgc3R5bGVzIG9uIHRoZSBvcHRpb24gdG8gbWFrZSBpdCBhcHBlYXIKICAgICAqIGFjdGl2ZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciBzbyBrZXkKICAgICAqIGV2ZW50cyB3aWxsIGRpc3BsYXkgdGhlIHByb3BlciBvcHRpb25zIGFzIGFjdGl2ZSBvbiBhcnJvdyBrZXkgZXZlbnRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0QWN0aXZlU3R5bGVzKCkgewogICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSB7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyBkaXNwbGF5IHN0eWxlcyBvbiB0aGUgb3B0aW9uIHRoYXQgbWFkZSBpdCBhcHBlYXIKICAgICAqIGFjdGl2ZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciBzbyBrZXkKICAgICAqIGV2ZW50cyB3aWxsIGRpc3BsYXkgdGhlIHByb3BlciBvcHRpb25zIGFzIGFjdGl2ZSBvbiBhcnJvdyBrZXkgZXZlbnRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0SW5hY3RpdmVTdHlsZXMoKSB7CiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkgewogICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBsYWJlbCB0byBiZSB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgb3B0aW9uIHNob3VsZCBiZSBmb2N1c2VkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0TGFiZWwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmlld1ZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBFbnN1cmVzIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQgd2hlbiBhY3RpdmF0ZWQgZnJvbSB0aGUga2V5Ym9hcmQuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFuZGxlS2V5ZG93bihldmVudCkgewogICAgICAgIGlmICgoZXZlbnQua2V5Q29kZSA9PT0gRU5URVIgfHwgZXZlbnQua2V5Q29kZSA9PT0gU1BBQ0UpICYmICFoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTsKICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZyBkb3duIGFuZCBmb3JtIHN1Ym1pdHMuCiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBgU2VsZWN0cyB0aGUgb3B0aW9uIHdoaWxlIGluZGljYXRpbmcgdGhlIHNlbGVjdGlvbiBjYW1lIGZyb20gdGhlIHVzZXIuIFVzZWQgdG8KICAgICAqIGRldGVybWluZSBpZiB0aGUgc2VsZWN0J3MgdmlldyAtPiBtb2RlbCBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZC5gCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2VsZWN0VmlhSW50ZXJhY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5tdWx0aXBsZSA/ICF0aGlzLl9zZWxlY3RlZCA6IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB0aGlzLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQodHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBgYXJpYS1zZWxlY3RlZGAgdmFsdWUgZm9yIHRoZSBvcHRpb24uIFdlIGV4cGxpY2l0bHkgb21pdCB0aGUgYGFyaWEtc2VsZWN0ZWRgCiAgICAgKiBhdHRyaWJ1dGUgZnJvbSBzaW5nbGUtc2VsZWN0aW9uLCB1bnNlbGVjdGVkIG9wdGlvbnMuIEluY2x1ZGluZyB0aGUgYGFyaWEtc2VsZWN0ZWQ9ImZhbHNlImAKICAgICAqIGF0dHJpYnV0ZXMgYWRkcyBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBub2lzZSB0byBzY3JlZW4tcmVhZGVyIHVzZXJzIHdpdGhvdXQgcHJvdmlkaW5nIHVzZWZ1bAogICAgICogaW5mb3JtYXRpb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0QXJpYVNlbGVjdGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkIHx8ICh0aGlzLm11bHRpcGxlID8gZmFsc2UgOiBudWxsKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY29ycmVjdCB0YWJpbmRleCBmb3IgdGhlIG9wdGlvbiBkZXBlbmRpbmcgb24gZGlzYWJsZWQgc3RhdGUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0VGFiSW5kZXgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAnLTEnIDogJzAnOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBob3N0IERPTSBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEhvc3RFbGVtZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHsKICAgICAgICAvLyBTaW5jZSBwYXJlbnQgY29tcG9uZW50cyBjb3VsZCBiZSB1c2luZyB0aGUgb3B0aW9uJ3MgbGFiZWwgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQgdmFsdWVzCiAgICAgICAgLy8gKGUuZy4gYG1hdC1zZWxlY3RgKSBhbmQgdGhleSBkb24ndCBoYXZlIGEgd2F5IG9mIGtub3dpbmcgaWYgdGhlIG9wdGlvbidzIGxhYmVsIGhhcyBjaGFuZ2VkCiAgICAgICAgLy8gd2UgaGF2ZSB0byBjaGVjayBmb3IgY2hhbmdlcyBpbiB0aGUgRE9NIG91cnNlbHZlcyBhbmQgZGlzcGF0Y2ggYW4gZXZlbnQuIFRoZXNlIGNoZWNrcyBhcmUKICAgICAgICAvLyByZWxhdGl2ZWx5IGNoZWFwLCBob3dldmVyIHdlIHN0aWxsIGxpbWl0IHRoZW0gb25seSB0byBzZWxlY3RlZCBvcHRpb25zIGluIG9yZGVyIHRvIGF2b2lkCiAgICAgICAgLy8gaGl0dGluZyB0aGUgRE9NIHRvbyBvZnRlbi4KICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3VmFsdWUgPSB0aGlzLnZpZXdWYWx1ZTsKICAgICAgICAgICAgaWYgKHZpZXdWYWx1ZSAhPT0gdGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZSA9IHZpZXdWYWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBFbWl0cyB0aGUgc2VsZWN0aW9uIGNoYW5nZSBldmVudC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez89fSBpc1VzZXJJbnB1dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2VtaXRTZWxlY3Rpb25DaGFuZ2VFdmVudChpc1VzZXJJbnB1dCA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KG5ldyBNYXRPcHRpb25TZWxlY3Rpb25DaGFuZ2UodGhpcywgaXNVc2VySW5wdXQpKTsKICAgIH0KfQpNYXRPcHRpb24uybVmYWMgPSBmdW5jdGlvbiBNYXRPcHRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0T3B0aW9uKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdE9wdGdyb3VwLCA4KSk7IH07Ck1hdE9wdGlvbi7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRPcHRpb24sIHNlbGVjdG9yczogW1sibWF0LW9wdGlvbiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAib3B0aW9uIiwgMSwgIm1hdC1vcHRpb24iLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogMTIsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0T3B0aW9uX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0T3B0aW9uX2NsaWNrX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTsgfSkoImtleWRvd24iLCBmdW5jdGlvbiBNYXRPcHRpb25fa2V5ZG93bl9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX2hhbmRsZUtleWRvd24oJGV2ZW50KTsgfSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1aG9zdFByb3BlcnR5KCJpZCIsIGN0eC5pZCk7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgidGFiaW5kZXgiLCBjdHguX2dldFRhYkluZGV4KCkpKCJhcmlhLXNlbGVjdGVkIiwgY3R4Ll9nZXRBcmlhU2VsZWN0ZWQoKSkoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQudG9TdHJpbmcoKSk7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXNlbGVjdGVkIiwgY3R4LnNlbGVjdGVkKSgibWF0LW9wdGlvbi1tdWx0aXBsZSIsIGN0eC5tdWx0aXBsZSkoIm1hdC1hY3RpdmUiLCBjdHguYWN0aXZlKSgibWF0LW9wdGlvbi1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCk7CiAgICB9IH0sIGlucHV0czogeyBpZDogImlkIiwgZGlzYWJsZWQ6ICJkaXNhYmxlZCIsIHZhbHVlOiAidmFsdWUiIH0sIG91dHB1dHM6IHsgb25TZWxlY3Rpb25DaGFuZ2U6ICJvblNlbGVjdGlvbkNoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0T3B0aW9uIl0sIG5nQ29udGVudFNlbGVjdG9yczogX2MyLCBkZWNsczogNCwgdmFyczogMywgY29uc3RzOiBbWyJjbGFzcyIsICJtYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveCIsIDMsICJzdGF0ZSIsICJkaXNhYmxlZCIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LW9wdGlvbi10ZXh0Il0sIFsibWF0LXJpcHBsZSIsICIiLCAxLCAibWF0LW9wdGlvbi1yaXBwbGUiLCAzLCAibWF0UmlwcGxlVHJpZ2dlciIsICJtYXRSaXBwbGVEaXNhYmxlZCJdLCBbMSwgIm1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94IiwgMywgInN0YXRlIiwgImRpc2FibGVkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0T3B0aW9uX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDAsIE1hdE9wdGlvbl9tYXRfcHNldWRvX2NoZWNrYm94XzBfVGVtcGxhdGUsIDEsIDIsICJtYXQtcHNldWRvLWNoZWNrYm94IiwgMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIsIDEpOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnQoMywgImRpdiIsIDIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Lm11bHRpcGxlKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZVRyaWdnZXIiLCBjdHguX2dldEhvc3RFbGVtZW50KCkpKCJtYXRSaXBwbGVEaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCB8fCBjdHguZGlzYWJsZVJpcHBsZSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBNYXRSaXBwbGUsCiAgICAgICAgTWF0UHNldWRvQ2hlY2tib3hdLCBzdHlsZXM6IFsiLm1hdC1vcHRpb257d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6NDhweDtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWF4LXdpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7bWF4LXdpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O2FsaWduLWl0ZW1zOmNlbnRlcjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1vcHRpb25bZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fVtkaXI9cnRsXSAubWF0LW9wdGlvbnt0ZXh0LWFsaWduOnJpZ2h0fS5tYXQtb3B0aW9uIC5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MTZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1vcHRpb24gLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9W2Rpcj1ydGxdIC5tYXQtb3B0aW9uIC5tYXQtaWNvbnttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDowfS5tYXQtb3B0aW9uW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtb3B0Z3JvdXAgLm1hdC1vcHRpb246bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtwYWRkaW5nLWxlZnQ6MzJweH1bZGlyPXJ0bF0gLm1hdC1vcHRncm91cCAubWF0LW9wdGlvbjpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe3BhZGRpbmctbGVmdDoxNnB4O3BhZGRpbmctcmlnaHQ6MzJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtb3B0aW9ue21hcmdpbjowIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtb3B0aW9uLm1hdC1hY3RpdmV7Ym9yZGVyOnNvbGlkIDFweCBjdXJyZW50Q29sb3I7bWFyZ2luOjB9Lm1hdC1vcHRpb24tdGV4dHtkaXNwbGF5OmlubGluZS1ibG9jaztmbGV4LWdyb3c6MTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubWF0LW9wdGlvbiAubWF0LW9wdGlvbi1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtb3B0aW9uIC5tYXQtb3B0aW9uLXJpcHBsZXtvcGFjaXR5Oi41fS5tYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveHttYXJnaW4tcmlnaHQ6OHB4fVtkaXI9cnRsXSAubWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3h7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdE9wdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5ULF0gfV0gfSwKICAgIHsgdHlwZTogTWF0T3B0Z3JvdXAsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKTWF0T3B0aW9uLnByb3BEZWNvcmF0b3JzID0gewogICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgaWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgb25TZWxlY3Rpb25DaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XQp9OwovKioKICogQ291bnRzIHRoZSBhbW91bnQgb2Ygb3B0aW9uIGdyb3VwIGxhYmVscyB0aGF0IHByZWNlZGUgdGhlIHNwZWNpZmllZCBvcHRpb24uCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gb3B0aW9uSW5kZXggSW5kZXggb2YgdGhlIG9wdGlvbiBhdCB3aGljaCB0byBzdGFydCBjb3VudGluZy4KICogQHBhcmFtIHs/fSBvcHRpb25zIEZsYXQgbGlzdCBvZiBhbGwgb2YgdGhlIG9wdGlvbnMuCiAqIEBwYXJhbSB7P30gb3B0aW9uR3JvdXBzIEZsYXQgbGlzdCBvZiBhbGwgb2YgdGhlIG9wdGlvbiBncm91cHMuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfY291bnRHcm91cExhYmVsc0JlZm9yZU9wdGlvbihvcHRpb25JbmRleCwgb3B0aW9ucywgb3B0aW9uR3JvdXBzKSB7CiAgICBpZiAob3B0aW9uR3JvdXBzLmxlbmd0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb3B0aW9uc0FycmF5ID0gb3B0aW9ucy50b0FycmF5KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBncm91cHMgPSBvcHRpb25Hcm91cHMudG9BcnJheSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZ3JvdXBDb3VudGVyID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbkluZGV4ICsgMTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChvcHRpb25zQXJyYXlbaV0uZ3JvdXAgJiYgb3B0aW9uc0FycmF5W2ldLmdyb3VwID09PSBncm91cHNbZ3JvdXBDb3VudGVyXSkgewogICAgICAgICAgICAgICAgZ3JvdXBDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdyb3VwQ291bnRlcjsKICAgIH0KICAgIHJldHVybiAwOwp9Ci8qKgogKiBEZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiB0byB3aGljaCB0byBzY3JvbGwgYSBwYW5lbCBpbiBvcmRlciBmb3IgYW4gb3B0aW9uIHRvIGJlIGludG8gdmlldy4KICogXEBkb2NzLXByaXZhdGUKICogQHBhcmFtIHs/fSBvcHRpb25JbmRleCBJbmRleCBvZiB0aGUgb3B0aW9uIHRvIGJlIHNjcm9sbGVkIGludG8gdGhlIHZpZXcuCiAqIEBwYXJhbSB7P30gb3B0aW9uSGVpZ2h0IEhlaWdodCBvZiB0aGUgb3B0aW9ucy4KICogQHBhcmFtIHs/fSBjdXJyZW50U2Nyb2xsUG9zaXRpb24gQ3VycmVudCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIHBhbmVsLgogKiBAcGFyYW0gez99IHBhbmVsSGVpZ2h0IEhlaWdodCBvZiB0aGUgcGFuZWwuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfZ2V0T3B0aW9uU2Nyb2xsUG9zaXRpb24ob3B0aW9uSW5kZXgsIG9wdGlvbkhlaWdodCwgY3VycmVudFNjcm9sbFBvc2l0aW9uLCBwYW5lbEhlaWdodCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb3B0aW9uT2Zmc2V0ID0gb3B0aW9uSW5kZXggKiBvcHRpb25IZWlnaHQ7CiAgICBpZiAob3B0aW9uT2Zmc2V0IDwgY3VycmVudFNjcm9sbFBvc2l0aW9uKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbk9mZnNldDsKICAgIH0KICAgIGlmIChvcHRpb25PZmZzZXQgKyBvcHRpb25IZWlnaHQgPiBjdXJyZW50U2Nyb2xsUG9zaXRpb24gKyBwYW5lbEhlaWdodCkgewogICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBvcHRpb25PZmZzZXQgLSBwYW5lbEhlaWdodCArIG9wdGlvbkhlaWdodCk7CiAgICB9CiAgICByZXR1cm4gY3VycmVudFNjcm9sbFBvc2l0aW9uOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9vcHRpb24vaW5kZXgudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgTWF0T3B0aW9uTW9kdWxlIHsKfQpNYXRPcHRpb25Nb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRPcHRpb25Nb2R1bGUgfSk7Ck1hdE9wdGlvbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdE9wdGlvbk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRPcHRpb25Nb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbTWF0UmlwcGxlTW9kdWxlLCBDb21tb25Nb2R1bGUsIE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdE9wdGlvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRPcHRpb24sCiAgICAgICAgTWF0T3B0Z3JvdXBdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0UmlwcGxlTW9kdWxlLAogICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICBNYXRQc2V1ZG9DaGVja2JveE1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRPcHRpb24sCiAgICAgICAgTWF0T3B0Z3JvdXBdOyB9IH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvbGFiZWwvbGFiZWwtb3B0aW9ucy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogSW5qZWN0aW9uVG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBnbG9iYWwgbGFiZWwgb3B0aW9ucy4KICogQGRlcHJlY2F0ZWQgVXNlIGBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlNgIGluamVjdGlvbiB0b2tlbiBmcm9tCiAqICAgICBgXEBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRgIGluc3RlYWQuCiAqIFxAYnJlYWtpbmctY2hhbmdlIDExLjAuMAogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BVF9MQUJFTF9HTE9CQUxfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWxhYmVsLWdsb2JhbC1vcHRpb25zJyk7Cgpjb25zdCBfYzAkMSA9IFsiKiIsIFtbIm1hdC10b29sYmFyLXJvdyJdXV07CmNvbnN0IF9jMSQxID0gWyIqIiwgIm1hdC10b29sYmFyLXJvdyJdOwpjbGFzcyBNYXRUb29sYmFyQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfTWF0VG9vbGJhck1peGluQmFzZSA9IG1peGluQ29sb3IoTWF0VG9vbGJhckJhc2UpOwpjbGFzcyBNYXRUb29sYmFyUm93IHsKfQpNYXRUb29sYmFyUm93Lsm1ZmFjID0gZnVuY3Rpb24gTWF0VG9vbGJhclJvd19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUb29sYmFyUm93KSgpOyB9OwpNYXRUb29sYmFyUm93Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFRvb2xiYXJSb3csIHNlbGVjdG9yczogW1sibWF0LXRvb2xiYXItcm93Il1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXRvb2xiYXItcm93Il0sIGV4cG9ydEFzOiBbIm1hdFRvb2xiYXJSb3ciXSB9KTsKY2xhc3MgTWF0VG9vbGJhciBleHRlbmRzIF9NYXRUb29sYmFyTWl4aW5CYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICogQHBhcmFtIHs/PX0gZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgX3BsYXRmb3JtLCBkb2N1bWVudCkgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYpOwogICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIC8vIFRPRE86IG1ha2UgdGhlIGRvY3VtZW50IGEgcmVxdWlyZWQgcGFyYW0gd2hlbiBkb2luZyBicmVha2luZyBjaGFuZ2VzLgogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHsKICAgICAgICBpZiAoIWlzRGV2TW9kZSgpIHx8ICF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCk7CiAgICAgICAgdGhpcy5fdG9vbGJhclJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5fY2hlY2tUb29sYmFyTWl4ZWRNb2RlcygpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gd2hlbiBkZXZlbG9wZXJzIGFyZSBhdHRlbXB0aW5nIHRvIGNvbWJpbmUgdGhlIGRpZmZlcmVudCB0b29sYmFyIHJvdyBtb2Rlcy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tUb29sYmFyTWl4ZWRNb2RlcygpIHsKICAgICAgICBpZiAoIXRoaXMuX3Rvb2xiYXJSb3dzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgRE9NIG5vZGVzIHRoYXQgY2FuIGRpc3BsYXkgY29udGVudCBidXQgYXJlbid0IGluc2lkZSBvZgogICAgICAgIC8vIGEgPG1hdC10b29sYmFyLXJvdz4gZWxlbWVudC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNDb21iaW5lZFVzYWdlID0gQXJyYXkuZnJvbSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcykKICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBub2RlID0+ICEobm9kZS5jbGFzc0xpc3QgJiYgbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC10b29sYmFyLXJvdycpKSkpCiAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm9kZSA9PiBub2RlLm5vZGVUeXBlICE9PSAodGhpcy5fZG9jdW1lbnQgPyB0aGlzLl9kb2N1bWVudC5DT01NRU5UX05PREUgOiA4KSkpCiAgICAgICAgICAgIC5zb21lKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5vZGUgPT4gISEobm9kZS50ZXh0Q29udGVudCAmJiBub2RlLnRleHRDb250ZW50LnRyaW0oKSkpKTsKICAgICAgICBpZiAoaXNDb21iaW5lZFVzYWdlKSB7CiAgICAgICAgICAgIHRocm93VG9vbGJhck1peGVkTW9kZXNFcnJvcigpOwogICAgICAgIH0KICAgIH0KfQpNYXRUb29sYmFyLsm1ZmFjID0gZnVuY3Rpb24gTWF0VG9vbGJhcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUb29sYmFyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSk7IH07Ck1hdFRvb2xiYXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0VG9vbGJhciwgc2VsZWN0b3JzOiBbWyJtYXQtdG9vbGJhciJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdFRvb2xiYXJfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdFRvb2xiYXJSb3csIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3Rvb2xiYXJSb3dzID0gX3QpOwogICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LXRvb2xiYXIiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0VG9vbGJhcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRvb2xiYXItbXVsdGlwbGUtcm93cyIsIGN0eC5fdG9vbGJhclJvd3MubGVuZ3RoID4gMCkoIm1hdC10b29sYmFyLXNpbmdsZS1yb3ciLCBjdHguX3Rvb2xiYXJSb3dzLmxlbmd0aCA9PT0gMCk7CiAgICB9IH0sIGlucHV0czogeyBjb2xvcjogImNvbG9yIiB9LCBleHBvcnRBczogWyJtYXRUb29sYmFyIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJDEsIGRlY2xzOiAyLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0VG9vbGJhcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1cHJvamVjdGlvbkRlZihfYzAkMSk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMCk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMSwgMSk7CiAgICB9IH0sIHN0eWxlczogWyIuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdG9vbGJhcntvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXRvb2xiYXItcm93LC5tYXQtdG9vbGJhci1zaW5nbGUtcm93e2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowIDE2cHg7d2lkdGg6MTAwJTtmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0ubWF0LXRvb2xiYXItbXVsdGlwbGUtcm93c3tkaXNwbGF5OmZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDoxMDAlfS5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze21pbi1oZWlnaHQ6NjRweH0ubWF0LXRvb2xiYXItcm93LC5tYXQtdG9vbGJhci1zaW5nbGUtcm93e2hlaWdodDo2NHB4fUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRvb2xiYXItbXVsdGlwbGUtcm93c3ttaW4taGVpZ2h0OjU2cHh9Lm1hdC10b29sYmFyLXJvdywubWF0LXRvb2xiYXItc2luZ2xlLXJvd3toZWlnaHQ6NTZweH19XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0VG9vbGJhci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ck1hdFRvb2xiYXIucHJvcERlY29yYXRvcnMgPSB7CiAgICBfdG9vbGJhclJvd3M6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdFRvb2xiYXJSb3csIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dCn07Ci8qKgogKiBUaHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byBjb21iaW5lIHRoZSBkaWZmZXJlbnQgdG9vbGJhciByb3cgbW9kZXMuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd1Rvb2xiYXJNaXhlZE1vZGVzRXJyb3IoKSB7CiAgICB0aHJvdyBFcnJvcignTWF0VG9vbGJhcjogQXR0ZW1wdGluZyB0byBjb21iaW5lIGRpZmZlcmVudCB0b29sYmFyIG1vZGVzLiAnICsKICAgICAgICAnRWl0aGVyIHNwZWNpZnkgbXVsdGlwbGUgYDxtYXQtdG9vbGJhci1yb3c+YCBlbGVtZW50cyBleHBsaWNpdGx5IG9yIGp1c3QgcGxhY2UgY29udGVudCAnICsKICAgICAgICAnaW5zaWRlIG9mIGEgYDxtYXQtdG9vbGJhcj5gIGZvciBhIHNpbmdsZSByb3cuJyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90b29sYmFyL3Rvb2xiYXItbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE1hdFRvb2xiYXJNb2R1bGUgewp9Ck1hdFRvb2xiYXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRUb29sYmFyTW9kdWxlIH0pOwpNYXRUb29sYmFyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0VG9vbGJhck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUb29sYmFyTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW01hdENvbW1vbk1vZHVsZV0sCiAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0VG9vbGJhck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRUb29sYmFyLAogICAgICAgIE1hdFRvb2xiYXJSb3ddOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFRvb2xiYXIsCiAgICAgICAgTWF0VG9vbGJhclJvdywKICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyoqIERhdGEtcmVsYXRlZCB0eXBlcyAqLwp2YXIgRGF0YUxvYWRTdGF0ZTsKKGZ1bmN0aW9uIChEYXRhTG9hZFN0YXRlKSB7CiAgICBEYXRhTG9hZFN0YXRlW0RhdGFMb2FkU3RhdGVbIk5PVF9MT0FERUQiXSA9IDBdID0gIk5PVF9MT0FERUQiOwogICAgRGF0YUxvYWRTdGF0ZVtEYXRhTG9hZFN0YXRlWyJMT0FERUQiXSA9IDFdID0gIkxPQURFRCI7CiAgICBEYXRhTG9hZFN0YXRlW0RhdGFMb2FkU3RhdGVbIkxPQURJTkciXSA9IDJdID0gIkxPQURJTkciOwogICAgRGF0YUxvYWRTdGF0ZVtEYXRhTG9hZFN0YXRlWyJGQUlMRUQiXSA9IDNdID0gIkZBSUxFRCI7Cn0pKERhdGFMb2FkU3RhdGUgfHwgKERhdGFMb2FkU3RhdGUgPSB7fSkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvc3RvcmUvY29yZV90eXBlcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IENPUkVfRkVBVFVSRV9LRVkgPSAnY29yZSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgaW5pdGlhbFN0YXRlID0gewogICAgYWN0aXZlUGx1Z2luOiBudWxsLAogICAgcGx1Z2luczoge30sCiAgICBwbHVnaW5zTGlzdExvYWRlZDogewogICAgICAgIHN0YXRlOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQsCiAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBudWxsLAogICAgfSwKICAgIHJlbG9hZFBlcmlvZEluTXM6IDMwMDAwLAogICAgcmVsb2FkRW5hYmxlZDogZmFsc2UsCiAgICBwYWdlU2l6ZTogMTIsCiAgICBlbnZpcm9ubWVudDogewogICAgICAgIGRhdGFfbG9jYXRpb246ICcnLAogICAgICAgIHdpbmRvd190aXRsZTogJycsCiAgICB9LAogICAgcG9seW1lckludGVyb3BSdW5zOiBbXSwKICAgIHBvbHltZXJJbnRlcm9wUnVuU2VsZWN0aW9uOiBuZXcgU2V0KCksCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvY29yZS9zdG9yZS9jb3JlX3JlZHVjZXJzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgcmVkdWNlciA9IGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCBvbihjaGFuZ2VQbHVnaW4sIHBsdWdpblVybEhhc2hDaGFuZ2VkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBfXzEKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgeyBwbHVnaW4gfSkgPT4gewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGFjdGl2ZVBsdWdpbjogcGx1Z2luIH0pOwp9KSksIG9uKHBsdWdpbnNMaXN0aW5nUmVxdWVzdGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHBsdWdpbnNMaXN0TG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnBsdWdpbnNMaXN0TG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FESU5HIH0pIH0pOwp9KSksIG9uKHBsdWdpbnNMaXN0aW5nRmFpbGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHBsdWdpbnNMaXN0TG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnBsdWdpbnNMaXN0TG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5GQUlMRUQgfSkgfSk7Cn0pKSwgb24ocGx1Z2luc0xpc3RpbmdMb2FkZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IHBsdWdpbnMgfSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZmlyc3RFbmFibGVkUGx1Z2luSWQgPSBPYmplY3Qua2V5cyhwbHVnaW5zKS5maW5kKCgvKioKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luSWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwbHVnaW5JZCkgPT4gewogICAgICAgIHJldHVybiBwbHVnaW5zW3BsdWdpbklkXS5lbmFibGVkOwogICAgfSkpIHx8IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhY3RpdmVQbHVnaW4gPSBzdGF0ZS5hY3RpdmVQbHVnaW4gfHwgZmlyc3RFbmFibGVkUGx1Z2luSWQ7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgYWN0aXZlUGx1Z2luLAogICAgICAgIHBsdWdpbnMsIHBsdWdpbnNMaXN0TG9hZGVkOiB7CiAgICAgICAgICAgIHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURFRCwKICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBEYXRlLm5vdygpLAogICAgICAgIH0gfSk7Cn0pKSwgb24oZW52aXJvbm1lbnRMb2FkZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IGVudmlyb25tZW50IH0pID0+IHsKICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBlbnZpcm9ubWVudDogZW52aXJvbm1lbnQgfSk7Cn0pKSwgb24odG9nZ2xlUmVsb2FkRW5hYmxlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyByZWxvYWRFbmFibGVkOiAhc3RhdGUucmVsb2FkRW5hYmxlZCB9KTsKfSkpLCBvbihjaGFuZ2VSZWxvYWRQZXJpb2QsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IHBlcmlvZEluTXMgfSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV4dFJlbG9hZFBlcmlvZCA9IHBlcmlvZEluTXMgPiAwID8gcGVyaW9kSW5NcyA6IHN0YXRlLnJlbG9hZFBlcmlvZEluTXM7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcmVsb2FkUGVyaW9kSW5NczogbmV4dFJlbG9hZFBlcmlvZCB9KTsKfSkpLCBvbihjaGFuZ2VQYWdlU2l6ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gX18xCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIHsgc2l6ZSB9KSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXh0UGFnZVNpemUgPSBzaXplID4gMCA/IHNpemUgOiBzdGF0ZS5wYWdlU2l6ZTsKICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBwYWdlU2l6ZTogbmV4dFBhZ2VTaXplIH0pOwp9KSksIG9uKGZldGNoUnVuU3VjY2VlZGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBfXzEKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgeyBydW5zIH0pID0+IHsKICAgIC8vIERvIG5vdCBtb2RpZnkgdGhlIHJ1blNlbGVjdGlvbiBzaW5jZSB0aGUgUG9seW1lciBjb21wb25lbnQgaXMgdGhlCiAgICAvLyBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBQb2x5bWVyIEludGVyb3AuCiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcG9seW1lckludGVyb3BSdW5zOiBydW5zIH0pOwp9KSksIG9uKHBvbHltZXJJbnRlcm9wUnVuU2VsZWN0aW9uQ2hhbmdlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gX18xCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIHsgbmV4dFNlbGVjdGlvbiB9KSA9PiB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcG9seW1lckludGVyb3BSdW5TZWxlY3Rpb246IG5ldyBTZXQobmV4dFNlbGVjdGlvbikgfSk7Cn0pKSk7Ci8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gYWN0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKSB7CiAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvc3RvcmUvY29yZV9zZWxlY3RvcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBzZWxlY3RDb3JlU3RhdGUgPSBjcmVhdGVGZWF0dXJlU2VsZWN0b3IoQ09SRV9GRUFUVVJFX0tFWSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0UGx1Z2luc0xpc3RMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RDb3JlU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiBzdGF0ZS5wbHVnaW5zTGlzdExvYWRlZCkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEFjdGl2ZVBsdWdpbiA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBzdGF0ZS5hY3RpdmVQbHVnaW47Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRQbHVnaW5zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0Q29yZVN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIHN0YXRlLnBsdWdpbnM7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRFbnZpcm9ubWVudCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBzdGF0ZS5lbnZpcm9ubWVudDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldFJlbG9hZEVuYWJsZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RDb3JlU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiB7CiAgICByZXR1cm4gc3RhdGUucmVsb2FkRW5hYmxlZDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldFJlbG9hZFBlcmlvZEluTXMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RDb3JlU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiB7CiAgICByZXR1cm4gc3RhdGUucmVsb2FkUGVyaW9kSW5NczsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldFBhZ2VTaXplID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0Q29yZVN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIHN0YXRlLnBhZ2VTaXplOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0UnVucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBzdGF0ZS5wb2x5bWVySW50ZXJvcFJ1bnM7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBzZWxlY3RTZWxlY3Rpb24gPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RDb3JlU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiB7CiAgICByZXR1cm4gc3RhdGUucG9seW1lckludGVyb3BSdW5TZWxlY3Rpb247Cn0pKTsKLyoqCiAqIHJ1blNlbGVjdGlvbiBjYW4gYmUgYG51bGxgIHdoZW4gaW5mb3JtYXRpb24gaXMgeWV0IG1pc3Npbmc7IGUuZy4sIHJ1biBzZWxlY3Rpb24gZm9yIGFuCiAqIGV4cGVyaW1lbnQgdGhhdCBpcyBub3QgeWV0IGZldGNoZWQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZ2V0UnVuU2VsZWN0aW9uID0gY3JlYXRlU2VsZWN0b3IoZ2V0UnVucywgc2VsZWN0U2VsZWN0aW9uLCAoLyoqCiAqIEBwYXJhbSB7P30gcnVucwogKiBAcGFyYW0gez99IHNlbGVjdGlvbgogKiBAcmV0dXJuIHs/fQogKi8KKHJ1bnMsIHNlbGVjdGlvbikgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuU2VsZWN0aW9uID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCB7IGlkIH0gb2YgcnVucykgewogICAgICAgIHJ1blNlbGVjdGlvbi5zZXQoaWQsIHNlbGVjdGlvbi5oYXMoaWQpKTsKICAgIH0KICAgIHJldHVybiBydW5TZWxlY3Rpb247Cn0pKTsKCmZ1bmN0aW9uIHRocm93TnVsbFBvcnRhbEVycm9yKCkgewogICAgdGhyb3cgRXJyb3IoJ011c3QgcHJvdmlkZSBhIHBvcnRhbCB0byBhdHRhY2gnKTsKfQovKioKICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGEgcG9ydGFsIHRvIGEgaG9zdCB0aGF0IGlzIGFscmVhZHkgYXR0YWNoZWQuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd1BvcnRhbEFscmVhZHlBdHRhY2hlZEVycm9yKCkgewogICAgdGhyb3cgRXJyb3IoJ0hvc3QgYWxyZWFkeSBoYXMgYSBwb3J0YWwgYXR0YWNoZWQnKTsKfQovKioKICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGEgcG9ydGFsIHRvIGFuIGFscmVhZHktZGlzcG9zZWQgaG9zdC4KICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRocm93UG9ydGFsT3V0bGV0QWxyZWFkeURpc3Bvc2VkRXJyb3IoKSB7CiAgICB0aHJvdyBFcnJvcignVGhpcyBQb3J0YWxPdXRsZXQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCcpOwp9Ci8qKgogKiBUaHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYW4gdW5rbm93biBwb3J0YWwgdHlwZS4KICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRocm93VW5rbm93blBvcnRhbFR5cGVFcnJvcigpIHsKICAgIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBhbiB1bmtub3duIFBvcnRhbCB0eXBlLiBCYXNlUG9ydGFsT3V0bGV0IGFjY2VwdHMgZWl0aGVyICcgKwogICAgICAgICdhIENvbXBvbmVudFBvcnRhbCBvciBhIFRlbXBsYXRlUG9ydGFsLicpOwp9Ci8qKgogKiBUaHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYSBwb3J0YWwgdG8gYSBudWxsIGhvc3QuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd051bGxQb3J0YWxPdXRsZXRFcnJvcigpIHsKICAgIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBhIHBvcnRhbCB0byBhIG51bGwgUG9ydGFsT3V0bGV0Jyk7Cn0KLyoqCiAqIFRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIGRldGFjaCBhIHBvcnRhbCB0aGF0IGlzIG5vdCBhdHRhY2hlZC4KICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRocm93Tm9Qb3J0YWxBdHRhY2hlZEVycm9yKCkgewogICAgdGhyb3cgRXJyb3IoJ0F0dGVtcHRpbmcgdG8gZGV0YWNoIGEgcG9ydGFsIHRoYXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgaG9zdCcpOwp9Ci8qKgogKiBBIGBQb3J0YWxgIGlzIHNvbWV0aGluZyB0aGF0IHlvdSB3YW50IHRvIHJlbmRlciBzb21ld2hlcmUgZWxzZS4KICogSXQgY2FuIGJlIGF0dGFjaCB0byAvIGRldGFjaGVkIGZyb20gYSBgUG9ydGFsT3V0bGV0YC4KICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBQb3J0YWwgewogICAgLyoqCiAgICAgKiBBdHRhY2ggdGhpcyBwb3J0YWwgdG8gYSBob3N0LgogICAgICogQHBhcmFtIHs/fSBob3N0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2goaG9zdCkgewogICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3dOdWxsUG9ydGFsT3V0bGV0RXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGhvc3QuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICB0aHJvd1BvcnRhbEFscmVhZHlBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2F0dGFjaGVkSG9zdCA9IGhvc3Q7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChob3N0LmF0dGFjaCh0aGlzKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2ggdGhpcyBwb3J0YWwgZnJvbSBpdHMgaG9zdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGV0YWNoKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaG9zdCA9IHRoaXMuX2F0dGFjaGVkSG9zdDsKICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93Tm9Qb3J0YWxBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9hdHRhY2hlZEhvc3QgPSBudWxsOwogICAgICAgICAgICBob3N0LmRldGFjaCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIHBvcnRhbCBpcyBhdHRhY2hlZCB0byBhIGhvc3QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaXNBdHRhY2hlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRIb3N0ICE9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIFBvcnRhbE91dGxldCByZWZlcmVuY2Ugd2l0aG91dCBwZXJmb3JtaW5nIGBhdHRhY2goKWAuIFRoaXMgaXMgdXNlZCBkaXJlY3RseSBieQogICAgICogdGhlIFBvcnRhbE91dGxldCB3aGVuIGl0IGlzIHBlcmZvcm1pbmcgYW4gYGF0dGFjaCgpYCBvciBgZGV0YWNoKClgLgogICAgICogQHBhcmFtIHs/fSBob3N0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRBdHRhY2hlZEhvc3QoaG9zdCkgewogICAgICAgIHRoaXMuX2F0dGFjaGVkSG9zdCA9IGhvc3Q7CiAgICB9Cn0KLyoqCiAqIEEgYENvbXBvbmVudFBvcnRhbGAgaXMgYSBwb3J0YWwgdGhhdCBpbnN0YW50aWF0ZXMgc29tZSBDb21wb25lbnQgdXBvbiBhdHRhY2htZW50LgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgQ29tcG9uZW50UG9ydGFsIGV4dGVuZHMgUG9ydGFsIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQKICAgICAqIEBwYXJhbSB7Pz19IHZpZXdDb250YWluZXJSZWYKICAgICAqIEBwYXJhbSB7Pz19IGluamVjdG9yCiAgICAgKiBAcGFyYW0gez89fSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoY29tcG9uZW50LCB2aWV3Q29udGFpbmVyUmVmLCBpbmplY3RvciwgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB2aWV3Q29udGFpbmVyUmVmOwogICAgICAgIHRoaXMuaW5qZWN0b3IgPSBpbmplY3RvcjsKICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgIH0KfQovKioKICogQSBgVGVtcGxhdGVQb3J0YWxgIGlzIGEgcG9ydGFsIHRoYXQgcmVwcmVzZW50cyBzb21lIGVtYmVkZGVkIHRlbXBsYXRlIChUZW1wbGF0ZVJlZikuCiAqIEB0ZW1wbGF0ZSBDCiAqLwpjbGFzcyBUZW1wbGF0ZVBvcnRhbCBleHRlbmRzIFBvcnRhbCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICogQHBhcmFtIHs/PX0gY29udGV4dAogICAgICovCiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSwgdmlld0NvbnRhaW5lclJlZiwgY29udGV4dCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlOwogICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZiA9IHZpZXdDb250YWluZXJSZWY7CiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG9yaWdpbigpIHsKICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVJlZi5lbGVtZW50UmVmOwogICAgfQogICAgLyoqCiAgICAgKiBBdHRhY2ggdGhlIHBvcnRhbCB0byB0aGUgcHJvdmlkZWQgYFBvcnRhbE91dGxldGAuCiAgICAgKiBXaGVuIGEgY29udGV4dCBpcyBwcm92aWRlZCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBgY29udGV4dGAgcHJvcGVydHkgb2YgdGhlIGBUZW1wbGF0ZVBvcnRhbGAKICAgICAqIGluc3RhbmNlLgogICAgICogQHBhcmFtIHs/fSBob3N0CiAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2goaG9zdCwgY29udGV4dCA9IHRoaXMuY29udGV4dCkgewogICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgcmV0dXJuIHN1cGVyLmF0dGFjaChob3N0KTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGV0YWNoKCkgewogICAgICAgIHRoaXMuY29udGV4dCA9IHVuZGVmaW5lZDsKICAgICAgICByZXR1cm4gc3VwZXIuZGV0YWNoKCk7CiAgICB9Cn0KLyoqCiAqIEEgYERvbVBvcnRhbGAgaXMgYSBwb3J0YWwgd2hvc2UgRE9NIGVsZW1lbnQgd2lsbCBiZSB0YWtlbiBmcm9tIGl0cyBjdXJyZW50IHBvc2l0aW9uCiAqIGluIHRoZSBET00gYW5kIG1vdmVkIGludG8gYSBwb3J0YWwgb3V0bGV0LCB3aGVuIGl0IGlzIGF0dGFjaGVkLiBPbiBkZXRhY2gsIHRoZSBjb250ZW50CiAqIHdpbGwgYmUgcmVzdG9yZWQgdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uLgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgRG9tUG9ydGFsIGV4dGVuZHMgUG9ydGFsIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gZWxlbWVudC5uYXRpdmVFbGVtZW50IDogZWxlbWVudDsKICAgIH0KfQovKioKICogUGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBQb3J0YWxPdXRsZXQgdGhhdCBoYW5kbGVzIGF0dGFjaGluZwogKiBDb21wb25lbnRQb3J0YWwgYW5kIFRlbXBsYXRlUG9ydGFsLgogKiBAYWJzdHJhY3QKICovCmNsYXNzIEJhc2VQb3J0YWxPdXRsZXQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGlzIGhvc3QgaGFzIGFscmVhZHkgYmVlbiBwZXJtYW5lbnRseSBkaXNwb3NlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAgYGF0dGFjaERvbVBvcnRhbGAgdG8gYmVjb21lIGEgcmVxdWlyZWQgYWJzdHJhY3QgbWV0aG9kLgogICAgICAgIHRoaXMuYXR0YWNoRG9tUG9ydGFsID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGhvc3QgaGFzIGFuIGF0dGFjaGVkIHBvcnRhbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhc0F0dGFjaGVkKCkgewogICAgICAgIHJldHVybiAhIXRoaXMuX2F0dGFjaGVkUG9ydGFsOwogICAgfQogICAgLyoqCiAgICAgKiBBdHRhY2hlcyBhIHBvcnRhbC4KICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2gocG9ydGFsKSB7CiAgICAgICAgaWYgKCFwb3J0YWwpIHsKICAgICAgICAgICAgdGhyb3dOdWxsUG9ydGFsRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICB0aHJvd1BvcnRhbEFscmVhZHlBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkKSB7CiAgICAgICAgICAgIHRocm93UG9ydGFsT3V0bGV0QWxyZWFkeURpc3Bvc2VkRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvcnRhbCBpbnN0YW5jZW9mIENvbXBvbmVudFBvcnRhbCkgewogICAgICAgICAgICB0aGlzLl9hdHRhY2hlZFBvcnRhbCA9IHBvcnRhbDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBvcnRhbCBpbnN0YW5jZW9mIFRlbXBsYXRlUG9ydGFsKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsID0gcG9ydGFsOwogICAgICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2hUZW1wbGF0ZVBvcnRhbChwb3J0YWwpOwogICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMCByZW1vdmUgbnVsbCBjaGVjayBmb3IgYHRoaXMuYXR0YWNoRG9tUG9ydGFsYC4KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5hdHRhY2hEb21Qb3J0YWwgJiYgcG9ydGFsIGluc3RhbmNlb2YgRG9tUG9ydGFsKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsID0gcG9ydGFsOwogICAgICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2hEb21Qb3J0YWwocG9ydGFsKTsKICAgICAgICB9CiAgICAgICAgdGhyb3dVbmtub3duUG9ydGFsVHlwZUVycm9yKCk7CiAgICB9CiAgICAvKioKICAgICAqIERldGFjaGVzIGEgcHJldmlvdXNseSBhdHRhY2hlZCBwb3J0YWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2goKSB7CiAgICAgICAgaWYgKHRoaXMuX2F0dGFjaGVkUG9ydGFsKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsLnNldEF0dGFjaGVkSG9zdChudWxsKTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwgPSBudWxsOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pbnZva2VEaXNwb3NlRm4oKTsKICAgIH0KICAgIC8qKgogICAgICogUGVybWFuZW50bHkgZGlzcG9zZSBvZiB0aGlzIHBvcnRhbCBob3N0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzcG9zZSgpIHsKICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgIHRoaXMuZGV0YWNoKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ludm9rZURpc3Bvc2VGbigpOwogICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlzcG9zZUZuKGZuKSB7CiAgICAgICAgdGhpcy5fZGlzcG9zZUZuID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaW52b2tlRGlzcG9zZUZuKCkgewogICAgICAgIGlmICh0aGlzLl9kaXNwb3NlRm4pIHsKICAgICAgICAgICAgdGhpcy5fZGlzcG9zZUZuKCk7CiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VGbiA9IG51bGw7CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3BvcnRhbC9kb20tcG9ydGFsLW91dGxldC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBQb3J0YWxPdXRsZXQgZm9yIGF0dGFjaGluZyBwb3J0YWxzIHRvIGFuIGFyYml0cmFyeSBET00gZWxlbWVudCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyCiAqIGFwcGxpY2F0aW9uIGNvbnRleHQuCiAqLwpjbGFzcyBEb21Qb3J0YWxPdXRsZXQgZXh0ZW5kcyBCYXNlUG9ydGFsT3V0bGV0IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvdXRsZXRFbGVtZW50CiAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAqIEBwYXJhbSB7P30gX2FwcFJlZgogICAgICogQHBhcmFtIHs/fSBfZGVmYXVsdEluamVjdG9yCiAgICAgKiBAcGFyYW0gez89fSBfZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3Iob3V0bGV0RWxlbWVudCwgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX2FwcFJlZiwgX2RlZmF1bHRJbmplY3RvciwgCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkIGBfZG9jdW1lbnRgIFBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAqLwogICAgX2RvY3VtZW50KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLm91dGxldEVsZW1lbnQgPSBvdXRsZXRFbGVtZW50OwogICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgdGhpcy5fYXBwUmVmID0gX2FwcFJlZjsKICAgICAgICB0aGlzLl9kZWZhdWx0SW5qZWN0b3IgPSBfZGVmYXVsdEluamVjdG9yOwogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIGEgRE9NIHBvcnRhbCBieSB0cmFuc2ZlcnJpbmcgaXRzIGNvbnRlbnQgaW50byB0aGUgb3V0bGV0LgogICAgICAgICAqIEBwYXJhbSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkLgogICAgICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHR1cm5lZCBpbnRvIGEgbWV0aG9kLgogICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAqLwogICAgICAgIHRoaXMuYXR0YWNoRG9tUG9ydGFsID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocG9ydGFsKSA9PiB7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wIFJlbW92ZSBjaGVjayBhbmQgZXJyb3Igb25jZSB0aGUKICAgICAgICAgICAgLy8gYF9kb2N1bWVudGAgY29uc3RydWN0b3IgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgogICAgICAgICAgICBpZiAoIXRoaXMuX2RvY3VtZW50KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGF0dGFjaCBET00gcG9ydGFsIHdpdGhvdXQgX2RvY3VtZW50IGNvbnN0cnVjdG9yIHBhcmFtZXRlcicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHBvcnRhbC5lbGVtZW50OwogICAgICAgICAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0RPTSBwb3J0YWwgY29udGVudCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgcGFyZW50IG5vZGUuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQW5jaG9yIHVzZWQgdG8gc2F2ZSB0aGUgZWxlbWVudCdzIHByZXZpb3VzIHBvc2l0aW9uIHNvCiAgICAgICAgICAgIC8vIHRoYXQgd2UgY2FuIHJlc3RvcmUgaXQgd2hlbiB0aGUgcG9ydGFsIGlzIGRldGFjaGVkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuY2hvck5vZGUgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVDb21tZW50KCdkb20tcG9ydGFsJyk7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW5jaG9yTm9kZSwgZWxlbWVudCk7CiAgICAgICAgICAgIHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgc3VwZXIuc2V0RGlzcG9zZUZuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSBgcmVwbGFjZVdpdGhgIGhlcmUgYmVjYXVzZSBJRSBkb2Vzbid0IHN1cHBvcnQgaXQuCiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlbGVtZW50LCBhbmNob3JOb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBBdHRhY2ggdGhlIGdpdmVuIENvbXBvbmVudFBvcnRhbCB0byBET00gZWxlbWVudCB1c2luZyB0aGUgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZAogICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudC4KICAgICAqLwogICAgYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNvbHZlciA9IHBvcnRhbC5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfHwgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gcmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkocG9ydGFsLmNvbXBvbmVudCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb21wb25lbnRSZWY7CiAgICAgICAgLy8gSWYgdGhlIHBvcnRhbCBzcGVjaWZpZXMgYSBWaWV3Q29udGFpbmVyUmVmLCB3ZSB3aWxsIHVzZSB0aGF0IGFzIHRoZSBhdHRhY2htZW50IHBvaW50CiAgICAgICAgLy8gZm9yIHRoZSBjb21wb25lbnQgKGluIHRlcm1zIG9mIEFuZ3VsYXIncyBjb21wb25lbnQgdHJlZSwgbm90IHJlbmRlcmluZykuCiAgICAgICAgLy8gV2hlbiB0aGUgVmlld0NvbnRhaW5lclJlZiBpcyBtaXNzaW5nLCB3ZSB1c2UgdGhlIGZhY3RvcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgZGlyZWN0bHkKICAgICAgICAvLyBhbmQgdGhlbiBtYW51YWxseSBhdHRhY2ggdGhlIHZpZXcgdG8gdGhlIGFwcGxpY2F0aW9uLgogICAgICAgIGlmIChwb3J0YWwudmlld0NvbnRhaW5lclJlZikgewogICAgICAgICAgICBjb21wb25lbnRSZWYgPSBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgcG9ydGFsLnZpZXdDb250YWluZXJSZWYubGVuZ3RoLCBwb3J0YWwuaW5qZWN0b3IgfHwgcG9ydGFsLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3IpOwogICAgICAgICAgICB0aGlzLnNldERpc3Bvc2VGbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBjb21wb25lbnRSZWYuZGVzdHJveSgpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShwb3J0YWwuaW5qZWN0b3IgfHwgdGhpcy5fZGVmYXVsdEluamVjdG9yKTsKICAgICAgICAgICAgdGhpcy5fYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTsKICAgICAgICAgICAgdGhpcy5zZXREaXNwb3NlRm4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fYXBwUmVmLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTsKICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGluc3RhbnRpYXRlZCwgc28gd2UgbW92ZSBpdCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIERPTQogICAgICAgIC8vIHdoZXJlIHdlIHdhbnQgaXQgdG8gYmUgcmVuZGVyZWQuCiAgICAgICAgdGhpcy5vdXRsZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2dldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZikpOwogICAgICAgIHJldHVybiBjb21wb25lbnRSZWY7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGFjaGVzIGEgdGVtcGxhdGUgcG9ydGFsIHRvIHRoZSBET00gYXMgYW4gZW1iZWRkZWQgdmlldy4KICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgKiBAcGFyYW0gez99IHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBSZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgZW1iZWRkZWQgdmlldy4KICAgICAqLwogICAgYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2aWV3Q29udGFpbmVyID0gcG9ydGFsLnZpZXdDb250YWluZXJSZWY7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2aWV3UmVmID0gdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcocG9ydGFsLnRlbXBsYXRlUmVmLCBwb3J0YWwuY29udGV4dCk7CiAgICAgICAgdmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgICAgLy8gVGhlIG1ldGhvZCBgY3JlYXRlRW1iZWRkZWRWaWV3YCB3aWxsIGFkZCB0aGUgdmlldyBhcyBhIGNoaWxkIG9mIHRoZSB2aWV3Q29udGFpbmVyLgogICAgICAgIC8vIEJ1dCBmb3IgdGhlIERvbVBvcnRhbE91dGxldCB0aGUgdmlldyBjYW4gYmUgYWRkZWQgZXZlcnl3aGVyZSBpbiB0aGUgRE9NCiAgICAgICAgLy8gKGUuZyBPdmVybGF5IENvbnRhaW5lcikgVG8gbW92ZSB0aGUgdmlldyB0byB0aGUgc3BlY2lmaWVkIGhvc3QgZWxlbWVudC4gV2UganVzdAogICAgICAgIC8vIHJlLWFwcGVuZCB0aGUgZXhpc3Rpbmcgcm9vdCBub2Rlcy4KICAgICAgICB2aWV3UmVmLnJvb3ROb2Rlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJvb3ROb2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByb290Tm9kZSA9PiB0aGlzLm91dGxldEVsZW1lbnQuYXBwZW5kQ2hpbGQocm9vdE5vZGUpKSk7CiAgICAgICAgdGhpcy5zZXREaXNwb3NlRm4oKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaW5kZXggPSB2aWV3Q29udGFpbmVyLmluZGV4T2Yodmlld1JlZik7CiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXIucmVtb3ZlKGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0pKSk7CiAgICAgICAgLy8gVE9ETyhqZWxib3Vybik6IFJldHVybiBsb2NhbHMgZnJvbSB2aWV3LgogICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhcnMgb3V0IGEgcG9ydGFsIGZyb20gdGhlIERPTS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwogICAgICAgIGlmICh0aGlzLm91dGxldEVsZW1lbnQucGFyZW50Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMub3V0bGV0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub3V0bGV0RWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSByb290IEhUTUxFbGVtZW50IGZvciBhbiBpbnN0YW50aWF0ZWQgY29tcG9uZW50LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFJlZi5ob3N0VmlldykpKS5yb290Tm9kZXNbMF0pKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9wb3J0YWwvcG9ydGFsLWRpcmVjdGl2ZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERpcmVjdGl2ZSB2ZXJzaW9uIG9mIGEgYFRlbXBsYXRlUG9ydGFsYC4gQmVjYXVzZSB0aGUgZGlyZWN0aXZlICppcyogYSBUZW1wbGF0ZVBvcnRhbCwKICogdGhlIGRpcmVjdGl2ZSBpbnN0YW5jZSBpdHNlbGYgY2FuIGJlIGF0dGFjaGVkIHRvIGEgaG9zdCwgZW5hYmxpbmcgZGVjbGFyYXRpdmUgdXNlIG9mIHBvcnRhbHMuCiAqLwpjbGFzcyBDZGtQb3J0YWwgZXh0ZW5kcyBUZW1wbGF0ZVBvcnRhbCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICovCiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZiwgdmlld0NvbnRhaW5lclJlZikgewogICAgICAgIHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTsKICAgIH0KfQpDZGtQb3J0YWwuybVmYWMgPSBmdW5jdGlvbiBDZGtQb3J0YWxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrUG9ydGFsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSk7IH07CkNka1BvcnRhbC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtQb3J0YWwsIHNlbGVjdG9yczogW1siIiwgImNka1BvcnRhbCIsICIiXV0sIGV4cG9ydEFzOiBbImNka1BvcnRhbCJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KQ2RrUG9ydGFsLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9LAogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0KXTsKLyoqCiAqIEBkZXByZWNhdGVkIFVzZSBgQ2RrUG9ydGFsYCBpbnN0ZWFkLgogKiBcQGJyZWFraW5nLWNoYW5nZSA5LjAuMAogKi8KY2xhc3MgVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWwgewp9ClRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlLsm1ZmFjID0gZnVuY3Rpb24gVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmVfRmFjdG9yeSh0KSB7IHJldHVybiDJtVRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlX0Jhc2VGYWN0b3J5KHQgfHwgVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUpOyB9OwpUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZSwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrLXBvcnRhbCIsICIiXSwgWyIiLCAicG9ydGFsIiwgIiJdXSwgZXhwb3J0QXM6IFsiY2RrUG9ydGFsIl0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sKICAgICAgICAgICAgICAgIHByb3ZpZGU6IENka1BvcnRhbCwKICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZQogICAgICAgICAgICB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwpjb25zdCDJtVRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUpOwovKioKICogRGlyZWN0aXZlIHZlcnNpb24gb2YgYSBQb3J0YWxPdXRsZXQuIEJlY2F1c2UgdGhlIGRpcmVjdGl2ZSAqaXMqIGEgUG9ydGFsT3V0bGV0LCBwb3J0YWxzIGNhbiBiZQogKiBkaXJlY3RseSBhdHRhY2hlZCB0byBpdCwgZW5hYmxpbmcgZGVjbGFyYXRpdmUgdXNlLgogKgogKiBVc2FnZToKICogYDxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT0iZ3JlZXRpbmciPjwvbmctdGVtcGxhdGU+YAogKi8KY2xhc3MgQ2RrUG9ydGFsT3V0bGV0IGV4dGVuZHMgQmFzZVBvcnRhbE91dGxldCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgogICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lclJlZgogICAgICogQHBhcmFtIHs/PX0gX2RvY3VtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIF92aWV3Q29udGFpbmVyUmVmLCAKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgYF9kb2N1bWVudGAgcGFyYW1ldGVyIHRvIGJlIG1hZGUgcmVxdWlyZWQuCiAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDkuMC4wCiAgICAgKi8KICAgIF9kb2N1bWVudCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgcG9ydGFsIGNvbXBvbmVudCBpcyBpbml0aWFsaXplZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiBhIHBvcnRhbCBpcyBhdHRhY2hlZCB0byB0aGUgb3V0bGV0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuYXR0YWNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhlIGdpdmVuIERvbVBvcnRhbCB0byB0aGlzIFBvcnRhbEhvc3QgYnkgbW92aW5nIGFsbCBvZiB0aGUgcG9ydGFsIGNvbnRlbnQgaW50byBpdC4KICAgICAgICAgKiBAcGFyYW0gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZC4KICAgICAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSB0dXJuZWQgaW50byBhIG1ldGhvZC4KICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAgICAgKi8KICAgICAgICB0aGlzLmF0dGFjaERvbVBvcnRhbCA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHBvcnRhbCkgPT4gewogICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDkuMC4wIFJlbW92ZSBjaGVjayBhbmQgZXJyb3Igb25jZSB0aGUKICAgICAgICAgICAgLy8gYF9kb2N1bWVudGAgY29uc3RydWN0b3IgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgogICAgICAgICAgICBpZiAoIXRoaXMuX2RvY3VtZW50KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGF0dGFjaCBET00gcG9ydGFsIHdpdGhvdXQgX2RvY3VtZW50IGNvbnN0cnVjdG9yIHBhcmFtZXRlcicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHBvcnRhbC5lbGVtZW50OwogICAgICAgICAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0RPTSBwb3J0YWwgY29udGVudCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgcGFyZW50IG5vZGUuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQW5jaG9yIHVzZWQgdG8gc2F2ZSB0aGUgZWxlbWVudCdzIHByZXZpb3VzIHBvc2l0aW9uIHNvCiAgICAgICAgICAgIC8vIHRoYXQgd2UgY2FuIHJlc3RvcmUgaXQgd2hlbiB0aGUgcG9ydGFsIGlzIGRldGFjaGVkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuY2hvck5vZGUgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVDb21tZW50KCdkb20tcG9ydGFsJyk7CiAgICAgICAgICAgIHBvcnRhbC5zZXRBdHRhY2hlZEhvc3QodGhpcyk7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW5jaG9yTm9kZSwgZWxlbWVudCk7CiAgICAgICAgICAgIHRoaXMuX2dldFJvb3ROb2RlKCkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgICAgICAgICAgIHN1cGVyLnNldERpc3Bvc2VGbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGFuY2hvck5vZGUucGFyZW50Tm9kZSkpLnJlcGxhY2VDaGlsZChlbGVtZW50LCBhbmNob3JOb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBQb3J0YWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBQb3J0YWwgb3V0bGV0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBvcnRhbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRQb3J0YWw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgcG9ydGFsKHBvcnRhbCkgewogICAgICAgIC8vIElnbm9yZSB0aGUgY2FzZXMgd2hlcmUgdGhlIGBwb3J0YWxgIGlzIHNldCB0byBhIGZhbHN5IHZhbHVlIGJlZm9yZSB0aGUgbGlmZWN5Y2xlIGhvb2tzIGhhdmUKICAgICAgICAvLyBydW4uIFRoaXMgaGFuZGxlcyB0aGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgbWlnaHQgZG8gc29tZXRoaW5nIGxpa2UgYDxkaXYgY2RrUG9ydGFsT3V0bGV0PmAKICAgICAgICAvLyBhbmQgYXR0YWNoIGEgcG9ydGFsIHByb2dyYW1tYXRpY2FsbHkgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuIFdoZW4gQW5ndWxhciBkb2VzIHRoZSBmaXJzdCBDRAogICAgICAgIC8vIHJvdW5kLCBpdCB3aWxsIGZpcmUgdGhlIHNldHRlciB3aXRoIGVtcHR5IHN0cmluZywgY2F1c2luZyB0aGUgdXNlcidzIGNvbnRlbnQgdG8gYmUgY2xlYXJlZC4KICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpICYmICFwb3J0YWwgJiYgIXRoaXMuX2lzSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgIHN1cGVyLmRldGFjaCgpOwogICAgICAgIH0KICAgICAgICBpZiAocG9ydGFsKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dGFjaChwb3J0YWwpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9hdHRhY2hlZFBvcnRhbCA9IHBvcnRhbDsKICAgIH0KICAgIC8qKgogICAgICogQ29tcG9uZW50IG9yIHZpZXcgcmVmZXJlbmNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIHBvcnRhbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBhdHRhY2hlZFJlZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRSZWY7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25Jbml0KCkgewogICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICBzdXBlci5kaXNwb3NlKCk7CiAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwgPSBudWxsOwogICAgICAgIHRoaXMuX2F0dGFjaGVkUmVmID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoIHRoZSBnaXZlbiBDb21wb25lbnRQb3J0YWwgdG8gdGhpcyBQb3J0YWxPdXRsZXQgdXNpbmcgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBwb3J0YWwgb3V0bGV0LgogICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudC4KICAgICAqLwogICAgYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCkgewogICAgICAgIHBvcnRhbC5zZXRBdHRhY2hlZEhvc3QodGhpcyk7CiAgICAgICAgLy8gSWYgdGhlIHBvcnRhbCBzcGVjaWZpZXMgYW4gb3JpZ2luLCB1c2UgdGhhdCBhcyB0aGUgbG9naWNhbCBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50CiAgICAgICAgLy8gaW4gdGhlIGFwcGxpY2F0aW9uIHRyZWUuIE90aGVyd2lzZSB1c2UgdGhlIGxvY2F0aW9uIG9mIHRoaXMgUG9ydGFsT3V0bGV0LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gcG9ydGFsLnZpZXdDb250YWluZXJSZWYgIT0gbnVsbCA/CiAgICAgICAgICAgIHBvcnRhbC52aWV3Q29udGFpbmVyUmVmIDoKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBwb3J0YWwuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyIHx8IHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHBvcnRhbC5jb21wb25lbnQpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5LCB2aWV3Q29udGFpbmVyUmVmLmxlbmd0aCwgcG9ydGFsLmluamVjdG9yIHx8IHZpZXdDb250YWluZXJSZWYuaW5qZWN0b3IpOwogICAgICAgIC8vIElmIHdlJ3JlIHVzaW5nIGEgdmlldyBjb250YWluZXIgdGhhdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBpbmplY3RlZCBvbmUgKGUuZy4gd2hlbiB0aGUgcG9ydGFsCiAgICAgICAgLy8gc3BlY2lmaWVzIGl0cyBvd24pIHdlIG5lZWQgdG8gbW92ZSB0aGUgY29tcG9uZW50IGludG8gdGhlIG91dGxldCwgb3RoZXJ3aXNlIGl0J2xsIGJlIHJlbmRlcmVkCiAgICAgICAgLy8gaW5zaWRlIG9mIHRoZSBhbHRlcm5hdGUgdmlldyBjb250YWluZXIuCiAgICAgICAgaWYgKHZpZXdDb250YWluZXJSZWYgIT09IHRoaXMuX3ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICAgICAgdGhpcy5fZ2V0Um9vdE5vZGUoKS5hcHBlbmRDaGlsZCgoKC8qKiBAdHlwZSB7P30gKi8gKHJlZi5ob3N0VmlldykpKS5yb290Tm9kZXNbMF0pOwogICAgICAgIH0KICAgICAgICBzdXBlci5zZXREaXNwb3NlRm4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gcmVmLmRlc3Ryb3koKSkpOwogICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsID0gcG9ydGFsOwogICAgICAgIHRoaXMuX2F0dGFjaGVkUmVmID0gcmVmOwogICAgICAgIHRoaXMuYXR0YWNoZWQuZW1pdChyZWYpOwogICAgICAgIHJldHVybiByZWY7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGFjaCB0aGUgZ2l2ZW4gVGVtcGxhdGVQb3J0YWwgdG8gdGhpcyBQb3J0YWxIb3N0IGFzIGFuIGVtYmVkZGVkIFZpZXcuCiAgICAgKiBAdGVtcGxhdGUgQwogICAgICogQHBhcmFtIHs/fSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkLgogICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGVtYmVkZGVkIHZpZXcuCiAgICAgKi8KICAgIGF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCkgewogICAgICAgIHBvcnRhbC5zZXRBdHRhY2hlZEhvc3QodGhpcyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhwb3J0YWwudGVtcGxhdGVSZWYsIHBvcnRhbC5jb250ZXh0KTsKICAgICAgICBzdXBlci5zZXREaXNwb3NlRm4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpKSk7CiAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwgPSBwb3J0YWw7CiAgICAgICAgdGhpcy5fYXR0YWNoZWRSZWYgPSB2aWV3UmVmOwogICAgICAgIHRoaXMuYXR0YWNoZWQuZW1pdCh2aWV3UmVmKTsKICAgICAgICByZXR1cm4gdmlld1JlZjsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgcm9vdCBub2RlIG9mIHRoZSBwb3J0YWwgb3V0bGV0LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRSb290Tm9kZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50OwogICAgICAgIC8vIFRoZSBkaXJlY3RpdmUgY291bGQgYmUgc2V0IG9uIGEgdGVtcGxhdGUgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBjb21tZW50CiAgICAgICAgLy8gbm9kZSBiZWluZyB0aGUgcm9vdC4gVXNlIHRoZSBjb21tZW50J3MgcGFyZW50IG5vZGUgaWYgdGhhdCBpcyB0aGUgY2FzZS4KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKChuYXRpdmVFbGVtZW50Lm5vZGVUeXBlID09PSBuYXRpdmVFbGVtZW50LkVMRU1FTlRfTk9ERSA/CiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQgOiAoLyoqIEB0eXBlIHs/fSAqLyAobmF0aXZlRWxlbWVudC5wYXJlbnROb2RlKSkpKSk7CiAgICB9Cn0KQ2RrUG9ydGFsT3V0bGV0Lsm1ZmFjID0gZnVuY3Rpb24gQ2RrUG9ydGFsT3V0bGV0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka1BvcnRhbE91dGxldCkoybXJtWRpcmVjdGl2ZUluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKQ2RrUG9ydGFsT3V0bGV0Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka1BvcnRhbE91dGxldCwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrUG9ydGFsT3V0bGV0IiwgIiJdXSwgaW5wdXRzOiB7IHBvcnRhbDogWyJjZGtQb3J0YWxPdXRsZXQiLCAicG9ydGFsIl0gfSwgb3V0cHV0czogeyBhdHRhY2hlZDogImF0dGFjaGVkIiB9LCBleHBvcnRBczogWyJjZGtQb3J0YWxPdXRsZXQiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkNka1BvcnRhbE91dGxldC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0sCiAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwpDZGtQb3J0YWxPdXRsZXQucHJvcERlY29yYXRvcnMgPSB7CiAgICBhdHRhY2hlZDogW3sgdHlwZTogT3V0cHV0IH1dCn07Ci8qKgogKiBAZGVwcmVjYXRlZCBVc2UgYENka1BvcnRhbE91dGxldGAgaW5zdGVhZC4KICogXEBicmVha2luZy1jaGFuZ2UgOS4wLjAKICovCmNsYXNzIFBvcnRhbEhvc3REaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWxPdXRsZXQgewp9ClBvcnRhbEhvc3REaXJlY3RpdmUuybVmYWMgPSBmdW5jdGlvbiBQb3J0YWxIb3N0RGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gybVQb3J0YWxIb3N0RGlyZWN0aXZlX0Jhc2VGYWN0b3J5KHQgfHwgUG9ydGFsSG9zdERpcmVjdGl2ZSk7IH07ClBvcnRhbEhvc3REaXJlY3RpdmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogUG9ydGFsSG9zdERpcmVjdGl2ZSwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrUG9ydGFsSG9zdCIsICIiXSwgWyIiLCAicG9ydGFsSG9zdCIsICIiXV0sIGlucHV0czogeyBwb3J0YWw6IFsiY2RrUG9ydGFsSG9zdCIsICJwb3J0YWwiXSB9LCBleHBvcnRBczogWyJjZGtQb3J0YWxIb3N0Il0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sKICAgICAgICAgICAgICAgIHByb3ZpZGU6IENka1BvcnRhbE91dGxldCwKICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBQb3J0YWxIb3N0RGlyZWN0aXZlCiAgICAgICAgICAgIH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CmNvbnN0IMm1UG9ydGFsSG9zdERpcmVjdGl2ZV9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KFBvcnRhbEhvc3REaXJlY3RpdmUpOwpjbGFzcyBQb3J0YWxNb2R1bGUgewp9ClBvcnRhbE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFBvcnRhbE1vZHVsZSB9KTsKUG9ydGFsTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUG9ydGFsTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBvcnRhbE1vZHVsZSkoKTsgfSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoUG9ydGFsTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0Nka1BvcnRhbCwKICAgICAgICBDZGtQb3J0YWxPdXRsZXQsCiAgICAgICAgVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUsCiAgICAgICAgUG9ydGFsSG9zdERpcmVjdGl2ZV0sIGV4cG9ydHM6IFtDZGtQb3J0YWwsCiAgICAgICAgQ2RrUG9ydGFsT3V0bGV0LAogICAgICAgIFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlLAogICAgICAgIFBvcnRhbEhvc3REaXJlY3RpdmVdIH0pOyB9KSgpOwoKY2xhc3MgRGF0YVNvdXJjZSB7Cn0KLyoqCiAqIENoZWNrcyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIGRhdGEgc291cmNlLgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0RhdGFTb3VyY2UodmFsdWUpIHsKICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIERhdGFTb3VyY2UgYnkgb2JzZXJ2aW5nIGlmIGl0IGhhcyBhIGNvbm5lY3QgZnVuY3Rpb24uIENhbm5vdAogICAgLy8gYmUgY2hlY2tlZCBhcyBhbiBgaW5zdGFuY2VvZiBEYXRhU291cmNlYCBzaW5jZSBwZW9wbGUgY291bGQgY3JlYXRlIHRoZWlyIG93biBzb3VyY2VzCiAgICAvLyB0aGF0IG1hdGNoIHRoZSBpbnRlcmZhY2UsIGJ1dCBkb24ndCBleHRlbmQgRGF0YVNvdXJjZS4KICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuY29ubmVjdCA9PT0gJ2Z1bmN0aW9uJzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jb2xsZWN0aW9ucy9hcnJheS1kYXRhLXNvdXJjZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogRGF0YVNvdXJjZSB3cmFwcGVyIGZvciBhIG5hdGl2ZSBhcnJheS4KICogQHRlbXBsYXRlIFQKICovCmNsYXNzIEFycmF5RGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9kYXRhCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kYXRhKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9kYXRhID0gX2RhdGE7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNvbm5lY3QoKSB7CiAgICAgICAgcmV0dXJuIGlzT2JzZXJ2YWJsZSh0aGlzLl9kYXRhKSA/IHRoaXMuX2RhdGEgOiBvZih0aGlzLl9kYXRhKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzY29ubmVjdCgpIHsgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2NvbGxlY3Rpb25zL3NlbGVjdGlvbi1tb2RlbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ2xhc3MgdG8gYmUgdXNlZCB0byBwb3dlciBzZWxlY3Rpbmcgb25lIG9yIG1vcmUgb3B0aW9ucyBmcm9tIGEgbGlzdC4KICogQHRlbXBsYXRlIFQKICovCmNsYXNzIFNlbGVjdGlvbk1vZGVsIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gX211bHRpcGxlCiAgICAgKiBAcGFyYW0gez89fSBpbml0aWFsbHlTZWxlY3RlZFZhbHVlcwogICAgICogQHBhcmFtIHs/PX0gX2VtaXRDaGFuZ2VzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9tdWx0aXBsZSA9IGZhbHNlLCBpbml0aWFsbHlTZWxlY3RlZFZhbHVlcywgX2VtaXRDaGFuZ2VzID0gdHJ1ZSkgewogICAgICAgIHRoaXMuX211bHRpcGxlID0gX211bHRpcGxlOwogICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VzID0gX2VtaXRDaGFuZ2VzOwogICAgICAgIC8qKgogICAgICAgICAqIEN1cnJlbnRseS1zZWxlY3RlZCB2YWx1ZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IFNldCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNlbGVjdGVkIG9wdGlvbnMgdGhhdCBoYXZlbid0IGJlZW4gZW1pdHRlZCBieSB0aGUgY2hhbmdlIGV2ZW50LgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9ucyB0aGF0IGhhdmVuJ3QgYmVlbiBlbWl0dGVkIGJ5IHRoZSBjaGFuZ2UgZXZlbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUb0VtaXQgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY2hhbmdlZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgaWYgKGluaXRpYWxseVNlbGVjdGVkVmFsdWVzICYmIGluaXRpYWxseVNlbGVjdGVkVmFsdWVzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoX211bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpbml0aWFsbHlTZWxlY3RlZFZhbHVlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHZhbHVlID0+IHRoaXMuX21hcmtTZWxlY3RlZCh2YWx1ZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21hcmtTZWxlY3RlZChpbml0aWFsbHlTZWxlY3RlZFZhbHVlc1swXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGFycmF5IGluIG9yZGVyIHRvIGF2b2lkIGZpcmluZyB0aGUgY2hhbmdlIGV2ZW50IGZvciBwcmVzZWxlY3RlZCB2YWx1ZXMuCiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3RlZCB2YWx1ZXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc2VsZWN0ZWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZCkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IEFycmF5LmZyb20odGhpcy5fc2VsZWN0aW9uLnZhbHVlcygpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkOwogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3RzIGEgdmFsdWUgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLgogICAgICogQHBhcmFtIHsuLi4/fSB2YWx1ZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNlbGVjdCguLi52YWx1ZXMpIHsKICAgICAgICB0aGlzLl92ZXJpZnlWYWx1ZUFzc2lnbm1lbnQodmFsdWVzKTsKICAgICAgICB2YWx1ZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmFsdWUgPT4gdGhpcy5fbWFya1NlbGVjdGVkKHZhbHVlKSkpOwogICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXNlbGVjdHMgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZXMuCiAgICAgKiBAcGFyYW0gey4uLj99IHZhbHVlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzZWxlY3QoLi4udmFsdWVzKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5VmFsdWVBc3NpZ25tZW50KHZhbHVlcyk7CiAgICAgICAgdmFsdWVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbHVlID0+IHRoaXMuX3VubWFya1NlbGVjdGVkKHZhbHVlKSkpOwogICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgfQogICAgLyoqCiAgICAgKiBUb2dnbGVzIGEgdmFsdWUgYmV0d2VlbiBzZWxlY3RlZCBhbmQgZGVzZWxlY3RlZC4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRvZ2dsZSh2YWx1ZSkgewogICAgICAgIHRoaXMuaXNTZWxlY3RlZCh2YWx1ZSkgPyB0aGlzLmRlc2VsZWN0KHZhbHVlKSA6IHRoaXMuc2VsZWN0KHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYXJzIGFsbCBvZiB0aGUgc2VsZWN0ZWQgdmFsdWVzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xlYXIoKSB7CiAgICAgICAgdGhpcy5fdW5tYXJrQWxsKCk7CiAgICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHZhbHVlIGlzIHNlbGVjdGVkLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaXNTZWxlY3RlZCh2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24uaGFzKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtb2RlbCBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc0VtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24uc2l6ZSA9PT0gMDsKICAgIH0KICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYSB2YWx1ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhc1ZhbHVlKCkgewogICAgICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCk7CiAgICB9CiAgICAvKioKICAgICAqIFNvcnRzIHRoZSBzZWxlY3RlZCB2YWx1ZXMgYmFzZWQgb24gYSBwcmVkaWNhdGUgZnVuY3Rpb24uCiAgICAgKiBAcGFyYW0gez89fSBwcmVkaWNhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNvcnQocHJlZGljYXRlKSB7CiAgICAgICAgaWYgKHRoaXMuX211bHRpcGxlICYmIHRoaXMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3NlbGVjdGVkKSkuc29ydChwcmVkaWNhdGUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0cyB3aGV0aGVyIG11bHRpcGxlIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc011bHRpcGxlU2VsZWN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTsKICAgIH0KICAgIC8qKgogICAgICogRW1pdHMgYSBjaGFuZ2UgZXZlbnQgYW5kIGNsZWFycyB0aGUgcmVjb3JkcyBvZiBzZWxlY3RlZCBhbmQgZGVzZWxlY3RlZCB2YWx1ZXMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2VtaXRDaGFuZ2VFdmVudCgpIHsKICAgICAgICAvLyBDbGVhciB0aGUgc2VsZWN0ZWQgdmFsdWVzIHNvIHRoZXkgY2FuIGJlIHJlLWNhY2hlZC4KICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aCB8fCB0aGlzLl9kZXNlbGVjdGVkVG9FbWl0Lmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLmNoYW5nZWQubmV4dCh7CiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsCiAgICAgICAgICAgICAgICBhZGRlZDogdGhpcy5fc2VsZWN0ZWRUb0VtaXQsCiAgICAgICAgICAgICAgICByZW1vdmVkOiB0aGlzLl9kZXNlbGVjdGVkVG9FbWl0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kZXNlbGVjdGVkVG9FbWl0ID0gW107CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVG9FbWl0ID0gW107CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3RzIGEgdmFsdWUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX21hcmtTZWxlY3RlZCh2YWx1ZSkgewogICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKHZhbHVlKSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX211bHRpcGxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91bm1hcmtBbGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24uYWRkKHZhbHVlKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXRDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFRvRW1pdC5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVzZWxlY3RzIGEgdmFsdWUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VubWFya1NlbGVjdGVkKHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCh2YWx1ZSkpIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uLmRlbGV0ZSh2YWx1ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9lbWl0Q2hhbmdlcykgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzZWxlY3RlZFRvRW1pdC5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2xlYXJzIG91dCB0aGUgc2VsZWN0ZWQgdmFsdWVzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91bm1hcmtBbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzRW1wdHkoKSkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24uZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhbHVlID0+IHRoaXMuX3VubWFya1NlbGVjdGVkKHZhbHVlKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVmVyaWZpZXMgdGhlIHZhbHVlIGFzc2lnbm1lbnQgYW5kIHRocm93cyBhbiBlcnJvciBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFycmF5IGlzCiAgICAgKiBpbmNsdWRpbmcgbXVsdGlwbGUgdmFsdWVzIHdoaWxlIHRoZSBzZWxlY3Rpb24gbW9kZWwgaXMgbm90IHN1cHBvcnRpbmcgbXVsdGlwbGUgdmFsdWVzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdmFsdWVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdmVyaWZ5VmFsdWVBc3NpZ25tZW50KHZhbHVlcykgewogICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSAmJiAhdGhpcy5fbXVsdGlwbGUpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TXVsdGlwbGVWYWx1ZXNJblNpbmdsZVNlbGVjdGlvbkVycm9yKCk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBSZXR1cm5zIGFuIGVycm9yIHRoYXQgcmVwb3J0cyB0aGF0IG11bHRpcGxlIHZhbHVlcyBhcmUgcGFzc2VkIGludG8gYSBzZWxlY3Rpb24gbW9kZWwKICogd2l0aCBhIHNpbmdsZSB2YWx1ZS4KICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE11bHRpcGxlVmFsdWVzSW5TaW5nbGVTZWxlY3Rpb25FcnJvcigpIHsKICAgIHJldHVybiBFcnJvcignQ2Fubm90IHBhc3MgbXVsdGlwbGUgdmFsdWVzIGludG8gU2VsZWN0aW9uTW9kZWwgd2l0aCBzaW5nbGUtdmFsdWUgbW9kZS4nKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jb2xsZWN0aW9ucy91bmlxdWUtc2VsZWN0aW9uLWRpc3BhdGNoZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENsYXNzIHRvIGNvb3JkaW5hdGUgdW5pcXVlIHNlbGVjdGlvbiBiYXNlZCBvbiBuYW1lLgogKiBJbnRlbmRlZCB0byBiZSBjb25zdW1lZCBhcyBhbiBBbmd1bGFyIHNlcnZpY2UuCiAqIFRoaXMgc2VydmljZSBpcyBuZWVkZWQgYmVjYXVzZSBuYXRpdmUgcmFkaW8gY2hhbmdlIGV2ZW50cyBhcmUgb25seSBmaXJlZCBvbiB0aGUgaXRlbSBjdXJyZW50bHkKICogYmVpbmcgc2VsZWN0ZWQsIGFuZCB3ZSBzdGlsbCBuZWVkIHRvIHVuY2hlY2sgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4KICoKICogVGhpcyBzZXJ2aWNlIGRvZXMgbm90ICpzdG9yZSogYW55IElEcyBhbmQgbmFtZXMgYmVjYXVzZSB0aGV5IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUsIHNvIGl0IGlzCiAqIGxlc3MgZXJyb3ItcHJvbmUgaWYgdGhleSBhcmUgc2ltcGx5IHBhc3NlZCB0aHJvdWdoIHdoZW4gdGhlIGV2ZW50cyBvY2N1ci4KICovCmNsYXNzIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107CiAgICB9CiAgICAvKioKICAgICAqIE5vdGlmeSBvdGhlciBpdGVtcyB0aGF0IHNlbGVjdGlvbiBmb3IgdGhlIGdpdmVuIG5hbWUgaGFzIGJlZW4gc2V0LgogICAgICogQHBhcmFtIHs/fSBpZCBJRCBvZiB0aGUgaXRlbS4KICAgICAqIEBwYXJhbSB7P30gbmFtZSBOYW1lIG9mIHRoZSBpdGVtLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbm90aWZ5KGlkLCBuYW1lKSB7CiAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7CiAgICAgICAgICAgIGxpc3RlbmVyKGlkLCBuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIExpc3RlbiBmb3IgZnV0dXJlIGNoYW5nZXMgdG8gaXRlbSBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgKiBAcmV0dXJuIHs/fSBGdW5jdGlvbiB1c2VkIHRvIGRlcmVnaXN0ZXIgbGlzdGVuZXIKICAgICAqLwogICAgbGlzdGVuKGxpc3RlbmVyKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOwogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlZ2lzdGVyZWQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZWdpc3RlcmVkKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXIgIT09IHJlZ2lzdGVyZWQ7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107CiAgICB9Cn0KVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlci7JtWZhYyA9IGZ1bmN0aW9uIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlcikoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlcigpOyB9LCB0b2tlbjogVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKY29uc3QgX2MwJDIgPSBbImNvbnRlbnRXcmFwcGVyIl07CmNvbnN0IF9jMSQyID0gWyIqIl07CmNvbnN0IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZID0gbmV3IEluamVjdGlvblRva2VuKCdWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWScpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9zY3JvbGxpbmcvZml4ZWQtc2l6ZS12aXJ0dWFsLXNjcm9sbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVmlydHVhbCBzY3JvbGxpbmcgc3RyYXRlZ3kgZm9yIGxpc3RzIHdpdGggaXRlbXMgb2Yga25vd24gZml4ZWQgc2l6ZS4KICovCmNsYXNzIEZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaXRlbVNpemUgVGhlIHNpemUgb2YgdGhlIGl0ZW1zIGluIHRoZSB2aXJ0dWFsbHkgc2Nyb2xsaW5nIGxpc3QuCiAgICAgKiBAcGFyYW0gez99IG1pbkJ1ZmZlclB4IFRoZSBtaW5pbXVtIGFtb3VudCBvZiBidWZmZXIgKGluIHBpeGVscykgYmVmb3JlIG5lZWRpbmcgdG8gcmVuZGVyIG1vcmUKICAgICAqIEBwYXJhbSB7P30gbWF4QnVmZmVyUHggVGhlIGFtb3VudCBvZiBidWZmZXIgKGluIHBpeGVscykgdG8gcmVuZGVyIHdoZW4gcmVuZGVyaW5nIG1vcmUuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGl0ZW1TaXplLCBtaW5CdWZmZXJQeCwgbWF4QnVmZmVyUHgpIHsKICAgICAgICB0aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFZpcnR1YWxTY3JvbGxTdHJhdGVneS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnNjcm9sbGVkSW5kZXhDaGFuZ2UgPSB0aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGF0dGFjaGVkIHZpZXdwb3J0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3ZpZXdwb3J0ID0gbnVsbDsKICAgICAgICB0aGlzLl9pdGVtU2l6ZSA9IGl0ZW1TaXplOwogICAgICAgIHRoaXMuX21pbkJ1ZmZlclB4ID0gbWluQnVmZmVyUHg7CiAgICAgICAgdGhpcy5fbWF4QnVmZmVyUHggPSBtYXhCdWZmZXJQeDsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgdGhpcyBzY3JvbGwgc3RyYXRlZ3kgdG8gYSB2aWV3cG9ydC4KICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnQgVGhlIHZpZXdwb3J0IHRvIGF0dGFjaCB0aGlzIHN0cmF0ZWd5IHRvLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoKHZpZXdwb3J0KSB7CiAgICAgICAgdGhpcy5fdmlld3BvcnQgPSB2aWV3cG9ydDsKICAgICAgICB0aGlzLl91cGRhdGVUb3RhbENvbnRlbnRTaXplKCk7CiAgICAgICAgdGhpcy5fdXBkYXRlUmVuZGVyZWRSYW5nZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyB0aGlzIHNjcm9sbCBzdHJhdGVneSBmcm9tIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgdmlld3BvcnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2goKSB7CiAgICAgICAgdGhpcy5fc2Nyb2xsZWRJbmRleENoYW5nZS5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0ID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIHRoZSBpdGVtIHNpemUgYW5kIGJ1ZmZlciBzaXplLgogICAgICogQHBhcmFtIHs/fSBpdGVtU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgaXRlbXMgaW4gdGhlIHZpcnR1YWxseSBzY3JvbGxpbmcgbGlzdC4KICAgICAqIEBwYXJhbSB7P30gbWluQnVmZmVyUHggVGhlIG1pbmltdW0gYW1vdW50IG9mIGJ1ZmZlciAoaW4gcGl4ZWxzKSBiZWZvcmUgbmVlZGluZyB0byByZW5kZXIgbW9yZQogICAgICogQHBhcmFtIHs/fSBtYXhCdWZmZXJQeCBUaGUgYW1vdW50IG9mIGJ1ZmZlciAoaW4gcGl4ZWxzKSB0byByZW5kZXIgd2hlbiByZW5kZXJpbmcgbW9yZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVwZGF0ZUl0ZW1BbmRCdWZmZXJTaXplKGl0ZW1TaXplLCBtaW5CdWZmZXJQeCwgbWF4QnVmZmVyUHgpIHsKICAgICAgICBpZiAobWF4QnVmZmVyUHggPCBtaW5CdWZmZXJQeCkgewogICAgICAgICAgICB0aHJvdyBFcnJvcignQ0RLIHZpcnR1YWwgc2Nyb2xsOiBtYXhCdWZmZXJQeCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5CdWZmZXJQeCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pdGVtU2l6ZSA9IGl0ZW1TaXplOwogICAgICAgIHRoaXMuX21pbkJ1ZmZlclB4ID0gbWluQnVmZmVyUHg7CiAgICAgICAgdGhpcy5fbWF4QnVmZmVyUHggPSBtYXhCdWZmZXJQeDsKICAgICAgICB0aGlzLl91cGRhdGVUb3RhbENvbnRlbnRTaXplKCk7CiAgICAgICAgdGhpcy5fdXBkYXRlUmVuZGVyZWRSYW5nZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFZpcnR1YWxTY3JvbGxTdHJhdGVneS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uQ29udGVudFNjcm9sbGVkKCkgewogICAgICAgIHRoaXMuX3VwZGF0ZVJlbmRlcmVkUmFuZ2UoKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUgSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRhdGFMZW5ndGhDaGFuZ2VkKCkgewogICAgICAgIHRoaXMuX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKTsKICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgVmlydHVhbFNjcm9sbFN0cmF0ZWd5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Db250ZW50UmVuZGVyZWQoKSB7IH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUgSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblJlbmRlcmVkT2Zmc2V0Q2hhbmdlZCgpIHsgfQogICAgLyoqCiAgICAgKiBTY3JvbGwgdG8gdGhlIG9mZnNldCBmb3IgdGhlIGdpdmVuIGluZGV4LgogICAgICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIHRvLgogICAgICogQHBhcmFtIHs/fSBiZWhhdmlvciBUaGUgU2Nyb2xsQmVoYXZpb3IgdG8gdXNlIHdoZW4gc2Nyb2xsaW5nLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IpIHsKICAgICAgICBpZiAodGhpcy5fdmlld3BvcnQpIHsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnQuc2Nyb2xsVG9PZmZzZXQoaW5kZXggKiB0aGlzLl9pdGVtU2l6ZSwgYmVoYXZpb3IpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIHRoZSB2aWV3cG9ydCdzIHRvdGFsIGNvbnRlbnQgc2l6ZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVG90YWxDb250ZW50U2l6ZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdmlld3BvcnQuc2V0VG90YWxDb250ZW50U2l6ZSh0aGlzLl92aWV3cG9ydC5nZXREYXRhTGVuZ3RoKCkgKiB0aGlzLl9pdGVtU2l6ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSB0aGUgdmlld3BvcnQncyByZW5kZXJlZCByYW5nZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlUmVuZGVyZWRSYW5nZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMuX3ZpZXdwb3J0Lm1lYXN1cmVTY3JvbGxPZmZzZXQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlSW5kZXggPSBzY3JvbGxPZmZzZXQgLyB0aGlzLl9pdGVtU2l6ZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZWRSYW5nZSA9IHRoaXMuX3ZpZXdwb3J0LmdldFJlbmRlcmVkUmFuZ2UoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB7IHN0YXJ0OiByZW5kZXJlZFJhbmdlLnN0YXJ0LCBlbmQ6IHJlbmRlcmVkUmFuZ2UuZW5kIH07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMuX3ZpZXdwb3J0LmdldFZpZXdwb3J0U2l6ZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gdGhpcy5fdmlld3BvcnQuZ2V0RGF0YUxlbmd0aCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFydEJ1ZmZlciA9IHNjcm9sbE9mZnNldCAtIG5ld1JhbmdlLnN0YXJ0ICogdGhpcy5faXRlbVNpemU7CiAgICAgICAgaWYgKHN0YXJ0QnVmZmVyIDwgdGhpcy5fbWluQnVmZmVyUHggJiYgbmV3UmFuZ2Uuc3RhcnQgIT0gMCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4cGFuZFN0YXJ0ID0gTWF0aC5jZWlsKCh0aGlzLl9tYXhCdWZmZXJQeCAtIHN0YXJ0QnVmZmVyKSAvIHRoaXMuX2l0ZW1TaXplKTsKICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnQgPSBNYXRoLm1heCgwLCBuZXdSYW5nZS5zdGFydCAtIGV4cGFuZFN0YXJ0KTsKICAgICAgICAgICAgbmV3UmFuZ2UuZW5kID0gTWF0aC5taW4oZGF0YUxlbmd0aCwgTWF0aC5jZWlsKGZpcnN0VmlzaWJsZUluZGV4ICsgKHZpZXdwb3J0U2l6ZSArIHRoaXMuX21pbkJ1ZmZlclB4KSAvIHRoaXMuX2l0ZW1TaXplKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZEJ1ZmZlciA9IG5ld1JhbmdlLmVuZCAqIHRoaXMuX2l0ZW1TaXplIC0gKHNjcm9sbE9mZnNldCArIHZpZXdwb3J0U2l6ZSk7CiAgICAgICAgICAgIGlmIChlbmRCdWZmZXIgPCB0aGlzLl9taW5CdWZmZXJQeCAmJiBuZXdSYW5nZS5lbmQgIT0gZGF0YUxlbmd0aCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXhwYW5kRW5kID0gTWF0aC5jZWlsKCh0aGlzLl9tYXhCdWZmZXJQeCAtIGVuZEJ1ZmZlcikgLyB0aGlzLl9pdGVtU2l6ZSk7CiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kRW5kID4gMCkgewogICAgICAgICAgICAgICAgICAgIG5ld1JhbmdlLmVuZCA9IE1hdGgubWluKGRhdGFMZW5ndGgsIG5ld1JhbmdlLmVuZCArIGV4cGFuZEVuZCk7CiAgICAgICAgICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGZpcnN0VmlzaWJsZUluZGV4IC0gdGhpcy5fbWluQnVmZmVyUHggLyB0aGlzLl9pdGVtU2l6ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ZpZXdwb3J0LnNldFJlbmRlcmVkUmFuZ2UobmV3UmFuZ2UpOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0LnNldFJlbmRlcmVkQ29udGVudE9mZnNldCh0aGlzLl9pdGVtU2l6ZSAqIG5ld1JhbmdlLnN0YXJ0KTsKICAgICAgICB0aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlLm5leHQoTWF0aC5mbG9vcihmaXJzdFZpc2libGVJbmRleCkpOwogICAgfQp9Ci8qKgogKiBQcm92aWRlciBmYWN0b3J5IGZvciBgRml4ZWRTaXplVmlydHVhbFNjcm9sbFN0cmF0ZWd5YCB0aGF0IHNpbXBseSBleHRyYWN0cyB0aGUgYWxyZWFkeSBjcmVhdGVkCiAqIGBGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lgIGZyb20gdGhlIGdpdmVuIGRpcmVjdGl2ZS4KICogQHBhcmFtIHs/fSBmaXhlZFNpemVEaXIgVGhlIGluc3RhbmNlIG9mIGBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsYCB0byBleHRyYWN0IHRoZQogKiAgICAgYEZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneWAgZnJvbS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9maXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KGZpeGVkU2l6ZURpcikgewogICAgcmV0dXJuIGZpeGVkU2l6ZURpci5fc2Nyb2xsU3RyYXRlZ3k7Cn0KLyoqCiAqIEEgdmlydHVhbCBzY3JvbGwgc3RyYXRlZ3kgdGhhdCBzdXBwb3J0cyBmaXhlZC1zaXplIGl0ZW1zLgogKi8KY2xhc3MgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9pdGVtU2l6ZSA9IDIwOwogICAgICAgIHRoaXMuX21pbkJ1ZmZlclB4ID0gMTAwOwogICAgICAgIHRoaXMuX21heEJ1ZmZlclB4ID0gMjAwOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzY3JvbGwgc3RyYXRlZ3kgdXNlZCBieSB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneSA9IG5ldyBGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kodGhpcy5pdGVtU2l6ZSwgdGhpcy5taW5CdWZmZXJQeCwgdGhpcy5tYXhCdWZmZXJQeCk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBzaXplIG9mIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCAoaW4gcGl4ZWxzKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBpdGVtU2l6ZSgpIHsgcmV0dXJuIHRoaXMuX2l0ZW1TaXplOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBpdGVtU2l6ZSh2YWx1ZSkgeyB0aGlzLl9pdGVtU2l6ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsgfQogICAgLyoqCiAgICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgYnVmZmVyIHJlbmRlcmVkIGJleW9uZCB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuCiAgICAgKiBJZiB0aGUgYW1vdW50IG9mIGJ1ZmZlciBkaXBzIGJlbG93IHRoaXMgbnVtYmVyLCBtb3JlIGl0ZW1zIHdpbGwgYmUgcmVuZGVyZWQuIERlZmF1bHRzIHRvIDEwMHB4LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG1pbkJ1ZmZlclB4KCkgeyByZXR1cm4gdGhpcy5fbWluQnVmZmVyUHg7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG1pbkJ1ZmZlclB4KHZhbHVlKSB7IHRoaXMuX21pbkJ1ZmZlclB4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpOyB9CiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHdvcnRoIG9mIGJ1ZmZlciB0byByZW5kZXIgZm9yIHdoZW4gcmVuZGVyaW5nIG5ldyBpdGVtcy4gRGVmYXVsdHMgdG8gMjAwcHguCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbWF4QnVmZmVyUHgoKSB7IHJldHVybiB0aGlzLl9tYXhCdWZmZXJQeDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbWF4QnVmZmVyUHgodmFsdWUpIHsgdGhpcy5fbWF4QnVmZmVyUHggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoKSB7CiAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kudXBkYXRlSXRlbUFuZEJ1ZmZlclNpemUodGhpcy5pdGVtU2l6ZSwgdGhpcy5taW5CdWZmZXJQeCwgdGhpcy5tYXhCdWZmZXJQeCk7CiAgICB9Cn0KQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbC7JtWZhYyA9IGZ1bmN0aW9uIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCkoKTsgfTsKQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsLCBzZWxlY3RvcnM6IFtbImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCIsICJpdGVtU2l6ZSIsICIiXV0sIGlucHV0czogeyBpdGVtU2l6ZTogIml0ZW1TaXplIiwgbWluQnVmZmVyUHg6ICJtaW5CdWZmZXJQeCIsIG1heEJ1ZmZlclB4OiAibWF4QnVmZmVyUHgiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sKICAgICAgICAgICAgICAgIHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLAogICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogX2ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneUZhY3RvcnksCiAgICAgICAgICAgICAgICBkZXBzOiBbZm9yd2FyZFJlZigoIC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8oKSA9PiBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsKSldCiAgICAgICAgICAgIH1dKSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CkNka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwucHJvcERlY29yYXRvcnMgPSB7CiAgICBpdGVtU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBtaW5CdWZmZXJQeDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBtYXhCdWZmZXJQeDogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3Njcm9sbC1kaXNwYXRjaGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaW1lIGluIG1zIHRvIHRocm90dGxlIHRoZSBzY3JvbGxpbmcgZXZlbnRzIGJ5IGRlZmF1bHQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgREVGQVVMVF9TQ1JPTExfVElNRSA9IDIwOwovKioKICogU2VydmljZSBjb250YWluZWQgYWxsIHJlZ2lzdGVyZWQgU2Nyb2xsYWJsZSByZWZlcmVuY2VzIGFuZCBlbWl0cyBhbiBldmVudCB3aGVuIGFueSBvbmUgb2YgdGhlCiAqIFNjcm9sbGFibGUgcmVmZXJlbmNlcyBlbWl0IGEgc2Nyb2xsZWQgZXZlbnQuCiAqLwpjbGFzcyBTY3JvbGxEaXNwYXRjaGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICogQHBhcmFtIHs/PX0gZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoX25nWm9uZSwgX3BsYXRmb3JtLCAKICAgIC8qKiBAYnJlYWtpbmctY2hhbmdlIDExLjAuMCBtYWtlIGRvY3VtZW50IHJlcXVpcmVkICovCiAgICBkb2N1bWVudCkgewogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgLyoqCiAgICAgICAgICogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoYXQgYSByZWdpc3RlcmVkIHNjcm9sbGFibGUgcmVmZXJlbmNlIGVsZW1lbnQgaGFzIGJlZW4gc2Nyb2xsZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc2Nyb2xsZWQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBnbG9iYWwgYHNjcm9sbGAgYW5kIGByZXNpemVgIHN1YnNjcmlwdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgYW1vdW50IG9mIHN1YnNjcmlwdGlvbnMgdG8gYHNjcm9sbGVkYC4gVXNlZCBmb3IgY2xlYW5pbmcgdXAgYWZ0ZXJ3YXJkcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zY3JvbGxlZENvdW50ID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBNYXAgb2YgYWxsIHRoZSBzY3JvbGxhYmxlIHJlZmVyZW5jZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2aWNlIGFuZCB0aGVpcgogICAgICAgICAqIHNjcm9sbCBldmVudCBzdWJzY3JpcHRpb25zLgogICAgICAgICAqLwogICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVycyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBzY3JvbGxhYmxlIGluc3RhbmNlIHdpdGggdGhlIHNlcnZpY2UgYW5kIGxpc3RlbnMgZm9yIGl0cyBzY3JvbGxlZCBldmVudHMuIFdoZW4gdGhlCiAgICAgKiBzY3JvbGxhYmxlIGlzIHNjcm9sbGVkLCB0aGUgc2VydmljZSBlbWl0cyB0aGUgZXZlbnQgdG8gaXRzIHNjcm9sbGVkIG9ic2VydmFibGUuCiAgICAgKiBAcGFyYW0gez99IHNjcm9sbGFibGUgU2Nyb2xsYWJsZSBpbnN0YW5jZSB0byBiZSByZWdpc3RlcmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXIoc2Nyb2xsYWJsZSkgewogICAgICAgIGlmICghdGhpcy5zY3JvbGxDb250YWluZXJzLmhhcyhzY3JvbGxhYmxlKSkgewogICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lcnMuc2V0KHNjcm9sbGFibGUsIHNjcm9sbGFibGUuZWxlbWVudFNjcm9sbGVkKCkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2Nyb2xsZWQubmV4dChzY3JvbGxhYmxlKSkpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERlcmVnaXN0ZXJzIGEgU2Nyb2xsYWJsZSByZWZlcmVuY2UgYW5kIHVuc3Vic2NyaWJlcyBmcm9tIGl0cyBzY3JvbGwgZXZlbnQgb2JzZXJ2YWJsZS4KICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZSBTY3JvbGxhYmxlIGluc3RhbmNlIHRvIGJlIGRlcmVnaXN0ZXJlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlcmVnaXN0ZXIoc2Nyb2xsYWJsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY3JvbGxhYmxlUmVmZXJlbmNlID0gdGhpcy5zY3JvbGxDb250YWluZXJzLmdldChzY3JvbGxhYmxlKTsKICAgICAgICBpZiAoc2Nyb2xsYWJsZVJlZmVyZW5jZSkgewogICAgICAgICAgICBzY3JvbGxhYmxlUmVmZXJlbmNlLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVycy5kZWxldGUoc2Nyb2xsYWJsZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyBhbiBldmVudCB3aGVuZXZlciBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgU2Nyb2xsYWJsZQogICAgICogcmVmZXJlbmNlcyAob3Igd2luZG93LCBkb2N1bWVudCwgb3IgYm9keSkgZmlyZSBhIHNjcm9sbGVkIGV2ZW50LiBDYW4gcHJvdmlkZSBhIHRpbWUgaW4gbXMKICAgICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICJ0aHJvdHRsZSIgdGltZS4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogaW4gb3JkZXIgdG8gYXZvaWQgaGl0dGluZyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciBldmVyeSBzY3JvbGwgZXZlbnQsCiAgICAgKiBhbGwgb2YgdGhlIGV2ZW50cyBlbWl0dGVkIGZyb20gdGhpcyBzdHJlYW0gd2lsbCBiZSBydW4gb3V0c2lkZSB0aGUgQW5ndWxhciB6b25lLgogICAgICogSWYgeW91IG5lZWQgdG8gdXBkYXRlIGFueSBkYXRhIGJpbmRpbmdzIGFzIGEgcmVzdWx0IG9mIGEgc2Nyb2xsIGV2ZW50LCB5b3UgaGF2ZQogICAgICogdG8gcnVuIHRoZSBjYWxsYmFjayB1c2luZyBgTmdab25lLnJ1bmAuCiAgICAgKiBAcGFyYW0gez89fSBhdWRpdFRpbWVJbk1zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzY3JvbGxlZChhdWRpdFRpbWVJbk1zID0gREVGQVVMVF9TQ1JPTExfVElNRSkgewogICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgIHJldHVybiBvZigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChvYnNlcnZlcikgPT4gewogICAgICAgICAgICBpZiAoIXRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fYWRkR2xvYmFsTGlzdGVuZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIDBtcyBkZWxheSwgdXNlIGFuIG9ic2VydmFibGUgd2l0aG91dCBhdWRpdFRpbWUKICAgICAgICAgICAgLy8gc2luY2UgaXQgZG9lcyBhZGQgYSBwZXJjZXB0aWJsZSBkZWxheSBpbiBwcm9jZXNzaW5nIG92ZXJoZWFkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGF1ZGl0VGltZUluTXMgPiAwID8KICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkLnBpcGUoYXVkaXRUaW1lKGF1ZGl0VGltZUluTXMpKS5zdWJzY3JpYmUob2JzZXJ2ZXIpIDoKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkLnN1YnNjcmliZShvYnNlcnZlcik7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkQ291bnQrKzsKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsZWRDb3VudC0tOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zY3JvbGxlZENvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpOwogICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKF8sIGNvbnRhaW5lcikgPT4gdGhpcy5kZXJlZ2lzdGVyKGNvbnRhaW5lcikpKTsKICAgICAgICB0aGlzLl9zY3JvbGxlZC5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuZXZlciBhbnkgb2YgdGhlCiAgICAgKiBzY3JvbGxhYmxlIGFuY2VzdG9ycyBvZiBhbiBlbGVtZW50IGFyZSBzY3JvbGxlZC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZiBFbGVtZW50IHdob3NlIGFuY2VzdG9ycyB0byBsaXN0ZW4gZm9yLgogICAgICogQHBhcmFtIHs/PX0gYXVkaXRUaW1lSW5NcyBUaW1lIHRvIHRocm90dGxlIHRoZSBzY3JvbGwgZXZlbnRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYW5jZXN0b3JTY3JvbGxlZChlbGVtZW50UmVmLCBhdWRpdFRpbWVJbk1zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuY2VzdG9ycyA9IHRoaXMuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKGVsZW1lbnRSZWYpOwogICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVkKGF1ZGl0VGltZUluTXMpLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0ID0+IHsKICAgICAgICAgICAgcmV0dXJuICF0YXJnZXQgfHwgYW5jZXN0b3JzLmluZGV4T2YodGFyZ2V0KSA+IC0xOwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgU2Nyb2xsYWJsZXMgdGhhdCBjb250YWluIHRoZSBwcm92aWRlZCBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRBbmNlc3RvclNjcm9sbENvbnRhaW5lcnMoZWxlbWVudFJlZikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY3JvbGxpbmdDb250YWluZXJzID0gW107CiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3N1YnNjcmlwdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKF9zdWJzY3JpcHRpb24sIHNjcm9sbGFibGUpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Njcm9sbGFibGVDb250YWluc0VsZW1lbnQoc2Nyb2xsYWJsZSwgZWxlbWVudFJlZikpIHsKICAgICAgICAgICAgICAgIHNjcm9sbGluZ0NvbnRhaW5lcnMucHVzaChzY3JvbGxhYmxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gc2Nyb2xsaW5nQ29udGFpbmVyczsKICAgIH0KICAgIC8qKgogICAgICogQWNjZXNzIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgZG9jdW1lbnQgcmVmZXJlbmNlCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldERvY3VtZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9kb2N1bWVudCB8fCBkb2N1bWVudDsKICAgIH0KICAgIC8qKgogICAgICogVXNlIGRlZmF1bHRWaWV3IG9mIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgd2luZG93IHJlZmVyZW5jZQogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRXaW5kb3coKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBjb250YWluZWQgd2l0aGluIHRoZSBwcm92aWRlZCBTY3JvbGxhYmxlLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudChzY3JvbGxhYmxlLCBlbGVtZW50UmVmKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBlbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2Nyb2xsYWJsZUVsZW1lbnQgPSBzY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50OwogICAgICAgIC8vIFRyYXZlcnNlIHRocm91Z2ggdGhlIGVsZW1lbnQgcGFyZW50cyB1bnRpbCB3ZSByZWFjaCBudWxsLCBjaGVja2luZyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzCiAgICAgICAgLy8gYXJlIHRoZSBzY3JvbGxhYmxlJ3MgZWxlbWVudC4KICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IHNjcm9sbGFibGVFbGVtZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpLnBhcmVudEVsZW1lbnQpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB1cCB0aGUgZ2xvYmFsIHNjcm9sbCBsaXN0ZW5lcnMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZEdsb2JhbExpc3RlbmVyKCkgewogICAgICAgIHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbiA9IHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7CiAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQod2luZG93LmRvY3VtZW50LCAnc2Nyb2xsJykuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX3Njcm9sbGVkLm5leHQoKSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYW5zIHVwIHRoZSBnbG9iYWwgc2Nyb2xsIGxpc3RlbmVyLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpIHsKICAgICAgICBpZiAodGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgIH0KICAgIH0KfQpTY3JvbGxEaXNwYXRjaGVyLsm1ZmFjID0gZnVuY3Rpb24gU2Nyb2xsRGlzcGF0Y2hlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTY3JvbGxEaXNwYXRjaGVyKSjJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovClNjcm9sbERpc3BhdGNoZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFNjcm9sbERpc3BhdGNoZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBTY3JvbGxEaXNwYXRjaGVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgU2Nyb2xsRGlzcGF0Y2hlcijJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfSwgdG9rZW46IFNjcm9sbERpc3BhdGNoZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3Njcm9sbGFibGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFNlbmRzIGFuIGV2ZW50IHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaXMgc2Nyb2xsZWQuIFJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUKICogU2Nyb2xsRGlzcGF0Y2hlciBzZXJ2aWNlIHRvIGluY2x1ZGUgaXRzZWxmIGFzIHBhcnQgb2YgaXRzIGNvbGxlY3Rpb24gb2Ygc2Nyb2xsaW5nIGV2ZW50cyB0aGF0IGl0CiAqIGNhbiBiZSBsaXN0ZW5lZCB0byB0aHJvdWdoIHRoZSBzZXJ2aWNlLgogKi8KY2xhc3MgQ2RrU2Nyb2xsYWJsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBzY3JvbGxEaXNwYXRjaGVyCiAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICogQHBhcmFtIHs/PX0gZGlyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIHNjcm9sbERpc3BhdGNoZXIsIG5nWm9uZSwgZGlyKSB7CiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXIgPSBzY3JvbGxEaXNwYXRjaGVyOwogICAgICAgIHRoaXMubmdab25lID0gbmdab25lOwogICAgICAgIHRoaXMuZGlyID0gZGlyOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgdGhpcy5fZWxlbWVudFNjcm9sbGVkID0gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChvYnNlcnZlcikgPT4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gZnJvbUV2ZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJykucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkKICAgICAgICAgICAgLnN1YnNjcmliZShvYnNlcnZlcikpKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXIucmVnaXN0ZXIodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuc2Nyb2xsRGlzcGF0Y2hlci5kZXJlZ2lzdGVyKHRoaXMpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gYSBzY3JvbGwgZXZlbnQgaXMgZmlyZWQgb24gdGhlIGhvc3QgZWxlbWVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVsZW1lbnRTY3JvbGxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFNjcm9sbGVkOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBFbGVtZW50UmVmIGZvciB0aGUgdmlld3BvcnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRFbGVtZW50UmVmKCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWY7CiAgICB9CiAgICAvKioKICAgICAqIFNjcm9sbHMgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXRzLiBUaGlzIGlzIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNjcm9sbFRvCiAgICAgKiBtZXRob2QsIHNpbmNlIGJyb3dzZXJzIGFyZSBub3QgY29uc2lzdGVudCBhYm91dCB3aGF0IHNjcm9sbExlZnQgbWVhbnMgaW4gUlRMLiBGb3IgdGhpcyBtZXRob2QKICAgICAqIGxlZnQgYW5kIHJpZ2h0IGFsd2F5cyByZWZlciB0byB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgc2Nyb2xsaW5nIGNvbnRhaW5lciBpcnJlc3BlY3RpdmUKICAgICAqIG9mIHRoZSBsYXlvdXQgZGlyZWN0aW9uLiBzdGFydCBhbmQgZW5kIHJlZmVyIHRvIGxlZnQgYW5kIHJpZ2h0IGluIGFuIExUUiBjb250ZXh0IGFuZCB2aWNlLXZlcnNhCiAgICAgKiBpbiBhbiBSVEwgY29udGV4dC4KICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucyBzcGVjaWZpZWQgdGhlIG9mZnNldHMgdG8gc2Nyb2xsIHRvLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2Nyb2xsVG8ob3B0aW9ucykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1J0bCA9IHRoaXMuZGlyICYmIHRoaXMuZGlyLnZhbHVlID09ICdydGwnOwogICAgICAgIC8vIFJld3JpdGUgc3RhcnQgJiBlbmQgb2Zmc2V0cyBhcyByaWdodCBvciBsZWZ0IG9mZnNldHMuCiAgICAgICAgaWYgKG9wdGlvbnMubGVmdCA9PSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnMubGVmdCA9IGlzUnRsID8gb3B0aW9ucy5lbmQgOiBvcHRpb25zLnN0YXJ0OwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5yaWdodCA9PSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnMucmlnaHQgPSBpc1J0bCA/IG9wdGlvbnMuc3RhcnQgOiBvcHRpb25zLmVuZDsKICAgICAgICB9CiAgICAgICAgLy8gUmV3cml0ZSB0aGUgYm90dG9tIG9mZnNldCBhcyBhIHRvcCBvZmZzZXQuCiAgICAgICAgaWYgKG9wdGlvbnMuYm90dG9tICE9IG51bGwpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpLnRvcCA9CiAgICAgICAgICAgICAgICBlbC5zY3JvbGxIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQgLSBvcHRpb25zLmJvdHRvbTsKICAgICAgICB9CiAgICAgICAgLy8gUmV3cml0ZSB0aGUgcmlnaHQgb2Zmc2V0IGFzIGEgbGVmdCBvZmZzZXQuCiAgICAgICAgaWYgKGlzUnRsICYmIGdldFJ0bFNjcm9sbEF4aXNUeXBlKCkgIT0gMCAvKiBOT1JNQUwgKi8pIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVmdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSkucmlnaHQgPQogICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbFdpZHRoIC0gZWwuY2xpZW50V2lkdGggLSBvcHRpb25zLmxlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdldFJ0bFNjcm9sbEF4aXNUeXBlKCkgPT0gMiAvKiBJTlZFUlRFRCAqLykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5sZWZ0ID0gb3B0aW9ucy5yaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChnZXRSdGxTY3JvbGxBeGlzVHlwZSgpID09IDEgLyogTkVHQVRFRCAqLykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5sZWZ0ID0gb3B0aW9ucy5yaWdodCA/IC1vcHRpb25zLnJpZ2h0IDogb3B0aW9ucy5yaWdodDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmlnaHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpLmxlZnQgPQogICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbFdpZHRoIC0gZWwuY2xpZW50V2lkdGggLSBvcHRpb25zLnJpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2FwcGx5U2Nyb2xsVG9PcHRpb25zKG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlTY3JvbGxUb09wdGlvbnMob3B0aW9ucykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHsKICAgICAgICAgICAgZWwuc2Nyb2xsVG8ob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAob3B0aW9ucy50b3AgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZWwuc2Nyb2xsVG9wID0gb3B0aW9ucy50b3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVmdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBlbC5zY3JvbGxMZWZ0ID0gb3B0aW9ucy5sZWZ0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNZWFzdXJlcyB0aGUgc2Nyb2xsIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGVkZ2Ugb2YgdGhlIHZpZXdwb3J0LiBUaGlzIG1ldGhvZCBjYW4gYmUKICAgICAqIHVzZWQgaW5zdGVhZCBvZiBkaXJlY3RseSBjaGVja2luZyBzY3JvbGxMZWZ0IG9yIHNjcm9sbFRvcCwgc2luY2UgYnJvd3NlcnMgYXJlIG5vdCBjb25zaXN0ZW50CiAgICAgKiBhYm91dCB3aGF0IHNjcm9sbExlZnQgbWVhbnMgaW4gUlRMLiBUaGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGFyZSBub3JtYWxpemVkIHN1Y2ggdGhhdAogICAgICogbGVmdCBhbmQgcmlnaHQgYWx3YXlzIHJlZmVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBzY3JvbGxpbmcgY29udGFpbmVyIGlycmVzcGVjdGl2ZQogICAgICogb2YgdGhlIGxheW91dCBkaXJlY3Rpb24uIHN0YXJ0IGFuZCBlbmQgcmVmZXIgdG8gbGVmdCBhbmQgcmlnaHQgaW4gYW4gTFRSIGNvbnRleHQgYW5kIHZpY2UtdmVyc2EKICAgICAqIGluIGFuIFJUTCBjb250ZXh0LgogICAgICogQHBhcmFtIHs/fSBmcm9tIFRoZSBlZGdlIHRvIG1lYXN1cmUgZnJvbS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1lYXN1cmVTY3JvbGxPZmZzZXQoZnJvbSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBMRUZUID0gJ2xlZnQnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBSSUdIVCA9ICdyaWdodCc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgaWYgKGZyb20gPT0gJ3RvcCcpIHsKICAgICAgICAgICAgcmV0dXJuIGVsLnNjcm9sbFRvcDsKICAgICAgICB9CiAgICAgICAgaWYgKGZyb20gPT0gJ2JvdHRvbScpIHsKICAgICAgICAgICAgcmV0dXJuIGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodCAtIGVsLnNjcm9sbFRvcDsKICAgICAgICB9CiAgICAgICAgLy8gUmV3cml0ZSBzdGFydCAmIGVuZCBhcyBsZWZ0IG9yIHJpZ2h0IG9mZnNldHMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzUnRsID0gdGhpcy5kaXIgJiYgdGhpcy5kaXIudmFsdWUgPT0gJ3J0bCc7CiAgICAgICAgaWYgKGZyb20gPT0gJ3N0YXJ0JykgewogICAgICAgICAgICBmcm9tID0gaXNSdGwgPyBSSUdIVCA6IExFRlQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZyb20gPT0gJ2VuZCcpIHsKICAgICAgICAgICAgZnJvbSA9IGlzUnRsID8gTEVGVCA6IFJJR0hUOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSdGwgJiYgZ2V0UnRsU2Nyb2xsQXhpc1R5cGUoKSA9PSAyIC8qIElOVkVSVEVEICovKSB7CiAgICAgICAgICAgIC8vIEZvciBJTlZFUlRFRCwgc2Nyb2xsTGVmdCBpcyAoc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSBsZWZ0IGFuZAogICAgICAgICAgICAvLyAwIHdoZW4gc2Nyb2xsZWQgYWxsIHRoZSB3YXkgcmlnaHQuCiAgICAgICAgICAgIGlmIChmcm9tID09IExFRlQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlbC5zY3JvbGxXaWR0aCAtIGVsLmNsaWVudFdpZHRoIC0gZWwuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBlbC5zY3JvbGxMZWZ0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzUnRsICYmIGdldFJ0bFNjcm9sbEF4aXNUeXBlKCkgPT0gMSAvKiBORUdBVEVEICovKSB7CiAgICAgICAgICAgIC8vIEZvciBORUdBVEVELCBzY3JvbGxMZWZ0IGlzIC0oc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSBsZWZ0IGFuZAogICAgICAgICAgICAvLyAwIHdoZW4gc2Nyb2xsZWQgYWxsIHRoZSB3YXkgcmlnaHQuCiAgICAgICAgICAgIGlmIChmcm9tID09IExFRlQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlbC5zY3JvbGxMZWZ0ICsgZWwuc2Nyb2xsV2lkdGggLSBlbC5jbGllbnRXaWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAtZWwuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gRm9yIE5PUk1BTCwgYXMgd2VsbCBhcyBub24tUlRMIGNvbnRleHRzLCBzY3JvbGxMZWZ0IGlzIDAgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSBsZWZ0IGFuZAogICAgICAgICAgICAvLyAoc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSByaWdodC4KICAgICAgICAgICAgaWYgKGZyb20gPT0gTEVGVCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVsLnNjcm9sbExlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZWwuc2Nyb2xsV2lkdGggLSBlbC5jbGllbnRXaWR0aCAtIGVsLnNjcm9sbExlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KQ2RrU2Nyb2xsYWJsZS7JtWZhYyA9IGZ1bmN0aW9uIENka1Njcm9sbGFibGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrU2Nyb2xsYWJsZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChTY3JvbGxEaXNwYXRjaGVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSk7IH07CkNka1Njcm9sbGFibGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrU2Nyb2xsYWJsZSwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrLXNjcm9sbGFibGUiLCAiIl0sIFsiIiwgImNka1Njcm9sbGFibGUiLCAiIl1dIH0pOwovKiogQG5vY29sbGFwc2UgKi8KQ2RrU2Nyb2xsYWJsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBTY3JvbGxEaXNwYXRjaGVyIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9zY3JvbGxpbmcvdmlld3BvcnQtcnVsZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRpbWUgaW4gbXMgdG8gdGhyb3R0bGUgdGhlIHJlc2l6ZSBldmVudHMgYnkgZGVmYXVsdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBERUZBVUxUX1JFU0laRV9USU1FID0gMjA7Ci8qKgogKiBTaW1wbGUgdXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgYm91bmRzIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0LgogKiBcQGRvY3MtcHJpdmF0ZQogKi8KY2xhc3MgVmlld3BvcnRSdWxlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICogQHBhcmFtIHs/PX0gZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoX3BsYXRmb3JtLCBuZ1pvbmUsIAogICAgLyoqIEBicmVha2luZy1jaGFuZ2UgMTEuMC4wIG1ha2UgZG9jdW1lbnQgcmVxdWlyZWQgKi8KICAgIGRvY3VtZW50KSB7CiAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2UgPSBfcGxhdGZvcm0uaXNCcm93c2VyID8KICAgICAgICAgICAgICAgIG1lcmdlKGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKSwgZnJvbUV2ZW50KHdpbmRvdywgJ29yaWVudGF0aW9uY2hhbmdlJykpIDoKICAgICAgICAgICAgICAgIG9mKCk7CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGRvIHRoZSBzdWJzY3JpcHRpb24gaW5zaWRlIGBydW5PdXRzaWRlQW5ndWxhcmAKICAgICAgICAgICAgLy8gc2luY2Ugc3Vic2NyaWJpbmcgaXMgd2hhdCBjYXVzZXMgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGFkZGVkLgogICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlQ2FjaGUgPSB0aGlzLmNoYW5nZSgpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl91cGRhdGVWaWV3cG9ydFNpemUoKSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZUNhY2hlLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZpZXdwb3J0J3Mgd2lkdGggYW5kIGhlaWdodC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFZpZXdwb3J0U2l6ZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0U2l6ZSkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVWaWV3cG9ydFNpemUoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG91dHB1dCA9IHsgd2lkdGg6IHRoaXMuX3ZpZXdwb3J0U2l6ZS53aWR0aCwgaGVpZ2h0OiB0aGlzLl92aWV3cG9ydFNpemUuaGVpZ2h0IH07CiAgICAgICAgLy8gSWYgd2UncmUgbm90IG9uIGEgYnJvd3NlciwgZG9uJ3QgY2FjaGUgdGhlIHNpemUgc2luY2UgaXQnbGwgYmUgbW9ja2VkIG91dCBhbnl3YXkuCiAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRTaXplID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyBhIENsaWVudFJlY3QgZm9yIHRoZSB2aWV3cG9ydCdzIGJvdW5kcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFZpZXdwb3J0UmVjdCgpIHsKICAgICAgICAvLyBVc2UgdGhlIGRvY3VtZW50IGVsZW1lbnQncyBib3VuZGluZyByZWN0IHJhdGhlciB0aGFuIHRoZSB3aW5kb3cgc2Nyb2xsIHByb3BlcnRpZXMKICAgICAgICAvLyAoZS5nLiBwYWdlWU9mZnNldCwgc2Nyb2xsWSkgZHVlIHRvIGluIGlzc3VlIGluIENocm9tZSBhbmQgSUUgd2hlcmUgd2luZG93IHNjcm9sbAogICAgICAgIC8vIHByb3BlcnRpZXMgYW5kIGNsaWVudCBjb29yZGluYXRlcyAoYm91bmRpbmdDbGllbnRSZWN0LCBjbGllbnRYL1ksIGV0Yy4pIGFyZSBpbiBkaWZmZXJlbnQKICAgICAgICAvLyBjb25jZXB0dWFsIHZpZXdwb3J0cy4gVW5kZXIgbW9zdCBjaXJjdW1zdGFuY2VzIHRoZXNlIHZpZXdwb3J0cyBhcmUgZXF1aXZhbGVudCwgYnV0IHRoZXkKICAgICAgICAvLyBjYW4gZGlzYWdyZWUgd2hlbiB0aGUgcGFnZSBpcyBwaW5jaC16b29tZWQgKG9uIGRldmljZXMgdGhhdCBzdXBwb3J0IHRvdWNoKS4KICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDg5MjA2I2M0CiAgICAgICAgLy8gV2UgdXNlIHRoZSBkb2N1bWVudEVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgYm9keSBiZWNhdXNlLCBieSBkZWZhdWx0ICh3aXRob3V0IGEgY3NzIHJlc2V0KQogICAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBnaXZlIHRoZSBkb2N1bWVudCBib2R5IGFuIDhweCBtYXJnaW4sIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbgogICAgICAgIC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpOwogICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5nZXRWaWV3cG9ydFNpemUoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3A6IHNjcm9sbFBvc2l0aW9uLnRvcCwKICAgICAgICAgICAgbGVmdDogc2Nyb2xsUG9zaXRpb24ubGVmdCwKICAgICAgICAgICAgYm90dG9tOiBzY3JvbGxQb3NpdGlvbi50b3AgKyBoZWlnaHQsCiAgICAgICAgICAgIHJpZ2h0OiBzY3JvbGxQb3NpdGlvbi5sZWZ0ICsgd2lkdGgsCiAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgKHRvcCwgbGVmdCkgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSB2aWV3cG9ydC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKSB7CiAgICAgICAgLy8gV2hpbGUgd2UgY2FuIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZmFrZSBkb2N1bWVudAogICAgICAgIC8vIGR1cmluZyBTU1IsIGl0IGRvZXNuJ3QgaGF2ZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QuCiAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgfQogICAgICAgIC8vIFRoZSB0b3AtbGVmdC1jb3JuZXIgb2YgdGhlIHZpZXdwb3J0IGlzIGRldGVybWluZWQgYnkgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZG9jdW1lbnQKICAgICAgICAvLyBib2R5LCBub3JtYWxseSBqdXN0IChzY3JvbGxMZWZ0LCBzY3JvbGxUb3ApLiBIb3dldmVyLCBDaHJvbWUgYW5kIEZpcmVmb3ggZGlzYWdyZWUgYWJvdXQKICAgICAgICAvLyB3aGV0aGVyIGBkb2N1bWVudC5ib2R5YCBvciBgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50YCBpcyB0aGUgc2Nyb2xsZWQgZWxlbWVudCwgc28gcmVhZGluZwogICAgICAgIC8vIGBzY3JvbGxUb3BgIGFuZCBgc2Nyb2xsTGVmdGAgaXMgaW5jb25zaXN0ZW50LiBIb3dldmVyLCB1c2luZyB0aGUgYm91bmRpbmcgcmVjdCBvZgogICAgICAgIC8vIGBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRgIHdvcmtzIGNvbnNpc3RlbnRseSwgd2hlcmUgdGhlIGB0b3BgIGFuZCBgbGVmdGAgdmFsdWVzIHdpbGwKICAgICAgICAvLyBlcXVhbCBuZWdhdGl2ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRvY3VtZW50UmVjdCA9IGRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9wID0gLWRvY3VtZW50UmVjdC50b3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgd2luZG93LnNjcm9sbFkgfHwKICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsZWZ0ID0gLWRvY3VtZW50UmVjdC5sZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCB8fCB3aW5kb3cuc2Nyb2xsWCB8fAogICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOwogICAgICAgIHJldHVybiB7IHRvcCwgbGVmdCB9OwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIHRoYXQgZW1pdHMgd2hlbmV2ZXIgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0IGNoYW5nZXMuCiAgICAgKiBAcGFyYW0gez89fSB0aHJvdHRsZVRpbWUgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgdGhlIHN0cmVhbS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNoYW5nZSh0aHJvdHRsZVRpbWUgPSBERUZBVUxUX1JFU0laRV9USU1FKSB7CiAgICAgICAgcmV0dXJuIHRocm90dGxlVGltZSA+IDAgPyB0aGlzLl9jaGFuZ2UucGlwZShhdWRpdFRpbWUodGhyb3R0bGVUaW1lKSkgOiB0aGlzLl9jaGFuZ2U7CiAgICB9CiAgICAvKioKICAgICAqIEFjY2VzcyBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIGRvY3VtZW50IHJlZmVyZW5jZQogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXREb2N1bWVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0V2luZG93KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2MgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBjYWNoZWQgdmlld3BvcnQgc2l6ZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmlld3BvcnRTaXplKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICB0aGlzLl92aWV3cG9ydFNpemUgPSB0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIgPwogICAgICAgICAgICB7IHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgfSA6CiAgICAgICAgICAgIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9OwogICAgfQp9ClZpZXdwb3J0UnVsZXIuybVmYWMgPSBmdW5jdGlvbiBWaWV3cG9ydFJ1bGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFZpZXdwb3J0UnVsZXIpKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KVmlld3BvcnRSdWxlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gVmlld3BvcnRSdWxlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIFZpZXdwb3J0UnVsZXJfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBWaWV3cG9ydFJ1bGVyKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCkpOyB9LCB0b2tlbjogVmlld3BvcnRSdWxlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9zY3JvbGxpbmcvdmlydHVhbC1zY3JvbGwtdmlld3BvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmFuZ2VzIGFyZSBlcXVhbC4KICogQHBhcmFtIHs/fSByMQogKiBAcGFyYW0gez99IHIyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByYW5nZXNFcXVhbChyMSwgcjIpIHsKICAgIHJldHVybiByMS5zdGFydCA9PSByMi5zdGFydCAmJiByMS5lbmQgPT0gcjIuZW5kOwp9Ci8qKgogKiBTY2hlZHVsZXIgdG8gYmUgdXNlZCBmb3Igc2Nyb2xsIGV2ZW50cy4gTmVlZHMgdG8gZmFsbCBiYWNrIHRvCiAqIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgcmVseSBvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgb24gZW52aXJvbm1lbnRzCiAqIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAoZS5nLiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcpLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFNDUk9MTF9TQ0hFRFVMRVIgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJyA/IGFuaW1hdGlvbkZyYW1lIDogYXNhcDsKLyoqCiAqIEEgdmlld3BvcnQgdGhhdCB2aXJ0dWFsaXplcyBpdHMgc2Nyb2xsaW5nIHdpdGggdGhlIGhlbHAgb2YgYENka1ZpcnR1YWxGb3JPZmAuCiAqLwpjbGFzcyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgZXh0ZW5kcyBDZGtTY3JvbGxhYmxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICogQHBhcmFtIHs/fSBuZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gX3Njcm9sbFN0cmF0ZWd5CiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHBhcmFtIHs/fSBzY3JvbGxEaXNwYXRjaGVyCiAgICAgKiBAcGFyYW0gez89fSB2aWV3cG9ydFJ1bGVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgbmdab25lLCBfc2Nyb2xsU3RyYXRlZ3ksIGRpciwgc2Nyb2xsRGlzcGF0Y2hlciwgCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkIGB2aWV3cG9ydFJ1bGVyYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLgogICAgICogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAKICAgICAqLwogICAgdmlld3BvcnRSdWxlcikgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIHNjcm9sbERpc3BhdGNoZXIsIG5nWm9uZSwgZGlyKTsKICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmOwogICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gX3Njcm9sbFN0cmF0ZWd5OwogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gdGhlIHZpZXdwb3J0IGlzIGRldGFjaGVkIGZyb20gYSBDZGtWaXJ0dWFsRm9yT2YuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB3aGVuIHRoZSByZW5kZXJlZCByYW5nZSBjaGFuZ2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCc7CiAgICAgICAgLy8gTm90ZTogd2UgZG9uJ3QgdXNlIHRoZSB0eXBpY2FsIEV2ZW50RW1pdHRlciBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBzdWJzY3JpYmUgdG8gdGhlIHNjcm9sbAogICAgICAgIC8vIHN0cmF0ZWd5IGxhemlseSAoaS5lLiBvbmx5IGlmIHRoZSB1c2VyIGlzIGFjdHVhbGx5IGxpc3RlbmluZyB0byB0aGUgZXZlbnRzKS4gV2UgZG8gdGhpcyBiZWNhdXNlCiAgICAgICAgLy8gZGVwZW5kaW5nIG9uIGhvdyB0aGUgc3RyYXRlZ3kgY2FsY3VsYXRlcyB0aGUgc2Nyb2xsZWQgaW5kZXgsIGl0IG1heSBjb21lIGF0IGEgY29zdCB0bwogICAgICAgIC8vIHBlcmZvcm1hbmNlLgogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0IGNoYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5zY3JvbGxlZEluZGV4Q2hhbmdlID0gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChvYnNlcnZlcikgPT4gdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluZGV4ID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5uZ1pvbmUucnVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IG9ic2VydmVyLm5leHQoaW5kZXgpKSkpKSkpKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBzdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmVuZGVyZWQgcmFuZ2UgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlbmRlcmVkUmFuZ2VTdHJlYW0gPSB0aGlzLl9yZW5kZXJlZFJhbmdlU3ViamVjdC5hc09ic2VydmFibGUoKTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdG90YWwgc2l6ZSBvZiBhbGwgY29udGVudCAoaW4gcGl4ZWxzKSwgaW5jbHVkaW5nIGNvbnRlbnQgdGhhdCBpcyBub3QgY3VycmVudGx5IHJlbmRlcmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3RvdGFsQ29udGVudFNpemUgPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYHN0eWxlLndpZHRoYCBwcm9wZXJ0eSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgc3BhY2VyIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdG90YWxDb250ZW50V2lkdGggPSAnJzsKICAgICAgICAvKioKICAgICAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGBzdHlsZS5oZWlnaHRgIHByb3BlcnR5IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl90b3RhbENvbnRlbnRIZWlnaHQgPSAnJzsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3VycmVudGx5IHJlbmRlcmVkIHJhbmdlIG9mIGluZGljZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcmVuZGVyZWRSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9OwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYm91bmQgdG8gdGhpcyB2aWV3cG9ydCAoaW4gbnVtYmVyIG9mIGl0ZW1zKS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9kYXRhTGVuZ3RoID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdmlld3BvcnRTaXplID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGFzdCByZW5kZXJlZCBjb250ZW50IG9mZnNldCB0aGF0IHdhcyBzZXQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0ID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBsYXN0IHJlbmRlcmVkIGNvbnRlbnQgb2Zmc2V0IHdhcyB0byB0aGUgZW5kIG9mIHRoZSBjb250ZW50IChhbmQgdGhlcmVmb3JlIG5lZWRzIHRvCiAgICAgICAgICogYmUgcmV3cml0dGVuIGFzIGFuIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQpLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlcmUgaXMgYSBwZW5kaW5nIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBydW4gYWZ0ZXIgdGhlIG5leHQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbiA9IFtdOwogICAgICAgIC8qKgogICAgICAgICAqIFN1YnNjcmlwdGlvbiB0byBjaGFuZ2VzIGluIHRoZSB2aWV3cG9ydCBzaXplLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3ZpZXdwb3J0Q2hhbmdlcyA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICBpZiAoIV9zY3JvbGxTdHJhdGVneSkgewogICAgICAgICAgICB0aHJvdyBFcnJvcignRXJyb3I6IGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCByZXF1aXJlcyB0aGUgIml0ZW1TaXplIiBwcm9wZXJ0eSB0byBiZSBzZXQuJyk7CiAgICAgICAgfQogICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTEuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgdmlld3BvcnRSdWxlcmAuCiAgICAgICAgaWYgKHZpZXdwb3J0UnVsZXIpIHsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRDaGFuZ2VzID0gdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGUgZGlyZWN0aW9uIHRoZSB2aWV3cG9ydCBzY3JvbGxzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG9yaWVudGF0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvcmllbnRhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG9yaWVudGF0aW9uKG9yaWVudGF0aW9uKSB7CiAgICAgICAgaWYgKHRoaXMuX29yaWVudGF0aW9uICE9PSBvcmllbnRhdGlvbikgewogICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOwogICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICBzdXBlci5uZ09uSW5pdCgpOwogICAgICAgIC8vIEl0J3Mgc3RpbGwgdG9vIGVhcmx5IHRvIG1lYXN1cmUgdGhlIHZpZXdwb3J0IGF0IHRoaXMgcG9pbnQuIERlZmVycmluZyB3aXRoIGEgcHJvbWlzZSBhbGxvd3MKICAgICAgICAvLyB0aGUgVmlld3BvcnQgdG8gYmUgcmVuZGVyZWQgd2l0aCB0aGUgY29ycmVjdCBzaXplIGJlZm9yZSB3ZSBtZWFzdXJlLiBXZSBydW4gdGhpcyBvdXRzaWRlIHRoZQogICAgICAgIC8vIHpvbmUgdG8gYXZvaWQgY2F1c2luZyBtb3JlIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLiBXZSBoYW5kbGUgdGhlIGNoYW5nZSBkZXRlY3Rpb24gbG9vcAogICAgICAgIC8vIG91cnNlbHZlcyBpbnN0ZWFkLgogICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9tZWFzdXJlVmlld3BvcnRTaXplKCk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmF0dGFjaCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50U2Nyb2xsZWQoKQogICAgICAgICAgICAgICAgLnBpcGUoCiAgICAgICAgICAgIC8vIFN0YXJ0IG9mZiB3aXRoIGEgZmFrZSBzY3JvbGwgZXZlbnQgc28gd2UgcHJvcGVybHkgZGV0ZWN0IG91ciBpbml0aWFsIHBvc2l0aW9uLgogICAgICAgICAgICBzdGFydFdpdGgoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSksIAogICAgICAgICAgICAvLyBDb2xsZWN0IG11bHRpcGxlIGV2ZW50cyBpbnRvIG9uZSB1bnRpbCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUuIFRoaXMgd2F5IGlmCiAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSBzY3JvbGwgZXZlbnRzIGluIHRoZSBzYW1lIGZyYW1lIHdlIG9ubHkgbmVlZCB0byByZWNoZWNrCiAgICAgICAgICAgIC8vIG91ciBsYXlvdXQgb25jZS4KICAgICAgICAgICAgYXVkaXRUaW1lKDAsIFNDUk9MTF9TQ0hFRFVMRVIpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRTY3JvbGxlZCgpKSk7CiAgICAgICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKTsKICAgICAgICB9KSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5kZXRhY2goKTsKICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5kZXRhY2goKTsKICAgICAgICAvLyBDb21wbGV0ZSBhbGwgc3ViamVjdHMKICAgICAgICB0aGlzLl9yZW5kZXJlZFJhbmdlU3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMuX2RldGFjaGVkU3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0Q2hhbmdlcy51bnN1YnNjcmliZSgpOwogICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGFjaGVzIGEgYENka1ZpcnR1YWxGb3JPZmAgdG8gdGhpcyB2aWV3cG9ydC4KICAgICAqIEBwYXJhbSB7P30gZm9yT2YKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGF0dGFjaChmb3JPZikgewogICAgICAgIGlmICh0aGlzLl9mb3JPZikgewogICAgICAgICAgICB0aHJvdyBFcnJvcignQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IGlzIGFscmVhZHkgYXR0YWNoZWQuJyk7CiAgICAgICAgfQogICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgZGF0YSBzdHJlYW0gb2YgdGhlIENka1ZpcnR1YWxGb3JPZiB0byBrZWVwIHRyYWNrIG9mIHdoZW4gdGhlIGRhdGEgbGVuZ3RoCiAgICAgICAgLy8gY2hhbmdlcy4gUnVuIG91dHNpZGUgdGhlIHpvbmUgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZGV0ZWN0aW9uLCBzaW5jZSB3ZSdyZSBtYW5hZ2luZyB0aGUKICAgICAgICAvLyBjaGFuZ2UgZGV0ZWN0aW9uIGxvb3Agb3Vyc2VsdmVzLgogICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fZm9yT2YgPSBmb3JPZjsKICAgICAgICAgICAgdGhpcy5fZm9yT2YuZGF0YVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXRhY2hlZFN1YmplY3QpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRhdGEgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAobmV3TGVuZ3RoICE9PSB0aGlzLl9kYXRhTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCA9IG5ld0xlbmd0aDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9kb0NoYW5nZURldGVjdGlvbigpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyB0aGUgY3VycmVudCBgQ2RrVmlydHVhbEZvck9mYC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRldGFjaCgpIHsKICAgICAgICB0aGlzLl9mb3JPZiA9IG51bGw7CiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJqZWN0Lm5leHQoKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJvdW5kIHRvIHRoaXMgdmlld3BvcnQgKGluIG51bWJlciBvZiBpdGVtcykuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXREYXRhTGVuZ3RoKCkgewogICAgICAgIHJldHVybiB0aGlzLl9kYXRhTGVuZ3RoOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSB2aWV3cG9ydCAoaW4gcGl4ZWxzKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFZpZXdwb3J0U2l6ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRTaXplOwogICAgfQogICAgLy8gVE9ETyhtbWFsZXJiYSk6IFRoaXMgaXMgdGVjaG5pY2FsbHkgb3V0IG9mIHN5bmMgd2l0aCB3aGF0J3MgcmVhbGx5IHJlbmRlcmVkIHVudGlsIGEgcmVuZGVyCiAgICAvLyBjeWNsZSBoYXBwZW5zLiBJJ20gYmVpbmcgY2FyZWZ1bCB0byBvbmx5IGNhbGwgaXQgYWZ0ZXIgdGhlIHJlbmRlciBjeWNsZSBpcyBjb21wbGV0ZSBhbmQgYmVmb3JlCiAgICAvLyBzZXR0aW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLCBidXQgaXRzIGVycm9yIHByb25lIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bwogICAgLy8gYHBlbmRpbmdSYW5nZWAgYW5kIGByZW5kZXJlZFJhbmdlYCwgdGhlIGxhdHRlciByZWZsZWN0aW5nIHdoYXRzIGFjdHVhbGx5IGluIHRoZSBET00uCiAgICAvKioKICAgICAqIEdldCB0aGUgY3VycmVudCByZW5kZXJlZCByYW5nZSBvZiBpdGVtcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFJlbmRlcmVkUmFuZ2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkUmFuZ2U7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGNvbnRlbnQgKGluIHBpeGVscyksIGluY2x1ZGluZyBjb250ZW50IHRoYXQgaXMgbm90IGN1cnJlbnRseQogICAgICogcmVuZGVyZWQuCiAgICAgKiBAcGFyYW0gez99IHNpemUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFRvdGFsQ29udGVudFNpemUoc2l6ZSkgewogICAgICAgIGlmICh0aGlzLl90b3RhbENvbnRlbnRTaXplICE9PSBzaXplKSB7CiAgICAgICAgICAgIHRoaXMuX3RvdGFsQ29udGVudFNpemUgPSBzaXplOwogICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCk7CiAgICAgICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCByYW5nZSBvZiBpbmRpY2VzLgogICAgICogQHBhcmFtIHs/fSByYW5nZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0UmVuZGVyZWRSYW5nZShyYW5nZSkgewogICAgICAgIGlmICghcmFuZ2VzRXF1YWwodGhpcy5fcmVuZGVyZWRSYW5nZSwgcmFuZ2UpKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0Lm5leHQodGhpcy5fcmVuZGVyZWRSYW5nZSA9IHJhbmdlKTsKICAgICAgICAgICAgdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRSZW5kZXJlZCgpKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IHRvIHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyZWQgZGF0YSAoaW4gcGl4ZWxzKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSA/IG51bGwgOiB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQ7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdmlld3BvcnQgdG8gZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHJlbmRlcmVkIGRhdGEKICAgICAqIChpbiBwaXhlbHMpLgogICAgICogQHBhcmFtIHs/fSBvZmZzZXQKICAgICAqIEBwYXJhbSB7Pz19IHRvCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQob2Zmc2V0LCB0byA9ICd0by1zdGFydCcpIHsKICAgICAgICAvLyBGb3IgYSBob3Jpem9udGFsIHZpZXdwb3J0IGluIGEgcmlnaHQtdG8tbGVmdCBsYW5ndWFnZSB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBhbG9uZyB0aGUgeC1heGlzCiAgICAgICAgLy8gaW4gdGhlIG5lZ2F0aXZlIGRpcmVjdGlvbi4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNSdGwgPSB0aGlzLmRpciAmJiB0aGlzLmRpci52YWx1ZSA9PSAncnRsJzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5vcmllbnRhdGlvbiA9PSAnaG9yaXpvbnRhbCc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF4aXMgPSBpc0hvcml6b250YWwgPyAnWCcgOiAnWSc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF4aXNEaXJlY3Rpb24gPSBpc0hvcml6b250YWwgJiYgaXNSdGwgPyAtMSA6IDE7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlJHtheGlzfSgke051bWJlcihheGlzRGlyZWN0aW9uICogb2Zmc2V0KX1weClgOwogICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldCA9IG9mZnNldDsKICAgICAgICBpZiAodG8gPT09ICd0by1lbmQnKSB7CiAgICAgICAgICAgIHRyYW5zZm9ybSArPSBgIHRyYW5zbGF0ZSR7YXhpc30oLTEwMCUpYDsKICAgICAgICAgICAgLy8gVGhlIHZpZXdwb3J0IHNob3VsZCByZXdyaXRlIHRoaXMgYXMgYSBgdG8tc3RhcnRgIG9mZnNldCBvbiB0aGUgbmV4dCByZW5kZXIgY3ljbGUuIE90aGVyd2lzZQogICAgICAgICAgICAvLyBlbGVtZW50cyB3aWxsIGFwcGVhciB0byBleHBhbmQgaW4gdGhlIHdyb25nIGRpcmVjdGlvbiAoZS5nLiBgbWF0LWV4cGFuc2lvbi1wYW5lbGAgd291bGQKICAgICAgICAgICAgLy8gZXhwYW5kIHVwd2FyZCkuCiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbnRlbnRUcmFuc2Zvcm0gIT0gdHJhbnNmb3JtKSB7CiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcyB2YWx1ZSBpcyBzYWZlIGJlY2F1c2Ugd2UgcGFyc2UgYG9mZnNldGAgd2l0aCBgTnVtYmVyKClgIGJlZm9yZSBwYXNzaW5nIGl0CiAgICAgICAgICAgIC8vIGludG8gdGhlIHN0cmluZy4KICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50VHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgICAgICAgICB0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQgLT0gdGhpcy5tZWFzdXJlUmVuZGVyZWRDb250ZW50U2l6ZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vblJlbmRlcmVkT2Zmc2V0Q2hhbmdlZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTY3JvbGxzIHRvIHRoZSBnaXZlbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgbm90IGFsd2F5cwogICAgICogdGhlIHNhbWUgYXMgc2V0dGluZyBgc2Nyb2xsVG9wYCBvciBgc2Nyb2xsTGVmdGAuIEluIGEgaG9yaXpvbnRhbCB2aWV3cG9ydCB3aXRoIHJpZ2h0LXRvLWxlZnQKICAgICAqIGRpcmVjdGlvbiwgdGhpcyB3b3VsZCBiZSB0aGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nIGEgZmljdGlvbmFsIGBzY3JvbGxSaWdodGAgcHJvcGVydHkuCiAgICAgKiBAcGFyYW0gez99IG9mZnNldCBUaGUgb2Zmc2V0IHRvIHNjcm9sbCB0by4KICAgICAqIEBwYXJhbSB7Pz19IGJlaGF2aW9yIFRoZSBTY3JvbGxCZWhhdmlvciB0byB1c2Ugd2hlbiBzY3JvbGxpbmcuIERlZmF1bHQgaXMgYmVoYXZpb3IgaXMgYGF1dG9gLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2Nyb2xsVG9PZmZzZXQob2Zmc2V0LCBiZWhhdmlvciA9ICdhdXRvJykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcHRpb25zID0geyBiZWhhdmlvciB9OwogICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHsKICAgICAgICAgICAgb3B0aW9ucy5zdGFydCA9IG9mZnNldDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG9wdGlvbnMudG9wID0gb2Zmc2V0OwogICAgICAgIH0KICAgICAgICB0aGlzLnNjcm9sbFRvKG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBTY3JvbGxzIHRvIHRoZSBvZmZzZXQgZm9yIHRoZSBnaXZlbiBpbmRleC4KICAgICAqIEBwYXJhbSB7P30gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHNjcm9sbCB0by4KICAgICAqIEBwYXJhbSB7Pz19IGJlaGF2aW9yIFRoZSBTY3JvbGxCZWhhdmlvciB0byB1c2Ugd2hlbiBzY3JvbGxpbmcuIERlZmF1bHQgaXMgYmVoYXZpb3IgaXMgYGF1dG9gLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IgPSAnYXV0bycpIHsKICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5zY3JvbGxUb0luZGV4KGluZGV4LCBiZWhhdmlvcik7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Nyb2xsIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuCiAgICAgKiBAcGFyYW0gez89fSBmcm9tIFRoZSBlZGdlIHRvIG1lYXN1cmUgdGhlIG9mZnNldCBmcm9tLiBEZWZhdWx0cyB0byAndG9wJyBpbiB2ZXJ0aWNhbCBtb2RlIGFuZCAnc3RhcnQnCiAgICAgKiAgICAgaW4gaG9yaXpvbnRhbCBtb2RlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWVhc3VyZVNjcm9sbE9mZnNldChmcm9tKSB7CiAgICAgICAgcmV0dXJuIGZyb20gPwogICAgICAgICAgICBzdXBlci5tZWFzdXJlU2Nyb2xsT2Zmc2V0KGZyb20pIDoKICAgICAgICAgICAgc3VwZXIubWVhc3VyZVNjcm9sbE9mZnNldCh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnc3RhcnQnIDogJ3RvcCcpOwogICAgfQogICAgLyoqCiAgICAgKiBNZWFzdXJlIHRoZSBjb21iaW5lZCBzaXplIG9mIGFsbCBvZiB0aGUgcmVuZGVyZWQgaXRlbXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtZWFzdXJlUmVuZGVyZWRDb250ZW50U2l6ZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGVudEVsID0gdGhpcy5fY29udGVudFdyYXBwZXIubmF0aXZlRWxlbWVudDsKICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gY29udGVudEVsLm9mZnNldFdpZHRoIDogY29udGVudEVsLm9mZnNldEhlaWdodDsKICAgIH0KICAgIC8qKgogICAgICogTWVhc3VyZSB0aGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiB0aGUgZ2l2ZW4gcmFuZ2UuIFRocm93cyBpZiB0aGUgcmFuZ2UgaW5jbHVkZXMgaXRlbXMgdGhhdCBhcmUKICAgICAqIG5vdCByZW5kZXJlZC4KICAgICAqIEBwYXJhbSB7P30gcmFuZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1lYXN1cmVSYW5nZVNpemUocmFuZ2UpIHsKICAgICAgICBpZiAoIXRoaXMuX2Zvck9mKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZm9yT2YubWVhc3VyZVJhbmdlU2l6ZShyYW5nZSwgdGhpcy5vcmllbnRhdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBhbmQgcmUtcmVuZGVyLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2hlY2tWaWV3cG9ydFNpemUoKSB7CiAgICAgICAgLy8gVE9ETzogQ2xlYW51cCBsYXRlciB3aGVuIGFkZCBsb2dpYyBmb3IgaGFuZGxpbmcgY29udGVudCByZXNpemUKICAgICAgICB0aGlzLl9tZWFzdXJlVmlld3BvcnRTaXplKCk7CiAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25EYXRhTGVuZ3RoQ2hhbmdlZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBNZWFzdXJlIHRoZSB2aWV3cG9ydCBzaXplLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9tZWFzdXJlVmlld3BvcnRTaXplKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3cG9ydEVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgdGhpcy5fdmlld3BvcnRTaXplID0gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8KICAgICAgICAgICAgdmlld3BvcnRFbC5jbGllbnRXaWR0aCA6IHZpZXdwb3J0RWwuY2xpZW50SGVpZ2h0OwogICAgfQogICAgLyoqCiAgICAgKiBRdWV1ZSB1cCBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHJ1bi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez89fSBydW5BZnRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQocnVuQWZ0ZXIpIHsKICAgICAgICBpZiAocnVuQWZ0ZXIpIHsKICAgICAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24ucHVzaChydW5BZnRlcik7CiAgICAgICAgfQogICAgICAgIC8vIFVzZSBhIFByb21pc2UgdG8gYmF0Y2ggdG9nZXRoZXIgY2FsbHMgdG8gYF9kb0NoYW5nZURldGVjdGlvbmAuIFRoaXMgd2F5IGlmIHdlIHNldCBhIGJ1bmNoIG9mCiAgICAgICAgLy8gcHJvcGVydGllcyBzZXF1ZW50aWFsbHkgd2Ugb25seSBoYXZlIHRvIHJ1biBgX2RvQ2hhbmdlRGV0ZWN0aW9uYCBvbmNlIGF0IHRoZSBlbmQuCiAgICAgICAgaWYgKCF0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcpIHsKICAgICAgICAgICAgdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9kb0NoYW5nZURldGVjdGlvbigpOwogICAgICAgICAgICB9KSkpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJ1biBjaGFuZ2UgZGV0ZWN0aW9uLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9kb0NoYW5nZURldGVjdGlvbigpIHsKICAgICAgICB0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcgPSBmYWxzZTsKICAgICAgICAvLyBBcHBseSB0aGUgY29udGVudCB0cmFuc2Zvcm0uIFRoZSB0cmFuc2Zvcm0gY2FuJ3QgYmUgc2V0IHZpYSBhbiBBbmd1bGFyIGJpbmRpbmcgYmVjYXVzZQogICAgICAgIC8vIGJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSBpcyBiYW5uZWQgaW4gR29vZ2xlLiBIb3dldmVyIHRoZSB2YWx1ZSBpcyBzYWZlLCBpdCdzIGNvbXBvc2VkIG9mCiAgICAgICAgLy8gc3RyaW5nIGxpdGVyYWxzLCBhIHZhcmlhYmxlIHRoYXQgY2FuIG9ubHkgYmUgJ1gnIG9yICdZJywgYW5kIHVzZXIgaW5wdXQgdGhhdCBpcyBydW4gdGhyb3VnaAogICAgICAgIC8vIHRoZSBgTnVtYmVyYCBmdW5jdGlvbiBmaXJzdCB0byBjb2VyY2UgaXQgdG8gYSBudW1lcmljIHZhbHVlLgogICAgICAgIHRoaXMuX2NvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gdGhpcy5fcmVuZGVyZWRDb250ZW50VHJhbnNmb3JtOwogICAgICAgIC8vIEFwcGx5IGNoYW5nZXMgdG8gQW5ndWxhciBiaW5kaW5ncy4gTm90ZTogV2UgbXVzdCBjYWxsIGBtYXJrRm9yQ2hlY2tgIHRvIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uCiAgICAgICAgLy8gZnJvbSB0aGUgcm9vdCwgc2luY2UgdGhlIHJlcGVhdGVkIGl0ZW1zIGFyZSBjb250ZW50IHByb2plY3RlZCBpbi4gQ2FsbGluZyBgZGV0ZWN0Q2hhbmdlc2AKICAgICAgICAvLyBpbnN0ZWFkIGRvZXMgbm90IHByb3Blcmx5IGNoZWNrIHRoZSBwcm9qZWN0ZWQgY29udGVudC4KICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24gPSB0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbjsKICAgICAgICB0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbiA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZm4gb2YgcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24pIHsKICAgICAgICAgICAgZm4oKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIGBzdHlsZS53aWR0aGAgYW5kIGBzdHlsZS5oZWlnaHRgIGZvciB0aGUgc3BhY2VyIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NhbGN1bGF0ZVNwYWNlclNpemUoKSB7CiAgICAgICAgdGhpcy5fdG90YWxDb250ZW50SGVpZ2h0ID0KICAgICAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJycgOiBgJHt0aGlzLl90b3RhbENvbnRlbnRTaXplfXB4YDsKICAgICAgICB0aGlzLl90b3RhbENvbnRlbnRXaWR0aCA9CiAgICAgICAgICAgIHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGAke3RoaXMuX3RvdGFsQ29udGVudFNpemV9cHhgIDogJyc7CiAgICB9Cn0KQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0Lsm1ZmFjID0gZnVuY3Rpb24gQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFNjcm9sbERpc3BhdGNoZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdwb3J0UnVsZXIsIDgpKTsgfTsKQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgc2VsZWN0b3JzOiBbWyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJDIsIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2NvbnRlbnRXcmFwcGVyID0gX3QuZmlyc3QpOwogICAgfSB9LCBob3N0QXR0cnM6IFsxLCAiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0Il0sIGhvc3RWYXJzOiA0LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWNsYXNzUHJvcCgiY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwiLCBjdHgub3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIikoImNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsIGN0eC5vcmllbnRhdGlvbiAhPT0gImhvcml6b250YWwiKTsKICAgIH0gfSwgaW5wdXRzOiB7IG9yaWVudGF0aW9uOiAib3JpZW50YXRpb24iIH0sIG91dHB1dHM6IHsgc2Nyb2xsZWRJbmRleENoYW5nZTogInNjcm9sbGVkSW5kZXhDaGFuZ2UiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sKICAgICAgICAgICAgICAgIHByb3ZpZGU6IENka1Njcm9sbGFibGUsCiAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0CiAgICAgICAgICAgIH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJDIsIGRlY2xzOiA0LCB2YXJzOiA0LCBjb25zdHM6IFtbMSwgImNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXIiXSwgWyJjb250ZW50V3JhcHBlciIsICIiXSwgWzEsICJjZGstdmlydHVhbC1zY3JvbGwtc3BhY2VyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCwgMSk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAiZGl2IiwgMik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJ3aWR0aCIsIGN0eC5fdG90YWxDb250ZW50V2lkdGgpKCJoZWlnaHQiLCBjdHguX3RvdGFsQ29udGVudEhlaWdodCk7CiAgICB9IH0sIHN0eWxlczogWyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzphdXRvO2NvbnRhaW46c3RyaWN0O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3dpbGwtY2hhbmdlOnNjcm9sbC1wb3NpdGlvbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y29udGFpbjpjb250ZW50fVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntyaWdodDowO2xlZnQ6YXV0b30uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJ7bWluLWhlaWdodDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5kbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+b2w6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj51bDpub3QoW2Nka1ZpcnR1YWxGb3JdKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDowO291dGxpbmU6bm9uZX0uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVye21pbi13aWR0aDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+ZGw6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5vbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+dWw6bm90KFtjZGtWaXJ0dWFsRm9yXSl7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20td2lkdGg6MDtvdXRsaW5lOm5vbmV9LmNkay12aXJ0dWFsLXNjcm9sbC1zcGFjZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxcHg7d2lkdGg6MXB4O3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlcntyaWdodDowO2xlZnQ6YXV0bzt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSxdIH1dIH0sCiAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBTY3JvbGxEaXNwYXRjaGVyIH0sCiAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LnByb3BEZWNvcmF0b3JzID0gewogICAgb3JpZW50YXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgc2Nyb2xsZWRJbmRleENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgX2NvbnRlbnRXcmFwcGVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29udGVudFdyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3ZpcnR1YWwtZm9yLW9mLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBIZWxwZXIgdG8gZXh0cmFjdCBzaXplIGZyb20gYSBET00gTm9kZS4KICogQHBhcmFtIHs/fSBvcmllbnRhdGlvbgogKiBAcGFyYW0gez99IG5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFNpemUob3JpZW50YXRpb24sIG5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsID0gKC8qKiBAdHlwZSB7P30gKi8gKG5vZGUpKTsKICAgIGlmICghZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICByZXR1cm4gb3JpZW50YXRpb24gPT0gJ2hvcml6b250YWwnID8gcmVjdC53aWR0aCA6IHJlY3QuaGVpZ2h0Owp9Ci8qKgogKiBBIGRpcmVjdGl2ZSBzaW1pbGFyIHRvIGBuZ0Zvck9mYCB0byBiZSB1c2VkIGZvciByZW5kZXJpbmcgZGF0YSBpbnNpZGUgYSB2aXJ0dWFsIHNjcm9sbGluZwogKiBjb250YWluZXIuCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBDZGtWaXJ0dWFsRm9yT2YgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyUmVmCiAgICAgKiBAcGFyYW0gez99IF90ZW1wbGF0ZQogICAgICogQHBhcmFtIHs/fSBfZGlmZmVycwogICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnQKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyUmVmLCBfdGVtcGxhdGUsIF9kaWZmZXJzLCBfdmlld3BvcnQsIG5nWm9uZSkgewogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjsKICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IF90ZW1wbGF0ZTsKICAgICAgICB0aGlzLl9kaWZmZXJzID0gX2RpZmZlcnM7CiAgICAgICAgdGhpcy5fdmlld3BvcnQgPSBfdmlld3BvcnQ7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgcmVuZGVyZWQgdmlldyBvZiB0aGUgZGF0YSBjaGFuZ2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMudmlld0NoYW5nZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogU3ViamVjdCB0aGF0IGVtaXRzIHdoZW4gYSBuZXcgRGF0YVNvdXJjZSBpbnN0YW5jZSBpcyBnaXZlbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIHVzZWQgdG8gc3RvcmUgdGVtcGxhdGVzIHRoYXQgYXJlIG5vdCBiZWluZyB1c2VkIGZvciByZS11c2UgbGF0ZXIuCiAgICAgICAgICogU2V0dGluZyB0aGUgY2FjaGUgc2l6ZSB0byBgMGAgd2lsbCBkaXNhYmxlIGNhY2hpbmcuIERlZmF1bHRzIHRvIDIwIHRlbXBsYXRlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNka1ZpcnR1YWxGb3JUZW1wbGF0ZUNhY2hlU2l6ZSA9IDIwOwogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW5ldmVyIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50IERhdGFTb3VyY2UgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmRhdGFTdHJlYW0gPSB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcwogICAgICAgICAgICAucGlwZSgKICAgICAgICAvLyBTdGFydCBvZmYgd2l0aCBudWxsIGBEYXRhU291cmNlYC4KICAgICAgICBzdGFydFdpdGgoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSksIAogICAgICAgIC8vIEJ1bmRsZSB1cCB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgZGF0YSBzb3VyY2VzIHNvIHdlIGNhbiB3b3JrIHdpdGggYm90aC4KICAgICAgICBwYWlyd2lzZSgpLCAKICAgICAgICAvLyBVc2UgYF9jaGFuZ2VEYXRhU291cmNlYCB0byBkaXNjb25uZWN0IGZyb20gdGhlIHByZXZpb3VzIGRhdGEgc291cmNlIGFuZCBjb25uZWN0IHRvIHRoZQogICAgICAgIC8vIG5ldyBvbmUsIHBhc3NpbmcgYmFjayBhIHN0cmVhbSBvZiBkYXRhIGNoYW5nZXMgd2hpY2ggd2UgcnVuIHRocm91Z2ggYHN3aXRjaE1hcGAgdG8gZ2l2ZQogICAgICAgIC8vIHVzIGEgZGF0YSBzdHJlYW0gdGhhdCBlbWl0cyB0aGUgbGF0ZXN0IGRhdGEgZnJvbSB3aGF0ZXZlciB0aGUgY3VycmVudCBgRGF0YVNvdXJjZWAgaXMuCiAgICAgICAgc3dpdGNoTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFtwcmV2LCBjdXJdKSA9PiB0aGlzLl9jaGFuZ2VEYXRhU291cmNlKHByZXYsIGN1cikpKSwgCiAgICAgICAgLy8gUmVwbGF5IHRoZSBsYXN0IGVtaXR0ZWQgZGF0YSB3aGVuIHNvbWVvbmUgc3Vic2NyaWJlcy4KICAgICAgICBzaGFyZVJlcGxheSgxKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRpZmZlciB1c2VkIHRvIGNhbGN1bGF0ZSBjaGFuZ2VzIHRvIHRoZSBkYXRhLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRlbXBsYXRlIGNhY2hlIHVzZWQgdG8gaG9sZCBvbiBvdCB0ZW1wbGF0ZSBpbnN0YW5jZXNzIHRoYXQgaGF2ZSBiZWVuIHN0YW1wZWQgb3V0LCBidXQgZG9uJ3QKICAgICAgICAgKiBjdXJyZW50bHkgbmVlZCB0byBiZSByZW5kZXJlZC4gVGhlc2UgaW5zdGFuY2VzIHdpbGwgYmUgcmV1c2VkIGluIHRoZSBmdXR1cmUgcmF0aGVyIHRoYW4KICAgICAgICAgKiBzdGFtcGluZyBvdXQgYnJhbmQgbmV3IG9uZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdGVtcGxhdGVDYWNoZSA9IFtdOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHJlbmRlcmVkIGRhdGEgc2hvdWxkIGJlIHVwZGF0ZWQgZHVyaW5nIHRoZSBuZXh0IG5nRG9DaGVjayBjeWNsZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IGZhbHNlOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgdGhpcy5kYXRhU3RyZWFtLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkYXRhID0+IHsKICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMuX29uUmVuZGVyZWREYXRhQ2hhbmdlKCk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0LnJlbmRlcmVkUmFuZ2VTdHJlYW0ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJhbmdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByYW5nZSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkUmFuZ2UgPSByYW5nZTsKICAgICAgICAgICAgbmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnZpZXdDaGFuZ2UubmV4dCh0aGlzLl9yZW5kZXJlZFJhbmdlKSkpOwogICAgICAgICAgICB0aGlzLl9vblJlbmRlcmVkRGF0YUNoYW5nZSgpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLl92aWV3cG9ydC5hdHRhY2godGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBEYXRhU291cmNlIHRvIGRpc3BsYXkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY2RrVmlydHVhbEZvck9mKCkgewogICAgICAgIHJldHVybiB0aGlzLl9jZGtWaXJ0dWFsRm9yT2Y7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBjZGtWaXJ0dWFsRm9yT2YodmFsdWUpIHsKICAgICAgICB0aGlzLl9jZGtWaXJ0dWFsRm9yT2YgPSB2YWx1ZTsKICAgICAgICBpZiAoaXNEYXRhU291cmNlKHZhbHVlKSkgewogICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFNsaWNlIHRoZSB2YWx1ZSBpZiBpdHMgYW4gTmdJdGVyYWJsZSB0byBlbnN1cmUgd2UncmUgd29ya2luZyB3aXRoIGFuIGFycmF5LgogICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KG5ldyBBcnJheURhdGFTb3VyY2UoaXNPYnNlcnZhYmxlKHZhbHVlKSA/IHZhbHVlIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodmFsdWUgfHwgW10pKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGUgYFRyYWNrQnlGdW5jdGlvbmAgdG8gdXNlIGZvciB0cmFja2luZyBjaGFuZ2VzLiBUaGUgYFRyYWNrQnlGdW5jdGlvbmAgdGFrZXMgdGhlIGluZGV4IGFuZAogICAgICogdGhlIGl0ZW0gYW5kIHByb2R1Y2VzIGEgdmFsdWUgdG8gYmUgdXNlZCBhcyB0aGUgaXRlbSdzIGlkZW50aXR5IHdoZW4gdHJhY2tpbmcgY2hhbmdlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjZGtWaXJ0dWFsRm9yVHJhY2tCeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2RrVmlydHVhbEZvclRyYWNrQnk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBjZGtWaXJ0dWFsRm9yVHJhY2tCeShmbikgewogICAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICB0aGlzLl9jZGtWaXJ0dWFsRm9yVHJhY2tCeSA9IGZuID8KICAgICAgICAgICAgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGluZGV4LCBpdGVtKSA9PiBmbihpbmRleCArICh0aGlzLl9yZW5kZXJlZFJhbmdlID8gdGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCA6IDApLCBpdGVtKSkgOgogICAgICAgICAgICB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSB0ZW1wbGF0ZSB1c2VkIHRvIHN0YW1wIG91dCBuZXcgZWxlbWVudHMuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgY2RrVmlydHVhbEZvclRlbXBsYXRlKHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1lYXN1cmVzIHRoZSBjb21iaW5lZCBzaXplICh3aWR0aCBmb3IgaG9yaXpvbnRhbCBvcmllbnRhdGlvbiwgaGVpZ2h0IGZvciB2ZXJ0aWNhbCkgb2YgYWxsIGl0ZW1zCiAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJhbmdlIGluY2x1ZGVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkKICAgICAqIHJlbmRlcmVkLgogICAgICogQHBhcmFtIHs/fSByYW5nZQogICAgICogQHBhcmFtIHs/fSBvcmllbnRhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWVhc3VyZVJhbmdlU2l6ZShyYW5nZSwgb3JpZW50YXRpb24pIHsKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgPj0gcmFuZ2UuZW5kKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgPCB0aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0IHx8IHJhbmdlLmVuZCA+IHRoaXMuX3JlbmRlcmVkUmFuZ2UuZW5kKSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKGBFcnJvcjogYXR0ZW1wdGVkIHRvIG1lYXN1cmUgYW4gaXRlbSB0aGF0IGlzbid0IHJlbmRlcmVkLmApOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgaW5kZXggaW50byB0aGUgbGlzdCBvZiByZW5kZXJlZCB2aWV3cyBmb3IgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHJhbmdlLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZW5kZXJlZFN0YXJ0SW5kZXggPSByYW5nZS5zdGFydCAtIHRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnQ7CiAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugd2UncmUgbWVhc3VyaW5nLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByYW5nZUxlbiA9IHJhbmdlLmVuZCAtIHJhbmdlLnN0YXJ0OwogICAgICAgIC8vIExvb3Agb3ZlciBhbGwgcm9vdCBub2RlcyBmb3IgYWxsIGl0ZW1zIGluIHRoZSByYW5nZSBhbmQgc3VtIHVwIHRoZWlyIHNpemUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0b3RhbFNpemUgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaSA9IHJhbmdlTGVuOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZ2V0KGkgKyByZW5kZXJlZFN0YXJ0SW5kZXgpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGogPSB2aWV3ID8gdmlldy5yb290Tm9kZXMubGVuZ3RoIDogMDsKICAgICAgICAgICAgd2hpbGUgKGotLSkgewogICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGdldFNpemUob3JpZW50YXRpb24sICgvKiogQHR5cGUgez99ICovICh2aWV3KSkucm9vdE5vZGVzW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdG90YWxTaXplOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgaWYgKHRoaXMuX2RpZmZlciAmJiB0aGlzLl9uZWVkc1VwZGF0ZSkgewogICAgICAgICAgICAvLyBUT0RPKG1tYWxlcmJhKTogV2Ugc2hvdWxkIGRpZmZlcmVudGlhdGUgbmVlZHMgdXBkYXRlIGR1ZSB0byBzY3JvbGxpbmcgYW5kIGEgbmV3IHBvcnRpb24gb2YKICAgICAgICAgICAgLy8gdGhpcyBsaXN0IGJlaW5nIHJlbmRlcmVkIChjYW4gdXNlIHNpbXBsZXIgYWxnb3JpdGhtKSB2cyBuZWVkcyB1cGRhdGUgZHVlIHRvIGRhdGEgYWN0dWFsbHkKICAgICAgICAgICAgLy8gY2hhbmdpbmcgKG5lZWQgdG8gZG8gdGhpcyBkaWZmKS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fcmVuZGVyZWRJdGVtcyk7CiAgICAgICAgICAgIGlmICghY2hhbmdlcykgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29udGV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl92aWV3cG9ydC5kZXRhY2goKTsKICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZUNoYW5nZXMuY29tcGxldGUoKTsKICAgICAgICB0aGlzLnZpZXdDaGFuZ2UuY29tcGxldGUoKTsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpOwogICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5fdGVtcGxhdGVDYWNoZSkgewogICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlYWN0IHRvIHNjcm9sbCBzdGF0ZSBjaGFuZ2VzIGluIHRoZSB2aWV3cG9ydC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25SZW5kZXJlZERhdGFDaGFuZ2UoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9yZW5kZXJlZFJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcmVuZGVyZWRJdGVtcyA9IHRoaXMuX2RhdGEuc2xpY2UodGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCwgdGhpcy5fcmVuZGVyZWRSYW5nZS5lbmQpOwogICAgICAgIGlmICghdGhpcy5fZGlmZmVyKSB7CiAgICAgICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh0aGlzLl9yZW5kZXJlZEl0ZW1zKS5jcmVhdGUodGhpcy5jZGtWaXJ0dWFsRm9yVHJhY2tCeSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogU3dhcCBvdXQgb25lIGBEYXRhU291cmNlYCBmb3IgYW5vdGhlci4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9sZERzCiAgICAgKiBAcGFyYW0gez99IG5ld0RzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hhbmdlRGF0YVNvdXJjZShvbGREcywgbmV3RHMpIHsKICAgICAgICBpZiAob2xkRHMpIHsKICAgICAgICAgICAgb2xkRHMuZGlzY29ubmVjdCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIHJldHVybiBuZXdEcyA/IG5ld0RzLmNvbm5lY3QodGhpcykgOiBvZigpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgdGhlIGBDZGtWaXJ0dWFsRm9yT2ZDb250ZXh0YCBmb3IgYWxsIHZpZXdzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVDb250ZXh0KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RhdGEubGVuZ3RoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaSA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYubGVuZ3RoOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldChpKSkpOwogICAgICAgICAgICB2aWV3LmNvbnRleHQuaW5kZXggPSB0aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0ICsgaTsKICAgICAgICAgICAgdmlldy5jb250ZXh0LmNvdW50ID0gY291bnQ7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbXB1dGVkQ29udGV4dFByb3BlcnRpZXModmlldy5jb250ZXh0KTsKICAgICAgICAgICAgdmlldy5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBcHBseSBjaGFuZ2VzIHRvIHRoZSBET00uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlDaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAvLyBSZWFycmFuZ2UgdGhlIHZpZXdzIHRvIHB1dCB0aGVtIGluIHRoZSByaWdodCBsb2NhdGlvbi4KICAgICAgICBjaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBhZGp1c3RlZFByZXZpb3VzSW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRJbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCwgYWRqdXN0ZWRQcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXgpID0+IHsKICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09IG51bGwpIHsgLy8gSXRlbSBhZGRlZC4KICAgICAgICAgICAgICAgIC8vIEl0ZW0gYWRkZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5faW5zZXJ0Vmlld0Zvck5ld0l0ZW0oKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRJbmRleCkpKTsKICAgICAgICAgICAgICAgIHZpZXcuY29udGV4dC4kaW1wbGljaXQgPSByZWNvcmQuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50SW5kZXggPT0gbnVsbCkgeyAvLyBJdGVtIHJlbW92ZWQuCiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZVZpZXcodGhpcy5fZGV0YWNoVmlldygoLyoqIEB0eXBlIHs/fSAqLyAoYWRqdXN0ZWRQcmV2aW91c0luZGV4KSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsgLy8gSXRlbSBtb3ZlZC4KICAgICAgICAgICAgICAgIC8vIEl0ZW0gbW92ZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZ2V0KCgvKiogQHR5cGUgez99ICovIChhZGp1c3RlZFByZXZpb3VzSW5kZXgpKSkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYubW92ZSh2aWV3LCBjdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgICAgdmlldy5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIC8vIFVwZGF0ZSAkaW1wbGljaXQgZm9yIGFueSBpdGVtcyB0aGF0IGhhZCBhbiBpZGVudGl0eSBjaGFuZ2UuCiAgICAgICAgY2hhbmdlcy5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldCgoLyoqIEB0eXBlIHs/fSAqLyAocmVjb3JkLmN1cnJlbnRJbmRleCkpKSkpOwogICAgICAgICAgICB2aWV3LmNvbnRleHQuJGltcGxpY2l0ID0gcmVjb3JkLml0ZW07CiAgICAgICAgfSkpOwogICAgICAgIC8vIFVwZGF0ZSB0aGUgY29udGV4dCB2YXJpYWJsZXMgb24gYWxsIGl0ZW1zLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RhdGEubGVuZ3RoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaSA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYubGVuZ3RoOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZ2V0KGkpKSk7CiAgICAgICAgICAgIHZpZXcuY29udGV4dC5pbmRleCA9IHRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnQgKyBpOwogICAgICAgICAgICB2aWV3LmNvbnRleHQuY291bnQgPSBjb3VudDsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29tcHV0ZWRDb250ZXh0UHJvcGVydGllcyh2aWV3LmNvbnRleHQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2FjaGUgdGhlIGdpdmVuIGRldGFjaGVkIHZpZXcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2FjaGVWaWV3KHZpZXcpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGVDYWNoZS5sZW5ndGggPCB0aGlzLmNka1ZpcnR1YWxGb3JUZW1wbGF0ZUNhY2hlU2l6ZSkgewogICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZUNhY2hlLnB1c2godmlldyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHZpZXcpOwogICAgICAgICAgICAvLyBJdCdzIHZlcnkgdW5saWtlbHkgdGhhdCB0aGUgaW5kZXggd2lsbCBldmVyIGJlIC0xLCBidXQganVzdCBpbiBjYXNlLAogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSB2aWV3IG9uIGl0cyBvd24sIG90aGVyd2lzZSBkZXN0cm95IGl0IHRocm91Z2ggdGhlCiAgICAgICAgICAgIC8vIGNvbnRhaW5lciB0byBlbnN1cmUgdGhhdCBhbGwgdGhlIHJlZmVyZW5jZXMgYXJlIHJlbW92ZWQuCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5yZW1vdmUoaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJbnNlcnRzIGEgdmlldyBmb3IgYSBuZXcgaXRlbSwgZWl0aGVyIGZyb20gdGhlIGNhY2hlIG9yIGJ5IGNyZWF0aW5nIGEgbmV3IG9uZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaW5zZXJ0Vmlld0Zvck5ld0l0ZW0oaW5kZXgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0Vmlld0Zyb21DYWNoZShpbmRleCkgfHwgdGhpcy5fY3JlYXRlRW1iZWRkZWRWaWV3QXQoaW5kZXgpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgb24gdGhlIGBDZGtWaXJ0dWFsRm9yT2ZDb250ZXh0YC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVDb21wdXRlZENvbnRleHRQcm9wZXJ0aWVzKGNvbnRleHQpIHsKICAgICAgICBjb250ZXh0LmZpcnN0ID0gY29udGV4dC5pbmRleCA9PT0gMDsKICAgICAgICBjb250ZXh0Lmxhc3QgPSBjb250ZXh0LmluZGV4ID09PSBjb250ZXh0LmNvdW50IC0gMTsKICAgICAgICBjb250ZXh0LmV2ZW4gPSBjb250ZXh0LmluZGV4ICUgMiA9PT0gMDsKICAgICAgICBjb250ZXh0Lm9kZCA9ICFjb250ZXh0LmV2ZW47CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgZW1iZWRkZWQgdmlldyBhbmQgbW92ZXMgaXQgdG8gdGhlIGdpdmVuIGluZGV4CiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZUVtYmVkZGVkVmlld0F0KGluZGV4KSB7CiAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgd2UgaW5zZXJ0IHRoZSBpdGVtIGRpcmVjdGx5IGF0IHRoZSBwcm9wZXIgaW5kZXgsCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gaW5zZXJ0aW5nIGl0IGFuZCB0aGUgbW92aW5nIGl0IGluIHBsYWNlLCBiZWNhdXNlIGlmIHRoZXJlJ3MgYSBkaXJlY3RpdmUKICAgICAgICAvLyBvbiB0aGUgc2FtZSBub2RlIHRoYXQgaW5qZWN0cyB0aGUgYFZpZXdDb250YWluZXJSZWZgLCBBbmd1bGFyIHdpbGwgaW5zZXJ0IGFub3RoZXIKICAgICAgICAvLyBjb21tZW50IG5vZGUgd2hpY2ggY2FuIHRocm93IG9mZiB0aGUgbW92ZSB3aGVuIGl0J3MgYmVpbmcgcmVwZWF0ZWQgZm9yIGFsbCBpdGVtcy4KICAgICAgICByZXR1cm4gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGUsIHsKICAgICAgICAgICAgJGltcGxpY2l0OiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLyBJdCdzIGd1YXJhbnRlZWQgdGhhdCB0aGUgaXRlcmFibGUgaXMgbm90ICJ1bmRlZmluZWQiIG9yICJudWxsIiBiZWNhdXNlIHdlIG9ubHkKICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdmlld3MgZm9yIGVsZW1lbnRzIGlmIHRoZSAiY2RrVmlydHVhbEZvck9mIiBpdGVyYWJsZSBoYXMgZWxlbWVudHMuCiAgICAgICAgICAgIGNka1ZpcnR1YWxGb3JPZjogKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2Nka1ZpcnR1YWxGb3JPZikpLAogICAgICAgICAgICBpbmRleDogLTEsCiAgICAgICAgICAgIGNvdW50OiAtMSwKICAgICAgICAgICAgZmlyc3Q6IGZhbHNlLAogICAgICAgICAgICBsYXN0OiBmYWxzZSwKICAgICAgICAgICAgb2RkOiBmYWxzZSwKICAgICAgICAgICAgZXZlbjogZmFsc2UKICAgICAgICB9LCBpbmRleCk7CiAgICB9CiAgICAvKioKICAgICAqIEluc2VydHMgYSByZWN5Y2xlZCB2aWV3IGZyb20gdGhlIGNhY2hlIGF0IHRoZSBnaXZlbiBpbmRleC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaW5zZXJ0Vmlld0Zyb21DYWNoZShpbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjYWNoZWRWaWV3ID0gdGhpcy5fdGVtcGxhdGVDYWNoZS5wb3AoKTsKICAgICAgICBpZiAoY2FjaGVkVmlldykgewogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluc2VydChjYWNoZWRWaWV3LCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYWNoZWRWaWV3IHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIERldGFjaGVzIHRoZSBlbWJlZGRlZCB2aWV3IGF0IHRoZSBnaXZlbiBpbmRleC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZGV0YWNoVmlldyhpbmRleCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goaW5kZXgpKSk7CiAgICB9Cn0KQ2RrVmlydHVhbEZvck9mLsm1ZmFjID0gZnVuY3Rpb24gQ2RrVmlydHVhbEZvck9mX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka1ZpcnR1YWxGb3JPZikoybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoSXRlcmFibGVEaWZmZXJzKSwgybXJtWRpcmVjdGl2ZUluamVjdChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIDQpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSkpOyB9OwpDZGtWaXJ0dWFsRm9yT2YuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrVmlydHVhbEZvck9mLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtWaXJ0dWFsRm9yIiwgIiIsICJjZGtWaXJ0dWFsRm9yT2YiLCAiIl1dLCBpbnB1dHM6IHsgY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplOiAiY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplIiwgY2RrVmlydHVhbEZvck9mOiAiY2RrVmlydHVhbEZvck9mIiwgY2RrVmlydHVhbEZvclRyYWNrQnk6ICJjZGtWaXJ0dWFsRm9yVHJhY2tCeSIsIGNka1ZpcnR1YWxGb3JUZW1wbGF0ZTogImNka1ZpcnR1YWxGb3JUZW1wbGF0ZSIgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkNka1ZpcnR1YWxGb3JPZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9LAogICAgeyB0eXBlOiBJdGVyYWJsZURpZmZlcnMgfSwKICAgIHsgdHlwZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfQpdOwpDZGtWaXJ0dWFsRm9yT2YucHJvcERlY29yYXRvcnMgPSB7CiAgICBjZGtWaXJ0dWFsRm9yT2Y6IFt7IHR5cGU6IElucHV0IH1dLAogICAgY2RrVmlydHVhbEZvclRyYWNrQnk6IFt7IHR5cGU6IElucHV0IH1dLAogICAgY2RrVmlydHVhbEZvclRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGNka1ZpcnR1YWxGb3JUZW1wbGF0ZUNhY2hlU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3Njcm9sbGluZy1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgU2Nyb2xsaW5nTW9kdWxlIHsKfQpTY3JvbGxpbmdNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTY3JvbGxpbmdNb2R1bGUgfSk7ClNjcm9sbGluZ01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNjcm9sbGluZ01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTY3JvbGxpbmdNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQmlkaU1vZHVsZSwgUGxhdGZvcm1Nb2R1bGVdLAogICAgICAgIEJpZGlNb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShTY3JvbGxpbmdNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCwKICAgICAgICBDZGtTY3JvbGxhYmxlLAogICAgICAgIENka1ZpcnR1YWxGb3JPZiwKICAgICAgICBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQmlkaU1vZHVsZSwgUGxhdGZvcm1Nb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQmlkaU1vZHVsZSwKICAgICAgICBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsLAogICAgICAgIENka1Njcm9sbGFibGUsCiAgICAgICAgQ2RrVmlydHVhbEZvck9mLAogICAgICAgIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydF07IH0gfSk7IH0pKCk7CgpmdW5jdGlvbiBNYXRUYWJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVwcm9qZWN0aW9uKDApOwp9IH0KY29uc3QgX2MwJDMgPSBbIioiXTsKZnVuY3Rpb24gTWF0VGFiQm9keV9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgfQpjb25zdCBfYzEkMyA9IGZ1bmN0aW9uIChhMCkgeyByZXR1cm4geyBhbmltYXRpb25EdXJhdGlvbjogYTAgfTsgfTsKY29uc3QgX2MyJDEgPSBmdW5jdGlvbiAoYTAsIGExKSB7IHJldHVybiB7IHZhbHVlOiBhMCwgcGFyYW1zOiBhMSB9OyB9Owpjb25zdCBfYzMgPSBbInRhYkJvZHlXcmFwcGVyIl07CmNvbnN0IF9jNCA9IFsidGFiSGVhZGVyIl07CmZ1bmN0aW9uIE1hdFRhYkdyb3VwX2Rpdl8yX25nX3RlbXBsYXRlXzJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IH0KZnVuY3Rpb24gTWF0VGFiR3JvdXBfZGl2XzJfbmdfdGVtcGxhdGVfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybV0ZW1wbGF0ZSgwLCBNYXRUYWJHcm91cF9kaXZfMl9uZ190ZW1wbGF0ZV8yX25nX3RlbXBsYXRlXzBfVGVtcGxhdGUsIDAsIDAsICJuZy10ZW1wbGF0ZSIsIDkpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHRhYl9yNCA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsKICAgIMm1ybVwcm9wZXJ0eSgiY2RrUG9ydGFsT3V0bGV0IiwgdGFiX3I0LnRlbXBsYXRlTGFiZWwpOwp9IH0KZnVuY3Rpb24gTWF0VGFiR3JvdXBfZGl2XzJfbmdfdGVtcGxhdGVfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybV0ZXh0KDApOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHRhYl9yNCA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUodGFiX3I0LnRleHRMYWJlbCk7Cn0gfQpmdW5jdGlvbiBNYXRUYWJHcm91cF9kaXZfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMTIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDYpOwogICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX2Rpdl8yX1RlbXBsYXRlX2Rpdl9jbGlja18wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxMik7IGNvbnN0IHRhYl9yNCA9IGN0eC4kaW1wbGljaXQ7IGNvbnN0IGlfcjUgPSBjdHguaW5kZXg7IGNvbnN0IGN0eF9yMTEgPSDJtcm1bmV4dENvbnRleHQoKTsgY29uc3QgX3IwID0gybXJtXJlZmVyZW5jZSgxKTsgcmV0dXJuIGN0eF9yMTEuX2hhbmRsZUNsaWNrKHRhYl9yNCwgX3IwLCBpX3I1KTsgfSk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCA3KTsKICAgIMm1ybV0ZW1wbGF0ZSgyLCBNYXRUYWJHcm91cF9kaXZfMl9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlLCAxLCAxLCAibmctdGVtcGxhdGUiLCA4KTsKICAgIMm1ybV0ZW1wbGF0ZSgzLCBNYXRUYWJHcm91cF9kaXZfMl9uZ190ZW1wbGF0ZV8zX1RlbXBsYXRlLCAxLCAxLCAibmctdGVtcGxhdGUiLCA4KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHRhYl9yNCA9IGN0eC4kaW1wbGljaXQ7CiAgICBjb25zdCBpX3I1ID0gY3R4LmluZGV4OwogICAgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtdGFiLWxhYmVsLWFjdGl2ZSIsIGN0eF9yMS5zZWxlY3RlZEluZGV4ID09IGlfcjUpOwogICAgybXJtXByb3BlcnR5KCJpZCIsIGN0eF9yMS5fZ2V0VGFiTGFiZWxJZChpX3I1KSkoImRpc2FibGVkIiwgdGFiX3I0LmRpc2FibGVkKSgibWF0UmlwcGxlRGlzYWJsZWQiLCB0YWJfcjQuZGlzYWJsZWQgfHwgY3R4X3IxLmRpc2FibGVSaXBwbGUpOwogICAgybXJtWF0dHJpYnV0ZSgidGFiSW5kZXgiLCBjdHhfcjEuX2dldFRhYkluZGV4KHRhYl9yNCwgaV9yNSkpKCJhcmlhLXBvc2luc2V0IiwgaV9yNSArIDEpKCJhcmlhLXNldHNpemUiLCBjdHhfcjEuX3RhYnMubGVuZ3RoKSgiYXJpYS1jb250cm9scyIsIGN0eF9yMS5fZ2V0VGFiQ29udGVudElkKGlfcjUpKSgiYXJpYS1zZWxlY3RlZCIsIGN0eF9yMS5zZWxlY3RlZEluZGV4ID09IGlfcjUpKCJhcmlhLWxhYmVsIiwgdGFiX3I0LmFyaWFMYWJlbCB8fCBudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IiwgIXRhYl9yNC5hcmlhTGFiZWwgJiYgdGFiX3I0LmFyaWFMYWJlbGxlZGJ5ID8gdGFiX3I0LmFyaWFMYWJlbGxlZGJ5IDogbnVsbCk7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIHRhYl9yNC50ZW1wbGF0ZUxhYmVsKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgIXRhYl9yNC50ZW1wbGF0ZUxhYmVsKTsKfSB9CmZ1bmN0aW9uIE1hdFRhYkdyb3VwX21hdF90YWJfYm9keV81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgY29uc3QgX3IxNiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXRhYi1ib2R5IiwgMTApOwogICAgybXJtWxpc3RlbmVyKCJfb25DZW50ZXJlZCIsIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX21hdF90YWJfYm9keV81X1RlbXBsYXRlX21hdF90YWJfYm9keV9fb25DZW50ZXJlZF8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxNik7IGNvbnN0IGN0eF9yMTUgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTUuX3JlbW92ZVRhYkJvZHlXcmFwcGVySGVpZ2h0KCk7IH0pKCJfb25DZW50ZXJpbmciLCBmdW5jdGlvbiBNYXRUYWJHcm91cF9tYXRfdGFiX2JvZHlfNV9UZW1wbGF0ZV9tYXRfdGFiX2JvZHlfX29uQ2VudGVyaW5nXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjE2KTsgY29uc3QgY3R4X3IxNyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IxNy5fc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQoJGV2ZW50KTsgfSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHRhYl9yMTMgPSBjdHguJGltcGxpY2l0OwogICAgY29uc3QgaV9yMTQgPSBjdHguaW5kZXg7CiAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10YWItYm9keS1hY3RpdmUiLCBjdHhfcjMuc2VsZWN0ZWRJbmRleCA9PSBpX3IxNCk7CiAgICDJtcm1cHJvcGVydHkoImlkIiwgY3R4X3IzLl9nZXRUYWJDb250ZW50SWQoaV9yMTQpKSgiY29udGVudCIsIHRhYl9yMTMuY29udGVudCkoInBvc2l0aW9uIiwgdGFiX3IxMy5wb3NpdGlvbikoIm9yaWdpbiIsIHRhYl9yMTMub3JpZ2luKSgiYW5pbWF0aW9uRHVyYXRpb24iLCBjdHhfcjMuYW5pbWF0aW9uRHVyYXRpb24pOwogICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IiwgY3R4X3IzLl9nZXRUYWJMYWJlbElkKGlfcjE0KSk7Cn0gfQpjb25zdCBfYzUgPSBbInRhYkxpc3RDb250YWluZXIiXTsKY29uc3QgX2M2ID0gWyJ0YWJMaXN0Il07CmNvbnN0IF9jNyA9IFsibmV4dFBhZ2luYXRvciJdOwpjb25zdCBfYzggPSBbInByZXZpb3VzUGFnaW5hdG9yIl07CmNvbnN0IF9jOSA9IFsibWF0LXRhYi1uYXYtYmFyIiwgIiJdOwovKioKICogSW5qZWN0aW9uIHRva2VuIGZvciB0aGUgTWF0SW5rQmFyJ3MgUG9zaXRpb25lci4KICogQHR5cGUgez99CiAqLwpjb25zdCBfTUFUX0lOS19CQVJfUE9TSVRJT05FUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignTWF0SW5rQmFyUG9zaXRpb25lcicsIHsKICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgIGZhY3Rvcnk6IF9NQVRfSU5LX0JBUl9QT1NJVElPTkVSX0ZBQ1RPUlkKfSk7Ci8qKgogKiBUaGUgZGVmYXVsdCBwb3NpdGlvbmVyIGZ1bmN0aW9uIGZvciB0aGUgTWF0SW5rQmFyLgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX01BVF9JTktfQkFSX1BPU0lUSU9ORVJfRkFDVE9SWSgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1ldGhvZCA9ICgvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGVsZW1lbnQpID0+ICh7CiAgICAgICAgbGVmdDogZWxlbWVudCA/IChlbGVtZW50Lm9mZnNldExlZnQgfHwgMCkgKyAncHgnIDogJzAnLAogICAgICAgIHdpZHRoOiBlbGVtZW50ID8gKGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMCkgKyAncHgnIDogJzAnLAogICAgfSkpOwogICAgcmV0dXJuIG1ldGhvZDsKfQovKioKICogVGhlIGluay1iYXIgaXMgdXNlZCB0byBkaXNwbGF5IGFuZCBhbmltYXRlIHRoZSBsaW5lIHVuZGVybmVhdGggdGhlIGN1cnJlbnQgYWN0aXZlIHRhYiBsYWJlbC4KICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdElua0JhciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSBfaW5rQmFyUG9zaXRpb25lcgogICAgICogQHBhcmFtIHs/PX0gX2FuaW1hdGlvbk1vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9uZ1pvbmUsIF9pbmtCYXJQb3NpdGlvbmVyLCBfYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIHRoaXMuX2lua0JhclBvc2l0aW9uZXIgPSBfaW5rQmFyUG9zaXRpb25lcjsKICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIHN0eWxlcyBmcm9tIHRoZSBwcm92aWRlZCBlbGVtZW50IGluIG9yZGVyIHRvIGFsaWduIHRoZSBpbmstYmFyIHRvIHRoYXQgZWxlbWVudC4KICAgICAqIFNob3dzIHRoZSBpbmsgYmFyIGlmIHByZXZpb3VzbHkgc2V0IGFzIGhpZGRlbi4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWxpZ25Ub0VsZW1lbnQoZWxlbWVudCkgewogICAgICAgIHRoaXMuc2hvdygpOwogICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3NldFN0eWxlcyhlbGVtZW50KSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9zZXRTdHlsZXMoZWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTaG93cyB0aGUgaW5rIGJhci4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNob3coKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CiAgICB9CiAgICAvKioKICAgICAqIEhpZGVzIHRoZSBpbmsgYmFyLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaGlkZSgpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBwcm9wZXIgc3R5bGVzIHRvIHRoZSBpbmsgYmFyIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0U3R5bGVzKGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5faW5rQmFyUG9zaXRpb25lcihlbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5rQmFyID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIGlua0Jhci5zdHlsZS5sZWZ0ID0gcG9zaXRpb25zLmxlZnQ7CiAgICAgICAgaW5rQmFyLnN0eWxlLndpZHRoID0gcG9zaXRpb25zLndpZHRoOwogICAgfQp9Ck1hdElua0Jhci7JtWZhYyA9IGZ1bmN0aW9uIE1hdElua0Jhcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRJbmtCYXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChfTUFUX0lOS19CQVJfUE9TSVRJT05FUiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSk7IH07Ck1hdElua0Jhci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRJbmtCYXIsIHNlbGVjdG9yczogW1sibWF0LWluay1iYXIiXV0sIGhvc3RBdHRyczogWzEsICJtYXQtaW5rLWJhciJdLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRJbmtCYXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiKTsKICAgIH0gfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdElua0Jhci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtfTUFUX0lOS19CQVJfUE9TSVRJT05FUixdIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWItY29udGVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogRGVjb3JhdGVzIHRoZSBgbmctdGVtcGxhdGVgIHRhZ3MgYW5kIHJlYWRzIG91dCB0aGUgdGVtcGxhdGUgZnJvbSBpdC4KICovCmNsYXNzIE1hdFRhYkNvbnRlbnQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlKSB7CiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgfQp9Ck1hdFRhYkNvbnRlbnQuybVmYWMgPSBmdW5jdGlvbiBNYXRUYWJDb250ZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkNvbnRlbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpKTsgfTsKTWF0VGFiQ29udGVudC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRUYWJDb250ZW50LCBzZWxlY3RvcnM6IFtbIiIsICJtYXRUYWJDb250ZW50IiwgIiJdXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdFRhYkNvbnRlbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1sYWJlbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVXNlZCB0byBmbGFnIHRhYiBsYWJlbHMgZm9yIHVzZSB3aXRoIHRoZSBwb3J0YWwgZGlyZWN0aXZlCiAqLwpjbGFzcyBNYXRUYWJMYWJlbCBleHRlbmRzIENka1BvcnRhbCB7Cn0KTWF0VGFiTGFiZWwuybVmYWMgPSBmdW5jdGlvbiBNYXRUYWJMYWJlbF9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0VGFiTGFiZWxfQmFzZUZhY3RvcnkodCB8fCBNYXRUYWJMYWJlbCk7IH07Ck1hdFRhYkxhYmVsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFRhYkxhYmVsLCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtdGFiLWxhYmVsIiwgIiJdLCBbIiIsICJtYXRUYWJMYWJlbCIsICIiXV0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CmNvbnN0IMm1TWF0VGFiTGFiZWxfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRUYWJMYWJlbCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRUYWIuCi8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKi8KY2xhc3MgTWF0VGFiQmFzZSB7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfTWF0VGFiTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlZChNYXRUYWJCYXNlKTsKLyoqCiAqIFVzZWQgdG8gcHJvdmlkZSBhIHRhYiBncm91cCB0byBhIHRhYiB3aXRob3V0IGNhdXNpbmcgYSBjaXJjdWxhciBkZXBlbmRlbmN5LgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BVF9UQUJfR1JPVVAgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01BVF9UQUJfR1JPVVAnKTsKY2xhc3MgTWF0VGFiIGV4dGVuZHMgX01hdFRhYk1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAqIEBwYXJhbSB7Pz19IF9jbG9zZXN0VGFiR3JvdXAKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYsIF9jbG9zZXN0VGFiR3JvdXApIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjsKICAgICAgICB0aGlzLl9jbG9zZXN0VGFiR3JvdXAgPSBfY2xvc2VzdFRhYkdyb3VwOwogICAgICAgIC8qKgogICAgICAgICAqIFBsYWluIHRleHQgbGFiZWwgZm9yIHRoZSB0YWIsIHVzZWQgd2hlbiB0aGVyZSBpcyBubyB0ZW1wbGF0ZSBsYWJlbC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnRleHRMYWJlbCA9ICcnOwogICAgICAgIC8qKgogICAgICAgICAqIFBvcnRhbCB0aGF0IHdpbGwgYmUgdGhlIGhvc3RlZCBjb250ZW50IG9mIHRoZSB0YWIKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9jb250ZW50UG9ydGFsID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB3aGVuZXZlciB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRhYiBjaGFuZ2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHJlbGF0aXZlbHkgaW5kZXhlZCBwb3NpdGlvbiB3aGVyZSAwIHJlcHJlc2VudHMgdGhlIGNlbnRlciwgbmVnYXRpdmUgaXMgbGVmdCwgYW5kIHBvc2l0aXZlCiAgICAgICAgICogcmVwcmVzZW50cyB0aGUgcmlnaHQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGluaXRpYWwgcmVsYXRpdmVseSBpbmRleCBvcmlnaW4gb2YgdGhlIHRhYiBpZiBpdCB3YXMgY3JlYXRlZCBhbmQgc2VsZWN0ZWQgYWZ0ZXIgdGhlcmUKICAgICAgICAgKiB3YXMgYWxyZWFkeSBhIHNlbGVjdGVkIHRhYi4gUHJvdmlkZXMgY29udGV4dCBvZiB3aGF0IHBvc2l0aW9uIHRoZSB0YWIgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tLgogICAgICAgICAqLwogICAgICAgIHRoaXMub3JpZ2luID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSB0YWIgaXMgY3VycmVudGx5IGFjdGl2ZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIENvbnRlbnQgZm9yIHRoZSB0YWIgbGFiZWwgZ2l2ZW4gYnkgYDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPmAuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdGVtcGxhdGVMYWJlbCgpIHsgcmV0dXJuIHRoaXMuX3RlbXBsYXRlTGFiZWw7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHRlbXBsYXRlTGFiZWwodmFsdWUpIHsKICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgdGVtcGxhdGVMYWJlbCB2aWEgcXVlcnkgaWYgdGhlcmUgaXMgYWN0dWFsbHkKICAgICAgICAvLyBhIE1hdFRhYkxhYmVsIGZvdW5kLiBUaGlzIHdvcmtzIGFyb3VuZCBhbiBpc3N1ZSB3aGVyZSBhIHVzZXIgbWF5IGhhdmUKICAgICAgICAvLyBtYW51YWxseSBzZXQgYHRlbXBsYXRlTGFiZWxgIGR1cmluZyBjcmVhdGlvbiBtb2RlLCB3aGljaCB3b3VsZCB0aGVuIGdldCBjbG9iYmVyZWQKICAgICAgICAvLyBieSBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgcXVlcnkgcmVzb2x2ZXMuCiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlTGFiZWwgPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY29udGVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFBvcnRhbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3RleHRMYWJlbCcpIHx8IGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2Rpc2FibGVkJykpIHsKICAgICAgICAgICAgdGhpcy5fc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLl9jb250ZW50UG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuX2V4cGxpY2l0Q29udGVudCB8fCB0aGlzLl9pbXBsaWNpdENvbnRlbnQsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpOwogICAgfQp9Ck1hdFRhYi7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWIpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1RBQl9HUk9VUCwgOCkpOyB9OwpNYXRUYWIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0VGFiLCBzZWxlY3RvcnM6IFtbIm1hdC10YWIiXV0sIGNvbnRlbnRRdWVyaWVzOiBmdW5jdGlvbiBNYXRUYWJfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdFRhYkxhYmVsLCB0cnVlKTsKICAgICAgICDJtcm1c3RhdGljQ29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRUYWJDb250ZW50LCB0cnVlLCBUZW1wbGF0ZVJlZik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC50ZW1wbGF0ZUxhYmVsID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2V4cGxpY2l0Q29udGVudCA9IF90LmZpcnN0KTsKICAgIH0gfSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRUYWJfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShUZW1wbGF0ZVJlZiwgdHJ1ZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW1wbGljaXRDb250ZW50ID0gX3QuZmlyc3QpOwogICAgfSB9LCBpbnB1dHM6IHsgZGlzYWJsZWQ6ICJkaXNhYmxlZCIsIHRleHRMYWJlbDogWyJsYWJlbCIsICJ0ZXh0TGFiZWwiXSwgYXJpYUxhYmVsOiBbImFyaWEtbGFiZWwiLCAiYXJpYUxhYmVsIl0sIGFyaWFMYWJlbGxlZGJ5OiBbImFyaWEtbGFiZWxsZWRieSIsICJhcmlhTGFiZWxsZWRieSJdIH0sIGV4cG9ydEFzOiBbIm1hdFRhYiJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMCQzLCBkZWNsczogMSwgdmFyczogMCwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRhYl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgwLCBNYXRUYWJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZSwgMSwgMCwgIm5nLXRlbXBsYXRlIik7CiAgICB9IH0sIGVuY2Fwc3VsYXRpb246IDIgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRUYWIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9UQUJfR1JPVVAsXSB9XSB9Cl07Ck1hdFRhYi5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHRlbXBsYXRlTGFiZWw6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW01hdFRhYkxhYmVsLF0gfV0sCiAgICBfZXhwbGljaXRDb250ZW50OiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNYXRUYWJDb250ZW50LCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSxdIH1dLAogICAgX2ltcGxpY2l0Q29udGVudDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIHRleHRMYWJlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbGFiZWwnLF0gfV0sCiAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICBhcmlhTGFiZWxsZWRieTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnYXJpYS1sYWJlbGxlZGJ5JyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWJzLWFuaW1hdGlvbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFuaW1hdGlvbnMgdXNlZCBieSB0aGUgTWF0ZXJpYWwgdGFicy4KICogXEBkb2NzLXByaXZhdGUKICogQHR5cGUgez99CiAqLwpjb25zdCBtYXRUYWJzQW5pbWF0aW9ucyA9IHsKICAgIC8qKgogICAgICogQW5pbWF0aW9uIHRyYW5zbGF0ZXMgYSB0YWIgYWxvbmcgdGhlIFggYXhpcy4KICAgICAqLwogICAgdHJhbnNsYXRlVGFiOiB0cmlnZ2VyKCd0cmFuc2xhdGVUYWInLCBbCiAgICAgICAgLy8gTm90ZTogdHJhbnNpdGlvbnMgdG8gYG5vbmVgIGluc3RlYWQgb2YgMCwgYmVjYXVzZSBzb21lIGJyb3dzZXJzIG1pZ2h0IGJsdXIgdGhlIGNvbnRlbnQuCiAgICAgICAgc3RhdGUoJ2NlbnRlciwgdm9pZCwgbGVmdC1vcmlnaW4tY2VudGVyLCByaWdodC1vcmlnaW4tY2VudGVyJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdub25lJyB9KSksCiAgICAgICAgLy8gSWYgdGhlIHRhYiBpcyBlaXRoZXIgb24gdGhlIGxlZnQgb3IgcmlnaHQsIHdlIGFkZGl0aW9uYWxseSBhZGQgYSBgbWluLWhlaWdodGAgb2YgMXB4CiAgICAgICAgLy8gaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGEgaGVpZ2h0IGJlZm9yZSBpdHMgc3RhdGUgY2hhbmdlcy4gVGhpcyBpcwogICAgICAgIC8vIG5lY2Vzc2FyeSBiZWNhdXNlIENocm9tZSBkb2VzIHNlZW0gdG8gc2tpcCB0aGUgdHJhbnNpdGlvbiBpbiBSVEwgbW9kZSBpZiB0aGUgZWxlbWVudCBkb2VzCiAgICAgICAgLy8gbm90IGhhdmUgYSBzdGF0aWMgaGVpZ2h0IGFuZCBpcyBub3QgcmVuZGVyZWQuIFNlZSByZWxhdGVkIGlzc3VlOiAjOTQ2NQogICAgICAgIHN0YXRlKCdsZWZ0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknLCBtaW5IZWlnaHQ6ICcxcHgnIH0pKSwKICAgICAgICBzdGF0ZSgncmlnaHQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJywgbWluSGVpZ2h0OiAnMXB4JyB9KSksCiAgICAgICAgdHJhbnNpdGlvbignKiA9PiBsZWZ0LCAqID0+IHJpZ2h0LCBsZWZ0ID0+IGNlbnRlciwgcmlnaHQgPT4gY2VudGVyJywgYW5pbWF0ZSgne3thbmltYXRpb25EdXJhdGlvbn19IGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKScpKSwKICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGxlZnQtb3JpZ2luLWNlbnRlcicsIFsKICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknIH0pLAogICAgICAgICAgICBhbmltYXRlKCd7e2FuaW1hdGlvbkR1cmF0aW9ufX0gY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJykKICAgICAgICBdKSwKICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IHJpZ2h0LW9yaWdpbi1jZW50ZXInLCBbCiAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMTAwJSwgMCwgMCknIH0pLAogICAgICAgICAgICBhbmltYXRlKCd7e2FuaW1hdGlvbkR1cmF0aW9ufX0gY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJykKICAgICAgICBdKQogICAgXSkKfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1ib2R5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaGUgcG9ydGFsIGhvc3QgZGlyZWN0aXZlIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHRhYi4KICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdFRhYkJvZHlQb3J0YWwgZXh0ZW5kcyBDZGtQb3J0YWxPdXRsZXQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgogICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyUmVmCiAgICAgKiBAcGFyYW0gez99IF9ob3N0CiAgICAgKiBAcGFyYW0gez89fSBfZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCB2aWV3Q29udGFpbmVyUmVmLCBfaG9zdCwgCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkIGBfZG9jdW1lbnRgIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgICogQGJyZWFraW5nLWNoYW5nZSA5LjAuMAogICAgICovCiAgICBfZG9jdW1lbnQpIHsKICAgICAgICBzdXBlcihjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHZpZXdDb250YWluZXJSZWYsIF9kb2N1bWVudCk7CiAgICAgICAgdGhpcy5faG9zdCA9IF9ob3N0OwogICAgICAgIC8qKgogICAgICAgICAqIFN1YnNjcmlwdGlvbiB0byBldmVudHMgZm9yIHdoZW4gdGhlIHRhYiBib2R5IGJlZ2lucyBjZW50ZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fY2VudGVyaW5nU3ViID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIC8qKgogICAgICAgICAqIFN1YnNjcmlwdGlvbiB0byBldmVudHMgZm9yIHdoZW4gdGhlIHRhYiBib2R5IGZpbmlzaGVzIGxlYXZpbmcgZnJvbSBjZW50ZXIgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbGVhdmluZ1N1YiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGluaXRpYWwgdmlzaWJpbGl0eSBvciBzZXQgdXAgc3Vic2NyaXB0aW9uIGZvciBjaGFuZ2luZyB2aXNpYmlsaXR5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgc3VwZXIubmdPbkluaXQoKTsKICAgICAgICB0aGlzLl9jZW50ZXJpbmdTdWIgPSB0aGlzLl9ob3N0Ll9iZWZvcmVDZW50ZXJpbmcKICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuX2hvc3QuX2lzQ2VudGVyUG9zaXRpb24odGhpcy5faG9zdC5fcG9zaXRpb24pKSkKICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0NlbnRlcmluZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGlzQ2VudGVyaW5nKSA9PiB7CiAgICAgICAgICAgIGlmIChpc0NlbnRlcmluZyAmJiAhdGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaCh0aGlzLl9ob3N0Ll9jb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLl9sZWF2aW5nU3ViID0gdGhpcy5faG9zdC5fYWZ0ZXJMZWF2aW5nQ2VudGVyLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZGV0YWNoKCk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhbiB1cCBjZW50ZXJpbmcgc3Vic2NyaXB0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTsKICAgICAgICB0aGlzLl9jZW50ZXJpbmdTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICB0aGlzLl9sZWF2aW5nU3ViLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KTWF0VGFiQm9keVBvcnRhbC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYkJvZHlQb3J0YWxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0VGFiQm9keVBvcnRhbCkoybXJtWRpcmVjdGl2ZUluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KGZvcndhcmRSZWYoKCAvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8oKSA9PiBNYXRUYWJCb2R5KSkpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKTWF0VGFiQm9keVBvcnRhbC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRUYWJCb2R5UG9ydGFsLCBzZWxlY3RvcnM6IFtbIiIsICJtYXRUYWJCb2R5SG9zdCIsICIiXV0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRUYWJCb2R5UG9ydGFsLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfSwKICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgeyB0eXBlOiBNYXRUYWJCb2R5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtmb3J3YXJkUmVmKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IE1hdFRhYkJvZHkpKSxdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKLyoqCiAqIEJhc2UgY2xhc3Mgd2l0aCBhbGwgb2YgdGhlIGBNYXRUYWJCb2R5YCBmdW5jdGlvbmFsaXR5LgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAYWJzdHJhY3QKICovCi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lCmNsYXNzIF9NYXRUYWJCb2R5QmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VEZXRlY3RvclJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX2RpciwgY2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAvKioKICAgICAgICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIGRpcmVjdGlvbmFsaXR5IGNoYW5nZSBvYnNlcnZhYmxlLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB3aGVuIGFuIGFuaW1hdGlvbiBvbiB0aGUgdGFiIGlzIGNvbXBsZXRlLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3RyYW5zbGF0ZVRhYkNvbXBsZXRlID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHRhYiBiZWdpbnMgdG8gYW5pbWF0ZSB0b3dhcmRzIHRoZSBjZW50ZXIgYXMgdGhlIGFjdGl2ZSB0YWIuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb25DZW50ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCBiZWZvcmUgdGhlIGNlbnRlcmluZyBvZiB0aGUgdGFiIGJlZ2lucy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9iZWZvcmVDZW50ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCBiZWZvcmUgdGhlIGNlbnRlcmluZyBvZiB0aGUgdGFiIGJlZ2lucy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9hZnRlckxlYXZpbmdDZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB0YWIgY29tcGxldGVzIGl0cyBhbmltYXRpb24gdG93YXJkcyB0aGUgY2VudGVyLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX29uQ2VudGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpOwogICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbiBieSBgTWF0VGFiQm9keWAsIGJ1dCB3ZSBuZWVkIG9uZQogICAgICAgIC8vIGFueXdheSB0byBwcmV2ZW50IHRoZSBhbmltYXRpb25zIG1vZHVsZSBmcm9tIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZSBib2R5IGlzIHVzZWQgb24gaXRzIG93bi4KICAgICAgICAvKioKICAgICAgICAgKiBEdXJhdGlvbiBmb3IgdGhlIHRhYidzIGFuaW1hdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmFuaW1hdGlvbkR1cmF0aW9uID0gJzUwMG1zJzsKICAgICAgICBpZiAoX2RpcikgewogICAgICAgICAgICB0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb24gPSBfZGlyLmNoYW5nZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRpcikgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fY29tcHV0ZVBvc2l0aW9uQW5pbWF0aW9uU3RhdGUoZGlyKTsKICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGdldCB1bmlxdWUgYW5pbWF0aW9uIGV2ZW50cywgYmVjYXVzZSB0aGUgYC5kb25lYCBjYWxsYmFjayBjYW4gZ2V0CiAgICAgICAgLy8gaW52b2tlZCB0d2ljZSBpbiBzb21lIGJyb3dzZXJzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjQwODQuCiAgICAgICAgdGhpcy5fdHJhbnNsYXRlVGFiQ29tcGxldGUucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB4CiAgICAgICAgICogQHBhcmFtIHs/fSB5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoeCwgeSkgPT4gewogICAgICAgICAgICByZXR1cm4geC5mcm9tU3RhdGUgPT09IHkuZnJvbVN0YXRlICYmIHgudG9TdGF0ZSA9PT0geS50b1N0YXRlOwogICAgICAgIH0pKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBjZW50ZXIgaXMgY29tcGxldGUsIGVtaXQgYW4gZXZlbnQuCiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NlbnRlclBvc2l0aW9uKGV2ZW50LnRvU3RhdGUpICYmIHRoaXMuX2lzQ2VudGVyUG9zaXRpb24odGhpcy5fcG9zaXRpb24pKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkNlbnRlcmVkLmVtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5faXNDZW50ZXJQb3NpdGlvbihldmVudC5mcm9tU3RhdGUpICYmICF0aGlzLl9pc0NlbnRlclBvc2l0aW9uKHRoaXMuX3Bvc2l0aW9uKSkgewogICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJMZWF2aW5nQ2VudGVyLmVtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogVGhlIHNoaWZ0ZWQgaW5kZXggcG9zaXRpb24gb2YgdGhlIHRhYiBib2R5LCB3aGVyZSB6ZXJvIHJlcHJlc2VudHMgdGhlIGFjdGl2ZSBjZW50ZXIgdGFiLgogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHBvc2l0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgdGhpcy5fcG9zaXRpb25JbmRleCA9IHBvc2l0aW9uOwogICAgICAgIHRoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEFmdGVyIGluaXRpYWxpemVkLCBjaGVjayBpZiB0aGUgY29udGVudCBpcyBjZW50ZXJlZCBhbmQgaGFzIGFuIG9yaWdpbi4gSWYgc28sIHNldCB0aGUKICAgICAqIHNwZWNpYWwgcG9zaXRpb24gc3RhdGVzIHRoYXQgdHJhbnNpdGlvbiB0aGUgdGFiIGZyb20gdGhlIGxlZnQgb3IgcmlnaHQgYmVmb3JlIGNlbnRlcmluZy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25Jbml0KCkgewogICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PSAnY2VudGVyJyAmJiB0aGlzLm9yaWdpbiAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gdGhpcy5fY29tcHV0ZVBvc2l0aW9uRnJvbU9yaWdpbih0aGlzLm9yaWdpbik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB0aGlzLl90cmFuc2xhdGVUYWJDb21wbGV0ZS5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25UcmFuc2xhdGVUYWJTdGFydGVkKGV2ZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzQ2VudGVyaW5nID0gdGhpcy5faXNDZW50ZXJQb3NpdGlvbihldmVudC50b1N0YXRlKTsKICAgICAgICB0aGlzLl9iZWZvcmVDZW50ZXJpbmcuZW1pdChpc0NlbnRlcmluZyk7CiAgICAgICAgaWYgKGlzQ2VudGVyaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX29uQ2VudGVyaW5nLmVtaXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIGNvbnRhaW5pbmcgYXBwLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldExheW91dERpcmVjdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGlyICYmIHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcgPyAncnRsJyA6ICdsdHInOwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBwcm92aWRlZCBwb3NpdGlvbiBzdGF0ZSBpcyBjb25zaWRlcmVkIGNlbnRlciwgcmVnYXJkbGVzcyBvZiBvcmlnaW4uCiAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNDZW50ZXJQb3NpdGlvbihwb3NpdGlvbikgewogICAgICAgIHJldHVybiBwb3NpdGlvbiA9PSAnY2VudGVyJyB8fAogICAgICAgICAgICBwb3NpdGlvbiA9PSAnbGVmdC1vcmlnaW4tY2VudGVyJyB8fAogICAgICAgICAgICBwb3NpdGlvbiA9PSAncmlnaHQtb3JpZ2luLWNlbnRlcic7CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGVzIHRoZSBwb3NpdGlvbiBzdGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRhYi1ib2R5IGFuaW1hdGlvbiB0cmlnZ2VyLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Pz19IGRpcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKGRpciA9IHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKSB7CiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uSW5kZXggPCAwKSB7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gZGlyID09ICdsdHInID8gJ2xlZnQnIDogJ3JpZ2h0JzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5fcG9zaXRpb25JbmRleCA+IDApIHsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBkaXIgPT0gJ2x0cicgPyAncmlnaHQnIDogJ2xlZnQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSAnY2VudGVyJzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGVzIHRoZSBwb3NpdGlvbiBzdGF0ZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIG9yaWdpbiBwb3NpdGlvbi4gVGhpcyBpcyB1c2VkIGlmIHRoZQogICAgICogdGFiIGlzIGJlY29taW5nIHZpc2libGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jb21wdXRlUG9zaXRpb25Gcm9tT3JpZ2luKG9yaWdpbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXIgPSB0aGlzLl9nZXRMYXlvdXREaXJlY3Rpb24oKTsKICAgICAgICBpZiAoKGRpciA9PSAnbHRyJyAmJiBvcmlnaW4gPD0gMCkgfHwgKGRpciA9PSAncnRsJyAmJiBvcmlnaW4gPiAwKSkgewogICAgICAgICAgICByZXR1cm4gJ2xlZnQtb3JpZ2luLWNlbnRlcic7CiAgICAgICAgfQogICAgICAgIHJldHVybiAncmlnaHQtb3JpZ2luLWNlbnRlcic7CiAgICB9Cn0KX01hdFRhYkJvZHlCYXNlLsm1ZmFjID0gZnVuY3Rpb24gX01hdFRhYkJvZHlCYXNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IF9NYXRUYWJCb2R5QmFzZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpKTsgfTsKX01hdFRhYkJvZHlCYXNlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IF9NYXRUYWJCb2R5QmFzZSwgaW5wdXRzOiB7IGFuaW1hdGlvbkR1cmF0aW9uOiAiYW5pbWF0aW9uRHVyYXRpb24iLCBwb3NpdGlvbjogInBvc2l0aW9uIiwgX2NvbnRlbnQ6IFsiY29udGVudCIsICJfY29udGVudCJdLCBvcmlnaW46ICJvcmlnaW4iIH0sIG91dHB1dHM6IHsgX29uQ2VudGVyaW5nOiAiX29uQ2VudGVyaW5nIiwgX2JlZm9yZUNlbnRlcmluZzogIl9iZWZvcmVDZW50ZXJpbmciLCBfYWZ0ZXJMZWF2aW5nQ2VudGVyOiAiX2FmdGVyTGVhdmluZ0NlbnRlciIsIF9vbkNlbnRlcmVkOiAiX29uQ2VudGVyZWQiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpfTWF0VGFiQm9keUJhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0KXTsKX01hdFRhYkJvZHlCYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgX29uQ2VudGVyaW5nOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBfYmVmb3JlQ2VudGVyaW5nOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBfYWZ0ZXJMZWF2aW5nQ2VudGVyOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBfb25DZW50ZXJlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgX2NvbnRlbnQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2NvbnRlbnQnLF0gfV0sCiAgICBvcmlnaW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgYW5pbWF0aW9uRHVyYXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgcG9zaXRpb246IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBXcmFwcGVyIGZvciB0aGUgY29udGVudHMgb2YgYSB0YWIuCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBNYXRUYWJCb2R5IGV4dGVuZHMgX01hdFRhYkJvZHlCYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VEZXRlY3RvclJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBkaXIsIGNoYW5nZURldGVjdG9yUmVmKSB7CiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgZGlyLCBjaGFuZ2VEZXRlY3RvclJlZik7CiAgICB9Cn0KTWF0VGFiQm9keS7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYkJvZHlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0VGFiQm9keSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpKTsgfTsKTWF0VGFiQm9keS7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRUYWJCb2R5LCBzZWxlY3RvcnM6IFtbIm1hdC10YWItYm9keSJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRUYWJCb2R5X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybV2aWV3UXVlcnkoUG9ydGFsSG9zdERpcmVjdGl2ZSwgdHJ1ZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcG9ydGFsSG9zdCA9IF90LmZpcnN0KTsKICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC10YWItYm9keSJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBkZWNsczogMywgdmFyczogNiwgY29uc3RzOiBbWzEsICJtYXQtdGFiLWJvZHktY29udGVudCJdLCBbImNvbnRlbnQiLCAiIl0sIFsibWF0VGFiQm9keUhvc3QiLCAiIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0VGFiQm9keV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIkB0cmFuc2xhdGVUYWIuc3RhcnQiLCBmdW5jdGlvbiBNYXRUYWJCb2R5X1RlbXBsYXRlX2Rpdl9hbmltYXRpb25fdHJhbnNsYXRlVGFiX3N0YXJ0XzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX29uVHJhbnNsYXRlVGFiU3RhcnRlZCgkZXZlbnQpOyB9KSgiQHRyYW5zbGF0ZVRhYi5kb25lIiwgZnVuY3Rpb24gTWF0VGFiQm9keV9UZW1wbGF0ZV9kaXZfYW5pbWF0aW9uX3RyYW5zbGF0ZVRhYl9kb25lXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLm5leHQoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIE1hdFRhYkJvZHlfbmdfdGVtcGxhdGVfMl9UZW1wbGF0ZSwgMCwgMCwgIm5nLXRlbXBsYXRlIiwgMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVwcm9wZXJ0eSgiQHRyYW5zbGF0ZVRhYiIsIMm1ybVwdXJlRnVuY3Rpb24yKDMsIF9jMiQxLCBjdHguX3Bvc2l0aW9uLCDJtcm1cHVyZUZ1bmN0aW9uMSgxLCBfYzEkMywgY3R4LmFuaW1hdGlvbkR1cmF0aW9uKSkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0VGFiQm9keVBvcnRhbF0sIHN0eWxlczogWyIubWF0LXRhYi1ib2R5LWNvbnRlbnR7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0b30ubWF0LXRhYi1ncm91cC1keW5hbWljLWhlaWdodCAubWF0LXRhYi1ib2R5LWNvbnRlbnR7b3ZlcmZsb3c6aGlkZGVufVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGRhdGE6IHsgYW5pbWF0aW9uOiBbbWF0VGFic0FuaW1hdGlvbnMudHJhbnNsYXRlVGFiXSB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0VGFiQm9keS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfQpdOwpNYXRUYWJCb2R5LnByb3BEZWNvcmF0b3JzID0gewogICAgX3BvcnRhbEhvc3Q6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1BvcnRhbEhvc3REaXJlY3RpdmUsXSB9XQp9OwovKioKICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIHRoZSB0YWJzIG1vZHVsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfVEFCU19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01BVF9UQUJTX0NPTkZJRycpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3RhYnMvdGFiLWdyb3VwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRCdzIGZvciBlYWNoIHRhYiBjb21wb25lbnQKICogQHR5cGUgez99CiAqLwpsZXQgbmV4dElkJDEgPSAwOwovKioKICogQSBzaW1wbGUgY2hhbmdlIGV2ZW50IGVtaXR0ZWQgb24gZm9jdXMgb3Igc2VsZWN0aW9uIGNoYW5nZXMuCiAqLwpjbGFzcyBNYXRUYWJDaGFuZ2VFdmVudCB7Cn0KLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRUYWJHcm91cC4KLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBNYXRUYWJHcm91cE1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfTWF0VGFiR3JvdXBNaXhpbkJhc2UgPSBtaXhpbkNvbG9yKG1peGluRGlzYWJsZVJpcHBsZShNYXRUYWJHcm91cE1peGluQmFzZSksICdwcmltYXJ5Jyk7Ci8qKgogKiBCYXNlIGNsYXNzIHdpdGggYWxsIG9mIHRoZSBgTWF0VGFiR3JvdXBCYXNlYCBmdW5jdGlvbmFsaXR5LgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAYWJzdHJhY3QKICovCi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lCmNsYXNzIF9NYXRUYWJHcm91cEJhc2UgZXh0ZW5kcyBfTWF0VGFiR3JvdXBNaXhpbkJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0Q29uZmlnCiAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBfY2hhbmdlRGV0ZWN0b3JSZWYsIGRlZmF1bHRDb25maWcsIF9hbmltYXRpb25Nb2RlKSB7CiAgICAgICAgc3VwZXIoZWxlbWVudFJlZik7CiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgdGhpcy5fYW5pbWF0aW9uTW9kZSA9IF9hbmltYXRpb25Nb2RlOwogICAgICAgIC8qKgogICAgICAgICAqIEFsbCBvZiB0aGUgdGFicyB0aGF0IGJlbG9uZyB0byB0aGUgZ3JvdXAuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdGFicyA9IG5ldyBRdWVyeUxpc3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdGFiIGluZGV4IHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGFmdGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIGNoZWNrZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faW5kZXhUb1NlbGVjdCA9IDA7CiAgICAgICAgLyoqCiAgICAgICAgICogU25hcHNob3Qgb2YgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGJvZHkgd3JhcHBlciBiZWZvcmUgYW5vdGhlciB0YWIgaXMgYWN0aXZhdGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0ID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBTdWJzY3JpcHRpb24gdG8gdGFicyBiZWluZyBhZGRlZC9yZW1vdmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3RhYnNTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIHRhYiBsYWJlbHMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgdGhpcy5fZHluYW1pY0hlaWdodCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFBvc2l0aW9uIG9mIHRoZSB0YWIgaGVhZGVyLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaGVhZGVyUG9zaXRpb24gPSAnYWJvdmUnOwogICAgICAgIC8qKgogICAgICAgICAqIE91dHB1dCB0byBlbmFibGUgc3VwcG9ydCBmb3IgdHdvLXdheSBiaW5kaW5nIG9uIGBbKHNlbGVjdGVkSW5kZXgpXWAKICAgICAgICAgKi8KICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGZvY3VzIGhhcyBjaGFuZ2VkIHdpdGhpbiBhIHRhYiBncm91cC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmZvY3VzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgYm9keSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZAogICAgICAgICAqLwogICAgICAgIHRoaXMuYW5pbWF0aW9uRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHRhYiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7CiAgICAgICAgdGhpcy5fZ3JvdXBJZCA9IG5leHRJZCQxKys7CiAgICAgICAgdGhpcy5hbmltYXRpb25EdXJhdGlvbiA9IGRlZmF1bHRDb25maWcgJiYgZGVmYXVsdENvbmZpZy5hbmltYXRpb25EdXJhdGlvbiA/CiAgICAgICAgICAgIGRlZmF1bHRDb25maWcuYW5pbWF0aW9uRHVyYXRpb24gOiAnNTAwbXMnOwogICAgICAgIHRoaXMuZGlzYWJsZVBhZ2luYXRpb24gPSBkZWZhdWx0Q29uZmlnICYmIGRlZmF1bHRDb25maWcuZGlzYWJsZVBhZ2luYXRpb24gIT0gbnVsbCA/CiAgICAgICAgICAgIGRlZmF1bHRDb25maWcuZGlzYWJsZVBhZ2luYXRpb24gOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgdGFiIGdyb3VwIHNob3VsZCBncm93IHRvIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgdGFiLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGR5bmFtaWNIZWlnaHQoKSB7IHJldHVybiB0aGlzLl9keW5hbWljSGVpZ2h0OyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBkeW5hbWljSGVpZ2h0KHZhbHVlKSB7IHRoaXMuX2R5bmFtaWNIZWlnaHQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAvKioKICAgICAqIFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIHRhYi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBzZWxlY3RlZEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0ZWRJbmRleDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgc2VsZWN0ZWRJbmRleCh2YWx1ZSkgewogICAgICAgIHRoaXMuX2luZGV4VG9TZWxlY3QgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgbnVsbCk7CiAgICB9CiAgICAvKioKICAgICAqIER1cmF0aW9uIGZvciB0aGUgdGFiIGFuaW1hdGlvbi4gV2lsbCBiZSBub3JtYWxpemVkIHRvIG1pbGxpc2Vjb25kcyBpZiBubyB1bml0cyBhcmUgc2V0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFuaW1hdGlvbkR1cmF0aW9uKCkgeyByZXR1cm4gdGhpcy5fYW5pbWF0aW9uRHVyYXRpb247IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGFuaW1hdGlvbkR1cmF0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRHVyYXRpb24gPSAvXlxkKyQvLnRlc3QodmFsdWUpID8gdmFsdWUgKyAnbXMnIDogdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRhYiBncm91cC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBiYWNrZ3JvdW5kQ29sb3IoKSB7IHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGJhY2tncm91bmRDb2xvcih2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIG5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShgbWF0LWJhY2tncm91bmQtJHt0aGlzLmJhY2tncm91bmRDb2xvcn1gKTsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBtYXQtYmFja2dyb3VuZC0ke3ZhbHVlfWApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogQWZ0ZXIgdGhlIGNvbnRlbnQgaXMgY2hlY2tlZCwgdGhpcyBjb21wb25lbnQga25vd3Mgd2hhdCB0YWJzIGhhdmUgYmVlbiBkZWZpbmVkCiAgICAgKiBhbmQgd2hhdCB0aGUgc2VsZWN0ZWQgaW5kZXggc2hvdWxkIGJlLiBUaGlzIGlzIHdoZXJlIHdlIGNhbiBrbm93IGV4YWN0bHkgd2hhdCBwb3NpdGlvbgogICAgICogZWFjaCB0YWIgc2hvdWxkIGJlIGluIGFjY29yZGluZyB0byB0aGUgbmV3IHNlbGVjdGVkIGluZGV4LCBhbmQgYWRkaXRpb25hbGx5IHdlIGtub3cgaG93CiAgICAgKiBhIG5ldyBzZWxlY3RlZCB0YWIgc2hvdWxkIHRyYW5zaXRpb24gaW4gKGZyb20gdGhlIGxlZnQgb3IgcmlnaHQpLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkgewogICAgICAgIC8vIERvbid0IGNsYW1wIHRoZSBgaW5kZXhUb1NlbGVjdGAgaW1tZWRpYXRlbHkgaW4gdGhlIHNldHRlciBiZWNhdXNlIGl0IGNhbiBoYXBwZW4gdGhhdAogICAgICAgIC8vIHRoZSBhbW91bnQgb2YgdGFicyBjaGFuZ2VzIGJlZm9yZSB0aGUgYWN0dWFsIGNoYW5nZSBkZXRlY3Rpb24gcnVucy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXhUb1NlbGVjdCA9IHRoaXMuX2luZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpOwogICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHNlbGVjdGVkIGluZGV4LCBlbWl0IGEgY2hhbmdlIGV2ZW50LiBTaG91bGQgbm90IHRyaWdnZXIgaWYKICAgICAgICAvLyB0aGUgc2VsZWN0ZWQgaW5kZXggaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC4KICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRJbmRleCAhPSBpbmRleFRvU2VsZWN0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNGaXJzdFJ1biA9IHRoaXMuX3NlbGVjdGVkSW5kZXggPT0gbnVsbDsKICAgICAgICAgICAgaWYgKCFpc0ZpcnN0UnVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiQ2hhbmdlLmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoaW5kZXhUb1NlbGVjdCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoYW5naW5nIHRoZXNlIHZhbHVlcyBhZnRlciBjaGFuZ2UgZGV0ZWN0aW9uIGhhcyBydW4KICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNoZWNrZWQgY29udGVudCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZW0uCiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fdGFicy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGFiCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAodGFiLCBpbmRleCkgPT4gdGFiLmlzQWN0aXZlID0gaW5kZXggPT09IGluZGV4VG9TZWxlY3QpKTsKICAgICAgICAgICAgICAgIGlmICghaXNGaXJzdFJ1bikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZS5lbWl0KGluZGV4VG9TZWxlY3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8vIFNldHVwIHRoZSBwb3NpdGlvbiBmb3IgZWFjaCB0YWIgYW5kIG9wdGlvbmFsbHkgc2V0dXAgYW4gb3JpZ2luIG9uIHRoZSBuZXh0IHNlbGVjdGVkIHRhYi4KICAgICAgICB0aGlzLl90YWJzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGFiCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHRhYiwgaW5kZXgpID0+IHsKICAgICAgICAgICAgdGFiLnBvc2l0aW9uID0gaW5kZXggLSBpbmRleFRvU2VsZWN0OwogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgc2VsZWN0ZWQgdGFiLCB0aGVuIHNldCB1cCBhbiBvcmlnaW4gZm9yIHRoZSBuZXh0IHNlbGVjdGVkIHRhYgogICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGhhdmUgb25lIGFscmVhZHkuCiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9IG51bGwgJiYgdGFiLnBvc2l0aW9uID09IDAgJiYgIXRhYi5vcmlnaW4pIHsKICAgICAgICAgICAgICAgIHRhYi5vcmlnaW4gPSBpbmRleFRvU2VsZWN0IC0gdGhpcy5fc2VsZWN0ZWRJbmRleDsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRJbmRleCAhPT0gaW5kZXhUb1NlbGVjdCkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gaW5kZXhUb1NlbGVjdDsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgdGhpcy5fc3Vic2NyaWJlVG9BbGxUYWJDaGFuZ2VzKCk7CiAgICAgICAgdGhpcy5fc3Vic2NyaWJlVG9UYWJMYWJlbHMoKTsKICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiB0aGUgYW1vdW50IG9mIHRhYnMsIGluIG9yZGVyIHRvIGJlCiAgICAgICAgLy8gYWJsZSB0byByZS1yZW5kZXIgdGhlIGNvbnRlbnQgYXMgbmV3IHRhYnMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCiAgICAgICAgdGhpcy5fdGFic1N1YnNjcmlwdGlvbiA9IHRoaXMuX3RhYnMuY2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpOwogICAgICAgICAgICAvLyBNYWludGFpbiB0aGUgcHJldmlvdXNseS1zZWxlY3RlZCB0YWIgaWYgYSBuZXcgdGFiIGlzIGFkZGVkIG9yIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vCiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNoYW5nZSB0aGF0IHNlbGVjdHMgYSBkaWZmZXJlbnQgdGFiLgogICAgICAgICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PT0gdGhpcy5fc2VsZWN0ZWRJbmRleCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IHRoaXMuX3RhYnMudG9BcnJheSgpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYnNbaV0uaXNBY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGJvdGggdG8gdGhlIGBfaW5kZXhUb1NlbGVjdGAgYW5kIGBfc2VsZWN0ZWRJbmRleGAgc28gd2UgZG9uJ3QgZmlyZSBhIGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQsIG90aGVyd2lzZSB0aGUgY29uc3VtZXIgbWF5IGVuZCB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIGluIHNvbWUgZWRnZSBjYXNlcyBsaWtlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyBhIHRhYiB3aXRoaW4gdGhlIGBzZWxlY3RlZEluZGV4Q2hhbmdlYCBldmVudC4KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXhUb1NlbGVjdCA9IHRoaXMuX3NlbGVjdGVkSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBMaXN0ZW5zIHRvIGNoYW5nZXMgaW4gYWxsIG9mIHRoZSB0YWJzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zdWJzY3JpYmVUb0FsbFRhYkNoYW5nZXMoKSB7CiAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGEgcXVlcnkgd2l0aCBgZGVzY2VuZGFudHM6IHRydWVgIHRvIHBpY2sgdXAgdGhlIHRhYnMsIHdlIG1heSBlbmQgdXAgY2F0Y2hpbmcKICAgICAgICAvLyBzb21lIHRoYXQgYXJlIGluc2lkZSBvZiBuZXN0ZWQgdGFiIGdyb3Vwcy4gV2UgZmlsdGVyIHRoZW0gb3V0IG1hbnVhbGx5IGJ5IGNoZWNraW5nIHRoYXQKICAgICAgICAvLyB0aGUgY2xvc2VzdCBncm91cCB0byB0aGUgdGFiIGlzIHRoZSBjdXJyZW50IG9uZS4KICAgICAgICB0aGlzLl9hbGxUYWJzLmNoYW5nZXMKICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuX2FsbFRhYnMpKQogICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRhYnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0YWJzKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3RhYnMucmVzZXQodGFicy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhYgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGFiID0+IHsKICAgICAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgX2Nsb3Nlc3RUYWJHcm91cGAKICAgICAgICAgICAgICAgIC8vIG9uY2UgaXQgYmVjb21lcyBhIHJlcXVpcmVkIHBhcmFtZXRlciBpbiBNYXRUYWIuCiAgICAgICAgICAgICAgICByZXR1cm4gIXRhYi5fY2xvc2VzdFRhYkdyb3VwIHx8IHRhYi5fY2xvc2VzdFRhYkdyb3VwID09PSB0aGlzOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLl90YWJzLm5vdGlmeU9uQ2hhbmdlcygpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fdGFicy5kZXN0cm95KCk7CiAgICAgICAgdGhpcy5fdGFic1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuX3RhYkxhYmVsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJlLWFsaWducyB0aGUgaW5rIGJhciB0byB0aGUgc2VsZWN0ZWQgdGFiIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWFsaWduSW5rQmFyKCkgewogICAgICAgIGlmICh0aGlzLl90YWJIZWFkZXIpIHsKICAgICAgICAgICAgdGhpcy5fdGFiSGVhZGVyLl9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mb2N1c0NoYW5nZWQoaW5kZXgpIHsKICAgICAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoaW5kZXgpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jcmVhdGVDaGFuZ2VFdmVudChpbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNYXRUYWJDaGFuZ2VFdmVudDsKICAgICAgICBldmVudC5pbmRleCA9IGluZGV4OwogICAgICAgIGlmICh0aGlzLl90YWJzICYmIHRoaXMuX3RhYnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGV2ZW50LnRhYiA9IHRoaXMuX3RhYnMudG9BcnJheSgpW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgfQogICAgLyoqCiAgICAgKiBTdWJzY3JpYmVzIHRvIGNoYW5nZXMgaW4gdGhlIHRhYiBsYWJlbHMuIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIHRoZSBcQElucHV0IGZvciB0aGUgbGFiZWwgaXMKICAgICAqIG9uIHRoZSBNYXRUYWIgY29tcG9uZW50LCB3aGVyZWFzIHRoZSBkYXRhIGJpbmRpbmcgaXMgaW5zaWRlIHRoZSBNYXRUYWJHcm91cC4gSW4gb3JkZXIgZm9yIHRoZQogICAgICogYmluZGluZyB0byBiZSB1cGRhdGVkLCB3ZSBuZWVkIHRvIHN1YnNjcmliZSB0byBjaGFuZ2VzIGluIGl0IGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24KICAgICAqIG1hbnVhbGx5LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zdWJzY3JpYmVUb1RhYkxhYmVscygpIHsKICAgICAgICBpZiAodGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24gPSBtZXJnZSguLi50aGlzLl90YWJzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0YWIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRhYiA9PiB0YWIuX3N0YXRlQ2hhbmdlcykpKQogICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSk7CiAgICB9CiAgICAvKioKICAgICAqIENsYW1wcyB0aGUgZ2l2ZW4gaW5kZXggdG8gdGhlIGJvdW5kcyBvZiAwIGFuZCB0aGUgdGFicyBsZW5ndGguCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NsYW1wVGFiSW5kZXgoaW5kZXgpIHsKICAgICAgICAvLyBOb3RlIHRoZSBgfHwgMGAsIHdoaWNoIGVuc3VyZXMgdGhhdCB2YWx1ZXMgbGlrZSBOYU4gY2FuJ3QgZ2V0IHRocm91Z2gKICAgICAgICAvLyBhbmQgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IHRoZSBjb21wb25lbnQgaW50byBhbiBpbmZpbml0ZSBsb29wCiAgICAgICAgLy8gKHNpbmNlIE1hdGgubWF4KE5hTiwgMCkgPT09IE5hTikuCiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuX3RhYnMubGVuZ3RoIC0gMSwgTWF0aC5tYXgoaW5kZXggfHwgMCwgMCkpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkIGZvciBlYWNoIHRhYiBsYWJlbCBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRUYWJMYWJlbElkKGkpIHsKICAgICAgICByZXR1cm4gYG1hdC10YWItbGFiZWwtJHt0aGlzLl9ncm91cElkfS0ke2l9YDsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIHVuaXF1ZSBpZCBmb3IgZWFjaCB0YWIgY29udGVudCBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRUYWJDb250ZW50SWQoaSkgewogICAgICAgIHJldHVybiBgbWF0LXRhYi1jb250ZW50LSR7dGhpcy5fZ3JvdXBJZH0tJHtpfWA7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgYm9keSB3cmFwcGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGFjdGl2YXRpbmcgdGFiIGlmIGR5bmFtaWMKICAgICAqIGhlaWdodCBwcm9wZXJ0eSBpcyB0cnVlLgogICAgICogQHBhcmFtIHs/fSB0YWJIZWlnaHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRUYWJCb2R5V3JhcHBlckhlaWdodCh0YWJIZWlnaHQpIHsKICAgICAgICBpZiAoIXRoaXMuX2R5bmFtaWNIZWlnaHQgfHwgIXRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50OwogICAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fdGFiQm9keVdyYXBwZXJIZWlnaHQgKyAncHgnOwogICAgICAgIC8vIFRoaXMgY29uZGl0aW9uYWwgZm9yY2VzIHRoZSBicm93c2VyIHRvIHBhaW50IHRoZSBoZWlnaHQgc28gdGhhdAogICAgICAgIC8vIHRoZSBhbmltYXRpb24gdG8gdGhlIG5ldyBoZWlnaHQgY2FuIGhhdmUgYW4gb3JpZ2luLgogICAgICAgIGlmICh0aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCkgewogICAgICAgICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IHRhYkhlaWdodCArICdweCc7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIHRoZSBoZWlnaHQgb2YgdGhlIHRhYiBib2R5IHdyYXBwZXIuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVtb3ZlVGFiQm9keVdyYXBwZXJIZWlnaHQoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50OwogICAgICAgIHRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0ID0gd3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnJzsKICAgICAgICB0aGlzLmFuaW1hdGlvbkRvbmUuZW1pdCgpOwogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGUgY2xpY2sgZXZlbnRzLCBzZXR0aW5nIG5ldyBzZWxlY3RlZCBpbmRleCBpZiBhcHByb3ByaWF0ZS4KICAgICAqIEBwYXJhbSB7P30gdGFiCiAgICAgKiBAcGFyYW0gez99IHRhYkhlYWRlcgogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2hhbmRsZUNsaWNrKHRhYiwgdGFiSGVhZGVyLCBpbmRleCkgewogICAgICAgIGlmICghdGFiLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRhYkhlYWRlci5mb2N1c0luZGV4ID0gaW5kZXg7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIHRhYmluZGV4IGZvciB0aGUgdGFiLgogICAgICogQHBhcmFtIHs/fSB0YWIKICAgICAqIEBwYXJhbSB7P30gaWR4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0VGFiSW5kZXgodGFiLCBpZHgpIHsKICAgICAgICBpZiAodGFiLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGV4ID09PSBpZHggPyAwIDogLTE7CiAgICB9Cn0KX01hdFRhYkdyb3VwQmFzZS7JtWZhYyA9IGZ1bmN0aW9uIF9NYXRUYWJHcm91cEJhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgX01hdFRhYkdyb3VwQmFzZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1RBQlNfQ09ORklHLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKX01hdFRhYkdyb3VwQmFzZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBfTWF0VGFiR3JvdXBCYXNlLCBpbnB1dHM6IHsgaGVhZGVyUG9zaXRpb246ICJoZWFkZXJQb3NpdGlvbiIsIGFuaW1hdGlvbkR1cmF0aW9uOiAiYW5pbWF0aW9uRHVyYXRpb24iLCBkaXNhYmxlUGFnaW5hdGlvbjogImRpc2FibGVQYWdpbmF0aW9uIiwgZHluYW1pY0hlaWdodDogImR5bmFtaWNIZWlnaHQiLCBzZWxlY3RlZEluZGV4OiAic2VsZWN0ZWRJbmRleCIsIGJhY2tncm91bmRDb2xvcjogImJhY2tncm91bmRDb2xvciIgfSwgb3V0cHV0czogeyBzZWxlY3RlZEluZGV4Q2hhbmdlOiAic2VsZWN0ZWRJbmRleENoYW5nZSIsIGZvY3VzQ2hhbmdlOiAiZm9jdXNDaGFuZ2UiLCBhbmltYXRpb25Eb25lOiAiYW5pbWF0aW9uRG9uZSIsIHNlbGVjdGVkVGFiQ2hhbmdlOiAic2VsZWN0ZWRUYWJDaGFuZ2UiIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpfTWF0VGFiR3JvdXBCYXNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1RBQlNfQ09ORklHLF0gfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQpdOwpfTWF0VGFiR3JvdXBCYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgZHluYW1pY0hlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBzZWxlY3RlZEluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGhlYWRlclBvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRpc2FibGVQYWdpbmF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGJhY2tncm91bmRDb2xvcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBzZWxlY3RlZEluZGV4Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBmb2N1c0NoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgYW5pbWF0aW9uRG9uZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgc2VsZWN0ZWRUYWJDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XQp9OwovKioKICogTWF0ZXJpYWwgZGVzaWduIHRhYi1ncm91cCBjb21wb25lbnQuIFN1cHBvcnRzIGJhc2ljIHRhYiBwYWlycyAobGFiZWwgKyBjb250ZW50KSBhbmQgaW5jbHVkZXMKICogYW5pbWF0ZWQgaW5rLWJhciwga2V5Ym9hcmQgbmF2aWdhdGlvbiwgYW5kIHNjcmVlbiByZWFkZXIuCiAqIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vY29tcG9uZW50cy90YWJzLmh0bWwKICovCmNsYXNzIE1hdFRhYkdyb3VwIGV4dGVuZHMgX01hdFRhYkdyb3VwQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VEZXRlY3RvclJlZgogICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdENvbmZpZwogICAgICogQHBhcmFtIHs/PX0gYW5pbWF0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBjaGFuZ2VEZXRlY3RvclJlZiwgZGVmYXVsdENvbmZpZywgYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCBkZWZhdWx0Q29uZmlnLCBhbmltYXRpb25Nb2RlKTsKICAgIH0KfQpNYXRUYWJHcm91cC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYkdyb3VwX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkdyb3VwKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfVEFCU19DT05GSUcsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwpNYXRUYWJHcm91cC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRUYWJHcm91cCwgc2VsZWN0b3JzOiBbWyJtYXQtdGFiLWdyb3VwIl1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0VGFiR3JvdXBfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdFRhYiwgdHJ1ZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fYWxsVGFicyA9IF90KTsKICAgIH0gfSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRUYWJHcm91cF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMywgdHJ1ZSk7CiAgICAgICAgybXJtXZpZXdRdWVyeShfYzQsIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3RhYkJvZHlXcmFwcGVyID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3RhYkhlYWRlciA9IF90LmZpcnN0KTsKICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC10YWItZ3JvdXAiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0VGFiR3JvdXBfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQiLCBjdHguZHluYW1pY0hlaWdodCkoIm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIiwgY3R4LmhlYWRlclBvc2l0aW9uID09PSAiYmVsb3ciKTsKICAgIH0gfSwgaW5wdXRzOiB7IGNvbG9yOiAiY29sb3IiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIgfSwgZXhwb3J0QXM6IFsibWF0VGFiR3JvdXAiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbewogICAgICAgICAgICAgICAgcHJvdmlkZTogTUFUX1RBQl9HUk9VUCwKICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBNYXRUYWJHcm91cAogICAgICAgICAgICB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBkZWNsczogNiwgdmFyczogNywgY29uc3RzOiBbWzMsICJzZWxlY3RlZEluZGV4IiwgImRpc2FibGVSaXBwbGUiLCAiZGlzYWJsZVBhZ2luYXRpb24iLCAiaW5kZXhGb2N1c2VkIiwgInNlbGVjdEZvY3VzZWRJbmRleCJdLCBbInRhYkhlYWRlciIsICIiXSwgWyJjbGFzcyIsICJtYXQtdGFiLWxhYmVsIG1hdC1mb2N1cy1pbmRpY2F0b3IiLCAicm9sZSIsICJ0YWIiLCAibWF0VGFiTGFiZWxXcmFwcGVyIiwgIiIsICJtYXQtcmlwcGxlIiwgIiIsICJjZGtNb25pdG9yRWxlbWVudEZvY3VzIiwgIiIsIDMsICJpZCIsICJtYXQtdGFiLWxhYmVsLWFjdGl2ZSIsICJkaXNhYmxlZCIsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJjbGljayIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsxLCAibWF0LXRhYi1ib2R5LXdyYXBwZXIiXSwgWyJ0YWJCb2R5V3JhcHBlciIsICIiXSwgWyJyb2xlIiwgInRhYnBhbmVsIiwgMywgImlkIiwgIm1hdC10YWItYm9keS1hY3RpdmUiLCAiY29udGVudCIsICJwb3NpdGlvbiIsICJvcmlnaW4iLCAiYW5pbWF0aW9uRHVyYXRpb24iLCAiX29uQ2VudGVyZWQiLCAiX29uQ2VudGVyaW5nIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWyJyb2xlIiwgInRhYiIsICJtYXRUYWJMYWJlbFdyYXBwZXIiLCAiIiwgIm1hdC1yaXBwbGUiLCAiIiwgImNka01vbml0b3JFbGVtZW50Rm9jdXMiLCAiIiwgMSwgIm1hdC10YWItbGFiZWwiLCAibWF0LWZvY3VzLWluZGljYXRvciIsIDMsICJpZCIsICJkaXNhYmxlZCIsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJjbGljayJdLCBbMSwgIm1hdC10YWItbGFiZWwtY29udGVudCJdLCBbMywgIm5nSWYiXSwgWzMsICJjZGtQb3J0YWxPdXRsZXQiXSwgWyJyb2xlIiwgInRhYnBhbmVsIiwgMywgImlkIiwgImNvbnRlbnQiLCAicG9zaXRpb24iLCAib3JpZ2luIiwgImFuaW1hdGlvbkR1cmF0aW9uIiwgIl9vbkNlbnRlcmVkIiwgIl9vbkNlbnRlcmluZyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRhYkdyb3VwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC10YWItaGVhZGVyIiwgMCwgMSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJpbmRleEZvY3VzZWQiLCBmdW5jdGlvbiBNYXRUYWJHcm91cF9UZW1wbGF0ZV9tYXRfdGFiX2hlYWRlcl9pbmRleEZvY3VzZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5fZm9jdXNDaGFuZ2VkKCRldmVudCk7IH0pKCJzZWxlY3RGb2N1c2VkSW5kZXgiLCBmdW5jdGlvbiBNYXRUYWJHcm91cF9UZW1wbGF0ZV9tYXRfdGFiX2hlYWRlcl9zZWxlY3RGb2N1c2VkSW5kZXhfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5zZWxlY3RlZEluZGV4ID0gJGV2ZW50OyB9KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgTWF0VGFiR3JvdXBfZGl2XzJfVGVtcGxhdGUsIDQsIDE0LCAiZGl2IiwgMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAzLCA0KTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgTWF0VGFiR3JvdXBfbWF0X3RhYl9ib2R5XzVfVGVtcGxhdGUsIDEsIDgsICJtYXQtdGFiLWJvZHkiLCA1KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJzZWxlY3RlZEluZGV4IiwgY3R4LnNlbGVjdGVkSW5kZXggfHwgMCkoImRpc2FibGVSaXBwbGUiLCBjdHguZGlzYWJsZVJpcHBsZSkoImRpc2FibGVQYWdpbmF0aW9uIiwgY3R4LmRpc2FibGVQYWdpbmF0aW9uKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguX3RhYnMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVjbGFzc1Byb3AoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguX3RhYnMpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0VGFiSGVhZGVyLCBOZ0Zvck9mLCBNYXRUYWJMYWJlbFdyYXBwZXIsIE1hdFJpcHBsZSwgQ2RrTW9uaXRvckZvY3VzLCBOZ0lmLCBDZGtQb3J0YWxPdXRsZXQsIE1hdFRhYkJvZHldOyB9LCBzdHlsZXM6IFsiLm1hdC10YWItZ3JvdXB7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubWF0LXRhYi1ncm91cC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcntmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0ubWF0LXRhYi1sYWJlbHtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxhYmVsOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1sYWJlbCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWx7b3BhY2l0eToxfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1sYWJlbHtwYWRkaW5nOjAgMTJweH19QG1lZGlhKG1heC13aWR0aDogOTU5cHgpey5tYXQtdGFiLWxhYmVse3BhZGRpbmc6MCAxMnB4fX0ubWF0LXRhYi1ncm91cFttYXQtc3RyZXRjaC10YWJzXT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWx7ZmxleC1iYXNpczowO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWJvZHktd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O3RyYW5zaXRpb246aGVpZ2h0IDUwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXRhYi1ib2R5LXdyYXBwZXJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtdGFiLWJvZHl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47ZmxleC1iYXNpczoxMDAlfS5tYXQtdGFiLWJvZHkubWF0LXRhYi1ib2R5LWFjdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87ei1pbmRleDoxO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWdyb3VwLm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQgLm1hdC10YWItYm9keS5tYXQtdGFiLWJvZHktYWN0aXZle292ZXJmbG93LXk6aGlkZGVufVxuIl0sIGVuY2Fwc3VsYXRpb246IDIgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRUYWJHcm91cC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9UQUJTX0NPTkZJRyxdIH0sIHsgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KXTsKTWF0VGFiR3JvdXAucHJvcERlY29yYXRvcnMgPSB7CiAgICBfYWxsVGFiczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0VGFiLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgIF90YWJCb2R5V3JhcHBlcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RhYkJvZHlXcmFwcGVyJyxdIH1dLAogICAgX3RhYkhlYWRlcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RhYkhlYWRlcicsXSB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3RhYnMvdGFiLWxhYmVsLXdyYXBwZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRUYWJMYWJlbFdyYXBwZXIuCi8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKi8KY2xhc3MgTWF0VGFiTGFiZWxXcmFwcGVyQmFzZSB7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfTWF0VGFiTGFiZWxXcmFwcGVyTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlZChNYXRUYWJMYWJlbFdyYXBwZXJCYXNlKTsKLyoqCiAqIFVzZWQgaW4gdGhlIGBtYXQtdGFiLWdyb3VwYCB2aWV3IHRvIGRpc3BsYXkgdGFiIGxhYmVscy4KICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdFRhYkxhYmVsV3JhcHBlciBleHRlbmRzIF9NYXRUYWJMYWJlbFdyYXBwZXJNaXhpbkJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoZWxlbWVudFJlZikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyBmb2N1cyBvbiB0aGUgd3JhcHBlciBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb2N1cygpIHsKICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRPZmZzZXRMZWZ0KCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRPZmZzZXRXaWR0aCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7CiAgICB9Cn0KTWF0VGFiTGFiZWxXcmFwcGVyLsm1ZmFjID0gZnVuY3Rpb24gTWF0VGFiTGFiZWxXcmFwcGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkxhYmVsV3JhcHBlcikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07Ck1hdFRhYkxhYmVsV3JhcHBlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRUYWJMYWJlbFdyYXBwZXIsIHNlbGVjdG9yczogW1siIiwgIm1hdFRhYkxhYmVsV3JhcHBlciIsICIiXV0sIGhvc3RWYXJzOiAzLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFRhYkxhYmVsV3JhcHBlcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsICEhY3R4LmRpc2FibGVkKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtdGFiLWRpc2FibGVkIiwgY3R4LmRpc2FibGVkKTsKICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRUYWJMYWJlbFdyYXBwZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3RhYnMvcGFnaW5hdGVkLXRhYi1oZWFkZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENvbmZpZyB1c2VkIHRvIGJpbmQgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMKICogQHR5cGUgez99CiAqLwpjb25zdCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAobm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSkpKTsKLyoqCiAqIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgdGhhdCB3aWxsIGJlIG92ZXJzaG90IHdoZW4gc2Nyb2xsaW5nIGEgdGFiIGxhYmVsIGludG8gdmlldy4gVGhpcyBoZWxwcwogKiBwcm92aWRlIGEgc21hbGwgYWZmb3JkYW5jZSB0byB0aGUgbGFiZWwgbmV4dCB0byBpdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBFWEFHR0VSQVRFRF9PVkVSU0NST0xMID0gNjA7Ci8qKgogKiBBbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHRvIHNjcm9sbCB0aGUgaGVhZGVyIGF1dG9tYXRpY2FsbHkuCiAqIFNldCBhIGxpdHRsZSBjb25zZXJ2YXRpdmVseSBpbiBvcmRlciB0byBoYW5kbGUgZmFrZSBldmVudHMgZGlzcGF0Y2hlZCBvbiB0b3VjaCBkZXZpY2VzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEhFQURFUl9TQ1JPTExfREVMQVkgPSA2NTA7Ci8qKgogKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYXQgd2hpY2ggdG8gc2Nyb2xsIHRoZSBoZWFkZXIKICogd2hpbGUgdGhlIHVzZXIgaXMgaG9sZGluZyB0aGVpciBwb2ludGVyLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEhFQURFUl9TQ1JPTExfSU5URVJWQUwgPSAxMDA7Ci8qKgogKiBCYXNlIGNsYXNzIGZvciBhIHRhYiBoZWFkZXIgdGhhdCBzdXBwb3J0ZWQgcGFnaW5hdGlvbi4KICogXEBkb2NzLXByaXZhdGUKICogQGFic3RyYWN0CiAqLwpjbGFzcyBNYXRQYWdpbmF0ZWRUYWJIZWFkZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBfZGlyCiAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAqIEBwYXJhbSB7Pz19IF9wbGF0Zm9ybQogICAgICogQHBhcmFtIHs/PX0gX2FuaW1hdGlvbk1vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgX3ZpZXdwb3J0UnVsZXIsIF9kaXIsIF9uZ1pvbmUsIF9wbGF0Zm9ybSwgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgIHRoaXMuX2RpciA9IF9kaXI7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRpc3RhbmNlIGluIHBpeGVscyB0aGF0IHRoZSB0YWIgbGFiZWxzIHNob3VsZCBiZSB0cmFuc2xhdGVkIHRvIHRoZSBsZWZ0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3Njcm9sbERpc3RhbmNlID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBoZWFkZXIgc2hvdWxkIHNjcm9sbCB0byB0aGUgc2VsZWN0ZWQgaW5kZXggYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gY2hlY2tlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjb250cm9scyBmb3IgcGFnaW5hdGlvbiBzaG91bGQgYmUgZGlzcGxheWVkCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scyA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHRhYiBsaXN0IGNhbiBiZSBzY3JvbGxlZCBtb3JlIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgdGFiIGxhYmVsIGxpc3QuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyID0gdHJ1ZTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSB0YWIgbGlzdCBjYW4gYmUgc2Nyb2xsZWQgbW9yZSB0b3dhcmRzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYiBsYWJlbCBsaXN0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2Rpc2FibGVTY3JvbGxCZWZvcmUgPSB0cnVlOwogICAgICAgIC8qKgogICAgICAgICAqIFN0cmVhbSB0aGF0IHdpbGwgc3RvcCB0aGUgYXV0b21hdGVkIHNjcm9sbGluZy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zdG9wU2Nyb2xsaW5nID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHBhZ2luYXRpb24gc2hvdWxkIGJlIGRpc2FibGVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5CiAgICAgICAgICogbGF5b3V0IHJlY2FsY3VsYXRpb25zIGlmIGl0J3Mga25vd24gdGhhdCBwYWdpbmF0aW9uIHdvbid0IGJlIHJlcXVpcmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuZGlzYWJsZVBhZ2luYXRpb24gPSBmYWxzZTsKICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIG9wdGlvbiBpcyBzZWxlY3RlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnNlbGVjdEZvY3VzZWRJbmRleCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBsYWJlbCBpcyBmb2N1c2VkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaW5kZXhGb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8vIEJpbmQgdGhlIGBtb3VzZWxlYXZlYCBldmVudCBvbiB0aGUgb3V0c2lkZSBzaW5jZSBpdCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZyBpbiB0aGUgdmlldy4KICAgICAgICBfbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgZnJvbUV2ZW50KF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJykKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdG9wSW50ZXJ2YWwoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHNlbGVjdGVkSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4OyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBzZWxlY3RlZEluZGV4KHZhbHVlKSB7CiAgICAgICAgdmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkSW5kZXggIT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleENoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gdmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLl9rZXlNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0odmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0FmdGVyVmlld0luaXQoKSB7CiAgICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgdGhlc2UgZXZlbnRzIG1hbnVhbGx5LCBiZWNhdXNlIHdlIHdhbnQgdG8gYmluZCBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICBmcm9tRXZlbnQodGhpcy5fcHJldmlvdXNQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwgJ3RvdWNoc3RhcnQnLCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMpCiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKQogICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5faGFuZGxlUGFnaW5hdG9yUHJlc3MoJ2JlZm9yZScpOwogICAgICAgIH0pKTsKICAgICAgICBmcm9tRXZlbnQodGhpcy5fbmV4dFBhZ2luYXRvci5uYXRpdmVFbGVtZW50LCAndG91Y2hzdGFydCcsIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucykKICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygnYWZ0ZXInKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyQ2hhbmdlID0gdGhpcy5fZGlyID8gdGhpcy5fZGlyLmNoYW5nZSA6IG9mKG51bGwpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNpemUgPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgxNTApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWFsaWduID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTsKICAgICAgICAgICAgdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fa2V5TWFuYWdlciA9IG5ldyBGb2N1c0tleU1hbmFnZXIodGhpcy5faXRlbXMpCiAgICAgICAgICAgIC53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKQogICAgICAgICAgICAud2l0aFdyYXAoKTsKICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oMCk7CiAgICAgICAgLy8gRGVmZXIgdGhlIGZpcnN0IGNhbGwgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHNsb3dlciBicm93c2VycyB0byBsYXkgb3V0IHRoZSBlbGVtZW50cy4KICAgICAgICAvLyBUaGlzIGhlbHBzIGluIGNhc2VzIHdoZXJlIHRoZSB1c2VyIGxhbmRzIGRpcmVjdGx5IG9uIGEgcGFnZSB3aXRoIHBhZ2luYXRlZCB0YWJzLgogICAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlYWxpZ24pIDogcmVhbGlnbigpOwogICAgICAgIC8vIE9uIGRpciBjaGFuZ2Ugb3Igd2luZG93IHJlc2l6ZSwgcmVhbGlnbiB0aGUgaW5rIGJhciBhbmQgdXBkYXRlIHRoZSBvcmllbnRhdGlvbiBvZgogICAgICAgIC8vIHRoZSBrZXkgbWFuYWdlciBpZiB0aGUgZGlyZWN0aW9uIGhhcyBjaGFuZ2VkLgogICAgICAgIG1lcmdlKGRpckNoYW5nZSwgcmVzaXplLCB0aGlzLl9pdGVtcy5jaGFuZ2VzKS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICByZWFsaWduKCk7CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIud2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0aGlzLl9nZXRMYXlvdXREaXJlY3Rpb24oKSk7CiAgICAgICAgfSkpOwogICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBmb2N1cyBrZXkgbWFuYWdlciB3ZSBuZWVkIHRvIGVtaXQgdGhlIGBpbmRleEZvY3VzZWRgCiAgICAgICAgLy8gZXZlbnQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIHB1YmxpYyBldmVudCB0aGF0IG5vdGlmaWVzIGFib3V0IGZvY3VzIGNoYW5nZXMuIEFsc28gd2UgcmVhbGlnbgogICAgICAgIC8vIHRoZSB0YWJzIGNvbnRhaW5lciBieSBzY3JvbGxpbmcgdGhlIG5ldyBmb2N1c2VkIHRhYiBpbnRvIHRoZSB2aXNpYmxlIHNlY3Rpb24uCiAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5ld0ZvY3VzSW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5ld0ZvY3VzSW5kZXggPT4gewogICAgICAgICAgICB0aGlzLmluZGV4Rm9jdXNlZC5lbWl0KG5ld0ZvY3VzSW5kZXgpOwogICAgICAgICAgICB0aGlzLl9zZXRUYWJGb2N1cyhuZXdGb2N1c0luZGV4KTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHsKICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIG9mIHRhYiBsYWJlbHMgaGF2ZSBjaGFuZ2VkLCBjaGVjayBpZiBzY3JvbGxpbmcgc2hvdWxkIGJlIGVuYWJsZWQKICAgICAgICBpZiAodGhpcy5fdGFiTGFiZWxDb3VudCAhPSB0aGlzLl9pdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7CiAgICAgICAgICAgIHRoaXMuX3RhYkxhYmVsQ291bnQgPSB0aGlzLl9pdGVtcy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgaW5kZXggaGFzIGNoYW5nZWQsIHNjcm9sbCB0byB0aGUgbGFiZWwgYW5kIGNoZWNrIGlmIHRoZSBzY3JvbGxpbmcgY29udHJvbHMKICAgICAgICAvLyBzaG91bGQgYmUgZGlzYWJsZWQuCiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkKSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvTGFiZWwodGhpcy5fc2VsZWN0ZWRJbmRleCk7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Nyb2xsaW5nQ29udHJvbHMoKTsKICAgICAgICAgICAgdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgc2Nyb2xsIGRpc3RhbmNlIGhhcyBiZWVuIGNoYW5nZWQgKHRhYiBzZWxlY3RlZCwgZm9jdXNlZCwgc2Nyb2xsIGNvbnRyb2xzIGFjdGl2YXRlZCksCiAgICAgICAgLy8gdGhlbiB0cmFuc2xhdGUgdGhlIGhlYWRlciB0byByZWZsZWN0IHRoaXMuCiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpOwogICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXN0YW5jZUNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMuX3N0b3BTY3JvbGxpbmcuY29tcGxldGUoKTsKICAgIH0KICAgIC8qKgogICAgICogSGFuZGxlcyBrZXlib2FyZCBldmVudHMgb24gdGhlIGhlYWRlci4KICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7CiAgICAgICAgLy8gV2UgZG9uJ3QgaGFuZGxlIGFueSBrZXkgYmluZGluZ3Mgd2l0aCBhIG1vZGlmaWVyIGtleS4KICAgICAgICBpZiAoaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgICAgIGNhc2UgSE9NRToKICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRU5EOgogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVOVEVSOgogICAgICAgICAgICBjYXNlIFNQQUNFOgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGb2N1c2VkSW5kZXguZW1pdCh0aGlzLmZvY3VzSW5kZXgpOwogICAgICAgICAgICAgICAgdGhpcy5faXRlbVNlbGVjdGVkKGV2ZW50KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5vbktleWRvd24oZXZlbnQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIE11dGF0aW9uT2JzZXJ2ZXIgZGV0ZWN0cyB0aGF0IHRoZSBjb250ZW50IGhhcyBjaGFuZ2VkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uQ29udGVudENoYW5nZXMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50OwogICAgICAgIC8vIFdlIG5lZWQgdG8gZGlmZiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBoZWFkZXIsIGJlY2F1c2UgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sKICAgICAgICAvLyB3aWxsIGZpcmUgZXZlbiBpZiB0aGUgdGV4dCBjb250ZW50IGRpZG4ndCBjaGFuZ2Ugd2hpY2ggaXMgaW5lZmZpY2llbnQgYW5kIGlzIHByb25lCiAgICAgICAgLy8gdG8gaW5maW5pdGUgbG9vcHMgaWYgYSBwb29ybHkgY29uc3RydWN0ZWQgZXhwcmVzc2lvbiBpcyBwYXNzZWQgaW4gKHNlZSAjMTQyNDkpLgogICAgICAgIGlmICh0ZXh0Q29udGVudCAhPT0gdGhpcy5fY3VycmVudFRleHRDb250ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUZXh0Q29udGVudCA9IHRleHRDb250ZW50IHx8ICcnOwogICAgICAgICAgICAvLyBUaGUgY29udGVudCBvYnNlcnZlciBydW5zIG91dHNpZGUgdGhlIGBOZ1pvbmVgIGJ5IGRlZmF1bHQsIHdoaWNoCiAgICAgICAgICAgIC8vIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBicmluZyB0aGUgY2FsbGJhY2sgYmFjayBpbiBvdXJzZWx2ZXMuCiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSB2aWV3IHdoZXRoZXIgcGFnaW5hdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuCiAgICAgKgogICAgICogV0FSTklORzogQ2FsbGluZyB0aGlzIG1ldGhvZCBjYW4gYmUgdmVyeSBjb3N0bHkgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UuIEl0IHNob3VsZCBiZSBjYWxsZWQKICAgICAqIGFzIGluZnJlcXVlbnRseSBhcyBwb3NzaWJsZSBmcm9tIG91dHNpZGUgb2YgdGhlIFRhYnMgY29tcG9uZW50IGFzIGl0IGNhdXNlcyBhIHJlZmxvdyBvZiB0aGUKICAgICAqIHBhZ2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cGRhdGVQYWdpbmF0aW9uKCkgewogICAgICAgIHRoaXMuX2NoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKTsKICAgICAgICB0aGlzLl9jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCk7CiAgICAgICAgdGhpcy5fdXBkYXRlVGFiU2Nyb2xsUG9zaXRpb24oKTsKICAgIH0KICAgIC8qKgogICAgICogVHJhY2tzIHdoaWNoIGVsZW1lbnQgaGFzIGZvY3VzOyB1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZm9jdXNJbmRleCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fa2V5TWFuYWdlciA/ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCkpIDogMDsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiB0aGUgZm9jdXMgaW5kZXggaXMgc2V0LCB3ZSBtdXN0IG1hbnVhbGx5IHNlbmQgZm9jdXMgdG8gdGhlIGNvcnJlY3QgbGFiZWwKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBmb2N1c0luZGV4KHZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLl9pc1ZhbGlkSW5kZXgodmFsdWUpIHx8IHRoaXMuZm9jdXNJbmRleCA9PT0gdmFsdWUgfHwgIXRoaXMuX2tleU1hbmFnZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIGluZGV4IGlzIHZhbGlkLiAgSWYgdGhlIHRhYnMgYXJlIG5vdCByZWFkeSB5ZXQsIHdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIGlzCiAgICAgKiBwcm92aWRpbmcgYSB2YWxpZCBpbmRleCBhbmQgcmV0dXJuIHRydWUuCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNWYWxpZEluZGV4KGluZGV4KSB7CiAgICAgICAgaWYgKCF0aGlzLl9pdGVtcykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhYiA9IHRoaXMuX2l0ZW1zID8gdGhpcy5faXRlbXMudG9BcnJheSgpW2luZGV4XSA6IG51bGw7CiAgICAgICAgcmV0dXJuICEhdGFiICYmICF0YWIuZGlzYWJsZWQ7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgZm9jdXMgb24gdGhlIEhUTUwgZWxlbWVudCBmb3IgdGhlIGxhYmVsIHdyYXBwZXIgYW5kIHNjcm9sbHMgaXQgaW50byB0aGUgdmlldyBpZgogICAgICogc2Nyb2xsaW5nIGlzIGVuYWJsZWQuCiAgICAgKiBAcGFyYW0gez99IHRhYkluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VGFiRm9jdXModGFiSW5kZXgpIHsKICAgICAgICBpZiAodGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scykgewogICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0xhYmVsKHRhYkluZGV4KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zICYmIHRoaXMuX2l0ZW1zLmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLl9pdGVtcy50b0FycmF5KClbdGFiSW5kZXhdLmZvY3VzKCk7CiAgICAgICAgICAgIC8vIERvIG5vdCBsZXQgdGhlIGJyb3dzZXIgbWFuYWdlIHNjcm9sbGluZyB0byBmb2N1cyB0aGUgZWxlbWVudCwgdGhpcyB3aWxsIGJlIGhhbmRsZWQKICAgICAgICAgICAgLy8gYnkgdXNpbmcgdHJhbnNsYXRpb24uIEluIExUUiwgdGhlIHNjcm9sbCBsZWZ0IHNob3VsZCBiZSAwLiBJbiBSVEwsIHRoZSBzY3JvbGwgd2lkdGgKICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRoZSBmdWxsIHdpZHRoIG1pbnVzIHRoZSBvZmZzZXQgd2lkdGguCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl90YWJMaXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk7CiAgICAgICAgICAgIGlmIChkaXIgPT0gJ2x0cicpIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsLnNjcm9sbExlZnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29udGFpbmVyRWwuc2Nyb2xsTGVmdCA9IGNvbnRhaW5lckVsLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyRWwub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBsYXlvdXQgZGlyZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGFwcC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRMYXlvdXREaXJlY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RpciAmJiB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnID8gJ3J0bCcgOiAnbHRyJzsKICAgIH0KICAgIC8qKgogICAgICogUGVyZm9ybXMgdGhlIENTUyB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgdGFiIGxpc3QgdGhhdCB3aWxsIGNhdXNlIHRoZSBsaXN0IHRvIHNjcm9sbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5kaXNhYmxlUGFnaW5hdGlvbikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY3JvbGxEaXN0YW5jZSA9IHRoaXMuc2Nyb2xsRGlzdGFuY2U7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5fcGxhdGZvcm07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyYW5zbGF0ZVggPSB0aGlzLl9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PT0gJ2x0cicgPyAtc2Nyb2xsRGlzdGFuY2UgOiBzY3JvbGxEaXN0YW5jZTsKICAgICAgICAvLyBEb24ndCB1c2UgYHRyYW5zbGF0ZTNkYCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgbGF5ZXIuIEEgbmV3IGxheWVyCiAgICAgICAgLy8gc2VlbXMgdG8gY2F1c2UgZmxpY2tlcmluZyBhbmQgb3ZlcmZsb3cgaW4gSW50ZXJuZXQgRXhwbG9yZXIuIEZvciBleGFtcGxlLCB0aGUgaW5rIGJhcgogICAgICAgIC8vIGFuZCByaXBwbGVzIHdpbGwgZXhjZWVkIHRoZSBib3VuZGFyaWVzIG9mIHRoZSB2aXNpYmxlIHRhYiBiYXIuCiAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xMDI3NgogICAgICAgIC8vIFdlIHJvdW5kIHRoZSBgdHJhbnNmb3JtYCBoZXJlLCBiZWNhdXNlIHRyYW5zZm9ybXMgd2l0aCBzdWItcGl4ZWwgcHJlY2lzaW9uIGNhdXNlIHNvbWUKICAgICAgICAvLyBicm93c2VycyB0byBibHVyIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LgogICAgICAgIHRoaXMuX3RhYkxpc3QubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke01hdGgucm91bmQodHJhbnNsYXRlWCl9cHgpYDsKICAgICAgICAvLyBTZXR0aW5nIHRoZSBgdHJhbnNmb3JtYCBvbiBJRSB3aWxsIGNoYW5nZSB0aGUgc2Nyb2xsIG9mZnNldCBvZiB0aGUgcGFyZW50LCBjYXVzaW5nIHRoZQogICAgICAgIC8vIHBvc2l0aW9uIHRvIGJlIHRocm93biBvZmYgaW4gc29tZSBjYXNlcy4gV2UgaGF2ZSB0byByZXNldCBpdCBvdXJzZWx2ZXMgdG8gZW5zdXJlIHRoYXQKICAgICAgICAvLyBpdCBkb2Vzbid0IGdldCB0aHJvd24gb2ZmLiBOb3RlIHRoYXQgd2Ugc2NvcGUgaXQgb25seSB0byBJRSBhbmQgRWRnZSwgYmVjYXVzZSBtZXNzaW5nCiAgICAgICAgLy8gd2l0aCB0aGUgc2Nyb2xsIHBvc2l0aW9uIHRocm93cyBvZmYgQ2hyb21lIDcxKyBpbiBSVEwgbW9kZSAoc2VlICMxNDY4OSkuCiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBSZW1vdmUgbnVsbCBjaGVjayBmb3IgYHBsYXRmb3JtYCBhZnRlciBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVuZGVmaW5lZC4KICAgICAgICBpZiAocGxhdGZvcm0gJiYgKHBsYXRmb3JtLlRSSURFTlQgfHwgcGxhdGZvcm0uRURHRSkpIHsKICAgICAgICAgICAgdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoYXQgdGhlIHRhYiBoZWFkZXIgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGluIHRoZSBYLWF4aXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc2Nyb2xsRGlzdGFuY2UoKSB7IHJldHVybiB0aGlzLl9zY3JvbGxEaXN0YW5jZTsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgc2Nyb2xsRGlzdGFuY2UodmFsdWUpIHsKICAgICAgICB0aGlzLl9zY3JvbGxUbyh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIE1vdmVzIHRoZSB0YWIgbGlzdCBpbiB0aGUgJ2JlZm9yZScgb3IgJ2FmdGVyJyBkaXJlY3Rpb24gKHRvd2FyZHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBvcgogICAgICogdGhlIGVuZCBvZiB0aGUgbGlzdCwgcmVzcGVjdGl2ZWx5KS4gVGhlIGRpc3RhbmNlIHRvIHNjcm9sbCBpcyBjb21wdXRlZCB0byBiZSBhIHRoaXJkIG9mIHRoZQogICAgICogbGVuZ3RoIG9mIHRoZSB0YWIgbGlzdCB2aWV3IHdpbmRvdy4KICAgICAqCiAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIHRoYXQgZm9yY2VzIGEgbGF5b3V0IHJlZmxvdyB0byBjb21wdXRlIGJveCBhbmQgc2Nyb2xsIG1ldHJpY3MgYW5kCiAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHNwYXJpbmdseS4KICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2Nyb2xsSGVhZGVyKGRpcmVjdGlvbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3TGVuZ3RoID0gdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgIC8vIE1vdmUgdGhlIHNjcm9sbCBkaXN0YW5jZSBvbmUtdGhpcmQgdGhlIGxlbmd0aCBvZiB0aGUgdGFiIGxpc3QncyB2aWV3cG9ydC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2Nyb2xsQW1vdW50ID0gKGRpcmVjdGlvbiA9PSAnYmVmb3JlJyA/IC0xIDogMSkgKiB2aWV3TGVuZ3RoIC8gMzsKICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsVG8odGhpcy5fc2Nyb2xsRGlzdGFuY2UgKyBzY3JvbGxBbW91bnQpOwogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBvbiB0aGUgcGFnaW5hdGlvbiBhcnJvd3MuCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2hhbmRsZVBhZ2luYXRvckNsaWNrKGRpcmVjdGlvbikgewogICAgICAgIHRoaXMuX3N0b3BJbnRlcnZhbCgpOwogICAgICAgIHRoaXMuX3Njcm9sbEhlYWRlcihkaXJlY3Rpb24pOwogICAgfQogICAgLyoqCiAgICAgKiBNb3ZlcyB0aGUgdGFiIGxpc3Qgc3VjaCB0aGF0IHRoZSBkZXNpcmVkIHRhYiBsYWJlbCAobWFya2VkIGJ5IGluZGV4KSBpcyBtb3ZlZCBpbnRvIHZpZXcuCiAgICAgKgogICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgY2FsbCB0aGF0IGZvcmNlcyBhIGxheW91dCByZWZsb3cgdG8gY29tcHV0ZSBib3ggYW5kIHNjcm9sbCBtZXRyaWNzIGFuZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBzcGFyaW5nbHkuCiAgICAgKiBAcGFyYW0gez99IGxhYmVsSW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zY3JvbGxUb0xhYmVsKGxhYmVsSW5kZXgpIHsKICAgICAgICBpZiAodGhpcy5kaXNhYmxlUGFnaW5hdGlvbikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzZWxlY3RlZExhYmVsID0gdGhpcy5faXRlbXMgPyB0aGlzLl9pdGVtcy50b0FycmF5KClbbGFiZWxJbmRleF0gOiBudWxsOwogICAgICAgIGlmICghc2VsZWN0ZWRMYWJlbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIFRoZSB2aWV3IGxlbmd0aCBpcyB0aGUgdmlzaWJsZSB3aWR0aCBvZiB0aGUgdGFiIGxhYmVscy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld0xlbmd0aCA9IHRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDsKICAgICAgICBjb25zdCB7IG9mZnNldExlZnQsIG9mZnNldFdpZHRoIH0gPSBzZWxlY3RlZExhYmVsLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGxhYmVsQmVmb3JlUG9zOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbGFiZWxBZnRlclBvczsKICAgICAgICBpZiAodGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkgPT0gJ2x0cicpIHsKICAgICAgICAgICAgbGFiZWxCZWZvcmVQb3MgPSBvZmZzZXRMZWZ0OwogICAgICAgICAgICBsYWJlbEFmdGVyUG9zID0gbGFiZWxCZWZvcmVQb3MgKyBvZmZzZXRXaWR0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxhYmVsQWZ0ZXJQb3MgPSB0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLSBvZmZzZXRMZWZ0OwogICAgICAgICAgICBsYWJlbEJlZm9yZVBvcyA9IGxhYmVsQWZ0ZXJQb3MgLSBvZmZzZXRXaWR0aDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJlZm9yZVZpc2libGVQb3MgPSB0aGlzLnNjcm9sbERpc3RhbmNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhZnRlclZpc2libGVQb3MgPSB0aGlzLnNjcm9sbERpc3RhbmNlICsgdmlld0xlbmd0aDsKICAgICAgICBpZiAobGFiZWxCZWZvcmVQb3MgPCBiZWZvcmVWaXNpYmxlUG9zKSB7CiAgICAgICAgICAgIC8vIFNjcm9sbCBoZWFkZXIgdG8gbW92ZSBsYWJlbCB0byB0aGUgYmVmb3JlIGRpcmVjdGlvbgogICAgICAgICAgICB0aGlzLnNjcm9sbERpc3RhbmNlIC09IGJlZm9yZVZpc2libGVQb3MgLSBsYWJlbEJlZm9yZVBvcyArIEVYQUdHRVJBVEVEX09WRVJTQ1JPTEw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxhYmVsQWZ0ZXJQb3MgPiBhZnRlclZpc2libGVQb3MpIHsKICAgICAgICAgICAgLy8gU2Nyb2xsIGhlYWRlciB0byBtb3ZlIGxhYmVsIHRvIHRoZSBhZnRlciBkaXJlY3Rpb24KICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXN0YW5jZSArPSBsYWJlbEFmdGVyUG9zIC0gYWZ0ZXJWaXNpYmxlUG9zICsgRVhBR0dFUkFURURfT1ZFUlNDUk9MTDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEV2YWx1YXRlIHdoZXRoZXIgdGhlIHBhZ2luYXRpb24gY29udHJvbHMgc2hvdWxkIGJlIGRpc3BsYXllZC4gSWYgdGhlIHNjcm9sbCB3aWR0aCBvZiB0aGUKICAgICAqIHRhYiBsaXN0IGlzIHdpZGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBjb250YWluZXIsIHRoZW4gdGhlIHBhZ2luYXRpb24gY29udHJvbHMgc2hvdWxkCiAgICAgKiBiZSBzaG93bi4KICAgICAqCiAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIHRoYXQgZm9yY2VzIGEgbGF5b3V0IHJlZmxvdyB0byBjb21wdXRlIGJveCBhbmQgc2Nyb2xsIG1ldHJpY3MgYW5kCiAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHNwYXJpbmdseS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jaGVja1BhZ2luYXRpb25FbmFibGVkKCkgewogICAgICAgIGlmICh0aGlzLmRpc2FibGVQYWdpbmF0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHMgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNFbmFibGVkID0gdGhpcy5fdGFiTGlzdC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoID4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXN0YW5jZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCAhPT0gdGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scykgewogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scyA9IGlzRW5hYmxlZDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEV2YWx1YXRlIHdoZXRoZXIgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgY29udHJvbHMgc2hvdWxkIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCiAgICAgKiBJZiB0aGUgaGVhZGVyIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKHNjcm9sbCBkaXN0YW5jZSBpcyBlcXVhbCB0byAwKSB0aGVuIGRpc2FibGUgdGhlCiAgICAgKiBiZWZvcmUgYnV0dG9uLiBJZiB0aGUgaGVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKHNjcm9sbCBkaXN0YW5jZSBpcyBlcXVhbCB0byB0aGUKICAgICAqIG1heGltdW0gZGlzdGFuY2Ugd2UgY2FuIHNjcm9sbCksIHRoZW4gZGlzYWJsZSB0aGUgYWZ0ZXIgYnV0dG9uLgogICAgICoKICAgICAqIFRoaXMgaXMgYW4gZXhwZW5zaXZlIGNhbGwgdGhhdCBmb3JjZXMgYSBsYXlvdXQgcmVmbG93IHRvIGNvbXB1dGUgYm94IGFuZCBzY3JvbGwgbWV0cmljcyBhbmQKICAgICAqIHNob3VsZCBiZSBjYWxsZWQgc3BhcmluZ2x5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrU2Nyb2xsaW5nQ29udHJvbHMoKSB7CiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pIHsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyID0gdGhpcy5fZGlzYWJsZVNjcm9sbEJlZm9yZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFnaW5hdGlvbiBhcnJvd3Mgc2hvdWxkIGJlIGFjdGl2YXRlZC4KICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEJlZm9yZSA9IHRoaXMuc2Nyb2xsRGlzdGFuY2UgPT0gMDsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyID0gdGhpcy5zY3JvbGxEaXN0YW5jZSA9PSB0aGlzLl9nZXRNYXhTY3JvbGxEaXN0YW5jZSgpOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggaW4gcGl4ZWxzIHRoYXQgY2FuIGJlIHNldCBmb3IgdGhlIHNjcm9sbCBkaXN0YW5jZS4gVGhpcwogICAgICogaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgaW4gd2lkdGggYmV0d2VlbiB0aGUgdGFiIGxpc3QgY29udGFpbmVyIGFuZCB0YWIgaGVhZGVyIGNvbnRhaW5lci4KICAgICAqCiAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIHRoYXQgZm9yY2VzIGEgbGF5b3V0IHJlZmxvdyB0byBjb21wdXRlIGJveCBhbmQgc2Nyb2xsIG1ldHJpY3MgYW5kCiAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHNwYXJpbmdseS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRNYXhTY3JvbGxEaXN0YW5jZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGVuZ3RoT2ZUYWJMaXN0ID0gdGhpcy5fdGFiTGlzdC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3TGVuZ3RoID0gdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgIHJldHVybiAobGVuZ3RoT2ZUYWJMaXN0IC0gdmlld0xlbmd0aCkgfHwgMDsKICAgIH0KICAgIC8qKgogICAgICogVGVsbHMgdGhlIGluay1iYXIgdG8gYWxpZ24gaXRzZWxmIHRvIHRoZSBjdXJyZW50IGxhYmVsIHdyYXBwZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuX2l0ZW1zICYmIHRoaXMuX2l0ZW1zLmxlbmd0aCA/CiAgICAgICAgICAgIHRoaXMuX2l0ZW1zLnRvQXJyYXkoKVt0aGlzLnNlbGVjdGVkSW5kZXhdIDogbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMYWJlbFdyYXBwZXIgPSBzZWxlY3RlZEl0ZW0gPyBzZWxlY3RlZEl0ZW0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IDogbnVsbDsKICAgICAgICBpZiAoc2VsZWN0ZWRMYWJlbFdyYXBwZXIpIHsKICAgICAgICAgICAgdGhpcy5faW5rQmFyLmFsaWduVG9FbGVtZW50KHNlbGVjdGVkTGFiZWxXcmFwcGVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2lua0Jhci5oaWRlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTdG9wcyB0aGUgY3VycmVudGx5LXJ1bm5pbmcgcGFnaW5hdG9yIGludGVydmFsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N0b3BJbnRlcnZhbCgpIHsKICAgICAgICB0aGlzLl9zdG9wU2Nyb2xsaW5nLm5leHQoKTsKICAgIH0KICAgIC8qKgogICAgICogSGFuZGxlcyB0aGUgdXNlciBwcmVzc2luZyBkb3duIG9uIG9uZSBvZiB0aGUgcGFnaW5hdG9ycy4KICAgICAqIFN0YXJ0cyBzY3JvbGxpbmcgdGhlIGhlYWRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGlvbiBJbiB3aGljaCBkaXJlY3Rpb24gdGhlIHBhZ2luYXRvciBzaG91bGQgYmUgc2Nyb2xsZWQuCiAgICAgKiBAcGFyYW0gez89fSBtb3VzZUV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFuZGxlUGFnaW5hdG9yUHJlc3MoZGlyZWN0aW9uLCBtb3VzZUV2ZW50KSB7CiAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgYXV0byBzY3JvbGxpbmcgZm9yIHJpZ2h0IG1vdXNlIGJ1dHRvbiBjbGlja3MuIE5vdGUgdGhhdCB3ZSBzaG91bGRuJ3QgaGF2ZSB0bwogICAgICAgIC8vIG51bGwgY2hlY2sgdGhlIGBidXR0b25gLCBidXQgd2UgZG8gaXQgc28gd2UgZG9uJ3QgYnJlYWsgdGVzdHMgdGhhdCB1c2UgZmFrZSBldmVudHMuCiAgICAgICAgaWYgKG1vdXNlRXZlbnQgJiYgbW91c2VFdmVudC5idXR0b24gIT0gbnVsbCAmJiBtb3VzZUV2ZW50LmJ1dHRvbiAhPT0gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIEF2b2lkIG92ZXJsYXBwaW5nIHRpbWVycy4KICAgICAgICB0aGlzLl9zdG9wSW50ZXJ2YWwoKTsKICAgICAgICAvLyBTdGFydCBhIHRpbWVyIGFmdGVyIHRoZSBkZWxheSBhbmQga2VlcCBmaXJpbmcgYmFzZWQgb24gdGhlIGludGVydmFsLgogICAgICAgIHRpbWVyKEhFQURFUl9TQ1JPTExfREVMQVksIEhFQURFUl9TQ1JPTExfSU5URVJWQUwpCiAgICAgICAgICAgIC8vIEtlZXAgdGhlIHRpbWVyIGdvaW5nIHVudGlsIHNvbWV0aGluZyB0ZWxscyBpdCB0byBzdG9wIG9yIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLgogICAgICAgICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5fc3RvcFNjcm9sbGluZywgdGhpcy5fZGVzdHJveWVkKSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBjb25zdCB7IG1heFNjcm9sbERpc3RhbmNlLCBkaXN0YW5jZSB9ID0gdGhpcy5fc2Nyb2xsSGVhZGVyKGRpcmVjdGlvbik7CiAgICAgICAgICAgIC8vIFN0b3AgdGhlIHRpbWVyIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIHN0YXJ0IG9yIHRoZSBlbmQuCiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA9PT0gMCB8fCBkaXN0YW5jZSA+PSBtYXhTY3JvbGxEaXN0YW5jZSkgewogICAgICAgICAgICAgICAgdGhpcy5fc3RvcEludGVydmFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFNjcm9sbHMgdGhlIGhlYWRlciB0byBhIGdpdmVuIHBvc2l0aW9uLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24gUG9zaXRpb24gdG8gd2hpY2ggdG8gc2Nyb2xsLgogICAgICogQHJldHVybiB7P30gSW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgc2Nyb2xsIGRpc3RhbmNlIGFuZCB0aGUgbWF4aW11bS4KICAgICAqLwogICAgX3Njcm9sbFRvKHBvc2l0aW9uKSB7CiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHsgbWF4U2Nyb2xsRGlzdGFuY2U6IDAsIGRpc3RhbmNlOiAwIH07CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXhTY3JvbGxEaXN0YW5jZSA9IHRoaXMuX2dldE1heFNjcm9sbERpc3RhbmNlKCk7CiAgICAgICAgdGhpcy5fc2Nyb2xsRGlzdGFuY2UgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXhTY3JvbGxEaXN0YW5jZSwgcG9zaXRpb24pKTsKICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIHNjcm9sbCBkaXN0YW5jZSBoYXMgY2hhbmdlZCBzbyB0aGF0IGFmdGVyIHRoZSB2aWV3IGlzIGNoZWNrZWQsIHRoZSBDU1MKICAgICAgICAvLyB0cmFuc2Zvcm1hdGlvbiBjYW4gbW92ZSB0aGUgaGVhZGVyLgogICAgICAgIHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpOwogICAgICAgIHJldHVybiB7IG1heFNjcm9sbERpc3RhbmNlLCBkaXN0YW5jZTogdGhpcy5fc2Nyb2xsRGlzdGFuY2UgfTsKICAgIH0KfQpNYXRQYWdpbmF0ZWRUYWJIZWFkZXIuybVmYWMgPSBmdW5jdGlvbiBNYXRQYWdpbmF0ZWRUYWJIZWFkZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UGFnaW5hdGVkVGFiSGVhZGVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3cG9ydFJ1bGVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSk7IH07Ck1hdFBhZ2luYXRlZFRhYkhlYWRlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRQYWdpbmF0ZWRUYWJIZWFkZXIsIGlucHV0czogeyBkaXNhYmxlUGFnaW5hdGlvbjogImRpc2FibGVQYWdpbmF0aW9uIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0UGFnaW5hdGVkVGFiSGVhZGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQpdOwpNYXRQYWdpbmF0ZWRUYWJIZWFkZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICBkaXNhYmxlUGFnaW5hdGlvbjogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1oZWFkZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEJhc2UgY2xhc3Mgd2l0aCBhbGwgb2YgdGhlIGBNYXRUYWJIZWFkZXJgIGZ1bmN0aW9uYWxpdHkuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBhYnN0cmFjdAogKi8KLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNsYXNzLW5hbWUKY2xhc3MgX01hdFRhYkhlYWRlckJhc2UgZXh0ZW5kcyBNYXRQYWdpbmF0ZWRUYWJIZWFkZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtCiAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBkaXIsIG5nWm9uZSwgcGxhdGZvcm0sIAogICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBgX2FuaW1hdGlvbk1vZGVgIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBkaXIsIG5nWm9uZSwgcGxhdGZvcm0sIGFuaW1hdGlvbk1vZGUpOwogICAgICAgIHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgcmlwcGxlIGVmZmVjdCBpcyBkaXNhYmxlZCBvciBub3QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGlzYWJsZVJpcHBsZSgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGU7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGRpc2FibGVSaXBwbGUodmFsdWUpIHsgdGhpcy5fZGlzYWJsZVJpcHBsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogQHByb3RlY3RlZAogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2l0ZW1TZWxlY3RlZChldmVudCkgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9Cn0KX01hdFRhYkhlYWRlckJhc2UuybVmYWMgPSBmdW5jdGlvbiBfTWF0VGFiSGVhZGVyQmFzZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0VGFiSGVhZGVyQmFzZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld3BvcnRSdWxlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwpfTWF0VGFiSGVhZGVyQmFzZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBfTWF0VGFiSGVhZGVyQmFzZSwgaW5wdXRzOiB7IGRpc2FibGVSaXBwbGU6ICJkaXNhYmxlUmlwcGxlIiB9LCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KX01hdFRhYkhlYWRlckJhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Cl9NYXRUYWJIZWFkZXJCYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgZGlzYWJsZVJpcHBsZTogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFRoZSBoZWFkZXIgb2YgdGhlIHRhYiBncm91cCB3aGljaCBkaXNwbGF5cyBhIGxpc3Qgb2YgYWxsIHRoZSB0YWJzIGluIHRoZSB0YWIgZ3JvdXAuIEluY2x1ZGVzCiAqIGFuIGluayBiYXIgdGhhdCBmb2xsb3dzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFiLiBXaGVuIHRoZSB0YWJzIGxpc3QncyB3aWR0aCBleGNlZWRzIHRoZQogKiB3aWR0aCBvZiB0aGUgaGVhZGVyIGNvbnRhaW5lciwgdGhlbiBhcnJvd3Mgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2Nyb2xsCiAqIGxlZnQgYW5kIHJpZ2h0IGFjcm9zcyB0aGUgaGVhZGVyLgogKiBcQGRvY3MtcHJpdmF0ZQogKi8KY2xhc3MgTWF0VGFiSGVhZGVyIGV4dGVuZHMgX01hdFRhYkhlYWRlckJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtCiAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBkaXIsIG5nWm9uZSwgcGxhdGZvcm0sIAogICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBgX2FuaW1hdGlvbk1vZGVgIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBkaXIsIG5nWm9uZSwgcGxhdGZvcm0sIGFuaW1hdGlvbk1vZGUpOwogICAgfQp9Ck1hdFRhYkhlYWRlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWJIZWFkZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKTWF0VGFiSGVhZGVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFRhYkhlYWRlciwgc2VsZWN0b3JzOiBbWyJtYXQtdGFiLWhlYWRlciJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9Db250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJJbmRleCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0VGFiTGFiZWxXcmFwcGVyLCBmYWxzZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faXRlbXMgPSBfdCk7CiAgICB9IH0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0VGFiSGVhZGVyX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoTWF0SW5rQmFyLCB0cnVlKTsKICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KF9jNSwgdHJ1ZSk7CiAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzYsIHRydWUpOwogICAgICAgIMm1ybV2aWV3UXVlcnkoX2M3LCB0cnVlKTsKICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jOCwgdHJ1ZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW5rQmFyID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3RhYkxpc3RDb250YWluZXIgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGFiTGlzdCA9IF90LmZpcnN0KTsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9uZXh0UGFnaW5hdG9yID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3ByZXZpb3VzUGFnaW5hdG9yID0gX3QuZmlyc3QpOwogICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LXRhYi1oZWFkZXIiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0VGFiSGVhZGVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWQiLCBjdHguX3Nob3dQYWdpbmF0aW9uQ29udHJvbHMpKCJtYXQtdGFiLWhlYWRlci1ydGwiLCBjdHguX2dldExheW91dERpcmVjdGlvbigpID09ICJydGwiKTsKICAgIH0gfSwgaW5wdXRzOiB7IHNlbGVjdGVkSW5kZXg6ICJzZWxlY3RlZEluZGV4IiB9LCBvdXRwdXRzOiB7IHNlbGVjdEZvY3VzZWRJbmRleDogInNlbGVjdEZvY3VzZWRJbmRleCIsIGluZGV4Rm9jdXNlZDogImluZGV4Rm9jdXNlZCIgfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzAkMywgZGVjbHM6IDEzLCB2YXJzOiA4LCBjb25zdHM6IFtbImFyaWEtaGlkZGVuIiwgInRydWUiLCAibWF0LXJpcHBsZSIsICIiLCAxLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiIsICJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSIsICJtYXQtZWxldmF0aW9uLXo0IiwgMywgIm1hdFJpcHBsZURpc2FibGVkIiwgImNsaWNrIiwgIm1vdXNlZG93biIsICJ0b3VjaGVuZCJdLCBbInByZXZpb3VzUGFnaW5hdG9yIiwgIiJdLCBbMSwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiJdLCBbMSwgIm1hdC10YWItbGFiZWwtY29udGFpbmVyIiwgMywgImtleWRvd24iXSwgWyJ0YWJMaXN0Q29udGFpbmVyIiwgIiJdLCBbInJvbGUiLCAidGFibGlzdCIsIDEsICJtYXQtdGFiLWxpc3QiLCAzLCAiY2RrT2JzZXJ2ZUNvbnRlbnQiXSwgWyJ0YWJMaXN0IiwgIiJdLCBbMSwgIm1hdC10YWItbGFiZWxzIl0sIFsiYXJpYS1oaWRkZW4iLCAidHJ1ZSIsICJtYXQtcmlwcGxlIiwgIiIsIDEsICJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIiLCAibWF0LWVsZXZhdGlvbi16NCIsIDMsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJtb3VzZWRvd24iLCAiY2xpY2siLCAidG91Y2hlbmQiXSwgWyJuZXh0UGFnaW5hdG9yIiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X2NsaWNrXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX2hhbmRsZVBhZ2luYXRvckNsaWNrKCJiZWZvcmUiKTsgfSkoIm1vdXNlZG93biIsIGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9UZW1wbGF0ZV9kaXZfbW91c2Vkb3duXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX2hhbmRsZVBhZ2luYXRvclByZXNzKCJiZWZvcmUiLCAkZXZlbnQpOyB9KSgidG91Y2hlbmQiLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X3RvdWNoZW5kXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX3N0b3BJbnRlcnZhbCgpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAzLCA0KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X2tleWRvd25fM19saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlS2V5ZG93bigkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiLCA1LCA2KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNka09ic2VydmVDb250ZW50IiwgZnVuY3Rpb24gTWF0VGFiSGVhZGVyX1RlbXBsYXRlX2Rpdl9jZGtPYnNlcnZlQ29udGVudF81X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Ll9vbkNvbnRlbnRDaGFuZ2VzKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIsIDcpOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnQoOSwgIm1hdC1pbmstYmFyIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJkaXYiLCA4LCA5KTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm1vdXNlZG93biIsIGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9UZW1wbGF0ZV9kaXZfbW91c2Vkb3duXzEwX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYWZ0ZXIiLCAkZXZlbnQpOyB9KSgiY2xpY2siLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X2NsaWNrXzEwX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVQYWdpbmF0b3JDbGljaygiYWZ0ZXIiKTsgfSkoInRvdWNoZW5kIiwgZnVuY3Rpb24gTWF0VGFiSGVhZGVyX1RlbXBsYXRlX2Rpdl90b3VjaGVuZF8xMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5fc3RvcEludGVydmFsKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50KDEyLCAiZGl2IiwgMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQiLCBjdHguX2Rpc2FibGVTY3JvbGxCZWZvcmUpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlRGlzYWJsZWQiLCBjdHguX2Rpc2FibGVTY3JvbGxCZWZvcmUgfHwgY3R4LmRpc2FibGVSaXBwbGUpOwogICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgIMm1ybVjbGFzc1Byb3AoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiKTsKICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIiwgY3R4Ll9kaXNhYmxlU2Nyb2xsQWZ0ZXIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlRGlzYWJsZWQiLCBjdHguX2Rpc2FibGVTY3JvbGxBZnRlciB8fCBjdHguZGlzYWJsZVJpcHBsZSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRSaXBwbGUsIENka09ic2VydmVDb250ZW50LCBNYXRJbmtCYXJdLCBzdHlsZXM6IFsiLm1hdC10YWItaGVhZGVye2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21pbi13aWR0aDozMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6Mjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dG91Y2gtYWN0aW9uOm5vbmV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntkaXNwbGF5OmZsZXh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1sZWZ0OjRweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLXJpZ2h0OjRweH0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjJweCAycHggMCAwO2NvbnRlbnQ6XCJcIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC1pbmstYmFye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2hlaWdodDoycHg7dHJhbnNpdGlvbjo1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1pbmstYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC1pbmstYmFye2JvdHRvbTphdXRvO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pbmstYmFye291dGxpbmU6c29saWQgMnB4O2hlaWdodDowfS5tYXQtdGFiLWxhYmVsc3tkaXNwbGF5OmZsZXh9W21hdC1hbGlnbi10YWJzPWNlbnRlcl0gLm1hdC10YWItbGFiZWxze2p1c3RpZnktY29udGVudDpjZW50ZXJ9W21hdC1hbGlnbi10YWJzPWVuZF0gLm1hdC10YWItbGFiZWxze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0ubWF0LXRhYi1sYWJlbC1jb250YWluZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzoxO292ZXJmbG93OmhpZGRlbjt6LWluZGV4OjF9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC10YWItbGlzdHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItbGFiZWx7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHg7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6LjY7bWluLXdpZHRoOjE2MHB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1sYWJlbDpmb2N1czpub3QoLm1hdC10YWItZGlzYWJsZWQpe29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweDtvdXRsaW5lLW9mZnNldDotMnB4fS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVke29wYWNpdHk6LjV9Lm1hdC10YWItbGFiZWwgLm1hdC10YWItbGFiZWwtY29udGVudHtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVse29wYWNpdHk6MX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10YWItbGFiZWx7bWluLXdpZHRoOjcycHh9fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRUYWJIZWFkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Ck1hdFRhYkhlYWRlci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIF9pdGVtczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0VGFiTGFiZWxXcmFwcGVyLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSB9LF0gfV0sCiAgICBfaW5rQmFyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRJbmtCYXIsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF90YWJMaXN0Q29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsndGFiTGlzdENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF90YWJMaXN0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsndGFiTGlzdCcsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF9uZXh0UGFnaW5hdG9yOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnbmV4dFBhZ2luYXRvcicsXSB9XSwKICAgIF9wcmV2aW91c1BhZ2luYXRvcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3ByZXZpb3VzUGFnaW5hdG9yJyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWItbmF2LWJhci90YWItbmF2LWJhci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQmFzZSBjbGFzcyB3aXRoIGFsbCBvZiB0aGUgYE1hdFRhYk5hdmAgZnVuY3Rpb25hbGl0eS4KICogXEBkb2NzLXByaXZhdGUKICogQGFic3RyYWN0CiAqLwovLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y2xhc3MtbmFtZQpjbGFzcyBfTWF0VGFiTmF2QmFzZSBleHRlbmRzIE1hdFBhZ2luYXRlZFRhYkhlYWRlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZURldGVjdG9yUmVmCiAgICAgKiBAcGFyYW0gez99IHZpZXdwb3J0UnVsZXIKICAgICAqIEBwYXJhbSB7Pz19IHBsYXRmb3JtCiAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIGRpciwgbmdab25lLCBjaGFuZ2VEZXRlY3RvclJlZiwgdmlld3BvcnRSdWxlciwgCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLgogICAgICovCiAgICBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBkaXIsIG5nWm9uZSwgcGxhdGZvcm0sIGFuaW1hdGlvbk1vZGUpOwogICAgICAgIHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGVtZSBjb2xvciBvZiB0aGUgbmF2IGJhci4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNvbG9yID0gJ3ByaW1hcnknOwogICAgfQogICAgLyoqCiAgICAgKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB0YWIgbmF2LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGJhY2tncm91bmRDb2xvcigpIHsgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb2xvcjsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgYmFja2dyb3VuZENvbG9yKHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7CiAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShgbWF0LWJhY2tncm91bmQtJHt0aGlzLmJhY2tncm91bmRDb2xvcn1gKTsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChgbWF0LWJhY2tncm91bmQtJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHJpcHBsZSBlZmZlY3QgaXMgZGlzYWJsZWQgb3Igbm90LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRpc2FibGVSaXBwbGUoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlUmlwcGxlOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBkaXNhYmxlUmlwcGxlKHZhbHVlKSB7IHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAvKioKICAgICAqIEBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pdGVtU2VsZWN0ZWQoKSB7CiAgICAgICAgLy8gbm9vcAogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgLy8gV2UgbmVlZCB0aGlzIHRvIHJ1biBiZWZvcmUgdGhlIGBjaGFuZ2VzYCBzdWJzY3JpcHRpb24gaW4gcGFyZW50IHRvIGVuc3VyZSB0aGF0IHRoZQogICAgICAgIC8vIHNlbGVjdGVkSW5kZXggaXMgdXAtdG8tZGF0ZSBieSB0aGUgdGltZSB0aGUgc3VwZXIgY2xhc3Mgc3RhcnRzIGxvb2tpbmcgZm9yIGl0LgogICAgICAgIHRoaXMuX2l0ZW1zLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUxpbmsoKTsKICAgICAgICB9KSk7CiAgICAgICAgc3VwZXIubmdBZnRlckNvbnRlbnRJbml0KCk7CiAgICB9CiAgICAvKioKICAgICAqIE5vdGlmaWVzIHRoZSBjb21wb25lbnQgdGhhdCB0aGUgYWN0aXZlIGxpbmsgaGFzIGJlZW4gY2hhbmdlZC4KICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wIGBlbGVtZW50YCBwYXJhbWV0ZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAqIEBwYXJhbSB7Pz19IF9lbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cGRhdGVBY3RpdmVMaW5rKF9lbGVtZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLl9pdGVtcykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zLnRvQXJyYXkoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpdGVtc1tpXS5hY3RpdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGk7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUaGUgaW5rIGJhciBzaG91bGQgaGlkZSBpdHNlbGYgaWYgbm8gaXRlbXMgYXJlIGFjdGl2ZS4KICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKICAgICAgICB0aGlzLl9pbmtCYXIuaGlkZSgpOwogICAgfQp9Cl9NYXRUYWJOYXZCYXNlLsm1ZmFjID0gZnVuY3Rpb24gX01hdFRhYk5hdkJhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgX01hdFRhYk5hdkJhc2UpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKX01hdFRhYk5hdkJhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogX01hdFRhYk5hdkJhc2UsIGlucHV0czogeyBjb2xvcjogImNvbG9yIiwgYmFja2dyb3VuZENvbG9yOiAiYmFja2dyb3VuZENvbG9yIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpfTWF0VGFiTmF2QmFzZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgIHsgdHlwZTogUGxhdGZvcm0sIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Cl9NYXRUYWJOYXZCYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgYmFja2dyb3VuZENvbG9yOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRpc2FibGVSaXBwbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgY29sb3I6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBOYXZpZ2F0aW9uIGNvbXBvbmVudCBtYXRjaGluZyB0aGUgc3R5bGVzIG9mIHRoZSB0YWIgZ3JvdXAgaGVhZGVyLgogKiBQcm92aWRlcyBhbmNob3JlZCBuYXZpZ2F0aW9uIHdpdGggYW5pbWF0ZWQgaW5rIGJhci4KICovCmNsYXNzIE1hdFRhYk5hdiBleHRlbmRzIF9NYXRUYWJOYXZCYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHBhcmFtIHs/fSBuZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/PX0gcGxhdGZvcm0KICAgICAqIEBwYXJhbSB7Pz19IGFuaW1hdGlvbk1vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgZGlyLCBuZ1pvbmUsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCAKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBgcGxhdGZvcm1gIHBhcmFtZXRlciB0byBiZWNvbWUgcmVxdWlyZWQuCiAgICAgKi8KICAgIHBsYXRmb3JtLCBhbmltYXRpb25Nb2RlKSB7CiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgZGlyLCBuZ1pvbmUsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7CiAgICB9Cn0KTWF0VGFiTmF2Lsm1ZmFjID0gZnVuY3Rpb24gTWF0VGFiTmF2X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYk5hdikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld3BvcnRSdWxlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0sIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwpNYXRUYWJOYXYuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0VGFiTmF2LCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtdGFiLW5hdi1iYXIiLCAiIl1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0VGFiTmF2X0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRUYWJMaW5rLCB0cnVlKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIHZhciBfdDsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9pdGVtcyA9IF90KTsKICAgIH0gfSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRUYWJOYXZfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShNYXRJbmtCYXIsIHRydWUpOwogICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2M1LCB0cnVlKTsKICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KF9jNiwgdHJ1ZSk7CiAgICAgICAgybXJtXZpZXdRdWVyeShfYzcsIHRydWUpOwogICAgICAgIMm1ybV2aWV3UXVlcnkoX2M4LCB0cnVlKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIHZhciBfdDsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9pbmtCYXIgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGFiTGlzdENvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll90YWJMaXN0ID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX25leHRQYWdpbmF0b3IgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcHJldmlvdXNQYWdpbmF0b3IgPSBfdC5maXJzdCk7CiAgICB9IH0sIGhvc3RBdHRyczogWzEsICJtYXQtdGFiLW5hdi1iYXIiLCAibWF0LXRhYi1oZWFkZXIiXSwgaG9zdFZhcnM6IDEwLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFRhYk5hdl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIiwgY3R4Ll9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwgY3R4Ll9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PSAicnRsIikoIm1hdC1wcmltYXJ5IiwgY3R4LmNvbG9yICE9PSAid2FybiIgJiYgY3R4LmNvbG9yICE9PSAiYWNjZW50IikoIm1hdC1hY2NlbnQiLCBjdHguY29sb3IgPT09ICJhY2NlbnQiKSgibWF0LXdhcm4iLCBjdHguY29sb3IgPT09ICJ3YXJuIik7CiAgICB9IH0sIGlucHV0czogeyBjb2xvcjogImNvbG9yIiB9LCBleHBvcnRBczogWyJtYXRUYWJOYXZCYXIiLCAibWF0VGFiTmF2Il0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGF0dHJzOiBfYzksIG5nQ29udGVudFNlbGVjdG9yczogX2MwJDMsIGRlY2xzOiAxMywgdmFyczogOCwgY29uc3RzOiBbWyJhcmlhLWhpZGRlbiIsICJ0cnVlIiwgIm1hdC1yaXBwbGUiLCAiIiwgMSwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUiLCAibWF0LWVsZXZhdGlvbi16NCIsIDMsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJjbGljayIsICJtb3VzZWRvd24iLCAidG91Y2hlbmQiXSwgWyJwcmV2aW91c1BhZ2luYXRvciIsICIiXSwgWzEsICJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24iXSwgWzEsICJtYXQtdGFiLWxpbmstY29udGFpbmVyIiwgMywgImtleWRvd24iXSwgWyJ0YWJMaXN0Q29udGFpbmVyIiwgIiJdLCBbMSwgIm1hdC10YWItbGlzdCIsIDMsICJjZGtPYnNlcnZlQ29udGVudCJdLCBbInRhYkxpc3QiLCAiIl0sIFsxLCAibWF0LXRhYi1saW5rcyJdLCBbImFyaWEtaGlkZGVuIiwgInRydWUiLCAibWF0LXJpcHBsZSIsICIiLCAxLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiIsICJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIiwgIm1hdC1lbGV2YXRpb24tejQiLCAzLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAibW91c2Vkb3duIiwgImNsaWNrIiwgInRvdWNoZW5kIl0sIFsibmV4dFBhZ2luYXRvciIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRUYWJOYXZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlX2Rpdl9jbGlja18wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVQYWdpbmF0b3JDbGljaygiYmVmb3JlIik7IH0pKCJtb3VzZWRvd24iLCBmdW5jdGlvbiBNYXRUYWJOYXZfVGVtcGxhdGVfZGl2X21vdXNlZG93bl8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYmVmb3JlIiwgJGV2ZW50KTsgfSkoInRvdWNoZW5kIiwgZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlX2Rpdl90b3VjaGVuZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Ll9zdG9wSW50ZXJ2YWwoKTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnQoMiwgImRpdiIsIDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMywgNCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlX2Rpdl9rZXlkb3duXzNfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX2hhbmRsZUtleWRvd24oJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgNSwgNik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjZGtPYnNlcnZlQ29udGVudCIsIGZ1bmN0aW9uIE1hdFRhYk5hdl9UZW1wbGF0ZV9kaXZfY2RrT2JzZXJ2ZUNvbnRlbnRfNV9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5fb25Db250ZW50Q2hhbmdlcygpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiLCA3KTsKICAgICAgICDJtcm1cHJvamVjdGlvbig4KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50KDksICJtYXQtaW5rLWJhciIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEwLCAiZGl2IiwgOCwgOSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJtb3VzZWRvd24iLCBmdW5jdGlvbiBNYXRUYWJOYXZfVGVtcGxhdGVfZGl2X21vdXNlZG93bl8xMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImFmdGVyIiwgJGV2ZW50KTsgfSkoImNsaWNrIiwgZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlX2Rpdl9jbGlja18xMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImFmdGVyIik7IH0pKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uIE1hdFRhYk5hdl9UZW1wbGF0ZV9kaXZfdG91Y2hlbmRfMTBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX3N0b3BJbnRlcnZhbCgpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudCgxMiwgImRpdiIsIDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIiwgY3R4Ll9kaXNhYmxlU2Nyb2xsQmVmb3JlKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4Ll9kaXNhYmxlU2Nyb2xsQmVmb3JlIHx8IGN0eC5kaXNhYmxlUmlwcGxlKTsKICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEFmdGVyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4Ll9kaXNhYmxlU2Nyb2xsQWZ0ZXIgfHwgY3R4LmRpc2FibGVSaXBwbGUpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0UmlwcGxlLCBDZGtPYnNlcnZlQ29udGVudCwgTWF0SW5rQmFyXSwgc3R5bGVzOiBbIi5tYXQtdGFiLWhlYWRlcntkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjB9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjttaW4td2lkdGg6MzJweDtjdXJzb3I6cG9pbnRlcjt6LWluZGV4OjI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RvdWNoLWFjdGlvbjpub25lfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257ZGlzcGxheTpmbGV4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctbGVmdDo0cHh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyl9Lm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1yaWdodDo0cHh9Lm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoycHggMnB4IDAgMDtjb250ZW50OlwiXCI7aGVpZ2h0OjhweDt3aWR0aDo4cHh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7Ym94LXNoYWRvdzpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtdGFiLWxpc3R7ZmxleC1ncm93OjE7cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtdGFiLWxpbmtze2Rpc3BsYXk6ZmxleH1bbWF0LWFsaWduLXRhYnM9Y2VudGVyXSAubWF0LXRhYi1saW5rc3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfVttYXQtYWxpZ24tdGFicz1lbmRdIC5tYXQtdGFiLWxpbmtze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0ubWF0LWluay1iYXJ7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7aGVpZ2h0OjJweDt0cmFuc2l0aW9uOjUwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWluay1iYXJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LWluay1iYXJ7Ym90dG9tOmF1dG87dG9wOjB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWluay1iYXJ7b3V0bGluZTpzb2xpZCAycHg7aGVpZ2h0OjB9Lm1hdC10YWItbGluay1jb250YWluZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzoxO292ZXJmbG93OmhpZGRlbjt6LWluZGV4OjF9Lm1hdC10YWItbGlua3toZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246dG9wO3RleHQtZGVjb3JhdGlvbjpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC10YWItbGluazpmb2N1c3tvdXRsaW5lOm5vbmV9Lm1hdC10YWItbGluazpmb2N1czpub3QoLm1hdC10YWItZGlzYWJsZWQpe29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxpbms6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke29wYWNpdHk6LjV9Lm1hdC10YWItbGluayAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGlua3tvcGFjaXR5OjF9W21hdC1zdHJldGNoLXRhYnNdIC5tYXQtdGFiLWxpbmt7ZmxleC1iYXNpczowO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1saW5re21pbi13aWR0aDo3MnB4fX1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0VGFiTmF2LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KXTsKTWF0VGFiTmF2LnByb3BEZWNvcmF0b3JzID0gewogICAgX2l0ZW1zOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtmb3J3YXJkUmVmKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IE1hdFRhYkxpbmspKSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sCiAgICBfaW5rQmFyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRJbmtCYXIsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF90YWJMaXN0Q29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsndGFiTGlzdENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF90YWJMaXN0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsndGFiTGlzdCcsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF9uZXh0UGFnaW5hdG9yOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnbmV4dFBhZ2luYXRvcicsXSB9XSwKICAgIF9wcmV2aW91c1BhZ2luYXRvcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3ByZXZpb3VzUGFnaW5hdG9yJyxdIH1dCn07Ci8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0VGFiTGluay4KY2xhc3MgTWF0VGFiTGlua01peGluQmFzZSB7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfTWF0VGFiTGlua01peGluQmFzZSA9IG1peGluVGFiSW5kZXgobWl4aW5EaXNhYmxlUmlwcGxlKG1peGluRGlzYWJsZWQoTWF0VGFiTGlua01peGluQmFzZSkpKTsKLyoqCiAqIEJhc2UgY2xhc3Mgd2l0aCBhbGwgb2YgdGhlIGBNYXRUYWJMaW5rYCBmdW5jdGlvbmFsaXR5LgogKi8KLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNsYXNzLW5hbWUKY2xhc3MgX01hdFRhYkxpbmtCYXNlIGV4dGVuZHMgX01hdFRhYkxpbmtNaXhpbkJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF90YWJOYXZCYXIKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBnbG9iYWxSaXBwbGVPcHRpb25zCiAgICAgKiBAcGFyYW0gez99IHRhYkluZGV4CiAgICAgKiBAcGFyYW0gez99IF9mb2N1c01vbml0b3IKICAgICAqIEBwYXJhbSB7Pz19IGFuaW1hdGlvbk1vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IoX3RhYk5hdkJhciwgZWxlbWVudFJlZiwgZ2xvYmFsUmlwcGxlT3B0aW9ucywgdGFiSW5kZXgsIF9mb2N1c01vbml0b3IsIGFuaW1hdGlvbk1vZGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX3RhYk5hdkJhciA9IF90YWJOYXZCYXI7CiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IgPSBfZm9jdXNNb25pdG9yOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHRhYiBsaW5rIGlzIGFjdGl2ZSBvciBub3QuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTsKICAgICAgICB0aGlzLnJpcHBsZUNvbmZpZyA9IGdsb2JhbFJpcHBsZU9wdGlvbnMgfHwge307CiAgICAgICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4KSB8fCAwOwogICAgICAgIGlmIChhbmltYXRpb25Nb2RlID09PSAnTm9vcEFuaW1hdGlvbnMnKSB7CiAgICAgICAgICAgIHRoaXMucmlwcGxlQ29uZmlnLmFuaW1hdGlvbiA9IHsgZW50ZXJEdXJhdGlvbjogMCwgZXhpdER1cmF0aW9uOiAwIH07CiAgICAgICAgfQogICAgICAgIF9mb2N1c01vbml0b3IubW9uaXRvcihlbGVtZW50UmVmKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgbGluayBpcyBhY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgYWN0aXZlKCkgeyByZXR1cm4gdGhpcy5faXNBY3RpdmU7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGFjdGl2ZSh2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5faXNBY3RpdmUpIHsKICAgICAgICAgICAgdGhpcy5faXNBY3RpdmUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fdGFiTmF2QmFyLnVwZGF0ZUFjdGl2ZUxpbmsodGhpcy5lbGVtZW50UmVmKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgcmlwcGxlcyBhcmUgZGlzYWJsZWQgb24gaW50ZXJhY3Rpb24uCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJpcHBsZURpc2FibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJpcHBsZSB8fCB0aGlzLl90YWJOYXZCYXIuZGlzYWJsZVJpcHBsZSB8fAogICAgICAgICAgICAhIXRoaXMucmlwcGxlQ29uZmlnLmRpc2FibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb2N1cygpIHsKICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTsKICAgIH0KfQpfTWF0VGFiTGlua0Jhc2UuybVmYWMgPSBmdW5jdGlvbiBfTWF0VGFiTGlua0Jhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgX01hdFRhYkxpbmtCYXNlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KF9NYXRUYWJOYXZCYXNlKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TLCA4KSwgybXJtWluamVjdEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwpfTWF0VGFiTGlua0Jhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogX01hdFRhYkxpbmtCYXNlLCBpbnB1dHM6IHsgYWN0aXZlOiAiYWN0aXZlIiB9LCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KX01hdFRhYkxpbmtCYXNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBfTWF0VGFiTmF2QmFzZSB9LAogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TLF0gfV0gfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsndGFiaW5kZXgnLF0gfV0gfSwKICAgIHsgdHlwZTogRm9jdXNNb25pdG9yIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Cl9NYXRUYWJMaW5rQmFzZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGFjdGl2ZTogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIExpbmsgaW5zaWRlIG9mIGEgYG1hdC10YWItbmF2LWJhcmAuCiAqLwpjbGFzcyBNYXRUYWJMaW5rIGV4dGVuZHMgX01hdFRhYkxpbmtCYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YWJOYXZCYXIKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBuZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAqIEBwYXJhbSB7P30gZ2xvYmFsUmlwcGxlT3B0aW9ucwogICAgICogQHBhcmFtIHs/fSB0YWJJbmRleAogICAgICogQHBhcmFtIHs/fSBmb2N1c01vbml0b3IKICAgICAqIEBwYXJhbSB7Pz19IGFuaW1hdGlvbk1vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IodGFiTmF2QmFyLCBlbGVtZW50UmVmLCBuZ1pvbmUsIHBsYXRmb3JtLCBnbG9iYWxSaXBwbGVPcHRpb25zLCB0YWJJbmRleCwgZm9jdXNNb25pdG9yLCBhbmltYXRpb25Nb2RlKSB7CiAgICAgICAgc3VwZXIodGFiTmF2QmFyLCBlbGVtZW50UmVmLCBnbG9iYWxSaXBwbGVPcHRpb25zLCB0YWJJbmRleCwgZm9jdXNNb25pdG9yLCBhbmltYXRpb25Nb2RlKTsKICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlID0gbmV3IFJpcHBsZVJlbmRlcmVyKHRoaXMsIG5nWm9uZSwgZWxlbWVudFJlZiwgcGxhdGZvcm0pOwogICAgICAgIHRoaXMuX3RhYkxpbmtSaXBwbGUuc2V0dXBUcmlnZ2VyRXZlbnRzKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7CiAgICAgICAgdGhpcy5fdGFiTGlua1JpcHBsZS5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpOwogICAgfQp9Ck1hdFRhYkxpbmsuybVmYWMgPSBmdW5jdGlvbiBNYXRUYWJMaW5rX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkxpbmspKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0VGFiTmF2KSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TLCA4KSwgybXJtWluamVjdEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwpNYXRUYWJMaW5rLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFRhYkxpbmssIHNlbGVjdG9yczogW1siIiwgIm1hdC10YWItbGluayIsICIiXSwgWyIiLCAibWF0VGFiTGluayIsICIiXV0sIGhvc3RBdHRyczogWzEsICJtYXQtdGFiLWxpbmsiLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogNywgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRUYWJMaW5rX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiLCBjdHguYWN0aXZlID8gInBhZ2UiIDogbnVsbCkoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJ0YWJJbmRleCIsIGN0eC50YWJJbmRleCk7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoIm1hdC10YWItbGFiZWwtYWN0aXZlIiwgY3R4LmFjdGl2ZSk7CiAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCB0YWJJbmRleDogInRhYkluZGV4IiB9LCBleHBvcnRBczogWyJtYXRUYWJMaW5rIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRUYWJMaW5rLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBNYXRUYWJOYXYgfSwKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9SSVBQTEVfR0xPQkFMX09QVElPTlMsXSB9XSB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEF0dHJpYnV0ZSwgYXJnczogWyd0YWJpbmRleCcsXSB9XSB9LAogICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYnMtbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE1hdFRhYnNNb2R1bGUgewp9Ck1hdFRhYnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRUYWJzTW9kdWxlIH0pOwpNYXRUYWJzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0VGFic01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWJzTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgUG9ydGFsTW9kdWxlLAogICAgICAgICAgICBNYXRSaXBwbGVNb2R1bGUsCiAgICAgICAgICAgIE9ic2VydmVyc01vZHVsZSwKICAgICAgICAgICAgQTExeU1vZHVsZSwKICAgICAgICBdLAogICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdFRhYnNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0VGFiR3JvdXAsCiAgICAgICAgTWF0VGFiTGFiZWwsCiAgICAgICAgTWF0VGFiLAogICAgICAgIE1hdElua0JhciwKICAgICAgICBNYXRUYWJMYWJlbFdyYXBwZXIsCiAgICAgICAgTWF0VGFiTmF2LAogICAgICAgIE1hdFRhYkxpbmssCiAgICAgICAgTWF0VGFiQm9keSwKICAgICAgICBNYXRUYWJCb2R5UG9ydGFsLAogICAgICAgIE1hdFRhYkhlYWRlciwKICAgICAgICBNYXRUYWJDb250ZW50XTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0NvbW1vbk1vZHVsZSwKICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgUG9ydGFsTW9kdWxlLAogICAgICAgIE1hdFJpcHBsZU1vZHVsZSwKICAgICAgICBPYnNlcnZlcnNNb2R1bGUsCiAgICAgICAgQTExeU1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgTWF0VGFiR3JvdXAsCiAgICAgICAgTWF0VGFiTGFiZWwsCiAgICAgICAgTWF0VGFiLAogICAgICAgIE1hdFRhYk5hdiwKICAgICAgICBNYXRUYWJMaW5rLAogICAgICAgIE1hdFRhYkNvbnRlbnRdOyB9IH0pOyB9KSgpOwoKY29uc3QgX2MwJDQgPSBbInVuZGVybGluZSJdOwpjb25zdCBfYzEkNCA9IFsiY29ubmVjdGlvbkNvbnRhaW5lciJdOwpjb25zdCBfYzIkMiA9IFsiaW5wdXRDb250YWluZXIiXTsKY29uc3QgX2MzJDEgPSBbImxhYmVsIl07CmZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9uZ19jb250YWluZXJfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxNCk7CiAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMTUpOwogICAgybXJtWVsZW1lbnQoMywgImRpdiIsIDE2KTsKICAgIMm1ybVlbGVtZW50KDQsICJkaXYiLCAxNyk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgMTgpOwogICAgybXJtWVsZW1lbnQoNiwgImRpdiIsIDE1KTsKICAgIMm1ybVlbGVtZW50KDcsICJkaXYiLCAxNik7CiAgICDJtcm1ZWxlbWVudCg4LCAiZGl2IiwgMTcpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7Cn0gfQpmdW5jdGlvbiBNYXRGb3JtRmllbGRfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxOSk7CiAgICDJtcm1cHJvamVjdGlvbigxLCAxKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV9uZ19jb250YWluZXJfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICDJtcm1cHJvamVjdGlvbigxLCAyKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iKTsKICAgIMm1ybV0ZXh0KDMpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IxMCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVhZHZhbmNlKDMpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHhfcjEwLl9jb250cm9sLnBsYWNlaG9sZGVyKTsKfSB9CmZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9sYWJlbF85XzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1cHJvamVjdGlvbigwLCAzLCBbIipuZ1N3aXRjaENhc2UiLCAidHJ1ZSJdKTsKfSB9CmZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9sYWJlbF85X3NwYW5fNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAyMyk7CiAgICDJtcm1dGV4dCgxLCAiICoiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMTQgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImxhYmVsIiwgMjAsIDIxKTsKICAgIMm1ybVsaXN0ZW5lcigiY2RrT2JzZXJ2ZUNvbnRlbnQiLCBmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV9UZW1wbGF0ZV9sYWJlbF9jZGtPYnNlcnZlQ29udGVudF8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxNCk7IGNvbnN0IGN0eF9yMTMgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTMudXBkYXRlT3V0bGluZUdhcCgpOyB9KTsKICAgIMm1ybV0ZW1wbGF0ZSgyLCBNYXRGb3JtRmllbGRfbGFiZWxfOV9uZ19jb250YWluZXJfMl9UZW1wbGF0ZSwgNCwgMSwgIm5nLWNvbnRhaW5lciIsIDEyKTsKICAgIMm1ybV0ZW1wbGF0ZSgzLCBNYXRGb3JtRmllbGRfbGFiZWxfOV8zX1RlbXBsYXRlLCAxLCAwLCB1bmRlZmluZWQsIDEyKTsKICAgIMm1ybV0ZW1wbGF0ZSg0LCBNYXRGb3JtRmllbGRfbGFiZWxfOV9zcGFuXzRfVGVtcGxhdGUsIDIsIDAsICJzcGFuIiwgMjIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1lbXB0eSIsIGN0eF9yNC5fY29udHJvbC5lbXB0eSAmJiAhY3R4X3I0Ll9zaG91bGRBbHdheXNGbG9hdCkoIm1hdC1mb3JtLWZpZWxkLWVtcHR5IiwgY3R4X3I0Ll9jb250cm9sLmVtcHR5ICYmICFjdHhfcjQuX3Nob3VsZEFsd2F5c0Zsb2F0KSgibWF0LWFjY2VudCIsIGN0eF9yNC5jb2xvciA9PSAiYWNjZW50IikoIm1hdC13YXJuIiwgY3R4X3I0LmNvbG9yID09ICJ3YXJuIik7CiAgICDJtcm1cHJvcGVydHkoImNka09ic2VydmVDb250ZW50RGlzYWJsZWQiLCBjdHhfcjQuYXBwZWFyYW5jZSAhPSAib3V0bGluZSIpKCJpZCIsIGN0eF9yNC5fbGFiZWxJZCkoIm5nU3dpdGNoIiwgY3R4X3I0Ll9oYXNMYWJlbCgpKTsKICAgIMm1ybVhdHRyaWJ1dGUoImZvciIsIGN0eF9yNC5fY29udHJvbC5pZCkoImFyaWEtb3ducyIsIGN0eF9yNC5fY29udHJvbC5pZCk7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgZmFsc2UpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIHRydWUpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4X3I0LmhpZGVSZXF1aXJlZE1hcmtlciAmJiBjdHhfcjQuX2NvbnRyb2wucmVxdWlyZWQgJiYgIWN0eF9yNC5fY29udHJvbC5kaXNhYmxlZCk7Cn0gfQpmdW5jdGlvbiBNYXRGb3JtRmllbGRfZGl2XzEwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjQpOwogICAgybXJtXByb2plY3Rpb24oMSwgNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IH0KZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX2Rpdl8xMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDI1LCAyNik7CiAgICDJtcm1ZWxlbWVudCgyLCAic3BhbiIsIDI3KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3I2ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1hY2NlbnQiLCBjdHhfcjYuY29sb3IgPT0gImFjY2VudCIpKCJtYXQtd2FybiIsIGN0eF9yNi5jb2xvciA9PSAid2FybiIpOwp9IH0KZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX2Rpdl8xM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgybXJtXByb2plY3Rpb24oMSwgNSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yNyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtXByb3BlcnR5KCJAdHJhbnNpdGlvbk1lc3NhZ2VzIiwgY3R4X3I3Ll9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSk7Cn0gfQpmdW5jdGlvbiBNYXRGb3JtRmllbGRfZGl2XzE0X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMzEpOwogICAgybXJtXRleHQoMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMTYgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1cHJvcGVydHkoImlkIiwgY3R4X3IxNi5faGludExhYmVsSWQpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yMTYuaGludExhYmVsKTsKfSB9CmZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9kaXZfMTRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAyOCk7CiAgICDJtcm1dGVtcGxhdGUoMSwgTWF0Rm9ybUZpZWxkX2Rpdl8xNF9kaXZfMV9UZW1wbGF0ZSwgMiwgMiwgImRpdiIsIDI5KTsKICAgIMm1ybVwcm9qZWN0aW9uKDIsIDYpOwogICAgybXJtWVsZW1lbnQoMywgImRpdiIsIDMwKTsKICAgIMm1ybVwcm9qZWN0aW9uKDQsIDcpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjggPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVwcm9wZXJ0eSgiQHRyYW5zaXRpb25NZXNzYWdlcyIsIGN0eF9yOC5fc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGUpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjguaGludExhYmVsKTsKfSB9CmNvbnN0IF9jNCQxID0gWyIqIiwgW1siIiwgIm1hdFByZWZpeCIsICIiXV0sIFtbIm1hdC1wbGFjZWhvbGRlciJdXSwgW1sibWF0LWxhYmVsIl1dLCBbWyIiLCAibWF0U3VmZml4IiwgIiJdXSwgW1sibWF0LWVycm9yIl1dLCBbWyJtYXQtaGludCIsIDMsICJhbGlnbiIsICJlbmQiXV0sIFtbIm1hdC1oaW50IiwgImFsaWduIiwgImVuZCJdXV07CmNvbnN0IF9jNSQxID0gWyIqIiwgIlttYXRQcmVmaXhdIiwgIm1hdC1wbGFjZWhvbGRlciIsICJtYXQtbGFiZWwiLCAiW21hdFN1ZmZpeF0iLCAibWF0LWVycm9yIiwgIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSIsICJtYXQtaGludFthbGlnbj0nZW5kJ10iXTsKbGV0IG5leHRVbmlxdWVJZCA9IDA7Ci8qKgogKiBTaW5nbGUgZXJyb3IgbWVzc2FnZSB0byBiZSBzaG93biB1bmRlcm5lYXRoIHRoZSBmb3JtIGZpZWxkLgogKi8KY2xhc3MgTWF0RXJyb3IgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5pZCA9IGBtYXQtZXJyb3ItJHtuZXh0VW5pcXVlSWQrK31gOwogICAgfQp9Ck1hdEVycm9yLsm1ZmFjID0gZnVuY3Rpb24gTWF0RXJyb3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RXJyb3IpKCk7IH07Ck1hdEVycm9yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdEVycm9yLCBzZWxlY3RvcnM6IFtbIm1hdC1lcnJvciJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAiYWxlcnQiLCAxLCAibWF0LWVycm9yIl0sIGhvc3RWYXJzOiAxLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdEVycm9yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5pZCk7CiAgICB9IH0sIGlucHV0czogeyBpZDogImlkIiB9IH0pOwpNYXRFcnJvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGlkOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvZm9ybS1maWVsZC1hbmltYXRpb25zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBbmltYXRpb25zIHVzZWQgYnkgdGhlIE1hdEZvcm1GaWVsZC4KICogXEBkb2NzLXByaXZhdGUKICogQHR5cGUgez99CiAqLwpjb25zdCBtYXRGb3JtRmllbGRBbmltYXRpb25zID0gewogICAgLyoqCiAgICAgKiBBbmltYXRpb24gdGhhdCB0cmFuc2l0aW9ucyB0aGUgZm9ybSBmaWVsZCdzIGVycm9yIGFuZCBoaW50IG1lc3NhZ2VzLgogICAgICovCiAgICB0cmFuc2l0aW9uTWVzc2FnZXM6IHRyaWdnZXIoJ3RyYW5zaXRpb25NZXNzYWdlcycsIFsKICAgICAgICAvLyBUT0RPKG1tYWxlcmJhKTogVXNlIGFuZ3VsYXIgYW5pbWF0aW9ucyBmb3IgbGFiZWwgYW5pbWF0aW9uIGFzIHdlbGwuCiAgICAgICAgc3RhdGUoJ2VudGVyJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScgfSkpLAogICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gZW50ZXInLCBbCiAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknIH0pLAogICAgICAgICAgICBhbmltYXRlKCczMDBtcyBjdWJpYy1iZXppZXIoMC41NSwgMCwgMC41NSwgMC4yKScpLAogICAgICAgIF0pLAogICAgXSkKfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtY29udHJvbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gaW50ZXJmYWNlIHdoaWNoIGFsbG93cyBhIGNvbnRyb2wgdG8gd29yayBpbnNpZGUgb2YgYSBgTWF0Rm9ybUZpZWxkYC4KICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBNYXRGb3JtRmllbGRDb250cm9sIHsKfQpNYXRGb3JtRmllbGRDb250cm9sLsm1ZmFjID0gZnVuY3Rpb24gTWF0Rm9ybUZpZWxkQ29udHJvbF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRGb3JtRmllbGRDb250cm9sKSgpOyB9OwpNYXRGb3JtRmllbGRDb250cm9sLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdEZvcm1GaWVsZENvbnRyb2wgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9mb3JtLWZpZWxkLWVycm9ycy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRNYXRGb3JtRmllbGRQbGFjZWhvbGRlckNvbmZsaWN0RXJyb3IoKSB7CiAgICByZXR1cm4gRXJyb3IoJ1BsYWNlaG9sZGVyIGF0dHJpYnV0ZSBhbmQgY2hpbGQgZWxlbWVudCB3ZXJlIGJvdGggc3BlY2lmaWVkLicpOwp9Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcGFyYW0gez99IGFsaWduCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRNYXRGb3JtRmllbGREdXBsaWNhdGVkSGludEVycm9yKGFsaWduKSB7CiAgICByZXR1cm4gRXJyb3IoYEEgaGludCB3YXMgYWxyZWFkeSBkZWNsYXJlZCBmb3IgJ2FsaWduPSIke2FsaWdufSInLmApOwp9Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TWF0Rm9ybUZpZWxkTWlzc2luZ0NvbnRyb2xFcnJvcigpIHsKICAgIHJldHVybiBFcnJvcignbWF0LWZvcm0tZmllbGQgbXVzdCBjb250YWluIGEgTWF0Rm9ybUZpZWxkQ29udHJvbC4nKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvaGludC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmxldCBuZXh0VW5pcXVlSWQkMSA9IDA7Ci8qKgogKiBIaW50IHRleHQgdG8gYmUgc2hvd24gdW5kZXJuZWF0aCB0aGUgZm9ybSBmaWVsZCBjb250cm9sLgogKi8KY2xhc3MgTWF0SGludCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRvIGFsaWduIHRoZSBoaW50IGxhYmVsIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGxpbmUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5hbGlnbiA9ICdzdGFydCc7CiAgICAgICAgLyoqCiAgICAgICAgICogVW5pcXVlIElEIGZvciB0aGUgaGludC4gVXNlZCBmb3IgdGhlIGFyaWEtZGVzY3JpYmVkYnkgb24gdGhlIGZvcm0gZmllbGQgY29udHJvbC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmlkID0gYG1hdC1oaW50LSR7bmV4dFVuaXF1ZUlkJDErK31gOwogICAgfQp9Ck1hdEhpbnQuybVmYWMgPSBmdW5jdGlvbiBNYXRIaW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEhpbnQpKCk7IH07Ck1hdEhpbnQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0SGludCwgc2VsZWN0b3JzOiBbWyJtYXQtaGludCJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1oaW50Il0sIGhvc3RWYXJzOiA0LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdEhpbnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhdHRyaWJ1dGUoImlkIiwgY3R4LmlkKSgiYWxpZ24iLCBudWxsKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtcmlnaHQiLCBjdHguYWxpZ24gPT0gImVuZCIpOwogICAgfSB9LCBpbnB1dHM6IHsgYWxpZ246ICJhbGlnbiIsIGlkOiAiaWQiIH0gfSk7Ck1hdEhpbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBhbGlnbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2xhYmVsLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaGUgZmxvYXRpbmcgbGFiZWwgZm9yIGEgYG1hdC1mb3JtLWZpZWxkYC4KICovCmNsYXNzIE1hdExhYmVsIHsKfQpNYXRMYWJlbC7JtWZhYyA9IGZ1bmN0aW9uIE1hdExhYmVsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdExhYmVsKSgpOyB9OwpNYXRMYWJlbC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRMYWJlbCwgc2VsZWN0b3JzOiBbWyJtYXQtbGFiZWwiXV0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9wbGFjZWhvbGRlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhlIHBsYWNlaG9sZGVyIHRleHQgZm9yIGFuIGBNYXRGb3JtRmllbGRgLgogKiBAZGVwcmVjYXRlZCBVc2UgYDxtYXQtbGFiZWw+YCB0byBzcGVjaWZ5IHRoZSBsYWJlbCBhbmQgdGhlIGBwbGFjZWhvbGRlcmAgYXR0cmlidXRlIHRvIHNwZWNpZnkgdGhlCiAqICAgICBwbGFjZWhvbGRlci4KICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICovCmNsYXNzIE1hdFBsYWNlaG9sZGVyIHsKfQpNYXRQbGFjZWhvbGRlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFBsYWNlaG9sZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFBsYWNlaG9sZGVyKSgpOyB9OwpNYXRQbGFjZWhvbGRlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRQbGFjZWhvbGRlciwgc2VsZWN0b3JzOiBbWyJtYXQtcGxhY2Vob2xkZXIiXV0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9wcmVmaXgudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFByZWZpeCB0byBiZSBwbGFjZWQgaW4gZnJvbnQgb2YgdGhlIGZvcm0gZmllbGQuCiAqLwpjbGFzcyBNYXRQcmVmaXggewp9Ck1hdFByZWZpeC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFByZWZpeF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRQcmVmaXgpKCk7IH07Ck1hdFByZWZpeC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRQcmVmaXgsIHNlbGVjdG9yczogW1siIiwgIm1hdFByZWZpeCIsICIiXV0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9zdWZmaXgudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFN1ZmZpeCB0byBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgZm9ybSBmaWVsZC4KICovCmNsYXNzIE1hdFN1ZmZpeCB7Cn0KTWF0U3VmZml4Lsm1ZmFjID0gZnVuY3Rpb24gTWF0U3VmZml4X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFN1ZmZpeCkoKTsgfTsKTWF0U3VmZml4Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFN1ZmZpeCwgc2VsZWN0b3JzOiBbWyIiLCAibWF0U3VmZml4IiwgIiJdXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgbmV4dFVuaXF1ZUlkJDIgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IGZsb2F0aW5nTGFiZWxTY2FsZSA9IDAuNzU7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3Qgb3V0bGluZUdhcFBhZGRpbmcgPSA1OwovKioKICogQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRGb3JtRmllbGQuCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBNYXRGb3JtRmllbGRCYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgIH0KfQovKioKICogQmFzZSBjbGFzcyB0byB3aGljaCB3ZSdyZSBhcHBseWluZyB0aGUgZm9ybSBmaWVsZCBtaXhpbnMuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgX01hdEZvcm1GaWVsZE1peGluQmFzZSA9IG1peGluQ29sb3IoTWF0Rm9ybUZpZWxkQmFzZSwgJ3ByaW1hcnknKTsKLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUKICogZGVmYXVsdCBvcHRpb25zIGZvciBhbGwgZm9ybSBmaWVsZCB3aXRoaW4gYW4gYXBwLgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TJyk7Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYW4gaW5zdGFuY2VzIG9mIGBNYXRGb3JtRmllbGRgLiBJdCBzZXJ2ZXMKICogYXMgYWx0ZXJuYXRpdmUgdG9rZW4gdG8gdGhlIGFjdHVhbCBgTWF0Rm9ybUZpZWxkYCBjbGFzcyB3aGljaCB3b3VsZCBjYXVzZSB1bm5lY2Vzc2FyeQogKiByZXRlbnRpb24gb2YgdGhlIGBNYXRGb3JtRmllbGRgIGNsYXNzIGFuZCBpdHMgY29tcG9uZW50IG1ldGFkYXRhLgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BVF9GT1JNX0ZJRUxEID0gbmV3IEluamVjdGlvblRva2VuKCdNYXRGb3JtRmllbGQnKTsKLyoqCiAqIENvbnRhaW5lciBmb3IgZm9ybSBjb250cm9scyB0aGF0IGFwcGxpZXMgTWF0ZXJpYWwgRGVzaWduIHN0eWxpbmcgYW5kIGJlaGF2aW9yLgogKi8KY2xhc3MgTWF0Rm9ybUZpZWxkIGV4dGVuZHMgX01hdEZvcm1GaWVsZE1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgKiBAcGFyYW0gez99IGxhYmVsT3B0aW9ucwogICAgICogQHBhcmFtIHs/fSBfZGlyCiAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0cwogICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSBfYW5pbWF0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX2NoYW5nZURldGVjdG9yUmVmLCBsYWJlbE9wdGlvbnMsIF9kaXIsIF9kZWZhdWx0cywgX3BsYXRmb3JtLCBfbmdab25lLCBfYW5pbWF0aW9uTW9kZSkgewogICAgICAgIHN1cGVyKF9lbGVtZW50UmVmKTsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IF9kZWZhdWx0czsKICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG91dGxpbmUgZ2FwIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQKICAgICAgICAgKiBpbW1lZGlhdGVseSBvbiB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseSA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG91dGxpbmUgZ2FwIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgbmV4dCB0aW1lIHRoZSB6b25lIGhhcyBzdGFiaWxpemVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZSBmb3IgdGhlIGxvZ2ljIHRoYXQgZGlzYWJsZXMgdGhlIGxhYmVsIGFuaW1hdGlvbiBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3Nob3dBbHdheXNBbmltYXRlID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogU3RhdGUgb2YgdGhlIG1hdC1oaW50IGFuZCBtYXQtZXJyb3IgYW5pbWF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSA9ICcnOwogICAgICAgIHRoaXMuX2hpbnRMYWJlbCA9ICcnOwogICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhlIGhpbnQgbGFiZWwuCiAgICAgICAgdGhpcy5faGludExhYmVsSWQgPSBgbWF0LWhpbnQtJHtuZXh0VW5pcXVlSWQkMisrfWA7CiAgICAgICAgLy8gVW5pcXVlIGlkIGZvciB0aGUgaW50ZXJuYWwgZm9ybSBmaWVsZCBsYWJlbC4KICAgICAgICB0aGlzLl9sYWJlbElkID0gYG1hdC1mb3JtLWZpZWxkLWxhYmVsLSR7bmV4dFVuaXF1ZUlkJDIrK31gOwogICAgICAgIHRoaXMuX2xhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyA/IGxhYmVsT3B0aW9ucyA6IHt9OwogICAgICAgIHRoaXMuZmxvYXRMYWJlbCA9IHRoaXMuX2dldERlZmF1bHRGbG9hdExhYmVsU3RhdGUoKTsKICAgICAgICB0aGlzLl9hbmltYXRpb25zRW5hYmxlZCA9IF9hbmltYXRpb25Nb2RlICE9PSAnTm9vcEFuaW1hdGlvbnMnOwogICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCB0aHJvdWdoIGhlcmUgc28gd2UgaW52b2tlIHRoZSBzZXR0ZXIgb24gdGhlIGZpcnN0IHJ1bi4KICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSAoX2RlZmF1bHRzICYmIF9kZWZhdWx0cy5hcHBlYXJhbmNlKSA/IF9kZWZhdWx0cy5hcHBlYXJhbmNlIDogJ2xlZ2FjeSc7CiAgICAgICAgdGhpcy5faGlkZVJlcXVpcmVkTWFya2VyID0gKF9kZWZhdWx0cyAmJiBfZGVmYXVsdHMuaGlkZVJlcXVpcmVkTWFya2VyICE9IG51bGwpID8KICAgICAgICAgICAgX2RlZmF1bHRzLmhpZGVSZXF1aXJlZE1hcmtlciA6IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgZm9ybS1maWVsZCBhcHBlYXJhbmNlIHN0eWxlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFwcGVhcmFuY2UoKSB7IHJldHVybiB0aGlzLl9hcHBlYXJhbmNlOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBhcHBlYXJhbmNlKHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fYXBwZWFyYW5jZTsKICAgICAgICB0aGlzLl9hcHBlYXJhbmNlID0gdmFsdWUgfHwgKHRoaXMuX2RlZmF1bHRzICYmIHRoaXMuX2RlZmF1bHRzLmFwcGVhcmFuY2UpIHx8ICdsZWdhY3knOwogICAgICAgIGlmICh0aGlzLl9hcHBlYXJhbmNlID09PSAnb3V0bGluZScgJiYgb2xkVmFsdWUgIT09IHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHJlcXVpcmVkIG1hcmtlciBzaG91bGQgYmUgaGlkZGVuLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGhpZGVSZXF1aXJlZE1hcmtlcigpIHsgcmV0dXJuIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcjsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgaGlkZVJlcXVpcmVkTWFya2VyKHZhbHVlKSB7CiAgICAgICAgdGhpcy5faGlkZVJlcXVpcmVkTWFya2VyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgZmxvYXRpbmcgbGFiZWwgc2hvdWxkIGFsd2F5cyBmbG9hdCBvciBub3QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgX3Nob3VsZEFsd2F5c0Zsb2F0KCkgewogICAgICAgIHJldHVybiB0aGlzLmZsb2F0TGFiZWwgPT09ICdhbHdheXMnICYmICF0aGlzLl9zaG93QWx3YXlzQW5pbWF0ZTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgbGFiZWwgY2FuIGZsb2F0IG9yIG5vdC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBfY2FuTGFiZWxGbG9hdCgpIHsgcmV0dXJuIHRoaXMuZmxvYXRMYWJlbCAhPT0gJ25ldmVyJzsgfQogICAgLyoqCiAgICAgKiBUZXh0IGZvciB0aGUgZm9ybSBmaWVsZCBoaW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGhpbnRMYWJlbCgpIHsgcmV0dXJuIHRoaXMuX2hpbnRMYWJlbDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgaGludExhYmVsKHZhbHVlKSB7CiAgICAgICAgdGhpcy5faGludExhYmVsID0gdmFsdWU7CiAgICAgICAgdGhpcy5fcHJvY2Vzc0hpbnRzKCk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBhbHdheXMgZmxvYXQsIG5ldmVyIGZsb2F0IG9yIGZsb2F0IGFzIHRoZSB1c2VyIHR5cGVzLgogICAgICoKICAgICAqIE5vdGU6IG9ubHkgdGhlIGxlZ2FjeSBhcHBlYXJhbmNlIHN1cHBvcnRzIHRoZSBgbmV2ZXJgIG9wdGlvbi4gYG5ldmVyYCB3YXMgb3JpZ2luYWxseSBhZGRlZCBhcyBhCiAgICAgKiB3YXkgdG8gbWFrZSB0aGUgZmxvYXRpbmcgbGFiZWwgZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgYSBzdGFuZGFyZCBpbnB1dCBwbGFjZWhvbGRlci4gSG93ZXZlcgogICAgICogdGhlIGZvcm0gZmllbGQgbm93IHN1cHBvcnRzIGJvdGggZmxvYXRpbmcgbGFiZWxzIGFuZCBwbGFjZWhvbGRlcnMuIFRoZXJlZm9yZSBpbiB0aGUgbm9uLWxlZ2FjeQogICAgICogYXBwZWFyYW5jZXMgdGhlIGBuZXZlcmAgb3B0aW9uIGhhcyBiZWVuIGRpc2FibGVkIGluIGZhdm9yIG9mIGp1c3QgdXNpbmcgdGhlIHBsYWNlaG9sZGVyLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGZsb2F0TGFiZWwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZWFyYW5jZSAhPT0gJ2xlZ2FjeScgJiYgdGhpcy5fZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyA/ICdhdXRvJyA6IHRoaXMuX2Zsb2F0TGFiZWw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBmbG9hdExhYmVsKHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9mbG9hdExhYmVsKSB7CiAgICAgICAgICAgIHRoaXMuX2Zsb2F0TGFiZWwgPSB2YWx1ZSB8fCB0aGlzLl9nZXREZWZhdWx0RmxvYXRMYWJlbFN0YXRlKCk7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IF9jb250cm9sKCkgewogICAgICAgIC8vIFRPRE8oY3Jpc2JldG8pOiB3ZSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLgogICAgICAgIC8vICBXZSBzaG91bGQgY2xlYW4gdGhpcyB1cCBvbmNlIEl2eSBpcyB0aGUgZGVmYXVsdCByZW5kZXJlci4KICAgICAgICByZXR1cm4gdGhpcy5fZXhwbGljaXRGb3JtRmllbGRDb250cm9sIHx8IHRoaXMuX2NvbnRyb2xOb25TdGF0aWMgfHwgdGhpcy5fY29udHJvbFN0YXRpYzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IF9jb250cm9sKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fZXhwbGljaXRGb3JtRmllbGRDb250cm9sID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBfbGFiZWxDaGlsZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWxDaGlsZE5vblN0YXRpYyB8fCB0aGlzLl9sYWJlbENoaWxkU3RhdGljOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIGFuIEVsZW1lbnRSZWYgZm9yIHRoZSBlbGVtZW50IHRoYXQgYSBvdmVybGF5IGF0dGFjaGVkIHRvIHRoZSBmb3JtLWZpZWxkIHNob3VsZCBiZQogICAgICogcG9zaXRpb25lZCByZWxhdGl2ZSB0by4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldENvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25Db250YWluZXJSZWYgfHwgdGhpcy5fZWxlbWVudFJlZjsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlckNvbnRlbnRJbml0KCkgewogICAgICAgIHRoaXMuX3ZhbGlkYXRlQ29udHJvbENoaWxkKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLl9jb250cm9sOwogICAgICAgIGlmIChjb250cm9sLmNvbnRyb2xUeXBlKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBtYXQtZm9ybS1maWVsZC10eXBlLSR7Y29udHJvbC5jb250cm9sVHlwZX1gKTsKICAgICAgICB9CiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gdGhlIGNoaWxkIGNvbnRyb2wgc3RhdGUgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBmb3JtIGZpZWxkIFVJLgogICAgICAgIGNvbnRyb2wuc3RhdGVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVBsYWNlaG9sZGVycygpOwogICAgICAgICAgICB0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfSkpOwogICAgICAgIC8vIFJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGlmIHRoZSB2YWx1ZSBjaGFuZ2VzLgogICAgICAgIGlmIChjb250cm9sLm5nQ29udHJvbCAmJiBjb250cm9sLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMpIHsKICAgICAgICAgICAgY29udHJvbC5uZ0NvbnRyb2wudmFsdWVDaGFuZ2VzCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpKTsKICAgICAgICB9CiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gcnVuIG91dHNpZGUgb2YgdGhlIGBOZ1pvbmVgIGV4cGxpY2l0bHksCiAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgdGhyb3dpbmcgdXNlcnMgaW50byBhbiBpbmZpbml0ZSBsb29wCiAgICAgICAgLy8gaWYgYHpvbmUtcGF0Y2gtcnhqc2AgaXMgaW5jbHVkZWQuCiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fbmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkT25TdGFibGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU91dGxpbmVHYXAoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgICAgICAvLyBSdW4gY2hhbmdlIGRldGVjdGlvbiBhbmQgdXBkYXRlIHRoZSBvdXRsaW5lIGlmIHRoZSBzdWZmaXggb3IgcHJlZml4IGNoYW5nZXMuCiAgICAgICAgbWVyZ2UodGhpcy5fcHJlZml4Q2hpbGRyZW4uY2hhbmdlcywgdGhpcy5fc3VmZml4Q2hpbGRyZW4uY2hhbmdlcykuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkT25TdGFibGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gUmUtdmFsaWRhdGUgd2hlbiB0aGUgbnVtYmVyIG9mIGhpbnRzIGNoYW5nZXMuCiAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NIaW50cygpOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gVXBkYXRlIHRoZSBhcmlhLWRlc2NyaWJlZCBieSB3aGVuIHRoZSBudW1iZXIgb2YgZXJyb3JzIGNoYW5nZXMuCiAgICAgICAgdGhpcy5fZXJyb3JDaGlsZHJlbi5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLl9kaXIpIHsKICAgICAgICAgICAgdGhpcy5fZGlyLmNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy51cGRhdGVPdXRsaW5lR2FwKCkpKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU91dGxpbmVHYXAoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkgewogICAgICAgIHRoaXMuX3ZhbGlkYXRlQ29udHJvbENoaWxkKCk7CiAgICAgICAgaWYgKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5KSB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT3V0bGluZUdhcCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgIC8vIEF2b2lkIGFuaW1hdGlvbnMgb24gbG9hZC4KICAgICAgICB0aGlzLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSA9ICdlbnRlcic7CiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjbGFzcyBmcm9tIHRoZSBOZ0NvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0aGUgaG9zdCBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2hvdWxkRm9yd2FyZChwcm9wKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLm5nQ29udHJvbCA6IG51bGw7CiAgICAgICAgcmV0dXJuIG5nQ29udHJvbCAmJiBuZ0NvbnRyb2xbcHJvcF07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYXNQbGFjZWhvbGRlcigpIHsKICAgICAgICByZXR1cm4gISEodGhpcy5fY29udHJvbCAmJiB0aGlzLl9jb250cm9sLnBsYWNlaG9sZGVyIHx8IHRoaXMuX3BsYWNlaG9sZGVyQ2hpbGQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFzTGFiZWwoKSB7CiAgICAgICAgcmV0dXJuICEhdGhpcy5fbGFiZWxDaGlsZDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Nob3VsZExhYmVsRmxvYXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkxhYmVsRmxvYXQgJiYgKHRoaXMuX2NvbnRyb2wuc2hvdWxkTGFiZWxGbG9hdCB8fCB0aGlzLl9zaG91bGRBbHdheXNGbG9hdCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oaWRlQ29udHJvbFBsYWNlaG9sZGVyKCkgewogICAgICAgIC8vIEluIHRoZSBsZWdhY3kgYXBwZWFyYW5jZSB0aGUgcGxhY2Vob2xkZXIgaXMgcHJvbW90ZWQgdG8gYSBsYWJlbCBpZiBubyBsYWJlbCBpcyBnaXZlbi4KICAgICAgICByZXR1cm4gdGhpcy5hcHBlYXJhbmNlID09PSAnbGVnYWN5JyAmJiAhdGhpcy5faGFzTGFiZWwoKSB8fAogICAgICAgICAgICB0aGlzLl9oYXNMYWJlbCgpICYmICF0aGlzLl9zaG91bGRMYWJlbEZsb2F0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYXNGbG9hdGluZ0xhYmVsKCkgewogICAgICAgIC8vIEluIHRoZSBsZWdhY3kgYXBwZWFyYW5jZSB0aGUgcGxhY2Vob2xkZXIgaXMgcHJvbW90ZWQgdG8gYSBsYWJlbCBpZiBubyBsYWJlbCBpcyBnaXZlbi4KICAgICAgICByZXR1cm4gdGhpcy5faGFzTGFiZWwoKSB8fCB0aGlzLmFwcGVhcmFuY2UgPT09ICdsZWdhY3knICYmIHRoaXMuX2hhc1BsYWNlaG9sZGVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IGhpbnRzIG9yIGVycm9ycy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXREaXNwbGF5ZWRNZXNzYWdlcygpIHsKICAgICAgICByZXR1cm4gKHRoaXMuX2Vycm9yQ2hpbGRyZW4gJiYgdGhpcy5fZXJyb3JDaGlsZHJlbi5sZW5ndGggPiAwICYmCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wuZXJyb3JTdGF0ZSkgPyAnZXJyb3InIDogJ2hpbnQnOwogICAgfQogICAgLyoqCiAgICAgKiBBbmltYXRlcyB0aGUgcGxhY2Vob2xkZXIgdXAgYW5kIGxvY2tzIGl0IGluIHBvc2l0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FuaW1hdGVBbmRMb2NrTGFiZWwoKSB7CiAgICAgICAgaWYgKHRoaXMuX2hhc0Zsb2F0aW5nTGFiZWwoKSAmJiB0aGlzLl9jYW5MYWJlbEZsb2F0KSB7CiAgICAgICAgICAgIC8vIElmIGFuaW1hdGlvbnMgYXJlIGRpc2FibGVkLCB3ZSBzaG91bGRuJ3QgZ28gaW4gaGVyZSwKICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgYHRyYW5zaXRpb25lbmRgIHdpbGwgbmV2ZXIgZmlyZS4KICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvbnNFbmFibGVkICYmIHRoaXMuX2xhYmVsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zaG93QWx3YXlzQW5pbWF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICBmcm9tRXZlbnQodGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Fsd2F5c0FuaW1hdGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYWx3YXlzJzsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBwbGFjZWhvbGRlciAoZWl0aGVyIGBwbGFjZWhvbGRlcmAgYXR0cmlidXRlIG9uIHRoZSBjaGlsZCBjb250cm9sCiAgICAgKiBvciBjaGlsZCBlbGVtZW50IHdpdGggdGhlIGBtYXQtcGxhY2Vob2xkZXJgIGRpcmVjdGl2ZSkuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3ZhbGlkYXRlUGxhY2Vob2xkZXJzKCkgewogICAgICAgIGlmICh0aGlzLl9jb250cm9sLnBsYWNlaG9sZGVyICYmIHRoaXMuX3BsYWNlaG9sZGVyQ2hpbGQpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkUGxhY2Vob2xkZXJDb25mbGljdEVycm9yKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEb2VzIGFueSBleHRyYSBwcm9jZXNzaW5nIHRoYXQgaXMgcmVxdWlyZWQgd2hlbiBoYW5kbGluZyB0aGUgaGludHMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Byb2Nlc3NIaW50cygpIHsKICAgICAgICB0aGlzLl92YWxpZGF0ZUhpbnRzKCk7CiAgICAgICAgdGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCk7CiAgICB9CiAgICAvKioKICAgICAqIEVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBvZiBvbmUgb2YgZWFjaCBgPG1hdC1oaW50PmAgYWxpZ25tZW50IHNwZWNpZmllZCwgd2l0aCB0aGUKICAgICAqIGF0dHJpYnV0ZSBiZWluZyBjb25zaWRlcmVkIGFzIGBhbGlnbj0ic3RhcnQiYC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdmFsaWRhdGVIaW50cygpIHsKICAgICAgICBpZiAodGhpcy5faGludENoaWxkcmVuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0YXJ0SGludDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZW5kSGludDsKICAgICAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGhpbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChoaW50KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaGludC5hbGlnbiA9PT0gJ3N0YXJ0JykgewogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEhpbnQgfHwgdGhpcy5oaW50TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkRHVwbGljYXRlZEhpbnRFcnJvcignc3RhcnQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnRIaW50ID0gaGludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhpbnQuYWxpZ24gPT09ICdlbmQnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEhpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkRHVwbGljYXRlZEhpbnRFcnJvcignZW5kJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuZEhpbnQgPSBoaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGZsb2F0IGxhYmVsIHN0YXRlLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXREZWZhdWx0RmxvYXRMYWJlbFN0YXRlKCkgewogICAgICAgIHJldHVybiAodGhpcy5fZGVmYXVsdHMgJiYgdGhpcy5fZGVmYXVsdHMuZmxvYXRMYWJlbCkgfHwgdGhpcy5fbGFiZWxPcHRpb25zLmZsb2F0IHx8ICdhdXRvJzsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbGlzdCBvZiBlbGVtZW50IElEcyB0aGF0IGRlc2NyaWJlIHRoZSBjaGlsZCBjb250cm9sLiBUaGlzIGFsbG93cyB0aGUgY29udHJvbCB0byB1cGRhdGUKICAgICAqIGl0cyBgYXJpYS1kZXNjcmliZWRieWAgYXR0cmlidXRlIGFjY29yZGluZ2x5LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zeW5jRGVzY3JpYmVkQnlJZHMoKSB7CiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaWRzID0gW107CiAgICAgICAgICAgIGlmICh0aGlzLl9nZXREaXNwbGF5ZWRNZXNzYWdlcygpID09PSAnaGludCcpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SGludCA9IHRoaXMuX2hpbnRDaGlsZHJlbiA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmZpbmQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaGludAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaGludCA9PiBoaW50LmFsaWduID09PSAnc3RhcnQnKSkgOiBudWxsOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kSGludCA9IHRoaXMuX2hpbnRDaGlsZHJlbiA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmZpbmQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaGludAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaGludCA9PiBoaW50LmFsaWduID09PSAnZW5kJykpIDogbnVsbDsKICAgICAgICAgICAgICAgIGlmIChzdGFydEhpbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChzdGFydEhpbnQuaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5faGludExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2godGhpcy5faGludExhYmVsSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVuZEhpbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChlbmRIaW50LmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9lcnJvckNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBpZHMgPSB0aGlzLl9lcnJvckNoaWxkcmVuLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlcnJvciA9PiBlcnJvci5pZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wuc2V0RGVzY3JpYmVkQnlJZHMoaWRzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgZm9ybSBmaWVsZCdzIGNvbnRyb2wgaXMgbWlzc2luZy4KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF92YWxpZGF0ZUNvbnRyb2xDaGlsZCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkTWlzc2luZ0NvbnRyb2xFcnJvcigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uIG9mIHRoZSBnYXAgaW4gdGhlIG91dGxpbmUuIE9ubHkgcmVsZXZhbnQgZm9yIHRoZSBvdXRsaW5lCiAgICAgKiBhcHBlYXJhbmNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdXBkYXRlT3V0bGluZUdhcCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGFiZWxFbCA9IHRoaXMuX2xhYmVsID8gdGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudCA6IG51bGw7CiAgICAgICAgaWYgKHRoaXMuYXBwZWFyYW5jZSAhPT0gJ291dGxpbmUnIHx8ICFsYWJlbEVsIHx8ICFsYWJlbEVsLmNoaWxkcmVuLmxlbmd0aCB8fAogICAgICAgICAgICAhbGFiZWxFbC50ZXh0Q29udGVudC50cmltKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXNuJ3QgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgaW4gdGhlIERPTSwgdGhlIG91dGxpbmUgZ2FwIHdpbGwgbmVlZCB0byBiZSBjYWxjdWxhdGVkCiAgICAgICAgLy8gdGhlIG5leHQgdGltZSBpdCBpcyBjaGVja2VkIGFuZCBpbiB0aGUgRE9NLgogICAgICAgIGlmICghdGhpcy5faXNBdHRhY2hlZFRvRE9NKCkpIHsKICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHkgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3RhcnRXaWR0aCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBnYXBXaWR0aCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2Nvbm5lY3Rpb25Db250YWluZXJSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhcnRFbHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZ2FwRWxzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcCcpOwogICAgICAgIGlmICh0aGlzLl9sYWJlbCAmJiB0aGlzLl9sYWJlbC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIC8vIElmIHRoZSBjb250YWluZXIncyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSB6ZXJvLCBpdCBtZWFucyB0aGF0IHRoZSBlbGVtZW50IGlzCiAgICAgICAgICAgIC8vIGludmlzaWJsZSBhbmQgd2UgY2FuJ3QgY2FsY3VsYXRlIHRoZSBvdXRsaW5lIGdhcC4gTWFyayB0aGUgZWxlbWVudCBhcyBuZWVkaW5nCiAgICAgICAgICAgIC8vIHRvIGJlIGNoZWNrZWQgdGhlIG5leHQgdGltZSB0aGUgem9uZSBzdGFiaWxpemVzLiBXZSBjYW4ndCBkbyB0aGlzIGltbWVkaWF0ZWx5CiAgICAgICAgICAgIC8vIG9uIHRoZSBuZXh0IGNoYW5nZSBkZXRlY3Rpb24sIGJlY2F1c2UgZXZlbiBpZiB0aGUgZWxlbWVudCBiZWNvbWVzIHZpc2libGUsCiAgICAgICAgICAgIC8vIHRoZSBgQ2xpZW50UmVjdGAgd29uJ3QgYmUgcmVjbGFjdWxhdGVkIGltbWVkaWF0ZWx5LiBXZSByZXNldCB0aGUKICAgICAgICAgICAgLy8gYF9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseWAgZmxhZyBzb21lIHdlIGRvbid0IHJ1biB0aGUgY2hlY2tzIHR3aWNlLgogICAgICAgICAgICBpZiAoY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMCAmJiBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkT25TdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclN0YXJ0ID0gdGhpcy5fZ2V0U3RhcnRFbmQoY29udGFpbmVyUmVjdCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGFiZWxTdGFydCA9IHRoaXMuX2dldFN0YXJ0RW5kKGxhYmVsRWwuY2hpbGRyZW5bMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBsYWJlbFdpZHRoID0gMDsKICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBsYWJlbEVsLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBsYWJlbFdpZHRoICs9IGNoaWxkLm9mZnNldFdpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBNYXRoLmFicyhsYWJlbFN0YXJ0IC0gY29udGFpbmVyU3RhcnQpIC0gb3V0bGluZUdhcFBhZGRpbmc7CiAgICAgICAgICAgIGdhcFdpZHRoID0gbGFiZWxXaWR0aCA+IDAgPyBsYWJlbFdpZHRoICogZmxvYXRpbmdMYWJlbFNjYWxlICsgb3V0bGluZUdhcFBhZGRpbmcgKiAyIDogMDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydEVscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBzdGFydEVsc1tpXS5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGh9cHhgOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhcEVscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBnYXBFbHNbaV0uc3R5bGUud2lkdGggPSBgJHtnYXBXaWR0aH1weGA7CiAgICAgICAgfQogICAgICAgIHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlID0KICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHkgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgc3RhcnQgZW5kIG9mIHRoZSByZWN0IGNvbnNpZGVyaW5nIHRoZSBjdXJyZW50IGRpcmVjdGlvbmFsaXR5LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmVjdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldFN0YXJ0RW5kKHJlY3QpIHsKICAgICAgICByZXR1cm4gKHRoaXMuX2RpciAmJiB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnKSA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQ7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmb3JtIGZpZWxkIGlzIGF0dGFjaGVkIHRvIHRoZSBET00uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2lzQXR0YWNoZWRUb0RPTSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICBpZiAoZWxlbWVudC5nZXRSb290Tm9kZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gZWxlbWVudC5nZXRSb290Tm9kZSgpOwogICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBpbnNpZGUgdGhlIERPTSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgZWl0aGVyIHRoZSBkb2N1bWVudAogICAgICAgICAgICAvLyBvciB0aGUgY2xvc2VzdCBzaGFkb3cgcm9vdCwgb3RoZXJ3aXNlIGl0J2xsIGJlIHRoZSBlbGVtZW50IGl0c2VsZi4KICAgICAgICAgICAgcmV0dXJuIHJvb3ROb2RlICYmIHJvb3ROb2RlICE9PSBlbGVtZW50OwogICAgICAgIH0KICAgICAgICAvLyBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIGNoZWNraW5nIGlmIGl0J3MgaW4gdGhlIGRvY3VtZW50LiBUaGlzIGRvZXNuJ3QgYWNjb3VudCBmb3IKICAgICAgICAvLyBzaGFkb3cgRE9NLCBob3dldmVyIGJyb3dzZXIgdGhhdCBzdXBwb3J0IHNoYWRvdyBET00gc2hvdWxkIHN1cHBvcnQgYGdldFJvb3ROb2RlYCBhcyB3ZWxsLgogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuY29udGFpbnMoZWxlbWVudCk7CiAgICB9Cn0KTWF0Rm9ybUZpZWxkLsm1ZmFjID0gZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEZvcm1GaWVsZCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0xBQkVMX0dMT0JBTF9PUFRJT05TLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKTWF0Rm9ybUZpZWxkLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEZvcm1GaWVsZCwgc2VsZWN0b3JzOiBbWyJtYXQtZm9ybS1maWVsZCJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9Db250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJJbmRleCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0Rm9ybUZpZWxkQ29udHJvbCwgdHJ1ZSk7CiAgICAgICAgybXJtXN0YXRpY0NvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0Rm9ybUZpZWxkQ29udHJvbCwgdHJ1ZSk7CiAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0TGFiZWwsIHRydWUpOwogICAgICAgIMm1ybVzdGF0aWNDb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdExhYmVsLCB0cnVlKTsKICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRQbGFjZWhvbGRlciwgdHJ1ZSk7CiAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0RXJyb3IsIHRydWUpOwogICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdEhpbnQsIHRydWUpOwogICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdFByZWZpeCwgdHJ1ZSk7CiAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0U3VmZml4LCB0cnVlKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIHZhciBfdDsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9jb250cm9sTm9uU3RhdGljID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2NvbnRyb2xTdGF0aWMgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fbGFiZWxDaGlsZE5vblN0YXRpYyA9IF90LmZpcnN0KTsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9sYWJlbENoaWxkU3RhdGljID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3BsYWNlaG9sZGVyQ2hpbGQgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fZXJyb3JDaGlsZHJlbiA9IF90KTsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9oaW50Q2hpbGRyZW4gPSBfdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcHJlZml4Q2hpbGRyZW4gPSBfdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fc3VmZml4Q2hpbGRyZW4gPSBfdCk7CiAgICB9IH0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybV2aWV3UXVlcnkoX2MwJDQsIHRydWUpOwogICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MxJDQsIHRydWUpOwogICAgICAgIMm1ybV2aWV3UXVlcnkoX2MyJDIsIHRydWUpOwogICAgICAgIMm1ybV2aWV3UXVlcnkoX2MzJDEsIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgudW5kZXJsaW5lUmVmID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2Nvbm5lY3Rpb25Db250YWluZXJSZWYgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW5wdXRDb250YWluZXJSZWYgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fbGFiZWwgPSBfdC5maXJzdCk7CiAgICB9IH0sIGhvc3RBdHRyczogWzEsICJtYXQtZm9ybS1maWVsZCJdLCBob3N0VmFyczogNDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIiwgY3R4LmFwcGVhcmFuY2UgPT0gInN0YW5kYXJkIikoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsIGN0eC5hcHBlYXJhbmNlID09ICJmaWxsIikoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsIGN0eC5hcHBlYXJhbmNlID09ICJvdXRsaW5lIikoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IiwgY3R4LmFwcGVhcmFuY2UgPT0gImxlZ2FjeSIpKCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIiwgY3R4Ll9jb250cm9sLmVycm9yU3RhdGUpKCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLCBjdHguX2NhbkxhYmVsRmxvYXQpKCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLCBjdHguX3Nob3VsZExhYmVsRmxvYXQoKSkoIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsIGN0eC5faGFzRmxvYXRpbmdMYWJlbCgpKSgibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsIGN0eC5faGlkZUNvbnRyb2xQbGFjZWhvbGRlcigpKSgibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLCBjdHguX2NvbnRyb2wuZGlzYWJsZWQpKCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIiwgY3R4Ll9jb250cm9sLmF1dG9maWxsZWQpKCJtYXQtZm9jdXNlZCIsIGN0eC5fY29udHJvbC5mb2N1c2VkKSgibWF0LWFjY2VudCIsIGN0eC5jb2xvciA9PSAiYWNjZW50IikoIm1hdC13YXJuIiwgY3R4LmNvbG9yID09ICJ3YXJuIikoIm5nLXVudG91Y2hlZCIsIGN0eC5fc2hvdWxkRm9yd2FyZCgidW50b3VjaGVkIikpKCJuZy10b3VjaGVkIiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJ0b3VjaGVkIikpKCJuZy1wcmlzdGluZSIsIGN0eC5fc2hvdWxkRm9yd2FyZCgicHJpc3RpbmUiKSkoIm5nLWRpcnR5IiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJkaXJ0eSIpKSgibmctdmFsaWQiLCBjdHguX3Nob3VsZEZvcndhcmQoInZhbGlkIikpKCJuZy1pbnZhbGlkIiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJpbnZhbGlkIikpKCJuZy1wZW5kaW5nIiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJwZW5kaW5nIikpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsICFjdHguX2FuaW1hdGlvbnNFbmFibGVkKTsKICAgIH0gfSwgaW5wdXRzOiB7IGNvbG9yOiAiY29sb3IiLCBmbG9hdExhYmVsOiAiZmxvYXRMYWJlbCIsIGFwcGVhcmFuY2U6ICJhcHBlYXJhbmNlIiwgaGlkZVJlcXVpcmVkTWFya2VyOiAiaGlkZVJlcXVpcmVkTWFya2VyIiwgaGludExhYmVsOiAiaGludExhYmVsIiB9LCBleHBvcnRBczogWyJtYXRGb3JtRmllbGQiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbCiAgICAgICAgICAgIHsgcHJvdmlkZTogTUFUX0ZPUk1fRklFTEQsIHVzZUV4aXN0aW5nOiBNYXRGb3JtRmllbGQgfSwKICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2M1JDEsIGRlY2xzOiAxNSwgdmFyczogOCwgY29uc3RzOiBbWzEsICJtYXQtZm9ybS1maWVsZC13cmFwcGVyIl0sIFsxLCAibWF0LWZvcm0tZmllbGQtZmxleCIsIDMsICJjbGljayJdLCBbImNvbm5lY3Rpb25Db250YWluZXIiLCAiIl0sIFs0LCAibmdJZiJdLCBbImNsYXNzIiwgIm1hdC1mb3JtLWZpZWxkLXByZWZpeCIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LWZvcm0tZmllbGQtaW5maXgiXSwgWyJpbnB1dENvbnRhaW5lciIsICIiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIl0sIFsiY2xhc3MiLCAibWF0LWZvcm0tZmllbGQtbGFiZWwiLCAzLCAiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsICJpZCIsICJtYXQtZW1wdHkiLCAibWF0LWZvcm0tZmllbGQtZW1wdHkiLCAibWF0LWFjY2VudCIsICJtYXQtd2FybiIsICJuZ1N3aXRjaCIsICJjZGtPYnNlcnZlQ29udGVudCIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAibWF0LWZvcm0tZmllbGQtc3VmZml4IiwgNCwgIm5nSWYiXSwgWyJjbGFzcyIsICJtYXQtZm9ybS1maWVsZC11bmRlcmxpbmUiLCA0LCAibmdJZiJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIiwgMywgIm5nU3dpdGNoIl0sIFs0LCAibmdTd2l0Y2hDYXNlIl0sIFsiY2xhc3MiLCAibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyIiwgNCwgIm5nU3dpdGNoQ2FzZSJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Il0sIFsxLCAibWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUiLCAibWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXByZWZpeCJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLWxhYmVsIiwgMywgImNka09ic2VydmVDb250ZW50RGlzYWJsZWQiLCAiaWQiLCAibmdTd2l0Y2giLCAiY2RrT2JzZXJ2ZUNvbnRlbnQiXSwgWyJsYWJlbCIsICIiXSwgWyJjbGFzcyIsICJtYXQtcGxhY2Vob2xkZXItcmVxdWlyZWQgbWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyIiwgImFyaWEtaGlkZGVuIiwgInRydWUiLCA0LCAibmdJZiJdLCBbImFyaWEtaGlkZGVuIiwgInRydWUiLCAxLCAibWF0LXBsYWNlaG9sZGVyLXJlcXVpcmVkIiwgIm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSJdLCBbInVuZGVybGluZSIsICIiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1yaXBwbGUiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXIiXSwgWyJjbGFzcyIsICJtYXQtaGludCIsIDMsICJpZCIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LWZvcm0tZmllbGQtaGludC1zcGFjZXIiXSwgWzEsICJtYXQtaGludCIsIDMsICJpZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1cHJvamVjdGlvbkRlZihfYzQkMSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSwgMik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9UZW1wbGF0ZV9kaXZfY2xpY2tfMV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5fY29udHJvbC5vbkNvbnRhaW5lckNsaWNrICYmIGN0eC5fY29udHJvbC5vbkNvbnRhaW5lckNsaWNrKCRldmVudCk7IH0pOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBNYXRGb3JtRmllbGRfbmdfY29udGFpbmVyXzNfVGVtcGxhdGUsIDksIDAsICJuZy1jb250YWluZXIiLCAzKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNCwgTWF0Rm9ybUZpZWxkX2Rpdl80X1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgNCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgNSwgNik7CiAgICAgICAgybXJtXByb2plY3Rpb24oNyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAic3BhbiIsIDcpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg5LCBNYXRGb3JtRmllbGRfbGFiZWxfOV9UZW1wbGF0ZSwgNSwgMTYsICJsYWJlbCIsIDgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTAsIE1hdEZvcm1GaWVsZF9kaXZfMTBfVGVtcGxhdGUsIDIsIDAsICJkaXYiLCA5KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxMSwgTWF0Rm9ybUZpZWxkX2Rpdl8xMV9UZW1wbGF0ZSwgMywgNCwgImRpdiIsIDEwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAiZGl2IiwgMTEpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxMywgTWF0Rm9ybUZpZWxkX2Rpdl8xM19UZW1wbGF0ZSwgMiwgMSwgImRpdiIsIDEyKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTQsIE1hdEZvcm1GaWVsZF9kaXZfMTRfVGVtcGxhdGUsIDUsIDIsICJkaXYiLCAxMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmFwcGVhcmFuY2UgPT0gIm91dGxpbmUiKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguX3ByZWZpeENoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Ll9oYXNGbG9hdGluZ0xhYmVsKCkpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5fc3VmZml4Q2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguYXBwZWFyYW5jZSAhPSAib3V0bGluZSIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCBjdHguX2dldERpc3BsYXllZE1lc3NhZ2VzKCkpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgImVycm9yIik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCAiaGludCIpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgQ2RrT2JzZXJ2ZUNvbnRlbnRdLCBzdHlsZXM6IFsiLm1hdC1mb3JtLWZpZWxke2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246bGVmdH1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxke3RleHQtYWxpZ246cmlnaHR9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpiYXNlbGluZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJX0ubWF0LWZvcm0tZmllbGQtcHJlZml4LC5tYXQtZm9ybS1maWVsZC1zdWZmaXh7d2hpdGUtc3BhY2U6bm93cmFwO2ZsZXg6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtaW5maXh7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OmF1dG87bWluLXdpZHRoOjA7d2lkdGg6MTgwcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaW5maXh7Ym9yZGVyLWltYWdlOmxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQpfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVye2xlZnQ6YXV0bztyaWdodDowfS5tYXQtZm9ybS1maWVsZC1sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7Zm9udDppbmhlcml0O3BvaW50ZXItZXZlbnRzOm5vbmU7d2lkdGg6MTAwJTt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztvdmVyZmxvdzpoaWRkZW47dHJhbnNmb3JtLW9yaWdpbjowIDA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksd2lkdGggNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7ZGlzcGxheTpub25lfVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDA7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWVtcHR5Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6bm9uZX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2s7dHJhbnNpdGlvbjpub25lfS5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWlucHV0LXNlcnZlcltwbGFjZWhvbGRlcl06bm90KDpwbGFjZWhvbGRlci1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6bm9uZX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9ja30ubWF0LWZvcm0tZmllbGQtbGFiZWw6bm90KC5tYXQtZm9ybS1maWVsZC1lbXB0eSl7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zZm9ybTpzY2FsZTNkKDEsIDEuMDAwMSwgMSl9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7d2lkdGg6MTAwJTt0cmFuc2Zvcm0tb3JpZ2luOjUwJTt0cmFuc2Zvcm06c2NhbGVYKDAuNSk7b3BhY2l0eTowO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAzMDBtcyBjdWJpYy1iZXppZXIoMC41NSwgMCwgMC41NSwgMC4yKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zaXRpb246dHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciAzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1pY29ue3dpZHRoOjFlbTtoZWlnaHQ6MWVtO2ZvbnQtc2l6ZTppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJ7ZGlzcGxheTpmbGV4fS5tYXQtZm9ybS1maWVsZC1oaW50LXNwYWNlcntmbGV4OjEgMCAxZW19Lm1hdC1lcnJvcntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1jb250cm9sLXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9XG4iLCAiLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtib3JkZXItcmFkaXVzOjRweCA0cHggMCAwO3BhZGRpbmc6Ljc1ZW0gLjc1ZW0gMCAuNzVlbX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWZsZXh7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7Y29udGVudDpcIlwiO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7aGVpZ2h0OjFweDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtib3R0b206MDtoZWlnaHQ6MnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGw6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVye3BhZGRpbmc6MCAxZW19XG4iLCAiLm1hdC1pbnB1dC1lbGVtZW50e2ZvbnQ6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOmN1cnJlbnRDb2xvcjtib3JkZXI6bm9uZTtvdXRsaW5lOm5vbmU7cGFkZGluZzowO21hcmdpbjowO3dpZHRoOjEwMCU7bWF4LXdpZHRoOjEwMCU7dmVydGljYWwtYWxpZ246Ym90dG9tO3RleHQtYWxpZ246aW5oZXJpdH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1jbGVhciwubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1yZXZlYWx7ZGlzcGxheTpub25lfS5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1yZXN1bHRzLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNvbnRhY3RzLWF1dG8tZmlsbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhcHMtbG9jay1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNyZWRlbnRpYWxzLWF1dG8tZmlsbC1idXR0b257dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZV0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1tb250aF0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla10sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9dGltZV17bGluZS1oZWlnaHQ6MX0ubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRlXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZS1sb2NhbF06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPW1vbnRoXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla106OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXRpbWVdOjphZnRlcntjb250ZW50OlwiIFwiO3doaXRlLXNwYWNlOnByZTt3aWR0aDoxcHh9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1jbGVhci1idXR0b257Zm9udC1zaXplOi43NWVtfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZX0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfXRleHRhcmVhLm1hdC1pbnB1dC1lbGVtZW50e3Jlc2l6ZTp2ZXJ0aWNhbDtvdmVyZmxvdzphdXRvfXRleHRhcmVhLm1hdC1pbnB1dC1lbGVtZW50LmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudHtwYWRkaW5nOjJweCAwO21hcmdpbjotMnB4IDB9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50ey1tb3otYXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZy10b3A6MWVtO3RvcDotMWVtO21hcmdpbi1ib3R0b206LTFlbX1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1leHBhbmR7ZGlzcGxheTpub25lfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6bm90KDpkaXNhYmxlZCl7Y3Vyc29yOnBvaW50ZXJ9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtdmFsdWV7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOm5vbmV9Lm1hdC1mb2N1c2VkIC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgc2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtdmFsdWV7Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbnRlbnQ6XCJcIjt3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MDttYXJnaW4tdG9wOi0yLjVweDtwb2ludGVyLWV2ZW50czpub25lfVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye3JpZ2h0OmF1dG87bGVmdDowfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtaW5wdXQtZWxlbWVudHtwYWRkaW5nLXJpZ2h0OjE1cHh9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtaW5wdXQtZWxlbWVudHtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE1cHh9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDEwcHgpfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcnttYXJnaW4tdG9wOi0xMHB4fVxuIiwgIi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMHB4KTstbXMtdHJhbnNmb3JtOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbnt3aWR0aDoxZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2ZvbnQ6aW5oZXJpdDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntmb250LXNpemU6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtoZWlnaHQ6MXB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAxcHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7dG9wOjA7aGVpZ2h0OjJweDtvdmVyZmxvdzpoaWRkZW59LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvcmRlci10b3Atc3R5bGU6ZG90dGVkO2JvcmRlci10b3Atd2lkdGg6MnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkOm5vdCgubWF0LWZvY3VzZWQpIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjFweH1cbiIsICIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC13cmFwcGVye21hcmdpbjouMjVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWZsZXh7cGFkZGluZzowIC43NWVtIDAgLjc1ZW07bWFyZ2luLXRvcDotMC4yNWVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1zdWZmaXh7dG9wOi4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDouMjVlbTtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7bWluLXdpZHRoOjVweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0e2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnR7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJhZGl1czowIDVweCA1cHggMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXItcmFkaXVzOjAgNXB4IDVweCAwO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7ZmxleC1ncm93OjF9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpub25lO2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXJhZGl1czouMDAwMDAxcHg7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItd2lkdGg6MnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljaywubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eToxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXIgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre29wYWNpdHk6MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntwYWRkaW5nOjAgMWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZSwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0LC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5kLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe3RyYW5zaXRpb246bm9uZX1cbiIsICIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nLXRvcDouNzVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7Ym90dG9tOjA7aGVpZ2h0OjJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBkYXRhOiB7IGFuaW1hdGlvbjogW21hdEZvcm1GaWVsZEFuaW1hdGlvbnMudHJhbnNpdGlvbk1lc3NhZ2VzXSB9LCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRGb3JtRmllbGQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9MQUJFTF9HTE9CQUxfT1BUSU9OUyxdIH1dIH0sCiAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLF0gfV0gfSwKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Ck1hdEZvcm1GaWVsZC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGFwcGVhcmFuY2U6IFt7IHR5cGU6IElucHV0IH1dLAogICAgaGlkZVJlcXVpcmVkTWFya2VyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGhpbnRMYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBmbG9hdExhYmVsOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIHVuZGVybGluZVJlZjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3VuZGVybGluZScsXSB9XSwKICAgIF9jb25uZWN0aW9uQ29udGFpbmVyUmVmOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29ubmVjdGlvbkNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF9pbnB1dENvbnRhaW5lclJlZjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2lucHV0Q29udGFpbmVyJyxdIH1dLAogICAgX2xhYmVsOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnbGFiZWwnLF0gfV0sCiAgICBfY29udHJvbE5vblN0YXRpYzogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0Rm9ybUZpZWxkQ29udHJvbCxdIH1dLAogICAgX2NvbnRyb2xTdGF0aWM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW01hdEZvcm1GaWVsZENvbnRyb2wsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgIF9sYWJlbENoaWxkTm9uU3RhdGljOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNYXRMYWJlbCxdIH1dLAogICAgX2xhYmVsQ2hpbGRTdGF0aWM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW01hdExhYmVsLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICBfcGxhY2Vob2xkZXJDaGlsZDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0UGxhY2Vob2xkZXIsXSB9XSwKICAgIF9lcnJvckNoaWxkcmVuOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRFcnJvciwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sCiAgICBfaGludENoaWxkcmVuOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRIaW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgIF9wcmVmaXhDaGlsZHJlbjogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0UHJlZml4LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgIF9zdWZmaXhDaGlsZHJlbjogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0U3VmZml4LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvZm9ybS1maWVsZC1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgTWF0Rm9ybUZpZWxkTW9kdWxlIHsKfQpNYXRGb3JtRmllbGRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRGb3JtRmllbGRNb2R1bGUgfSk7Ck1hdEZvcm1GaWVsZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdEZvcm1GaWVsZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRGb3JtRmllbGRNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgT2JzZXJ2ZXJzTW9kdWxlLAogICAgICAgIF1dIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRGb3JtRmllbGRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0RXJyb3IsCiAgICAgICAgTWF0Rm9ybUZpZWxkLAogICAgICAgIE1hdEhpbnQsCiAgICAgICAgTWF0TGFiZWwsCiAgICAgICAgTWF0UGxhY2Vob2xkZXIsCiAgICAgICAgTWF0UHJlZml4LAogICAgICAgIE1hdFN1ZmZpeF07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsCiAgICAgICAgT2JzZXJ2ZXJzTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdEVycm9yLAogICAgICAgIE1hdEZvcm1GaWVsZCwKICAgICAgICBNYXRIaW50LAogICAgICAgIE1hdExhYmVsLAogICAgICAgIE1hdFBsYWNlaG9sZGVyLAogICAgICAgIE1hdFByZWZpeCwKICAgICAgICBNYXRTdWZmaXhdOyB9IH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Njcm9sbC9ibG9jay1zY3JvbGwtc3RyYXRlZ3kudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFN0cmF0ZWd5IHRoYXQgd2lsbCBwcmV2ZW50IHRoZSB1c2VyIGZyb20gc2Nyb2xsaW5nIHdoaWxlIHRoZSBvdmVybGF5IGlzIHZpc2libGUuCiAqLwpjbGFzcyBCbG9ja1Njcm9sbFN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihfdmlld3BvcnRSdWxlciwgZG9jdW1lbnQpIHsKICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyID0gX3ZpZXdwb3J0UnVsZXI7CiAgICAgICAgdGhpcy5fcHJldmlvdXNIVE1MU3R5bGVzID0geyB0b3A6ICcnLCBsZWZ0OiAnJyB9OwogICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGFjaGVzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IHRvIGFuIG92ZXJsYXkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2goKSB7IH0KICAgIC8qKgogICAgICogQmxvY2tzIHBhZ2UtbGV2ZWwgc2Nyb2xsIHdoaWxlIHRoZSBhdHRhY2hlZCBvdmVybGF5IGlzIG9wZW4uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbmFibGUoKSB7CiAgICAgICAgaWYgKHRoaXMuX2NhbkJlRW5hYmxlZCgpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbiA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpOwogICAgICAgICAgICAvLyBDYWNoZSB0aGUgcHJldmlvdXMgaW5saW5lIHN0eWxlcyBpbiBjYXNlIHRoZSB1c2VyIGhhZCBzZXQgdGhlbS4KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNIVE1MU3R5bGVzLmxlZnQgPSByb290LnN0eWxlLmxlZnQgfHwgJyc7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy50b3AgPSByb290LnN0eWxlLnRvcCB8fCAnJzsKICAgICAgICAgICAgLy8gTm90ZTogd2UncmUgdXNpbmcgdGhlIGBodG1sYCBub2RlLCBpbnN0ZWFkIG9mIHRoZSBgYm9keWAsIGJlY2F1c2UgdGhlIGBib2R5YCBtYXkKICAgICAgICAgICAgLy8gaGF2ZSB0aGUgdXNlciBhZ2VudCBtYXJnaW4sIHdoZXJlYXMgdGhlIGBodG1sYCBpcyBndWFyYW50ZWVkIG5vdCB0byBoYXZlIG9uZS4KICAgICAgICAgICAgcm9vdC5zdHlsZS5sZWZ0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSgtdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi5sZWZ0KTsKICAgICAgICAgICAgcm9vdC5zdHlsZS50b3AgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKC10aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLnRvcCk7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgnY2RrLWdsb2JhbC1zY3JvbGxibG9jaycpOwogICAgICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVW5ibG9ja3MgcGFnZS1sZXZlbCBzY3JvbGwgd2hpbGUgdGhlIGF0dGFjaGVkIG92ZXJsYXkgaXMgb3Blbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc2FibGUoKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzRW5hYmxlZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm9keSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5ib2R5KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaHRtbFN0eWxlID0gKC8qKiBAdHlwZSB7P30gKi8gKGh0bWwuc3R5bGUpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBib2R5U3R5bGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYm9keS5zdHlsZSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSHRtbFNjcm9sbEJlaGF2aW9yID0gaHRtbFN0eWxlLnNjcm9sbEJlaGF2aW9yIHx8ICcnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQm9keVNjcm9sbEJlaGF2aW9yID0gYm9keVN0eWxlLnNjcm9sbEJlaGF2aW9yIHx8ICcnOwogICAgICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgaHRtbFN0eWxlLmxlZnQgPSB0aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMubGVmdDsKICAgICAgICAgICAgaHRtbFN0eWxlLnRvcCA9IHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy50b3A7CiAgICAgICAgICAgIGh0bWwuY2xhc3NMaXN0LnJlbW92ZSgnY2RrLWdsb2JhbC1zY3JvbGxibG9jaycpOwogICAgICAgICAgICAvLyBEaXNhYmxlIHVzZXItZGVmaW5lZCBzbW9vdGggc2Nyb2xsaW5nIHRlbXBvcmFyaWx5IHdoaWxlIHdlIHJlc3RvcmUgdGhlIHNjcm9sbCBwb3NpdGlvbi4KICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9zY3JvbGwtYmVoYXZpb3IKICAgICAgICAgICAgaHRtbFN0eWxlLnNjcm9sbEJlaGF2aW9yID0gYm9keVN0eWxlLnNjcm9sbEJlaGF2aW9yID0gJ2F1dG8nOwogICAgICAgICAgICB3aW5kb3cuc2Nyb2xsKHRoaXMuX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24ubGVmdCwgdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApOwogICAgICAgICAgICBodG1sU3R5bGUuc2Nyb2xsQmVoYXZpb3IgPSBwcmV2aW91c0h0bWxTY3JvbGxCZWhhdmlvcjsKICAgICAgICAgICAgYm9keVN0eWxlLnNjcm9sbEJlaGF2aW9yID0gcHJldmlvdXNCb2R5U2Nyb2xsQmVoYXZpb3I7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NhbkJlRW5hYmxlZCgpIHsKICAgICAgICAvLyBTaW5jZSB0aGUgc2Nyb2xsIHN0cmF0ZWdpZXMgY2FuJ3QgYmUgc2luZ2xldG9ucywgd2UgaGF2ZSB0byB1c2UgYSBnbG9iYWwgQ1NTIGNsYXNzCiAgICAgICAgLy8gKGBjZGstZ2xvYmFsLXNjcm9sbGJsb2NrYCkgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIGRpc2FibGUgZ2xvYmFsCiAgICAgICAgLy8gc2Nyb2xsaW5nIG11bHRpcGxlIHRpbWVzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBodG1sID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpOwogICAgICAgIGlmIChodG1sLmNsYXNzTGlzdC5jb250YWlucygnY2RrLWdsb2JhbC1zY3JvbGxibG9jaycpIHx8IHRoaXMuX2lzRW5hYmxlZCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5fZG9jdW1lbnQuYm9keTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpOwogICAgICAgIHJldHVybiBib2R5LnNjcm9sbEhlaWdodCA+IHZpZXdwb3J0LmhlaWdodCB8fCBib2R5LnNjcm9sbFdpZHRoID4gdmlld3BvcnQud2lkdGg7CiAgICB9Cn0KLyoqCiAqIFJldHVybnMgYW4gZXJyb3IgdG8gYmUgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYW4gYWxyZWFkeS1hdHRhY2hlZCBzY3JvbGwgc3RyYXRlZ3kuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRNYXRTY3JvbGxTdHJhdGVneUFscmVhZHlBdHRhY2hlZEVycm9yKCkgewogICAgcmV0dXJuIEVycm9yKGBTY3JvbGwgc3RyYXRlZ3kgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZC5gKTsKfQovKioKICogU3RyYXRlZ3kgdGhhdCB3aWxsIGNsb3NlIHRoZSBvdmVybGF5IGFzIHNvb24gYXMgdGhlIHVzZXIgc3RhcnRzIHNjcm9sbGluZy4KICovCmNsYXNzIENsb3NlU2Nyb2xsU3RyYXRlZ3kgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9zY3JvbGxEaXNwYXRjaGVyCiAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdwb3J0UnVsZXIKICAgICAqIEBwYXJhbSB7Pz19IF9jb25maWcKICAgICAqLwogICAgY29uc3RydWN0b3IoX3Njcm9sbERpc3BhdGNoZXIsIF9uZ1pvbmUsIF92aWV3cG9ydFJ1bGVyLCBfY29uZmlnKSB7CiAgICAgICAgdGhpcy5fc2Nyb2xsRGlzcGF0Y2hlciA9IF9zY3JvbGxEaXNwYXRjaGVyOwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyB0aGUgb3ZlcmxheSByZWYgYW5kIGRpc2FibGVzIHRoZSBzY3JvbGwgc3RyYXRlZ3kuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGV0YWNoID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgdGhpcyBzY3JvbGwgc3RyYXRlZ3kgdG8gYW4gb3ZlcmxheS4KICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoKG92ZXJsYXlSZWYpIHsKICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICB0aHJvdyBnZXRNYXRTY3JvbGxTdHJhdGVneUFscmVhZHlBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBvdmVybGF5UmVmOwogICAgfQogICAgLyoqCiAgICAgKiBFbmFibGVzIHRoZSBjbG9zaW5nIG9mIHRoZSBhdHRhY2hlZCBvdmVybGF5IG9uIHNjcm9sbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVuYWJsZSgpIHsKICAgICAgICBpZiAodGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX3Njcm9sbERpc3BhdGNoZXIuc2Nyb2xsZWQoMCk7CiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZyAmJiB0aGlzLl9jb25maWcudGhyZXNob2xkICYmIHRoaXMuX2NvbmZpZy50aHJlc2hvbGQgPiAxKSB7CiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxTY3JvbGxQb3NpdGlvbiA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLnRvcDsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gc3RyZWFtLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLnRvcDsKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhzY3JvbGxQb3NpdGlvbiAtIHRoaXMuX2luaXRpYWxTY3JvbGxQb3NpdGlvbikgPiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NvbmZpZykpLnRocmVzaG9sZCkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGV0YWNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IHN0cmVhbS5zdWJzY3JpYmUodGhpcy5fZGV0YWNoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERpc2FibGVzIHRoZSBjbG9zaW5nIHRoZSBhdHRhY2hlZCBvdmVybGF5IG9uIHNjcm9sbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc2FibGUoKSB7CiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICB0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRldGFjaCgpIHsKICAgICAgICB0aGlzLmRpc2FibGUoKTsKICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Njcm9sbC9ub29wLXNjcm9sbC1zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFNjcm9sbCBzdHJhdGVneSB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcuCiAqLwpjbGFzcyBOb29wU2Nyb2xsU3RyYXRlZ3kgewogICAgLyoqCiAgICAgKiBEb2VzIG5vdGhpbmcsIGFzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IGlzIGEgbm8tb3AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbmFibGUoKSB7IH0KICAgIC8qKgogICAgICogRG9lcyBub3RoaW5nLCBhcyB0aGlzIHNjcm9sbCBzdHJhdGVneSBpcyBhIG5vLW9wLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzYWJsZSgpIHsgfQogICAgLyoqCiAgICAgKiBEb2VzIG5vdGhpbmcsIGFzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IGlzIGEgbm8tb3AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2goKSB7IH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Bvc2l0aW9uL3Njcm9sbC1jbGlwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovLyBUT0RPKGplbGJvdXJuKTogbW92ZSB0aGlzIHRvIGxpdmUgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc2Nyb2xsaW5nIGNvZGUKLy8gVE9ETyhqZWxib3Vybik6IHNvbWVkYXkgcmVwbGFjZSB0aGlzIHdpdGggSW50ZXJzZWN0aW9uT2JzZXJ2ZXJzCi8qKgogKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBzY3JvbGxlZCBvdXRzaWRlIG9mIHZpZXcgYnkgYW55IG9mIGl0cyBwYXJlbnQgc2Nyb2xsaW5nIGNvbnRhaW5lcnMuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gZWxlbWVudCBEaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50IChmcm9tIGdldEJvdW5kaW5nQ2xpZW50UmVjdCkKICogQHBhcmFtIHs/fSBzY3JvbGxDb250YWluZXJzIERpbWVuc2lvbnMgb2YgZWxlbWVudCdzIHNjcm9sbGluZyBjb250YWluZXJzIChmcm9tIGdldEJvdW5kaW5nQ2xpZW50UmVjdCkKICogQHJldHVybiB7P30gV2hldGhlciB0aGUgZWxlbWVudCBpcyBzY3JvbGxlZCBvdXQgb2YgdmlldwogKi8KZnVuY3Rpb24gaXNFbGVtZW50U2Nyb2xsZWRPdXRzaWRlVmlldyhlbGVtZW50LCBzY3JvbGxDb250YWluZXJzKSB7CiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVycy5zb21lKCgvKioKICAgICAqIEBwYXJhbSB7P30gY29udGFpbmVyQm91bmRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb250YWluZXJCb3VuZHMgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvdXRzaWRlQWJvdmUgPSBlbGVtZW50LmJvdHRvbSA8IGNvbnRhaW5lckJvdW5kcy50b3A7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG91dHNpZGVCZWxvdyA9IGVsZW1lbnQudG9wID4gY29udGFpbmVyQm91bmRzLmJvdHRvbTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3V0c2lkZUxlZnQgPSBlbGVtZW50LnJpZ2h0IDwgY29udGFpbmVyQm91bmRzLmxlZnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG91dHNpZGVSaWdodCA9IGVsZW1lbnQubGVmdCA+IGNvbnRhaW5lckJvdW5kcy5yaWdodDsKICAgICAgICByZXR1cm4gb3V0c2lkZUFib3ZlIHx8IG91dHNpZGVCZWxvdyB8fCBvdXRzaWRlTGVmdCB8fCBvdXRzaWRlUmlnaHQ7CiAgICB9KSk7Cn0KLyoqCiAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIGNsaXBwZWQgYnkgYW55IG9mIGl0cyBzY3JvbGxpbmcgY29udGFpbmVycy4KICogXEBkb2NzLXByaXZhdGUKICogQHBhcmFtIHs/fSBlbGVtZW50IERpbWVuc2lvbnMgb2YgdGhlIGVsZW1lbnQgKGZyb20gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KQogKiBAcGFyYW0gez99IHNjcm9sbENvbnRhaW5lcnMgRGltZW5zaW9ucyBvZiBlbGVtZW50J3Mgc2Nyb2xsaW5nIGNvbnRhaW5lcnMgKGZyb20gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KQogKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGNsaXBwZWQKICovCmZ1bmN0aW9uIGlzRWxlbWVudENsaXBwZWRCeVNjcm9sbGluZyhlbGVtZW50LCBzY3JvbGxDb250YWluZXJzKSB7CiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVycy5zb21lKCgvKioKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsQ29udGFpbmVyUmVjdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2Nyb2xsQ29udGFpbmVyUmVjdCA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNsaXBwZWRBYm92ZSA9IGVsZW1lbnQudG9wIDwgc2Nyb2xsQ29udGFpbmVyUmVjdC50b3A7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNsaXBwZWRCZWxvdyA9IGVsZW1lbnQuYm90dG9tID4gc2Nyb2xsQ29udGFpbmVyUmVjdC5ib3R0b207CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNsaXBwZWRMZWZ0ID0gZWxlbWVudC5sZWZ0IDwgc2Nyb2xsQ29udGFpbmVyUmVjdC5sZWZ0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjbGlwcGVkUmlnaHQgPSBlbGVtZW50LnJpZ2h0ID4gc2Nyb2xsQ29udGFpbmVyUmVjdC5yaWdodDsKICAgICAgICByZXR1cm4gY2xpcHBlZEFib3ZlIHx8IGNsaXBwZWRCZWxvdyB8fCBjbGlwcGVkTGVmdCB8fCBjbGlwcGVkUmlnaHQ7CiAgICB9KSk7Cn0KLyoqCiAqIFN0cmF0ZWd5IHRoYXQgd2lsbCB1cGRhdGUgdGhlIGVsZW1lbnQgcG9zaXRpb24gYXMgdGhlIHVzZXIgaXMgc2Nyb2xsaW5nLgogKi8KY2xhc3MgUmVwb3NpdGlvblNjcm9sbFN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfc2Nyb2xsRGlzcGF0Y2hlcgogICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez89fSBfY29uZmlnCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9zY3JvbGxEaXNwYXRjaGVyLCBfdmlld3BvcnRSdWxlciwgX25nWm9uZSwgX2NvbmZpZykgewogICAgICAgIHRoaXMuX3Njcm9sbERpc3BhdGNoZXIgPSBfc2Nyb2xsRGlzcGF0Y2hlcjsKICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyID0gX3ZpZXdwb3J0UnVsZXI7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9jb25maWcgPSBfY29uZmlnOwogICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGFjaGVzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IHRvIGFuIG92ZXJsYXkuCiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXlSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGF0dGFjaChvdmVybGF5UmVmKSB7CiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0U2Nyb2xsU3RyYXRlZ3lBbHJlYWR5QXR0YWNoZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gb3ZlcmxheVJlZjsKICAgIH0KICAgIC8qKgogICAgICogRW5hYmxlcyByZXBvc2l0aW9uaW5nIG9mIHRoZSBhdHRhY2hlZCBvdmVybGF5IG9uIHNjcm9sbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVuYWJsZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRocm90dGxlID0gdGhpcy5fY29uZmlnID8gdGhpcy5fY29uZmlnLnNjcm9sbFRocm90dGxlIDogMDsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5fc2Nyb2xsRGlzcGF0Y2hlci5zY3JvbGxlZCh0aHJvdHRsZSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8oY3Jpc2JldG8pOiBtYWtlIGBjbG9zZWAgb24gYnkgZGVmYXVsdCBvbmNlIGFsbCBjb21wb25lbnRzIGNhbiBoYW5kbGUgaXQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnICYmIHRoaXMuX2NvbmZpZy5hdXRvQ2xvc2UpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheVJlY3QgPSB0aGlzLl9vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKTsKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGNyaXNiZXRvKTogaW5jbHVkZSBhbGwgYW5jZXN0b3Igc2Nyb2xsIGNvbnRhaW5lcnMgaGVyZSBvbmNlCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHdheSBvZiBleHBvc2luZyB0aGUgdHJpZ2dlciBlbGVtZW50IHRvIHRoZSBzY3JvbGwgc3RyYXRlZ3kuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlY3RzID0gW3sgd2lkdGgsIGhlaWdodCwgYm90dG9tOiBoZWlnaHQsIHJpZ2h0OiB3aWR0aCwgdG9wOiAwLCBsZWZ0OiAwIH1dOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0VsZW1lbnRTY3JvbGxlZE91dHNpZGVWaWV3KG92ZXJsYXlSZWN0LCBwYXJlbnRSZWN0cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGlzYWJsZXMgcmVwb3NpdGlvbmluZyBvZiB0aGUgYXR0YWNoZWQgb3ZlcmxheSBvbiBzY3JvbGwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNhYmxlKCkgewogICAgICAgIGlmICh0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2goKSB7CiAgICAgICAgdGhpcy5kaXNhYmxlKCk7CiAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9zY3JvbGwvc2Nyb2xsLXN0cmF0ZWd5LW9wdGlvbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIE9wdGlvbnMgZm9yIGhvdyBhbiBvdmVybGF5IHdpbGwgaGFuZGxlIHNjcm9sbGluZy4KICoKICogVXNlcnMgY2FuIHByb3ZpZGUgYSBjdXN0b20gdmFsdWUgZm9yIGBTY3JvbGxTdHJhdGVneU9wdGlvbnNgIHRvIHJlcGxhY2UgdGhlIGRlZmF1bHQKICogYmVoYXZpb3JzLiBUaGlzIGNsYXNzIHByaW1hcmlseSBhY3RzIGFzIGEgZmFjdG9yeSBmb3IgU2Nyb2xsU3RyYXRlZ3kgaW5zdGFuY2VzLgogKi8KY2xhc3MgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfc2Nyb2xsRGlzcGF0Y2hlcgogICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9zY3JvbGxEaXNwYXRjaGVyLCBfdmlld3BvcnRSdWxlciwgX25nWm9uZSwgZG9jdW1lbnQpIHsKICAgICAgICB0aGlzLl9zY3JvbGxEaXNwYXRjaGVyID0gX3Njcm9sbERpc3BhdGNoZXI7CiAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgLyoqCiAgICAgICAgICogRG8gbm90aGluZyBvbiBzY3JvbGwuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5ub29wID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gbmV3IE5vb3BTY3JvbGxTdHJhdGVneSgpKTsKICAgICAgICAvKioKICAgICAgICAgKiBDbG9zZSB0aGUgb3ZlcmxheSBhcyBzb29uIGFzIHRoZSB1c2VyIHNjcm9sbHMuCiAgICAgICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSBzY3JvbGwgc3RyYXRlZ3kuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5jbG9zZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb25maWcpID0+IG5ldyBDbG9zZVNjcm9sbFN0cmF0ZWd5KHRoaXMuX3Njcm9sbERpc3BhdGNoZXIsIHRoaXMuX25nWm9uZSwgdGhpcy5fdmlld3BvcnRSdWxlciwgY29uZmlnKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogQmxvY2sgc2Nyb2xsaW5nLgogICAgICAgICAqLwogICAgICAgIHRoaXMuYmxvY2sgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBuZXcgQmxvY2tTY3JvbGxTdHJhdGVneSh0aGlzLl92aWV3cG9ydFJ1bGVyLCB0aGlzLl9kb2N1bWVudCkpOwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgb3ZlcmxheSdzIHBvc2l0aW9uIG9uIHNjcm9sbC4KICAgICAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCBpbnNpZGUgdGhlIHNjcm9sbCBzdHJhdGVneS4KICAgICAgICAgKiBBbGxvd3MgZGVib3VuY2luZyB0aGUgcmVwb3NpdGlvbiBjYWxscy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlcG9zaXRpb24gPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gY29uZmlnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29uZmlnKSA9PiBuZXcgUmVwb3NpdGlvblNjcm9sbFN0cmF0ZWd5KHRoaXMuX3Njcm9sbERpc3BhdGNoZXIsIHRoaXMuX3ZpZXdwb3J0UnVsZXIsIHRoaXMuX25nWm9uZSwgY29uZmlnKSk7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgIH0KfQpTY3JvbGxTdHJhdGVneU9wdGlvbnMuybVmYWMgPSBmdW5jdGlvbiBTY3JvbGxTdHJhdGVneU9wdGlvbnNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zKSjJtcm1aW5qZWN0KFNjcm9sbERpc3BhdGNoZXIpLCDJtcm1aW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KU2Nyb2xsU3RyYXRlZ3lPcHRpb25zLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTY3JvbGxEaXNwYXRjaGVyIH0sCiAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFNjcm9sbFN0cmF0ZWd5T3B0aW9ucy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNjcm9sbFN0cmF0ZWd5T3B0aW9uc19GYWN0b3J5KCkgeyByZXR1cm4gbmV3IFNjcm9sbFN0cmF0ZWd5T3B0aW9ucyjJtcm1aW5qZWN0KFNjcm9sbERpc3BhdGNoZXIpLCDJtcm1aW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9LCB0b2tlbjogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvc2Nyb2xsL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS1jb25maWcudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEluaXRpYWwgY29uZmlndXJhdGlvbiB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gb3ZlcmxheS4KICovCmNsYXNzIE92ZXJsYXlDb25maWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAqLwogICAgY29uc3RydWN0b3IoY29uZmlnKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogU3RyYXRlZ3kgdG8gYmUgdXNlZCB3aGVuIGhhbmRsaW5nIHNjcm9sbCBldmVudHMgd2hpbGUgdGhlIG92ZXJsYXkgaXMgb3Blbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5ID0gbmV3IE5vb3BTY3JvbGxTdHJhdGVneSgpOwogICAgICAgIC8qKgogICAgICAgICAqIEN1c3RvbSBjbGFzcyB0byBhZGQgdG8gdGhlIG92ZXJsYXkgcGFuZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnBhbmVsQ2xhc3MgPSAnJzsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5IGhhcyBhIGJhY2tkcm9wLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaGFzQmFja2Ryb3AgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBDdXN0b20gY2xhc3MgdG8gYWRkIHRvIHRoZSBiYWNrZHJvcAogICAgICAgICAqLwogICAgICAgIHRoaXMuYmFja2Ryb3BDbGFzcyA9ICdjZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wJzsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5IHNob3VsZCBiZSBkaXNwb3NlZCBvZiB3aGVuIHRoZSB1c2VyIGdvZXMgYmFja3dhcmRzL2ZvcndhcmRzIGluIGhpc3RvcnkuCiAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgdXN1YWxseSBkb2Vzbid0IGluY2x1ZGUgY2xpY2tpbmcgb24gbGlua3MgKHVubGVzcyB0aGUgdXNlciBpcyB1c2luZwogICAgICAgICAqIHRoZSBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgKS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmRpc3Bvc2VPbk5hdmlnYXRpb24gPSBmYWxzZTsKICAgICAgICBpZiAoY29uZmlnKSB7CiAgICAgICAgICAgIC8vIFVzZSBgSXRlcmFibGVgIGluc3RlYWQgb2YgYEFycmF5YCBiZWNhdXNlIFR5cGVTY3JpcHQsIGFzIG9mIDMuNi4zLAogICAgICAgICAgICAvLyBsb3NlcyB0aGUgYXJyYXkgZ2VuZXJpYyB0eXBlIGluIHRoZSBgZm9yIG9mYC4gQnV0IHdlICphbHNvKiBoYXZlIHRvIHVzZSBgQXJyYXlgIGJlY2F1c2UKICAgICAgICAgICAgLy8gdHlwZXNjcmlwdCB3b24ndCBpdGVyYXRlIG92ZXIgYW4gYEl0ZXJhYmxlYCB1bmxlc3MgeW91IGNvbXBpbGUgd2l0aCBgLS1kb3dubGV2ZWxJdGVyYXRpb25gCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29uZmlnS2V5cyA9ICgvKiogQHR5cGUgez99ICovIChPYmplY3Qua2V5cyhjb25maWcpKSk7CiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbmZpZ0tleXMpIHsKICAgICAgICAgICAgICAgIGlmIChjb25maWdba2V5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHlwZVNjcmlwdCwgYXMgb2YgdmVyc2lvbiAzLjUsIHNlZXMgdGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoaXMgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIC8vIGFzICJJIGRvbid0IGtub3cgKndoaWNoKiBrZXkgdGhpcyBpcywgc28gdGhlIG9ubHkgdmFsaWQgdmFsdWUgaXMgdGhlIGludGVyc2VjdGlvbgogICAgICAgICAgICAgICAgICAgIC8vIG9mIGFsbCB0aGUgcG9zaWJsZSB2YWx1ZXMuIiBJbiB0aGlzIGNhc2UsIHRoYXQgaGFwcGVucyB0byBiZSBgdW5kZWZpbmVkYC4gVHlwZVNjcmlwdAogICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gc2VlIHRoYXQgdGhlIHJpZ2h0LWhhbmQtc2lkZSBpcyBhY3R1YWxseSBhbiBhY2Nlc3Mgb2YgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCB0eXBlIHdpdGggdGhlIHNhbWUgZXhhY3Qga2V5LCBtZWFuaW5nIHRoYXQgdGhlIHZhbHVlIHR5cGUgbXVzdCBiZSBpZGVudGljYWwuCiAgICAgICAgICAgICAgICAgICAgLy8gU28gd2UgdXNlIGBhbnlgIHRvIHdvcmsgYXJvdW5kIHRoaXMuCiAgICAgICAgICAgICAgICAgICAgdGhpc1trZXldID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbmZpZ1trZXldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFRoZSBwb2ludHMgb2YgdGhlIG9yaWdpbiBlbGVtZW50IGFuZCB0aGUgb3ZlcmxheSBlbGVtZW50IHRvIGNvbm5lY3QuCiAqLwpjbGFzcyBDb25uZWN0aW9uUG9zaXRpb25QYWlyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheQogICAgICogQHBhcmFtIHs/PX0gb2Zmc2V0WAogICAgICogQHBhcmFtIHs/PX0gb2Zmc2V0WQogICAgICogQHBhcmFtIHs/PX0gcGFuZWxDbGFzcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG92ZXJsYXksIG9mZnNldFgsIG9mZnNldFksIHBhbmVsQ2xhc3MpIHsKICAgICAgICB0aGlzLm9mZnNldFggPSBvZmZzZXRYOwogICAgICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFk7CiAgICAgICAgdGhpcy5wYW5lbENsYXNzID0gcGFuZWxDbGFzczsKICAgICAgICB0aGlzLm9yaWdpblggPSBvcmlnaW4ub3JpZ2luWDsKICAgICAgICB0aGlzLm9yaWdpblkgPSBvcmlnaW4ub3JpZ2luWTsKICAgICAgICB0aGlzLm92ZXJsYXlYID0gb3ZlcmxheS5vdmVybGF5WDsKICAgICAgICB0aGlzLm92ZXJsYXlZID0gb3ZlcmxheS5vdmVybGF5WTsKICAgIH0KfQovKioKICogU2V0IG9mIHByb3BlcnRpZXMgcmVnYXJkaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luIGFuZCBvdmVybGF5IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydAogKiB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRhaW5pbmcgU2Nyb2xsYWJsZSBlbGVtZW50cy4KICoKICogVGhlIG92ZXJsYXkgYW5kIG9yaWdpbiBhcmUgY2xpcHBlZCBpZiBhbnkgcGFydCBvZiB0aGVpciBib3VuZGluZyBjbGllbnQgcmVjdGFuZ2xlIGV4Y2VlZHMgdGhlCiAqIGJvdW5kcyBvZiBhbnkgb25lIG9mIHRoZSBzdHJhdGVneSdzIFNjcm9sbGFibGUncyBib3VuZGluZyBjbGllbnQgcmVjdGFuZ2xlLgogKgogKiBUaGUgb3ZlcmxheSBhbmQgb3JpZ2luIGFyZSBvdXRzaWRlIHZpZXcgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZWlyIGJvdW5kaW5nIGNsaWVudAogKiByZWN0YW5nbGUgYW5kIGFueSBvbmUgb2YgdGhlIHN0cmF0ZWd5J3MgU2Nyb2xsYWJsZSdzIGJvdW5kaW5nIGNsaWVudCByZWN0YW5nbGUuCiAqCiAqICAgICAgIC0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLQogKiAgICAgICB8IG91dHNpZGUgfCAgICAgICAgICAgICAgICAgICAgfCBjbGlwcGVkIHwKICogICAgICAgfCAgdmlldyAgIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgfCAgICAgICAgfAogKiAgICAgICAtLS0tLS0tLS0tICAgICAgICAgICAgICAgfCAgICAgLS0tLS0tLS0tLS0gICAgICAgIHwKICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgU2Nyb2xsYWJsZSAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgfCAgICAgIFNjcm9sbGFibGUgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBcQGRvY3MtcHJpdmF0ZQogKi8KY2xhc3MgU2Nyb2xsaW5nVmlzaWJpbGl0eSB7Cn0KLyoqCiAqIFRoZSBjaGFuZ2UgZXZlbnQgZW1pdHRlZCBieSB0aGUgc3RyYXRlZ3kgd2hlbiBhIGZhbGxiYWNrIHBvc2l0aW9uIGlzIHVzZWQuCiAqLwpjbGFzcyBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbm5lY3Rpb25QYWlyCiAgICAgKiBAcGFyYW0gez99IHNjcm9sbGFibGVWaWV3UHJvcGVydGllcwogICAgICovCiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uUGFpciwgc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzKSB7CiAgICAgICAgdGhpcy5jb25uZWN0aW9uUGFpciA9IGNvbm5lY3Rpb25QYWlyOwogICAgICAgIHRoaXMuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzID0gc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzOwogICAgfQp9Ci8qKiBAbm9jb2xsYXBzZSAqLwpDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIgfSwKICAgIHsgdHlwZTogU2Nyb2xsaW5nVmlzaWJpbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQpdOwovKioKICogVmFsaWRhdGVzIHdoZXRoZXIgYSB2ZXJ0aWNhbCBwb3NpdGlvbiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZXMuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgdmFsaWRhdGVkLgogKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyB2YWxpZGF0ZWQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB2YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24ocHJvcGVydHksIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT09ICd0b3AnICYmIHZhbHVlICE9PSAnYm90dG9tJyAmJiB2YWx1ZSAhPT0gJ2NlbnRlcicpIHsKICAgICAgICB0aHJvdyBFcnJvcihgQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgJHtwcm9wZXJ0eX0gIiR7dmFsdWV9Ii4gYCArCiAgICAgICAgICAgIGBFeHBlY3RlZCAidG9wIiwgImJvdHRvbSIgb3IgImNlbnRlciIuYCk7CiAgICB9Cn0KLyoqCiAqIFZhbGlkYXRlcyB3aGV0aGVyIGEgaG9yaXpvbnRhbCBwb3NpdGlvbiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZXMuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgdmFsaWRhdGVkLgogKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyB2YWxpZGF0ZWQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB2YWxpZGF0ZUhvcml6b250YWxQb3NpdGlvbihwcm9wZXJ0eSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPT0gJ3N0YXJ0JyAmJiB2YWx1ZSAhPT0gJ2VuZCcgJiYgdmFsdWUgIT09ICdjZW50ZXInKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoYENvbm5lY3RlZFBvc2l0aW9uOiBJbnZhbGlkICR7cHJvcGVydHl9ICIke3ZhbHVlfSIuIGAgKwogICAgICAgICAgICBgRXhwZWN0ZWQgInN0YXJ0IiwgImVuZCIgb3IgImNlbnRlciIuYCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9rZXlib2FyZC9vdmVybGF5LWtleWJvYXJkLWRpc3BhdGNoZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFNlcnZpY2UgZm9yIGRpc3BhdGNoaW5nIGtleWJvYXJkIGV2ZW50cyB0aGF0IGxhbmQgb24gdGhlIGJvZHkgdG8gYXBwcm9wcmlhdGUgb3ZlcmxheSByZWYsCiAqIGlmIGFueS4gSXQgbWFpbnRhaW5zIGEgbGlzdCBvZiBhdHRhY2hlZCBvdmVybGF5cyB0byBkZXRlcm1pbmUgYmVzdCBzdWl0ZWQgb3ZlcmxheSBiYXNlZAogKiBvbiBldmVudCB0YXJnZXQgYW5kIG9yZGVyIG9mIG92ZXJsYXkgb3BlbnMuCiAqLwpjbGFzcyBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCkgewogICAgICAgIC8qKgogICAgICAgICAqIEN1cnJlbnRseSBhdHRhY2hlZCBvdmVybGF5cyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGF0dGFjaGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2F0dGFjaGVkT3ZlcmxheXMgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBLZXlib2FyZCBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGJvZHkuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fa2V5ZG93bkxpc3RlbmVyID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlzID0gdGhpcy5fYXR0YWNoZWRPdmVybGF5czsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IG92ZXJsYXlzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7CiAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUga2V5ZG93biBldmVudCB0byB0aGUgdG9wIG92ZXJsYXkgd2hpY2ggaGFzIHN1YnNjcmliZXJzIHRvIGl0cyBrZXlkb3duIGV2ZW50cy4KICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdGFyZ2V0IHRoZSBtb3N0IHJlY2VudCBvdmVybGF5LCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gbWF0Y2ggd2hlcmUgdGhlIGV2ZW50IGNhbWUKICAgICAgICAgICAgICAgIC8vIGZyb20sIGJlY2F1c2Ugc29tZSBjb21wb25lbnRzIG1pZ2h0IG9wZW4gYW4gb3ZlcmxheSwgYnV0IGtlZXAgZm9jdXMgb24gYSB0cmlnZ2VyIGVsZW1lbnQKICAgICAgICAgICAgICAgIC8vIChlLmcuIGZvciBzZWxlY3QgYW5kIGF1dG9jb21wbGV0ZSkuIFdlIHNraXAgb3ZlcmxheXMgd2l0aG91dCBrZXlkb3duIGV2ZW50IHN1YnNjcmlwdGlvbnMsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgb3ZlcmxheXMgdGhhdCBkb24ndCBoYW5kbGUga2V5Ym9hcmQgZXZlbnRzIHRvIGJsb2NrIHRoZSBvbmVzIGJlbG93CiAgICAgICAgICAgICAgICAvLyB0aGVtIHRoYXQgZG8uCiAgICAgICAgICAgICAgICBpZiAob3ZlcmxheXNbaV0uX2tleWRvd25FdmVudFN1YnNjcmlwdGlvbnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheXNbaV0uX2tleWRvd25FdmVudHMubmV4dChldmVudCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9kZXRhY2goKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGEgbmV3IG92ZXJsYXkgdG8gdGhlIGxpc3Qgb2YgYXR0YWNoZWQgb3ZlcmxheSByZWZzLgogICAgICogQHBhcmFtIHs/fSBvdmVybGF5UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGQob3ZlcmxheVJlZikgewogICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IGdldCB0aGUgc2FtZSBvdmVybGF5IG11bHRpcGxlIHRpbWVzLgogICAgICAgIHRoaXMucmVtb3ZlKG92ZXJsYXlSZWYpOwogICAgICAgIC8vIExhemlseSBzdGFydCBkaXNwYXRjaGVyIG9uY2UgZmlyc3Qgb3ZlcmxheSBpcyBhZGRlZAogICAgICAgIGlmICghdGhpcy5faXNBdHRhY2hlZCkgewogICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9rZXlkb3duTGlzdGVuZXIpOwogICAgICAgICAgICB0aGlzLl9pc0F0dGFjaGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYXR0YWNoZWRPdmVybGF5cy5wdXNoKG92ZXJsYXlSZWYpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgYW4gb3ZlcmxheSBmcm9tIHRoZSBsaXN0IG9mIGF0dGFjaGVkIG92ZXJsYXkgcmVmcy4KICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlKG92ZXJsYXlSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLmluZGV4T2Yob3ZlcmxheVJlZik7CiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRPdmVybGF5cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIH0KICAgICAgICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBsaXN0ZW5lciBvbmNlIHRoZXJlIGFyZSBubyBtb3JlIG92ZXJsYXlzLgogICAgICAgIGlmICh0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICB0aGlzLl9kZXRhY2goKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERldGFjaGVzIHRoZSBnbG9iYWwga2V5Ym9hcmQgZXZlbnQgbGlzdGVuZXIuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2RldGFjaCgpIHsKICAgICAgICBpZiAodGhpcy5faXNBdHRhY2hlZCkgewogICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9rZXlkb3duTGlzdGVuZXIpOwogICAgICAgICAgICB0aGlzLl9pc0F0dGFjaGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgfQp9Ck92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIuybVmYWMgPSBmdW5jdGlvbiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXJfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9LCB0b2tlbjogT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwovKioKICogXEBkb2NzLXByaXZhdGUgXEBkZXByZWNhdGVkIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAqIEBwYXJhbSB7P30gZGlzcGF0Y2hlcgogKiBAcGFyYW0gez99IF9kb2N1bWVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gT1ZFUkxBWV9LRVlCT0FSRF9ESVNQQVRDSEVSX1BST1ZJREVSX0ZBQ1RPUlkoZGlzcGF0Y2hlciwgX2RvY3VtZW50KSB7CiAgICByZXR1cm4gZGlzcGF0Y2hlciB8fCBuZXcgT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcihfZG9jdW1lbnQpOwp9Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZSBcQGRlcHJlY2F0ZWQgXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICogQHR5cGUgez99CiAqLwpjb25zdCBPVkVSTEFZX0tFWUJPQVJEX0RJU1BBVENIRVJfUFJPVklERVIgPSB7CiAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIgYXZhaWxhYmxlLCB1c2UgdGhhdC4KICAgIC8vIE90aGVyd2lzZSwgcHJvdmlkZSBhIG5ldyBvbmUuCiAgICBwcm92aWRlOiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyLAogICAgZGVwczogWwogICAgICAgIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXJdLAogICAgICAgICgvKiogQHR5cGUgez99ICovICgKICAgICAgICAvLyBDb2VyY2UgdG8gYEluamVjdGlvblRva2VuYCBzbyB0aGF0IHRoZSBgZGVwc2AgbWF0Y2ggdGhlICJzaGFwZSIKICAgICAgICAvLyBvZiB0aGUgdHlwZSBleHBlY3RlZCBieSBBbmd1bGFyCiAgICAgICAgRE9DVU1FTlQkMSkpCiAgICBdLAogICAgdXNlRmFjdG9yeTogT1ZFUkxBWV9LRVlCT0FSRF9ESVNQQVRDSEVSX1BST1ZJREVSX0ZBQ1RPUlkKfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9vdmVybGF5LWNvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogV2hldGhlciB3ZSdyZSBpbiBhIHRlc3RpbmcgZW52aXJvbm1lbnQuCiAqIFRPRE8oY3Jpc2JldG8pOiByZW1vdmUgdGhpcyBvbmNlIHdlIGhhdmUgYW4gb3ZlcmxheSB0ZXN0aW5nIG1vZHVsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBpc1Rlc3RFbnZpcm9ubWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICEhd2luZG93ICYmCiAgICAhISgoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5fX2thcm1hX18gfHwgKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuamFzbWluZSk7Ci8qKgogKiBDb250YWluZXIgaW5zaWRlIHdoaWNoIGFsbCBvdmVybGF5cyB3aWxsIHJlbmRlci4KICovCmNsYXNzIE92ZXJsYXlDb250YWluZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgKiBAcGFyYW0gez89fSBfcGxhdGZvcm0KICAgICAqLwogICAgY29uc3RydWN0b3IoZG9jdW1lbnQsIF9wbGF0Zm9ybSkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXJFbGVtZW50OwogICAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG92ZXJsYXkgY29udGFpbmVyIGVsZW1lbnQuIEl0IHdpbGwgbGF6aWx5CiAgICAgKiBjcmVhdGUgdGhlIGVsZW1lbnQgdGhlIGZpcnN0IHRpbWUgIGl0IGlzIGNhbGxlZCB0byBmYWNpbGl0YXRlIHVzaW5nCiAgICAgKiB0aGUgY29udGFpbmVyIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy4KICAgICAqIEByZXR1cm4gez99IHRoZSBjb250YWluZXIgZWxlbWVudAogICAgICovCiAgICBnZXRDb250YWluZXJFbGVtZW50KCkgewogICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyRWxlbWVudCkgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVDb250YWluZXIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZSB0aGUgb3ZlcmxheSBjb250YWluZXIgZWxlbWVudCwgd2hpY2ggaXMgc2ltcGx5IGEgZGl2CiAgICAgKiB3aXRoIHRoZSAnY2RrLW92ZXJsYXktY29udGFpbmVyJyBjbGFzcyBvbiB0aGUgZG9jdW1lbnQgYm9keS4KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jcmVhdGVDb250YWluZXIoKSB7CiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAgUmVtb3ZlIG51bGwgY2hlY2sgZm9yIGBfcGxhdGZvcm1gLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0Jyb3dzZXIgPSB0aGlzLl9wbGF0Zm9ybSA/IHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluZXJDbGFzcyA9ICdjZGstb3ZlcmxheS1jb250YWluZXInOwogICAgICAgIGlmIChpc0Jyb3dzZXIgfHwgaXNUZXN0RW52aXJvbm1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcHBvc2l0ZVBsYXRmb3JtQ29udGFpbmVycyA9IHRoaXMuX2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke2NvbnRhaW5lckNsYXNzfVtwbGF0Zm9ybT0ic2VydmVyIl0sIGAgKwogICAgICAgICAgICAgICAgYC4ke2NvbnRhaW5lckNsYXNzfVtwbGF0Zm9ybT0idGVzdCJdYCk7CiAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgb2xkIGNvbnRhaW5lcnMgZnJvbSB0aGUgb3Bwb3NpdGUgcGxhdGZvcm0uCiAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRyYW5zaXRpb25pbmcgZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3Bwb3NpdGVQbGF0Zm9ybUNvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChvcHBvc2l0ZVBsYXRmb3JtQ29udGFpbmVyc1tpXS5wYXJlbnROb2RlKSkucmVtb3ZlQ2hpbGQob3Bwb3NpdGVQbGF0Zm9ybUNvbnRhaW5lcnNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChjb250YWluZXJDbGFzcyk7CiAgICAgICAgLy8gQSBsb25nIHRpbWUgYWdvIHdlIGtlcHQgYWRkaW5nIG5ldyBvdmVybGF5IGNvbnRhaW5lcnMgd2hlbmV2ZXIgYSBuZXcgYXBwIHdhcyBpbnN0YW50aWF0ZWQsCiAgICAgICAgLy8gYnV0IGF0IHNvbWUgcG9pbnQgd2UgYWRkZWQgbG9naWMgd2hpY2ggY2xlYXJzIHRoZSBkdXBsaWNhdGUgb25lcyBpbiBvcmRlciB0byBhdm9pZCBsZWFrcy4KICAgICAgICAvLyBUaGUgbmV3IGxvZ2ljIHdhcyBhIGxpdHRsZSB0b28gYWdncmVzc2l2ZSBzaW5jZSBpdCB3YXMgYnJlYWtpbmcgc29tZSBsZWdpdGltYXRlIHVzZSBjYXNlcy4KICAgICAgICAvLyBUbyBtaXRpZ2F0ZSB0aGUgcHJvYmxlbSB3ZSBtYWRlIGl0IHNvIHRoYXQgb25seSBjb250YWluZXJzIGZyb20gYSBkaWZmZXJlbnQgcGxhdGZvcm0gYXJlCiAgICAgICAgLy8gY2xlYXJlZCwgYnV0IHRoZSBzaWRlLWVmZmVjdCB3YXMgdGhhdCBwZW9wbGUgc3RhcnRlZCBkZXBlbmRpbmcgb24gdGhlIG92ZXJseS1hZ2dyZXNzaXZlCiAgICAgICAgLy8gbG9naWMgdG8gY2xlYW4gdXAgdGhlaXIgdGVzdHMgZm9yIHRoZW0uIFVudGlsIHdlIGNhbiBpbnRyb2R1Y2UgYW4gb3ZlcmxheS1zcGVjaWZpYyB0ZXN0aW5nCiAgICAgICAgLy8gbW9kdWxlIHdoaWNoIGRvZXMgdGhlIGNsZWFudXAsIHdlIHRyeSB0byBkZXRlY3QgdGhhdCB3ZSdyZSBpbiBhIHRlc3QgZW52aXJvbm1lbnQgYW5kIHdlCiAgICAgICAgLy8gYWx3YXlzIGNsZWFyIHRoZSBjb250YWluZXIuIFNlZSAjMTcwMDYuCiAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IHJlbW92ZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBjaGVjayBvbmNlIHdlIGhhdmUgYW4gb3ZlcmxheSB0ZXN0aW5nIG1vZHVsZS4KICAgICAgICBpZiAoaXNUZXN0RW52aXJvbm1lbnQpIHsKICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgncGxhdGZvcm0nLCAndGVzdCcpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghaXNCcm93c2VyKSB7CiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3BsYXRmb3JtJywgJ3NlcnZlcicpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lcjsKICAgIH0KfQpPdmVybGF5Q29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gT3ZlcmxheUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBPdmVybGF5Q29udGFpbmVyKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpPdmVybGF5Q29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBPdmVybGF5Q29udGFpbmVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gT3ZlcmxheUNvbnRhaW5lcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IE92ZXJsYXlDb250YWluZXIoybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChQbGF0Zm9ybSkpOyB9LCB0b2tlbjogT3ZlcmxheUNvbnRhaW5lciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwovKioKICogXEBkb2NzLXByaXZhdGUgXEBkZXByZWNhdGVkIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAqIEBwYXJhbSB7P30gcGFyZW50Q29udGFpbmVyCiAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBPVkVSTEFZX0NPTlRBSU5FUl9QUk9WSURFUl9GQUNUT1JZKHBhcmVudENvbnRhaW5lciwgX2RvY3VtZW50KSB7CiAgICByZXR1cm4gcGFyZW50Q29udGFpbmVyIHx8IG5ldyBPdmVybGF5Q29udGFpbmVyKF9kb2N1bWVudCk7Cn0KLyoqCiAqIFxAZG9jcy1wcml2YXRlIFxAZGVwcmVjYXRlZCBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogKiBAdHlwZSB7P30KICovCmNvbnN0IE9WRVJMQVlfQ09OVEFJTkVSX1BST1ZJREVSID0gewogICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBPdmVybGF5Q29udGFpbmVyIGF2YWlsYWJsZSwgdXNlIHRoYXQuIE90aGVyd2lzZSwgcHJvdmlkZSBhIG5ldyBvbmUuCiAgICBwcm92aWRlOiBPdmVybGF5Q29udGFpbmVyLAogICAgZGVwczogWwogICAgICAgIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE92ZXJsYXlDb250YWluZXJdLAogICAgICAgICgvKiogQHR5cGUgez99ICovIChET0NVTUVOVCQxKSkKICAgIF0sCiAgICB1c2VGYWN0b3J5OiBPVkVSTEFZX0NPTlRBSU5FUl9QUk9WSURFUl9GQUNUT1JZCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS1yZWYudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJlZmVyZW5jZSB0byBhbiBvdmVybGF5IHRoYXQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBPdmVybGF5IHNlcnZpY2UuCiAqIFVzZWQgdG8gbWFuaXB1bGF0ZSBvciBkaXNwb3NlIG9mIHNhaWQgb3ZlcmxheS4KICovCmNsYXNzIE92ZXJsYXlSZWYgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9wb3J0YWxPdXRsZXQKICAgICAqIEBwYXJhbSB7P30gX2hvc3QKICAgICAqIEBwYXJhbSB7P30gX3BhbmUKICAgICAqIEBwYXJhbSB7P30gX2NvbmZpZwogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez99IF9rZXlib2FyZERpc3BhdGNoZXIKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKiBAcGFyYW0gez89fSBfbG9jYXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IoX3BvcnRhbE91dGxldCwgX2hvc3QsIF9wYW5lLCBfY29uZmlnLCBfbmdab25lLCBfa2V5Ym9hcmREaXNwYXRjaGVyLCBfZG9jdW1lbnQsIF9sb2NhdGlvbikgewogICAgICAgIHRoaXMuX3BvcnRhbE91dGxldCA9IF9wb3J0YWxPdXRsZXQ7CiAgICAgICAgdGhpcy5faG9zdCA9IF9ob3N0OwogICAgICAgIHRoaXMuX3BhbmUgPSBfcGFuZTsKICAgICAgICB0aGlzLl9jb25maWcgPSBfY29uZmlnOwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyID0gX2tleWJvYXJkRGlzcGF0Y2hlcjsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgICAgICB0aGlzLl9sb2NhdGlvbiA9IF9sb2NhdGlvbjsKICAgICAgICB0aGlzLl9iYWNrZHJvcEVsZW1lbnQgPSBudWxsOwogICAgICAgIHRoaXMuX2JhY2tkcm9wQ2xpY2sgPSBuZXcgU3ViamVjdCgpOwogICAgICAgIHRoaXMuX2F0dGFjaG1lbnRzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB0aGlzLl9kZXRhY2htZW50cyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgdGhpcy5fbG9jYXRpb25DaGFuZ2VzID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIHRoaXMuX2JhY2tkcm9wQ2xpY2tIYW5kbGVyID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldmVudCkgPT4gdGhpcy5fYmFja2Ryb3BDbGljay5uZXh0KGV2ZW50KSk7CiAgICAgICAgdGhpcy5fa2V5ZG93bkV2ZW50c09ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvYnNlcnZlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG9ic2VydmVyKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fa2V5ZG93bkV2ZW50cy5zdWJzY3JpYmUob2JzZXJ2ZXIpOwogICAgICAgICAgICB0aGlzLl9rZXlkb3duRXZlbnRTdWJzY3JpcHRpb25zKys7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2tleWRvd25FdmVudFN1YnNjcmlwdGlvbnMtLTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgICAgIC8qKgogICAgICAgICAqIFN0cmVhbSBvZiBrZXlkb3duIGV2ZW50cyBkaXNwYXRjaGVkIHRvIHRoaXMgb3ZlcmxheS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9rZXlkb3duRXZlbnRzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBBbW91bnQgb2Ygc3Vic2NyaXB0aW9ucyB0byB0aGUga2V5ZG93biBldmVudHMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fa2V5ZG93bkV2ZW50U3Vic2NyaXB0aW9ucyA9IDA7CiAgICAgICAgaWYgKF9jb25maWcuc2Nyb2xsU3RyYXRlZ3kpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kgPSBfY29uZmlnLnNjcm9sbFN0cmF0ZWd5OwogICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5hdHRhY2godGhpcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kgPSBfY29uZmlnLnBvc2l0aW9uU3RyYXRlZ3k7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBvdmVybGF5J3MgSFRNTCBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb3ZlcmxheUVsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhbmU7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBvdmVybGF5J3MgYmFja2Ryb3AgSFRNTCBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGJhY2tkcm9wRWxlbWVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBXcmFwcGVyIGFyb3VuZCB0aGUgcGFuZWwgZWxlbWVudC4gQ2FuIGJlIHVzZWQgZm9yIGFkdmFuY2VkCiAgICAgKiBwb3NpdGlvbmluZyB3aGVyZSBhIHdyYXBwZXIgd2l0aCBzcGVjaWZpYyBzdHlsaW5nIGlzCiAgICAgKiByZXF1aXJlZCBhcm91bmQgdGhlIG92ZXJsYXkgcGFuZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBob3N0RWxlbWVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faG9zdDsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgY29udGVudCwgZ2l2ZW4gdmlhIGEgUG9ydGFsLCB0byB0aGUgb3ZlcmxheS4KICAgICAqIElmIHRoZSBvdmVybGF5IGlzIGNvbmZpZ3VyZWQgdG8gaGF2ZSBhIGJhY2tkcm9wLCBpdCB3aWxsIGJlIGNyZWF0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBwb3J0YWwgUG9ydGFsIGluc3RhbmNlIHRvIHdoaWNoIHRvIGF0dGFjaCB0aGUgb3ZlcmxheS4KICAgICAqIEByZXR1cm4gez99IFRoZSBwb3J0YWwgYXR0YWNobWVudCByZXN1bHQuCiAgICAgKi8KICAgIGF0dGFjaChwb3J0YWwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGF0dGFjaFJlc3VsdCA9IHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2gocG9ydGFsKTsKICAgICAgICAvLyBVcGRhdGUgdGhlIHBhbmUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgogICAgICAgIGlmICghdGhpcy5faG9zdC5wYXJlbnRFbGVtZW50ICYmIHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudCkgewogICAgICAgICAgICB0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5faG9zdCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9wb3NpdGlvblN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXR0YWNoKHRoaXMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91cGRhdGVTdGFja2luZ09yZGVyKCk7CiAgICAgICAgdGhpcy5fdXBkYXRlRWxlbWVudFNpemUoKTsKICAgICAgICB0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCk7CiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpOwogICAgICAgIH0KICAgICAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9uY2UgdGhlIHpvbmUgaXMgc3RhYmxlIHNvIHRoYXQgdGhlIG92ZXJsYXkgd2lsbCBiZSBmdWxseSByZW5kZXJlZAogICAgICAgIC8vIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHBvc2l0aW9uIGl0LCBhcyB0aGUgcG9zaXRpb24gbWF5IGRlcGVuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgcmVuZGVyZWQKICAgICAgICAvLyBjb250ZW50LgogICAgICAgIHRoaXMuX25nWm9uZS5vblN0YWJsZQogICAgICAgICAgICAuYXNPYnNlcnZhYmxlKCkKICAgICAgICAgICAgLnBpcGUodGFrZSgxKSkKICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIFRoZSBvdmVybGF5IGNvdWxkJ3ZlIGJlZW4gZGV0YWNoZWQgYmVmb3JlIHRoZSB6b25lIGhhcyBzdGFiaWxpemVkLgogICAgICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgLy8gRW5hYmxlIHBvaW50ZXIgZXZlbnRzIGZvciB0aGUgb3ZlcmxheSBwYW5lIGVsZW1lbnQuCiAgICAgICAgdGhpcy5fdG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTsKICAgICAgICBpZiAodGhpcy5fY29uZmlnLmhhc0JhY2tkcm9wKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaEJhY2tkcm9wKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9jb25maWcucGFuZWxDbGFzcykgewogICAgICAgICAgICB0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsIHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgLy8gT25seSBlbWl0IHRoZSBgYXR0YWNobWVudHNgIGV2ZW50IG9uY2UgYWxsIG90aGVyIHNldHVwIGlzIGRvbmUuCiAgICAgICAgdGhpcy5fYXR0YWNobWVudHMubmV4dCgpOwogICAgICAgIC8vIFRyYWNrIHRoaXMgb3ZlcmxheSBieSB0aGUga2V5Ym9hcmQgZGlzcGF0Y2hlcgogICAgICAgIHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlci5hZGQodGhpcyk7CiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCByZW1vdmUgdGhlIG51bGwgY2hlY2sgZm9yIGBfbG9jYXRpb25gCiAgICAgICAgLy8gb25jZSB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIGlzIG1hZGUgcmVxdWlyZWQuCiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kaXNwb3NlT25OYXZpZ2F0aW9uICYmIHRoaXMuX2xvY2F0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX2xvY2F0aW9uQ2hhbmdlcyA9IHRoaXMuX2xvY2F0aW9uLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLmRpc3Bvc2UoKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXR0YWNoUmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyBhbiBvdmVybGF5IGZyb20gYSBwb3J0YWwuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcG9ydGFsIGRldGFjaG1lbnQgcmVzdWx0LgogICAgICovCiAgICBkZXRhY2goKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmRldGFjaEJhY2tkcm9wKCk7CiAgICAgICAgLy8gV2hlbiB0aGUgb3ZlcmxheSBpcyBkZXRhY2hlZCwgdGhlIHBhbmUgZWxlbWVudCBzaG91bGQgZGlzYWJsZSBwb2ludGVyIGV2ZW50cy4KICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgcGFuZSBlbGVtZW50IHdpbGwgY292ZXIgdGhlIHBhZ2UgYW5kIGRpc2FibGUKICAgICAgICAvLyBwb2ludGVyIGV2ZW50cyB0aGVyZWZvcmUuIERlcGVuZHMgb24gdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IGFuZCB0aGUgYXBwbGllZCBwYW5lIGJvdW5kYXJpZXMuCiAgICAgICAgdGhpcy5fdG9nZ2xlUG9pbnRlckV2ZW50cyhmYWxzZSk7CiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kgJiYgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kZXRhY2gpIHsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kZXRhY2goKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmRpc2FibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRldGFjaG1lbnRSZXN1bHQgPSB0aGlzLl9wb3J0YWxPdXRsZXQuZGV0YWNoKCk7CiAgICAgICAgLy8gT25seSBlbWl0IGFmdGVyIGV2ZXJ5dGhpbmcgaXMgZGV0YWNoZWQuCiAgICAgICAgdGhpcy5fZGV0YWNobWVudHMubmV4dCgpOwogICAgICAgIC8vIFJlbW92ZSB0aGlzIG92ZXJsYXkgZnJvbSBrZXlib2FyZCBkaXNwYXRjaGVyIHRyYWNraW5nLgogICAgICAgIHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlci5yZW1vdmUodGhpcyk7CiAgICAgICAgLy8gS2VlcGluZyB0aGUgaG9zdCBlbGVtZW50IGluIHRoZSBET00gY2FuIGNhdXNlIHNjcm9sbCBqYW5rLCBiZWNhdXNlIGl0IHN0aWxsIGdldHMKICAgICAgICAvLyByZW5kZXJlZCwgZXZlbiB0aG91Z2ggaXQncyB0cmFuc3BhcmVudCBhbmQgdW5jbGlja2FibGUgd2hpY2ggaXMgd2h5IHdlIHJlbW92ZSBpdC4KICAgICAgICB0aGlzLl9kZXRhY2hDb250ZW50V2hlblN0YWJsZSgpOwogICAgICAgIC8vIFN0b3AgbGlzdGVuaW5nIGZvciBsb2NhdGlvbiBjaGFuZ2VzLgogICAgICAgIHRoaXMuX2xvY2F0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpOwogICAgICAgIHJldHVybiBkZXRhY2htZW50UmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhbnMgdXAgdGhlIG92ZXJsYXkgZnJvbSB0aGUgRE9NLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzcG9zZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBdHRhY2hlZCA9IHRoaXMuaGFzQXR0YWNoZWQoKTsKICAgICAgICBpZiAodGhpcy5fcG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCk7CiAgICAgICAgdGhpcy5kZXRhY2hCYWNrZHJvcCgpOwogICAgICAgIHRoaXMuX2xvY2F0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlci5yZW1vdmUodGhpcyk7CiAgICAgICAgdGhpcy5fcG9ydGFsT3V0bGV0LmRpc3Bvc2UoKTsKICAgICAgICB0aGlzLl9hdHRhY2htZW50cy5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMuX2JhY2tkcm9wQ2xpY2suY29tcGxldGUoKTsKICAgICAgICB0aGlzLl9rZXlkb3duRXZlbnRzLmNvbXBsZXRlKCk7CiAgICAgICAgaWYgKHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHRoaXMuX2hvc3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9ob3N0KTsKICAgICAgICAgICAgdGhpcy5faG9zdCA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudCA9IHRoaXMuX3BhbmUgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIGlmIChpc0F0dGFjaGVkKSB7CiAgICAgICAgICAgIHRoaXMuX2RldGFjaG1lbnRzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGV0YWNobWVudHMuY29tcGxldGUoKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBoYXMgYXR0YWNoZWQgY29udGVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhc0F0dGFjaGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgYmFja2Ryb3AgaGFzIGJlZW4gY2xpY2tlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJhY2tkcm9wQ2xpY2soKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2tkcm9wQ2xpY2suYXNPYnNlcnZhYmxlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIG92ZXJsYXkgaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2htZW50cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNobWVudHMuYXNPYnNlcnZhYmxlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIG92ZXJsYXkgaGFzIGJlZW4gZGV0YWNoZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2htZW50cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGV0YWNobWVudHMuYXNPYnNlcnZhYmxlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSBvZiBrZXlkb3duIGV2ZW50cyB0YXJnZXRlZCB0byB0aGlzIG92ZXJsYXkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBrZXlkb3duRXZlbnRzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9rZXlkb3duRXZlbnRzT2JzZXJ2YWJsZTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgY3VycmVudCBvdmVybGF5IGNvbmZpZ3VyYXRpb24sIHdoaWNoIGlzIGltbXV0YWJsZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldENvbmZpZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3ZlcmxheSBiYXNlZCBvbiB0aGUgcG9zaXRpb24gc3RyYXRlZ3kuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cGRhdGVQb3NpdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fcG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmFwcGx5KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTd2l0Y2hlcyB0byBhIG5ldyBwb3NpdGlvbiBzdHJhdGVneSBhbmQgdXBkYXRlcyB0aGUgb3ZlcmxheSBwb3NpdGlvbi4KICAgICAqIEBwYXJhbSB7P30gc3RyYXRlZ3kKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3koc3RyYXRlZ3kpIHsKICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fcG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneSA9IHN0cmF0ZWd5OwogICAgICAgIGlmICh0aGlzLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgc3RyYXRlZ3kuYXR0YWNoKHRoaXMpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgdGhlIHNpemUgcHJvcGVydGllcyBvZiB0aGUgb3ZlcmxheS4KICAgICAqIEBwYXJhbSB7P30gc2l6ZUNvbmZpZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdXBkYXRlU2l6ZShzaXplQ29uZmlnKSB7CiAgICAgICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcpLCBzaXplQ29uZmlnKTsKICAgICAgICB0aGlzLl91cGRhdGVFbGVtZW50U2l6ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBMVFIvUlRMIGRpcmVjdGlvbiBmb3IgdGhlIG92ZXJsYXkuCiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlyZWN0aW9uKGRpcikgewogICAgICAgIHRoaXMuX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29uZmlnKSwgeyBkaXJlY3Rpb246IGRpciB9KTsKICAgICAgICB0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIHRvIHRoZSBvdmVybGF5IHBhbmUuCiAgICAgKiBAcGFyYW0gez99IGNsYXNzZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFBhbmVsQ2xhc3MoY2xhc3NlcykgewogICAgICAgIGlmICh0aGlzLl9wYW5lKSB7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fcGFuZSwgY2xhc3NlcywgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgYSBDU1MgY2xhc3Mgb3IgYW4gYXJyYXkgb2YgY2xhc3NlcyBmcm9tIHRoZSBvdmVybGF5IHBhbmUuCiAgICAgKiBAcGFyYW0gez99IGNsYXNzZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZVBhbmVsQ2xhc3MoY2xhc3NlcykgewogICAgICAgIGlmICh0aGlzLl9wYW5lKSB7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fcGFuZSwgY2xhc3NlcywgZmFsc2UpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGF5b3V0IGRpcmVjdGlvbiBvZiB0aGUgb3ZlcmxheSBwYW5lbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldERpcmVjdGlvbigpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5fY29uZmlnLmRpcmVjdGlvbjsKICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICByZXR1cm4gJ2x0cic7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlb2YgZGlyZWN0aW9uID09PSAnc3RyaW5nJyA/IGRpcmVjdGlvbiA6IGRpcmVjdGlvbi52YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogU3dpdGNoZXMgdG8gYSBuZXcgc2Nyb2xsIHN0cmF0ZWd5LgogICAgICogQHBhcmFtIHs/fSBzdHJhdGVneQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdXBkYXRlU2Nyb2xsU3RyYXRlZ3koc3RyYXRlZ3kpIHsKICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IHRoaXMuX3Njcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCk7CiAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kgPSBzdHJhdGVneTsKICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgIHN0cmF0ZWd5LmF0dGFjaCh0aGlzKTsKICAgICAgICAgICAgc3RyYXRlZ3kuZW5hYmxlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiB0aGUgb3ZlcmxheSBwYW5lbC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlRWxlbWVudERpcmVjdGlvbigpIHsKICAgICAgICB0aGlzLl9ob3N0LnNldEF0dHJpYnV0ZSgnZGlyJywgdGhpcy5nZXREaXJlY3Rpb24oKSk7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhlIG92ZXJsYXkgZWxlbWVudCBiYXNlZCBvbiB0aGUgb3ZlcmxheSBjb25maWcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZUVsZW1lbnRTaXplKCkgewogICAgICAgIGlmICghdGhpcy5fcGFuZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMuX3BhbmUuc3R5bGU7CiAgICAgICAgc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMuX2NvbmZpZy53aWR0aCk7CiAgICAgICAgc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLl9jb25maWcuaGVpZ2h0KTsKICAgICAgICBzdHlsZS5taW5XaWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy5fY29uZmlnLm1pbldpZHRoKTsKICAgICAgICBzdHlsZS5taW5IZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMuX2NvbmZpZy5taW5IZWlnaHQpOwogICAgICAgIHN0eWxlLm1heFdpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLl9jb25maWcubWF4V2lkdGgpOwogICAgICAgIHN0eWxlLm1heEhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy5fY29uZmlnLm1heEhlaWdodCk7CiAgICB9CiAgICAvKioKICAgICAqIFRvZ2dsZXMgdGhlIHBvaW50ZXIgZXZlbnRzIGZvciB0aGUgb3ZlcmxheSBwYW5lIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbmFibGVQb2ludGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdG9nZ2xlUG9pbnRlckV2ZW50cyhlbmFibGVQb2ludGVyKSB7CiAgICAgICAgdGhpcy5fcGFuZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gZW5hYmxlUG9pbnRlciA/ICdhdXRvJyA6ICdub25lJzsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgYSBiYWNrZHJvcCBmb3IgdGhpcyBvdmVybGF5LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hdHRhY2hCYWNrZHJvcCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2hvd2luZ0NsYXNzID0gJ2Nkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcnOwogICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZGstb3ZlcmxheS1iYWNrZHJvcCcpOwogICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcykgewogICAgICAgICAgICB0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX2JhY2tkcm9wRWxlbWVudCwgdGhpcy5fY29uZmlnLmJhY2tkcm9wQ2xhc3MsIHRydWUpOwogICAgICAgIH0KICAgICAgICAvLyBJbnNlcnQgdGhlIGJhY2tkcm9wIGJlZm9yZSB0aGUgcGFuZSBpbiB0aGUgRE9NIG9yZGVyLAogICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBzdGFja2VkIG92ZXJsYXlzIHByb3Blcmx5LgogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQpKS5pbnNlcnRCZWZvcmUodGhpcy5fYmFja2Ryb3BFbGVtZW50LCB0aGlzLl9ob3N0KTsKICAgICAgICAvLyBGb3J3YXJkIGJhY2tkcm9wIGNsaWNrcyBzdWNoIHRoYXQgdGhlIGNvbnN1bWVyIG9mIHRoZSBvdmVybGF5IGNhbiBwZXJmb3JtIHdoYXRldmVyCiAgICAgICAgLy8gYWN0aW9uIGRlc2lyZWQgd2hlbiBzdWNoIGEgY2xpY2sgb2NjdXJzICh1c3VhbGx5IGNsb3NpbmcgdGhlIG92ZXJsYXkpLgogICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JhY2tkcm9wQ2xpY2tIYW5kbGVyKTsKICAgICAgICAvLyBBZGQgY2xhc3MgdG8gZmFkZS1pbiB0aGUgYmFja2Ryb3AgYWZ0ZXIgb25lIGZyYW1lLgogICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYmFja2Ryb3BFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudC5jbGFzc0xpc3QuYWRkKHNob3dpbmdDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9iYWNrZHJvcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChzaG93aW5nQ2xhc3MpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgc3RhY2tpbmcgb3JkZXIgb2YgdGhlIGVsZW1lbnQsIG1vdmluZyBpdCB0byB0aGUgdG9wIGlmIG5lY2Vzc2FyeS4KICAgICAqIFRoaXMgaXMgcmVxdWlyZWQgaW4gY2FzZXMgd2hlcmUgb25lIG92ZXJsYXkgd2FzIGRldGFjaGVkLCB3aGlsZSBhbm90aGVyIG9uZSwKICAgICAqIHRoYXQgc2hvdWxkIGJlIGJlaGluZCBpdCwgd2FzIGRlc3Ryb3llZC4gVGhlIG5leHQgdGltZSBib3RoIG9mIHRoZW0gYXJlIG9wZW5lZCwKICAgICAqIHRoZSBzdGFja2luZyB3aWxsIGJlIHdyb25nLCBiZWNhdXNlIHRoZSBkZXRhY2hlZCBlbGVtZW50J3MgcGFuZSB3aWxsIHN0aWxsIGJlCiAgICAgKiBpbiBpdHMgb3JpZ2luYWwgRE9NIHBvc2l0aW9uLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVTdGFja2luZ09yZGVyKCkgewogICAgICAgIGlmICh0aGlzLl9ob3N0Lm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9ob3N0LnBhcmVudE5vZGUpKS5hcHBlbmRDaGlsZCh0aGlzLl9ob3N0KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERldGFjaGVzIHRoZSBiYWNrZHJvcCAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhlIG92ZXJsYXkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2hCYWNrZHJvcCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGJhY2tkcm9wVG9EZXRhY2ggPSB0aGlzLl9iYWNrZHJvcEVsZW1lbnQ7CiAgICAgICAgaWYgKCFiYWNrZHJvcFRvRGV0YWNoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0aW1lb3V0SWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmaW5pc2hEZXRhY2ggPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIEl0IG1heSBub3QgYmUgYXR0YWNoZWQgdG8gYW55dGhpbmcgaW4gY2VydGFpbiBjYXNlcyAoZS5nLiB1bml0IHRlc3RzKS4KICAgICAgICAgICAgaWYgKGJhY2tkcm9wVG9EZXRhY2gpIHsKICAgICAgICAgICAgICAgIGJhY2tkcm9wVG9EZXRhY2gucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9iYWNrZHJvcENsaWNrSGFuZGxlcik7CiAgICAgICAgICAgICAgICBiYWNrZHJvcFRvRGV0YWNoLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBmaW5pc2hEZXRhY2gpOwogICAgICAgICAgICAgICAgaWYgKGJhY2tkcm9wVG9EZXRhY2gucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgICAgIGJhY2tkcm9wVG9EZXRhY2gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZHJvcFRvRGV0YWNoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgbmV3IHBvcnRhbCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGlzIG92ZXJsYXkgc2luY2Ugd2Ugc3RhcnRlZAogICAgICAgICAgICAvLyByZW1vdmluZyB0aGUgYmFja2Ryb3AuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG9ubHkgY2xlYXIgdGhlIGJhY2tkcm9wIHJlZmVyZW5jZSBpZiBpdAogICAgICAgICAgICAvLyBpcyBzdGlsbCB0aGUgc2FtZSBpbnN0YW5jZSB0aGF0IHdlIHN0YXJ0ZWQgdG8gcmVtb3ZlLgogICAgICAgICAgICBpZiAodGhpcy5fYmFja2Ryb3BFbGVtZW50ID09IGJhY2tkcm9wVG9EZXRhY2gpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90b2dnbGVDbGFzc2VzKCgvKiogQHR5cGUgez99ICovIChiYWNrZHJvcFRvRGV0YWNoKSksIHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgfSk7CiAgICAgICAgYmFja2Ryb3BUb0RldGFjaC5jbGFzc0xpc3QucmVtb3ZlKCdjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nJyk7CiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGJhY2tkcm9wVG9EZXRhY2gpKS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmluaXNoRGV0YWNoKTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gSWYgdGhlIGJhY2tkcm9wIGRvZXNuJ3QgaGF2ZSBhIHRyYW5zaXRpb24sIHRoZSBgdHJhbnNpdGlvbmVuZGAgZXZlbnQgd29uJ3QgZmlyZS4KICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgbWFrZSBpdCB1bmNsaWNrYWJsZSBhbmQgd2UgdHJ5IHRvIHJlbW92ZSBpdCBhZnRlciBhIGRlbGF5LgogICAgICAgIGJhY2tkcm9wVG9EZXRhY2guc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsKICAgICAgICAvLyBSdW4gdGhpcyBvdXRzaWRlIHRoZSBBbmd1bGFyIHpvbmUgYmVjYXVzZSB0aGVyZSdzIG5vdGhpbmcgdGhhdCBBbmd1bGFyIGNhcmVzIGFib3V0LgogICAgICAgIC8vIElmIGl0IHdlcmUgdG8gcnVuIGluc2lkZSB0aGUgQW5ndWxhciB6b25lLCBldmVyeSB0ZXN0IHRoYXQgdXNlZCBPdmVybGF5IHdvdWxkIGhhdmUgdG8gYmUKICAgICAgICAvLyBlaXRoZXIgYXN5bmMgb3IgZmFrZUFzeW5jLgogICAgICAgIHRpbWVvdXRJZCA9IHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBzZXRUaW1lb3V0KGZpbmlzaERldGFjaCwgNTAwKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBUb2dnbGVzIGEgc2luZ2xlIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIG9uIGFuIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGNzc0NsYXNzZXMKICAgICAqIEBwYXJhbSB7P30gaXNBZGQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90b2dnbGVDbGFzc2VzKGVsZW1lbnQsIGNzc0NsYXNzZXMsIGlzQWRkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0OwogICAgICAgIGNvZXJjZUFycmF5KGNzc0NsYXNzZXMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY3NzQ2xhc3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNzc0NsYXNzID0+IHsKICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZG8gYSBzcHJlYWQgaGVyZSwgYmVjYXVzZSBJRSBkb2Vzbid0IHN1cHBvcnQgc2V0dGluZyBtdWx0aXBsZSBjbGFzc2VzLgogICAgICAgICAgICAvLyBBbHNvIHRyeWluZyB0byBhZGQgYW4gZW1wdHkgc3RyaW5nIHRvIGEgRE9NVG9rZW5MaXN0IHdpbGwgdGhyb3cuCiAgICAgICAgICAgIGlmIChjc3NDbGFzcykgewogICAgICAgICAgICAgICAgaXNBZGQgPyBjbGFzc0xpc3QuYWRkKGNzc0NsYXNzKSA6IGNsYXNzTGlzdC5yZW1vdmUoY3NzQ2xhc3MpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyB0aGUgb3ZlcmxheSBjb250ZW50IG5leHQgdGltZSB0aGUgem9uZSBzdGFiaWxpemVzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9kZXRhY2hDb250ZW50V2hlblN0YWJsZSgpIHsKICAgICAgICAvLyBOb3JtYWxseSB3ZSB3b3VsZG4ndCBoYXZlIHRvIGV4cGxpY2l0bHkgcnVuIHRoaXMgb3V0c2lkZSB0aGUgYE5nWm9uZWAsIGhvd2V2ZXIKICAgICAgICAvLyBpZiB0aGUgY29uc3VtZXIgaXMgdXNpbmcgYHpvbmUtcGF0Y2gtcnhqc2AsIHRoZSBgU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlYCBjYWxsIHdpbGwKICAgICAgICAvLyBiZSBwYXRjaGVkIHRvIHJ1biBpbnNpZGUgdGhlIHpvbmUsIHdoaWNoIHdpbGwgdGhyb3cgdXMgaW50byBhbiBpbmZpbml0ZSBsb29wLgogICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIFdlIGNhbid0IHJlbW92ZSB0aGUgaG9zdCBoZXJlIGltbWVkaWF0ZWx5LCBiZWNhdXNlIHRoZSBvdmVybGF5IHBhbmUncyBjb250ZW50CiAgICAgICAgICAgIC8vIG1pZ2h0IHN0aWxsIGJlIGFuaW1hdGluZy4gVGhpcyBzdHJlYW0gaGVscHMgdXMgYXZvaWQgaW50ZXJydXB0aW5nIHRoZSBhbmltYXRpb24KICAgICAgICAgICAgLy8gYnkgd2FpdGluZyBmb3IgdGhlIHBhbmUgdG8gYmVjb21lIGVtcHR5LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX25nWm9uZS5vblN0YWJsZQogICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5fYXR0YWNobWVudHMsIHRoaXMuX2RldGFjaG1lbnRzKSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIE5lZWRzIGEgY291cGxlIG9mIGNoZWNrcyBmb3IgdGhlIHBhbmUgYW5kIGhvc3QsIGJlY2F1c2UKICAgICAgICAgICAgICAgIC8vIHRoZXkgbWF5IGhhdmUgYmVlbiByZW1vdmVkIGJ5IHRoZSB0aW1lIHRoZSB6b25lIHN0YWJpbGl6ZXMuCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3BhbmUgfHwgIXRoaXMuX2hvc3QgfHwgdGhpcy5fcGFuZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFuZSAmJiB0aGlzLl9jb25maWcucGFuZWxDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsIHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQgPSB0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9ob3N0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIERpc3Bvc2VzIG9mIGEgc2Nyb2xsIHN0cmF0ZWd5LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9kaXNwb3NlU2Nyb2xsU3RyYXRlZ3koKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5fc2Nyb2xsU3RyYXRlZ3k7CiAgICAgICAgaWYgKHNjcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5LmRpc2FibGUoKTsKICAgICAgICAgICAgaWYgKHNjcm9sbFN0cmF0ZWd5LmRldGFjaCkgewogICAgICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3kuZGV0YWNoKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9wb3NpdGlvbi9mbGV4aWJsZS1jb25uZWN0ZWQtcG9zaXRpb24tc3RyYXRlZ3kudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gVE9ETzogcmVmYWN0b3IgY2xpcHBpbmcgZGV0ZWN0aW9uIGludG8gYSBzZXBhcmF0ZSB0aGluZyAocGFydCBvZiBzY3JvbGxpbmcgbW9kdWxlKQovLyBUT0RPOiBkb2Vzbid0IGhhbmRsZSBib3RoIGZsZXhpYmxlIHdpZHRoIGFuZCBoZWlnaHQgd2hlbiBpdCBoYXMgdG8gc2Nyb2xsIGFsb25nIGJvdGggYXhpcy4KLyoqCiAqIENsYXNzIHRvIGJlIGFkZGVkIHRvIHRoZSBvdmVybGF5IGJvdW5kaW5nIGJveC4KICogQHR5cGUgez99CiAqLwpjb25zdCBib3VuZGluZ0JveENsYXNzID0gJ2Nkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3gnOwovKioKICogUmVnZXggdXNlZCB0byBzcGxpdCBhIHN0cmluZyBvbiBpdHMgQ1NTIHVuaXRzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IGNzc1VuaXRQYXR0ZXJuID0gLyhbQS1aYS16JV0rKSQvOwovKioKICogQSBzdHJhdGVneSBmb3IgcG9zaXRpb25pbmcgb3ZlcmxheXMuIFVzaW5nIHRoaXMgc3RyYXRlZ3ksIGFuIG92ZXJsYXkgaXMgZ2l2ZW4gYW4KICogaW1wbGljaXQgcG9zaXRpb24gcmVsYXRpdmUgc29tZSBvcmlnaW4gZWxlbWVudC4gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIGlzIGRlZmluZWQgaW4gdGVybXMgb2YKICogYSBwb2ludCBvbiB0aGUgb3JpZ2luIGVsZW1lbnQgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYSBwb2ludCBvbiB0aGUgb3ZlcmxheSBlbGVtZW50LiBGb3IgZXhhbXBsZSwKICogYSBiYXNpYyBkcm9wZG93biBpcyBjb25uZWN0aW5nIHRoZSBib3R0b20tbGVmdCBjb3JuZXIgb2YgdGhlIG9yaWdpbiB0byB0aGUgdG9wLWxlZnQgY29ybmVyCiAqIG9mIHRoZSBvdmVybGF5LgogKi8KY2xhc3MgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb25uZWN0ZWRUbwogICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgKiBAcGFyYW0gez99IF9vdmVybGF5Q29udGFpbmVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGNvbm5lY3RlZFRvLCBfdmlld3BvcnRSdWxlciwgX2RvY3VtZW50LCBfcGxhdGZvcm0sIF9vdmVybGF5Q29udGFpbmVyKSB7CiAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIHRoaXMuX292ZXJsYXlDb250YWluZXIgPSBfb3ZlcmxheUNvbnRhaW5lcjsKICAgICAgICAvKioKICAgICAgICAgKiBMYXN0IHNpemUgdXNlZCBmb3IgdGhlIGJvdW5kaW5nIGJveC4gVXNlZCB0byBhdm9pZCByZXNpemluZyB0aGUgb3ZlcmxheSBhZnRlciBvcGVuLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5IHdhcyBwdXNoZWQgaW4gYSBwcmV2aW91cyBwb3NpdGlvbmluZy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc1B1c2hlZCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgY2FuIGJlIHB1c2hlZCBvbi1zY3JlZW4gb24gdGhlIGluaXRpYWwgb3Blbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9jYW5QdXNoID0gdHJ1ZTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5IGNhbiBncm93IHZpYSBmbGV4aWJsZSB3aWR0aC9oZWlnaHQgYWZ0ZXIgdGhlIGluaXRpYWwgb3Blbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9ncm93QWZ0ZXJPcGVuID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSdzIHdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlIGNvbnN0cmFpbmVkIHRvIGZpdCB3aXRoaW4gdGhlIHZpZXdwb3J0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBwb3NpdGlvbiBpcyBsb2NrZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcG9zaXRpb25Mb2NrZWQgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBBbW91bnQgb2Ygc3BhY2UgdGhhdCBtdXN0IGJlIG1haW50YWluZWQgYmV0d2VlbiB0aGUgb3ZlcmxheSBhbmQgdGhlIGVkZ2Ugb2YgdGhlIHZpZXdwb3J0LgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3ZpZXdwb3J0TWFyZ2luID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgU2Nyb2xsYWJsZSBjb250YWluZXJzIHVzZWQgdG8gY2hlY2sgc2Nyb2xsYWJsZSB2aWV3IHByb3BlcnRpZXMgb24gcG9zaXRpb24gY2hhbmdlLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3Njcm9sbGFibGVzID0gW107CiAgICAgICAgLyoqCiAgICAgICAgICogT3JkZXJlZCBsaXN0IG9mIHByZWZlcnJlZCBwb3NpdGlvbnMsIGZyb20gbW9zdCB0byBsZWFzdCBkZXNpcmFibGUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zID0gW107CiAgICAgICAgLyoqCiAgICAgICAgICogU3ViamVjdCB0aGF0IGVtaXRzIHdoZW5ldmVyIHRoZSBwb3NpdGlvbiBjaGFuZ2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIHZpZXdwb3J0IHNpemUgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9yZXNpemVTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBvZmZzZXQgZm9yIHRoZSBvdmVybGF5IGFsb25nIHRoZSB4IGF4aXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb2Zmc2V0WCA9IDA7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBvZmZzZXQgZm9yIHRoZSBvdmVybGF5IGFsb25nIHRoZSB5IGF4aXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7CiAgICAgICAgLyoqCiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIENTUyBjbGFzc2VzIHRoYXQgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IGhhcyBhcHBsaWVkIG9uIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBPYnNlcnZhYmxlIHNlcXVlbmNlIG9mIHBvc2l0aW9uIGNoYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5wb3NpdGlvbkNoYW5nZXMgPSB0aGlzLl9wb3NpdGlvbkNoYW5nZXMuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgdGhpcy5zZXRPcmlnaW4oY29ubmVjdGVkVG8pOwogICAgfQogICAgLyoqCiAgICAgKiBPcmRlcmVkIGxpc3Qgb2YgcHJlZmVycmVkIHBvc2l0aW9ucywgZnJvbSBtb3N0IHRvIGxlYXN0IGRlc2lyYWJsZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwb3NpdGlvbnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uczsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgdGhpcyBwb3NpdGlvbiBzdHJhdGVneSB0byBhbiBvdmVybGF5LgogICAgICogQHBhcmFtIHs/fSBvdmVybGF5UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2gob3ZlcmxheVJlZikgewogICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmICYmIG92ZXJsYXlSZWYgIT09IHRoaXMuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoaXMgcG9zaXRpb24gc3RyYXRlZ3kgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhbiBvdmVybGF5Jyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ZhbGlkYXRlUG9zaXRpb25zKCk7CiAgICAgICAgb3ZlcmxheVJlZi5ob3N0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGJvdW5kaW5nQm94Q2xhc3MpOwogICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBvdmVybGF5UmVmOwogICAgICAgIHRoaXMuX2JvdW5kaW5nQm94ID0gb3ZlcmxheVJlZi5ob3N0RWxlbWVudDsKICAgICAgICB0aGlzLl9wYW5lID0gb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudDsKICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5faXNJbml0aWFsUmVuZGVyID0gdHJ1ZTsKICAgICAgICB0aGlzLl9sYXN0UG9zaXRpb24gPSBudWxsOwogICAgICAgIHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLy8gV2hlbiB0aGUgd2luZG93IGlzIHJlc2l6ZWQsIHdlIHdhbnQgdG8gdHJpZ2dlciB0aGUgbmV4dCByZXBvc2l0aW9uIGFzIGlmIGl0CiAgICAgICAgICAgIC8vIHdhcyBhbiBpbml0aWFsIHJlbmRlciwgaW4gb3JkZXIgZm9yIHRoZSBzdHJhdGVneSB0byBwaWNrIGEgbmV3IG9wdGltYWwgcG9zaXRpb24sCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBwb3NpdGlvbiBsb2NraW5nIHdpbGwgY2F1c2UgaXQgdG8gc3RheSBhdCB0aGUgb2xkIG9uZS4KICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsUmVuZGVyID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5hcHBseSgpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkgZWxlbWVudCwgdXNpbmcgd2hpY2hldmVyIHByZWZlcnJlZCBwb3NpdGlvbiByZWxhdGl2ZQogICAgICogdG8gdGhlIG9yaWdpbiBiZXN0IGZpdHMgb24tc2NyZWVuLgogICAgICoKICAgICAqIFRoZSBzZWxlY3Rpb24gb2YgYSBwb3NpdGlvbiBnb2VzIGFzIGZvbGxvd3M6CiAgICAgKiAgLSBJZiBhbnkgcG9zaXRpb25zIGZpdCBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgdmlld3BvcnQgYXMtaXMsCiAgICAgKiAgICAgIGNob29zZSB0aGUgZmlyc3QgcG9zaXRpb24gdGhhdCBkb2VzIHNvLgogICAgICogIC0gSWYgZmxleGlibGUgZGltZW5zaW9ucyBhcmUgZW5hYmxlZCBhbmQgYXQgbGVhc3Qgb25lIHNhdGlmaWVzIHRoZSBnaXZlbiBtaW5pbXVtIHdpZHRoL2hlaWdodCwKICAgICAqICAgICAgY2hvb3NlIHRoZSBwb3NpdGlvbiB3aXRoIHRoZSBncmVhdGVzdCBhdmFpbGFibGUgc2l6ZSBtb2RpZmllZCBieSB0aGUgcG9zaXRpb25zJyB3ZWlnaHQuCiAgICAgKiAgLSBJZiBwdXNoaW5nIGlzIGVuYWJsZWQsIHRha2UgdGhlIHBvc2l0aW9uIHRoYXQgd2VudCBvZmYtc2NyZWVuIHRoZSBsZWFzdCBhbmQgcHVzaCBpdAogICAgICogICAgICBvbi1zY3JlZW4uCiAgICAgKiAgLSBJZiBub25lIG9mIHRoZSBwcmV2aW91cyBjcml0ZXJpYSB3ZXJlIG1ldCwgdXNlIHRoZSBwb3NpdGlvbiB0aGF0IGdvZXMgb2ZmLXNjcmVlbiB0aGUgbGVhc3QuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXBwbHkoKSB7CiAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nIGlmIHRoZSBzdHJhdGVneSB3YXMgZGlzcG9zZWQgb3Igd2UncmUgb24gdGhlIHNlcnZlci4KICAgICAgICBpZiAodGhpcy5faXNEaXNwb3NlZCB8fCAhdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdGhlIHBvc2l0aW9uIGhhcyBiZWVuIGFwcGxpZWQgYWxyZWFkeSAoZS5nLiB3aGVuIHRoZSBvdmVybGF5IHdhcyBvcGVuZWQpIGFuZCB0aGUKICAgICAgICAvLyBjb25zdW1lciBvcHRlZCBpbnRvIGxvY2tpbmcgaW4gdGhlIHBvc2l0aW9uLCByZS11c2UgdGhlIG9sZCBwb3NpdGlvbiwgaW4gb3JkZXIgdG8KICAgICAgICAvLyBwcmV2ZW50IHRoZSBvdmVybGF5IGZyb20ganVtcGluZyBhcm91bmQuCiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxSZW5kZXIgJiYgdGhpcy5fcG9zaXRpb25Mb2NrZWQgJiYgdGhpcy5fbGFzdFBvc2l0aW9uKSB7CiAgICAgICAgICAgIHRoaXMucmVhcHBseUxhc3RQb3NpdGlvbigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NsZWFyUGFuZWxDbGFzc2VzKCk7CiAgICAgICAgdGhpcy5fcmVzZXRPdmVybGF5RWxlbWVudFN0eWxlcygpOwogICAgICAgIHRoaXMuX3Jlc2V0Qm91bmRpbmdCb3hTdHlsZXMoKTsKICAgICAgICAvLyBXZSBuZWVkIHRoZSBib3VuZGluZyByZWN0cyBmb3IgdGhlIG9yaWdpbiBhbmQgdGhlIG92ZXJsYXkgdG8gZGV0ZXJtaW5lIGhvdyB0byBwb3NpdGlvbgogICAgICAgIC8vIHRoZSBvdmVybGF5IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4uCiAgICAgICAgLy8gV2UgdXNlIHRoZSB2aWV3cG9ydCByZWN0IHRvIGRldGVybWluZSB3aGV0aGVyIGEgcG9zaXRpb24gd291bGQgZ28gb2ZmLXNjcmVlbi4KICAgICAgICB0aGlzLl92aWV3cG9ydFJlY3QgPSB0aGlzLl9nZXROYXJyb3dlZFZpZXdwb3J0UmVjdCgpOwogICAgICAgIHRoaXMuX29yaWdpblJlY3QgPSB0aGlzLl9nZXRPcmlnaW5SZWN0KCk7CiAgICAgICAgdGhpcy5fb3ZlcmxheVJlY3QgPSB0aGlzLl9wYW5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcmlnaW5SZWN0ID0gdGhpcy5fb3JpZ2luUmVjdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3ZlcmxheVJlY3QgPSB0aGlzLl9vdmVybGF5UmVjdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld3BvcnRSZWN0ID0gdGhpcy5fdmlld3BvcnRSZWN0OwogICAgICAgIC8vIFBvc2l0aW9ucyB3aGVyZSB0aGUgb3ZlcmxheSB3aWxsIGZpdCB3aXRoIGZsZXhpYmxlIGRpbWVuc2lvbnMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZsZXhpYmxlRml0cyA9IFtdOwogICAgICAgIC8vIEZhbGxiYWNrIGlmIG5vbmUgb2YgdGhlIHByZWZlcnJlZCBwb3NpdGlvbnMgZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmYWxsYmFjazsKICAgICAgICAvLyBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIHByZWZlcnJlZCBwb3NpdGlvbnMgbG9va2luZyBmb3IgYSBnb29kIGZpdC4KICAgICAgICAvLyBJZiBhIGdvb2QgZml0IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCiAgICAgICAgZm9yIChsZXQgcG9zIG9mIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucykgewogICAgICAgICAgICAvLyBHZXQgdGhlIGV4YWN0ICh4LCB5KSBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQtb2Ytb3JpZ2luIG9uIHRoZSBvcmlnaW4gZWxlbWVudC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb3JpZ2luUG9pbnQgPSB0aGlzLl9nZXRPcmlnaW5Qb2ludChvcmlnaW5SZWN0LCBwb3MpOwogICAgICAgICAgICAvLyBGcm9tIHRoYXQgcG9pbnQtb2Ytb3JpZ2luLCBnZXQgdGhlIGV4YWN0ICh4LCB5KSBjb29yZGluYXRlIGZvciB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZQogICAgICAgICAgICAvLyBvdmVybGF5IGluIHRoaXMgcG9zaXRpb24uIFdlIHVzZSB0aGUgdG9wLWxlZnQgY29ybmVyIGZvciBjYWxjdWxhdGlvbnMgYW5kIGxhdGVyIHRyYW5zbGF0ZQogICAgICAgICAgICAvLyB0aGlzIGludG8gYW4gYXBwcm9wcmlhdGUgKHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCkgc3R5bGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG92ZXJsYXlQb2ludCA9IHRoaXMuX2dldE92ZXJsYXlQb2ludChvcmlnaW5Qb2ludCwgb3ZlcmxheVJlY3QsIHBvcyk7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBob3cgd2VsbCB0aGUgb3ZlcmxheSB3b3VsZCBmaXQgaW50byB0aGUgdmlld3BvcnQgd2l0aCB0aGlzIHBvaW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvdmVybGF5Rml0ID0gdGhpcy5fZ2V0T3ZlcmxheUZpdChvdmVybGF5UG9pbnQsIG92ZXJsYXlSZWN0LCB2aWV3cG9ydFJlY3QsIHBvcyk7CiAgICAgICAgICAgIC8vIElmIHRoZSBvdmVybGF5LCB3aXRob3V0IGFueSBmdXJ0aGVyIHdvcmssIGZpdHMgaW50byB0aGUgdmlld3BvcnQsIHVzZSB0aGlzIHBvc2l0aW9uLgogICAgICAgICAgICBpZiAob3ZlcmxheUZpdC5pc0NvbXBsZXRlbHlXaXRoaW5WaWV3cG9ydCkgewogICAgICAgICAgICAgICAgdGhpcy5faXNQdXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5UG9zaXRpb24ocG9zLCBvcmlnaW5Qb2ludCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIG92ZXJsYXkgaGFzIGZsZXhpYmxlIGRpbWVuc2lvbnMsIHdlIGNhbiB1c2UgdGhpcyBwb3NpdGlvbgogICAgICAgICAgICAvLyBzbyBsb25nIGFzIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGZvciB0aGUgbWluaW11bSBkaW1lbnNpb25zLgogICAgICAgICAgICBpZiAodGhpcy5fY2FuRml0V2l0aEZsZXhpYmxlRGltZW5zaW9ucyhvdmVybGF5Rml0LCBvdmVybGF5UG9pbnQsIHZpZXdwb3J0UmVjdCkpIHsKICAgICAgICAgICAgICAgIC8vIFNhdmUgcG9zaXRpb25zIHdoZXJlIHRoZSBvdmVybGF5IHdpbGwgZml0IHdpdGggZmxleGlibGUgZGltZW5zaW9ucy4gV2Ugd2lsbCB1c2UgdGhlc2UKICAgICAgICAgICAgICAgIC8vIGlmIG5vbmUgb2YgdGhlIHBvc2l0aW9ucyBmaXQgKndpdGhvdXQqIGZsZXhpYmxlIGRpbWVuc2lvbnMuCiAgICAgICAgICAgICAgICBmbGV4aWJsZUZpdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHBvcywKICAgICAgICAgICAgICAgICAgICBvcmlnaW46IG9yaWdpblBvaW50LAogICAgICAgICAgICAgICAgICAgIG92ZXJsYXlSZWN0LAogICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nQm94UmVjdDogdGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KG9yaWdpblBvaW50LCBwb3MpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IHByZWZlcnJlZCBwb3NpdGlvbiBkb2VzIG5vdCBmaXQgb24gdGhlIHNjcmVlbiwgcmVtZW1iZXIgdGhlIHBvc2l0aW9uCiAgICAgICAgICAgIC8vIGlmIGl0IGhhcyBtb3JlIHZpc2libGUgYXJlYSBvbi1zY3JlZW4gdGhhbiB3ZSd2ZSBzZWVuIGFuZCBtb3ZlIG9udG8gdGhlIG5leHQgcHJlZmVycmVkCiAgICAgICAgICAgIC8vIHBvc2l0aW9uLgogICAgICAgICAgICBpZiAoIWZhbGxiYWNrIHx8IGZhbGxiYWNrLm92ZXJsYXlGaXQudmlzaWJsZUFyZWEgPCBvdmVybGF5Rml0LnZpc2libGVBcmVhKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IHsgb3ZlcmxheUZpdCwgb3ZlcmxheVBvaW50LCBvcmlnaW5Qb2ludCwgcG9zaXRpb246IHBvcywgb3ZlcmxheVJlY3QgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IHBvc2l0aW9ucyB3aGVyZSB0aGUgb3ZlcmxheSB3b3VsZCBmaXQgd2l0aCBmbGV4aWJsZSBkaW1lbnNpb25zLCBjaG9vc2UgdGhlCiAgICAgICAgLy8gb25lIHRoYXQgaGFzIHRoZSBncmVhdGVzdCBhcmVhIGF2YWlsYWJsZSBtb2RpZmllZCBieSB0aGUgcG9zaXRpb24ncyB3ZWlnaHQKICAgICAgICBpZiAoZmxleGlibGVGaXRzLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBiZXN0Rml0ID0gbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYmVzdFNjb3JlID0gLTE7CiAgICAgICAgICAgIGZvciAoY29uc3QgZml0IG9mIGZsZXhpYmxlRml0cykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSBmaXQuYm91bmRpbmdCb3hSZWN0LndpZHRoICogZml0LmJvdW5kaW5nQm94UmVjdC5oZWlnaHQgKiAoZml0LnBvc2l0aW9uLndlaWdodCB8fCAxKTsKICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkgewogICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwogICAgICAgICAgICAgICAgICAgIGJlc3RGaXQgPSBmaXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNQdXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlQb3NpdGlvbigoLyoqIEB0eXBlIHs/fSAqLyAoYmVzdEZpdCkpLnBvc2l0aW9uLCAoLyoqIEB0eXBlIHs/fSAqLyAoYmVzdEZpdCkpLm9yaWdpbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gV2hlbiBub25lIG9mIHRoZSBwcmVmZXJyZWQgcG9zaXRpb25zIGZpdCB3aXRoaW4gdGhlIHZpZXdwb3J0LCB0YWtlIHRoZSBwb3NpdGlvbgogICAgICAgIC8vIHRoYXQgd2VudCBvZmYtc2NyZWVuIHRoZSBsZWFzdCBhbmQgYXR0ZW1wdCB0byBwdXNoIGl0IG9uLXNjcmVlbi4KICAgICAgICBpZiAodGhpcy5fY2FuUHVzaCkgewogICAgICAgICAgICAvLyBUT0RPKGplbGJvdXJuKTogYWZ0ZXIgcHVzaGluZywgdGhlIG9wZW5pbmcgImRpcmVjdGlvbiIgb2YgdGhlIG92ZXJsYXkgbWlnaHQgbm90IG1ha2Ugc2Vuc2UuCiAgICAgICAgICAgIHRoaXMuX2lzUHVzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlQb3NpdGlvbigoLyoqIEB0eXBlIHs/fSAqLyAoZmFsbGJhY2spKS5wb3NpdGlvbiwgKC8qKiBAdHlwZSB7P30gKi8gKGZhbGxiYWNrKSkub3JpZ2luUG9pbnQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIEFsbCBvcHRpb25zIGZvciBnZXR0aW5nIHRoZSBvdmVybGF5IHdpdGhpbiB0aGUgdmlld3BvcnQgaGF2ZSBiZWVuIGV4aGF1c3RlZCwgc28gZ28gd2l0aCB0aGUKICAgICAgICAvLyBwb3NpdGlvbiB0aGF0IHdlbnQgb2ZmLXNjcmVlbiB0aGUgbGVhc3QuCiAgICAgICAgdGhpcy5fYXBwbHlQb3NpdGlvbigoLyoqIEB0eXBlIHs/fSAqLyAoZmFsbGJhY2spKS5wb3NpdGlvbiwgKC8qKiBAdHlwZSB7P30gKi8gKGZhbGxiYWNrKSkub3JpZ2luUG9pbnQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2goKSB7CiAgICAgICAgdGhpcy5fY2xlYXJQYW5lbENsYXNzZXMoKTsKICAgICAgICB0aGlzLl9sYXN0UG9zaXRpb24gPSBudWxsOwogICAgICAgIHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudCA9IG51bGw7CiAgICAgICAgdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFudXAgYWZ0ZXIgdGhlIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNwb3NlKCkgewogICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIGBfcmVzZXRCb3VuZGluZ0JveFN0eWxlc2AgaGVyZSwgYmVjYXVzZSBpdCByZXNldHMKICAgICAgICAvLyBzb21lIHByb3BlcnRpZXMgdG8gemVybywgcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbS4KICAgICAgICBpZiAodGhpcy5fYm91bmRpbmdCb3gpIHsKICAgICAgICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLCAoLyoqIEB0eXBlIHs/fSAqLyAoewogICAgICAgICAgICAgICAgdG9wOiAnJywKICAgICAgICAgICAgICAgIGxlZnQ6ICcnLAogICAgICAgICAgICAgICAgcmlnaHQ6ICcnLAogICAgICAgICAgICAgICAgYm90dG9tOiAnJywKICAgICAgICAgICAgICAgIGhlaWdodDogJycsCiAgICAgICAgICAgICAgICB3aWR0aDogJycsCiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnJywKICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnJywKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3BhbmUpIHsKICAgICAgICAgICAgdGhpcy5fcmVzZXRPdmVybGF5RWxlbWVudFN0eWxlcygpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYm91bmRpbmdCb3hDbGFzcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZGV0YWNoKCk7CiAgICAgICAgdGhpcy5fcG9zaXRpb25DaGFuZ2VzLmNvbXBsZXRlKCk7CiAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX2JvdW5kaW5nQm94ID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogVGhpcyByZS1hbGlnbnMgdGhlIG92ZXJsYXkgZWxlbWVudCB3aXRoIHRoZSB0cmlnZ2VyIGluIGl0cyBsYXN0IGNhbGN1bGF0ZWQgcG9zaXRpb24sCiAgICAgKiBldmVuIGlmIGEgcG9zaXRpb24gaGlnaGVyIGluIHRoZSAicHJlZmVycmVkIHBvc2l0aW9ucyIgbGlzdCB3b3VsZCBub3cgZml0LiBUaGlzCiAgICAgKiBhbGxvd3Mgb25lIHRvIHJlLWFsaWduIHRoZSBwYW5lbCB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgcGFuZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWFwcGx5TGFzdFBvc2l0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5faXNEaXNwb3NlZCAmJiAoIXRoaXMuX3BsYXRmb3JtIHx8IHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikpIHsKICAgICAgICAgICAgdGhpcy5fb3JpZ2luUmVjdCA9IHRoaXMuX2dldE9yaWdpblJlY3QoKTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlY3QgPSB0aGlzLl9wYW5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFJlY3QgPSB0aGlzLl9nZXROYXJyb3dlZFZpZXdwb3J0UmVjdCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IHRoaXMuX2xhc3RQb3NpdGlvbiB8fCB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnNbMF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3JpZ2luUG9pbnQgPSB0aGlzLl9nZXRPcmlnaW5Qb2ludCh0aGlzLl9vcmlnaW5SZWN0LCBsYXN0UG9zaXRpb24pOwogICAgICAgICAgICB0aGlzLl9hcHBseVBvc2l0aW9uKGxhc3RQb3NpdGlvbiwgb3JpZ2luUG9pbnQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbGlzdCBvZiBTY3JvbGxhYmxlIGNvbnRhaW5lcnMgdGhhdCBob3N0IHRoZSBvcmlnaW4gZWxlbWVudCBzbyB0aGF0CiAgICAgKiBvbiByZXBvc2l0aW9uIHdlIGNhbiBldmFsdWF0ZSBpZiBpdCBvciB0aGUgb3ZlcmxheSBoYXMgYmVlbiBjbGlwcGVkIG9yIG91dHNpZGUgdmlldy4gRXZlcnkKICAgICAqIFNjcm9sbGFibGUgbXVzdCBiZSBhbiBhbmNlc3RvciBlbGVtZW50IG9mIHRoZSBzdHJhdGVneSdzIG9yaWdpbiBlbGVtZW50LgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/fSBzY3JvbGxhYmxlcwogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVzKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fc2Nyb2xsYWJsZXMgPSBzY3JvbGxhYmxlczsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkcyBuZXcgcHJlZmVycmVkIHBvc2l0aW9ucy4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb25zIExpc3Qgb2YgcG9zaXRpb25zIG9wdGlvbnMgZm9yIHRoaXMgb3ZlcmxheS4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhQb3NpdGlvbnMocG9zaXRpb25zKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcHJlZmVycmVkUG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgIC8vIElmIHRoZSBsYXN0IGNhbGN1bGF0ZWQgcG9zaXRpb24gb2JqZWN0IGlzbid0IHBhcnQgb2YgdGhlIHBvc2l0aW9ucyBhbnltb3JlLCBjbGVhcgogICAgICAgIC8vIGl0IGluIG9yZGVyIHRvIGF2b2lkIGl0IGJlaW5nIHBpY2tlZCB1cCBpZiB0aGUgY29uc3VtZXIgdHJpZXMgdG8gcmUtYXBwbHkuCiAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmRleE9mKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9sYXN0UG9zaXRpb24pKSkgPT09IC0xKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2xhc3RQb3NpdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ZhbGlkYXRlUG9zaXRpb25zKCk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgYSBtaW5pbXVtIGRpc3RhbmNlIHRoZSBvdmVybGF5IG1heSBiZSBwb3NpdGlvbmVkIHRvIHRoZSBlZGdlIG9mIHRoZSB2aWV3cG9ydC4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gbWFyZ2luIFJlcXVpcmVkIG1hcmdpbiBiZXR3ZWVuIHRoZSBvdmVybGF5IGFuZCB0aGUgdmlld3BvcnQgZWRnZSBpbiBwaXhlbHMuCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB3aXRoVmlld3BvcnRNYXJnaW4obWFyZ2luKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fdmlld3BvcnRNYXJnaW4gPSBtYXJnaW47CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgd2hldGhlciB0aGUgb3ZlcmxheSdzIHdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlIGNvbnN0cmFpbmVkIHRvIGZpdCB3aXRoaW4gdGhlIHZpZXdwb3J0LgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/PX0gZmxleGlibGVEaW1lbnNpb25zCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB3aXRoRmxleGlibGVEaW1lbnNpb25zKGZsZXhpYmxlRGltZW5zaW9ucyA9IHRydWUpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9oYXNGbGV4aWJsZURpbWVuc2lvbnMgPSBmbGV4aWJsZURpbWVuc2lvbnM7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgd2hldGhlciB0aGUgb3ZlcmxheSBjYW4gZ3JvdyBhZnRlciB0aGUgaW5pdGlhbCBvcGVuIHZpYSBmbGV4aWJsZSB3aWR0aC9oZWlnaHQuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez89fSBncm93QWZ0ZXJPcGVuCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB3aXRoR3Jvd0FmdGVyT3Blbihncm93QWZ0ZXJPcGVuID0gdHJ1ZSkgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2dyb3dBZnRlck9wZW4gPSBncm93QWZ0ZXJPcGVuOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIG92ZXJsYXkgY2FuIGJlIHB1c2hlZCBvbi1zY3JlZW4gaWYgbm9uZSBvZiB0aGUgcHJvdmlkZWQgcG9zaXRpb25zIGZpdC4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7Pz19IGNhblB1c2gKICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhQdXNoKGNhblB1c2ggPSB0cnVlKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fY2FuUHVzaCA9IGNhblB1c2g7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgd2hldGhlciB0aGUgb3ZlcmxheSdzIHBvc2l0aW9uIHNob3VsZCBiZSBsb2NrZWQgaW4gYWZ0ZXIgaXQgaXMgcG9zaXRpb25lZAogICAgICogaW5pdGlhbGx5LiBXaGVuIGFuIG92ZXJsYXkgaXMgbG9ja2VkIGluLCBpdCB3b24ndCBhdHRlbXB0IHRvIHJlcG9zaXRpb24gaXRzZWxmCiAgICAgKiB3aGVuIHRoZSBwb3NpdGlvbiBpcyByZS1hcHBsaWVkIChlLmcuIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhd2F5KS4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7Pz19IGlzTG9ja2VkIFdoZXRoZXIgdGhlIG92ZXJsYXkgc2hvdWxkIGxvY2tlZCBpbi4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhMb2NrZWRQb3NpdGlvbihpc0xvY2tlZCA9IHRydWUpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wb3NpdGlvbkxvY2tlZCA9IGlzTG9ja2VkOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBvcmlnaW4sIHJlbGF0aXZlIHRvIHdoaWNoIHRvIHBvc2l0aW9uIHRoZSBvdmVybGF5LgogICAgICogVXNpbmcgYW4gZWxlbWVudCBvcmlnaW4gaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb21wb25lbnRzIHRoYXQgbmVlZCB0byBiZSBwb3NpdGlvbmVkCiAgICAgKiByZWxhdGl2ZWx5IHRvIGEgdHJpZ2dlciAoZS5nLiBkcm9wZG93biBtZW51cyBvciB0b29sdGlwcyksIHdoZXJlYXMgdXNpbmcgYSBwb2ludCBjYW4gYmUKICAgICAqIHVzZWQgZm9yIGNhc2VzIGxpa2UgY29udGV4dHVhbCBtZW51cyB3aGljaCBvcGVuIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgcG9pbnRlci4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gb3JpZ2luIFJlZmVyZW5jZSB0byB0aGUgbmV3IG9yaWdpbi4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHNldE9yaWdpbihvcmlnaW4pIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vcmlnaW4gPSBvcmlnaW47CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGRlZmF1bHQgb2Zmc2V0IGZvciB0aGUgb3ZlcmxheSdzIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIHgtYXhpcy4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gb2Zmc2V0IE5ldyBvZmZzZXQgaW4gdGhlIFggYXhpcy4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhEZWZhdWx0T2Zmc2V0WChvZmZzZXQpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vZmZzZXRYID0gb2Zmc2V0OwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IG9mZnNldCBmb3IgdGhlIG92ZXJsYXkncyBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSB5LWF4aXMuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IG9mZnNldCBOZXcgb2Zmc2V0IGluIHRoZSBZIGF4aXMuCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB3aXRoRGVmYXVsdE9mZnNldFkob2Zmc2V0KSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb2Zmc2V0WSA9IG9mZnNldDsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogQ29uZmlndXJlcyB0aGF0IHRoZSBwb3NpdGlvbiBzdHJhdGVneSBzaG91bGQgc2V0IGEgYHRyYW5zZm9ybS1vcmlnaW5gIG9uIHNvbWUgZWxlbWVudHMKICAgICAqIGluc2lkZSB0aGUgb3ZlcmxheSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRoYXQgaXMgYmVpbmcgYXBwbGllZC4gVGhpcyBpcwogICAgICogdXNlZnVsIGZvciB0aGUgY2FzZXMgd2hlcmUgdGhlIG9yaWdpbiBvZiBhbiBhbmltYXRpb24gY2FuIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlCiAgICAgKiBhbGlnbm1lbnQgb2YgdGhlIG92ZXJsYXkuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yIENTUyBzZWxlY3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSB0YXJnZXQKICAgICAqICAgIGVsZW1lbnRzIG9udG8gd2hpY2ggdG8gc2V0IHRoZSB0cmFuc2Zvcm0gb3JpZ2luLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aFRyYW5zZm9ybU9yaWdpbk9uKHNlbGVjdG9yKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgKHgsIHkpIGNvb3JkaW5hdGUgb2YgYSBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSBvcmlnaW4gYmFzZWQgb24gYSByZWxhdGl2ZSBwb3NpdGlvbi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9yaWdpblJlY3QKICAgICAqIEBwYXJhbSB7P30gcG9zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0T3JpZ2luUG9pbnQob3JpZ2luUmVjdCwgcG9zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB4OwogICAgICAgIGlmIChwb3Mub3JpZ2luWCA9PSAnY2VudGVyJykgewogICAgICAgICAgICAvLyBOb3RlOiB3aGVuIGNlbnRlcmluZyB3ZSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgYGxlZnRgCiAgICAgICAgICAgIC8vIG9mZnNldCwgb3RoZXJ3aXNlIHRoZSBwb3NpdGlvbiB3aWxsIGJlIHdyb25nIGluIFJUTC4KICAgICAgICAgICAgeCA9IG9yaWdpblJlY3QubGVmdCArIChvcmlnaW5SZWN0LndpZHRoIC8gMik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0YXJ0WCA9IHRoaXMuX2lzUnRsKCkgPyBvcmlnaW5SZWN0LnJpZ2h0IDogb3JpZ2luUmVjdC5sZWZ0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZFggPSB0aGlzLl9pc1J0bCgpID8gb3JpZ2luUmVjdC5sZWZ0IDogb3JpZ2luUmVjdC5yaWdodDsKICAgICAgICAgICAgeCA9IHBvcy5vcmlnaW5YID09ICdzdGFydCcgPyBzdGFydFggOiBlbmRYOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHk7CiAgICAgICAgaWYgKHBvcy5vcmlnaW5ZID09ICdjZW50ZXInKSB7CiAgICAgICAgICAgIHkgPSBvcmlnaW5SZWN0LnRvcCArIChvcmlnaW5SZWN0LmhlaWdodCAvIDIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgeSA9IHBvcy5vcmlnaW5ZID09ICd0b3AnID8gb3JpZ2luUmVjdC50b3AgOiBvcmlnaW5SZWN0LmJvdHRvbTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgeCwgeSB9OwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSAoeCwgeSkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBvdmVybGF5IGdpdmVuIGEgZ2l2ZW4gcG9zaXRpb24gYW5kCiAgICAgKiBvcmlnaW4gcG9pbnQgdG8gd2hpY2ggdGhlIG92ZXJsYXkgc2hvdWxkIGJlIGNvbm5lY3RlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9yaWdpblBvaW50CiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXlSZWN0CiAgICAgKiBAcGFyYW0gez99IHBvcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE92ZXJsYXlQb2ludChvcmlnaW5Qb2ludCwgb3ZlcmxheVJlY3QsIHBvcykgewogICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgKG92ZXJsYXlTdGFydFgsIG92ZXJsYXlTdGFydFkpLCB0aGUgc3RhcnQgb2YgdGhlCiAgICAgICAgLy8gcG90ZW50aWFsIG92ZXJsYXkgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yaWdpbiBwb2ludC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG92ZXJsYXlTdGFydFg7CiAgICAgICAgaWYgKHBvcy5vdmVybGF5WCA9PSAnY2VudGVyJykgewogICAgICAgICAgICBvdmVybGF5U3RhcnRYID0gLW92ZXJsYXlSZWN0LndpZHRoIC8gMjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocG9zLm92ZXJsYXlYID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIG92ZXJsYXlTdGFydFggPSB0aGlzLl9pc1J0bCgpID8gLW92ZXJsYXlSZWN0LndpZHRoIDogMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG92ZXJsYXlTdGFydFggPSB0aGlzLl9pc1J0bCgpID8gMCA6IC1vdmVybGF5UmVjdC53aWR0aDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvdmVybGF5U3RhcnRZOwogICAgICAgIGlmIChwb3Mub3ZlcmxheVkgPT0gJ2NlbnRlcicpIHsKICAgICAgICAgICAgb3ZlcmxheVN0YXJ0WSA9IC1vdmVybGF5UmVjdC5oZWlnaHQgLyAyOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb3ZlcmxheVN0YXJ0WSA9IHBvcy5vdmVybGF5WSA9PSAndG9wJyA/IDAgOiAtb3ZlcmxheVJlY3QuaGVpZ2h0OwogICAgICAgIH0KICAgICAgICAvLyBUaGUgKHgsIHkpIGNvb3JkaW5hdGVzIG9mIHRoZSBvdmVybGF5LgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHg6IG9yaWdpblBvaW50LnggKyBvdmVybGF5U3RhcnRYLAogICAgICAgICAgICB5OiBvcmlnaW5Qb2ludC55ICsgb3ZlcmxheVN0YXJ0WSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIGhvdyB3ZWxsIGFuIG92ZXJsYXkgYXQgdGhlIGdpdmVuIHBvaW50IHdpbGwgZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwb2ludAogICAgICogQHBhcmFtIHs/fSBvdmVybGF5CiAgICAgKiBAcGFyYW0gez99IHZpZXdwb3J0CiAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0T3ZlcmxheUZpdChwb2ludCwgb3ZlcmxheSwgdmlld3BvcnQsIHBvc2l0aW9uKSB7CiAgICAgICAgbGV0IHsgeCwgeSB9ID0gcG9pbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvZmZzZXRYID0gdGhpcy5fZ2V0T2Zmc2V0KHBvc2l0aW9uLCAneCcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuX2dldE9mZnNldChwb3NpdGlvbiwgJ3knKTsKICAgICAgICAvLyBBY2NvdW50IGZvciB0aGUgb2Zmc2V0cyBzaW5jZSB0aGV5IGNvdWxkIHB1c2ggdGhlIG92ZXJsYXkgb3V0IG9mIHRoZSB2aWV3cG9ydC4KICAgICAgICBpZiAob2Zmc2V0WCkgewogICAgICAgICAgICB4ICs9IG9mZnNldFg7CiAgICAgICAgfQogICAgICAgIGlmIChvZmZzZXRZKSB7CiAgICAgICAgICAgIHkgKz0gb2Zmc2V0WTsKICAgICAgICB9CiAgICAgICAgLy8gSG93IG11Y2ggdGhlIG92ZXJsYXkgd291bGQgb3ZlcmZsb3cgYXQgdGhpcyBwb3NpdGlvbiwgb24gZWFjaCBzaWRlLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbGVmdE92ZXJmbG93ID0gMCAtIHg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByaWdodE92ZXJmbG93ID0gKHggKyBvdmVybGF5LndpZHRoKSAtIHZpZXdwb3J0LndpZHRoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdG9wT3ZlcmZsb3cgPSAwIC0geTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGJvdHRvbU92ZXJmbG93ID0gKHkgKyBvdmVybGF5LmhlaWdodCkgLSB2aWV3cG9ydC5oZWlnaHQ7CiAgICAgICAgLy8gVmlzaWJsZSBwYXJ0cyBvZiB0aGUgZWxlbWVudCBvbiBlYWNoIGF4aXMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2aXNpYmxlV2lkdGggPSB0aGlzLl9zdWJ0cmFjdE92ZXJmbG93cyhvdmVybGF5LndpZHRoLCBsZWZ0T3ZlcmZsb3csIHJpZ2h0T3ZlcmZsb3cpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmlzaWJsZUhlaWdodCA9IHRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKG92ZXJsYXkuaGVpZ2h0LCB0b3BPdmVyZmxvdywgYm90dG9tT3ZlcmZsb3cpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmlzaWJsZUFyZWEgPSB2aXNpYmxlV2lkdGggKiB2aXNpYmxlSGVpZ2h0OwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZpc2libGVBcmVhLAogICAgICAgICAgICBpc0NvbXBsZXRlbHlXaXRoaW5WaWV3cG9ydDogKG92ZXJsYXkud2lkdGggKiBvdmVybGF5LmhlaWdodCkgPT09IHZpc2libGVBcmVhLAogICAgICAgICAgICBmaXRzSW5WaWV3cG9ydFZlcnRpY2FsbHk6IHZpc2libGVIZWlnaHQgPT09IG92ZXJsYXkuaGVpZ2h0LAogICAgICAgICAgICBmaXRzSW5WaWV3cG9ydEhvcml6b250YWxseTogdmlzaWJsZVdpZHRoID09IG92ZXJsYXkud2lkdGgsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBjYW4gZml0IHdpdGhpbiB0aGUgdmlld3BvcnQgd2hlbiBpdCBtYXkgcmVzaXplIGVpdGhlciBpdHMgd2lkdGggb3IgaGVpZ2h0LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZml0IEhvdyB3ZWxsIHRoZSBvdmVybGF5IGZpdHMgaW4gdGhlIHZpZXdwb3J0IGF0IHNvbWUgcG9zaXRpb24uCiAgICAgKiBAcGFyYW0gez99IHBvaW50IFRoZSAoeCwgeSkgY29vcmRpbmF0ZXMgb2YgdGhlIG92ZXJsYXQgYXQgc29tZSBwb3NpdGlvbi4KICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnQgVGhlIGdlb21ldHJ5IG9mIHRoZSB2aWV3cG9ydC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYW5GaXRXaXRoRmxleGlibGVEaW1lbnNpb25zKGZpdCwgcG9pbnQsIHZpZXdwb3J0KSB7CiAgICAgICAgaWYgKHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodCA9IHZpZXdwb3J0LmJvdHRvbSAtIHBvaW50Lnk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSB2aWV3cG9ydC5yaWdodCAtIHBvaW50Lng7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gZ2V0UGl4ZWxWYWx1ZSh0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLm1pbkhlaWdodCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRQaXhlbFZhbHVlKHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWluV2lkdGgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsRml0ID0gZml0LmZpdHNJblZpZXdwb3J0VmVydGljYWxseSB8fAogICAgICAgICAgICAgICAgKG1pbkhlaWdodCAhPSBudWxsICYmIG1pbkhlaWdodCA8PSBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxGaXQgPSBmaXQuZml0c0luVmlld3BvcnRIb3Jpem9udGFsbHkgfHwKICAgICAgICAgICAgICAgIChtaW5XaWR0aCAhPSBudWxsICYmIG1pbldpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKTsKICAgICAgICAgICAgcmV0dXJuIHZlcnRpY2FsRml0ICYmIGhvcml6b250YWxGaXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG92ZXJsYXkgY2FuIGJlICJwdXNoZWQiIG9uLXNjcmVlbi4gSWYgdGhlIG92ZXJsYXkgaXMgbGFyZ2VyIHRoYW4KICAgICAqIHRoZSB2aWV3cG9ydCwgdGhlIHRvcC1sZWZ0IGNvcm5lciB3aWxsIGJlIHB1c2hlZCBvbi1zY3JlZW4gKHdpdGggb3ZlcmZsb3cgb2NjdXJpbmcgb24gdGhlCiAgICAgKiByaWdodCBhbmQgYm90dG9tKS4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBzdGFydCBTdGFydGluZyBwb2ludCBmcm9tIHdoaWNoIHRoZSBvdmVybGF5IGlzIHB1c2hlZC4KICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheSBEaW1lbnNpb25zIG9mIHRoZSBvdmVybGF5LgogICAgICogQHBhcmFtIHs/fSBzY3JvbGxQb3NpdGlvbiBDdXJyZW50IHZpZXdwb3J0IHNjcm9sbCBwb3NpdGlvbi4KICAgICAqIEByZXR1cm4gez99IFRoZSBwb2ludCBhdCB3aGljaCB0byBwb3NpdGlvbiB0aGUgb3ZlcmxheSBhZnRlciBwdXNoaW5nLiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgbmV3CiAgICAgKiAgICAgb3JpZ2luUG9pbnQuCiAgICAgKi8KICAgIF9wdXNoT3ZlcmxheU9uU2NyZWVuKHN0YXJ0LCBvdmVybGF5LCBzY3JvbGxQb3NpdGlvbikgewogICAgICAgIC8vIElmIHRoZSBwb3NpdGlvbiBpcyBsb2NrZWQgYW5kIHdlJ3ZlIHB1c2hlZCB0aGUgb3ZlcmxheSBhbHJlYWR5LCByZXVzZSB0aGUgcHJldmlvdXMgcHVzaAogICAgICAgIC8vIGFtb3VudCwgcmF0aGVyIHRoYW4gcHVzaGluZyBpdCBhZ2Fpbi4gSWYgd2Ugd2VyZSB0byBjb250aW51ZSBwdXNoaW5nLCB0aGUgZWxlbWVudCB3b3VsZAogICAgICAgIC8vIHJlbWFpbiBpbiB0aGUgdmlld3BvcnQsIHdoaWNoIGdvZXMgYWdhaW5zdCB0aGUgZXhwZWN0YXRpb25zIHdoZW4gcG9zaXRpb24gbG9ja2luZyBpcyBlbmFibGVkLgogICAgICAgIGlmICh0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQgJiYgdGhpcy5fcG9zaXRpb25Mb2NrZWQpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6IHN0YXJ0LnggKyB0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQueCwKICAgICAgICAgICAgICAgIHk6IHN0YXJ0LnkgKyB0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQueQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydFJlY3Q7CiAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtdWNoIHRoZSBvdmVybGF5IGdvZXMgb3V0c2lkZSB0aGUgdmlld3BvcnQgb24gZWFjaAogICAgICAgIC8vIHNpZGUsIHdoaWNoIHdlJ2xsIHVzZSB0byBkZWNpZGUgd2hpY2ggZGlyZWN0aW9uIHRvIHB1c2ggaXQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG92ZXJmbG93UmlnaHQgPSBNYXRoLm1heChzdGFydC54ICsgb3ZlcmxheS53aWR0aCAtIHZpZXdwb3J0LnJpZ2h0LCAwKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3ZlcmZsb3dCb3R0b20gPSBNYXRoLm1heChzdGFydC55ICsgb3ZlcmxheS5oZWlnaHQgLSB2aWV3cG9ydC5ib3R0b20sIDApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvdmVyZmxvd1RvcCA9IE1hdGgubWF4KHZpZXdwb3J0LnRvcCAtIHNjcm9sbFBvc2l0aW9uLnRvcCAtIHN0YXJ0LnksIDApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvdmVyZmxvd0xlZnQgPSBNYXRoLm1heCh2aWV3cG9ydC5sZWZ0IC0gc2Nyb2xsUG9zaXRpb24ubGVmdCAtIHN0YXJ0LngsIDApOwogICAgICAgIC8vIEFtb3VudCBieSB3aGljaCB0byBwdXNoIHRoZSBvdmVybGF5IGluIGVhY2ggYXhpcyBzdWNoIHRoYXQgaXQgcmVtYWlucyBvbi1zY3JlZW4uCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwdXNoWCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwdXNoWSA9IDA7CiAgICAgICAgLy8gSWYgdGhlIG92ZXJsYXkgZml0cyBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSB2aWV3cG9ydCwgcHVzaCBpdCBmcm9tIHdoaWNoZXZlcgogICAgICAgIC8vIGRpcmVjdGlvbiBpcyBnb2VzIG9mZi1zY3JlZW4uIE90aGVyd2lzZSwgcHVzaCB0aGUgdG9wLWxlZnQgY29ybmVyIHN1Y2ggdGhhdCBpdHMgaW4gdGhlCiAgICAgICAgLy8gdmlld3BvcnQgYW5kIGFsbG93IGZvciB0aGUgdHJhaWxpbmcgZW5kIG9mIHRoZSBvdmVybGF5IHRvIGdvIG91dCBvZiBib3VuZHMuCiAgICAgICAgaWYgKG92ZXJsYXkud2lkdGggPD0gdmlld3BvcnQud2lkdGgpIHsKICAgICAgICAgICAgcHVzaFggPSBvdmVyZmxvd0xlZnQgfHwgLW92ZXJmbG93UmlnaHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoWCA9IHN0YXJ0LnggPCB0aGlzLl92aWV3cG9ydE1hcmdpbiA/ICh2aWV3cG9ydC5sZWZ0IC0gc2Nyb2xsUG9zaXRpb24ubGVmdCkgLSBzdGFydC54IDogMDsKICAgICAgICB9CiAgICAgICAgaWYgKG92ZXJsYXkuaGVpZ2h0IDw9IHZpZXdwb3J0LmhlaWdodCkgewogICAgICAgICAgICBwdXNoWSA9IG92ZXJmbG93VG9wIHx8IC1vdmVyZmxvd0JvdHRvbTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2hZID0gc3RhcnQueSA8IHRoaXMuX3ZpZXdwb3J0TWFyZ2luID8gKHZpZXdwb3J0LnRvcCAtIHNjcm9sbFBvc2l0aW9uLnRvcCkgLSBzdGFydC55IDogMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcHJldmlvdXNQdXNoQW1vdW50ID0geyB4OiBwdXNoWCwgeTogcHVzaFkgfTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiBzdGFydC54ICsgcHVzaFgsCiAgICAgICAgICAgIHk6IHN0YXJ0LnkgKyBwdXNoWSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBBcHBsaWVzIGEgY29tcHV0ZWQgcG9zaXRpb24gdG8gdGhlIG92ZXJsYXkgYW5kIGVtaXRzIGEgcG9zaXRpb24gY2hhbmdlLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHByZWZlcmVuY2UKICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9pbnQgVGhlIHBvaW50IG9uIHRoZSBvcmlnaW4gZWxlbWVudCB3aGVyZSB0aGUgb3ZlcmxheSBpcyBjb25uZWN0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlQb3NpdGlvbihwb3NpdGlvbiwgb3JpZ2luUG9pbnQpIHsKICAgICAgICB0aGlzLl9zZXRUcmFuc2Zvcm1PcmlnaW4ocG9zaXRpb24pOwogICAgICAgIHRoaXMuX3NldE92ZXJsYXlFbGVtZW50U3R5bGVzKG9yaWdpblBvaW50LCBwb3NpdGlvbik7CiAgICAgICAgdGhpcy5fc2V0Qm91bmRpbmdCb3hTdHlsZXMob3JpZ2luUG9pbnQsIHBvc2l0aW9uKTsKICAgICAgICBpZiAocG9zaXRpb24ucGFuZWxDbGFzcykgewogICAgICAgICAgICB0aGlzLl9hZGRQYW5lbENsYXNzZXMocG9zaXRpb24ucGFuZWxDbGFzcyk7CiAgICAgICAgfQogICAgICAgIC8vIFNhdmUgdGhlIGxhc3QgY29ubmVjdGVkIHBvc2l0aW9uIGluIGNhc2UgdGhlIHBvc2l0aW9uIG5lZWRzIHRvIGJlIHJlLWNhbGN1bGF0ZWQuCiAgICAgICAgdGhpcy5fbGFzdFBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgICAgLy8gTm90aWZ5IHRoYXQgdGhlIHBvc2l0aW9uIGhhcyBiZWVuIGNoYW5nZWQgYWxvbmcgd2l0aCBpdHMgY2hhbmdlIHByb3BlcnRpZXMuCiAgICAgICAgLy8gV2Ugb25seSBlbWl0IGlmIHdlJ3ZlIGdvdCBhbnkgc3Vic2NyaXB0aW9ucywgYmVjYXVzZSB0aGUgc2Nyb2xsIHZpc2liaWxpdHkKICAgICAgICAvLyBjYWxjdWxjYXRpb25zIGNhbiBiZSBzb21ld2hhdCBleHBlbnNpdmUuCiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5vYnNlcnZlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0U2Nyb2xsVmlzaWJpbGl0eSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNoYW5nZUV2ZW50ID0gbmV3IENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZShwb3NpdGlvbiwgc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25DaGFuZ2VzLm5leHQoY2hhbmdlRXZlbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pc0luaXRpYWxSZW5kZXIgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgdHJhbnNmb3JtIG9yaWdpbiBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBzZWxlY3RvciBhbmQgdGhlIHBhc3NlZC1pbiBwb3NpdGlvbi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VHJhbnNmb3JtT3JpZ2luKHBvc2l0aW9uKSB7CiAgICAgICAgaWYgKCF0aGlzLl90cmFuc2Zvcm1PcmlnaW5TZWxlY3RvcikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50cyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9ib3VuZGluZ0JveCkpLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgeE9yaWdpbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHlPcmlnaW4gPSBwb3NpdGlvbi5vdmVybGF5WTsKICAgICAgICBpZiAocG9zaXRpb24ub3ZlcmxheVggPT09ICdjZW50ZXInKSB7CiAgICAgICAgICAgIHhPcmlnaW4gPSAnY2VudGVyJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5faXNSdGwoKSkgewogICAgICAgICAgICB4T3JpZ2luID0gcG9zaXRpb24ub3ZlcmxheVggPT09ICdzdGFydCcgPyAncmlnaHQnIDogJ2xlZnQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgeE9yaWdpbiA9IHBvc2l0aW9uLm92ZXJsYXlYID09PSAnc3RhcnQnID8gJ2xlZnQnIDogJ3JpZ2h0JzsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBlbGVtZW50c1tpXS5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBgJHt4T3JpZ2lufSAke3lPcmlnaW59YDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZSBvdmVybGF5J3Mgc2l6aW5nIGNvbnRhaW5lci4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vIG1lYXN1cmluZyBhbmQgYXBwbGllcyBubyBzdHlsZXMgc28gdGhhdCB3ZSBjYW4gY2hlYXBseSBjb21wdXRlIHRoZQogICAgICogYm91bmRzIGZvciBhbGwgcG9zaXRpb25zIGFuZCBjaG9vc2UgdGhlIGJlc3QgZml0IGJhc2VkIG9uIHRoZXNlIHJlc3VsdHMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYWxjdWxhdGVCb3VuZGluZ0JveFJlY3Qob3JpZ2luLCBwb3NpdGlvbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuX3ZpZXdwb3J0UmVjdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNSdGwgPSB0aGlzLl9pc1J0bCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaGVpZ2h0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdG9wOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYm90dG9tOwogICAgICAgIGlmIChwb3NpdGlvbi5vdmVybGF5WSA9PT0gJ3RvcCcpIHsKICAgICAgICAgICAgLy8gT3ZlcmxheSBpcyBvcGVuaW5nICJkb3dud2FyZCIgYW5kIHRodXMgaXMgYm91bmQgYnkgdGhlIGJvdHRvbSB2aWV3cG9ydCBlZGdlLgogICAgICAgICAgICB0b3AgPSBvcmlnaW4ueTsKICAgICAgICAgICAgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0IC0gdG9wICsgdGhpcy5fdmlld3BvcnRNYXJnaW47CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLm92ZXJsYXlZID09PSAnYm90dG9tJykgewogICAgICAgICAgICAvLyBPdmVybGF5IGlzIG9wZW5pbmcgInVwd2FyZCIgYW5kIHRodXMgaXMgYm91bmQgYnkgdGhlIHRvcCB2aWV3cG9ydCBlZGdlLiBXZSBuZWVkIHRvIGFkZAogICAgICAgICAgICAvLyB0aGUgdmlld3BvcnQgbWFyZ2luIGJhY2sgaW4sIGJlY2F1c2UgdGhlIHZpZXdwb3J0IHJlY3QgaXMgbmFycm93ZWQgZG93biB0byByZW1vdmUgdGhlCiAgICAgICAgICAgIC8vIG1hcmdpbiwgd2hlcmVhcyB0aGUgYG9yaWdpbmAgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBpdHMgYENsaWVudFJlY3RgLgogICAgICAgICAgICBib3R0b20gPSB2aWV3cG9ydC5oZWlnaHQgLSBvcmlnaW4ueSArIHRoaXMuX3ZpZXdwb3J0TWFyZ2luICogMjsKICAgICAgICAgICAgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0IC0gYm90dG9tICsgdGhpcy5fdmlld3BvcnRNYXJnaW47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBJZiBuZWl0aGVyIHRvcCBub3IgYm90dG9tLCBpdCBtZWFucyB0aGF0IHRoZSBvdmVybGF5IGlzIHZlcnRpY2FsbHkgY2VudGVyZWQgb24gdGhlCiAgICAgICAgICAgIC8vIG9yaWdpbiBwb2ludC4gTm90ZSB0aGF0IHdlIHdhbnQgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgcmF0aGVyIHRoYW4KICAgICAgICAgICAgLy8gdGhlIHBhZ2UsIHdoaWNoIGlzIHdoeSB3ZSBkb24ndCB1c2Ugc29tZXRoaW5nIGxpa2UgYHZpZXdwb3J0LmJvdHRvbSAtIG9yaWdpbi55YCBhbmQKICAgICAgICAgICAgLy8gYG9yaWdpbi55IC0gdmlld3BvcnQudG9wYC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzbWFsbGVzdERpc3RhbmNlVG9WaWV3cG9ydEVkZ2UgPSBNYXRoLm1pbih2aWV3cG9ydC5ib3R0b20gLSBvcmlnaW4ueSArIHZpZXdwb3J0LnRvcCwgb3JpZ2luLnkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSGVpZ2h0ID0gdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQ7CiAgICAgICAgICAgIGhlaWdodCA9IHNtYWxsZXN0RGlzdGFuY2VUb1ZpZXdwb3J0RWRnZSAqIDI7CiAgICAgICAgICAgIHRvcCA9IG9yaWdpbi55IC0gc21hbGxlc3REaXN0YW5jZVRvVmlld3BvcnRFZGdlOwogICAgICAgICAgICBpZiAoaGVpZ2h0ID4gcHJldmlvdXNIZWlnaHQgJiYgIXRoaXMuX2lzSW5pdGlhbFJlbmRlciAmJiAhdGhpcy5fZ3Jvd0FmdGVyT3BlbikgewogICAgICAgICAgICAgICAgdG9wID0gb3JpZ2luLnkgLSAocHJldmlvdXNIZWlnaHQgLyAyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUaGUgb3ZlcmxheSBpcyBvcGVuaW5nICdyaWdodC13YXJkJyAodGhlIGNvbnRlbnQgZmxvd3MgdG8gdGhlIHJpZ2h0KS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNCb3VuZGVkQnlSaWdodFZpZXdwb3J0RWRnZSA9IChwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ3N0YXJ0JyAmJiAhaXNSdGwpIHx8CiAgICAgICAgICAgIChwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ2VuZCcgJiYgaXNSdGwpOwogICAgICAgIC8vIFRoZSBvdmVybGF5IGlzIG9wZW5pbmcgJ2xlZnQtd2FyZCcgKHRoZSBjb250ZW50IGZsb3dzIHRvIHRoZSBsZWZ0KS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNCb3VuZGVkQnlMZWZ0Vmlld3BvcnRFZGdlID0gKHBvc2l0aW9uLm92ZXJsYXlYID09PSAnZW5kJyAmJiAhaXNSdGwpIHx8CiAgICAgICAgICAgIChwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ3N0YXJ0JyAmJiBpc1J0bCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB3aWR0aDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGxlZnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByaWdodDsKICAgICAgICBpZiAoaXNCb3VuZGVkQnlMZWZ0Vmlld3BvcnRFZGdlKSB7CiAgICAgICAgICAgIHJpZ2h0ID0gdmlld3BvcnQud2lkdGggLSBvcmlnaW4ueCArIHRoaXMuX3ZpZXdwb3J0TWFyZ2luOwogICAgICAgICAgICB3aWR0aCA9IG9yaWdpbi54IC0gdGhpcy5fdmlld3BvcnRNYXJnaW47CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzQm91bmRlZEJ5UmlnaHRWaWV3cG9ydEVkZ2UpIHsKICAgICAgICAgICAgbGVmdCA9IG9yaWdpbi54OwogICAgICAgICAgICB3aWR0aCA9IHZpZXdwb3J0LnJpZ2h0IC0gb3JpZ2luLng7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBJZiBuZWl0aGVyIHN0YXJ0IG5vciBlbmQsIGl0IG1lYW5zIHRoYXQgdGhlIG92ZXJsYXkgaXMgaG9yaXpvbnRhbGx5IGNlbnRlcmVkIG9uIHRoZQogICAgICAgICAgICAvLyBvcmlnaW4gcG9pbnQuIE5vdGUgdGhhdCB3ZSB3YW50IHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQsIHJhdGhlciB0aGFuCiAgICAgICAgICAgIC8vIHRoZSBwYWdlLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QgdXNlIHNvbWV0aGluZyBsaWtlIGB2aWV3cG9ydC5yaWdodCAtIG9yaWdpbi54YCBhbmQKICAgICAgICAgICAgLy8gYG9yaWdpbi54IC0gdmlld3BvcnQubGVmdGAuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc21hbGxlc3REaXN0YW5jZVRvVmlld3BvcnRFZGdlID0gTWF0aC5taW4odmlld3BvcnQucmlnaHQgLSBvcmlnaW4ueCArIHZpZXdwb3J0LmxlZnQsIG9yaWdpbi54KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c1dpZHRoID0gdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS53aWR0aDsKICAgICAgICAgICAgd2lkdGggPSBzbWFsbGVzdERpc3RhbmNlVG9WaWV3cG9ydEVkZ2UgKiAyOwogICAgICAgICAgICBsZWZ0ID0gb3JpZ2luLnggLSBzbWFsbGVzdERpc3RhbmNlVG9WaWV3cG9ydEVkZ2U7CiAgICAgICAgICAgIGlmICh3aWR0aCA+IHByZXZpb3VzV2lkdGggJiYgIXRoaXMuX2lzSW5pdGlhbFJlbmRlciAmJiAhdGhpcy5fZ3Jvd0FmdGVyT3BlbikgewogICAgICAgICAgICAgICAgbGVmdCA9IG9yaWdpbi54IC0gKHByZXZpb3VzV2lkdGggLyAyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4geyB0b3A6ICgvKiogQHR5cGUgez99ICovICh0b3ApKSwgbGVmdDogKC8qKiBAdHlwZSB7P30gKi8gKGxlZnQpKSwgYm90dG9tOiAoLyoqIEB0eXBlIHs/fSAqLyAoYm90dG9tKSksIHJpZ2h0OiAoLyoqIEB0eXBlIHs/fSAqLyAocmlnaHQpKSwgd2lkdGgsIGhlaWdodCB9OwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgb3ZlcmxheSdzIHNpemluZyB3cmFwcGVyLiBUaGUgd3JhcHBlciBpcyBwb3NpdGlvbmVkIG9uIHRoZQogICAgICogb3JpZ2luJ3MgY29ubmVjdGlvbiBwb2ludCBhbmQgc3RldGNoZXMgdG8gdGhlIGJvdW5kcyBvZiB0aGUgdmlld3BvcnQuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3JpZ2luIFRoZSBwb2ludCBvbiB0aGUgb3JpZ2luIGVsZW1lbnQgd2hlcmUgdGhlIG92ZXJsYXkgaXMgY29ubmVjdGVkLgogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gcHJlZmVyZW5jZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldEJvdW5kaW5nQm94U3R5bGVzKG9yaWdpbiwgcG9zaXRpb24pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYm91bmRpbmdCb3hSZWN0ID0gdGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KG9yaWdpbiwgcG9zaXRpb24pOwogICAgICAgIC8vIEl0J3Mgd2VpcmQgaWYgdGhlIG92ZXJsYXkgKmdyb3dzKiB3aGlsZSBzY3JvbGxpbmcsIHNvIHdlIHRha2UgdGhlIGxhc3Qgc2l6ZSBpbnRvIGFjY291bnQKICAgICAgICAvLyB3aGVuIGFwcGx5aW5nIGEgbmV3IHNpemUuCiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxSZW5kZXIgJiYgIXRoaXMuX2dyb3dBZnRlck9wZW4pIHsKICAgICAgICAgICAgYm91bmRpbmdCb3hSZWN0LmhlaWdodCA9IE1hdGgubWluKGJvdW5kaW5nQm94UmVjdC5oZWlnaHQsIHRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUuaGVpZ2h0KTsKICAgICAgICAgICAgYm91bmRpbmdCb3hSZWN0LndpZHRoID0gTWF0aC5taW4oYm91bmRpbmdCb3hSZWN0LndpZHRoLCB0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0eWxlcyA9ICgvKiogQHR5cGUgez99ICovICh7fSkpOwogICAgICAgIGlmICh0aGlzLl9oYXNFeGFjdFBvc2l0aW9uKCkpIHsKICAgICAgICAgICAgc3R5bGVzLnRvcCA9IHN0eWxlcy5sZWZ0ID0gJzAnOwogICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gc3R5bGVzLnJpZ2h0ID0gc3R5bGVzLm1heEhlaWdodCA9IHN0eWxlcy5tYXhXaWR0aCA9ICcnOwogICAgICAgICAgICBzdHlsZXMud2lkdGggPSBzdHlsZXMuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLm1heEhlaWdodDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWF4V2lkdGg7CiAgICAgICAgICAgIHN0eWxlcy5oZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGJvdW5kaW5nQm94UmVjdC5oZWlnaHQpOwogICAgICAgICAgICBzdHlsZXMudG9wID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShib3VuZGluZ0JveFJlY3QudG9wKTsKICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoYm91bmRpbmdCb3hSZWN0LmJvdHRvbSk7CiAgICAgICAgICAgIHN0eWxlcy53aWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoYm91bmRpbmdCb3hSZWN0LndpZHRoKTsKICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGJvdW5kaW5nQm94UmVjdC5sZWZ0KTsKICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShib3VuZGluZ0JveFJlY3QucmlnaHQpOwogICAgICAgICAgICAvLyBQdXNoIHRoZSBwYW5lIGNvbnRlbnQgdG93YXJkcyB0aGUgcHJvcGVyIGRpcmVjdGlvbi4KICAgICAgICAgICAgaWYgKHBvc2l0aW9uLm92ZXJsYXlYID09PSAnY2VudGVyJykgewogICAgICAgICAgICAgICAgc3R5bGVzLmFsaWduSXRlbXMgPSAnY2VudGVyJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHN0eWxlcy5hbGlnbkl0ZW1zID0gcG9zaXRpb24ub3ZlcmxheVggPT09ICdlbmQnID8gJ2ZsZXgtZW5kJyA6ICdmbGV4LXN0YXJ0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9zaXRpb24ub3ZlcmxheVkgPT09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICBzdHlsZXMuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHN0eWxlcy5qdXN0aWZ5Q29udGVudCA9IHBvc2l0aW9uLm92ZXJsYXlZID09PSAnYm90dG9tJyA/ICdmbGV4LWVuZCcgOiAnZmxleC1zdGFydCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1heEhlaWdodCkgewogICAgICAgICAgICAgICAgc3R5bGVzLm1heEhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUobWF4SGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWF4V2lkdGgpIHsKICAgICAgICAgICAgICAgIHN0eWxlcy5tYXhXaWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUobWF4V2lkdGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUgPSBib3VuZGluZ0JveFJlY3Q7CiAgICAgICAgZXh0ZW5kU3R5bGVzKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9ib3VuZGluZ0JveCkpLnN0eWxlLCBzdHlsZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIHN0eWxlcyBmb3IgdGhlIGJvdW5kaW5nIGJveCBzbyB0aGF0IGEgbmV3IHBvc2l0aW9uaW5nIGNhbiBiZSBjb21wdXRlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVzZXRCb3VuZGluZ0JveFN0eWxlcygpIHsKICAgICAgICBleHRlbmRTdHlsZXMoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2JvdW5kaW5nQm94KSkuc3R5bGUsICgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgICAgIHRvcDogJzAnLAogICAgICAgICAgICBsZWZ0OiAnMCcsCiAgICAgICAgICAgIHJpZ2h0OiAnMCcsCiAgICAgICAgICAgIGJvdHRvbTogJzAnLAogICAgICAgICAgICBoZWlnaHQ6ICcnLAogICAgICAgICAgICB3aWR0aDogJycsCiAgICAgICAgICAgIGFsaWduSXRlbXM6ICcnLAogICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJycsCiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXRzIHRoZSBzdHlsZXMgZm9yIHRoZSBvdmVybGF5IHBhbmUgc28gdGhhdCBhIG5ldyBwb3NpdGlvbmluZyBjYW4gYmUgY29tcHV0ZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKSB7CiAgICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuX3BhbmUuc3R5bGUsICgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgICAgIHRvcDogJycsCiAgICAgICAgICAgIGxlZnQ6ICcnLAogICAgICAgICAgICBib3R0b206ICcnLAogICAgICAgICAgICByaWdodDogJycsCiAgICAgICAgICAgIHBvc2l0aW9uOiAnJywKICAgICAgICAgICAgdHJhbnNmb3JtOiAnJywKICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHBvc2l0aW9uaW5nIHN0eWxlcyB0byB0aGUgb3ZlcmxheSBlbGVtZW50LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9pbnQKICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRPdmVybGF5RWxlbWVudFN0eWxlcyhvcmlnaW5Qb2ludCwgcG9zaXRpb24pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHt9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhc0V4YWN0UG9zaXRpb24gPSB0aGlzLl9oYXNFeGFjdFBvc2l0aW9uKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhc0ZsZXhpYmxlRGltZW5zaW9ucyA9IHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9uczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKTsKICAgICAgICBpZiAoaGFzRXhhY3RQb3NpdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7CiAgICAgICAgICAgIGV4dGVuZFN0eWxlcyhzdHlsZXMsIHRoaXMuX2dldEV4YWN0T3ZlcmxheVkocG9zaXRpb24sIG9yaWdpblBvaW50LCBzY3JvbGxQb3NpdGlvbikpOwogICAgICAgICAgICBleHRlbmRTdHlsZXMoc3R5bGVzLCB0aGlzLl9nZXRFeGFjdE92ZXJsYXlYKHBvc2l0aW9uLCBvcmlnaW5Qb2ludCwgc2Nyb2xsUG9zaXRpb24pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN0eWxlcy5wb3NpdGlvbiA9ICdzdGF0aWMnOwogICAgICAgIH0KICAgICAgICAvLyBVc2UgYSB0cmFuc2Zvcm0gdG8gYXBwbHkgdGhlIG9mZnNldHMuIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgYGNlbnRlcmAgcG9zaXRpb25zIHJlbHkgb24KICAgICAgICAvLyBiZWluZyBpbiB0aGUgbm9ybWFsIGZsZXggZmxvdyBhbmQgc2V0dGluZyBhIGB0b3BgIC8gYGxlZnRgIGF0IGFsbCB3aWxsIGNvbXBsZXRlbHkgdGhyb3cKICAgICAgICAvLyBvZmYgdGhlIHBvc2l0aW9uLiBXZSBhbHNvIGNhbid0IHVzZSBtYXJnaW5zLCBiZWNhdXNlIHRoZXkgd29uJ3QgaGF2ZSBhbiBlZmZlY3QgaW4gc29tZQogICAgICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0byAicHVzaCBvZmYgb2YiLiBGaW5hbGx5LCB0aGlzIHdvcmtzCiAgICAgICAgLy8gYmV0dGVyIGJvdGggd2l0aCBmbGV4aWJsZSBhbmQgbm9uLWZsZXhpYmxlIHBvc2l0aW9uaW5nLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdHJhbnNmb3JtU3RyaW5nID0gJyc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvZmZzZXRYID0gdGhpcy5fZ2V0T2Zmc2V0KHBvc2l0aW9uLCAneCcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuX2dldE9mZnNldChwb3NpdGlvbiwgJ3knKTsKICAgICAgICBpZiAob2Zmc2V0WCkgewogICAgICAgICAgICB0cmFuc2Zvcm1TdHJpbmcgKz0gYHRyYW5zbGF0ZVgoJHtvZmZzZXRYfXB4KSBgOwogICAgICAgIH0KICAgICAgICBpZiAob2Zmc2V0WSkgewogICAgICAgICAgICB0cmFuc2Zvcm1TdHJpbmcgKz0gYHRyYW5zbGF0ZVkoJHtvZmZzZXRZfXB4KWA7CiAgICAgICAgfQogICAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJpbmcudHJpbSgpOwogICAgICAgIC8vIElmIGEgbWF4V2lkdGggb3IgbWF4SGVpZ2h0IGlzIHNwZWNpZmllZCBvbiB0aGUgb3ZlcmxheSwgd2UgcmVtb3ZlIHRoZW0uIFdlIGRvIHRoaXMgYmVjYXVzZQogICAgICAgIC8vIHdlIG5lZWQgdGhlc2UgdmFsdWVzIHRvIGJvdGggYmUgc2V0IHRvICIxMDAlIiBmb3IgdGhlIGF1dG9tYXRpYyBmbGV4aWJsZSBzaXppbmcgdG8gd29yay4KICAgICAgICAvLyBUaGUgbWF4SGVpZ2h0IGFuZCBtYXhXaWR0aCBhcmUgc2V0IG9uIHRoZSBib3VuZGluZ0JveCBpbiBvcmRlciB0byBlbmZvcmNlIHRoZSBjb25zdHJhaW50LgogICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgYXBwbHkgd2hlbiB3ZSBoYXZlIGFuIGV4YWN0IHBvc2l0aW9uLCBpbiB3aGljaCBjYXNlIHdlIGRvIHdhbnQgdG8KICAgICAgICAvLyBhcHBseSB0aGVtIGJlY2F1c2UgdGhleSdsbCBiZSBjbGVhcmVkIGZyb20gdGhlIGJvdW5kaW5nIGJveC4KICAgICAgICBpZiAoY29uZmlnLm1heEhlaWdodCkgewogICAgICAgICAgICBpZiAoaGFzRXhhY3RQb3NpdGlvbikgewogICAgICAgICAgICAgICAgc3R5bGVzLm1heEhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoY29uZmlnLm1heEhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaGFzRmxleGlibGVEaW1lbnNpb25zKSB7CiAgICAgICAgICAgICAgICBzdHlsZXMubWF4SGVpZ2h0ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGNvbmZpZy5tYXhXaWR0aCkgewogICAgICAgICAgICBpZiAoaGFzRXhhY3RQb3NpdGlvbikgewogICAgICAgICAgICAgICAgc3R5bGVzLm1heFdpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjb25maWcubWF4V2lkdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGhhc0ZsZXhpYmxlRGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgc3R5bGVzLm1heFdpZHRoID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuX3BhbmUuc3R5bGUsIHN0eWxlcyk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIGV4YWN0IHRvcC9ib3R0b20gZm9yIHRoZSBvdmVybGF5IHdoZW4gbm90IHVzaW5nIGZsZXhpYmxlIHNpemluZyBvciB3aGVuIHB1c2hpbmcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICogQHBhcmFtIHs/fSBvcmlnaW5Qb2ludAogICAgICogQHBhcmFtIHs/fSBzY3JvbGxQb3NpdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEV4YWN0T3ZlcmxheVkocG9zaXRpb24sIG9yaWdpblBvaW50LCBzY3JvbGxQb3NpdGlvbikgewogICAgICAgIC8vIFJlc2V0IGFueSBleGlzdGluZyBzdHlsZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGluIGNhc2UgdGhlCiAgICAgICAgLy8gcHJlZmVycmVkIHBvc2l0aW9uIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGBhcHBseWAuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdHlsZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoeyB0b3A6ICcnLCBib3R0b206ICcnIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG92ZXJsYXlQb2ludCA9IHRoaXMuX2dldE92ZXJsYXlQb2ludChvcmlnaW5Qb2ludCwgdGhpcy5fb3ZlcmxheVJlY3QsIHBvc2l0aW9uKTsKICAgICAgICBpZiAodGhpcy5faXNQdXNoZWQpIHsKICAgICAgICAgICAgb3ZlcmxheVBvaW50ID0gdGhpcy5fcHVzaE92ZXJsYXlPblNjcmVlbihvdmVybGF5UG9pbnQsIHRoaXMuX292ZXJsYXlSZWN0LCBzY3JvbGxQb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmlydHVhbEtleWJvYXJkT2Zmc2V0ID0gdGhpcy5fb3ZlcmxheUNvbnRhaW5lci5nZXRDb250YWluZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwogICAgICAgIC8vIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgemVybywgaG93ZXZlciB3aGVuIHRoZSBvdmVybGF5IGlzIGF0dGFjaGVkIHRvIGFuIGlucHV0IChlLmcuIGluIGFuCiAgICAgICAgLy8gYXV0b2NvbXBsZXRlKSwgbW9iaWxlIGJyb3dzZXJzIHdpbGwgc2hpZnQgZXZlcnl0aGluZyBpbiBvcmRlciB0byBwdXQgdGhlIGlucHV0IGluIHRoZSBtaWRkbGUKICAgICAgICAvLyBvZiB0aGUgc2NyZWVuIGFuZCB0byBtYWtlIHNwYWNlIGZvciB0aGUgdmlydHVhbCBrZXlib2FyZC4gV2UgbmVlZCB0byBhY2NvdW50IGZvciB0aGlzIG9mZnNldCwKICAgICAgICAvLyBvdGhlcndpc2Ugb3VyIHBvc2l0aW9uaW5nIHdpbGwgYmUgdGhyb3duIG9mZi4KICAgICAgICBvdmVybGF5UG9pbnQueSAtPSB2aXJ0dWFsS2V5Ym9hcmRPZmZzZXQ7CiAgICAgICAgLy8gV2Ugd2FudCB0byBzZXQgZWl0aGVyIGB0b3BgIG9yIGBib3R0b21gIGJhc2VkIG9uIHdoZXRoZXIgdGhlIG92ZXJsYXkgd2FudHMgdG8gYXBwZWFyCiAgICAgICAgLy8gYWJvdmUgb3IgYmVsb3cgdGhlIG9yaWdpbiBhbmQgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgZWxlbWVudCB3aWxsIGV4cGFuZC4KICAgICAgICBpZiAocG9zaXRpb24ub3ZlcmxheVkgPT09ICdib3R0b20nKSB7CiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGJvdHRvbWAsIHdlIGFkanVzdCB0aGUgeSBwb3NpdGlvbiBzdWNoIHRoYXQgaXQgaXMgdGhlIGRpc3RhbmNlCiAgICAgICAgICAgIC8vIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgdmlld3BvcnQgcmF0aGVyIHRoYW4gdGhlIHRvcC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb2N1bWVudEhlaWdodCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBgJHtkb2N1bWVudEhlaWdodCAtIChvdmVybGF5UG9pbnQueSArIHRoaXMuX292ZXJsYXlSZWN0LmhlaWdodCl9cHhgOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUob3ZlcmxheVBvaW50LnkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGVzOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBleGFjdCBsZWZ0L3JpZ2h0IGZvciB0aGUgb3ZlcmxheSB3aGVuIG5vdCB1c2luZyBmbGV4aWJsZSBzaXppbmcgb3Igd2hlbiBwdXNoaW5nLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9pbnQKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsUG9zaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRFeGFjdE92ZXJsYXlYKHBvc2l0aW9uLCBvcmlnaW5Qb2ludCwgc2Nyb2xsUG9zaXRpb24pIHsKICAgICAgICAvLyBSZXNldCBhbnkgZXhpc3Rpbmcgc3R5bGVzLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIHRoZSBwcmVmZXJyZWQgcG9zaXRpb24gaGFzCiAgICAgICAgLy8gY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBgYXBwbHlgLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3R5bGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHsgbGVmdDogJycsIHJpZ2h0OiAnJyB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvdmVybGF5UG9pbnQgPSB0aGlzLl9nZXRPdmVybGF5UG9pbnQob3JpZ2luUG9pbnQsIHRoaXMuX292ZXJsYXlSZWN0LCBwb3NpdGlvbik7CiAgICAgICAgaWYgKHRoaXMuX2lzUHVzaGVkKSB7CiAgICAgICAgICAgIG92ZXJsYXlQb2ludCA9IHRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4ob3ZlcmxheVBvaW50LCB0aGlzLl9vdmVybGF5UmVjdCwgc2Nyb2xsUG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICAvLyBXZSB3YW50IHRvIHNldCBlaXRoZXIgYGxlZnRgIG9yIGByaWdodGAgYmFzZWQgb24gd2hldGhlciB0aGUgb3ZlcmxheSB3YW50cyB0byBhcHBlYXIgImJlZm9yZSIKICAgICAgICAvLyBvciAiYWZ0ZXIiIHRoZSBvcmlnaW4sIHdoaWNoIGRldGVybWluZXMgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgZWxlbWVudCB3aWxsIGV4cGFuZC4KICAgICAgICAvLyBGb3IgdGhlIGhvcml6b250YWwgYXhpcywgdGhlIG1lYW5pbmcgb2YgImJlZm9yZSIgYW5kICJhZnRlciIgY2hhbmdlIGJhc2VkIG9uIHdoZXRoZXIgdGhlCiAgICAgICAgLy8gcGFnZSBpcyBpbiBSVEwgb3IgTFRSLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaG9yaXpvbnRhbFN0eWxlUHJvcGVydHk7CiAgICAgICAgaWYgKHRoaXMuX2lzUnRsKCkpIHsKICAgICAgICAgICAgaG9yaXpvbnRhbFN0eWxlUHJvcGVydHkgPSBwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ2VuZCcgPyAnbGVmdCcgOiAncmlnaHQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaG9yaXpvbnRhbFN0eWxlUHJvcGVydHkgPSBwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ2VuZCcgPyAncmlnaHQnIDogJ2xlZnQnOwogICAgICAgIH0KICAgICAgICAvLyBXaGVuIHdlJ3JlIHNldHRpbmcgYHJpZ2h0YCwgd2UgYWRqdXN0IHRoZSB4IHBvc2l0aW9uIHN1Y2ggdGhhdCBpdCBpcyB0aGUgZGlzdGFuY2UKICAgICAgICAvLyBmcm9tIHRoZSByaWdodCBlZGdlIG9mIHRoZSB2aWV3cG9ydCByYXRoZXIgdGhhbiB0aGUgbGVmdCBlZGdlLgogICAgICAgIGlmIChob3Jpem9udGFsU3R5bGVQcm9wZXJ0eSA9PT0gJ3JpZ2h0JykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50V2lkdGggPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuY2xpZW50V2lkdGg7CiAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IGAke2RvY3VtZW50V2lkdGggLSAob3ZlcmxheVBvaW50LnggKyB0aGlzLl9vdmVybGF5UmVjdC53aWR0aCl9cHhgOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKG92ZXJsYXlQb2ludC54KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgdmlldyBwcm9wZXJ0aWVzIG9mIHRoZSB0cmlnZ2VyIGFuZCBvdmVybGF5LCBpbmNsdWRpbmcgd2hldGhlciB0aGV5IGFyZSBjbGlwcGVkCiAgICAgKiBvciBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIHZpZXcgb2YgYW55IG9mIHRoZSBzdHJhdGVneSdzIHNjcm9sbGFibGVzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRTY3JvbGxWaXNpYmlsaXR5KCkgewogICAgICAgIC8vIE5vdGU6IG5lZWRzIGZyZXNoIHJlY3RzIHNpbmNlIHRoZSBwb3NpdGlvbiBjb3VsZCd2ZSBjaGFuZ2VkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcmlnaW5Cb3VuZHMgPSB0aGlzLl9nZXRPcmlnaW5SZWN0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG92ZXJsYXlCb3VuZHMgPSB0aGlzLl9wYW5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIC8vIFRPRE8oamVsYm91cm4pOiBpbnN0ZWFkIG9mIG5lZWRpbmcgYWxsIG9mIHRoZSBjbGllbnQgcmVjdHMgZm9yIHRoZXNlIHNjcm9sbGluZyBjb250YWluZXJzCiAgICAgICAgLy8gZXZlcnkgdGltZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSBzY3JvbGxUb3Agb2YgdGhlIGNvbnRhaW5lcnMgaWYgdGhlIHNpemUgb2YgdGhvc2UKICAgICAgICAvLyBjb250YWluZXJzIGhhc24ndCBjaGFuZ2VkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJCb3VuZHMgPSB0aGlzLl9zY3JvbGxhYmxlcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsYWJsZSA9PiB7CiAgICAgICAgICAgIHJldHVybiBzY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBpc09yaWdpbkNsaXBwZWQ6IGlzRWxlbWVudENsaXBwZWRCeVNjcm9sbGluZyhvcmlnaW5Cb3VuZHMsIHNjcm9sbENvbnRhaW5lckJvdW5kcyksCiAgICAgICAgICAgIGlzT3JpZ2luT3V0c2lkZVZpZXc6IGlzRWxlbWVudFNjcm9sbGVkT3V0c2lkZVZpZXcob3JpZ2luQm91bmRzLCBzY3JvbGxDb250YWluZXJCb3VuZHMpLAogICAgICAgICAgICBpc092ZXJsYXlDbGlwcGVkOiBpc0VsZW1lbnRDbGlwcGVkQnlTY3JvbGxpbmcob3ZlcmxheUJvdW5kcywgc2Nyb2xsQ29udGFpbmVyQm91bmRzKSwKICAgICAgICAgICAgaXNPdmVybGF5T3V0c2lkZVZpZXc6IGlzRWxlbWVudFNjcm9sbGVkT3V0c2lkZVZpZXcob3ZlcmxheUJvdW5kcywgc2Nyb2xsQ29udGFpbmVyQm91bmRzKSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBTdWJ0cmFjdHMgdGhlIGFtb3VudCB0aGF0IGFuIGVsZW1lbnQgaXMgb3ZlcmZsb3dpbmcgb24gYW4gYXhpcyBmcm9tIGl0cyBsZW5ndGguCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBsZW5ndGgKICAgICAqIEBwYXJhbSB7Li4uP30gb3ZlcmZsb3dzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc3VidHJhY3RPdmVyZmxvd3MobGVuZ3RoLCAuLi5vdmVyZmxvd3MpIHsKICAgICAgICByZXR1cm4gb3ZlcmZsb3dzLnJlZHVjZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmFsdWUKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRPdmVyZmxvdwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGN1cnJlbnRWYWx1ZSwgY3VycmVudE92ZXJmbG93KSA9PiB7CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWUgLSBNYXRoLm1heChjdXJyZW50T3ZlcmZsb3csIDApOwogICAgICAgIH0pLCBsZW5ndGgpOwogICAgfQogICAgLyoqCiAgICAgKiBOYXJyb3dzIHRoZSBnaXZlbiB2aWV3cG9ydCByZWN0IGJ5IHRoZSBjdXJyZW50IF92aWV3cG9ydE1hcmdpbi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3QoKSB7CiAgICAgICAgLy8gV2UgcmVjYWxjdWxhdGUgdGhlIHZpZXdwb3J0IHJlY3QgaGVyZSBvdXJzZWx2ZXMsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBWaWV3cG9ydFJ1bGVyLAogICAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhlIGBjbGllbnRXaWR0aGAgYW5kIGBjbGllbnRIZWlnaHRgIGFzIHRoZSBiYXNlLiBUaGUgZGlmZmVyZW5jZQogICAgICAgIC8vIGJlaW5nIHRoYXQgdGhlIGNsaWVudCBwcm9wZXJ0aWVzIGRvbid0IGluY2x1ZGUgdGhlIHNjcm9sbGJhciwgYXMgb3Bwb3NlZCB0byBgaW5uZXJXaWR0aGAKICAgICAgICAvLyBhbmQgYGlubmVySGVpZ2h0YCB0aGF0IGRvLiBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUgb3ZlcmxheSBjb250YWluZXIgdXNlcwogICAgICAgIC8vIDEwMCUgYHdpZHRoYCBhbmQgYGhlaWdodGAgd2hpY2ggZG9uJ3QgaW5jbHVkZSB0aGUgc2Nyb2xsYmFyIGVpdGhlci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgd2lkdGggPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuY2xpZW50V2lkdGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhlaWdodCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKS5jbGllbnRIZWlnaHQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9wOiBzY3JvbGxQb3NpdGlvbi50b3AgKyB0aGlzLl92aWV3cG9ydE1hcmdpbiwKICAgICAgICAgICAgbGVmdDogc2Nyb2xsUG9zaXRpb24ubGVmdCArIHRoaXMuX3ZpZXdwb3J0TWFyZ2luLAogICAgICAgICAgICByaWdodDogc2Nyb2xsUG9zaXRpb24ubGVmdCArIHdpZHRoIC0gdGhpcy5fdmlld3BvcnRNYXJnaW4sCiAgICAgICAgICAgIGJvdHRvbTogc2Nyb2xsUG9zaXRpb24udG9wICsgaGVpZ2h0IC0gdGhpcy5fdmlld3BvcnRNYXJnaW4sCiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAtICgyICogdGhpcy5fdmlld3BvcnRNYXJnaW4pLAogICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAtICgyICogdGhpcy5fdmlld3BvcnRNYXJnaW4pLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiBSVEwgY29udGV4dAogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pc1J0bCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5nZXREaXJlY3Rpb24oKSA9PT0gJ3J0bCc7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgb3ZlcmxheSB1c2VzIGV4YWN0IG9yIGZsZXhpYmxlIHBvc2l0aW9uaW5nLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYXNFeGFjdFBvc2l0aW9uKCkgewogICAgICAgIHJldHVybiAhdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zIHx8IHRoaXMuX2lzUHVzaGVkOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIG9mZnNldCBvZiBhIHBvc2l0aW9uIGFsb25nIHRoZSB4IG9yIHkgYXhpcy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgKiBAcGFyYW0gez99IGF4aXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRPZmZzZXQocG9zaXRpb24sIGF4aXMpIHsKICAgICAgICBpZiAoYXhpcyA9PT0gJ3gnKSB7CiAgICAgICAgICAgIC8vIFdlIGRvbid0IGRvIHNvbWV0aGluZyBsaWtlIGBwb3NpdGlvblsnb2Zmc2V0JyArIGF4aXNdYCBpbgogICAgICAgICAgICAvLyBvcmRlciB0byBhdm9pZCBicmVraW5nIG1pbmlmaWVycyB0aGF0IHJlbmFtZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICByZXR1cm4gcG9zaXRpb24ub2Zmc2V0WCA9PSBudWxsID8gdGhpcy5fb2Zmc2V0WCA6IHBvc2l0aW9uLm9mZnNldFg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbi5vZmZzZXRZID09IG51bGwgPyB0aGlzLl9vZmZzZXRZIDogcG9zaXRpb24ub2Zmc2V0WTsKICAgIH0KICAgIC8qKgogICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlcy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdmFsaWRhdGVQb3NpdGlvbnMoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKCdGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k6IEF0IGxlYXN0IG9uZSBwb3NpdGlvbiBpcyByZXF1aXJlZC4nKTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IHJlbW92ZSB0aGVzZSBvbmNlIEFuZ3VsYXIncyB0ZW1wbGF0ZSB0eXBlCiAgICAgICAgLy8gY2hlY2tpbmcgaXMgYWR2YW5jZWQgZW5vdWdoIHRvIGNhdGNoIHRoZXNlIGNhc2VzLgogICAgICAgIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhaXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhaXIgPT4gewogICAgICAgICAgICB2YWxpZGF0ZUhvcml6b250YWxQb3NpdGlvbignb3JpZ2luWCcsIHBhaXIub3JpZ2luWCk7CiAgICAgICAgICAgIHZhbGlkYXRlVmVydGljYWxQb3NpdGlvbignb3JpZ2luWScsIHBhaXIub3JpZ2luWSk7CiAgICAgICAgICAgIHZhbGlkYXRlSG9yaXpvbnRhbFBvc2l0aW9uKCdvdmVybGF5WCcsIHBhaXIub3ZlcmxheVgpOwogICAgICAgICAgICB2YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24oJ292ZXJsYXlZJywgcGFpci5vdmVybGF5WSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGRzIGEgc2luZ2xlIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIG9uIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3NzQ2xhc3NlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZFBhbmVsQ2xhc3Nlcyhjc3NDbGFzc2VzKSB7CiAgICAgICAgaWYgKHRoaXMuX3BhbmUpIHsKICAgICAgICAgICAgY29lcmNlQXJyYXkoY3NzQ2xhc3NlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3NzQ2xhc3MKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNzc0NsYXNzID0+IHsKICAgICAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPT0gJycgJiYgdGhpcy5fYXBwbGllZFBhbmVsQ2xhc3Nlcy5pbmRleE9mKGNzc0NsYXNzKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLnB1c2goY3NzQ2xhc3MpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhbmUuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENsZWFycyB0aGUgY2xhc3NlcyB0aGF0IHRoZSBwb3NpdGlvbiBzdHJhdGVneSBoYXMgYXBwbGllZCBmcm9tIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jbGVhclBhbmVsQ2xhc3NlcygpIHsKICAgICAgICBpZiAodGhpcy5fcGFuZSkgewogICAgICAgICAgICB0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNzc0NsYXNzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjc3NDbGFzcyA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYW5lLmNsYXNzTGlzdC5yZW1vdmUoY3NzQ2xhc3MpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMgPSBbXTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIENsaWVudFJlY3Qgb2YgdGhlIGN1cnJlbnQgb3JpZ2luLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRPcmlnaW5SZWN0KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcmlnaW4gPSB0aGlzLl9vcmlnaW47CiAgICAgICAgaWYgKG9yaWdpbiBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBmb3IgRWxlbWVudCBzbyBTVkcgZWxlbWVudHMgYXJlIGFsc28gc3VwcG9ydGVkLgogICAgICAgIGlmIChvcmlnaW4gaW5zdGFuY2VvZiBFbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiBvcmlnaW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB3aWR0aCA9IG9yaWdpbi53aWR0aCB8fCAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBoZWlnaHQgPSBvcmlnaW4uaGVpZ2h0IHx8IDA7CiAgICAgICAgLy8gSWYgdGhlIG9yaWdpbiBpcyBhIHBvaW50LCByZXR1cm4gYSBjbGllbnQgcmVjdCBhcyBpZiBpdCB3YXMgYSAweDAgZWxlbWVudCBhdCB0aGUgcG9pbnQuCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9wOiBvcmlnaW4ueSwKICAgICAgICAgICAgYm90dG9tOiBvcmlnaW4ueSArIGhlaWdodCwKICAgICAgICAgICAgbGVmdDogb3JpZ2luLngsCiAgICAgICAgICAgIHJpZ2h0OiBvcmlnaW4ueCArIHdpZHRoLAogICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgIHdpZHRoCiAgICAgICAgfTsKICAgIH0KfQovKioKICogU2hhbGxvdy1leHRlbmRzIGEgc3R5bGVzaGVldCBvYmplY3Qgd2l0aCBhbm90aGVyIHN0eWxlc2hlZXQgb2JqZWN0LgogKiBAcGFyYW0gez99IGRlc3RpbmF0aW9uCiAqIEBwYXJhbSB7P30gc291cmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleHRlbmRTdHlsZXMoZGVzdGluYXRpb24sIHNvdXJjZSkgewogICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkgewogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICBkZXN0aW5hdGlvbltrZXldID0gc291cmNlW2tleV07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGRlc3RpbmF0aW9uOwp9Ci8qKgogKiBFeHRyYWN0cyB0aGUgcGl4ZWwgdmFsdWUgYXMgYSBudW1iZXIgZnJvbSBhIHZhbHVlLCBpZiBpdCdzIGEgbnVtYmVyCiAqIG9yIGEgQ1NTIHBpeGVsIHN0cmluZyAoZS5nLiBgMTMzN3B4YCkuIE90aGVyd2lzZSByZXR1cm5zIG51bGwuCiAqIEBwYXJhbSB7P30gaW5wdXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBpeGVsVmFsdWUoaW5wdXQpIHsKICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdudW1iZXInICYmIGlucHV0ICE9IG51bGwpIHsKICAgICAgICBjb25zdCBbdmFsdWUsIHVuaXRzXSA9IGlucHV0LnNwbGl0KGNzc1VuaXRQYXR0ZXJuKTsKICAgICAgICByZXR1cm4gKCF1bml0cyB8fCB1bml0cyA9PT0gJ3B4JykgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IG51bGw7CiAgICB9CiAgICByZXR1cm4gaW5wdXQgfHwgbnVsbDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Bvc2l0aW9uL2Nvbm5lY3RlZC1wb3NpdGlvbi1zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBzdHJhdGVneSBmb3IgcG9zaXRpb25pbmcgb3ZlcmxheXMuIFVzaW5nIHRoaXMgc3RyYXRlZ3ksIGFuIG92ZXJsYXkgaXMgZ2l2ZW4gYW4KICogaW1wbGljaXQgcG9zaXRpb24gcmVsYXRpdmUgdG8gc29tZSBvcmlnaW4gZWxlbWVudC4gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIGlzIGRlZmluZWQgaW4gdGVybXMgb2YKICogYSBwb2ludCBvbiB0aGUgb3JpZ2luIGVsZW1lbnQgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYSBwb2ludCBvbiB0aGUgb3ZlcmxheSBlbGVtZW50LiBGb3IgZXhhbXBsZSwKICogYSBiYXNpYyBkcm9wZG93biBpcyBjb25uZWN0aW5nIHRoZSBib3R0b20tbGVmdCBjb3JuZXIgb2YgdGhlIG9yaWdpbiB0byB0aGUgdG9wLWxlZnQgY29ybmVyCiAqIG9mIHRoZSBvdmVybGF5LgogKiBAZGVwcmVjYXRlZCBVc2UgYEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneWAgaW5zdGVhZC4KICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICovCmNsYXNzIENvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9yaWdpblBvcwogICAgICogQHBhcmFtIHs/fSBvdmVybGF5UG9zCiAgICAgKiBAcGFyYW0gez99IGNvbm5lY3RlZFRvCiAgICAgKiBAcGFyYW0gez99IHZpZXdwb3J0UnVsZXIKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheUNvbnRhaW5lcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihvcmlnaW5Qb3MsIG92ZXJsYXlQb3MsIGNvbm5lY3RlZFRvLCB2aWV3cG9ydFJ1bGVyLCBkb2N1bWVudCwgcGxhdGZvcm0sIG92ZXJsYXlDb250YWluZXIpIHsKICAgICAgICAvKioKICAgICAgICAgKiBPcmRlcmVkIGxpc3Qgb2YgcHJlZmVycmVkIHBvc2l0aW9ucywgZnJvbSBtb3N0IHRvIGxlYXN0IGRlc2lyYWJsZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMgPSBbXTsKICAgICAgICAvLyBTaW5jZSB0aGUgYENvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3lgIGlzIGRlcHJlY2F0ZWQgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4KICAgICAgICAvLyB0aGUgZXh0cmEgbG9naWMsIHdlIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcG9zaXRpb25pbmcgc3RyYXRlZ3kgdGhhdCBoYXMgc29tZQogICAgICAgIC8vIGRlZmF1bHRzIHRoYXQgbWFrZSBpdCBiZWhhdmUgYXMgdGhlIG9sZCBwb3NpdGlvbiBzdHJhdGVneSBhbmQgdG8gd2hpY2ggd2UnbGwKICAgICAgICAvLyBwcm94eSBhbGwgb2YgdGhlIEFQSSBjYWxscy4KICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5ID0gbmV3IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneShjb25uZWN0ZWRUbywgdmlld3BvcnRSdWxlciwgZG9jdW1lbnQsIHBsYXRmb3JtLCBvdmVybGF5Q29udGFpbmVyKQogICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSkKICAgICAgICAgICAgLndpdGhQdXNoKGZhbHNlKQogICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDApOwogICAgICAgIHRoaXMud2l0aEZhbGxiYWNrUG9zaXRpb24ob3JpZ2luUG9zLCBvdmVybGF5UG9zKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgd2UncmUgZGVhbGluZyB3aXRoIGFuIFJUTCBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgX2lzUnRsKCkgewogICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmLmdldERpcmVjdGlvbigpID09PSAncnRsJzsKICAgIH0KICAgIC8qKgogICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgY29ubmVjdGlvbiBwb2ludCBjaGFuZ2VzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG9uUG9zaXRpb25DaGFuZ2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzOwogICAgfQogICAgLyoqCiAgICAgKiBPcmRlcmVkIGxpc3Qgb2YgcHJlZmVycmVkIHBvc2l0aW9ucywgZnJvbSBtb3N0IHRvIGxlYXN0IGRlc2lyYWJsZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwb3NpdGlvbnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uczsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoIHRoaXMgcG9zaXRpb24gc3RyYXRlZ3kgdG8gYW4gb3ZlcmxheS4KICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoKG92ZXJsYXlSZWYpIHsKICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gb3ZlcmxheVJlZjsKICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmF0dGFjaChvdmVybGF5UmVmKTsKICAgICAgICBpZiAodGhpcy5fZGlyZWN0aW9uKSB7CiAgICAgICAgICAgIG92ZXJsYXlSZWYuc2V0RGlyZWN0aW9uKHRoaXMuX2RpcmVjdGlvbik7CiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRpc3Bvc2UoKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRldGFjaCgpIHsKICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3ZlcmxheSBlbGVtZW50LCB1c2luZyB3aGljaGV2ZXIgcHJlZmVycmVkIHBvc2l0aW9uIHJlbGF0aXZlCiAgICAgKiB0byB0aGUgb3JpZ2luIGZpdHMgb24tc2NyZWVuLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFwcGx5KCkgewogICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXBwbHkoKTsKICAgIH0KICAgIC8qKgogICAgICogUmUtcG9zaXRpb25zIHRoZSBvdmVybGF5IGVsZW1lbnQgd2l0aCB0aGUgdHJpZ2dlciBpbiBpdHMgbGFzdCBjYWxjdWxhdGVkIHBvc2l0aW9uLAogICAgICogZXZlbiBpZiBhIHBvc2l0aW9uIGhpZ2hlciBpbiB0aGUgInByZWZlcnJlZCBwb3NpdGlvbnMiIGxpc3Qgd291bGQgbm93IGZpdC4gVGhpcwogICAgICogYWxsb3dzIG9uZSB0byByZS1hbGlnbiB0aGUgcGFuZWwgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHBhbmVsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVjYWxjdWxhdGVMYXN0UG9zaXRpb24oKSB7CiAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5yZWFwcGx5TGFzdFBvc2l0aW9uKCk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgU2Nyb2xsYWJsZSBjb250YWluZXJzIHRoYXQgaG9zdCB0aGUgb3JpZ2luIGVsZW1lbnQgc28gdGhhdAogICAgICogb24gcmVwb3NpdGlvbiB3ZSBjYW4gZXZhbHVhdGUgaWYgaXQgb3IgdGhlIG92ZXJsYXkgaGFzIGJlZW4gY2xpcHBlZCBvciBvdXRzaWRlIHZpZXcuIEV2ZXJ5CiAgICAgKiBTY3JvbGxhYmxlIG11c3QgYmUgYW4gYW5jZXN0b3IgZWxlbWVudCBvZiB0aGUgc3RyYXRlZ3kncyBvcmlnaW4gZWxlbWVudC4KICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdpdGhTY3JvbGxhYmxlQ29udGFpbmVycyhzY3JvbGxhYmxlcykgewogICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVzKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkcyBhIG5ldyBwcmVmZXJyZWQgZmFsbGJhY2sgcG9zaXRpb24uCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IG9yaWdpblBvcwogICAgICogQHBhcmFtIHs/fSBvdmVybGF5UG9zCiAgICAgKiBAcGFyYW0gez89fSBvZmZzZXRYCiAgICAgKiBAcGFyYW0gez89fSBvZmZzZXRZCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB3aXRoRmFsbGJhY2tQb3NpdGlvbihvcmlnaW5Qb3MsIG92ZXJsYXlQb3MsIG9mZnNldFgsIG9mZnNldFkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihvcmlnaW5Qb3MsIG92ZXJsYXlQb3MsIG9mZnNldFgsIG9mZnNldFkpOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZWZlcnJlZFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcHJlZmVycmVkUG9zaXRpb25zKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbGF5b3V0IGRpcmVjdGlvbiBzbyB0aGUgb3ZlcmxheSdzIHBvc2l0aW9uIGNhbiBiZSBhZGp1c3RlZCB0byBtYXRjaC4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gZGlyIE5ldyBsYXlvdXQgZGlyZWN0aW9uLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aERpcmVjdGlvbihkaXIpIHsKICAgICAgICAvLyBTaW5jZSB0aGUgZGlyZWN0aW9uIG1pZ2h0IGJlIGRlY2xhcmVkIGJlZm9yZSB0aGUgc3RyYXRlZ3kgaXMgYXR0YWNoZWQsCiAgICAgICAgLy8gd2Ugc2F2ZSB0aGUgdmFsdWUgaW4gYSB0ZW1wb3JhcnkgcHJvcGVydHkgYW5kIHdlJ2xsIHRyYW5zZmVyIGl0IHRvIHRoZQogICAgICAgIC8vIG92ZXJsYXkgcmVmIG9uIGF0dGFjaG1lbnQuCiAgICAgICAgaWYgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi5zZXREaXJlY3Rpb24oZGlyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2RpcmVjdGlvbiA9IGRpcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgYW4gb2Zmc2V0IGZvciB0aGUgb3ZlcmxheSdzIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIHgtYXhpcwogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/fSBvZmZzZXQgTmV3IG9mZnNldCBpbiB0aGUgWCBheGlzLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aE9mZnNldFgob2Zmc2V0KSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcG9zaXRpb25TdHJhdGVneS53aXRoRGVmYXVsdE9mZnNldFgob2Zmc2V0KTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyBhbiBvZmZzZXQgZm9yIHRoZSBvdmVybGF5J3MgY29ubmVjdGlvbiBwb2ludCBvbiB0aGUgeS1heGlzCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IG9mZnNldCBOZXcgb2Zmc2V0IGluIHRoZSBZIGF4aXMuCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB3aXRoT2Zmc2V0WShvZmZzZXQpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhEZWZhdWx0T2Zmc2V0WShvZmZzZXQpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIG92ZXJsYXkncyBwb3NpdGlvbiBzaG91bGQgYmUgbG9ja2VkIGluIGFmdGVyIGl0IGlzIHBvc2l0aW9uZWQKICAgICAqIGluaXRpYWxseS4gV2hlbiBhbiBvdmVybGF5IGlzIGxvY2tlZCBpbiwgaXQgd29uJ3QgYXR0ZW1wdCB0byByZXBvc2l0aW9uIGl0c2VsZgogICAgICogd2hlbiB0aGUgcG9zaXRpb24gaXMgcmUtYXBwbGllZCAoZS5nLiB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgYXdheSkuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IGlzTG9ja2VkIFdoZXRoZXIgdGhlIG92ZXJsYXkgc2hvdWxkIGxvY2tlZCBpbi4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpdGhMb2NrZWRQb3NpdGlvbihpc0xvY2tlZCkgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aExvY2tlZFBvc2l0aW9uKGlzTG9ja2VkKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogT3ZlcndyaXRlcyB0aGUgY3VycmVudCBzZXQgb2YgcG9zaXRpb25zIHdpdGggYW4gYXJyYXkgb2YgbmV3IG9uZXMuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9ucyBQb3NpdGlvbiBwYWlycyB0byBiZSBzZXQgb24gdGhlIHN0cmF0ZWd5LgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgd2l0aFBvc2l0aW9ucyhwb3NpdGlvbnMpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wcmVmZXJyZWRQb3NpdGlvbnMgPSBwb3NpdGlvbnMuc2xpY2UoKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcHJlZmVycmVkUG9zaXRpb25zKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgb3JpZ2luIGVsZW1lbnQsIHJlbGF0aXZlIHRvIHdoaWNoIHRvIHBvc2l0aW9uIHRoZSBvdmVybGF5LgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/fSBvcmlnaW4gUmVmZXJlbmNlIHRvIHRoZSBuZXcgb3JpZ2luIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBzZXRPcmlnaW4ob3JpZ2luKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcG9zaXRpb25TdHJhdGVneS5zZXRPcmlnaW4ob3JpZ2luKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Bvc2l0aW9uL2dsb2JhbC1wb3NpdGlvbi1zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIENsYXNzIHRvIGJlIGFkZGVkIHRvIHRoZSBvdmVybGF5IHBhbmUgd3JhcHBlci4KICogQHR5cGUgez99CiAqLwpjb25zdCB3cmFwcGVyQ2xhc3MgPSAnY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXInOwovKioKICogQSBzdHJhdGVneSBmb3IgcG9zaXRpb25pbmcgb3ZlcmxheXMuIFVzaW5nIHRoaXMgc3RyYXRlZ3ksIGFuIG92ZXJsYXkgaXMgZ2l2ZW4gYW4KICogZXhwbGljaXQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGJyb3dzZXIncyB2aWV3cG9ydC4gV2UgdXNlIGZsZXhib3gsIGluc3RlYWQgb2YKICogdHJhbnNmb3JtcywgaW4gb3JkZXIgdG8gYXZvaWQgaXNzdWVzIHdpdGggc3VicGl4ZWwgcmVuZGVyaW5nIHdoaWNoIGNhbiBjYXVzZSB0aGUKICogZWxlbWVudCB0byBiZWNvbWUgYmx1cnJ5LgogKi8KY2xhc3MgR2xvYmFsUG9zaXRpb25TdHJhdGVneSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9jc3NQb3NpdGlvbiA9ICdzdGF0aWMnOwogICAgICAgIHRoaXMuX3RvcE9mZnNldCA9ICcnOwogICAgICAgIHRoaXMuX2JvdHRvbU9mZnNldCA9ICcnOwogICAgICAgIHRoaXMuX2xlZnRPZmZzZXQgPSAnJzsKICAgICAgICB0aGlzLl9yaWdodE9mZnNldCA9ICcnOwogICAgICAgIHRoaXMuX2FsaWduSXRlbXMgPSAnJzsKICAgICAgICB0aGlzLl9qdXN0aWZ5Q29udGVudCA9ICcnOwogICAgICAgIHRoaXMuX3dpZHRoID0gJyc7CiAgICAgICAgdGhpcy5faGVpZ2h0ID0gJyc7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoKG92ZXJsYXlSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29uZmlnID0gb3ZlcmxheVJlZi5nZXRDb25maWcoKTsKICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gb3ZlcmxheVJlZjsKICAgICAgICBpZiAodGhpcy5fd2lkdGggJiYgIWNvbmZpZy53aWR0aCkgewogICAgICAgICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoeyB3aWR0aDogdGhpcy5fd2lkdGggfSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9oZWlnaHQgJiYgIWNvbmZpZy5oZWlnaHQpIHsKICAgICAgICAgICAgb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgaGVpZ2h0OiB0aGlzLl9oZWlnaHQgfSk7CiAgICAgICAgfQogICAgICAgIG92ZXJsYXlSZWYuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh3cmFwcGVyQ2xhc3MpOwogICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5LiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IHZlcnRpY2FsIHBvc2l0aW9uLgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/PX0gdmFsdWUgTmV3IHRvcCBvZmZzZXQuCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICB0b3AodmFsdWUgPSAnJykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2JvdHRvbU9mZnNldCA9ICcnOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3RvcE9mZnNldCA9IHZhbHVlOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FsaWduSXRlbXMgPSAnZmxleC1zdGFydCc7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkuIENsZWFycyBhbnkgcHJldmlvdXNseSBzZXQgaG9yaXpvbnRhbCBwb3NpdGlvbi4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIE5ldyBsZWZ0IG9mZnNldC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIGxlZnQodmFsdWUgPSAnJykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3JpZ2h0T2Zmc2V0ID0gJyc7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fbGVmdE9mZnNldCA9IHZhbHVlOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2p1c3RpZnlDb250ZW50ID0gJ2ZsZXgtc3RhcnQnOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkuIENsZWFycyBhbnkgcHJldmlvdXNseSBzZXQgdmVydGljYWwgcG9zaXRpb24uCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBOZXcgYm90dG9tIG9mZnNldC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIGJvdHRvbSh2YWx1ZSA9ICcnKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fdG9wT2Zmc2V0ID0gJyc7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fYm90dG9tT2Zmc2V0ID0gdmFsdWU7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fYWxpZ25JdGVtcyA9ICdmbGV4LWVuZCc7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5LiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBOZXcgcmlnaHQgb2Zmc2V0LgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgcmlnaHQodmFsdWUgPSAnJykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2xlZnRPZmZzZXQgPSAnJzsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9yaWdodE9mZnNldCA9IHZhbHVlOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2p1c3RpZnlDb250ZW50ID0gJ2ZsZXgtZW5kJzsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgb3ZlcmxheSB3aWR0aCBhbmQgY2xlYXJzIGFueSBwcmV2aW91c2x5IHNldCB3aWR0aC4KICAgICAqIEBkZXByZWNhdGVkIFBhc3MgdGhlIGB3aWR0aGAgdGhyb3VnaCB0aGUgYE92ZXJsYXlDb25maWdgLgogICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIE5ldyB3aWR0aCBmb3IgdGhlIG92ZXJsYXkKICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHdpZHRoKHZhbHVlID0gJycpIHsKICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vdmVybGF5UmVmLnVwZGF0ZVNpemUoeyB3aWR0aDogdmFsdWUgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl93aWR0aCA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgb3ZlcmxheSBoZWlnaHQgYW5kIGNsZWFycyBhbnkgcHJldmlvdXNseSBzZXQgaGVpZ2h0LgogICAgICogQGRlcHJlY2F0ZWQgUGFzcyB0aGUgYGhlaWdodGAgdGhyb3VnaCB0aGUgYE92ZXJsYXlDb25maWdgLgogICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIE5ldyBoZWlnaHQgZm9yIHRoZSBvdmVybGF5CiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBoZWlnaHQodmFsdWUgPSAnJykgewogICAgICAgIGlmICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7IGhlaWdodDogdmFsdWUgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9oZWlnaHQgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIENlbnRlcnMgdGhlIG92ZXJsYXkgaG9yaXpvbnRhbGx5IHdpdGggYW4gb3B0aW9uYWwgb2Zmc2V0LgogICAgICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHNldCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7Pz19IG9mZnNldCBPdmVybGF5IG9mZnNldCBmcm9tIHRoZSBob3Jpem9udGFsIGNlbnRlci4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIGNlbnRlckhvcml6b250YWxseShvZmZzZXQgPSAnJykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkubGVmdChvZmZzZXQpOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2p1c3RpZnlDb250ZW50ID0gJ2NlbnRlcic7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIENlbnRlcnMgdGhlIG92ZXJsYXkgdmVydGljYWxseSB3aXRoIGFuIG9wdGlvbmFsIG9mZnNldC4KICAgICAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzZXQgdmVydGljYWwgcG9zaXRpb24uCiAgICAgKgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/PX0gb2Zmc2V0IE92ZXJsYXkgb2Zmc2V0IGZyb20gdGhlIHZlcnRpY2FsIGNlbnRlci4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIGNlbnRlclZlcnRpY2FsbHkob2Zmc2V0ID0gJycpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLnRvcChvZmZzZXQpOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FsaWduSXRlbXMgPSAnY2VudGVyJzsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogQXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBlbGVtZW50LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFwcGx5KCkgewogICAgICAgIC8vIFNpbmNlIHRoZSBvdmVybGF5IHJlZiBhcHBsaWVzIHRoZSBzdHJhdGVneSBhc3luY2hyb25vdXNseSwgaXQgY291bGQKICAgICAgICAvLyBoYXZlIGJlZW4gZGlzcG9zZWQgYmVmb3JlIGl0IGVuZHMgdXAgYmVpbmcgYXBwbGllZC4gSWYgdGhhdCBpcyB0aGUKICAgICAgICAvLyBjYXNlLCB3ZSBzaG91bGRuJ3QgZG8gYW55dGhpbmcuCiAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5UmVmIHx8ICF0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50U3R5bGVzID0gdGhpcy5fb3ZlcmxheVJlZi5ob3N0RWxlbWVudC5zdHlsZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKTsKICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IGNvbmZpZzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2hvdWxkQmVGbHVzaEhvcml6b250YWxseSA9ICh3aWR0aCA9PT0gJzEwMCUnIHx8IHdpZHRoID09PSAnMTAwdncnKSAmJgogICAgICAgICAgICAoIW1heFdpZHRoIHx8IG1heFdpZHRoID09PSAnMTAwJScgfHwgbWF4V2lkdGggPT09ICcxMDB2dycpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzaG91bGRCZUZsdXNoVmVydGljYWxseSA9IChoZWlnaHQgPT09ICcxMDAlJyB8fCBoZWlnaHQgPT09ICcxMDB2aCcpICYmCiAgICAgICAgICAgICghbWF4SGVpZ2h0IHx8IG1heEhlaWdodCA9PT0gJzEwMCUnIHx8IG1heEhlaWdodCA9PT0gJzEwMHZoJyk7CiAgICAgICAgc3R5bGVzLnBvc2l0aW9uID0gdGhpcy5fY3NzUG9zaXRpb247CiAgICAgICAgc3R5bGVzLm1hcmdpbkxlZnQgPSBzaG91bGRCZUZsdXNoSG9yaXpvbnRhbGx5ID8gJzAnIDogdGhpcy5fbGVmdE9mZnNldDsKICAgICAgICBzdHlsZXMubWFyZ2luVG9wID0gc2hvdWxkQmVGbHVzaFZlcnRpY2FsbHkgPyAnMCcgOiB0aGlzLl90b3BPZmZzZXQ7CiAgICAgICAgc3R5bGVzLm1hcmdpbkJvdHRvbSA9IHRoaXMuX2JvdHRvbU9mZnNldDsKICAgICAgICBzdHlsZXMubWFyZ2luUmlnaHQgPSB0aGlzLl9yaWdodE9mZnNldDsKICAgICAgICBpZiAoc2hvdWxkQmVGbHVzaEhvcml6b250YWxseSkgewogICAgICAgICAgICBwYXJlbnRTdHlsZXMuanVzdGlmeUNvbnRlbnQgPSAnZmxleC1zdGFydCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuX2p1c3RpZnlDb250ZW50ID09PSAnY2VudGVyJykgewogICAgICAgICAgICBwYXJlbnRTdHlsZXMuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7CiAgICAgICAgICAgIC8vIEluIFJUTCB0aGUgYnJvd3NlciB3aWxsIGludmVydCBgZmxleC1zdGFydGAgYW5kIGBmbGV4LWVuZGAgYXV0b21hdGljYWxseSwgYnV0IHdlCiAgICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhhdCBiZWNhdXNlIG91ciBwb3NpdGlvbmluZyBpcyBleHBsaWNpdGx5IGBsZWZ0YCBhbmQgYHJpZ2h0YCwgaGVuY2UKICAgICAgICAgICAgLy8gd2h5IHdlIGRvIGFub3RoZXIgaW52ZXJzaW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBvdmVybGF5IHN0YXlzIGluIHRoZSBzYW1lIHBvc2l0aW9uLgogICAgICAgICAgICAvLyBUT0RPOiByZWNvbnNpZGVyIHRoaXMgaWYgd2UgYWRkIGBzdGFydGAgYW5kIGBlbmRgIG1ldGhvZHMuCiAgICAgICAgICAgIGlmICh0aGlzLl9qdXN0aWZ5Q29udGVudCA9PT0gJ2ZsZXgtc3RhcnQnKSB7CiAgICAgICAgICAgICAgICBwYXJlbnRTdHlsZXMuanVzdGlmeUNvbnRlbnQgPSAnZmxleC1lbmQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2p1c3RpZnlDb250ZW50ID09PSAnZmxleC1lbmQnKSB7CiAgICAgICAgICAgICAgICBwYXJlbnRTdHlsZXMuanVzdGlmeUNvbnRlbnQgPSAnZmxleC1zdGFydCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBhcmVudFN0eWxlcy5qdXN0aWZ5Q29udGVudCA9IHRoaXMuX2p1c3RpZnlDb250ZW50OwogICAgICAgIH0KICAgICAgICBwYXJlbnRTdHlsZXMuYWxpZ25JdGVtcyA9IHNob3VsZEJlRmx1c2hWZXJ0aWNhbGx5ID8gJ2ZsZXgtc3RhcnQnIDogdGhpcy5fYWxpZ25JdGVtczsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYW5zIHVwIHRoZSBET00gY2hhbmdlcyBmcm9tIHRoZSBwb3NpdGlvbiBzdHJhdGVneS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNwb3NlKCkgewogICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8ICF0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX292ZXJsYXlSZWYuaG9zdEVsZW1lbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudFN0eWxlcyA9IHBhcmVudC5zdHlsZTsKICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZSh3cmFwcGVyQ2xhc3MpOwogICAgICAgIHBhcmVudFN0eWxlcy5qdXN0aWZ5Q29udGVudCA9IHBhcmVudFN0eWxlcy5hbGlnbkl0ZW1zID0gc3R5bGVzLm1hcmdpblRvcCA9CiAgICAgICAgICAgIHN0eWxlcy5tYXJnaW5Cb3R0b20gPSBzdHlsZXMubWFyZ2luTGVmdCA9IHN0eWxlcy5tYXJnaW5SaWdodCA9IHN0eWxlcy5wb3NpdGlvbiA9ICcnOwogICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvcG9zaXRpb24vb3ZlcmxheS1wb3NpdGlvbi1idWlsZGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBCdWlsZGVyIGZvciBvdmVybGF5IHBvc2l0aW9uIHN0cmF0ZWd5LgogKi8KY2xhc3MgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdwb3J0UnVsZXIKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheUNvbnRhaW5lcgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihfdmlld3BvcnRSdWxlciwgX2RvY3VtZW50LCBfcGxhdGZvcm0sIF9vdmVybGF5Q29udGFpbmVyKSB7CiAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIHRoaXMuX292ZXJsYXlDb250YWluZXIgPSBfb3ZlcmxheUNvbnRhaW5lcjsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGdsb2JhbCBwb3NpdGlvbiBzdHJhdGVneS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdsb2JhbCgpIHsKICAgICAgICByZXR1cm4gbmV3IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3koKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHJlbGF0aXZlIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGBmbGV4aWJsZUNvbm5lY3RlZFRvYCBpbnN0ZWFkLgogICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBvcmlnaW5Qb3MKICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVBvcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY29ubmVjdGVkVG8oZWxlbWVudFJlZiwgb3JpZ2luUG9zLCBvdmVybGF5UG9zKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5KG9yaWdpblBvcywgb3ZlcmxheVBvcywgZWxlbWVudFJlZiwgdGhpcy5fdmlld3BvcnRSdWxlciwgdGhpcy5fZG9jdW1lbnQsIHRoaXMuX3BsYXRmb3JtLCB0aGlzLl9vdmVybGF5Q29udGFpbmVyKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZsZXhpYmxlIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICogQHBhcmFtIHs/fSBvcmlnaW4gT3JpZ2luIHJlbGF0aXZlIHRvIHdoaWNoIHRvIHBvc2l0aW9uIHRoZSBvdmVybGF5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmxleGlibGVDb25uZWN0ZWRUbyhvcmlnaW4pIHsKICAgICAgICByZXR1cm4gbmV3IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneShvcmlnaW4sIHRoaXMuX3ZpZXdwb3J0UnVsZXIsIHRoaXMuX2RvY3VtZW50LCB0aGlzLl9wbGF0Zm9ybSwgdGhpcy5fb3ZlcmxheUNvbnRhaW5lcik7CiAgICB9Cn0KT3ZlcmxheVBvc2l0aW9uQnVpbGRlci7JtWZhYyA9IGZ1bmN0aW9uIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgT3ZlcmxheVBvc2l0aW9uQnVpbGRlcikoybXJtWluamVjdChWaWV3cG9ydFJ1bGVyKSwgybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChQbGF0Zm9ybSksIMm1ybVpbmplY3QoT3ZlcmxheUNvbnRhaW5lcikpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KT3ZlcmxheVBvc2l0aW9uQnVpbGRlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgeyB0eXBlOiBPdmVybGF5Q29udGFpbmVyIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBPdmVybGF5UG9zaXRpb25CdWlsZGVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgT3ZlcmxheVBvc2l0aW9uQnVpbGRlcijJtcm1aW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChPdmVybGF5Q29udGFpbmVyKSk7IH0sIHRva2VuOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogTmV4dCBvdmVybGF5IHVuaXF1ZSBJRC4KICogQHR5cGUgez99CiAqLwpsZXQgbmV4dFVuaXF1ZUlkJDMgPSAwOwovLyBOb3RlIHRoYXQgT3ZlcmxheSBpcyAqbm90KiBzY29wZWQgdG8gdGhlIGFwcCByb290IGJlY2F1c2Ugb2YgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgovLyB3aGljaCBuZWVkcyB0byBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXJlIE92ZXJsYXlNb2R1bGUgaXMgaW1wb3J0ZWQuCi8qKgogKiBTZXJ2aWNlIHRvIGNyZWF0ZSBPdmVybGF5cy4gT3ZlcmxheXMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkIHBpZWNlcyBvZiBmbG9hdGluZyBVSSwgbWVhbnQgdG8gYmUKICogdXNlZCBhcyBhIGxvdy1sZXZlbCBidWlsZGluZyBibG9jayBmb3Igb3RoZXIgY29tcG9uZW50cy4gRGlhbG9ncywgdG9vbHRpcHMsIG1lbnVzLAogKiBzZWxlY3RzLCBldGMuIGNhbiBhbGwgYmUgYnVpbHQgdXNpbmcgb3ZlcmxheXMuIFRoZSBzZXJ2aWNlIHNob3VsZCBwcmltYXJpbHkgYmUgdXNlZCBieSBhdXRob3JzCiAqIG9mIHJlLXVzYWJsZSBjb21wb25lbnRzIHJhdGhlciB0aGFuIGRldmVsb3BlcnMgYnVpbGRpbmcgZW5kLXVzZXIgYXBwbGljYXRpb25zLgogKgogKiBBbiBvdmVybGF5ICppcyogYSBQb3J0YWxPdXRsZXQsIHNvIGFueSBraW5kIG9mIFBvcnRhbCBjYW4gYmUgbG9hZGVkIGludG8gb25lLgogKi8KY2xhc3MgT3ZlcmxheSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsU3RyYXRlZ2llcwogICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheUNvbnRhaW5lcgogICAgICogQHBhcmFtIHs/fSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyCiAgICAgKiBAcGFyYW0gez99IF9wb3NpdGlvbkJ1aWxkZXIKICAgICAqIEBwYXJhbSB7P30gX2tleWJvYXJkRGlzcGF0Y2hlcgogICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gX2RpcmVjdGlvbmFsaXR5CiAgICAgKiBAcGFyYW0gez89fSBfbG9jYXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3Ioc2Nyb2xsU3RyYXRlZ2llcywgX292ZXJsYXlDb250YWluZXIsIF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIF9wb3NpdGlvbkJ1aWxkZXIsIF9rZXlib2FyZERpc3BhdGNoZXIsIF9pbmplY3RvciwgX25nWm9uZSwgX2RvY3VtZW50LCBfZGlyZWN0aW9uYWxpdHksIF9sb2NhdGlvbikgewogICAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ2llcyA9IHNjcm9sbFN0cmF0ZWdpZXM7CiAgICAgICAgdGhpcy5fb3ZlcmxheUNvbnRhaW5lciA9IF9vdmVybGF5Q29udGFpbmVyOwogICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgdGhpcy5fcG9zaXRpb25CdWlsZGVyID0gX3Bvc2l0aW9uQnVpbGRlcjsKICAgICAgICB0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIgPSBfa2V5Ym9hcmREaXNwYXRjaGVyOwogICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yOwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgdGhpcy5fZGlyZWN0aW9uYWxpdHkgPSBfZGlyZWN0aW9uYWxpdHk7CiAgICAgICAgdGhpcy5fbG9jYXRpb24gPSBfbG9jYXRpb247CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gb3ZlcmxheS4KICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZyBDb25maWd1cmF0aW9uIGFwcGxpZWQgdG8gdGhlIG92ZXJsYXkuCiAgICAgKiBAcmV0dXJuIHs/fSBSZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgb3ZlcmxheS4KICAgICAqLwogICAgY3JlYXRlKGNvbmZpZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5fY3JlYXRlSG9zdEVsZW1lbnQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFuZSA9IHRoaXMuX2NyZWF0ZVBhbmVFbGVtZW50KGhvc3QpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb3J0YWxPdXRsZXQgPSB0aGlzLl9jcmVhdGVQb3J0YWxPdXRsZXQocGFuZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyhjb25maWcpOwogICAgICAgIG92ZXJsYXlDb25maWcuZGlyZWN0aW9uID0gb3ZlcmxheUNvbmZpZy5kaXJlY3Rpb24gfHwgdGhpcy5fZGlyZWN0aW9uYWxpdHkudmFsdWU7CiAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5UmVmKHBvcnRhbE91dGxldCwgaG9zdCwgcGFuZSwgb3ZlcmxheUNvbmZpZywgdGhpcy5fbmdab25lLCB0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIsIHRoaXMuX2RvY3VtZW50LCB0aGlzLl9sb2NhdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYSBwb3NpdGlvbiBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQsIHZpYSBmbHVlbnQgQVBJLAogICAgICogdG8gY29uc3RydWN0IGFuZCBjb25maWd1cmUgYSBwb3NpdGlvbiBzdHJhdGVneS4KICAgICAqIEByZXR1cm4gez99IEFuIG92ZXJsYXkgcG9zaXRpb24gYnVpbGRlci4KICAgICAqLwogICAgcG9zaXRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uQnVpbGRlcjsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgRE9NIGVsZW1lbnQgZm9yIGFuIG92ZXJsYXkgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIG92ZXJsYXkgY29udGFpbmVyLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICogQHJldHVybiB7P30gTmV3bHktY3JlYXRlZCBwYW5lIGVsZW1lbnQKICAgICAqLwogICAgX2NyZWF0ZVBhbmVFbGVtZW50KGhvc3QpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFuZSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHBhbmUuaWQgPSBgY2RrLW92ZXJsYXktJHtuZXh0VW5pcXVlSWQkMysrfWA7CiAgICAgICAgcGFuZS5jbGFzc0xpc3QuYWRkKCdjZGstb3ZlcmxheS1wYW5lJyk7CiAgICAgICAgaG9zdC5hcHBlbmRDaGlsZChwYW5lKTsKICAgICAgICByZXR1cm4gcGFuZTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgaG9zdCBlbGVtZW50IHRoYXQgd3JhcHMgYXJvdW5kIGFuIG92ZXJsYXkKICAgICAqIGFuZCBjYW4gYmUgdXNlZCBmb3IgYWR2YW5jZWQgcG9zaXRpb25pbmcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30gTmV3bHktY3JlYXRlIGhvc3QgZWxlbWVudC4KICAgICAqLwogICAgX2NyZWF0ZUhvc3RFbGVtZW50KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgdGhpcy5fb3ZlcmxheUNvbnRhaW5lci5nZXRDb250YWluZXJFbGVtZW50KCkuYXBwZW5kQ2hpbGQoaG9zdCk7CiAgICAgICAgcmV0dXJuIGhvc3Q7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZSBhIERvbVBvcnRhbE91dGxldCBpbnRvIHdoaWNoIHRoZSBvdmVybGF5IGNvbnRlbnQgY2FuIGJlIGxvYWRlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhbmUgVGhlIERPTSBlbGVtZW50IHRvIHR1cm4gaW50byBhIHBvcnRhbCBvdXRsZXQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIHBvcnRhbCBvdXRsZXQgZm9yIHRoZSBnaXZlbiBET00gZWxlbWVudC4KICAgICAqLwogICAgX2NyZWF0ZVBvcnRhbE91dGxldChwYW5lKSB7CiAgICAgICAgLy8gV2UgaGF2ZSB0byByZXNvbHZlIHRoZSBBcHBsaWNhdGlvblJlZiBsYXRlciBpbiBvcmRlciB0byBhbGxvdyBwZW9wbGUKICAgICAgICAvLyB0byB1c2Ugb3ZlcmxheS1iYXNlZCBwcm92aWRlcnMgZHVyaW5nIGFwcCBpbml0aWFsaXphdGlvbi4KICAgICAgICBpZiAoIXRoaXMuX2FwcFJlZikgewogICAgICAgICAgICB0aGlzLl9hcHBSZWYgPSB0aGlzLl9pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IERvbVBvcnRhbE91dGxldChwYW5lLCB0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHRoaXMuX2FwcFJlZiwgdGhpcy5faW5qZWN0b3IsIHRoaXMuX2RvY3VtZW50KTsKICAgIH0KfQpPdmVybGF5Lsm1ZmFjID0gZnVuY3Rpb24gT3ZlcmxheV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBPdmVybGF5KSjJtcm1aW5qZWN0KFNjcm9sbFN0cmF0ZWd5T3B0aW9ucyksIMm1ybVpbmplY3QoT3ZlcmxheUNvbnRhaW5lciksIMm1ybVpbmplY3QoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSwgybXJtWluamVjdChPdmVybGF5UG9zaXRpb25CdWlsZGVyKSwgybXJtWluamVjdChPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyKSwgybXJtWluamVjdChJbmplY3RvciksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChEaXJlY3Rpb25hbGl0eSksIMm1ybVpbmplY3QoTG9jYXRpb24sIDgpKTsgfTsKT3ZlcmxheS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBPdmVybGF5LCBmYWN0b3J5OiBPdmVybGF5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KT3ZlcmxheS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0sCiAgICB7IHR5cGU6IE92ZXJsYXlDb250YWluZXIgfSwKICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0sCiAgICB7IHR5cGU6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIgfSwKICAgIHsgdHlwZTogT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlciB9LAogICAgeyB0eXBlOiBJbmplY3RvciB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHkgfSwKICAgIHsgdHlwZTogTG9jYXRpb24sIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9vdmVybGF5LWRpcmVjdGl2ZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERlZmF1bHQgc2V0IG9mIHBvc2l0aW9ucyBmb3IgdGhlIG92ZXJsYXkuIEZvbGxvd3MgdGhlIGJlaGF2aW9yIG9mIGEgZHJvcGRvd24uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZGVmYXVsdFBvc2l0aW9uTGlzdCA9IFsKICAgIHsKICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLAogICAgICAgIG9yaWdpblk6ICdib3R0b20nLAogICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLAogICAgICAgIG92ZXJsYXlZOiAndG9wJwogICAgfSwKICAgIHsKICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLAogICAgICAgIG9yaWdpblk6ICd0b3AnLAogICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLAogICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJwogICAgfSwKICAgIHsKICAgICAgICBvcmlnaW5YOiAnZW5kJywKICAgICAgICBvcmlnaW5ZOiAndG9wJywKICAgICAgICBvdmVybGF5WDogJ2VuZCcsCiAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nCiAgICB9LAogICAgewogICAgICAgIG9yaWdpblg6ICdlbmQnLAogICAgICAgIG9yaWdpblk6ICdib3R0b20nLAogICAgICAgIG92ZXJsYXlYOiAnZW5kJywKICAgICAgICBvdmVybGF5WTogJ3RvcCcKICAgIH0KXTsKLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSB0aGUgY29ubmVjdGVkIG92ZXJsYXkgaXMgb3Blbi4KICogQHR5cGUgez99CiAqLwpjb25zdCBDREtfQ09OTkVDVEVEX09WRVJMQVlfU0NST0xMX1NUUkFURUdZID0gbmV3IEluamVjdGlvblRva2VuKCdjZGstY29ubmVjdGVkLW92ZXJsYXktc2Nyb2xsLXN0cmF0ZWd5Jyk7Ci8qKgogKiBEaXJlY3RpdmUgYXBwbGllZCB0byBhbiBlbGVtZW50IHRvIG1ha2UgaXQgdXNhYmxlIGFzIGFuIG9yaWdpbiBmb3IgYW4gT3ZlcmxheSB1c2luZyBhCiAqIENvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kuCiAqLwpjbGFzcyBDZGtPdmVybGF5T3JpZ2luIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYpIHsKICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmOwogICAgfQp9CkNka092ZXJsYXlPcmlnaW4uybVmYWMgPSBmdW5jdGlvbiBDZGtPdmVybGF5T3JpZ2luX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka092ZXJsYXlPcmlnaW4pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwpDZGtPdmVybGF5T3JpZ2luLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka092ZXJsYXlPcmlnaW4sIHNlbGVjdG9yczogW1siIiwgImNkay1vdmVybGF5LW9yaWdpbiIsICIiXSwgWyIiLCAib3ZlcmxheS1vcmlnaW4iLCAiIl0sIFsiIiwgImNka092ZXJsYXlPcmlnaW4iLCAiIl1dLCBleHBvcnRBczogWyJjZGtPdmVybGF5T3JpZ2luIl0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpDZGtPdmVybGF5T3JpZ2luLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0KXTsKLyoqCiAqIERpcmVjdGl2ZSB0byBmYWNpbGl0YXRlIGRlY2xhcmF0aXZlIGNyZWF0aW9uIG9mIGFuCiAqIE92ZXJsYXkgdXNpbmcgYSBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kuCiAqLwpjbGFzcyBDZGtDb25uZWN0ZWRPdmVybGF5IHsKICAgIC8vIFRPRE8oamVsYm91cm4pOiBpbnB1dHMgZm9yIHNpemUsIHNjcm9sbCBiZWhhdmlvciwgYW5pbWF0aW9uLCBldGMuCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX292ZXJsYXkKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICogQHBhcmFtIHs/fSBzY3JvbGxTdHJhdGVneUZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihfb3ZlcmxheSwgdGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYsIHNjcm9sbFN0cmF0ZWd5RmFjdG9yeSwgX2RpcikgewogICAgICAgIHRoaXMuX292ZXJsYXkgPSBfb3ZlcmxheTsKICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgIHRoaXMuX2hhc0JhY2tkcm9wID0gZmFsc2U7CiAgICAgICAgdGhpcy5fbG9ja1Bvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZ3Jvd0FmdGVyT3BlbiA9IGZhbHNlOwogICAgICAgIHRoaXMuX2ZsZXhpYmxlRGltZW5zaW9ucyA9IGZhbHNlOwogICAgICAgIHRoaXMuX3B1c2ggPSBmYWxzZTsKICAgICAgICB0aGlzLl9iYWNrZHJvcFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAvKioKICAgICAgICAgKiBNYXJnaW4gYmV0d2VlbiB0aGUgb3ZlcmxheSBhbmQgdGhlIHZpZXdwb3J0IGVkZ2VzLgogICAgICAgICAqLwogICAgICAgIHRoaXMudmlld3BvcnRNYXJnaW4gPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgaXMgb3Blbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGJhY2tkcm9wIGlzIGNsaWNrZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5iYWNrZHJvcENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgcG9zaXRpb24gaGFzIGNoYW5nZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5wb3NpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIG92ZXJsYXkgaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5hdHRhY2ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBvdmVybGF5IGhhcyBiZWVuIGRldGFjaGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuZGV0YWNoID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gdGhlcmUgYXJlIGtleWJvYXJkIGV2ZW50cyB0aGF0IGFyZSB0YXJnZXRlZCBhdCB0aGUgb3ZlcmxheS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm92ZXJsYXlLZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMuX3RlbXBsYXRlUG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTsKICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkgPSBzY3JvbGxTdHJhdGVneUZhY3Rvcnk7CiAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneSA9IHRoaXMuX3Njcm9sbFN0cmF0ZWd5RmFjdG9yeSgpOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgb2Zmc2V0IGluIHBpeGVscyBmb3IgdGhlIG92ZXJsYXkgY29ubmVjdGlvbiBwb2ludCBvbiB0aGUgeC1heGlzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb2Zmc2V0WCgpIHsgcmV0dXJuIHRoaXMuX29mZnNldFg7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvZmZzZXRYCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgb2Zmc2V0WChvZmZzZXRYKSB7CiAgICAgICAgdGhpcy5fb2Zmc2V0WCA9IG9mZnNldFg7CiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb24pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVGhlIG9mZnNldCBpbiBwaXhlbHMgZm9yIHRoZSBvdmVybGF5IGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIHktYXhpcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG9mZnNldFkoKSB7IHJldHVybiB0aGlzLl9vZmZzZXRZOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb2Zmc2V0WQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG9mZnNldFkob2Zmc2V0WSkgewogICAgICAgIHRoaXMuX29mZnNldFkgPSBvZmZzZXRZOwogICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbikgewogICAgICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBvdmVybGF5IHNob3VsZCBhdHRhY2ggYSBiYWNrZHJvcC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBoYXNCYWNrZHJvcCgpIHsgcmV0dXJuIHRoaXMuX2hhc0JhY2tkcm9wOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBoYXNCYWNrZHJvcCh2YWx1ZSkgeyB0aGlzLl9oYXNCYWNrZHJvcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogV2hldGhlciBvciBub3QgdGhlIG92ZXJsYXkgc2hvdWxkIGJlIGxvY2tlZCB3aGVuIHNjcm9sbGluZy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBsb2NrUG9zaXRpb24oKSB7IHJldHVybiB0aGlzLl9sb2NrUG9zaXRpb247IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGxvY2tQb3NpdGlvbih2YWx1ZSkgeyB0aGlzLl9sb2NrUG9zaXRpb24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkncyB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZSBjb25zdHJhaW5lZCB0byBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmbGV4aWJsZURpbWVuc2lvbnMoKSB7IHJldHVybiB0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnM7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGZsZXhpYmxlRGltZW5zaW9ucyh2YWx1ZSkgewogICAgICAgIHRoaXMuX2ZsZXhpYmxlRGltZW5zaW9ucyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgY2FuIGdyb3cgYWZ0ZXIgdGhlIGluaXRpYWwgb3BlbiB3aGVuIGZsZXhpYmxlIHBvc2l0aW9uaW5nIGlzIHR1cm5lZCBvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBncm93QWZ0ZXJPcGVuKCkgeyByZXR1cm4gdGhpcy5fZ3Jvd0FmdGVyT3BlbjsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZ3Jvd0FmdGVyT3Blbih2YWx1ZSkgeyB0aGlzLl9ncm93QWZ0ZXJPcGVuID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5IGNhbiBiZSBwdXNoZWQgb24tc2NyZWVuIGlmIG5vbmUgb2YgdGhlIHByb3ZpZGVkIHBvc2l0aW9ucyBmaXQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcHVzaCgpIHsgcmV0dXJuIHRoaXMuX3B1c2g7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHB1c2godmFsdWUpIHsgdGhpcy5fcHVzaCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogVGhlIGFzc29jaWF0ZWQgb3ZlcmxheSByZWZlcmVuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb3ZlcmxheVJlZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGVsZW1lbnQncyBsYXlvdXQgZGlyZWN0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRpcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGlyID8gdGhpcy5fZGlyLnZhbHVlIDogJ2x0cic7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9iYWNrZHJvcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24pIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9wb3NpdGlvbik7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7CiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCwKICAgICAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLm1pbldpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCwKICAgICAgICAgICAgICAgIG1pbkhlaWdodDogdGhpcy5taW5IZWlnaHQsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoY2hhbmdlc1snb3JpZ2luJ10gJiYgdGhpcy5vcGVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbi5hcHBseSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjaGFuZ2VzWydvcGVuJ10pIHsKICAgICAgICAgICAgdGhpcy5vcGVuID8gdGhpcy5fYXR0YWNoT3ZlcmxheSgpIDogdGhpcy5fZGV0YWNoT3ZlcmxheSgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBvdmVybGF5CiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZU92ZXJsYXkoKSB7CiAgICAgICAgaWYgKCF0aGlzLnBvc2l0aW9ucyB8fCAhdGhpcy5wb3NpdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zID0gZGVmYXVsdFBvc2l0aW9uTGlzdDsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKHRoaXMuX2J1aWxkQ29uZmlnKCkpOwogICAgICAgIHRoaXMuX292ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgIHRoaXMub3ZlcmxheUtleWRvd24ubmV4dChldmVudCk7CiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBFU0NBUEUgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2RldGFjaE92ZXJsYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQnVpbGRzIHRoZSBvdmVybGF5IGNvbmZpZyBiYXNlZCBvbiB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2J1aWxkQ29uZmlnKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5fcG9zaXRpb24gPQogICAgICAgICAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kgfHwgdGhpcy5fY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoewogICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuX2RpciwKICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneSwKICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuc2Nyb2xsU3RyYXRlZ3ksCiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0aGlzLmhhc0JhY2tkcm9wCiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMud2lkdGggfHwgdGhpcy53aWR0aCA9PT0gMCkgewogICAgICAgICAgICBvdmVybGF5Q29uZmlnLndpZHRoID0gdGhpcy53aWR0aDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0IHx8IHRoaXMuaGVpZ2h0ID09PSAwKSB7CiAgICAgICAgICAgIG92ZXJsYXlDb25maWcuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm1pbldpZHRoIHx8IHRoaXMubWluV2lkdGggPT09IDApIHsKICAgICAgICAgICAgb3ZlcmxheUNvbmZpZy5taW5XaWR0aCA9IHRoaXMubWluV2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm1pbkhlaWdodCB8fCB0aGlzLm1pbkhlaWdodCA9PT0gMCkgewogICAgICAgICAgICBvdmVybGF5Q29uZmlnLm1pbkhlaWdodCA9IHRoaXMubWluSGVpZ2h0OwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5iYWNrZHJvcENsYXNzKSB7CiAgICAgICAgICAgIG92ZXJsYXlDb25maWcuYmFja2Ryb3BDbGFzcyA9IHRoaXMuYmFja2Ryb3BDbGFzczsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMucGFuZWxDbGFzcykgewogICAgICAgICAgICBvdmVybGF5Q29uZmlnLnBhbmVsQ2xhc3MgPSB0aGlzLnBhbmVsQ2xhc3M7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdmVybGF5Q29uZmlnOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiBhIHBvc2l0aW9uIHN0cmF0ZWd5LCBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIHRoZSBkaXJlY3RpdmUgaW5wdXRzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb25TdHJhdGVneQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb25TdHJhdGVneSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9ucy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudFBvc2l0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjdXJyZW50UG9zaXRpb24gPT4gKHsKICAgICAgICAgICAgb3JpZ2luWDogY3VycmVudFBvc2l0aW9uLm9yaWdpblgsCiAgICAgICAgICAgIG9yaWdpblk6IGN1cnJlbnRQb3NpdGlvbi5vcmlnaW5ZLAogICAgICAgICAgICBvdmVybGF5WDogY3VycmVudFBvc2l0aW9uLm92ZXJsYXlYLAogICAgICAgICAgICBvdmVybGF5WTogY3VycmVudFBvc2l0aW9uLm92ZXJsYXlZLAogICAgICAgICAgICBvZmZzZXRYOiBjdXJyZW50UG9zaXRpb24ub2Zmc2V0WCB8fCB0aGlzLm9mZnNldFgsCiAgICAgICAgICAgIG9mZnNldFk6IGN1cnJlbnRQb3NpdGlvbi5vZmZzZXRZIHx8IHRoaXMub2Zmc2V0WSwKICAgICAgICAgICAgcGFuZWxDbGFzczogY3VycmVudFBvc2l0aW9uLnBhbmVsQ2xhc3MgfHwgdW5kZWZpbmVkLAogICAgICAgIH0pKSk7CiAgICAgICAgcmV0dXJuIHBvc2l0aW9uU3RyYXRlZ3kKICAgICAgICAgICAgLnNldE9yaWdpbih0aGlzLm9yaWdpbi5lbGVtZW50UmVmKQogICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhwb3NpdGlvbnMpCiAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKHRoaXMuZmxleGlibGVEaW1lbnNpb25zKQogICAgICAgICAgICAud2l0aFB1c2godGhpcy5wdXNoKQogICAgICAgICAgICAud2l0aEdyb3dBZnRlck9wZW4odGhpcy5ncm93QWZ0ZXJPcGVuKQogICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKHRoaXMudmlld3BvcnRNYXJnaW4pCiAgICAgICAgICAgIC53aXRoTG9ja2VkUG9zaXRpb24odGhpcy5sb2NrUG9zaXRpb24pCiAgICAgICAgICAgIC53aXRoVHJhbnNmb3JtT3JpZ2luT24odGhpcy50cmFuc2Zvcm1PcmlnaW5TZWxlY3Rvcik7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IG9mIHRoZSBvdmVybGF5IHRvIGJlIHNldCBvbiB0aGUgb3ZlcmxheSBjb25maWcKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLm9yaWdpbi5lbGVtZW50UmVmKTsKICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHN0cmF0ZWd5KTsKICAgICAgICBzdHJhdGVneS5wb3NpdGlvbkNoYW5nZXMuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHAgPT4gdGhpcy5wb3NpdGlvbkNoYW5nZS5lbWl0KHApKSk7CiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5OwogICAgfQogICAgLyoqCiAgICAgKiBBdHRhY2hlcyB0aGUgb3ZlcmxheSBhbmQgc3Vic2NyaWJlcyB0byBiYWNrZHJvcCBjbGlja3MgaWYgYmFja2Ryb3AgZXhpc3RzCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2F0dGFjaE92ZXJsYXkoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU92ZXJsYXkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgb3ZlcmxheSBzaXplLCBpbiBjYXNlIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgaGF2ZSBjaGFuZ2VkCiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkuaGFzQmFja2Ryb3AgPSB0aGlzLmhhc0JhY2tkcm9wOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmF0dGFjaCh0aGlzLl90ZW1wbGF0ZVBvcnRhbCk7CiAgICAgICAgICAgIHRoaXMuYXR0YWNoLmVtaXQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaGFzQmFja2Ryb3ApIHsKICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb24gPSB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmJhY2tkcm9wQ2xpY2suZW1pdChldmVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyB0aGUgb3ZlcmxheSBhbmQgdW5zdWJzY3JpYmVzIHRvIGJhY2tkcm9wIGNsaWNrcyBpZiBiYWNrZHJvcCBleGlzdHMKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZGV0YWNoT3ZlcmxheSgpIHsKICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpOwogICAgICAgICAgICB0aGlzLmRldGFjaC5lbWl0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KQ2RrQ29ubmVjdGVkT3ZlcmxheS7JtWZhYyA9IGZ1bmN0aW9uIENka0Nvbm5lY3RlZE92ZXJsYXlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrQ29ubmVjdGVkT3ZlcmxheSkoybXJtWRpcmVjdGl2ZUluamVjdChPdmVybGF5KSwgybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ0RLX0NPTk5FQ1RFRF9PVkVSTEFZX1NDUk9MTF9TVFJBVEVHWSksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpKTsgfTsKQ2RrQ29ubmVjdGVkT3ZlcmxheS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtDb25uZWN0ZWRPdmVybGF5LCBzZWxlY3RvcnM6IFtbIiIsICJjZGstY29ubmVjdGVkLW92ZXJsYXkiLCAiIl0sIFsiIiwgImNvbm5lY3RlZC1vdmVybGF5IiwgIiJdLCBbIiIsICJjZGtDb25uZWN0ZWRPdmVybGF5IiwgIiJdXSwgaW5wdXRzOiB7IHZpZXdwb3J0TWFyZ2luOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbiIsICJ2aWV3cG9ydE1hcmdpbiJdLCBvcGVuOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwgIm9wZW4iXSwgc2Nyb2xsU3RyYXRlZ3k6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5IiwgInNjcm9sbFN0cmF0ZWd5Il0sIG9mZnNldFg6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheU9mZnNldFgiLCAib2Zmc2V0WCJdLCBvZmZzZXRZOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIiwgIm9mZnNldFkiXSwgaGFzQmFja2Ryb3A6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wIiwgImhhc0JhY2tkcm9wIl0sIGxvY2tQb3NpdGlvbjogWyJjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uIiwgImxvY2tQb3NpdGlvbiJdLCBmbGV4aWJsZURpbWVuc2lvbnM6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheUZsZXhpYmxlRGltZW5zaW9ucyIsICJmbGV4aWJsZURpbWVuc2lvbnMiXSwgZ3Jvd0FmdGVyT3BlbjogWyJjZGtDb25uZWN0ZWRPdmVybGF5R3Jvd0FmdGVyT3BlbiIsICJncm93QWZ0ZXJPcGVuIl0sIHB1c2g6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheVB1c2giLCAicHVzaCJdLCBwb3NpdGlvbnM6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucyIsICJwb3NpdGlvbnMiXSwgb3JpZ2luOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iLCAib3JpZ2luIl0sIHBvc2l0aW9uU3RyYXRlZ3k6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kiLCAicG9zaXRpb25TdHJhdGVneSJdLCB3aWR0aDogWyJjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGgiLCAid2lkdGgiXSwgaGVpZ2h0OiBbImNka0Nvbm5lY3RlZE92ZXJsYXlIZWlnaHQiLCAiaGVpZ2h0Il0sIG1pbldpZHRoOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aCIsICJtaW5XaWR0aCJdLCBtaW5IZWlnaHQ6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheU1pbkhlaWdodCIsICJtaW5IZWlnaHQiXSwgYmFja2Ryb3BDbGFzczogWyJjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcyIsICJiYWNrZHJvcENsYXNzIl0sIHBhbmVsQ2xhc3M6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheVBhbmVsQ2xhc3MiLCAicGFuZWxDbGFzcyJdLCB0cmFuc2Zvcm1PcmlnaW5TZWxlY3RvcjogWyJjZGtDb25uZWN0ZWRPdmVybGF5VHJhbnNmb3JtT3JpZ2luT24iLCAidHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IiXSB9LCBvdXRwdXRzOiB7IGJhY2tkcm9wQ2xpY2s6ICJiYWNrZHJvcENsaWNrIiwgcG9zaXRpb25DaGFuZ2U6ICJwb3NpdGlvbkNoYW5nZSIsIGF0dGFjaDogImF0dGFjaCIsIGRldGFjaDogImRldGFjaCIsIG92ZXJsYXlLZXlkb3duOiAib3ZlcmxheUtleWRvd24iIH0sIGV4cG9ydEFzOiBbImNka0Nvbm5lY3RlZE92ZXJsYXkiXSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkNka0Nvbm5lY3RlZE92ZXJsYXkuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE92ZXJsYXkgfSwKICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSwKICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0NES19DT05ORUNURURfT1ZFUkxBWV9TQ1JPTExfU1RSQVRFR1ksXSB9XSB9LAogICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQpdOwpDZGtDb25uZWN0ZWRPdmVybGF5LnByb3BEZWNvcmF0b3JzID0gewogICAgb3JpZ2luOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luJyxdIH1dLAogICAgcG9zaXRpb25zOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zJyxdIH1dLAogICAgcG9zaXRpb25TdHJhdGVneTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3knLF0gfV0sCiAgICBvZmZzZXRYOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCcsXSB9XSwKICAgIG9mZnNldFk6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZJyxdIH1dLAogICAgd2lkdGg6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aCcsXSB9XSwKICAgIGhlaWdodDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodCcsXSB9XSwKICAgIG1pbldpZHRoOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgnLF0gfV0sCiAgICBtaW5IZWlnaHQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlNaW5IZWlnaHQnLF0gfV0sCiAgICBiYWNrZHJvcENsYXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcycsXSB9XSwKICAgIHBhbmVsQ2xhc3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzJyxdIH1dLAogICAgdmlld3BvcnRNYXJnaW46IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbicsXSB9XSwKICAgIHNjcm9sbFN0cmF0ZWd5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3knLF0gfV0sCiAgICBvcGVuOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5T3BlbicsXSB9XSwKICAgIHRyYW5zZm9ybU9yaWdpblNlbGVjdG9yOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5VHJhbnNmb3JtT3JpZ2luT24nLF0gfV0sCiAgICBoYXNCYWNrZHJvcDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wJyxdIH1dLAogICAgbG9ja1Bvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uJyxdIH1dLAogICAgZmxleGlibGVEaW1lbnNpb25zOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zJyxdIH1dLAogICAgZ3Jvd0FmdGVyT3BlbjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4nLF0gfV0sCiAgICBwdXNoOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5UHVzaCcsXSB9XSwKICAgIGJhY2tkcm9wQ2xpY2s6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIHBvc2l0aW9uQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBhdHRhY2g6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIGRldGFjaDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgb3ZlcmxheUtleWRvd246IFt7IHR5cGU6IE91dHB1dCB9XQp9OwovKioKICogXEBkb2NzLXByaXZhdGUKICogQHBhcmFtIHs/fSBvdmVybGF5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBDREtfQ09OTkVDVEVEX09WRVJMQVlfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlkob3ZlcmxheSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IG92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCkpOwp9Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAdHlwZSB7P30KICovCmNvbnN0IENES19DT05ORUNURURfT1ZFUkxBWV9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVIgPSB7CiAgICBwcm92aWRlOiBDREtfQ09OTkVDVEVEX09WRVJMQVlfU0NST0xMX1NUUkFURUdZLAogICAgZGVwczogW092ZXJsYXldLAogICAgdXNlRmFjdG9yeTogQ0RLX0NPTk5FQ1RFRF9PVkVSTEFZX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZLAp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L292ZXJsYXktbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE92ZXJsYXlNb2R1bGUgewp9Ck92ZXJsYXlNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBPdmVybGF5TW9kdWxlIH0pOwpPdmVybGF5TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gT3ZlcmxheU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBPdmVybGF5TW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICBPdmVybGF5LAogICAgICAgIENES19DT05ORUNURURfT1ZFUkxBWV9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVIsCiAgICBdLCBpbXBvcnRzOiBbW0JpZGlNb2R1bGUsIFBvcnRhbE1vZHVsZSwgU2Nyb2xsaW5nTW9kdWxlXSwKICAgICAgICBTY3JvbGxpbmdNb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShPdmVybGF5TW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0Nka0Nvbm5lY3RlZE92ZXJsYXksCiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtCaWRpTW9kdWxlLCBQb3J0YWxNb2R1bGUsIFNjcm9sbGluZ01vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtDb25uZWN0ZWRPdmVybGF5LAogICAgICAgIENka092ZXJsYXlPcmlnaW4sCiAgICAgICAgU2Nyb2xsaW5nTW9kdWxlXTsgfSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9mdWxsc2NyZWVuLW92ZXJsYXktY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBbHRlcm5hdGl2ZSB0byBPdmVybGF5Q29udGFpbmVyIHRoYXQgc3VwcG9ydHMgY29ycmVjdCBkaXNwbGF5aW5nIG9mIG92ZXJsYXkgZWxlbWVudHMgaW4KICogRnVsbHNjcmVlbiBtb2RlCiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlcXVlc3RGdWxsU2NyZWVuCiAqCiAqIFNob3VsZCBiZSBwcm92aWRlZCBpbiB0aGUgcm9vdCBjb21wb25lbnQuCiAqLwpjbGFzcyBGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lciBleHRlbmRzIE92ZXJsYXlDb250YWluZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICogQHBhcmFtIHs/PX0gcGxhdGZvcm0KICAgICAqLwogICAgY29uc3RydWN0b3IoX2RvY3VtZW50LCAKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLgogICAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAqLwogICAgcGxhdGZvcm0pIHsKICAgICAgICBzdXBlcihfZG9jdW1lbnQsIHBsYXRmb3JtKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTsKICAgICAgICBpZiAodGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSAmJiB0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpIHsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lLCB0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByb3RlY3RlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZUNvbnRhaW5lcigpIHsKICAgICAgICBzdXBlci5fY3JlYXRlQ29udGFpbmVyKCk7CiAgICAgICAgdGhpcy5fYWRqdXN0UGFyZW50Rm9yRnVsbHNjcmVlbkNoYW5nZSgpOwogICAgICAgIHRoaXMuX2FkZEZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLl9hZGp1c3RQYXJlbnRGb3JGdWxsc2NyZWVuQ2hhbmdlKCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hZGp1c3RQYXJlbnRGb3JGdWxsc2NyZWVuQ2hhbmdlKCkgewogICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyRWxlbWVudCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmdWxsc2NyZWVuRWxlbWVudCA9IHRoaXMuZ2V0RnVsbHNjcmVlbkVsZW1lbnQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gZnVsbHNjcmVlbkVsZW1lbnQgfHwgdGhpcy5fZG9jdW1lbnQuYm9keTsKICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkRnVsbHNjcmVlbkNoYW5nZUxpc3RlbmVyKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IHRoaXMuX2dldEV2ZW50TmFtZSgpOwogICAgICAgIGlmIChldmVudE5hbWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2Z1bGxTY3JlZW5MaXN0ZW5lcikgewogICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuX2Z1bGxTY3JlZW5MaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuKTsKICAgICAgICAgICAgdGhpcy5fZnVsbFNjcmVlbkxpc3RlbmVyID0gZm47CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEV2ZW50TmFtZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBfZG9jdW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQpKTsKICAgICAgICAgICAgaWYgKF9kb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSA9ICdmdWxsc2NyZWVuY2hhbmdlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChfZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWUgPSAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoX2RvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lID0gJ21vemZ1bGxzY3JlZW5jaGFuZ2UnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKF9kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lID0gJ01TRnVsbHNjcmVlbkNoYW5nZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIFdoZW4gdGhlIHBhZ2UgaXMgcHV0IGludG8gZnVsbHNjcmVlbiBtb2RlLCBhIHNwZWNpZmljIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgogICAgICogT25seSB0aGF0IGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgdmlzaWJsZSB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEZ1bGxzY3JlZW5FbGVtZW50KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBfZG9jdW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQpKTsKICAgICAgICByZXR1cm4gX2RvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8CiAgICAgICAgICAgIF9kb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fAogICAgICAgICAgICBfZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHwKICAgICAgICAgICAgX2RvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgfHwKICAgICAgICAgICAgbnVsbDsKICAgIH0KfQpGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgIHsgdHlwZTogUGxhdGZvcm0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gRnVsbHNjcmVlbk92ZXJsYXlDb250YWluZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfSwgdG9rZW46IEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KLyoqCiAqIFVzZWQgdG8gcHJvdmlkZSBhIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIGZvcm0gY29udHJvbHMuCiAqCiAqIFNlZSBgRGVmYXVsdFZhbHVlQWNjZXNzb3JgIGZvciBob3cgdG8gaW1wbGVtZW50IG9uZS4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBOR19WQUxVRV9BQ0NFU1NPUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignTmdWYWx1ZUFjY2Vzc29yJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IENIRUNLQk9YX1ZBTFVFX0FDQ0VTU09SID0gewogICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yKSksCiAgICBtdWx0aTogdHJ1ZSwKfTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogQSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIGEgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIG9uIGEgY2hlY2tib3ggaW5wdXQKICogZWxlbWVudC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBVc2luZyBhIGNoZWNrYm94IHdpdGggYSByZWFjdGl2ZSBmb3JtLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGNoZWNrYm94IHdpdGggYSByZWFjdGl2ZSBmb3JtLgogKgogKiBgYGB0cwogKiBjb25zdCByZW1lbWJlckxvZ2luQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpOwogKiBgYGAKICoKICogYGBgCiAqIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgW2Zvcm1Db250cm9sXT0icmVtZW1iZXJMb2dpbkNvbnRyb2wiPgogKiBgYGAKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChfKSA9PiB7IH0pOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHRoaXMub25Ub3VjaGVkID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4geyB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgImNoZWNrZWQiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdyaXRlVmFsdWUodmFsdWUpIHsKICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjaGVja2VkJywgdmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBpcyB0b3VjaGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlICJkaXNhYmxlZCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTsKICAgIH0KfQpDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLsm1ZmFjID0gZnVuY3Rpb24gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwpDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IsIHNlbGVjdG9yczogW1siaW5wdXQiLCAidHlwZSIsICJjaGVja2JveCIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJjaGVja2JveCIsICJmb3JtQ29udHJvbCIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcl9jaGFuZ2VfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uQ2hhbmdlKCRldmVudC50YXJnZXQuY2hlY2tlZCk7IH0pKCJibHVyIiwgZnVuY3Rpb24gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcl9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblRvdWNoZWQoKTsgfSk7CiAgICB9IH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW0NIRUNLQk9YX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwovKiogQG5vY29sbGFwc2UgKi8KQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3Nvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1IgPSB7CiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IERlZmF1bHRWYWx1ZUFjY2Vzc29yKSksCiAgICBtdWx0aTogdHJ1ZQp9OwovKioKICogV2UgbXVzdCBjaGVjayB3aGV0aGVyIHRoZSBhZ2VudCBpcyBBbmRyb2lkIGJlY2F1c2UgY29tcG9zaXRpb24gZXZlbnRzCiAqIGJlaGF2ZSBkaWZmZXJlbnRseSBiZXR3ZWVuIGlPUyBhbmQgQW5kcm9pZC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9pc0FuZHJvaWQoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1c2VyQWdlbnQgPSBnZXRET00oKSA/IGdldERPTSgpLmdldFVzZXJBZ2VudCgpIDogJyc7CiAgICByZXR1cm4gL2FuZHJvaWQgKFxkKykvLnRlc3QodXNlckFnZW50LnRvTG93ZXJDYXNlKCkpOwp9Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBjb250cm9sIGlmIGZvcm0gZGlyZWN0aXZlcyBidWZmZXIgSU1FIGlucHV0IHVudGlsCiAqIHRoZSAiY29tcG9zaXRpb25lbmQiIGV2ZW50IG9jY3Vycy4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSA9IG5ldyBJbmplY3Rpb25Ub2tlbignQ29tcG9zaXRpb25FdmVudE1vZGUnKTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogVGhlIGRlZmF1bHQgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyBhIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gY2hhbmdlcyBvbiBpbnB1dAogKiBlbGVtZW50cy4gVGhlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQKICogYE5nTW9kZWxgIGRpcmVjdGl2ZXMuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgVXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgYWNjZXNzb3IKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYW4gaW5wdXQgZWxlbWVudCB0aGF0IGFjdGl2YXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBhY2Nlc3NvcgogKiAoaW4gdGhpcyBjYXNlLCBhIHRleHQgZmllbGQpLgogKgogKiBgYGB0cwogKiBjb25zdCBmaXJzdE5hbWVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7CiAqIGBgYAogKgogKiBgYGAKICogPGlucHV0IHR5cGU9InRleHQiIFtmb3JtQ29udHJvbF09ImZpcnN0TmFtZUNvbnRyb2wiPgogKiBgYGAKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIERlZmF1bHRWYWx1ZUFjY2Vzc29yIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2NvbXBvc2l0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmLCBfY29tcG9zaXRpb25Nb2RlKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX2NvbXBvc2l0aW9uTW9kZSA9IF9jb21wb3NpdGlvbk1vZGU7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGFuIGlucHV0IGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKF8pID0+IHsgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3JlYXRpbmcgYSBjb21wb3NpdGlvbiBzdHJpbmcgKElNRSBldmVudHMpLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2NvbXBvc2luZyA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLl9jb21wb3NpdGlvbk1vZGUgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9jb21wb3NpdGlvbk1vZGUgPSAhX2lzQW5kcm9pZCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgInZhbHVlIiBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBjaGVja2VkIHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlOwogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbm9ybWFsaXplZFZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgY2hhbmdlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJPbkNoYW5nZShmbikgewogICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSAiZGlzYWJsZWQiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZCBUaGUgZGlzYWJsZWQgdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkgewogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYW5kbGVJbnB1dCh2YWx1ZSkgewogICAgICAgIGlmICghdGhpcy5fY29tcG9zaXRpb25Nb2RlIHx8ICh0aGlzLl9jb21wb3NpdGlvbk1vZGUgJiYgIXRoaXMuX2NvbXBvc2luZykpIHsKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY29tcG9zaXRpb25TdGFydCgpIHsKICAgICAgICB0aGlzLl9jb21wb3NpbmcgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY29tcG9zaXRpb25FbmQodmFsdWUpIHsKICAgICAgICB0aGlzLl9jb21wb3NpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLl9jb21wb3NpdGlvbk1vZGUgJiYgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7CiAgICB9Cn0KRGVmYXVsdFZhbHVlQWNjZXNzb3IuybVmYWMgPSBmdW5jdGlvbiBEZWZhdWx0VmFsdWVBY2Nlc3Nvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWZhdWx0VmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFLCA4KSk7IH07CkRlZmF1bHRWYWx1ZUFjY2Vzc29yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IERlZmF1bHRWYWx1ZUFjY2Vzc29yLCBzZWxlY3RvcnM6IFtbImlucHV0IiwgImZvcm1Db250cm9sTmFtZSIsICIiLCAzLCAidHlwZSIsICJjaGVja2JveCJdLCBbInRleHRhcmVhIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyJpbnB1dCIsICJmb3JtQ29udHJvbCIsICIiLCAzLCAidHlwZSIsICJjaGVja2JveCJdLCBbInRleHRhcmVhIiwgImZvcm1Db250cm9sIiwgIiJdLCBbImlucHV0IiwgIm5nTW9kZWwiLCAiIiwgMywgInR5cGUiLCAiY2hlY2tib3giXSwgWyJ0ZXh0YXJlYSIsICJuZ01vZGVsIiwgIiJdLCBbIiIsICJuZ0RlZmF1bHRDb250cm9sIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBEZWZhdWx0VmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIERlZmF1bHRWYWx1ZUFjY2Vzc29yX2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSk7IH0pKCJibHVyIiwgZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25Ub3VjaGVkKCk7IH0pKCJjb21wb3NpdGlvbnN0YXJ0IiwgZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfY29tcG9zaXRpb25zdGFydF9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX2NvbXBvc2l0aW9uU3RhcnQoKTsgfSkoImNvbXBvc2l0aW9uZW5kIiwgZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfY29tcG9zaXRpb25lbmRfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9jb21wb3NpdGlvbkVuZCgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSk7CiAgICB9IH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW0RFRkFVTFRfVkFMVUVfQUNDRVNTT1JdKV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpEZWZhdWx0VmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogQm9vbGVhbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2Fic3RyYWN0X2NvbnRyb2xfZGlyZWN0aXZlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFxAZGVzY3JpcHRpb24KICogQmFzZSBjbGFzcyBmb3IgY29udHJvbCBkaXJlY3RpdmVzLgogKgogKiBUaGlzIGNsYXNzIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBgUmVhY3RpdmVGb3Jtc01vZHVsZWAgYW5kIHRoZSBgRm9ybXNNb2R1bGVgLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlcG9ydHMgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGlmIGl0IGlzIHByZXNlbnQsIG90aGVyd2lzZSBudWxsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudmFsdWUgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdmFsaWQuIEEgY29udHJvbCBpcyBjb25zaWRlcmVkIHZhbGlkIGlmIG5vCiAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyBleGlzdCB3aXRoIHRoZSBjdXJyZW50IHZhbHVlLgogICAgICogSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC52YWxpZCA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCBpcyBpbnZhbGlkLCBtZWFuaW5nIHRoYXQgYW4gZXJyb3IgZXhpc3RzIGluIHRoZSBpbnB1dCB2YWx1ZS4KICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGludmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5pbnZhbGlkIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVwb3J0cyB3aGV0aGVyIGEgY29udHJvbCBpcyBwZW5kaW5nLCBtZWFuaW5nIHRoYXQgdGhhdCBhc3luYyB2YWxpZGF0aW9uIGlzIG9jY3VycmluZyBhbmQKICAgICAqIGVycm9ycyBhcmUgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBpbnB1dCB2YWx1ZS4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMKICAgICAqIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBlbmRpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5wZW5kaW5nIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGRpc2FibGVkLCBtZWFuaW5nIHRoYXQgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQKICAgICAqIGluIHRoZSBVSSBhbmQgaXMgZXhlbXB0IGZyb20gdmFsaWRhdGlvbiBjaGVja3MgYW5kIGV4Y2x1ZGVkIGZyb20gYWdncmVnYXRlCiAgICAgKiB2YWx1ZXMgb2YgYW5jZXN0b3IgY29udHJvbHMuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRpc2FibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgZW5hYmxlZCwgbWVhbmluZyB0aGF0IHRoZSBjb250cm9sIGlzIGluY2x1ZGVkIGluIGFuY2VzdG9yCiAgICAgKiBjYWxjdWxhdGlvbnMgb2YgdmFsaWRpdHkgb3IgdmFsdWUuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGVuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5lbmFibGVkIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVwb3J0cyB0aGUgY29udHJvbCdzIHZhbGlkYXRpb24gZXJyb3JzLiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBlcnJvcnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5lcnJvcnMgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgcHJpc3RpbmUsIG1lYW5pbmcgdGhhdCB0aGUgdXNlciBoYXMgbm90IHlldCBjaGFuZ2VkCiAgICAgKiB0aGUgdmFsdWUgaW4gdGhlIFVJLiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwcmlzdGluZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnByaXN0aW5lIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGRpcnR5LCBtZWFuaW5nIHRoYXQgdGhlIHVzZXIgaGFzIGNoYW5nZWQKICAgICAqIHRoZSB2YWx1ZSBpbiB0aGUgVUkuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRpcnR5KCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuZGlydHkgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdG91Y2hlZCwgbWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0cmlnZ2VyZWQKICAgICAqIGEgYGJsdXJgIGV2ZW50IG9uIGl0LiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0b3VjaGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudG91Y2hlZCA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlcG9ydHMgdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHRoZSBjb250cm9sLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZToKICAgICAqICdWQUxJRCcsICdJTlZBTElEJywgJ0RJU0FCTEVEJywgYW5kICdQRU5ESU5HJy4KICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnN0YXR1cyA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCBpcyB1bnRvdWNoZWQsIG1lYW5pbmcgdGhhdCB0aGUgdXNlciBoYXMgbm90IHlldCB0cmlnZ2VyZWQKICAgICAqIGEgYGJsdXJgIGV2ZW50IG9uIGl0LiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB1bnRvdWNoZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC51bnRvdWNoZWQgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXR1cm5zIGEgbXVsdGljYXN0aW5nIG9ic2VydmFibGUgdGhhdCBlbWl0cyBhIHZhbGlkYXRpb24gc3RhdHVzIHdoZW5ldmVyIGl0IGlzCiAgICAgKiBjYWxjdWxhdGVkIGZvciB0aGUgY29udHJvbC4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc3RhdHVzQ2hhbmdlcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnN0YXR1c0NoYW5nZXMgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXR1cm5zIGEgbXVsdGljYXN0aW5nIG9ic2VydmFibGUgb2YgdmFsdWUgY2hhbmdlcyBmb3IgdGhlIGNvbnRyb2wgdGhhdCBlbWl0cyBldmVyeSB0aW1lIHRoZQogICAgICogdmFsdWUgb2YgdGhlIGNvbnRyb2wgY2hhbmdlcyBpbiB0aGUgVUkgb3IgcHJvZ3JhbW1hdGljYWxseS4KICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbHVlQ2hhbmdlcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcyA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC4KICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGF0aCgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVzZXRzIHRoZSBjb250cm9sIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlIGlmIHRoZSBjb250cm9sIGlzIHByZXNlbnQuCiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQodmFsdWUgPSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAodGhpcy5jb250cm9sKQogICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBoYXMgdGhlIGVycm9yIHNwZWNpZmllZC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBgRm9ybUdyb3VwYDoKICAgICAqCiAgICAgKiBgYGAKICAgICAqIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAqICAgYWRkcmVzczogbmV3IEZvcm1Hcm91cCh7IHN0cmVldDogbmV3IEZvcm1Db250cm9sKCkgfSkKICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogVGhlIHBhdGggdG8gdGhlICdzdHJlZXQnIGNvbnRyb2wgZnJvbSB0aGUgcm9vdCBmb3JtIHdvdWxkIGJlICdhZGRyZXNzJyAtPiAnc3RyZWV0Jy4KICAgICAqCiAgICAgKiBJdCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhpcyBtZXRob2QgaW4gb25lIG9mIHR3byBmb3JtYXRzOgogICAgICoKICAgICAqIDEuIEFuIGFycmF5IG9mIHN0cmluZyBjb250cm9sIG5hbWVzLCBlLmcuIGBbJ2FkZHJlc3MnLCAnc3RyZWV0J11gCiAgICAgKiAxLiBBIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiBjb250cm9sIG5hbWVzIGluIG9uZSBzdHJpbmcsIGUuZy4gYCdhZGRyZXNzLnN0cmVldCdgCiAgICAgKgogICAgICogSWYgbm8gcGF0aCBpcyBnaXZlbiwgdGhpcyBtZXRob2QgY2hlY2tzIGZvciB0aGUgZXJyb3Igb24gdGhlIGN1cnJlbnQgY29udHJvbC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2sKICAgICAqIEBwYXJhbSB7Pz19IHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbAogICAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLgogICAgICoKICAgICAqIEByZXR1cm4gez99IHdoZXRoZXIgdGhlIGdpdmVuIGVycm9yIGlzIHByZXNlbnQgaW4gdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIHBhdGguCiAgICAgKgogICAgICogSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIGZhbHNlIGlzIHJldHVybmVkLgogICAgICovCiAgICBoYXNFcnJvcihlcnJvckNvZGUsIHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLmhhc0Vycm9yKGVycm9yQ29kZSwgcGF0aCkgOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVwb3J0cyBlcnJvciBkYXRhIGZvciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGBGb3JtR3JvdXBgOgogICAgICoKICAgICAqIGBgYAogICAgICogZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICogICBhZGRyZXNzOiBuZXcgRm9ybUdyb3VwKHsgc3RyZWV0OiBuZXcgRm9ybUNvbnRyb2woKSB9KQogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgcGF0aCB0byB0aGUgJ3N0cmVldCcgY29udHJvbCBmcm9tIHRoZSByb290IGZvcm0gd291bGQgYmUgJ2FkZHJlc3MnIC0+ICdzdHJlZXQnLgogICAgICoKICAgICAqIEl0IGNhbiBiZSBwcm92aWRlZCB0byB0aGlzIG1ldGhvZCBpbiBvbmUgb2YgdHdvIGZvcm1hdHM6CiAgICAgKgogICAgICogMS4gQW4gYXJyYXkgb2Ygc3RyaW5nIGNvbnRyb2wgbmFtZXMsIGUuZy4gYFsnYWRkcmVzcycsICdzdHJlZXQnXWAKICAgICAqIDEuIEEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgaW4gb25lIHN0cmluZywgZS5nLiBgJ2FkZHJlc3Muc3RyZWV0J2AKICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2sKICAgICAqIEBwYXJhbSB7Pz19IHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbAogICAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLgogICAgICoKICAgICAqIEByZXR1cm4gez99IGVycm9yIGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBlcnJvci4gSWYgdGhlIGNvbnRyb2wgb3IgZXJyb3IgaXMgbm90IHByZXNlbnQsCiAgICAgKiBudWxsIGlzIHJldHVybmVkLgogICAgICovCiAgICBnZXRFcnJvcihlcnJvckNvZGUsIHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLmdldEVycm9yKGVycm9yQ29kZSwgcGF0aCkgOiBudWxsOwogICAgfQp9CkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS7JtWZhYyA9IGZ1bmN0aW9uIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUpKCk7IH07CkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9jb250cm9sX2NvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBkZXNjcmlwdGlvbgogKiBBIGJhc2UgY2xhc3MgZm9yIGRpcmVjdGl2ZXMgdGhhdCBjb250YWluIG11bHRpcGxlIHJlZ2lzdGVyZWQgaW5zdGFuY2VzIG9mIGBOZ0NvbnRyb2xgLgogKiBPbmx5IHVzZWQgYnkgdGhlIGZvcm1zIG1vZHVsZS4KICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBDb250cm9sQ29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlIHsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIHRvcC1sZXZlbCBmb3JtIGRpcmVjdGl2ZSBmb3IgdGhlIGNvbnRyb2wuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZm9ybURpcmVjdGl2ZSgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIHBhdGggdG8gdGhpcyBncm91cC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXRoKCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CkNvbnRyb2xDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBDb250cm9sQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gybVDb250cm9sQ29udGFpbmVyX0Jhc2VGYWN0b3J5KHQgfHwgQ29udHJvbENvbnRhaW5lcik7IH07CkNvbnRyb2xDb250YWluZXIuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ29udHJvbENvbnRhaW5lciwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKY29uc3QgybVDb250cm9sQ29udGFpbmVyX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoQ29udHJvbENvbnRhaW5lcik7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9uZ19jb250cm9sLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdW5pbXBsZW1lbnRlZCgpIHsKICAgIHRocm93IG5ldyBFcnJvcigndW5pbXBsZW1lbnRlZCcpOwp9Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEEgYmFzZSBjbGFzcyB0aGF0IGFsbCBjb250cm9sIGBGb3JtQ29udHJvbGAtYmFzZWQgZGlyZWN0aXZlcyBleHRlbmQuIEl0IGJpbmRzIGEgYEZvcm1Db250cm9sYAogKiBvYmplY3QgdG8gYSBET00gZWxlbWVudC4KICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBOZ0NvbnRyb2wgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHBhcmVudCBmb3JtIGZvciB0aGUgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgbmFtZSBmb3IgdGhlIGNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICB0aGlzLm5hbWUgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgdmFsdWUgYWNjZXNzb3IgZm9yIHRoZSBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgdGhpcy52YWx1ZUFjY2Vzc29yID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHVuY29tcG9zZWQgYXJyYXkgb2Ygc3luY2hyb25vdXMgdmFsaWRhdG9ycyBmb3IgdGhlIGNvbnRyb2wKICAgICAgICAgKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9yYXdWYWxpZGF0b3JzID0gW107CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSB1bmNvbXBvc2VkIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvcnMgZm9yIHRoZSBjb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzID0gW107CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSByZWdpc3RlcmVkIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgdGhlIGNvbnRyb2wKICAgICAqCiAgICAgKiBAdGhyb3dzIEFuIGV4Y2VwdGlvbiB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHVuaW1wbGVtZW50ZWQoKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgcmVnaXN0ZXJlZCBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb24gZm9yIHRoZSBjb250cm9sCiAgICAgKgogICAgICogQHRocm93cyBBbiBleGNlcHRpb24gdGhhdCB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBhc3luY1ZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHVuaW1wbGVtZW50ZWQoKSkpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9uZ19jb250cm9sX3N0YXR1cy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBBYnN0cmFjdENvbnRyb2xTdGF0dXMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNkCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGNkKSB7CiAgICAgICAgdGhpcy5fY2QgPSBjZDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5nQ2xhc3NVbnRvdWNoZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLnVudG91Y2hlZCA6IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbmdDbGFzc1RvdWNoZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLnRvdWNoZWQgOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5nQ2xhc3NQcmlzdGluZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wucHJpc3RpbmUgOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5nQ2xhc3NEaXJ0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wuZGlydHkgOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5nQ2xhc3NWYWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wudmFsaWQgOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5nQ2xhc3NJbnZhbGlkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9jZC5jb250cm9sID8gdGhpcy5fY2QuY29udHJvbC5pbnZhbGlkIDogZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuZ0NsYXNzUGVuZGluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wucGVuZGluZyA6IGZhbHNlOwogICAgfQp9Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIERpcmVjdGl2ZSBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gQW5ndWxhciBmb3JtIGNvbnRyb2xzIHRoYXQgc2V0cyBDU1MgY2xhc3NlcwogKiBiYXNlZCBvbiBjb250cm9sIHN0YXR1cy4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBDU1MgY2xhc3NlcyBhcHBsaWVkCiAqCiAqIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgYXBwbGllZCBhcyB0aGUgcHJvcGVydGllcyBiZWNvbWUgdHJ1ZToKICoKICogKiBuZy12YWxpZAogKiAqIG5nLWludmFsaWQKICogKiBuZy1wZW5kaW5nCiAqICogbmctcHJpc3RpbmUKICogKiBuZy1kaXJ0eQogKiAqIG5nLXVudG91Y2hlZAogKiAqIG5nLXRvdWNoZWQKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5nQ29udHJvbFN0YXR1cyBleHRlbmRzIEFic3RyYWN0Q29udHJvbFN0YXR1cyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2QKICAgICAqLwogICAgY29uc3RydWN0b3IoY2QpIHsKICAgICAgICBzdXBlcihjZCk7CiAgICB9Cn0KTmdDb250cm9sU3RhdHVzLsm1ZmFjID0gZnVuY3Rpb24gTmdDb250cm9sU3RhdHVzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ29udHJvbFN0YXR1cykoybXJtWRpcmVjdGl2ZUluamVjdChOZ0NvbnRyb2wsIDIpKTsgfTsKTmdDb250cm9sU3RhdHVzLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nQ29udHJvbFN0YXR1cywgc2VsZWN0b3JzOiBbWyIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIiIsICJuZ01vZGVsIiwgIiJdLCBbIiIsICJmb3JtQ29udHJvbCIsICIiXV0sIGhvc3RWYXJzOiAxNCwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBOZ0NvbnRyb2xTdGF0dXNfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoIm5nLXVudG91Y2hlZCIsIGN0eC5uZ0NsYXNzVW50b3VjaGVkKSgibmctdG91Y2hlZCIsIGN0eC5uZ0NsYXNzVG91Y2hlZCkoIm5nLXByaXN0aW5lIiwgY3R4Lm5nQ2xhc3NQcmlzdGluZSkoIm5nLWRpcnR5IiwgY3R4Lm5nQ2xhc3NEaXJ0eSkoIm5nLXZhbGlkIiwgY3R4Lm5nQ2xhc3NWYWxpZCkoIm5nLWludmFsaWQiLCBjdHgubmdDbGFzc0ludmFsaWQpKCJuZy1wZW5kaW5nIiwgY3R4Lm5nQ2xhc3NQZW5kaW5nKTsKICAgIH0gfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk5nQ29udHJvbFN0YXR1cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogTmdDb250cm9sLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTZWxmIH1dIH0KXTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogRGlyZWN0aXZlIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBBbmd1bGFyIGZvcm0gZ3JvdXBzIHRoYXQgc2V0cyBDU1MgY2xhc3NlcwogKiBiYXNlZCBvbiBjb250cm9sIHN0YXR1cyAodmFsaWQvaW52YWxpZC9kaXJ0eS9ldGMpLgogKgogKiBAc2VlIGBOZ0NvbnRyb2xTdGF0dXNgCiAqCiAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ0NvbnRyb2xTdGF0dXNHcm91cCBleHRlbmRzIEFic3RyYWN0Q29udHJvbFN0YXR1cyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2QKICAgICAqLwogICAgY29uc3RydWN0b3IoY2QpIHsKICAgICAgICBzdXBlcihjZCk7CiAgICB9Cn0KTmdDb250cm9sU3RhdHVzR3JvdXAuybVmYWMgPSBmdW5jdGlvbiBOZ0NvbnRyb2xTdGF0dXNHcm91cF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0NvbnRyb2xTdGF0dXNHcm91cCkoybXJtWRpcmVjdGl2ZUluamVjdChDb250cm9sQ29udGFpbmVyLCAyKSk7IH07Ck5nQ29udHJvbFN0YXR1c0dyb3VwLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nQ29udHJvbFN0YXR1c0dyb3VwLCBzZWxlY3RvcnM6IFtbIiIsICJmb3JtR3JvdXBOYW1lIiwgIiJdLCBbIiIsICJmb3JtQXJyYXlOYW1lIiwgIiJdLCBbIiIsICJuZ01vZGVsR3JvdXAiLCAiIl0sIFsiIiwgImZvcm1Hcm91cCIsICIiXSwgWyJmb3JtIiwgMywgIm5nTm9Gb3JtIiwgIiJdLCBbIiIsICJuZ0Zvcm0iLCAiIl1dLCBob3N0VmFyczogMTQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTmdDb250cm9sU3RhdHVzR3JvdXBfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoIm5nLXVudG91Y2hlZCIsIGN0eC5uZ0NsYXNzVW50b3VjaGVkKSgibmctdG91Y2hlZCIsIGN0eC5uZ0NsYXNzVG91Y2hlZCkoIm5nLXByaXN0aW5lIiwgY3R4Lm5nQ2xhc3NQcmlzdGluZSkoIm5nLWRpcnR5IiwgY3R4Lm5nQ2xhc3NEaXJ0eSkoIm5nLXZhbGlkIiwgY3R4Lm5nQ2xhc3NWYWxpZCkoIm5nLWludmFsaWQiLCBjdHgubmdDbGFzc0ludmFsaWQpKCJuZy1wZW5kaW5nIiwgY3R4Lm5nQ2xhc3NQZW5kaW5nKTsKICAgIH0gfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk5nQ29udHJvbFN0YXR1c0dyb3VwLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBDb250cm9sQ29udGFpbmVyLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTZWxmIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy92YWxpZGF0b3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0VtcHR5SW5wdXRWYWx1ZSh2YWx1ZSkgewogICAgLy8gd2UgZG9uJ3QgY2hlY2sgZm9yIHN0cmluZyBoZXJlIHNvIGl0IGFsc28gd29ya3Mgd2l0aCBhcnJheXMKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCA9PT0gMDsKfQovKioKICogXEBkZXNjcmlwdGlvbgogKiBBbiBgSW5qZWN0aW9uVG9rZW5gIGZvciByZWdpc3RlcmluZyBhZGRpdGlvbmFsIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdXNlZCB3aXRoCiAqIGBBYnN0cmFjdENvbnRyb2xgcy4KICoKICogQHNlZSBgTkdfQVNZTkNfVkFMSURBVE9SU2AKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBQcm92aWRpbmcgYSBjdXN0b20gdmFsaWRhdG9yCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWdpc3RlcnMgYSBjdXN0b20gdmFsaWRhdG9yIGRpcmVjdGl2ZS4gQWRkaW5nIHRoZSB2YWxpZGF0b3IgdG8gdGhlCiAqIGV4aXN0aW5nIGNvbGxlY3Rpb24gb2YgdmFsaWRhdG9ycyByZXF1aXJlcyB0aGUgYG11bHRpOiB0cnVlYCBvcHRpb24uCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogXEBEaXJlY3RpdmUoewogKiAgIHNlbGVjdG9yOiAnW2N1c3RvbVZhbGlkYXRvcl0nLAogKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlLCBtdWx0aTogdHJ1ZX1dCiAqIH0pCiAqIGNsYXNzIEN1c3RvbVZhbGlkYXRvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIFZhbGlkYXRvciB7CiAqICAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgewogKiAgICAgcmV0dXJuIHsgJ2N1c3RvbSc6IHRydWUgfTsKICogICB9CiAqIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTkdfVkFMSURBVE9SUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTmdWYWxpZGF0b3JzJyk7Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEFuIGBJbmplY3Rpb25Ub2tlbmAgZm9yIHJlZ2lzdGVyaW5nIGFkZGl0aW9uYWwgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdXNlZCB3aXRoCiAqIGBBYnN0cmFjdENvbnRyb2xgcy4KICoKICogQHNlZSBgTkdfVkFMSURBVE9SU2AKICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBOR19BU1lOQ19WQUxJREFUT1JTID0gbmV3IEluamVjdGlvblRva2VuKCdOZ0FzeW5jVmFsaWRhdG9ycycpOwovKioKICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHZhbGlkIGUtbWFpbCBhZGRyZXNzZXMuCiAqCiAqIEF0IGEgaGlnaCBsZXZlbCwgdGhpcyByZWdleHAgbWF0Y2hlcyBlLW1haWwgYWRkcmVzc2VzIG9mIHRoZSBmb3JtYXQgYGxvY2FsLXBhcnRcQHRsZGAsIHdoZXJlOgogKiAtIGBsb2NhbC1wYXJ0YCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgYWxsb3dlZCBjaGFyYWN0ZXJzIChhbHBoYW51bWVyaWMgYW5kIHNvbWUKICogICBwdW5jdHVhdGlvbiBzeW1ib2xzKS4KICogLSBgbG9jYWwtcGFydGAgY2Fubm90IGJlZ2luIG9yIGVuZCB3aXRoIGEgcGVyaW9kIChgLmApLgogKiAtIGBsb2NhbC1wYXJ0YCBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycy4KICogLSBgdGxkYCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBgbGFiZWxzYCBzZXBhcmF0ZWQgYnkgcGVyaW9kcyAoYC5gKS4gRm9yIGV4YW1wbGUgYGxvY2FsaG9zdGAgb3IKICogICBgZm9vLmNvbWAuCiAqIC0gQSBgbGFiZWxgIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBhbGxvd2VkIGNoYXJhY3RlcnMgKGFscGhhbnVtZXJpYywgZGFzaGVzIChgLWApIGFuZAogKiAgIHBlcmlvZHMgKGAuYCkpLgogKiAtIEEgYGxhYmVsYCBjYW5ub3QgYmVnaW4gb3IgZW5kIHdpdGggYSBkYXNoIChgLWApIG9yIGEgcGVyaW9kIChgLmApLgogKiAtIEEgYGxhYmVsYCBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gNjMgY2hhcmFjdGVycy4KICogLSBUaGUgd2hvbGUgYWRkcmVzcyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMjU0IGNoYXJhY3RlcnMuCiAqCiAqICMjIEltcGxlbWVudGF0aW9uIGJhY2tncm91bmQKICoKICogVGhpcyByZWdleHAgd2FzIHBvcnRlZCBvdmVyIGZyb20gQW5ndWxhckpTIChzZWUgdGhlcmUgZm9yIGdpdCBoaXN0b3J5KToKICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9ibG9iL2MxMzNlZjgzNi9zcmMvbmcvZGlyZWN0aXZlL2lucHV0LmpzI0wyNwogKiBJdCBpcyBiYXNlZCBvbiB0aGUKICogW1dIQVRXRyB2ZXJzaW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI3ZhbGlkLWUtbWFpbC1hZGRyZXNzKSB3aXRoCiAqIHNvbWUgZW5oYW5jZW1lbnRzIHRvIGluY29ycG9yYXRlIG1vcmUgUkZDIHJ1bGVzIChzdWNoIGFzIHJ1bGVzIHJlbGF0ZWQgdG8gZG9tYWluIG5hbWVzIGFuZCB0aGUKICogbGVuZ3RocyBvZiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGFkZHJlc3MpLiBUaGUgbWFpbiBkaWZmZXJlbmNlcyBmcm9tIHRoZSBXSEFUV0cgdmVyc2lvbiBhcmU6CiAqICAgLSBEaXNhbGxvdyBgbG9jYWwtcGFydGAgdG8gYmVnaW4gb3IgZW5kIHdpdGggYSBwZXJpb2QgKGAuYCkuCiAqICAgLSBEaXNhbGxvdyBgbG9jYWwtcGFydGAgbGVuZ3RoIHRvIGV4Y2VlZCA2NCBjaGFyYWN0ZXJzLgogKiAgIC0gRGlzYWxsb3cgdG90YWwgYWRkcmVzcyBsZW5ndGggdG8gZXhjZWVkIDI1NCBjaGFyYWN0ZXJzLgogKgogKiBTZWUgW3RoaXMgY29tbWl0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2NvbW1pdC9mM2Y1Y2Y3MmUpIGZvciBtb3JlIGRldGFpbHMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgRU1BSUxfUkVHRVhQID0gL14oPz0uezEsMjU0fSQpKD89LnsxLDY0fUApW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlwuW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLzsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogUHJvdmlkZXMgYSBzZXQgb2YgYnVpbHQtaW4gdmFsaWRhdG9ycyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGZvcm0gY29udHJvbHMuCiAqCiAqIEEgdmFsaWRhdG9yIGlzIGEgZnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgYSBgRm9ybUNvbnRyb2xgIG9yIGNvbGxlY3Rpb24gb2YKICogY29udHJvbHMgYW5kIHJldHVybnMgYW4gZXJyb3IgbWFwIG9yIG51bGwuIEEgbnVsbCBtYXAgbWVhbnMgdGhhdCB2YWxpZGF0aW9uIGhhcyBwYXNzZWQuCiAqCiAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oL2d1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFZhbGlkYXRvcnMgewogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgbnVtYmVyLgogICAgICogVGhlIHZhbGlkYXRvciBleGlzdHMgb25seSBhcyBhIGZ1bmN0aW9uIGFuZCBub3QgYXMgYSBkaXJlY3RpdmUuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIFZhbGlkYXRlIGFnYWluc3QgYSBtaW5pbXVtIG9mIDMKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKDIsIFZhbGlkYXRvcnMubWluKDMpKTsKICAgICAqCiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHttaW46IHttaW46IDMsIGFjdHVhbDogMn19CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBtaW4KICAgICAqIEByZXR1cm4gez99IEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGUKICAgICAqIGBtaW5gIHByb3BlcnR5IGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLgogICAgICoKICAgICAqLwogICAgc3RhdGljIG1pbihtaW4pIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpIHx8IGlzRW1wdHlJbnB1dFZhbHVlKG1pbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHMKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChjb250cm9sLnZhbHVlKTsKICAgICAgICAgICAgLy8gQ29udHJvbHMgd2l0aCBOYU4gdmFsdWVzIGFmdGVyIHBhcnNpbmcgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgbm90IGhhdmluZyBhCiAgICAgICAgICAgIC8vIG1pbmltdW0sIHBlciB0aGUgSFRNTCBmb3JtcyBzcGVjOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNhdHRyLWlucHV0LW1pbgogICAgICAgICAgICByZXR1cm4gIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA8IG1pbiA/IHsgJ21pbic6IHsgJ21pbic6IG1pbiwgJ2FjdHVhbCc6IGNvbnRyb2wudmFsdWUgfSB9IDogbnVsbDsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG51bWJlci4KICAgICAqIFRoZSB2YWxpZGF0b3IgZXhpc3RzIG9ubHkgYXMgYSBmdW5jdGlvbiBhbmQgbm90IGFzIGEgZGlyZWN0aXZlLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBWYWxpZGF0ZSBhZ2FpbnN0IGEgbWF4aW11bSBvZiAxNQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woMTYsIFZhbGlkYXRvcnMubWF4KDE1KSk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7bWF4OiB7bWF4OiAxNSwgYWN0dWFsOiAxNn19CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBtYXgKICAgICAqIEByZXR1cm4gez99IEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGUKICAgICAqIGBtYXhgIHByb3BlcnR5IGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLgogICAgICoKICAgICAqLwogICAgc3RhdGljIG1heChtYXgpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpIHx8IGlzRW1wdHlJbnB1dFZhbHVlKG1heCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHMKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChjb250cm9sLnZhbHVlKTsKICAgICAgICAgICAgLy8gQ29udHJvbHMgd2l0aCBOYU4gdmFsdWVzIGFmdGVyIHBhcnNpbmcgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgbm90IGhhdmluZyBhCiAgICAgICAgICAgIC8vIG1heGltdW0sIHBlciB0aGUgSFRNTCBmb3JtcyBzcGVjOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNhdHRyLWlucHV0LW1heAogICAgICAgICAgICByZXR1cm4gIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+IG1heCA/IHsgJ21heCc6IHsgJ21heCc6IG1heCwgJ2FjdHVhbCc6IGNvbnRyb2wudmFsdWUgfSB9IDogbnVsbDsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGNvbnRyb2wgaGF2ZSBhIG5vbi1lbXB0eSB2YWx1ZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgVmFsaWRhdGUgdGhhdCB0aGUgZmllbGQgaXMgbm9uLWVtcHR5CiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7cmVxdWlyZWQ6IHRydWV9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBlcnJvciBtYXAgd2l0aCB0aGUgYHJlcXVpcmVkYCBwcm9wZXJ0eQogICAgICogaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgKgogICAgICovCiAgICBzdGF0aWMgcmVxdWlyZWQoY29udHJvbCkgewogICAgICAgIHJldHVybiBpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSA/IHsgJ3JlcXVpcmVkJzogdHJ1ZSB9IDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSBiZSB0cnVlLiBUaGlzIHZhbGlkYXRvciBpcyBjb21tb25seQogICAgICogdXNlZCBmb3IgcmVxdWlyZWQgY2hlY2tib3hlcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgVmFsaWRhdGUgdGhhdCB0aGUgZmllbGQgdmFsdWUgaXMgdHJ1ZQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWRUcnVlKTsKICAgICAqCiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHtyZXF1aXJlZDogdHJ1ZX0KICAgICAqIGBgYAogICAgICoKICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAqIEByZXR1cm4gez99IEFuIGVycm9yIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBgcmVxdWlyZWRgIHByb3BlcnR5CiAgICAgKiBzZXQgdG8gYHRydWVgIGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLgogICAgICoKICAgICAqLwogICAgc3RhdGljIHJlcXVpcmVkVHJ1ZShjb250cm9sKSB7CiAgICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWUgPT09IHRydWUgPyBudWxsIDogeyAncmVxdWlyZWQnOiB0cnVlIH07CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBjb250cm9sJ3MgdmFsdWUgcGFzcyBhbiBlbWFpbCB2YWxpZGF0aW9uIHRlc3QuCiAgICAgKgogICAgICogVGVzdHMgdGhlIHZhbHVlIHVzaW5nIGEgW3JlZ3VsYXIKICAgICAqIGV4cHJlc3Npb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvR3VpZGUvUmVndWxhcl9FeHByZXNzaW9ucykKICAgICAqIHBhdHRlcm4gc3VpdGFibGUgZm9yIGNvbW1vbiB1c2VjYXNlcy4gVGhlIHBhdHRlcm4gaXMgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YgYSB2YWxpZCBlbWFpbAogICAgICogYWRkcmVzcyBpbiB0aGUgW1dIQVRXRyBIVE1MCiAgICAgKiBzcGVjaWZpY2F0aW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI3ZhbGlkLWUtbWFpbC1hZGRyZXNzKSB3aXRoCiAgICAgKiBzb21lIGVuaGFuY2VtZW50cyB0byBpbmNvcnBvcmF0ZSBtb3JlIFJGQyBydWxlcyAoc3VjaCBhcyBydWxlcyByZWxhdGVkIHRvIGRvbWFpbiBuYW1lcyBhbmQgdGhlCiAgICAgKiBsZW5ndGhzIG9mIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYWRkcmVzcykuCiAgICAgKgogICAgICogVGhlIGRpZmZlcmVuY2VzIGZyb20gdGhlIFdIQVRXRyB2ZXJzaW9uIGluY2x1ZGU6CiAgICAgKiAtIERpc2FsbG93IGBsb2NhbC1wYXJ0YCAodGhlIHBhcnQgYmVmb3JlIHRoZSBgXEBgIHN5bWJvbCkgdG8gYmVnaW4gb3IgZW5kIHdpdGggYSBwZXJpb2QgKGAuYCkuCiAgICAgKiAtIERpc2FsbG93IGBsb2NhbC1wYXJ0YCB0byBiZSBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzLgogICAgICogLSBEaXNhbGxvdyB0aGUgd2hvbGUgYWRkcmVzcyB0byBiZSBsb25nZXIgdGhhbiAyNTQgY2hhcmFjdGVycy4KICAgICAqCiAgICAgKiBJZiB0aGlzIHBhdHRlcm4gZG9lcyBub3Qgc2F0aXNmeSB5b3VyIGJ1c2luZXNzIG5lZWRzLCB5b3UgY2FuIHVzZSBgVmFsaWRhdG9ycy5wYXR0ZXJuKClgIHRvCiAgICAgKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCBhIGRpZmZlcmVudCBwYXR0ZXJuLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBWYWxpZGF0ZSB0aGF0IHRoZSBmaWVsZCBtYXRjaGVzIGEgdmFsaWQgZW1haWwgcGF0dGVybgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJ2JhZFxAJywgVmFsaWRhdG9ycy5lbWFpbCk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7ZW1haWw6IHRydWV9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBlcnJvciBtYXAgd2l0aCB0aGUgYGVtYWlsYCBwcm9wZXJ0eQogICAgICogaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgKgogICAgICovCiAgICBzdGF0aWMgZW1haWwoY29udHJvbCkgewogICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IG9wdGlvbmFsIGNvbnRyb2xzCiAgICAgICAgfQogICAgICAgIHJldHVybiBFTUFJTF9SRUdFWFAudGVzdChjb250cm9sLnZhbHVlKSA/IG51bGwgOiB7ICdlbWFpbCc6IHRydWUgfTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAogICAgICogdG8gdGhlIHByb3ZpZGVkIG1pbmltdW0gbGVuZ3RoLiBUaGlzIHZhbGlkYXRvciBpcyBhbHNvIHByb3ZpZGVkIGJ5IGRlZmF1bHQgaWYgeW91IHVzZSB0aGUKICAgICAqIHRoZSBIVE1MNSBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuIE5vdGUgdGhhdCB0aGUgYG1pbkxlbmd0aGAgdmFsaWRhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKICAgICAqIG9ubHkgZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIG51bWVyaWMgYGxlbmd0aGAgcHJvcGVydHksIHN1Y2ggYXMgc3RyaW5ncyBvciBhcnJheXMuIFRoZQogICAgICogYG1pbkxlbmd0aGAgdmFsaWRhdG9yIGxvZ2ljIGlzIGFsc28gbm90IGludm9rZWQgZm9yIHZhbHVlcyB3aGVuIHRoZWlyIGBsZW5ndGhgIHByb3BlcnR5IGlzIDAKICAgICAqIChmb3IgZXhhbXBsZSBpbiBjYXNlIG9mIGFuIGVtcHR5IHN0cmluZyBvciBhbiBlbXB0eSBhcnJheSksIHRvIHN1cHBvcnQgb3B0aW9uYWwgY29udHJvbHMuIFlvdQogICAgICogY2FuIHVzZSB0aGUgc3RhbmRhcmQgYHJlcXVpcmVkYCB2YWxpZGF0b3IgaWYgZW1wdHkgdmFsdWVzIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB2YWxpZC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgVmFsaWRhdGUgdGhhdCB0aGUgZmllbGQgaGFzIGEgbWluaW11bSBvZiAzIGNoYXJhY3RlcnMKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCduZycsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpKTsKICAgICAqCiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHttaW5sZW5ndGg6IHtyZXF1aXJlZExlbmd0aDogMywgYWN0dWFsTGVuZ3RoOiAyfX0KICAgICAqIGBgYAogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxpbnB1dCBtaW5sZW5ndGg9IjUiPgogICAgICogYGBgCiAgICAgKgogICAgICogQHNlZSBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gbWluTGVuZ3RoCiAgICAgKiBAcmV0dXJuIHs/fSBBIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWFwIHdpdGggdGhlCiAgICAgKiBgbWlubGVuZ3RoYCBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC4KICAgICAqCiAgICAgKi8KICAgIHN0YXRpYyBtaW5MZW5ndGgobWluTGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9scwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY29udHJvbC52YWx1ZSA/IGNvbnRyb2wudmFsdWUubGVuZ3RoIDogMDsKICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCA8IG1pbkxlbmd0aCA/CiAgICAgICAgICAgICAgICB7ICdtaW5sZW5ndGgnOiB7ICdyZXF1aXJlZExlbmd0aCc6IG1pbkxlbmd0aCwgJ2FjdHVhbExlbmd0aCc6IGxlbmd0aCB9IH0gOgogICAgICAgICAgICAgICAgbnVsbDsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbAogICAgICogdG8gdGhlIHByb3ZpZGVkIG1heGltdW0gbGVuZ3RoLiBUaGlzIHZhbGlkYXRvciBpcyBhbHNvIHByb3ZpZGVkIGJ5IGRlZmF1bHQgaWYgeW91IHVzZSB0aGUKICAgICAqIHRoZSBIVE1MNSBgbWF4bGVuZ3RoYCBhdHRyaWJ1dGUuIE5vdGUgdGhhdCB0aGUgYG1heExlbmd0aGAgdmFsaWRhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKICAgICAqIG9ubHkgZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIG51bWVyaWMgYGxlbmd0aGAgcHJvcGVydHksIHN1Y2ggYXMgc3RyaW5ncyBvciBhcnJheXMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIGhhcyBtYXhpbXVtIG9mIDUgY2hhcmFjdGVycwogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJ0FuZ3VsYXInLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1KSk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7bWF4bGVuZ3RoOiB7cmVxdWlyZWRMZW5ndGg6IDUsIGFjdHVhbExlbmd0aDogN319CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8aW5wdXQgbWF4bGVuZ3RoPSI1Ij4KICAgICAqIGBgYAogICAgICoKICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAqCiAgICAgKiBAcGFyYW0gez99IG1heExlbmd0aAogICAgICogQHJldHVybiB7P30gQSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGVycm9yIG1hcCB3aXRoIHRoZQogICAgICogYG1heGxlbmd0aGAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgKgogICAgICovCiAgICBzdGF0aWMgbWF4TGVuZ3RoKG1heExlbmd0aCkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGNvbnRyb2wudmFsdWUgPyBjb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgIHJldHVybiBsZW5ndGggPiBtYXhMZW5ndGggPwogICAgICAgICAgICAgICAgeyAnbWF4bGVuZ3RoJzogeyAncmVxdWlyZWRMZW5ndGgnOiBtYXhMZW5ndGgsICdhY3R1YWxMZW5ndGgnOiBsZW5ndGggfSB9IDoKICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBjb250cm9sJ3MgdmFsdWUgdG8gbWF0Y2ggYSByZWdleCBwYXR0ZXJuLiBUaGlzIHZhbGlkYXRvciBpcyBhbHNvCiAgICAgKiBwcm92aWRlZCBieSBkZWZhdWx0IGlmIHlvdSB1c2UgdGhlIEhUTUw1IGBwYXR0ZXJuYCBhdHRyaWJ1dGUuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIG9ubHkgY29udGFpbnMgbGV0dGVycyBvciBzcGFjZXMKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcxJywgVmFsaWRhdG9ycy5wYXR0ZXJuKCdbYS16QS1aIF0qJykpOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge3BhdHRlcm46IHtyZXF1aXJlZFBhdHRlcm46ICdeW2EtekEtWiBdKiQnLCBhY3R1YWxWYWx1ZTogJzEnfX0KICAgICAqIGBgYAogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxpbnB1dCBwYXR0ZXJuPSJbYS16QS1aIF0qIj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHBhdHRlcm4gQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBhcyBpcyB0byB0ZXN0IHRoZSB2YWx1ZXMsIG9yIGEgc3RyaW5nLgogICAgICogSWYgYSBzdHJpbmcgaXMgcGFzc2VkLCB0aGUgYF5gIGNoYXJhY3RlciBpcyBwcmVwZW5kZWQgYW5kIHRoZSBgJGAgY2hhcmFjdGVyIGlzCiAgICAgKiBhcHBlbmRlZCB0byB0aGUgcHJvdmlkZWQgc3RyaW5nIChpZiBub3QgYWxyZWFkeSBwcmVzZW50KSwgYW5kIHRoZSByZXN1bHRpbmcgcmVndWxhcgogICAgICogZXhwcmVzc2lvbiBpcyB1c2VkIHRvIHRlc3QgdGhlIHZhbHVlcy4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBBIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWFwIHdpdGggdGhlCiAgICAgKiBgcGF0dGVybmAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgKgogICAgICovCiAgICBzdGF0aWMgcGF0dGVybihwYXR0ZXJuKSB7CiAgICAgICAgaWYgKCFwYXR0ZXJuKQogICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVnZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWdleFN0cjsKICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJlZ2V4U3RyID0gJyc7CiAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNoYXJBdCgwKSAhPT0gJ14nKQogICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gJ14nOwogICAgICAgICAgICByZWdleFN0ciArPSBwYXR0ZXJuOwogICAgICAgICAgICBpZiAocGF0dGVybi5jaGFyQXQocGF0dGVybi5sZW5ndGggLSAxKSAhPT0gJyQnKQogICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gJyQnOwogICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhTdHIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmVnZXhTdHIgPSBwYXR0ZXJuLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJlZ2V4ID0gcGF0dGVybjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9scwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlOwogICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSkgPyBudWxsIDoKICAgICAgICAgICAgICAgIHsgJ3BhdHRlcm4nOiB7ICdyZXF1aXJlZFBhdHRlcm4nOiByZWdleFN0ciwgJ2FjdHVhbFZhbHVlJzogdmFsdWUgfSB9OwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBWYWxpZGF0b3IgdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb24uCiAgICAgKgogICAgICogQHNlZSBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIG51bGxWYWxpZGF0b3IoY29udHJvbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBjb21wb3NlKHZhbGlkYXRvcnMpIHsKICAgICAgICBpZiAoIXZhbGlkYXRvcnMpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmVzZW50VmFsaWRhdG9ycyA9ICgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3JzLmZpbHRlcihpc1ByZXNlbnQpKSk7CiAgICAgICAgaWYgKHByZXNlbnRWYWxpZGF0b3JzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKGNvbnRyb2wpIHsKICAgICAgICAgICAgcmV0dXJuIF9tZXJnZUVycm9ycyhfZXhlY3V0ZVZhbGlkYXRvcnMoY29udHJvbCwgcHJlc2VudFZhbGlkYXRvcnMpKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQ29tcG9zZSBtdWx0aXBsZSBhc3luYyB2YWxpZGF0b3JzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB1bmlvbgogICAgICogb2YgdGhlIGluZGl2aWR1YWwgZXJyb3Igb2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGNvbnRyb2wuCiAgICAgKgogICAgICogQHNlZSBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICogQHJldHVybiB7P30gQSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGVycm9yIG1hcCB3aXRoIHRoZQogICAgICogbWVyZ2VkIGVycm9yIG9iamVjdHMgb2YgdGhlIGFzeW5jIHZhbGlkYXRvcnMgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgKgogICAgICovCiAgICBzdGF0aWMgY29tcG9zZUFzeW5jKHZhbGlkYXRvcnMpIHsKICAgICAgICBpZiAoIXZhbGlkYXRvcnMpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmVzZW50VmFsaWRhdG9ycyA9ICgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3JzLmZpbHRlcihpc1ByZXNlbnQpKSk7CiAgICAgICAgaWYgKHByZXNlbnRWYWxpZGF0b3JzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKGNvbnRyb2wpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IF9leGVjdXRlQXN5bmNWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKS5tYXAodG9PYnNlcnZhYmxlKTsKICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzKS5waXBlKG1hcChfbWVyZ2VFcnJvcnMpKTsKICAgICAgICB9KTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBvCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1ByZXNlbnQobykgewogICAgcmV0dXJuIG8gIT0gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSByCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b09ic2VydmFibGUocikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb2JzID0gaXNQcm9taXNlJDEocikgPyBmcm9tKHIpIDogcjsKICAgIGlmICghKGlzT2JzZXJ2YWJsZSQxKG9icykpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB2YWxpZGF0b3IgdG8gcmV0dXJuIFByb21pc2Ugb3IgT2JzZXJ2YWJsZS5gKTsKICAgIH0KICAgIHJldHVybiBvYnM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gY29udHJvbAogKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9leGVjdXRlVmFsaWRhdG9ycyhjb250cm9sLCB2YWxpZGF0b3JzKSB7CiAgICByZXR1cm4gdmFsaWRhdG9ycy5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2ID0+IHYoY29udHJvbCkpKTsKfQovKioKICogQHBhcmFtIHs/fSBjb250cm9sCiAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2V4ZWN1dGVBc3luY1ZhbGlkYXRvcnMoY29udHJvbCwgdmFsaWRhdG9ycykgewogICAgcmV0dXJuIHZhbGlkYXRvcnMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gdgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdiA9PiB2KGNvbnRyb2wpKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gYXJyYXlPZkVycm9ycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX21lcmdlRXJyb3JzKGFycmF5T2ZFcnJvcnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByZXMgPSB7fTsKICAgIC8vIE5vdCB1c2luZyBBcnJheS5yZWR1Y2UgaGVyZSBkdWUgdG8gYSBDaHJvbWUgODAgYnVnCiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDQ5OTgyCiAgICBhcnJheU9mRXJyb3JzLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChlcnJvcnMpID0+IHsKICAgICAgICByZXMgPSBlcnJvcnMgIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKC8qKiBAdHlwZSB7P30gKi8gKHJlcykpKSwgZXJyb3JzKSA6ICgvKiogQHR5cGUgez99ICovIChyZXMpKTsKICAgIH0pKTsKICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXMpLmxlbmd0aCA9PT0gMCA/IG51bGwgOiByZXM7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL25vcm1hbGl6ZV92YWxpZGF0b3IudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogQHBhcmFtIHs/fSB2YWxpZGF0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbGlkYXRvcih2YWxpZGF0b3IpIHsKICAgIGlmICgoKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpKS52YWxpZGF0ZSkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoYykgPT4gKCgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3IpKSkudmFsaWRhdGUoYykpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3IpKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB2YWxpZGF0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUFzeW5jVmFsaWRhdG9yKHZhbGlkYXRvcikgewogICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnZhbGlkYXRlKSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjKSA9PiAoKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpKS52YWxpZGF0ZShjKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9udW1iZXJfdmFsdWVfYWNjZXNzb3IudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOVU1CRVJfVkFMVUVfQUNDRVNTT1IgPSB7CiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IE51bWJlclZhbHVlQWNjZXNzb3IpKSwKICAgIG11bHRpOiB0cnVlCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFRoZSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIGEgbnVtYmVyIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gbnVtYmVyIGlucHV0IGNoYW5nZXMuCiAqIFRoZSB2YWx1ZSBhY2Nlc3NvciBpcyB1c2VkIGJ5IHRoZSBgRm9ybUNvbnRyb2xEaXJlY3RpdmVgLCBgRm9ybUNvbnRyb2xOYW1lYCwgYW5kICBgTmdNb2RlbGAKICogZGlyZWN0aXZlcy4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBVc2luZyBhIG51bWJlciBpbnB1dCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSBudW1iZXIgaW5wdXQgd2l0aCBhIHJlYWN0aXZlIGZvcm0uCiAqCiAqIGBgYHRzCiAqIGNvbnN0IHRvdGFsQ291bnRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7CiAqIGBgYAogKgogKiBgYGAKICogPGlucHV0IHR5cGU9Im51bWJlciIgW2Zvcm1Db250cm9sXT0idG90YWxDb3VudENvbnRyb2wiPgogKiBgYGAKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE51bWJlclZhbHVlQWNjZXNzb3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBvciBpbnB1dCBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0CiAgICAgICAgICogZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKF8pID0+IHsgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSAidmFsdWUiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdyaXRlVmFsdWUodmFsdWUpIHsKICAgICAgICAvLyBUaGUgdmFsdWUgbmVlZHMgdG8gYmUgbm9ybWFsaXplZCBmb3IgSUU5LCBvdGhlcndpc2UgaXQgaXMgc2V0IHRvICdudWxsJyB3aGVuIG51bGwKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBub3JtYWxpemVkVmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgZm4odmFsdWUgPT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh2YWx1ZSkpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBpcyB0b3VjaGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlICJkaXNhYmxlZCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTsKICAgIH0KfQpOdW1iZXJWYWx1ZUFjY2Vzc29yLsm1ZmFjID0gZnVuY3Rpb24gTnVtYmVyVmFsdWVBY2Nlc3Nvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOdW1iZXJWYWx1ZUFjY2Vzc29yKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwpOdW1iZXJWYWx1ZUFjY2Vzc29yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE51bWJlclZhbHVlQWNjZXNzb3IsIHNlbGVjdG9yczogW1siaW5wdXQiLCAidHlwZSIsICJudW1iZXIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbImlucHV0IiwgInR5cGUiLCAibnVtYmVyIiwgImZvcm1Db250cm9sIiwgIiJdLCBbImlucHV0IiwgInR5cGUiLCAibnVtYmVyIiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE51bWJlclZhbHVlQWNjZXNzb3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gTnVtYmVyVmFsdWVBY2Nlc3Nvcl9jaGFuZ2VfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpOyB9KSgiaW5wdXQiLCBmdW5jdGlvbiBOdW1iZXJWYWx1ZUFjY2Vzc29yX2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSkoImJsdXIiLCBmdW5jdGlvbiBOdW1iZXJWYWx1ZUFjY2Vzc29yX2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Lm9uVG91Y2hlZCgpOyB9KTsKICAgIH0gfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbTlVNQkVSX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTnVtYmVyVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmFkaW9fY29udHJvbF92YWx1ZV9hY2Nlc3Nvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IFJBRElPX1ZBTFVFX0FDQ0VTU09SID0gewogICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yKSksCiAgICBtdWx0aTogdHJ1ZQp9OwovKioKICogXEBkZXNjcmlwdGlvbgogKiBDbGFzcyB1c2VkIGJ5IEFuZ3VsYXIgdG8gdHJhY2sgcmFkaW8gYnV0dG9ucy4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogKi8KY2xhc3MgUmFkaW9Db250cm9sUmVnaXN0cnkgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5fYWNjZXNzb3JzID0gW107CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEFkZHMgYSBjb250cm9sIHRvIHRoZSBpbnRlcm5hbCByZWdpc3RyeS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcGFyYW0gez99IGFjY2Vzc29yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGQoY29udHJvbCwgYWNjZXNzb3IpIHsKICAgICAgICB0aGlzLl9hY2Nlc3NvcnMucHVzaChbY29udHJvbCwgYWNjZXNzb3JdKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVtb3ZlcyBhIGNvbnRyb2wgZnJvbSB0aGUgaW50ZXJuYWwgcmVnaXN0cnkuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqIEBwYXJhbSB7P30gYWNjZXNzb3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZShhY2Nlc3NvcikgewogICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9hY2Nlc3NvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2FjY2Vzc29yc1tpXVsxXSA9PT0gYWNjZXNzb3IpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FjY2Vzc29ycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFNlbGVjdHMgYSByYWRpbyBidXR0b24uIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqIEBwYXJhbSB7P30gYWNjZXNzb3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNlbGVjdChhY2Nlc3NvcikgewogICAgICAgIHRoaXMuX2FjY2Vzc29ycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjKSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc1NhbWVHcm91cChjLCBhY2Nlc3NvcikgJiYgY1sxXSAhPT0gYWNjZXNzb3IpIHsKICAgICAgICAgICAgICAgIGNbMV0uZmlyZVVuY2hlY2soYWNjZXNzb3IudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb250cm9sUGFpcgogICAgICogQHBhcmFtIHs/fSBhY2Nlc3NvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2lzU2FtZUdyb3VwKGNvbnRyb2xQYWlyLCBhY2Nlc3NvcikgewogICAgICAgIGlmICghY29udHJvbFBhaXJbMF0uY29udHJvbCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiBjb250cm9sUGFpclswXS5fcGFyZW50ID09PSBhY2Nlc3Nvci5fY29udHJvbC5fcGFyZW50ICYmCiAgICAgICAgICAgIGNvbnRyb2xQYWlyWzFdLm5hbWUgPT09IGFjY2Vzc29yLm5hbWU7CiAgICB9Cn0KUmFkaW9Db250cm9sUmVnaXN0cnkuybVmYWMgPSBmdW5jdGlvbiBSYWRpb0NvbnRyb2xSZWdpc3RyeV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSYWRpb0NvbnRyb2xSZWdpc3RyeSkoKTsgfTsKUmFkaW9Db250cm9sUmVnaXN0cnkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogUmFkaW9Db250cm9sUmVnaXN0cnksIGZhY3Rvcnk6IFJhZGlvQ29udHJvbFJlZ2lzdHJ5Lsm1ZmFjIH0pOwovKioKICogXEBkZXNjcmlwdGlvbgogKiBUaGUgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyByYWRpbyBjb250cm9sIHZhbHVlcyBhbmQgbGlzdGVuaW5nIHRvIHJhZGlvIGNvbnRyb2wKICogY2hhbmdlcy4gVGhlIHZhbHVlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQKICogYE5nTW9kZWxgIGRpcmVjdGl2ZXMuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgVXNpbmcgcmFkaW8gYnV0dG9ucyB3aXRoIHJlYWN0aXZlIGZvcm0gZGlyZWN0aXZlcwogKgogKiBUaGUgZm9sbG93IGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSByYWRpbyBidXR0b25zIGluIGEgcmVhY3RpdmUgZm9ybS4gV2hlbiB1c2luZyByYWRpbyBidXR0b25zIGluCiAqIGEgcmVhY3RpdmUgZm9ybSwgcmFkaW8gYnV0dG9ucyBpbiB0aGUgc2FtZSBncm91cCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBgZm9ybUNvbnRyb2xOYW1lYC4KICogUHJvdmlkaW5nIGEgYG5hbWVgIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KICoKICoge1xAZXhhbXBsZSBmb3Jtcy90cy9yZWFjdGl2ZVJhZGlvQnV0dG9ucy9yZWFjdGl2ZV9yYWRpb19idXR0b25fZXhhbXBsZS50cyByZWdpb249J1JlYWN0aXZlJ30KICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfcmVnaXN0cnkKICAgICAqIEBwYXJhbSB7P30gX2luamVjdG9yCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYsIF9yZWdpc3RyeSwgX2luamVjdG9yKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gX3JlZ2lzdHJ5OwogICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSBpcyBpbml0aWFsaXplZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgdGhpcy5fY29udHJvbCA9IHRoaXMuX2luamVjdG9yLmdldChOZ0NvbnRyb2wpOwogICAgICAgIHRoaXMuX2NoZWNrTmFtZSgpOwogICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmFkZCh0aGlzLl9jb250cm9sLCB0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgYmVmb3JlIHRoZSBkaXJlY3RpdmUncyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuX3JlZ2lzdHJ5LnJlbW92ZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogU2V0cyB0aGUgImNoZWNrZWQiIHByb3BlcnR5IHZhbHVlIG9uIHRoZSByYWRpbyBpbnB1dCBlbGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdyaXRlVmFsdWUodmFsdWUpIHsKICAgICAgICB0aGlzLl9zdGF0ZSA9IHZhbHVlID09PSB0aGlzLnZhbHVlOwogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NoZWNrZWQnLCB0aGlzLl9zdGF0ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLl9mbiA9IGZuOwogICAgICAgIHRoaXMub25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGZuKHRoaXMudmFsdWUpOwogICAgICAgICAgICB0aGlzLl9yZWdpc3RyeS5zZWxlY3QodGhpcyk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlICJ2YWx1ZSIgb24gdGhlIHJhZGlvIGlucHV0IGVsZW1lbnQgYW5kIHVuY2hlY2tzIGl0LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpcmVVbmNoZWNrKHZhbHVlKSB7CiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSAiZGlzYWJsZWQiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZCBUaGUgZGlzYWJsZWQgdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkgewogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tOYW1lKCkgewogICAgICAgIGlmICh0aGlzLm5hbWUgJiYgdGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5uYW1lICE9PSB0aGlzLmZvcm1Db250cm9sTmFtZSkgewogICAgICAgICAgICB0aGlzLl90aHJvd05hbWVFcnJvcigpOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMubmFtZSAmJiB0aGlzLmZvcm1Db250cm9sTmFtZSkKICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5mb3JtQ29udHJvbE5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdGhyb3dOYW1lRXJyb3IoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAKICAgICAgSWYgeW91IGRlZmluZSBib3RoIGEgbmFtZSBhbmQgYSBmb3JtQ29udHJvbE5hbWUgYXR0cmlidXRlIG9uIHlvdXIgcmFkaW8gYnV0dG9uLCB0aGVpciB2YWx1ZXMKICAgICAgbXVzdCBtYXRjaC4gRXg6IDxpbnB1dCB0eXBlPSJyYWRpbyIgZm9ybUNvbnRyb2xOYW1lPSJmb29kIiBuYW1lPSJmb29kIj4KICAgIGApOwogICAgfQp9ClJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IuybVmYWMgPSBmdW5jdGlvbiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IpKMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChSYWRpb0NvbnRyb2xSZWdpc3RyeSksIMm1ybVkaXJlY3RpdmVJbmplY3QoSW5qZWN0b3IpKTsgfTsKUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBzZWxlY3RvcnM6IFtbImlucHV0IiwgInR5cGUiLCAicmFkaW8iLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbImlucHV0IiwgInR5cGUiLCAicmFkaW8iLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJyYWRpbyIsICJuZ01vZGVsIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JfY2hhbmdlX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vbkNoYW5nZSgpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25Ub3VjaGVkKCk7IH0pOwogICAgfSB9LCBpbnB1dHM6IHsgbmFtZTogIm5hbWUiLCBmb3JtQ29udHJvbE5hbWU6ICJmb3JtQ29udHJvbE5hbWUiLCB2YWx1ZTogInZhbHVlIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtSQURJT19WQUxVRV9BQ0NFU1NPUl0pXSB9KTsKLyoqIEBub2NvbGxhcHNlICovClJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IFJhZGlvQ29udHJvbFJlZ2lzdHJ5IH0sCiAgICB7IHR5cGU6IEluamVjdG9yIH0KXTsKUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZm9ybUNvbnRyb2xOYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmFuZ2VfdmFsdWVfYWNjZXNzb3IudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBSQU5HRV9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gUmFuZ2VWYWx1ZUFjY2Vzc29yKSksCiAgICBtdWx0aTogdHJ1ZQp9OwovKioKICogXEBkZXNjcmlwdGlvbgogKiBUaGUgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyBhIHJhbmdlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gcmFuZ2UgaW5wdXQgY2hhbmdlcy4KICogVGhlIHZhbHVlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQgIGBOZ01vZGVsYAogKiBkaXJlY3RpdmVzLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIFVzaW5nIGEgcmFuZ2UgaW5wdXQgd2l0aCBhIHJlYWN0aXZlIGZvcm0KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSByYW5nZSBpbnB1dCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICoKICogYGBgdHMKICogY29uc3QgYWdlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpOwogKiBgYGAKICoKICogYGBgCiAqIDxpbnB1dCB0eXBlPSJyYW5nZSIgW2Zvcm1Db250cm9sXT0iYWdlQ29udHJvbCI+CiAqIGBgYAogKgogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUmFuZ2VWYWx1ZUFjY2Vzc29yIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3JlbmRlcmVyLCBfZWxlbWVudFJlZikgewogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb3IgaW5wdXQgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dAogICAgICAgICAqIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChfKSA9PiB7IH0pOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHRoaXMub25Ub3VjaGVkID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4geyB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgInZhbHVlIiBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBjaGVja2VkIHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBwYXJzZUZsb2F0KHZhbHVlKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICBmbih2YWx1ZSA9PSAnJyA/IG51bGwgOiBwYXJzZUZsb2F0KHZhbHVlKSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgImRpc2FibGVkIiBwcm9wZXJ0eSBvbiB0aGUgcmFuZ2UgaW5wdXQgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpOwogICAgfQp9ClJhbmdlVmFsdWVBY2Nlc3Nvci7JtWZhYyA9IGZ1bmN0aW9uIFJhbmdlVmFsdWVBY2Nlc3Nvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSYW5nZVZhbHVlQWNjZXNzb3IpKMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07ClJhbmdlVmFsdWVBY2Nlc3Nvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBSYW5nZVZhbHVlQWNjZXNzb3IsIHNlbGVjdG9yczogW1siaW5wdXQiLCAidHlwZSIsICJyYW5nZSIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJyYW5nZSIsICJmb3JtQ29udHJvbCIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgInJhbmdlIiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFJhbmdlVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBSYW5nZVZhbHVlQWNjZXNzb3JfY2hhbmdlX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSkoImlucHV0IiwgZnVuY3Rpb24gUmFuZ2VWYWx1ZUFjY2Vzc29yX2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSkoImJsdXIiLCBmdW5jdGlvbiBSYW5nZVZhbHVlQWNjZXNzb3JfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25Ub3VjaGVkKCk7IH0pOwogICAgfSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtSQU5HRV9WQUxVRV9BQ0NFU1NPUl0pXSB9KTsKLyoqIEBub2NvbGxhcHNlICovClJhbmdlVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZXJyb3JfZXhhbXBsZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IEZvcm1FcnJvckV4YW1wbGVzID0gewogICAgZm9ybUNvbnRyb2xOYW1lOiBgCiAgICA8ZGl2IFtmb3JtR3JvdXBdPSJteUdyb3VwIj4KICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT0iZmlyc3ROYW1lIj4KICAgIDwvZGl2PgoKICAgIEluIHlvdXIgY2xhc3M6CgogICAgdGhpcy5teUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgICBmaXJzdE5hbWU6IG5ldyBGb3JtQ29udHJvbCgpCiAgICB9KTtgLAogICAgZm9ybUdyb3VwTmFtZTogYAogICAgPGRpdiBbZm9ybUdyb3VwXT0ibXlHcm91cCI+CiAgICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9InBlcnNvbiI+CiAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPSJmaXJzdE5hbWUiPgogICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICBJbiB5b3VyIGNsYXNzOgoKICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoewogICAgICAgcGVyc29uOiBuZXcgRm9ybUdyb3VwKHsgZmlyc3ROYW1lOiBuZXcgRm9ybUNvbnRyb2woKSB9KQogICAgfSk7YCwKICAgIGZvcm1BcnJheU5hbWU6IGAKICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPgogICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9ImNpdGllcyI+CiAgICAgICAgPGRpdiAqbmdGb3I9ImxldCBjaXR5IG9mIGNpdHlBcnJheS5jb250cm9sczsgaW5kZXggYXMgaSI+CiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09ImkiPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIEluIHlvdXIgY2xhc3M6CgogICAgdGhpcy5jaXR5QXJyYXkgPSBuZXcgRm9ybUFycmF5KFtuZXcgRm9ybUNvbnRyb2woJ1NGJyldKTsKICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoewogICAgICBjaXRpZXM6IHRoaXMuY2l0eUFycmF5CiAgICB9KTtgLAogICAgbmdNb2RlbEdyb3VwOiBgCiAgICA8Zm9ybT4KICAgICAgIDxkaXYgbmdNb2RlbEdyb3VwPSJwZXJzb24iPgogICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPSJwZXJzb24ubmFtZSIgbmFtZT0iZmlyc3ROYW1lIj4KICAgICAgIDwvZGl2PgogICAgPC9mb3JtPmAsCiAgICBuZ01vZGVsV2l0aEZvcm1Hcm91cDogYAogICAgPGRpdiBbZm9ybUdyb3VwXT0ibXlHcm91cCI+CiAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPSJmaXJzdE5hbWUiPgogICAgICAgPGlucHV0IFsobmdNb2RlbCldPSJzaG93TW9yZUNvbnRyb2xzIiBbbmdNb2RlbE9wdGlvbnNdPSJ7c3RhbmRhbG9uZTogdHJ1ZX0iPgogICAgPC9kaXY+CiAgYAp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmVhY3RpdmVfZXJyb3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIFJlYWN0aXZlRXJyb3JzIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGNvbnRyb2xQYXJlbnRFeGNlcHRpb24oKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtQ29udHJvbE5hbWUgbXVzdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS4gIFlvdSdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cAogICAgICAgZGlyZWN0aXZlIGFuZCBwYXNzIGl0IGFuIGV4aXN0aW5nIEZvcm1Hcm91cCBpbnN0YW5jZSAoeW91IGNhbiBjcmVhdGUgb25lIGluIHlvdXIgY2xhc3MpLgoKICAgICAgRXhhbXBsZToKCiAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMuZm9ybUNvbnRyb2xOYW1lfWApOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbmdNb2RlbEdyb3VwRXhjZXB0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9ybUNvbnRyb2xOYW1lIGNhbm5vdCBiZSB1c2VkIHdpdGggYW4gbmdNb2RlbEdyb3VwIHBhcmVudC4gSXQgaXMgb25seSBjb21wYXRpYmxlIHdpdGggcGFyZW50cwogICAgICAgdGhhdCBhbHNvIGhhdmUgYSAiZm9ybSIgcHJlZml4OiBmb3JtR3JvdXBOYW1lLCBmb3JtQXJyYXlOYW1lLCBvciBmb3JtR3JvdXAuCgogICAgICAgT3B0aW9uIDE6ICBVcGRhdGUgdGhlIHBhcmVudCB0byBiZSBmb3JtR3JvdXBOYW1lIChyZWFjdGl2ZSBmb3JtIHN0cmF0ZWd5KQoKICAgICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLmZvcm1Hcm91cE5hbWV9CgogICAgICAgIE9wdGlvbiAyOiBVc2UgbmdNb2RlbCBpbnN0ZWFkIG9mIGZvcm1Db250cm9sTmFtZSAodGVtcGxhdGUtZHJpdmVuIHN0cmF0ZWd5KQoKICAgICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLm5nTW9kZWxHcm91cH1gKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIG1pc3NpbmdGb3JtRXhjZXB0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9ybUdyb3VwIGV4cGVjdHMgYSBGb3JtR3JvdXAgaW5zdGFuY2UuIFBsZWFzZSBwYXNzIG9uZSBpbi4KCiAgICAgICBFeGFtcGxlOgoKICAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMuZm9ybUNvbnRyb2xOYW1lfWApOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZ3JvdXBQYXJlbnRFeGNlcHRpb24oKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtR3JvdXBOYW1lIG11c3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBZb3UnbGwgd2FudCB0byBhZGQgYSBmb3JtR3JvdXAKICAgICAgZGlyZWN0aXZlIGFuZCBwYXNzIGl0IGFuIGV4aXN0aW5nIEZvcm1Hcm91cCBpbnN0YW5jZSAoeW91IGNhbiBjcmVhdGUgb25lIGluIHlvdXIgY2xhc3MpLgoKICAgICAgRXhhbXBsZToKCiAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMuZm9ybUdyb3VwTmFtZX1gKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGFycmF5UGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9ybUFycmF5TmFtZSBtdXN0IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLiAgWW91J2xsIHdhbnQgdG8gYWRkIGEgZm9ybUdyb3VwCiAgICAgICBkaXJlY3RpdmUgYW5kIHBhc3MgaXQgYW4gZXhpc3RpbmcgRm9ybUdyb3VwIGluc3RhbmNlICh5b3UgY2FuIGNyZWF0ZSBvbmUgaW4geW91ciBjbGFzcykuCgogICAgICAgIEV4YW1wbGU6CgogICAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMuZm9ybUFycmF5TmFtZX1gKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGRpc2FibGVkQXR0cldhcm5pbmcoKSB7CiAgICAgICAgY29uc29sZS53YXJuKGAKICAgICAgSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSB3aXRoIGEgcmVhY3RpdmUgZm9ybSBkaXJlY3RpdmUuIElmIHlvdSBzZXQgZGlzYWJsZWQgdG8gdHJ1ZQogICAgICB3aGVuIHlvdSBzZXQgdXAgdGhpcyBjb250cm9sIGluIHlvdXIgY29tcG9uZW50IGNsYXNzLCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpbGwgYWN0dWFsbHkgYmUgc2V0IGluIHRoZSBET00gZm9yCiAgICAgIHlvdS4gV2UgcmVjb21tZW5kIHVzaW5nIHRoaXMgYXBwcm9hY2ggdG8gYXZvaWQgJ2NoYW5nZWQgYWZ0ZXIgY2hlY2tlZCcgZXJyb3JzLgogICAgICAgCiAgICAgIEV4YW1wbGU6IAogICAgICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6ICdOYW5jeScsIGRpc2FibGVkOiB0cnVlfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksCiAgICAgICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCdEcmV3JywgVmFsaWRhdG9ycy5yZXF1aXJlZCkKICAgICAgfSk7CiAgICBgKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbmdNb2RlbFdhcm5pbmcoZGlyZWN0aXZlTmFtZSkgewogICAgICAgIGNvbnNvbGUud2FybihgCiAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBuZ01vZGVsIG9uIHRoZSBzYW1lIGZvcm0gZmllbGQgYXMgJHtkaXJlY3RpdmVOYW1lfS4gCiAgICBTdXBwb3J0IGZvciB1c2luZyB0aGUgbmdNb2RlbCBpbnB1dCBwcm9wZXJ0eSBhbmQgbmdNb2RlbENoYW5nZSBldmVudCB3aXRoIAogICAgcmVhY3RpdmUgZm9ybSBkaXJlY3RpdmVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgd2lsbCBiZSByZW1vdmVkIAogICAgaW4gQW5ndWxhciB2Ny4KICAgIAogICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgc2VlIG91ciBBUEkgZG9jcyBoZXJlOgogICAgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy8ke2RpcmVjdGl2ZU5hbWUgPT09ICdmb3JtQ29udHJvbCcgPyAnRm9ybUNvbnRyb2xEaXJlY3RpdmUnIDoKICAgICAgICAgICAgJ0Zvcm1Db250cm9sTmFtZSd9I3VzZS13aXRoLW5nbW9kZWwKICAgIGApOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9zZWxlY3RfY29udHJvbF92YWx1ZV9hY2Nlc3Nvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IFNFTEVDVF9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IpKSwKICAgIG11bHRpOiB0cnVlCn07Ci8qKgogKiBAcGFyYW0gez99IGlkCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9idWlsZFZhbHVlU3RyaW5nKGlkLCB2YWx1ZSkgewogICAgaWYgKGlkID09IG51bGwpCiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7CiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykKICAgICAgICB2YWx1ZSA9ICdPYmplY3QnOwogICAgcmV0dXJuIGAke2lkfTogJHt2YWx1ZX1gLnNsaWNlKDAsIDUwKTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZVN0cmluZwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2V4dHJhY3RJZCh2YWx1ZVN0cmluZykgewogICAgcmV0dXJuIHZhbHVlU3RyaW5nLnNwbGl0KCc6JylbMF07Cn0KLyoqCiAqIFxAZGVzY3JpcHRpb24KICogVGhlIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHdyaXRpbmcgc2VsZWN0IGNvbnRyb2wgdmFsdWVzIGFuZCBsaXN0ZW5pbmcgdG8gc2VsZWN0IGNvbnRyb2wKICogY2hhbmdlcy4gVGhlIHZhbHVlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQKICogYE5nTW9kZWxgIGRpcmVjdGl2ZXMuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgVXNpbmcgc2VsZWN0IGNvbnRyb2xzIGluIGEgcmVhY3RpdmUgZm9ybQogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgaG93IHRvIHVzZSBhIHNlbGVjdCBjb250cm9sIGluIGEgcmVhY3RpdmUgZm9ybS4KICoKICoge1xAZXhhbXBsZSBmb3Jtcy90cy9yZWFjdGl2ZVNlbGVjdENvbnRyb2wvcmVhY3RpdmVfc2VsZWN0X2NvbnRyb2xfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAqCiAqICMjIyBVc2luZyBzZWxlY3QgY29udHJvbHMgaW4gYSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybQogKgogKiBUbyB1c2UgYSBzZWxlY3QgaW4gYSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybSwgc2ltcGx5IGFkZCBhbiBgbmdNb2RlbGAgYW5kIGEgYG5hbWVgCiAqIGF0dHJpYnV0ZSB0byB0aGUgbWFpbiBgPHNlbGVjdD5gIHRhZy4KICoKICoge1xAZXhhbXBsZSBmb3Jtcy90cy9zZWxlY3RDb250cm9sL3NlbGVjdF9jb250cm9sX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfQogKgogKiAjIyMgQ3VzdG9taXppbmcgb3B0aW9uIHNlbGVjdGlvbgogKgogKiBBbmd1bGFyIHVzZXMgb2JqZWN0IGlkZW50aXR5IHRvIHNlbGVjdCBvcHRpb24uIEl0J3MgcG9zc2libGUgZm9yIHRoZSBpZGVudGl0aWVzIG9mIGl0ZW1zCiAqIHRvIGNoYW5nZSB3aGlsZSB0aGUgZGF0YSBkb2VzIG5vdC4gVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZW1zIGFyZSBwcm9kdWNlZAogKiBmcm9tIGFuIFJQQyB0byB0aGUgc2VydmVyLCBhbmQgdGhhdCBSUEMgaXMgcmUtcnVuLiBFdmVuIGlmIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkLCB0aGUKICogc2Vjb25kIHJlc3BvbnNlIHdpbGwgcHJvZHVjZSBvYmplY3RzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMuCiAqCiAqIFRvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBvcHRpb24gY29tcGFyaXNvbiBhbGdvcml0aG0sIGA8c2VsZWN0PmAgc3VwcG9ydHMgYGNvbXBhcmVXaXRoYCBpbnB1dC4KICogYGNvbXBhcmVXaXRoYCB0YWtlcyBhICoqZnVuY3Rpb24qKiB3aGljaCBoYXMgdHdvIGFyZ3VtZW50czogYG9wdGlvbjFgIGFuZCBgb3B0aW9uMmAuCiAqIElmIGBjb21wYXJlV2l0aGAgaXMgZ2l2ZW4sIEFuZ3VsYXIgc2VsZWN0cyBvcHRpb24gYnkgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uCiAqCiAqIGBgYHRzCiAqIGNvbnN0IHNlbGVjdGVkQ291bnRyaWVzQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpOwogKiBgYGAKICoKICogYGBgCiAqIDxzZWxlY3QgW2NvbXBhcmVXaXRoXT0iY29tcGFyZUZuIiAgW2Zvcm1Db250cm9sXT0ic2VsZWN0ZWRDb3VudHJpZXNDb250cm9sIj4KICogICAgIDxvcHRpb24gKm5nRm9yPSJsZXQgY291bnRyeSBvZiBjb3VudHJpZXMiIFtuZ1ZhbHVlXT0iY291bnRyeSI+CiAqICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fQogKiAgICAgPC9vcHRpb24+CiAqIDwvc2VsZWN0PgogKgogKiBjb21wYXJlRm4oYzE6IENvdW50cnksIGMyOiBDb3VudHJ5KTogYm9vbGVhbiB7CiAqICAgICByZXR1cm4gYzEgJiYgYzIgPyBjMS5pZCA9PT0gYzIuaWQgOiBjMSA9PT0gYzI7CiAqIH0KICogYGBgCiAqCiAqICoqTm90ZToqKiBXZSBsaXN0ZW4gdG8gdGhlICdjaGFuZ2UnIGV2ZW50IGJlY2F1c2UgJ2lucHV0JyBldmVudHMgYXJlbid0IGZpcmVkCiAqIGZvciBzZWxlY3RzIGluIEZpcmVmb3ggYW5kIElFOgogKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDI0MzUwCiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzQ2NjAwNDUvCiAqCiAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYpIHsKICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX29wdGlvbk1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faWRDb3VudGVyID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHRoaXMub25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoXykgPT4geyB9KTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBibHVyIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uVG91Y2hlZCA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBsb29zZUlkZW50aWNhbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVHJhY2tzIHRoZSBvcHRpb24gY29tcGFyaXNvbiBhbGdvcml0aG0gZm9yIHRyYWNraW5nIGlkZW50aXRpZXMgd2hlbgogICAgICogY2hlY2tpbmcgZm9yIGNoYW5nZXMuCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgY29tcGFyZVdpdGgoZm4pIHsKICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY29tcGFyZVdpdGggbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShmbil9YCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NvbXBhcmVXaXRoID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlICJ2YWx1ZSIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuIFRoZSAic2VsZWN0ZWRJbmRleCIKICAgICAqIHByb3BlcnR5IGlzIGFsc28gc2V0IGlmIGFuIElEIGlzIHByb3ZpZGVkIG9uIHRoZSBvcHRpb24gZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBjaGVja2VkIHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpZCA9IHRoaXMuX2dldE9wdGlvbklkKHZhbHVlKTsKICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZEluZGV4JywgLTEpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSBfYnVpbGRWYWx1ZVN0cmluZyhpZCwgdmFsdWUpOwogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWVTdHJpbmcpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlU3RyaW5nCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsdWVTdHJpbmcpID0+IHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuX2dldE9wdGlvblZhbHVlKHZhbHVlU3RyaW5nKTsKICAgICAgICAgICAgZm4odGhpcy52YWx1ZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgImRpc2FibGVkIiBwcm9wZXJ0eSBvbiB0aGUgc2VsZWN0IGlucHV0IGVsZW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlZ2lzdGVyT3B0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5faWRDb3VudGVyKyspLnRvU3RyaW5nKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRPcHRpb25JZCh2YWx1ZSkgewogICAgICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLl9vcHRpb25NYXAua2V5cygpKSkgewogICAgICAgICAgICBpZiAodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChpZCksIHZhbHVlKSkKICAgICAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gdmFsdWVTdHJpbmcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRPcHRpb25WYWx1ZSh2YWx1ZVN0cmluZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpZCA9IF9leHRyYWN0SWQodmFsdWVTdHJpbmcpOwogICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGlkKSA/IHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpIDogdmFsdWVTdHJpbmc7CiAgICB9Cn0KU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuybVmYWMgPSBmdW5jdGlvbiBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsIHNlbGVjdG9yczogW1sic2VsZWN0IiwgImZvcm1Db250cm9sTmFtZSIsICIiLCAzLCAibXVsdGlwbGUiLCAiIl0sIFsic2VsZWN0IiwgImZvcm1Db250cm9sIiwgIiIsIDMsICJtdWx0aXBsZSIsICIiXSwgWyJzZWxlY3QiLCAibmdNb2RlbCIsICIiLCAzLCAibXVsdGlwbGUiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yX2NoYW5nZV9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSk7IH0pKCJibHVyIiwgZnVuY3Rpb24gU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25Ub3VjaGVkKCk7IH0pOwogICAgfSB9LCBpbnB1dHM6IHsgY29tcGFyZVdpdGg6ICJjb21wYXJlV2l0aCIgfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbU0VMRUNUX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwovKiogQG5vY29sbGFwc2UgKi8KU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0KXTsKU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvcERlY29yYXRvcnMgPSB7CiAgICBjb21wYXJlV2l0aDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogTWFya3MgYDxvcHRpb24+YCBhcyBkeW5hbWljLCBzbyBBbmd1bGFyIGNhbiBiZSBub3RpZmllZCB3aGVuIG9wdGlvbnMgY2hhbmdlLgogKgogKiBAc2VlIGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmAKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5nU2VsZWN0T3B0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gX3NlbGVjdAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX3JlbmRlcmVyLCBfc2VsZWN0KSB7CiAgICAgICAgdGhpcy5fZWxlbWVudCA9IF9lbGVtZW50OwogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgIHRoaXMuX3NlbGVjdCA9IF9zZWxlY3Q7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkKICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuX3NlbGVjdC5fcmVnaXN0ZXJPcHRpb24oKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVHJhY2tzIHRoZSB2YWx1ZSBib3VuZCB0byB0aGUgb3B0aW9uIGVsZW1lbnQuIFVubGlrZSB0aGUgdmFsdWUgYmluZGluZywKICAgICAqIG5nVmFsdWUgc3VwcG9ydHMgYmluZGluZyB0byBvYmplY3RzLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG5nVmFsdWUodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5fc2VsZWN0ID09IG51bGwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5zZXQodGhpcy5pZCwgdmFsdWUpOwogICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZShfYnVpbGRWYWx1ZVN0cmluZyh0aGlzLmlkLCB2YWx1ZSkpOwogICAgICAgIHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRyYWNrcyBzaW1wbGUgc3RyaW5nIHZhbHVlcyBib3VuZCB0byB0aGUgb3B0aW9uIGVsZW1lbnQuCiAgICAgKiBGb3Igb2JqZWN0cywgdXNlIHRoZSBgbmdWYWx1ZWAgaW5wdXQgYmluZGluZy4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCB2YWx1ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkKICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldEVsZW1lbnRWYWx1ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5kZWxldGUodGhpcy5pZCk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSk7CiAgICAgICAgfQogICAgfQp9Ck5nU2VsZWN0T3B0aW9uLsm1ZmFjID0gZnVuY3Rpb24gTmdTZWxlY3RPcHRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTZWxlY3RPcHRpb24pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciwgOSkpOyB9OwpOZ1NlbGVjdE9wdGlvbi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1NlbGVjdE9wdGlvbiwgc2VsZWN0b3JzOiBbWyJvcHRpb24iXV0sIGlucHV0czogeyBuZ1ZhbHVlOiAibmdWYWx1ZSIsIHZhbHVlOiAidmFsdWUiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ1NlbGVjdE9wdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBSZW5kZXJlcjIgfSwKICAgIHsgdHlwZTogU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSG9zdCB9XSB9Cl07Ck5nU2VsZWN0T3B0aW9uLnByb3BEZWNvcmF0b3JzID0gewogICAgbmdWYWx1ZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdWYWx1ZScsXSB9XSwKICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyd2YWx1ZScsXSB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvc2VsZWN0X211bHRpcGxlX2NvbnRyb2xfdmFsdWVfYWNjZXNzb3IudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTRUxFQ1RfTVVMVElQTEVfVkFMVUVfQUNDRVNTT1IgPSB7CiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IpKSwKICAgIG11bHRpOiB0cnVlCn07Ci8qKgogKiBAcGFyYW0gez99IGlkCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9idWlsZFZhbHVlU3RyaW5nJDEoaWQsIHZhbHVlKSB7CiAgICBpZiAoaWQgPT0gbnVsbCkKICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKQogICAgICAgIHZhbHVlID0gYCcke3ZhbHVlfSdgOwogICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpCiAgICAgICAgdmFsdWUgPSAnT2JqZWN0JzsKICAgIHJldHVybiBgJHtpZH06ICR7dmFsdWV9YC5zbGljZSgwLCA1MCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWVTdHJpbmcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9leHRyYWN0SWQkMSh2YWx1ZVN0cmluZykgewogICAgcmV0dXJuIHZhbHVlU3RyaW5nLnNwbGl0KCc6JylbMF07Cn0KLyoqCiAqIFxAZGVzY3JpcHRpb24KICogVGhlIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHdyaXRpbmcgbXVsdGktc2VsZWN0IGNvbnRyb2wgdmFsdWVzIGFuZCBsaXN0ZW5pbmcgdG8gbXVsdGktc2VsZWN0CiAqIGNvbnRyb2wgY2hhbmdlcy4gVGhlIHZhbHVlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQKICogYE5nTW9kZWxgIGRpcmVjdGl2ZXMuCiAqCiAqIEBzZWUgYFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yYAogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIFVzaW5nIGEgbXVsdGktc2VsZWN0IGNvbnRyb2wKICoKICogVGhlIGZvbGxvdyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gdXNlIGEgbXVsdGktc2VsZWN0IGNvbnRyb2wgd2l0aCBhIHJlYWN0aXZlIGZvcm0uCiAqCiAqIGBgYHRzCiAqIGNvbnN0IGNvdW50cnlDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7CiAqIGBgYAogKgogKiBgYGAKICogPHNlbGVjdCBtdWx0aXBsZSBuYW1lPSJjb3VudHJpZXMiIFtmb3JtQ29udHJvbF09ImNvdW50cnlDb250cm9sIj4KICogICA8b3B0aW9uICpuZ0Zvcj0ibGV0IGNvdW50cnkgb2YgY291bnRyaWVzIiBbbmdWYWx1ZV09ImNvdW50cnkiPgogKiAgICAge3sgY291bnRyeS5uYW1lIH19CiAqICAgPC9vcHRpb24+CiAqIDwvc2VsZWN0PgogKiBgYGAKICoKICogIyMjIEN1c3RvbWl6aW5nIG9wdGlvbiBzZWxlY3Rpb24KICoKICogVG8gY3VzdG9taXplIHRoZSBkZWZhdWx0IG9wdGlvbiBjb21wYXJpc29uIGFsZ29yaXRobSwgYDxzZWxlY3Q+YCBzdXBwb3J0cyBgY29tcGFyZVdpdGhgIGlucHV0LgogKiBTZWUgdGhlIGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHVzYWdlLgogKgogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYpIHsKICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX29wdGlvbk1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faWRDb3VudGVyID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHRoaXMub25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoXykgPT4geyB9KTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBibHVyIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uVG91Y2hlZCA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBsb29zZUlkZW50aWNhbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVHJhY2tzIHRoZSBvcHRpb24gY29tcGFyaXNvbiBhbGdvcml0aG0gZm9yIHRyYWNraW5nIGlkZW50aXRpZXMgd2hlbgogICAgICogY2hlY2tpbmcgZm9yIGNoYW5nZXMuCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgY29tcGFyZVdpdGgoZm4pIHsKICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY29tcGFyZVdpdGggbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShmbil9YCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NvbXBhcmVXaXRoID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFNldHMgdGhlICJ2YWx1ZSIgcHJvcGVydHkgb24gb25lIG9yIG9mIG1vcmUKICAgICAqIG9mIHRoZSBzZWxlY3QncyBvcHRpb25zLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlcjsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgLy8gY29udmVydCB2YWx1ZXMgdG8gaWRzCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaWRzID0gdmFsdWUubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodikgPT4gdGhpcy5fZ2V0T3B0aW9uSWQodikpKTsKICAgICAgICAgICAgb3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAob3B0LCBvKSA9PiB7CiAgICAgICAgICAgICAgICBvcHQuX3NldFNlbGVjdGVkKGlkcy5pbmRleE9mKG8udG9TdHJpbmcoKSkgPiAtMSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAob3B0LCBvKSA9PiB7CiAgICAgICAgICAgICAgICBvcHQuX3NldFNlbGVjdGVkKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX29wdGlvbk1hcC5mb3JFYWNoKG9wdGlvblNlbGVjdGVkU3RhdGVTZXR0ZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzCiAgICAgKiBhbmQgd3JpdGVzIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBvcHRpb25zLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChfKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTsKICAgICAgICAgICAgaWYgKF8uaGFzT3duUHJvcGVydHkoJ3NlbGVjdGVkT3B0aW9ucycpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gXy5zZWxlY3RlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gb3B0aW9ucy5pdGVtKGkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRPcHRpb25WYWx1ZShvcHQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnB1c2godmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBEZWdyYWRlIG9uIElFCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovIChfLm9wdGlvbnMpKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHQgPSBvcHRpb25zLml0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX2dldE9wdGlvblZhbHVlKG9wdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnB1c2godmFsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkOwogICAgICAgICAgICBmbihzZWxlY3RlZCk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgImRpc2FibGVkIiBwcm9wZXJ0eSBvbiB0aGUgc2VsZWN0IGlucHV0IGVsZW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlZ2lzdGVyT3B0aW9uKHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlkID0gKHRoaXMuX2lkQ291bnRlcisrKS50b1N0cmluZygpOwogICAgICAgIHRoaXMuX29wdGlvbk1hcC5zZXQoaWQsIHZhbHVlKTsKICAgICAgICByZXR1cm4gaWQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRPcHRpb25JZCh2YWx1ZSkgewogICAgICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLl9vcHRpb25NYXAua2V5cygpKSkgewogICAgICAgICAgICBpZiAodGhpcy5fY29tcGFyZVdpdGgoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpKSkuX3ZhbHVlLCB2YWx1ZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHZhbHVlU3RyaW5nCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0T3B0aW9uVmFsdWUodmFsdWVTdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaWQgPSBfZXh0cmFjdElkJDEodmFsdWVTdHJpbmcpOwogICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGlkKSA/ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9vcHRpb25NYXAuZ2V0KGlkKSkpLl92YWx1ZSA6IHZhbHVlU3RyaW5nOwogICAgfQp9ClNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IuybVmYWMgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IpKMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07ClNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvciwgc2VsZWN0b3JzOiBbWyJzZWxlY3QiLCAibXVsdGlwbGUiLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyJzZWxlY3QiLCAibXVsdGlwbGUiLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbInNlbGVjdCIsICJtdWx0aXBsZSIsICIiLCAibmdNb2RlbCIsICIiXV0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yX2NoYW5nZV9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25DaGFuZ2UoJGV2ZW50LnRhcmdldCk7IH0pKCJibHVyIiwgZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvcl9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblRvdWNoZWQoKTsgfSk7CiAgICB9IH0sIGlucHV0czogeyBjb21wYXJlV2l0aDogImNvbXBhcmVXaXRoIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtTRUxFQ1RfTVVMVElQTEVfVkFMVUVfQUNDRVNTT1JdKV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBSZW5kZXJlcjIgfSwKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9Cl07ClNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IucHJvcERlY29yYXRvcnMgPSB7CiAgICBjb21wYXJlV2l0aDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogTWFya3MgYDxvcHRpb24+YCBhcyBkeW5hbWljLCBzbyBBbmd1bGFyIGNhbiBiZSBub3RpZmllZCB3aGVuIG9wdGlvbnMgY2hhbmdlLgogKgogKiBAc2VlIGBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yYAogKgogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gX3NlbGVjdAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX3JlbmRlcmVyLCBfc2VsZWN0KSB7CiAgICAgICAgdGhpcy5fZWxlbWVudCA9IF9lbGVtZW50OwogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgIHRoaXMuX3NlbGVjdCA9IF9zZWxlY3Q7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkgewogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5fc2VsZWN0Ll9yZWdpc3Rlck9wdGlvbih0aGlzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRyYWNrcyB0aGUgdmFsdWUgYm91bmQgdG8gdGhlIG9wdGlvbiBlbGVtZW50LiBVbmxpa2UgdGhlIHZhbHVlIGJpbmRpbmcsCiAgICAgKiBuZ1ZhbHVlIHN1cHBvcnRzIGJpbmRpbmcgdG8gb2JqZWN0cy4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ1ZhbHVlKHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCA9PSBudWxsKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLl9zZXRFbGVtZW50VmFsdWUoX2J1aWxkVmFsdWVTdHJpbmckMSh0aGlzLmlkLCB2YWx1ZSkpOwogICAgICAgIHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRyYWNrcyBzaW1wbGUgc3RyaW5nIHZhbHVlcyBib3VuZCB0byB0aGUgb3B0aW9uIGVsZW1lbnQuCiAgICAgKiBGb3Igb2JqZWN0cywgdXNlIHRoZSBgbmdWYWx1ZWAgaW5wdXQgYmluZGluZy4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCB2YWx1ZSh2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZWxlY3QpIHsKICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlKF9idWlsZFZhbHVlU3RyaW5nJDEodGhpcy5pZCwgdmFsdWUpKTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0RWxlbWVudFZhbHVlKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRTZWxlY3RlZChzZWxlY3RlZCkgewogICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGVkJywgc2VsZWN0ZWQpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5kZWxldGUodGhpcy5pZCk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSk7CiAgICAgICAgfQogICAgfQp9Csm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbi7JtWZhYyA9IGZ1bmN0aW9uIMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLCA5KSk7IH07Csm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24sIHNlbGVjdG9yczogW1sib3B0aW9uIl1dLCBpbnB1dHM6IHsgbmdWYWx1ZTogIm5nVmFsdWUiLCB2YWx1ZTogInZhbHVlIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgeyB0eXBlOiBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEhvc3QgfV0gfQpdOwrJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24ucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1ZhbHVlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduZ1ZhbHVlJyxdIH1dLAogICAgdmFsdWU6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ3ZhbHVlJyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9zaGFyZWQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udHJvbFBhdGgobmFtZSwgcGFyZW50KSB7CiAgICByZXR1cm4gWy4uLigvKiogQHR5cGUgez99ICovIChwYXJlbnQucGF0aCkpLCAoLyoqIEB0eXBlIHs/fSAqLyAobmFtZSkpXTsKfQovKioKICogQHBhcmFtIHs/fSBjb250cm9sCiAqIEBwYXJhbSB7P30gZGlyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRVcENvbnRyb2woY29udHJvbCwgZGlyKSB7CiAgICBpZiAoIWNvbnRyb2wpCiAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnQ2Fubm90IGZpbmQgY29udHJvbCB3aXRoJyk7CiAgICBpZiAoIWRpci52YWx1ZUFjY2Vzc29yKQogICAgICAgIF90aHJvd0Vycm9yKGRpciwgJ05vIHZhbHVlIGFjY2Vzc29yIGZvciBmb3JtIGNvbnRyb2wgd2l0aCcpOwogICAgY29udHJvbC52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoWygvKiogQHR5cGUgez99ICovIChjb250cm9sLnZhbGlkYXRvcikpLCBkaXIudmFsaWRhdG9yXSk7CiAgICBjb250cm9sLmFzeW5jVmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMoWygvKiogQHR5cGUgez99ICovIChjb250cm9sLmFzeW5jVmFsaWRhdG9yKSksIGRpci5hc3luY1ZhbGlkYXRvcl0pOwogICAgKC8qKiBAdHlwZSB7P30gKi8gKGRpci52YWx1ZUFjY2Vzc29yKSkud3JpdGVWYWx1ZShjb250cm9sLnZhbHVlKTsKICAgIHNldFVwVmlld0NoYW5nZVBpcGVsaW5lKGNvbnRyb2wsIGRpcik7CiAgICBzZXRVcE1vZGVsQ2hhbmdlUGlwZWxpbmUoY29udHJvbCwgZGlyKTsKICAgIHNldFVwQmx1clBpcGVsaW5lKGNvbnRyb2wsIGRpcik7CiAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGRpci52YWx1ZUFjY2Vzc29yKSkuc2V0RGlzYWJsZWRTdGF0ZSkgewogICAgICAgIGNvbnRyb2wucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChpc0Rpc2FibGVkKSA9PiB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS5zZXREaXNhYmxlZFN0YXRlKSkoaXNEaXNhYmxlZCk7CiAgICAgICAgfSkpOwogICAgfQogICAgLy8gcmUtcnVuIHZhbGlkYXRpb24gd2hlbiB2YWxpZGF0b3IgYmluZGluZyBjaGFuZ2VzLCBlLmcuIG1pbmxlbmd0aD0zIC0+IG1pbmxlbmd0aD00CiAgICBkaXIuX3Jhd1ZhbGlkYXRvcnMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHZhbGlkYXRvcikgPT4gewogICAgICAgIGlmICgoKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpKS5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKQogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3IpKSkucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSkpKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpKSk7CiAgICB9KSk7CiAgICBkaXIuX3Jhd0FzeW5jVmFsaWRhdG9ycy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAodmFsaWRhdG9yKSA9PiB7CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UpCiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpKS5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKSkoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCkpKTsKICAgIH0pKTsKfQovKioKICogQHBhcmFtIHs/fSBjb250cm9sCiAqIEBwYXJhbSB7P30gZGlyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjbGVhblVwQ29udHJvbChjb250cm9sLCBkaXIpIHsKICAgICgvKiogQHR5cGUgez99ICovIChkaXIudmFsdWVBY2Nlc3NvcikpLnJlZ2lzdGVyT25DaGFuZ2UoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gX25vQ29udHJvbEVycm9yKGRpcikpKTsKICAgICgvKiogQHR5cGUgez99ICovIChkaXIudmFsdWVBY2Nlc3NvcikpLnJlZ2lzdGVyT25Ub3VjaGVkKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IF9ub0NvbnRyb2xFcnJvcihkaXIpKSk7CiAgICBkaXIuX3Jhd1ZhbGlkYXRvcnMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHZhbGlkYXRvcikgPT4gewogICAgICAgIGlmICh2YWxpZGF0b3IucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSkgewogICAgICAgICAgICB2YWxpZGF0b3IucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShudWxsKTsKICAgICAgICB9CiAgICB9KSk7CiAgICBkaXIuX3Jhd0FzeW5jVmFsaWRhdG9ycy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAodmFsaWRhdG9yKSA9PiB7CiAgICAgICAgaWYgKHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKSB7CiAgICAgICAgICAgIHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKG51bGwpOwogICAgICAgIH0KICAgIH0pKTsKICAgIGlmIChjb250cm9sKQogICAgICAgIGNvbnRyb2wuX2NsZWFyQ2hhbmdlRm5zKCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gY29udHJvbAogKiBAcGFyYW0gez99IGRpcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0VXBWaWV3Q2hhbmdlUGlwZWxpbmUoY29udHJvbCwgZGlyKSB7CiAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS5yZWdpc3Rlck9uQ2hhbmdlKCgvKioKICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChuZXdWYWx1ZSkgPT4gewogICAgICAgIGNvbnRyb2wuX3BlbmRpbmdWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgIGNvbnRyb2wuX3BlbmRpbmdDaGFuZ2UgPSB0cnVlOwogICAgICAgIGNvbnRyb2wuX3BlbmRpbmdEaXJ0eSA9IHRydWU7CiAgICAgICAgaWYgKGNvbnRyb2wudXBkYXRlT24gPT09ICdjaGFuZ2UnKQogICAgICAgICAgICB1cGRhdGVDb250cm9sKGNvbnRyb2wsIGRpcik7CiAgICB9KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gY29udHJvbAogKiBAcGFyYW0gez99IGRpcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0VXBCbHVyUGlwZWxpbmUoY29udHJvbCwgZGlyKSB7CiAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS5yZWdpc3Rlck9uVG91Y2hlZCgoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7CiAgICAgICAgY29udHJvbC5fcGVuZGluZ1RvdWNoZWQgPSB0cnVlOwogICAgICAgIGlmIChjb250cm9sLnVwZGF0ZU9uID09PSAnYmx1cicgJiYgY29udHJvbC5fcGVuZGluZ0NoYW5nZSkKICAgICAgICAgICAgdXBkYXRlQ29udHJvbChjb250cm9sLCBkaXIpOwogICAgICAgIGlmIChjb250cm9sLnVwZGF0ZU9uICE9PSAnc3VibWl0JykKICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7CiAgICB9KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gY29udHJvbAogKiBAcGFyYW0gez99IGRpcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdXBkYXRlQ29udHJvbChjb250cm9sLCBkaXIpIHsKICAgIGlmIChjb250cm9sLl9wZW5kaW5nRGlydHkpCiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpOwogICAgY29udHJvbC5zZXRWYWx1ZShjb250cm9sLl9wZW5kaW5nVmFsdWUsIHsgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSB9KTsKICAgIGRpci52aWV3VG9Nb2RlbFVwZGF0ZShjb250cm9sLl9wZW5kaW5nVmFsdWUpOwogICAgY29udHJvbC5fcGVuZGluZ0NoYW5nZSA9IGZhbHNlOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbnRyb2wKICogQHBhcmFtIHs/fSBkaXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldFVwTW9kZWxDaGFuZ2VQaXBlbGluZShjb250cm9sLCBkaXIpIHsKICAgIGNvbnRyb2wucmVnaXN0ZXJPbkNoYW5nZSgoLyoqCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgKiBAcGFyYW0gez99IGVtaXRNb2RlbEV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAobmV3VmFsdWUsIGVtaXRNb2RlbEV2ZW50KSA9PiB7CiAgICAgICAgLy8gY29udHJvbCAtPiB2aWV3CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGRpci52YWx1ZUFjY2Vzc29yKSkud3JpdGVWYWx1ZShuZXdWYWx1ZSk7CiAgICAgICAgLy8gY29udHJvbCAtPiBuZ01vZGVsCiAgICAgICAgaWYgKGVtaXRNb2RlbEV2ZW50KQogICAgICAgICAgICBkaXIudmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWUpOwogICAgfSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbnRyb2wKICogQHBhcmFtIHs/fSBkaXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldFVwRm9ybUNvbnRhaW5lcihjb250cm9sLCBkaXIpIHsKICAgIGlmIChjb250cm9sID09IG51bGwpCiAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnQ2Fubm90IGZpbmQgY29udHJvbCB3aXRoJyk7CiAgICBjb250cm9sLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbY29udHJvbC52YWxpZGF0b3IsIGRpci52YWxpZGF0b3JdKTsKICAgIGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyhbY29udHJvbC5hc3luY1ZhbGlkYXRvciwgZGlyLmFzeW5jVmFsaWRhdG9yXSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZGlyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbm9Db250cm9sRXJyb3IoZGlyKSB7CiAgICByZXR1cm4gX3Rocm93RXJyb3IoZGlyLCAnVGhlcmUgaXMgbm8gRm9ybUNvbnRyb2wgaW5zdGFuY2UgYXR0YWNoZWQgdG8gZm9ybSBjb250cm9sIGVsZW1lbnQgd2l0aCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IGRpcgogKiBAcGFyYW0gez99IG1lc3NhZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF90aHJvd0Vycm9yKGRpciwgbWVzc2FnZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1lc3NhZ2VFbmQ7CiAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGRpci5wYXRoKSkubGVuZ3RoID4gMSkgewogICAgICAgIG1lc3NhZ2VFbmQgPSBgcGF0aDogJyR7KC8qKiBAdHlwZSB7P30gKi8gKGRpci5wYXRoKSkuam9pbignIC0+ICcpfSdgOwogICAgfQogICAgZWxzZSBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGRpci5wYXRoKSlbMF0pIHsKICAgICAgICBtZXNzYWdlRW5kID0gYG5hbWU6ICcke2Rpci5wYXRofSdgOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbWVzc2FnZUVuZCA9ICd1bnNwZWNpZmllZCBuYW1lIGF0dHJpYnV0ZSc7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gJHttZXNzYWdlRW5kfWApOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBvc2VWYWxpZGF0b3JzKHZhbGlkYXRvcnMpIHsKICAgIHJldHVybiB2YWxpZGF0b3JzICE9IG51bGwgPyBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9ycy5tYXAobm9ybWFsaXplVmFsaWRhdG9yKSkgOiBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModmFsaWRhdG9ycykgewogICAgcmV0dXJuIHZhbGlkYXRvcnMgIT0gbnVsbCA/IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKHZhbGlkYXRvcnMubWFwKG5vcm1hbGl6ZUFzeW5jVmFsaWRhdG9yKSkgOgogICAgICAgIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gY2hhbmdlcwogKiBAcGFyYW0gez99IHZpZXdNb2RlbAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdmlld01vZGVsKSB7CiAgICBpZiAoIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21vZGVsJykpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2hhbmdlID0gY2hhbmdlc1snbW9kZWwnXTsKICAgIGlmIChjaGFuZ2UuaXNGaXJzdENoYW5nZSgpKQogICAgICAgIHJldHVybiB0cnVlOwogICAgcmV0dXJuICFsb29zZUlkZW50aWNhbCh2aWV3TW9kZWwsIGNoYW5nZS5jdXJyZW50VmFsdWUpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQlVJTFRJTl9BQ0NFU1NPUlMgPSBbCiAgICBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLAogICAgTnVtYmVyVmFsdWVBY2Nlc3NvciwKICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IsCl07Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlQWNjZXNzb3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQnVpbHRJbkFjY2Vzc29yKHZhbHVlQWNjZXNzb3IpIHsKICAgIHJldHVybiBCVUlMVElOX0FDQ0VTU09SUy5zb21lKCgvKioKICAgICAqIEBwYXJhbSB7P30gYQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYSA9PiB2YWx1ZUFjY2Vzc29yLmNvbnN0cnVjdG9yID09PSBhKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZm9ybQogKiBAcGFyYW0gez99IGRpcmVjdGl2ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN5bmNQZW5kaW5nQ29udHJvbHMoZm9ybSwgZGlyZWN0aXZlcykgewogICAgZm9ybS5fc3luY1BlbmRpbmdDb250cm9scygpOwogICAgZGlyZWN0aXZlcy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXIgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250cm9sID0gKC8qKiBAdHlwZSB7P30gKi8gKGRpci5jb250cm9sKSk7CiAgICAgICAgaWYgKGNvbnRyb2wudXBkYXRlT24gPT09ICdzdWJtaXQnICYmIGNvbnRyb2wuX3BlbmRpbmdDaGFuZ2UpIHsKICAgICAgICAgICAgZGlyLnZpZXdUb01vZGVsVXBkYXRlKGNvbnRyb2wuX3BlbmRpbmdWYWx1ZSk7CiAgICAgICAgICAgIGNvbnRyb2wuX3BlbmRpbmdDaGFuZ2UgPSBmYWxzZTsKICAgICAgICB9CiAgICB9KSk7Cn0KLy8gVE9ETzogdnNhdmtpbiByZW1vdmUgaXQgb25jZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMDExIGlzIGltcGxlbWVudGVkCi8qKgogKiBAcGFyYW0gez99IGRpcgogKiBAcGFyYW0gez99IHZhbHVlQWNjZXNzb3JzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZWxlY3RWYWx1ZUFjY2Vzc29yKGRpciwgdmFsdWVBY2Nlc3NvcnMpIHsKICAgIGlmICghdmFsdWVBY2Nlc3NvcnMpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVBY2Nlc3NvcnMpKQogICAgICAgIF90aHJvd0Vycm9yKGRpciwgJ1ZhbHVlIGFjY2Vzc29yIHdhcyBub3QgcHJvdmlkZWQgYXMgYW4gYXJyYXkgZm9yIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZGVmYXVsdEFjY2Vzc29yID0gdW5kZWZpbmVkOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGJ1aWx0aW5BY2Nlc3NvciA9IHVuZGVmaW5lZDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXN0b21BY2Nlc3NvciA9IHVuZGVmaW5lZDsKICAgIHZhbHVlQWNjZXNzb3JzLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAodikgPT4gewogICAgICAgIGlmICh2LmNvbnN0cnVjdG9yID09PSBEZWZhdWx0VmFsdWVBY2Nlc3NvcikgewogICAgICAgICAgICBkZWZhdWx0QWNjZXNzb3IgPSB2OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc0J1aWx0SW5BY2Nlc3Nvcih2KSkgewogICAgICAgICAgICBpZiAoYnVpbHRpbkFjY2Vzc29yKQogICAgICAgICAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnTW9yZSB0aGFuIG9uZSBidWlsdC1pbiB2YWx1ZSBhY2Nlc3NvciBtYXRjaGVzIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICAgICAgICAgIGJ1aWx0aW5BY2Nlc3NvciA9IHY7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoY3VzdG9tQWNjZXNzb3IpCiAgICAgICAgICAgICAgICBfdGhyb3dFcnJvcihkaXIsICdNb3JlIHRoYW4gb25lIGN1c3RvbSB2YWx1ZSBhY2Nlc3NvciBtYXRjaGVzIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICAgICAgICAgIGN1c3RvbUFjY2Vzc29yID0gdjsKICAgICAgICB9CiAgICB9KSk7CiAgICBpZiAoY3VzdG9tQWNjZXNzb3IpCiAgICAgICAgcmV0dXJuIGN1c3RvbUFjY2Vzc29yOwogICAgaWYgKGJ1aWx0aW5BY2Nlc3NvcikKICAgICAgICByZXR1cm4gYnVpbHRpbkFjY2Vzc29yOwogICAgaWYgKGRlZmF1bHRBY2Nlc3NvcikKICAgICAgICByZXR1cm4gZGVmYXVsdEFjY2Vzc29yOwogICAgX3Rocm93RXJyb3IoZGlyLCAnTm8gdmFsaWQgdmFsdWUgYWNjZXNzb3IgZm9yIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBsaXN0CiAqIEBwYXJhbSB7P30gZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbW92ZURpcihsaXN0LCBlbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoZWwpOwogICAgaWYgKGluZGV4ID4gLTEpCiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpOwp9Ci8vIFRPRE8oa2FyYSk6IHJlbW92ZSBhZnRlciBkZXByZWNhdGlvbiBwZXJpb2QKLyoqCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBpbnN0YW5jZQogKiBAcGFyYW0gez99IHdhcm5pbmdDb25maWcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9uZ01vZGVsV2FybmluZyhuYW1lLCB0eXBlLCBpbnN0YW5jZSwgd2FybmluZ0NvbmZpZykgewogICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB3YXJuaW5nQ29uZmlnID09PSAnbmV2ZXInKQogICAgICAgIHJldHVybjsKICAgIGlmICgoKHdhcm5pbmdDb25maWcgPT09IG51bGwgfHwgd2FybmluZ0NvbmZpZyA9PT0gJ29uY2UnKSAmJiAhdHlwZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSkgfHwKICAgICAgICAod2FybmluZ0NvbmZpZyA9PT0gJ2Fsd2F5cycgJiYgIWluc3RhbmNlLl9uZ01vZGVsV2FybmluZ1NlbnQpKSB7CiAgICAgICAgUmVhY3RpdmVFcnJvcnMubmdNb2RlbFdhcm5pbmcobmFtZSk7CiAgICAgICAgdHlwZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2UuX25nTW9kZWxXYXJuaW5nU2VudCA9IHRydWU7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9tb2RlbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgdmFsaWQsIG1lYW5pbmcgdGhhdCBubyBlcnJvcnMgZXhpc3QgaW4gdGhlIGlucHV0IHZhbHVlLgogKgogKiBAc2VlIGBzdGF0dXNgCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVkFMSUQgPSAnVkFMSUQnOwovKioKICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgaW52YWxpZCwgbWVhbmluZyB0aGF0IGFuIGVycm9yIGV4aXN0cyBpbiB0aGUgaW5wdXQgdmFsdWUuCiAqCiAqIEBzZWUgYHN0YXR1c2AKICogQHR5cGUgez99CiAqLwpjb25zdCBJTlZBTElEID0gJ0lOVkFMSUQnOwovKioKICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgcGVuZGluZywgbWVhbmluZyB0aGF0IHRoYXQgYXN5bmMgdmFsaWRhdGlvbiBpcyBvY2N1cnJpbmcgYW5kCiAqIGVycm9ycyBhcmUgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBpbnB1dCB2YWx1ZS4KICoKICogQHNlZSBgbWFya0FzUGVuZGluZ2AKICogQHNlZSBgc3RhdHVzYAogKiBAdHlwZSB7P30KICovCmNvbnN0IFBFTkRJTkcgPSAnUEVORElORyc7Ci8qKgogKiBSZXBvcnRzIHRoYXQgYSBGb3JtQ29udHJvbCBpcyBkaXNhYmxlZCwgbWVhbmluZyB0aGF0IHRoZSBjb250cm9sIGlzIGV4ZW1wdCBmcm9tIGFuY2VzdG9yCiAqIGNhbGN1bGF0aW9ucyBvZiB2YWxpZGl0eSBvciB2YWx1ZS4KICoKICogQHNlZSBgbWFya0FzRGlzYWJsZWRgCiAqIEBzZWUgYHN0YXR1c2AKICogQHR5cGUgez99CiAqLwpjb25zdCBESVNBQkxFRCA9ICdESVNBQkxFRCc7Ci8qKgogKiBAcGFyYW0gez99IGNvbnRyb2wKICogQHBhcmFtIHs/fSBwYXRoCiAqIEBwYXJhbSB7P30gZGVsaW1pdGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfZmluZChjb250cm9sLCBwYXRoLCBkZWxpbWl0ZXIpIHsKICAgIGlmIChwYXRoID09IG51bGwpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdChkZWxpbWl0ZXIpOwogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkgJiYgcGF0aC5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAvLyBOb3QgdXNpbmcgQXJyYXkucmVkdWNlIGhlcmUgZHVlIHRvIGEgQ2hyb21lIDgwIGJ1ZwogICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTA0OTk4MgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGNvbnRyb2xUb0ZpbmQgPSBjb250cm9sOwogICAgcGF0aC5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKG5hbWUpID0+IHsKICAgICAgICBpZiAoY29udHJvbFRvRmluZCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgewogICAgICAgICAgICBjb250cm9sVG9GaW5kID0gY29udHJvbFRvRmluZC5jb250cm9scy5oYXNPd25Qcm9wZXJ0eSgoLyoqIEB0eXBlIHs/fSAqLyAobmFtZSkpKSA/CiAgICAgICAgICAgICAgICBjb250cm9sVG9GaW5kLmNvbnRyb2xzW25hbWVdIDoKICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbnRyb2xUb0ZpbmQgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHsKICAgICAgICAgICAgY29udHJvbFRvRmluZCA9IGNvbnRyb2xUb0ZpbmQuYXQoKC8qKiBAdHlwZSB7P30gKi8gKG5hbWUpKSkgfHwgbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvbnRyb2xUb0ZpbmQgPSBudWxsOwogICAgICAgIH0KICAgIH0pKTsKICAgIHJldHVybiBjb250cm9sVG9GaW5kOwp9Ci8qKgogKiBAcGFyYW0gez89fSB2YWxpZGF0b3JPck9wdHMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvZXJjZVRvVmFsaWRhdG9yKHZhbGlkYXRvck9yT3B0cykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdmFsaWRhdG9yID0gKC8qKiBAdHlwZSB7P30gKi8gKChpc09wdGlvbnNPYmoodmFsaWRhdG9yT3JPcHRzKSA/ICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yT3JPcHRzKSkpLnZhbGlkYXRvcnMgOgogICAgICAgIHZhbGlkYXRvck9yT3B0cykpKTsKICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbGlkYXRvcikgPyBjb21wb3NlVmFsaWRhdG9ycyh2YWxpZGF0b3IpIDogdmFsaWRhdG9yIHx8IG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7Pz19IGFzeW5jVmFsaWRhdG9yCiAqIEBwYXJhbSB7Pz19IHZhbGlkYXRvck9yT3B0cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29lcmNlVG9Bc3luY1ZhbGlkYXRvcihhc3luY1ZhbGlkYXRvciwgdmFsaWRhdG9yT3JPcHRzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvcmlnQXN5bmNWYWxpZGF0b3IgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKGlzT3B0aW9uc09iaih2YWxpZGF0b3JPck9wdHMpID8gKCgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3JPck9wdHMpKSkuYXN5bmNWYWxpZGF0b3JzIDoKICAgICAgICBhc3luY1ZhbGlkYXRvcikpKTsKICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9yaWdBc3luY1ZhbGlkYXRvcikgPyBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKG9yaWdBc3luY1ZhbGlkYXRvcikgOgogICAgICAgIG9yaWdBc3luY1ZhbGlkYXRvciB8fCBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez89fSB2YWxpZGF0b3JPck9wdHMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzT3B0aW9uc09iaih2YWxpZGF0b3JPck9wdHMpIHsKICAgIHJldHVybiB2YWxpZGF0b3JPck9wdHMgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWxpZGF0b3JPck9wdHMpICYmCiAgICAgICAgdHlwZW9mIHZhbGlkYXRvck9yT3B0cyA9PT0gJ29iamVjdCc7Cn0KLyoqCiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGBGb3JtQ29udHJvbGAsIGBGb3JtR3JvdXBgLCBhbmQgYEZvcm1BcnJheWAuCiAqCiAqIEl0IHByb3ZpZGVzIHNvbWUgb2YgdGhlIHNoYXJlZCBiZWhhdmlvciB0aGF0IGFsbCBjb250cm9scyBhbmQgZ3JvdXBzIG9mIGNvbnRyb2xzIGhhdmUsIGxpa2UKICogcnVubmluZyB2YWxpZGF0b3JzLCBjYWxjdWxhdGluZyBzdGF0dXMsIGFuZCByZXNldHRpbmcgc3RhdGUuIEl0IGFsc28gZGVmaW5lcyB0aGUgcHJvcGVydGllcwogKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBhbGwgc3ViLWNsYXNzZXMsIGxpa2UgYHZhbHVlYCwgYHZhbGlkYCwgYW5kIGBkaXJ0eWAuIEl0IHNob3VsZG4ndCBiZQogKiBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCiAqCiAqIEBzZWUgW0Zvcm1zIEd1aWRlXSgvZ3VpZGUvZm9ybXMpCiAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXSgvZ3VpZGUvcmVhY3RpdmUtZm9ybXMpCiAqIEBzZWUgW0R5bmFtaWMgRm9ybXMgR3VpZGVdKC9ndWlkZS9keW5hbWljLWZvcm0pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgQWJzdHJhY3RDb250cm9sIHsKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZSB0aGUgQWJzdHJhY3RDb250cm9sIGluc3RhbmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yIFRoZSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIHN5bmNocm9ub3VzIHZhbGlkaXR5IG9mIHRoaXMgY29udHJvbC4KICAgICAqIEBwYXJhbSB7P30gYXN5bmNWYWxpZGF0b3IgVGhlIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYXN5bmNocm9ub3VzIHZhbGlkaXR5IG9mIHRoaXMKICAgICAqIGNvbnRyb2wuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpIHsKICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKICAgICAgICB0aGlzLmFzeW5jVmFsaWRhdG9yID0gYXN5bmNWYWxpZGF0b3I7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBjb250cm9sIGlzIGBwcmlzdGluZWAgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgY2hhbmdlZAogICAgICAgICAqIHRoZSB2YWx1ZSBpbiB0aGUgVUkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgY2hhbmdlZCB0aGUgdmFsdWUgaW4gdGhlIFVJOyBjb21wYXJlIGBkaXJ0eWAuCiAgICAgICAgICogUHJvZ3JhbW1hdGljIGNoYW5nZXMgdG8gYSBjb250cm9sJ3MgdmFsdWUgZG8gbm90IG1hcmsgaXQgZGlydHkuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5wcmlzdGluZSA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGUgY29udHJvbCBpcyBtYXJrZWQgYXMgYHRvdWNoZWRgLgogICAgICAgICAqCiAgICAgICAgICogQSBjb250cm9sIGlzIG1hcmtlZCBgdG91Y2hlZGAgb25jZSB0aGUgdXNlciBoYXMgdHJpZ2dlcmVkCiAgICAgICAgICogYSBgYmx1cmAgZXZlbnQgb24gaXQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy50b3VjaGVkID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogVGhlIHBhcmVudCBjb250cm9sLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBhcmVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50OwogICAgfQogICAgLyoqCiAgICAgKiBBIGNvbnRyb2wgaXMgYHZhbGlkYCB3aGVuIGl0cyBgc3RhdHVzYCBpcyBgVkFMSURgLgogICAgICoKICAgICAqIEBzZWUge1xAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfQogICAgICoKICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGNvbnRyb2wgaGFzIHBhc3NlZCBhbGwgb2YgaXRzIHZhbGlkYXRpb24gdGVzdHMsCiAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IFZBTElEOwogICAgfQogICAgLyoqCiAgICAgKiBBIGNvbnRyb2wgaXMgYGludmFsaWRgIHdoZW4gaXRzIGBzdGF0dXNgIGlzIGBJTlZBTElEYC4KICAgICAqCiAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoaXMgY29udHJvbCBoYXMgZmFpbGVkIG9uZSBvciBtb3JlIG9mIGl0cyB2YWxpZGF0aW9uIGNoZWNrcywKICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgZ2V0IGludmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBJTlZBTElEOwogICAgfQogICAgLyoqCiAgICAgKiBBIGNvbnRyb2wgaXMgYHBlbmRpbmdgIHdoZW4gaXRzIGBzdGF0dXNgIGlzIGBQRU5ESU5HYC4KICAgICAqCiAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoaXMgY29udHJvbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25kdWN0aW5nIGEgdmFsaWRhdGlvbiBjaGVjaywKICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgZ2V0IHBlbmRpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09IFBFTkRJTkc7CiAgICB9CiAgICAvKioKICAgICAqIEEgY29udHJvbCBpcyBgZGlzYWJsZWRgIHdoZW4gaXRzIGBzdGF0dXNgIGlzIGBESVNBQkxFRGAuCiAgICAgKgogICAgICogRGlzYWJsZWQgY29udHJvbHMgYXJlIGV4ZW1wdCBmcm9tIHZhbGlkYXRpb24gY2hlY2tzIGFuZAogICAgICogYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYWdncmVnYXRlIHZhbHVlIG9mIHRoZWlyIGFuY2VzdG9yCiAgICAgKiBjb250cm9scy4KICAgICAqCiAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoZSBjb250cm9sIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGdldCBkaXNhYmxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IERJU0FCTEVEOwogICAgfQogICAgLyoqCiAgICAgKiBBIGNvbnRyb2wgaXMgYGVuYWJsZWRgIGFzIGxvbmcgYXMgaXRzIGBzdGF0dXNgIGlzIG5vdCBgRElTQUJMRURgLgogICAgICoKICAgICAqIEBzZWUge1xAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfQogICAgICoKICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGNvbnRyb2wgaGFzIGFueSBzdGF0dXMgb3RoZXIgdGhhbiAnRElTQUJMRUQnLAogICAgICogZmFsc2UgaWYgdGhlIHN0YXR1cyBpcyAnRElTQUJMRUQnLgogICAgICoKICAgICAqLwogICAgZ2V0IGVuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzICE9PSBESVNBQkxFRDsKICAgIH0KICAgIC8qKgogICAgICogQSBjb250cm9sIGlzIGBkaXJ0eWAgaWYgdGhlIHVzZXIgaGFzIGNoYW5nZWQgdGhlIHZhbHVlCiAgICAgKiBpbiB0aGUgVUkuCiAgICAgKgogICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgdXNlciBoYXMgY2hhbmdlZCB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGluIHRoZSBVSTsgY29tcGFyZSBgcHJpc3RpbmVgLgogICAgICogUHJvZ3JhbW1hdGljIGNoYW5nZXMgdG8gYSBjb250cm9sJ3MgdmFsdWUgZG8gbm90IG1hcmsgaXQgZGlydHkuCiAgICAgKi8KICAgIGdldCBkaXJ0eSgpIHsKICAgICAgICByZXR1cm4gIXRoaXMucHJpc3RpbmU7CiAgICB9CiAgICAvKioKICAgICAqIFRydWUgaWYgdGhlIGNvbnRyb2wgaGFzIG5vdCBiZWVuIG1hcmtlZCBhcyB0b3VjaGVkCiAgICAgKgogICAgICogQSBjb250cm9sIGlzIGB1bnRvdWNoZWRgIGlmIHRoZSB1c2VyIGhhcyBub3QgeWV0IHRyaWdnZXJlZAogICAgICogYSBgYmx1cmAgZXZlbnQgb24gaXQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdW50b3VjaGVkKCkgewogICAgICAgIHJldHVybiAhdGhpcy50b3VjaGVkOwogICAgfQogICAgLyoqCiAgICAgKiBSZXBvcnRzIHRoZSB1cGRhdGUgc3RyYXRlZ3kgb2YgdGhlIGBBYnN0cmFjdENvbnRyb2xgIChtZWFuaW5nCiAgICAgKiB0aGUgZXZlbnQgb24gd2hpY2ggdGhlIGNvbnRyb2wgdXBkYXRlcyBpdHNlbGYpLgogICAgICogUG9zc2libGUgdmFsdWVzOiBgJ2NoYW5nZSdgIHwgYCdibHVyJ2AgfCBgJ3N1Ym1pdCdgCiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgJ2NoYW5nZSdgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdXBkYXRlT24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU9uID8gdGhpcy5fdXBkYXRlT24gOiAodGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC51cGRhdGVPbiA6ICdjaGFuZ2UnKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycyB0aGF0IGFyZSBhY3RpdmUgb24gdGhpcyBjb250cm9sLiAgQ2FsbGluZwogICAgICogdGhpcyBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBzeW5jIHZhbGlkYXRvcnMuCiAgICAgKgogICAgICogV2hlbiB5b3UgYWRkIG9yIHJlbW92ZSBhIHZhbGlkYXRvciBhdCBydW4gdGltZSwgeW91IG11c3QgY2FsbAogICAgICogYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAgZm9yIHRoZSBuZXcgdmFsaWRhdGlvbiB0byB0YWtlIGVmZmVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbGlkYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0VmFsaWRhdG9ycyhuZXdWYWxpZGF0b3IpIHsKICAgICAgICB0aGlzLnZhbGlkYXRvciA9IGNvZXJjZVRvVmFsaWRhdG9yKG5ld1ZhbGlkYXRvcik7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIGFzeW5jIHZhbGlkYXRvcnMgdGhhdCBhcmUgYWN0aXZlIG9uIHRoaXMgY29udHJvbC4gQ2FsbGluZyB0aGlzCiAgICAgKiBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBhc3luYyB2YWxpZGF0b3JzLgogICAgICoKICAgICAqIFdoZW4geW91IGFkZCBvciByZW1vdmUgYSB2YWxpZGF0b3IgYXQgcnVuIHRpbWUsIHlvdSBtdXN0IGNhbGwKICAgICAqIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgIGZvciB0aGUgbmV3IHZhbGlkYXRpb24gdG8gdGFrZSBlZmZlY3QuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuZXdWYWxpZGF0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldEFzeW5jVmFsaWRhdG9ycyhuZXdWYWxpZGF0b3IpIHsKICAgICAgICB0aGlzLmFzeW5jVmFsaWRhdG9yID0gY29lcmNlVG9Bc3luY1ZhbGlkYXRvcihuZXdWYWxpZGF0b3IpOwogICAgfQogICAgLyoqCiAgICAgKiBFbXB0aWVzIG91dCB0aGUgc3luYyB2YWxpZGF0b3IgbGlzdC4KICAgICAqCiAgICAgKiBXaGVuIHlvdSBhZGQgb3IgcmVtb3ZlIGEgdmFsaWRhdG9yIGF0IHJ1biB0aW1lLCB5b3UgbXVzdCBjYWxsCiAgICAgKiBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYCBmb3IgdGhlIG5ldyB2YWxpZGF0aW9uIHRvIHRha2UgZWZmZWN0LgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsZWFyVmFsaWRhdG9ycygpIHsKICAgICAgICB0aGlzLnZhbGlkYXRvciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEVtcHRpZXMgb3V0IHRoZSBhc3luYyB2YWxpZGF0b3IgbGlzdC4KICAgICAqCiAgICAgKiBXaGVuIHlvdSBhZGQgb3IgcmVtb3ZlIGEgdmFsaWRhdG9yIGF0IHJ1biB0aW1lLCB5b3UgbXVzdCBjYWxsCiAgICAgKiBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYCBmb3IgdGhlIG5ldyB2YWxpZGF0aW9uIHRvIHRha2UgZWZmZWN0LgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsZWFyQXN5bmNWYWxpZGF0b3JzKCkgewogICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0b3IgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBNYXJrcyB0aGUgY29udHJvbCBhcyBgdG91Y2hlZGAuIEEgY29udHJvbCBpcyB0b3VjaGVkIGJ5IGZvY3VzIGFuZAogICAgICogYmx1ciBldmVudHMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSB2YWx1ZS4KICAgICAqCiAgICAgKiBAc2VlIGBtYXJrQXNVbnRvdWNoZWQoKWAgLyBgbWFya0FzRGlydHkoKWAgLyBgbWFya0FzUHJpc3RpbmUoKWAKICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBvcHRzIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzCiAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIGFmdGVyIG1hcmtpbmcgaXMgYXBwbGllZC4KICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWFya0FzVG91Y2hlZChvcHRzID0ge30pIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkudG91Y2hlZCA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikgewogICAgICAgICAgICB0aGlzLl9wYXJlbnQubWFya0FzVG91Y2hlZChvcHRzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnQgY29udHJvbHMgYXMgYHRvdWNoZWRgLgogICAgICogQHNlZSBgbWFya0FzVG91Y2hlZCgpYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWFya0FsbEFzVG91Y2hlZCgpIHsKICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTsKICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wubWFya0FsbEFzVG91Y2hlZCgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGB1bnRvdWNoZWRgLgogICAgICoKICAgICAqIElmIHRoZSBjb250cm9sIGhhcyBhbnkgY2hpbGRyZW4sIGFsc28gbWFya3MgYWxsIGNoaWxkcmVuIGFzIGB1bnRvdWNoZWRgCiAgICAgKiBhbmQgcmVjYWxjdWxhdGVzIHRoZSBgdG91Y2hlZGAgc3RhdHVzIG9mIGFsbCBwYXJlbnQgY29udHJvbHMuCiAgICAgKgogICAgICogQHNlZSBgbWFya0FzVG91Y2hlZCgpYCAvIGBtYXJrQXNEaXJ0eSgpYCAvIGBtYXJrQXNQcmlzdGluZSgpYAogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IG9wdHMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMKICAgICAqIGFuZCBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIG1hcmtpbmcgaXMgYXBwbGllZC4KICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWFya0FzVW50b3VjaGVkKG9wdHMgPSB7fSkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS50b3VjaGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fcGVuZGluZ1RvdWNoZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikgewogICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQob3B0cyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYXJrcyB0aGUgY29udHJvbCBhcyBgZGlydHlgLiBBIGNvbnRyb2wgYmVjb21lcyBkaXJ0eSB3aGVuCiAgICAgKiB0aGUgY29udHJvbCdzIHZhbHVlIGlzIGNoYW5nZWQgdGhyb3VnaCB0aGUgVUk7IGNvbXBhcmUgYG1hcmtBc1RvdWNoZWRgLgogICAgICoKICAgICAqIEBzZWUgYG1hcmtBc1RvdWNoZWQoKWAgLyBgbWFya0FzVW50b3VjaGVkKClgIC8gYG1hcmtBc1ByaXN0aW5lKClgCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcwogICAgICogYW5kIGVtaXRzIGV2ZW50cyBhZnRlciBtYXJraW5nIGlzIGFwcGxpZWQuCiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsCiAgICAgKiBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1hcmtBc0RpcnR5KG9wdHMgPSB7fSkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5wcmlzdGluZSA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KG9wdHMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTWFya3MgdGhlIGNvbnRyb2wgYXMgYHByaXN0aW5lYC4KICAgICAqCiAgICAgKiBJZiB0aGUgY29udHJvbCBoYXMgYW55IGNoaWxkcmVuLCBtYXJrcyBhbGwgY2hpbGRyZW4gYXMgYHByaXN0aW5lYCwKICAgICAqIGFuZCByZWNhbGN1bGF0ZXMgdGhlIGBwcmlzdGluZWAgc3RhdHVzIG9mIGFsbCBwYXJlbnQKICAgICAqIGNvbnRyb2xzLgogICAgICoKICAgICAqIEBzZWUgYG1hcmtBc1RvdWNoZWQoKWAgLyBgbWFya0FzVW50b3VjaGVkKClgIC8gYG1hcmtBc0RpcnR5KClgCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIGVtaXRzIGV2ZW50cyBhZnRlcgogICAgICogbWFya2luZyBpcyBhcHBsaWVkLgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLAogICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXJrQXNQcmlzdGluZShvcHRzID0ge30pIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkucHJpc3RpbmUgPSB0cnVlOwogICAgICAgIHRoaXMuX3BlbmRpbmdEaXJ0eSA9IGZhbHNlOwogICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHRydWUgfSk7CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVQcmlzdGluZShvcHRzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGBwZW5kaW5nYC4KICAgICAqCiAgICAgKiBBIGNvbnRyb2wgaXMgcGVuZGluZyB3aGlsZSB0aGUgY29udHJvbCBwZXJmb3JtcyBhc3luYyB2YWxpZGF0aW9uLgogICAgICoKICAgICAqIEBzZWUge1xAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfQogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IG9wdHMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kCiAgICAgKiBlbWl0cyBldmVudHMgYWZ0ZXIgbWFya2luZyBpcyBhcHBsaWVkLgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLAogICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuCiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIHRoZSBgc3RhdHVzQ2hhbmdlc2AKICAgICAqIG9ic2VydmFibGUgZW1pdHMgYW4gZXZlbnQgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyB0aGUgY29udHJvbCBpcyBtYXJrZWQgcGVuZGluZy4KICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXJrQXNQZW5kaW5nKG9wdHMgPSB7fSkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5zdGF0dXMgPSBQRU5ESU5HOwogICAgICAgIGlmIChvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLnN0YXR1c0NoYW5nZXMpKSkuZW1pdCh0aGlzLnN0YXR1cyk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc1BlbmRpbmcob3B0cyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEaXNhYmxlcyB0aGUgY29udHJvbC4gVGhpcyBtZWFucyB0aGUgY29udHJvbCBpcyBleGVtcHQgZnJvbSB2YWxpZGF0aW9uIGNoZWNrcyBhbmQKICAgICAqIGV4Y2x1ZGVkIGZyb20gdGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiBhbnkgcGFyZW50LiBJdHMgc3RhdHVzIGlzIGBESVNBQkxFRGAuCiAgICAgKgogICAgICogSWYgdGhlIGNvbnRyb2wgaGFzIGNoaWxkcmVuLCBhbGwgY2hpbGRyZW4gYXJlIGFsc28gZGlzYWJsZWQuCiAgICAgKgogICAgICogQHNlZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9CiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMKICAgICAqIGNoYW5nZXMgYW5kIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZC4KICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLgogICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCBpcyBkaXNhYmxlZC4KICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc2FibGUob3B0cyA9IHt9KSB7CiAgICAgICAgLy8gSWYgcGFyZW50IGhhcyBiZWVuIG1hcmtlZCBhcnRpZmljaWFsbHkgZGlydHkgd2UgZG9uJ3Qgd2FudCB0byByZS1jYWxjdWxhdGUgdGhlCiAgICAgICAgLy8gcGFyZW50J3MgZGlydGluZXNzIGJhc2VkIG9uIHRoZSBjaGlsZHJlbi4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2tpcFByaXN0aW5lQ2hlY2sgPSB0aGlzLl9wYXJlbnRNYXJrZWREaXJ0eShvcHRzLm9ubHlTZWxmKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzID0gRElTQUJMRUQ7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmVycm9ycyA9IG51bGw7CiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdHMpLCB7IG9ubHlTZWxmOiB0cnVlIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fdXBkYXRlVmFsdWUoKTsKICAgICAgICBpZiAob3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy52YWx1ZUNoYW5nZXMpKSkuZW1pdCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLnN0YXR1c0NoYW5nZXMpKSkuZW1pdCh0aGlzLnN0YXR1cyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VwZGF0ZUFuY2VzdG9ycyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdHMpLCB7IHNraXBQcmlzdGluZUNoZWNrIH0pKTsKICAgICAgICB0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjaGFuZ2VGbikgPT4gY2hhbmdlRm4odHJ1ZSkpKTsKICAgIH0KICAgIC8qKgogICAgICogRW5hYmxlcyB0aGUgY29udHJvbC4gVGhpcyBtZWFucyB0aGUgY29udHJvbCBpcyBpbmNsdWRlZCBpbiB2YWxpZGF0aW9uIGNoZWNrcyBhbmQKICAgICAqIHRoZSBhZ2dyZWdhdGUgdmFsdWUgb2YgaXRzIHBhcmVudC4gSXRzIHN0YXR1cyByZWNhbGN1bGF0ZXMgYmFzZWQgb24gaXRzIHZhbHVlIGFuZAogICAgICogaXRzIHZhbGlkYXRvcnMuCiAgICAgKgogICAgICogQnkgZGVmYXVsdCwgaWYgdGhlIGNvbnRyb2wgaGFzIGNoaWxkcmVuLCBhbGwgY2hpbGRyZW4gYXJlIGVuYWJsZWQuCiAgICAgKgogICAgICogQHNlZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9CiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGNvbnRyb2wgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcyBhbmQKICAgICAqIGVtaXRzIGV2ZW50cyB3aGVuIG1hcmtlZCBhcyB1bnRvdWNoZWQKICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLgogICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCBpcyBlbmFibGVkLgogICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZW5hYmxlKG9wdHMgPSB7fSkgewogICAgICAgIC8vIElmIHBhcmVudCBoYXMgYmVlbiBtYXJrZWQgYXJ0aWZpY2lhbGx5IGRpcnR5IHdlIGRvbid0IHdhbnQgdG8gcmUtY2FsY3VsYXRlIHRoZQogICAgICAgIC8vIHBhcmVudCdzIGRpcnRpbmVzcyBiYXNlZCBvbiB0aGUgY2hpbGRyZW4uCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNraXBQcmlzdGluZUNoZWNrID0gdGhpcy5fcGFyZW50TWFya2VkRGlydHkob3B0cy5vbmx5U2VsZik7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN0YXR1cyA9IFZBTElEOwogICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICBjb250cm9sLmVuYWJsZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdHMpLCB7IG9ubHlTZWxmOiB0cnVlIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0cy5lbWl0RXZlbnQgfSk7CiAgICAgICAgdGhpcy5fdXBkYXRlQW5jZXN0b3JzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0cyksIHsgc2tpcFByaXN0aW5lQ2hlY2sgfSkpOwogICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VGbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNoYW5nZUZuKSA9PiBjaGFuZ2VGbihmYWxzZSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3B0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZUFuY2VzdG9ycyhvcHRzKSB7CiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikgewogICAgICAgICAgICB0aGlzLl9wYXJlbnQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRzKTsKICAgICAgICAgICAgaWYgKCFvcHRzLnNraXBQcmlzdGluZUNoZWNrKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVUb3VjaGVkKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudCBTZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGNvbnRyb2wKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFBhcmVudChwYXJlbnQpIHsKICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgICAvKioKICAgICAqIFJlY2FsY3VsYXRlcyB0aGUgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzIG9mIHRoZSBjb250cm9sLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIGl0IGFsc28gdXBkYXRlcyB0aGUgdmFsdWUgYW5kIHZhbGlkaXR5IG9mIGl0cyBhbmNlc3RvcnMuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kIGVtaXRzIGV2ZW50cwogICAgICogYWZ0ZXIgdXBkYXRlcyBhbmQgdmFsaWRpdHkgY2hlY2tzIGFyZSBhcHBsaWVkLgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG9ubHkgdXBkYXRlIHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsCiAgICAgKiB1cGRhdGUgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuCiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHVwZGF0ZWQuCiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdHMgPSB7fSkgewogICAgICAgIHRoaXMuX3NldEluaXRpYWxTdGF0dXMoKTsKICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZSgpOwogICAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fY2FuY2VsRXhpc3RpbmdTdWJzY3JpcHRpb24oKTsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmVycm9ycyA9IHRoaXMuX3J1blZhbGlkYXRvcigpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzID0gdGhpcy5fY2FsY3VsYXRlU3RhdHVzKCk7CiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gVkFMSUQgfHwgdGhpcy5zdGF0dXMgPT09IFBFTkRJTkcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3J1bkFzeW5jVmFsaWRhdG9yKG9wdHMuZW1pdEV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy52YWx1ZUNoYW5nZXMpKSkuZW1pdCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLnN0YXR1c0NoYW5nZXMpKSkuZW1pdCh0aGlzLnN0YXR1cyk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgdGhpcy5fcGFyZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0cyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez89fSBvcHRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVHJlZVZhbGlkaXR5KG9wdHMgPSB7IGVtaXRFdmVudDogdHJ1ZSB9KSB7CiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGN0cmwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjdHJsKSA9PiBjdHJsLl91cGRhdGVUcmVlVmFsaWRpdHkob3B0cykpKTsKICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRzLmVtaXRFdmVudCB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRJbml0aWFsU3RhdHVzKCkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5zdGF0dXMgPSB0aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCkgPyBESVNBQkxFRCA6IFZBTElEOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3J1blZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3IgPyB0aGlzLnZhbGlkYXRvcih0aGlzKSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez89fSBlbWl0RXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9ydW5Bc3luY1ZhbGlkYXRvcihlbWl0RXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5hc3luY1ZhbGlkYXRvcikgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzID0gUEVORElORzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYnMgPSB0b09ic2VydmFibGUodGhpcy5hc3luY1ZhbGlkYXRvcih0aGlzKSk7CiAgICAgICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbiA9CiAgICAgICAgICAgICAgICBvYnMuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyb3JzKSA9PiB0aGlzLnNldEVycm9ycyhlcnJvcnMsIHsgZW1pdEV2ZW50IH0pKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NhbmNlbEV4aXN0aW5nU3Vic2NyaXB0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIGVycm9ycyBvbiBhIGZvcm0gY29udHJvbCB3aGVuIHJ1bm5pbmcgdmFsaWRhdGlvbnMgbWFudWFsbHksIHJhdGhlciB0aGFuIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogQ2FsbGluZyBgc2V0RXJyb3JzYCBhbHNvIHVwZGF0ZXMgdGhlIHZhbGlkaXR5IG9mIHRoZSBwYXJlbnQgY29udHJvbC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgTWFudWFsbHkgc2V0IHRoZSBlcnJvcnMgZm9yIGEgY29udHJvbAogICAgICoKICAgICAqIGBgYAogICAgICogY29uc3QgbG9naW4gPSBuZXcgRm9ybUNvbnRyb2woJ3NvbWVMb2dpbicpOwogICAgICogbG9naW4uc2V0RXJyb3JzKHsKICAgICAqICAgbm90VW5pcXVlOiB0cnVlCiAgICAgKiB9KTsKICAgICAqCiAgICAgKiBleHBlY3QobG9naW4udmFsaWQpLnRvRXF1YWwoZmFsc2UpOwogICAgICogZXhwZWN0KGxvZ2luLmVycm9ycykudG9FcXVhbCh7IG5vdFVuaXF1ZTogdHJ1ZSB9KTsKICAgICAqCiAgICAgKiBsb2dpbi5zZXRWYWx1ZSgnc29tZU90aGVyTG9naW4nKTsKICAgICAqCiAgICAgKiBleHBlY3QobG9naW4udmFsaWQpLnRvRXF1YWwodHJ1ZSk7CiAgICAgKiBgYGAKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcGFyYW0gez89fSBvcHRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRFcnJvcnMoZXJyb3JzLCBvcHRzID0ge30pIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuZXJyb3JzID0gZXJyb3JzOwogICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xzRXJyb3JzKG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIGNoaWxkIGNvbnRyb2wgZ2l2ZW4gdGhlIGNvbnRyb2wncyBuYW1lIG9yIHBhdGguCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgUmV0cmlldmUgYSBuZXN0ZWQgY29udHJvbAogICAgICoKICAgICAqIEZvciBleGFtcGxlLCB0byBnZXQgYSBgbmFtZWAgY29udHJvbCBuZXN0ZWQgd2l0aGluIGEgYHBlcnNvbmAgc3ViLWdyb3VwOgogICAgICoKICAgICAqICogYHRoaXMuZm9ybS5nZXQoJ3BlcnNvbi5uYW1lJyk7YAogICAgICoKICAgICAqIC1PUi0KICAgICAqCiAgICAgKiAqIGB0aGlzLmZvcm0uZ2V0KFsncGVyc29uJywgJ25hbWUnXSk7YAogICAgICogQHBhcmFtIHs/fSBwYXRoIEEgZG90LWRlbGltaXRlZCBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nL251bWJlciB2YWx1ZXMgdGhhdCBkZWZpbmUgdGhlIHBhdGggdG8gdGhlCiAgICAgKiBjb250cm9sLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldChwYXRoKSB7CiAgICAgICAgcmV0dXJuIF9maW5kKHRoaXMsIHBhdGgsICcuJyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlcG9ydHMgZXJyb3IgZGF0YSBmb3IgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBgRm9ybUdyb3VwYDoKICAgICAqCiAgICAgKiBgYGAKICAgICAqIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAqICAgYWRkcmVzczogbmV3IEZvcm1Hcm91cCh7IHN0cmVldDogbmV3IEZvcm1Db250cm9sKCkgfSkKICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogVGhlIHBhdGggdG8gdGhlICdzdHJlZXQnIGNvbnRyb2wgZnJvbSB0aGUgcm9vdCBmb3JtIHdvdWxkIGJlICdhZGRyZXNzJyAtPiAnc3RyZWV0Jy4KICAgICAqCiAgICAgKiBJdCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhpcyBtZXRob2QgaW4gb25lIG9mIHR3byBmb3JtYXRzOgogICAgICoKICAgICAqIDEuIEFuIGFycmF5IG9mIHN0cmluZyBjb250cm9sIG5hbWVzLCBlLmcuIGBbJ2FkZHJlc3MnLCAnc3RyZWV0J11gCiAgICAgKiAxLiBBIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiBjb250cm9sIG5hbWVzIGluIG9uZSBzdHJpbmcsIGUuZy4gYCdhZGRyZXNzLnN0cmVldCdgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBlcnJvckNvZGUgVGhlIGNvZGUgb2YgdGhlIGVycm9yIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gez89fSBwYXRoIEEgbGlzdCBvZiBjb250cm9sIG5hbWVzIHRoYXQgZGVzaWduYXRlcyBob3cgdG8gbW92ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRyb2wKICAgICAqIHRvIHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIGJlIHF1ZXJpZWQgZm9yIGVycm9ycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBlcnJvciBkYXRhIGZvciB0aGF0IHBhcnRpY3VsYXIgZXJyb3IuIElmIHRoZSBjb250cm9sIG9yIGVycm9yIGlzIG5vdCBwcmVzZW50LAogICAgICogbnVsbCBpcyByZXR1cm5lZC4KICAgICAqLwogICAgZ2V0RXJyb3IoZXJyb3JDb2RlLCBwYXRoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRyb2wgPSBwYXRoID8gdGhpcy5nZXQocGF0aCkgOiB0aGlzOwogICAgICAgIHJldHVybiBjb250cm9sICYmIGNvbnRyb2wuZXJyb3JzID8gY29udHJvbC5lcnJvcnNbZXJyb3JDb2RlXSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoIGhhcyB0aGUgZXJyb3Igc3BlY2lmaWVkLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGBGb3JtR3JvdXBgOgogICAgICoKICAgICAqIGBgYAogICAgICogZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICogICBhZGRyZXNzOiBuZXcgRm9ybUdyb3VwKHsgc3RyZWV0OiBuZXcgRm9ybUNvbnRyb2woKSB9KQogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgcGF0aCB0byB0aGUgJ3N0cmVldCcgY29udHJvbCBmcm9tIHRoZSByb290IGZvcm0gd291bGQgYmUgJ2FkZHJlc3MnIC0+ICdzdHJlZXQnLgogICAgICoKICAgICAqIEl0IGNhbiBiZSBwcm92aWRlZCB0byB0aGlzIG1ldGhvZCBpbiBvbmUgb2YgdHdvIGZvcm1hdHM6CiAgICAgKgogICAgICogMS4gQW4gYXJyYXkgb2Ygc3RyaW5nIGNvbnRyb2wgbmFtZXMsIGUuZy4gYFsnYWRkcmVzcycsICdzdHJlZXQnXWAKICAgICAqIDEuIEEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgaW4gb25lIHN0cmluZywgZS5nLiBgJ2FkZHJlc3Muc3RyZWV0J2AKICAgICAqCiAgICAgKiBJZiBubyBwYXRoIGlzIGdpdmVuLCB0aGlzIG1ldGhvZCBjaGVja3MgZm9yIHRoZSBlcnJvciBvbiB0aGUgY3VycmVudCBjb250cm9sLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZXJyb3JDb2RlIFRoZSBjb2RlIG9mIHRoZSBlcnJvciB0byBjaGVjawogICAgICogQHBhcmFtIHs/PX0gcGF0aCBBIGxpc3Qgb2YgY29udHJvbCBuYW1lcyB0aGF0IGRlc2lnbmF0ZXMgaG93IHRvIG1vdmUgZnJvbSB0aGUgY3VycmVudCBjb250cm9sCiAgICAgKiB0byB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGZvciBlcnJvcnMuCiAgICAgKgogICAgICogQHJldHVybiB7P30gd2hldGhlciB0aGUgZ2l2ZW4gZXJyb3IgaXMgcHJlc2VudCBpbiB0aGUgY29udHJvbCBhdCB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgZmFsc2UgaXMgcmV0dXJuZWQuCiAgICAgKi8KICAgIGhhc0Vycm9yKGVycm9yQ29kZSwgcGF0aCkgewogICAgICAgIHJldHVybiAhIXRoaXMuZ2V0RXJyb3IoZXJyb3JDb2RlLCBwYXRoKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSB0b3AtbGV2ZWwgYW5jZXN0b3Igb2YgdGhpcyBjb250cm9sLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJvb3QoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB4ID0gdGhpczsKICAgICAgICB3aGlsZSAoeC5fcGFyZW50KSB7CiAgICAgICAgICAgIHggPSB4Ll9wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB4OwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGVtaXRFdmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZUNvbnRyb2xzRXJyb3JzKGVtaXRFdmVudCkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5zdGF0dXMgPSB0aGlzLl9jYWxjdWxhdGVTdGF0dXMoKTsKICAgICAgICBpZiAoZW1pdEV2ZW50KSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5zdGF0dXNDaGFuZ2VzKSkpLmVtaXQodGhpcy5zdGF0dXMpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoZW1pdEV2ZW50KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbml0T2JzZXJ2YWJsZXMoKSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYWxjdWxhdGVTdGF0dXMoKSB7CiAgICAgICAgaWYgKHRoaXMuX2FsbENvbnRyb2xzRGlzYWJsZWQoKSkKICAgICAgICAgICAgcmV0dXJuIERJU0FCTEVEOwogICAgICAgIGlmICh0aGlzLmVycm9ycykKICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhQRU5ESU5HKSkKICAgICAgICAgICAgcmV0dXJuIFBFTkRJTkc7CiAgICAgICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhJTlZBTElEKSkKICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgcmV0dXJuIFZBTElEOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHN0YXR1cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXMpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYW55Q29udHJvbHMoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuc3RhdHVzID09PSBzdGF0dXMpKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FueUNvbnRyb2xzRGlydHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FueUNvbnRyb2xzKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sKSA9PiBjb250cm9sLmRpcnR5KSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbnlDb250cm9sc1RvdWNoZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FueUNvbnRyb2xzKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sKSA9PiBjb250cm9sLnRvdWNoZWQpKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/PX0gb3B0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZVByaXN0aW5lKG9wdHMgPSB7fSkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5wcmlzdGluZSA9ICF0aGlzLl9hbnlDb250cm9sc0RpcnR5KCk7CiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikgewogICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKG9wdHMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/PX0gb3B0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZVRvdWNoZWQob3B0cyA9IHt9KSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnRvdWNoZWQgPSB0aGlzLl9hbnlDb250cm9sc1RvdWNoZWQoKTsKICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlVG91Y2hlZChvcHRzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gZm9ybVN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNCb3hlZFZhbHVlKGZvcm1TdGF0ZSkgewogICAgICAgIHJldHVybiB0eXBlb2YgZm9ybVN0YXRlID09PSAnb2JqZWN0JyAmJiBmb3JtU3RhdGUgIT09IG51bGwgJiYKICAgICAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5sZW5ndGggPT09IDIgJiYgJ3ZhbHVlJyBpbiBmb3JtU3RhdGUgJiYgJ2Rpc2FibGVkJyBpbiBmb3JtU3RhdGU7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZShmbikgewogICAgICAgIHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSA9IGZuOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez89fSBvcHRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VXBkYXRlU3RyYXRlZ3kob3B0cykgewogICAgICAgIGlmIChpc09wdGlvbnNPYmoob3B0cykgJiYgKCgvKiogQHR5cGUgez99ICovIChvcHRzKSkpLnVwZGF0ZU9uICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlT24gPSAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovIChvcHRzKSkpLnVwZGF0ZU9uKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayB0byBzZWUgaWYgcGFyZW50IGhhcyBiZWVuIG1hcmtlZCBhcnRpZmljaWFsbHkgZGlydHkuCiAgICAgKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Pz19IG9ubHlTZWxmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcGFyZW50TWFya2VkRGlydHkob25seVNlbGYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50RGlydHkgPSB0aGlzLl9wYXJlbnQgJiYgdGhpcy5fcGFyZW50LmRpcnR5OwogICAgICAgIHJldHVybiAhb25seVNlbGYgJiYgcGFyZW50RGlydHkgJiYgIXRoaXMuX3BhcmVudC5fYW55Q29udHJvbHNEaXJ0eSgpOwogICAgfQp9Ci8qKgogKiBUcmFja3MgdGhlIHZhbHVlIGFuZCB2YWxpZGF0aW9uIHN0YXR1cyBvZiBhbiBpbmRpdmlkdWFsIGZvcm0gY29udHJvbC4KICoKICogVGhpcyBpcyBvbmUgb2YgdGhlIHRocmVlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBBbmd1bGFyIGZvcm1zLCBhbG9uZyB3aXRoCiAqIGBGb3JtR3JvdXBgIGFuZCBgRm9ybUFycmF5YC4gSXQgZXh0ZW5kcyB0aGUgYEFic3RyYWN0Q29udHJvbGAgY2xhc3MgdGhhdAogKiBpbXBsZW1lbnRzIG1vc3Qgb2YgdGhlIGJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgYWNjZXNzaW5nIHRoZSB2YWx1ZSwgdmFsaWRhdGlvbiBzdGF0dXMsCiAqIHVzZXIgaW50ZXJhY3Rpb25zIGFuZCBldmVudHMuIFNlZSBbdXNhZ2UgZXhhbXBsZXMgYmVsb3ddKCN1c2FnZS1ub3RlcykuCiAqCiAqIEBzZWUgYEFic3RyYWN0Q29udHJvbGAKICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKQogKiBAc2VlIFtVc2FnZSBOb3Rlc10oI3VzYWdlLW5vdGVzKQogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEluaXRpYWxpemluZyBGb3JtIENvbnRyb2xzCiAqCiAqIEluc3RhbnRpYXRlIGEgYEZvcm1Db250cm9sYCwgd2l0aCBhbiBpbml0aWFsIHZhbHVlLgogKgogKiBgYGB0cwogKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdzb21lIHZhbHVlJyk7CiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAgICAgLy8gJ3NvbWUgdmFsdWUnCiAqIGBgYAogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2wgd2l0aCBhIGZvcm0gc3RhdGUgb2JqZWN0LiBUaGUgYHZhbHVlYAogKiBhbmQgYGRpc2FibGVkYCBrZXlzIGFyZSByZXF1aXJlZCBpbiB0aGlzIGNhc2UuCiAqCiAqIGBgYHRzCiAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJ24vYScsIGRpc2FibGVkOiB0cnVlIH0pOwogKiBjb25zb2xlLmxvZyhjb250cm9sLnZhbHVlKTsgICAgIC8vICduL2EnCiAqIGNvbnNvbGUubG9nKGNvbnRyb2wuc3RhdHVzKTsgICAgLy8gJ0RJU0FCTEVEJwogKiBgYGAKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGluaXRpYWxpemVzIHRoZSBjb250cm9sIHdpdGggYSBzeW5jIHZhbGlkYXRvci4KICoKICogYGBgdHMKICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7CiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAgICAgIC8vICcnCiAqIGNvbnNvbGUubG9nKGNvbnRyb2wuc3RhdHVzKTsgICAgIC8vICdJTlZBTElEJwogKiBgYGAKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGluaXRpYWxpemVzIHRoZSBjb250cm9sIHVzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LgogKgogKiBgYGB0cwogKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7CiAqICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsCiAqICAgIGFzeW5jVmFsaWRhdG9yczogbXlBc3luY1ZhbGlkYXRvcgogKiB9KTsKICogYGBgCiAqCiAqICMjIyBDb25maWd1cmUgdGhlIGNvbnRyb2wgdG8gdXBkYXRlIG9uIGEgYmx1ciBldmVudAogKgogKiBTZXQgdGhlIGB1cGRhdGVPbmAgb3B0aW9uIHRvIGAnYmx1cidgIHRvIHVwZGF0ZSBvbiB0aGUgYmx1ciBgZXZlbnRgLgogKgogKiBgYGB0cwogKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IHVwZGF0ZU9uOiAnYmx1cicgfSk7CiAqIGBgYAogKgogKiAjIyMgQ29uZmlndXJlIHRoZSBjb250cm9sIHRvIHVwZGF0ZSBvbiBhIHN1Ym1pdCBldmVudAogKgogKiBTZXQgdGhlIGB1cGRhdGVPbmAgb3B0aW9uIHRvIGAnc3VibWl0J2AgdG8gdXBkYXRlIG9uIGEgc3VibWl0IGBldmVudGAuCiAqCiAqIGBgYHRzCiAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgdXBkYXRlT246ICdzdWJtaXQnIH0pOwogKiBgYGAKICoKICogIyMjIFJlc2V0IHRoZSBjb250cm9sIGJhY2sgdG8gYW4gaW5pdGlhbCB2YWx1ZQogKgogKiBZb3UgcmVzZXQgdG8gYSBzcGVjaWZpYyBmb3JtIHN0YXRlIGJ5IHBhc3NpbmcgdGhyb3VnaCBhIHN0YW5kYWxvbmUKICogdmFsdWUgb3IgYSBmb3JtIHN0YXRlIG9iamVjdCB0aGF0IGNvbnRhaW5zIGJvdGggYSB2YWx1ZSBhbmQgYSBkaXNhYmxlZCBzdGF0ZQogKiAodGhlc2UgYXJlIHRoZSBvbmx5IHR3byBwcm9wZXJ0aWVzIHRoYXQgY2Fubm90IGJlIGNhbGN1bGF0ZWQpLgogKgogKiBgYGB0cwogKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdOYW5jeScpOwogKgogKiBjb25zb2xlLmxvZyhjb250cm9sLnZhbHVlKTsgLy8gJ05hbmN5JwogKgogKiBjb250cm9sLnJlc2V0KCdEcmV3Jyk7CiAqCiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnRHJldycKICogYGBgCiAqCiAqICMjIyBSZXNldCB0aGUgY29udHJvbCBiYWNrIHRvIGFuIGluaXRpYWwgdmFsdWUgYW5kIGRpc2FibGVkCiAqCiAqIGBgYAogKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdOYW5jeScpOwogKgogKiBjb25zb2xlLmxvZyhjb250cm9sLnZhbHVlKTsgLy8gJ05hbmN5JwogKiBjb25zb2xlLmxvZyhjb250cm9sLnN0YXR1cyk7IC8vICdWQUxJRCcKICoKICogY29udHJvbC5yZXNldCh7IHZhbHVlOiAnRHJldycsIGRpc2FibGVkOiB0cnVlIH0pOwogKgogKiBjb25zb2xlLmxvZyhjb250cm9sLnZhbHVlKTsgLy8gJ0RyZXcnCiAqIGNvbnNvbGUubG9nKGNvbnRyb2wuc3RhdHVzKTsgLy8gJ0RJU0FCTEVEJwogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEZvcm1Db250cm9sIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sIHsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBgRm9ybUNvbnRyb2xgIGluc3RhbmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IGZvcm1TdGF0ZSBJbml0aWFsaXplcyB0aGUgY29udHJvbCB3aXRoIGFuIGluaXRpYWwgdmFsdWUsCiAgICAgKiBvciBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkaXNhYmxlZCBzdGF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSB2YWxpZGF0b3JPck9wdHMgQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mCiAgICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zIHZhbGlkYXRpb24gZnVuY3Rpb25zCiAgICAgKiBhbmQgYSB2YWxpZGF0aW9uIHRyaWdnZXIuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gYXN5bmNWYWxpZGF0b3IgQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMKICAgICAqCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGZvcm1TdGF0ZSA9IG51bGwsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpIHsKICAgICAgICBzdXBlcihjb2VyY2VUb1ZhbGlkYXRvcih2YWxpZGF0b3JPck9wdHMpLCBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yLCB2YWxpZGF0b3JPck9wdHMpKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBbXTsKICAgICAgICB0aGlzLl9hcHBseUZvcm1TdGF0ZShmb3JtU3RhdGUpOwogICAgICAgIHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KHZhbGlkYXRvck9yT3B0cyk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICAgICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgYSBuZXcgdmFsdWUgZm9yIHRoZSBmb3JtIGNvbnRyb2wuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgY29udHJvbC4KICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMKICAgICAqIGFuZCBlbWl0cyBldmVudHMgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUge1xAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eQogICAgICogdXBkYXRlVmFsdWVBbmRWYWxpZGl0eX0gbWV0aG9kLgogICAgICoKICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQgaXMKICAgICAqIGZhbHNlLgogICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBpcyB1cGRhdGVkLgogICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICogKiBgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlYDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAgKHRoZSBkZWZhdWx0KSwgZWFjaCBjaGFuZ2UgdHJpZ2dlcnMgYW4KICAgICAqIGBvbkNoYW5nZWAgZXZlbnQgdG8KICAgICAqIHVwZGF0ZSB0aGUgdmlldy4KICAgICAqICogYGVtaXRWaWV3VG9Nb2RlbENoYW5nZWA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgZWFjaCBjaGFuZ2UgdHJpZ2dlcnMgYW4KICAgICAqIGBuZ01vZGVsQ2hhbmdlYAogICAgICogZXZlbnQgdG8gdXBkYXRlIHRoZSBtb2RlbC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlID0gdmFsdWU7CiAgICAgICAgaWYgKHRoaXMuX29uQ2hhbmdlLmxlbmd0aCAmJiBvcHRpb25zLmVtaXRNb2RlbFRvVmlld0NoYW5nZSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjaGFuZ2VGbikgPT4gY2hhbmdlRm4odGhpcy52YWx1ZSwgb3B0aW9ucy5lbWl0Vmlld1RvTW9kZWxDaGFuZ2UgIT09IGZhbHNlKSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFBhdGNoZXMgdGhlIHZhbHVlIG9mIGEgY29udHJvbC4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBhcyB7XEBsaW5rIEZvcm1Db250cm9sI3NldFZhbHVlIHNldFZhbHVlfSBhdCB0aGlzIGxldmVsLgogICAgICogSXQgZXhpc3RzIGZvciBzeW1tZXRyeSB3aXRoIHtcQGxpbmsgRm9ybUdyb3VwI3BhdGNoVmFsdWUgcGF0Y2hWYWx1ZX0gb24gYEZvcm1Hcm91cHNgIGFuZAogICAgICogYEZvcm1BcnJheXNgLCB3aGVyZSBpdCBkb2VzIGJlaGF2ZSBkaWZmZXJlbnRseS4KICAgICAqCiAgICAgKiBAc2VlIGBzZXRWYWx1ZWAgZm9yIG9wdGlvbnMKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhdGNoVmFsdWUodmFsdWUsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUsIG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGZvcm0gY29udHJvbCwgbWFya2luZyBpdCBgcHJpc3RpbmVgIGFuZCBgdW50b3VjaGVkYCwgYW5kIHNldHRpbmcKICAgICAqIHRoZSB2YWx1ZSB0byBudWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IGZvcm1TdGF0ZSBSZXNldHMgdGhlIGNvbnRyb2wgd2l0aCBhbiBpbml0aWFsIHZhbHVlLAogICAgICogb3IgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgaW5pdGlhbCB2YWx1ZSBhbmQgZGlzYWJsZWQgc3RhdGUuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcwogICAgICogYW5kIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAqCiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzCiAgICAgKiBmYWxzZS4KICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZAogICAgICogYHZhbHVlQ2hhbmdlc2AKICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgaXMgcmVzZXQuCiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQoZm9ybVN0YXRlID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgdGhpcy5fYXBwbHlGb3JtU3RhdGUoZm9ybVN0YXRlKTsKICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKG9wdGlvbnMpOwogICAgICAgIHRoaXMubWFya0FzVW50b3VjaGVkKG9wdGlvbnMpOwogICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZSwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5fcGVuZGluZ0NoYW5nZSA9IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmFsdWUoKSB7IH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBjb25kaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbnlDb250cm9scyhjb25kaXRpb24pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbGxDb250cm9sc0Rpc2FibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBjaGFuZ2UgZXZlbnRzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5fb25DaGFuZ2UucHVzaChmbik7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jbGVhckNoYW5nZUZucygpIHsKICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IFtdOwogICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UgPSBbXTsKICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBkaXNhYmxlZCBldmVudHMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGRpc2FibGVkIHN0YXR1cyBjaGFuZ2VzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5fb25EaXNhYmxlZENoYW5nZS5wdXNoKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBjYgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2ZvckVhY2hDaGlsZChjYikgeyB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zeW5jUGVuZGluZ0NvbnRyb2xzKCkgewogICAgICAgIGlmICh0aGlzLnVwZGF0ZU9uID09PSAnc3VibWl0JykgewogICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0RpcnR5KQogICAgICAgICAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpOwogICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1RvdWNoZWQpCiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fcGVuZGluZ1ZhbHVlLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBmb3JtU3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUZvcm1TdGF0ZShmb3JtU3RhdGUpIHsKICAgICAgICBpZiAodGhpcy5faXNCb3hlZFZhbHVlKGZvcm1TdGF0ZSkpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlID0gZm9ybVN0YXRlLnZhbHVlOwogICAgICAgICAgICBmb3JtU3RhdGUuZGlzYWJsZWQgPyB0aGlzLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KSA6CiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlID0gZm9ybVN0YXRlOwogICAgICAgIH0KICAgIH0KfQovKioKICogVHJhY2tzIHRoZSB2YWx1ZSBhbmQgdmFsaWRpdHkgc3RhdGUgb2YgYSBncm91cCBvZiBgRm9ybUNvbnRyb2xgIGluc3RhbmNlcy4KICoKICogQSBgRm9ybUdyb3VwYCBhZ2dyZWdhdGVzIHRoZSB2YWx1ZXMgb2YgZWFjaCBjaGlsZCBgRm9ybUNvbnRyb2xgIGludG8gb25lIG9iamVjdCwKICogd2l0aCBlYWNoIGNvbnRyb2wgbmFtZSBhcyB0aGUga2V5LiAgSXQgY2FsY3VsYXRlcyBpdHMgc3RhdHVzIGJ5IHJlZHVjaW5nIHRoZSBzdGF0dXMgdmFsdWVzCiAqIG9mIGl0cyBjaGlsZHJlbi4gRm9yIGV4YW1wbGUsIGlmIG9uZSBvZiB0aGUgY29udHJvbHMgaW4gYSBncm91cCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlCiAqIGdyb3VwIGJlY29tZXMgaW52YWxpZC4KICoKICogYEZvcm1Hcm91cGAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhciwKICogYWxvbmcgd2l0aCBgRm9ybUNvbnRyb2xgIGFuZCBgRm9ybUFycmF5YC4KICoKICogV2hlbiBpbnN0YW50aWF0aW5nIGEgYEZvcm1Hcm91cGAsIHBhc3MgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkIGNvbnRyb2xzIGFzIHRoZSBmaXJzdAogKiBhcmd1bWVudC4gVGhlIGtleSBmb3IgZWFjaCBjaGlsZCByZWdpc3RlcnMgdGhlIG5hbWUgZm9yIHRoZSBjb250cm9sLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIENyZWF0ZSBhIGZvcm0gZ3JvdXAgd2l0aCAyIGNvbnRyb2xzCiAqCiAqIGBgYAogKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAqICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCgnTmFuY3knLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgyKSksCiAqICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCdEcmV3JyksCiAqIH0pOwogKgogKiBjb25zb2xlLmxvZyhmb3JtLnZhbHVlKTsgICAvLyB7Zmlyc3Q6ICdOYW5jeScsIGxhc3Q7ICdEcmV3J30KICogY29uc29sZS5sb2coZm9ybS5zdGF0dXMpOyAgLy8gJ1ZBTElEJwogKiBgYGAKICoKICogIyMjIENyZWF0ZSBhIGZvcm0gZ3JvdXAgd2l0aCBhIGdyb3VwLWxldmVsIHZhbGlkYXRvcgogKgogKiBZb3UgaW5jbHVkZSBncm91cC1sZXZlbCB2YWxpZGF0b3JzIGFzIHRoZSBzZWNvbmQgYXJnLCBvciBncm91cC1sZXZlbCBhc3luYwogKiB2YWxpZGF0b3JzIGFzIHRoZSB0aGlyZCBhcmcuIFRoZXNlIGNvbWUgaW4gaGFuZHkgd2hlbiB5b3Ugd2FudCB0byBwZXJmb3JtIHZhbGlkYXRpb24KICogdGhhdCBjb25zaWRlcnMgdGhlIHZhbHVlIG9mIG1vcmUgdGhhbiBvbmUgY2hpbGQgY29udHJvbC4KICoKICogYGBgCiAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICogICBwYXNzd29yZDogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgyKSksCiAqICAgcGFzc3dvcmRDb25maXJtOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDIpKSwKICogfSwgcGFzc3dvcmRNYXRjaFZhbGlkYXRvcik7CiAqCiAqCiAqIGZ1bmN0aW9uIHBhc3N3b3JkTWF0Y2hWYWxpZGF0b3IoZzogRm9ybUdyb3VwKSB7CiAqICAgIHJldHVybiBnLmdldCgncGFzc3dvcmQnKS52YWx1ZSA9PT0gZy5nZXQoJ3Bhc3N3b3JkQ29uZmlybScpLnZhbHVlCiAqICAgICAgID8gbnVsbCA6IHsnbWlzbWF0Y2gnOiB0cnVlfTsKICogfQogKiBgYGAKICoKICogTGlrZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlcywgeW91IGNob29zZSB0byBwYXNzIGluCiAqIHZhbGlkYXRvcnMgYW5kIGFzeW5jIHZhbGlkYXRvcnMgYXMgcGFydCBvZiBhbiBvcHRpb25zIG9iamVjdC4KICoKICogYGBgCiAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICogICBwYXNzd29yZDogbmV3IEZvcm1Db250cm9sKCcnKQogKiAgIHBhc3N3b3JkQ29uZmlybTogbmV3IEZvcm1Db250cm9sKCcnKQogKiB9LCB7IHZhbGlkYXRvcnM6IHBhc3N3b3JkTWF0Y2hWYWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yczogb3RoZXJWYWxpZGF0b3IgfSk7CiAqIGBgYAogKgogKiAjIyMgU2V0IHRoZSB1cGRhdGVPbiBwcm9wZXJ0eSBmb3IgYWxsIGNvbnRyb2xzIGluIGEgZm9ybSBncm91cAogKgogKiBUaGUgb3B0aW9ucyBvYmplY3QgaXMgdXNlZCB0byBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIGNoaWxkCiAqIGNvbnRyb2wncyBgdXBkYXRlT25gIHByb3BlcnR5LiBJZiB5b3Ugc2V0IGB1cGRhdGVPbmAgdG8gYCdibHVyJ2AgYXQgdGhlCiAqIGdyb3VwIGxldmVsLCBhbGwgY2hpbGQgY29udHJvbHMgZGVmYXVsdCB0byAnYmx1cicsIHVubGVzcyB0aGUgY2hpbGQKICogaGFzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGEgZGlmZmVyZW50IGB1cGRhdGVPbmAgdmFsdWUuCiAqCiAqIGBgYHRzCiAqIGNvbnN0IGMgPSBuZXcgRm9ybUdyb3VwKHsKICogICBvbmU6IG5ldyBGb3JtQ29udHJvbCgpCiAqIH0sIHsgdXBkYXRlT246ICdibHVyJyB9KTsKICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBGb3JtR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2wgewogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IGBGb3JtR3JvdXBgIGluc3RhbmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gY29udHJvbHMgQSBjb2xsZWN0aW9uIG9mIGNoaWxkIGNvbnRyb2xzLiBUaGUga2V5IGZvciBlYWNoIGNoaWxkIGlzIHRoZSBuYW1lCiAgICAgKiB1bmRlciB3aGljaCBpdCBpcyByZWdpc3RlcmVkLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IHZhbGlkYXRvck9yT3B0cyBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YKICAgICAqIHN1Y2ggZnVuY3Rpb25zLCBvciBhbiBgQWJzdHJhY3RDb250cm9sT3B0aW9uc2Agb2JqZWN0IHRoYXQgY29udGFpbnMgdmFsaWRhdGlvbiBmdW5jdGlvbnMKICAgICAqIGFuZCBhIHZhbGlkYXRpb24gdHJpZ2dlci4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBhc3luY1ZhbGlkYXRvciBBIHNpbmdsZSBhc3luYyB2YWxpZGF0b3Igb3IgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9ucwogICAgICoKICAgICAqLwogICAgY29uc3RydWN0b3IoY29udHJvbHMsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpIHsKICAgICAgICBzdXBlcihjb2VyY2VUb1ZhbGlkYXRvcih2YWxpZGF0b3JPck9wdHMpLCBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yLCB2YWxpZGF0b3JPck9wdHMpKTsKICAgICAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbHM7CiAgICAgICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7CiAgICAgICAgdGhpcy5fc2V0VXBkYXRlU3RyYXRlZ3kodmFsaWRhdG9yT3JPcHRzKTsKICAgICAgICB0aGlzLl9zZXRVcENvbnRyb2xzKCk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGNvbnRyb2wgd2l0aCB0aGUgZ3JvdXAncyBsaXN0IG9mIGNvbnRyb2xzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHVwZGF0ZSB0aGUgdmFsdWUgb3IgdmFsaWRpdHkgb2YgdGhlIGNvbnRyb2wuCiAgICAgKiBVc2Uge1xAbGluayBGb3JtR3JvdXAjYWRkQ29udHJvbCBhZGRDb250cm9sfSBpbnN0ZWFkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgY29udHJvbCBuYW1lIHRvIHJlZ2lzdGVyIGluIHRoZSBjb2xsZWN0aW9uCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgUHJvdmlkZXMgdGhlIGNvbnRyb2wgZm9yIHRoZSBnaXZlbiBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3RlckNvbnRyb2wobmFtZSwgY29udHJvbCkgewogICAgICAgIGlmICh0aGlzLmNvbnRyb2xzW25hbWVdKQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sc1tuYW1lXTsKICAgICAgICB0aGlzLmNvbnRyb2xzW25hbWVdID0gY29udHJvbDsKICAgICAgICBjb250cm9sLnNldFBhcmVudCh0aGlzKTsKICAgICAgICBjb250cm9sLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpOwogICAgICAgIHJldHVybiBjb250cm9sOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBjb250cm9sIHRvIHRoaXMgZ3JvdXAuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgYWxzbyB1cGRhdGVzIHRoZSB2YWx1ZSBhbmQgdmFsaWRpdHkgb2YgdGhlIGNvbnRyb2wuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuYW1lIFRoZSBjb250cm9sIG5hbWUgdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgUHJvdmlkZXMgdGhlIGNvbnRyb2wgZm9yIHRoZSBnaXZlbiBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRDb250cm9sKG5hbWUsIGNvbnRyb2wpIHsKICAgICAgICB0aGlzLnJlZ2lzdGVyQ29udHJvbChuYW1lLCBjb250cm9sKTsKICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTsKICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGEgY29udHJvbCBmcm9tIHRoaXMgZ3JvdXAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuYW1lIFRoZSBjb250cm9sIG5hbWUgdG8gcmVtb3ZlIGZyb20gdGhlIGNvbGxlY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUNvbnRyb2wobmFtZSkgewogICAgICAgIGlmICh0aGlzLmNvbnRyb2xzW25hbWVdKQogICAgICAgICAgICB0aGlzLmNvbnRyb2xzW25hbWVdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pKTsKICAgICAgICBkZWxldGUgKHRoaXMuY29udHJvbHNbbmFtZV0pOwogICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOwogICAgICAgIHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGNvbnRyb2wuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuYW1lIFRoZSBjb250cm9sIG5hbWUgdG8gcmVwbGFjZSBpbiB0aGUgY29sbGVjdGlvbgogICAgICogQHBhcmFtIHs/fSBjb250cm9sIFByb3ZpZGVzIHRoZSBjb250cm9sIGZvciB0aGUgZ2l2ZW4gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0Q29udHJvbChuYW1lLCBjb250cm9sKSB7CiAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbbmFtZV0pCiAgICAgICAgICAgIHRoaXMuY29udHJvbHNbbmFtZV0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSkpOwogICAgICAgIGRlbGV0ZSAodGhpcy5jb250cm9sc1tuYW1lXSk7CiAgICAgICAgaWYgKGNvbnRyb2wpCiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDb250cm9sKG5hbWUsIGNvbnRyb2wpOwogICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOwogICAgICAgIHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFuIGVuYWJsZWQgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBncm91cC4KICAgICAqCiAgICAgKiBSZXBvcnRzIGZhbHNlIGZvciBkaXNhYmxlZCBjb250cm9scy4gSWYgeW91J2QgbGlrZSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBncm91cAogICAgICogb25seSwgdXNlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI2dldCBnZXR9IGluc3RlYWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sTmFtZSBUaGUgY29udHJvbCBuYW1lIHRvIGNoZWNrIGZvciBleGlzdGVuY2UgaW4gdGhlIGNvbGxlY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBmYWxzZSBmb3IgZGlzYWJsZWQgY29udHJvbHMsIHRydWUgb3RoZXJ3aXNlLgogICAgICovCiAgICBjb250YWlucyhjb250cm9sTmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGNvbnRyb2xOYW1lKSAmJiB0aGlzLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS5lbmFibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1Hcm91cGAuIEl0IGFjY2VwdHMgYW4gb2JqZWN0IHRoYXQgbWF0Y2hlcwogICAgICogdGhlIHN0cnVjdHVyZSBvZiB0aGUgZ3JvdXAsIHdpdGggY29udHJvbCBuYW1lcyBhcyBrZXlzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIFNldCB0aGUgY29tcGxldGUgdmFsdWUgZm9yIHRoZSBmb3JtIGdyb3VwCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woKSwKICAgICAqICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCkKICAgICAqIH0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogbnVsbCwgbGFzdDogbnVsbH0KICAgICAqCiAgICAgKiBmb3JtLnNldFZhbHVlKHtmaXJzdDogJ05hbmN5JywgbGFzdDogJ0RyZXcnfSk7CiAgICAgKiBjb25zb2xlLmxvZyhmb3JtLnZhbHVlKTsgICAvLyB7Zmlyc3Q6ICdOYW5jeScsIGxhc3Q6ICdEcmV3J30KICAgICAqIGBgYAogICAgICoKICAgICAqIEB0aHJvd3MgV2hlbiBzdHJpY3QgY2hlY2tzIGZhaWwsIHN1Y2ggYXMgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjb250cm9sCiAgICAgKiB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgaWYgeW91IGV4Y2x1ZGUgYSB2YWx1ZSBvZiBhIGNvbnRyb2wgdGhhdCBkb2VzIGV4aXN0LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvbnRyb2wgdGhhdCBtYXRjaGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdyb3VwLgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcwogICAgICogYW5kIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUge1xAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eQogICAgICogdXBkYXRlVmFsdWVBbmRWYWxpZGl0eX0gbWV0aG9kLgogICAgICoKICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQgaXMKICAgICAqIGZhbHNlLgogICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBpcyB1cGRhdGVkLgogICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0VmFsdWUodmFsdWUsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHRoaXMuX2NoZWNrQWxsVmFsdWVzUHJlc2VudCh2YWx1ZSk7CiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmFtZSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3Rocm93SWZDb250cm9sTWlzc2luZyhuYW1lKTsKICAgICAgICAgICAgdGhpcy5jb250cm9sc1tuYW1lXS5zZXRWYWx1ZSh2YWx1ZVtuYW1lXSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRpb25zLmVtaXRFdmVudCB9KTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBQYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1Hcm91cGAuIEl0IGFjY2VwdHMgYW4gb2JqZWN0IHdpdGggY29udHJvbAogICAgICogbmFtZXMgYXMga2V5cywgYW5kIGRvZXMgaXRzIGJlc3QgdG8gbWF0Y2ggdGhlIHZhbHVlcyB0byB0aGUgY29ycmVjdCBjb250cm9scwogICAgICogaW4gdGhlIGdyb3VwLgogICAgICoKICAgICAqIEl0IGFjY2VwdHMgYm90aCBzdXBlci1zZXRzIGFuZCBzdWItc2V0cyBvZiB0aGUgZ3JvdXAgd2l0aG91dCB0aHJvd2luZyBhbiBlcnJvci4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBQYXRjaCB0aGUgdmFsdWUgZm9yIGEgZm9ybSBncm91cAogICAgICoKICAgICAqIGBgYAogICAgICogY29uc3QgZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICogICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCgpLAogICAgICogICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCkKICAgICAqIH0pOwogICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAgLy8ge2ZpcnN0OiBudWxsLCBsYXN0OiBudWxsfQogICAgICoKICAgICAqIGZvcm0ucGF0Y2hWYWx1ZSh7Zmlyc3Q6ICdOYW5jeSd9KTsKICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogJ05hbmN5JywgbGFzdDogbnVsbH0KICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZ3JvdXAuCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZAogICAgICogZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSB2YWx1ZSBpcyBwYXRjaGVkLgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzCiAgICAgKiB0cnVlLgogICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBpcyB1cGRhdGVkLgogICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCN1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5CiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwYXRjaFZhbHVlKHZhbHVlLCBvcHRpb25zID0ge30pIHsKICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuYW1lID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHNbbmFtZV0ucGF0Y2hWYWx1ZSh2YWx1ZVtuYW1lXSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRpb25zLmVtaXRFdmVudCB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2V0cyB0aGUgYEZvcm1Hcm91cGAsIG1hcmtzIGFsbCBkZXNjZW5kYW50cyBhcmUgbWFya2VkIGBwcmlzdGluZWAgYW5kIGB1bnRvdWNoZWRgLCBhbmQKICAgICAqIHRoZSB2YWx1ZSBvZiBhbGwgZGVzY2VuZGFudHMgdG8gbnVsbC4KICAgICAqCiAgICAgKiBZb3UgcmVzZXQgdG8gYSBzcGVjaWZpYyBmb3JtIHN0YXRlIGJ5IHBhc3NpbmcgaW4gYSBtYXAgb2Ygc3RhdGVzCiAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB5b3VyIGZvcm0sIHdpdGggY29udHJvbCBuYW1lcyBhcyBrZXlzLiBUaGUgc3RhdGUKICAgICAqIGlzIGEgc3RhbmRhbG9uZSB2YWx1ZSBvciBhIGZvcm0gc3RhdGUgb2JqZWN0IHdpdGggYm90aCBhIHZhbHVlIGFuZCBhIGRpc2FibGVkCiAgICAgKiBzdGF0dXMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIFJlc2V0IHRoZSBmb3JtIGdyb3VwIHZhbHVlcwogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ2ZpcnN0IG5hbWUnKSwKICAgICAqICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCdsYXN0IG5hbWUnKQogICAgICogfSk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAvLyB7Zmlyc3Q6ICdmaXJzdCBuYW1lJywgbGFzdDogJ2xhc3QgbmFtZSd9CiAgICAgKgogICAgICogZm9ybS5yZXNldCh7IGZpcnN0OiAnbmFtZScsIGxhc3Q6ICdsYXN0IG5hbWUnIH0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgLy8ge2ZpcnN0OiAnbmFtZScsIGxhc3Q6ICdsYXN0IG5hbWUnfQogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIFJlc2V0IHRoZSBmb3JtIGdyb3VwIHZhbHVlcyBhbmQgZGlzYWJsZWQgc3RhdHVzCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ2ZpcnN0IG5hbWUnKSwKICAgICAqICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCdsYXN0IG5hbWUnKQogICAgICogfSk7CiAgICAgKgogICAgICogZm9ybS5yZXNldCh7CiAgICAgKiAgIGZpcnN0OiB7dmFsdWU6ICduYW1lJywgZGlzYWJsZWQ6IHRydWV9LAogICAgICogICBsYXN0OiAnbGFzdCcKICAgICAqIH0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKHRoaXMuZm9ybS52YWx1ZSk7ICAvLyB7Zmlyc3Q6ICduYW1lJywgbGFzdDogJ2xhc3QgbmFtZSd9CiAgICAgKiBjb25zb2xlLmxvZyh0aGlzLmZvcm0uZ2V0KCdmaXJzdCcpLnN0YXR1cyk7ICAvLyAnRElTQUJMRUQnCiAgICAgKiBgYGAKICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFJlc2V0cyB0aGUgY29udHJvbCB3aXRoIGFuIGluaXRpYWwgdmFsdWUsCiAgICAgKiBvciBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkaXNhYmxlZCBzdGF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzCiAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIHdoZW4gdGhlIGdyb3VwIGlzIHJlc2V0LgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC4gRGVmYXVsdCBpcwogICAgICogZmFsc2UuCiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHJlc2V0LgogICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCN1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5CiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQodmFsdWUgPSB7fSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sLCBuYW1lKSA9PiB7CiAgICAgICAgICAgIGNvbnRyb2wucmVzZXQodmFsdWVbbmFtZV0sIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX3VwZGF0ZVByaXN0aW5lKG9wdGlvbnMpOwogICAgICAgIHRoaXMuX3VwZGF0ZVRvdWNoZWQob3B0aW9ucyk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgYWdncmVnYXRlIHZhbHVlIG9mIHRoZSBgRm9ybUdyb3VwYCwgaW5jbHVkaW5nIGFueSBkaXNhYmxlZCBjb250cm9scy4KICAgICAqCiAgICAgKiBSZXRyaWV2ZXMgYWxsIHZhbHVlcyByZWdhcmRsZXNzIG9mIGRpc2FibGVkIHN0YXR1cy4KICAgICAqIFRoZSBgdmFsdWVgIHByb3BlcnR5IGlzIHRoZSBiZXN0IHdheSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgYmVjYXVzZQogICAgICogaXQgZXhjbHVkZXMgZGlzYWJsZWQgY29udHJvbHMgaW4gdGhlIGBGb3JtR3JvdXBgLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UmF3VmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKHt9LCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhY2MKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChhY2MsIGNvbnRyb2wsIG5hbWUpID0+IHsKICAgICAgICAgICAgYWNjW25hbWVdID0gY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sID8gY29udHJvbC52YWx1ZSA6ICgoLyoqIEB0eXBlIHs/fSAqLyAoY29udHJvbCkpKS5nZXRSYXdWYWx1ZSgpOwogICAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N5bmNQZW5kaW5nQ29udHJvbHMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdWJ0cmVlVXBkYXRlZCA9IHRoaXMuX3JlZHVjZUNoaWxkcmVuKGZhbHNlLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVkCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHVwZGF0ZWQsIGNoaWxkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBjaGlsZC5fc3luY1BlbmRpbmdDb250cm9scygpID8gdHJ1ZSA6IHVwZGF0ZWQ7CiAgICAgICAgfSkpOwogICAgICAgIGlmIChzdWJ0cmVlVXBkYXRlZCkKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUgfSk7CiAgICAgICAgcmV0dXJuIHN1YnRyZWVVcGRhdGVkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90aHJvd0lmQ29udHJvbE1pc3NpbmcobmFtZSkgewogICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb250cm9scykubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgCiAgICAgICAgVGhlcmUgYXJlIG5vIGZvcm0gY29udHJvbHMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZ3JvdXAgeWV0LiAgSWYgeW91J3JlIHVzaW5nIG5nTW9kZWwsCiAgICAgICAgeW91IG1heSB3YW50IHRvIGNoZWNrIG5leHQgdGljayAoZS5nLiB1c2Ugc2V0VGltZW91dCkuCiAgICAgIGApOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuY29udHJvbHNbbmFtZV0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiAke25hbWV9LmApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBjYgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2ZvckVhY2hDaGlsZChjYikgewogICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gawogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgayA9PiBjYih0aGlzLmNvbnRyb2xzW2tdLCBrKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VXBDb250cm9scygpIHsKICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7CiAgICAgICAgICAgIGNvbnRyb2wuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmFsdWUoKSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0gdGhpcy5fcmVkdWNlVmFsdWUoKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBjb25kaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbnlDb250cm9scyhjb25kaXRpb24pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlcyA9IGZhbHNlOwogICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCwgbmFtZSkgPT4gewogICAgICAgICAgICByZXMgPSByZXMgfHwgKHRoaXMuY29udGFpbnMobmFtZSkgJiYgY29uZGl0aW9uKGNvbnRyb2wpKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlZHVjZVZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yZWR1Y2VDaGlsZHJlbih7fSwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWNjCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoYWNjLCBjb250cm9sLCBuYW1lKSA9PiB7CiAgICAgICAgICAgIGlmIChjb250cm9sLmVuYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgYWNjW25hbWVdID0gY29udHJvbC52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBpbml0VmFsdWUKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZWR1Y2VDaGlsZHJlbihpbml0VmFsdWUsIGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXMgPSBpbml0VmFsdWU7CiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sLCBuYW1lKSA9PiB7CiAgICAgICAgICAgIHJlcyA9IGZuKHJlcywgY29udHJvbCwgbmFtZSk7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbGxDb250cm9sc0Rpc2FibGVkKCkgewogICAgICAgIGZvciAoY29uc3QgY29udHJvbE5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5jb250cm9scykpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbY29udHJvbE5hbWVdLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jb250cm9scykubGVuZ3RoID4gMCB8fCB0aGlzLmRpc2FibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tBbGxWYWx1ZXNQcmVzZW50KHZhbHVlKSB7CiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sLCBuYW1lKSA9PiB7CiAgICAgICAgICAgIGlmICh2YWx1ZVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11c3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGZvcm0gY29udHJvbCB3aXRoIG5hbWU6ICcke25hbWV9Jy5gKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KfQovKioKICogVHJhY2tzIHRoZSB2YWx1ZSBhbmQgdmFsaWRpdHkgc3RhdGUgb2YgYW4gYXJyYXkgb2YgYEZvcm1Db250cm9sYCwKICogYEZvcm1Hcm91cGAgb3IgYEZvcm1BcnJheWAgaW5zdGFuY2VzLgogKgogKiBBIGBGb3JtQXJyYXlgIGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBvZiBlYWNoIGNoaWxkIGBGb3JtQ29udHJvbGAgaW50byBhbiBhcnJheS4KICogSXQgY2FsY3VsYXRlcyBpdHMgc3RhdHVzIGJ5IHJlZHVjaW5nIHRoZSBzdGF0dXMgdmFsdWVzIG9mIGl0cyBjaGlsZHJlbi4gRm9yIGV4YW1wbGUsIGlmIG9uZSBvZgogKiB0aGUgY29udHJvbHMgaW4gYSBgRm9ybUFycmF5YCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlIGFycmF5IGJlY29tZXMgaW52YWxpZC4KICoKICogYEZvcm1BcnJheWAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhciwKICogYWxvbmcgd2l0aCBgRm9ybUNvbnRyb2xgIGFuZCBgRm9ybUdyb3VwYC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBDcmVhdGUgYW4gYXJyYXkgb2YgZm9ybSBjb250cm9scwogKgogKiBgYGAKICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbCiAqICAgbmV3IEZvcm1Db250cm9sKCdOYW5jeScsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDIpKSwKICogICBuZXcgRm9ybUNvbnRyb2woJ0RyZXcnKSwKICogXSk7CiAqCiAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gWydOYW5jeScsICdEcmV3J10KICogY29uc29sZS5sb2coYXJyLnN0YXR1cyk7ICAvLyAnVkFMSUQnCiAqIGBgYAogKgogKiAjIyMgQ3JlYXRlIGEgZm9ybSBhcnJheSB3aXRoIGFycmF5LWxldmVsIHZhbGlkYXRvcnMKICoKICogWW91IGluY2x1ZGUgYXJyYXktbGV2ZWwgdmFsaWRhdG9ycyBhbmQgYXN5bmMgdmFsaWRhdG9ycy4gVGhlc2UgY29tZSBpbiBoYW5keQogKiB3aGVuIHlvdSB3YW50IHRvIHBlcmZvcm0gdmFsaWRhdGlvbiB0aGF0IGNvbnNpZGVycyB0aGUgdmFsdWUgb2YgbW9yZSB0aGFuIG9uZSBjaGlsZAogKiBjb250cm9sLgogKgogKiBUaGUgdHdvIHR5cGVzIG9mIHZhbGlkYXRvcnMgYXJlIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IGFzIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZwogKiByZXNwZWN0aXZlbHksIG9yIHRvZ2V0aGVyIGFzIHBhcnQgb2YgYW4gb3B0aW9ucyBvYmplY3QuCiAqCiAqIGBgYAogKiBjb25zdCBhcnIgPSBuZXcgRm9ybUFycmF5KFsKICogICBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JyksCiAqICAgbmV3IEZvcm1Db250cm9sKCdEcmV3JykKICogXSwge3ZhbGlkYXRvcnM6IG15VmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcnM6IG15QXN5bmNWYWxpZGF0b3J9KTsKICogYGBgCiAqCiAqICMjIyBTZXQgdGhlIHVwZGF0ZU9uIHByb3BlcnR5IGZvciBhbGwgY29udHJvbHMgaW4gYSBmb3JtIGFycmF5CiAqCiAqIFRoZSBvcHRpb25zIG9iamVjdCBpcyB1c2VkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggY2hpbGQKICogY29udHJvbCdzIGB1cGRhdGVPbmAgcHJvcGVydHkuIElmIHlvdSBzZXQgYHVwZGF0ZU9uYCB0byBgJ2JsdXInYCBhdCB0aGUKICogYXJyYXkgbGV2ZWwsIGFsbCBjaGlsZCBjb250cm9scyBkZWZhdWx0IHRvICdibHVyJywgdW5sZXNzIHRoZSBjaGlsZAogKiBoYXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYSBkaWZmZXJlbnQgYHVwZGF0ZU9uYCB2YWx1ZS4KICoKICogYGBgdHMKICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbCiAqICAgIG5ldyBGb3JtQ29udHJvbCgpCiAqIF0sIHt1cGRhdGVPbjogJ2JsdXInfSk7CiAqIGBgYAogKgogKiAjIyMgQWRkaW5nIG9yIHJlbW92aW5nIGNvbnRyb2xzIGZyb20gYSBmb3JtIGFycmF5CiAqCiAqIFRvIGNoYW5nZSB0aGUgY29udHJvbHMgaW4gdGhlIGFycmF5LCB1c2UgdGhlIGBwdXNoYCwgYGluc2VydGAsIGByZW1vdmVBdGAgb3IgYGNsZWFyYCBtZXRob2RzCiAqIGluIGBGb3JtQXJyYXlgIGl0c2VsZi4gVGhlc2UgbWV0aG9kcyBlbnN1cmUgdGhlIGNvbnRyb2xzIGFyZSBwcm9wZXJseSB0cmFja2VkIGluIHRoZQogKiBmb3JtJ3MgaGllcmFyY2h5LiBEbyBub3QgbW9kaWZ5IHRoZSBhcnJheSBvZiBgQWJzdHJhY3RDb250cm9sYHMgdXNlZCB0byBpbnN0YW50aWF0ZQogKiB0aGUgYEZvcm1BcnJheWAgZGlyZWN0bHksIGFzIHRoYXQgcmVzdWx0IGluIHN0cmFuZ2UgYW5kIHVuZXhwZWN0ZWQgYmVoYXZpb3Igc3VjaAogKiBhcyBicm9rZW4gY2hhbmdlIGRldGVjdGlvbi4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEZvcm1BcnJheSBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgYEZvcm1BcnJheWAgaW5zdGFuY2UuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjb250cm9scyBBbiBhcnJheSBvZiBjaGlsZCBjb250cm9scy4gRWFjaCBjaGlsZCBjb250cm9sIGlzIGdpdmVuIGFuIGluZGV4CiAgICAgKiB3aGVyZSBpdCBpcyByZWdpc3RlcmVkLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IHZhbGlkYXRvck9yT3B0cyBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YKICAgICAqIHN1Y2ggZnVuY3Rpb25zLCBvciBhbiBgQWJzdHJhY3RDb250cm9sT3B0aW9uc2Agb2JqZWN0IHRoYXQgY29udGFpbnMgdmFsaWRhdGlvbiBmdW5jdGlvbnMKICAgICAqIGFuZCBhIHZhbGlkYXRpb24gdHJpZ2dlci4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBhc3luY1ZhbGlkYXRvciBBIHNpbmdsZSBhc3luYyB2YWxpZGF0b3Igb3IgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9ucwogICAgICoKICAgICAqLwogICAgY29uc3RydWN0b3IoY29udHJvbHMsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpIHsKICAgICAgICBzdXBlcihjb2VyY2VUb1ZhbGlkYXRvcih2YWxpZGF0b3JPck9wdHMpLCBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yLCB2YWxpZGF0b3JPck9wdHMpKTsKICAgICAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbHM7CiAgICAgICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7CiAgICAgICAgdGhpcy5fc2V0VXBkYXRlU3RyYXRlZ3kodmFsaWRhdG9yT3JPcHRzKTsKICAgICAgICB0aGlzLl9zZXRVcENvbnRyb2xzKCk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgYEFic3RyYWN0Q29udHJvbGAgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gdGhlIGFycmF5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gaW5kZXggSW5kZXggaW4gdGhlIGFycmF5IHRvIHJldHJpZXZlIHRoZSBjb250cm9sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdChpbmRleCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzW2luZGV4XTsKICAgIH0KICAgIC8qKgogICAgICogSW5zZXJ0IGEgbmV3IGBBYnN0cmFjdENvbnRyb2xgIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gY29udHJvbCBGb3JtIGNvbnRyb2wgdG8gYmUgaW5zZXJ0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHB1c2goY29udHJvbCkgewogICAgICAgIHRoaXMuY29udHJvbHMucHVzaChjb250cm9sKTsKICAgICAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2woY29udHJvbCk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7CiAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEluc2VydCBhIG5ldyBgQWJzdHJhY3RDb250cm9sYCBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiB0aGUgYXJyYXkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gaW5zZXJ0IHRoZSBjb250cm9sCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgRm9ybSBjb250cm9sIHRvIGJlIGluc2VydGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnNlcnQoaW5kZXgsIGNvbnRyb2wpIHsKICAgICAgICB0aGlzLmNvbnRyb2xzLnNwbGljZShpbmRleCwgMCwgY29udHJvbCk7CiAgICAgICAgdGhpcy5fcmVnaXN0ZXJDb250cm9sKGNvbnRyb2wpOwogICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gdGhlIGFycmF5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gaW5kZXggSW5kZXggaW4gdGhlIGFycmF5IHRvIHJlbW92ZSB0aGUgY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlQXQoaW5kZXgpIHsKICAgICAgICBpZiAodGhpcy5jb250cm9sc1tpbmRleF0pCiAgICAgICAgICAgIHRoaXMuY29udHJvbHNbaW5kZXhdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pKTsKICAgICAgICB0aGlzLmNvbnRyb2xzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7CiAgICB9CiAgICAvKioKICAgICAqIFJlcGxhY2UgYW4gZXhpc3RpbmcgY29udHJvbC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGluZGV4IEluZGV4IGluIHRoZSBhcnJheSB0byByZXBsYWNlIHRoZSBjb250cm9sCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgVGhlIGBBYnN0cmFjdENvbnRyb2xgIGNvbnRyb2wgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0Q29udHJvbChpbmRleCwgY29udHJvbCkgewogICAgICAgIGlmICh0aGlzLmNvbnRyb2xzW2luZGV4XSkKICAgICAgICAgICAgdGhpcy5jb250cm9sc1tpbmRleF0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSkpOwogICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICBpZiAoY29udHJvbCkgewogICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnNwbGljZShpbmRleCwgMCwgY29udHJvbCk7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChjb250cm9sKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7CiAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7CiAgICB9CiAgICAvKioKICAgICAqIExlbmd0aCBvZiB0aGUgY29udHJvbCBhcnJheS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHMubGVuZ3RoOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1BcnJheWAuIEl0IGFjY2VwdHMgYW4gYXJyYXkgdGhhdCBtYXRjaGVzCiAgICAgKiB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb250cm9sLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHN0cmljdCBjaGVja3MsIGFuZCB0aHJvd3MgYW4gZXJyb3IgaWYgeW91IHRyeQogICAgICogdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRyb2wgdGhhdCBkb2Vzbid0IGV4aXN0IG9yIGlmIHlvdSBleGNsdWRlIHRoZQogICAgICogdmFsdWUgb2YgYSBjb250cm9sLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIFNldCB0aGUgdmFsdWVzIGZvciB0aGUgY29udHJvbHMgaW4gdGhlIGZvcm0gYXJyYXkKICAgICAqCiAgICAgKiBgYGAKICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICogICBuZXcgRm9ybUNvbnRyb2woKSwKICAgICAqICAgbmV3IEZvcm1Db250cm9sKCkKICAgICAqIF0pOwogICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbbnVsbCwgbnVsbF0KICAgICAqCiAgICAgKiBhcnIuc2V0VmFsdWUoWydOYW5jeScsICdEcmV3J10pOwogICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbJ05hbmN5JywgJ0RyZXcnXQogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBBcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSBjb250cm9scwogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZAogICAgICogZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgKgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC4gRGVmYXVsdAogICAgICogaXMgZmFsc2UuCiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGlzIHVwZGF0ZWQuCiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuCiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHkKICAgICAqIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHl9IG1ldGhvZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFZhbHVlKHZhbHVlLCBvcHRpb25zID0ge30pIHsKICAgICAgICB0aGlzLl9jaGVja0FsbFZhbHVlc1ByZXNlbnQodmFsdWUpOwogICAgICAgIHZhbHVlLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobmV3VmFsdWUsIGluZGV4KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3Rocm93SWZDb250cm9sTWlzc2luZyhpbmRleCk7CiAgICAgICAgICAgIHRoaXMuYXQoaW5kZXgpLnNldFZhbHVlKG5ld1ZhbHVlLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IG9wdGlvbnMuZW1pdEV2ZW50IH0pOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFBhdGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBgRm9ybUFycmF5YC4gSXQgYWNjZXB0cyBhbiBhcnJheSB0aGF0IG1hdGNoZXMgdGhlCiAgICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRyb2wsIGFuZCBkb2VzIGl0cyBiZXN0IHRvIG1hdGNoIHRoZSB2YWx1ZXMgdG8gdGhlIGNvcnJlY3QKICAgICAqIGNvbnRyb2xzIGluIHRoZSBncm91cC4KICAgICAqCiAgICAgKiBJdCBhY2NlcHRzIGJvdGggc3VwZXItc2V0cyBhbmQgc3ViLXNldHMgb2YgdGhlIGFycmF5IHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3IuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgUGF0Y2ggdGhlIHZhbHVlcyBmb3IgY29udHJvbHMgaW4gYSBmb3JtIGFycmF5CiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdCBhcnIgPSBuZXcgRm9ybUFycmF5KFsKICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpLAogICAgICogICAgbmV3IEZvcm1Db250cm9sKCkKICAgICAqIF0pOwogICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbbnVsbCwgbnVsbF0KICAgICAqCiAgICAgKiBhcnIucGF0Y2hWYWx1ZShbJ05hbmN5J10pOwogICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbJ05hbmN5JywgbnVsbF0KICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgQXJyYXkgb2YgbGF0ZXN0IHZhbHVlcyBmb3IgdGhlIGNvbnRyb2xzCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyZSBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kCiAgICAgKiBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIHZhbHVlIGNoYW5nZXMKICAgICAqCiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0CiAgICAgKiBpcyBmYWxzZS4KICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZAogICAgICogYHZhbHVlQ2hhbmdlc2AKICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgaXMgdXBkYXRlZC4KICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUge1xAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eQogICAgICogdXBkYXRlVmFsdWVBbmRWYWxpZGl0eX0gbWV0aG9kLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGF0Y2hWYWx1ZSh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgdmFsdWUuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChuZXdWYWx1ZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuYXQoaW5kZXgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmF0KGluZGV4KS5wYXRjaFZhbHVlKG5ld1ZhbHVlLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IG9wdGlvbnMuZW1pdEV2ZW50IH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXRzIHRoZSBgRm9ybUFycmF5YCBhbmQgYWxsIGRlc2NlbmRhbnRzIGFyZSBtYXJrZWQgYHByaXN0aW5lYCBhbmQgYHVudG91Y2hlZGAsIGFuZCB0aGUKICAgICAqIHZhbHVlIG9mIGFsbCBkZXNjZW5kYW50cyB0byBudWxsIG9yIG51bGwgbWFwcy4KICAgICAqCiAgICAgKiBZb3UgcmVzZXQgdG8gYSBzcGVjaWZpYyBmb3JtIHN0YXRlIGJ5IHBhc3NpbmcgaW4gYW4gYXJyYXkgb2Ygc3RhdGVzCiAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udHJvbC4gVGhlIHN0YXRlIGlzIGEgc3RhbmRhbG9uZSB2YWx1ZQogICAgICogb3IgYSBmb3JtIHN0YXRlIG9iamVjdCB3aXRoIGJvdGggYSB2YWx1ZSBhbmQgYSBkaXNhYmxlZCBzdGF0dXMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgUmVzZXQgdGhlIHZhbHVlcyBpbiBhIGZvcm0gYXJyYXkKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbCiAgICAgKiAgICBuZXcgRm9ybUNvbnRyb2woKSwKICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpCiAgICAgKiBdKTsKICAgICAqIGFyci5yZXNldChbJ25hbWUnLCAnbGFzdCBuYW1lJ10pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKHRoaXMuYXJyLnZhbHVlKTsgIC8vIFsnbmFtZScsICdsYXN0IG5hbWUnXQogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIFJlc2V0IHRoZSB2YWx1ZXMgaW4gYSBmb3JtIGFycmF5IGFuZCB0aGUgZGlzYWJsZWQgc3RhdHVzIGZvciB0aGUgZmlyc3QgY29udHJvbAogICAgICoKICAgICAqIGBgYAogICAgICogdGhpcy5hcnIucmVzZXQoWwogICAgICogICB7dmFsdWU6ICduYW1lJywgZGlzYWJsZWQ6IHRydWV9LAogICAgICogICAnbGFzdCcKICAgICAqIF0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKHRoaXMuYXJyLnZhbHVlKTsgIC8vIFsnbmFtZScsICdsYXN0IG5hbWUnXQogICAgICogY29uc29sZS5sb2codGhpcy5hcnIuZ2V0KDApLnN0YXR1cyk7ICAvLyAnRElTQUJMRUQnCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBBcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSBjb250cm9scwogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZAogICAgICogZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgKgogICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC4gRGVmYXVsdAogICAgICogaXMgZmFsc2UuCiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHJlc2V0LgogICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCN1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5CiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNldCh2YWx1ZSA9IFtdLCBvcHRpb25zID0ge30pIHsKICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sLCBpbmRleCkgPT4gewogICAgICAgICAgICBjb250cm9sLnJlc2V0KHZhbHVlW2luZGV4XSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRpb25zLmVtaXRFdmVudCB9KTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fdXBkYXRlUHJpc3RpbmUob3B0aW9ucyk7CiAgICAgICAgdGhpcy5fdXBkYXRlVG91Y2hlZChvcHRpb25zKTsKICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBhZ2dyZWdhdGUgdmFsdWUgb2YgdGhlIGFycmF5LCBpbmNsdWRpbmcgYW55IGRpc2FibGVkIGNvbnRyb2xzLgogICAgICoKICAgICAqIFJlcG9ydHMgYWxsIHZhbHVlcyByZWdhcmRsZXNzIG9mIGRpc2FibGVkIHN0YXR1cy4KICAgICAqIEZvciBlbmFibGVkIGNvbnRyb2xzIG9ubHksIHRoZSBgdmFsdWVgIHByb3BlcnR5IGlzIHRoZSBiZXN0IHdheSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFJhd1ZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICByZXR1cm4gY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sID8gY29udHJvbC52YWx1ZSA6ICgoLyoqIEB0eXBlIHs/fSAqLyAoY29udHJvbCkpKS5nZXRSYXdWYWx1ZSgpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGFsbCBjb250cm9scyBpbiB0aGUgYEZvcm1BcnJheWAuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIGEgRm9ybUFycmF5CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICogICAgbmV3IEZvcm1Db250cm9sKCksCiAgICAgKiAgICBuZXcgRm9ybUNvbnRyb2woKQogICAgICogXSk7CiAgICAgKiBjb25zb2xlLmxvZyhhcnIubGVuZ3RoKTsgIC8vIDIKICAgICAqCiAgICAgKiBhcnIuY2xlYXIoKTsKICAgICAqIGNvbnNvbGUubG9nKGFyci5sZW5ndGgpOyAgLy8gMAogICAgICogYGBgCiAgICAgKgogICAgICogSXQncyBhIHNpbXBsZXIgYW5kIG1vcmUgZWZmaWNpZW50IGFsdGVybmF0aXZlIHRvIHJlbW92aW5nIGFsbCBlbGVtZW50cyBvbmUgYnkgb25lOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCBhcnIgPSBuZXcgRm9ybUFycmF5KFsKICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpLAogICAgICogICAgbmV3IEZvcm1Db250cm9sKCkKICAgICAqIF0pOwogICAgICoKICAgICAqIHdoaWxlIChhcnIubGVuZ3RoKSB7CiAgICAgKiAgICBhcnIucmVtb3ZlQXQoMCk7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsZWFyKCkgewogICAgICAgIGlmICh0aGlzLmNvbnRyb2xzLmxlbmd0aCA8IDEpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSkpKSk7CiAgICAgICAgdGhpcy5jb250cm9scy5zcGxpY2UoMCk7CiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zeW5jUGVuZGluZ0NvbnRyb2xzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3VidHJlZVVwZGF0ZWQgPSB0aGlzLmNvbnRyb2xzLnJlZHVjZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVkCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHVwZGF0ZWQsIGNoaWxkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBjaGlsZC5fc3luY1BlbmRpbmdDb250cm9scygpID8gdHJ1ZSA6IHVwZGF0ZWQ7CiAgICAgICAgfSksIGZhbHNlKTsKICAgICAgICBpZiAoc3VidHJlZVVwZGF0ZWQpCiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlIH0pOwogICAgICAgIHJldHVybiBzdWJ0cmVlVXBkYXRlZDsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Rocm93SWZDb250cm9sTWlzc2luZyhpbmRleCkgewogICAgICAgIGlmICghdGhpcy5jb250cm9scy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAKICAgICAgICBUaGVyZSBhcmUgbm8gZm9ybSBjb250cm9scyByZWdpc3RlcmVkIHdpdGggdGhpcyBhcnJheSB5ZXQuICBJZiB5b3UncmUgdXNpbmcgbmdNb2RlbCwKICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS4KICAgICAgYCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5hdChpbmRleCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgYXQgaW5kZXggJHtpbmRleH1gKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gY2IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mb3JFYWNoQ2hpbGQoY2IpIHsKICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sLCBpbmRleCkgPT4gewogICAgICAgICAgICBjYihjb250cm9sLCBpbmRleCk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmFsdWUoKSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0KICAgICAgICAgICAgdGhpcy5jb250cm9scy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sKSA9PiBjb250cm9sLmVuYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCkpCiAgICAgICAgICAgICAgICAubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGNvbmRpdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FueUNvbnRyb2xzKGNvbmRpdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuZW5hYmxlZCAmJiBjb25kaXRpb24oY29udHJvbCkpKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFVwQ29udHJvbHMoKSB7CiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjb250cm9sKSA9PiB0aGlzLl9yZWdpc3RlckNvbnRyb2woY29udHJvbCkpKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrQWxsVmFsdWVzUHJlc2VudCh2YWx1ZSkgewogICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCwgaSkgPT4gewogICAgICAgICAgICBpZiAodmFsdWVbaV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdXN0IHN1cHBseSBhIHZhbHVlIGZvciBmb3JtIGNvbnRyb2wgYXQgaW5kZXg6ICR7aX0uYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hbGxDb250cm9sc0Rpc2FibGVkKCkgewogICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xzKSB7CiAgICAgICAgICAgIGlmIChjb250cm9sLmVuYWJsZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aCA+IDAgfHwgdGhpcy5kaXNhYmxlZDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlZ2lzdGVyQ29udHJvbChjb250cm9sKSB7CiAgICAgICAgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7CiAgICAgICAgY29udHJvbC5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UodGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvbmdfZm9ybS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IGZvcm1EaXJlY3RpdmVQcm92aWRlciA9IHsKICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBOZ0Zvcm0pKQp9Owpjb25zdCDJtTAkYiA9IC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwovKiogQHR5cGUgez99ICovCmNvbnN0IHJlc29sdmVkUHJvbWlzZSA9ICgoybUwJGIpKSgpOwovKioKICogXEBkZXNjcmlwdGlvbgogKiBDcmVhdGVzIGEgdG9wLWxldmVsIGBGb3JtR3JvdXBgIGluc3RhbmNlIGFuZCBiaW5kcyBpdCB0byBhIGZvcm0KICogdG8gdHJhY2sgYWdncmVnYXRlIGZvcm0gdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzLgogKgogKiBBcyBzb29uIGFzIHlvdSBpbXBvcnQgdGhlIGBGb3Jtc01vZHVsZWAsIHRoaXMgZGlyZWN0aXZlIGJlY29tZXMgYWN0aXZlIGJ5IGRlZmF1bHQgb24KICogYWxsIGA8Zm9ybT5gIHRhZ3MuICBZb3UgZG9uJ3QgbmVlZCB0byBhZGQgYSBzcGVjaWFsIHNlbGVjdG9yLgogKgogKiBZb3Ugb3B0aW9uYWxseSBleHBvcnQgdGhlIGRpcmVjdGl2ZSBpbnRvIGEgbG9jYWwgdGVtcGxhdGUgdmFyaWFibGUgdXNpbmcgYG5nRm9ybWAgYXMgdGhlIGtleQogKiAoZXg6IGAjbXlGb3JtPSJuZ0Zvcm0iYCkuIFRoaXMgaXMgb3B0aW9uYWwsIGJ1dCB1c2VmdWwuICBNYW55IHByb3BlcnRpZXMgZnJvbSB0aGUgdW5kZXJseWluZwogKiBgRm9ybUdyb3VwYCBpbnN0YW5jZSBhcmUgZHVwbGljYXRlZCBvbiB0aGUgZGlyZWN0aXZlIGl0c2VsZiwgc28gYSByZWZlcmVuY2UgdG8gaXQKICogZ2l2ZXMgeW91IGFjY2VzcyB0byB0aGUgYWdncmVnYXRlIHZhbHVlIGFuZCB2YWxpZGl0eSBzdGF0dXMgb2YgdGhlIGZvcm0sIGFzIHdlbGwgYXMKICogdXNlciBpbnRlcmFjdGlvbiBwcm9wZXJ0aWVzIGxpa2UgYGRpcnR5YCBhbmQgYHRvdWNoZWRgLgogKgogKiBUbyByZWdpc3RlciBjaGlsZCBjb250cm9scyB3aXRoIHRoZSBmb3JtLCB1c2UgYE5nTW9kZWxgIHdpdGggYSBgbmFtZWAKICogYXR0cmlidXRlLiBZb3UgbWF5IHVzZSBgTmdNb2RlbEdyb3VwYCB0byBjcmVhdGUgc3ViLWdyb3VwcyB3aXRoaW4gdGhlIGZvcm0uCiAqCiAqIElmIG5lY2Vzc2FyeSwgbGlzdGVuIHRvIHRoZSBkaXJlY3RpdmUncyBgbmdTdWJtaXRgIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHVzZXIgaGFzCiAqIHRyaWdnZXJlZCBhIGZvcm0gc3VibWlzc2lvbi4gVGhlIGBuZ1N1Ym1pdGAgZXZlbnQgZW1pdHMgdGhlIG9yaWdpbmFsIGZvcm0KICogc3VibWlzc2lvbiBldmVudC4KICoKICogSW4gdGVtcGxhdGUgZHJpdmVuIGZvcm1zLCBhbGwgYDxmb3JtPmAgdGFncyBhcmUgYXV0b21hdGljYWxseSB0YWdnZWQgYXMgYE5nRm9ybWAuCiAqIFRvIGltcG9ydCB0aGUgYEZvcm1zTW9kdWxlYCBidXQgc2tpcCBpdHMgdXNhZ2UgaW4gc29tZSBmb3JtcywKICogZm9yIGV4YW1wbGUsIHRvIHVzZSBuYXRpdmUgSFRNTDUgdmFsaWRhdGlvbiwgYWRkIHRoZSBgbmdOb0Zvcm1gIGFuZCB0aGUgYDxmb3JtPmAKICogdGFncyB3b24ndCBjcmVhdGUgYW4gYE5nRm9ybWAgZGlyZWN0aXZlLiBJbiByZWFjdGl2ZSBmb3JtcywgdXNpbmcgYG5nTm9Gb3JtYCBpcwogKiB1bm5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBgPGZvcm0+YCB0YWdzIGFyZSBpbmVydC4gSW4gdGhhdCBjYXNlLCB5b3Ugd291bGQKICogcmVmcmFpbiBmcm9tIHVzaW5nIHRoZSBgZm9ybUdyb3VwYCBkaXJlY3RpdmUuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgTGlzdGVuaW5nIGZvciBmb3JtIHN1Ym1pc3Npb24KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjYXB0dXJlIHRoZSBmb3JtIHZhbHVlcyBmcm9tIHRoZSAibmdTdWJtaXQiIGV2ZW50LgogKgogKiB7XEBleGFtcGxlIGZvcm1zL3RzL3NpbXBsZUZvcm0vc2ltcGxlX2Zvcm1fZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAqCiAqICMjIyBTZXR0aW5nIHRoZSB1cGRhdGUgb3B0aW9ucwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byBjaGFuZ2UgdGhlICJ1cGRhdGVPbiIgb3B0aW9uIGZyb20gaXRzIGRlZmF1bHQgdXNpbmcKICogbmdGb3JtT3B0aW9ucy4KICoKICogYGBgaHRtbAogKiA8Zm9ybSBbbmdGb3JtT3B0aW9uc109Int1cGRhdGVPbjogJ2JsdXInfSI+CiAqICAgIDxpbnB1dCBuYW1lPSJvbmUiIG5nTW9kZWw+ICA8IS0tIHRoaXMgbmdNb2RlbCB3aWxsIHVwZGF0ZSBvbiBibHVyIC0tPgogKiA8L2Zvcm0+CiAqIGBgYAogKgogKiAjIyMgTmF0aXZlIERPTSB2YWxpZGF0aW9uIFVJCiAqCiAqIEluIG9yZGVyIHRvIHByZXZlbnQgdGhlIG5hdGl2ZSBET00gZm9ybSB2YWxpZGF0aW9uIFVJIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBBbmd1bGFyJ3MgZm9ybQogKiB2YWxpZGF0aW9uLCBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgYG5vdmFsaWRhdGVgIGF0dHJpYnV0ZSBvbiBhbnkgYDxmb3JtPmAgd2hlbmV2ZXIKICogYEZvcm1Nb2R1bGVgIG9yIGBSZWFjdGl2ZUZvcm1Nb2R1bGVgIGFyZSBpbXBvcnRlZCBpbnRvIHRoZSBhcHBsaWNhdGlvbi4KICogSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBlbmFibGUgbmF0aXZlIERPTSB2YWxpZGF0aW9uIFVJIHdpdGggQW5ndWxhciBmb3JtcywgeW91IGNhbiBhZGQgdGhlCiAqIGBuZ05hdGl2ZVZhbGlkYXRlYCBhdHRyaWJ1dGUgdG8gdGhlIGA8Zm9ybT5gIGVsZW1lbnQ6CiAqCiAqIGBgYGh0bWwKICogPGZvcm0gbmdOYXRpdmVWYWxpZGF0ZT4KICogICAuLi4KICogPC9mb3JtPgogKiBgYGAKICoKICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdGb3JtIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICogQHBhcmFtIHs/fSBhc3luY1ZhbGlkYXRvcnMKICAgICAqLwogICAgY29uc3RydWN0b3IodmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBmb3JtIHN1Ym1pc3Npb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZGlyZWN0aXZlcyA9IFtdOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBFdmVudCBlbWl0dGVyIGZvciB0aGUgIm5nU3VibWl0IiBldmVudAogICAgICAgICAqLwogICAgICAgIHRoaXMubmdTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgdGhpcy5mb3JtID0KICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7fSwgY29tcG9zZVZhbGlkYXRvcnModmFsaWRhdG9ycyksIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSB2aWV3IGlzIGluaXRpYWxpemVkLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0FmdGVyVmlld0luaXQoKSB7CiAgICAgICAgdGhpcy5fc2V0VXBkYXRlU3RyYXRlZ3koKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgaW50ZXJuYWwgYEZvcm1Hcm91cGAgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY29udHJvbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb3JtOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGlzIGdyb3VwLiBCZWNhdXNlIHRoaXMgZGlyZWN0aXZlCiAgICAgKiBhbHdheXMgbGl2ZXMgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZvcm0sIGl0IGlzIGFsd2F5cyBhbiBlbXB0eSBhcnJheS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXRoKCkgewogICAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmV0dXJucyBhIG1hcCBvZiB0aGUgY29udHJvbHMgaW4gdGhpcyBncm91cC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250cm9scygpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBNZXRob2QgdGhhdCBzZXRzIHVwIHRoZSBjb250cm9sIGRpcmVjdGl2ZSBpbiB0aGlzIGdyb3VwLCByZS1jYWxjdWxhdGVzIGl0cyB2YWx1ZQogICAgICogYW5kIHZhbGlkaXR5LCBhbmQgYWRkcyB0aGUgaW5zdGFuY2UgdG8gdGhlIGludGVybmFsIGxpc3Qgb2YgZGlyZWN0aXZlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYE5nTW9kZWxgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZENvbnRyb2woZGlyKSB7CiAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2ZpbmRDb250YWluZXIoZGlyLnBhdGgpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRpcikpKS5jb250cm9sID0KICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChjb250YWluZXIucmVnaXN0ZXJDb250cm9sKGRpci5uYW1lLCBkaXIuY29udHJvbCkpKTsKICAgICAgICAgICAgc2V0VXBDb250cm9sKGRpci5jb250cm9sLCBkaXIpOwogICAgICAgICAgICBkaXIuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICAgICAgdGhpcy5fZGlyZWN0aXZlcy5wdXNoKGRpcik7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgZnJvbSB0aGUgcHJvdmlkZWQgYE5nTW9kZWxgIGRpcmVjdGl2ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYE5nTW9kZWxgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldENvbnRyb2woZGlyKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZW1vdmVzIHRoZSBgTmdNb2RlbGAgaW5zdGFuY2UgZnJvbSB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkaXJlY3RpdmVzCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBOZ01vZGVsYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVDb250cm9sKGRpcikgewogICAgICAgIHJlc29sdmVkUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTsKICAgICAgICAgICAgaWYgKGNvbnRhaW5lcikgewogICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNvbnRyb2woZGlyLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZURpcih0aGlzLl9kaXJlY3RpdmVzLCBkaXIpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQWRkcyBhIG5ldyBgTmdNb2RlbEdyb3VwYCBkaXJlY3RpdmUgaW5zdGFuY2UgdG8gdGhlIGZvcm0uCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEZvcm1Hcm91cChkaXIpIHsKICAgICAgICByZXNvbHZlZFByb21pc2UudGhlbigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTsKICAgICAgICAgICAgc2V0VXBGb3JtQ29udGFpbmVyKGdyb3VwLCBkaXIpOwogICAgICAgICAgICBjb250YWluZXIucmVnaXN0ZXJDb250cm9sKGRpci5uYW1lLCBncm91cCk7CiAgICAgICAgICAgIGdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVtb3ZlcyB0aGUgYE5nTW9kZWxHcm91cGAgZGlyZWN0aXZlIGluc3RhbmNlIGZyb20gdGhlIGZvcm0uCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUZvcm1Hcm91cChkaXIpIHsKICAgICAgICByZXNvbHZlZFByb21pc2UudGhlbigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7CiAgICAgICAgICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDb250cm9sKGRpci5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmV0cmlldmVzIHRoZSBgRm9ybUdyb3VwYCBmb3IgYSBwcm92aWRlZCBgTmdNb2RlbEdyb3VwYCBkaXJlY3RpdmUgaW5zdGFuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYE5nTW9kZWxHcm91cGAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Rm9ybUdyb3VwKGRpcikgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtLmdldChkaXIucGF0aCkpKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgYE5nQ29udHJvbGAgZGlyZWN0aXZlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgTmdDb250cm9sYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBkaXJlY3RpdmUncyBjb250cm9sLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdXBkYXRlTW9kZWwoZGlyLCB2YWx1ZSkgewogICAgICAgIHJlc29sdmVkUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdHJsID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS5nZXQoKC8qKiBAdHlwZSB7P30gKi8gKGRpci5wYXRoKSkpKSk7CiAgICAgICAgICAgIGN0cmwuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgYEZvcm1Hcm91cGAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbmV3IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRWYWx1ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIE1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgInN1Ym1pdCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLgogICAgICogVHJpZ2dlcnMgdGhlIGBuZ1N1Ym1pdGAgZW1pdHRlciB0byBlbWl0IHRoZSAic3VibWl0IiBldmVudCBhcyBpdHMgcGF5bG9hZC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99ICRldmVudCBUaGUgInN1Ym1pdCIgZXZlbnQgb2JqZWN0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblN1Ym1pdCgkZXZlbnQpIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3VibWl0dGVkID0gdHJ1ZTsKICAgICAgICBzeW5jUGVuZGluZ0NvbnRyb2xzKHRoaXMuZm9ybSwgdGhpcy5fZGlyZWN0aXZlcyk7CiAgICAgICAgdGhpcy5uZ1N1Ym1pdC5lbWl0KCRldmVudCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlICJyZXNldCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25SZXNldCgpIHsKICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXNldHMgdGhlIGZvcm0gdG8gYW4gaW5pdGlhbCB2YWx1ZSBhbmQgcmVzZXRzIGl0cyBzdWJtaXR0ZWQgc3RhdHVzLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBmb3JtLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXRGb3JtKHZhbHVlID0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KHZhbHVlKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3VibWl0dGVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VXBkYXRlU3RyYXRlZ3koKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMudXBkYXRlT24gIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmZvcm0uX3VwZGF0ZU9uID0gdGhpcy5vcHRpb25zLnVwZGF0ZU9uOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZmluZENvbnRhaW5lcihwYXRoKSB7CiAgICAgICAgcGF0aC5wb3AoKTsKICAgICAgICByZXR1cm4gcGF0aC5sZW5ndGggPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtLmdldChwYXRoKSkpIDogdGhpcy5mb3JtOwogICAgfQp9Ck5nRm9ybS7JtWZhYyA9IGZ1bmN0aW9uIE5nRm9ybV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0Zvcm0pKMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMsIDEwKSk7IH07Ck5nRm9ybS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ0Zvcm0sIHNlbGVjdG9yczogW1siZm9ybSIsIDMsICJuZ05vRm9ybSIsICIiLCAzLCAiZm9ybUdyb3VwIiwgIiJdLCBbIm5nLWZvcm0iXSwgWyIiLCAibmdGb3JtIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBOZ0Zvcm1fSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigic3VibWl0IiwgZnVuY3Rpb24gTmdGb3JtX3N1Ym1pdF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25TdWJtaXQoJGV2ZW50KTsgfSkoInJlc2V0IiwgZnVuY3Rpb24gTmdGb3JtX3Jlc2V0X0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblJlc2V0KCk7IH0pOwogICAgfSB9LCBpbnB1dHM6IHsgb3B0aW9uczogWyJuZ0Zvcm1PcHRpb25zIiwgIm9wdGlvbnMiXSB9LCBvdXRwdXRzOiB7IG5nU3VibWl0OiAibmdTdWJtaXQiIH0sIGV4cG9ydEFzOiBbIm5nRm9ybSJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtmb3JtRGlyZWN0aXZlUHJvdmlkZXJdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0Zvcm0uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxJREFUT1JTLF0gfV0gfSwKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9Cl07Ck5nRm9ybS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG9wdGlvbnM6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ25nRm9ybU9wdGlvbnMnLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2Fic3RyYWN0X2Zvcm1fZ3JvdXBfZGlyZWN0aXZlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEEgYmFzZSBjbGFzcyBmb3IgY29kZSBzaGFyZWQgYmV0d2VlbiB0aGUgYE5nTW9kZWxHcm91cGAgYW5kIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmVzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUgZXh0ZW5kcyBDb250cm9sQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQW4gaW50ZXJuYWwgY2FsbGJhY2sgbWV0aG9kIHRyaWdnZXJlZCBvbiB0aGUgaW5zdGFuY2UgYWZ0ZXIgdGhlIGlucHV0cyBhcmUgc2V0LgogICAgICogUmVnaXN0ZXJzIHRoZSBncm91cCB3aXRoIGl0cyBwYXJlbnQgZ3JvdXAuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLl9jaGVja1BhcmVudFR5cGUoKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtRGlyZWN0aXZlKSkuYWRkRm9ybUdyb3VwKHRoaXMpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBbiBpbnRlcm5hbCBjYWxsYmFjayBtZXRob2QgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLgogICAgICogUmVtb3ZlcyB0aGUgZ3JvdXAgZnJvbSBpdHMgcGFyZW50IGdyb3VwLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZSkgewogICAgICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlRm9ybUdyb3VwKHRoaXMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIGBGb3JtR3JvdXBgIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNvbnRyb2woKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm1EaXJlY3RpdmUpKS5nZXRGb3JtR3JvdXAodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAgZnJvbSB0aGUgdG9wLWxldmVsIGRpcmVjdGl2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXRoKCkgewogICAgICAgIHJldHVybiBjb250cm9sUGF0aCh0aGlzLm5hbWUgPT0gbnVsbCA/IHRoaXMubmFtZSA6IHRoaXMubmFtZS50b1N0cmluZygpLCB0aGlzLl9wYXJlbnQpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgdG9wLWxldmVsIGRpcmVjdGl2ZSBmb3IgdGhpcyBncm91cCBpZiBwcmVzZW50LCBvdGhlcndpc2UgbnVsbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSBzeW5jaHJvbm91cyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGdyb3VwLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSBhc3luYyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGdyb3VwLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFzeW5jVmFsaWRhdG9yKCkgewogICAgICAgIHJldHVybiBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHRoaXMuX2FzeW5jVmFsaWRhdG9ycyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jaGVja1BhcmVudFR5cGUoKSB7IH0KfQpBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZS7JtWZhYyA9IGZ1bmN0aW9uIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gybVBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZV9CYXNlRmFjdG9yeSh0IHx8IEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlKTsgfTsKQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUsIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CmNvbnN0IMm1QWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmVfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy90ZW1wbGF0ZV9kcml2ZW5fZXJyb3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIFRlbXBsYXRlRHJpdmVuRXJyb3JzIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIG1vZGVsUGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgCiAgICAgIG5nTW9kZWwgY2Fubm90IGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9ybSBjb250cm9scyB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBUcnkgdXNpbmcKICAgICAgZm9ybUdyb3VwJ3MgcGFydG5lciBkaXJlY3RpdmUgImZvcm1Db250cm9sTmFtZSIgaW5zdGVhZC4gIEV4YW1wbGU6CgogICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLmZvcm1Db250cm9sTmFtZX0KCiAgICAgIE9yLCBpZiB5b3UnZCBsaWtlIHRvIGF2b2lkIHJlZ2lzdGVyaW5nIHRoaXMgZm9ybSBjb250cm9sLCBpbmRpY2F0ZSB0aGF0IGl0J3Mgc3RhbmRhbG9uZSBpbiBuZ01vZGVsT3B0aW9uczoKCiAgICAgIEV4YW1wbGU6CgogICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLm5nTW9kZWxXaXRoRm9ybUdyb3VwfWApOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYAogICAgICBuZ01vZGVsIGNhbm5vdCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGZvcm0gY29udHJvbHMgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXBOYW1lIG9yIGZvcm1BcnJheU5hbWUgZGlyZWN0aXZlLgoKICAgICAgT3B0aW9uIDE6IFVzZSBmb3JtQ29udHJvbE5hbWUgaW5zdGVhZCBvZiBuZ01vZGVsIChyZWFjdGl2ZSBzdHJhdGVneSk6CgogICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLmZvcm1Hcm91cE5hbWV9CgogICAgICBPcHRpb24gMjogIFVwZGF0ZSBuZ01vZGVsJ3MgcGFyZW50IGJlIG5nTW9kZWxHcm91cCAodGVtcGxhdGUtZHJpdmVuIHN0cmF0ZWd5KToKCiAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMubmdNb2RlbEdyb3VwfWApOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbWlzc2luZ05hbWVFeGNlcHRpb24oKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZiBuZ01vZGVsIGlzIHVzZWQgd2l0aGluIGEgZm9ybSB0YWcsIGVpdGhlciB0aGUgbmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgb3IgdGhlIGZvcm0KICAgICAgY29udHJvbCBtdXN0IGJlIGRlZmluZWQgYXMgJ3N0YW5kYWxvbmUnIGluIG5nTW9kZWxPcHRpb25zLgoKICAgICAgRXhhbXBsZSAxOiA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5maXJzdE5hbWUiIG5hbWU9ImZpcnN0Ij4KICAgICAgRXhhbXBsZSAyOiA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5maXJzdE5hbWUiIFtuZ01vZGVsT3B0aW9uc109IntzdGFuZGFsb25lOiB0cnVlfSI+YCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBtb2RlbEdyb3VwUGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgCiAgICAgIG5nTW9kZWxHcm91cCBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuCgogICAgICBPcHRpb24gMTogVXNlIGZvcm1Hcm91cE5hbWUgaW5zdGVhZCBvZiBuZ01vZGVsR3JvdXAgKHJlYWN0aXZlIHN0cmF0ZWd5KToKCiAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMuZm9ybUdyb3VwTmFtZX0KCiAgICAgIE9wdGlvbiAyOiAgVXNlIGEgcmVndWxhciBmb3JtIHRhZyBpbnN0ZWFkIG9mIHRoZSBmb3JtR3JvdXAgZGlyZWN0aXZlICh0ZW1wbGF0ZS1kcml2ZW4gc3RyYXRlZ3kpOgoKICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5uZ01vZGVsR3JvdXB9YCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL25nX21vZGVsX2dyb3VwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgbW9kZWxHcm91cFByb3ZpZGVyID0gewogICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IE5nTW9kZWxHcm91cCkpCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgYEZvcm1Hcm91cGAgaW5zdGFuY2UgdG8gYSBET00gZWxlbWVudC4KICoKICogVGhpcyBkaXJlY3RpdmUgY2FuIG9ubHkgYmUgdXNlZCBhcyBhIGNoaWxkIG9mIGBOZ0Zvcm1gICh3aXRoaW4gYDxmb3JtPmAgdGFncykuCiAqCiAqIFVzZSB0aGlzIGRpcmVjdGl2ZSB0byB2YWxpZGF0ZSBhIHN1Yi1ncm91cCBvZiB5b3VyIGZvcm0gc2VwYXJhdGVseSBmcm9tIHRoZQogKiByZXN0IG9mIHlvdXIgZm9ybSwgb3IgaWYgc29tZSB2YWx1ZXMgaW4geW91ciBkb21haW4gbW9kZWwgbWFrZSBtb3JlIHNlbnNlCiAqIHRvIGNvbnN1bWUgdG9nZXRoZXIgaW4gYSBuZXN0ZWQgb2JqZWN0LgogKgogKiBQcm92aWRlIGEgbmFtZSBmb3IgdGhlIHN1Yi1ncm91cCBhbmQgaXQgd2lsbCBiZWNvbWUgdGhlIGtleQogKiBmb3IgdGhlIHN1Yi1ncm91cCBpbiB0aGUgZm9ybSdzIGZ1bGwgdmFsdWUuIElmIHlvdSBuZWVkIGRpcmVjdCBhY2Nlc3MsIGV4cG9ydCB0aGUgZGlyZWN0aXZlIGludG8KICogYSBsb2NhbCB0ZW1wbGF0ZSB2YXJpYWJsZSB1c2luZyBgbmdNb2RlbEdyb3VwYCAoZXg6IGAjbXlHcm91cD0ibmdNb2RlbEdyb3VwImApLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIENvbnN1bWluZyBjb250cm9scyBpbiBhIGdyb3VwaW5nCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGNvbWJpbmUgY29udHJvbHMgdG9nZXRoZXIgaW4gYSBzdWItZ3JvdXAKICogb2YgdGhlIGZvcm0uCiAqCiAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvbmdNb2RlbEdyb3VwL25nX21vZGVsX2dyb3VwX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfQogKgogKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ01vZGVsR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAqIEBwYXJhbSB7P30gYXN5bmNWYWxpZGF0b3JzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5fdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7CiAgICAgICAgdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tQYXJlbnRUeXBlKCkgewogICAgICAgIGlmICghKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIE5nTW9kZWxHcm91cCkgJiYgISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBOZ0Zvcm0pKSB7CiAgICAgICAgICAgIFRlbXBsYXRlRHJpdmVuRXJyb3JzLm1vZGVsR3JvdXBQYXJlbnRFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICB9Cn0KTmdNb2RlbEdyb3VwLsm1ZmFjID0gZnVuY3Rpb24gTmdNb2RlbEdyb3VwX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nTW9kZWxHcm91cCkoybXJtWRpcmVjdGl2ZUluamVjdChDb250cm9sQ29udGFpbmVyLCA1KSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApKTsgfTsKTmdNb2RlbEdyb3VwLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nTW9kZWxHcm91cCwgc2VsZWN0b3JzOiBbWyIiLCAibmdNb2RlbEdyb3VwIiwgIiJdXSwgaW5wdXRzOiB7IG5hbWU6IFsibmdNb2RlbEdyb3VwIiwgIm5hbWUiXSB9LCBleHBvcnRBczogWyJuZ01vZGVsR3JvdXAiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbbW9kZWxHcm91cFByb3ZpZGVyXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdNb2RlbEdyb3VwLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBDb250cm9sQ29udGFpbmVyLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH0sIHsgdHlwZTogU2tpcFNlbGYgfV0gfSwKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfQVNZTkNfVkFMSURBVE9SUyxdIH1dIH0KXTsKTmdNb2RlbEdyb3VwLnByb3BEZWNvcmF0b3JzID0gewogICAgbmFtZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdNb2RlbEdyb3VwJyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9uZ19tb2RlbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IGZvcm1Db250cm9sQmluZGluZyA9IHsKICAgIHByb3ZpZGU6IE5nQ29udHJvbCwKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IE5nTW9kZWwpKQp9Owpjb25zdCDJtTAkMSQ0ID0gLyoqCiAqIEByZXR1cm4gez99CiAqLwooKSA9PiBQcm9taXNlLnJlc29sdmUobnVsbCk7Ci8qKgogKiBgbmdNb2RlbGAgZm9yY2VzIGFuIGFkZGl0aW9uYWwgY2hhbmdlIGRldGVjdGlvbiBydW4gd2hlbiBpdHMgaW5wdXRzIGNoYW5nZToKICogRS5nLjoKICogYGBgCiAqIDxkaXY+e3tteU1vZGVsLnZhbGlkfX08L2Rpdj4KICogPGlucHV0IFsobmdNb2RlbCldPSJteVZhbHVlIiAjbXlNb2RlbD0ibmdNb2RlbCI+CiAqIGBgYAogKiBJLmUuIGBuZ01vZGVsYCBjYW4gZXhwb3J0IGl0c2VsZiBvbiB0aGUgZWxlbWVudCBhbmQgdGhlbiBiZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZS4KICogTm9ybWFsbHksIHRoaXMgd291bGQgcmVzdWx0IGluIGV4cHJlc3Npb25zIGJlZm9yZSB0aGUgYGlucHV0YCB0aGF0IHVzZSB0aGUgZXhwb3J0ZWQgZGlyZWN0aXZlCiAqIHRvIGhhdmUgYW5kIG9sZCB2YWx1ZSBhcyB0aGV5IGhhdmUgYmVlbgogKiBkaXJ0eSBjaGVja2VkIGJlZm9yZS4gQXMgdGhpcyBpcyBhIHZlcnkgY29tbW9uIGNhc2UgZm9yIGBuZ01vZGVsYCwgd2UgYWRkZWQgdGhpcyBzZWNvbmQgY2hhbmdlCiAqIGRldGVjdGlvbiBydW4uCiAqCiAqIE5vdGVzOgogKiAtIHRoaXMgaXMganVzdCBvbmUgZXh0cmEgcnVuIG5vIG1hdHRlciBob3cgbWFueSBgbmdNb2RlbGAgaGF2ZSBiZWVuIGNoYW5nZWQuCiAqIC0gdGhpcyBpcyBhIGdlbmVyYWwgcHJvYmxlbSB3aGVuIHVzaW5nIGBleHBvcnRBc2AgZm9yIGRpcmVjdGl2ZXMhCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgcmVzb2x2ZWRQcm9taXNlJDEgPSAoKMm1MCQxJDQpKSgpOwovKioKICogXEBkZXNjcmlwdGlvbgogKiBDcmVhdGVzIGEgYEZvcm1Db250cm9sYCBpbnN0YW5jZSBmcm9tIGEgZG9tYWluIG1vZGVsIGFuZCBiaW5kcyBpdAogKiB0byBhIGZvcm0gY29udHJvbCBlbGVtZW50LgogKgogKiBUaGUgYEZvcm1Db250cm9sYCBpbnN0YW5jZSB0cmFja3MgdGhlIHZhbHVlLCB1c2VyIGludGVyYWN0aW9uLCBhbmQKICogdmFsaWRhdGlvbiBzdGF0dXMgb2YgdGhlIGNvbnRyb2wgYW5kIGtlZXBzIHRoZSB2aWV3IHN5bmNlZCB3aXRoIHRoZSBtb2RlbC4gSWYgdXNlZAogKiB3aXRoaW4gYSBwYXJlbnQgZm9ybSwgdGhlIGRpcmVjdGl2ZSBhbHNvIHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgZm9ybSBhcyBhIGNoaWxkCiAqIGNvbnRyb2wuCiAqCiAqIFRoaXMgZGlyZWN0aXZlIGlzIHVzZWQgYnkgaXRzZWxmIG9yIGFzIHBhcnQgb2YgYSBsYXJnZXIgZm9ybS4gVXNlIHRoZQogKiBgbmdNb2RlbGAgc2VsZWN0b3IgdG8gYWN0aXZhdGUgaXQuCiAqCiAqIEl0IGFjY2VwdHMgYSBkb21haW4gbW9kZWwgYXMgYW4gb3B0aW9uYWwgYElucHV0YC4gSWYgeW91IGhhdmUgYSBvbmUtd2F5IGJpbmRpbmcKICogdG8gYG5nTW9kZWxgIHdpdGggYFtdYCBzeW50YXgsIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgZG9tYWluIG1vZGVsIGluIHRoZSBjb21wb25lbnQKICogY2xhc3Mgc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHZpZXcuIElmIHlvdSBoYXZlIGEgdHdvLXdheSBiaW5kaW5nIHdpdGggYFsoKV1gIHN5bnRheAogKiAoYWxzbyBrbm93biBhcyAnYmFuYW5hLWJveCBzeW50YXgnKSwgdGhlIHZhbHVlIGluIHRoZSBVSSBhbHdheXMgc3luY3MgYmFjayB0bwogKiB0aGUgZG9tYWluIG1vZGVsIGluIHlvdXIgY2xhc3MuCiAqCiAqIFRvIGluc3BlY3QgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgYEZvcm1Db250cm9sYCAobGlrZSB2YWxpZGl0eSBzdGF0ZSksCiAqIGV4cG9ydCB0aGUgZGlyZWN0aXZlIGludG8gYSBsb2NhbCB0ZW1wbGF0ZSB2YXJpYWJsZSB1c2luZyBgbmdNb2RlbGAgYXMgdGhlIGtleSAoZXg6CiAqIGAjbXlWYXI9Im5nTW9kZWwiYCkuIFlvdSB0aGVuIGFjY2VzcyB0aGUgY29udHJvbCB1c2luZyB0aGUgZGlyZWN0aXZlJ3MgYGNvbnRyb2xgIHByb3BlcnR5LCBidXQKICogbW9zdCBwcm9wZXJ0aWVzIHVzZWQgKGxpa2UgYHZhbGlkYCBhbmQgYGRpcnR5YCkgZmFsbCB0aHJvdWdoIHRvIHRoZSBjb250cm9sIGFueXdheSBmb3IgZGlyZWN0CiAqIGFjY2Vzcy4gU2VlIGEgZnVsbCBsaXN0IG9mIHByb3BlcnRpZXMgZGlyZWN0bHkgYXZhaWxhYmxlIGluIGBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmVgLgogKgogKiBAc2VlIGBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yYAogKiBAc2VlIGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmAKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBVc2luZyBuZ01vZGVsIG9uIGEgc3RhbmRhbG9uZSBjb250cm9sCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBhIHNpbXBsZSBzdGFuZGFsb25lIGNvbnRyb2wgdXNpbmcgYG5nTW9kZWxgOgogKgogKiB7XEBleGFtcGxlIGZvcm1zL3RzL3NpbXBsZU5nTW9kZWwvc2ltcGxlX25nX21vZGVsX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfQogKgogKiBXaGVuIHVzaW5nIHRoZSBgbmdNb2RlbGAgd2l0aGluIGA8Zm9ybT5gIHRhZ3MsIHlvdSdsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IGEgYG5hbWVgIGF0dHJpYnV0ZQogKiBzbyB0aGF0IHRoZSBjb250cm9sIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIHBhcmVudCBmb3JtIHVuZGVyIHRoYXQgbmFtZS4KICoKICogSW4gdGhlIGNvbnRleHQgb2YgYSBwYXJlbnQgZm9ybSwgaXQncyBvZnRlbiB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIG9uZS13YXkgb3IgdHdvLXdheSBiaW5kaW5nLAogKiBhcyB0aGUgcGFyZW50IGZvcm0gc3luY3MgdGhlIHZhbHVlIGZvciB5b3UuIFlvdSBhY2Nlc3MgaXRzIHByb3BlcnRpZXMgYnkgZXhwb3J0aW5nIGl0IGludG8gYQogKiBsb2NhbCB0ZW1wbGF0ZSB2YXJpYWJsZSB1c2luZyBgbmdGb3JtYCBzdWNoIGFzIChgI2Y9Im5nRm9ybSJgKS4gVXNlIHRoZSB2YXJpYWJsZSB3aGVyZQogKiBuZWVkZWQgb24gZm9ybSBzdWJtaXNzaW9uLgogKgogKiBJZiB5b3UgZG8gbmVlZCB0byBwb3B1bGF0ZSBpbml0aWFsIHZhbHVlcyBpbnRvIHlvdXIgZm9ybSwgdXNpbmcgYSBvbmUtd2F5IGJpbmRpbmcgZm9yCiAqIGBuZ01vZGVsYCB0ZW5kcyB0byBiZSBzdWZmaWNpZW50IGFzIGxvbmcgYXMgeW91IHVzZSB0aGUgZXhwb3J0ZWQgZm9ybSdzIHZhbHVlIHJhdGhlcgogKiB0aGFuIHRoZSBkb21haW4gbW9kZWwncyB2YWx1ZSBvbiBzdWJtaXQuCiAqCiAqICMjIyBVc2luZyBuZ01vZGVsIHdpdGhpbiBhIGZvcm0KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGNvbnRyb2xzIHVzaW5nIGBuZ01vZGVsYCB3aXRoaW4gYSBmb3JtOgogKgogKiB7XEBleGFtcGxlIGZvcm1zL3RzL3NpbXBsZUZvcm0vc2ltcGxlX2Zvcm1fZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAqCiAqICMjIyBVc2luZyBhIHN0YW5kYWxvbmUgbmdNb2RlbCB3aXRoaW4gYSBncm91cAogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byB1c2UgYSBzdGFuZGFsb25lIG5nTW9kZWwgY29udHJvbAogKiB3aXRoaW4gYSBmb3JtLiBUaGlzIGNvbnRyb2xzIHRoZSBkaXNwbGF5IG9mIHRoZSBmb3JtLCBidXQgZG9lc24ndCBjb250YWluIGZvcm0gZGF0YS4KICoKICogYGBgaHRtbAogKiA8Zm9ybT4KICogICA8aW5wdXQgbmFtZT0ibG9naW4iIG5nTW9kZWwgcGxhY2Vob2xkZXI9IkxvZ2luIj4KICogICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nTW9kZWwgW25nTW9kZWxPcHRpb25zXT0ie3N0YW5kYWxvbmU6IHRydWV9Ij4gU2hvdyBtb3JlIG9wdGlvbnM/CiAqIDwvZm9ybT4KICogPCEtLSBmb3JtIHZhbHVlOiB7bG9naW46ICcnfSAtLT4KICogYGBgCiAqCiAqICMjIyBTZXR0aW5nIHRoZSBuZ01vZGVsIG5hbWUgYXR0cmlidXRlIHRocm91Z2ggb3B0aW9ucwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGFuIGFsdGVybmF0ZSB3YXkgdG8gc2V0IHRoZSBuYW1lIGF0dHJpYnV0ZS4gVGhlIG5hbWUgYXR0cmlidXRlIGlzCiAqIHVzZWQgd2l0aGluIGEgY3VzdG9tIGZvcm0gY29tcG9uZW50LCBhbmQgdGhlIG5hbWUgYFxASW5wdXRgIHByb3BlcnR5IHNlcnZlcyBhIGRpZmZlcmVudCBwdXJwb3NlLgogKgogKiBgYGBodG1sCiAqIDxmb3JtPgogKiAgIDxteS1wZXJzb24tY29udHJvbCBuYW1lPSJOYW5jeSIgbmdNb2RlbCBbbmdNb2RlbE9wdGlvbnNdPSJ7bmFtZTogJ3VzZXInfSI+CiAqICAgPC9teS1wZXJzb24tY29udHJvbD4KICogPC9mb3JtPgogKiA8IS0tIGZvcm0gdmFsdWU6IHt1c2VyOiAnJ30gLS0+CiAqIGBgYAogKgogKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ01vZGVsIGV4dGVuZHMgTmdDb250cm9sIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICogQHBhcmFtIHs/fSBhc3luY1ZhbGlkYXRvcnMKICAgICAqIEBwYXJhbSB7P30gdmFsdWVBY2Nlc3NvcnMKICAgICAqLwogICAgY29uc3RydWN0b3IocGFyZW50LCB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnMsIHZhbHVlQWNjZXNzb3JzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBFdmVudCBlbWl0dGVyIGZvciBwcm9kdWNpbmcgdGhlIGBuZ01vZGVsQ2hhbmdlYCBldmVudCBhZnRlcgogICAgICAgICAqIHRoZSB2aWV3IG1vZGVsIHVwZGF0ZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy51cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwogICAgICAgIHRoaXMuX3Jhd1ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzIHx8IFtdOwogICAgICAgIHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyA9IGFzeW5jVmFsaWRhdG9ycyB8fCBbXTsKICAgICAgICB0aGlzLnZhbHVlQWNjZXNzb3IgPSBzZWxlY3RWYWx1ZUFjY2Vzc29yKHRoaXMsIHZhbHVlQWNjZXNzb3JzKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlCiAgICAgKiBvbmx5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgdGhpcy5fY2hlY2tGb3JFcnJvcnMoKTsKICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWQpCiAgICAgICAgICAgIHRoaXMuX3NldFVwQ29udHJvbCgpOwogICAgICAgIGlmICgnaXNEaXNhYmxlZCcgaW4gY2hhbmdlcykgewogICAgICAgICAgICB0aGlzLl91cGRhdGVEaXNhYmxlZChjaGFuZ2VzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUHJvcGVydHlVcGRhdGVkKGNoYW5nZXMsIHRoaXMudmlld01vZGVsKSkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZSh0aGlzLm1vZGVsKTsKICAgICAgICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgYmVmb3JlIHRoZSBkaXJlY3RpdmUncyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuIEZvciBpbnRlcm5hbAogICAgICogdXNlIG9ubHkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUgJiYgdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUNvbnRyb2wodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC4KICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGF0aCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gY29udHJvbFBhdGgodGhpcy5uYW1lLCB0aGlzLl9wYXJlbnQpIDogW3RoaXMubmFtZV07CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSB0b3AtbGV2ZWwgZGlyZWN0aXZlIGZvciB0aGlzIGNvbnRyb2wgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIG51bGwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZm9ybURpcmVjdGl2ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmUgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBTeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24gY29tcG9zZWQgb2YgYWxsIHRoZSBzeW5jaHJvbm91cyB2YWxpZGF0b3JzCiAgICAgKiByZWdpc3RlcmVkIHdpdGggdGhpcyBkaXJlY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdmFsaWRhdG9yKCkgewogICAgICAgIHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl9yYXdWYWxpZGF0b3JzKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgYXN5bmMgdmFsaWRhdG9ycyByZWdpc3RlcmVkIHdpdGggdGhpcwogICAgICogZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFzeW5jVmFsaWRhdG9yKCkgewogICAgICAgIHJldHVybiBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZpZXcgbW9kZWwgYW5kIGVtaXRzIGFuIGBuZ01vZGVsQ2hhbmdlYCBldmVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgZW1pdHRlZCBieSBgbmdNb2RlbENoYW5nZWAuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2aWV3VG9Nb2RlbFVwZGF0ZShuZXdWYWx1ZSkgewogICAgICAgIHRoaXMudmlld01vZGVsID0gbmV3VmFsdWU7CiAgICAgICAgdGhpcy51cGRhdGUuZW1pdChuZXdWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VXBDb250cm9sKCkgewogICAgICAgIHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KCk7CiAgICAgICAgdGhpcy5faXNTdGFuZGFsb25lKCkgPyB0aGlzLl9zZXRVcFN0YW5kYWxvbmUoKSA6IHRoaXMuZm9ybURpcmVjdGl2ZS5hZGRDb250cm9sKHRoaXMpOwogICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFVwZGF0ZVN0cmF0ZWd5KCkgewogICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZU9uICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5jb250cm9sLl91cGRhdGVPbiA9IHRoaXMub3B0aW9ucy51cGRhdGVPbjsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNTdGFuZGFsb25lKCkgewogICAgICAgIHJldHVybiAhdGhpcy5fcGFyZW50IHx8ICEhKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc3RhbmRhbG9uZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0VXBTdGFuZGFsb25lKCkgewogICAgICAgIHNldFVwQ29udHJvbCh0aGlzLmNvbnRyb2wsIHRoaXMpOwogICAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jaGVja0ZvckVycm9ycygpIHsKICAgICAgICBpZiAoIXRoaXMuX2lzU3RhbmRhbG9uZSgpKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jaGVja05hbWUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jaGVja1BhcmVudFR5cGUoKSB7CiAgICAgICAgaWYgKCEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTmdNb2RlbEdyb3VwKSAmJgogICAgICAgICAgICB0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSkgewogICAgICAgICAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5mb3JtR3JvdXBOYW1lRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTmdNb2RlbEdyb3VwKSAmJiAhKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIE5nRm9ybSkpIHsKICAgICAgICAgICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubW9kZWxQYXJlbnRFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tOYW1lKCkgewogICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgIGlmICghdGhpcy5faXNTdGFuZGFsb25lKCkgJiYgIXRoaXMubmFtZSkgewogICAgICAgICAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5taXNzaW5nTmFtZUV4Y2VwdGlvbigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVWYWx1ZSh2YWx1ZSkgewogICAgICAgIHJlc29sdmVkUHJvbWlzZSQxLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdFZpZXdUb01vZGVsQ2hhbmdlOiBmYWxzZSB9KTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVEaXNhYmxlZChjaGFuZ2VzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpc2FibGVkVmFsdWUgPSBjaGFuZ2VzWydpc0Rpc2FibGVkJ10uY3VycmVudFZhbHVlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gZGlzYWJsZWRWYWx1ZSA9PT0gJycgfHwgKGRpc2FibGVkVmFsdWUgJiYgZGlzYWJsZWRWYWx1ZSAhPT0gJ2ZhbHNlJyk7CiAgICAgICAgcmVzb2x2ZWRQcm9taXNlJDEudGhlbigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChpc0Rpc2FibGVkICYmICF0aGlzLmNvbnRyb2wuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWlzRGlzYWJsZWQgJiYgdGhpcy5jb250cm9sLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuZW5hYmxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9Cn0KTmdNb2RlbC7JtWZhYyA9IGZ1bmN0aW9uIE5nTW9kZWxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdNb2RlbCkoybXJtWRpcmVjdGl2ZUluamVjdChDb250cm9sQ29udGFpbmVyLCA5KSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SLCAxMCkpOyB9OwpOZ01vZGVsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nTW9kZWwsIHNlbGVjdG9yczogW1siIiwgIm5nTW9kZWwiLCAiIiwgMywgImZvcm1Db250cm9sTmFtZSIsICIiLCAzLCAiZm9ybUNvbnRyb2wiLCAiIl1dLCBpbnB1dHM6IHsgbmFtZTogIm5hbWUiLCBpc0Rpc2FibGVkOiBbImRpc2FibGVkIiwgImlzRGlzYWJsZWQiXSwgbW9kZWw6IFsibmdNb2RlbCIsICJtb2RlbCJdLCBvcHRpb25zOiBbIm5nTW9kZWxPcHRpb25zIiwgIm9wdGlvbnMiXSB9LCBvdXRwdXRzOiB7IHVwZGF0ZTogIm5nTW9kZWxDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm5nTW9kZWwiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbZm9ybUNvbnRyb2xCaW5kaW5nXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdNb2RlbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ29udHJvbENvbnRhaW5lciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBIb3N0IH1dIH0sCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxJREFUT1JTLF0gfV0gfSwKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMVUVfQUNDRVNTT1IsXSB9XSB9Cl07Ck5nTW9kZWwucHJvcERlY29yYXRvcnMgPSB7CiAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGlzRGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Rpc2FibGVkJyxdIH1dLAogICAgbW9kZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ25nTW9kZWwnLF0gfV0sCiAgICBvcHRpb25zOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduZ01vZGVsT3B0aW9ucycsXSB9XSwKICAgIHVwZGF0ZTogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ25nTW9kZWxDaGFuZ2UnLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL25nX25vX3ZhbGlkYXRlX2RpcmVjdGl2ZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBkZXNjcmlwdGlvbgogKgogKiBBZGRzIGBub3ZhbGlkYXRlYCBhdHRyaWJ1dGUgdG8gYWxsIGZvcm1zIGJ5IGRlZmF1bHQuCiAqCiAqIGBub3ZhbGlkYXRlYCBpcyB1c2VkIHRvIGRpc2FibGUgYnJvd3NlcidzIG5hdGl2ZSBmb3JtIHZhbGlkYXRpb24uCiAqCiAqIElmIHlvdSB3YW50IHRvIHVzZSBuYXRpdmUgdmFsaWRhdGlvbiB3aXRoIEFuZ3VsYXIgZm9ybXMsIGp1c3QgYWRkIGBuZ05hdGl2ZVZhbGlkYXRlYCBhdHRyaWJ1dGU6CiAqCiAqIGBgYAogKiA8Zm9ybSBuZ05hdGl2ZVZhbGlkYXRlPjwvZm9ybT4KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAqLwpjbGFzcyDJtU5nTm9WYWxpZGF0ZSB7Cn0KybVOZ05vVmFsaWRhdGUuybVmYWMgPSBmdW5jdGlvbiDJtU5nTm9WYWxpZGF0ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCDJtU5nTm9WYWxpZGF0ZSkoKTsgfTsKybVOZ05vVmFsaWRhdGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogybVOZ05vVmFsaWRhdGUsIHNlbGVjdG9yczogW1siZm9ybSIsIDMsICJuZ05vRm9ybSIsICIiLCAzLCAibmdOYXRpdmVWYWxpZGF0ZSIsICIiXV0sIGhvc3RBdHRyczogWyJub3ZhbGlkYXRlIiwgIiJdIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmVhY3RpdmVfZGlyZWN0aXZlcy9mb3JtX2NvbnRyb2xfZGlyZWN0aXZlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUb2tlbiB0byBwcm92aWRlIHRvIHR1cm4gb2ZmIHRoZSBuZ01vZGVsIHdhcm5pbmcgb24gZm9ybUNvbnRyb2wgYW5kIGZvcm1Db250cm9sTmFtZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBOR19NT0RFTF9XSVRIX0ZPUk1fQ09OVFJPTF9XQVJOSU5HID0gbmV3IEluamVjdGlvblRva2VuKCdOZ01vZGVsV2l0aEZvcm1Db250cm9sV2FybmluZycpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGZvcm1Db250cm9sQmluZGluZyQxID0gewogICAgcHJvdmlkZTogTmdDb250cm9sLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gRm9ybUNvbnRyb2xEaXJlY3RpdmUpKQp9OwovKioKICogXEBkZXNjcmlwdGlvbgogKiBTeW5jaHJvbml6ZXMgYSBzdGFuZGFsb25lIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgdG8gYSBmb3JtIGNvbnRyb2wgZWxlbWVudC4KICoKICogTm90ZSB0aGF0IHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBgbmdNb2RlbGAgaW5wdXQgcHJvcGVydHkgYW5kIGBuZ01vZGVsQ2hhbmdlYCBldmVudCB3aXRoIHJlYWN0aXZlCiAqIGZvcm0gZGlyZWN0aXZlcyB3YXMgZGVwcmVjYXRlZCBpbiBBbmd1bGFyIHY2IGFuZCBpcyBzY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4KICogYSBmdXR1cmUgdmVyc2lvbiBvZiBBbmd1bGFyLgogKiBGb3IgZGV0YWlscywgc2VlIFtEZXByZWNhdGVkIGZlYXR1cmVzXShndWlkZS9kZXByZWNhdGlvbnMjbmdtb2RlbC13aXRoLXJlYWN0aXZlLWZvcm1zKS4KICoKICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKQogKiBAc2VlIGBGb3JtQ29udHJvbGAKICogQHNlZSBgQWJzdHJhY3RDb250cm9sYAogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byByZWdpc3RlciBhIHN0YW5kYWxvbmUgY29udHJvbCBhbmQgc2V0IGl0cyB2YWx1ZS4KICoKICoge1xAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtQ29udHJvbC9zaW1wbGVfZm9ybV9jb250cm9sX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfQogKgogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEZvcm1Db250cm9sRGlyZWN0aXZlIGV4dGVuZHMgTmdDb250cm9sIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWxpZGF0b3JzCiAgICAgKiBAcGFyYW0gez99IGFzeW5jVmFsaWRhdG9ycwogICAgICogQHBhcmFtIHs/fSB2YWx1ZUFjY2Vzc29ycwogICAgICogQHBhcmFtIHs/fSBfbmdNb2RlbFdhcm5pbmdDb25maWcKICAgICAqLwogICAgY29uc3RydWN0b3IodmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzLCB2YWx1ZUFjY2Vzc29ycywgX25nTW9kZWxXYXJuaW5nQ29uZmlnKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZyA9IF9uZ01vZGVsV2FybmluZ0NvbmZpZzsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBhcyBvZiB2NgogICAgICAgICAqLwogICAgICAgIHRoaXMudXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBJbnN0YW5jZSBwcm9wZXJ0eSB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgYW4gbmdNb2RlbCB3YXJuaW5nIGhhcyBiZWVuIHNlbnQgb3V0IGZvciB0aGlzCiAgICAgICAgICogcGFydGljdWxhciBgRm9ybUNvbnRyb2xEaXJlY3RpdmVgIGluc3RhbmNlLiBVc2VkIHRvIHN1cHBvcnQgd2FybmluZyBjb25maWcgb2YgImFsd2F5cyIuCiAgICAgICAgICoKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmdNb2RlbFdhcm5pbmdTZW50ID0gZmFsc2U7CiAgICAgICAgdGhpcy5fcmF3VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMgfHwgW107CiAgICAgICAgdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzIHx8IFtdOwogICAgICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUcmlnZ2VycyBhIHdhcm5pbmcgdGhhdCB0aGlzIGlucHV0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHJlYWN0aXZlIGZvcm1zLgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgaXNEaXNhYmxlZChpc0Rpc2FibGVkKSB7CiAgICAgICAgUmVhY3RpdmVFcnJvcnMuZGlzYWJsZWRBdHRyV2FybmluZygpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2UKICAgICAqIG9ubHkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzIEEgb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBmb3IgdGhlIHNldCBvZiBjaGFuZ2VkIGlucHV0cy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICBpZiAodGhpcy5faXNDb250cm9sQ2hhbmdlZChjaGFuZ2VzKSkgewogICAgICAgICAgICBzZXRVcENvbnRyb2wodGhpcy5mb3JtLCB0aGlzKTsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5kaXNhYmxlZCAmJiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy52YWx1ZUFjY2Vzc29yKSkuc2V0RGlzYWJsZWRTdGF0ZSkgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzLnZhbHVlQWNjZXNzb3IpKS5zZXREaXNhYmxlZFN0YXRlKSkodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdGhpcy52aWV3TW9kZWwpKSB7CiAgICAgICAgICAgIF9uZ01vZGVsV2FybmluZygnZm9ybUNvbnRyb2wnLCBGb3JtQ29udHJvbERpcmVjdGl2ZSwgdGhpcywgdGhpcy5fbmdNb2RlbFdhcm5pbmdDb25maWcpOwogICAgICAgICAgICB0aGlzLmZvcm0uc2V0VmFsdWUodGhpcy5tb2RlbCk7CiAgICAgICAgICAgIHRoaXMudmlld01vZGVsID0gdGhpcy5tb2RlbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC4KICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGF0aCgpIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMKICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpcmVjdGl2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB2YWxpZGF0b3IoKSB7CiAgICAgICAgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3Jhd1ZhbGlkYXRvcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBc3luYyB2YWxpZGF0b3IgZnVuY3Rpb24gY29tcG9zZWQgb2YgYWxsIHRoZSBhc3luYyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzCiAgICAgKiBkaXJlY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgYXN5bmNWYWxpZGF0b3IoKSB7CiAgICAgICAgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIGBGb3JtQ29udHJvbGAgYm91bmQgdG8gdGhpcyBkaXJlY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY29udHJvbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb3JtOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBTZXRzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2aWV3IG1vZGVsIGFuZCBlbWl0cyBhbiBgbmdNb2RlbENoYW5nZWAgZXZlbnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlKSB7CiAgICAgICAgdGhpcy52aWV3TW9kZWwgPSBuZXdWYWx1ZTsKICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KG5ld1ZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2lzQ29udHJvbENoYW5nZWQoY2hhbmdlcykgewogICAgICAgIHJldHVybiBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdmb3JtJyk7CiAgICB9Cn0KRm9ybUNvbnRyb2xEaXJlY3RpdmUuybVmYWMgPSBmdW5jdGlvbiBGb3JtQ29udHJvbERpcmVjdGl2ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb3JtQ29udHJvbERpcmVjdGl2ZSkoybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfTU9ERUxfV0lUSF9GT1JNX0NPTlRST0xfV0FSTklORywgOCkpOyB9OwpGb3JtQ29udHJvbERpcmVjdGl2ZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBGb3JtQ29udHJvbERpcmVjdGl2ZSwgc2VsZWN0b3JzOiBbWyIiLCAiZm9ybUNvbnRyb2wiLCAiIl1dLCBpbnB1dHM6IHsgaXNEaXNhYmxlZDogWyJkaXNhYmxlZCIsICJpc0Rpc2FibGVkIl0sIGZvcm06IFsiZm9ybUNvbnRyb2wiLCAiZm9ybSJdLCBtb2RlbDogWyJuZ01vZGVsIiwgIm1vZGVsIl0gfSwgb3V0cHV0czogeyB1cGRhdGU6ICJuZ01vZGVsQ2hhbmdlIiB9LCBleHBvcnRBczogWyJuZ0Zvcm0iXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbZm9ybUNvbnRyb2xCaW5kaW5nJDFdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFN0YXRpYyBwcm9wZXJ0eSB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgYW55IG5nTW9kZWwgd2FybmluZ3MgaGF2ZSBiZWVuIHNlbnQgYWNyb3NzCiAqIGFsbCBpbnN0YW5jZXMgb2YgRm9ybUNvbnRyb2xEaXJlY3RpdmUuIFVzZWQgdG8gc3VwcG9ydCB3YXJuaW5nIGNvbmZpZyBvZiAib25jZSIuCiAqCiAqIFxAaW50ZXJuYWwKICovCkZvcm1Db250cm9sRGlyZWN0aXZlLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlID0gZmFsc2U7Ci8qKiBAbm9jb2xsYXBzZSAqLwpGb3JtQ29udHJvbERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfQVNZTkNfVkFMSURBVE9SUyxdIH1dIH0sCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxVRV9BQ0NFU1NPUixdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19NT0RFTF9XSVRIX0ZPUk1fQ09OVFJPTF9XQVJOSU5HLF0gfV0gfQpdOwpGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGZvcm06IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Zvcm1Db250cm9sJyxdIH1dLAogICAgaXNEaXNhYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZGlzYWJsZWQnLF0gfV0sCiAgICBtb2RlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdNb2RlbCcsXSB9XSwKICAgIHVwZGF0ZTogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ25nTW9kZWxDaGFuZ2UnLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL3JlYWN0aXZlX2RpcmVjdGl2ZXMvZm9ybV9ncm91cF9kaXJlY3RpdmUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBmb3JtRGlyZWN0aXZlUHJvdmlkZXIkMSA9IHsKICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBGb3JtR3JvdXBEaXJlY3RpdmUpKQp9OwovKioKICogXEBkZXNjcmlwdGlvbgogKgogKiBCaW5kcyBhbiBleGlzdGluZyBgRm9ybUdyb3VwYCB0byBhIERPTSBlbGVtZW50LgogKgogKiBUaGlzIGRpcmVjdGl2ZSBhY2NlcHRzIGFuIGV4aXN0aW5nIGBGb3JtR3JvdXBgIGluc3RhbmNlLiBJdCB3aWxsIHRoZW4gdXNlIHRoaXMKICogYEZvcm1Hcm91cGAgaW5zdGFuY2UgdG8gbWF0Y2ggYW55IGNoaWxkIGBGb3JtQ29udHJvbGAsIGBGb3JtR3JvdXBgLAogKiBhbmQgYEZvcm1BcnJheWAgaW5zdGFuY2VzIHRvIGNoaWxkIGBGb3JtQ29udHJvbE5hbWVgLCBgRm9ybUdyb3VwTmFtZWAsCiAqIGFuZCBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlcy4KICoKICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKQogKiBAc2VlIGBBYnN0cmFjdENvbnRyb2xgCiAqCiAqICMjIyBSZWdpc3RlciBGb3JtIEdyb3VwCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWdpc3RlcnMgYSBgRm9ybUdyb3VwYCB3aXRoIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZSBjb250cm9scywKICogYW5kIGxpc3RlbnMgZm9yIHRoZSAqbmdTdWJtaXQqIGV2ZW50IHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLgogKgogKiB7XEBleGFtcGxlIGZvcm1zL3RzL3NpbXBsZUZvcm1Hcm91cC9zaW1wbGVfZm9ybV9ncm91cF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBGb3JtR3JvdXBEaXJlY3RpdmUgZXh0ZW5kcyBDb250cm9sQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfdmFsaWRhdG9ycwogICAgICogQHBhcmFtIHs/fSBfYXN5bmNWYWxpZGF0b3JzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92YWxpZGF0b3JzLCBfYXN5bmNWYWxpZGF0b3JzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl92YWxpZGF0b3JzID0gX3ZhbGlkYXRvcnM7CiAgICAgICAgdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gX2FzeW5jVmFsaWRhdG9yczsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBmb3JtIHN1Ym1pc3Npb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRyYWNrcyB0aGUgbGlzdCBvZiBhZGRlZCBgRm9ybUNvbnRyb2xOYW1lYCBpbnN0YW5jZXMKICAgICAgICAgKi8KICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVHJhY2tzIHRoZSBgRm9ybUdyb3VwYCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmZvcm0gPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBmb3JtIHN1Ym1pc3Npb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMubmdTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzIGNoYW5nZS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgdGhpcy5fY2hlY2tGb3JtUHJlc2VudCgpOwogICAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdmb3JtJykpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmFsaWRhdG9ycygpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVEb21WYWx1ZSgpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVSZWdpc3RyYXRpb25zKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXR1cm5zIHRoaXMgZGlyZWN0aXZlJ3MgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZm9ybURpcmVjdGl2ZSgpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmV0dXJucyB0aGUgYEZvcm1Hcm91cGAgYm91bmQgdG8gdGhpcyBkaXJlY3RpdmUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY29udHJvbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb3JtOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGlzIGdyb3VwLiBCZWNhdXNlIHRoaXMgZGlyZWN0aXZlCiAgICAgKiBhbHdheXMgbGl2ZXMgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZvcm0sIGl0IGFsd2F5cyBhbiBlbXB0eSBhcnJheS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXRoKCkgewogICAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogTWV0aG9kIHRoYXQgc2V0cyB1cCB0aGUgY29udHJvbCBkaXJlY3RpdmUgaW4gdGhpcyBncm91cCwgcmUtY2FsY3VsYXRlcyBpdHMgdmFsdWUKICAgICAqIGFuZCB2YWxpZGl0eSwgYW5kIGFkZHMgdGhlIGluc3RhbmNlIHRvIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGRpcmVjdGl2ZXMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtQ29udHJvbE5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZENvbnRyb2woZGlyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKTsKICAgICAgICBzZXRVcENvbnRyb2woY3RybCwgZGlyKTsKICAgICAgICBjdHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgIHRoaXMuZGlyZWN0aXZlcy5wdXNoKGRpcik7CiAgICAgICAgcmV0dXJuIGN0cmw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJldHJpZXZlcyB0aGUgYEZvcm1Db250cm9sYCBpbnN0YW5jZSBmcm9tIHRoZSBwcm92aWRlZCBgRm9ybUNvbnRyb2xOYW1lYCBkaXJlY3RpdmUKICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Q29udHJvbChkaXIpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlbW92ZXMgdGhlIGBGb3JtQ29udHJvbE5hbWVgIGluc3RhbmNlIGZyb20gdGhlIGludGVybmFsIGxpc3Qgb2YgZGlyZWN0aXZlcwogICAgICoKICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgRm9ybUNvbnRyb2xOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVDb250cm9sKGRpcikgewogICAgICAgIHJlbW92ZURpcih0aGlzLmRpcmVjdGl2ZXMsIGRpcik7CiAgICB9CiAgICAvKioKICAgICAqIEFkZHMgYSBuZXcgYEZvcm1Hcm91cE5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZSB0byB0aGUgZm9ybS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYEZvcm1Hcm91cE5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEZvcm1Hcm91cChkaXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpOwogICAgICAgIHNldFVwRm9ybUNvbnRhaW5lcihjdHJsLCBkaXIpOwogICAgICAgIGN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICB9CiAgICAvKioKICAgICAqIE5vLW9wIG1ldGhvZCB0byByZW1vdmUgdGhlIGZvcm0gZ3JvdXAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVGb3JtR3JvdXAoZGlyKSB7IH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmV0cmlldmVzIHRoZSBgRm9ybUdyb3VwYCBmb3IgYSBwcm92aWRlZCBgRm9ybUdyb3VwTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRGb3JtR3JvdXAoZGlyKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGRzIGEgbmV3IGBGb3JtQXJyYXlOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UgdG8gdGhlIGZvcm0uCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtQXJyYXlOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRGb3JtQXJyYXkoZGlyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKTsKICAgICAgICBzZXRVcEZvcm1Db250YWluZXIoY3RybCwgZGlyKTsKICAgICAgICBjdHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBOby1vcCBtZXRob2QgdG8gcmVtb3ZlIHRoZSBmb3JtIGFycmF5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlRm9ybUFycmF5KGRpcikgeyB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJldHJpZXZlcyB0aGUgYEZvcm1BcnJheWAgZm9yIGEgcHJvdmlkZWQgYEZvcm1BcnJheU5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYEZvcm1BcnJheU5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEZvcm1BcnJheShkaXIpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGBGb3JtQ29udHJvbE5hbWVgIGRpcmVjdGl2ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgZGlyZWN0aXZlJ3MgY29udHJvbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVwZGF0ZU1vZGVsKGRpciwgdmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3RybCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKSkpOwogICAgICAgIGN0cmwuc2V0VmFsdWUodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBNZXRob2QgY2FsbGVkIHdpdGggdGhlICJzdWJtaXQiIGV2ZW50IGlzIHRyaWdnZXJlZCBvbiB0aGUgZm9ybS4KICAgICAqIFRyaWdnZXJzIHRoZSBgbmdTdWJtaXRgIGVtaXR0ZXIgdG8gZW1pdCB0aGUgInN1Ym1pdCIgZXZlbnQgYXMgaXRzIHBheWxvYWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSAkZXZlbnQgVGhlICJzdWJtaXQiIGV2ZW50IG9iamVjdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25TdWJtaXQoJGV2ZW50KSB7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN1Ym1pdHRlZCA9IHRydWU7CiAgICAgICAgc3luY1BlbmRpbmdDb250cm9scyh0aGlzLmZvcm0sIHRoaXMuZGlyZWN0aXZlcyk7CiAgICAgICAgdGhpcy5uZ1N1Ym1pdC5lbWl0KCRldmVudCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlICJyZXNldCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25SZXNldCgpIHsKICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXNldHMgdGhlIGZvcm0gdG8gYW4gaW5pdGlhbCB2YWx1ZSBhbmQgcmVzZXRzIGl0cyBzdWJtaXR0ZWQgc3RhdHVzLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBmb3JtLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXRGb3JtKHZhbHVlID0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KHZhbHVlKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3VibWl0dGVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVEb21WYWx1ZSgpIHsKICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpciA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3Q3RybCA9IHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpOwogICAgICAgICAgICBpZiAoZGlyLmNvbnRyb2wgIT09IG5ld0N0cmwpIHsKICAgICAgICAgICAgICAgIGNsZWFuVXBDb250cm9sKGRpci5jb250cm9sLCBkaXIpOwogICAgICAgICAgICAgICAgaWYgKG5ld0N0cmwpCiAgICAgICAgICAgICAgICAgICAgc2V0VXBDb250cm9sKG5ld0N0cmwsIGRpcik7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRpcikpKS5jb250cm9sID0gbmV3Q3RybDsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLmZvcm0uX3VwZGF0ZVRyZWVWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlUmVnaXN0cmF0aW9ucygpIHsKICAgICAgICB0aGlzLmZvcm0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuX3VwZGF0ZURvbVZhbHVlKCkpKTsKICAgICAgICBpZiAodGhpcy5fb2xkRm9ybSkKICAgICAgICAgICAgdGhpcy5fb2xkRm9ybS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KSk7CiAgICAgICAgdGhpcy5fb2xkRm9ybSA9IHRoaXMuZm9ybTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF91cGRhdGVWYWxpZGF0b3JzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzeW5jID0gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7CiAgICAgICAgdGhpcy5mb3JtLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS52YWxpZGF0b3IpKSwgKC8qKiBAdHlwZSB7P30gKi8gKHN5bmMpKV0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhc3luYyA9IGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsKICAgICAgICB0aGlzLmZvcm0uYXN5bmNWYWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyhbKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS5hc3luY1ZhbGlkYXRvcikpLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXN5bmMpKV0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrRm9ybVByZXNlbnQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmZvcm0pIHsKICAgICAgICAgICAgUmVhY3RpdmVFcnJvcnMubWlzc2luZ0Zvcm1FeGNlcHRpb24oKTsKICAgICAgICB9CiAgICB9Cn0KRm9ybUdyb3VwRGlyZWN0aXZlLsm1ZmFjID0gZnVuY3Rpb24gRm9ybUdyb3VwRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvcm1Hcm91cERpcmVjdGl2ZSkoybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApKTsgfTsKRm9ybUdyb3VwRGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEZvcm1Hcm91cERpcmVjdGl2ZSwgc2VsZWN0b3JzOiBbWyIiLCAiZm9ybUdyb3VwIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBGb3JtR3JvdXBEaXJlY3RpdmVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigic3VibWl0IiwgZnVuY3Rpb24gRm9ybUdyb3VwRGlyZWN0aXZlX3N1Ym1pdF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25TdWJtaXQoJGV2ZW50KTsgfSkoInJlc2V0IiwgZnVuY3Rpb24gRm9ybUdyb3VwRGlyZWN0aXZlX3Jlc2V0X0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblJlc2V0KCk7IH0pOwogICAgfSB9LCBpbnB1dHM6IHsgZm9ybTogWyJmb3JtR3JvdXAiLCAiZm9ybSJdIH0sIG91dHB1dHM6IHsgbmdTdWJtaXQ6ICJuZ1N1Ym1pdCIgfSwgZXhwb3J0QXM6IFsibmdGb3JtIl0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW2Zvcm1EaXJlY3RpdmVQcm92aWRlciQxXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRm9ybUdyb3VwRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMSURBVE9SUyxdIH1dIH0sCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19BU1lOQ19WQUxJREFUT1JTLF0gfV0gfQpdOwpGb3JtR3JvdXBEaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7CiAgICBmb3JtOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydmb3JtR3JvdXAnLF0gfV0sCiAgICBuZ1N1Ym1pdDogW3sgdHlwZTogT3V0cHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9yZWFjdGl2ZV9kaXJlY3RpdmVzL2Zvcm1fZ3JvdXBfbmFtZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IGZvcm1Hcm91cE5hbWVQcm92aWRlciA9IHsKICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBGb3JtR3JvdXBOYW1lKSkKfTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICoKICogU3luY3MgYSBuZXN0ZWQgYEZvcm1Hcm91cGAgdG8gYSBET00gZWxlbWVudC4KICoKICogVGhpcyBkaXJlY3RpdmUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGBGb3JtR3JvdXBEaXJlY3RpdmVgLgogKgogKiBJdCBhY2NlcHRzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmVzdGVkIGBGb3JtR3JvdXBgIHRvIGxpbmssIGFuZAogKiBsb29rcyBmb3IgYSBgRm9ybUdyb3VwYCByZWdpc3RlcmVkIHdpdGggdGhhdCBuYW1lIGluIHRoZSBwYXJlbnQKICogYEZvcm1Hcm91cGAgaW5zdGFuY2UgeW91IHBhc3NlZCBpbnRvIGBGb3JtR3JvdXBEaXJlY3RpdmVgLgogKgogKiBVc2UgbmVzdGVkIGZvcm0gZ3JvdXBzIHRvIHZhbGlkYXRlIGEgc3ViLWdyb3VwIG9mIGEKICogZm9ybSBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlc3Qgb3IgdG8gZ3JvdXAgdGhlIHZhbHVlcyBvZiBjZXJ0YWluCiAqIGNvbnRyb2xzIGludG8gdGhlaXIgb3duIG5lc3RlZCBvYmplY3QuCiAqCiAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcykKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBBY2Nlc3MgdGhlIGdyb3VwIGJ5IG5hbWUKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgdGhlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI2dldCBnZXR9IG1ldGhvZCB0byBhY2Nlc3MgdGhlCiAqIGFzc29jaWF0ZWQgYEZvcm1Hcm91cGAKICoKICogYGBgdHMKICogICB0aGlzLmZvcm0uZ2V0KCduYW1lJyk7CiAqIGBgYAogKgogKiAjIyMgQWNjZXNzIGluZGl2aWR1YWwgY29udHJvbHMgaW4gdGhlIGdyb3VwCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCNnZXQgZ2V0fSBtZXRob2QgdG8gYWNjZXNzCiAqIGluZGl2aWR1YWwgY29udHJvbHMgd2l0aGluIHRoZSBncm91cCB1c2luZyBkb3Qgc3ludGF4LgogKgogKiBgYGB0cwogKiAgIHRoaXMuZm9ybS5nZXQoJ25hbWUuZmlyc3QnKTsKICogYGBgCiAqCiAqICMjIyBSZWdpc3RlciBhIG5lc3RlZCBgRm9ybUdyb3VwYC4KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlZ2lzdGVycyBhIG5lc3RlZCAqbmFtZSogYEZvcm1Hcm91cGAgd2l0aGluIGFuIGV4aXN0aW5nIGBGb3JtR3JvdXBgLAogKiBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUgbmVzdGVkIGBGb3JtR3JvdXBgIGFuZCBpbmRpdmlkdWFsIGNvbnRyb2xzLgogKgogKiB7XEBleGFtcGxlIGZvcm1zL3RzL25lc3RlZEZvcm1Hcm91cC9uZXN0ZWRfZm9ybV9ncm91cF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBGb3JtR3JvdXBOYW1lIGV4dGVuZHMgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSB2YWxpZGF0b3JzCiAgICAgKiBAcGFyYW0gez99IGFzeW5jVmFsaWRhdG9ycwogICAgICovCiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwogICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzOwogICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdG9ycyA9IGFzeW5jVmFsaWRhdG9yczsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrUGFyZW50VHlwZSgpIHsKICAgICAgICBpZiAoX2hhc0ludmFsaWRQYXJlbnQodGhpcy5fcGFyZW50KSkgewogICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5ncm91cFBhcmVudEV4Y2VwdGlvbigpOwogICAgICAgIH0KICAgIH0KfQpGb3JtR3JvdXBOYW1lLsm1ZmFjID0gZnVuY3Rpb24gRm9ybUdyb3VwTmFtZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb3JtR3JvdXBOYW1lKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbnRyb2xDb250YWluZXIsIDEzKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApKTsgfTsKRm9ybUdyb3VwTmFtZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBGb3JtR3JvdXBOYW1lLCBzZWxlY3RvcnM6IFtbIiIsICJmb3JtR3JvdXBOYW1lIiwgIiJdXSwgaW5wdXRzOiB7IG5hbWU6IFsiZm9ybUdyb3VwTmFtZSIsICJuYW1lIl0gfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbZm9ybUdyb3VwTmFtZVByb3ZpZGVyXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRm9ybUdyb3VwTmFtZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ29udHJvbENvbnRhaW5lciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBIb3N0IH0sIHsgdHlwZTogU2tpcFNlbGYgfV0gfSwKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfQVNZTkNfVkFMSURBVE9SUyxdIH1dIH0KXTsKRm9ybUdyb3VwTmFtZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG5hbWU6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Zvcm1Hcm91cE5hbWUnLF0gfV0KfTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBmb3JtQXJyYXlOYW1lUHJvdmlkZXIgPSB7CiAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gRm9ybUFycmF5TmFtZSkpCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIFN5bmNzIGEgbmVzdGVkIGBGb3JtQXJyYXlgIHRvIGEgRE9NIGVsZW1lbnQuCiAqCiAqIFRoaXMgZGlyZWN0aXZlIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBhIHBhcmVudCBgRm9ybUdyb3VwRGlyZWN0aXZlYCAoc2VsZWN0b3I6CiAqIGBbZm9ybUdyb3VwXWApLgogKgogKiBJdCBhY2NlcHRzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmVzdGVkIGBGb3JtQXJyYXlgIHlvdSB3YW50IHRvIGxpbmssIGFuZAogKiB3aWxsIGxvb2sgZm9yIGEgYEZvcm1BcnJheWAgcmVnaXN0ZXJlZCB3aXRoIHRoYXQgbmFtZSBpbiB0aGUgcGFyZW50CiAqIGBGb3JtR3JvdXBgIGluc3RhbmNlIHlvdSBwYXNzZWQgaW50byBgRm9ybUdyb3VwRGlyZWN0aXZlYC4KICoKICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKQogKiBAc2VlIGBBYnN0cmFjdENvbnRyb2xgCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgRXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGZvcm1zL3RzL25lc3RlZEZvcm1BcnJheS9uZXN0ZWRfZm9ybV9hcnJheV9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBGb3JtQXJyYXlOYW1lIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAqIEBwYXJhbSB7P30gYXN5bmNWYWxpZGF0b3JzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5fdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7CiAgICAgICAgdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBhcmUgaW5pdGlhbGl6ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqCiAgICAgKiBAdGhyb3dzIElmIHRoZSBkaXJlY3RpdmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHBhcmVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25Jbml0KCkgewogICAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpOwogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm1EaXJlY3RpdmUpKS5hZGRGb3JtQXJyYXkodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgYmVmb3JlIHRoZSBkaXJlY3RpdmUncyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUpIHsKICAgICAgICAgICAgdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUZvcm1BcnJheSh0aGlzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSBgRm9ybUFycmF5YCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250cm9sKCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtRGlyZWN0aXZlKSkuZ2V0Rm9ybUFycmF5KHRoaXMpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgdG9wLWxldmVsIGRpcmVjdGl2ZSBmb3IgdGhpcyBncm91cCBpZiBwcmVzZW50LCBvdGhlcndpc2UgbnVsbC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmUpKSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC4KICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGF0aCgpIHsKICAgICAgICByZXR1cm4gY29udHJvbFBhdGgodGhpcy5uYW1lID09IG51bGwgPyB0aGlzLm5hbWUgOiB0aGlzLm5hbWUudG9TdHJpbmcoKSwgdGhpcy5fcGFyZW50KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogU3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycyByZWdpc3RlcmVkIHdpdGggdGhpcwogICAgICogZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFzeW5jVmFsaWRhdG9yKCkgewogICAgICAgIHJldHVybiBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHRoaXMuX2FzeW5jVmFsaWRhdG9ycyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tQYXJlbnRUeXBlKCkgewogICAgICAgIGlmIChfaGFzSW52YWxpZFBhcmVudCh0aGlzLl9wYXJlbnQpKSB7CiAgICAgICAgICAgIFJlYWN0aXZlRXJyb3JzLmFycmF5UGFyZW50RXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgfQp9CkZvcm1BcnJheU5hbWUuybVmYWMgPSBmdW5jdGlvbiBGb3JtQXJyYXlOYW1lX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvcm1BcnJheU5hbWUpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ29udHJvbENvbnRhaW5lciwgMTMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX1ZBTElEQVRPUlMsIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19BU1lOQ19WQUxJREFUT1JTLCAxMCkpOyB9OwpGb3JtQXJyYXlOYW1lLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEZvcm1BcnJheU5hbWUsIHNlbGVjdG9yczogW1siIiwgImZvcm1BcnJheU5hbWUiLCAiIl1dLCBpbnB1dHM6IHsgbmFtZTogWyJmb3JtQXJyYXlOYW1lIiwgIm5hbWUiXSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtmb3JtQXJyYXlOYW1lUHJvdmlkZXJdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpGb3JtQXJyYXlOYW1lLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBDb250cm9sQ29udGFpbmVyLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMSURBVE9SUyxdIH1dIH0sCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19BU1lOQ19WQUxJREFUT1JTLF0gfV0gfQpdOwpGb3JtQXJyYXlOYW1lLnByb3BEZWNvcmF0b3JzID0gewogICAgbmFtZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZm9ybUFycmF5TmFtZScsXSB9XQp9OwovKioKICogQHBhcmFtIHs/fSBwYXJlbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9oYXNJbnZhbGlkUGFyZW50KHBhcmVudCkgewogICAgcmV0dXJuICEocGFyZW50IGluc3RhbmNlb2YgRm9ybUdyb3VwTmFtZSkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBEaXJlY3RpdmUpICYmCiAgICAgICAgIShwYXJlbnQgaW5zdGFuY2VvZiBGb3JtQXJyYXlOYW1lKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmVhY3RpdmVfZGlyZWN0aXZlcy9mb3JtX2NvbnRyb2xfbmFtZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IGNvbnRyb2xOYW1lQmluZGluZyA9IHsKICAgIHByb3ZpZGU6IE5nQ29udHJvbCwKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IEZvcm1Db250cm9sTmFtZSkpCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFN5bmNzIGEgYEZvcm1Db250cm9sYCBpbiBhbiBleGlzdGluZyBgRm9ybUdyb3VwYCB0byBhIGZvcm0gY29udHJvbAogKiBlbGVtZW50IGJ5IG5hbWUuCiAqCiAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcykKICogQHNlZSBgRm9ybUNvbnRyb2xgCiAqIEBzZWUgYEFic3RyYWN0Q29udHJvbGAKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBSZWdpc3RlciBgRm9ybUNvbnRyb2xgIHdpdGhpbiBhIGdyb3VwCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgZm9ybSBjb250cm9scyB3aXRoaW4gYSBmb3JtIGdyb3VwCiAqIGFuZCBzZXQgdGhlaXIgdmFsdWUuCiAqCiAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvc2ltcGxlRm9ybUdyb3VwL3NpbXBsZV9mb3JtX2dyb3VwX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfQogKgogKiBUbyBzZWUgYGZvcm1Db250cm9sTmFtZWAgZXhhbXBsZXMgd2l0aCBkaWZmZXJlbnQgZm9ybSBjb250cm9sIHR5cGVzLCBzZWU6CiAqCiAqICogUmFkaW8gYnV0dG9uczogYFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JgCiAqICogU2VsZWN0czogYFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yYAogKgogKiAjIyMgVXNlIHdpdGggbmdNb2RlbCBpcyBkZXByZWNhdGVkCiAqCiAqIFN1cHBvcnQgZm9yIHVzaW5nIHRoZSBgbmdNb2RlbGAgaW5wdXQgcHJvcGVydHkgYW5kIGBuZ01vZGVsQ2hhbmdlYCBldmVudCB3aXRoIHJlYWN0aXZlCiAqIGZvcm0gZGlyZWN0aXZlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIEFuZ3VsYXIgdjYgYW5kIGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbgogKiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEFuZ3VsYXIuCiAqCiAqIEZvciBkZXRhaWxzLCBzZWUgW0RlcHJlY2F0ZWQgZmVhdHVyZXNdKGd1aWRlL2RlcHJlY2F0aW9ucyNuZ21vZGVsLXdpdGgtcmVhY3RpdmUtZm9ybXMpLgogKgogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEZvcm1Db250cm9sTmFtZSBleHRlbmRzIE5nQ29udHJvbCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAqIEBwYXJhbSB7P30gYXN5bmNWYWxpZGF0b3JzCiAgICAgKiBAcGFyYW0gez99IHZhbHVlQWNjZXNzb3JzCiAgICAgKiBAcGFyYW0gez99IF9uZ01vZGVsV2FybmluZ0NvbmZpZwogICAgICovCiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycywgdmFsdWVBY2Nlc3NvcnMsIF9uZ01vZGVsV2FybmluZ0NvbmZpZykgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fbmdNb2RlbFdhcm5pbmdDb25maWcgPSBfbmdNb2RlbFdhcm5pbmdDb25maWc7CiAgICAgICAgdGhpcy5fYWRkZWQgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBhcyBvZiB2NgogICAgICAgICAqLwogICAgICAgIHRoaXMudXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBJbnN0YW5jZSBwcm9wZXJ0eSB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgYW4gbmdNb2RlbCB3YXJuaW5nIGhhcyBiZWVuIHNlbnQgb3V0IGZvciB0aGlzCiAgICAgICAgICogcGFydGljdWxhciBGb3JtQ29udHJvbE5hbWUgaW5zdGFuY2UuIFVzZWQgdG8gc3VwcG9ydCB3YXJuaW5nIGNvbmZpZyBvZiAiYWx3YXlzIi4KICAgICAgICAgKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZ01vZGVsV2FybmluZ1NlbnQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5fcmF3VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMgfHwgW107CiAgICAgICAgdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzIHx8IFtdOwogICAgICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUcmlnZ2VycyBhIHdhcm5pbmcgdGhhdCB0aGlzIGlucHV0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHJlYWN0aXZlIGZvcm1zLgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgaXNEaXNhYmxlZChpc0Rpc2FibGVkKSB7CiAgICAgICAgUmVhY3RpdmVFcnJvcnMuZGlzYWJsZWRBdHRyV2FybmluZygpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGlmICghdGhpcy5fYWRkZWQpCiAgICAgICAgICAgIHRoaXMuX3NldFVwQ29udHJvbCgpOwogICAgICAgIGlmIChpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB0aGlzLnZpZXdNb2RlbCkpIHsKICAgICAgICAgICAgX25nTW9kZWxXYXJuaW5nKCdmb3JtQ29udHJvbE5hbWUnLCBGb3JtQ29udHJvbE5hbWUsIHRoaXMsIHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnKTsKICAgICAgICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsOwogICAgICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUudXBkYXRlTW9kZWwodGhpcywgdGhpcy5tb2RlbCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZSkgewogICAgICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZpZXcgbW9kZWwgYW5kIGVtaXRzIGFuIGBuZ01vZGVsQ2hhbmdlYCBldmVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2aWV3IG1vZGVsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWUpIHsKICAgICAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlOwogICAgICAgIHRoaXMudXBkYXRlLmVtaXQobmV3VmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgcGF0aCBmcm9tIHRoZSB0b3AtbGV2ZWwgZm9ybSB0byB0aGlzIGNvbnRyb2wuCiAgICAgKiBFYWNoIGluZGV4IGlzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgY29udHJvbCBvbiB0aGF0IGxldmVsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIGNvbnRyb2xQYXRoKHRoaXMubmFtZSA9PSBudWxsID8gdGhpcy5uYW1lIDogdGhpcy5uYW1lLnRvU3RyaW5nKCksICgvKiogQHR5cGUgez99ICovICh0aGlzLl9wYXJlbnQpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSB0b3AtbGV2ZWwgZGlyZWN0aXZlIGZvciB0aGlzIGdyb3VwIGlmIHByZXNlbnQsIG90aGVyd2lzZSBudWxsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGZvcm1EaXJlY3RpdmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5mb3JtRGlyZWN0aXZlIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogU3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycwogICAgICogcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fcmF3VmFsaWRhdG9ycyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKICAgICAqIGRpcmVjdGl2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBhc3luY1ZhbGlkYXRvcigpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NoZWNrUGFyZW50VHlwZSgpIHsKICAgICAgICBpZiAoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBOYW1lKSAmJgogICAgICAgICAgICB0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSkgewogICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5uZ01vZGVsR3JvdXBFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBOYW1lKSAmJiAhKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEZvcm1Hcm91cERpcmVjdGl2ZSkgJiYKICAgICAgICAgICAgISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBGb3JtQXJyYXlOYW1lKSkgewogICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5jb250cm9sUGFyZW50RXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFVwQ29udHJvbCgpIHsKICAgICAgICB0aGlzLl9jaGVja1BhcmVudFR5cGUoKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuY29udHJvbCA9IHRoaXMuZm9ybURpcmVjdGl2ZS5hZGRDb250cm9sKHRoaXMpOwogICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZGlzYWJsZWQgJiYgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMudmFsdWVBY2Nlc3NvcikpLnNldERpc2FibGVkU3RhdGUpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzLnZhbHVlQWNjZXNzb3IpKS5zZXREaXNhYmxlZFN0YXRlKSkodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZTsKICAgIH0KfQpGb3JtQ29udHJvbE5hbWUuybVmYWMgPSBmdW5jdGlvbiBGb3JtQ29udHJvbE5hbWVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRm9ybUNvbnRyb2xOYW1lKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbnRyb2xDb250YWluZXIsIDEzKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfTU9ERUxfV0lUSF9GT1JNX0NPTlRST0xfV0FSTklORywgOCkpOyB9OwpGb3JtQ29udHJvbE5hbWUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRm9ybUNvbnRyb2xOYW1lLCBzZWxlY3RvcnM6IFtbIiIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl1dLCBpbnB1dHM6IHsgaXNEaXNhYmxlZDogWyJkaXNhYmxlZCIsICJpc0Rpc2FibGVkIl0sIG5hbWU6IFsiZm9ybUNvbnRyb2xOYW1lIiwgIm5hbWUiXSwgbW9kZWw6IFsibmdNb2RlbCIsICJtb2RlbCJdIH0sIG91dHB1dHM6IHsgdXBkYXRlOiAibmdNb2RlbENoYW5nZSIgfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbY29udHJvbE5hbWVCaW5kaW5nXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwovKioKICogXEBkZXNjcmlwdGlvbgogKiBTdGF0aWMgcHJvcGVydHkgdXNlZCB0byB0cmFjayB3aGV0aGVyIGFueSBuZ01vZGVsIHdhcm5pbmdzIGhhdmUgYmVlbiBzZW50IGFjcm9zcwogKiBhbGwgaW5zdGFuY2VzIG9mIEZvcm1Db250cm9sTmFtZS4gVXNlZCB0byBzdXBwb3J0IHdhcm5pbmcgY29uZmlnIG9mICJvbmNlIi4KICoKICogXEBpbnRlcm5hbAogKi8KRm9ybUNvbnRyb2xOYW1lLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlID0gZmFsc2U7Ci8qKiBAbm9jb2xsYXBzZSAqLwpGb3JtQ29udHJvbE5hbWUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IENvbnRyb2xDb250YWluZXIsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IFNraXBTZWxmIH1dIH0sCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxJREFUT1JTLF0gfV0gfSwKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMVUVfQUNDRVNTT1IsXSB9XSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfTU9ERUxfV0lUSF9GT1JNX0NPTlRST0xfV0FSTklORyxdIH1dIH0KXTsKRm9ybUNvbnRyb2xOYW1lLnByb3BEZWNvcmF0b3JzID0gewogICAgbmFtZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZm9ybUNvbnRyb2xOYW1lJyxdIH1dLAogICAgaXNEaXNhYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZGlzYWJsZWQnLF0gfV0sCiAgICBtb2RlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdNb2RlbCcsXSB9XSwKICAgIHVwZGF0ZTogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ25nTW9kZWxDaGFuZ2UnLF0gfV0KfTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgUmVxdWlyZWRWYWxpZGF0b3JgIHRvIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBSRVFVSVJFRF9WQUxJREFUT1IgPSB7CiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gUmVxdWlyZWRWYWxpZGF0b3IpKSwKICAgIG11bHRpOiB0cnVlCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JgIHRvIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBDSEVDS0JPWF9SRVFVSVJFRF9WQUxJREFUT1IgPSB7CiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcikpLAogICAgbXVsdGk6IHRydWUKfTsKLyoqCiAqIFxAZGVzY3JpcHRpb24KICogQSBkaXJlY3RpdmUgdGhhdCBhZGRzIHRoZSBgcmVxdWlyZWRgIHZhbGlkYXRvciB0byBhbnkgY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAqIGByZXF1aXJlZGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogKgogKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBBZGRpbmcgYSByZXF1aXJlZCB2YWxpZGF0b3IgdXNpbmcgdGVtcGxhdGUtZHJpdmVuIGZvcm1zCiAqCiAqIGBgYAogKiA8aW5wdXQgbmFtZT0iZnVsbE5hbWUiIG5nTW9kZWwgcmVxdWlyZWQ+CiAqIGBgYAogKgogKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3IgewogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUcmFja3MgY2hhbmdlcyB0byB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJlcXVpcmVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHJlcXVpcmVkKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnOwogICAgICAgIGlmICh0aGlzLl9vbkNoYW5nZSkKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgZW1wdHkuCiAgICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdCBpZiBlbmFibGVkLCBvdGhlcndpc2UgbnVsbC4KICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmFsaWRhdGUoY29udHJvbCkgewogICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVkID8gVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgdmFsaWRhdG9yIGlucHV0cyBjaGFuZ2UuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IGZuOwogICAgfQp9ClJlcXVpcmVkVmFsaWRhdG9yLsm1ZmFjID0gZnVuY3Rpb24gUmVxdWlyZWRWYWxpZGF0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmVxdWlyZWRWYWxpZGF0b3IpKCk7IH07ClJlcXVpcmVkVmFsaWRhdG9yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IFJlcXVpcmVkVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbIiIsICJyZXF1aXJlZCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiIsIDMsICJ0eXBlIiwgImNoZWNrYm94Il0sIFsiIiwgInJlcXVpcmVkIiwgIiIsICJmb3JtQ29udHJvbCIsICIiLCAzLCAidHlwZSIsICJjaGVja2JveCJdLCBbIiIsICJyZXF1aXJlZCIsICIiLCAibmdNb2RlbCIsICIiLCAzLCAidHlwZSIsICJjaGVja2JveCJdXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gUmVxdWlyZWRWYWxpZGF0b3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhdHRyaWJ1dGUoInJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkID8gIiIgOiBudWxsKTsKICAgIH0gfSwgaW5wdXRzOiB7IHJlcXVpcmVkOiAicmVxdWlyZWQiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW1JFUVVJUkVEX1ZBTElEQVRPUl0pXSB9KTsKUmVxdWlyZWRWYWxpZGF0b3IucHJvcERlY29yYXRvcnMgPSB7CiAgICByZXF1aXJlZDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIEEgRGlyZWN0aXZlIHRoYXQgYWRkcyB0aGUgYHJlcXVpcmVkYCB2YWxpZGF0b3IgdG8gY2hlY2tib3ggY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAqIGByZXF1aXJlZGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogKgogKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBBZGRpbmcgYSByZXF1aXJlZCBjaGVja2JveCB2YWxpZGF0b3IgdXNpbmcgdGVtcGxhdGUtZHJpdmVuIGZvcm1zCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgY2hlY2tib3ggcmVxdWlyZWQgdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuCiAqIG5nTW9kZWwgYmluZGluZy4KICoKICogYGBgCiAqIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYWN0aXZlIiBuZ01vZGVsIHJlcXVpcmVkPgogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICovCmNsYXNzIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IgZXh0ZW5kcyBSZXF1aXJlZFZhbGlkYXRvciB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIE1ldGhvZCB0aGF0IHZhbGlkYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgY2hlY2tib3ggaGFzIGJlZW4gY2hlY2tlZC4KICAgICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVuYWJsZWQsIG90aGVyd2lzZSBudWxsLgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB2YWxpZGF0ZShjb250cm9sKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZWQgPyBWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZShjb250cm9sKSA6IG51bGw7CiAgICB9Cn0KQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JfRmFjdG9yeSh0KSB7IHJldHVybiDJtUNoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JfQmFzZUZhY3RvcnkodCB8fCBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yKTsgfTsKQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbImlucHV0IiwgInR5cGUiLCAiY2hlY2tib3giLCAicmVxdWlyZWQiLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgInJlcXVpcmVkIiwgIiIsICJmb3JtQ29udHJvbCIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgInJlcXVpcmVkIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgicmVxdWlyZWQiLCBjdHgucmVxdWlyZWQgPyAiIiA6IG51bGwpOwogICAgfSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtDSEVDS0JPWF9SRVFVSVJFRF9WQUxJREFUT1JdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CmNvbnN0IMm1Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IpOwovKioKICogXEBkZXNjcmlwdGlvbgogKiBQcm92aWRlciB3aGljaCBhZGRzIGBFbWFpbFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVNQUlMX1ZBTElEQVRPUiA9IHsKICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBFbWFpbFZhbGlkYXRvcikpLAogICAgbXVsdGk6IHRydWUKfTsKLyoqCiAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyB0aGUgYGVtYWlsYCB2YWxpZGF0b3IgdG8gY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAqIGBlbWFpbGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogKgogKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBBZGRpbmcgYW4gZW1haWwgdmFsaWRhdG9yCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGFuIGVtYWlsIHZhbGlkYXRvciB0byBhbiBpbnB1dCBhdHRhY2hlZCB0byBhbiBuZ01vZGVsCiAqIGJpbmRpbmcuCiAqCiAqIGBgYAogKiA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImVtYWlsIiBuZ01vZGVsIGVtYWlsPgogKiA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImVtYWlsIiBuZ01vZGVsIGVtYWlsPSJ0cnVlIj4KICogPGlucHV0IHR5cGU9ImVtYWlsIiBuYW1lPSJlbWFpbCIgbmdNb2RlbCBbZW1haWxdPSJ0cnVlIj4KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqLwpjbGFzcyBFbWFpbFZhbGlkYXRvciB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRyYWNrcyBjaGFuZ2VzIHRvIHRoZSBlbWFpbCBhdHRyaWJ1dGUgYm91bmQgdG8gdGhpcyBkaXJlY3RpdmUuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZW1haWwodmFsdWUpIHsKICAgICAgICB0aGlzLl9lbmFibGVkID0gdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZSc7CiAgICAgICAgaWYgKHRoaXMuX29uQ2hhbmdlKQogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBNZXRob2QgdGhhdCB2YWxpZGF0ZXMgd2hldGhlciBhbiBlbWFpbCBhZGRyZXNzIGlzIHZhbGlkLgogICAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiByZXN1bHQgaWYgZW5hYmxlZCwgb3RoZXJ3aXNlIG51bGwuCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZhbGlkYXRlKGNvbnRyb2wpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCA/IFZhbGlkYXRvcnMuZW1haWwoY29udHJvbCkgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgIH0KfQpFbWFpbFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIEVtYWlsVmFsaWRhdG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEVtYWlsVmFsaWRhdG9yKSgpOyB9OwpFbWFpbFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBFbWFpbFZhbGlkYXRvciwgc2VsZWN0b3JzOiBbWyIiLCAiZW1haWwiLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyIiLCAiZW1haWwiLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbIiIsICJlbWFpbCIsICIiLCAibmdNb2RlbCIsICIiXV0sIGlucHV0czogeyBlbWFpbDogImVtYWlsIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtFTUFJTF9WQUxJREFUT1JdKV0gfSk7CkVtYWlsVmFsaWRhdG9yLnByb3BEZWNvcmF0b3JzID0gewogICAgZW1haWw6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYE1pbkxlbmd0aFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1JTl9MRU5HVEhfVkFMSURBVE9SID0gewogICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUywKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IE1pbkxlbmd0aFZhbGlkYXRvcikpLAogICAgbXVsdGk6IHRydWUKfTsKLyoqCiAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0aW9uIHRvIGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZQogKiBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuIFRoZSBkaXJlY3RpdmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAqCiAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oZ3VpZGUvZm9ybS12YWxpZGF0aW9uKQogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEFkZGluZyBhIG1pbmltdW0gbGVuZ3RoIHZhbGlkYXRvcgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIG1pbmltdW0gbGVuZ3RoIHZhbGlkYXRvciB0byBhbiBpbnB1dCBhdHRhY2hlZCB0byBhbgogKiBuZ01vZGVsIGJpbmRpbmcuCiAqCiAqIGBgYGh0bWwKICogPGlucHV0IG5hbWU9ImZpcnN0TmFtZSIgbmdNb2RlbCBtaW5sZW5ndGg9IjQiPgogKiBgYGAKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvciB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzIGNoYW5nZS4gRm9yIGludGVybmFsIHVzZQogICAgICogb25seS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGlmICgnbWlubGVuZ3RoJyBpbiBjaGFuZ2VzKSB7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVZhbGlkYXRvcigpOwogICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpCiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIHZhbHVlIG1lZXRzIGEgbWluaW11bSBsZW5ndGgKICAgICAqIHJlcXVpcmVtZW50LiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdCBpZiBlbmFibGVkLCBvdGhlcndpc2UgbnVsbC4KICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmFsaWRhdGUoY29udHJvbCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbmxlbmd0aCA9PSBudWxsID8gbnVsbCA6IHRoaXMuX3ZhbGlkYXRvcihjb250cm9sKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSB2YWxpZGF0b3IgaW5wdXRzIGNoYW5nZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbikgewogICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY3JlYXRlVmFsaWRhdG9yKCkgewogICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMubWluTGVuZ3RoKHR5cGVvZiB0aGlzLm1pbmxlbmd0aCA9PT0gJ251bWJlcicgPyB0aGlzLm1pbmxlbmd0aCA6IHBhcnNlSW50KHRoaXMubWlubGVuZ3RoLCAxMCkpOwogICAgfQp9Ck1pbkxlbmd0aFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIE1pbkxlbmd0aFZhbGlkYXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNaW5MZW5ndGhWYWxpZGF0b3IpKCk7IH07Ck1pbkxlbmd0aFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNaW5MZW5ndGhWYWxpZGF0b3IsIHNlbGVjdG9yczogW1siIiwgIm1pbmxlbmd0aCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIiIsICJtaW5sZW5ndGgiLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbIiIsICJtaW5sZW5ndGgiLCAiIiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0VmFyczogMSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNaW5MZW5ndGhWYWxpZGF0b3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhdHRyaWJ1dGUoIm1pbmxlbmd0aCIsIGN0eC5taW5sZW5ndGggPyBjdHgubWlubGVuZ3RoIDogbnVsbCk7CiAgICB9IH0sIGlucHV0czogeyBtaW5sZW5ndGg6ICJtaW5sZW5ndGgiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW01JTl9MRU5HVEhfVkFMSURBVE9SXSksIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwpNaW5MZW5ndGhWYWxpZGF0b3IucHJvcERlY29yYXRvcnMgPSB7CiAgICBtaW5sZW5ndGg6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYE1heExlbmd0aFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BWF9MRU5HVEhfVkFMSURBVE9SID0gewogICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUywKICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IE1heExlbmd0aFZhbGlkYXRvcikpLAogICAgbXVsdGk6IHRydWUKfTsKLyoqCiAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyBtYXggbGVuZ3RoIHZhbGlkYXRpb24gdG8gY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAqIGBtYXhsZW5ndGhgIGF0dHJpYnV0ZS4gVGhlIGRpcmVjdGl2ZSBpcyBwcm92aWRlZCB3aXRoIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICoKICogQHNlZSBbRm9ybSBWYWxpZGF0aW9uXShndWlkZS9mb3JtLXZhbGlkYXRpb24pCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgQWRkaW5nIGEgbWF4aW11bSBsZW5ndGggdmFsaWRhdG9yCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgbWF4aW11bSBsZW5ndGggdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuCiAqIG5nTW9kZWwgYmluZGluZy4KICoKICogYGBgaHRtbAogKiA8aW5wdXQgbmFtZT0iZmlyc3ROYW1lIiBuZ01vZGVsIG1heGxlbmd0aD0iMjUiPgogKiBgYGAKICoKICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE1heExlbmd0aFZhbGlkYXRvciB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzIGNoYW5nZS4gRm9yIGludGVybmFsIHVzZQogICAgICogb25seS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGlmICgnbWF4bGVuZ3RoJyBpbiBjaGFuZ2VzKSB7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVZhbGlkYXRvcigpOwogICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpCiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIHZhbHVlIGV4Y2VlZHMKICAgICAqIHRoZSBtYXhpbXVtIGxlbmd0aCByZXF1aXJlbWVudC4KICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdmFsaWRhdGUoY29udHJvbCkgewogICAgICAgIHJldHVybiB0aGlzLm1heGxlbmd0aCAhPSBudWxsID8gdGhpcy5fdmFsaWRhdG9yKGNvbnRyb2wpIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSB2YWxpZGF0b3IgaW5wdXRzIGNoYW5nZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbikgewogICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY3JlYXRlVmFsaWRhdG9yKCkgewogICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMubWF4TGVuZ3RoKHR5cGVvZiB0aGlzLm1heGxlbmd0aCA9PT0gJ251bWJlcicgPyB0aGlzLm1heGxlbmd0aCA6IHBhcnNlSW50KHRoaXMubWF4bGVuZ3RoLCAxMCkpOwogICAgfQp9Ck1heExlbmd0aFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIE1heExlbmd0aFZhbGlkYXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXhMZW5ndGhWYWxpZGF0b3IpKCk7IH07Ck1heExlbmd0aFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXhMZW5ndGhWYWxpZGF0b3IsIHNlbGVjdG9yczogW1siIiwgIm1heGxlbmd0aCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIiIsICJtYXhsZW5ndGgiLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbIiIsICJtYXhsZW5ndGgiLCAiIiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0VmFyczogMSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXhMZW5ndGhWYWxpZGF0b3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhdHRyaWJ1dGUoIm1heGxlbmd0aCIsIGN0eC5tYXhsZW5ndGggPyBjdHgubWF4bGVuZ3RoIDogbnVsbCk7CiAgICB9IH0sIGlucHV0czogeyBtYXhsZW5ndGg6ICJtYXhsZW5ndGgiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW01BWF9MRU5HVEhfVkFMSURBVE9SXSksIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwpNYXhMZW5ndGhWYWxpZGF0b3IucHJvcERlY29yYXRvcnMgPSB7CiAgICBtYXhsZW5ndGg6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYFBhdHRlcm5WYWxpZGF0b3JgIHRvIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBQQVRURVJOX1ZBTElEQVRPUiA9IHsKICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBQYXR0ZXJuVmFsaWRhdG9yKSksCiAgICBtdWx0aTogdHJ1ZQp9OwovKioKICogXEBkZXNjcmlwdGlvbgogKiBBIGRpcmVjdGl2ZSB0aGF0IGFkZHMgcmVnZXggcGF0dGVybiB2YWxpZGF0aW9uIHRvIGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZQogKiBgcGF0dGVybmAgYXR0cmlidXRlLiBUaGUgcmVnZXggbXVzdCBtYXRjaCB0aGUgZW50aXJlIGNvbnRyb2wgdmFsdWUuCiAqIFRoZSBkaXJlY3RpdmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAqCiAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oZ3VpZGUvZm9ybS12YWxpZGF0aW9uKQogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEFkZGluZyBhIHBhdHRlcm4gdmFsaWRhdG9yCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgcGF0dGVybiB2YWxpZGF0b3IgdG8gYW4gaW5wdXQgYXR0YWNoZWQgdG8gYW4KICogbmdNb2RlbCBiaW5kaW5nLgogKgogKiBgYGBodG1sCiAqIDxpbnB1dCBuYW1lPSJmaXJzdE5hbWUiIG5nTW9kZWwgcGF0dGVybj0iW2EtekEtWiBdKiI+CiAqIGBgYAogKgogKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUGF0dGVyblZhbGlkYXRvciB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzIGNoYW5nZS4gRm9yIGludGVybmFsIHVzZQogICAgICogb25seS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGlmICgncGF0dGVybicgaW4gY2hhbmdlcykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVWYWxpZGF0b3IoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX29uQ2hhbmdlKQogICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIE1ldGhvZCB0aGF0IHZhbGlkYXRlcyB3aGV0aGVyIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZQogICAgICogdGhlIHBhdHRlcm4gcmVxdWlyZW1lbnQuCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZhbGlkYXRlKGNvbnRyb2wpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yKGNvbnRyb2wpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jcmVhdGVWYWxpZGF0b3IoKSB7CiAgICAgICAgdGhpcy5fdmFsaWRhdG9yID0gVmFsaWRhdG9ycy5wYXR0ZXJuKHRoaXMucGF0dGVybik7CiAgICB9Cn0KUGF0dGVyblZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIFBhdHRlcm5WYWxpZGF0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGF0dGVyblZhbGlkYXRvcikoKTsgfTsKUGF0dGVyblZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBQYXR0ZXJuVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbIiIsICJwYXR0ZXJuIiwgIiIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiIiwgInBhdHRlcm4iLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbIiIsICJwYXR0ZXJuIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gUGF0dGVyblZhbGlkYXRvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgicGF0dGVybiIsIGN0eC5wYXR0ZXJuID8gY3R4LnBhdHRlcm4gOiBudWxsKTsKICAgIH0gfSwgaW5wdXRzOiB7IHBhdHRlcm46ICJwYXR0ZXJuIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtQQVRURVJOX1ZBTElEQVRPUl0pLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKUGF0dGVyblZhbGlkYXRvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHBhdHRlcm46IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBJbnRlcm5hbCBtb2R1bGUgdXNlZCBmb3Igc2hhcmluZyBkaXJlY3RpdmVzIGJldHdlZW4gRm9ybXNNb2R1bGUgYW5kIFJlYWN0aXZlRm9ybXNNb2R1bGUKICovCmNsYXNzIMm1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZSB7Cn0KybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlIH0pOwrJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiDJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlKSgpOyB9IH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZSjJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbybVOZ05vVmFsaWRhdGUsCiAgICAgICAgTmdTZWxlY3RPcHRpb24sCiAgICAgICAgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLAogICAgICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yLAogICAgICAgIE51bWJlclZhbHVlQWNjZXNzb3IsCiAgICAgICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLAogICAgICAgIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IsCiAgICAgICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsCiAgICAgICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgIE5nQ29udHJvbFN0YXR1cywKICAgICAgICBOZ0NvbnRyb2xTdGF0dXNHcm91cCwKICAgICAgICBSZXF1aXJlZFZhbGlkYXRvciwKICAgICAgICBNaW5MZW5ndGhWYWxpZGF0b3IsCiAgICAgICAgTWF4TGVuZ3RoVmFsaWRhdG9yLAogICAgICAgIFBhdHRlcm5WYWxpZGF0b3IsCiAgICAgICAgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciwKICAgICAgICBFbWFpbFZhbGlkYXRvcl0sIGV4cG9ydHM6IFvJtU5nTm9WYWxpZGF0ZSwKICAgICAgICBOZ1NlbGVjdE9wdGlvbiwKICAgICAgICDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24sCiAgICAgICAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsCiAgICAgICAgTnVtYmVyVmFsdWVBY2Nlc3NvciwKICAgICAgICBSYW5nZVZhbHVlQWNjZXNzb3IsCiAgICAgICAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IsCiAgICAgICAgTmdDb250cm9sU3RhdHVzLAogICAgICAgIE5nQ29udHJvbFN0YXR1c0dyb3VwLAogICAgICAgIFJlcXVpcmVkVmFsaWRhdG9yLAogICAgICAgIE1pbkxlbmd0aFZhbGlkYXRvciwKICAgICAgICBNYXhMZW5ndGhWYWxpZGF0b3IsCiAgICAgICAgUGF0dGVyblZhbGlkYXRvciwKICAgICAgICBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLAogICAgICAgIEVtYWlsVmFsaWRhdG9yXSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9mb3JtX2J1aWxkZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gb3B0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNBYnN0cmFjdENvbnRyb2xPcHRpb25zKG9wdGlvbnMpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSkuYXN5bmNWYWxpZGF0b3JzICE9PSB1bmRlZmluZWQgfHwKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSkudmFsaWRhdG9ycyAhPT0gdW5kZWZpbmVkIHx8CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpLnVwZGF0ZU9uICE9PSB1bmRlZmluZWQ7Cn0KLyoqCiAqIFxAZGVzY3JpcHRpb24KICogQ3JlYXRlcyBhbiBgQWJzdHJhY3RDb250cm9sYCBmcm9tIGEgdXNlci1zcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KICoKICogVGhlIGBGb3JtQnVpbGRlcmAgcHJvdmlkZXMgc3ludGFjdGljIHN1Z2FyIHRoYXQgc2hvcnRlbnMgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGEgYEZvcm1Db250cm9sYCwKICogYEZvcm1Hcm91cGAsIG9yIGBGb3JtQXJyYXlgLiBJdCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgYm9pbGVycGxhdGUgbmVlZGVkIHRvIGJ1aWxkIGNvbXBsZXgKICogZm9ybXMuCiAqCiAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXSgvZ3VpZGUvcmVhY3RpdmUtZm9ybXMpCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBGb3JtQnVpbGRlciB7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIENvbnN0cnVjdCBhIG5ldyBgRm9ybUdyb3VwYCBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2xzQ29uZmlnIEEgY29sbGVjdGlvbiBvZiBjaGlsZCBjb250cm9scy4gVGhlIGtleSBmb3IgZWFjaCBjaGlsZCBpcyB0aGUgbmFtZQogICAgICogdW5kZXIgd2hpY2ggaXQgaXMgcmVnaXN0ZXJlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBvYmplY3QgZm9yIHRoZSBgRm9ybUdyb3VwYC4gVGhlIG9iamVjdCBjYW4KICAgICAqIGhhdmUgdHdvIHNoYXBlczoKICAgICAqCiAgICAgKiAxKSBgQWJzdHJhY3RDb250cm9sT3B0aW9uc2Agb2JqZWN0IChwcmVmZXJyZWQpLCB3aGljaCBjb25zaXN0cyBvZjoKICAgICAqICogYHZhbGlkYXRvcnNgOiBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YgdmFsaWRhdG9yIGZ1bmN0aW9ucwogICAgICogKiBgYXN5bmNWYWxpZGF0b3JzYDogQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMKICAgICAqICogYHVwZGF0ZU9uYDogVGhlIGV2ZW50IHVwb24gd2hpY2ggdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHVwZGF0ZWQgKG9wdGlvbnM6ICdjaGFuZ2UnIHwgJ2JsdXInIHwKICAgICAqIHN1Ym1pdCcpCiAgICAgKgogICAgICogMikgTGVnYWN5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LCB3aGljaCBjb25zaXN0cyBvZjoKICAgICAqICogYHZhbGlkYXRvcmA6IEEgc3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uLCBvciBhbiBhcnJheSBvZiB2YWxpZGF0b3IgZnVuY3Rpb25zCiAgICAgKiAqIGBhc3luY1ZhbGlkYXRvcmA6IEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ3JvdXAoY29udHJvbHNDb25maWcsIG9wdGlvbnMgPSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5fcmVkdWNlQ29udHJvbHMoY29udHJvbHNDb25maWcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsaWRhdG9ycyA9IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnMgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdXBkYXRlT24gPSB1bmRlZmluZWQ7CiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAoaXNBYnN0cmFjdENvbnRyb2xPcHRpb25zKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAvLyBgb3B0aW9uc2AgYXJlIGBBYnN0cmFjdENvbnRyb2xPcHRpb25zYAogICAgICAgICAgICAgICAgdmFsaWRhdG9ycyA9IG9wdGlvbnMudmFsaWRhdG9ycyAhPSBudWxsID8gb3B0aW9ucy52YWxpZGF0b3JzIDogbnVsbDsKICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycyA9IG9wdGlvbnMuYXN5bmNWYWxpZGF0b3JzICE9IG51bGwgPyBvcHRpb25zLmFzeW5jVmFsaWRhdG9ycyA6IG51bGw7CiAgICAgICAgICAgICAgICB1cGRhdGVPbiA9IG9wdGlvbnMudXBkYXRlT24gIT0gbnVsbCA/IG9wdGlvbnMudXBkYXRlT24gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBgb3B0aW9uc2AgYXJlIGxlZ2FjeSBmb3JtIGdyb3VwIG9wdGlvbnMKICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBvcHRpb25zWyd2YWxpZGF0b3InXSAhPSBudWxsID8gb3B0aW9uc1sndmFsaWRhdG9yJ10gOiBudWxsOwogICAgICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzID0gb3B0aW9uc1snYXN5bmNWYWxpZGF0b3InXSAhPSBudWxsID8gb3B0aW9uc1snYXN5bmNWYWxpZGF0b3InXSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoY29udHJvbHMsIHsgYXN5bmNWYWxpZGF0b3JzLCB1cGRhdGVPbiwgdmFsaWRhdG9ycyB9KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQ29uc3RydWN0IGEgbmV3IGBGb3JtQ29udHJvbGAgd2l0aCB0aGUgZ2l2ZW4gc3RhdGUsIHZhbGlkYXRvcnMgYW5kIG9wdGlvbnMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIEluaXRpYWxpemUgYSBjb250cm9sIGFzIGRpc2FibGVkCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHJldHVybnMgYSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBpbiBhIGRpc2FibGVkIHN0YXRlLgogICAgICoKICAgICAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iZm9ybXMvdHMvZm9ybUJ1aWxkZXIvZm9ybV9idWlsZGVyX2V4YW1wbGUudHMiIHJlZ2lvbj0iZGlzYWJsZWQtY29udHJvbCI+CiAgICAgKiA8L2NvZGUtZXhhbXBsZT4KICAgICAqIEBwYXJhbSB7P30gZm9ybVN0YXRlIEluaXRpYWxpemVzIHRoZSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCBzdGF0ZSB2YWx1ZSwgb3IKICAgICAqIHdpdGggYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYm90aCBhIHZhbHVlIGFuZCBhIGRpc2FibGVkIHN0YXR1cy4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSB2YWxpZGF0b3JPck9wdHMgQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mCiAgICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zCiAgICAgKiB2YWxpZGF0aW9uIGZ1bmN0aW9ucyBhbmQgYSB2YWxpZGF0aW9uIHRyaWdnZXIuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gYXN5bmNWYWxpZGF0b3IgQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvcgogICAgICogZnVuY3Rpb25zLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpOwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBGb3JtQXJyYXlgIGZyb20gdGhlIGdpdmVuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb25zLAogICAgICogdmFsaWRhdG9ycyBhbmQgb3B0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2xzQ29uZmlnIEFuIGFycmF5IG9mIGNoaWxkIGNvbnRyb2xzIG9yIGNvbnRyb2wgY29uZmlncy4gRWFjaAogICAgICogY2hpbGQgY29udHJvbCBpcyBnaXZlbiBhbiBpbmRleCB3aGVuIGl0IGlzIHJlZ2lzdGVyZWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gdmFsaWRhdG9yT3JPcHRzIEEgc3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uLCBvciBhbiBhcnJheSBvZgogICAgICogc3VjaCBmdW5jdGlvbnMsIG9yIGFuIGBBYnN0cmFjdENvbnRyb2xPcHRpb25zYCBvYmplY3QgdGhhdCBjb250YWlucwogICAgICogdmFsaWRhdGlvbiBmdW5jdGlvbnMgYW5kIGEgdmFsaWRhdGlvbiB0cmlnZ2VyLgogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IGFzeW5jVmFsaWRhdG9yIEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3IKICAgICAqIGZ1bmN0aW9ucy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFycmF5KGNvbnRyb2xzQ29uZmlnLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRyb2xzID0gY29udHJvbHNDb25maWcubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGMgPT4gdGhpcy5fY3JlYXRlQ29udHJvbChjKSkpOwogICAgICAgIHJldHVybiBuZXcgRm9ybUFycmF5KGNvbnRyb2xzLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBjb250cm9sc0NvbmZpZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlZHVjZUNvbnRyb2xzKGNvbnRyb2xzQ29uZmlnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRyb2xzID0ge307CiAgICAgICAgT2JqZWN0LmtleXMoY29udHJvbHNDb25maWcpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbE5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvbnRyb2xOYW1lID0+IHsKICAgICAgICAgICAgY29udHJvbHNbY29udHJvbE5hbWVdID0gdGhpcy5fY3JlYXRlQ29udHJvbChjb250cm9sc0NvbmZpZ1tjb250cm9sTmFtZV0pOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY29udHJvbHM7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gY29udHJvbENvbmZpZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZUNvbnRyb2woY29udHJvbENvbmZpZykgewogICAgICAgIGlmIChjb250cm9sQ29uZmlnIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgY29udHJvbENvbmZpZyBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fAogICAgICAgICAgICBjb250cm9sQ29uZmlnIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sQ29uZmlnOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xDb25maWcpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sQ29uZmlnWzBdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbnRyb2xDb25maWcubGVuZ3RoID4gMSA/IGNvbnRyb2xDb25maWdbMV0gOiBudWxsOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gY29udHJvbENvbmZpZy5sZW5ndGggPiAyID8gY29udHJvbENvbmZpZ1syXSA6IG51bGw7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wodmFsdWUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbChjb250cm9sQ29uZmlnKTsKICAgICAgICB9CiAgICB9Cn0KRm9ybUJ1aWxkZXIuybVmYWMgPSBmdW5jdGlvbiBGb3JtQnVpbGRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb3JtQnVpbGRlcikoKTsgfTsKRm9ybUJ1aWxkZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRm9ybUJ1aWxkZXIsIGZhY3Rvcnk6IEZvcm1CdWlsZGVyLsm1ZmFjIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL3ZlcnNpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVkVSU0lPTiQ1ID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZm9ybV9wcm92aWRlcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEV4cG9ydHMgdGhlIHJlcXVpcmVkIHByb3ZpZGVycyBhbmQgZGlyZWN0aXZlcyBmb3IgdGVtcGxhdGUtZHJpdmVuIGZvcm1zLAogKiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIGltcG9ydCBieSBOZ01vZHVsZXMgdGhhdCBpbXBvcnQgdGhpcyBtb2R1bGUuCiAqCiAqIEBzZWUgW0Zvcm1zIE92ZXJ2aWV3XSgvZ3VpZGUvZm9ybXMtb3ZlcnZpZXcpCiAqIEBzZWUgW1RlbXBsYXRlLWRyaXZlbiBGb3JtcyBHdWlkZV0oL2d1aWRlL2Zvcm1zKQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgRm9ybXNNb2R1bGUgewp9CkZvcm1zTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRm9ybXNNb2R1bGUgfSk7CkZvcm1zTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRm9ybXNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRm9ybXNNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW1JhZGlvQ29udHJvbFJlZ2lzdHJ5XSwgaW1wb3J0czogW8m1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEZvcm1zTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW05nTW9kZWwsCiAgICAgICAgTmdNb2RlbEdyb3VwLAogICAgICAgIE5nRm9ybV0sIGV4cG9ydHM6IFvJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUsCiAgICAgICAgTmdNb2RlbCwKICAgICAgICBOZ01vZGVsR3JvdXAsCiAgICAgICAgTmdGb3JtXSB9KTsgfSkoKTsKLyoqCiAqIEV4cG9ydHMgdGhlIHJlcXVpcmVkIGluZnJhc3RydWN0dXJlIGFuZCBkaXJlY3RpdmVzIGZvciByZWFjdGl2ZSBmb3JtcywKICogbWFraW5nIHRoZW0gYXZhaWxhYmxlIGZvciBpbXBvcnQgYnkgTmdNb2R1bGVzIHRoYXQgaW1wb3J0IHRoaXMgbW9kdWxlLgogKgogKiBAc2VlIFtGb3JtcyBPdmVydmlld10oZ3VpZGUvZm9ybXMtb3ZlcnZpZXcpCiAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcykKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFJlYWN0aXZlRm9ybXNNb2R1bGUgewogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBQcm92aWRlcyBvcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgcmVhY3RpdmUgZm9ybXMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gb3B0cyBBbiBvYmplY3Qgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zCiAgICAgKiAqIGB3YXJuT25OZ01vZGVsV2l0aEZvcm1Db250cm9sYCBDb25maWd1cmVzIHdoZW4gdG8gZW1pdCBhIHdhcm5pbmcgd2hlbiBhbiBgbmdNb2RlbGAKICAgICAqIGJpbmRpbmcgaXMgdXNlZCB3aXRoIHJlYWN0aXZlIGZvcm0gZGlyZWN0aXZlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyB3aXRoQ29uZmlnKG9wdHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBuZ01vZHVsZTogUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcsIHVzZVZhbHVlOiBvcHRzLndhcm5Pbk5nTW9kZWxXaXRoRm9ybUNvbnRyb2wgfQogICAgICAgICAgICBdCiAgICAgICAgfTsKICAgIH0KfQpSZWFjdGl2ZUZvcm1zTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogUmVhY3RpdmVGb3Jtc01vZHVsZSB9KTsKUmVhY3RpdmVGb3Jtc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFJlYWN0aXZlRm9ybXNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmVhY3RpdmVGb3Jtc01vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbRm9ybUJ1aWxkZXIsIFJhZGlvQ29udHJvbFJlZ2lzdHJ5XSwgaW1wb3J0czogW8m1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFJlYWN0aXZlRm9ybXNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbRm9ybUNvbnRyb2xEaXJlY3RpdmUsCiAgICAgICAgRm9ybUdyb3VwRGlyZWN0aXZlLAogICAgICAgIEZvcm1Db250cm9sTmFtZSwKICAgICAgICBGb3JtR3JvdXBOYW1lLAogICAgICAgIEZvcm1BcnJheU5hbWVdLCBleHBvcnRzOiBbybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlLAogICAgICAgIEZvcm1Db250cm9sRGlyZWN0aXZlLAogICAgICAgIEZvcm1Hcm91cERpcmVjdGl2ZSwKICAgICAgICBGb3JtQ29udHJvbE5hbWUsCiAgICAgICAgRm9ybUdyb3VwTmFtZSwKICAgICAgICBGb3JtQXJyYXlOYW1lXSB9KTsgfSkoKTsKCmNvbnN0IF9jMCQ1ID0gWyJ0cmlnZ2VyIl07CmNvbnN0IF9jMSQ1ID0gWyJwYW5lbCJdOwpmdW5jdGlvbiBNYXRTZWxlY3Rfc3Bhbl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDgpOwogICAgybXJtXRleHQoMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMiA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yMi5wbGFjZWhvbGRlciB8fCAiXHUwMEEwIik7Cn0gfQpmdW5jdGlvbiBNYXRTZWxlY3Rfc3Bhbl81X3NwYW5fMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iKTsKICAgIMm1ybV0ZXh0KDEpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjUgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4X3I1LnRyaWdnZXJWYWx1ZSB8fCAiXHUwMEEwIik7Cn0gfQpmdW5jdGlvbiBNYXRTZWxlY3Rfc3Bhbl81XzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1cHJvamVjdGlvbigwLCAwLCBbIipuZ1N3aXRjaENhc2UiLCAidHJ1ZSJdKTsKfSB9CmZ1bmN0aW9uIE1hdFNlbGVjdF9zcGFuXzVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIiwgOSk7CiAgICDJtcm1dGVtcGxhdGUoMSwgTWF0U2VsZWN0X3NwYW5fNV9zcGFuXzFfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgMTApOwogICAgybXJtXRlbXBsYXRlKDIsIE1hdFNlbGVjdF9zcGFuXzVfMl9UZW1wbGF0ZSwgMSwgMCwgdW5kZWZpbmVkLCAxMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaCIsICEhY3R4X3IzLmN1c3RvbVRyaWdnZXIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIHRydWUpOwp9IH0KZnVuY3Rpb24gTWF0U2VsZWN0X25nX3RlbXBsYXRlXzhfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICBjb25zdCBfcjkgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDEyKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDEzLCAxNCk7CiAgICDJtcm1bGlzdGVuZXIoIkB0cmFuc2Zvcm1QYW5lbC5kb25lIiwgZnVuY3Rpb24gTWF0U2VsZWN0X25nX3RlbXBsYXRlXzhfVGVtcGxhdGVfZGl2X2FuaW1hdGlvbl90cmFuc2Zvcm1QYW5lbF9kb25lXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjkpOyBjb25zdCBjdHhfcjggPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yOC5fcGFuZWxEb25lQW5pbWF0aW5nU3RyZWFtLm5leHQoJGV2ZW50LnRvU3RhdGUpOyB9KSgia2V5ZG93biIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9uZ190ZW1wbGF0ZV84X1RlbXBsYXRlX2Rpdl9rZXlkb3duXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjkpOyBjb25zdCBjdHhfcjEwID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEwLl9oYW5kbGVLZXlkb3duKCRldmVudCk7IH0pOwogICAgybXJtXByb2plY3Rpb24oMywgMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVwcm9wZXJ0eSgiQHRyYW5zZm9ybVBhbmVsV3JhcCIsIHVuZGVmaW5lZCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVjbGFzc01hcEludGVycG9sYXRlMSgibWF0LXNlbGVjdC1wYW5lbCAiLCBjdHhfcjQuX2dldFBhbmVsVGhlbWUoKSwgIiIpOwogICAgybXJtXN0eWxlUHJvcCgidHJhbnNmb3JtLW9yaWdpbiIsIGN0eF9yNC5fdHJhbnNmb3JtT3JpZ2luKSgiZm9udC1zaXplIiwgY3R4X3I0Ll90cmlnZ2VyRm9udFNpemUsICJweCIpOwogICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgY3R4X3I0LnBhbmVsQ2xhc3MpKCJAdHJhbnNmb3JtUGFuZWwiLCBjdHhfcjQubXVsdGlwbGUgPyAic2hvd2luZy1tdWx0aXBsZSIgOiAic2hvd2luZyIpOwp9IH0KY29uc3QgX2MyJDMgPSBbW1sibWF0LXNlbGVjdC10cmlnZ2VyIl1dLCAiKiJdOwpjb25zdCBfYzMkMiA9IFsibWF0LXNlbGVjdC10cmlnZ2VyIiwgIioiXTsKY29uc3QgbWF0U2VsZWN0QW5pbWF0aW9ucyA9IHsKICAgIC8qKgogICAgICogVGhpcyBhbmltYXRpb24gZW5zdXJlcyB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbCBhbmltYXRpb24gKHRyYW5zZm9ybVBhbmVsKSBpcyBjYWxsZWQgd2hlbgogICAgICogY2xvc2luZyB0aGUgc2VsZWN0LgogICAgICogVGhpcyBpcyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIzMzAyCiAgICAgKi8KICAgIHRyYW5zZm9ybVBhbmVsV3JhcDogdHJpZ2dlcigndHJhbnNmb3JtUGFuZWxXcmFwJywgWwogICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIHF1ZXJ5KCdAdHJhbnNmb3JtUGFuZWwnLCBbYW5pbWF0ZUNoaWxkKCldLCB7IG9wdGlvbmFsOiB0cnVlIH0pKQogICAgXSksCiAgICAvKioKICAgICAqIFRoaXMgYW5pbWF0aW9uIHRyYW5zZm9ybXMgdGhlIHNlbGVjdCdzIG92ZXJsYXkgcGFuZWwgb24gYW5kIG9mZiB0aGUgcGFnZS4KICAgICAqCiAgICAgKiBXaGVuIHRoZSBwYW5lbCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NLCBpdCBleHBhbmRzIGl0cyB3aWR0aCBieSB0aGUgYW1vdW50IG9mIHBhZGRpbmcsIHNjYWxlcyBpdAogICAgICogdXAgdG8gMTAwJSBvbiB0aGUgWSBheGlzLCBmYWRlcyBpbiBpdHMgYm9yZGVyLCBhbmQgdHJhbnNsYXRlcyBzbGlnaHRseSB1cCBhbmQgdG8gdGhlCiAgICAgKiBzaWRlIHRvIGVuc3VyZSB0aGUgb3B0aW9uIHRleHQgY29ycmVjdGx5IG92ZXJsYXBzIHRoZSB0cmlnZ2VyIHRleHQuCiAgICAgKgogICAgICogV2hlbiB0aGUgcGFuZWwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00sIGl0IHNpbXBseSBmYWRlcyBvdXQgbGluZWFybHkuCiAgICAgKi8KICAgIHRyYW5zZm9ybVBhbmVsOiB0cmlnZ2VyKCd0cmFuc2Zvcm1QYW5lbCcsIFsKICAgICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLAogICAgICAgICAgICBtaW5XaWR0aDogJzEwMCUnLAogICAgICAgICAgICBvcGFjaXR5OiAwCiAgICAgICAgfSkpLAogICAgICAgIHN0YXRlKCdzaG93aW5nJywgc3R5bGUoewogICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICBtaW5XaWR0aDogJ2NhbGMoMTAwJSArIDMycHgpJywKICAgICAgICAgICAgLy8gMzJweCA9IDIgKiAxNnB4IHBhZGRpbmcKICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJwogICAgICAgIH0pKSwKICAgICAgICBzdGF0ZSgnc2hvd2luZy1tdWx0aXBsZScsIHN0eWxlKHsKICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgbWluV2lkdGg6ICdjYWxjKDEwMCUgKyA2NHB4KScsCiAgICAgICAgICAgIC8vIDY0cHggPSA0OHB4IHBhZGRpbmcgb24gdGhlIGxlZnQgKyAxNnB4IHBhZGRpbmcgb24gdGhlIHJpZ2h0CiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScKICAgICAgICB9KSksCiAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgYW5pbWF0ZSgnMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknKSksCiAgICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgYW5pbWF0ZSgnMTAwbXMgMjVtcyBsaW5lYXInLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpKQogICAgXSkKfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zZWxlY3Qvc2VsZWN0LWVycm9ycy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gY2hhbmdlIGEgc2VsZWN0J3MgYG11bHRpcGxlYCBvcHRpb24KICogYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRNYXRTZWxlY3REeW5hbWljTXVsdGlwbGVFcnJvcigpIHsKICAgIHJldHVybiBFcnJvcignQ2Fubm90IGNoYW5nZSBgbXVsdGlwbGVgIG1vZGUgb2Ygc2VsZWN0IGFmdGVyIGluaXRpYWxpemF0aW9uLicpOwp9Ci8qKgogKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGFzc2lnbiBhIG5vbi1hcnJheSB2YWx1ZSB0byBhIHNlbGVjdAogKiBpbiBgbXVsdGlwbGVgIG1vZGUuIE5vdGUgdGhhdCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIGFyZSBzdGlsbCB2YWxpZCB2YWx1ZXMgdG8gYWxsb3cgZm9yCiAqIHJlc2V0dGluZyB0aGUgdmFsdWUuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRNYXRTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKSB7CiAgICByZXR1cm4gRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuJyk7Cn0KLyoqCiAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGFzc2lnbmluZyBhIG5vbi1mdW5jdGlvbiB2YWx1ZSB0byB0aGUgY29tcGFyYXRvcgogKiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGFuIG9wdGlvbi4gTm90ZSB0aGF0IHdoZXRoZXIgdGhlIGZ1bmN0aW9uCiAqIGFjdHVhbGx5IHRha2VzIHR3byB2YWx1ZXMgYW5kIHJldHVybnMgYSBib29sZWFuIGlzIG5vdCBjaGVja2VkLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TWF0U2VsZWN0Tm9uRnVuY3Rpb25WYWx1ZUVycm9yKCkgewogICAgcmV0dXJuIEVycm9yKCdgY29tcGFyZVdpdGhgIG11c3QgYmUgYSBmdW5jdGlvbi4nKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NlbGVjdC9zZWxlY3QudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgbmV4dFVuaXF1ZUlkJDQgPSAwOwovKioKICogVGhlIG1heCBoZWlnaHQgb2YgdGhlIHNlbGVjdCdzIG92ZXJsYXkgcGFuZWwKICogQHR5cGUgez99CiAqLwpjb25zdCBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCA9IDI1NjsKLyoqCiAqIFRoZSBwYW5lbCdzIHBhZGRpbmcgb24gdGhlIHgtYXhpcwogKiBAdHlwZSB7P30KICovCmNvbnN0IFNFTEVDVF9QQU5FTF9QQURESU5HX1ggPSAxNjsKLyoqCiAqIFRoZSBwYW5lbCdzIHggYXhpcyBwYWRkaW5nIGlmIGl0IGlzIGluZGVudGVkIChlLmcuIHRoZXJlIGlzIGFuIG9wdGlvbiBncm91cCkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgU0VMRUNUX1BBTkVMX0lOREVOVF9QQURESU5HX1ggPSBTRUxFQ1RfUEFORUxfUEFERElOR19YICogMjsKLyoqCiAqIFRoZSBoZWlnaHQgb2YgdGhlIHNlbGVjdCBpdGVtcyBpbiBgZW1gIHVuaXRzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFNFTEVDVF9JVEVNX0hFSUdIVF9FTSA9IDM7Ci8vIFRPRE8oam9zZXBocGVycm90dCk6IFJldmVydCB0byBhIGNvbnN0YW50IGFmdGVyIDIwMTggc3BlYyB1cGRhdGVzIGFyZSBmdWxseSBtZXJnZWQuCi8qKgogKiBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwYW5lbCBlZGdlIGFuZCB0aGUgb3B0aW9uIHRleHQgaW4KICogbXVsdGktc2VsZWN0aW9uIG1vZGUuCiAqCiAqIENhbGN1bGF0ZWQgYXM6CiAqIChTRUxFQ1RfUEFORUxfUEFERElOR19YICogMS41KSArIDE2ID0gNDAKICogVGhlIHBhZGRpbmcgaXMgbXVsdGlwbGllZCBieSAxLjUgYmVjYXVzZSB0aGUgY2hlY2tib3gncyBtYXJnaW4gaXMgaGFsZiB0aGUgcGFkZGluZy4KICogVGhlIGNoZWNrYm94IHdpZHRoIGlzIDE2cHguCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgU0VMRUNUX01VTFRJUExFX1BBTkVMX1BBRERJTkdfWCA9IFNFTEVDVF9QQU5FTF9QQURESU5HX1ggKiAxLjUgKyAxNjsKLyoqCiAqIFRoZSBzZWxlY3QgcGFuZWwgd2lsbCBvbmx5ICJmaXQiIGluc2lkZSB0aGUgdmlld3BvcnQgaWYgaXQgaXMgcG9zaXRpb25lZCBhdAogKiB0aGlzIHZhbHVlIG9yIG1vcmUgYXdheSBmcm9tIHRoZSB2aWV3cG9ydCBib3VuZGFyeS4KICogQHR5cGUgez99CiAqLwpjb25zdCBTRUxFQ1RfUEFORUxfVklFV1BPUlRfUEFERElORyA9IDg7Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBkZXRlcm1pbmVzIHRoZSBzY3JvbGwgaGFuZGxpbmcgd2hpbGUgYSBzZWxlY3QgaXMgb3Blbi4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWSA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LXNlbGVjdC1zY3JvbGwtc3RyYXRlZ3knKTsKLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gb3ZlcmxheQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gTUFUX1NFTEVDVF9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVJfRkFDVE9SWShvdmVybGF5KSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSk7Cn0KLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyB0aGUgc2VsZWN0IG1vZHVsZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfU0VMRUNUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX1NFTEVDVF9DT05GSUcnKTsKLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX1NFTEVDVF9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVIgPSB7CiAgICBwcm92aWRlOiBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWSwKICAgIGRlcHM6IFtPdmVybGF5XSwKICAgIHVzZUZhY3Rvcnk6IE1BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlksCn07Ci8qKgogKiBDaGFuZ2UgZXZlbnQgb2JqZWN0IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgdmFsdWUgaGFzIGNoYW5nZWQuCiAqLwpjbGFzcyBNYXRTZWxlY3RDaGFuZ2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgfQp9Ci8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0U2VsZWN0LgovKioKICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdFNlbGVjdEJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIKICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm0KICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm1Hcm91cAogICAgICogQHBhcmFtIHs/fSBuZ0NvbnRyb2wKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBuZ0NvbnRyb2wpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgdGhpcy5fZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyID0gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjsKICAgICAgICB0aGlzLl9wYXJlbnRGb3JtID0gX3BhcmVudEZvcm07CiAgICAgICAgdGhpcy5fcGFyZW50Rm9ybUdyb3VwID0gX3BhcmVudEZvcm1Hcm91cDsKICAgICAgICB0aGlzLm5nQ29udHJvbCA9IG5nQ29udHJvbDsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9NYXRTZWxlY3RNaXhpbkJhc2UgPSBtaXhpbkRpc2FibGVSaXBwbGUobWl4aW5UYWJJbmRleChtaXhpbkRpc2FibGVkKG1peGluRXJyb3JTdGF0ZShNYXRTZWxlY3RCYXNlKSkpKTsKLyoqCiAqIEFsbG93cyB0aGUgdXNlciB0byBjdXN0b21pemUgdGhlIHRyaWdnZXIgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUgc2VsZWN0IGhhcyBhIHZhbHVlLgogKi8KY2xhc3MgTWF0U2VsZWN0VHJpZ2dlciB7Cn0KTWF0U2VsZWN0VHJpZ2dlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNlbGVjdFRyaWdnZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0U2VsZWN0VHJpZ2dlcikoKTsgfTsKTWF0U2VsZWN0VHJpZ2dlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRTZWxlY3RUcmlnZ2VyLCBzZWxlY3RvcnM6IFtbIm1hdC1zZWxlY3QtdHJpZ2dlciJdXSB9KTsKY2xhc3MgTWF0U2VsZWN0IGV4dGVuZHMgX01hdFNlbGVjdE1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdwb3J0UnVsZXIKICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9kaXIKICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm0KICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm1Hcm91cAogICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybUZpZWxkCiAgICAgKiBAcGFyYW0gez99IG5nQ29udHJvbAogICAgICogQHBhcmFtIHs/fSB0YWJJbmRleAogICAgICogQHBhcmFtIHs/fSBzY3JvbGxTdHJhdGVneUZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gX2xpdmVBbm5vdW5jZXIKICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92aWV3cG9ydFJ1bGVyLCBfY2hhbmdlRGV0ZWN0b3JSZWYsIF9uZ1pvbmUsIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIGVsZW1lbnRSZWYsIF9kaXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBfcGFyZW50Rm9ybUZpZWxkLCBuZ0NvbnRyb2wsIHRhYkluZGV4LCBzY3JvbGxTdHJhdGVneUZhY3RvcnksIF9saXZlQW5ub3VuY2VyLCBkZWZhdWx0cykgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBuZ0NvbnRyb2wpOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0UnVsZXIgPSBfdmlld3BvcnRSdWxlcjsKICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIHRoaXMuX2RpciA9IF9kaXI7CiAgICAgICAgdGhpcy5fcGFyZW50Rm9ybUZpZWxkID0gX3BhcmVudEZvcm1GaWVsZDsKICAgICAgICB0aGlzLm5nQ29udHJvbCA9IG5nQ29udHJvbDsKICAgICAgICB0aGlzLl9saXZlQW5ub3VuY2VyID0gX2xpdmVBbm5vdW5jZXI7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIG92ZXJsYXkgcGFuZWwgaXMgb3Blbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wYW5lbE9wZW4gPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIGZpbGxpbmcgb3V0IHRoZSBzZWxlY3QgaXMgcmVxdWlyZWQgaW4gdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5IHBhbmVsLCBjYWxjdWxhdGVkIHRvIGNlbnRlciB0aGUgc2VsZWN0ZWQgb3B0aW9uLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3Njcm9sbFRvcCA9IDA7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX211bHRpcGxlID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyaXNvbiBmdW5jdGlvbiB0byBzcGVjaWZ5IHdoaWNoIG9wdGlvbiBpcyBkaXNwbGF5ZWQuIERlZmF1bHRzIHRvIG9iamVjdCBlcXVhbGl0eS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9jb21wYXJlV2l0aCA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG8xCiAgICAgICAgICogQHBhcmFtIHs/fSBvMgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG8xLCBvMikgPT4gbzEgPT09IG8yKTsKICAgICAgICAvKioKICAgICAgICAgKiBVbmlxdWUgaWQgZm9yIHRoaXMgaW5wdXQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdWlkID0gYG1hdC1zZWxlY3QtJHtuZXh0VW5pcXVlSWQkNCsrfWA7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNhY2hlZCBmb250LXNpemUgb2YgdGhlIHRyaWdnZXIgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl90cmlnZ2VyRm9udFNpemUgPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIGBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXNgCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIC8qKgogICAgICAgICAqIGBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkYAogICAgICAgICAqLwogICAgICAgIHRoaXMuX29uVG91Y2hlZCA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIElEcyBvZiBjaGlsZCBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgYXJpYS1vd25zIGF0dHJpYnV0ZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9vcHRpb25JZHMgPSAnJzsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBwYW5lbCdzIHRyYW5zZm9ybS1vcmlnaW4gcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdHJhbnNmb3JtT3JpZ2luID0gJ3RvcCc7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgcGFuZWwgZWxlbWVudCBpcyBmaW5pc2hlZCB0cmFuc2Zvcm1pbmcgaW4uCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcGFuZWxEb25lQW5pbWF0aW5nU3RyZWFtID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgeS1vZmZzZXQgb2YgdGhlIG92ZXJsYXkgcGFuZWwgaW4gcmVsYXRpb24gdG8gdGhlIHRyaWdnZXIncyB0b3Agc3RhcnQgY29ybmVyLgogICAgICAgICAqIFRoaXMgbXVzdCBiZSBhZGp1c3RlZCB0byBhbGlnbiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRleHQgb3ZlciB0aGUgdHJpZ2dlciB0ZXh0LgogICAgICAgICAqIHdoZW4gdGhlIHBhbmVsIG9wZW5zLiBXaWxsIGNoYW5nZSBiYXNlZCBvbiB0aGUgeS1wb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX29mZnNldFkgPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgcG9zaXRpb24gY29uZmlnIGVuc3VyZXMgdGhhdCB0aGUgdG9wICJzdGFydCIgY29ybmVyIG9mIHRoZSBvdmVybGF5CiAgICAgICAgICogaXMgYWxpZ25lZCB3aXRoIHdpdGggdGhlIHRvcCAic3RhcnQiIG9mIHRoZSBvcmlnaW4gYnkgZGVmYXVsdCAob3ZlcmxhcHBpbmcKICAgICAgICAgKiB0aGUgdHJpZ2dlciBjb21wbGV0ZWx5KS4gSWYgdGhlIHBhbmVsIGNhbm5vdCBmaXQgYmVsb3cgdGhlIHRyaWdnZXIsIGl0CiAgICAgICAgICogd2lsbCBmYWxsIGJhY2sgdG8gYSBwb3NpdGlvbiBhYm92ZSB0aGUgdHJpZ2dlci4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wb3NpdGlvbnMgPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsCiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJywKICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLAogICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLAogICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsCiAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JywKICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxpbmcgY2VudGVyaW5nIG9mIHRoZSBhY3RpdmUgb3B0aW9uIG92ZXIgdGhlIHRyaWdnZXIuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGlzYWJsZU9wdGlvbkNlbnRlcmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBBIG5hbWUgZm9yIHRoaXMgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGBtYXQtZm9ybS1maWVsZGAuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5jb250cm9sVHlwZSA9ICdtYXQtc2VsZWN0JzsKICAgICAgICAvKioKICAgICAgICAgKiBBcmlhIGxhYmVsIG9mIHRoZSBzZWxlY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIHVzZWQgYXMgbGFiZWwuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5hcmlhTGFiZWwgPSAnJzsKICAgICAgICAvKioKICAgICAgICAgKiBDb21iaW5lZCBzdHJlYW0gb2YgYWxsIG9mIHRoZSBjaGlsZCBvcHRpb25zJyBjaGFuZ2UgZXZlbnRzLgogICAgICAgICAqLwogICAgICAgIHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcyA9ICgvKiogQHR5cGUgez99ICovIChkZWZlcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNoYW5nZXMucGlwZShzdGFydFdpdGgob3B0aW9ucyksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBtZXJnZSguLi5vcHRpb25zLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5vblNlbGVjdGlvbkNoYW5nZSkpKSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fbmdab25lLm9uU3RhYmxlCiAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKCkKICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMpKSk7CiAgICAgICAgfSkpKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgcGFuZWwgaGFzIGJlZW4gdG9nZ2xlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9wZW5lZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdCBoYXMgYmVlbiBvcGVuZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb3BlbmVkU3RyZWFtID0gdGhpcy5vcGVuZWRDaGFuZ2UucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbyA9PiBvKSksIG1hcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgaGFzIGJlZW4gY2xvc2VkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2Nsb3NlZFN0cmVhbSA9IHRoaXMub3BlbmVkQ2hhbmdlLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG8KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG8gPT4gIW8pKSwgbWFwKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSkpKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRXZlbnQgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmF3IHZhbHVlIG9mIHRoZSBzZWxlY3QgY2hhbmdlcy4gVGhpcyBpcyBoZXJlIHByaW1hcmlseQogICAgICAgICAqIHRvIGZhY2lsaXRhdGUgdGhlIHR3by13YXkgYmluZGluZyBmb3IgdGhlIGB2YWx1ZWAgaW5wdXQuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKi8KICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkgewogICAgICAgICAgICAvLyBOb3RlOiB3ZSBwcm92aWRlIHRoZSB2YWx1ZSBhY2Nlc3NvciB0aHJvdWdoIGhlcmUsIGluc3RlYWQgb2YKICAgICAgICAgICAgLy8gdGhlIGBwcm92aWRlcnNgIHRvIGF2b2lkIHJ1bm5pbmcgaW50byBhIGNpcmN1bGFyIGltcG9ydC4KICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5RmFjdG9yeSA9IHNjcm9sbFN0cmF0ZWd5RmFjdG9yeTsKICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneSA9IHRoaXMuX3Njcm9sbFN0cmF0ZWd5RmFjdG9yeSgpOwogICAgICAgIHRoaXMudGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCkgfHwgMDsKICAgICAgICAvLyBGb3JjZSBzZXR0ZXIgdG8gYmUgY2FsbGVkIGluIGNhc2UgaWQgd2FzIG5vdCBzcGVjaWZpZWQuCiAgICAgICAgdGhpcy5pZCA9IHRoaXMuaWQ7CiAgICAgICAgaWYgKGRlZmF1bHRzKSB7CiAgICAgICAgICAgIGlmIChkZWZhdWx0cy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU9wdGlvbkNlbnRlcmluZyA9IGRlZmF1bHRzLmRpc2FibGVPcHRpb25DZW50ZXJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmF1bHRzLnR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy50eXBlYWhlYWREZWJvdW5jZUludGVydmFsID0gZGVmYXVsdHMudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgc2VsZWN0IGlzIGZvY3VzZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZm9jdXNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZCB8fCB0aGlzLl9wYW5lbE9wZW47CiAgICB9CiAgICAvKioKICAgICAqIFBsYWNlaG9sZGVyIHRvIGJlIHNob3duIGlmIG5vIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBsYWNlaG9sZGVyKCkgeyByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTsKICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCByZXF1aXJlZCgpIHsgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCByZXF1aXJlZCh2YWx1ZSkgewogICAgICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gc2VsZWN0IG11bHRpcGxlIG9wdGlvbnMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbXVsdGlwbGUoKSB7IHJldHVybiB0aGlzLl9tdWx0aXBsZTsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbXVsdGlwbGUodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0U2VsZWN0RHluYW1pY011bHRpcGxlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbXVsdGlwbGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIGNlbnRlciB0aGUgYWN0aXZlIG9wdGlvbiBvdmVyIHRoZSB0cmlnZ2VyLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRpc2FibGVPcHRpb25DZW50ZXJpbmcoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fZGlzYWJsZU9wdGlvbkNlbnRlcmluZyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdGhlIG9wdGlvbiB2YWx1ZXMgd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVzLiBUaGUgZmlyc3QgYXJndW1lbnQKICAgICAqIGlzIGEgdmFsdWUgZnJvbSBhbiBvcHRpb24uIFRoZSBzZWNvbmQgaXMgYSB2YWx1ZSBmcm9tIHRoZSBzZWxlY3Rpb24uIEEgYm9vbGVhbgogICAgICogc2hvdWxkIGJlIHJldHVybmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNvbXBhcmVXaXRoKCkgeyByZXR1cm4gdGhpcy5fY29tcGFyZVdpdGg7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGNvbXBhcmVXaXRoKGZuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBnZXRNYXRTZWxlY3ROb25GdW5jdGlvblZhbHVlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjsKICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwpIHsKICAgICAgICAgICAgLy8gQSBkaWZmZXJlbnQgY29tcGFyYXRvciBtZWFucyB0aGUgc2VsZWN0aW9uIGNvdWxkIGNoYW5nZS4KICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVmFsdWUgb2YgdGhlIHNlbGVjdCBjb250cm9sLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7CiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSkgewogICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUobmV3VmFsdWUpOwogICAgICAgICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYmVmb3JlIG1vdmluZyBmb2N1cyB0byBhbiBpdGVtLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwoKSB7IHJldHVybiB0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCB0eXBlYWhlYWREZWJvdW5jZUludGVydmFsKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogVW5pcXVlIGlkIG9mIHRoZSBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5faWQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGlkKHZhbHVlKSB7CiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7CiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbCh0aGlzLm11bHRpcGxlKTsKICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgLy8gV2UgbmVlZCBgZGlzdGluY3RVbnRpbENoYW5nZWRgIGhlcmUsIGJlY2F1c2Ugc29tZSBicm93c2VycyB3aWxsCiAgICAgICAgLy8gZmlyZSB0aGUgYW5pbWF0aW9uIGVuZCBldmVudCB0d2ljZSBmb3IgdGhlIHNhbWUgYW5pbWF0aW9uLiBTZWU6CiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjQwODQKICAgICAgICB0aGlzLl9wYW5lbERvbmVBbmltYXRpbmdTdHJlYW0KICAgICAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKQogICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb3AgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5vcGVuZWRDaGFuZ2UuZW1pdCh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMub3BlbmVkQ2hhbmdlLmVtaXQoZmFsc2UpOwogICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5RGlyLm9mZnNldFggPSAwOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoKQogICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5fcGFuZWxPcGVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICB0aGlzLl9pbml0S2V5TWFuYWdlcigpOwogICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZXZlbnQgPT4gewogICAgICAgICAgICBldmVudC5hZGRlZC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0KCkpKTsKICAgICAgICAgICAgZXZlbnQucmVtb3ZlZC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uZGVzZWxlY3QoKSkpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLm9wdGlvbnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChudWxsKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9yZXNldE9wdGlvbnMoKTsKICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdEb0NoZWNrKCkgewogICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkgewogICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIC8vIFVwZGF0aW5nIHRoZSBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIGJ5IGBtaXhpbkRpc2FibGVkYCwgYnV0IHdlIG5lZWQgdG8gYWRkaXRpb25hbGx5IGxldAogICAgICAgIC8vIHRoZSBwYXJlbnQgZm9ybSBmaWVsZCBrbm93IHRvIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHdoZW4gdGhlIGRpc2FibGVkIHN0YXRlIGNoYW5nZXMuCiAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHsKICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgICAgICBpZiAoY2hhbmdlc1sndHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCddICYmIHRoaXMuX2tleU1hbmFnZXIpIHsKICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci53aXRoVHlwZUFoZWFkKHRoaXMuX3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7CiAgICAgICAgdGhpcy5fZGVzdHJveS5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7CiAgICB9CiAgICAvKioKICAgICAqIFRvZ2dsZXMgdGhlIG92ZXJsYXkgcGFuZWwgb3BlbiBvciBjbG9zZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b2dnbGUoKSB7CiAgICAgICAgdGhpcy5wYW5lbE9wZW4gPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKTsKICAgIH0KICAgIC8qKgogICAgICogT3BlbnMgdGhlIG92ZXJsYXkgcGFuZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvcGVuKCkgewogICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLm9wdGlvbnMgfHwgIXRoaXMub3B0aW9ucy5sZW5ndGggfHwgdGhpcy5fcGFuZWxPcGVuKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdHJpZ2dlclJlY3QgPSB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAvLyBOb3RlOiBUaGUgY29tcHV0ZWQgZm9udC1zaXplIHdpbGwgYmUgYSBzdHJpbmcgcGl4ZWwgdmFsdWUgKGUuZy4gIjE2cHgiKS4KICAgICAgICAvLyBgcGFyc2VJbnRgIGlnbm9yZXMgdGhlIHRyYWlsaW5nICdweCcgYW5kIGNvbnZlcnRzIHRoaXMgdG8gYSBudW1iZXIuCiAgICAgICAgdGhpcy5fdHJpZ2dlckZvbnRTaXplID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCkuZm9udFNpemUgfHwgJzAnKTsKICAgICAgICB0aGlzLl9wYW5lbE9wZW4gPSB0cnVlOwogICAgICAgIHRoaXMuX2tleU1hbmFnZXIud2l0aEhvcml6b250YWxPcmllbnRhdGlvbihudWxsKTsKICAgICAgICB0aGlzLl9jYWxjdWxhdGVPdmVybGF5UG9zaXRpb24oKTsKICAgICAgICB0aGlzLl9oaWdobGlnaHRDb3JyZWN0T3B0aW9uKCk7CiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgLy8gU2V0IHRoZSBmb250IHNpemUgb24gdGhlIHBhbmVsIGVsZW1lbnQgb25jZSBpdCBleGlzdHMuCiAgICAgICAgdGhpcy5fbmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXJGb250U2l6ZSAmJiB0aGlzLm92ZXJsYXlEaXIub3ZlcmxheVJlZiAmJgogICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5RGlyLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheURpci5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gYCR7dGhpcy5fdHJpZ2dlckZvbnRTaXplfXB4YDsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xvc2VzIHRoZSBvdmVybGF5IHBhbmVsIGFuZCBmb2N1c2VzIHRoZSBob3N0IGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbG9zZSgpIHsKICAgICAgICBpZiAodGhpcy5fcGFuZWxPcGVuKSB7CiAgICAgICAgICAgIHRoaXMuX3BhbmVsT3BlbiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKSA/ICdydGwnIDogJ2x0cicpOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzZWxlY3QncyB2YWx1ZS4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlCiAgICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbW9kZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZQogICAgICogY2hhbmdlcyBmcm9tIHVzZXIgaW5wdXQuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZQogICAgICogcmVxdWlyZWQgdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgIH0KICAgIC8qKgogICAgICogU2F2ZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIHNlbGVjdCBpcyBibHVycmVkCiAgICAgKiBieSB0aGUgdXNlci4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlIHJlcXVpcmVkCiAgICAgKiB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHRvdWNoZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuOwogICAgfQogICAgLyoqCiAgICAgKiBEaXNhYmxlcyB0aGUgc2VsZWN0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2UgcmVxdWlyZWQKICAgICAqIHRvIGludGVncmF0ZSB3aXRoIEFuZ3VsYXIncyBjb3JlIGZvcm1zIEFQSS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQgU2V0cyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDsKICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBvdmVybGF5IHBhbmVsIGlzIG9wZW4uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGFuZWxPcGVuKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wYW5lbE9wZW47CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHNlbGVjdGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQgOiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXTsKICAgIH0KICAgIC8qKgogICAgICogVGhlIHZhbHVlIGRpc3BsYXllZCBpbiB0aGUgdHJpZ2dlci4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0cmlnZ2VyVmFsdWUoKSB7CiAgICAgICAgaWYgKHRoaXMuZW1wdHkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbXVsdGlwbGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0aW9uID0+IG9wdGlvbi52aWV3VmFsdWUpKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzUnRsKCkpIHsKICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5yZXZlcnNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IGRlbGltaXRlciBzaG91bGQgYmUgY29uZmlndXJhYmxlIGZvciBwcm9wZXIgbG9jYWxpemF0aW9uLgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb25zLmpvaW4oJywgJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXS52aWV3VmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaW4gUlRMIG1vZGUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNSdGwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RpciA/IHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcgOiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogSGFuZGxlcyBhbGwga2V5ZG93biBldmVudHMgb24gdGhlIHNlbGVjdC4KICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMucGFuZWxPcGVuID8gdGhpcy5faGFuZGxlT3BlbktleWRvd24oZXZlbnQpIDogdGhpcy5faGFuZGxlQ2xvc2VkS2V5ZG93bihldmVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGVzIGtleWJvYXJkIGV2ZW50cyB3aGlsZSB0aGUgc2VsZWN0IGlzIGNsb3NlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFuZGxlQ2xvc2VkS2V5ZG93bihldmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT09IERPV05fQVJST1cgfHwga2V5Q29kZSA9PT0gVVBfQVJST1cgfHwKICAgICAgICAgICAga2V5Q29kZSA9PT0gTEVGVF9BUlJPVyB8fCBrZXlDb2RlID09PSBSSUdIVF9BUlJPVzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNPcGVuS2V5ID0ga2V5Q29kZSA9PT0gRU5URVIgfHwga2V5Q29kZSA9PT0gU1BBQ0U7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLl9rZXlNYW5hZ2VyOwogICAgICAgIC8vIE9wZW4gdGhlIHNlbGVjdCBvbiBBTFQgKyBhcnJvdyBrZXkgdG8gbWF0Y2ggdGhlIG5hdGl2ZSA8c2VsZWN0PgogICAgICAgIGlmICghbWFuYWdlci5pc1R5cGluZygpICYmIChpc09wZW5LZXkgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkgfHwKICAgICAgICAgICAgKCh0aGlzLm11bHRpcGxlIHx8IGV2ZW50LmFsdEtleSkgJiYgaXNBcnJvd0tleSkpIHsKICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gcHJldmVudHMgdGhlIHBhZ2UgZnJvbSBzY3JvbGxpbmcgZG93biB3aGVuIHByZXNzaW5nIHNwYWNlCiAgICAgICAgICAgIHRoaXMub3BlbigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghdGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzbHlTZWxlY3RlZE9wdGlvbiA9IHRoaXMuc2VsZWN0ZWQ7CiAgICAgICAgICAgIGlmIChrZXlDb2RlID09PSBIT01FIHx8IGtleUNvZGUgPT09IEVORCkgewogICAgICAgICAgICAgICAga2V5Q29kZSA9PT0gSE9NRSA/IG1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCkgOiBtYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbWFuYWdlci5vbktleWRvd24oZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLnNlbGVjdGVkOwogICAgICAgICAgICAvLyBTaW5jZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gYW5ub3VuY2UgaXQgb3Vyc2VsdmVzLgogICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgcHJldmlvdXNseVNlbGVjdGVkT3B0aW9uICE9PSBzZWxlY3RlZE9wdGlvbikgewogICAgICAgICAgICAgICAgLy8gV2Ugc2V0IGEgZHVyYXRpb24gb24gdGhlIGxpdmUgYW5ub3VuY2VtZW50LCBiZWNhdXNlIHdlIHdhbnQgdGhlIGxpdmUgZWxlbWVudCB0byBiZQogICAgICAgICAgICAgICAgLy8gY2xlYXJlZCBhZnRlciBhIHdoaWxlIHNvIHRoYXQgdXNlcnMgY2FuJ3QgbmF2aWdhdGUgdG8gaXQgdXNpbmcgdGhlIGFycm93IGtleXMuCiAgICAgICAgICAgICAgICB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKCgoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0ZWRPcHRpb24pKSkudmlld1ZhbHVlLCAxMDAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIHdoZW4gdGhlIHNlbGVjdGVkIGlzIG9wZW4uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2hhbmRsZU9wZW5LZXlkb3duKGV2ZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLl9rZXlNYW5hZ2VyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT09IERPV05fQVJST1cgfHwga2V5Q29kZSA9PT0gVVBfQVJST1c7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzVHlwaW5nID0gbWFuYWdlci5pc1R5cGluZygpOwogICAgICAgIGlmIChrZXlDb2RlID09PSBIT01FIHx8IGtleUNvZGUgPT09IEVORCkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBrZXlDb2RlID09PSBIT01FID8gbWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKSA6IG1hbmFnZXIuc2V0TGFzdEl0ZW1BY3RpdmUoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNBcnJvd0tleSAmJiBldmVudC5hbHRLZXkpIHsKICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHNlbGVjdCBvbiBBTFQgKyBhcnJvdyBrZXkgdG8gbWF0Y2ggdGhlIG5hdGl2ZSA8c2VsZWN0PgogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZSBpZiB0aGUgdXNlciBpcyB0eXBpbmcsCiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHR5cGluZyBzZXF1ZW5jZSBjYW4gaW5jbHVkZSB0aGUgc3BhY2Uga2V5LgogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghaXNUeXBpbmcgJiYgKGtleUNvZGUgPT09IEVOVEVSIHx8IGtleUNvZGUgPT09IFNQQUNFKSAmJiBtYW5hZ2VyLmFjdGl2ZUl0ZW0gJiYKICAgICAgICAgICAgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW0uX3NlbGVjdFZpYUludGVyYWN0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFpc1R5cGluZyAmJiB0aGlzLl9tdWx0aXBsZSAmJiBrZXlDb2RlID09PSBBICYmIGV2ZW50LmN0cmxLZXkpIHsKICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYXNEZXNlbGVjdGVkT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5zb21lKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdCA9PiAhb3B0LmRpc2FibGVkICYmICFvcHQuc2VsZWN0ZWQpKTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0aW9uID0+IHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzRGVzZWxlY3RlZE9wdGlvbnMgPyBvcHRpb24uc2VsZWN0KCkgOiBvcHRpb24uZGVzZWxlY3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEluZGV4ID0gbWFuYWdlci5hY3RpdmVJdGVtSW5kZXg7CiAgICAgICAgICAgIG1hbmFnZXIub25LZXlkb3duKGV2ZW50KTsKICAgICAgICAgICAgaWYgKHRoaXMuX211bHRpcGxlICYmIGlzQXJyb3dLZXkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgbWFuYWdlci5hY3RpdmVJdGVtICYmCiAgICAgICAgICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCAhPT0gcHJldmlvdXNseUZvY3VzZWRJbmRleCkgewogICAgICAgICAgICAgICAgbWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25Gb2N1cygpIHsKICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENhbGxzIHRoZSB0b3VjaGVkIGNhbGxiYWNrIG9ubHkgaWYgdGhlIHBhbmVsIGlzIGNsb3NlZC4gT3RoZXJ3aXNlLCB0aGUgdHJpZ2dlciB3aWxsCiAgICAgKiAiYmx1ciIgdG8gdGhlIHBhbmVsIHdoZW4gaXQgb3BlbnMsIGNhdXNpbmcgYSBmYWxzZSBwb3NpdGl2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbkJsdXIoKSB7CiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlOwogICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5wYW5lbE9wZW4pIHsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgb3ZlcmxheSBwYW5lbCBoYXMgYmVlbiBhdHRhY2hlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbkF0dGFjaGVkKCkgewogICAgICAgIHRoaXMub3ZlcmxheURpci5wb3NpdGlvbkNoYW5nZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlT3ZlcmxheU9mZnNldFgoKTsKICAgICAgICAgICAgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX3Njcm9sbFRvcDsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRoZW1lIHRvIGJlIHVzZWQgb24gdGhlIHBhbmVsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldFBhbmVsVGhlbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudEZvcm1GaWVsZCA/IGBtYXQtJHt0aGlzLl9wYXJlbnRGb3JtRmllbGQuY29sb3J9YCA6ICcnOwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBzZWxlY3QgaGFzIGEgdmFsdWUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZW1wdHkoKSB7CiAgICAgICAgcmV0dXJuICF0aGlzLl9zZWxlY3Rpb25Nb2RlbCB8fCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaW5pdGlhbGl6ZVNlbGVjdGlvbigpIHsKICAgICAgICAvLyBEZWZlciBzZXR0aW5nIHRoZSB2YWx1ZSBpbiBvcmRlciB0byBhdm9pZCB0aGUgIkV4cHJlc3Npb24KICAgICAgICAvLyBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZCIgZXJyb3JzIGZyb20gQW5ndWxhci4KICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZSh0aGlzLm5nQ29udHJvbCA/IHRoaXMubmdDb250cm9sLnZhbHVlIDogdGhpcy5fdmFsdWUpOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBvcHRpb24gYmFzZWQgb24gYSB2YWx1ZS4gSWYgbm8gb3B0aW9uIGNhbiBiZQogICAgICogZm91bmQgd2l0aCB0aGUgZGVzaWduYXRlZCB2YWx1ZSwgdGhlIHNlbGVjdCB0cmlnZ2VyIGlzIGNsZWFyZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB2YWx1ZSkgewogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpOwogICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjdXJyZW50VmFsdWUpID0+IHRoaXMuX3NlbGVjdFZhbHVlKGN1cnJlbnRWYWx1ZSkpKTsKICAgICAgICAgICAgdGhpcy5fc29ydFZhbHVlcygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5fc2VsZWN0VmFsdWUodmFsdWUpOwogICAgICAgICAgICAvLyBTaGlmdCBmb2N1cyB0byB0aGUgYWN0aXZlIGl0ZW0uIE5vdGUgdGhhdCB3ZSBzaG91bGRuJ3QgZG8gdGhpcyBpbiBtdWx0aXBsZQogICAgICAgICAgICAvLyBtb2RlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCBvcHRpb24gdGhlIHVzZXIgaW50ZXJhY3RlZCB3aXRoIGxhc3QuCiAgICAgICAgICAgIGlmIChjb3JyZXNwb25kaW5nT3B0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oY29ycmVzcG9uZGluZ09wdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucGFuZWxPcGVuKSB7CiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgcmVzZXQgdGhlIGhpZ2hsaWdodGVkIG9wdGlvbi4gTm90ZSB0aGF0IHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIHdoaWxlCiAgICAgICAgICAgICAgICAvLyBjbG9zZWQsIGJlY2F1c2UgZG9pbmcgaXQgd2hpbGUgb3BlbiBjYW4gc2hpZnQgdGhlIHVzZXIncyBmb2N1cyB1bm5lY2Vzc2FyaWx5LgogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgIH0KICAgIC8qKgogICAgICogRmluZHMgYW5kIHNlbGVjdHMgYW5kIG9wdGlvbiBiYXNlZCBvbiBpdHMgdmFsdWUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30gT3B0aW9uIHRoYXQgaGFzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICovCiAgICBfc2VsZWN0VmFsdWUodmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29ycmVzcG9uZGluZ09wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG9wdGlvbikgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gVHJlYXQgbnVsbCBhcyBhIHNwZWNpYWwgcmVzZXQgdmFsdWUuCiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlICE9IG51bGwgJiYgdGhpcy5fY29tcGFyZVdpdGgob3B0aW9uLnZhbHVlLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZGV2ZWxvcGVycyBvZiBlcnJvcnMgaW4gdGhlaXIgY29tcGFyYXRvci4KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGlmIChjb3JyZXNwb25kaW5nT3B0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChjb3JyZXNwb25kaW5nT3B0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdPcHRpb247CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdXAgYSBrZXkgbWFuYWdlciB0byBsaXN0ZW4gdG8ga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbml0S2V5TWFuYWdlcigpIHsKICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyKHRoaXMub3B0aW9ucykKICAgICAgICAgICAgLndpdGhUeXBlQWhlYWQodGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCkKICAgICAgICAgICAgLndpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKCkKICAgICAgICAgICAgLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKSA/ICdydGwnIDogJ2x0cicpCiAgICAgICAgICAgIC53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbJ3NoaWZ0S2V5J10pOwogICAgICAgIHRoaXMuX2tleU1hbmFnZXIudGFiT3V0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGFjdGl2ZSBpdGVtIHdoZW4gdGFiYmluZyBhd2F5LiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIG5hdGl2ZQogICAgICAgICAgICAvLyBzZWxlY3QgYmVoYXZlcy4gTm90ZSB0aGF0IHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGluIHNpbmdsZSBzZWxlY3Rpb24gbW9kZS4KICAgICAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlICYmIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbSkgewogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIHRyaWdnZXIgYmVmb3JlIGNsb3NpbmcuIEVuc3VyZXMgdGhhdCB0aGUgZm9jdXMKICAgICAgICAgICAgLy8gcG9zaXRpb24gd29uJ3QgYmUgbG9zdCBpZiB0aGUgdXNlciBnb3QgZm9jdXMgaW50byB0aGUgb3ZlcmxheS4KICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX2tleU1hbmFnZXIuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5fcGFuZWxPcGVuICYmIHRoaXMucGFuZWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbEFjdGl2ZU9wdGlvbkludG9WaWV3KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3BhbmVsT3BlbiAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogRHJvcHMgY3VycmVudCBvcHRpb24gc3Vic2NyaXB0aW9ucyBhbmQgSURzIGFuZCByZXNldHMgZnJvbSBzY3JhdGNoLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZXNldE9wdGlvbnMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9ucy5jaGFuZ2VzLCB0aGlzLl9kZXN0cm95KTsKICAgICAgICB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMucGlwZSh0YWtlVW50aWwoY2hhbmdlZE9yRGVzdHJveWVkKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0KGV2ZW50LnNvdXJjZSwgZXZlbnQuaXNVc2VySW5wdXQpOwogICAgICAgICAgICBpZiAoZXZlbnQuaXNVc2VySW5wdXQgJiYgIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5fcGFuZWxPcGVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgLy8gTGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBvcHRpb25zIGFuZCByZWFjdCBhY2NvcmRpbmdseS4KICAgICAgICAvLyBIYW5kbGVzIGNhc2VzIGxpa2UgdGhlIGxhYmVscyBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBjaGFuZ2luZy4KICAgICAgICBtZXJnZSguLi50aGlzLm9wdGlvbnMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5fc3RhdGVDaGFuZ2VzKSkpCiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKQogICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fc2V0T3B0aW9uSWRzKCk7CiAgICB9CiAgICAvKioKICAgICAqIEludm9rZWQgd2hlbiBhbiBvcHRpb24gaXMgY2xpY2tlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICogQHBhcmFtIHs/fSBpc1VzZXJJbnB1dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uU2VsZWN0KG9wdGlvbiwgaXNVc2VySW5wdXQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbik7CiAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSA9PSBudWxsICYmICF0aGlzLl9tdWx0aXBsZSkgewogICAgICAgICAgICBvcHRpb24uZGVzZWxlY3QoKTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlcyhvcHRpb24udmFsdWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkICE9PSBvcHRpb24uc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA/IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChvcHRpb24pIDoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChvcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1VzZXJJbnB1dCkgewogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG9wdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgIGlmIChpc1VzZXJJbnB1dCkgewogICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIG9wdGlvbiB3aXRoIHRoZWlyIG1vdXNlLCB3ZQogICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gcmVzdG9yZSBmb2N1cyBiYWNrIHRvIHRoZSB0cmlnZ2VyLCBpbiBvcmRlciB0bwogICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgdGhlIHNlbGVjdCBrZXlib2FyZCBjb250cm9scyBmcm9tIGNsYXNoaW5nIHdpdGgKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25lcyBmcm9tIGBtYXQtb3B0aW9uYC4KICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHdhc1NlbGVjdGVkICE9PSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbikpIHsKICAgICAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlcygpOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICB9CiAgICAvKioKICAgICAqIFNvcnRzIHRoZSBzZWxlY3RlZCB2YWx1ZXMgaW4gdGhlIHNlbGVjdGVkIGJhc2VkIG9uIHRoZWlyIG9yZGVyIGluIHRoZSBwYW5lbC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc29ydFZhbHVlcygpIHsKICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMudG9BcnJheSgpOwogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zb3J0KCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGEsIGIpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRDb21wYXJhdG9yID8gdGhpcy5zb3J0Q29tcGFyYXRvcihhLCBiLCBvcHRpb25zKSA6CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbmRleE9mKGEpIC0gb3B0aW9ucy5pbmRleE9mKGIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIGNoYW5nZSBldmVudCB0byBzZXQgdGhlIG1vZGVsIHZhbHVlLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Pz19IGZhbGxiYWNrVmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9wcm9wYWdhdGVDaGFuZ2VzKGZhbGxiYWNrVmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHZhbHVlVG9FbWl0ID0gbnVsbDsKICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICB2YWx1ZVRvRW1pdCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5zZWxlY3RlZCkpKS5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0aW9uID0+IG9wdGlvbi52YWx1ZSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFsdWVUb0VtaXQgPSB0aGlzLnNlbGVjdGVkID8gKCgvKiogQHR5cGUgez99ICovICh0aGlzLnNlbGVjdGVkKSkpLnZhbHVlIDogZmFsbGJhY2tWYWx1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZVRvRW1pdDsKICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWVUb0VtaXQpOwogICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlVG9FbWl0KTsKICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KG5ldyBNYXRTZWxlY3RDaGFuZ2UodGhpcywgdmFsdWVUb0VtaXQpKTsKICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgIH0KICAgIC8qKgogICAgICogUmVjb3JkcyBvcHRpb24gSURzIHRvIHBhc3MgdG8gdGhlIGFyaWEtb3ducyBwcm9wZXJ0eS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0T3B0aW9uSWRzKCkgewogICAgICAgIHRoaXMuX29wdGlvbklkcyA9IHRoaXMub3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmlkKSkuam9pbignICcpOwogICAgfQogICAgLyoqCiAgICAgKiBIaWdobGlnaHRzIHRoZSBzZWxlY3RlZCBpdGVtLiBJZiBubyBvcHRpb24gaXMgc2VsZWN0ZWQsIGl0IHdpbGwgaGlnaGxpZ2h0CiAgICAgKiB0aGUgZmlyc3QgaXRlbSBpbnN0ZWFkLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9oaWdobGlnaHRDb3JyZWN0T3B0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9rZXlNYW5hZ2VyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmVtcHR5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2Nyb2xscyB0aGUgYWN0aXZlIG9wdGlvbiBpbnRvIHZpZXcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Njcm9sbEFjdGl2ZU9wdGlvbkludG9WaWV3KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhY3RpdmVPcHRpb25JbmRleCA9IHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4IHx8IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxhYmVsQ291bnQgPSBfY291bnRHcm91cExhYmVsc0JlZm9yZU9wdGlvbihhY3RpdmVPcHRpb25JbmRleCwgdGhpcy5vcHRpb25zLCB0aGlzLm9wdGlvbkdyb3Vwcyk7CiAgICAgICAgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IF9nZXRPcHRpb25TY3JvbGxQb3NpdGlvbihhY3RpdmVPcHRpb25JbmRleCArIGxhYmVsQ291bnQsIHRoaXMuX2dldEl0ZW1IZWlnaHQoKSwgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCwgU0VMRUNUX1BBTkVMX01BWF9IRUlHSFQpOwogICAgfQogICAgLyoqCiAgICAgKiBGb2N1c2VzIHRoZSBzZWxlY3QgZWxlbWVudC4KICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvY3VzKG9wdGlvbnMpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBwcm92aWRlZCBvcHRpb24gaW4gdGhlIG9wdGlvbiBsaXN0LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0T3B0aW9uSW5kZXgob3B0aW9uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWR1Y2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlc3VsdCwgY3VycmVudCwgaW5kZXgpID0+IHsKICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcHRpb24gPT09IGN1cnJlbnQgPyBpbmRleCA6IHVuZGVmaW5lZDsKICAgICAgICB9KSwgdW5kZWZpbmVkKTsKICAgIH0KICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCB4LSBhbmQgeS1vZmZzZXRzIG9mIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYWxjdWxhdGVPdmVybGF5UG9zaXRpb24oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW1IZWlnaHQgPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbUNvdW50KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhbmVsSGVpZ2h0ID0gTWF0aC5taW4oaXRlbXMgKiBpdGVtSGVpZ2h0LCBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckhlaWdodCA9IGl0ZW1zICogaXRlbUhlaWdodDsKICAgICAgICAvLyBUaGUgZmFydGhlc3QgdGhlIHBhbmVsIGNhbiBiZSBzY3JvbGxlZCBiZWZvcmUgaXQgaGl0cyB0aGUgYm90dG9tCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHNjcm9sbENvbnRhaW5lckhlaWdodCAtIHBhbmVsSGVpZ2h0OwogICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHNlbGVjdGVkIHdlIG9wZW4gdGhlIHBvcHVwIHRvIHRoZSBmaXJzdCBpdGVtLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25PZmZzZXQgPSB0aGlzLmVtcHR5ID8gMCA6ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9nZXRPcHRpb25JbmRleCh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSkpKTsKICAgICAgICBzZWxlY3RlZE9wdGlvbk9mZnNldCArPSBfY291bnRHcm91cExhYmVsc0JlZm9yZU9wdGlvbihzZWxlY3RlZE9wdGlvbk9mZnNldCwgdGhpcy5vcHRpb25zLCB0aGlzLm9wdGlvbkdyb3Vwcyk7CiAgICAgICAgLy8gV2UgbXVzdCBtYWludGFpbiBhIHNjcm9sbCBidWZmZXIgc28gdGhlIHNlbGVjdGVkIG9wdGlvbiB3aWxsIGJlIHNjcm9sbGVkIHRvIHRoZQogICAgICAgIC8vIGNlbnRlciBvZiB0aGUgb3ZlcmxheSBwYW5lbCByYXRoZXIgdGhhbiB0aGUgdG9wLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY3JvbGxCdWZmZXIgPSBwYW5lbEhlaWdodCAvIDI7CiAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gdGhpcy5fY2FsY3VsYXRlT3ZlcmxheVNjcm9sbChzZWxlY3RlZE9wdGlvbk9mZnNldCwgc2Nyb2xsQnVmZmVyLCBtYXhTY3JvbGwpOwogICAgICAgIHRoaXMuX29mZnNldFkgPSB0aGlzLl9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WShzZWxlY3RlZE9wdGlvbk9mZnNldCwgc2Nyb2xsQnVmZmVyLCBtYXhTY3JvbGwpOwogICAgICAgIHRoaXMuX2NoZWNrT3ZlcmxheVdpdGhpblZpZXdwb3J0KG1heFNjcm9sbCk7CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbC4KICAgICAqCiAgICAgKiBBdHRlbXB0cyB0byBjZW50ZXIgdGhlIHNlbGVjdGVkIG9wdGlvbiBpbiB0aGUgcGFuZWwuIElmIHRoZSBvcHRpb24gaXMKICAgICAqIHRvbyBoaWdoIG9yIHRvbyBsb3cgaW4gdGhlIHBhbmVsIHRvIGJlIHNjcm9sbGVkIHRvIHRoZSBjZW50ZXIsIGl0IGNsYW1wcyB0aGUKICAgICAqIHNjcm9sbCBwb3NpdGlvbiB0byB0aGUgbWluIG9yIG1heCBzY3JvbGwgcG9zaXRpb25zIHJlc3BlY3RpdmVseS4KICAgICAqIEBwYXJhbSB7P30gc2VsZWN0ZWRJbmRleAogICAgICogQHBhcmFtIHs/fSBzY3JvbGxCdWZmZXIKICAgICAqIEBwYXJhbSB7P30gbWF4U2Nyb2xsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2FsY3VsYXRlT3ZlcmxheVNjcm9sbChzZWxlY3RlZEluZGV4LCBzY3JvbGxCdWZmZXIsIG1heFNjcm9sbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcHRpb25PZmZzZXRGcm9tU2Nyb2xsVG9wID0gaXRlbUhlaWdodCAqIHNlbGVjdGVkSW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhbGZPcHRpb25IZWlnaHQgPSBpdGVtSGVpZ2h0IC8gMjsKICAgICAgICAvLyBTdGFydHMgYXQgdGhlIG9wdGlvbk9mZnNldEZyb21TY3JvbGxUb3AsIHdoaWNoIHNjcm9sbHMgdGhlIG9wdGlvbiB0byB0aGUgdG9wIG9mIHRoZQogICAgICAgIC8vIHNjcm9sbCBjb250YWluZXIsIHRoZW4gc3VidHJhY3RzIHRoZSBzY3JvbGwgYnVmZmVyIHRvIHNjcm9sbCB0aGUgb3B0aW9uIGRvd24gdG8KICAgICAgICAvLyB0aGUgY2VudGVyIG9mIHRoZSBvdmVybGF5IHBhbmVsLiBIYWxmIHRoZSBvcHRpb24gaGVpZ2h0IG11c3QgYmUgcmUtYWRkZWQgdG8gdGhlCiAgICAgICAgLy8gc2Nyb2xsVG9wIHNvIHRoZSBvcHRpb24gaXMgY2VudGVyZWQgYmFzZWQgb24gaXRzIG1pZGRsZSwgbm90IGl0cyB0b3AgZWRnZS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3B0aW1hbFNjcm9sbFBvc2l0aW9uID0gb3B0aW9uT2Zmc2V0RnJvbVNjcm9sbFRvcCAtIHNjcm9sbEJ1ZmZlciArIGhhbGZPcHRpb25IZWlnaHQ7CiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KDAsIG9wdGltYWxTY3JvbGxQb3NpdGlvbiksIG1heFNjcm9sbCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGFyaWEtbGFiZWwgb2YgdGhlIHNlbGVjdCBjb21wb25lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0QXJpYUxhYmVsKCkgewogICAgICAgIC8vIElmIGFuIGFyaWFMYWJlbGxlZGJ5IHZhbHVlIGhhcyBiZWVuIHNldCBieSB0aGUgY29uc3VtZXIsIHRoZSBzZWxlY3Qgc2hvdWxkIG5vdCBvdmVyd3JpdGUgdGhlCiAgICAgICAgLy8gYGFyaWEtbGFiZWxsZWRieWAgdmFsdWUgYnkgc2V0dGluZyB0aGUgYXJpYUxhYmVsIHRvIHRoZSBwbGFjZWhvbGRlci4KICAgICAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxsZWRieSA/IG51bGwgOiB0aGlzLmFyaWFMYWJlbCB8fCB0aGlzLnBsYWNlaG9sZGVyOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhcmlhLWxhYmVsbGVkYnkgb2YgdGhlIHNlbGVjdCBjb21wb25lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0QXJpYUxhYmVsbGVkYnkoKSB7CiAgICAgICAgaWYgKHRoaXMuYXJpYUxhYmVsbGVkYnkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnk7CiAgICAgICAgfQogICAgICAgIC8vIE5vdGU6IHdlIHVzZSBgX2dldEFyaWFMYWJlbGAgaGVyZSwgYmVjYXVzZSB3ZSB3YW50IHRvIGNoZWNrIHdoZXRoZXIgdGhlcmUncyBhCiAgICAgICAgLy8gY29tcHV0ZWQgbGFiZWwuIGB0aGlzLmFyaWFMYWJlbGAgaXMgb25seSB0aGUgdXNlci1zcGVjaWZpZWQgbGFiZWwuCiAgICAgICAgaWYgKCF0aGlzLl9wYXJlbnRGb3JtRmllbGQgfHwgIXRoaXMuX3BhcmVudEZvcm1GaWVsZC5faGFzRmxvYXRpbmdMYWJlbCgpIHx8CiAgICAgICAgICAgIHRoaXMuX2dldEFyaWFMYWJlbCgpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Rm9ybUZpZWxkLl9sYWJlbElkIHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIHRvIGJlIHNldCBvbiB0aGUgaG9zdC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRBcmlhQWN0aXZlRGVzY2VuZGFudCgpIHsKICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgdGhpcy5fa2V5TWFuYWdlciAmJiB0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5pZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIHgtb2Zmc2V0IG9mIHRoZSBvdmVybGF5IHBhbmVsIGluIHJlbGF0aW9uIHRvIHRoZSB0cmlnZ2VyJ3MgdG9wIHN0YXJ0IGNvcm5lci4KICAgICAqIFRoaXMgbXVzdCBiZSBhZGp1c3RlZCB0byBhbGlnbiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRleHQgb3ZlciB0aGUgdHJpZ2dlciB0ZXh0IHdoZW4KICAgICAqIHRoZSBwYW5lbCBvcGVucy4gV2lsbCBjaGFuZ2UgYmFzZWQgb24gTFRSIG9yIFJUTCB0ZXh0IGRpcmVjdGlvbi4gTm90ZSB0aGF0IHRoZSBvZmZzZXQKICAgICAqIGNhbid0IGJlIGNhbGN1bGF0ZWQgdW50aWwgdGhlIHBhbmVsIGhhcyBiZWVuIGF0dGFjaGVkLCBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB0aGUKICAgICAqIGNvbnRlbnQgd2lkdGggaW4gb3JkZXIgdG8gY29uc3RyYWluIHRoZSBwYW5lbCB3aXRoaW4gdGhlIHZpZXdwb3J0LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3ZlcmxheVJlY3QgPSB0aGlzLm92ZXJsYXlEaXIub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNSdGwgPSB0aGlzLl9pc1J0bCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYWRkaW5nV2lkdGggPSB0aGlzLm11bHRpcGxlID8gU0VMRUNUX01VTFRJUExFX1BBTkVMX1BBRERJTkdfWCArIFNFTEVDVF9QQU5FTF9QQURESU5HX1ggOgogICAgICAgICAgICBTRUxFQ1RfUEFORUxfUEFERElOR19YICogMjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG9mZnNldFg7CiAgICAgICAgLy8gQWRqdXN0IHRoZSBvZmZzZXQsIGRlcGVuZGluZyBvbiB0aGUgb3B0aW9uIHBhZGRpbmcuCiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHsKICAgICAgICAgICAgb2Zmc2V0WCA9IFNFTEVDVF9NVUxUSVBMRV9QQU5FTF9QQURESU5HX1g7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdIHx8IHRoaXMub3B0aW9ucy5maXJzdDsKICAgICAgICAgICAgb2Zmc2V0WCA9IHNlbGVjdGVkICYmIHNlbGVjdGVkLmdyb3VwID8gU0VMRUNUX1BBTkVMX0lOREVOVF9QQURESU5HX1ggOiBTRUxFQ1RfUEFORUxfUEFERElOR19YOwogICAgICAgIH0KICAgICAgICAvLyBJbnZlcnQgdGhlIG9mZnNldCBpbiBMVFIuCiAgICAgICAgaWYgKCFpc1J0bCkgewogICAgICAgICAgICBvZmZzZXRYICo9IC0xOwogICAgICAgIH0KICAgICAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggdGhlIHNlbGVjdCBvdmVyZmxvd3Mgb24gZWFjaCBzaWRlLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsZWZ0T3ZlcmZsb3cgPSAwIC0gKG92ZXJsYXlSZWN0LmxlZnQgKyBvZmZzZXRYIC0gKGlzUnRsID8gcGFkZGluZ1dpZHRoIDogMCkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByaWdodE92ZXJmbG93ID0gb3ZlcmxheVJlY3QucmlnaHQgKyBvZmZzZXRYIC0gdmlld3BvcnRTaXplLndpZHRoCiAgICAgICAgICAgICsgKGlzUnRsID8gMCA6IHBhZGRpbmdXaWR0aCk7CiAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgb3ZlcmZsb3dzIG9uIGVpdGhlciBzaWRlLCByZWR1Y2UgdGhlIG9mZnNldCB0byBhbGxvdyBpdCB0byBmaXQuCiAgICAgICAgaWYgKGxlZnRPdmVyZmxvdyA+IDApIHsKICAgICAgICAgICAgb2Zmc2V0WCArPSBsZWZ0T3ZlcmZsb3cgKyBTRUxFQ1RfUEFORUxfVklFV1BPUlRfUEFERElORzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmlnaHRPdmVyZmxvdyA+IDApIHsKICAgICAgICAgICAgb2Zmc2V0WCAtPSByaWdodE92ZXJmbG93ICsgU0VMRUNUX1BBTkVMX1ZJRVdQT1JUX1BBRERJTkc7CiAgICAgICAgfQogICAgICAgIC8vIFNldCB0aGUgb2Zmc2V0IGRpcmVjdGx5IGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0byBnbyB0aHJvdWdoIGNoYW5nZSBkZXRlY3Rpb24gYW5kCiAgICAgICAgLy8gcG90ZW50aWFsbHkgdHJpZ2dlcmluZyAiY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZCIgZXJyb3JzLiBSb3VuZCB0aGUgdmFsdWUgdG8gYXZvaWQKICAgICAgICAvLyBibHVycnkgY29udGVudCBpbiBzb21lIGJyb3dzZXJzLgogICAgICAgIHRoaXMub3ZlcmxheURpci5vZmZzZXRYID0gTWF0aC5yb3VuZChvZmZzZXRYKTsKICAgICAgICB0aGlzLm92ZXJsYXlEaXIub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSB5LW9mZnNldCBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbCBpbiByZWxhdGlvbiB0byB0aGUKICAgICAqIHRvcCBzdGFydCBjb3JuZXIgb2YgdGhlIHRyaWdnZXIuIEl0IGhhcyB0byBiZSBhZGp1c3RlZCBpbiBvcmRlciBmb3IgdGhlCiAgICAgKiBzZWxlY3RlZCBvcHRpb24gdG8gYmUgYWxpZ25lZCBvdmVyIHRoZSB0cmlnZ2VyIHdoZW4gdGhlIHBhbmVsIG9wZW5zLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0ZWRJbmRleAogICAgICogQHBhcmFtIHs/fSBzY3JvbGxCdWZmZXIKICAgICAqIEBwYXJhbSB7P30gbWF4U2Nyb2xsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2FsY3VsYXRlT3ZlcmxheU9mZnNldFkoc2VsZWN0ZWRJbmRleCwgc2Nyb2xsQnVmZmVyLCBtYXhTY3JvbGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXRlbUhlaWdodCA9IHRoaXMuX2dldEl0ZW1IZWlnaHQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3B0aW9uSGVpZ2h0QWRqdXN0bWVudCA9IChpdGVtSGVpZ2h0IC0gdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0KSAvIDI7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1heE9wdGlvbnNEaXNwbGF5ZWQgPSBNYXRoLmZsb29yKFNFTEVDVF9QQU5FTF9NQVhfSEVJR0hUIC8gaXRlbUhlaWdodCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvcHRpb25PZmZzZXRGcm9tUGFuZWxUb3A7CiAgICAgICAgLy8gRGlzYWJsZSBvZmZzZXQgaWYgcmVxdWVzdGVkIGJ5IHVzZXIgYnkgcmV0dXJuaW5nIDAgYXMgdmFsdWUgdG8gb2Zmc2V0CiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zY3JvbGxUb3AgPT09IDApIHsKICAgICAgICAgICAgb3B0aW9uT2Zmc2V0RnJvbVBhbmVsVG9wID0gc2VsZWN0ZWRJbmRleCAqIGl0ZW1IZWlnaHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuX3Njcm9sbFRvcCA9PT0gbWF4U2Nyb2xsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3REaXNwbGF5ZWRJbmRleCA9IHRoaXMuX2dldEl0ZW1Db3VudCgpIC0gbWF4T3B0aW9uc0Rpc3BsYXllZDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWxlY3RlZERpc3BsYXlJbmRleCA9IHNlbGVjdGVkSW5kZXggLSBmaXJzdERpc3BsYXllZEluZGV4OwogICAgICAgICAgICAvLyBUaGUgZmlyc3QgaXRlbSBpcyBwYXJ0aWFsbHkgb3V0IG9mIHRoZSB2aWV3cG9ydC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHdoYXQKICAgICAgICAgICAgLy8gcG9ydGlvbiBvZiBpdCBpcyBzaG93biBpbiB0aGUgdmlld3BvcnQgYW5kIGFjY291bnQgZm9yIGl0IGluIG91ciBvZmZzZXQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcnRpYWxJdGVtSGVpZ2h0ID0gaXRlbUhlaWdodCAtICh0aGlzLl9nZXRJdGVtQ291bnQoKSAqIGl0ZW1IZWlnaHQgLSBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCkgJSBpdGVtSGVpZ2h0OwogICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBwYW5lbCBoZWlnaHQgaXMgbG9uZ2VyIHRoYW4gdGhlIGhlaWdodCBvZiB0aGUgb3B0aW9ucyBhbG9uZSwKICAgICAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGV4dHJhIHBhZGRpbmcgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIHBhbmVsLiBXaGVuCiAgICAgICAgICAgIC8vIHNjcm9sbGVkIHRvIHRoZSB2ZXJ5IGJvdHRvbSwgdGhpcyBwYWRkaW5nIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmVsIGFuZAogICAgICAgICAgICAvLyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBvZmZzZXQuCiAgICAgICAgICAgIG9wdGlvbk9mZnNldEZyb21QYW5lbFRvcCA9IHNlbGVjdGVkRGlzcGxheUluZGV4ICogaXRlbUhlaWdodCArIHBhcnRpYWxJdGVtSGVpZ2h0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gSWYgdGhlIG9wdGlvbiB3YXMgc2Nyb2xsZWQgdG8gdGhlIG1pZGRsZSBvZiB0aGUgcGFuZWwgdXNpbmcgYSBzY3JvbGwgYnVmZmVyLAogICAgICAgICAgICAvLyBpdHMgb2Zmc2V0IHdpbGwgYmUgdGhlIHNjcm9sbCBidWZmZXIgbWludXMgdGhlIGhhbGYgaGVpZ2h0IHRoYXQgd2FzIGFkZGVkIHRvCiAgICAgICAgICAgIC8vIGNlbnRlciBpdC4KICAgICAgICAgICAgb3B0aW9uT2Zmc2V0RnJvbVBhbmVsVG9wID0gc2Nyb2xsQnVmZmVyIC0gaXRlbUhlaWdodCAvIDI7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBmaW5hbCBvZmZzZXQgaXMgdGhlIG9wdGlvbidzIG9mZnNldCBmcm9tIHRoZSB0b3AsIGFkanVzdGVkIGZvciB0aGUgaGVpZ2h0IGRpZmZlcmVuY2UsCiAgICAgICAgLy8gbXVsdGlwbGllZCBieSAtMSB0byBlbnN1cmUgdGhhdCB0aGUgb3ZlcmxheSBtb3ZlcyBpbiB0aGUgY29ycmVjdCBkaXJlY3Rpb24gdXAgdGhlIHBhZ2UuCiAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHJvdW5kZWQgdG8gcHJldmVudCBzb21lIGJyb3dzZXJzIGZyb20gYmx1cnJpbmcgdGhlIGNvbnRlbnQuCiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQob3B0aW9uT2Zmc2V0RnJvbVBhbmVsVG9wICogLTEgLSBvcHRpb25IZWlnaHRBZGp1c3RtZW50KTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHRoYXQgdGhlIGF0dGVtcHRlZCBvdmVybGF5IHBvc2l0aW9uIHdpbGwgZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuCiAgICAgKiBJZiBpdCB3aWxsIG5vdCBmaXQsIHRyaWVzIHRvIGFkanVzdCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCB0aGUgYXNzb2NpYXRlZAogICAgICogeS1vZmZzZXQgc28gdGhlIHBhbmVsIGNhbiBvcGVuIGZ1bGx5IG9uLXNjcmVlbi4gSWYgaXQgc3RpbGwgd29uJ3QgZml0LAogICAgICogc2V0cyB0aGUgb2Zmc2V0IGJhY2sgdG8gMCB0byBhbGxvdyB0aGUgZmFsbGJhY2sgcG9zaXRpb24gdG8gdGFrZSBvdmVyLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gbWF4U2Nyb2xsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2hlY2tPdmVybGF5V2l0aGluVmlld3BvcnQobWF4U2Nyb2xsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW1IZWlnaHQgPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRvcFNwYWNlQXZhaWxhYmxlID0gdGhpcy5fdHJpZ2dlclJlY3QudG9wIC0gU0VMRUNUX1BBTkVMX1ZJRVdQT1JUX1BBRERJTkc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJvdHRvbVNwYWNlQXZhaWxhYmxlID0gdmlld3BvcnRTaXplLmhlaWdodCAtIHRoaXMuX3RyaWdnZXJSZWN0LmJvdHRvbSAtIFNFTEVDVF9QQU5FTF9WSUVXUE9SVF9QQURESU5HOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYW5lbEhlaWdodFRvcCA9IE1hdGguYWJzKHRoaXMuX29mZnNldFkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0b3RhbFBhbmVsSGVpZ2h0ID0gTWF0aC5taW4odGhpcy5fZ2V0SXRlbUNvdW50KCkgKiBpdGVtSGVpZ2h0LCBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhbmVsSGVpZ2h0Qm90dG9tID0gdG90YWxQYW5lbEhlaWdodCAtIHBhbmVsSGVpZ2h0VG9wIC0gdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0OwogICAgICAgIGlmIChwYW5lbEhlaWdodEJvdHRvbSA+IGJvdHRvbVNwYWNlQXZhaWxhYmxlKSB7CiAgICAgICAgICAgIHRoaXMuX2FkanVzdFBhbmVsVXAocGFuZWxIZWlnaHRCb3R0b20sIGJvdHRvbVNwYWNlQXZhaWxhYmxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocGFuZWxIZWlnaHRUb3AgPiB0b3BTcGFjZUF2YWlsYWJsZSkgewogICAgICAgICAgICB0aGlzLl9hZGp1c3RQYW5lbERvd24ocGFuZWxIZWlnaHRUb3AsIHRvcFNwYWNlQXZhaWxhYmxlLCBtYXhTY3JvbGwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtT3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQWRqdXN0cyB0aGUgb3ZlcmxheSBwYW5lbCB1cCB0byBmaXQgaW4gdGhlIHZpZXdwb3J0LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcGFuZWxIZWlnaHRCb3R0b20KICAgICAqIEBwYXJhbSB7P30gYm90dG9tU3BhY2VBdmFpbGFibGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hZGp1c3RQYW5lbFVwKHBhbmVsSGVpZ2h0Qm90dG9tLCBib3R0b21TcGFjZUF2YWlsYWJsZSkgewogICAgICAgIC8vIEJyb3dzZXJzIGlnbm9yZSBmcmFjdGlvbmFsIHNjcm9sbCBvZmZzZXRzLCBzbyB3ZSBuZWVkIHRvIHJvdW5kLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXN0YW5jZUJlbG93Vmlld3BvcnQgPSBNYXRoLnJvdW5kKHBhbmVsSGVpZ2h0Qm90dG9tIC0gYm90dG9tU3BhY2VBdmFpbGFibGUpOwogICAgICAgIC8vIFNjcm9sbHMgdGhlIHBhbmVsIHVwIGJ5IHRoZSBkaXN0YW5jZSBpdCB3YXMgZXh0ZW5kaW5nIHBhc3QgdGhlIGJvdW5kYXJ5LCB0aGVuCiAgICAgICAgLy8gYWRqdXN0cyB0aGUgb2Zmc2V0IGJ5IHRoYXQgYW1vdW50IHRvIG1vdmUgdGhlIHBhbmVsIHVwIGludG8gdGhlIHZpZXdwb3J0LgogICAgICAgIHRoaXMuX3Njcm9sbFRvcCAtPSBkaXN0YW5jZUJlbG93Vmlld3BvcnQ7CiAgICAgICAgdGhpcy5fb2Zmc2V0WSAtPSBkaXN0YW5jZUJlbG93Vmlld3BvcnQ7CiAgICAgICAgdGhpcy5fdHJhbnNmb3JtT3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpOwogICAgICAgIC8vIElmIHRoZSBwYW5lbCBpcyBzY3JvbGxlZCB0byB0aGUgdmVyeSB0b3AsIGl0IHdvbid0IGJlIGFibGUgdG8gZml0IHRoZSBwYW5lbAogICAgICAgIC8vIGJ5IHNjcm9sbGluZywgc28gc2V0IHRoZSBvZmZzZXQgdG8gMCB0byBhbGxvdyB0aGUgZmFsbGJhY2sgcG9zaXRpb24gdG8gdGFrZQogICAgICAgIC8vIGVmZmVjdC4KICAgICAgICBpZiAodGhpcy5fc2Nyb2xsVG9wIDw9IDApIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gMDsKICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IGA1MCUgYm90dG9tIDBweGA7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBZGp1c3RzIHRoZSBvdmVybGF5IHBhbmVsIGRvd24gdG8gZml0IGluIHRoZSB2aWV3cG9ydC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhbmVsSGVpZ2h0VG9wCiAgICAgKiBAcGFyYW0gez99IHRvcFNwYWNlQXZhaWxhYmxlCiAgICAgKiBAcGFyYW0gez99IG1heFNjcm9sbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkanVzdFBhbmVsRG93bihwYW5lbEhlaWdodFRvcCwgdG9wU3BhY2VBdmFpbGFibGUsIG1heFNjcm9sbCkgewogICAgICAgIC8vIEJyb3dzZXJzIGlnbm9yZSBmcmFjdGlvbmFsIHNjcm9sbCBvZmZzZXRzLCBzbyB3ZSBuZWVkIHRvIHJvdW5kLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXN0YW5jZUFib3ZlVmlld3BvcnQgPSBNYXRoLnJvdW5kKHBhbmVsSGVpZ2h0VG9wIC0gdG9wU3BhY2VBdmFpbGFibGUpOwogICAgICAgIC8vIFNjcm9sbHMgdGhlIHBhbmVsIGRvd24gYnkgdGhlIGRpc3RhbmNlIGl0IHdhcyBleHRlbmRpbmcgcGFzdCB0aGUgYm91bmRhcnksIHRoZW4KICAgICAgICAvLyBhZGp1c3RzIHRoZSBvZmZzZXQgYnkgdGhhdCBhbW91bnQgdG8gbW92ZSB0aGUgcGFuZWwgZG93biBpbnRvIHRoZSB2aWV3cG9ydC4KICAgICAgICB0aGlzLl9zY3JvbGxUb3AgKz0gZGlzdGFuY2VBYm92ZVZpZXdwb3J0OwogICAgICAgIHRoaXMuX29mZnNldFkgKz0gZGlzdGFuY2VBYm92ZVZpZXdwb3J0OwogICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKTsKICAgICAgICAvLyBJZiB0aGUgcGFuZWwgaXMgc2Nyb2xsZWQgdG8gdGhlIHZlcnkgYm90dG9tLCBpdCB3b24ndCBiZSBhYmxlIHRvIGZpdCB0aGUKICAgICAgICAvLyBwYW5lbCBieSBzY3JvbGxpbmcsIHNvIHNldCB0aGUgb2Zmc2V0IHRvIDAgdG8gYWxsb3cgdGhlIGZhbGxiYWNrIHBvc2l0aW9uCiAgICAgICAgLy8gdG8gdGFrZSBlZmZlY3QuCiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFRvcCA+PSBtYXhTY3JvbGwpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gbWF4U2Nyb2xsOwogICAgICAgICAgICB0aGlzLl9vZmZzZXRZID0gMDsKICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtT3JpZ2luID0gYDUwJSB0b3AgMHB4YDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgdHJhbnNmb3JtIG9yaWdpbiBwb2ludCBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgb3B0aW9uLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRPcmlnaW5CYXNlZE9uT3B0aW9uKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvcHRpb25IZWlnaHRBZGp1c3RtZW50ID0gKGl0ZW1IZWlnaHQgLSB0aGlzLl90cmlnZ2VyUmVjdC5oZWlnaHQpIC8gMjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3JpZ2luWSA9IE1hdGguYWJzKHRoaXMuX29mZnNldFkpIC0gb3B0aW9uSGVpZ2h0QWRqdXN0bWVudCArIGl0ZW1IZWlnaHQgLyAyOwogICAgICAgIHJldHVybiBgNTAlICR7b3JpZ2luWX1weCAwcHhgOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBhbW91bnQgb2YgaXRlbXMgaW4gdGhlIHNlbGVjdC4gVGhpcyBpbmNsdWRlcyBvcHRpb25zIGFuZCBncm91cCBsYWJlbHMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEl0ZW1Db3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxlbmd0aCArIHRoaXMub3B0aW9uR3JvdXBzLmxlbmd0aDsKICAgIH0KICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QncyBvcHRpb25zLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRJdGVtSGVpZ2h0KCkgewogICAgICAgIHJldHVybiB0aGlzLl90cmlnZ2VyRm9udFNpemUgKiBTRUxFQ1RfSVRFTV9IRUlHSFRfRU07CiAgICB9CiAgICAvKioKICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGlkcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGVzY3JpYmVkQnlJZHMoaWRzKSB7CiAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlZGJ5ID0gaWRzLmpvaW4oJyAnKTsKICAgIH0KICAgIC8qKgogICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uQ29udGFpbmVyQ2xpY2soKSB7CiAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgIHRoaXMub3BlbigpOwogICAgfQogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHNob3VsZExhYmVsRmxvYXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhbmVsT3BlbiB8fCAhdGhpcy5lbXB0eTsKICAgIH0KfQpNYXRTZWxlY3QuybVmYWMgPSBmdW5jdGlvbiBNYXRTZWxlY3RfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0U2VsZWN0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVycm9yU3RhdGVNYXRjaGVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdGb3JtLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9GT1JNX0ZJRUxELCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ0NvbnRyb2wsIDEwKSwgybXJtWluamVjdEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTGl2ZUFubm91bmNlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1NFTEVDVF9DT05GSUcsIDgpKTsgfTsKTWF0U2VsZWN0Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFNlbGVjdCwgc2VsZWN0b3JzOiBbWyJtYXQtc2VsZWN0Il1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0U2VsZWN0X0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRTZWxlY3RUcmlnZ2VyLCB0cnVlKTsKICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRPcHRpb24sIHRydWUpOwogICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdE9wdGdyb3VwLCB0cnVlKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIHZhciBfdDsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmN1c3RvbVRyaWdnZXIgPSBfdC5maXJzdCk7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5vcHRpb25zID0gX3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgub3B0aW9uR3JvdXBzID0gX3QpOwogICAgfSB9LCB2aWV3UXVlcnk6IGZ1bmN0aW9uIE1hdFNlbGVjdF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMCQ1LCB0cnVlKTsKICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMSQ1LCB0cnVlKTsKICAgICAgICDJtcm1dmlld1F1ZXJ5KENka0Nvbm5lY3RlZE92ZXJsYXksIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgudHJpZ2dlciA9IF90LmZpcnN0KTsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnBhbmVsID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgub3ZlcmxheURpciA9IF90LmZpcnN0KTsKICAgIH0gfSwgaG9zdEF0dHJzOiBbInJvbGUiLCAibGlzdGJveCIsIDEsICJtYXQtc2VsZWN0Il0sIGhvc3RWYXJzOiAxOSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRTZWxlY3RfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9rZXlkb3duX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlS2V5ZG93bigkZXZlbnQpOyB9KSgiZm9jdXMiLCBmdW5jdGlvbiBNYXRTZWxlY3RfZm9jdXNfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9vbkZvY3VzKCk7IH0pKCJibHVyIiwgZnVuY3Rpb24gTWF0U2VsZWN0X2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9vbkJsdXIoKTsgfSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5pZCkoInRhYmluZGV4IiwgY3R4LnRhYkluZGV4KSgiYXJpYS1sYWJlbCIsIGN0eC5fZ2V0QXJpYUxhYmVsKCkpKCJhcmlhLWxhYmVsbGVkYnkiLCBjdHguX2dldEFyaWFMYWJlbGxlZGJ5KCkpKCJhcmlhLXJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkLnRvU3RyaW5nKCkpKCJhcmlhLWRpc2FibGVkIiwgY3R4LmRpc2FibGVkLnRvU3RyaW5nKCkpKCJhcmlhLWludmFsaWQiLCBjdHguZXJyb3JTdGF0ZSkoImFyaWEtb3ducyIsIGN0eC5wYW5lbE9wZW4gPyBjdHguX29wdGlvbklkcyA6IG51bGwpKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIsIGN0eC5tdWx0aXBsZSkoImFyaWEtZGVzY3JpYmVkYnkiLCBjdHguX2FyaWFEZXNjcmliZWRieSB8fCBudWxsKSgiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiwgY3R4Ll9nZXRBcmlhQWN0aXZlRGVzY2VuZGFudCgpKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtc2VsZWN0LWRpc2FibGVkIiwgY3R4LmRpc2FibGVkKSgibWF0LXNlbGVjdC1pbnZhbGlkIiwgY3R4LmVycm9yU3RhdGUpKCJtYXQtc2VsZWN0LXJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkKSgibWF0LXNlbGVjdC1lbXB0eSIsIGN0eC5lbXB0eSk7CiAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCB0YWJJbmRleDogInRhYkluZGV4IiwgYXJpYUxhYmVsOiBbImFyaWEtbGFiZWwiLCAiYXJpYUxhYmVsIl0sIGlkOiAiaWQiLCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nOiAiZGlzYWJsZU9wdGlvbkNlbnRlcmluZyIsIHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw6ICJ0eXBlYWhlYWREZWJvdW5jZUludGVydmFsIiwgcGxhY2Vob2xkZXI6ICJwbGFjZWhvbGRlciIsIHJlcXVpcmVkOiAicmVxdWlyZWQiLCBtdWx0aXBsZTogIm11bHRpcGxlIiwgY29tcGFyZVdpdGg6ICJjb21wYXJlV2l0aCIsIHZhbHVlOiAidmFsdWUiLCBwYW5lbENsYXNzOiAicGFuZWxDbGFzcyIsIGFyaWFMYWJlbGxlZGJ5OiBbImFyaWEtbGFiZWxsZWRieSIsICJhcmlhTGFiZWxsZWRieSJdLCBlcnJvclN0YXRlTWF0Y2hlcjogImVycm9yU3RhdGVNYXRjaGVyIiwgc29ydENvbXBhcmF0b3I6ICJzb3J0Q29tcGFyYXRvciIgfSwgb3V0cHV0czogeyBvcGVuZWRDaGFuZ2U6ICJvcGVuZWRDaGFuZ2UiLCBfb3BlbmVkU3RyZWFtOiAib3BlbmVkIiwgX2Nsb3NlZFN0cmVhbTogImNsb3NlZCIsIHNlbGVjdGlvbkNoYW5nZTogInNlbGVjdGlvbkNoYW5nZSIsIHZhbHVlQ2hhbmdlOiAidmFsdWVDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm1hdFNlbGVjdCJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFsKICAgICAgICAgICAgeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogTWF0U2VsZWN0IH0sCiAgICAgICAgICAgIHsgcHJvdmlkZTogTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5ULCB1c2VFeGlzdGluZzogTWF0U2VsZWN0IH0KICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MzJDIsIGRlY2xzOiA5LCB2YXJzOiA5LCBjb25zdHM6IFtbImNkay1vdmVybGF5LW9yaWdpbiIsICIiLCAiYXJpYS1oaWRkZW4iLCAidHJ1ZSIsIDEsICJtYXQtc2VsZWN0LXRyaWdnZXIiLCAzLCAiY2xpY2siXSwgWyJvcmlnaW4iLCAiY2RrT3ZlcmxheU9yaWdpbiIsICJ0cmlnZ2VyIiwgIiJdLCBbMSwgIm1hdC1zZWxlY3QtdmFsdWUiLCAzLCAibmdTd2l0Y2giXSwgWyJjbGFzcyIsICJtYXQtc2VsZWN0LXBsYWNlaG9sZGVyIiwgNCwgIm5nU3dpdGNoQ2FzZSJdLCBbImNsYXNzIiwgIm1hdC1zZWxlY3QtdmFsdWUtdGV4dCIsIDMsICJuZ1N3aXRjaCIsIDQsICJuZ1N3aXRjaENhc2UiXSwgWzEsICJtYXQtc2VsZWN0LWFycm93LXdyYXBwZXIiXSwgWzEsICJtYXQtc2VsZWN0LWFycm93Il0sIFsiY2RrLWNvbm5lY3RlZC1vdmVybGF5IiwgIiIsICJjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uIiwgIiIsICJjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3AiLCAiIiwgImNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzIiwgImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIiwgMywgImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsICJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIiwgImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwgImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLCAiY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoIiwgImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIiwgImJhY2tkcm9wQ2xpY2siLCAiYXR0YWNoIiwgImRldGFjaCJdLCBbMSwgIm1hdC1zZWxlY3QtcGxhY2Vob2xkZXIiXSwgWzEsICJtYXQtc2VsZWN0LXZhbHVlLXRleHQiLCAzLCAibmdTd2l0Y2giXSwgWzQsICJuZ1N3aXRjaERlZmF1bHQiXSwgWzQsICJuZ1N3aXRjaENhc2UiXSwgWzEsICJtYXQtc2VsZWN0LXBhbmVsLXdyYXAiXSwgWzMsICJuZ0NsYXNzIiwgImtleWRvd24iXSwgWyJwYW5lbCIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRTZWxlY3RfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXByb2plY3Rpb25EZWYoX2MyJDMpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRTZWxlY3RfVGVtcGxhdGVfZGl2X2NsaWNrXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgudG9nZ2xlKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDIpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBNYXRTZWxlY3Rfc3Bhbl80X1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDMpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBNYXRTZWxlY3Rfc3Bhbl81X1RlbXBsYXRlLCAzLCAyLCAic3BhbiIsIDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAiZGl2IiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnQoNywgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoOCwgTWF0U2VsZWN0X25nX3RlbXBsYXRlXzhfVGVtcGxhdGUsIDQsIDEwLCAibmctdGVtcGxhdGUiLCA3KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImJhY2tkcm9wQ2xpY2siLCBmdW5jdGlvbiBNYXRTZWxlY3RfVGVtcGxhdGVfbmdfdGVtcGxhdGVfYmFja2Ryb3BDbGlja184X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LmNsb3NlKCk7IH0pKCJhdHRhY2giLCBmdW5jdGlvbiBNYXRTZWxlY3RfVGVtcGxhdGVfbmdfdGVtcGxhdGVfYXR0YWNoXzhfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX29uQXR0YWNoZWQoKTsgfSkoImRldGFjaCIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9UZW1wbGF0ZV9uZ190ZW1wbGF0ZV9kZXRhY2hfOF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5jbG9zZSgpOyB9KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IF9yMCA9IMm1ybVyZWZlcmVuY2UoMSk7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaCIsIGN0eC5lbXB0eSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCB0cnVlKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGZhbHNlKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsIGN0eC5fc2Nyb2xsU3RyYXRlZ3kpKCJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIiwgX3IwKSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW4iLCBjdHgucGFuZWxPcGVuKSgiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucyIsIGN0eC5fcG9zaXRpb25zKSgiY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoIiwgY3R4Ll90cmlnZ2VyUmVjdCA9PSBudWxsID8gbnVsbCA6IGN0eC5fdHJpZ2dlclJlY3Qud2lkdGgpKCJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WSIsIGN0eC5fb2Zmc2V0WSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtDZGtPdmVybGF5T3JpZ2luLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBDZGtDb25uZWN0ZWRPdmVybGF5LCBOZ1N3aXRjaERlZmF1bHQsIE5nQ2xhc3NdLCBzdHlsZXM6IFsiLm1hdC1zZWxlY3R7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJTtvdXRsaW5lOm5vbmV9Lm1hdC1zZWxlY3QtdHJpZ2dlcntkaXNwbGF5OmlubGluZS10YWJsZTtjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtdHJpZ2dlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1zZWxlY3QtdmFsdWV7ZGlzcGxheTp0YWJsZS1jZWxsO21heC13aWR0aDowO3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtc2VsZWN0LXZhbHVlLXRleHR7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7ZGlzcGxheTp0YWJsZS1jZWxsO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0yNSUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCAubWF0LXNlbGVjdDpub3QoLm1hdC1zZWxlY3QtZW1wdHkpIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1lbXB0eSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZW1wdHkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1zZWxlY3QtYXJyb3d7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItbGVmdDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wOjVweCBzb2xpZDttYXJnaW46MCA0cHh9Lm1hdC1zZWxlY3QtcGFuZWwtd3JhcHtmbGV4LWJhc2lzOjEwMCV9Lm1hdC1zZWxlY3QtcGFuZWx7bWluLXdpZHRoOjExMnB4O21heC13aWR0aDoyODBweDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO3BhZGRpbmctdG9wOjA7cGFkZGluZy1ib3R0b206MDttYXgtaGVpZ2h0OjI1NnB4O21pbi13aWR0aDoxMDAlO2JvcmRlci1yYWRpdXM6NHB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zZWxlY3QtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRncm91cC1sYWJlbCwubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbntmb250LXNpemU6aW5oZXJpdDtsaW5lLWhlaWdodDozZW07aGVpZ2h0OjNlbX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Om5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4e2N1cnNvcjpwb2ludGVyfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3dpZHRoOmNhbGMoMTAwJSAtIDE4cHgpfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZTtkaXNwbGF5OmJsb2NrfVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGRhdGE6IHsgYW5pbWF0aW9uOiBbCiAgICAgICAgICAgIG1hdFNlbGVjdEFuaW1hdGlvbnMudHJhbnNmb3JtUGFuZWxXcmFwLAogICAgICAgICAgICBtYXRTZWxlY3RBbmltYXRpb25zLnRyYW5zZm9ybVBhbmVsCiAgICAgICAgXSB9LCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRTZWxlY3QuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IEVycm9yU3RhdGVNYXRjaGVyIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IE5nRm9ybSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogRm9ybUdyb3VwRGlyZWN0aXZlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBNYXRGb3JtRmllbGQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0ZPUk1fRklFTEQsXSB9XSB9LAogICAgeyB0eXBlOiBOZ0NvbnRyb2wsIGRlY29yYXRvcnM6IFt7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEF0dHJpYnV0ZSwgYXJnczogWyd0YWJpbmRleCcsXSB9XSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZLF0gfV0gfSwKICAgIHsgdHlwZTogTGl2ZUFubm91bmNlciB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1NFTEVDVF9DT05GSUcsXSB9XSB9Cl07Ck1hdFNlbGVjdC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHRyaWdnZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyd0cmlnZ2VyJyxdIH1dLAogICAgcGFuZWw6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwYW5lbCcsXSB9XSwKICAgIG92ZXJsYXlEaXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW0Nka0Nvbm5lY3RlZE92ZXJsYXksXSB9XSwKICAgIG9wdGlvbnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdE9wdGlvbiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sCiAgICBvcHRpb25Hcm91cHM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdE9wdGdyb3VwLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgIHBhbmVsQ2xhc3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgY3VzdG9tVHJpZ2dlcjogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0U2VsZWN0VHJpZ2dlcixdIH1dLAogICAgcGxhY2Vob2xkZXI6IFt7IHR5cGU6IElucHV0IH1dLAogICAgcmVxdWlyZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbXVsdGlwbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZGlzYWJsZU9wdGlvbkNlbnRlcmluZzogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBjb21wYXJlV2l0aDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICBhcmlhTGFiZWxsZWRieTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnYXJpYS1sYWJlbGxlZGJ5JyxdIH1dLAogICAgZXJyb3JTdGF0ZU1hdGNoZXI6IFt7IHR5cGU6IElucHV0IH1dLAogICAgdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBzb3J0Q29tcGFyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBvcGVuZWRDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIF9vcGVuZWRTdHJlYW06IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydvcGVuZWQnLF0gfV0sCiAgICBfY2xvc2VkU3RyZWFtOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnY2xvc2VkJyxdIH1dLAogICAgc2VsZWN0aW9uQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICB2YWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvc2VsZWN0L3NlbGVjdC1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgTWF0U2VsZWN0TW9kdWxlIHsKfQpNYXRTZWxlY3RNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRTZWxlY3RNb2R1bGUgfSk7Ck1hdFNlbGVjdE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFNlbGVjdE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTZWxlY3RNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW01BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBPdmVybGF5TW9kdWxlLAogICAgICAgICAgICBNYXRPcHRpb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICBdLAogICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0T3B0aW9uTW9kdWxlLCBNYXRDb21tb25Nb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRTZWxlY3RNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0U2VsZWN0LAogICAgICAgIE1hdFNlbGVjdFRyaWdnZXJdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ29tbW9uTW9kdWxlLAogICAgICAgIE92ZXJsYXlNb2R1bGUsCiAgICAgICAgTWF0T3B0aW9uTW9kdWxlLAogICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRGb3JtRmllbGRNb2R1bGUsCiAgICAgICAgTWF0U2VsZWN0LAogICAgICAgIE1hdFNlbGVjdFRyaWdnZXIsCiAgICAgICAgTWF0T3B0aW9uTW9kdWxlLCBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2hlYWRlci9wbHVnaW5fc2VsZWN0b3JfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X21hdF90YWJfMV9uZ190ZW1wbGF0ZV8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgY29uc3QgX3I1ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIiwgNSk7CiAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X3RhYl8xX25nX3RlbXBsYXRlXzFfVGVtcGxhdGVfc3Bhbl9jbGlja18wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I1KTsgY29uc3QgcGx1Z2luX3IyID0gybXJtW5leHRDb250ZXh0KCkuJGltcGxpY2l0OyBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNC5vbkFjdGl2ZVBsdWdpblNlbGVjdGlvbigkZXZlbnQsIHBsdWdpbl9yMi5pZCk7IH0pOwogICAgybXJtXRleHQoMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHBsdWdpbl9yMiA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsKICAgIMm1ybVhdHRyaWJ1dGUoImRhdGEtcGx1Z2luLWlkIiwgcGx1Z2luX3IyLmlkKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBwbHVnaW5fcjIudGFiX25hbWUsICIgIik7Cn0gfQpmdW5jdGlvbiBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9tYXRfdGFiXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtYXQtdGFiIiwgMyk7CiAgICDJtcm1dGVtcGxhdGUoMSwgUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X3RhYl8xX25nX3RlbXBsYXRlXzFfVGVtcGxhdGUsIDIsIDIsICJuZy10ZW1wbGF0ZSIsIDQpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBwbHVnaW5fcjIgPSBjdHguJGltcGxpY2l0OwogICAgybXJtXByb3BlcnR5KCJkaXNhYmxlZCIsICFwbHVnaW5fcjIuZW5hYmxlZCk7Cn0gfQpmdW5jdGlvbiBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9tYXRfZm9ybV9maWVsZF8yX21hdF9vcHRpb25fNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1vcHRpb24iLCA5KTsKICAgIMm1ybV0ZXh0KDEpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBwbHVnaW5fcjkgPSBjdHguJGltcGxpY2l0OwogICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIHBsdWdpbl9yOS5pZCk7CiAgICDJtcm1YXR0cmlidXRlKCJkYXRhLXBsdWdpbi1pZCIsIHBsdWdpbl9yOS5pZCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgcGx1Z2luX3I5LnRhYl9uYW1lLCAiICIpOwp9IH0KZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X2Zvcm1fZmllbGRfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMTEgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1mb3JtLWZpZWxkIiwgNik7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJtYXQtbGFiZWwiKTsKICAgIMm1ybV0ZXh0KDIsICJJbmFjdGl2ZSIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMywgIm1hdC1zZWxlY3QiLCA3KTsKICAgIMm1ybVsaXN0ZW5lcigic2VsZWN0aW9uQ2hhbmdlIiwgZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X2Zvcm1fZmllbGRfMl9UZW1wbGF0ZV9tYXRfc2VsZWN0X3NlbGVjdGlvbkNoYW5nZV8zX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxMSk7IGNvbnN0IGN0eF9yMTAgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTAub25EaXNhYmxlZFBsdWdpblNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KTsgfSk7CiAgICDJtcm1dGVtcGxhdGUoNCwgUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X2Zvcm1fZmllbGRfMl9tYXRfb3B0aW9uXzRfVGVtcGxhdGUsIDIsIDMsICJtYXQtb3B0aW9uIiwgOCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVhZHZhbmNlKDMpOwogICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eF9yMS5zZWxlY3RlZFBsdWdpbik7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eF9yMS5kaXNhYmxlZFBsdWdpbnMpOwp9IH0KY2xhc3MgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5vblBsdWdpblNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEFjdGl2ZVBsdWdpbkluZGV4KCkgewogICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVBsdWdpbnMuZmluZEluZGV4KCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgaWQgfSkgPT4gaWQgPT09IHRoaXMuc2VsZWN0ZWRQbHVnaW4pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHBhcmFtIHs/fSBwbHVnaW5JZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25BY3RpdmVQbHVnaW5TZWxlY3Rpb24oZXZlbnQsIHBsdWdpbklkKSB7CiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5vblBsdWdpblNlbGVjdGlvbkNoYW5nZWQuZW1pdChwbHVnaW5JZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0Q2hhbmdlRXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGlzYWJsZWRQbHVnaW5TZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdENoYW5nZUV2ZW50KSB7CiAgICAgICAgdGhpcy5vblBsdWdpblNlbGVjdGlvbkNoYW5nZWQuZW1pdChzZWxlY3RDaGFuZ2VFdmVudC52YWx1ZSk7CiAgICB9Cn0KUGx1Z2luU2VsZWN0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50JywKICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9wbHVnaW5fc2VsZWN0b3JfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vcGx1Z2luX3NlbGVjdG9yX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgfSxdIH0sCl07ClBsdWdpblNlbGVjdG9yQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgYWN0aXZlUGx1Z2luczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBkaXNhYmxlZFBsdWdpbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgc2VsZWN0ZWRQbHVnaW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgb25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5TZWxlY3RvckNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBQbHVnaW5TZWxlY3RvckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJwbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgYWN0aXZlUGx1Z2luczogImFjdGl2ZVBsdWdpbnMiLCBkaXNhYmxlZFBsdWdpbnM6ICJkaXNhYmxlZFBsdWdpbnMiLCBzZWxlY3RlZFBsdWdpbjogInNlbGVjdGVkUGx1Z2luIiB9LCBvdXRwdXRzOiB7IG9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZDogIm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCIgfSwgZGVjbHM6IDMsIHZhcnM6IDMsIGNvbnN0czogW1siYW5pbWF0aW9uRHVyYXRpb24iLCAiMTAwbXMiLCAxLCAiYWN0aXZlLXBsdWdpbi1saXN0IiwgMywgInNlbGVjdGVkSW5kZXgiXSwgWzMsICJkaXNhYmxlZCIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsiZmxvYXRMYWJlbCIsICJuZXZlciIsIDQsICJuZ0lmIl0sIFszLCAiZGlzYWJsZWQiXSwgWyJtYXQtdGFiLWxhYmVsIiwgIiJdLCBbMSwgInBsdWdpbi1uYW1lIiwgMywgImNsaWNrIl0sIFsiZmxvYXRMYWJlbCIsICJuZXZlciJdLCBbMywgInZhbHVlIiwgInNlbGVjdGlvbkNoYW5nZSJdLCBbMywgInZhbHVlIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzMsICJ2YWx1ZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC10YWItZ3JvdXAiLCAwKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMSwgUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X3RhYl8xX1RlbXBsYXRlLCAyLCAxLCAibWF0LXRhYiIsIDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X21hdF9mb3JtX2ZpZWxkXzJfVGVtcGxhdGUsIDUsIDIsICJtYXQtZm9ybS1maWVsZCIsIDIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJzZWxlY3RlZEluZGV4IiwgY3R4LmdldEFjdGl2ZVBsdWdpbkluZGV4KCkpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5hY3RpdmVQbHVnaW5zKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZGlzYWJsZWRQbHVnaW5zLmxlbmd0aCA+IDApOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0VGFiR3JvdXAsIE5nRm9yT2YsIE5nSWYsIE1hdFRhYiwgTWF0VGFiTGFiZWwsIE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwsIE1hdFNlbGVjdCwgTWF0T3B0aW9uXSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSBhdXRvO2ZvbnQtc2l6ZToxNHB4O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDA7bWFyZ2luLXRvcDo1cHg7d2lkdGg6MTMwcHh9bWF0LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LmFjdGl2ZS1wbHVnaW4tbGlzdFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24tc2VsZjpzdHJldGNoO2ZsZXg6MSAxIGF1dG87b3ZlcmZsb3c6aGlkZGVufS5wbHVnaW4tbmFtZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7aGVpZ2h0OjEwMCU7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjAgMTJweDt3aWR0aDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QubWF0LXByaW1hcnkgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItbGFiZWwsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItbGlua3tjb2xvcjppbmhlcml0O29wYWNpdHk6Ljd9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWxhYmVsLWFjdGl2ZSwgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1saW5rLm1hdC10YWItbGFiZWwtYWN0aXZle29wYWNpdHk6MX1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOmN1cnJlbnRDb2xvcn1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVke3Zpc2liaWxpdHk6aGlkZGVufVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItZGlzYWJsZWR7ZGlzcGxheTpub25lfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVscywgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbHtoZWlnaHQ6MTAwJX1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVse21pbi13aWR0aDo0OHB4O3BhZGRpbmc6MDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2hlaWdodDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI6bm90KC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWQpe3BhZGRpbmc6MCAzNnB4fVxuLyojIHNvdXJjZU1hcHBpbmdVUkw9cGx1Z2luX3NlbGVjdG9yX2NvbXBvbmVudC5jc3MubWFwICovIl0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvaGVhZGVyL3BsdWdpbl9zZWxlY3Rvcl9jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRVaVBsdWdpbnMgPSBjcmVhdGVTZWxlY3RvcihnZXRQbHVnaW5zLCAoLyoqCiAqIEBwYXJhbSB7P30gbGlzdGluZwogKiBAcmV0dXJuIHs/fQogKi8KKGxpc3RpbmcpID0+IE9iamVjdC5rZXlzKGxpc3RpbmcpLm1hcCgoLyoqCiAqIEBwYXJhbSB7P30ga2V5CiAqIEByZXR1cm4gez99CiAqLwooa2V5KSA9PiBPYmplY3QuYXNzaWduKHt9LCB7IGlkOiBrZXkgfSwgbGlzdGluZ1trZXldKSkpKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0RGlzYWJsZWRQbHVnaW5zID0gY3JlYXRlU2VsZWN0b3IoZ2V0VWlQbHVnaW5zLCAoLyoqCiAqIEBwYXJhbSB7P30gcGx1Z2lucwogKiBAcmV0dXJuIHs/fQogKi8KKHBsdWdpbnMpID0+IHBsdWdpbnMuZmlsdGVyKCgvKioKICogQHBhcmFtIHs/fSBwbHVnaW4KICogQHJldHVybiB7P30KICovCihwbHVnaW4pID0+ICFwbHVnaW4uZW5hYmxlZCkpKSk7CmNsYXNzIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLmFjdGl2ZVBsdWdpbiQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEFjdGl2ZVBsdWdpbikpOwogICAgICAgIHRoaXMucGx1Z2lucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFVpUGx1Z2lucykpOwogICAgICAgIHRoaXMuZGlzYWJsZWRQbHVnaW5zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0RGlzYWJsZWRQbHVnaW5zKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luSWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlKHBsdWdpbklkKSB7CiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChjaGFuZ2VQbHVnaW4oeyBwbHVnaW46IHBsdWdpbklkIH0pKTsKICAgIH0KfQpQbHVnaW5TZWxlY3RvckNvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3BsdWdpbi1zZWxlY3RvcicsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHBsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQKICAgICAgW2FjdGl2ZVBsdWdpbnNdPSJwbHVnaW5zJCB8IGFzeW5jIgogICAgICBbZGlzYWJsZWRQbHVnaW5zXT0iZGlzYWJsZWRQbHVnaW5zJCB8IGFzeW5jIgogICAgICBbc2VsZWN0ZWRQbHVnaW5dPSJhY3RpdmVQbHVnaW4kIHwgYXN5bmMiCiAgICAgIChvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQpPSJvblBsdWdpblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpIgogICAgPjwvcGx1Z2luLXNlbGVjdG9yLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClBsdWdpblNlbGVjdG9yQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5TZWxlY3RvckNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsdWdpblNlbGVjdG9yQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5TZWxlY3RvckNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBQbHVnaW5TZWxlY3RvckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJwbHVnaW4tc2VsZWN0b3IiXV0sIGRlY2xzOiA0LCB2YXJzOiA5LCBjb25zdHM6IFtbMywgImFjdGl2ZVBsdWdpbnMiLCAiZGlzYWJsZWRQbHVnaW5zIiwgInNlbGVjdGVkUGx1Z2luIiwgIm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInBsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQiLCAwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCIsIGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyX1RlbXBsYXRlX3BsdWdpbl9zZWxlY3Rvcl9jb21wb25lbnRfb25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25QbHVnaW5TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVwcm9wZXJ0eSgiYWN0aXZlUGx1Z2lucyIsIMm1ybVwaXBlQmluZDEoMSwgMywgY3R4LnBsdWdpbnMkKSkoImRpc2FibGVkUGx1Z2lucyIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4LmRpc2FibGVkUGx1Z2lucyQpKSgic2VsZWN0ZWRQbHVnaW4iLCDJtcm1cGlwZUJpbmQxKDMsIDcsIGN0eC5hY3RpdmVQbHVnaW4kKSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtQbHVnaW5TZWxlY3RvckNvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCmZ1bmN0aW9uIE1hdERpYWxvZ0NvbnRhaW5lcl9uZ190ZW1wbGF0ZV8wX1RlbXBsYXRlKHJmLCBjdHgpIHsgfQovKioKICogQ29uZmlndXJhdGlvbiBmb3Igb3BlbmluZyBhIG1vZGFsIGRpYWxvZyB3aXRoIHRoZSBNYXREaWFsb2cgc2VydmljZS4KICogQHRlbXBsYXRlIEQKICovCmNsYXNzIE1hdERpYWxvZ0NvbmZpZyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgQVJJQSByb2xlIG9mIHRoZSBkaWFsb2cgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJvbGUgPSAnZGlhbG9nJzsKICAgICAgICAvKioKICAgICAgICAgKiBDdXN0b20gY2xhc3MgZm9yIHRoZSBvdmVybGF5IHBhbmUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5wYW5lbENsYXNzID0gJyc7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgZGlhbG9nIGhhcyBhIGJhY2tkcm9wLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaGFzQmFja2Ryb3AgPSB0cnVlOwogICAgICAgIC8qKgogICAgICAgICAqIEN1c3RvbSBjbGFzcyBmb3IgdGhlIGJhY2tkcm9wLgogICAgICAgICAqLwogICAgICAgIHRoaXMuYmFja2Ryb3BDbGFzcyA9ICcnOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIHVzZSBlc2NhcGUgb3IgY2xpY2tpbmcgb24gdGhlIGJhY2tkcm9wIHRvIGNsb3NlIHRoZSBtb2RhbC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmRpc2FibGVDbG9zZSA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdpZHRoIG9mIHRoZSBkaWFsb2cuCiAgICAgICAgICovCiAgICAgICAgdGhpcy53aWR0aCA9ICcnOwogICAgICAgIC8qKgogICAgICAgICAqIEhlaWdodCBvZiB0aGUgZGlhbG9nLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaGVpZ2h0ID0gJyc7CiAgICAgICAgLyoqCiAgICAgICAgICogTWF4LXdpZHRoIG9mIHRoZSBkaWFsb2cuIElmIGEgbnVtYmVyIGlzIHByb3ZpZGVkLCBhc3N1bWVzIHBpeGVsIHVuaXRzLiBEZWZhdWx0cyB0byA4MHZ3LgogICAgICAgICAqLwogICAgICAgIHRoaXMubWF4V2lkdGggPSAnODB2dyc7CiAgICAgICAgLyoqCiAgICAgICAgICogRGF0YSBiZWluZyBpbmplY3RlZCBpbnRvIHRoZSBjaGlsZCBjb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBJRCBvZiB0aGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB0aGUgZGlhbG9nLgogICAgICAgICAqLwogICAgICAgIHRoaXMuYXJpYURlc2NyaWJlZEJ5ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBJRCBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVscyB0aGUgZGlhbG9nLgogICAgICAgICAqLwogICAgICAgIHRoaXMuYXJpYUxhYmVsbGVkQnkgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIEFyaWEgbGFiZWwgdG8gYXNzaWduIHRvIHRoZSBkaWFsb2cgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmFyaWFMYWJlbCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgZGlhbG9nIHNob3VsZCBmb2N1cyB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgb24gb3Blbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmF1dG9Gb2N1cyA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgZGlhbG9nIHNob3VsZCByZXN0b3JlIGZvY3VzIHRvIHRoZQogICAgICAgICAqIHByZXZpb3VzbHktZm9jdXNlZCBlbGVtZW50LCBhZnRlciBpdCdzIGNsb3NlZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlc3RvcmVGb2N1cyA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgZGlhbG9nIHNob3VsZCBjbG9zZSB3aGVuIHRoZSB1c2VyIGdvZXMgYmFja3dhcmRzL2ZvcndhcmRzIGluIGhpc3RvcnkuCiAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgdXN1YWxseSBkb2Vzbid0IGluY2x1ZGUgY2xpY2tpbmcgb24gbGlua3MgKHVubGVzcyB0aGUgdXNlciBpcyB1c2luZwogICAgICAgICAqIHRoZSBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgKS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNsb3NlT25OYXZpZ2F0aW9uID0gdHJ1ZTsKICAgICAgICAvLyBUT0RPKGplbGJvdXJuKTogYWRkIGNvbmZpZ3VyYXRpb24gZm9yIGxpZmVjeWNsZSBob29rcywgQVJJQSBsYWJlbGxpbmcuCiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9kaWFsb2cvZGlhbG9nLWFuaW1hdGlvbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFuaW1hdGlvbnMgdXNlZCBieSBNYXREaWFsb2cuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgbWF0RGlhbG9nQW5pbWF0aW9ucyA9IHsKICAgIC8qKgogICAgICogQW5pbWF0aW9uIHRoYXQgaXMgYXBwbGllZCBvbiB0aGUgZGlhbG9nIGNvbnRhaW5lciBieSBkZWZhbHQuCiAgICAgKi8KICAgIGRpYWxvZ0NvbnRhaW5lcjogdHJpZ2dlcignZGlhbG9nQ29udGFpbmVyJywgWwogICAgICAgIC8vIE5vdGU6IFRoZSBgZW50ZXJgIGFuaW1hdGlvbiB0cmFuc2l0aW9ucyB0byBgdHJhbnNmb3JtOiBub25lYCwgYmVjYXVzZSBmb3Igc29tZSByZWFzb24KICAgICAgICAvLyBzcGVjaWZ5aW5nIHRoZSB0cmFuc2Zvcm0gZXhwbGljaXRseSwgY2F1c2VzIElFIGJvdGggdG8gYmx1ciB0aGUgZGlhbG9nIGNvbnRlbnQgYW5kCiAgICAgICAgLy8gZGVjaW1hdGUgdGhlIGFuaW1hdGlvbiBwZXJmb3JtYW5jZS4gTGVhdmluZyBpdCBhcyBgbm9uZWAgc29sdmVzIGJvdGggaXNzdWVzLgogICAgICAgIHN0YXRlKCd2b2lkLCBleGl0Jywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjcpJyB9KSksCiAgICAgICAgc3RhdGUoJ2VudGVyJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdub25lJyB9KSksCiAgICAgICAgdHJhbnNpdGlvbignKiA9PiBlbnRlcicsIGFuaW1hdGUoJzE1MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdub25lJywgb3BhY2l0eTogMSB9KSkpLAogICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCwgKiA9PiBleGl0JywgYW5pbWF0ZSgnNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpKSwKICAgIF0pCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZGlhbG9nL2RpYWxvZy1jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRocm93cyBhbiBleGNlcHRpb24gZm9yIHRoZSBjYXNlIHdoZW4gYSBDb21wb25lbnRQb3J0YWwgaXMKICogYXR0YWNoZWQgdG8gYSBEb21Qb3J0YWxPdXRsZXQgd2l0aG91dCBhbiBvcmlnaW4uCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd01hdERpYWxvZ0NvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpIHsKICAgIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBkaWFsb2cgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQnKTsKfQovKioKICogSW50ZXJuYWwgY29tcG9uZW50IHRoYXQgd3JhcHMgdXNlci1wcm92aWRlZCBkaWFsb2cgY29udGVudC4KICogQW5pbWF0aW9uIGlzIGJhc2VkIG9uIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZ3VpZGVsaW5lcy9tb3Rpb24vY2hvcmVvZ3JhcGh5Lmh0bWwuCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBNYXREaWFsb2dDb250YWluZXIgZXh0ZW5kcyBCYXNlUG9ydGFsT3V0bGV0IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfZm9jdXNUcmFwRmFjdG9yeQogICAgICogQHBhcmFtIHs/fSBfY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKiBAcGFyYW0gez99IF9jb25maWcKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9mb2N1c1RyYXBGYWN0b3J5LCBfY2hhbmdlRGV0ZWN0b3JSZWYsIF9kb2N1bWVudCwgX2NvbmZpZykgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX2ZvY3VzVHJhcEZhY3RvcnkgPSBfZm9jdXNUcmFwRmFjdG9yeTsKICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICB0aGlzLl9jb25maWcgPSBfY29uZmlnOwogICAgICAgIC8qKgogICAgICAgICAqIEVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGRpYWxvZyB3YXMgb3BlbmVkLiBTYXZlIHRoaXMgdG8gcmVzdG9yZSB1cG9uIGNsb3NlLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0ZSBvZiB0aGUgZGlhbG9nIGFuaW1hdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbnRlcic7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiBhbiBhbmltYXRpb24gc3RhdGUgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgYSBET00gcG9ydGFsIHRvIHRoZSBkaWFsb2cgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkLgogICAgICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHR1cm5lZCBpbnRvIGEgbWV0aG9kLgogICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAqLwogICAgICAgIHRoaXMuYXR0YWNoRG9tUG9ydGFsID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocG9ydGFsKSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICAgICAgdGhyb3dNYXREaWFsb2dDb250ZW50QWxyZWFkeUF0dGFjaGVkRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoRG9tUG9ydGFsKHBvcnRhbCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fYXJpYUxhYmVsbGVkQnkgPSBfY29uZmlnLmFyaWFMYWJlbGxlZEJ5IHx8IG51bGw7CiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGFjaCBhIENvbXBvbmVudFBvcnRhbCBhcyBjb250ZW50IHRvIHRoaXMgZGlhbG9nIGNvbnRhaW5lci4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQgYXMgdGhlIGRpYWxvZyBjb250ZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCkgewogICAgICAgIGlmICh0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICB0aHJvd01hdERpYWxvZ0NvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKTsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoIGEgVGVtcGxhdGVQb3J0YWwgYXMgY29udGVudCB0byB0aGlzIGRpYWxvZyBjb250YWluZXIuCiAgICAgKiBAdGVtcGxhdGUgQwogICAgICogQHBhcmFtIHs/fSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkIGFzIHRoZSBkaWFsb2cgY29udGVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCkgewogICAgICAgIGlmICh0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICB0aHJvd01hdERpYWxvZ0NvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hUZW1wbGF0ZVBvcnRhbChwb3J0YWwpOwogICAgfQogICAgLyoqCiAgICAgKiBNb3ZlcyBmb2N1cyBiYWNrIGludG8gdGhlIGRpYWxvZyBpZiBpdCB3YXMgbW92ZWQgb3V0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlY2FwdHVyZUZvY3VzKCkgewogICAgICAgIGlmICghdGhpcy5fY29udGFpbnNGb2N1cygpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZm9jdXNXYXNUcmFwcGVkID0gdGhpcy5fZ2V0Rm9jdXNUcmFwKCkuZm9jdXNJbml0aWFsRWxlbWVudCgpOwogICAgICAgICAgICBpZiAoIWZvY3VzV2FzVHJhcHBlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1vdmVzIHRoZSBmb2N1cyBpbnNpZGUgdGhlIGZvY3VzIHRyYXAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3RyYXBGb2N1cygpIHsKICAgICAgICAvLyBJZiB3ZSB3ZXJlIHRvIGF0dGVtcHQgdG8gZm9jdXMgaW1tZWRpYXRlbHksIHRoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIGRpYWxvZyB3b3VsZCBub3QgeWV0IGJlCiAgICAgICAgLy8gcmVhZHkgaW4gaW5zdGFuY2VzIHdoZXJlIGNoYW5nZSBkZXRlY3Rpb24gaGFzIHRvIHJ1biBmaXJzdC4gVG8gZGVhbCB3aXRoIHRoaXMsIHdlIHNpbXBseQogICAgICAgIC8vIHdhaXQgZm9yIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZW1wdHkuCiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hdXRvRm9jdXMpIHsKICAgICAgICAgICAgdGhpcy5fZ2V0Rm9jdXNUcmFwKCkuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghdGhpcy5fY29udGFpbnNGb2N1cygpKSB7CiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBlbnN1cmUgdGhhdCBmb2N1cyBpcyBvbiB0aGUgZGlhbG9nIGNvbnRhaW5lci4gSXQncyBwb3NzaWJsZSB0aGF0IGEgZGlmZmVyZW50CiAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0cmllZCB0byBtb3ZlIGZvY3VzIHdoaWxlIHRoZSBvcGVuIGFuaW1hdGlvbiB3YXMgcnVubmluZy4gU2VlOgogICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xNjIxNS4gTm90ZSB0aGF0IHdlIG9ubHkgd2FudCB0byBkbyB0aGlzCiAgICAgICAgICAgIC8vIGlmIHRoZSBmb2N1cyBpc24ndCBpbnNpZGUgdGhlIGRpYWxvZyBhbHJlYWR5LCBiZWNhdXNlIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgY29uc3VtZXIKICAgICAgICAgICAgLy8gdHVybmVkIG9mZiBgYXV0b0ZvY3VzYCBpbiBvcmRlciB0byBtb3ZlIGZvY3VzIHRoZW1zZWx2ZXMuCiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVzdG9yZXMgZm9jdXMgdG8gdGhlIGVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGRpYWxvZyBvcGVuZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Jlc3RvcmVGb2N1cygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9Gb2N1cyA9IHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkOwogICAgICAgIC8vIFdlIG5lZWQgdGhlIGV4dHJhIGNoZWNrLCBiZWNhdXNlIElFIGNhbiBzZXQgdGhlIGBhY3RpdmVFbGVtZW50YCB0byBudWxsIGluIHNvbWUgY2FzZXMuCiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5yZXN0b3JlRm9jdXMgJiYgdG9Gb2N1cyAmJiB0eXBlb2YgdG9Gb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGZvY3VzIGlzIHN0aWxsIGluc2lkZSB0aGUgZGlhbG9nIG9yIGlzIG9uIHRoZSBib2R5ICh1c3VhbGx5IGJlY2F1c2UgYQogICAgICAgICAgICAvLyBub24tZm9jdXNhYmxlIGVsZW1lbnQgbGlrZSB0aGUgYmFja2Ryb3Agd2FzIGNsaWNrZWQpIGJlZm9yZSBtb3ZpbmcgaXQuIEl0J3MgcG9zc2libGUgdGhhdAogICAgICAgICAgICAvLyB0aGUgY29uc3VtZXIgbW92ZWQgaXQgdGhlbXNlbHZlcyBiZWZvcmUgdGhlIGFuaW1hdGlvbiB3YXMgZG9uZSwgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGRuJ3QKICAgICAgICAgICAgLy8gZG8gYW55dGhpbmcuCiAgICAgICAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ID09PSB0aGlzLl9kb2N1bWVudC5ib2R5IHx8IGFjdGl2ZUVsZW1lbnQgPT09IGVsZW1lbnQgfHwKICAgICAgICAgICAgICAgIGVsZW1lbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHsKICAgICAgICAgICAgICAgIHRvRm9jdXMuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fZm9jdXNUcmFwKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVHJhcC5kZXN0cm95KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTYXZlcyBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgZGlhbG9nIHdhcyBvcGVuZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKSB7CiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKTsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGZvY3VzIG1ldGhvZCB3aGVuIHJlbmRlcmluZyBvbiB0aGUgc2VydmVyLgogICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKSB7CiAgICAgICAgICAgICAgICAvLyBNb3ZlIGZvY3VzIG9udG8gdGhlIGRpYWxvZyBpbW1lZGlhdGVseSBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5CiAgICAgICAgICAgICAgICAvLyBvcGVuaW5nIG11bHRpcGxlIGRpYWxvZ3MgYXQgdGhlIHNhbWUgdGltZS4gTmVlZHMgdG8gYmUgYXN5bmMsIGJlY2F1c2UgdGhlIGVsZW1lbnQKICAgICAgICAgICAgICAgIC8vIG1heSBub3QgYmUgZm9jdXNhYmxlIGltbWVkaWF0ZWx5LgogICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgZm9jdXMgaXMgaW5zaWRlIHRoZSBkaWFsb2cuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NvbnRhaW5zRm9jdXMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgICAgIHJldHVybiBlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIGZvY3VzIHRyYXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaWFsb2cuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEZvY3VzVHJhcCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzVHJhcCkgewogICAgICAgICAgICB0aGlzLl9mb2N1c1RyYXAgPSB0aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNUcmFwOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxsYmFjaywgaW52b2tlZCB3aGVuZXZlciBhbiBhbmltYXRpb24gb24gdGhlIGhvc3QgY29tcGxldGVzLgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uQW5pbWF0aW9uRG9uZShldmVudCkgewogICAgICAgIGlmIChldmVudC50b1N0YXRlID09PSAnZW50ZXInKSB7CiAgICAgICAgICAgIHRoaXMuX3RyYXBGb2N1cygpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudC50b1N0YXRlID09PSAnZXhpdCcpIHsKICAgICAgICAgICAgdGhpcy5fcmVzdG9yZUZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FsbGJhY2ssIGludm9rZWQgd2hlbiBhbiBhbmltYXRpb24gb24gdGhlIGhvc3Qgc3RhcnRzLgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uQW5pbWF0aW9uU3RhcnQoZXZlbnQpIHsKICAgICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdChldmVudCk7CiAgICB9CiAgICAvKioKICAgICAqIFN0YXJ0cyB0aGUgZGlhbG9nIGV4aXQgYW5pbWF0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N0YXJ0RXhpdEFuaW1hdGlvbigpIHsKICAgICAgICB0aGlzLl9zdGF0ZSA9ICdleGl0JzsKICAgICAgICAvLyBNYXJrIHRoZSBjb250YWluZXIgZm9yIGNoZWNrIHNvIGl0IGNhbiByZWFjdCBpZiB0aGUKICAgICAgICAvLyB2aWV3IGNvbnRhaW5lciBpcyB1c2luZyBPblB1c2ggY2hhbmdlIGRldGVjdGlvbi4KICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgIH0KfQpNYXREaWFsb2dDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvY3VzVHJhcEZhY3RvcnkpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXREaWFsb2dDb25maWcpKTsgfTsKTWF0RGlhbG9nQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdERpYWxvZ0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJtYXQtZGlhbG9nLWNvbnRhaW5lciJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShDZGtQb3J0YWxPdXRsZXQsIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3BvcnRhbE91dGxldCA9IF90LmZpcnN0KTsKICAgIH0gfSwgaG9zdEF0dHJzOiBbInRhYmluZGV4IiwgIi0xIiwgImFyaWEtbW9kYWwiLCAidHJ1ZSIsIDEsICJtYXQtZGlhbG9nLWNvbnRhaW5lciJdLCBob3N0VmFyczogNiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVjb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXIoIkBkaWFsb2dDb250YWluZXIuc3RhcnQiLCBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfYW5pbWF0aW9uX2RpYWxvZ0NvbnRhaW5lcl9zdGFydF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX29uQW5pbWF0aW9uU3RhcnQoJGV2ZW50KTsgfSkoIkBkaWFsb2dDb250YWluZXIuZG9uZSIsIGZ1bmN0aW9uIE1hdERpYWxvZ0NvbnRhaW5lcl9hbmltYXRpb25fZGlhbG9nQ29udGFpbmVyX2RvbmVfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbkFuaW1hdGlvbkRvbmUoJGV2ZW50KTsgfSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5faWQpKCJyb2xlIiwgY3R4Ll9jb25maWcucm9sZSkoImFyaWEtbGFiZWxsZWRieSIsIGN0eC5fY29uZmlnLmFyaWFMYWJlbCA/IG51bGwgOiBjdHguX2FyaWFMYWJlbGxlZEJ5KSgiYXJpYS1sYWJlbCIsIGN0eC5fY29uZmlnLmFyaWFMYWJlbCkoImFyaWEtZGVzY3JpYmVkYnkiLCBjdHguX2NvbmZpZy5hcmlhRGVzY3JpYmVkQnkgfHwgbnVsbCk7CiAgICAgICAgybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nKCJAZGlhbG9nQ29udGFpbmVyIiwgY3R4Ll9zdGF0ZSk7CiAgICB9IH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGRlY2xzOiAxLCB2YXJzOiAwLCBjb25zdHM6IFtbImNka1BvcnRhbE91dGxldCIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXRlbXBsYXRlKDAsIE1hdERpYWxvZ0NvbnRhaW5lcl9uZ190ZW1wbGF0ZV8wX1RlbXBsYXRlLCAwLCAwLCAibmctdGVtcGxhdGUiLCAwKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW0Nka1BvcnRhbE91dGxldF0sIHN0eWxlczogWyIubWF0LWRpYWxvZy1jb250YWluZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOjI0cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmF1dG87b3V0bGluZTowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDppbmhlcml0O21heC1oZWlnaHQ6aW5oZXJpdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZGlhbG9nLWNvbnRhaW5lcntvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWRpYWxvZy1jb250ZW50e2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgLTI0cHg7cGFkZGluZzowIDI0cHg7bWF4LWhlaWdodDo2NXZoO292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9Lm1hdC1kaWFsb2ctdGl0bGV7bWFyZ2luOjAgMCAyMHB4O2Rpc3BsYXk6YmxvY2t9Lm1hdC1kaWFsb2ctYWN0aW9uc3twYWRkaW5nOjhweCAwO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDttaW4taGVpZ2h0OjUycHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206LTI0cHh9Lm1hdC1kaWFsb2ctYWN0aW9uc1thbGlnbj1lbmRde2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0ubWF0LWRpYWxvZy1hY3Rpb25zW2FsaWduPWNlbnRlcl17anVzdGlmeS1jb250ZW50OmNlbnRlcn0ubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtYnV0dG9uLWJhc2UrLm1hdC1idXR0b24tYmFzZSwubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtbWRjLWJ1dHRvbi1iYXNlKy5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjhweH1bZGlyPXJ0bF0gLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LWJ1dHRvbi1iYXNlKy5tYXQtYnV0dG9uLWJhc2UsW2Rpcj1ydGxdIC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1tZGMtYnV0dG9uLWJhc2UrLm1hdC1tZGMtYnV0dG9uLWJhc2V7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6OHB4fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGRhdGE6IHsgYW5pbWF0aW9uOiBbbWF0RGlhbG9nQW5pbWF0aW9ucy5kaWFsb2dDb250YWluZXJdIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXREaWFsb2dDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogRm9jdXNUcmFwRmFjdG9yeSB9LAogICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICB7IHR5cGU6IE1hdERpYWxvZ0NvbmZpZyB9Cl07Ck1hdERpYWxvZ0NvbnRhaW5lci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIF9wb3J0YWxPdXRsZXQ6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW0Nka1BvcnRhbE91dGxldCwgeyBzdGF0aWM6IHRydWUgfSxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZGlhbG9nL2RpYWxvZy1yZWYudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gVE9ETyhqZWxib3Vybik6IHJlc2l6aW5nCi8vIENvdW50ZXIgZm9yIHVuaXF1ZSBkaWFsb2cgaWRzLgovKiogQHR5cGUgez99ICovCmxldCB1bmlxdWVJZCA9IDA7Ci8qKgogKiBSZWZlcmVuY2UgdG8gYSBkaWFsb2cgb3BlbmVkIHZpYSB0aGUgTWF0RGlhbG9nIHNlcnZpY2UuCiAqIEB0ZW1wbGF0ZSBULCBSCiAqLwpjbGFzcyBNYXREaWFsb2dSZWYgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9vdmVybGF5UmVmCiAgICAgKiBAcGFyYW0gez99IF9jb250YWluZXJJbnN0YW5jZQogICAgICogQHBhcmFtIHs/PX0gaWQKICAgICAqLwogICAgY29uc3RydWN0b3IoX292ZXJsYXlSZWYsIF9jb250YWluZXJJbnN0YW5jZSwgaWQgPSBgbWF0LWRpYWxvZy0ke3VuaXF1ZUlkKyt9YCkgewogICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBfb3ZlcmxheVJlZjsKICAgICAgICB0aGlzLl9jb250YWluZXJJbnN0YW5jZSA9IF9jb250YWluZXJJbnN0YW5jZTsKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGNsb3NlIHRoZSBkaWFsb2cuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5kaXNhYmxlQ2xvc2UgPSB0aGlzLl9jb250YWluZXJJbnN0YW5jZS5fY29uZmlnLmRpc2FibGVDbG9zZTsKICAgICAgICAvKioKICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgZGlhbG9nIGhhcyBmaW5pc2hlZCBvcGVuaW5nLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgZGlhbG9nIGhhcyBmaW5pc2hlZCBjbG9zaW5nLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2FmdGVyQ2xvc2VkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgZGlhbG9nIGhhcyBzdGFydGVkIGNsb3NpbmcuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fYmVmb3JlQ2xvc2VkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBkaWFsb2cuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc3RhdGUgPSAwIC8qIE9QRU4gKi87CiAgICAgICAgLy8gUGFzcyB0aGUgaWQgYWxvbmcgdG8gdGhlIGNvbnRhaW5lci4KICAgICAgICBfY29udGFpbmVySW5zdGFuY2UuX2lkID0gaWQ7CiAgICAgICAgLy8gRW1pdCB3aGVuIG9wZW5pbmcgYW5pbWF0aW9uIGNvbXBsZXRlcwogICAgICAgIF9jb250YWluZXJJbnN0YW5jZS5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBldmVudCA9PiBldmVudC5waGFzZU5hbWUgPT09ICdkb25lJyAmJiBldmVudC50b1N0YXRlID09PSAnZW50ZXInKSksIHRha2UoMSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkLmNvbXBsZXRlKCk7CiAgICAgICAgfSkpOwogICAgICAgIC8vIERpc3Bvc2Ugb3ZlcmxheSB3aGVuIGNsb3NpbmcgYW5pbWF0aW9uIGlzIGNvbXBsZXRlCiAgICAgICAgX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGV2ZW50ID0+IGV2ZW50LnBoYXNlTmFtZSA9PT0gJ2RvbmUnICYmIGV2ZW50LnRvU3RhdGUgPT09ICdleGl0JykpLCB0YWtlKDEpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQpOwogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTsKICAgICAgICB9KSk7CiAgICAgICAgX292ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9iZWZvcmVDbG9zZWQubmV4dCh0aGlzLl9yZXN1bHQpOwogICAgICAgICAgICB0aGlzLl9iZWZvcmVDbG9zZWQuY29tcGxldGUoKTsKICAgICAgICAgICAgdGhpcy5fYWZ0ZXJDbG9zZWQubmV4dCh0aGlzLl9yZXN1bHQpOwogICAgICAgICAgICB0aGlzLl9hZnRlckNsb3NlZC5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7CiAgICAgICAgfSkpOwogICAgICAgIF9vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKQogICAgICAgICAgICAucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSAmJiAhdGhpcy5kaXNhYmxlQ2xvc2UgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KTsKICAgICAgICB9KSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgIH0pKTsKICAgICAgICBfb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUNsb3NlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXJJbnN0YW5jZS5fcmVjYXB0dXJlRm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xvc2UgdGhlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7Pz19IGRpYWxvZ1Jlc3VsdCBPcHRpb25hbCByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBkaWFsb2cgb3BlbmVyLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xvc2UoZGlhbG9nUmVzdWx0KSB7CiAgICAgICAgdGhpcy5fcmVzdWx0ID0gZGlhbG9nUmVzdWx0OwogICAgICAgIC8vIFRyYW5zaXRpb24gdGhlIGJhY2tkcm9wIGluIHBhcmFsbGVsIHRvIHRoZSBkaWFsb2cuCiAgICAgICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZXZlbnQgPT4gZXZlbnQucGhhc2VOYW1lID09PSAnc3RhcnQnKSksIHRha2UoMSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgdGhpcy5fYmVmb3JlQ2xvc2VkLm5leHQoZGlhbG9nUmVzdWx0KTsKICAgICAgICAgICAgdGhpcy5fYmVmb3JlQ2xvc2VkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMiAvKiBDTE9TRUQgKi87CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoQmFja2Ryb3AoKTsKICAgICAgICAgICAgLy8gVGhlIGxvZ2ljIHRoYXQgZGlzcG9zZXMgb2YgdGhlIG92ZXJsYXkgZGVwZW5kcyBvbiB0aGUgZXhpdCBhbmltYXRpb24gY29tcGxldGluZywgaG93ZXZlcgogICAgICAgICAgICAvLyBpdCBpc24ndCBndWFyYW50ZWVkIGlmIHRoZSBwYXJlbnQgdmlldyBpcyBkZXN0cm95ZWQgd2hpbGUgaXQncyBydW5uaW5nLiBBZGQgYSBmYWxsYmFjawogICAgICAgICAgICAvLyB0aW1lb3V0IHdoaWNoIHdpbGwgY2xlYW4gZXZlcnl0aGluZyB1cCBpZiB0aGUgYW5pbWF0aW9uIGhhc24ndCBmaXJlZCB3aXRoaW4gdGhlIHNwZWNpZmllZAogICAgICAgICAgICAvLyBhbW91bnQgb2YgdGltZSBwbHVzIDEwMG1zLiBXZSBkb24ndCBuZWVkIHRvIHJ1biB0aGlzIG91dHNpZGUgdGhlIE5nWm9uZSwgYmVjYXVzZSBmb3IgdGhlCiAgICAgICAgICAgIC8vIHZhc3QgbWFqb3JpdHkgb2YgY2FzZXMgdGhlIHRpbWVvdXQgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBiZWZvcmUgaXQgaGFzIHRoZSBjaGFuY2UgdG8gZmlyZS4KICAgICAgICAgICAgdGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpOwogICAgICAgICAgICB9KSwgZXZlbnQudG90YWxUaW1lICsgMTAwKTsKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX3N0YXJ0RXhpdEFuaW1hdGlvbigpOwogICAgICAgIHRoaXMuX3N0YXRlID0gMSAvKiBDTE9TSU5HICovOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIGFuIG9ic2VydmFibGUgdGhhdCBpcyBub3RpZmllZCB3aGVuIHRoZSBkaWFsb2cgaXMgZmluaXNoZWQgb3BlbmluZy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFmdGVyT3BlbmVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hZnRlck9wZW5lZC5hc09ic2VydmFibGUoKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgaXMgbm90aWZpZWQgd2hlbiB0aGUgZGlhbG9nIGlzIGZpbmlzaGVkIGNsb3NpbmcuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZnRlckNsb3NlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJDbG9zZWQuYXNPYnNlcnZhYmxlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIGRpYWxvZyBoYXMgc3RhcnRlZCBjbG9zaW5nLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmVmb3JlQ2xvc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9iZWZvcmVDbG9zZWQuYXNPYnNlcnZhYmxlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIG92ZXJsYXkncyBiYWNrZHJvcCBoYXMgYmVlbiBjbGlja2VkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmFja2Ryb3BDbGljaygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4ga2V5ZG93biBldmVudHMgYXJlIHRhcmdldGVkIG9uIHRoZSBvdmVybGF5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAga2V5ZG93bkV2ZW50cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCk7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGRpYWxvZydzIHBvc2l0aW9uLgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/PX0gcG9zaXRpb24gTmV3IGRpYWxvZyBwb3NpdGlvbi4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHVwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdHJhdGVneSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2dldFBvc2l0aW9uU3RyYXRlZ3koKTsKICAgICAgICBpZiAocG9zaXRpb24gJiYgKHBvc2l0aW9uLmxlZnQgfHwgcG9zaXRpb24ucmlnaHQpKSB7CiAgICAgICAgICAgIHBvc2l0aW9uLmxlZnQgPyBzdHJhdGVneS5sZWZ0KHBvc2l0aW9uLmxlZnQpIDogc3RyYXRlZ3kucmlnaHQocG9zaXRpb24ucmlnaHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3RyYXRlZ3kuY2VudGVySG9yaXpvbnRhbGx5KCk7CiAgICAgICAgfQogICAgICAgIGlmIChwb3NpdGlvbiAmJiAocG9zaXRpb24udG9wIHx8IHBvc2l0aW9uLmJvdHRvbSkpIHsKICAgICAgICAgICAgcG9zaXRpb24udG9wID8gc3RyYXRlZ3kudG9wKHBvc2l0aW9uLnRvcCkgOiBzdHJhdGVneS5ib3R0b20ocG9zaXRpb24uYm90dG9tKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN0cmF0ZWd5LmNlbnRlclZlcnRpY2FsbHkoKTsKICAgICAgICB9CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBkaWFsb2cncyB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/PX0gd2lkdGggTmV3IHdpZHRoIG9mIHRoZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0gez89fSBoZWlnaHQgTmV3IGhlaWdodCBvZiB0aGUgZGlhbG9nLgogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgdXBkYXRlU2l6ZSh3aWR0aCA9ICcnLCBoZWlnaHQgPSAnJykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2dldFBvc2l0aW9uU3RyYXRlZ3koKS53aWR0aCh3aWR0aCkuaGVpZ2h0KGhlaWdodCk7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBDU1MgY2xhc3Mgb3IgYW4gYXJyYXkgb2YgY2xhc3NlcyB0byB0aGUgb3ZlcmxheSBwYW5lLgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/fSBjbGFzc2VzCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBhZGRQYW5lbENsYXNzKGNsYXNzZXMpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vdmVybGF5UmVmLmFkZFBhbmVsQ2xhc3MoY2xhc3Nlcyk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIGZyb20gdGhlIG92ZXJsYXkgcGFuZS4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gY2xhc3NlcwogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgcmVtb3ZlUGFuZWxDbGFzcyhjbGFzc2VzKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi5yZW1vdmVQYW5lbENsYXNzKGNsYXNzZXMpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkaWFsb2cncyBsaWZlY3ljbGUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRTdGF0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7CiAgICB9CiAgICAvKioKICAgICAqIEZldGNoZXMgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IG9iamVjdCBmcm9tIHRoZSBvdmVybGF5IHJlZi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0UG9zaXRpb25TdHJhdGVneSgpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSkpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZGlhbG9nL2RpYWxvZy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbiB0byBhIGRpYWxvZy4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfRElBTE9HX0RBVEEgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01hdERpYWxvZ0RhdGEnKTsKLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZGVmYXVsdCBkaWFsb2cgb3B0aW9ucy4KICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfRElBTE9HX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWRpYWxvZy1kZWZhdWx0LW9wdGlvbnMnKTsKLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSB0aGUgZGlhbG9nIGlzIG9wZW4uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX0RJQUxPR19TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1kaWFsb2ctc2Nyb2xsLXN0cmF0ZWd5Jyk7Ci8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcGFyYW0gez99IG92ZXJsYXkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlkob3ZlcmxheSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IG92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpKTsKfQovKioKICogXEBkb2NzLXByaXZhdGUKICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfRElBTE9HX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUiA9IHsKICAgIHByb3ZpZGU6IE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZLAogICAgZGVwczogW092ZXJsYXldLAogICAgdXNlRmFjdG9yeTogTUFUX0RJQUxPR19TQ1JPTExfU1RSQVRFR1lfUFJPVklERVJfRkFDVE9SWSwKfTsKLyoqCiAqIFNlcnZpY2UgdG8gb3BlbiBNYXRlcmlhbCBEZXNpZ24gbW9kYWwgZGlhbG9ncy4KICovCmNsYXNzIE1hdERpYWxvZyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX292ZXJsYXkKICAgICAqIEBwYXJhbSB7P30gX2luamVjdG9yCiAgICAgKiBAcGFyYW0gez99IF9sb2NhdGlvbgogICAgICogQHBhcmFtIHs/fSBfZGVmYXVsdE9wdGlvbnMKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsU3RyYXRlZ3kKICAgICAqIEBwYXJhbSB7P30gX3BhcmVudERpYWxvZwogICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheUNvbnRhaW5lcgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihfb3ZlcmxheSwgX2luamVjdG9yLCAKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgYF9sb2NhdGlvbmAgcGFyYW1ldGVyIHRvIGJlIHJlbW92ZWQuCiAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICovCiAgICBfbG9jYXRpb24sIF9kZWZhdWx0T3B0aW9ucywgc2Nyb2xsU3RyYXRlZ3ksIF9wYXJlbnREaWFsb2csIF9vdmVybGF5Q29udGFpbmVyKSB7CiAgICAgICAgdGhpcy5fb3ZlcmxheSA9IF9vdmVybGF5OwogICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yOwogICAgICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zID0gX2RlZmF1bHRPcHRpb25zOwogICAgICAgIHRoaXMuX3BhcmVudERpYWxvZyA9IF9wYXJlbnREaWFsb2c7CiAgICAgICAgdGhpcy5fb3ZlcmxheUNvbnRhaW5lciA9IF9vdmVybGF5Q29udGFpbmVyOwogICAgICAgIHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWwgPSBbXTsKICAgICAgICB0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgLy8gVE9ETyAoamVsYm91cm4pOiB0aWdodGVuIHRoZSB0eXBpbmcgcmlnaHQtaGFuZCBzaWRlIG9mIHRoaXMgZXhwcmVzc2lvbi4KICAgICAgICAvKioKICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGFsbCBvcGVuIGRpYWxvZyBoYXZlIGZpbmlzaGVkIGNsb3NpbmcuCiAgICAgICAgICogV2lsbCBlbWl0IG9uIHN1YnNjcmliZSBpZiB0aGVyZSBhcmUgbm8gb3BlbiBkaWFsb2dzIHRvIGJlZ2luIHdpdGguCiAgICAgICAgICovCiAgICAgICAgdGhpcy5hZnRlckFsbENsb3NlZCA9ICgvKiogQHR5cGUgez99ICovIChkZWZlcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aCA/CiAgICAgICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkIDoKICAgICAgICAgICAgdGhpcy5fYWZ0ZXJBbGxDbG9zZWQucGlwZShzdGFydFdpdGgodW5kZWZpbmVkKSkpKSkpOwogICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gc2Nyb2xsU3RyYXRlZ3k7CiAgICB9CiAgICAvKioKICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50bHktb3BlbiBkaWFsb2dzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG9wZW5EaWFsb2dzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnREaWFsb2cgPyB0aGlzLl9wYXJlbnREaWFsb2cub3BlbkRpYWxvZ3MgOiB0aGlzLl9vcGVuRGlhbG9nc0F0VGhpc0xldmVsOwogICAgfQogICAgLyoqCiAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgZGlhbG9nIGhhcyBiZWVuIG9wZW5lZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBhZnRlck9wZW5lZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50RGlhbG9nID8gdGhpcy5fcGFyZW50RGlhbG9nLmFmdGVyT3BlbmVkIDogdGhpcy5fYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IF9hZnRlckFsbENsb3NlZCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50RGlhbG9nOwogICAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuX2FmdGVyQWxsQ2xvc2VkIDogdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbDsKICAgIH0KICAgIC8qKgogICAgICogT3BlbnMgYSBtb2RhbCBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gY29tcG9uZW50LgogICAgICogQHRlbXBsYXRlIFQsIEQsIFIKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50T3JUZW1wbGF0ZVJlZiBUeXBlIG9mIHRoZSBjb21wb25lbnQgdG8gbG9hZCBpbnRvIHRoZSBkaWFsb2csCiAgICAgKiAgICAgb3IgYSBUZW1wbGF0ZVJlZiB0byBpbnN0YW50aWF0ZSBhcyB0aGUgZGlhbG9nIGNvbnRlbnQuCiAgICAgKiBAcGFyYW0gez89fSBjb25maWcgRXh0cmEgY29uZmlndXJhdGlvbiBvcHRpb25zLgogICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBuZXdseS1vcGVuZWQgZGlhbG9nLgogICAgICovCiAgICBvcGVuKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIGNvbmZpZykgewogICAgICAgIGNvbmZpZyA9IF9hcHBseUNvbmZpZ0RlZmF1bHRzKGNvbmZpZywgdGhpcy5fZGVmYXVsdE9wdGlvbnMgfHwgbmV3IE1hdERpYWxvZ0NvbmZpZygpKTsKICAgICAgICBpZiAoY29uZmlnLmlkICYmIHRoaXMuZ2V0RGlhbG9nQnlJZChjb25maWcuaWQpKSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKGBEaWFsb2cgd2l0aCBpZCAiJHtjb25maWcuaWR9IiBleGlzdHMgYWxyZWFkeS4gVGhlIGRpYWxvZyBpZCBtdXN0IGJlIHVuaXF1ZS5gKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KGNvbmZpZyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRhaW5lciA9IHRoaXMuX2F0dGFjaERpYWxvZ0NvbnRhaW5lcihvdmVybGF5UmVmLCBjb25maWcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9hdHRhY2hEaWFsb2dDb250ZW50KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIGRpYWxvZ0NvbnRhaW5lciwgb3ZlcmxheVJlZiwgY29uZmlnKTsKICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaWFsb2cgdGhhdCB3ZSdyZSBvcGVuaW5nLCBoaWRlIGFsbCB0aGUgbm9uLW92ZXJsYXkgY29udGVudC4KICAgICAgICBpZiAoIXRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMuX2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vcGVuRGlhbG9ncy5wdXNoKGRpYWxvZ1JlZik7CiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuX3JlbW92ZU9wZW5EaWFsb2coZGlhbG9nUmVmKSkpOwogICAgICAgIHRoaXMuYWZ0ZXJPcGVuZWQubmV4dChkaWFsb2dSZWYpOwogICAgICAgIHJldHVybiBkaWFsb2dSZWY7CiAgICB9CiAgICAvKioKICAgICAqIENsb3NlcyBhbGwgb2YgdGhlIGN1cnJlbnRseS1vcGVuIGRpYWxvZ3MuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbG9zZUFsbCgpIHsKICAgICAgICB0aGlzLl9jbG9zZURpYWxvZ3ModGhpcy5vcGVuRGlhbG9ncyk7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmRzIGFuIG9wZW4gZGlhbG9nIGJ5IGl0cyBpZC4KICAgICAqIEBwYXJhbSB7P30gaWQgSUQgdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgZGlhbG9nLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0RGlhbG9nQnlJZChpZCkgewogICAgICAgIHJldHVybiB0aGlzLm9wZW5EaWFsb2dzLmZpbmQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlhbG9nCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaWFsb2cgPT4gZGlhbG9nLmlkID09PSBpZCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAvLyBPbmx5IGNsb3NlIHRoZSBkaWFsb2dzIGF0IHRoaXMgbGV2ZWwgb24gZGVzdHJveQogICAgICAgIC8vIHNpbmNlIHRoZSBwYXJlbnQgc2VydmljZSBtYXkgc3RpbGwgYmUgYWN0aXZlLgogICAgICAgIHRoaXMuX2Nsb3NlRGlhbG9ncyh0aGlzLl9vcGVuRGlhbG9nc0F0VGhpc0xldmVsKTsKICAgICAgICB0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsLmNvbXBsZXRlKCk7CiAgICAgICAgdGhpcy5fYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIHRoZSBvdmVybGF5IGludG8gd2hpY2ggdGhlIGRpYWxvZyB3aWxsIGJlIGxvYWRlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBUaGUgZGlhbG9nIGNvbmZpZ3VyYXRpb24uCiAgICAgKiBAcmV0dXJuIHs/fSBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBPdmVybGF5UmVmIGZvciB0aGUgY3JlYXRlZCBvdmVybGF5LgogICAgICovCiAgICBfY3JlYXRlT3ZlcmxheShjb25maWcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IHRoaXMuX2dldE92ZXJsYXlDb25maWcoY29uZmlnKTsKICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gb3ZlcmxheSBjb25maWcgZnJvbSBhIGRpYWxvZyBjb25maWcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBkaWFsb2dDb25maWcgVGhlIGRpYWxvZyBjb25maWd1cmF0aW9uLgogICAgICogQHJldHVybiB7P30gVGhlIG92ZXJsYXkgY29uZmlndXJhdGlvbi4KICAgICAqLwogICAgX2dldE92ZXJsYXlDb25maWcoZGlhbG9nQ29uZmlnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IE92ZXJsYXlDb25maWcoewogICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCksCiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBkaWFsb2dDb25maWcuc2Nyb2xsU3RyYXRlZ3kgfHwgdGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSwKICAgICAgICAgICAgcGFuZWxDbGFzczogZGlhbG9nQ29uZmlnLnBhbmVsQ2xhc3MsCiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiBkaWFsb2dDb25maWcuaGFzQmFja2Ryb3AsCiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlhbG9nQ29uZmlnLmRpcmVjdGlvbiwKICAgICAgICAgICAgbWluV2lkdGg6IGRpYWxvZ0NvbmZpZy5taW5XaWR0aCwKICAgICAgICAgICAgbWluSGVpZ2h0OiBkaWFsb2dDb25maWcubWluSGVpZ2h0LAogICAgICAgICAgICBtYXhXaWR0aDogZGlhbG9nQ29uZmlnLm1heFdpZHRoLAogICAgICAgICAgICBtYXhIZWlnaHQ6IGRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQsCiAgICAgICAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IGRpYWxvZ0NvbmZpZy5jbG9zZU9uTmF2aWdhdGlvbgogICAgICAgIH0pOwogICAgICAgIGlmIChkaWFsb2dDb25maWcuYmFja2Ryb3BDbGFzcykgewogICAgICAgICAgICBzdGF0ZS5iYWNrZHJvcENsYXNzID0gZGlhbG9nQ29uZmlnLmJhY2tkcm9wQ2xhc3M7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgYW4gTWF0RGlhbG9nQ29udGFpbmVyIHRvIGEgZGlhbG9nJ3MgYWxyZWFkeS1jcmVhdGVkIG92ZXJsYXkuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvdmVybGF5IFJlZmVyZW5jZSB0byB0aGUgZGlhbG9nJ3MgdW5kZXJseWluZyBvdmVybGF5LgogICAgICogQHBhcmFtIHs/fSBjb25maWcgVGhlIGRpYWxvZyBjb25maWd1cmF0aW9uLgogICAgICogQHJldHVybiB7P30gQSBwcm9taXNlIHJlc29sdmluZyB0byBhIENvbXBvbmVudFJlZiBmb3IgdGhlIGF0dGFjaGVkIGNvbnRhaW5lci4KICAgICAqLwogICAgX2F0dGFjaERpYWxvZ0NvbnRhaW5lcihvdmVybGF5LCBjb25maWcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXNlckluamVjdG9yID0gY29uZmlnICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7CiAgICAgICAgICAgIHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLAogICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdERpYWxvZ0NvbmZpZywgdXNlVmFsdWU6IGNvbmZpZyB9XQogICAgICAgIH0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluZXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKE1hdERpYWxvZ0NvbnRhaW5lciwgY29uZmlnLnZpZXdDb250YWluZXJSZWYsIGluamVjdG9yLCBjb25maWcuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGFpbmVyUmVmID0gb3ZlcmxheS5hdHRhY2goY29udGFpbmVyUG9ydGFsKTsKICAgICAgICByZXR1cm4gY29udGFpbmVyUmVmLmluc3RhbmNlOwogICAgfQogICAgLyoqCiAgICAgKiBBdHRhY2hlcyB0aGUgdXNlci1wcm92aWRlZCBjb21wb25lbnQgdG8gdGhlIGFscmVhZHktY3JlYXRlZCBNYXREaWFsb2dDb250YWluZXIuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHRlbXBsYXRlIFQsIFIKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50T3JUZW1wbGF0ZVJlZiBUaGUgdHlwZSBvZiBjb21wb25lbnQgYmVpbmcgbG9hZGVkIGludG8gdGhlIGRpYWxvZywKICAgICAqICAgICBvciBhIFRlbXBsYXRlUmVmIHRvIGluc3RhbnRpYXRlIGFzIHRoZSBjb250ZW50LgogICAgICogQHBhcmFtIHs/fSBkaWFsb2dDb250YWluZXIgUmVmZXJlbmNlIHRvIHRoZSB3cmFwcGluZyBNYXREaWFsb2dDb250YWluZXIuCiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXlSZWYgUmVmZXJlbmNlIHRvIHRoZSBvdmVybGF5IGluIHdoaWNoIHRoZSBkaWFsb2cgcmVzaWRlcy4KICAgICAqIEBwYXJhbSB7P30gY29uZmlnIFRoZSBkaWFsb2cgY29uZmlndXJhdGlvbi4KICAgICAqIEByZXR1cm4gez99IEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIE1hdERpYWxvZ1JlZiB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgdXNlci4KICAgICAqLwogICAgX2F0dGFjaERpYWxvZ0NvbnRlbnQoY29tcG9uZW50T3JUZW1wbGF0ZVJlZiwgZGlhbG9nQ29udGFpbmVyLCBvdmVybGF5UmVmLCBjb25maWcpIHsKICAgICAgICAvLyBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIGRpYWxvZyB3ZSdyZSBjcmVhdGluZyBpbiBvcmRlciB0byBnaXZlIHRoZSB1c2VyIGEgaGFuZGxlCiAgICAgICAgLy8gdG8gbW9kaWZ5IGFuZCBjbG9zZSBpdC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gbmV3IE1hdERpYWxvZ1JlZihvdmVybGF5UmVmLCBkaWFsb2dDb250YWluZXIsIGNvbmZpZy5pZCk7CiAgICAgICAgaWYgKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikgewogICAgICAgICAgICBkaWFsb2dDb250YWluZXIuYXR0YWNoVGVtcGxhdGVQb3J0YWwobmV3IFRlbXBsYXRlUG9ydGFsKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsICgvKiogQHR5cGUgez99ICovIChudWxsKSksICgvKiogQHR5cGUgez99ICovICh7ICRpbXBsaWNpdDogY29uZmlnLmRhdGEsIGRpYWxvZ1JlZiB9KSkpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLl9jcmVhdGVJbmplY3Rvcihjb25maWcsIGRpYWxvZ1JlZiwgZGlhbG9nQ29udGFpbmVyKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZW50UmVmID0gZGlhbG9nQ29udGFpbmVyLmF0dGFjaENvbXBvbmVudFBvcnRhbChuZXcgQ29tcG9uZW50UG9ydGFsKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3RvcikpOwogICAgICAgICAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UgPSBjb250ZW50UmVmLmluc3RhbmNlOwogICAgICAgIH0KICAgICAgICBkaWFsb2dSZWYKICAgICAgICAgICAgLnVwZGF0ZVNpemUoY29uZmlnLndpZHRoLCBjb25maWcuaGVpZ2h0KQogICAgICAgICAgICAudXBkYXRlUG9zaXRpb24oY29uZmlnLnBvc2l0aW9uKTsKICAgICAgICByZXR1cm4gZGlhbG9nUmVmOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgY3VzdG9tIGluamVjdG9yIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSBkaWFsb2cuIFRoaXMgYWxsb3dzIGEgY29tcG9uZW50IGxvYWRlZCBpbnNpZGUKICAgICAqIG9mIGEgZGlhbG9nIHRvIGNsb3NlIGl0c2VsZiBhbmQsIG9wdGlvbmFsbHksIHRvIHJldHVybiBhIHZhbHVlLgogICAgICogQHByaXZhdGUKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBDb25maWcgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7P30gZGlhbG9nUmVmIFJlZmVyZW5jZSB0byB0aGUgZGlhbG9nLgogICAgICogQHBhcmFtIHs/fSBkaWFsb2dDb250YWluZXIKICAgICAqIEByZXR1cm4gez99IFRoZSBjdXN0b20gaW5qZWN0b3IgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGRpYWxvZy4KICAgICAqLwogICAgX2NyZWF0ZUluamVjdG9yKGNvbmZpZywgZGlhbG9nUmVmLCBkaWFsb2dDb250YWluZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXNlckluamVjdG9yID0gY29uZmlnICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yOwogICAgICAgIC8vIFRoZSBNYXREaWFsb2dDb250YWluZXIgaXMgaW5qZWN0ZWQgaW4gdGhlIHBvcnRhbCBhcyB0aGUgTWF0RGlhbG9nQ29udGFpbmVyIGFuZCB0aGUgZGlhbG9nJ3MKICAgICAgICAvLyBjb250ZW50IGFyZSBjcmVhdGVkIG91dCBvZiB0aGUgc2FtZSBWaWV3Q29udGFpbmVyUmVmIGFuZCBhcyBzdWNoLCBhcmUgc2libGluZ3MgZm9yIGluamVjdG9yCiAgICAgICAgLy8gcHVycG9zZXMuIFRvIGFsbG93IHRoZSBoaWVyYXJjaHkgdGhhdCBpcyBleHBlY3RlZCwgdGhlIE1hdERpYWxvZ0NvbnRhaW5lciBpcyBleHBsaWNpdGx5CiAgICAgICAgLy8gYWRkZWQgdG8gdGhlIGluamVjdGlvbiB0b2tlbnMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3ZpZGVycyA9IFsKICAgICAgICAgICAgeyBwcm92aWRlOiBNYXREaWFsb2dDb250YWluZXIsIHVzZVZhbHVlOiBkaWFsb2dDb250YWluZXIgfSwKICAgICAgICAgICAgeyBwcm92aWRlOiBNQVRfRElBTE9HX0RBVEEsIHVzZVZhbHVlOiBjb25maWcuZGF0YSB9LAogICAgICAgICAgICB7IHByb3ZpZGU6IE1hdERpYWxvZ1JlZiwgdXNlVmFsdWU6IGRpYWxvZ1JlZiB9CiAgICAgICAgXTsKICAgICAgICBpZiAoY29uZmlnLmRpcmVjdGlvbiAmJgogICAgICAgICAgICAoIXVzZXJJbmplY3RvciB8fCAhdXNlckluamVjdG9yLmdldChEaXJlY3Rpb25hbGl0eSwgbnVsbCkpKSB7CiAgICAgICAgICAgIHByb3ZpZGVycy5wdXNoKHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IERpcmVjdGlvbmFsaXR5LAogICAgICAgICAgICAgICAgdXNlVmFsdWU6IHsgdmFsdWU6IGNvbmZpZy5kaXJlY3Rpb24sIGNoYW5nZTogb2YoKSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW5qZWN0b3IuY3JlYXRlKHsgcGFyZW50OiB1c2VySW5qZWN0b3IgfHwgdGhpcy5faW5qZWN0b3IsIHByb3ZpZGVycyB9KTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBhIGRpYWxvZyBmcm9tIHRoZSBhcnJheSBvZiBvcGVuIGRpYWxvZ3MuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBkaWFsb2dSZWYgRGlhbG9nIHRvIGJlIHJlbW92ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVtb3ZlT3BlbkRpYWxvZyhkaWFsb2dSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5EaWFsb2dzLmluZGV4T2YoZGlhbG9nUmVmKTsKICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICB0aGlzLm9wZW5EaWFsb2dzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIC8vIElmIGFsbCB0aGUgZGlhbG9ncyB3ZXJlIGNsb3NlZCwgcmVtb3ZlL3Jlc3RvcmUgdGhlIGBhcmlhLWhpZGRlbmAKICAgICAgICAgICAgLy8gdG8gYSB0aGUgc2libGluZ3MgYW5kIGVtaXQgdG8gdGhlIGBhZnRlckFsbENsb3NlZGAgc3RyZWFtLgogICAgICAgICAgICBpZiAoIXRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByZXZpb3VzVmFsdWUKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHByZXZpb3VzVmFsdWUsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBwcmV2aW91c1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5jbGVhcigpOwogICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJBbGxDbG9zZWQubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBIaWRlcyBhbGwgb2YgdGhlIGNvbnRlbnQgdGhhdCBpc24ndCBhbiBvdmVybGF5IGZyb20gYXNzaXN0aXZlIHRlY2hub2xvZ3kuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG92ZXJsYXlDb250YWluZXIgPSB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTsKICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3ZlcmxheSBjb250YWluZXIgaXMgYXR0YWNoZWQgdG8gdGhlIERPTS4KICAgICAgICBpZiAob3ZlcmxheUNvbnRhaW5lci5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBvdmVybGF5Q29udGFpbmVyLnBhcmVudEVsZW1lbnQuY2hpbGRyZW47CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBzaWJsaW5nc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nICE9PSBvdmVybGF5Q29udGFpbmVyICYmCiAgICAgICAgICAgICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NDUklQVCcgJiYKICAgICAgICAgICAgICAgICAgICBzaWJsaW5nLm5vZGVOYW1lICE9PSAnU1RZTEUnICYmCiAgICAgICAgICAgICAgICAgICAgIXNpYmxpbmcuaGFzQXR0cmlidXRlKCdhcmlhLWxpdmUnKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5zZXQoc2libGluZywgc2libGluZy5nZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJykpOwogICAgICAgICAgICAgICAgICAgIHNpYmxpbmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENsb3NlcyBhbGwgb2YgdGhlIGRpYWxvZ3MgaW4gYW4gYXJyYXkuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBkaWFsb2dzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2xvc2VEaWFsb2dzKGRpYWxvZ3MpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSBkaWFsb2dzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgIC8vIFRoZSBgX29wZW5EaWFsb2dzYCBwcm9wZXJ0eSBpc24ndCB1cGRhdGVkIGFmdGVyIGNsb3NlIHVudGlsIHRoZSByeGpzIHN1YnNjcmlwdGlvbgogICAgICAgICAgICAvLyBydW5zIG9uIHRoZSBuZXh0IG1pY3JvdGFzaywgaW4gYWRkaXRpb24gdG8gbW9kaWZ5aW5nIHRoZSBhcnJheSBhcyB3ZSdyZSBnb2luZwogICAgICAgICAgICAvLyB0aHJvdWdoIGl0LiBXZSBsb29wIHRocm91Z2ggYWxsIG9mIHRoZW0gYW5kIGNhbGwgY2xvc2Ugd2l0aG91dCBhc3N1bWluZyB0aGF0CiAgICAgICAgICAgIC8vIHRoZXknbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGluc3RhbnRhbmVvdXNseS4KICAgICAgICAgICAgZGlhbG9nc1tpXS5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KfQpNYXREaWFsb2cuybVmYWMgPSBmdW5jdGlvbiBNYXREaWFsb2dfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nKSjJtcm1aW5qZWN0KE92ZXJsYXkpLCDJtcm1aW5qZWN0KEluamVjdG9yKSwgybXJtWluamVjdChMb2NhdGlvbiwgOCksIMm1ybVpbmplY3QoTUFUX0RJQUxPR19ERUZBVUxUX09QVElPTlMsIDgpLCDJtcm1aW5qZWN0KE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZKSwgybXJtWluamVjdChNYXREaWFsb2csIDEyKSwgybXJtWluamVjdChPdmVybGF5Q29udGFpbmVyKSk7IH07Ck1hdERpYWxvZy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBNYXREaWFsb2csIGZhY3Rvcnk6IE1hdERpYWxvZy7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdERpYWxvZy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogT3ZlcmxheSB9LAogICAgeyB0eXBlOiBJbmplY3RvciB9LAogICAgeyB0eXBlOiBMb2NhdGlvbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgIHsgdHlwZTogTWF0RGlhbG9nQ29uZmlnLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9ESUFMT0dfREVGQVVMVF9PUFRJT05TLF0gfV0gfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfRElBTE9HX1NDUk9MTF9TVFJBVEVHWSxdIH1dIH0sCiAgICB7IHR5cGU6IE1hdERpYWxvZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgeyB0eXBlOiBPdmVybGF5Q29udGFpbmVyIH0KXTsKLyoqCiAqIEFwcGxpZXMgZGVmYXVsdCBvcHRpb25zIHRvIHRoZSBkaWFsb2cgY29uZmlnLgogKiBAcGFyYW0gez89fSBjb25maWcgQ29uZmlnIHRvIGJlIG1vZGlmaWVkLgogKiBAcGFyYW0gez89fSBkZWZhdWx0T3B0aW9ucyBEZWZhdWx0IG9wdGlvbnMgcHJvdmlkZWQuCiAqIEByZXR1cm4gez99IFRoZSBuZXcgY29uZmlndXJhdGlvbiBvYmplY3QuCiAqLwpmdW5jdGlvbiBfYXBwbHlDb25maWdEZWZhdWx0cyhjb25maWcsIGRlZmF1bHRPcHRpb25zKSB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucyksIGNvbmZpZyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9kaWFsb2cvZGlhbG9nLWNvbnRlbnQtZGlyZWN0aXZlcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgZm9yIGRpYWxvZyBlbGVtZW50cy4KICogQHR5cGUgez99CiAqLwpsZXQgZGlhbG9nRWxlbWVudFVpZCA9IDA7Ci8qKgogKiBCdXR0b24gdGhhdCB3aWxsIGNsb3NlIHRoZSBjdXJyZW50IGRpYWxvZy4KICovCmNsYXNzIE1hdERpYWxvZ0Nsb3NlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkaWFsb2dSZWYKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2RpYWxvZwogICAgICovCiAgICBjb25zdHJ1Y3RvcihkaWFsb2dSZWYsIF9lbGVtZW50UmVmLCBfZGlhbG9nKSB7CiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSBkaWFsb2dSZWY7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX2RpYWxvZyA9IF9kaWFsb2c7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCB0byAiYnV0dG9uIiB0byBwcmV2ZW50cyBhY2NpZGVudGFsIGZvcm0gc3VibWl0cy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnR5cGUgPSAnYnV0dG9uJzsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmRpYWxvZ1JlZikgewogICAgICAgICAgICAvLyBXaGVuIHRoaXMgZGlyZWN0aXZlIGlzIGluY2x1ZGVkIGluIGEgZGlhbG9nIHZpYSBUZW1wbGF0ZVJlZiAocmF0aGVyIHRoYW4gYmVpbmcKICAgICAgICAgICAgLy8gaW4gYSBDb21wb25lbnQpLCB0aGUgRGlhbG9nUmVmIGlzbid0IGF2YWlsYWJsZSB2aWEgaW5qZWN0aW9uIGJlY2F1c2UgZW1iZWRkZWQKICAgICAgICAgICAgLy8gdmlld3MgY2Fubm90IGJlIGdpdmVuIGEgY3VzdG9tIGluamVjdG9yLiBJbnN0ZWFkLCB3ZSBsb29rIHVwIHRoZSBEaWFsb2dSZWYgYnkKICAgICAgICAgICAgLy8gSUQuIFRoaXMgbXVzdCBvY2N1ciBpbiBgb25Jbml0YCwgYXMgdGhlIElEIGJpbmRpbmcgZm9yIHRoZSBkaWFsb2cgY29udGFpbmVyIHdvbid0CiAgICAgICAgICAgIC8vIGJlIHJlc29sdmVkIGF0IGNvbnN0cnVjdG9yIHRpbWUuCiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldENsb3Nlc3REaWFsb2codGhpcy5fZWxlbWVudFJlZiwgdGhpcy5fZGlhbG9nLm9wZW5EaWFsb2dzKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3hpZWRDaGFuZ2UgPSBjaGFuZ2VzWydfbWF0RGlhbG9nQ2xvc2UnXSB8fCBjaGFuZ2VzWydfbWF0RGlhbG9nQ2xvc2VSZXN1bHQnXTsKICAgICAgICBpZiAocHJveGllZENoYW5nZSkgewogICAgICAgICAgICB0aGlzLmRpYWxvZ1Jlc3VsdCA9IHByb3hpZWRDaGFuZ2UuY3VycmVudFZhbHVlOwogICAgICAgIH0KICAgIH0KfQpNYXREaWFsb2dDbG9zZS7JtWZhYyA9IGZ1bmN0aW9uIE1hdERpYWxvZ0Nsb3NlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdERpYWxvZ0Nsb3NlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdERpYWxvZ1JlZiwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0RGlhbG9nKSk7IH07Ck1hdERpYWxvZ0Nsb3NlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdERpYWxvZ0Nsb3NlLCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtZGlhbG9nLWNsb3NlIiwgIiJdLCBbIiIsICJtYXREaWFsb2dDbG9zZSIsICIiXV0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdERpYWxvZ0Nsb3NlX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0RGlhbG9nQ2xvc2VfY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4LmRpYWxvZ1JlZi5jbG9zZShjdHguZGlhbG9nUmVzdWx0KTsgfSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgY3R4LmFyaWFMYWJlbCB8fCBudWxsKSgidHlwZSIsIGN0eC50eXBlKTsKICAgIH0gfSwgaW5wdXRzOiB7IHR5cGU6ICJ0eXBlIiwgZGlhbG9nUmVzdWx0OiBbIm1hdC1kaWFsb2ctY2xvc2UiLCAiZGlhbG9nUmVzdWx0Il0sIGFyaWFMYWJlbDogWyJhcmlhLWxhYmVsIiwgImFyaWFMYWJlbCJdLCBfbWF0RGlhbG9nQ2xvc2U6IFsibWF0RGlhbG9nQ2xvc2UiLCAiX21hdERpYWxvZ0Nsb3NlIl0gfSwgZXhwb3J0QXM6IFsibWF0RGlhbG9nQ2xvc2UiXSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdERpYWxvZ0Nsb3NlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBNYXREaWFsb2dSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogTWF0RGlhbG9nIH0KXTsKTWF0RGlhbG9nQ2xvc2UucHJvcERlY29yYXRvcnMgPSB7CiAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICB0eXBlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRpYWxvZ1Jlc3VsdDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0LWRpYWxvZy1jbG9zZScsXSB9XSwKICAgIF9tYXREaWFsb2dDbG9zZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0RGlhbG9nQ2xvc2UnLF0gfV0KfTsKLyoqCiAqIFRpdGxlIG9mIGEgZGlhbG9nIGVsZW1lbnQuIFN0YXlzIGZpeGVkIHRvIHRoZSB0b3Agb2YgdGhlIGRpYWxvZyB3aGVuIHNjcm9sbGluZy4KICovCmNsYXNzIE1hdERpYWxvZ1RpdGxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZGlhbG9nUmVmCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9kaWFsb2cKICAgICAqLwogICAgY29uc3RydWN0b3IoX2RpYWxvZ1JlZiwgX2VsZW1lbnRSZWYsIF9kaWFsb2cpIHsKICAgICAgICB0aGlzLl9kaWFsb2dSZWYgPSBfZGlhbG9nUmVmOwogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB0aGlzLl9kaWFsb2cgPSBfZGlhbG9nOwogICAgICAgIHRoaXMuaWQgPSBgbWF0LWRpYWxvZy10aXRsZS0ke2RpYWxvZ0VsZW1lbnRVaWQrK31gOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2RpYWxvZ1JlZikgewogICAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0Q2xvc2VzdERpYWxvZyh0aGlzLl9lbGVtZW50UmVmLCB0aGlzLl9kaWFsb2cub3BlbkRpYWxvZ3MpKSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9kaWFsb2dSZWYpIHsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9kaWFsb2dSZWYuX2NvbnRhaW5lckluc3RhbmNlOwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAmJiAhY29udGFpbmVyLl9hcmlhTGFiZWxsZWRCeSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5fYXJpYUxhYmVsbGVkQnkgPSB0aGlzLmlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQp9Ck1hdERpYWxvZ1RpdGxlLsm1ZmFjID0gZnVuY3Rpb24gTWF0RGlhbG9nVGl0bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nVGl0bGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0RGlhbG9nUmVmLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXREaWFsb2cpKTsgfTsKTWF0RGlhbG9nVGl0bGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0RGlhbG9nVGl0bGUsIHNlbGVjdG9yczogW1siIiwgIm1hdC1kaWFsb2ctdGl0bGUiLCAiIl0sIFsiIiwgIm1hdERpYWxvZ1RpdGxlIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1kaWFsb2ctdGl0bGUiXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0RGlhbG9nVGl0bGVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVob3N0UHJvcGVydHkoImlkIiwgY3R4LmlkKTsKICAgIH0gfSwgaW5wdXRzOiB7IGlkOiAiaWQiIH0sIGV4cG9ydEFzOiBbIm1hdERpYWxvZ1RpdGxlIl0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXREaWFsb2dUaXRsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogTWF0RGlhbG9nUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IE1hdERpYWxvZyB9Cl07Ck1hdERpYWxvZ1RpdGxlLnByb3BEZWNvcmF0b3JzID0gewogICAgaWQ6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBTY3JvbGxhYmxlIGNvbnRlbnQgY29udGFpbmVyIG9mIGEgZGlhbG9nLgogKi8KY2xhc3MgTWF0RGlhbG9nQ29udGVudCB7Cn0KTWF0RGlhbG9nQ29udGVudC7JtWZhYyA9IGZ1bmN0aW9uIE1hdERpYWxvZ0NvbnRlbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nQ29udGVudCkoKTsgfTsKTWF0RGlhbG9nQ29udGVudC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXREaWFsb2dDb250ZW50LCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtZGlhbG9nLWNvbnRlbnQiLCAiIl0sIFsibWF0LWRpYWxvZy1jb250ZW50Il0sIFsiIiwgIm1hdERpYWxvZ0NvbnRlbnQiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWRpYWxvZy1jb250ZW50Il0gfSk7Ci8qKgogKiBDb250YWluZXIgZm9yIHRoZSBib3R0b20gYWN0aW9uIGJ1dHRvbnMgaW4gYSBkaWFsb2cuCiAqIFN0YXlzIGZpeGVkIHRvIHRoZSBib3R0b20gd2hlbiBzY3JvbGxpbmcuCiAqLwpjbGFzcyBNYXREaWFsb2dBY3Rpb25zIHsKfQpNYXREaWFsb2dBY3Rpb25zLsm1ZmFjID0gZnVuY3Rpb24gTWF0RGlhbG9nQWN0aW9uc19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXREaWFsb2dBY3Rpb25zKSgpOyB9OwpNYXREaWFsb2dBY3Rpb25zLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdERpYWxvZ0FjdGlvbnMsIHNlbGVjdG9yczogW1siIiwgIm1hdC1kaWFsb2ctYWN0aW9ucyIsICIiXSwgWyJtYXQtZGlhbG9nLWFjdGlvbnMiXSwgWyIiLCAibWF0RGlhbG9nQWN0aW9ucyIsICIiXV0sIGhvc3RBdHRyczogWzEsICJtYXQtZGlhbG9nLWFjdGlvbnMiXSB9KTsKLyoqCiAqIEZpbmRzIHRoZSBjbG9zZXN0IE1hdERpYWxvZ1JlZiB0byBhbiBlbGVtZW50IGJ5IGxvb2tpbmcgYXQgdGhlIERPTS4KICogQHBhcmFtIHs/fSBlbGVtZW50IEVsZW1lbnQgcmVsYXRpdmUgdG8gd2hpY2ggdG8gbG9vayBmb3IgYSBkaWFsb2cuCiAqIEBwYXJhbSB7P30gb3BlbkRpYWxvZ3MgUmVmZXJlbmNlcyB0byB0aGUgY3VycmVudGx5LW9wZW4gZGlhbG9ncy4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENsb3Nlc3REaWFsb2coZWxlbWVudCwgb3BlbkRpYWxvZ3MpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnQgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDsKICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1kaWFsb2ctY29udGFpbmVyJykpIHsKICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBwYXJlbnQgPyBvcGVuRGlhbG9ncy5maW5kKCgvKioKICAgICAqIEBwYXJhbSB7P30gZGlhbG9nCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaWFsb2cgPT4gZGlhbG9nLmlkID09PSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50KSkuaWQpKSA6IG51bGw7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9kaWFsb2cvZGlhbG9nLW1vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBNYXREaWFsb2dNb2R1bGUgewp9Ck1hdERpYWxvZ01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdERpYWxvZ01vZHVsZSB9KTsKTWF0RGlhbG9nTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0RGlhbG9nTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdERpYWxvZ01vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbCiAgICAgICAgTWF0RGlhbG9nLAogICAgICAgIE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSLAogICAgXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgT3ZlcmxheU1vZHVsZSwKICAgICAgICAgICAgUG9ydGFsTW9kdWxlLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgXSwKICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXREaWFsb2dNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0RGlhbG9nQ29udGFpbmVyLAogICAgICAgIE1hdERpYWxvZ0Nsb3NlLAogICAgICAgIE1hdERpYWxvZ1RpdGxlLAogICAgICAgIE1hdERpYWxvZ0FjdGlvbnMsCiAgICAgICAgTWF0RGlhbG9nQ29udGVudF07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtPdmVybGF5TW9kdWxlLAogICAgICAgIFBvcnRhbE1vZHVsZSwKICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0RGlhbG9nQ29udGFpbmVyLAogICAgICAgIE1hdERpYWxvZ0Nsb3NlLAogICAgICAgIE1hdERpYWxvZ1RpdGxlLAogICAgICAgIE1hdERpYWxvZ0NvbnRlbnQsCiAgICAgICAgTWF0RGlhbG9nQWN0aW9ucywKICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKY29uc3QgX2MwJDYgPSBbIm1hdC1idXR0b24iLCAiIl07CmNvbnN0IF9jMSQ2ID0gWyIqIl07CmNvbnN0IERFRkFVTFRfUk9VTkRfQlVUVE9OX0NPTE9SID0gJ2FjY2VudCc7Ci8qKgogKiBMaXN0IG9mIGNsYXNzZXMgdG8gYWRkIHRvIE1hdEJ1dHRvbiBpbnN0YW5jZXMgYmFzZWQgb24gaG9zdCBhdHRyaWJ1dGVzIHRvCiAqIHN0eWxlIGFzIGRpZmZlcmVudCB2YXJpYW50cy4KICogQHR5cGUgez99CiAqLwpjb25zdCBCVVRUT05fSE9TVF9BVFRSSUJVVEVTID0gWwogICAgJ21hdC1idXR0b24nLAogICAgJ21hdC1mbGF0LWJ1dHRvbicsCiAgICAnbWF0LWljb24tYnV0dG9uJywKICAgICdtYXQtcmFpc2VkLWJ1dHRvbicsCiAgICAnbWF0LXN0cm9rZWQtYnV0dG9uJywKICAgICdtYXQtbWluaS1mYWInLAogICAgJ21hdC1mYWInLApdOwovLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdEJ1dHRvbi4KLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBNYXRCdXR0b25CYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9NYXRCdXR0b25NaXhpbkJhc2UgPSBtaXhpbkNvbG9yKG1peGluRGlzYWJsZWQobWl4aW5EaXNhYmxlUmlwcGxlKE1hdEJ1dHRvbkJhc2UpKSk7Ci8qKgogKiBNYXRlcmlhbCBkZXNpZ24gYnV0dG9uLgogKi8KY2xhc3MgTWF0QnV0dG9uIGV4dGVuZHMgX01hdEJ1dHRvbk1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfZm9jdXNNb25pdG9yCiAgICAgKiBAcGFyYW0gez99IF9hbmltYXRpb25Nb2RlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9mb2N1c01vbml0b3IsIF9hbmltYXRpb25Nb2RlKSB7CiAgICAgICAgc3VwZXIoZWxlbWVudFJlZik7CiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgYnV0dG9uIGlzIHJvdW5kLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaXNSb3VuZEJ1dHRvbiA9IHRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKCdtYXQtZmFiJywgJ21hdC1taW5pLWZhYicpOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBpY29uIGJ1dHRvbi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmlzSWNvbkJ1dHRvbiA9IHRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKCdtYXQtaWNvbi1idXR0b24nKTsKICAgICAgICAvLyBGb3IgZWFjaCBvZiB0aGUgdmFyaWFudCBzZWxlY3RvcnMgdGhhdCBpcyBwcmVzZW50IGluIHRoZSBidXR0b24ncyBob3N0CiAgICAgICAgLy8gYXR0cmlidXRlcywgYWRkIHRoZSBjb3JyZWN0IGNvcnJlc3BvbmRpbmcgY2xhc3MuCiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIEJVVFRPTl9IT1NUX0FUVFJJQlVURVMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKGF0dHIpKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2dldEhvc3RFbGVtZW50KCkpKSkuY2xhc3NMaXN0LmFkZChhdHRyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBjbGFzcyB0aGF0IGFwcGxpZXMgdG8gYWxsIGJ1dHRvbnMuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHRhcmdldCBpZiBzb21lYm9keQogICAgICAgIC8vIHdhbnRzIHRvIHRhcmdldCBhbGwgTWF0ZXJpYWwgYnV0dG9ucy4gV2UgZG8gaXQgaGVyZSByYXRoZXIgdGhhbiBgaG9zdGAgdG8gZW5zdXJlIHRoYXQKICAgICAgICAvLyB0aGUgY2xhc3MgaXMgYXBwbGllZCB0byBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21hdC1idXR0b24tYmFzZScpOwogICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRydWUpOwogICAgICAgIGlmICh0aGlzLmlzUm91bmRCdXR0b24pIHsKICAgICAgICAgICAgdGhpcy5jb2xvciA9IERFRkFVTFRfUk9VTkRfQlVUVE9OX0NPTE9SOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpOwogICAgfQogICAgLyoqCiAgICAgKiBGb2N1c2VzIHRoZSBidXR0b24uCiAgICAgKiBAcGFyYW0gez89fSBvcmlnaW4KICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvY3VzKG9yaWdpbiA9ICdwcm9ncmFtJywgb3B0aW9ucykgewogICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLCBvcmlnaW4sIG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0SG9zdEVsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2lzUmlwcGxlRGlzYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZVJpcHBsZSB8fCB0aGlzLmRpc2FibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGJ1dHRvbiBoYXMgb25lIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgogICAgICogQHBhcmFtIHsuLi4/fSBhdHRyaWJ1dGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFzSG9zdEF0dHJpYnV0ZXMoLi4uYXR0cmlidXRlcykgewogICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhdHRyaWJ1dGUgPT4gdGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkpOwogICAgfQp9Ck1hdEJ1dHRvbi7JtWZhYyA9IGZ1bmN0aW9uIE1hdEJ1dHRvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRCdXR0b24pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKTWF0QnV0dG9uLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEJ1dHRvbiwgc2VsZWN0b3JzOiBbWyJidXR0b24iLCAibWF0LWJ1dHRvbiIsICIiXSwgWyJidXR0b24iLCAibWF0LXJhaXNlZC1idXR0b24iLCAiIl0sIFsiYnV0dG9uIiwgIm1hdC1pY29uLWJ1dHRvbiIsICIiXSwgWyJidXR0b24iLCAibWF0LWZhYiIsICIiXSwgWyJidXR0b24iLCAibWF0LW1pbmktZmFiIiwgIiJdLCBbImJ1dHRvbiIsICJtYXQtc3Ryb2tlZC1idXR0b24iLCAiIl0sIFsiYnV0dG9uIiwgIm1hdC1mbGF0LWJ1dHRvbiIsICIiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0QnV0dG9uX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybV2aWV3UXVlcnkoTWF0UmlwcGxlLCB0cnVlKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIHZhciBfdDsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnJpcHBsZSA9IF90LmZpcnN0KTsKICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSwgaG9zdFZhcnM6IDMsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0QnV0dG9uX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCB8fCBudWxsKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCBjb2xvcjogImNvbG9yIiB9LCBleHBvcnRBczogWyJtYXRCdXR0b24iXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgYXR0cnM6IF9jMCQ2LCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMSQ2LCBkZWNsczogNCwgdmFyczogNSwgY29uc3RzOiBbWzEsICJtYXQtYnV0dG9uLXdyYXBwZXIiXSwgWyJtYXRSaXBwbGUiLCAiIiwgMSwgIm1hdC1idXR0b24tcmlwcGxlIiwgMywgIm1hdFJpcHBsZURpc2FibGVkIiwgIm1hdFJpcHBsZUNlbnRlcmVkIiwgIm1hdFJpcHBsZVRyaWdnZXIiXSwgWzEsICJtYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRCdXR0b25fVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIiwgMCk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMSk7CiAgICAgICAgybXJtWVsZW1lbnQoMywgImRpdiIsIDIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWJ1dHRvbi1yaXBwbGUtcm91bmQiLCBjdHguaXNSb3VuZEJ1dHRvbiB8fCBjdHguaXNJY29uQnV0dG9uKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4Ll9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVDZW50ZXJlZCIsIGN0eC5pc0ljb25CdXR0b24pKCJtYXRSaXBwbGVUcmlnZ2VyIiwgY3R4Ll9nZXRIb3N0RWxlbWVudCgpKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW01hdFJpcHBsZV0sIHN0eWxlczogWyIubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjB9Lm1hdC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMDR9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjB9fS5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9ue2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtYnV0dG9uW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZsYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LXJhaXNlZC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWlzZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOi0xcHg7bGVmdDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHh9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXJ7cGFkZGluZzoxNnB4IDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MjRweH0ubWF0LW1pbmktZmFie2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO21pbi13aWR0aDowO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7cGFkZGluZzowO2ZsZXgtc2hyaW5rOjB9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LW1pbmktZmFiW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LW1pbmktZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1taW5pLWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LW1pbmktZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXJ7cGFkZGluZzo4cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtaWNvbi1idXR0b257cGFkZGluZzowO21pbi13aWR0aDowO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7ZmxleC1zaHJpbms6MDtsaW5lLWhlaWdodDo0MHB4O2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtaWNvbi1idXR0b24gaSwubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntsaW5lLWhlaWdodDoyNHB4fS5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlLC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2ZmZn0uY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tcmlwcGxlLXJvdW5ke2JvcmRlci1yYWRpdXM6NTAlO3otaW5kZXg6MX0ubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1mbGF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1yYWlzZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWljb24tYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1taW5pLWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTppbmhlcml0O3dpZHRoOjIuNWVtO2hlaWdodDoyLjVlbX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mbGF0LWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmFpc2VkLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaWNvbi1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZhYiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWluaS1mYWJ7b3V0bGluZTpzb2xpZCAxcHh9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0QnV0dG9uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IEZvY3VzTW9uaXRvciB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQpdOwpNYXRCdXR0b24ucHJvcERlY29yYXRvcnMgPSB7CiAgICByaXBwbGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW01hdFJpcHBsZSxdIH1dCn07Ci8qKgogKiBNYXRlcmlhbCBkZXNpZ24gYW5jaG9yIGJ1dHRvbi4KICovCmNsYXNzIE1hdEFuY2hvciBleHRlbmRzIE1hdEJ1dHRvbiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm9jdXNNb25pdG9yCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTW9kZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihmb2N1c01vbml0b3IsIGVsZW1lbnRSZWYsIGFuaW1hdGlvbk1vZGUpIHsKICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBmb2N1c01vbml0b3IsIGFuaW1hdGlvbk1vZGUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFsdERpc2FibGVkRXZlbnRzKGV2ZW50KSB7CiAgICAgICAgLy8gQSBkaXNhYmxlZCBidXR0b24gc2hvdWxkbid0IGFwcGx5IGFueSBhY3Rpb25zCiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgfQp9Ck1hdEFuY2hvci7JtWZhYyA9IGZ1bmN0aW9uIE1hdEFuY2hvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRBbmNob3IpKMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKTWF0QW5jaG9yLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEFuY2hvciwgc2VsZWN0b3JzOiBbWyJhIiwgIm1hdC1idXR0b24iLCAiIl0sIFsiYSIsICJtYXQtcmFpc2VkLWJ1dHRvbiIsICIiXSwgWyJhIiwgIm1hdC1pY29uLWJ1dHRvbiIsICIiXSwgWyJhIiwgIm1hdC1mYWIiLCAiIl0sIFsiYSIsICJtYXQtbWluaS1mYWIiLCAiIl0sIFsiYSIsICJtYXQtc3Ryb2tlZC1idXR0b24iLCAiIl0sIFsiYSIsICJtYXQtZmxhdC1idXR0b24iLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogNSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRBbmNob3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRBbmNob3JfY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9oYWx0RGlzYWJsZWRFdmVudHMoJGV2ZW50KTsgfSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YXR0cmlidXRlKCJ0YWJpbmRleCIsIGN0eC5kaXNhYmxlZCA/IDAgLSAxIDogY3R4LnRhYkluZGV4IHx8IDApKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCB8fCBudWxsKSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZC50b1N0cmluZygpKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCBjb2xvcjogImNvbG9yIiwgdGFiSW5kZXg6ICJ0YWJJbmRleCIgfSwgZXhwb3J0QXM6IFsibWF0QnV0dG9uIiwgIm1hdEFuY2hvciJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBhdHRyczogX2MwJDYsIG5nQ29udGVudFNlbGVjdG9yczogX2MxJDYsIGRlY2xzOiA0LCB2YXJzOiA1LCBjb25zdHM6IFtbMSwgIm1hdC1idXR0b24td3JhcHBlciJdLCBbIm1hdFJpcHBsZSIsICIiLCAxLCAibWF0LWJ1dHRvbi1yaXBwbGUiLCAzLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAibWF0UmlwcGxlQ2VudGVyZWQiLCAibWF0UmlwcGxlVHJpZ2dlciJdLCBbMSwgIm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEFuY2hvcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAwKTsKICAgICAgICDJtcm1cHJvamVjdGlvbigxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50KDIsICJkaXYiLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAiZGl2IiwgMik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtYnV0dG9uLXJpcHBsZS1yb3VuZCIsIGN0eC5pc1JvdW5kQnV0dG9uIHx8IGN0eC5pc0ljb25CdXR0b24pOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlRGlzYWJsZWQiLCBjdHguX2lzUmlwcGxlRGlzYWJsZWQoKSkoIm1hdFJpcHBsZUNlbnRlcmVkIiwgY3R4LmlzSWNvbkJ1dHRvbikoIm1hdFJpcHBsZVRyaWdnZXIiLCBjdHguX2dldEhvc3RFbGVtZW50KCkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0UmlwcGxlXSwgc3R5bGVzOiBbIi5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH0ubWF0LWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4wNH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH19Lm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9uLC5tYXQtZmxhdC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGV9Lm1hdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1pY29uLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LXN0cm9rZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtZmxhdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1idXR0b25bZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LXJhaXNlZC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXJhaXNlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtcmFpc2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXJhaXNlZC1idXR0b257dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtc3Ryb2tlZC1idXR0b257Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7cGFkZGluZzowIDE1cHg7bGluZS1oZWlnaHQ6MzRweH0ubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlLC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6LTFweDtsZWZ0Oi0xcHg7cmlnaHQ6LTFweDtib3R0b206LTFweH0ubWF0LWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo1NnB4O2hlaWdodDo1NnB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtZmFiW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LWZhYi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWZhYnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjE2cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtbWluaS1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWluaS1mYWJbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtbWluaS1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiBpLC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jZGstaGlnaC1jb250cmFzdC1ibGFjay1vbi13aGl0ZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmR7Ym9yZGVyLXJhZGl1czo1MCU7ei1pbmRleDoxfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOmluaGVyaXQ7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZsYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yYWlzZWQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pY29uLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmFiLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1taW5pLWZhYntvdXRsaW5lOnNvbGlkIDFweH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRBbmNob3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEZvY3VzTW9uaXRvciB9LAogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9Cl07Ck1hdEFuY2hvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2J1dHRvbi9idXR0b24tbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE1hdEJ1dHRvbk1vZHVsZSB7Cn0KTWF0QnV0dG9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0QnV0dG9uTW9kdWxlIH0pOwpNYXRCdXR0b25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRCdXR0b25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0QnV0dG9uTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICBNYXRSaXBwbGVNb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICBdLAogICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdEJ1dHRvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRCdXR0b24sCiAgICAgICAgTWF0QW5jaG9yXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFJpcHBsZU1vZHVsZSwKICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0QnV0dG9uLAogICAgICAgIE1hdEFuY2hvciwKICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKY2xhc3MgUGVuZGluZ0NvcHkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRleHQKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHRleHQsIF9kb2N1bWVudCkgewogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuX3RleHRhcmVhID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGV4dGFyZWEuc3R5bGU7CiAgICAgICAgLy8gSGlkZSB0aGUgZWxlbWVudCBmb3IgZGlzcGxheSBhbmQgYWNjZXNzaWJpbGl0eS4gU2V0IGFuCiAgICAgICAgLy8gYWJzb2x1dGUgcG9zaXRpb24gc28gdGhlIHBhZ2UgbGF5b3V0IGlzbid0IGFmZmVjdGVkLgogICAgICAgIHN0eWxlcy5vcGFjaXR5ID0gJzAnOwogICAgICAgIHN0eWxlcy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgICAgc3R5bGVzLmxlZnQgPSBzdHlsZXMudG9wID0gJy05OTllbSc7CiAgICAgICAgdGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgdGV4dGFyZWEudmFsdWUgPSB0ZXh0OwogICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dGFyZWEpOwogICAgfQogICAgLyoqCiAgICAgKiBGaW5pc2hlcyBjb3B5aW5nIHRoZSB0ZXh0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY29weSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLl90ZXh0YXJlYTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN1Y2Nlc3NmdWwgPSBmYWxzZTsKICAgICAgICB0cnkgeyAvLyBPbGRlciBicm93c2VycyBjb3VsZCB0aHJvdyBpZiBjb3B5IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgICAgIGlmICh0ZXh0YXJlYSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZvY3VzID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIHRleHRhcmVhLnNlbGVjdCgpOwogICAgICAgICAgICAgICAgdGV4dGFyZWEuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dGFyZWEudmFsdWUubGVuZ3RoKTsKICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0aGlzLl9kb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb2N1cykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGb2N1cy5mb2N1cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICAvLyBEaXNjYXJkIGVycm9yLgogICAgICAgICAgICAvLyBJbml0aWFsIHNldHRpbmcgb2Yge0Bjb2RlIHN1Y2Nlc3NmdWx9IHdpbGwgcmVwcmVzZW50IGZhaWx1cmUgaGVyZS4KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFucyB1cCBET00gY2hhbmdlcyB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvcHkgb3BlcmF0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLl90ZXh0YXJlYTsKICAgICAgICBpZiAodGV4dGFyZWEpIHsKICAgICAgICAgICAgaWYgKHRleHRhcmVhLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgIHRleHRhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGV4dGFyZWEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jbGlwYm9hcmQvY2xpcGJvYXJkLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIHNlcnZpY2UgZm9yIGNvcHlpbmcgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgogKi8KY2xhc3MgQ2xpcGJvYXJkIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCkgewogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIENvcGllcyB0aGUgcHJvdmlkZWQgdGV4dCBpbnRvIHRoZSB1c2VyJ3MgY2xpcGJvYXJkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGV4dCBUaGUgc3RyaW5nIHRvIGNvcHkuCiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCiAgICAgKi8KICAgIGNvcHkodGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwZW5kaW5nQ29weSA9IHRoaXMuYmVnaW5Db3B5KHRleHQpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdWNjZXNzZnVsID0gcGVuZGluZ0NvcHkuY29weSgpOwogICAgICAgIHBlbmRpbmdDb3B5LmRlc3Ryb3koKTsKICAgICAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKICAgIH0KICAgIC8qKgogICAgICogUHJlcGFyZXMgYSBzdHJpbmcgdG8gYmUgY29waWVkIGxhdGVyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGFyZ2Ugc3RyaW5ncwogICAgICogd2hpY2ggdGFrZSB0b28gbG9uZyB0byBzdWNjZXNzZnVsbHkgcmVuZGVyIGFuZCBiZSBjb3BpZWQgaW4gdGhlIHNhbWUgdGljay4KICAgICAqCiAgICAgKiBUaGUgY2FsbGVyIG11c3QgY2FsbCBgZGVzdHJveWAgb24gdGhlIHJldHVybmVkIGBQZW5kaW5nQ29weWAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0ZXh0IFRoZSBzdHJpbmcgdG8gY29weS4KICAgICAqIEByZXR1cm4gez99IHRoZSBwZW5kaW5nIGNvcHkgb3BlcmF0aW9uLgogICAgICovCiAgICBiZWdpbkNvcHkodGV4dCkgewogICAgICAgIHJldHVybiBuZXcgUGVuZGluZ0NvcHkodGV4dCwgdGhpcy5fZG9jdW1lbnQpOwogICAgfQp9CkNsaXBib2FyZC7JtWZhYyA9IGZ1bmN0aW9uIENsaXBib2FyZF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDbGlwYm9hcmQpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KQ2xpcGJvYXJkLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBDbGlwYm9hcmQuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBDbGlwYm9hcmRfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBDbGlwYm9hcmQoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH0sIHRva2VuOiBDbGlwYm9hcmQsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKLyoqCiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyB0byBgQ2RrQ29weVRvQ2xpcGJvYXJkYC4KICogQHR5cGUgez99CiAqLwpjb25zdCBDS0RfQ09QWV9UT19DTElQQk9BUkRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdDS0RfQ09QWV9UT19DTElQQk9BUkRfQ09ORklHJyk7Ci8qKgogKiBQcm92aWRlcyBiZWhhdmlvciBmb3IgYSBidXR0b24gdGhhdCB3aGVuIGNsaWNrZWQgY29waWVzIGNvbnRlbnQgaW50byB1c2VyJ3MKICogY2xpcGJvYXJkLgogKi8KY2xhc3MgQ2RrQ29weVRvQ2xpcGJvYXJkIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfY2xpcGJvYXJkCiAgICAgKiBAcGFyYW0gez89fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAqLwogICAgY29uc3RydWN0b3IoX2NsaXBib2FyZCwgX25nWm9uZSwgY29uZmlnKSB7CiAgICAgICAgdGhpcy5fY2xpcGJvYXJkID0gX2NsaXBib2FyZDsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIC8qKgogICAgICAgICAqIENvbnRlbnQgdG8gYmUgY29waWVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMudGV4dCA9ICcnOwogICAgICAgIC8qKgogICAgICAgICAqIEhvdyBtYW55IHRpbWVzIHRvIGF0dGVtcHQgdG8gY29weSB0aGUgdGV4dC4gVGhpcyBtYXkgYmUgbmVjZXNzYXJ5IGZvciBsb25nZXIgdGV4dCwgYmVjYXVzZQogICAgICAgICAqIHRoZSBicm93c2VyIG5lZWRzIHRpbWUgdG8gZmlsbCBhbiBpbnRlcm1lZGlhdGUgdGV4dGFyZWEgZWxlbWVudCBhbmQgY29weSB0aGUgY29udGVudC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmF0dGVtcHRzID0gMTsKICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB3aGVuIHNvbWUgdGV4dCBpcyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4gVGhlCiAgICAgICAgICogZW1pdHRlZCB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBjb3B5aW5nIHdhcyBzdWNjZXNzZnVsLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29waWVkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gc29tZSB0ZXh0IGlzIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLiBUaGUKICAgICAgICAgKiBlbWl0dGVkIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGNvcHlpbmcgd2FzIHN1Y2Nlc3NmdWwuCiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWRgIGluc3RlYWQuCiAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgMTAuMC4wCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGVwcmVjYXRlZENvcGllZCA9IHRoaXMuY29waWVkOwogICAgICAgIC8qKgogICAgICAgICAqIENvcGllcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgYXR0ZW1wdGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3BlbmRpbmcgPSBuZXcgU2V0KCk7CiAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuYXR0ZW1wdHMgIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmF0dGVtcHRzID0gY29uZmlnLmF0dGVtcHRzOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29waWVzIHRoZSBjdXJyZW50IHRleHQgdG8gdGhlIGNsaXBib2FyZC4KICAgICAqIEBwYXJhbSB7Pz19IGF0dGVtcHRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb3B5KGF0dGVtcHRzID0gdGhpcy5hdHRlbXB0cykgewogICAgICAgIGlmIChhdHRlbXB0cyA+IDEpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVtYWluaW5nQXR0ZW1wdHMgPSBhdHRlbXB0czsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fY2xpcGJvYXJkLmJlZ2luQ29weSh0aGlzLnRleHQpOwogICAgICAgICAgICB0aGlzLl9wZW5kaW5nLmFkZChwZW5kaW5nKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHBlbmRpbmcuY29weSgpOwogICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzZnVsICYmIC0tcmVtYWluaW5nQXR0ZW1wdHMgJiYgIXRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgX25nWm9uZWAuCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX25nWm9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VGltZW91dCA9IHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRUaW1lb3V0KGF0dGVtcHQsIDEpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgMSBmb3IgdGhlIHRpbWVvdXQgc2luY2UgaXQncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZmx1c2hpbmcgaW4gdW5pdCB0ZXN0cy4KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KGF0dGVtcHQsIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nLmRlbGV0ZShwZW5kaW5nKTsKICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcGllZC5lbWl0KHN1Y2Nlc3NmdWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXR0ZW1wdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5jb3BpZWQuZW1pdCh0aGlzLl9jbGlwYm9hcmQuY29weSh0aGlzLnRleHQpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLl9jdXJyZW50VGltZW91dCkgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY3VycmVudFRpbWVvdXQpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wZW5kaW5nLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29weQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY29weSA9PiBjb3B5LmRlc3Ryb3koKSkpOwogICAgICAgIHRoaXMuX3BlbmRpbmcuY2xlYXIoKTsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlOwogICAgfQp9CkNka0NvcHlUb0NsaXBib2FyZC7JtWZhYyA9IGZ1bmN0aW9uIENka0NvcHlUb0NsaXBib2FyZF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtDb3B5VG9DbGlwYm9hcmQpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ2xpcGJvYXJkKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENLRF9DT1BZX1RPX0NMSVBCT0FSRF9DT05GSUcsIDgpKTsgfTsKQ2RrQ29weVRvQ2xpcGJvYXJkLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0NvcHlUb0NsaXBib2FyZCwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrQ29weVRvQ2xpcGJvYXJkIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBDZGtDb3B5VG9DbGlwYm9hcmRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBDZGtDb3B5VG9DbGlwYm9hcmRfY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4LmNvcHkoKTsgfSk7CiAgICB9IH0sIGlucHV0czogeyB0ZXh0OiBbImNka0NvcHlUb0NsaXBib2FyZCIsICJ0ZXh0Il0sIGF0dGVtcHRzOiBbImNka0NvcHlUb0NsaXBib2FyZEF0dGVtcHRzIiwgImF0dGVtcHRzIl0gfSwgb3V0cHV0czogeyBjb3BpZWQ6ICJjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQiLCBfZGVwcmVjYXRlZENvcGllZDogImNvcGllZCIgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkNka0NvcHlUb0NsaXBib2FyZC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ2xpcGJvYXJkIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0tEX0NPUFlfVE9fQ0xJUEJPQVJEX0NPTkZJRyxdIH1dIH0KXTsKQ2RrQ29weVRvQ2xpcGJvYXJkLnByb3BEZWNvcmF0b3JzID0gewogICAgdGV4dDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29weVRvQ2xpcGJvYXJkJyxdIH1dLAogICAgYXR0ZW1wdHM6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0NvcHlUb0NsaXBib2FyZEF0dGVtcHRzJyxdIH1dLAogICAgY29waWVkOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkJyxdIH1dLAogICAgX2RlcHJlY2F0ZWRDb3BpZWQ6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydjb3BpZWQnLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvY2xpcGJvYXJkL2NsaXBib2FyZC1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgQ2xpcGJvYXJkTW9kdWxlIHsKfQpDbGlwYm9hcmRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBDbGlwYm9hcmRNb2R1bGUgfSk7CkNsaXBib2FyZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIENsaXBib2FyZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDbGlwYm9hcmRNb2R1bGUpKCk7IH0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKENsaXBib2FyZE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtDZGtDb3B5VG9DbGlwYm9hcmRdLCBleHBvcnRzOiBbQ2RrQ29weVRvQ2xpcGJvYXJkXSB9KTsgfSkoKTsKCi8qKgogKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMgogKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICogTGljZW5zZTogTUlUCiAqLwpjbGFzcyBIdHRwSGFuZGxlciB7Cn0KLyoqCiAqIEEgZmluYWwgYEh0dHBIYW5kbGVyYCB3aGljaCB3aWxsIGRpc3BhdGNoIHRoZSByZXF1ZXN0IHZpYSBicm93c2VyIEhUVFAgQVBJcyB0byBhIGJhY2tlbmQuCiAqCiAqIEludGVyY2VwdG9ycyBzaXQgYmV0d2VlbiB0aGUgYEh0dHBDbGllbnRgIGludGVyZmFjZSBhbmQgdGhlIGBIdHRwQmFja2VuZGAuCiAqCiAqIFdoZW4gaW5qZWN0ZWQsIGBIdHRwQmFja2VuZGAgZGlzcGF0Y2hlcyByZXF1ZXN0cyBkaXJlY3RseSB0byB0aGUgYmFja2VuZCwgd2l0aG91dCBnb2luZwogKiB0aHJvdWdoIHRoZSBpbnRlcmNlcHRvciBjaGFpbi4KICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBIdHRwQmFja2VuZCB7Cn0KLyoqCiAqIFJlcHJlc2VudHMgdGhlIGhlYWRlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGFuIEhUVFAgcmVxdWVzdC4KICogSW5zdGFuY2VzIGFyZSBpbW11dGFibGUuIE1vZGlmeWluZyBtZXRob2RzIHJldHVybiBhIGNsb25lZAogKiBpbnN0YW5jZSB3aXRoIHRoZSBjaGFuZ2UuIFRoZSBvcmlnaW5hbCBvYmplY3QgaXMgbmV2ZXIgY2hhbmdlZC4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEh0dHBIZWFkZXJzIHsKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIG5ldyBIVFRQIGhlYWRlciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgogICAgICogQHBhcmFtIHs/PX0gaGVhZGVycwogICAgICovCiAgICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWFwIG9mIGxvd2VyY2FzZWQgaGVhZGVyIG5hbWVzIHRvIHRoZSBub3JtYWxpemVkCiAgICAgICAgICogZm9ybSBvZiB0aGUgbmFtZSAodGhlIGZvcm0gc2VlbiBmaXJzdCkuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5ub3JtYWxpemVkTmFtZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogUXVldWVkIHVwZGF0ZXMgdG8gYmUgbWF0ZXJpYWxpemVkIHRoZSBuZXh0IGluaXRpYWxpemF0aW9uLgogICAgICAgICAqLwogICAgICAgIHRoaXMubGF6eVVwZGF0ZSA9IG51bGw7CiAgICAgICAgaWYgKCFoZWFkZXJzKSB7CiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGhlYWRlcnMgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRoaXMubGF6eUluaXQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICBoZWFkZXJzLnNwbGl0KCdcbicpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsaW5lCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBsaW5lID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxpbmUuc2xpY2UoaW5kZXggKyAxKS50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVTZXROb3JtYWxpemVkTmFtZShuYW1lLCBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oZWFkZXJzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5oZWFkZXJzLmdldChrZXkpKSkucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KGtleSwgW3ZhbHVlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sYXp5SW5pdCA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBuYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IGhlYWRlcnNbbmFtZV07CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlcyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KGtleSwgdmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKG5hbWUsIGtleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyBmb3IgZXhpc3RlbmNlIG9mIGEgZ2l2ZW4gaGVhZGVyLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgaGVhZGVyIG5hbWUgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoZSBoZWFkZXIgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGhhcyhuYW1lKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVycy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSBmaXJzdCB2YWx1ZSBvZiBhIGdpdmVuIGhlYWRlci4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRoZSB2YWx1ZSBzdHJpbmcgaWYgdGhlIGhlYWRlciBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCiAgICAgKi8KICAgIGdldChuYW1lKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuaGVhZGVycy5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICByZXR1cm4gdmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBBIGxpc3Qgb2YgaGVhZGVyIG5hbWVzLgogICAgICovCiAgICBrZXlzKCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubm9ybWFsaXplZE5hbWVzLnZhbHVlcygpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGEgbGlzdCBvZiB2YWx1ZXMgZm9yIGEgZ2l2ZW4gaGVhZGVyLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgaGVhZGVyIG5hbWUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB2YWx1ZXMuCiAgICAgKgogICAgICogQHJldHVybiB7P30gQSBzdHJpbmcgb2YgdmFsdWVzIGlmIHRoZSBoZWFkZXIgZXhpc3RzLCBudWxsIG90aGVyd2lzZS4KICAgICAqLwogICAgZ2V0QWxsKG5hbWUpIHsKICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJzLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZHMgYSBuZXcgdmFsdWUgdG8gdGhlIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXMgZm9yIGEgaGVhZGVyCiAgICAgKiBhbmQgcmV0dXJucyB0aGVtIGluIGEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGluc3RhbmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgaGVhZGVyIG5hbWUgZm9yIHdoaWNoIHRvIGFwcGVuZCB0aGUgdmFsdWVzLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXBwZW5kLgogICAgICoKICAgICAqIEByZXR1cm4gez99IEEgY2xvbmUgb2YgdGhlIEhUVFAgaGVhZGVycyBvYmplY3Qgd2l0aCB0aGUgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIGdpdmVuIGhlYWRlci4KICAgICAqLwogICAgYXBwZW5kKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoeyBuYW1lLCB2YWx1ZSwgb3A6ICdhJyB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyBvciBtb2RpZmllcyBhIHZhbHVlIGZvciBhIGdpdmVuIGhlYWRlciBpbiBhIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBpbnN0YW5jZS4KICAgICAqIElmIHRoZSBoZWFkZXIgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZQogICAgICogaW4gdGhlIHJldHVybmVkIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgdmFsdWUgb3IgdmFsdWVzIHRvIHNldCBvciBvdmVyaWRlIGZvciB0aGUgZ2l2ZW4gaGVhZGVyLgogICAgICoKICAgICAqIEByZXR1cm4gez99IEEgY2xvbmUgb2YgdGhlIEhUVFAgaGVhZGVycyBvYmplY3Qgd2l0aCB0aGUgbmV3bHkgc2V0IGhlYWRlciB2YWx1ZS4KICAgICAqLwogICAgc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoeyBuYW1lLCB2YWx1ZSwgb3A6ICdzJyB9KTsKICAgIH0KICAgIC8qKgogICAgICogRGVsZXRlcyB2YWx1ZXMgZm9yIGEgZ2l2ZW4gaGVhZGVyIGluIGEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGluc3RhbmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgaGVhZGVyIG5hbWUuCiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBUaGUgdmFsdWUgb3IgdmFsdWVzIHRvIGRlbGV0ZSBmb3IgdGhlIGdpdmVuIGhlYWRlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNsb25lIG9mIHRoZSBIVFRQIGhlYWRlcnMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHZhbHVlIGRlbGV0ZWQuCiAgICAgKi8KICAgIGRlbGV0ZShuYW1lLCB2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKHsgbmFtZSwgdmFsdWUsIG9wOiAnZCcgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gbGNOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXliZVNldE5vcm1hbGl6ZWROYW1lKG5hbWUsIGxjTmFtZSkgewogICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkTmFtZXMuaGFzKGxjTmFtZSkpIHsKICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkTmFtZXMuc2V0KGxjTmFtZSwgbmFtZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5pdCgpIHsKICAgICAgICBpZiAoISF0aGlzLmxhenlJbml0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmxhenlJbml0IGluc3RhbmNlb2YgSHR0cEhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29weUZyb20odGhpcy5sYXp5SW5pdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlJbml0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5sYXp5SW5pdCA9IG51bGw7CiAgICAgICAgICAgIGlmICghIXRoaXMubGF6eVVwZGF0ZSkgewogICAgICAgICAgICAgICAgdGhpcy5sYXp5VXBkYXRlLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHVwZGF0ZSA9PiB0aGlzLmFwcGx5VXBkYXRlKHVwZGF0ZSkpKTsKICAgICAgICAgICAgICAgIHRoaXMubGF6eVVwZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG90aGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjb3B5RnJvbShvdGhlcikgewogICAgICAgIG90aGVyLmluaXQoKTsKICAgICAgICBBcnJheS5mcm9tKG90aGVyLmhlYWRlcnMua2V5cygpKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAga2V5ID0+IHsKICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChrZXksICgvKiogQHR5cGUgez99ICovIChvdGhlci5oZWFkZXJzLmdldChrZXkpKSkpOwogICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWROYW1lcy5zZXQoa2V5LCAoLyoqIEB0eXBlIHs/fSAqLyAob3RoZXIubm9ybWFsaXplZE5hbWVzLmdldChrZXkpKSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdXBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbG9uZSh1cGRhdGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgSHR0cEhlYWRlcnMoKTsKICAgICAgICBjbG9uZS5sYXp5SW5pdCA9CiAgICAgICAgICAgICghIXRoaXMubGF6eUluaXQgJiYgdGhpcy5sYXp5SW5pdCBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSA/IHRoaXMubGF6eUluaXQgOiB0aGlzOwogICAgICAgIGNsb25lLmxhenlVcGRhdGUgPSAodGhpcy5sYXp5VXBkYXRlIHx8IFtdKS5jb25jYXQoW3VwZGF0ZV0pOwogICAgICAgIHJldHVybiBjbG9uZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdXBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhcHBseVVwZGF0ZSh1cGRhdGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ID0gdXBkYXRlLm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICBzd2l0Y2ggKHVwZGF0ZS5vcCkgewogICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlLnZhbHVlKSk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLm1heWJlU2V0Tm9ybWFsaXplZE5hbWUodXBkYXRlLm5hbWUsIGtleSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKHVwZGF0ZS5vcCA9PT0gJ2EnID8gdGhpcy5oZWFkZXJzLmdldChrZXkpIDogdW5kZWZpbmVkKSB8fCBbXTsKICAgICAgICAgICAgICAgIGJhc2UucHVzaCguLi52YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KGtleSwgYmFzZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGUudmFsdWUpKTsKICAgICAgICAgICAgICAgIGlmICghdG9EZWxldGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5oZWFkZXJzLmdldChrZXkpOwogICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IGV4aXN0aW5nLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT4gdG9EZWxldGUuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZE5hbWVzLmRlbGV0ZShrZXkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChrZXksIGV4aXN0aW5nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2goZm4pIHsKICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICBBcnJheS5mcm9tKHRoaXMubm9ybWFsaXplZE5hbWVzLmtleXMoKSkKICAgICAgICAgICAgLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBrZXkgPT4gZm4oKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubm9ybWFsaXplZE5hbWVzLmdldChrZXkpKSksICgvKiogQHR5cGUgez99ICovICh0aGlzLmhlYWRlcnMuZ2V0KGtleSkpKSkpKTsKICAgIH0KfQovKioKICogUHJvdmlkZXMgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIFVSTCBwYXJhbWV0ZXIgYW5kIHF1ZXJ5LXN0cmluZyB2YWx1ZXMuCiAqCiAqIFNlcmlhbGl6ZXMgYW5kIHBhcnNlcyBVUkwgcGFyYW1ldGVyIGtleXMgYW5kIHZhbHVlcyB0byBlbmNvZGUgYW5kIGRlY29kZSB0aGVtLgogKiBJZiB5b3UgcGFzcyBVUkwgcXVlcnkgcGFyYW1ldGVycyB3aXRob3V0IGVuY29kaW5nLAogKiB0aGUgcXVlcnkgcGFyYW1ldGVycyBjYW4gYmUgbWlzaW50ZXJwcmV0ZWQgYXQgdGhlIHJlY2VpdmluZyBlbmQuCiAqCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIdHRwVXJsRW5jb2RpbmdDb2RlYyB7CiAgICAvKioKICAgICAqIEVuY29kZXMgYSBrZXkgbmFtZSBmb3IgYSBVUkwgcGFyYW1ldGVyIG9yIHF1ZXJ5LXN0cmluZy4KICAgICAqIEBwYXJhbSB7P30ga2V5IFRoZSBrZXkgbmFtZS4KICAgICAqIEByZXR1cm4gez99IFRoZSBlbmNvZGVkIGtleSBuYW1lLgogICAgICovCiAgICBlbmNvZGVLZXkoa2V5KSB7CiAgICAgICAgcmV0dXJuIHN0YW5kYXJkRW5jb2Rpbmcoa2V5KTsKICAgIH0KICAgIC8qKgogICAgICogRW5jb2RlcyB0aGUgdmFsdWUgb2YgYSBVUkwgcGFyYW1ldGVyIG9yIHF1ZXJ5LXN0cmluZy4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlLgogICAgICogQHJldHVybiB7P30gVGhlIGVuY29kZWQgdmFsdWUuCiAgICAgKi8KICAgIGVuY29kZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHN0YW5kYXJkRW5jb2RpbmcodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgVVJMIHBhcmFtZXRlciBvciBxdWVyeS1zdHJpbmcga2V5LgogICAgICogQHBhcmFtIHs/fSBrZXkgVGhlIGVuY29kZWQga2V5IG5hbWUuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgZGVjb2RlZCBrZXkgbmFtZS4KICAgICAqLwogICAgZGVjb2RlS2V5KGtleSkgewogICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoa2V5KTsKICAgIH0KICAgIC8qKgogICAgICogRGVjb2RlcyBhbiBlbmNvZGVkIFVSTCBwYXJhbWV0ZXIgb3IgcXVlcnktc3RyaW5nIHZhbHVlLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgZW5jb2RlZCB2YWx1ZS4KICAgICAqIEByZXR1cm4gez99IFRoZSBkZWNvZGVkIHZhbHVlLgogICAgICovCiAgICBkZWNvZGVWYWx1ZSh2YWx1ZSkgewogICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHJhd1BhcmFtcwogKiBAcGFyYW0gez99IGNvZGVjCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwYXJhbVBhcnNlcihyYXdQYXJhbXMsIGNvZGVjKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICBpZiAocmF3UGFyYW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyYW1zID0gcmF3UGFyYW1zLnNwbGl0KCcmJyk7CiAgICAgICAgcGFyYW1zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChwYXJhbSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVxSWR4ID0gcGFyYW0uaW5kZXhPZignPScpOwogICAgICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gZXFJZHggPT0gLTEgPwogICAgICAgICAgICAgICAgW2NvZGVjLmRlY29kZUtleShwYXJhbSksICcnXSA6CiAgICAgICAgICAgICAgICBbY29kZWMuZGVjb2RlS2V5KHBhcmFtLnNsaWNlKDAsIGVxSWR4KSksIGNvZGVjLmRlY29kZVZhbHVlKHBhcmFtLnNsaWNlKGVxSWR4ICsgMSkpXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaXN0ID0gbWFwLmdldChrZXkpIHx8IFtdOwogICAgICAgICAgICBsaXN0LnB1c2godmFsKTsKICAgICAgICAgICAgbWFwLnNldChrZXksIGxpc3QpOwogICAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBtYXA7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3RhbmRhcmRFbmNvZGluZyh2KSB7CiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHYpCiAgICAgICAgLnJlcGxhY2UoLyU0MC9naSwgJ0AnKQogICAgICAgIC5yZXBsYWNlKC8lM0EvZ2ksICc6JykKICAgICAgICAucmVwbGFjZSgvJTI0L2dpLCAnJCcpCiAgICAgICAgLnJlcGxhY2UoLyUyQy9naSwgJywnKQogICAgICAgIC5yZXBsYWNlKC8lM0IvZ2ksICc7JykKICAgICAgICAucmVwbGFjZSgvJTJCL2dpLCAnKycpCiAgICAgICAgLnJlcGxhY2UoLyUzRC9naSwgJz0nKQogICAgICAgIC5yZXBsYWNlKC8lM0YvZ2ksICc/JykKICAgICAgICAucmVwbGFjZSgvJTJGL2dpLCAnLycpOwp9Ci8qKgogKiBBbiBIVFRQIHJlcXVlc3QvcmVzcG9uc2UgYm9keSB0aGF0IHJlcHJlc2VudHMgc2VyaWFsaXplZCBwYXJhbWV0ZXJzLAogKiBwZXIgdGhlIE1JTUUgdHlwZSBgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYC4KICoKICogVGhpcyBjbGFzcyBpcyBpbW11dGFibGU7IGFsbCBtdXRhdGlvbiBvcGVyYXRpb25zIHJldHVybiBhIG5ldyBpbnN0YW5jZS4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEh0dHBQYXJhbXMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKSkgewogICAgICAgIHRoaXMudXBkYXRlcyA9IG51bGw7CiAgICAgICAgdGhpcy5jbG9uZUZyb20gPSBudWxsOwogICAgICAgIHRoaXMuZW5jb2RlciA9IG9wdGlvbnMuZW5jb2RlciB8fCBuZXcgSHR0cFVybEVuY29kaW5nQ29kZWMoKTsKICAgICAgICBpZiAoISFvcHRpb25zLmZyb21TdHJpbmcpIHsKICAgICAgICAgICAgaWYgKCEhb3B0aW9ucy5mcm9tT2JqZWN0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzcGVjaWZ5IGJvdGggZnJvbVN0cmluZyBhbmQgZnJvbU9iamVjdC5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1hcCA9IHBhcmFtUGFyc2VyKG9wdGlvbnMuZnJvbVN0cmluZywgdGhpcy5lbmNvZGVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoISFvcHRpb25zLmZyb21PYmplY3QpIHsKICAgICAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuZnJvbU9iamVjdCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBrZXkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMuZnJvbU9iamVjdCkpKVtrZXldOwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuc2V0KGtleSwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLm1hcCA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGJvZHkgaW5jbHVkZXMgb25lIG9yIG1vcmUgdmFsdWVzIGZvciBhIGdpdmVuIHBhcmFtZXRlci4KICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGhhcyBvbmUgb3IgbW9yZSB2YWx1ZXMsCiAgICAgKiBmYWxzZSBpZiBpdCBoYXMgbm8gdmFsdWUgb3IgaXMgbm90IHByZXNlbnQuCiAgICAgKi8KICAgIGhhcyhwYXJhbSkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5oYXMocGFyYW0pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IHZhbHVlIGZvciBhIHBhcmFtZXRlci4KICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICogQHJldHVybiB7P30gVGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBnaXZlbiBwYXJhbWV0ZXIsCiAgICAgKiBvciBgbnVsbGAgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudC4KICAgICAqLwogICAgZ2V0KHBhcmFtKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLmdldChwYXJhbSk7CiAgICAgICAgcmV0dXJuICEhcmVzID8gcmVzWzBdIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGFsbCB2YWx1ZXMgZm9yIGEgIHBhcmFtZXRlci4KICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICogQHJldHVybiB7P30gQWxsIHZhbHVlcyBpbiBhIHN0cmluZyBhcnJheSwKICAgICAqIG9yIGBudWxsYCBpZiB0aGUgcGFyYW1ldGVyIG5vdCBwcmVzZW50LgogICAgICovCiAgICBnZXRBbGwocGFyYW0pIHsKICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZ2V0KHBhcmFtKSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGJvZHkuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcGFyYW1ldGVyIG5hbWVzIGluIGEgc3RyaW5nIGFycmF5LgogICAgICovCiAgICBrZXlzKCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiBBcnJheS5mcm9tKCgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLmtleXMoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZHMgYSBuZXcgdmFsdWUgdG8gZXhpc3RpbmcgdmFsdWVzIGZvciBhIHBhcmFtZXRlci4KICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbmV3IHZhbHVlIHRvIGFkZC4KICAgICAqIEByZXR1cm4gez99IEEgbmV3IGJvZHkgd2l0aCB0aGUgYXBwZW5kZWQgdmFsdWUuCiAgICAgKi8KICAgIGFwcGVuZChwYXJhbSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IHBhcmFtLCB2YWx1ZSwgb3A6ICdhJyB9KTsKICAgIH0KICAgIC8qKgogICAgICogUmVwbGFjZXMgdGhlIHZhbHVlIGZvciBhIHBhcmFtZXRlci4KICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbmV3IHZhbHVlLgogICAgICogQHJldHVybiB7P30gQSBuZXcgYm9keSB3aXRoIHRoZSBuZXcgdmFsdWUuCiAgICAgKi8KICAgIHNldChwYXJhbSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IHBhcmFtLCB2YWx1ZSwgb3A6ICdzJyB9KTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBhIGdpdmVuIHZhbHVlIG9yIGFsbCB2YWx1ZXMgZnJvbSBhIHBhcmFtZXRlci4KICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICogQHBhcmFtIHs/PX0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlbW92ZSwgaWYgcHJvdmlkZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIG5ldyBib2R5IHdpdGggdGhlIGdpdmVuIHZhbHVlIHJlbW92ZWQsIG9yIHdpdGggYWxsIHZhbHVlcwogICAgICogcmVtb3ZlZCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQuCiAgICAgKi8KICAgIGRlbGV0ZShwYXJhbSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IHBhcmFtLCB2YWx1ZSwgb3A6ICdkJyB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2VyaWFsaXplcyB0aGUgYm9keSB0byBhbiBlbmNvZGVkIHN0cmluZywgd2hlcmUga2V5LXZhbHVlIHBhaXJzIChzZXBhcmF0ZWQgYnkgYD1gKSBhcmUKICAgICAqIHNlcGFyYXRlZCBieSBgJmBzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9TdHJpbmcoKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgcmV0dXJuIHRoaXMua2V5cygpCiAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBrZXkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVLZXkgPSB0aGlzLmVuY29kZXIuZW5jb2RlS2V5KGtleSk7CiAgICAgICAgICAgIC8vIGBhOiBbJzEnXWAgcHJvZHVjZXMgYCdhPTEnYAogICAgICAgICAgICAvLyBgYjogW11gIHByb2R1Y2VzIGAnJ2AKICAgICAgICAgICAgLy8gYGM6IFsnMScsICcyJ11gIHByb2R1Y2VzIGAnYz0xJmM9MidgCiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZ2V0KGtleSkpKS5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YWx1ZSA9PiBlS2V5ICsgJz0nICsgdGhpcy5lbmNvZGVyLmVuY29kZVZhbHVlKHZhbHVlKSkpCiAgICAgICAgICAgICAgICAuam9pbignJicpOwogICAgICAgIH0pKQogICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGVtcHR5IHZhbHVlcyBiZWNhdXNlIGBiOiBbXWAgcHJvZHVjZXMgYCcnYAogICAgICAgICAgICAvLyB3aGljaCByZXN1bHRzIGluIGBhPTEmJmM9MSZjPTJgIGluc3RlYWQgb2YgYGE9MSZjPTEmYz0yYCBpZiB3ZSBkb24ndAogICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXJhbSA9PiBwYXJhbSAhPT0gJycpKQogICAgICAgICAgICAuam9pbignJicpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB1cGRhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsb25lKHVwZGF0ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBIdHRwUGFyYW1zKCgvKiogQHR5cGUgez99ICovICh7IGVuY29kZXI6IHRoaXMuZW5jb2RlciB9KSkpOwogICAgICAgIGNsb25lLmNsb25lRnJvbSA9IHRoaXMuY2xvbmVGcm9tIHx8IHRoaXM7CiAgICAgICAgY2xvbmUudXBkYXRlcyA9ICh0aGlzLnVwZGF0ZXMgfHwgW10pLmNvbmNhdChbdXBkYXRlXSk7CiAgICAgICAgcmV0dXJuIGNsb25lOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5pdCgpIHsKICAgICAgICBpZiAodGhpcy5tYXAgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmNsb25lRnJvbSAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmNsb25lRnJvbS5pbml0KCk7CiAgICAgICAgICAgIHRoaXMuY2xvbmVGcm9tLmtleXMoKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGtleSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5zZXQoa2V5LCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzLmNsb25lRnJvbSkpLm1hcCkpLmdldChrZXkpKSkpKSk7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLnVwZGF0ZXMpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHVwZGF0ZS5vcCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAodXBkYXRlLm9wID09PSAnYScgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5nZXQodXBkYXRlLnBhcmFtKSA6IHVuZGVmaW5lZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlLnZhbHVlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5zZXQodXBkYXRlLnBhcmFtLCBiYXNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGUudmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5nZXQodXBkYXRlLnBhcmFtKSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGJhc2UuaW5kZXhPZih1cGRhdGUudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLnNwbGljZShpZHgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2UubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLnNldCh1cGRhdGUucGFyYW0sIGJhc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZGVsZXRlKHVwZGF0ZS5wYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5kZWxldGUodXBkYXRlLnBhcmFtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5jbG9uZUZyb20gPSB0aGlzLnVwZGF0ZXMgPSBudWxsOwogICAgICAgIH0KICAgIH0KfQovKioKICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIEhUVFAgbWV0aG9kIG1heSBpbmNsdWRlIGEgYm9keS4KICogQHBhcmFtIHs/fSBtZXRob2QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1pZ2h0SGF2ZUJvZHkobWV0aG9kKSB7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICAgIGNhc2UgJ0RFTEVURSc6CiAgICAgICAgY2FzZSAnR0VUJzoKICAgICAgICBjYXNlICdIRUFEJzoKICAgICAgICBjYXNlICdPUFRJT05TJzoKICAgICAgICBjYXNlICdKU09OUCc6CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQovKioKICogU2FmZWx5IGFzc2VydCB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlci4KICoKICogSW4gc29tZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIEFycmF5QnVmZmVyIGlzIG5vdCBkZWZpbmVkLgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbHVlKSB7CiAgICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyOwp9Ci8qKgogKiBTYWZlbHkgYXNzZXJ0IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgQmxvYi4KICoKICogSW4gc29tZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIEJsb2IgaXMgbm90IGRlZmluZWQuCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQmxvYih2YWx1ZSkgewogICAgcmV0dXJuIHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJsb2I7Cn0KLyoqCiAqIFNhZmVseSBhc3NlcnQgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBGb3JtRGF0YSBpbnN0YW5jZS4KICoKICogSW4gc29tZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIEZvcm1EYXRhIGlzIG5vdCBkZWZpbmVkLgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbHVlKSB7CiAgICByZXR1cm4gdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZvcm1EYXRhOwp9Ci8qKgogKiBBbiBvdXRnb2luZyBIVFRQIHJlcXVlc3Qgd2l0aCBhbiBvcHRpb25hbCB0eXBlZCBib2R5LgogKgogKiBgSHR0cFJlcXVlc3RgIHJlcHJlc2VudHMgYW4gb3V0Z29pbmcgcmVxdWVzdCwgaW5jbHVkaW5nIFVSTCwgbWV0aG9kLAogKiBoZWFkZXJzLCBib2R5LCBhbmQgb3RoZXIgcmVxdWVzdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEluc3RhbmNlcyBzaG91bGQgYmUKICogYXNzdW1lZCB0byBiZSBpbW11dGFibGUuIFRvIG1vZGlmeSBhIGBIdHRwUmVxdWVzdGAsIHRoZSBgY2xvbmVgCiAqIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KICoKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIEh0dHBSZXF1ZXN0IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRob2QKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcGFyYW0gez89fSB0aGlyZAogICAgICogQHBhcmFtIHs/PX0gZm91cnRoCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgdXJsLCB0aGlyZCwgZm91cnRoKSB7CiAgICAgICAgdGhpcy51cmwgPSB1cmw7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHJlcXVlc3QgYm9keSwgb3IgYG51bGxgIGlmIG9uZSBpc24ndCBzZXQuCiAgICAgICAgICoKICAgICAgICAgKiBCb2RpZXMgYXJlIG5vdCBlbmZvcmNlZCB0byBiZSBpbW11dGFibGUsIGFzIHRoZXkgY2FuIGluY2x1ZGUgYSByZWZlcmVuY2UgdG8gYW55CiAgICAgICAgICogdXNlci1kZWZpbmVkIGRhdGEgdHlwZS4gSG93ZXZlciwgaW50ZXJjZXB0b3JzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJlc2VydmUKICAgICAgICAgKiBpZGVtcG90ZW5jZSBieSB0cmVhdGluZyB0aGVtIGFzIHN1Y2guCiAgICAgICAgICovCiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBzaG91bGQgYmUgbWFkZSBpbiBhIHdheSB0aGF0IGV4cG9zZXMgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAqCiAgICAgICAgICogUHJvZ3Jlc3MgZXZlbnRzIGFyZSBleHBlbnNpdmUgKGNoYW5nZSBkZXRlY3Rpb24gcnVucyBvbiBlYWNoIGV2ZW50KSBhbmQgc28KICAgICAgICAgKiB0aGV5IHNob3VsZCBvbmx5IGJlIHJlcXVlc3RlZCBpZiB0aGUgY29uc3VtZXIgaW50ZW5kcyB0byBtb25pdG9yIHRoZW0uCiAgICAgICAgICovCiAgICAgICAgdGhpcy5yZXBvcnRQcm9ncmVzcyA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBzZW50IHdpdGggb3V0Z29pbmcgY3JlZGVudGlhbHMgKGNvb2tpZXMpLgogICAgICAgICAqLwogICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGV4cGVjdGVkIHJlc3BvbnNlIHR5cGUgb2YgdGhlIHNlcnZlci4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byBwYXJzZSB0aGUgcmVzcG9uc2UgYXBwcm9wcmlhdGVseSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvCiAgICAgICAgICogdGhlIHJlcXVlc3RlZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlc3BvbnNlVHlwZSA9ICdqc29uJzsKICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpOwogICAgICAgIC8vIE5leHQsIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBhcmd1bWVudCBob2xkcyB0aGUgSHR0cFJlcXVlc3RJbml0CiAgICAgICAgLy8gb3B0aW9ucywgaWYgYW55LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb3B0aW9uczsKICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGEgYm9keSBhcmd1bWVudCBpcyBleHBlY3RlZC4gVGhlIG9ubHkgdmFsaWQgd2F5IHRvIG9taXQKICAgICAgICAvLyB0aGUgYm9keSBhcmd1bWVudCBpcyB0byB1c2UgYSBrbm93biBuby1ib2R5IG1ldGhvZCBsaWtlIEdFVC4KICAgICAgICBpZiAobWlnaHRIYXZlQm9keSh0aGlzLm1ldGhvZCkgfHwgISFmb3VydGgpIHsKICAgICAgICAgICAgLy8gQm9keSBpcyB0aGUgdGhpcmQgYXJndW1lbnQsIG9wdGlvbnMgYXJlIHRoZSBmb3VydGguCiAgICAgICAgICAgIHRoaXMuYm9keSA9ICh0aGlyZCAhPT0gdW5kZWZpbmVkKSA/ICgvKiogQHR5cGUgez99ICovICh0aGlyZCkpIDogbnVsbDsKICAgICAgICAgICAgb3B0aW9ucyA9IGZvdXJ0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIE5vIGJvZHkgcmVxdWlyZWQsIG9wdGlvbnMgYXJlIHRoZSB0aGlyZCBhcmd1bWVudC4gVGhlIGJvZHkgc3RheXMgbnVsbC4KICAgICAgICAgICAgb3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovICh0aGlyZCkpOwogICAgICAgIH0KICAgICAgICAvLyBJZiBvcHRpb25zIGhhdmUgYmVlbiBwYXNzZWQsIGludGVycHJldCB0aGVtLgogICAgICAgIGlmIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSByZXBvcnRQcm9ncmVzcyBhbmQgd2l0aENyZWRlbnRpYWxzLgogICAgICAgICAgICB0aGlzLnJlcG9ydFByb2dyZXNzID0gISFvcHRpb25zLnJlcG9ydFByb2dyZXNzOwogICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9ICEhb3B0aW9ucy53aXRoQ3JlZGVudGlhbHM7CiAgICAgICAgICAgIC8vIE92ZXJyaWRlIGRlZmF1bHQgcmVzcG9uc2UgdHlwZSBvZiAnanNvbicgaWYgb25lIGlzIHByb3ZpZGVkLgogICAgICAgICAgICBpZiAoISFvcHRpb25zLnJlc3BvbnNlVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBPdmVycmlkZSBoZWFkZXJzIGlmIHRoZXkncmUgcHJvdmlkZWQuCiAgICAgICAgICAgIGlmICghIW9wdGlvbnMuaGVhZGVycykgewogICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIW9wdGlvbnMucGFyYW1zKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IG9wdGlvbnMucGFyYW1zOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIG5vIGhlYWRlcnMgaGF2ZSBiZWVuIHBhc3NlZCBpbiwgY29uc3RydWN0IGEgbmV3IEh0dHBIZWFkZXJzIGluc3RhbmNlLgogICAgICAgIGlmICghdGhpcy5oZWFkZXJzKSB7CiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpOwogICAgICAgIH0KICAgICAgICAvLyBJZiBubyBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwYXNzZWQgaW4sIGNvbnN0cnVjdCBhIG5ldyBIdHRwVXJsRW5jb2RlZFBhcmFtcyBpbnN0YW5jZS4KICAgICAgICBpZiAoIXRoaXMucGFyYW1zKSB7CiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTsKICAgICAgICAgICAgdGhpcy51cmxXaXRoUGFyYW1zID0gdXJsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gRW5jb2RlIHRoZSBwYXJhbWV0ZXJzIHRvIGEgc3RyaW5nIGluIHByZXBhcmF0aW9uIGZvciBpbmNsdXNpb24gaW4gdGhlIFVSTC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcy50b1N0cmluZygpOwogICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gTm8gcGFyYW1ldGVycywgdGhlIHZpc2libGUgVVJMIGlzIGp1c3QgdGhlIFVSTCBnaXZlbiBhdCBjcmVhdGlvbiB0aW1lLgogICAgICAgICAgICAgICAgdGhpcy51cmxXaXRoUGFyYW1zID0gdXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgVVJMIGFscmVhZHkgaGF2ZSBxdWVyeSBwYXJhbWV0ZXJzPyBMb29rIGZvciAnPycuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBxSWR4ID0gdXJsLmluZGV4T2YoJz8nKTsKICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSAzIGNhc2VzIHRvIGhhbmRsZToKICAgICAgICAgICAgICAgIC8vIDEpIE5vIGV4aXN0aW5nIHBhcmFtZXRlcnMgLT4gYXBwZW5kICc/JyBmb2xsb3dlZCBieSBwYXJhbXMuCiAgICAgICAgICAgICAgICAvLyAyKSAnPycgZXhpc3RzIGFuZCBpcyBmb2xsb3dlZCBieSBleGlzdGluZyBxdWVyeSBzdHJpbmcgLT4KICAgICAgICAgICAgICAgIC8vICAgIGFwcGVuZCAnJicgZm9sbG93ZWQgYnkgcGFyYW1zLgogICAgICAgICAgICAgICAgLy8gMykgJz8nIGV4aXN0cyBhdCB0aGUgZW5kIG9mIHRoZSB1cmwgLT4gYXBwZW5kIHBhcmFtcyBkaXJlY3RseS4KICAgICAgICAgICAgICAgIC8vIFRoaXMgYmFzaWNhbGx5IGFtb3VudHMgdG8gZGV0ZXJtaW5pbmcgdGhlIGNoYXJhY3RlciwgaWYgYW55LCB3aXRoCiAgICAgICAgICAgICAgICAvLyB3aGljaCB0byBqb2luIHRoZSBVUkwgYW5kIHBhcmFtZXRlcnMuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzZXAgPSBxSWR4ID09PSAtMSA/ICc/JyA6IChxSWR4IDwgdXJsLmxlbmd0aCAtIDEgPyAnJicgOiAnJyk7CiAgICAgICAgICAgICAgICB0aGlzLnVybFdpdGhQYXJhbXMgPSB1cmwgKyBzZXAgKyBwYXJhbXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRyYW5zZm9ybSB0aGUgZnJlZS1mb3JtIGJvZHkgaW50byBhIHNlcmlhbGl6ZWQgZm9ybWF0IHN1aXRhYmxlIGZvcgogICAgICogdHJhbnNtaXNzaW9uIHRvIHRoZSBzZXJ2ZXIuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXJpYWxpemVCb2R5KCkgewogICAgICAgIC8vIElmIG5vIGJvZHkgaXMgcHJlc2VudCwgbm8gbmVlZCB0byBzZXJpYWxpemUgaXQuCiAgICAgICAgaWYgKHRoaXMuYm9keSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYm9keSBpcyBhbHJlYWR5IGluIGEgc2VyaWFsaXplZCBmb3JtLiBJZiBzbywKICAgICAgICAvLyBpdCBjYW4ganVzdCBiZSByZXR1cm5lZCBkaXJlY3RseS4KICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcih0aGlzLmJvZHkpIHx8IGlzQmxvYih0aGlzLmJvZHkpIHx8IGlzRm9ybURhdGEodGhpcy5ib2R5KSB8fAogICAgICAgICAgICB0eXBlb2YgdGhpcy5ib2R5ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5OwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBib2R5IGlzIGFuIGluc3RhbmNlIG9mIEh0dHBVcmxFbmNvZGVkUGFyYW1zLgogICAgICAgIGlmICh0aGlzLmJvZHkgaW5zdGFuY2VvZiBIdHRwUGFyYW1zKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYm9keSBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGFuZCBzZXJpYWxpemUgd2l0aCBKU09OIGlmIHNvLgogICAgICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdGhpcy5ib2R5ID09PSAnYm9vbGVhbicgfHwKICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmJvZHkpKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmJvZHkpOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIGJhY2sgb24gdG9TdHJpbmcoKSBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuYm9keSkpKS50b1N0cmluZygpOwogICAgfQogICAgLyoqCiAgICAgKiBFeGFtaW5lIHRoZSBib2R5IGFuZCBhdHRlbXB0IHRvIGluZmVyIGFuIGFwcHJvcHJpYXRlIE1JTUUgdHlwZQogICAgICogZm9yIGl0LgogICAgICoKICAgICAqIElmIG5vIHN1Y2ggdHlwZSBjYW4gYmUgaW5mZXJyZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGBudWxsYC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCkgewogICAgICAgIC8vIEFuIGVtcHR5IGJvZHkgaGFzIG5vIGNvbnRlbnQgdHlwZS4KICAgICAgICBpZiAodGhpcy5ib2R5ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBGb3JtRGF0YSBib2RpZXMgcmVseSBvbiB0aGUgYnJvd3NlcidzIGNvbnRlbnQgdHlwZSBhc3NpZ25tZW50LgogICAgICAgIGlmIChpc0Zvcm1EYXRhKHRoaXMuYm9keSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIEJsb2JzIHVzdWFsbHkgaGF2ZSB0aGVpciBvd24gY29udGVudCB0eXBlLiBJZiBpdCBkb2Vzbid0LCB0aGVuCiAgICAgICAgLy8gbm8gdHlwZSBjYW4gYmUgaW5mZXJyZWQuCiAgICAgICAgaWYgKGlzQmxvYih0aGlzLmJvZHkpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkudHlwZSB8fCBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBBcnJheSBidWZmZXJzIGhhdmUgdW5rbm93biBjb250ZW50cyBhbmQgdGh1cyBubyB0eXBlIGNhbiBiZSBpbmZlcnJlZC4KICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcih0aGlzLmJvZHkpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBUZWNobmljYWxseSwgc3RyaW5ncyBjb3VsZCBiZSBhIGZvcm0gb2YgSlNPTiBkYXRhLCBidXQgaXQncyBzYWZlIGVub3VnaAogICAgICAgIC8vIHRvIGFzc3VtZSB0aGV5J3JlIHBsYWluIHN0cmluZ3MuCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgIC8vIGBIdHRwVXJsRW5jb2RlZFBhcmFtc2AgaGFzIGl0cyBvd24gY29udGVudC10eXBlLgogICAgICAgIGlmICh0aGlzLmJvZHkgaW5zdGFuY2VvZiBIdHRwUGFyYW1zKSB7CiAgICAgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnOwogICAgICAgIH0KICAgICAgICAvLyBBcnJheXMsIG9iamVjdHMsIGFuZCBudW1iZXJzIHdpbGwgYmUgZW5jb2RlZCBhcyBKU09OLgogICAgICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdGhpcy5ib2R5ID09PSAnbnVtYmVyJyB8fAogICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuYm9keSkpIHsKICAgICAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi9qc29uJzsKICAgICAgICB9CiAgICAgICAgLy8gTm8gdHlwZSBjb3VsZCBiZSBpbmZlcnJlZC4KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gdXBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbG9uZSh1cGRhdGUgPSB7fSkgewogICAgICAgIC8vIEZvciBtZXRob2QsIHVybCwgYW5kIHJlc3BvbnNlVHlwZSwgdGFrZSB0aGUgY3VycmVudCB2YWx1ZSB1bmxlc3MKICAgICAgICAvLyBpdCBpcyBvdmVycmlkZGVuIGluIHRoZSB1cGRhdGUgaGFzaC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0aG9kID0gdXBkYXRlLm1ldGhvZCB8fCB0aGlzLm1ldGhvZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXJsID0gdXBkYXRlLnVybCB8fCB0aGlzLnVybDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdXBkYXRlLnJlc3BvbnNlVHlwZSB8fCB0aGlzLnJlc3BvbnNlVHlwZTsKICAgICAgICAvLyBUaGUgYm9keSBpcyBzb21ld2hhdCBzcGVjaWFsIC0gYSBgbnVsbGAgdmFsdWUgaW4gdXBkYXRlLmJvZHkgbWVhbnMKICAgICAgICAvLyB3aGF0ZXZlciBjdXJyZW50IGJvZHkgaXMgcHJlc2VudCBpcyBiZWluZyBvdmVycmlkZGVuIHdpdGggYW4gZW1wdHkKICAgICAgICAvLyBib2R5LCB3aGVyZWFzIGFuIGB1bmRlZmluZWRgIHZhbHVlIGluIHVwZGF0ZS5ib2R5IGltcGxpZXMgbm8KICAgICAgICAvLyBvdmVycmlkZS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYm9keSA9ICh1cGRhdGUuYm9keSAhPT0gdW5kZWZpbmVkKSA/IHVwZGF0ZS5ib2R5IDogdGhpcy5ib2R5OwogICAgICAgIC8vIENhcmVmdWxseSBoYW5kbGUgdGhlIGJvb2xlYW4gb3B0aW9ucyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4KICAgICAgICAvLyBgZmFsc2VgIGFuZCBgdW5kZWZpbmVkYCBpbiB0aGUgdXBkYXRlIGFyZ3MuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdpdGhDcmVkZW50aWFscyA9ICh1cGRhdGUud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpID8gdXBkYXRlLndpdGhDcmVkZW50aWFscyA6IHRoaXMud2l0aENyZWRlbnRpYWxzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXBvcnRQcm9ncmVzcyA9ICh1cGRhdGUucmVwb3J0UHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCkgPyB1cGRhdGUucmVwb3J0UHJvZ3Jlc3MgOiB0aGlzLnJlcG9ydFByb2dyZXNzOwogICAgICAgIC8vIEhlYWRlcnMgYW5kIHBhcmFtcyBtYXkgYmUgYXBwZW5kZWQgdG8gaWYgYHNldEhlYWRlcnNgIG9yCiAgICAgICAgLy8gYHNldFBhcmFtc2AgYXJlIHVzZWQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBoZWFkZXJzID0gdXBkYXRlLmhlYWRlcnMgfHwgdGhpcy5oZWFkZXJzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyYW1zID0gdXBkYXRlLnBhcmFtcyB8fCB0aGlzLnBhcmFtczsKICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjYWxsZXIgaGFzIGFza2VkIHRvIGFkZCBoZWFkZXJzLgogICAgICAgIGlmICh1cGRhdGUuc2V0SGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIC8vIFNldCBldmVyeSByZXF1ZXN0ZWQgaGVhZGVyLgogICAgICAgICAgICBoZWFkZXJzID0KICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZS5zZXRIZWFkZXJzKQogICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBoZWFkZXJzCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChoZWFkZXJzLCBuYW1lKSA9PiBoZWFkZXJzLnNldChuYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlLnNldEhlYWRlcnMpKVtuYW1lXSkpLCBoZWFkZXJzKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY2FsbGVyIGhhcyBhc2tlZCB0byBzZXQgcGFyYW1zLgogICAgICAgIGlmICh1cGRhdGUuc2V0UGFyYW1zKSB7CiAgICAgICAgICAgIC8vIFNldCBldmVyeSByZXF1ZXN0ZWQgcGFyYW0uCiAgICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5rZXlzKHVwZGF0ZS5zZXRQYXJhbXMpCiAgICAgICAgICAgICAgICAucmVkdWNlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHBhcmFtcywgcGFyYW0pID0+IHBhcmFtcy5zZXQocGFyYW0sICgvKiogQHR5cGUgez99ICovICh1cGRhdGUuc2V0UGFyYW1zKSlbcGFyYW1dKSksIHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEZpbmFsbHksIGNvbnN0cnVjdCB0aGUgbmV3IEh0dHBSZXF1ZXN0IHVzaW5nIHRoZSBwaWVjZXMgZnJvbSBhYm92ZS4KICAgICAgICByZXR1cm4gbmV3IEh0dHBSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCB7CiAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgaGVhZGVycywKICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3MsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZSwKICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzLAogICAgICAgIH0pOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vaHR0cC9zcmMvcmVzcG9uc2UudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IEh0dHBFdmVudFR5cGUgPSB7CiAgICAvKioKICAgICAqIFRoZSByZXF1ZXN0IHdhcyBzZW50IG91dCBvdmVyIHRoZSB3aXJlLgogICAgICovCiAgICBTZW50OiAwLAogICAgLyoqCiAgICAgKiBBbiB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnQgd2FzIHJlY2VpdmVkLgogICAgICovCiAgICBVcGxvYWRQcm9ncmVzczogMSwKICAgIC8qKgogICAgICogVGhlIHJlc3BvbnNlIHN0YXR1cyBjb2RlIGFuZCBoZWFkZXJzIHdlcmUgcmVjZWl2ZWQuCiAgICAgKi8KICAgIFJlc3BvbnNlSGVhZGVyOiAyLAogICAgLyoqCiAgICAgKiBBIGRvd25sb2FkIHByb2dyZXNzIGV2ZW50IHdhcyByZWNlaXZlZC4KICAgICAqLwogICAgRG93bmxvYWRQcm9ncmVzczogMywKICAgIC8qKgogICAgICogVGhlIGZ1bGwgcmVzcG9uc2UgaW5jbHVkaW5nIHRoZSBib2R5IHdhcyByZWNlaXZlZC4KICAgICAqLwogICAgUmVzcG9uc2U6IDQsCiAgICAvKioKICAgICAqIEEgY3VzdG9tIGV2ZW50IGZyb20gYW4gaW50ZXJjZXB0b3Igb3IgYSBiYWNrZW5kLgogICAgICovCiAgICBVc2VyOiA1LAp9OwpIdHRwRXZlbnRUeXBlW0h0dHBFdmVudFR5cGUuU2VudF0gPSAnU2VudCc7Ckh0dHBFdmVudFR5cGVbSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzc10gPSAnVXBsb2FkUHJvZ3Jlc3MnOwpIdHRwRXZlbnRUeXBlW0h0dHBFdmVudFR5cGUuUmVzcG9uc2VIZWFkZXJdID0gJ1Jlc3BvbnNlSGVhZGVyJzsKSHR0cEV2ZW50VHlwZVtIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3NdID0gJ0Rvd25sb2FkUHJvZ3Jlc3MnOwpIdHRwRXZlbnRUeXBlW0h0dHBFdmVudFR5cGUuUmVzcG9uc2VdID0gJ1Jlc3BvbnNlJzsKSHR0cEV2ZW50VHlwZVtIdHRwRXZlbnRUeXBlLlVzZXJdID0gJ1VzZXInOwovKioKICogQmFzZSBjbGFzcyBmb3IgYm90aCBgSHR0cFJlc3BvbnNlYCBhbmQgYEh0dHBIZWFkZXJSZXNwb25zZWAuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgSHR0cFJlc3BvbnNlQmFzZSB7CiAgICAvKioKICAgICAqIFN1cGVyLWNvbnN0cnVjdG9yIGZvciBhbGwgcmVzcG9uc2VzLgogICAgICoKICAgICAqIFRoZSBzaW5nbGUgcGFyYW1ldGVyIGFjY2VwdGVkIGlzIGFuIGluaXRpYWxpemF0aW9uIGhhc2guIEFueSBwcm9wZXJ0aWVzCiAgICAgKiBvZiB0aGUgcmVzcG9uc2UgcGFzc2VkIHRoZXJlIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLgogICAgICogQHBhcmFtIHs/fSBpbml0CiAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0U3RhdHVzCiAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0U3RhdHVzVGV4dAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihpbml0LCBkZWZhdWx0U3RhdHVzID0gMjAwLCBkZWZhdWx0U3RhdHVzVGV4dCA9ICdPSycpIHsKICAgICAgICAvLyBJZiB0aGUgaGFzaCBoYXMgdmFsdWVzIHBhc3NlZCwgdXNlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgcmVzcG9uc2UuCiAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgdGhpcy5oZWFkZXJzID0gaW5pdC5oZWFkZXJzIHx8IG5ldyBIdHRwSGVhZGVycygpOwogICAgICAgIHRoaXMuc3RhdHVzID0gaW5pdC5zdGF0dXMgIT09IHVuZGVmaW5lZCA/IGluaXQuc3RhdHVzIDogZGVmYXVsdFN0YXR1czsKICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHQgfHwgZGVmYXVsdFN0YXR1c1RleHQ7CiAgICAgICAgdGhpcy51cmwgPSBpbml0LnVybCB8fCBudWxsOwogICAgICAgIC8vIENhY2hlIHRoZSBvayB2YWx1ZSB0byBhdm9pZCBkZWZpbmluZyBhIGdldHRlci4KICAgICAgICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwOwogICAgfQp9Ci8qKgogKiBBIHBhcnRpYWwgSFRUUCByZXNwb25zZSB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBzdGF0dXMgYW5kIGhlYWRlciBkYXRhLAogKiBidXQgbm8gcmVzcG9uc2UgYm9keS4KICoKICogYEh0dHBIZWFkZXJSZXNwb25zZWAgaXMgYSBgSHR0cEV2ZW50YCBhdmFpbGFibGUgb24gdGhlIHJlc3BvbnNlCiAqIGV2ZW50IHN0cmVhbSwgb25seSB3aGVuIHByb2dyZXNzIGV2ZW50cyBhcmUgcmVxdWVzdGVkLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSHR0cEhlYWRlclJlc3BvbnNlIGV4dGVuZHMgSHR0cFJlc3BvbnNlQmFzZSB7CiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBgSHR0cEhlYWRlclJlc3BvbnNlYCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHs/PX0gaW5pdAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihpbml0ID0ge30pIHsKICAgICAgICBzdXBlcihpbml0KTsKICAgICAgICB0aGlzLnR5cGUgPSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlSGVhZGVyOwogICAgfQogICAgLyoqCiAgICAgKiBDb3B5IHRoaXMgYEh0dHBIZWFkZXJSZXNwb25zZWAsIG92ZXJyaWRpbmcgaXRzIGNvbnRlbnRzIHdpdGggdGhlCiAgICAgKiBnaXZlbiBwYXJhbWV0ZXIgaGFzaC4KICAgICAqIEBwYXJhbSB7Pz19IHVwZGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xvbmUodXBkYXRlID0ge30pIHsKICAgICAgICAvLyBQZXJmb3JtIGEgc3RyYWlnaHRmb3J3YXJkIGluaXRpYWxpemF0aW9uIG9mIHRoZSBuZXcgSHR0cEhlYWRlclJlc3BvbnNlLAogICAgICAgIC8vIG92ZXJyaWRpbmcgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyB3aXRoIG5ldyBvbmVzIGlmIGdpdmVuLgogICAgICAgIHJldHVybiBuZXcgSHR0cEhlYWRlclJlc3BvbnNlKHsKICAgICAgICAgICAgaGVhZGVyczogdXBkYXRlLmhlYWRlcnMgfHwgdGhpcy5oZWFkZXJzLAogICAgICAgICAgICBzdGF0dXM6IHVwZGF0ZS5zdGF0dXMgIT09IHVuZGVmaW5lZCA/IHVwZGF0ZS5zdGF0dXMgOiB0aGlzLnN0YXR1cywKICAgICAgICAgICAgc3RhdHVzVGV4dDogdXBkYXRlLnN0YXR1c1RleHQgfHwgdGhpcy5zdGF0dXNUZXh0LAogICAgICAgICAgICB1cmw6IHVwZGF0ZS51cmwgfHwgdGhpcy51cmwgfHwgdW5kZWZpbmVkLAogICAgICAgIH0pOwogICAgfQp9Ci8qKgogKiBBIGZ1bGwgSFRUUCByZXNwb25zZSwgaW5jbHVkaW5nIGEgdHlwZWQgcmVzcG9uc2UgYm9keSAod2hpY2ggbWF5IGJlIGBudWxsYAogKiBpZiBvbmUgd2FzIG5vdCByZXR1cm5lZCkuCiAqCiAqIGBIdHRwUmVzcG9uc2VgIGlzIGEgYEh0dHBFdmVudGAgYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZSBldmVudAogKiBzdHJlYW0uCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBIdHRwUmVzcG9uc2UgZXh0ZW5kcyBIdHRwUmVzcG9uc2VCYXNlIHsKICAgIC8qKgogICAgICogQ29uc3RydWN0IGEgbmV3IGBIdHRwUmVzcG9uc2VgLgogICAgICogQHBhcmFtIHs/PX0gaW5pdAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihpbml0ID0ge30pIHsKICAgICAgICBzdXBlcihpbml0KTsKICAgICAgICB0aGlzLnR5cGUgPSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlOwogICAgICAgIHRoaXMuYm9keSA9IGluaXQuYm9keSAhPT0gdW5kZWZpbmVkID8gaW5pdC5ib2R5IDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gdXBkYXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbG9uZSh1cGRhdGUgPSB7fSkgewogICAgICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHsKICAgICAgICAgICAgYm9keTogKHVwZGF0ZS5ib2R5ICE9PSB1bmRlZmluZWQpID8gdXBkYXRlLmJvZHkgOiB0aGlzLmJvZHksCiAgICAgICAgICAgIGhlYWRlcnM6IHVwZGF0ZS5oZWFkZXJzIHx8IHRoaXMuaGVhZGVycywKICAgICAgICAgICAgc3RhdHVzOiAodXBkYXRlLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSA/IHVwZGF0ZS5zdGF0dXMgOiB0aGlzLnN0YXR1cywKICAgICAgICAgICAgc3RhdHVzVGV4dDogdXBkYXRlLnN0YXR1c1RleHQgfHwgdGhpcy5zdGF0dXNUZXh0LAogICAgICAgICAgICB1cmw6IHVwZGF0ZS51cmwgfHwgdGhpcy51cmwgfHwgdW5kZWZpbmVkLAogICAgICAgIH0pOwogICAgfQp9Ci8qKgogKiBBIHJlc3BvbnNlIHRoYXQgcmVwcmVzZW50cyBhbiBlcnJvciBvciBmYWlsdXJlLCBlaXRoZXIgZnJvbSBhCiAqIG5vbi1zdWNjZXNzZnVsIEhUVFAgc3RhdHVzLCBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIHJlcXVlc3QsCiAqIG9yIHNvbWUgb3RoZXIgZmFpbHVyZSB3aGljaCBvY2N1cnJlZCBkdXJpbmcgdGhlIHBhcnNpbmcgb2YgdGhlIHJlc3BvbnNlLgogKgogKiBBbnkgZXJyb3IgcmV0dXJuZWQgb24gdGhlIGBPYnNlcnZhYmxlYCByZXNwb25zZSBzdHJlYW0gd2lsbCBiZQogKiB3cmFwcGVkIGluIGFuIGBIdHRwRXJyb3JSZXNwb25zZWAgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGNvbnRleHQgYWJvdXQKICogdGhlIHN0YXRlIG9mIHRoZSBIVFRQIGxheWVyIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkLiBUaGUgZXJyb3IgcHJvcGVydHkKICogd2lsbCBjb250YWluIGVpdGhlciBhIHdyYXBwZWQgRXJyb3Igb2JqZWN0IG9yIHRoZSBlcnJvciByZXNwb25zZSByZXR1cm5lZAogKiBmcm9tIHRoZSBzZXJ2ZXIuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIdHRwRXJyb3JSZXNwb25zZSBleHRlbmRzIEh0dHBSZXNwb25zZUJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluaXQKICAgICAqLwogICAgY29uc3RydWN0b3IoaW5pdCkgewogICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBhIGRlZmF1bHQgc3RhdHVzIG9mIDAgLyBVbmtub3duIEVycm9yLgogICAgICAgIHN1cGVyKGluaXQsIDAsICdVbmtub3duIEVycm9yJyk7CiAgICAgICAgdGhpcy5uYW1lID0gJ0h0dHBFcnJvclJlc3BvbnNlJzsKICAgICAgICAvKioKICAgICAgICAgKiBFcnJvcnMgYXJlIG5ldmVyIG9rYXksIGV2ZW4gd2hlbiB0aGUgc3RhdHVzIGNvZGUgaXMgaW4gdGhlIDJ4eCBzdWNjZXNzIHJhbmdlLgogICAgICAgICAqLwogICAgICAgIHRoaXMub2sgPSBmYWxzZTsKICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWwsIHRoZW4gdGhpcyB3YXMgYSBwYXJzZSBlcnJvci4gT3RoZXJ3aXNlLCBpdCB3YXMKICAgICAgICAvLyBhIHByb3RvY29sLWxldmVsIGZhaWx1cmUgb2Ygc29tZSBzb3J0LiBFaXRoZXIgdGhlIHJlcXVlc3QgZmFpbGVkIGluIHRyYW5zaXQKICAgICAgICAvLyBvciB0aGUgc2VydmVyIHJldHVybmVkIGFuIHVuc3VjY2Vzc2Z1bCBzdGF0dXMgY29kZS4KICAgICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwKSB7CiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGBIdHRwIGZhaWx1cmUgZHVyaW5nIHBhcnNpbmcgZm9yICR7aW5pdC51cmwgfHwgJyh1bmtub3duIHVybCknfWA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBgSHR0cCBmYWlsdXJlIHJlc3BvbnNlIGZvciAke2luaXQudXJsIHx8ICcodW5rbm93biB1cmwpJ306ICR7aW5pdC5zdGF0dXN9ICR7aW5pdC5zdGF0dXNUZXh0fWA7CiAgICAgICAgfQogICAgICAgIHRoaXMuZXJyb3IgPSBpbml0LmVycm9yIHx8IG51bGw7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9odHRwL3NyYy9jbGllbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgYEh0dHBSZXF1ZXN0T3B0aW9uczxUPmAgZnJvbSBhIHNvdXJjZSBgSHR0cE1ldGhvZE9wdGlvbnNgIGFuZAogKiB0aGUgZ2l2ZW4gYGJvZHlgLiBUaGlzIGZ1bmN0aW9uIGNsb25lcyB0aGUgb2JqZWN0IGFuZCBhZGRzIHRoZSBib2R5LgogKgogKiBOb3RlIHRoYXQgdGhlIGByZXNwb25zZVR5cGVgICpvcHRpb25zKiB2YWx1ZSBpcyBhIFN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlCiAqIHNpbmdsZSBkYXRhIHR5cGUgb2YgdGhlIHJlc3BvbnNlLgogKiBBIHNpbmdsZSBvdmVybG9hZCB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgaGFuZGxlcyBlYWNoIHJlc3BvbnNlIHR5cGUuCiAqIFRoZSB2YWx1ZSBvZiBgcmVzcG9uc2VUeXBlYCBjYW5ub3QgYmUgYSB1bmlvbiwgYXMgdGhlIGNvbWJpbmVkIHNpZ25hdHVyZSBjb3VsZCBpbXBseS4KICoKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBvcHRpb25zCiAqIEBwYXJhbSB7P30gYm9keQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWRkQm9keShvcHRpb25zLCBib2R5KSB7CiAgICByZXR1cm4gewogICAgICAgIGJvZHksCiAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLAogICAgICAgIG9ic2VydmU6IG9wdGlvbnMub2JzZXJ2ZSwKICAgICAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLAogICAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLAogICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsCiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zLndpdGhDcmVkZW50aWFscywKICAgIH07Cn0KLyoqCiAqIFBlcmZvcm1zIEhUVFAgcmVxdWVzdHMuCiAqIFRoaXMgc2VydmljZSBpcyBhdmFpbGFibGUgYXMgYW4gaW5qZWN0YWJsZSBjbGFzcywgd2l0aCBtZXRob2RzIHRvIHBlcmZvcm0gSFRUUCByZXF1ZXN0cy4KICogRWFjaCByZXF1ZXN0IG1ldGhvZCBoYXMgbXVsdGlwbGUgc2lnbmF0dXJlcywgYW5kIHRoZSByZXR1cm4gdHlwZSB2YXJpZXMgYmFzZWQgb24KICogdGhlIHNpZ25hdHVyZSB0aGF0IGlzIGNhbGxlZCAobWFpbmx5IHRoZSB2YWx1ZXMgb2YgYG9ic2VydmVgIGFuZCBgcmVzcG9uc2VUeXBlYCkuCiAqCiAqIE5vdGUgdGhhdCB0aGUgYHJlc3BvbnNlVHlwZWAgKm9wdGlvbnMqIHZhbHVlIGlzIGEgU3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUKICogc2luZ2xlIGRhdGEgdHlwZSBvZiB0aGUgcmVzcG9uc2UuCiAqIEEgc2luZ2xlIG92ZXJsb2FkIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBoYW5kbGVzIGVhY2ggcmVzcG9uc2UgdHlwZS4KICogVGhlIHZhbHVlIG9mIGByZXNwb25zZVR5cGVgIGNhbm5vdCBiZSBhIHVuaW9uLCBhcyB0aGUgY29tYmluZWQgc2lnbmF0dXJlIGNvdWxkIGltcGx5LgogKgogKiBcQHVzYWdlTm90ZXMKICogU2FtcGxlIEhUVFAgcmVxdWVzdHMgZm9yIHRoZSBbVG91ciBvZiBIZXJvZXNdKC90dXRvcmlhbC90b2gtcHQwKSBhcHBsaWNhdGlvbi4KICoKICogIyMjIEhUVFAgUmVxdWVzdCBFeGFtcGxlCiAqCiAqIGBgYAogKiAgLy8gR0VUIGhlcm9lcyB3aG9zZSBuYW1lIGNvbnRhaW5zIHNlYXJjaCB0ZXJtCiAqIHNlYXJjaEhlcm9lcyh0ZXJtOiBzdHJpbmcpOiBvYnNlcnZhYmxlPEhlcm9bXT57CiAqCiAqICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogJ25hbWU9dGVybSd9KTsKICogICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0KCdHRVQnLCB0aGlzLmhlcm9lc1VybCwge3Jlc3BvbnNlVHlwZTonanNvbicsIHBhcmFtc30pOwogKiB9CiAqIGBgYAogKiAjIyMgSlNPTlAgRXhhbXBsZQogKiBgYGAKICogcmVxdWVzdEpzb25wKHVybCwgY2FsbGJhY2sgPSAnY2FsbGJhY2snKSB7CiAqICByZXR1cm4gdGhpcy5odHRwQ2xpZW50Lmpzb25wKHRoaXMuaGVyb2VzVVJMLCBjYWxsYmFjayk7CiAqIH0KICogYGBgCiAqCiAqICMjIyBQQVRDSCBFeGFtcGxlCiAqIGBgYAogKiAvLyBQQVRDSCBvbmUgb2YgdGhlIGhlcm9lcycgbmFtZQogKiBwYXRjaEhlcm8gKGlkOiBudW1iZXIsIGhlcm9OYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHt9PiB7CiAqIGNvbnN0IHVybCA9IGAke3RoaXMuaGVyb2VzVXJsfS8ke2lkfWA7ICAgLy8gUEFUQ0ggYXBpL2hlcm9lcy80MgogKiAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wYXRjaCh1cmwsIHtuYW1lOiBoZXJvTmFtZX0sIGh0dHBPcHRpb25zKQogKiAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ3BhdGNoSGVybycpKSk7CiAqIH0KICogYGBgCiAqCiAqIEBzZWUgW0hUVFAgR3VpZGVdKGd1aWRlL2h0dHApCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIdHRwQ2xpZW50IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBoYW5kbGVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGhhbmRsZXIpIHsKICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgZm9yIGEgZ2VuZXJpYyBIVFRQIHJlcXVlc3QgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLAogICAgICogZmlyZXMgdGhlIHJlcXVlc3QgdGhyb3VnaCB0aGUgY2hhaW4gb2YgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnMgYW5kIG9uIHRvIHRoZQogICAgICogc2VydmVyLgogICAgICoKICAgICAqIFlvdSBjYW4gcGFzcyBhbiBgSHR0cFJlcXVlc3RgIGRpcmVjdGx5IGFzIHRoZSBvbmx5IHBhcmFtZXRlci4gSW4gdGhpcyBjYXNlLAogICAgICogdGhlIGNhbGwgcmV0dXJucyBhbiBvYnNlcnZhYmxlIG9mIHRoZSByYXcgYEh0dHBFdmVudGAgc3RyZWFtLgogICAgICoKICAgICAqIEFsdGVybmF0aXZlbHkgeW91IGNhbiBwYXNzIGFuIEhUVFAgbWV0aG9kIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsCiAgICAgKiBhIFVSTCBzdHJpbmcgYXMgdGhlIHNlY29uZCwgYW5kIGFuIG9wdGlvbnMgaGFzaCBjb250YWluaW5nIHRoZSByZXF1ZXN0IGJvZHkgYXMgdGhlIHRoaXJkLgogICAgICogU2VlIGBhZGRCb2R5KClgLiBJbiB0aGlzIGNhc2UsIHRoZSBzcGVjaWZpZWQgYHJlc3BvbnNlVHlwZWAgYW5kIGBvYnNlcnZlYCBvcHRpb25zIGRldGVybWluZSB0aGUKICAgICAqIHR5cGUgb2YgcmV0dXJuZWQgb2JzZXJ2YWJsZS4KICAgICAqICAgKiBUaGUgYHJlc3BvbnNlVHlwZWAgdmFsdWUgZGV0ZXJtaW5lcyBob3cgYSBzdWNjZXNzZnVsIHJlc3BvbnNlIGJvZHkgaXMgcGFyc2VkLgogICAgICogICAqIElmIGByZXNwb25zZVR5cGVgIGlzIHRoZSBkZWZhdWx0IGBqc29uYCwgeW91IGNhbiBwYXNzIGEgdHlwZSBpbnRlcmZhY2UgZm9yIHRoZSByZXN1bHRpbmcKICAgICAqIG9iamVjdCBhcyBhIHR5cGUgcGFyYW1ldGVyIHRvIHRoZSBjYWxsLgogICAgICoKICAgICAqIFRoZSBgb2JzZXJ2ZWAgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgcmV0dXJuIHR5cGUsIGFjY29yZGluZyB0byB3aGF0IHlvdSBhcmUgaW50ZXJlc3RlZCBpbgogICAgICogb2JzZXJ2aW5nLgogICAgICogICAqIEFuIGBvYnNlcnZlYCB2YWx1ZSBvZiBldmVudHMgcmV0dXJucyBhbiBvYnNlcnZhYmxlIG9mIHRoZSByYXcgYEh0dHBFdmVudGAgc3RyZWFtLCBpbmNsdWRpbmcKICAgICAqIHByb2dyZXNzIGV2ZW50cyBieSBkZWZhdWx0LgogICAgICogICAqIEFuIGBvYnNlcnZlYCB2YWx1ZSBvZiByZXNwb25zZSByZXR1cm5zIGFuIG9ic2VydmFibGUgb2YgYEh0dHBSZXNwb25zZTxUPmAsCiAgICAgKiB3aGVyZSB0aGUgYFRgIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBgcmVzcG9uc2VUeXBlYCBhbmQgYW55IG9wdGlvbmFsbHkgcHJvdmlkZWQgdHlwZQogICAgICogcGFyYW1ldGVyLgogICAgICogICAqIEFuIGBvYnNlcnZlYCB2YWx1ZSBvZiBib2R5IHJldHVybnMgYW4gb2JzZXJ2YWJsZSBvZiBgPFQ+YCB3aXRoIHRoZSBzYW1lIGBUYCBib2R5IHR5cGUuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBmaXJzdAogICAgICogQHBhcmFtIHs/PX0gdXJsCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXF1ZXN0KGZpcnN0LCB1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVxOwogICAgICAgIC8vIEZpcnN0LCBjaGVjayB3aGV0aGVyIHRoZSBwcmltYXJ5IGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBIdHRwUmVxdWVzdGAuCiAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgSHR0cFJlcXVlc3QpIHsKICAgICAgICAgICAgLy8gSXQgaXMuIFRoZSBvdGhlciBhcmd1bWVudHMgbXVzdCBiZSB1bmRlZmluZWQgKHBlciB0aGUgc2lnbmF0dXJlcykgYW5kIGNhbiBiZQogICAgICAgICAgICAvLyBpZ25vcmVkLgogICAgICAgICAgICByZXEgPSBmaXJzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIEl0J3MgYSBzdHJpbmcsIHNvIGl0IHJlcHJlc2VudHMgYSBVUkwuIENvbnN0cnVjdCBhIHJlcXVlc3QgYmFzZWQgb24gaXQsCiAgICAgICAgICAgIC8vIGFuZCBpbmNvcnBvcmF0ZSB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyAoYXNzdW1pbmcgYEdFVGAgdW5sZXNzIGEgbWV0aG9kIGlzCiAgICAgICAgICAgIC8vIHByb3ZpZGVkLgogICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBoZWFkZXJzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSHR0cEhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU29ydCBvdXQgcGFyYW1ldGVycy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGFyYW1zID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoISFvcHRpb25zLnBhcmFtcykgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1zIGluc3RhbmNlb2YgSHR0cFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKC8qKiBAdHlwZSB7P30gKi8gKHsgZnJvbU9iamVjdDogb3B0aW9ucy5wYXJhbXMgfSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIHJlcSA9IG5ldyBIdHRwUmVxdWVzdChmaXJzdCwgKC8qKiBAdHlwZSB7P30gKi8gKHVybCkpLCAob3B0aW9ucy5ib2R5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJvZHkgOiBudWxsKSwgewogICAgICAgICAgICAgICAgaGVhZGVycywKICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLAogICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgSlNPTiBpcyBhc3N1bWVkIHRvIGJlIHJldHVybmVkIGZvciBhbGwgY2FsbHMuCiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlIHx8ICdqc29uJywKICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBTdGFydCB3aXRoIGFuIE9ic2VydmFibGUub2YoKSB0aGUgaW5pdGlhbCByZXF1ZXN0LCBhbmQgcnVuIHRoZSBoYW5kbGVyICh3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIGFsbCBpbnRlcmNlcHRvcnMpIGluc2lkZSBhIGNvbmNhdE1hcCgpLiBUaGlzIHdheSwgdGhlIGhhbmRsZXIgcnVucwogICAgICAgIC8vIGluc2lkZSBhbiBPYnNlcnZhYmxlIGNoYWluLCB3aGljaCBjYXVzZXMgaW50ZXJjZXB0b3JzIHRvIGJlIHJlLXJ1biBvbiBldmVyeQogICAgICAgIC8vIHN1YnNjcmlwdGlvbiAodGhpcyBhbHNvIG1ha2VzIHJldHJpZXMgcmUtcnVuIHRoZSBoYW5kbGVyLCBpbmNsdWRpbmcgaW50ZXJjZXB0b3JzKS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXZlbnRzJCA9IG9mKHJlcSkucGlwZShjb25jYXRNYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVxCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVxKSA9PiB0aGlzLmhhbmRsZXIuaGFuZGxlKHJlcSkpKSk7CiAgICAgICAgLy8gSWYgY29taW5nIHZpYSB0aGUgQVBJIHNpZ25hdHVyZSB3aGljaCBhY2NlcHRzIGEgcHJldmlvdXNseSBjb25zdHJ1Y3RlZCBIdHRwUmVxdWVzdCwKICAgICAgICAvLyB0aGUgb25seSBvcHRpb24gaXMgdG8gZ2V0IHRoZSBldmVudCBzdHJlYW0uIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBldmVudCBzdHJlYW0gaWYKICAgICAgICAvLyB0aGF0IGlzIHdoYXQgd2FzIHJlcXVlc3RlZC4KICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBIdHRwUmVxdWVzdCB8fCBvcHRpb25zLm9ic2VydmUgPT09ICdldmVudHMnKSB7CiAgICAgICAgICAgIHJldHVybiBldmVudHMkOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIHN0cmVhbSBjb250YWlucyBlaXRoZXIgdGhlIGZ1bGwgcmVzcG9uc2Ugb3IgdGhlIGJvZHkuIEluIGVpdGhlcgogICAgICAgIC8vIGNhc2UsIHRoZSBmaXJzdCBzdGVwIGlzIHRvIGZpbHRlciB0aGUgZXZlbnQgc3RyZWFtIHRvIGV4dHJhY3QgYSBzdHJlYW0gb2YKICAgICAgICAvLyByZXNwb25zZXMocykuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlcyQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnRzJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkpKSkpOwogICAgICAgIC8vIERlY2lkZSB3aGljaCBzdHJlYW0gdG8gcmV0dXJuLgogICAgICAgIHN3aXRjaCAob3B0aW9ucy5vYnNlcnZlIHx8ICdib2R5JykgewogICAgICAgICAgICBjYXNlICdib2R5JzoKICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgc3RyZWFtIGlzIHRoZSBib2R5LiBNYXAgdGhlIHJlc3BvbnNlIHN0cmVhbSB0byB0aGUgcmVzcG9uc2UKICAgICAgICAgICAgICAgIC8vIGJvZHkuIFRoaXMgY291bGQgYmUgZG9uZSBtb3JlIHNpbXBseSwgYnV0IGEgbWlzYmVoYXZpbmcgaW50ZXJjZXB0b3IgbWlnaHQKICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgcmVzcG9uc2UgYm9keSBpbnRvIGEgZGlmZmVyZW50IGZvcm1hdCBhbmQgaWdub3JlIHRoZSByZXF1ZXN0ZWQKICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlVHlwZS4gR3VhcmQgYWdhaW5zdCB0aGlzIGJ5IHZhbGlkYXRpbmcgdGhhdCB0aGUgcmVzcG9uc2UgaXMgb2YgdGhlCiAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgdHlwZS4KICAgICAgICAgICAgICAgIHN3aXRjaCAocmVxLnJlc3BvbnNlVHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgYm9keSBpcyBhbiBBcnJheUJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuYm9keSAhPT0gbnVsbCAmJiAhKHJlcy5ib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBpcyBub3QgYW4gQXJyYXlCdWZmZXIuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZXMKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGJvZHkgaXMgYSBCbG9iLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5ib2R5ICE9PSBudWxsICYmICEocmVzLmJvZHkgaW5zdGFuY2VvZiBCbG9iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgaXMgbm90IGEgQmxvYi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgYm9keSBpcyBhIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuYm9keSAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzLmJvZHkgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBpcyBub3QgYSBzdHJpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnanNvbic6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gdmFsaWRhdGlvbiBuZWVkZWQgZm9yIEpTT04gcmVzcG9uc2VzLCBhcyB0aGV5IGNhbiBiZSBvZiBhbnkgdHlwZS4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKHJlcykgPT4gcmVzLmJvZHkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgJ3Jlc3BvbnNlJzoKICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBzdHJlYW0gd2FzIHJlcXVlc3RlZCBkaXJlY3RseSwgc28gcmV0dXJuIGl0LgogICAgICAgICAgICAgICAgcmV0dXJuIHJlcyQ7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IG5ldyBmdXR1cmUgb2JzZXJ2ZSB0eXBlcyBiZWluZyBhZGRlZC4KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWFjaGFibGU6IHVuaGFuZGxlZCBvYnNlcnZlIHR5cGUgJHtvcHRpb25zLm9ic2VydmV9fWApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBvYnNlcnZhYmxlIHRoYXQsIHdoZW4gc3Vic2NyaWJlZCwgY2F1c2VzIHRoZSBjb25maWd1cmVkCiAgICAgKiBgREVMRVRFYCByZXF1ZXN0IHRvIGV4ZWN1dGUgb24gdGhlIHNlcnZlci4gU2VlIHRoZSBpbmRpdmlkdWFsIG92ZXJsb2FkcyBmb3IKICAgICAqIGRldGFpbHMgb24gdGhlIHJldHVybiB0eXBlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdXJsICAgICBUaGUgZW5kcG9pbnQgVVJMLgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBUaGUgSFRUUCBvcHRpb25zIHRvIHNlbmQgd2l0aCB0aGUgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZWxldGUodXJsLCBvcHRpb25zID0ge30pIHsKICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCB1cmwsICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAqIGBHRVRgIHJlcXVlc3QgdG8gZXhlY3V0ZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICogZGV0YWlscyBvbiB0aGUgcmV0dXJuIHR5cGUuCiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHVybCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgdXJsLCAoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9ucykpKTsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBvYnNlcnZhYmxlIHRoYXQsIHdoZW4gc3Vic2NyaWJlZCwgY2F1c2VzIHRoZSBjb25maWd1cmVkCiAgICAgKiBgSEVBRGAgcmVxdWVzdCB0byBleGVjdXRlIG9uIHRoZSBzZXJ2ZXIuIFRoZSBgSEVBRGAgbWV0aG9kIHJldHVybnMKICAgICAqIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZQogICAgICogcmVzb3VyY2UgaXRzZWxmLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICogZGV0YWlscyBvbiB0aGUgcmV0dXJuIHR5cGUuCiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaGVhZCh1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0hFQUQnLCB1cmwsICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIGBPYnNlcnZhYmxlYCB0aGF0LCB3aGVuIHN1YnNjcmliZWQsIGNhdXNlcyBhIHJlcXVlc3Qgd2l0aCB0aGUgc3BlY2lhbCBtZXRob2QKICAgICAqIGBKU09OUGAgdG8gYmUgZGlzcGF0Y2hlZCB2aWEgdGhlIGludGVyY2VwdG9yIHBpcGVsaW5lLgogICAgICogVGhlIFtKU09OUCBwYXR0ZXJuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUCkgd29ya3MgYXJvdW5kIGxpbWl0YXRpb25zIG9mIGNlcnRhaW4KICAgICAqIEFQSSBlbmRwb2ludHMgdGhhdCBkb24ndCBzdXBwb3J0IG5ld2VyLAogICAgICogYW5kIHByZWZlcmFibGUgW0NPUlNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQ09SUykgcHJvdG9jb2wuCiAgICAgKiBKU09OUCB0cmVhdHMgdGhlIGVuZHBvaW50IEFQSSBhcyBhIEphdmFTY3JpcHQgZmlsZSBhbmQgdHJpY2tzIHRoZSBicm93c2VyIHRvIHByb2Nlc3MgdGhlCiAgICAgKiByZXF1ZXN0cyBldmVuIGlmIHRoZSBBUEkgZW5kcG9pbnQgaXMgbm90IGxvY2F0ZWQgb24gdGhlIHNhbWUgZG9tYWluIChvcmlnaW4pIGFzIHRoZSBjbGllbnQtc2lkZQogICAgICogYXBwbGljYXRpb24gbWFraW5nIHRoZSByZXF1ZXN0LgogICAgICogVGhlIGVuZHBvaW50IEFQSSBtdXN0IHN1cHBvcnQgSlNPTlAgY2FsbGJhY2sgZm9yIEpTT05QIHJlcXVlc3RzIHRvIHdvcmsuCiAgICAgKiBUaGUgcmVzb3VyY2UgQVBJIHJldHVybnMgdGhlIEpTT04gcmVzcG9uc2Ugd3JhcHBlZCBpbiBhIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgICogWW91IGNhbiBwYXNzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBuYW1lIGFzIG9uZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVycy4KICAgICAqIE5vdGUgdGhhdCBKU09OUCByZXF1ZXN0cyBjYW4gb25seSBiZSB1c2VkIHdpdGggYEdFVGAgcmVxdWVzdHMuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdXJsIFRoZSByZXNvdXJjZSBVUkwuCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrUGFyYW0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAganNvbnAodXJsLCBjYWxsYmFja1BhcmFtKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnSlNPTlAnLCB1cmwsIHsKICAgICAgICAgICAgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLmFwcGVuZChjYWxsYmFja1BhcmFtLCAnSlNPTlBfQ0FMTEJBQ0snKSwKICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJywKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAqIGBPUFRJT05TYCByZXF1ZXN0IHRvIGV4ZWN1dGUgb24gdGhlIHNlcnZlci4gVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBjbGllbnQKICAgICAqIHRvIGRldGVybWluZSB0aGUgc3VwcG9ydGVkIEhUVFAgbWV0aG9kcyBhbmQgb3RoZXIgY2FwYWJpbGl0ZXMgb2YgYW4gZW5kcG9pbnQsCiAgICAgKiB3aXRob3V0IGltcGx5aW5nIGEgcmVzb3VyY2UgYWN0aW9uLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICogZGV0YWlscyBvbiB0aGUgcmV0dXJuIHR5cGUuCiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb3B0aW9ucyh1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ09QVElPTlMnLCB1cmwsICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAqIGBQQVRDSGAgcmVxdWVzdCB0byBleGVjdXRlIG9uIHRoZSBzZXJ2ZXIuIFNlZSB0aGUgaW5kaXZpZHVhbCBvdmVybG9hZHMgZm9yCiAgICAgKiBkZXRhaWxzIG9uIHRoZSByZXR1cm4gdHlwZS4KICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcGFyYW0gez99IGJvZHkKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhdGNoKHVybCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAqIGBQT1NUYCByZXF1ZXN0IHRvIGV4ZWN1dGUgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciByZXNwb25kcyB3aXRoIHRoZSBsb2NhdGlvbiBvZgogICAgICogdGhlIHJlcGxhY2VkIHJlc291cmNlLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICogZGV0YWlscyBvbiB0aGUgcmV0dXJuIHR5cGUuCiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHBhcmFtIHs/fSBib2R5CiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwb3N0KHVybCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIHVybCwgYWRkQm9keShvcHRpb25zLCBib2R5KSk7CiAgICB9CiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gb2JzZXJ2YWJsZSB0aGF0LCB3aGVuIHN1YnNjcmliZWQsIGNhdXNlcyB0aGUgY29uZmlndXJlZAogICAgICogYFBVVGAgcmVxdWVzdCB0byBleGVjdXRlIG9uIHRoZSBzZXJ2ZXIuIFRoZSBgUFVUYCBtZXRob2QgcmVwbGFjZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2UKICAgICAqIHdpdGggYSBuZXcgc2V0IG9mIHZhbHVlcy4KICAgICAqIFNlZSB0aGUgaW5kaXZpZHVhbCBvdmVybG9hZHMgZm9yIGRldGFpbHMgb24gdGhlIHJldHVybiB0eXBlLgogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEBwYXJhbSB7P30gYm9keQogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcHV0KHVybCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUFVUJywgdXJsLCBhZGRCb2R5KG9wdGlvbnMsIGJvZHkpKTsKICAgIH0KfQpIdHRwQ2xpZW50Lsm1ZmFjID0gZnVuY3Rpb24gSHR0cENsaWVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIdHRwQ2xpZW50KSjJtcm1aW5qZWN0KEh0dHBIYW5kbGVyKSk7IH07Ckh0dHBDbGllbnQuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSHR0cENsaWVudCwgZmFjdG9yeTogSHR0cENsaWVudC7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkh0dHBDbGllbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEh0dHBIYW5kbGVyIH0KXTsKLyoqCiAqIGBIdHRwSGFuZGxlcmAgd2hpY2ggYXBwbGllcyBhbiBgSHR0cEludGVyY2VwdG9yYCB0byBhbiBgSHR0cFJlcXVlc3RgLgogKgogKgogKi8KY2xhc3MgSHR0cEludGVyY2VwdG9ySGFuZGxlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICogQHBhcmFtIHs/fSBpbnRlcmNlcHRvcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihuZXh0LCBpbnRlcmNlcHRvcikgewogICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CiAgICAgICAgdGhpcy5pbnRlcmNlcHRvciA9IGludGVyY2VwdG9yOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlcQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaGFuZGxlKHJlcSkgewogICAgICAgIHJldHVybiB0aGlzLmludGVyY2VwdG9yLmludGVyY2VwdChyZXEsIHRoaXMubmV4dCk7CiAgICB9Cn0KLyoqCiAqIEEgbXVsdGktcHJvdmlkZXIgdG9rZW4gdGhhdCByZXByZXNlbnRzIHRoZSBhcnJheSBvZiByZWdpc3RlcmVkCiAqIGBIdHRwSW50ZXJjZXB0b3JgIG9iamVjdHMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSFRUUF9JTlRFUkNFUFRPUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0hUVFBfSU5URVJDRVBUT1JTJyk7CmNsYXNzIE5vb3BJbnRlcmNlcHRvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVxCiAgICAgKiBAcGFyYW0gez99IG5leHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGludGVyY2VwdChyZXEsIG5leHQpIHsKICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTsKICAgIH0KfQpOb29wSW50ZXJjZXB0b3IuybVmYWMgPSBmdW5jdGlvbiBOb29wSW50ZXJjZXB0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTm9vcEludGVyY2VwdG9yKSgpOyB9OwpOb29wSW50ZXJjZXB0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTm9vcEludGVyY2VwdG9yLCBmYWN0b3J5OiBOb29wSW50ZXJjZXB0b3IuybVmYWMgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vaHR0cC9zcmMvanNvbnAudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gRXZlcnkgcmVxdWVzdCBtYWRlIHRocm91Z2ggSlNPTlAgbmVlZHMgYSBjYWxsYmFjayBuYW1lIHRoYXQncyB1bmlxdWUgYWNyb3NzIHRoZQovLyB3aG9sZSBwYWdlLiBFYWNoIHJlcXVlc3QgaXMgYXNzaWduZWQgYW4gaWQgYW5kIHRoZSBjYWxsYmFjayBuYW1lIGlzIGNvbnN0cnVjdGVkCi8vIGZyb20gdGhhdC4gVGhlIG5leHQgaWQgdG8gYmUgYXNzaWduZWQgaXMgdHJhY2tlZCBpbiBhIGdsb2JhbCB2YXJpYWJsZSBoZXJlIHRoYXQKLy8gaXMgc2hhcmVkIGFtb25nIGFsbCBhcHBsaWNhdGlvbnMgb24gdGhlIHBhZ2UuCi8qKiBAdHlwZSB7P30gKi8KbGV0IG5leHRSZXF1ZXN0SWQgPSAwOwovLyBFcnJvciB0ZXh0IGdpdmVuIHdoZW4gYSBKU09OUCBzY3JpcHQgaXMgaW5qZWN0ZWQsIGJ1dCBkb2Vzbid0IGludm9rZSB0aGUgY2FsbGJhY2sKLy8gcGFzc2VkIGluIGl0cyBVUkwuCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgSlNPTlBfRVJSX05PX0NBTExCQUNLID0gJ0pTT05QIGluamVjdGVkIHNjcmlwdCBkaWQgbm90IGludm9rZSBjYWxsYmFjay4nOwovLyBFcnJvciB0ZXh0IGdpdmVuIHdoZW4gYSByZXF1ZXN0IGlzIHBhc3NlZCB0byB0aGUgSnNvbnBDbGllbnRCYWNrZW5kIHRoYXQgZG9lc24ndAovLyBoYXZlIGEgcmVxdWVzdCBtZXRob2QgSlNPTlAuCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgSlNPTlBfRVJSX1dST05HX01FVEhPRCA9ICdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBKU09OUCByZXF1ZXN0IG1ldGhvZC4nOwovKiogQHR5cGUgez99ICovCmNvbnN0IEpTT05QX0VSUl9XUk9OR19SRVNQT05TRV9UWVBFID0gJ0pTT05QIHJlcXVlc3RzIG11c3QgdXNlIEpzb24gcmVzcG9uc2UgdHlwZS4nOwovKioKICogREkgdG9rZW4vYWJzdHJhY3QgdHlwZSByZXByZXNlbnRpbmcgYSBtYXAgb2YgSlNPTlAgY2FsbGJhY2tzLgogKgogKiBJbiB0aGUgYnJvd3NlciwgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBgd2luZG93YCBvYmplY3QuCiAqCiAqCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgSnNvbnBDYWxsYmFja0NvbnRleHQgewp9Ci8qKgogKiBQcm9jZXNzZXMgYW4gYEh0dHBSZXF1ZXN0YCB3aXRoIHRoZSBKU09OUCBtZXRob2QsCiAqIGJ5IHBlcmZvcm1pbmcgSlNPTlAgc3R5bGUgcmVxdWVzdHMuCiAqIEBzZWUgYEh0dHBIYW5kbGVyYAogKiBAc2VlIGBIdHRwWGhyQmFja2VuZGAKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEpzb25wQ2xpZW50QmFja2VuZCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tNYXAKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoY2FsbGJhY2tNYXAsIGRvY3VtZW50KSB7CiAgICAgICAgdGhpcy5jYWxsYmFja01hcCA9IGNhbGxiYWNrTWFwOwogICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBuZXh0IGNhbGxiYWNrIG1ldGhvZCwgYnkgaW5jcmVtZW50aW5nIHRoZSBnbG9iYWwgYG5leHRSZXF1ZXN0SWRgLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5leHRDYWxsYmFjaygpIHsKICAgICAgICByZXR1cm4gYG5nX2pzb25wX2NhbGxiYWNrXyR7bmV4dFJlcXVlc3RJZCsrfWA7CiAgICB9CiAgICAvKioKICAgICAqIFByb2Nlc3NlcyBhIEpTT05QIHJlcXVlc3QgYW5kIHJldHVybnMgYW4gZXZlbnQgc3RyZWFtIG9mIHRoZSByZXN1bHRzLgogICAgICogQHBhcmFtIHs/fSByZXEgVGhlIHJlcXVlc3Qgb2JqZWN0LgogICAgICogQHJldHVybiB7P30gQW4gb2JzZXJ2YWJsZSBvZiB0aGUgcmVzcG9uc2UgZXZlbnRzLgogICAgICoKICAgICAqLwogICAgaGFuZGxlKHJlcSkgewogICAgICAgIC8vIEZpcnN0bHksIGNoZWNrIGJvdGggdGhlIG1ldGhvZCBhbmQgcmVzcG9uc2UgdHlwZS4gSWYgZWl0aGVyIGRvZXNuJ3QgbWF0Y2gKICAgICAgICAvLyB0aGVuIHRoZSByZXF1ZXN0IHdhcyBpbXByb3Blcmx5IHJvdXRlZCBoZXJlIGFuZCBjYW5ub3QgYmUgaGFuZGxlZC4KICAgICAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0pTT05QJykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTlBfRVJSX1dST05HX01FVEhPRCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJlcS5yZXNwb25zZVR5cGUgIT09ICdqc29uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTlBfRVJSX1dST05HX1JFU1BPTlNFX1RZUEUpOwogICAgICAgIH0KICAgICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaGFwcGVucyBpbnNpZGUgdGhlIE9ic2VydmFibGUgYm91bmRhcnkuCiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHN0ZXAgdG8gbWFrZSBhIHJlcXVlc3QgaXMgdG8gZ2VuZXJhdGUgdGhlIGNhbGxiYWNrIG5hbWUsIGFuZCByZXBsYWNlIHRoZQogICAgICAgICAgICAvLyBjYWxsYmFjayBwbGFjZWhvbGRlciBpbiB0aGUgVVJMIHdpdGggdGhlIG5hbWUuIENhcmUgaGFzIHRvIGJlIHRha2VuIGhlcmUgdG8gZW5zdXJlCiAgICAgICAgICAgIC8vIGEgdHJhaWxpbmcgJiwgaWYgbWF0Y2hlZCwgZ2V0cyBpbnNlcnRlZCBiYWNrIGludG8gdGhlIFVSTCBpbiB0aGUgY29ycmVjdCBwbGFjZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubmV4dENhbGxiYWNrKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxLnVybFdpdGhQYXJhbXMucmVwbGFjZSgvPUpTT05QX0NBTExCQUNLKCZ8JCkvLCBgPSR7Y2FsbGJhY2t9JDFgKTsKICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSA8c2NyaXB0PiB0YWcgYW5kIHBvaW50IGl0IGF0IHRoZSBVUkwuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgIG5vZGUuc3JjID0gdXJsOwogICAgICAgICAgICAvLyBBIEpTT05QIHJlcXVlc3QgcmVxdWlyZXMgd2FpdGluZyBmb3IgbXVsdGlwbGUgY2FsbGJhY2tzLiBUaGVzZSB2YXJpYWJsZXMKICAgICAgICAgICAgLy8gYXJlIGNsb3NlZCBvdmVyIGFuZCB0cmFjayBzdGF0ZSBhY3Jvc3MgdGhvc2UgY2FsbGJhY2tzLgogICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugb2JqZWN0LCBpZiBvbmUgaGFzIGJlZW4gcmVjZWl2ZWQsIG9yIG51bGwgb3RoZXJ3aXNlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBib2R5ID0gbnVsbDsKICAgICAgICAgICAgLy8gV2hldGhlciB0aGUgcmVzcG9uc2UgY2FsbGJhY2sgaGFzIGJlZW4gY2FsbGVkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAvLyBXaGV0aGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNhbmNlbGxlZCAoYW5kIHRodXMgYW55IG90aGVyIGNhbGxiYWNrcykKICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGlnbm9yZWQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAvLyBTZXQgdGhlIHJlc3BvbnNlIGNhbGxiYWNrIGluIHRoaXMuY2FsbGJhY2tNYXAgKHdoaWNoIHdpbGwgYmUgdGhlIHdpbmRvdwogICAgICAgICAgICAvLyBvYmplY3QgaW4gdGhlIGJyb3dzZXIuIFRoZSBzY3JpcHQgYmVpbmcgbG9hZGVkIHZpYSB0aGUgPHNjcmlwdD4gdGFnIHdpbGwKICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBjYWxsIHRoaXMgY2FsbGJhY2suCiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tNYXBbY2FsbGJhY2tdID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGF0YSkgPT4gewogICAgICAgICAgICAgICAgLy8gRGF0YSBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIHRoZSBKU09OUCBzY3JpcHQuIEZpcnN0bHksIGRlbGV0ZSB0aGlzIGNhbGxiYWNrLgogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgLy8gTmV4dCwgbWFrZSBzdXJlIHRoZSByZXF1ZXN0IHdhc24ndCBjYW5jZWxsZWQgaW4gdGhlIG1lYW50aW1lLgogICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFNldCBzdGF0ZSB0byBpbmRpY2F0ZSBkYXRhIHdhcyByZWNlaXZlZC4KICAgICAgICAgICAgICAgIGJvZHkgPSBkYXRhOwogICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gY2xlYW51cCgpIGlzIGEgdXRpbGl0eSBjbG9zdXJlIHRoYXQgcmVtb3ZlcyB0aGUgPHNjcmlwdD4gZnJvbSB0aGUgcGFnZSBhbmQKICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGNhbGxiYWNrIGZyb20gdGhlIHdpbmRvdy4gVGhpcyBsb2dpYyBpcyB1c2VkIGluIGJvdGggdGhlCiAgICAgICAgICAgIC8vIHN1Y2Nlc3MsIGVycm9yLCBhbmQgY2FuY2VsbGF0aW9uIHBhdGhzLCBzbyBpdCdzIGV4dHJhY3RlZCBvdXQgZm9yIGNvbnZlbmllbmNlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIDxzY3JpcHQ+IHRhZyBpZiBpdCdzIHN0aWxsIG9uIHRoZSBwYWdlLgogICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmVzcG9uc2UgY2FsbGJhY2sgZnJvbSB0aGUgY2FsbGJhY2tNYXAgKHdpbmRvdyBvYmplY3QgaW4gdGhlCiAgICAgICAgICAgICAgICAvLyBicm93c2VyKS4KICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrTWFwW2NhbGxiYWNrXTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIG9uTG9hZCgpIGlzIHRoZSBzdWNjZXNzIGNhbGxiYWNrIHdoaWNoIHJ1bnMgYWZ0ZXIgdGhlIHJlc3BvbnNlIGNhbGxiYWNrCiAgICAgICAgICAgIC8vIGlmIHRoZSBKU09OUCBzY3JpcHQgbG9hZHMgc3VjY2Vzc2Z1bGx5LiBUaGUgZXZlbnQgaXRzZWxmIGlzIHVuaW1wb3J0YW50LgogICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2VudCB3cm9uZywgb25Mb2FkKCkgbWF5IHJ1biB3aXRob3V0IHRoZSByZXNwb25zZSBjYWxsYmFjawogICAgICAgICAgICAvLyBoYXZpbmcgYmVlbiBpbnZva2VkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9uTG9hZCA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNhbmNlbGxlZC4KICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBwYWdlLgogICAgICAgICAgICAgICAgY2xlYW51cCgpOwogICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgcmVzcG9uc2UgY2FsbGJhY2sgaGFzIHJ1bi4KICAgICAgICAgICAgICAgIGlmICghZmluaXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJdCBoYXNuJ3QsIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHJlcXVlc3QuIFJldHVybiBhbiBlcnJvciB2aWEKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgT2JzZXJ2YWJsZSBlcnJvciBwYXRoLiBBbGwgSlNPTlAgZXJyb3JzIGhhdmUgc3RhdHVzIDAuCiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEh0dHBFcnJvclJlc3BvbnNlKHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICdKU09OUCBFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoSlNPTlBfRVJSX05PX0NBTExCQUNLKSwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU3VjY2Vzcy4gYm9keSBlaXRoZXIgY29udGFpbnMgdGhlIHJlc3BvbnNlIGJvZHkgb3IgbnVsbCBpZiBub25lIHdhcwogICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQuCiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG5ldyBIdHRwUmVzcG9uc2UoewogICAgICAgICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogJ09LJywKICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAvLyBDb21wbGV0ZSB0aGUgc3RyZWFtLCB0aGUgcmVzcG9uc2UgaXMgb3Zlci4KICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBvbkVycm9yKCkgaXMgdGhlIGVycm9yIGNhbGxiYWNrLCB3aGljaCBydW5zIGlmIHRoZSBzY3JpcHQgcmV0dXJuZWQgZ2VuZXJhdGVzCiAgICAgICAgICAgIC8vIGEgSmF2YXNjcmlwdCBlcnJvci4gSXQgZW1pdHMgdGhlIGVycm9yIHZpYSB0aGUgT2JzZXJ2YWJsZSBlcnJvciBjaGFubmVsIGFzCiAgICAgICAgICAgIC8vIGEgSHR0cEVycm9yUmVzcG9uc2UuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb25FcnJvciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCB3YXMgYWxyZWFkeSBjYW5jZWxsZWQsIG5vIG5lZWQgdG8gZW1pdCBhbnl0aGluZy4KICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBlcnJvciBpbiBhIEh0dHBFcnJvclJlc3BvbnNlLgogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEh0dHBFcnJvclJlc3BvbnNlKHsKICAgICAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogJ0pTT05QIEVycm9yJywKICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gYm90aCB0aGUgc3VjY2VzcyAobG9hZCkgYW5kIGVycm9yIGV2ZW50cyBvbiB0aGUgPHNjcmlwdD4gdGFnLAogICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBwYWdlLgogICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpOwogICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7CiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3QgaGFzIG5vdyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50LgogICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogSHR0cEV2ZW50VHlwZS5TZW50IH0pOwogICAgICAgICAgICAvLyBDYW5jZWxsYXRpb24gaGFuZGxlci4KICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBjYW5jZWxsYXRpb24gc28gZXZlbnQgbGlzdGVuZXJzIHdvbid0IGRvIGFueXRoaW5nIGV2ZW4gaWYgYWxyZWFkeSBzY2hlZHVsZWQuCiAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnMgc28gdGhleSB3b24ndCBydW4gaWYgdGhlIGV2ZW50cyBsYXRlciBmaXJlLgogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgIC8vIEFuZCBmaW5hbGx5LCBjbGVhbiB1cCB0aGUgcGFnZS4KICAgICAgICAgICAgICAgIGNsZWFudXAoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgfQp9Ckpzb25wQ2xpZW50QmFja2VuZC7JtWZhYyA9IGZ1bmN0aW9uIEpzb25wQ2xpZW50QmFja2VuZF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBKc29ucENsaWVudEJhY2tlbmQpKMm1ybVpbmplY3QoSnNvbnBDYWxsYmFja0NvbnRleHQpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKSnNvbnBDbGllbnRCYWNrZW5kLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEpzb25wQ2xpZW50QmFja2VuZCwgZmFjdG9yeTogSnNvbnBDbGllbnRCYWNrZW5kLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSnNvbnBDbGllbnRCYWNrZW5kLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBKc29ucENhbGxiYWNrQ29udGV4dCB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ci8qKgogKiBJZGVudGlmaWVzIHJlcXVlc3RzIHdpdGggdGhlIG1ldGhvZCBKU09OUCBhbmQKICogc2hpZnRzIHRoZW0gdG8gdGhlIGBKc29ucENsaWVudEJhY2tlbmRgLgogKgogKiBAc2VlIGBIdHRwSW50ZXJjZXB0b3JgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBKc29ucEludGVyY2VwdG9yIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBqc29ucAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihqc29ucCkgewogICAgICAgIHRoaXMuanNvbnAgPSBqc29ucDsKICAgIH0KICAgIC8qKgogICAgICogSWRlbnRpZmllcyBhbmQgaGFuZGxlcyBhIGdpdmVuIEpTT05QIHJlcXVlc3QuCiAgICAgKiBAcGFyYW0gez99IHJlcSBUaGUgb3V0Z29pbmcgcmVxdWVzdCBvYmplY3QgdG8gaGFuZGxlLgogICAgICogQHBhcmFtIHs/fSBuZXh0IFRoZSBuZXh0IGludGVyY2VwdG9yIGluIHRoZSBjaGFpbiwgb3IgdGhlIGJhY2tlbmQKICAgICAqIGlmIG5vIGludGVyY2VwdG9ycyByZW1haW4gaW4gdGhlIGNoYWluLgogICAgICogQHJldHVybiB7P30gQW4gb2JzZXJ2YWJsZSBvZiB0aGUgZXZlbnQgc3RyZWFtLgogICAgICovCiAgICBpbnRlcmNlcHQocmVxLCBuZXh0KSB7CiAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09ICdKU09OUCcpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuanNvbnAuaGFuZGxlKCgvKiogQHR5cGUgez99ICovIChyZXEpKSk7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCBmb3Igbm9ybWFsIEhUVFAgcmVxdWVzdHMuCiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7CiAgICB9Cn0KSnNvbnBJbnRlcmNlcHRvci7JtWZhYyA9IGZ1bmN0aW9uIEpzb25wSW50ZXJjZXB0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSnNvbnBJbnRlcmNlcHRvcikoybXJtWluamVjdChKc29ucENsaWVudEJhY2tlbmQpKTsgfTsKSnNvbnBJbnRlcmNlcHRvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBKc29ucEludGVyY2VwdG9yLCBmYWN0b3J5OiBKc29ucEludGVyY2VwdG9yLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSnNvbnBJbnRlcmNlcHRvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogSnNvbnBDbGllbnRCYWNrZW5kIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9odHRwL3NyYy94aHIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBYU1NJX1BSRUZJWCA9IC9eXClcXVx9Jyw/XG4vOwovKioKICogRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIFVSTCBmb3IgdGhlIHJlc3BvbnNlLCBieSBjaGVja2luZyBlaXRoZXIKICogWE1MSHR0cFJlcXVlc3QucmVzcG9uc2VVUkwgb3IgdGhlIFgtUmVxdWVzdC1VUkwgaGVhZGVyLgogKiBAcGFyYW0gez99IHhocgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UmVzcG9uc2VVcmwoeGhyKSB7CiAgICBpZiAoJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgJiYgeGhyLnJlc3BvbnNlVVJMKSB7CiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVVSTDsKICAgIH0KICAgIGlmICgvXlgtUmVxdWVzdC1VUkw6L20udGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKSB7CiAgICAgICAgcmV0dXJuIHhoci5nZXRSZXNwb25zZUhlYWRlcignWC1SZXF1ZXN0LVVSTCcpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIGBYTUxIdHRwUmVxdWVzdGAgY29uc3RydWN0b3IuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgWGhyRmFjdG9yeSB7Cn0KLyoqCiAqIEEgZmFjdG9yeSBmb3IgYEh0dHBYaHJCYWNrZW5kYCB0aGF0IHVzZXMgdGhlIGBYTUxIdHRwUmVxdWVzdGAgYnJvd3NlciBBUEkuCiAqCiAqLwpjbGFzcyBCcm93c2VyWGhyIHsKICAgIGNvbnN0cnVjdG9yKCkgeyB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ1aWxkKCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKG5ldyBYTUxIdHRwUmVxdWVzdCgpKSkpOwogICAgfQp9CkJyb3dzZXJYaHIuybVmYWMgPSBmdW5jdGlvbiBCcm93c2VyWGhyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEJyb3dzZXJYaHIpKCk7IH07CkJyb3dzZXJYaHIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQnJvd3NlclhociwgZmFjdG9yeTogQnJvd3Nlclhoci7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkJyb3dzZXJYaHIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXTsKLyoqCiAqIFVzZXMgYFhNTEh0dHBSZXF1ZXN0YCB0byBzZW5kIHJlcXVlc3RzIHRvIGEgYmFja2VuZCBzZXJ2ZXIuCiAqIEBzZWUgYEh0dHBIYW5kbGVyYAogKiBAc2VlIGBKc29ucENsaWVudEJhY2tlbmRgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIdHRwWGhyQmFja2VuZCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30geGhyRmFjdG9yeQogICAgICovCiAgICBjb25zdHJ1Y3Rvcih4aHJGYWN0b3J5KSB7CiAgICAgICAgdGhpcy54aHJGYWN0b3J5ID0geGhyRmFjdG9yeTsKICAgIH0KICAgIC8qKgogICAgICogUHJvY2Vzc2VzIGEgcmVxdWVzdCBhbmQgcmV0dXJucyBhIHN0cmVhbSBvZiByZXNwb25zZSBldmVudHMuCiAgICAgKiBAcGFyYW0gez99IHJlcSBUaGUgcmVxdWVzdCBvYmplY3QuCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYnNlcnZhYmxlIG9mIHRoZSByZXNwb25zZSBldmVudHMuCiAgICAgKi8KICAgIGhhbmRsZShyZXEpIHsKICAgICAgICAvLyBRdWljayBjaGVjayB0byBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgLy8gSHR0cENsaWVudC5qc29ucCgpIHdpdGhvdXQgaW5zdGFsbGluZyB0aGUgSnNvbnBDbGllbnRNb2R1bGUKICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ0pTT05QJykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHRlZCB0byBjb25zdHJ1Y3QgSnNvbnAgcmVxdWVzdCB3aXRob3V0IEpzb25wQ2xpZW50TW9kdWxlIGluc3RhbGxlZC5gKTsKICAgICAgICB9CiAgICAgICAgLy8gRXZlcnl0aGluZyBoYXBwZW5zIG9uIE9ic2VydmFibGUgc3Vic2NyaXB0aW9uLgogICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvYnNlcnZlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG9ic2VydmVyKSA9PiB7CiAgICAgICAgICAgIC8vIFN0YXJ0IGJ5IHNldHRpbmcgdXAgdGhlIFhIUiBvYmplY3Qgd2l0aCByZXF1ZXN0IG1ldGhvZCwgVVJMLCBhbmQgd2l0aENyZWRlbnRpYWxzIGZsYWcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgeGhyID0gdGhpcy54aHJGYWN0b3J5LmJ1aWxkKCk7CiAgICAgICAgICAgIHhoci5vcGVuKHJlcS5tZXRob2QsIHJlcS51cmxXaXRoUGFyYW1zKTsKICAgICAgICAgICAgaWYgKCEhcmVxLndpdGhDcmVkZW50aWFscykgewogICAgICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQWRkIGFsbCB0aGUgcmVxdWVzdGVkIGhlYWRlcnMuCiAgICAgICAgICAgIHJlcS5oZWFkZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZXMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChuYW1lLCB2YWx1ZXMpID0+IHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlcy5qb2luKCcsJykpKSk7CiAgICAgICAgICAgIC8vIEFkZCBhbiBBY2NlcHQgaGVhZGVyIGlmIG9uZSBpc24ndCBwcmVzZW50IGFscmVhZHkuCiAgICAgICAgICAgIGlmICghcmVxLmhlYWRlcnMuaGFzKCdBY2NlcHQnKSkgewogICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBdXRvLWRldGVjdCB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBpZiBvbmUgaXNuJ3QgcHJlc2VudCBhbHJlYWR5LgogICAgICAgICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRldGVjdGVkVHlwZSA9IHJlcS5kZXRlY3RDb250ZW50VHlwZUhlYWRlcigpOwogICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIENvbnRlbnQtVHlwZSBkZXRlY3Rpb24gZmFpbHMuCiAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0ZWRUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGRldGVjdGVkVHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2V0IHRoZSByZXNwb25zZVR5cGUgaWYgb25lIHdhcyByZXF1ZXN0ZWQuCiAgICAgICAgICAgIGlmIChyZXEucmVzcG9uc2VUeXBlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSByZXEucmVzcG9uc2VUeXBlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAvLyBKU09OIHJlc3BvbnNlcyBuZWVkIHRvIGJlIHByb2Nlc3NlZCBhcyB0ZXh0LiBUaGlzIGlzIGJlY2F1c2UgaWYgdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgLy8gcmV0dXJucyBhbiBYU1NJLXByZWZpeGVkIEpTT04gcmVzcG9uc2UsIHRoZSBicm93c2VyIHdpbGwgZmFpbCB0byBwYXJzZSBpdCwKICAgICAgICAgICAgICAgIC8vIHhoci5yZXNwb25zZSB3aWxsIGJlIG51bGwsIGFuZCB4aHIucmVzcG9uc2VUZXh0IGNhbm5vdCBiZSBhY2Nlc3NlZCB0bwogICAgICAgICAgICAgICAgLy8gcmV0cmlldmUgdGhlIHByZWZpeGVkIEpTT04gZGF0YSBpbiBvcmRlciB0byBzdHJpcCB0aGUgcHJlZml4LiBUaHVzLCBhbGwgSlNPTgogICAgICAgICAgICAgICAgLy8gaXMgcGFyc2VkIGJ5IGZpcnN0IHJlcXVlc3RpbmcgdGV4dCBhbmQgdGhlbiBhcHBseWluZyBKU09OLnBhcnNlLgogICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICgvKiogQHR5cGUgez99ICovICgoKHJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSA/IHJlc3BvbnNlVHlwZSA6ICd0ZXh0JykpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgYm9keSBpZiBvbmUgaXMgcHJlc2VudC4gSWYgbm90LCB0aGlzIHdpbGwgYmUgc2V0IHRvIG51bGwuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVxQm9keSA9IHJlcS5zZXJpYWxpemVCb2R5KCk7CiAgICAgICAgICAgIC8vIElmIHByb2dyZXNzIGV2ZW50cyBhcmUgZW5hYmxlZCwgcmVzcG9uc2UgaGVhZGVycyB3aWxsIGJlIGRlbGl2ZXJlZAogICAgICAgICAgICAvLyBpbiB0d28gZXZlbnRzIC0gdGhlIEh0dHBIZWFkZXJSZXNwb25zZSBldmVudCBhbmQgdGhlIGZ1bGwgSHR0cFJlc3BvbnNlCiAgICAgICAgICAgIC8vIGV2ZW50LiBIb3dldmVyLCBzaW5jZSByZXNwb25zZSBoZWFkZXJzIGRvbid0IGNoYW5nZSBpbiBiZXR3ZWVuIHRoZXNlCiAgICAgICAgICAgIC8vIHR3byBldmVudHMsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBwYXJzZSB0aGVtIHR3aWNlLiBTbyBoZWFkZXJSZXNwb25zZQogICAgICAgICAgICAvLyBjYWNoZXMgdGhlIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHJlc3BvbnNlIHdoZW5ldmVyIGl0J3MgZmlyc3QgcGFyc2VkLAogICAgICAgICAgICAvLyB0byBlbnN1cmUgcGFyc2luZyBpc24ndCBkdXBsaWNhdGVkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBoZWFkZXJSZXNwb25zZSA9IG51bGw7CiAgICAgICAgICAgIC8vIHBhcnRpYWxGcm9tWGhyIGV4dHJhY3RzIHRoZSBIdHRwSGVhZGVyUmVzcG9uc2UgZnJvbSB0aGUgY3VycmVudCBYTUxIdHRwUmVxdWVzdAogICAgICAgICAgICAvLyBzdGF0ZSwgYW5kIG1lbW9pemVzIGl0IGludG8gaGVhZGVyUmVzcG9uc2UuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFydGlhbEZyb21YaHIgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyUmVzcG9uc2UgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyUmVzcG9uc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBSZWFkIHN0YXR1cyBhbmQgbm9ybWFsaXplIGFuIElFOSBidWcgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzE0NTApLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0geGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXM7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQgfHwgJ09LJzsKICAgICAgICAgICAgICAgIC8vIFBhcnNlIGhlYWRlcnMgZnJvbSBYTUxIdHRwUmVxdWVzdCAtIHRoaXMgc3RlcCBpcyBsYXp5LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOwogICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgVVJMIGZyb20gdGhlIFhNTEh0dHBSZXNwb25zZSBpbnN0YW5jZSBhbmQgZmFsbCBiYWNrIG9uIHRoZQogICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBVUkwuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSZXNwb25zZVVybCh4aHIpIHx8IHJlcS51cmw7CiAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIEh0dHBIZWFkZXJSZXNwb25zZSBhbmQgbWVtb2l6ZSBpdC4KICAgICAgICAgICAgICAgIGhlYWRlclJlc3BvbnNlID0gbmV3IEh0dHBIZWFkZXJSZXNwb25zZSh7IGhlYWRlcnMsIHN0YXR1cywgc3RhdHVzVGV4dCwgdXJsIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlclJlc3BvbnNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gTmV4dCwgYSBmZXcgY2xvc3VyZXMgYXJlIGRlZmluZWQgZm9yIHRoZSB2YXJpb3VzIGV2ZW50cyB3aGljaCBYTUxIdHRwUmVxdWVzdCBjYW4KICAgICAgICAgICAgLy8gZW1pdC4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSB1bnJlZ2lzdGVyZWQgYXMgZXZlbnQgbGlzdGVuZXJzIGxhdGVyLgogICAgICAgICAgICAvLyBGaXJzdCB1cCBpcyB0aGUgbG9hZCBldmVudCwgd2hpY2ggcmVwcmVzZW50cyBhIHJlc3BvbnNlIGJlaW5nIGZ1bGx5IGF2YWlsYWJsZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvbkxvYWQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBSZWFkIHJlc3BvbnNlIHN0YXRlIGZyb20gdGhlIG1lbW9pemVkIHBhcnRpYWwgZGF0YS4KICAgICAgICAgICAgICAgIGxldCB7IGhlYWRlcnMsIHN0YXR1cywgc3RhdHVzVGV4dCwgdXJsIH0gPSBwYXJ0aWFsRnJvbVhocigpOwogICAgICAgICAgICAgICAgLy8gVGhlIGJvZHkgd2lsbCBiZSByZWFkIG91dCBpZiBwcmVzZW50LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGJvZHkgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjA0KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFhNTEh0dHBSZXF1ZXN0LnJlc3BvbnNlIGlmIHNldCwgcmVzcG9uc2VUZXh0IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgICBib2R5ID0gKHR5cGVvZiB4aHIucmVzcG9uc2UgPT09ICd1bmRlZmluZWQnKSA/IHhoci5yZXNwb25zZVRleHQgOiB4aHIucmVzcG9uc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgYW5vdGhlciBwb3RlbnRpYWwgYnVnICh0aGlzIG9uZSBjb21lcyBmcm9tIENPUlMpLgogICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICEhYm9keSA/IDIwMCA6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBvayBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlc3BvbnNlIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb24gdGhlIGV2ZW50IG9yCiAgICAgICAgICAgICAgICAvLyBlcnJvciBjaGFubmVsLiBVbnN1Y2Nlc3NmdWwgc3RhdHVzIGNvZGVzIChub3QgMnh4KSB3aWxsIGFsd2F5cyBiZSBlcnJvcnMsCiAgICAgICAgICAgICAgICAvLyBidXQgYSBzdWNjZXNzZnVsIHN0YXR1cyBjb2RlIGNhbiBzdGlsbCByZXN1bHQgaW4gYW4gZXJyb3IgaWYgdGhlIHVzZXIKICAgICAgICAgICAgICAgIC8vIGFza2VkIGZvciBKU09OIGRhdGEgYW5kIHRoZSBib2R5IGNhbm5vdCBiZSBwYXJzZWQgYXMgc3VjaC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBvayA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwOwogICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYm9keSBuZWVkcyB0byBiZSBwYXJzZWQgYXMgSlNPTiAoaW4gbWFueSBjYXNlcyB0aGUgYnJvd3NlcgogICAgICAgICAgICAgICAgLy8gd2lsbCBoYXZlIGRvbmUgdGhhdCBhbHJlYWR5KS4KICAgICAgICAgICAgICAgIGlmIChyZXEucmVzcG9uc2VUeXBlID09PSAnanNvbicgJiYgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgYm9keSwgYmVmb3JlIGF0dGVtcHRpbmcgWFNTSSBwcmVmaXggc3RyaXBwaW5nLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEJvZHkgPSBib2R5OwogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoWFNTSV9QUkVGSVgsICcnKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRoZSBwYXJzZS4gSWYgaXQgZmFpbHMsIGEgcGFyc2UgZXJyb3Igc2hvdWxkIGJlIGRlbGl2ZXJlZCB0byB0aGUgdXNlci4KICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGJvZHkgIT09ICcnID8gSlNPTi5wYXJzZShib2R5KSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgSlNPTi5wYXJzZSBmYWlsZWQsIGl0J3MgcmVhc29uYWJsZSB0byBhc3N1bWUgdGhpcyBtaWdodCBub3QgaGF2ZSBiZWVuIGEKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSlNPTiByZXNwb25zZS4gUmVzdG9yZSB0aGUgb3JpZ2luYWwgYm9keSAoaW5jbHVkaW5nIGFueSBYU1NJIHByZWZpeCkgdG8gZGVsaXZlcgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGJldHRlciBlcnJvciByZXNwb25zZS4KICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IG9yaWdpbmFsQm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYW4gZXJyb3IgcmVxdWVzdCB0byBiZWdpbiB3aXRoLCBsZWF2ZSBpdCBhcyBhIHN0cmluZywgaXQgcHJvYmFibHkKICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBpc24ndCBKU09OLiBPdGhlcndpc2UsIGRlbGl2ZXIgdGhlIHBhcnNpbmcgZXJyb3IgdG8gdGhlIHVzZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHJlc3BvbnNlIHN0YXR1cyB3YXMgMnh4LCB0aGlzIGlzIHN0aWxsIGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJzZSBlcnJvciBjb250YWlucyB0aGUgdGV4dCBvZiB0aGUgYm9keSB0aGF0IGZhaWxlZCB0byBwYXJzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoeyBlcnJvciwgdGV4dDogYm9keSB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob2spIHsKICAgICAgICAgICAgICAgICAgICAvLyBBIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgaXMgZGVsaXZlcmVkIG9uIHRoZSBldmVudCBzdHJlYW0uCiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChuZXcgSHR0cFJlc3BvbnNlKHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmdWxsIGJvZHkgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGRlbGl2ZXJlZCwgbm8gZnVydGhlciBldmVudHMKICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcG9zc2libGUuIFRoaXMgcmVxdWVzdCBpcyBjb21wbGV0ZS4KICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQW4gdW5zdWNjZXNzZnVsIHJlcXVlc3QgaXMgZGVsaXZlcmVkIG9uIHRoZSBlcnJvciBjaGFubmVsLgogICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlcnJvciBpbiB0aGlzIGNhc2UgaXMgdGhlIHJlc3BvbnNlIGJvZHkgKGVycm9yIGZyb20gdGhlIHNlcnZlcikuCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBib2R5LAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBUaGUgb25FcnJvciBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyBhdCB0aGUgbmV0d29yayBsZXZlbC4KICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiB0aW1lb3V0LCBETlMgZXJyb3IsIG9mZmxpbmUsIGV0Yy4gVGhlc2UgYXJlIGFjdHVhbCBlcnJvcnMsIGFuZCBhcmUKICAgICAgICAgICAgLy8gdHJhbnNtaXR0ZWQgb24gdGhlIGVycm9yIGNoYW5uZWwuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb25FcnJvciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCB9ID0gcGFydGlhbEZyb21YaHIoKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQgfHwgJ1Vua25vd24gRXJyb3InLAogICAgICAgICAgICAgICAgICAgIHVybDogdXJsIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IocmVzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIFRoZSBzZW50SGVhZGVycyBmbGFnIHRyYWNrcyB3aGV0aGVyIHRoZSBIdHRwUmVzcG9uc2VIZWFkZXJzIGV2ZW50CiAgICAgICAgICAgIC8vIGhhcyBiZWVuIHNlbnQgb24gdGhlIHN0cmVhbS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gdHJhY2sgaWYgcHJvZ3Jlc3MKICAgICAgICAgICAgLy8gaXMgZW5hYmxlZCBzaW5jZSB0aGUgZXZlbnQgd2lsbCBiZSBzZW50IG9uIG9ubHkgdGhlIGZpcnN0IGRvd25sb2FkCiAgICAgICAgICAgIC8vIHByb2dlcnNzIGV2ZW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzZW50SGVhZGVycyA9IGZhbHNlOwogICAgICAgICAgICAvLyBUaGUgZG93bmxvYWQgcHJvZ3Jlc3MgZXZlbnQgaGFuZGxlciwgd2hpY2ggaXMgb25seSByZWdpc3RlcmVkIGlmCiAgICAgICAgICAgIC8vIHByb2dyZXNzIGV2ZW50cyBhcmUgZW5hYmxlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvbkRvd25Qcm9ncmVzcyA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBIdHRwUmVzcG9uc2VIZWFkZXJzIGV2ZW50IGlmIGl0IGhhc24ndCBiZWVuIHNlbnQgYWxyZWFkeS4KICAgICAgICAgICAgICAgIGlmICghc2VudEhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHBhcnRpYWxGcm9tWGhyKCkpOwogICAgICAgICAgICAgICAgICAgIHNlbnRIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIHRoZSBkb3dubG9hZCBwcm9ncmVzcyBldmVudCB0byBkZWxpdmVyIG9uIHRoZSByZXNwb25zZQogICAgICAgICAgICAgICAgLy8gZXZlbnQgc3RyZWFtLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzRXZlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBldmVudCBpZiBpdCdzIGF2YWlsYWJsZS4KICAgICAgICAgICAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudC50b3RhbCA9IGV2ZW50LnRvdGFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgd2FzIGZvciB0ZXh0IGNvbnRlbnQgYW5kIGEgcGFydGlhbCByZXNwb25zZSBpcwogICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIG9uIFhNTEh0dHBSZXF1ZXN0LCBpbmNsdWRlIGl0IGluIHRoZSBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gdG8gYWxsb3cgZm9yIHN0cmVhbWluZyByZWFkcy4KICAgICAgICAgICAgICAgIGlmIChyZXEucmVzcG9uc2VUeXBlID09PSAndGV4dCcgJiYgISF4aHIucmVzcG9uc2VUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudC5wYXJ0aWFsVGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBmaXJlIHRoZSBldmVudC4KICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocHJvZ3Jlc3NFdmVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBUaGUgdXBsb2FkIHByb2dyZXNzIGV2ZW50IGhhbmRsZXIsIHdoaWNoIGlzIG9ubHkgcmVnaXN0ZXJlZCBpZgogICAgICAgICAgICAvLyBwcm9ncmVzcyBldmVudHMgYXJlIGVuYWJsZWQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb25VcFByb2dyZXNzID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgICAgIC8vIFVwbG9hZCBwcm9ncmVzcyBldmVudHMgYXJlIHNpbXBsZXIuIEJlZ2luIGJ1aWxkaW5nIHRoZSBwcm9ncmVzcwogICAgICAgICAgICAgICAgLy8gZXZlbnQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGJlaW5nIHVwbG9hZGVkIGlzIGF2YWlsYWJsZSwgaW5jbHVkZQogICAgICAgICAgICAgICAgLy8gaXQuCiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLnRvdGFsID0gZXZlbnQudG90YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBldmVudC4KICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocHJvZ3Jlc3MpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgcmVnaXN0ZXIgZm9yIGxvYWQgYW5kIGVycm9yIGV2ZW50cy4KICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpOwogICAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTsKICAgICAgICAgICAgLy8gUHJvZ3Jlc3MgZXZlbnRzIGFyZSBvbmx5IGVuYWJsZWQgaWYgcmVxdWVzdGVkLgogICAgICAgICAgICBpZiAocmVxLnJlcG9ydFByb2dyZXNzKSB7CiAgICAgICAgICAgICAgICAvLyBEb3dubG9hZCBwcm9ncmVzcyBpcyBhbHdheXMgZW5hYmxlZCBpZiByZXF1ZXN0ZWQuCiAgICAgICAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBvbkRvd25Qcm9ncmVzcyk7CiAgICAgICAgICAgICAgICAvLyBVcGxvYWQgcHJvZ3Jlc3MgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZXJlIGlzIGEgYm9keSB0byB1cGxvYWQuCiAgICAgICAgICAgICAgICBpZiAocmVxQm9keSAhPT0gbnVsbCAmJiB4aHIudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIG9uVXBQcm9ncmVzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmlyZSB0aGUgcmVxdWVzdCwgYW5kIG5vdGlmeSB0aGUgZXZlbnQgc3RyZWFtIHRoYXQgaXQgd2FzIGZpcmVkLgogICAgICAgICAgICB4aHIuc2VuZCgoLyoqIEB0eXBlIHs/fSAqLyAocmVxQm9keSkpKTsKICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHR5cGU6IEh0dHBFdmVudFR5cGUuU2VudCB9KTsKICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmV0dXJuIGZyb20gdGhlIE9ic2VydmFibGUgZnVuY3Rpb24sIHdoaWNoIGlzIHRoZQogICAgICAgICAgICAvLyByZXF1ZXN0IGNhbmNlbGxhdGlvbiBoYW5kbGVyLgogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gT24gYSBjYW5jZWxsYXRpb24sIHJlbW92ZSBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuCiAgICAgICAgICAgICAgICB4aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgIHhoci5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTsKICAgICAgICAgICAgICAgIGlmIChyZXEucmVwb3J0UHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICAgICB4aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBvbkRvd25Qcm9ncmVzcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUJvZHkgIT09IG51bGwgJiYgeGhyLnVwbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICB4aHIudXBsb2FkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgb25VcFByb2dyZXNzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBhYm9ydCB0aGUgaW4tZmxpZ2h0IHJlcXVlc3QuCiAgICAgICAgICAgICAgICB4aHIuYWJvcnQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgfQp9Ckh0dHBYaHJCYWNrZW5kLsm1ZmFjID0gZnVuY3Rpb24gSHR0cFhockJhY2tlbmRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cFhockJhY2tlbmQpKMm1ybVpbmplY3QoWGhyRmFjdG9yeSkpOyB9OwpIdHRwWGhyQmFja2VuZC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIdHRwWGhyQmFja2VuZCwgZmFjdG9yeTogSHR0cFhockJhY2tlbmQuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpIdHRwWGhyQmFja2VuZC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogWGhyRmFjdG9yeSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vaHR0cC9zcmMveHNyZi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IFhTUkZfQ09PS0lFX05BTUUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1hTUkZfQ09PS0lFX05BTUUnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBYU1JGX0hFQURFUl9OQU1FID0gbmV3IEluamVjdGlvblRva2VuKCdYU1JGX0hFQURFUl9OQU1FJyk7Ci8qKgogKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgWFNSRiB0b2tlbiB0byB1c2Ugd2l0aCB0aGUgbmV4dCBvdXRnb2luZyByZXF1ZXN0LgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIEh0dHBYc3JmVG9rZW5FeHRyYWN0b3Igewp9Ci8qKgogKiBgSHR0cFhzcmZUb2tlbkV4dHJhY3RvcmAgd2hpY2ggcmV0cmlldmVzIHRoZSB0b2tlbiBmcm9tIGEgY29va2llLgogKi8KY2xhc3MgSHR0cFhzcmZDb29raWVFeHRyYWN0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRvYwogICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybQogICAgICogQHBhcmFtIHs/fSBjb29raWVOYW1lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRvYywgcGxhdGZvcm0sIGNvb2tpZU5hbWUpIHsKICAgICAgICB0aGlzLmRvYyA9IGRvYzsKICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgdGhpcy5jb29raWVOYW1lID0gY29va2llTmFtZTsKICAgICAgICB0aGlzLmxhc3RDb29raWVTdHJpbmcgPSAnJzsKICAgICAgICB0aGlzLmxhc3RUb2tlbiA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbCBmb3IgdGVzdGluZwogICAgICAgICAqLwogICAgICAgIHRoaXMucGFyc2VDb3VudCA9IDA7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFRva2VuKCkgewogICAgICAgIGlmICh0aGlzLnBsYXRmb3JtID09PSAnc2VydmVyJykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvb2tpZVN0cmluZyA9IHRoaXMuZG9jLmNvb2tpZSB8fCAnJzsKICAgICAgICBpZiAoY29va2llU3RyaW5nICE9PSB0aGlzLmxhc3RDb29raWVTdHJpbmcpIHsKICAgICAgICAgICAgdGhpcy5wYXJzZUNvdW50Kys7CiAgICAgICAgICAgIHRoaXMubGFzdFRva2VuID0gcGFyc2VDb29raWVWYWx1ZShjb29raWVTdHJpbmcsIHRoaXMuY29va2llTmFtZSk7CiAgICAgICAgICAgIHRoaXMubGFzdENvb2tpZVN0cmluZyA9IGNvb2tpZVN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFRva2VuOwogICAgfQp9Ckh0dHBYc3JmQ29va2llRXh0cmFjdG9yLsm1ZmFjID0gZnVuY3Rpb24gSHR0cFhzcmZDb29raWVFeHRyYWN0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cFhzcmZDb29raWVFeHRyYWN0b3IpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoUExBVEZPUk1fSUQpLCDJtcm1aW5qZWN0KFhTUkZfQ09PS0lFX05BTUUpKTsgfTsKSHR0cFhzcmZDb29raWVFeHRyYWN0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSHR0cFhzcmZDb29raWVFeHRyYWN0b3IsIGZhY3Rvcnk6IEh0dHBYc3JmQ29va2llRXh0cmFjdG9yLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSHR0cFhzcmZDb29raWVFeHRyYWN0b3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbUExBVEZPUk1fSUQsXSB9XSB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW1hTUkZfQ09PS0lFX05BTUUsXSB9XSB9Cl07Ci8qKgogKiBgSHR0cEludGVyY2VwdG9yYCB3aGljaCBhZGRzIGFuIFhTUkYgdG9rZW4gdG8gZWxpZ2libGUgb3V0Z29pbmcgcmVxdWVzdHMuCiAqLwpjbGFzcyBIdHRwWHNyZkludGVyY2VwdG9yIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0b2tlblNlcnZpY2UKICAgICAqIEBwYXJhbSB7P30gaGVhZGVyTmFtZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcih0b2tlblNlcnZpY2UsIGhlYWRlck5hbWUpIHsKICAgICAgICB0aGlzLnRva2VuU2VydmljZSA9IHRva2VuU2VydmljZTsKICAgICAgICB0aGlzLmhlYWRlck5hbWUgPSBoZWFkZXJOYW1lOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlcQogICAgICogQHBhcmFtIHs/fSBuZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnRlcmNlcHQocmVxLCBuZXh0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxjVXJsID0gcmVxLnVybC50b0xvd2VyQ2FzZSgpOwogICAgICAgIC8vIFNraXAgYm90aCBub24tbXV0YXRpbmcgcmVxdWVzdHMgYW5kIGFic29sdXRlIFVSTHMuCiAgICAgICAgLy8gTm9uLW11dGF0aW5nIHJlcXVlc3RzIGRvbid0IHJlcXVpcmUgYSB0b2tlbiwgYW5kIGFic29sdXRlIFVSTHMgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nCiAgICAgICAgLy8gYW55d2F5IGFzIHRoZSBjb29raWUgc2V0CiAgICAgICAgLy8gb24gb3VyIG9yaWdpbiBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRva2VuIGV4cGVjdGVkIGJ5IGFub3RoZXIgb3JpZ2luLgogICAgICAgIGlmIChyZXEubWV0aG9kID09PSAnR0VUJyB8fCByZXEubWV0aG9kID09PSAnSEVBRCcgfHwgbGNVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8CiAgICAgICAgICAgIGxjVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHsKICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldFRva2VuKCk7CiAgICAgICAgLy8gQmUgY2FyZWZ1bCBub3QgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGhlYWRlciBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgIGlmICh0b2tlbiAhPT0gbnVsbCAmJiAhcmVxLmhlYWRlcnMuaGFzKHRoaXMuaGVhZGVyTmFtZSkpIHsKICAgICAgICAgICAgcmVxID0gcmVxLmNsb25lKHsgaGVhZGVyczogcmVxLmhlYWRlcnMuc2V0KHRoaXMuaGVhZGVyTmFtZSwgdG9rZW4pIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTsKICAgIH0KfQpIdHRwWHNyZkludGVyY2VwdG9yLsm1ZmFjID0gZnVuY3Rpb24gSHR0cFhzcmZJbnRlcmNlcHRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIdHRwWHNyZkludGVyY2VwdG9yKSjJtcm1aW5qZWN0KEh0dHBYc3JmVG9rZW5FeHRyYWN0b3IpLCDJtcm1aW5qZWN0KFhTUkZfSEVBREVSX05BTUUpKTsgfTsKSHR0cFhzcmZJbnRlcmNlcHRvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIdHRwWHNyZkludGVyY2VwdG9yLCBmYWN0b3J5OiBIdHRwWHNyZkludGVyY2VwdG9yLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSHR0cFhzcmZJbnRlcmNlcHRvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogSHR0cFhzcmZUb2tlbkV4dHJhY3RvciB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW1hTUkZfSEVBREVSX05BTUUsXSB9XSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vaHR0cC9zcmMvbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBbiBpbmplY3RhYmxlIGBIdHRwSGFuZGxlcmAgdGhhdCBhcHBsaWVzIG11bHRpcGxlIGludGVyY2VwdG9ycwogKiB0byBhIHJlcXVlc3QgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGdpdmVuIGBIdHRwQmFja2VuZGAuCiAqCiAqIFRoZSBpbnRlcmNlcHRvcnMgYXJlIGxvYWRlZCBsYXppbHkgZnJvbSB0aGUgaW5qZWN0b3IsIHRvIGFsbG93CiAqIGludGVyY2VwdG9ycyB0byB0aGVtc2VsdmVzIGluamVjdCBjbGFzc2VzIGRlcGVuZGluZyBpbmRpcmVjdGx5CiAqIG9uIGBIdHRwSW50ZXJjZXB0aW5nSGFuZGxlcmAgaXRzZWxmLgogKiBAc2VlIGBIdHRwSW50ZXJjZXB0b3JgCiAqLwpjbGFzcyBIdHRwSW50ZXJjZXB0aW5nSGFuZGxlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYmFja2VuZAogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBpbmplY3RvcikgewogICAgICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7CiAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yOwogICAgICAgIHRoaXMuY2hhaW4gPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlcQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaGFuZGxlKHJlcSkgewogICAgICAgIGlmICh0aGlzLmNoYWluID09PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gdGhpcy5pbmplY3Rvci5nZXQoSFRUUF9JTlRFUkNFUFRPUlMsIFtdKTsKICAgICAgICAgICAgdGhpcy5jaGFpbiA9IGludGVyY2VwdG9ycy5yZWR1Y2VSaWdodCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICAgICAgICAgKiBAcGFyYW0gez99IGludGVyY2VwdG9yCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobmV4dCwgaW50ZXJjZXB0b3IpID0+IG5ldyBIdHRwSW50ZXJjZXB0b3JIYW5kbGVyKG5leHQsIGludGVyY2VwdG9yKSksIHRoaXMuYmFja2VuZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNoYWluLmhhbmRsZShyZXEpOwogICAgfQp9Ckh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyLsm1ZmFjID0gZnVuY3Rpb24gSHR0cEludGVyY2VwdGluZ0hhbmRsZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cEludGVyY2VwdGluZ0hhbmRsZXIpKMm1ybVpbmplY3QoSHR0cEJhY2tlbmQpLCDJtcm1aW5qZWN0KEluamVjdG9yKSk7IH07Ckh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyLCBmYWN0b3J5OiBIdHRwSW50ZXJjZXB0aW5nSGFuZGxlci7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBIdHRwQmFja2VuZCB9LAogICAgeyB0eXBlOiBJbmplY3RvciB9Cl07Ci8qKgogKiBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGVyZSB0byBzdG9yZSBKU09OUCBjYWxsYmFja3MuCiAqCiAqIE9yZGluYXJpbHkgSlNPTlAgY2FsbGJhY2tzIGFyZSBzdG9yZWQgb24gdGhlIGB3aW5kb3dgIG9iamVjdCwgYnV0IHRoaXMgbWF5IG5vdCBleGlzdAogKiBpbiB0ZXN0IGVudmlyb25tZW50cy4gSW4gdGhhdCBjYXNlLCBjYWxsYmFja3MgYXJlIHN0b3JlZCBvbiBhbiBhbm9ueW1vdXMgb2JqZWN0IGluc3RlYWQuCiAqCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBqc29ucENhbGxiYWNrQ29udGV4dCgpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgewogICAgICAgIHJldHVybiB3aW5kb3c7CiAgICB9CiAgICByZXR1cm4ge307Cn0KLyoqCiAqIENvbmZpZ3VyZXMgWFNSRiBwcm90ZWN0aW9uIHN1cHBvcnQgZm9yIG91dGdvaW5nIHJlcXVlc3RzLgogKgogKiBGb3IgYSBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyBhIGNvb2tpZS1iYXNlZCBYU1JGIHByb3RlY3Rpb24gc3lzdGVtLAogKiB1c2UgZGlyZWN0bHkgdG8gY29uZmlndXJlIFhTUkYgcHJvdGVjdGlvbiB3aXRoIHRoZSBjb3JyZWN0CiAqIGNvb2tpZSBhbmQgaGVhZGVyIG5hbWVzLgogKgogKiBJZiBubyBuYW1lcyBhcmUgc3VwcGxpZWQsIHRoZSBkZWZhdWx0IGNvb2tpZSBuYW1lIGlzIGBYU1JGLVRPS0VOYAogKiBhbmQgdGhlIGRlZmF1bHQgaGVhZGVyIG5hbWUgaXMgYFgtWFNSRi1UT0tFTmAuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIdHRwQ2xpZW50WHNyZk1vZHVsZSB7CiAgICAvKioKICAgICAqIERpc2FibGUgdGhlIGRlZmF1bHQgWFNSRiBwcm90ZWN0aW9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGRpc2FibGUoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmdNb2R1bGU6IEh0dHBDbGllbnRYc3JmTW9kdWxlLAogICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogSHR0cFhzcmZJbnRlcmNlcHRvciwgdXNlQ2xhc3M6IE5vb3BJbnRlcmNlcHRvciB9LAogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIENvbmZpZ3VyZSBYU1JGIHByb3RlY3Rpb24uCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIEFuIG9iamVjdCB0aGF0IGNhbiBzcGVjaWZ5IGVpdGhlciBvciBib3RoCiAgICAgKiBjb29raWUgbmFtZSBvciBoZWFkZXIgbmFtZS4KICAgICAqIC0gQ29va2llIG5hbWUgZGVmYXVsdCBpcyBgWFNSRi1UT0tFTmAuCiAgICAgKiAtIEhlYWRlciBuYW1lIGRlZmF1bHQgaXMgYFgtWFNSRi1UT0tFTmAuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIHdpdGhPcHRpb25zKG9wdGlvbnMgPSB7fSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5nTW9kdWxlOiBIdHRwQ2xpZW50WHNyZk1vZHVsZSwKICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICBvcHRpb25zLmNvb2tpZU5hbWUgPyB7IHByb3ZpZGU6IFhTUkZfQ09PS0lFX05BTUUsIHVzZVZhbHVlOiBvcHRpb25zLmNvb2tpZU5hbWUgfSA6IFtdLAogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJOYW1lID8geyBwcm92aWRlOiBYU1JGX0hFQURFUl9OQU1FLCB1c2VWYWx1ZTogb3B0aW9ucy5oZWFkZXJOYW1lIH0gOiBbXSwKICAgICAgICAgICAgXSwKICAgICAgICB9OwogICAgfQp9Ckh0dHBDbGllbnRYc3JmTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogSHR0cENsaWVudFhzcmZNb2R1bGUgfSk7Ckh0dHBDbGllbnRYc3JmTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gSHR0cENsaWVudFhzcmZNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cENsaWVudFhzcmZNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogWwogICAgICAgIEh0dHBYc3JmSW50ZXJjZXB0b3IsCiAgICAgICAgeyBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUywgdXNlRXhpc3Rpbmc6IEh0dHBYc3JmSW50ZXJjZXB0b3IsIG11bHRpOiB0cnVlIH0sCiAgICAgICAgeyBwcm92aWRlOiBIdHRwWHNyZlRva2VuRXh0cmFjdG9yLCB1c2VDbGFzczogSHR0cFhzcmZDb29raWVFeHRyYWN0b3IgfSwKICAgICAgICB7IHByb3ZpZGU6IFhTUkZfQ09PS0lFX05BTUUsIHVzZVZhbHVlOiAnWFNSRi1UT0tFTicgfSwKICAgICAgICB7IHByb3ZpZGU6IFhTUkZfSEVBREVSX05BTUUsIHVzZVZhbHVlOiAnWC1YU1JGLVRPS0VOJyB9LAogICAgXSB9KTsKLyoqCiAqIENvbmZpZ3VyZXMgdGhlIFtkZXBlbmRlbmN5IGluamVjdG9yXShndWlkZS9nbG9zc2FyeSNpbmplY3RvcikgZm9yIGBIdHRwQ2xpZW50YAogKiB3aXRoIHN1cHBvcnRpbmcgc2VydmljZXMgZm9yIFhTUkYuIEF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgYnkgYEh0dHBDbGllbnRNb2R1bGVgLgogKgogKiBZb3UgY2FuIGFkZCBpbnRlcmNlcHRvcnMgdG8gdGhlIGNoYWluIGJlaGluZCBgSHR0cENsaWVudGAgYnkgYmluZGluZyB0aGVtIHRvIHRoZQogKiBtdWx0aXByb3ZpZGVyIGZvciBidWlsdC1pbiBbREkgdG9rZW5dKGd1aWRlL2dsb3NzYXJ5I2RpLXRva2VuKSBgSFRUUF9JTlRFUkNFUFRPUlNgLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSHR0cENsaWVudE1vZHVsZSB7Cn0KSHR0cENsaWVudE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEh0dHBDbGllbnRNb2R1bGUgfSk7Ckh0dHBDbGllbnRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBIdHRwQ2xpZW50TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEh0dHBDbGllbnRNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogWwogICAgICAgIEh0dHBDbGllbnQsCiAgICAgICAgeyBwcm92aWRlOiBIdHRwSGFuZGxlciwgdXNlQ2xhc3M6IEh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyIH0sCiAgICAgICAgSHR0cFhockJhY2tlbmQsCiAgICAgICAgeyBwcm92aWRlOiBIdHRwQmFja2VuZCwgdXNlRXhpc3Rpbmc6IEh0dHBYaHJCYWNrZW5kIH0sCiAgICAgICAgQnJvd3NlclhociwKICAgICAgICB7IHByb3ZpZGU6IFhockZhY3RvcnksIHVzZUV4aXN0aW5nOiBCcm93c2VyWGhyIH0sCiAgICBdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICBIdHRwQ2xpZW50WHNyZk1vZHVsZS53aXRoT3B0aW9ucyh7CiAgICAgICAgICAgICAgICBjb29raWVOYW1lOiAnWFNSRi1UT0tFTicsCiAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJwogICAgICAgICAgICB9KSwKICAgICAgICBdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoSHR0cENsaWVudE1vZHVsZSwgeyBpbXBvcnRzOiBbSHR0cENsaWVudFhzcmZNb2R1bGVdIH0pOyB9KSgpOwovKioKICogQ29uZmlndXJlcyB0aGUgW2RlcGVuZGVuY3kgaW5qZWN0b3JdKGd1aWRlL2dsb3NzYXJ5I2luamVjdG9yKSBmb3IgYEh0dHBDbGllbnRgCiAqIHdpdGggc3VwcG9ydGluZyBzZXJ2aWNlcyBmb3IgSlNPTlAuCiAqIFdpdGhvdXQgdGhpcyBtb2R1bGUsIEpzb25wIHJlcXVlc3RzIHJlYWNoIHRoZSBiYWNrZW5kCiAqIHdpdGggbWV0aG9kIEpTT05QLCB3aGVyZSB0aGV5IGFyZSByZWplY3RlZC4KICoKICogWW91IGNhbiBhZGQgaW50ZXJjZXB0b3JzIHRvIHRoZSBjaGFpbiBiZWhpbmQgYEh0dHBDbGllbnRgIGJ5IGJpbmRpbmcgdGhlbSB0byB0aGUKICogbXVsdGlwcm92aWRlciBmb3IgYnVpbHQtaW4gW0RJIHRva2VuXShndWlkZS9nbG9zc2FyeSNkaS10b2tlbikgYEhUVFBfSU5URVJDRVBUT1JTYC4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEh0dHBDbGllbnRKc29ucE1vZHVsZSB7Cn0KSHR0cENsaWVudEpzb25wTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogSHR0cENsaWVudEpzb25wTW9kdWxlIH0pOwpIdHRwQ2xpZW50SnNvbnBNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBIdHRwQ2xpZW50SnNvbnBNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cENsaWVudEpzb25wTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICBKc29ucENsaWVudEJhY2tlbmQsCiAgICAgICAgeyBwcm92aWRlOiBKc29ucENhbGxiYWNrQ29udGV4dCwgdXNlRmFjdG9yeToganNvbnBDYWxsYmFja0NvbnRleHQgfSwKICAgICAgICB7IHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLCB1c2VDbGFzczogSnNvbnBJbnRlcmNlcHRvciwgbXVsdGk6IHRydWUgfSwKICAgIF0gfSk7Cgpjb25zdCBfYzAkNyA9IFsiKiJdOwpmdW5jdGlvbiBnZXRNYXRJY29uTmFtZU5vdEZvdW5kRXJyb3IoaWNvbk5hbWUpIHsKICAgIHJldHVybiBFcnJvcihgVW5hYmxlIHRvIGZpbmQgaWNvbiB3aXRoIHRoZSBuYW1lICIke2ljb25OYW1lfSJgKTsKfQovKioKICogUmV0dXJucyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gdGhlIGNvbnN1bWVyIGF0dGVtcHRzIHRvIHVzZQogKiBgPG1hdC1pY29uPmAgd2l0aG91dCBpbmNsdWRpbmcgXEBhbmd1bGFyL2NvbW1vbi9odHRwLgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TWF0SWNvbk5vSHR0cFByb3ZpZGVyRXJyb3IoKSB7CiAgICByZXR1cm4gRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIEh0dHBDbGllbnQgcHJvdmlkZXIgZm9yIHVzZSB3aXRoIEFuZ3VsYXIgTWF0ZXJpYWwgaWNvbnMuICcgKwogICAgICAgICdQbGVhc2UgaW5jbHVkZSB0aGUgSHR0cENsaWVudE1vZHVsZSBmcm9tIEBhbmd1bGFyL2NvbW1vbi9odHRwIGluIHlvdXIgJyArCiAgICAgICAgJ2FwcCBpbXBvcnRzLicpOwp9Ci8qKgogKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhIFVSTCBjb3VsZG4ndCBiZSBzYW5pdGl6ZWQuCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gdXJsIFVSTCB0aGF0IHdhcyBhdHRlbXB0ZWQgdG8gYmUgc2FuaXRpemVkLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TWF0SWNvbkZhaWxlZFRvU2FuaXRpemVVcmxFcnJvcih1cmwpIHsKICAgIHJldHVybiBFcnJvcihgVGhlIFVSTCBwcm92aWRlZCB0byBNYXRJY29uUmVnaXN0cnkgd2FzIG5vdCB0cnVzdGVkIGFzIGEgcmVzb3VyY2UgVVJMIGAgKwogICAgICAgIGB2aWEgQW5ndWxhcidzIERvbVNhbml0aXplci4gQXR0ZW1wdGVkIFVSTCB3YXMgIiR7dXJsfSIuYCk7Cn0KLyoqCiAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGEgSFRNTCBzdHJpbmcgY291bGRuJ3QgYmUgc2FuaXRpemVkLgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcGFyYW0gez99IGxpdGVyYWwgSFRNTCB0aGF0IHdhcyBhdHRlbXB0ZWQgdG8gYmUgc2FuaXRpemVkLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TWF0SWNvbkZhaWxlZFRvU2FuaXRpemVMaXRlcmFsRXJyb3IobGl0ZXJhbCkgewogICAgcmV0dXJuIEVycm9yKGBUaGUgbGl0ZXJhbCBwcm92aWRlZCB0byBNYXRJY29uUmVnaXN0cnkgd2FzIG5vdCB0cnVzdGVkIGFzIHNhZmUgSFRNTCBieSBgICsKICAgICAgICBgQW5ndWxhcidzIERvbVNhbml0aXplci4gQXR0ZW1wdGVkIGxpdGVyYWwgd2FzICIke2xpdGVyYWx9Ii5gKTsKfQovKioKICogQ29uZmlndXJhdGlvbiBmb3IgYW4gaWNvbiwgaW5jbHVkaW5nIHRoZSBVUkwgYW5kIHBvc3NpYmx5IHRoZSBjYWNoZWQgU1ZHIGVsZW1lbnQuCiAqIFxAZG9jcy1wcml2YXRlCiAqLwpjbGFzcyBTdmdJY29uQ29uZmlnIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYGluc3RhbmNlb2YgU1ZHRWxlbWVudGAgaGVyZSwKICAgICAgICAvLyBiZWNhdXNlIGl0J2xsIGJyZWFrIGR1cmluZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuCiAgICAgICAgaWYgKCEhKCgvKiogQHR5cGUgez99ICovIChkYXRhKSkpLm5vZGVOYW1lKSB7CiAgICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChkYXRhKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLnVybCA9ICgvKiogQHR5cGUgez99ICovIChkYXRhKSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBTZXJ2aWNlIHRvIHJlZ2lzdGVyIGFuZCBkaXNwbGF5IGljb25zIHVzZWQgYnkgdGhlIGA8bWF0LWljb24+YCBjb21wb25lbnQuCiAqIC0gUmVnaXN0ZXJzIGljb24gVVJMcyBieSBuYW1lc3BhY2UgYW5kIG5hbWUuCiAqIC0gUmVnaXN0ZXJzIGljb24gc2V0IFVSTHMgYnkgbmFtZXNwYWNlLgogKiAtIFJlZ2lzdGVycyBhbGlhc2VzIGZvciBDU1MgY2xhc3NlcywgZm9yIHVzZSB3aXRoIGljb24gZm9udHMuCiAqIC0gTG9hZHMgaWNvbnMgZnJvbSBVUkxzIGFuZCBleHRyYWN0cyBpbmRpdmlkdWFsIGljb25zIGZyb20gaWNvbiBzZXRzLgogKi8KY2xhc3MgTWF0SWNvblJlZ2lzdHJ5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfaHR0cENsaWVudAogICAgICogQHBhcmFtIHs/fSBfc2FuaXRpemVyCiAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgKiBAcGFyYW0gez89fSBfZXJyb3JIYW5kbGVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9odHRwQ2xpZW50LCBfc2FuaXRpemVyLCBkb2N1bWVudCwgX2Vycm9ySGFuZGxlcikgewogICAgICAgIHRoaXMuX2h0dHBDbGllbnQgPSBfaHR0cENsaWVudDsKICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBfc2FuaXRpemVyOwogICAgICAgIHRoaXMuX2Vycm9ySGFuZGxlciA9IF9lcnJvckhhbmRsZXI7CiAgICAgICAgLyoqCiAgICAgICAgICogVVJMcyBhbmQgY2FjaGVkIFNWRyBlbGVtZW50cyBmb3IgaW5kaXZpZHVhbCBpY29ucy4gS2V5cyBhcmUgb2YgdGhlIGZvcm1hdCAiW25hbWVzcGFjZV06W2ljb25dIi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zdmdJY29uQ29uZmlncyA9IG5ldyBNYXAoKTsKICAgICAgICAvKioKICAgICAgICAgKiBTdmdJY29uQ29uZmlnIG9iamVjdHMgYW5kIGNhY2hlZCBTVkcgZWxlbWVudHMgZm9yIGljb24gc2V0cywga2V5ZWQgYnkgbmFtZXNwYWNlLgogICAgICAgICAqIE11bHRpcGxlIGljb24gc2V0cyBjYW4gYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lc3BhY2UuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faWNvblNldENvbmZpZ3MgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FjaGUgZm9yIGljb25zIGxvYWRlZCBieSBkaXJlY3QgVVJMcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9jYWNoZWRJY29uc0J5VXJsID0gbmV3IE1hcCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEluLXByb2dyZXNzIGljb24gZmV0Y2hlcy4gVXNlZCB0byBjb2FsZXNjZSBtdWx0aXBsZSByZXF1ZXN0cyB0byB0aGUgc2FtZSBVUkwuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIGZyb20gZm9udCBpZGVudGlmaWVycyB0byB0aGVpciBDU1MgY2xhc3MgbmFtZXMuIFVzZWQgZm9yIGljb24gZm9udHMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZm9udENzc0NsYXNzZXNCeUFsaWFzID0gbmV3IE1hcCgpOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgd2hlbiBhbiBgPG1hdC1pY29uPmAgY29tcG9uZW50IGhhcyBubyBpY29uIG5hbWUsIHVybCwgb3IgZm9udCBzcGVjaWZpZWQuCiAgICAgICAgICogVGhlIGRlZmF1bHQgJ21hdGVyaWFsLWljb25zJyB2YWx1ZSBhc3N1bWVzIHRoYXQgdGhlIG1hdGVyaWFsIGljb24gZm9udCBoYXMgYmVlbiBsb2FkZWQgYXMKICAgICAgICAgKiBkZXNjcmliZWQgYXQgaHR0cDovL2dvb2dsZS5naXRodWIuaW8vbWF0ZXJpYWwtZGVzaWduLWljb25zLyNpY29uLWZvbnQtZm9yLXRoZS13ZWIKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzID0gJ21hdGVyaWFsLWljb25zJzsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYW4gaWNvbiBieSBVUkwgaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/fSBpY29uTmFtZSBOYW1lIHVuZGVyIHdoaWNoIHRoZSBpY29uIHNob3VsZCBiZSByZWdpc3RlcmVkLgogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIGFkZFN2Z0ljb24oaWNvbk5hbWUsIHVybCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLmFkZFN2Z0ljb25Jbk5hbWVzcGFjZSgnJywgaWNvbk5hbWUsIHVybCwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHVzaW5nIGFuIEhUTUwgc3RyaW5nIGluIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gaWNvbk5hbWUgTmFtZSB1bmRlciB3aGljaCB0aGUgaWNvbiBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KICAgICAqIEBwYXJhbSB7P30gbGl0ZXJhbCBTVkcgc291cmNlIG9mIHRoZSBpY29uLgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgYWRkU3ZnSWNvbkxpdGVyYWwoaWNvbk5hbWUsIGxpdGVyYWwsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5hZGRTdmdJY29uTGl0ZXJhbEluTmFtZXNwYWNlKCcnLCBpY29uTmFtZSwgbGl0ZXJhbCwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIGJ5IFVSTCBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbiB3aGljaCB0aGUgaWNvbiBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KICAgICAqIEBwYXJhbSB7P30gaWNvbk5hbWUgTmFtZSB1bmRlciB3aGljaCB0aGUgaWNvbiBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBhZGRTdmdJY29uSW5OYW1lc3BhY2UobmFtZXNwYWNlLCBpY29uTmFtZSwgdXJsLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FkZFN2Z0ljb25Db25maWcobmFtZXNwYWNlLCBpY29uTmFtZSwgbmV3IFN2Z0ljb25Db25maWcodXJsLCBvcHRpb25zKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHVzaW5nIGFuIEhUTUwgc3RyaW5nIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgogICAgICogQHRlbXBsYXRlIFRISVMKICAgICAqIEB0aGlzIHtUSElTfQogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluIHdoaWNoIHRoZSBpY29uIHNob3VsZCBiZSByZWdpc3RlcmVkLgogICAgICogQHBhcmFtIHs/fSBpY29uTmFtZSBOYW1lIHVuZGVyIHdoaWNoIHRoZSBpY29uIHNob3VsZCBiZSByZWdpc3RlcmVkLgogICAgICogQHBhcmFtIHs/fSBsaXRlcmFsIFNWRyBzb3VyY2Ugb2YgdGhlIGljb24uCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBhZGRTdmdJY29uTGl0ZXJhbEluTmFtZXNwYWNlKG5hbWVzcGFjZSwgaWNvbk5hbWUsIGxpdGVyYWwsIG9wdGlvbnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2FuaXRpemVkTGl0ZXJhbCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgbGl0ZXJhbCk7CiAgICAgICAgaWYgKCFzYW5pdGl6ZWRMaXRlcmFsKSB7CiAgICAgICAgICAgIHRocm93IGdldE1hdEljb25GYWlsZWRUb1Nhbml0aXplTGl0ZXJhbEVycm9yKGxpdGVyYWwpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2NyZWF0ZVN2Z0VsZW1lbnRGb3JTaW5nbGVJY29uKHNhbml0aXplZExpdGVyYWwsIG9wdGlvbnMpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9hZGRTdmdJY29uQ29uZmlnKG5hbWVzcGFjZSwgaWNvbk5hbWUsIG5ldyBTdmdJY29uQ29uZmlnKHN2Z0VsZW1lbnQsIG9wdGlvbnMpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGFuIGljb24gc2V0IGJ5IFVSTCBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7VEhJU30KICAgICAqLwogICAgYWRkU3ZnSWNvblNldCh1cmwsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5hZGRTdmdJY29uU2V0SW5OYW1lc3BhY2UoJycsIHVybCwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHNldCB1c2luZyBhbiBIVE1MIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IGxpdGVyYWwgU1ZHIHNvdXJjZSBvZiB0aGUgaWNvbiBzZXQuCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBhZGRTdmdJY29uU2V0TGl0ZXJhbChsaXRlcmFsLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuYWRkU3ZnSWNvblNldExpdGVyYWxJbk5hbWVzcGFjZSgnJywgbGl0ZXJhbCwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHNldCBieSBVUkwgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW4gd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGljb24gc2V0LgogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIGFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZShuYW1lc3BhY2UsIHVybCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9hZGRTdmdJY29uU2V0Q29uZmlnKG5hbWVzcGFjZSwgbmV3IFN2Z0ljb25Db25maWcodXJsLCBvcHRpb25zKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHNldCB1c2luZyBhbiBIVE1MIHN0cmluZyBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbiB3aGljaCB0byByZWdpc3RlciB0aGUgaWNvbiBzZXQuCiAgICAgKiBAcGFyYW0gez99IGxpdGVyYWwgU1ZHIHNvdXJjZSBvZiB0aGUgaWNvbiBzZXQuCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBhZGRTdmdJY29uU2V0TGl0ZXJhbEluTmFtZXNwYWNlKG5hbWVzcGFjZSwgbGl0ZXJhbCwgb3B0aW9ucykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzYW5pdGl6ZWRMaXRlcmFsID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBsaXRlcmFsKTsKICAgICAgICBpZiAoIXNhbml0aXplZExpdGVyYWwpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0SWNvbkZhaWxlZFRvU2FuaXRpemVMaXRlcmFsRXJyb3IobGl0ZXJhbCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdmdFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fc3ZnRWxlbWVudEZyb21TdHJpbmcoc2FuaXRpemVkTGl0ZXJhbCk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FkZFN2Z0ljb25TZXRDb25maWcobmFtZXNwYWNlLCBuZXcgU3ZnSWNvbkNvbmZpZyhzdmdFbGVtZW50LCBvcHRpb25zKSk7CiAgICB9CiAgICAvKioKICAgICAqIERlZmluZXMgYW4gYWxpYXMgZm9yIGEgQ1NTIGNsYXNzIG5hbWUgdG8gYmUgdXNlZCBmb3IgaWNvbiBmb250cy4gQ3JlYXRpbmcgYW4gbWF0SWNvbgogICAgICogY29tcG9uZW50IHdpdGggdGhlIGFsaWFzIGFzIHRoZSBmb250U2V0IGlucHV0IHdpbGwgY2F1c2UgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwbGllZAogICAgICogdG8gdGhlIGA8bWF0LWljb24+YCBlbGVtZW50LgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gYWxpYXMgQWxpYXMgZm9yIHRoZSBmb250LgogICAgICogQHBhcmFtIHs/PX0gY2xhc3NOYW1lIENsYXNzIG5hbWUgb3ZlcnJpZGUgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhbGlhcy4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIHJlZ2lzdGVyRm9udENsYXNzQWxpYXMoYWxpYXMsIGNsYXNzTmFtZSA9IGFsaWFzKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fZm9udENzc0NsYXNzZXNCeUFsaWFzLnNldChhbGlhcywgY2xhc3NOYW1lKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgQ1NTIGNsYXNzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGlhcyBieSBhIHByZXZpb3VzIGNhbGwgdG8KICAgICAqIHJlZ2lzdGVyRm9udENsYXNzQWxpYXMuIElmIG5vIENTUyBjbGFzcyBoYXMgYmVlbiBhc3NvY2lhdGVkLCByZXR1cm5zIHRoZSBhbGlhcyB1bm1vZGlmaWVkLgogICAgICogQHBhcmFtIHs/fSBhbGlhcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xhc3NOYW1lRm9yRm9udEFsaWFzKGFsaWFzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRDc3NDbGFzc2VzQnlBbGlhcy5nZXQoYWxpYXMpIHx8IGFsaWFzOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSB1c2VkIGZvciBpY29uIGZvbnRzIHdoZW4gYW4gYDxtYXQtaWNvbj5gIGNvbXBvbmVudCBkb2VzIG5vdAogICAgICogaGF2ZSBhIGZvbnRTZXQgaW5wdXQgdmFsdWUsIGFuZCBpcyBub3QgbG9hZGluZyBhbiBpY29uIGJ5IG5hbWUgb3IgVVJMLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lCiAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICovCiAgICBzZXREZWZhdWx0Rm9udFNldENsYXNzKGNsYXNzTmFtZSkgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2RlZmF1bHRGb250U2V0Q2xhc3MgPSBjbGFzc05hbWU7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIENTUyBjbGFzcyBuYW1lIHRvIGJlIHVzZWQgZm9yIGljb24gZm9udHMgd2hlbiBhbiBgPG1hdC1pY29uPmAgY29tcG9uZW50IGRvZXMgbm90CiAgICAgKiBoYXZlIGEgZm9udFNldCBpbnB1dCB2YWx1ZSwgYW5kIGlzIG5vdCBsb2FkaW5nIGFuIGljb24gYnkgbmFtZSBvciBVUkwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXREZWZhdWx0Rm9udFNldENsYXNzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBwcm9kdWNlcyB0aGUgaWNvbiAoYXMgYW4gYDxzdmc+YCBET00gZWxlbWVudCkgZnJvbSB0aGUgZ2l2ZW4gVVJMLgogICAgICogVGhlIHJlc3BvbnNlIGZyb20gdGhlIFVSTCBtYXkgYmUgY2FjaGVkIHNvIHRoaXMgd2lsbCBub3QgYWx3YXlzIGNhdXNlIGFuIEhUVFAgcmVxdWVzdCwgYnV0CiAgICAgKiB0aGUgcHJvZHVjZWQgZWxlbWVudCB3aWxsIGFsd2F5cyBiZSBhIG5ldyBjb3B5IG9mIHRoZSBvcmlnaW5hbGx5IGZldGNoZWQgaWNvbi4gKFRoYXQgaXMsCiAgICAgKiBpdCB3aWxsIG5vdCBjb250YWluIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gZWxlbWVudHMgcHJldmlvdXNseSByZXR1cm5lZCkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBzYWZlVXJsIFVSTCBmcm9tIHdoaWNoIHRvIGZldGNoIHRoZSBTVkcgaWNvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFN2Z0ljb25Gcm9tVXJsKHNhZmVVcmwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHNhZmVVcmwpOwogICAgICAgIGlmICghdXJsKSB7CiAgICAgICAgICAgIHRocm93IGdldE1hdEljb25GYWlsZWRUb1Nhbml0aXplVXJsRXJyb3Ioc2FmZVVybCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjYWNoZWRJY29uID0gdGhpcy5fY2FjaGVkSWNvbnNCeVVybC5nZXQodXJsKTsKICAgICAgICBpZiAoY2FjaGVkSWNvbikgewogICAgICAgICAgICByZXR1cm4gb2YoY2xvbmVTdmcoY2FjaGVkSWNvbikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKG5ldyBTdmdJY29uQ29uZmlnKHNhZmVVcmwpKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN2ZyA9PiB0aGlzLl9jYWNoZWRJY29uc0J5VXJsLnNldCgoLyoqIEB0eXBlIHs/fSAqLyAodXJsKSksIHN2ZykpKSwgbWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN2ZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3ZnID0+IGNsb25lU3ZnKHN2ZykpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IHByb2R1Y2VzIHRoZSBpY29uIChhcyBhbiBgPHN2Zz5gIERPTSBlbGVtZW50KSB3aXRoIHRoZSBnaXZlbiBuYW1lCiAgICAgKiBhbmQgbmFtZXNwYWNlLiBUaGUgaWNvbiBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBhZGRJY29uIG9yIGFkZEljb25TZXQ7CiAgICAgKiBpZiBub3QsIHRoZSBPYnNlcnZhYmxlIHdpbGwgdGhyb3cgYW4gZXJyb3IuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuYW1lIE5hbWUgb2YgdGhlIGljb24gdG8gYmUgcmV0cmlldmVkLgogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgaWNvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldE5hbWVkU3ZnSWNvbihuYW1lLCBuYW1lc3BhY2UgPSAnJykgewogICAgICAgIC8vIFJldHVybiAoY29weSBvZikgY2FjaGVkIGljb24gaWYgcG9zc2libGUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IGljb25LZXkobmFtZXNwYWNlLCBuYW1lKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fc3ZnSWNvbkNvbmZpZ3MuZ2V0KGtleSk7CiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3ZnRnJvbUNvbmZpZyhjb25maWcpOwogICAgICAgIH0KICAgICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbnkgaWNvbiBzZXRzIHJlZ2lzdGVyZWQgZm9yIHRoZSBuYW1lc3BhY2UuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGljb25TZXRDb25maWdzID0gdGhpcy5faWNvblNldENvbmZpZ3MuZ2V0KG5hbWVzcGFjZSk7CiAgICAgICAgaWYgKGljb25TZXRDb25maWdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTdmdGcm9tSWNvblNldENvbmZpZ3MobmFtZSwgaWNvblNldENvbmZpZ3MpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihnZXRNYXRJY29uTmFtZU5vdEZvdW5kRXJyb3Ioa2V5KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuX3N2Z0ljb25Db25maWdzLmNsZWFyKCk7CiAgICAgICAgdGhpcy5faWNvblNldENvbmZpZ3MuY2xlYXIoKTsKICAgICAgICB0aGlzLl9jYWNoZWRJY29uc0J5VXJsLmNsZWFyKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCBpY29uIGZvciBhIFN2Z0ljb25Db25maWcgaWYgYXZhaWxhYmxlLCBvciBmZXRjaGVzIGl0IGZyb20gaXRzIFVSTCBpZiBub3QuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRTdmdGcm9tQ29uZmlnKGNvbmZpZykgewogICAgICAgIGlmIChjb25maWcuc3ZnRWxlbWVudCkgewogICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIFNWRyBlbGVtZW50IGZvciB0aGlzIGljb24sIHJldHVybiBhIGNvcHkuCiAgICAgICAgICAgIHJldHVybiBvZihjbG9uZVN2Zyhjb25maWcuc3ZnRWxlbWVudCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGljb24gZnJvbSB0aGUgY29uZmlnJ3MgVVJMLCBjYWNoZSBpdCwgYW5kIHJldHVybiBhIGNvcHkuCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkU3ZnSWNvbkZyb21Db25maWcoY29uZmlnKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3ZnCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdmcgPT4gY29uZmlnLnN2Z0VsZW1lbnQgPSBzdmcpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN2ZyA9PiBjbG9uZVN2ZyhzdmcpKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQXR0ZW1wdHMgdG8gZmluZCBhbiBpY29uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIGFueSBvZiB0aGUgU1ZHIGljb24gc2V0cy4KICAgICAqIEZpcnN0IHNlYXJjaGVzIHRoZSBhdmFpbGFibGUgY2FjaGVkIGljb25zIGZvciBhIG5lc3RlZCBlbGVtZW50IHdpdGggYSBtYXRjaGluZyBuYW1lLCBhbmQKICAgICAqIGlmIGZvdW5kIGNvcGllcyB0aGUgZWxlbWVudCB0byBhIG5ldyBgPHN2Zz5gIGVsZW1lbnQuIElmIG5vdCBmb3VuZCwgZmV0Y2hlcyBhbGwgaWNvbiBzZXRzCiAgICAgKiB0aGF0IGhhdmUgbm90IGJlZW4gY2FjaGVkLCBhbmQgc2VhcmNoZXMgYWdhaW4gYWZ0ZXIgYWxsIGZldGNoZXMgYXJlIGNvbXBsZXRlZC4KICAgICAqIFRoZSByZXR1cm5lZCBPYnNlcnZhYmxlIHByb2R1Y2VzIHRoZSBTVkcgZWxlbWVudCBpZiBwb3NzaWJsZSwgYW5kIHRocm93cwogICAgICogYW4gZXJyb3IgaWYgbm8gaWNvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IGljb25TZXRDb25maWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0U3ZnRnJvbUljb25TZXRDb25maWdzKG5hbWUsIGljb25TZXRDb25maWdzKSB7CiAgICAgICAgLy8gRm9yIGFsbCB0aGUgaWNvbiBzZXQgU1ZHIGVsZW1lbnRzIHdlJ3ZlIGZldGNoZWQsIHNlZSBpZiBhbnkgY29udGFpbiBhbiBpY29uIHdpdGggdGhlCiAgICAgICAgLy8gcmVxdWVzdGVkIG5hbWUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5hbWVkSWNvbiA9IHRoaXMuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KG5hbWUsIGljb25TZXRDb25maWdzKTsKICAgICAgICBpZiAobmFtZWRJY29uKSB7CiAgICAgICAgICAgIC8vIFdlIGNvdWxkIGNhY2hlIG5hbWVkSWNvbiBpbiBfc3ZnSWNvbkNvbmZpZ3MsIGJ1dCBzaW5jZSB3ZSBoYXZlIHRvIG1ha2UgYSBjb3B5IGV2ZXJ5CiAgICAgICAgICAgIC8vIHRpbWUgYW55d2F5LCB0aGVyZSdzIHByb2JhYmx5IG5vdCBtdWNoIGFkdmFudGFnZSBjb21wYXJlZCB0byBqdXN0IGFsd2F5cyBleHRyYWN0aW5nCiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGljb24gc2V0LgogICAgICAgICAgICByZXR1cm4gb2YobmFtZWRJY29uKTsKICAgICAgICB9CiAgICAgICAgLy8gTm90IGZvdW5kIGluIGFueSBjYWNoZWQgaWNvbiBzZXRzLiBJZiB0aGVyZSBhcmUgaWNvbiBzZXRzIHdpdGggVVJMcyB0aGF0IHdlIGhhdmVuJ3QKICAgICAgICAvLyBmZXRjaGVkLCBmZXRjaCB0aGVtIG5vdyBhbmQgbG9vayBmb3IgaWNvbk5hbWUgaW4gdGhlIHJlc3VsdHMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGljb25TZXRGZXRjaFJlcXVlc3RzID0gaWNvblNldENvbmZpZ3MKICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpY29uU2V0Q29uZmlnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpY29uU2V0Q29uZmlnID0+ICFpY29uU2V0Q29uZmlnLnN2Z0VsZW1lbnQpKQogICAgICAgICAgICAubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGljb25TZXRDb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGljb25TZXRDb25maWcgPT4gewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFN2Z0ljb25TZXRGcm9tQ29uZmlnKGljb25TZXRDb25maWcpLnBpcGUoY2F0Y2hFcnJvcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgaWNvblNldENvbmZpZy51cmwpOwogICAgICAgICAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgZmV0Y2hpbmcgaW5kaXZpZHVhbCBVUkxzIHNvIHRoZQogICAgICAgICAgICAgICAgLy8gY29tYmluZWQgT2JzZXJ2YWJsZSB3b24ndCBuZWNlc3NhcmlseSBmYWlsLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYExvYWRpbmcgaWNvbiBzZXQgVVJMOiAke3VybH0gZmFpbGVkOiAke2Vyci5tZXNzYWdlfWA7CiAgICAgICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDkuMC4wIF9lcnJvckhhbmRsZXIgcGFyYW1ldGVyIHRvIGJlIG1hZGUgcmVxdWlyZWQKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvckhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0pKTsKICAgICAgICAvLyBGZXRjaCBhbGwgdGhlIGljb24gc2V0IFVSTHMuIFdoZW4gdGhlIHJlcXVlc3RzIGNvbXBsZXRlLCBldmVyeSBJY29uU2V0IHNob3VsZCBoYXZlIGEKICAgICAgICAvLyBjYWNoZWQgU1ZHIGVsZW1lbnQgKHVubGVzcyB0aGUgcmVxdWVzdCBmYWlsZWQpLCBhbmQgd2UgY2FuIGNoZWNrIGFnYWluIGZvciB0aGUgaWNvbi4KICAgICAgICByZXR1cm4gZm9ya0pvaW4oaWNvblNldEZldGNoUmVxdWVzdHMpLnBpcGUobWFwKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmb3VuZEljb24gPSB0aGlzLl9leHRyYWN0SWNvbldpdGhOYW1lRnJvbUFueVNldChuYW1lLCBpY29uU2V0Q29uZmlncyk7CiAgICAgICAgICAgIGlmICghZm91bmRJY29uKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRJY29uTmFtZU5vdEZvdW5kRXJyb3IobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kSWNvbjsKICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBTZWFyY2hlcyB0aGUgY2FjaGVkIFNWRyBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGljb24gc2V0cyBmb3IgYSBuZXN0ZWQgaWNvbiBlbGVtZW50IHdob3NlICJpZCIKICAgICAqIHRhZyBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbmFtZS4gSWYgZm91bmQsIGNvcGllcyB0aGUgbmVzdGVkIGVsZW1lbnQgdG8gYSBuZXcgU1ZHIGVsZW1lbnQgYW5kCiAgICAgKiByZXR1cm5zIGl0LiBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGljb25OYW1lCiAgICAgKiBAcGFyYW0gez99IGljb25TZXRDb25maWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZXh0cmFjdEljb25XaXRoTmFtZUZyb21BbnlTZXQoaWNvbk5hbWUsIGljb25TZXRDb25maWdzKSB7CiAgICAgICAgLy8gSXRlcmF0ZSBiYWNrd2FyZHMsIHNvIGljb24gc2V0cyBhZGRlZCBsYXRlciBoYXZlIHByZWNlZGVuY2UuCiAgICAgICAgZm9yIChsZXQgaSA9IGljb25TZXRDb25maWdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29uZmlnID0gaWNvblNldENvbmZpZ3NbaV07CiAgICAgICAgICAgIGlmIChjb25maWcuc3ZnRWxlbWVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZm91bmRJY29uID0gdGhpcy5fZXh0cmFjdFN2Z0ljb25Gcm9tU2V0KGNvbmZpZy5zdmdFbGVtZW50LCBpY29uTmFtZSwgY29uZmlnLm9wdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGZvdW5kSWNvbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEljb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIExvYWRzIHRoZSBjb250ZW50IG9mIHRoZSBpY29uIFVSTCBzcGVjaWZpZWQgaW4gdGhlIFN2Z0ljb25Db25maWcgYW5kIGNyZWF0ZXMgYW4gU1ZHIGVsZW1lbnQKICAgICAqIGZyb20gaXQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9sb2FkU3ZnSWNvbkZyb21Db25maWcoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoVXJsKGNvbmZpZy51cmwpCiAgICAgICAgICAgIC5waXBlKG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdmdUZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdmdUZXh0ID0+IHRoaXMuX2NyZWF0ZVN2Z0VsZW1lbnRGb3JTaW5nbGVJY29uKHN2Z1RleHQsIGNvbmZpZy5vcHRpb25zKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogTG9hZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGljb24gc2V0IFVSTCBzcGVjaWZpZWQgaW4gdGhlIFN2Z0ljb25Db25maWcgYW5kIGNyZWF0ZXMgYW4gU1ZHIGVsZW1lbnQKICAgICAqIGZyb20gaXQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9sb2FkU3ZnSWNvblNldEZyb21Db25maWcoY29uZmlnKSB7CiAgICAgICAgLy8gSWYgdGhlIFNWRyBmb3IgdGhpcyBpY29uIHNldCBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCwgZG8gbm90aGluZy4KICAgICAgICBpZiAoY29uZmlnLnN2Z0VsZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIG9mKGNvbmZpZy5zdmdFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoVXJsKGNvbmZpZy51cmwpLnBpcGUobWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN2Z1RleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN2Z1RleHQgPT4gewogICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBpY29uIHNldCB3YXMgcGFyc2VkIGFuZCBjYWNoZWQgYnkgYW4gZWFybGllciByZXF1ZXN0LCBzbyBwYXJzaW5nCiAgICAgICAgICAgIC8vIG9ubHkgbmVlZHMgdG8gb2NjdXIgaWYgdGhlIGNhY2hlIGlzIHlldCB1bnNldC4KICAgICAgICAgICAgaWYgKCFjb25maWcuc3ZnRWxlbWVudCkgewogICAgICAgICAgICAgICAgY29uZmlnLnN2Z0VsZW1lbnQgPSB0aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyhzdmdUZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29uZmlnLnN2Z0VsZW1lbnQ7CiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIERPTSBlbGVtZW50IGZyb20gdGhlIGdpdmVuIFNWRyBzdHJpbmcsIGFuZCBhZGRzIGRlZmF1bHQgYXR0cmlidXRlcy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJlc3BvbnNlVGV4dAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NyZWF0ZVN2Z0VsZW1lbnRGb3JTaW5nbGVJY29uKHJlc3BvbnNlVGV4dCwgb3B0aW9ucykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdmcgPSB0aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyhyZXNwb25zZVRleHQpOwogICAgICAgIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoc3ZnLCBvcHRpb25zKTsKICAgICAgICByZXR1cm4gc3ZnOwogICAgfQogICAgLyoqCiAgICAgKiBTZWFyY2hlcyB0aGUgY2FjaGVkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIFN2Z0ljb25Db25maWcgZm9yIGEgbmVzdGVkIGljb24gZWxlbWVudCB3aG9zZSAiaWQiCiAgICAgKiB0YWcgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG5hbWUuIElmIGZvdW5kLCBjb3BpZXMgdGhlIG5lc3RlZCBlbGVtZW50IHRvIGEgbmV3IFNWRyBlbGVtZW50IGFuZAogICAgICogcmV0dXJucyBpdC4gUmV0dXJucyBudWxsIGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBpY29uU2V0CiAgICAgKiBAcGFyYW0gez99IGljb25OYW1lCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZXh0cmFjdFN2Z0ljb25Gcm9tU2V0KGljb25TZXQsIGljb25OYW1lLCBvcHRpb25zKSB7CiAgICAgICAgLy8gVXNlIHRoZSBgaWQ9Imljb25OYW1lImAgc3ludGF4IGluIG9yZGVyIHRvIGVzY2FwZSBzcGVjaWFsCiAgICAgICAgLy8gY2hhcmFjdGVycyBpbiB0aGUgSUQgKHZlcnN1cyB1c2luZyB0aGUgI2ljb25OYW1lIHN5bnRheCkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGljb25Tb3VyY2UgPSBpY29uU2V0LnF1ZXJ5U2VsZWN0b3IoYFtpZD0iJHtpY29uTmFtZX0iXWApOwogICAgICAgIGlmICghaWNvblNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gQ2xvbmUgdGhlIGVsZW1lbnQgYW5kIHJlbW92ZSB0aGUgSUQgdG8gcHJldmVudCBtdWx0aXBsZSBlbGVtZW50cyBmcm9tIGJlaW5nIGFkZGVkCiAgICAgICAgLy8gdG8gdGhlIHBhZ2Ugd2l0aCB0aGUgc2FtZSBJRC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaWNvbkVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaWNvblNvdXJjZS5jbG9uZU5vZGUodHJ1ZSkpKTsKICAgICAgICBpY29uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7CiAgICAgICAgLy8gSWYgdGhlIGljb24gbm9kZSBpcyBpdHNlbGYgYW4gPHN2Zz4gbm9kZSwgY2xvbmUgYW5kIHJldHVybiBpdCBkaXJlY3RseS4gSWYgbm90LCBzZXQgaXQgYXMKICAgICAgICAvLyB0aGUgY29udGVudCBvZiBhIG5ldyA8c3ZnPiBub2RlLgogICAgICAgIGlmIChpY29uRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3ZnJykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcygoLyoqIEB0eXBlIHs/fSAqLyAoaWNvbkVsZW1lbnQpKSwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGEgPHN5bWJvbD4sIGl0IHdvbid0IGJlIHJlbmRlcmVkIHNvIHdlIGhhdmUgdG8gY29udmVydCBpdCBpbnRvIDxzdmc+LiBOb3RlCiAgICAgICAgLy8gdGhhdCB0aGUgc2FtZSBjb3VsZCBiZSBhY2hpZXZlZCBieSByZWZlcnJpbmcgdG8gaXQgdmlhIDx1c2UgaHJlZj0iI2lkIj4sIGhvd2V2ZXIgdGhlIDx1c2U+CiAgICAgICAgLy8gdGFnIGlzIHByb2JsZW1hdGljIG9uIEZpcmVmb3gsIGJlY2F1c2UgaXQgbmVlZHMgdG8gaW5jbHVkZSB0aGUgY3VycmVudCBwYWdlIHBhdGguCiAgICAgICAgaWYgKGljb25FbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzeW1ib2wnKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRTdmdBdHRyaWJ1dGVzKHRoaXMuX3RvU3ZnRWxlbWVudChpY29uRWxlbWVudCksIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvLyBjcmVhdGVFbGVtZW50KCdTVkcnKSBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQ7IHRoZSBET00gZW5kcyB1cCB3aXRoCiAgICAgICAgLy8gdGhlIGNvcnJlY3Qgbm9kZXMsIGJ1dCB0aGUgU1ZHIGNvbnRlbnQgZG9lc24ndCByZW5kZXIuIEluc3RlYWQgd2UKICAgICAgICAvLyBoYXZlIHRvIGNyZWF0ZSBhbiBlbXB0eSBTVkcgbm9kZSB1c2luZyBpbm5lckhUTUwgYW5kIGFwcGVuZCBpdHMgY29udGVudC4KICAgICAgICAvLyBFbGVtZW50cyBjcmVhdGVkIHVzaW5nIERPTVBhcnNlci5wYXJzZUZyb21TdHJpbmcgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgogICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjMwMDMyNzgvc3ZnLWlubmVyaHRtbC1pbi1maXJlZm94LWNhbi1ub3QtZGlzcGxheQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdmcgPSB0aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygnPHN2Zz48L3N2Zz4nKTsKICAgICAgICAvLyBDbG9uZSB0aGUgbm9kZSBzbyB3ZSBkb24ndCByZW1vdmUgaXQgZnJvbSB0aGUgcGFyZW50IGljb24gc2V0IGVsZW1lbnQuCiAgICAgICAgc3ZnLmFwcGVuZENoaWxkKGljb25FbGVtZW50KTsKICAgICAgICByZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyhzdmcsIG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgRE9NIGVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gU1ZHIHN0cmluZy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHN0cgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N2Z0VsZW1lbnRGcm9tU3RyaW5nKHN0cikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTsKICAgICAgICBkaXYuaW5uZXJIVE1MID0gc3RyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdmcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGl2LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpKSk7CiAgICAgICAgaWYgKCFzdmcpIHsKICAgICAgICAgICAgdGhyb3cgRXJyb3IoJzxzdmc+IHRhZyBub3QgZm91bmQnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN2ZzsKICAgIH0KICAgIC8qKgogICAgICogQ29udmVydHMgYW4gZWxlbWVudCBpbnRvIGFuIFNWRyBub2RlIGJ5IGNsb25pbmcgYWxsIG9mIGl0cyBjaGlsZHJlbi4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90b1N2Z0VsZW1lbnQoZWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdmcgPSB0aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygnPHN2Zz48L3N2Zz4nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlczsKICAgICAgICAvLyBDb3B5IG92ZXIgYWxsIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGBzeW1ib2xgIHRvIHRoZSBuZXcgU1ZHLCBleGNlcHQgdGhlIGlkLgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb25zdCB7IG5hbWUsIHZhbHVlIH0gPSBhdHRyaWJ1dGVzW2ldOwogICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2lkJykgewogICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSA9PT0gdGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoZWxlbWVudC5jaGlsZE5vZGVzW2ldLmNsb25lTm9kZSh0cnVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN2ZzsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciBhbiBTVkcgZWxlbWVudCB0byBiZSB1c2VkIGFzIGFuIGljb24uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRTdmdBdHRyaWJ1dGVzKHN2Zywgb3B0aW9ucykgewogICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZpdCcsICcnKTsKICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTAwJScpOwogICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTsKICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTsKICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdmb2N1c2FibGUnLCAnZmFsc2UnKTsgLy8gRGlzYWJsZSBJRTExIGRlZmF1bHQgYmVoYXZpb3IgdG8gbWFrZSBTVkdzIGZvY3VzYWJsZS4KICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZpZXdCb3gpIHsKICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIG9wdGlvbnMudmlld0JveCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdmc7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB3aGljaCBwcm9kdWNlcyB0aGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBVUkwuIFJlc3VsdHMgbWF5IGJlCiAgICAgKiBjYWNoZWQsIHNvIGZ1dHVyZSBjYWxscyB3aXRoIHRoZSBzYW1lIFVSTCBtYXkgbm90IGNhdXNlIGFub3RoZXIgSFRUUCByZXF1ZXN0LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gc2FmZVVybAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2ZldGNoVXJsKHNhZmVVcmwpIHsKICAgICAgICBpZiAoIXRoaXMuX2h0dHBDbGllbnQpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0SWNvbk5vSHR0cFByb3ZpZGVyRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNhZmVVcmwgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IGZldGNoIGljb24gZnJvbSBVUkwgIiR7c2FmZVVybH0iLmApOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHNhZmVVcmwpOwogICAgICAgIGlmICghdXJsKSB7CiAgICAgICAgICAgIHRocm93IGdldE1hdEljb25GYWlsZWRUb1Nhbml0aXplVXJsRXJyb3Ioc2FmZVVybCk7CiAgICAgICAgfQogICAgICAgIC8vIFN0b3JlIGluLXByb2dyZXNzIGZldGNoZXMgdG8gYXZvaWQgc2VuZGluZyBhIGR1cGxpY2F0ZSByZXF1ZXN0IGZvciBhIFVSTCB3aGVuIHRoZXJlIGlzCiAgICAgICAgLy8gYWxyZWFkeSBhIHJlcXVlc3QgaW4gcHJvZ3Jlc3MgZm9yIHRoYXQgVVJMLiBJdCdzIG5lY2Vzc2FyeSB0byBjYWxsIHNoYXJlKCkgb24gdGhlCiAgICAgICAgLy8gT2JzZXJ2YWJsZSByZXR1cm5lZCBieSBodHRwLmdldCgpIHNvIHRoYXQgbXVsdGlwbGUgc3Vic2NyaWJlcnMgZG9uJ3QgY2F1c2UgbXVsdGlwbGUgWEhScy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5Qcm9ncmVzc0ZldGNoID0gdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuZ2V0KHVybCk7CiAgICAgICAgaWYgKGluUHJvZ3Jlc3NGZXRjaCkgewogICAgICAgICAgICByZXR1cm4gaW5Qcm9ncmVzc0ZldGNoOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGplbGJvdXJuKTogZm9yIHNvbWUgcmVhc29uLCB0aGUgYGZpbmFsaXplYCBvcGVyYXRvciAibG9zZXMiIHRoZSBnZW5lcmljIHR5cGUgb24gdGhlCiAgICAgICAgLy8gT2JzZXJ2YWJsZS4gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5faHR0cENsaWVudC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pLnBpcGUoZmluYWxpemUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuZGVsZXRlKHVybCkpKSwgc2hhcmUoKSk7CiAgICAgICAgdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuc2V0KHVybCwgcmVxKTsKICAgICAgICByZXR1cm4gcmVxOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYW4gaWNvbiBjb25maWcgYnkgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICogQHRoaXMge1RISVN9CiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW4gd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGljb24gY29uZmlnLgogICAgICogQHBhcmFtIHs/fSBpY29uTmFtZSBOYW1lIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBjb25maWcuCiAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBDb25maWcgdG8gYmUgcmVnaXN0ZXJlZC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIF9hZGRTdmdJY29uQ29uZmlnKG5hbWVzcGFjZSwgaWNvbk5hbWUsIGNvbmZpZykgewogICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3N2Z0ljb25Db25maWdzLnNldChpY29uS2V5KG5hbWVzcGFjZSwgaWNvbk5hbWUpLCBjb25maWcpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYW4gaWNvbiBzZXQgY29uZmlnIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgogICAgICogQHByaXZhdGUKICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgKiBAdGhpcyB7VEhJU30KICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbiB3aGljaCB0byByZWdpc3RlciB0aGUgaWNvbiBjb25maWcuCiAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBDb25maWcgdG8gYmUgcmVnaXN0ZXJlZC4KICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgKi8KICAgIF9hZGRTdmdJY29uU2V0Q29uZmlnKG5hbWVzcGFjZSwgY29uZmlnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbmZpZ05hbWVzcGFjZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2ljb25TZXRDb25maWdzLmdldChuYW1lc3BhY2UpOwogICAgICAgIGlmIChjb25maWdOYW1lc3BhY2UpIHsKICAgICAgICAgICAgY29uZmlnTmFtZXNwYWNlLnB1c2goY29uZmlnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2ljb25TZXRDb25maWdzLnNldChuYW1lc3BhY2UsIFtjb25maWddKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICB9Cn0KTWF0SWNvblJlZ2lzdHJ5Lsm1ZmFjID0gZnVuY3Rpb24gTWF0SWNvblJlZ2lzdHJ5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEljb25SZWdpc3RyeSkoybXJtWluamVjdChIdHRwQ2xpZW50LCA4KSwgybXJtWluamVjdChEb21TYW5pdGl6ZXIpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpLCDJtcm1aW5qZWN0KEVycm9ySGFuZGxlciwgOCkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KTWF0SWNvblJlZ2lzdHJ5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBIdHRwQ2xpZW50LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBEb21TYW5pdGl6ZXIgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgeyB0eXBlOiBFcnJvckhhbmRsZXIsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIE1hdEljb25SZWdpc3RyeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdEljb25SZWdpc3RyeV9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IE1hdEljb25SZWdpc3RyeSjJtcm1aW5qZWN0KEh0dHBDbGllbnQsIDgpLCDJtcm1aW5qZWN0KERvbVNhbml0aXplciksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCksIMm1ybVpbmplY3QoRXJyb3JIYW5kbGVyLCA4KSk7IH0sIHRva2VuOiBNYXRJY29uUmVnaXN0cnksIHByb3ZpZGVkSW46ICJyb290IiB9KTsKLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqIEBwYXJhbSB7P30gcGFyZW50UmVnaXN0cnkKICogQHBhcmFtIHs/fSBodHRwQ2xpZW50CiAqIEBwYXJhbSB7P30gc2FuaXRpemVyCiAqIEBwYXJhbSB7Pz19IGRvY3VtZW50CiAqIEBwYXJhbSB7Pz19IGVycm9ySGFuZGxlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gSUNPTl9SRUdJU1RSWV9QUk9WSURFUl9GQUNUT1JZKHBhcmVudFJlZ2lzdHJ5LCBodHRwQ2xpZW50LCBzYW5pdGl6ZXIsIGRvY3VtZW50LCBlcnJvckhhbmRsZXIpIHsKICAgIHJldHVybiBwYXJlbnRSZWdpc3RyeSB8fCBuZXcgTWF0SWNvblJlZ2lzdHJ5KGh0dHBDbGllbnQsIHNhbml0aXplciwgZG9jdW1lbnQsIGVycm9ySGFuZGxlcik7Cn0KLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSUNPTl9SRUdJU1RSWV9QUk9WSURFUiA9IHsKICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gTWF0SWNvblJlZ2lzdHJ5IGF2YWlsYWJsZSwgdXNlIHRoYXQuIE90aGVyd2lzZSwgcHJvdmlkZSBhIG5ldyBvbmUuCiAgICBwcm92aWRlOiBNYXRJY29uUmVnaXN0cnksCiAgICBkZXBzOiBbCiAgICAgICAgW25ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKSwgTWF0SWNvblJlZ2lzdHJ5XSwKICAgICAgICBbbmV3IE9wdGlvbmFsKCksIEh0dHBDbGllbnRdLAogICAgICAgIERvbVNhbml0aXplciwKICAgICAgICBbbmV3IE9wdGlvbmFsKCksIEVycm9ySGFuZGxlcl0sCiAgICAgICAgW25ldyBPcHRpb25hbCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoRE9DVU1FTlQkMSkpXSwKICAgIF0sCiAgICB1c2VGYWN0b3J5OiBJQ09OX1JFR0lTVFJZX1BST1ZJREVSX0ZBQ1RPUlksCn07Ci8qKgogKiBDbG9uZXMgYW4gU1ZHRWxlbWVudCB3aGlsZSBwcmVzZXJ2aW5nIHR5cGUgaW5mb3JtYXRpb24uCiAqIEBwYXJhbSB7P30gc3ZnCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjbG9uZVN2ZyhzdmcpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoc3ZnLmNsb25lTm9kZSh0cnVlKSkpOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBjYWNoZSBrZXkgdG8gdXNlIGZvciBhbiBpY29uIG5hbWVzcGFjZSBhbmQgbmFtZS4KICogQHBhcmFtIHs/fSBuYW1lc3BhY2UKICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpY29uS2V5KG5hbWVzcGFjZSwgbmFtZSkgewogICAgcmV0dXJuIG5hbWVzcGFjZSArICc6JyArIG5hbWU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pY29uL2ljb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRJY29uLgovKioKICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdEljb25CYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9NYXRJY29uTWl4aW5CYXNlID0gbWl4aW5Db2xvcihNYXRJY29uQmFzZSk7Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSBjdXJyZW50IGxvY2F0aW9uIHRvIGBNYXRJY29uYC4KICogVXNlZCB0byBoYW5kbGUgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCB0byBzdHViIG91dCBkdXJpbmcgdW5pdCB0ZXN0cy4KICogXEBkb2NzLXByaXZhdGUKICogQHR5cGUgez99CiAqLwpjb25zdCBNQVRfSUNPTl9MT0NBVElPTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWljb24tbG9jYXRpb24nLCB7CiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiBNQVRfSUNPTl9MT0NBVElPTl9GQUNUT1JZCn0pOwovKioKICogXEBkb2NzLXByaXZhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIE1BVF9JQ09OX0xPQ0FUSU9OX0ZBQ1RPUlkoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQkMSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfbG9jYXRpb24gPSBfZG9jdW1lbnQgPyBfZG9jdW1lbnQubG9jYXRpb24gOiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBuZWVkcyB0byBiZSBhIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIHByb3BlcnR5LCBiZWNhdXNlIEFuZ3VsYXIKICAgICAgICAvLyB3aWxsIG9ubHkgcmVzb2x2ZSBpdCBvbmNlLCBidXQgd2Ugd2FudCB0aGUgY3VycmVudCBwYXRoIG9uIGVhY2ggY2FsbC4KICAgICAgICBnZXRQYXRobmFtZTogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gX2xvY2F0aW9uID8gKF9sb2NhdGlvbi5wYXRobmFtZSArIF9sb2NhdGlvbi5zZWFyY2gpIDogJycpCiAgICB9Owp9Ci8qKgogKiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBhIEZ1bmNJUkkgKGUuZy4gYHVybCg8c29tZXRoaW5nPilgKS4KICogQHR5cGUgez99CiAqLwpjb25zdCBmdW5jSXJpQXR0cmlidXRlcyA9IFsKICAgICdjbGlwLXBhdGgnLAogICAgJ2NvbG9yLXByb2ZpbGUnLAogICAgJ3NyYycsCiAgICAnY3Vyc29yJywKICAgICdmaWxsJywKICAgICdmaWx0ZXInLAogICAgJ21hcmtlcicsCiAgICAnbWFya2VyLXN0YXJ0JywKICAgICdtYXJrZXItbWlkJywKICAgICdtYXJrZXItZW5kJywKICAgICdtYXNrJywKICAgICdzdHJva2UnCl07CmNvbnN0IMm1MCRjID0gLyoqCiAqIEBwYXJhbSB7P30gYXR0cgogKiBAcmV0dXJuIHs/fQogKi8KYXR0ciA9PiBgWyR7YXR0cn1dYDsKLyoqCiAqIFNlbGVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmluZCBhbGwgZWxlbWVudHMgdGhhdCBhcmUgdXNpbmcgYSBgRnVuY0lSSWAuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZnVuY0lyaUF0dHJpYnV0ZVNlbGVjdG9yID0gZnVuY0lyaUF0dHJpYnV0ZXMubWFwKCjJtTAkYykpLmpvaW4oJywgJyk7Ci8qKgogKiBSZWdleCB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIGlkIG91dCBvZiBhIEZ1bmNJUkkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZnVuY0lyaVBhdHRlcm4gPSAvXnVybFwoWyciXT8jKC4qPylbJyJdP1wpJC87Ci8qKgogKiBDb21wb25lbnQgdG8gZGlzcGxheSBhbiBpY29uLiBJdCBjYW4gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6CiAqCiAqIC0gU3BlY2lmeSB0aGUgc3ZnSWNvbiBpbnB1dCB0byBsb2FkIGFuIFNWRyBpY29uIGZyb20gYSBVUkwgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggdGhlCiAqICAgYWRkU3ZnSWNvbiwgYWRkU3ZnSWNvbkluTmFtZXNwYWNlLCBhZGRTdmdJY29uU2V0LCBvciBhZGRTdmdJY29uU2V0SW5OYW1lc3BhY2UgbWV0aG9kcyBvZgogKiAgIE1hdEljb25SZWdpc3RyeS4gSWYgdGhlIHN2Z0ljb24gdmFsdWUgY29udGFpbnMgYSBjb2xvbiBpdCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSBmb3JtYXQKICogICAiW25hbWVzcGFjZV06W25hbWVdIiwgaWYgbm90IHRoZSB2YWx1ZSB3aWxsIGJlIHRoZSBuYW1lIG9mIGFuIGljb24gaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLgogKiAgIEV4YW1wbGVzOgogKiAgICAgYDxtYXQtaWNvbiBzdmdJY29uPSJsZWZ0LWFycm93Ij48L21hdC1pY29uPgogKiAgICAgPG1hdC1pY29uIHN2Z0ljb249ImFuaW1hbHM6Y2F0Ij48L21hdC1pY29uPmAKICoKICogLSBVc2UgYSBmb250IGxpZ2F0dXJlIGFzIGFuIGljb24gYnkgcHV0dGluZyB0aGUgbGlnYXR1cmUgdGV4dCBpbiB0aGUgY29udGVudCBvZiB0aGUgYDxtYXQtaWNvbj5gCiAqICAgY29tcG9uZW50LiBCeSBkZWZhdWx0IHRoZSBNYXRlcmlhbCBpY29ucyBmb250IGlzIHVzZWQgYXMgZGVzY3JpYmVkIGF0CiAqICAgaHR0cDovL2dvb2dsZS5naXRodWIuaW8vbWF0ZXJpYWwtZGVzaWduLWljb25zLyNpY29uLWZvbnQtZm9yLXRoZS13ZWIuIFlvdSBjYW4gc3BlY2lmeSBhbgogKiAgIGFsdGVybmF0ZSBmb250IGJ5IHNldHRpbmcgdGhlIGZvbnRTZXQgaW5wdXQgdG8gZWl0aGVyIHRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdXNlIHRoZQogKiAgIGRlc2lyZWQgZm9udCwgb3IgdG8gYW4gYWxpYXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggTWF0SWNvblJlZ2lzdHJ5LnJlZ2lzdGVyRm9udENsYXNzQWxpYXMuCiAqICAgRXhhbXBsZXM6CiAqICAgICBgPG1hdC1pY29uPmhvbWU8L21hdC1pY29uPgogKiAgICAgPG1hdC1pY29uIGZvbnRTZXQ9Im15Zm9udCI+c3VuPC9tYXQtaWNvbj5gCiAqCiAqIC0gU3BlY2lmeSBhIGZvbnQgZ2x5cGggdG8gYmUgaW5jbHVkZWQgdmlhIENTUyBydWxlcyBieSBzZXR0aW5nIHRoZSBmb250U2V0IGlucHV0IHRvIHNwZWNpZnkgdGhlCiAqICAgZm9udCwgYW5kIHRoZSBmb250SWNvbiBpbnB1dCB0byBzcGVjaWZ5IHRoZSBpY29uLiBUeXBpY2FsbHkgdGhlIGZvbnRJY29uIHdpbGwgc3BlY2lmeSBhCiAqICAgQ1NTIGNsYXNzIHdoaWNoIGNhdXNlcyB0aGUgZ2x5cGggdG8gYmUgZGlzcGxheWVkIHZpYSBhIDpiZWZvcmUgc2VsZWN0b3IsIGFzIGluCiAqICAgaHR0cHM6Ly9mb3J0YXdlc29tZS5naXRodWIuaW8vRm9udC1Bd2Vzb21lL2V4YW1wbGVzLwogKiAgIEV4YW1wbGU6CiAqICAgICBgPG1hdC1pY29uIGZvbnRTZXQ9ImZhIiBmb250SWNvbj0iYWxhcm0iPjwvbWF0LWljb24+YAogKi8KY2xhc3MgTWF0SWNvbiBleHRlbmRzIF9NYXRJY29uTWl4aW5CYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9pY29uUmVnaXN0cnkKICAgICAqIEBwYXJhbSB7P30gYXJpYUhpZGRlbgogICAgICogQHBhcmFtIHs/PX0gX2xvY2F0aW9uCiAgICAgKiBAcGFyYW0gez89fSBfZXJyb3JIYW5kbGVyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9pY29uUmVnaXN0cnksIGFyaWFIaWRkZW4sIF9sb2NhdGlvbiwgX2Vycm9ySGFuZGxlcikgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYpOwogICAgICAgIHRoaXMuX2ljb25SZWdpc3RyeSA9IF9pY29uUmVnaXN0cnk7CiAgICAgICAgdGhpcy5fbG9jYXRpb24gPSBfbG9jYXRpb247CiAgICAgICAgdGhpcy5fZXJyb3JIYW5kbGVyID0gX2Vycm9ySGFuZGxlcjsKICAgICAgICB0aGlzLl9pbmxpbmUgPSBmYWxzZTsKICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgbm90IGV4cGxpY2l0bHkgc2V0IGFyaWEtaGlkZGVuLCBtYXJrIHRoZSBpY29uIGFzIGhpZGRlbiwgYXMgdGhpcyBpcwogICAgICAgIC8vIHRoZSByaWdodCB0aGluZyB0byBkbyBmb3IgdGhlIG1ham9yaXR5IG9mIGljb24gdXNlLWNhc2VzLgogICAgICAgIGlmICghYXJpYUhpZGRlbikgewogICAgICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBpY29uIHNob3VsZCBiZSBpbmxpbmVkLCBhdXRvbWF0aWNhbGx5IHNpemluZyB0aGUgaWNvbiB0byBtYXRjaCB0aGUgZm9udCBzaXplIG9mCiAgICAgKiB0aGUgZWxlbWVudCB0aGUgaWNvbiBpcyBjb250YWluZWQgaW4uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaW5saW5lKCkgewogICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5saW5lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgaW5saW5lKGlubGluZSkgewogICAgICAgIHRoaXMuX2lubGluZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShpbmxpbmUpOwogICAgfQogICAgLyoqCiAgICAgKiBGb250IHNldCB0aGF0IHRoZSBpY29uIGlzIGEgcGFydCBvZi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmb250U2V0KCkgeyByZXR1cm4gdGhpcy5fZm9udFNldDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZm9udFNldCh2YWx1ZSkgewogICAgICAgIHRoaXMuX2ZvbnRTZXQgPSB0aGlzLl9jbGVhbnVwRm9udFZhbHVlKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogTmFtZSBvZiBhbiBpY29uIHdpdGhpbiBhIGZvbnQgc2V0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGZvbnRJY29uKCkgeyByZXR1cm4gdGhpcy5fZm9udEljb247IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGZvbnRJY29uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fZm9udEljb24gPSB0aGlzLl9jbGVhbnVwRm9udFZhbHVlKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogU3BsaXRzIGFuIHN2Z0ljb24gYmluZGluZyB2YWx1ZSBpbnRvIGl0cyBpY29uIHNldCBhbmQgaWNvbiBuYW1lIGNvbXBvbmVudHMuCiAgICAgKiBSZXR1cm5zIGEgMi1lbGVtZW50IGFycmF5IG9mIFsoaWNvbiBzZXQpLCAoaWNvbiBuYW1lKV0uCiAgICAgKiBUaGUgc2VwYXJhdG9yIGZvciB0aGUgdHdvIGZpZWxkcyBpcyAnOicuIElmIHRoZXJlIGlzIG5vIHNlcGFyYXRvciwgYW4gZW1wdHkKICAgICAqIHN0cmluZyBpcyByZXR1cm5lZCBmb3IgdGhlIGljb24gc2V0IGFuZCB0aGUgZW50aXJlIHZhbHVlIGlzIHJldHVybmVkIGZvcgogICAgICogdGhlIGljb24gbmFtZS4gSWYgdGhlIGFyZ3VtZW50IGlzIGZhbHN5LCByZXR1cm5zIGFuIGFycmF5IG9mIHR3byBlbXB0eSBzdHJpbmdzLgogICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBuYW1lIGNvbnRhaW5zIHR3byBvciBtb3JlICc6JyBzZXBhcmF0b3JzLgogICAgICogRXhhbXBsZXM6CiAgICAgKiAgIGAnc29jaWFsOmNha2UnIC0+IFsnc29jaWFsJywgJ2Nha2UnXQogICAgICogICAncGVuZ3VpbicgLT4gWycnLCAncGVuZ3VpbiddCiAgICAgKiAgIG51bGwgLT4gWycnLCAnJ10KICAgICAqICAgJ2E6YjpjJyAtPiAodGhyb3dzIEVycm9yKWAKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGljb25OYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc3BsaXRJY29uTmFtZShpY29uTmFtZSkgewogICAgICAgIGlmICghaWNvbk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIFsnJywgJyddOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFydHMgPSBpY29uTmFtZS5zcGxpdCgnOicpOwogICAgICAgIHN3aXRjaCAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFsnJywgcGFydHNbMF1dOyAvLyBVc2UgZGVmYXVsdCBuYW1lc3BhY2UuCiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuICgvKiogQHR5cGUgez99ICovIChwYXJ0cykpOwogICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBFcnJvcihgSW52YWxpZCBpY29uIG5hbWU6ICIke2ljb25OYW1lfSJgKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBpbmxpbmUgU1ZHIGljb24gaWYgdGhlIGlucHV0cyBjaGFuZ2VkLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBET00gb3BlcmF0aW9ucy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3ZnSWNvbkNoYW5nZXMgPSBjaGFuZ2VzWydzdmdJY29uJ107CiAgICAgICAgaWYgKHN2Z0ljb25DaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnN2Z0ljb24pIHsKICAgICAgICAgICAgICAgIGNvbnN0IFtuYW1lc3BhY2UsIGljb25OYW1lXSA9IHRoaXMuX3NwbGl0SWNvbk5hbWUodGhpcy5zdmdJY29uKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ljb25SZWdpc3RyeS5nZXROYW1lZFN2Z0ljb24oaWNvbk5hbWUsIG5hbWVzcGFjZSkKICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKQogICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHN2ZyA9PiB0aGlzLl9zZXRTdmdFbGVtZW50KHN2ZykpLCAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgRXJyb3IgcmV0cmlldmluZyBpY29uICR7bmFtZXNwYWNlfToke2ljb25OYW1lfSEgJHtlcnIubWVzc2FnZX1gOwogICAgICAgICAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgX2Vycm9ySGFuZGxlciBwYXJhbWV0ZXIgdG8gYmUgbWFkZSByZXF1aXJlZC4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9ySGFuZGxlci5oYW5kbGVFcnJvcihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN2Z0ljb25DaGFuZ2VzLnByZXZpb3VzVmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU3ZnRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl91c2luZ0ZvbnRJY29uKCkpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICAvLyBVcGRhdGUgZm9udCBjbGFzc2VzIGJlY2F1c2UgbmdPbkNoYW5nZXMgd29uJ3QgYmUgY2FsbGVkIGlmIG5vbmUgb2YgdGhlIGlucHV0cyBhcmUgcHJlc2VudCwKICAgICAgICAvLyBlLmcuIDxtYXQtaWNvbj5hcnJvdzwvbWF0LWljb24+IEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGFkZCBhIENTUyBjbGFzcyBmb3IgdGhlIGRlZmF1bHQgZm9udC4KICAgICAgICBpZiAodGhpcy5fdXNpbmdGb250SWNvbigpKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUZvbnRJY29uQ2xhc3NlcygpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlclZpZXdDaGVja2VkKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjYWNoZWRFbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlczsKICAgICAgICBpZiAoY2FjaGVkRWxlbWVudHMgJiYgdGhpcy5fbG9jYXRpb24gJiYgY2FjaGVkRWxlbWVudHMuc2l6ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSB0aGlzLl9sb2NhdGlvbi5nZXRQYXRobmFtZSgpOwogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIFVSTCBoYXMgY2hhbmdlZCBvbiBlYWNoIGNoYW5nZSBkZXRlY3Rpb24gc2luY2UKICAgICAgICAgICAgLy8gdGhlIGJyb3dzZXIgZG9lc24ndCBoYXZlIGFuIEFQSSB0aGF0IHdpbGwgbGV0IHVzIHJlYWN0IG9uIGxpbmsgY2xpY2tzIGFuZAogICAgICAgICAgICAvLyB3ZSBjYW4ndCBkZXBlbmQgb24gdGhlIEFuZ3VsYXIgcm91dGVyLiBUaGUgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHVwZGF0ZWQsCiAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2hpbGUgbW9zdCBicm93c2VycyBkb24ndCBjYXJlIHdoZXRoZXIgdGhlIFVSTCBpcyBjb3JyZWN0IGFmdGVyCiAgICAgICAgICAgIC8vIHRoZSBmaXJzdCByZW5kZXIsIFNhZmFyaSB3aWxsIGJyZWFrIGlmIHRoZSB1c2VyIG5hdmlnYXRlcyB0byBhIGRpZmZlcmVudAogICAgICAgICAgICAvLyBwYWdlIGFuZCB0aGUgU1ZHIGlzbid0IHJlLXJlbmRlcmVkLgogICAgICAgICAgICBpZiAobmV3UGF0aCAhPT0gdGhpcy5fcHJldmlvdXNQYXRoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1BhdGggPSBuZXdQYXRoOwogICAgICAgICAgICAgICAgdGhpcy5fcHJlcGVuZFBhdGhUb1JlZmVyZW5jZXMobmV3UGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzLmNsZWFyKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VzaW5nRm9udEljb24oKSB7CiAgICAgICAgcmV0dXJuICF0aGlzLnN2Z0ljb247CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHN2ZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFN2Z0VsZW1lbnQoc3ZnKSB7CiAgICAgICAgdGhpcy5fY2xlYXJTdmdFbGVtZW50KCk7CiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgSUUxMSBhbmQgRWRnZSBpZ25vcmluZyBgc3R5bGVgIHRhZ3MgaW5zaWRlIGR5bmFtaWNhbGx5LWNyZWF0ZWQgU1ZHcy4KICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwODk4NDY5LwogICAgICAgIC8vIERvIHRoaXMgYmVmb3JlIGluc2VydGluZyB0aGUgZWxlbWVudCBpbnRvIHRoZSBET00sIGluIG9yZGVyIHRvIGF2b2lkIGEgc3R5bGUgcmVjYWxjdWxhdGlvbi4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVUYWdzID0gKC8qKiBAdHlwZSB7P30gKi8gKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZVRhZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgc3R5bGVUYWdzW2ldLnRleHRDb250ZW50ICs9ICcgJzsKICAgICAgICB9CiAgICAgICAgLy8gTm90ZTogd2UgZG8gdGhpcyBmaXggaGVyZSwgcmF0aGVyIHRoYW4gdGhlIGljb24gcmVnaXN0cnksIGJlY2F1c2UgdGhlCiAgICAgICAgLy8gcmVmZXJlbmNlcyBoYXZlIHRvIHBvaW50IHRvIHRoZSBVUkwgYXQgdGhlIHRpbWUgdGhhdCB0aGUgaWNvbiB3YXMgY3JlYXRlZC4KICAgICAgICBpZiAodGhpcy5fbG9jYXRpb24pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5fbG9jYXRpb24uZ2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNQYXRoID0gcGF0aDsKICAgICAgICAgICAgdGhpcy5fY2FjaGVDaGlsZHJlbldpdGhFeHRlcm5hbFJlZmVyZW5jZXMoc3ZnKTsKICAgICAgICAgICAgdGhpcy5fcHJlcGVuZFBhdGhUb1JlZmVyZW5jZXMocGF0aCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChzdmcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NsZWFyU3ZnRWxlbWVudCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGF5b3V0RWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNoaWxkQ291bnQgPSBsYXlvdXRFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOwogICAgICAgIGlmICh0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBub24tZWxlbWVudCBjaGlsZCBub2RlcyBhbmQgU1ZHcywgYW5kIGFkZCB0aGUgbmV3IFNWRyBlbGVtZW50LiBOb3RlIHRoYXQKICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgaW5uZXJIVE1MLCBiZWNhdXNlIElFIHdpbGwgdGhyb3cgaWYgdGhlIGVsZW1lbnQgaGFzIGEgZGF0YSBiaW5kaW5nLgogICAgICAgIHdoaWxlIChjaGlsZENvdW50LS0pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaGlsZCA9IGxheW91dEVsZW1lbnQuY2hpbGROb2Rlc1tjaGlsZENvdW50XTsKICAgICAgICAgICAgLy8gMSBjb3JyZXNwb25kcyB0byBOb2RlLkVMRU1FTlRfTk9ERS4gV2UgcmVtb3ZlIGFsbCBub24tZWxlbWVudCBub2RlcyBpbiBvcmRlciB0byBnZXQgcmlkCiAgICAgICAgICAgIC8vIG9mIGFueSBsb29zZSB0ZXh0IG5vZGVzLCBhcyB3ZWxsIGFzIGFueSBTVkcgZWxlbWVudHMgaW4gb3JkZXIgdG8gcmVtb3ZlIGFueSBvbGQgaWNvbnMuCiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gMSB8fCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3ZnJykgewogICAgICAgICAgICAgICAgbGF5b3V0RWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlRm9udEljb25DbGFzc2VzKCkgewogICAgICAgIGlmICghdGhpcy5fdXNpbmdGb250SWNvbigpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvbnRTZXRDbGFzcyA9IHRoaXMuZm9udFNldCA/CiAgICAgICAgICAgIHRoaXMuX2ljb25SZWdpc3RyeS5jbGFzc05hbWVGb3JGb250QWxpYXModGhpcy5mb250U2V0KSA6CiAgICAgICAgICAgIHRoaXMuX2ljb25SZWdpc3RyeS5nZXREZWZhdWx0Rm9udFNldENsYXNzKCk7CiAgICAgICAgaWYgKGZvbnRTZXRDbGFzcyAhPSB0aGlzLl9wcmV2aW91c0ZvbnRTZXRDbGFzcykgewogICAgICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MpIHsKICAgICAgICAgICAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9wcmV2aW91c0ZvbnRTZXRDbGFzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvbnRTZXRDbGFzcykgewogICAgICAgICAgICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKGZvbnRTZXRDbGFzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MgPSBmb250U2V0Q2xhc3M7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmZvbnRJY29uICE9IHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcykgewogICAgICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKSB7CiAgICAgICAgICAgICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5mb250SWNvbikgewogICAgICAgICAgICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKHRoaXMuZm9udEljb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcyA9IHRoaXMuZm9udEljb247CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDbGVhbnMgdXAgYSB2YWx1ZSB0byBiZSB1c2VkIGFzIGEgZm9udEljb24gb3IgZm9udFNldC4KICAgICAqIFNpbmNlIHRoZSB2YWx1ZSBlbmRzIHVwIGJlaW5nIGFzc2lnbmVkIGFzIGEgQ1NTIGNsYXNzLCB3ZQogICAgICogaGF2ZSB0byB0cmltIHRoZSB2YWx1ZSBhbmQgb21pdCBzcGFjZS1zZXBhcmF0ZWQgdmFsdWVzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jbGVhbnVwRm9udFZhbHVlKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkuc3BsaXQoJyAnKVswXSA6IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBQcmVwZW5kcyB0aGUgY3VycmVudCBwYXRoIHRvIGFsbCBlbGVtZW50cyB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHBvaW50aW5nIHRvIGEgYEZ1bmNJUklgCiAgICAgKiByZWZlcmVuY2UuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBXZWJLaXQgYnJvd3NlcnMgcmVxdWlyZSByZWZlcmVuY2VzIHRvIGJlIHByZWZpeGVkIHdpdGgKICAgICAqIHRoZSBjdXJyZW50IHBhdGgsIGlmIHRoZSBwYWdlIGhhcyBhIGBiYXNlYCB0YWcuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcHJlcGVuZFBhdGhUb1JlZmVyZW5jZXMocGF0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlczsKICAgICAgICBpZiAoZWxlbWVudHMpIHsKICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXR0cnMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYXR0cnMsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIGF0dHJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhdHRyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBhdHRyID0+IHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGB1cmwoJyR7cGF0aH0jJHthdHRyLnZhbHVlfScpYCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENhY2hlcyB0aGUgY2hpbGRyZW4gb2YgYW4gU1ZHIGVsZW1lbnQgdGhhdCBoYXZlIGB1cmwoKWAKICAgICAqIHJlZmVyZW5jZXMgdGhhdCB3ZSBuZWVkIHRvIHByZWZpeCB3aXRoIHRoZSBjdXJyZW50IHBhdGguCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2FjaGVDaGlsZHJlbldpdGhFeHRlcm5hbFJlZmVyZW5jZXMoZWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhGdW5jSXJpID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGZ1bmNJcmlBdHRyaWJ1dGVTZWxlY3Rvcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzID0KICAgICAgICAgICAgdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzIHx8IG5ldyBNYXAoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzV2l0aEZ1bmNJcmkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZnVuY0lyaUF0dHJpYnV0ZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXR0cgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYXR0ciA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50V2l0aFJlZmVyZW5jZSA9IGVsZW1lbnRzV2l0aEZ1bmNJcmlbaV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRXaXRoUmVmZXJlbmNlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUgPyB2YWx1ZS5tYXRjaChmdW5jSXJpUGF0dGVybikgOiBudWxsOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gZWxlbWVudHMuZ2V0KGVsZW1lbnRXaXRoUmVmZXJlbmNlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zZXQoZWxlbWVudFdpdGhSZWZlcmVuY2UsIGF0dHJpYnV0ZXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cmlidXRlcykpLnB1c2goeyBuYW1lOiBhdHRyLCB2YWx1ZTogbWF0Y2hbMV0gfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9Cn0KTWF0SWNvbi7JtWZhYyA9IGZ1bmN0aW9uIE1hdEljb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SWNvbikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXRJY29uUmVnaXN0cnkpLCDJtcm1aW5qZWN0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9JQ09OX0xPQ0FUSU9OLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChFcnJvckhhbmRsZXIsIDgpKTsgfTsKTWF0SWNvbi7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRJY29uLCBzZWxlY3RvcnM6IFtbIm1hdC1pY29uIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJpbWciLCAxLCAibWF0LWljb24iLCAibm90cmFuc2xhdGUiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0SWNvbl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWljb24taW5saW5lIiwgY3R4LmlubGluZSkoIm1hdC1pY29uLW5vLWNvbG9yIiwgY3R4LmNvbG9yICE9PSAicHJpbWFyeSIgJiYgY3R4LmNvbG9yICE9PSAiYWNjZW50IiAmJiBjdHguY29sb3IgIT09ICJ3YXJuIik7CiAgICB9IH0sIGlucHV0czogeyBjb2xvcjogImNvbG9yIiwgaW5saW5lOiAiaW5saW5lIiwgZm9udFNldDogImZvbnRTZXQiLCBmb250SWNvbjogImZvbnRJY29uIiwgc3ZnSWNvbjogInN2Z0ljb24iIH0sIGV4cG9ydEFzOiBbIm1hdEljb24iXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzAkNywgZGVjbHM6IDEsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRJY29uX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMCk7CiAgICB9IH0sIHN0eWxlczogWyIubWF0LWljb257YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZpbGw6Y3VycmVudENvbG9yO2hlaWdodDoyNHB4O3dpZHRoOjI0cHh9Lm1hdC1pY29uLm1hdC1pY29uLWlubGluZXtmb250LXNpemU6aW5oZXJpdDtoZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O3dpZHRoOmluaGVyaXR9W2Rpcj1ydGxdIC5tYXQtaWNvbi1ydGwtbWlycm9ye3RyYW5zZm9ybTpzY2FsZSgtMSwgMSl9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue21hcmdpbjphdXRvfVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdEljb24uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogTWF0SWNvblJlZ2lzdHJ5IH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogQXR0cmlidXRlLCBhcmdzOiBbJ2FyaWEtaGlkZGVuJyxdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfSUNPTl9MT0NBVElPTixdIH1dIH0sCiAgICB7IHR5cGU6IEVycm9ySGFuZGxlciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQpdOwpNYXRJY29uLnByb3BEZWNvcmF0b3JzID0gewogICAgaW5saW5lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIHN2Z0ljb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgZm9udFNldDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBmb250SWNvbjogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pY29uL2ljb24tbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIE1hdEljb25Nb2R1bGUgewp9Ck1hdEljb25Nb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRJY29uTW9kdWxlIH0pOwpNYXRJY29uTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0SWNvbk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRJY29uTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW01hdENvbW1vbk1vZHVsZV0sCiAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0SWNvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRJY29uXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRJY29uLAogICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvdGJkZXZfdXBsb2FkL3RiZGV2X3VwbG9hZF9kaWFsb2dfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkaWFsb2dSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoZGlhbG9nUmVmKSB7CiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSBkaWFsb2dSZWY7CiAgICAgICAgdGhpcy50ZW5zb3Jib2FyZERvdERldlVybCA9ICdodHRwczovL3RlbnNvcmJvYXJkLmRldi8/dXRtX3NvdXJjZT10ZW5zb3Jib2FyZCc7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uQ2xvc2UoKSB7CiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Q29tbWFuZFRleHQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmxvZ2RpcikgewogICAgICAgICAgICAvLyBXaXRob3V0IGxvZ2RpciB3ZSBwcmludCBhIGxpdGVyYWwgJ3tsb2dkaXJ9JyBzdHJpbmcgdGhhdCB1c2VyIHdpbGwKICAgICAgICAgICAgLy8gaGF2ZSB0byBtYW51YWxseSBzdWJzdGl0dXRlLgogICAgICAgICAgICByZXR1cm4gJ3RlbnNvcmJvYXJkIGRldiB1cGxvYWQgLS1sb2dkaXIge2xvZ2Rpcn0nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gV2l0aCBsb2dkaXIgd2Ugc3Vic3RpdHV0ZSB0aGUgdmFsdWUgaW50byB0aGUgY29tbWFuZCBmb3IgdGhlIHVzZXIuCiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IGxvZ2RpciBpcyBzdWZmaWNpZW50bHkgbG9uZyB0aGF0IHdlIHdhbnQgdG8gcHJpbnQgaXQgb24KICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZS4gSWYgdGhlIGxvZ2RpciB2YWx1ZSBpcyBzdGlsbCB0b28gbG9uZyB0aGVuIHRoZSBDU1Mgd2lsbAogICAgICAgICAgICAvLyByZW5kZXIgYSBzY3JvbGxiYXIgdW5kZXJuZWF0aC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlc2NhcGVkTG9nZGlyID0gdGhpcy5sb2dkaXIucmVwbGFjZSgvJy9nLCAiJ1xcJyciKTsKICAgICAgICAgICAgcmV0dXJuICJ0ZW5zb3Jib2FyZCBkZXYgdXBsb2FkIC0tbG9nZGlyIFxcXG4gICAgJyIgKyBlc2NhcGVkTG9nZGlyICsgIiciOwogICAgICAgIH0KICAgIH0KfQpUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50JywKICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi90YmRldl91cGxvYWRfZGlhbG9nX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3RiZGV2X3VwbG9hZF9kaWFsb2dfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBNYXREaWFsb2dSZWYgfQpdOwpUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGxvZ2RpcjogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gVGJkZXZVcGxvYWREaWFsb2dDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGJkZXZVcGxvYWREaWFsb2dDb21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0RGlhbG9nUmVmKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0YmRldi11cGxvYWQtZGlhbG9nLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IGxvZ2RpcjogImxvZ2RpciIgfSwgZGVjbHM6IDIxLCB2YXJzOiA0LCBjb25zdHM6IFtbInRhcmdldCIsICJfYmxhbmsiLCAicmVsIiwgIm5vcmVmZXJyZXIgbm9vcGVuZXIiLCAxLCAiYW5jaG9yLXRleHQiLCAzLCAiaHJlZiJdLCBbMSwgImNvbW1hbmQiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgInRpdGxlIiwgIkNsaWNrIHRvIGNvcHkgdGhlIGNvbW1hbmQiLCAxLCAiY29tbWFuZC1jb3B5IiwgMywgImNka0NvcHlUb0NsaXBib2FyZCJdLCBbInN2Z0ljb24iLCAiY29udGVudF9jb3B5XzI0cHgiXSwgWzEsICJib3R0b20tYnV0dG9ucyJdLCBbIm1hdC1mbGF0LWJ1dHRvbiIsICIiLCAxLCAiY2xvc2UtYnV0dG9uIiwgMywgImNsaWNrIl0sIFsibWF0LWZsYXQtYnV0dG9uIiwgIiIsICJ0YXJnZXQiLCAiX2JsYW5rIiwgInJlbCIsICJub3JlZmVycmVyIG5vb3BlbmVyIiwgMSwgImxlYXJuLW1vcmUtYnV0dG9uIiwgMywgImhyZWYiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJoMyIpOwogICAgICAgIMm1ybV0ZXh0KDEsICJVcGxvYWQgdG8gVGVuc29yQm9hcmQuZGV2Iik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJwIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiYSIsIDApOwogICAgICAgIMm1ybV0ZXh0KDQsICIgVGVuc29yQm9hcmQuZGV2Iik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGV4dCg1LCAiIGVuYWJsZXMgeW91IHRvIGVhc2lseSBob3N0LCB0cmFjaywgYW5kIHNoYXJlIHlvdXIgTUwgZXhwZXJpbWVudHMgd2l0aCBldmVyeW9uZS4gWW91IGNhbiBzaGFyZSBhIGxpbmsgdG8gdGhlIHVwbG9hZGVkIFRlbnNvckJvYXJkIGluIHBhcGVycywgYmxvZyBwb3N0cywgYW5kIHNvY2lhbCBtZWRpYS4gVGhpcyBjYW4gc2hvd2Nhc2UgdGhlIHJlc3VsdHMgbW9yZSBlZmZlY3RpdmVseSBhbmQgaGVscHMgcmVwcm9kdWNpYmlsaXR5LlxuIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJwIik7CiAgICAgICAgybXJtXRleHQoNywgIiBUbyB1cGxvYWQgYSBsb2dkaXIgdG8gVGVuc29yQm9hcmQuZGV2LCBydW4gdGhlIGNvbW1hbmQ6XG4iKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOCwgImRpdiIsIDEpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgInByZSIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJjb2RlIik7CiAgICAgICAgybXJtXRleHQoMTEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAiYnV0dG9uIiwgMik7CiAgICAgICAgybXJtWVsZW1lbnQoMTMsICJtYXQtaWNvbiIsIDMpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE0LCAicCIpOwogICAgICAgIMm1ybV0ZXh0KDE1LCAiIE9ubHkgY2VydGFpbiBwbHVnaW5zIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLiBVcGxvYWRlZCBUZW5zb3JCb2FyZHMgYXJlIHB1YmxpYyBhbmQgdmlzaWJsZSB0byBldmVyeW9uZTsgZG8gbm90IHVwbG9hZCBzZW5zaXRpdmUgZGF0YS5cbiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNiwgImRpdiIsIDQpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTcsICJidXR0b24iLCA1KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGJkZXZVcGxvYWREaWFsb2dDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzE3X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uQ2xvc2UoKTsgfSk7CiAgICAgICAgybXJtXRleHQoMTgsICIgQ2xvc2UgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE5LCAiYSIsIDYpOwogICAgICAgIMm1ybV0ZXh0KDIwLCAiIExlYXJuIG1vcmUgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoImhyZWYiLCBjdHgudGVuc29yYm9hcmREb3REZXZVcmwsIMm1ybVzYW5pdGl6ZVVybCk7CiAgICAgICAgybXJtWFkdmFuY2UoOCk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHguZ2V0Q29tbWFuZFRleHQoKSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJjZGtDb3B5VG9DbGlwYm9hcmQiLCBjdHguZ2V0Q29tbWFuZFRleHQoKSk7CiAgICAgICAgybXJtWFkdmFuY2UoNyk7CiAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoImhyZWYiLCBjdHgudGVuc29yYm9hcmREb3REZXZVcmwsIMm1ybVzYW5pdGl6ZVVybCk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRCdXR0b24sIENka0NvcHlUb0NsaXBib2FyZCwgTWF0SWNvbiwgTWF0QW5jaG9yXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudDtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9ZGl2W19uZ2NvbnRlbnQtJUNPTVAlXSwgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjE2cHggMH1bX25naG9zdC0lQ09NUCVdID4gW19uZ2NvbnRlbnQtJUNPTVAlXTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9W19uZ2hvc3QtJUNPTVAlXSA+IFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9aDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjV9cFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjV9LmFuY2hvci10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMTk3NmQyO3RleHQtZGVjb3JhdGlvbjpub25lfS5jb21tYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZDojZjVmNmY3O2JvcmRlci1yYWRpdXM6NHB4O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nOjJweCAxMnB4fXByZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3cteDphdXRvfWNvZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNX0uYm90dG9tLWJ1dHRvbnNbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5jbG9zZS1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO21hcmdpbi1yaWdodDo4cHh9LmxlYXJuLW1vcmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMTk3NmQyO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPXRiZGV2X3VwbG9hZF9kaWFsb2dfY29tcG9uZW50LmNzcy5tYXAgKi8iXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC90YmRldl91cGxvYWQvdGJkZXZfdXBsb2FkX2RpYWxvZ19jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRMb2dkaXIgPSBjcmVhdGVTZWxlY3RvcihnZXRFbnZpcm9ubWVudCwgKC8qKgogKiBAcGFyYW0gez99IGVudmlyb25tZW50CiAqIEByZXR1cm4gez99CiAqLwooZW52aXJvbm1lbnQpID0+IGVudmlyb25tZW50LmRhdGFfbG9jYXRpb24pKTsKY2xhc3MgVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgIHRoaXMubG9nZGlyJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0TG9nZGlyKSk7CiAgICB9Cn0KVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0YmRldi11cGxvYWQtZGlhbG9nJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8dGJkZXYtdXBsb2FkLWRpYWxvZy1jb21wb25lbnQKICAgICAgW2xvZ2Rpcl09ImxvZ2RpciQgfCBhc3luYyIKICAgID48L3RiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFN0b3JlIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRiZGV2LXVwbG9hZC1kaWFsb2ciXV0sIGRlY2xzOiAyLCB2YXJzOiAzLCBjb25zdHM6IFtbMywgImxvZ2RpciJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJ0YmRldi11cGxvYWQtZGlhbG9nLWNvbXBvbmVudCIsIDApOwogICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJsb2dkaXIiLCDJtcm1cGlwZUJpbmQxKDEsIDEsIGN0eC5sb2dkaXIkKSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC90YmRldl91cGxvYWQvdGJkZXZfdXBsb2FkX2J1dHRvbl9jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KZnVuY3Rpb24gVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRfYnV0dG9uXzBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICBjb25zdCBfcjIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImJ1dHRvbiIsIDEpOwogICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50X2J1dHRvbl8wX1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyKTsgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEub3BlbkRpYWxvZygpOyB9KTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAyKTsKICAgIMm1ybVlbGVtZW50KDIsICJtYXQtaWNvbiIsIDMpOwogICAgybXJtXRleHQoMywgIiBVcGxvYWQgIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSB9Ci8vIEEgbGlzdCBvZiBob3N0bmFtZSB2YWx1ZXMgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGJ1dHRvbiB0byBhcHBlYXIuCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTE9DQUxfSE9TVE5BTUVTID0gWydsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJ107CmNsYXNzIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB3aW5kb3cKICAgICAqIEBwYXJhbSB7P30gZGlhbG9nCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHdpbmRvdywgZGlhbG9nKSB7CiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7CiAgICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7CiAgICAgICAgdGhpcy5zaG93biA9IExPQ0FMX0hPU1ROQU1FUy5pbmNsdWRlcyh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvcGVuRGlhbG9nKCkgewogICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXIsIHsKICAgICAgICAgICAgd2lkdGg6ICc1NjBweCcsCiAgICAgICAgfSk7CiAgICB9Cn0KVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0YmRldi11cGxvYWQtYnV0dG9uJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi90YmRldl91cGxvYWRfYnV0dG9uX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3RiZGV2X3VwbG9hZF9idXR0b25fY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBXaW5kb3csIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogWyd3aW5kb3cnLF0gfV0gfSwKICAgIHsgdHlwZTogTWF0RGlhbG9nIH0KXTsKVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBzaG93bjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muc2hvd24nLF0gfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoJ3dpbmRvdycpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdERpYWxvZykpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQsIHNlbGVjdG9yczogW1sidGJkZXYtdXBsb2FkLWJ1dHRvbiJdXSwgaG9zdFZhcnM6IDIsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgIMm1ybVjbGFzc1Byb3AoInNob3duIiwgY3R4LnNob3duKTsKICAgIH0gfSwgZGVjbHM6IDEsIHZhcnM6IDEsIGNvbnN0czogW1sibWF0LXN0cm9rZWQtYnV0dG9uIiwgIiIsIDMsICJjbGljayIsIDQsICJuZ0lmIl0sIFsibWF0LXN0cm9rZWQtYnV0dG9uIiwgIiIsIDMsICJjbGljayJdLCBbMSwgImJ1dHRvbi1jb250ZW50cyJdLCBbInN2Z0ljb24iLCAiaW5mb19vdXRsaW5lXzI0cHgiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dGVtcGxhdGUoMCwgVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRfYnV0dG9uXzBfVGVtcGxhdGUsIDQsIDAsICJidXR0b24iLCAwKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zaG93bik7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBNYXRCdXR0b24sIE1hdEljb25dLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50O3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVdICAgYnV0dG9uLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2JvcmRlcjoxcHggc29saWQgI2ViZWJlYn0uYnV0dG9uLWNvbnRlbnRzW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0OjZweH1cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPXRiZGV2X3VwbG9hZF9idXR0b25fY29tcG9uZW50LmNzcy5tYXAgKi8iXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9oZWFkZXIvcmVsb2FkX2NvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IGlzUmVsb2FkRGlzYWJsZWRCeVBsdWdpbiA9IGNyZWF0ZVNlbGVjdG9yKGdldFBsdWdpbnMsIGdldEFjdGl2ZVBsdWdpbiwgKC8qKgogKiBAcGFyYW0gez99IHBsdWdpbnMKICogQHBhcmFtIHs/fSBpZAogKiBAcmV0dXJuIHs/fQogKi8KKHBsdWdpbnMsIGlkKSA9PiB7CiAgICBpZiAoIWlkIHx8ICFwbHVnaW5zW2lkXSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gcGx1Z2luc1tpZF0uZGlzYWJsZV9yZWxvYWQ7Cn0pKTsKY2xhc3MgUmVsb2FkQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLnJlbG9hZERpc2FibGVkJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGlzUmVsb2FkRGlzYWJsZWRCeVBsdWdpbik7CiAgICAgICAgdGhpcy5pc1JlbG9hZGluZyQgPSB0aGlzLnN0b3JlCiAgICAgICAgICAgIC5zZWxlY3QoZ2V0UGx1Z2luc0xpc3RMb2FkZWQpCiAgICAgICAgICAgIC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMucmVsb2FkRGlzYWJsZWQkKSwgbWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFtsb2FkZWQsIHJlbG9hZERpc2FibGVkXSkgPT4gewogICAgICAgICAgICByZXR1cm4gIXJlbG9hZERpc2FibGVkICYmIGxvYWRlZC5zdGF0ZSA9PT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HOwogICAgICAgIH0pKSk7CiAgICAgICAgdGhpcy5sYXN0TG9hZGVkVGltZUluTXMkID0gdGhpcy5zdG9yZQogICAgICAgICAgICAuc2VsZWN0KGdldFBsdWdpbnNMaXN0TG9hZGVkKQogICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbG9hZGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobG9hZGVkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZWQubGFzdExvYWRlZFRpbWVJbk1zOwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyaWdnZXJSZWxvYWQoKSB7CiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtYW51YWxSZWxvYWQoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZVN0cmluZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UmVsb2FkVGl0bGUoZGF0ZVN0cmluZykgewogICAgICAgIGlmICghZGF0ZVN0cmluZykgewogICAgICAgICAgICByZXR1cm4gJ0xvYWRpbmcuLi4nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYExhc3QgVXBkYXRlZDogJHtkYXRlU3RyaW5nfWA7CiAgICB9Cn0KUmVsb2FkQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnYXBwLWhlYWRlci1yZWxvYWQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxidXR0b24KICAgICAgY2xhc3M9InJlbG9hZC1idXR0b24iCiAgICAgIFtjbGFzcy5sb2FkaW5nXT0iaXNSZWxvYWRpbmckIHwgYXN5bmMiCiAgICAgIG1hdC1pY29uLWJ1dHRvbgogICAgICAoY2xpY2spPSJ0cmlnZ2VyUmVsb2FkKCkiCiAgICAgIFt0aXRsZV09ImdldFJlbG9hZFRpdGxlKGxhc3RMb2FkZWRUaW1lSW5NcyQgfCBhc3luYyB8IGRhdGU6ICdtZWRpdW0nKSIKICAgICAgW2Rpc2FibGVkXT0icmVsb2FkRGlzYWJsZWQkIHwgYXN5bmMiCiAgICA+CiAgICAgIDxtYXQtaWNvbiBjbGFzcz0icmVmcmVzaC1pY29uIiBzdmdJY29uPSJyZWZyZXNoXzI0cHgiPjwvbWF0LWljb24+CiAgICA8L2J1dHRvbj4KICBgLAogICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgYAogICAgICAucmVsb2FkLWJ1dHRvbiwKICAgICAgLnJlZnJlc2gtaWNvbiB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAucmVsb2FkLWJ1dHRvbi5sb2FkaW5nIHsKICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClJlbG9hZENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gUmVsb2FkQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gUmVsb2FkQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlbG9hZENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gUmVsb2FkQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFJlbG9hZENvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJhcHAtaGVhZGVyLXJlbG9hZCJdXSwgZGVjbHM6IDYsIHZhcnM6IDEzLCBjb25zdHM6IFtbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAxLCAicmVsb2FkLWJ1dHRvbiIsIDMsICJ0aXRsZSIsICJkaXNhYmxlZCIsICJjbGljayJdLCBbInN2Z0ljb24iLCAicmVmcmVzaF8yNHB4IiwgMSwgInJlZnJlc2gtaWNvbiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFJlbG9hZENvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCAwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gUmVsb2FkQ29udGFpbmVyX1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LnRyaWdnZXJSZWxvYWQoKTsgfSk7CiAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMiwgImRhdGUiKTsKICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICDJtcm1ZWxlbWVudCg1LCAibWF0LWljb24iLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibG9hZGluZyIsIMm1ybVwaXBlQmluZDEoMSwgNCwgY3R4LmlzUmVsb2FkaW5nJCkpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgidGl0bGUiLCBjdHguZ2V0UmVsb2FkVGl0bGUoybXJtXBpcGVCaW5kMigyLCA2LCDJtcm1cGlwZUJpbmQxKDMsIDksIGN0eC5sYXN0TG9hZGVkVGltZUluTXMkKSwgIm1lZGl1bSIpKSkoImRpc2FibGVkIiwgybXJtXBpcGVCaW5kMSg0LCAxMSwgY3R4LnJlbG9hZERpc2FibGVkJCkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0QnV0dG9uLCBNYXRJY29uXSwgcGlwZXM6IFtBc3luY1BpcGUsIERhdGVQaXBlXSwgc3R5bGVzOiBbIi5yZWxvYWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnJlZnJlc2gtaWNvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgLnJlbG9hZC1idXR0b24ubG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHtcbiAgICAgICAgMCUge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgICAgICB9XG4gICAgICAgIDUwJSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgICAgICB9XG4gICAgICB9Il0gfSk7Cgpjb25zdCBfYzAkOCA9IFsiaW5wdXQiXTsKY29uc3QgX2MxJDcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGVudGVyRHVyYXRpb246IDE1MCB9OyB9Owpjb25zdCBfYzIkNCA9IFsiKiJdOwovKioKICogSW5qZWN0aW9uIHRva2VuIHRvIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgYG1hdC1jaGVja2JveGAuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX0NIRUNLQk9YX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWNoZWNrYm94LWRlZmF1bHQtb3B0aW9ucycsIHsKICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgIGZhY3Rvcnk6IE1BVF9DSEVDS0JPWF9ERUZBVUxUX09QVElPTlNfRkFDVE9SWQp9KTsKLyoqCiAqIFxAZG9jcy1wcml2YXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBNQVRfQ0hFQ0tCT1hfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlkoKSB7CiAgICByZXR1cm4gewogICAgICAgIGNvbG9yOiAnYWNjZW50JywKICAgICAgICBjbGlja0FjdGlvbjogJ2NoZWNrLWluZGV0ZXJtaW5hdGUnLAogICAgfTsKfQovKioKICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hlY2tib3ggY2xpY2sgYmVoYXZpb3IuCiAqIEBkZXByZWNhdGVkIEluamVjdGlvbiB0b2tlbiB3aWxsIGJlIHJlbW92ZWQsIHVzZSBgTUFUX0NIRUNLQk9YX0RFRkFVTFRfT1BUSU9OU2AgaW5zdGVhZC4KICogXEBicmVha2luZy1jaGFuZ2UgMTAuMC4wCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX0NIRUNLQk9YX0NMSUNLX0FDVElPTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWNoZWNrYm94LWNsaWNrLWFjdGlvbicpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NoZWNrYm94L2NoZWNrYm94LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIEluY3JlYXNpbmcgaW50ZWdlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgaWRzIGZvciBjaGVja2JveCBjb21wb25lbnRzLgovKiogQHR5cGUgez99ICovCmxldCBuZXh0VW5pcXVlSWQkNSA9IDA7Ci8qKgogKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIG1hdC1jaGVja2JveCB0byByZWdpc3RlciBhcyBhIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BVF9DSEVDS0JPWF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SID0gewogICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsCiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBNYXRDaGVja2JveCkpLAogICAgbXVsdGk6IHRydWUKfTsKLyoqCiAqIENoYW5nZSBldmVudCBvYmplY3QgZW1pdHRlZCBieSBNYXRDaGVja2JveC4KICovCmNsYXNzIE1hdENoZWNrYm94Q2hhbmdlIHsKfQovLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdENoZWNrYm94LgovKioKICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdENoZWNrYm94QmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfTWF0Q2hlY2tib3hNaXhpbkJhc2UgPSBtaXhpblRhYkluZGV4KG1peGluQ29sb3IobWl4aW5EaXNhYmxlUmlwcGxlKG1peGluRGlzYWJsZWQoTWF0Q2hlY2tib3hCYXNlKSkpKTsKLyoqCiAqIEEgbWF0ZXJpYWwgZGVzaWduIGNoZWNrYm94IGNvbXBvbmVudC4gU3VwcG9ydHMgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEhUTUw1IGNoZWNrYm94LAogKiBhbmQgZXhwb3NlcyBhIHNpbWlsYXIgQVBJLiBBIE1hdENoZWNrYm94IGNhbiBiZSBlaXRoZXIgY2hlY2tlZCwgdW5jaGVja2VkLCBpbmRldGVybWluYXRlLCBvcgogKiBkaXNhYmxlZC4gTm90ZSB0aGF0IGFsbCBhZGRpdGlvbmFsIGFjY2Vzc2liaWxpdHkgYXR0cmlidXRlcyBhcmUgdGFrZW4gY2FyZSBvZiBieSB0aGUgY29tcG9uZW50LAogKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb3ZpZGUgdGhlbSB5b3Vyc2VsZi4gSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gb21pdCBhIGxhYmVsIGFuZCBzdGlsbAogKiBoYXZlIHRoZSBjaGVja2JveCBiZSBhY2Nlc3NpYmxlLCB5b3UgbWF5IHN1cHBseSBhbiBbYXJpYS1sYWJlbF0gaW5wdXQuCiAqIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vY29tcG9uZW50cy9zZWxlY3Rpb24tY29udHJvbHMuaHRtbAogKi8KY2xhc3MgTWF0Q2hlY2tib3ggZXh0ZW5kcyBfTWF0Q2hlY2tib3hNaXhpbkJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgKiBAcGFyYW0gez99IF9mb2N1c01vbml0b3IKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICogQHBhcmFtIHs/fSB0YWJJbmRleAogICAgICogQHBhcmFtIHs/fSBfY2xpY2tBY3Rpb24KICAgICAqIEBwYXJhbSB7Pz19IF9hbmltYXRpb25Nb2RlCiAgICAgKiBAcGFyYW0gez89fSBfb3B0aW9ucwogICAgICovCiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBfY2hhbmdlRGV0ZWN0b3JSZWYsIF9mb2N1c01vbml0b3IsIF9uZ1pvbmUsIHRhYkluZGV4LCBfY2xpY2tBY3Rpb24sIF9hbmltYXRpb25Nb2RlLCBfb3B0aW9ucykgewogICAgICAgIHN1cGVyKGVsZW1lbnRSZWYpOwogICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvciA9IF9mb2N1c01vbml0b3I7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9jbGlja0FjdGlvbiA9IF9jbGlja0FjdGlvbjsKICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zOwogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVkIHRvIHRoZSBhcmlhLWxhYmVsIGF0dHJpYnV0ZSBvZiB0aGUgaG9zdCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzLCBhcmlhLWxhYmVsbGVkYnkgd2lsbAogICAgICAgICAqIHRha2UgcHJlY2VkZW5jZSBzbyB0aGlzIG1heSBiZSBvbWl0dGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuYXJpYUxhYmVsID0gJyc7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlcnMgY2FuIHNwZWNpZnkgdGhlIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZSB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgaW5wdXQgZWxlbWVudAogICAgICAgICAqLwogICAgICAgIHRoaXMuYXJpYUxhYmVsbGVkYnkgPSBudWxsOwogICAgICAgIHRoaXMuX3VuaXF1ZUlkID0gYG1hdC1jaGVja2JveC0keysrbmV4dFVuaXF1ZUlkJDV9YDsKICAgICAgICAvKioKICAgICAgICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhlIGNoZWNrYm94IGlucHV0LiBJZiBub25lIGlzIHN1cHBsaWVkLCBpdCB3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaWQgPSB0aGlzLl91bmlxdWVJZDsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYXBwZWFyIGFmdGVyIG9yIGJlZm9yZSB0aGUgY2hlY2tib3guIERlZmF1bHRzIHRvICdhZnRlcicKICAgICAgICAgKi8KICAgICAgICB0aGlzLmxhYmVsUG9zaXRpb24gPSAnYWZ0ZXInOwogICAgICAgIC8qKgogICAgICAgICAqIE5hbWUgdmFsdWUgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBlbGVtZW50IGlmIHByZXNlbnQKICAgICAgICAgKi8KICAgICAgICB0aGlzLm5hbWUgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgY2hlY2tib3gncyBgY2hlY2tlZGAgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNoZWNrYm94J3MgYGluZGV0ZXJtaW5hdGVgIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaGVja2JveCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICB0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MgPSAnJzsKICAgICAgICB0aGlzLl9jdXJyZW50Q2hlY2tTdGF0ZSA9IDAgLyogSW5pdCAqLzsKICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICB0aGlzLl9jaGVja2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7CiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHRoaXMuX29wdGlvbnMgfHwge307CiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY29sb3IpIHsKICAgICAgICAgICAgdGhpcy5jb2xvciA9IHRoaXMuX29wdGlvbnMuY29sb3I7CiAgICAgICAgfQogICAgICAgIHRoaXMudGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCkgfHwgMDsKICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcihlbGVtZW50UmVmLCB0cnVlKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm9jdXNPcmlnaW4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvY3VzT3JpZ2luID0+IHsKICAgICAgICAgICAgaWYgKCFmb2N1c09yaWdpbikgewogICAgICAgICAgICAgICAgLy8gV2hlbiBhIGZvY3VzZWQgZWxlbWVudCBiZWNvbWVzIGRpc2FibGVkLCB0aGUgYnJvd3NlciAqaW1tZWRpYXRlbHkqIGZpcmVzIGEgYmx1ciBldmVudC4KICAgICAgICAgICAgICAgIC8vIEFuZ3VsYXIgZG9lcyBub3QgZXhwZWN0IGV2ZW50cyB0byBiZSByYWlzZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24sIHNvIGFueSBzdGF0ZSBjaGFuZ2UKICAgICAgICAgICAgICAgIC8vIChzdWNoIGFzIGEgZm9ybSBjb250cm9sJ3MgJ25nLXRvdWNoZWQnKSB3aWxsIGNhdXNlIGEgY2hhbmdlZC1hZnRlci1jaGVja2VkIGVycm9yLgogICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE3NzkzLiBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3ZSBkZWZlcgogICAgICAgICAgICAgICAgLy8gdGVsbGluZyB0aGUgZm9ybSBjb250cm9sIGl0IGhhcyBiZWVuIHRvdWNoZWQgdW50aWwgdGhlIG5leHQgdGljay4KICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpOwogICAgICAgICAgICAgICAgICAgIF9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBhZnRlciB0aGUgYF9jbGlja0FjdGlvbmAgcGFyYW1ldGVyIGlzIHJlbW92ZWQgYXMgYW4gaW5qZWN0aW9uIHBhcmFtZXRlci4KICAgICAgICB0aGlzLl9jbGlja0FjdGlvbiA9IHRoaXMuX2NsaWNrQWN0aW9uIHx8IHRoaXMuX29wdGlvbnMuY2xpY2tBY3Rpb247CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHZpc3VhbCBoaWRkZW4gaW5wdXQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaW5wdXRJZCgpIHsgcmV0dXJuIGAke3RoaXMuaWQgfHwgdGhpcy5fdW5pcXVlSWR9LWlucHV0YDsgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyByZXF1aXJlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCByZXF1aXJlZCgpIHsgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCByZXF1aXJlZCh2YWx1ZSkgeyB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgIHRoaXMuX3N5bmNJbmRldGVybWluYXRlKHRoaXMuX2luZGV0ZXJtaW5hdGUpOwogICAgfQogICAgLy8gVE9ETzogRGVsZXRlIG5leHQgbWFqb3IgcmV2aXNpb24uCiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZik7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY2hlY2tlZCgpIHsgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGNoZWNrZWQodmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgIT0gdGhpcy5jaGVja2VkKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrZWQgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyBkaXNhYmxlZC4gVGhpcyBmdWxseSBvdmVycmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5CiAgICAgKiBtaXhpbkRpc2FibGVkLCBidXQgdGhlIG1peGluIGlzIHN0aWxsIHJlcXVpcmVkIGJlY2F1c2UgbWl4aW5UYWJJbmRleCByZXF1aXJlcyBpdC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3VmFsdWU7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgY2hlY2tib3ggaXMgaW5kZXRlcm1pbmF0ZS4gVGhpcyBpcyBhbHNvIGtub3duIGFzICJtaXhlZCIgbW9kZSBhbmQgY2FuIGJlIHVzZWQgdG8KICAgICAqIHJlcHJlc2VudCBhIGNoZWNrYm94IHdpdGggdGhyZWUgc3RhdGVzLCBlLmcuIGEgY2hlY2tib3ggdGhhdCByZXByZXNlbnRzIGEgbmVzdGVkIGxpc3Qgb2YKICAgICAqIGNoZWNrYWJsZSBpdGVtcy4gTm90ZSB0aGF0IHdoZW5ldmVyIGNoZWNrYm94IGlzIG1hbnVhbGx5IGNsaWNrZWQsIGluZGV0ZXJtaW5hdGUgaXMgaW1tZWRpYXRlbHkKICAgICAqIHNldCB0byBmYWxzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBpbmRldGVybWluYXRlKCkgeyByZXR1cm4gdGhpcy5faW5kZXRlcm1pbmF0ZTsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaGFuZ2VkID0gdmFsdWUgIT0gdGhpcy5faW5kZXRlcm1pbmF0ZTsKICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkNoZWNrU3RhdGUoMyAvKiBJbmRldGVybWluYXRlICovKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25DaGVja1N0YXRlKHRoaXMuY2hlY2tlZCA/IDEgLyogQ2hlY2tlZCAqLyA6IDIgLyogVW5jaGVja2VkICovKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc3luY0luZGV0ZXJtaW5hdGUodGhpcy5faW5kZXRlcm1pbmF0ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pc1JpcHBsZURpc2FibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVSaXBwbGUgfHwgdGhpcy5kaXNhYmxlZDsKICAgIH0KICAgIC8qKgogICAgICogTWV0aG9kIGJlaW5nIGNhbGxlZCB3aGVuZXZlciB0aGUgbGFiZWwgdGV4dCBjaGFuZ2VzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uTGFiZWxUZXh0Q2hhbmdlKCkgewogICAgICAgIC8vIFNpbmNlIHRoZSBldmVudCBvZiB0aGUgYGNka09ic2VydmVDb250ZW50YCBkaXJlY3RpdmUgcnVucyBvdXRzaWRlIG9mIHRoZSB6b25lLCB0aGUgY2hlY2tib3gKICAgICAgICAvLyBjb21wb25lbnQgd2lsbCBiZSBvbmx5IG1hcmtlZCBmb3IgY2hlY2ssIGJ1dCBubyBhY3R1YWwgY2hhbmdlIGRldGVjdGlvbiBydW5zIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgLy8gSW5zdGVhZCBvZiBnb2luZyBiYWNrIGludG8gdGhlIHpvbmUgaW4gb3JkZXIgdG8gdHJpZ2dlciBhIGNoYW5nZSBkZXRlY3Rpb24gd2hpY2ggY2F1c2VzCiAgICAgICAgLy8gKmFsbCogY29tcG9uZW50cyB0byBiZSBjaGVja2VkIChpZiBleHBsaWNpdGx5IG1hcmtlZCBvciBub3QgdXNpbmcgT25QdXNoKSwgd2Ugb25seSB0cmlnZ2VyCiAgICAgICAgLy8gYW4gZXhwbGljaXQgY2hhbmdlIGRldGVjdGlvbiBmb3IgdGhlIGNoZWNrYm94IHZpZXcgYW5kIGl0cyBjaGlsZHJlbi4KICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7CiAgICB9CiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgdGhpcy5jaGVja2VkID0gISF2YWx1ZTsKICAgIH0KICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gZm47CiAgICB9CiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuOwogICAgfQogICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldEFyaWFDaGVja2VkKCkgewogICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZSA/ICdtaXhlZCcgOiAnZmFsc2UnOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBuZXdTdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3RyYW5zaXRpb25DaGVja1N0YXRlKG5ld1N0YXRlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvbGRTdGF0ZSA9IHRoaXMuX2N1cnJlbnRDaGVja1N0YXRlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICBpZiAob2xkU3RhdGUgPT09IG5ld1N0YXRlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MgPSB0aGlzLl9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKG9sZFN0YXRlLCBuZXdTdGF0ZSk7CiAgICAgICAgdGhpcy5fY3VycmVudENoZWNrU3RhdGUgPSBuZXdTdGF0ZTsKICAgICAgICBpZiAodGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcyk7CiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIHRvIGF2b2lkIGFuaW1hdGlvbiB3aGVuIHRoZSBjaGVja2JveCBpcyBtb3ZlZCBiZXR3ZWVuIGNvbnRhaW5lcnMKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmltYXRpb25DbGFzcyA9IHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzczsKICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShhbmltYXRpb25DbGFzcyk7CiAgICAgICAgICAgICAgICB9KSwgMTAwMCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZW1pdENoYW5nZUV2ZW50KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNYXRDaGVja2JveENoYW5nZSgpOwogICAgICAgIGV2ZW50LnNvdXJjZSA9IHRoaXM7CiAgICAgICAgZXZlbnQuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDsKICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKHRoaXMuY2hlY2tlZCk7CiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7CiAgICB9CiAgICAvKioKICAgICAqIFRvZ2dsZXMgdGhlIGBjaGVja2VkYCBzdGF0ZSBvZiB0aGUgY2hlY2tib3guCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b2dnbGUoKSB7CiAgICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDsKICAgIH0KICAgIC8qKgogICAgICogRXZlbnQgaGFuZGxlciBmb3IgY2hlY2tib3ggaW5wdXQgZWxlbWVudC4KICAgICAqIFRvZ2dsZXMgY2hlY2tlZCBzdGF0ZSBpZiBlbGVtZW50IGlzIG5vdCBkaXNhYmxlZC4KICAgICAqIERvIG5vdCB0b2dnbGUgb24gKGNoYW5nZSkgZXZlbnQgc2luY2UgSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBldmVudCB3aGVuCiAgICAgKiAgIGluZGV0ZXJtaW5hdGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbklucHV0Q2xpY2soZXZlbnQpIHsKICAgICAgICAvLyBXZSBoYXZlIHRvIHN0b3AgcHJvcGFnYXRpb24gZm9yIGNsaWNrIGV2ZW50cyBvbiB0aGUgdmlzdWFsIGhpZGRlbiBpbnB1dCBlbGVtZW50LgogICAgICAgIC8vIEJ5IGRlZmF1bHQsIHdoZW4gYSB1c2VyIGNsaWNrcyBvbiBhIGxhYmVsIGVsZW1lbnQsIGEgZ2VuZXJhdGVkIGNsaWNrIGV2ZW50IHdpbGwgYmUKICAgICAgICAvLyBkaXNwYXRjaGVkIG9uIHRoZSBhc3NvY2lhdGVkIGlucHV0IGVsZW1lbnQuIFNpbmNlIHdlIGFyZSB1c2luZyBhIGxhYmVsIGVsZW1lbnQgYXMgb3VyCiAgICAgICAgLy8gcm9vdCBjb250YWluZXIsIHRoZSBjbGljayBldmVudCBvbiB0aGUgYGNoZWNrYm94YCB3aWxsIGJlIGV4ZWN1dGVkIHR3aWNlLgogICAgICAgIC8vIFRoZSByZWFsIGNsaWNrIGV2ZW50IHdpbGwgYnViYmxlIHVwLCBhbmQgdGhlIGdlbmVyYXRlZCBjbGljayBldmVudCBhbHNvIHRyaWVzIHRvIGJ1YmJsZSB1cC4KICAgICAgICAvLyBUaGlzIHdpbGwgbGVhZCB0byBtdWx0aXBsZSBjbGljayBldmVudHMuCiAgICAgICAgLy8gUHJldmVudGluZyBidWJibGluZyBmb3IgdGhlIHNlY29uZCBldmVudCB3aWxsIHNvbHZlIHRoYXQgaXNzdWUuCiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgLy8gSWYgcmVzZXRJbmRldGVybWluYXRlIGlzIGZhbHNlLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW5kZXRlcm1pbmF0ZSwgZG8gbm90aGluZyBvbiBjbGljawogICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9jbGlja0FjdGlvbiAhPT0gJ25vb3AnKSB7CiAgICAgICAgICAgIC8vIFdoZW4gdXNlciBtYW51YWxseSBjbGljayBvbiB0aGUgY2hlY2tib3gsIGBpbmRldGVybWluYXRlYCBpcyBzZXQgdG8gZmFsc2UuCiAgICAgICAgICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGUgJiYgdGhpcy5fY2xpY2tBY3Rpb24gIT09ICdjaGVjaycpIHsKICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnRvZ2dsZSgpOwogICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uQ2hlY2tTdGF0ZSh0aGlzLl9jaGVja2VkID8gMSAvKiBDaGVja2VkICovIDogMiAvKiBVbmNoZWNrZWQgKi8pOwogICAgICAgICAgICAvLyBFbWl0IG91ciBjdXN0b20gY2hhbmdlIGV2ZW50IGlmIHRoZSBuYXRpdmUgaW5wdXQgZW1pdHRlZCBvbmUuCiAgICAgICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byBvbmx5IGVtaXQgaXQsIGlmIHRoZSBuYXRpdmUgaW5wdXQgdHJpZ2dlcmVkIG9uZSwgYmVjYXVzZQogICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIHdoZW4gdGhlIGBjaGVja2VkYCB2YXJpYWJsZSBjaGFuZ2VzIGZvciBleGFtcGxlLgogICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5fY2xpY2tBY3Rpb24gPT09ICdub29wJykgewogICAgICAgICAgICAvLyBSZXNldCBuYXRpdmUgaW5wdXQgd2hlbiBjbGlja2VkIHdpdGggbm9vcC4gVGhlIG5hdGl2ZSBjaGVja2JveCBiZWNvbWVzIGNoZWNrZWQgYWZ0ZXIKICAgICAgICAgICAgLy8gY2xpY2ssIHJlc2V0IGl0IHRvIGJlIGFsaWduIHdpdGggYGNoZWNrZWRgIHZhbHVlIG9mIGBtYXQtY2hlY2tib3hgLgogICAgICAgICAgICB0aGlzLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGVja2VkID0gdGhpcy5jaGVja2VkOwogICAgICAgICAgICB0aGlzLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlID0gdGhpcy5pbmRldGVybWluYXRlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRm9jdXNlcyB0aGUgY2hlY2tib3guCiAgICAgKiBAcGFyYW0gez89fSBvcmlnaW4KICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvY3VzKG9yaWdpbiA9ICdrZXlib2FyZCcsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5faW5wdXRFbGVtZW50LCBvcmlnaW4sIG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25JbnRlcmFjdGlvbkV2ZW50KGV2ZW50KSB7CiAgICAgICAgLy8gV2UgYWx3YXlzIGhhdmUgdG8gc3RvcCBwcm9wYWdhdGlvbiBvbiB0aGUgY2hhbmdlIGV2ZW50LgogICAgICAgIC8vIE90aGVyd2lzZSB0aGUgY2hhbmdlIGV2ZW50LCBmcm9tIHRoZSBpbnB1dCBlbGVtZW50LCB3aWxsIGJ1YmJsZSB1cCBhbmQKICAgICAgICAvLyBlbWl0IGl0cyBldmVudCBvYmplY3QgdG8gdGhlIGBjaGFuZ2VgIG91dHB1dC4KICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb2xkU3RhdGUKICAgICAqIEBwYXJhbSB7P30gbmV3U3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKG9sZFN0YXRlLCBuZXdTdGF0ZSkgewogICAgICAgIC8vIERvbid0IHRyYW5zaXRpb24gaWYgYW5pbWF0aW9ucyBhcmUgZGlzYWJsZWQuCiAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGFuaW1TdWZmaXggPSAnJzsKICAgICAgICBzd2l0Y2ggKG9sZFN0YXRlKSB7CiAgICAgICAgICAgIGNhc2UgMCAvKiBJbml0ICovOgogICAgICAgICAgICAgICAgLy8gSGFuZGxlIGVkZ2UgY2FzZSB3aGVyZSB1c2VyIGludGVyYWN0cyB3aXRoIGNoZWNrYm94IHRoYXQgZG9lcyBub3QgaGF2ZSBbKG5nTW9kZWwpXSBvcgogICAgICAgICAgICAgICAgLy8gW2NoZWNrZWRdIGJvdW5kIHRvIGl0LgogICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09PSAxIC8qIENoZWNrZWQgKi8pIHsKICAgICAgICAgICAgICAgICAgICBhbmltU3VmZml4ID0gJ3VuY2hlY2tlZC1jaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1N0YXRlID09IDMgLyogSW5kZXRlcm1pbmF0ZSAqLykgewogICAgICAgICAgICAgICAgICAgIGFuaW1TdWZmaXggPSAndW5jaGVja2VkLWluZGV0ZXJtaW5hdGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMiAvKiBVbmNoZWNrZWQgKi86CiAgICAgICAgICAgICAgICBhbmltU3VmZml4ID0gbmV3U3RhdGUgPT09IDEgLyogQ2hlY2tlZCAqLyA/CiAgICAgICAgICAgICAgICAgICAgJ3VuY2hlY2tlZC1jaGVja2VkJyA6ICd1bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxIC8qIENoZWNrZWQgKi86CiAgICAgICAgICAgICAgICBhbmltU3VmZml4ID0gbmV3U3RhdGUgPT09IDIgLyogVW5jaGVja2VkICovID8KICAgICAgICAgICAgICAgICAgICAnY2hlY2tlZC11bmNoZWNrZWQnIDogJ2NoZWNrZWQtaW5kZXRlcm1pbmF0ZSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzIC8qIEluZGV0ZXJtaW5hdGUgKi86CiAgICAgICAgICAgICAgICBhbmltU3VmZml4ID0gbmV3U3RhdGUgPT09IDEgLyogQ2hlY2tlZCAqLyA/CiAgICAgICAgICAgICAgICAgICAgJ2luZGV0ZXJtaW5hdGUtY2hlY2tlZCcgOiAnaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgbWF0LWNoZWNrYm94LWFuaW0tJHthbmltU3VmZml4fWA7CiAgICB9CiAgICAvKioKICAgICAqIFN5bmNzIHRoZSBpbmRldGVybWluYXRlIHZhbHVlIHdpdGggdGhlIGNoZWNrYm94IERPTSBub2RlLgogICAgICoKICAgICAqIFdlIHN5bmMgYGluZGV0ZXJtaW5hdGVgIGRpcmVjdGx5IG9uIHRoZSBET00gbm9kZSwgYmVjYXVzZSBpbiBJdnkgdGhlIGNoZWNrIGZvciB3aGV0aGVyIGEKICAgICAqIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBvbiBhbiBlbGVtZW50IGJvaWxzIGRvd24gdG8gYGlmIChwcm9wTmFtZSBpbiBlbGVtZW50KWAuIERvbWlubydzCiAgICAgKiBIVE1MSW5wdXRFbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBgaW5kZXRlcm1pbmF0ZWAgcHJvcGVydHkgc28gSXZ5IHdpbGwgd2FybiBkdXJpbmcKICAgICAqIHNlcnZlci1zaWRlIHJlbmRlcmluZy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc3luY0luZGV0ZXJtaW5hdGUodmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmF0aXZlQ2hlY2tib3ggPSB0aGlzLl9pbnB1dEVsZW1lbnQ7CiAgICAgICAgaWYgKG5hdGl2ZUNoZWNrYm94KSB7CiAgICAgICAgICAgIG5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KfQpNYXRDaGVja2JveC7JtWZhYyA9IGZ1bmN0aW9uIE1hdENoZWNrYm94X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdENoZWNrYm94KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3RBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0NIRUNLQk9YX0NMSUNLX0FDVElPTiwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfQ0hFQ0tCT1hfREVGQVVMVF9PUFRJT05TLCA4KSk7IH07Ck1hdENoZWNrYm94Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdENoZWNrYm94LCBzZWxlY3RvcnM6IFtbIm1hdC1jaGVja2JveCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRDaGVja2JveF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMCQ4LCB0cnVlKTsKICAgICAgICDJtcm1dmlld1F1ZXJ5KE1hdFJpcHBsZSwgdHJ1ZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW5wdXRFbGVtZW50ID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgucmlwcGxlID0gX3QuZmlyc3QpOwogICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LWNoZWNrYm94Il0sIGhvc3RWYXJzOiAxMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRDaGVja2JveF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWhvc3RQcm9wZXJ0eSgiaWQiLCBjdHguaWQpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoInRhYmluZGV4IiwgbnVsbCk7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUiLCBjdHguaW5kZXRlcm1pbmF0ZSkoIm1hdC1jaGVja2JveC1jaGVja2VkIiwgY3R4LmNoZWNrZWQpKCJtYXQtY2hlY2tib3gtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtY2hlY2tib3gtbGFiZWwtYmVmb3JlIiwgY3R4LmxhYmVsUG9zaXRpb24gPT0gImJlZm9yZSIpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIsIGNvbG9yOiAiY29sb3IiLCB0YWJJbmRleDogInRhYkluZGV4IiwgYXJpYUxhYmVsOiBbImFyaWEtbGFiZWwiLCAiYXJpYUxhYmVsIl0sIGFyaWFMYWJlbGxlZGJ5OiBbImFyaWEtbGFiZWxsZWRieSIsICJhcmlhTGFiZWxsZWRieSJdLCBpZDogImlkIiwgbGFiZWxQb3NpdGlvbjogImxhYmVsUG9zaXRpb24iLCBuYW1lOiAibmFtZSIsIHJlcXVpcmVkOiAicmVxdWlyZWQiLCBjaGVja2VkOiAiY2hlY2tlZCIsIGRpc2FibGVkOiAiZGlzYWJsZWQiLCBpbmRldGVybWluYXRlOiAiaW5kZXRlcm1pbmF0ZSIsIHZhbHVlOiAidmFsdWUiIH0sIG91dHB1dHM6IHsgY2hhbmdlOiAiY2hhbmdlIiwgaW5kZXRlcm1pbmF0ZUNoYW5nZTogImluZGV0ZXJtaW5hdGVDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm1hdENoZWNrYm94Il0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW01BVF9DSEVDS0JPWF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMiQ0LCBkZWNsczogMTcsIHZhcnM6IDE5LCBjb25zdHM6IFtbMSwgIm1hdC1jaGVja2JveC1sYXlvdXQiXSwgWyJsYWJlbCIsICIiXSwgWzEsICJtYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyIl0sIFsidHlwZSIsICJjaGVja2JveCIsIDEsICJtYXQtY2hlY2tib3gtaW5wdXQiLCAiY2RrLXZpc3VhbGx5LWhpZGRlbiIsIDMsICJpZCIsICJyZXF1aXJlZCIsICJjaGVja2VkIiwgImRpc2FibGVkIiwgInRhYkluZGV4IiwgImNoYW5nZSIsICJjbGljayJdLCBbImlucHV0IiwgIiJdLCBbIm1hdFJpcHBsZSIsICIiLCAxLCAibWF0LWNoZWNrYm94LXJpcHBsZSIsICJtYXQtZm9jdXMtaW5kaWNhdG9yIiwgMywgIm1hdFJpcHBsZVRyaWdnZXIiLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAibWF0UmlwcGxlUmFkaXVzIiwgIm1hdFJpcHBsZUNlbnRlcmVkIiwgIm1hdFJpcHBsZUFuaW1hdGlvbiJdLCBbMSwgIm1hdC1yaXBwbGUtZWxlbWVudCIsICJtYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUiXSwgWzEsICJtYXQtY2hlY2tib3gtZnJhbWUiXSwgWzEsICJtYXQtY2hlY2tib3gtYmFja2dyb3VuZCJdLCBbInZlcnNpb24iLCAiMS4xIiwgImZvY3VzYWJsZSIsICJmYWxzZSIsICJ2aWV3Qm94IiwgIjAgMCAyNCAyNCIsIDAsICJ4bWwiLCAic3BhY2UiLCAicHJlc2VydmUiLCAxLCAibWF0LWNoZWNrYm94LWNoZWNrbWFyayJdLCBbImZpbGwiLCAibm9uZSIsICJzdHJva2UiLCAid2hpdGUiLCAiZCIsICJNNC4xLDEyLjcgOSwxNy42IDIwLjMsNi4zIiwgMSwgIm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aCJdLCBbMSwgIm1hdC1jaGVja2JveC1taXhlZG1hcmsiXSwgWzEsICJtYXQtY2hlY2tib3gtbGFiZWwiLCAzLCAiY2RrT2JzZXJ2ZUNvbnRlbnQiXSwgWyJjaGVja2JveExhYmVsIiwgIiJdLCBbMiwgImRpc3BsYXkiLCAibm9uZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdENoZWNrYm94X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibGFiZWwiLCAwLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJpbnB1dCIsIDMsIDQpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gTWF0Q2hlY2tib3hfVGVtcGxhdGVfaW5wdXRfY2hhbmdlXzNfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX29uSW50ZXJhY3Rpb25FdmVudCgkZXZlbnQpOyB9KSgiY2xpY2siLCBmdW5jdGlvbiBNYXRDaGVja2JveF9UZW1wbGF0ZV9pbnB1dF9jbGlja18zX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbklucHV0Q2xpY2soJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiLCA1KTsKICAgICAgICDJtcm1ZWxlbWVudCg2LCAiZGl2IiwgNik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudCg3LCAiZGl2IiwgNyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAiZGl2IiwgOCk7CiAgICAgICAgybXJtW5hbWVzcGFjZVNWRygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgInN2ZyIsIDkpOwogICAgICAgIMm1ybVlbGVtZW50KDEwLCAicGF0aCIsIDEwKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVuYW1lc3BhY2VIVE1MKCk7CiAgICAgICAgybXJtWVsZW1lbnQoMTEsICJkaXYiLCAxMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTIsICJzcGFuIiwgMTIsIDEzKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNka09ic2VydmVDb250ZW50IiwgZnVuY3Rpb24gTWF0Q2hlY2tib3hfVGVtcGxhdGVfc3Bhbl9jZGtPYnNlcnZlQ29udGVudF8xMl9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5fb25MYWJlbFRleHRDaGFuZ2UoKTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNCwgInNwYW4iLCAxNCk7CiAgICAgICAgybXJtXRleHQoMTUsICJcdTAwQTAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDE2KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBfcjAgPSDJtcm1cmVmZXJlbmNlKDEpOwogICAgICAgIGNvbnN0IF9yMiA9IMm1ybVyZWZlcmVuY2UoMTMpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoImZvciIsIGN0eC5pbnB1dElkKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyLW5vLXNpZGUtbWFyZ2luIiwgIV9yMi50ZXh0Q29udGVudCB8fCAhX3IyLnRleHRDb250ZW50LnRyaW0oKSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJpZCIsIGN0eC5pbnB1dElkKSgicmVxdWlyZWQiLCBjdHgucmVxdWlyZWQpKCJjaGVja2VkIiwgY3R4LmNoZWNrZWQpKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoInRhYkluZGV4IiwgY3R4LnRhYkluZGV4KTsKICAgICAgICDJtcm1YXR0cmlidXRlKCJ2YWx1ZSIsIGN0eC52YWx1ZSkoIm5hbWUiLCBjdHgubmFtZSkoImFyaWEtbGFiZWwiLCBjdHguYXJpYUxhYmVsIHx8IG51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLCBjdHguYXJpYUxhYmVsbGVkYnkpKCJhcmlhLWNoZWNrZWQiLCBjdHguX2dldEFyaWFDaGVja2VkKCkpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlVHJpZ2dlciIsIF9yMCkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4Ll9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVSYWRpdXMiLCAyMCkoIm1hdFJpcHBsZUNlbnRlcmVkIiwgdHJ1ZSkoIm1hdFJpcHBsZUFuaW1hdGlvbiIsIMm1ybVwdXJlRnVuY3Rpb24wKDE4LCBfYzEkNykpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0UmlwcGxlLCBDZGtPYnNlcnZlQ29udGVudF0sIHN0eWxlczogWyJAa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1mYWRlLWluLWJhY2tncm91bmR7MCV7b3BhY2l0eTowfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWZhZGUtb3V0LWJhY2tncm91bmR7MCUsNTAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh7MCUsNTAle3N0cm9rZS1kYXNob2Zmc2V0OjIyLjkxMDI1OX01MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfTEwMCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MH19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrezAlLDY4LjIle3RyYW5zZm9ybTpzY2FsZVgoMCl9NjguMiV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMCwgMSl9MTAwJXt0cmFuc2Zvcm06c2NhbGVYKDEpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLXVuY2hlY2tlZC1jaGVja21hcmstcGF0aHtmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSk7c3Ryb2tlLWRhc2hvZmZzZXQ6MH10b3tzdHJva2UtZGFzaG9mZnNldDotMjIuOTEwMjU5fX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRve29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLWNoZWNrbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTQsIDAsIDAsIDEpO29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1taXhlZG1hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE0LCAwLCAwLCAxKTtvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX10b3tvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSgzMTVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLXVuY2hlY2tlZC1taXhlZG1hcmt7MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpsaW5lYXI7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZVgoMSl9MzIuOCUsMTAwJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWCgwKX19Lm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtZnJhbWV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNpemluZzpib3JkZXItYm94O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1jaGVja2JveHt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWNoZWNrYm94e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWNoZWNrYm94IC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjE2fS5tYXQtY2hlY2tib3gtbGF5b3V0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6aW5oZXJpdDthbGlnbi1pdGVtczpiYXNlbGluZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTppbmxpbmUtZmxleDt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1jaGVja2JveC1sYWJlbHstd2Via2l0LXVzZXItc2VsZWN0OmF1dG87LW1vei11c2VyLXNlbGVjdDphdXRvOy1tcy11c2VyLXNlbGVjdDphdXRvO3VzZXItc2VsZWN0OmF1dG99Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MDttYXJnaW46YXV0bzttYXJnaW4tcmlnaHQ6OHB4O29yZGVyOjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxNnB4O2ZsZXgtc2hyaW5rOjB9W2Rpcj1ydGxdIC5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6YXV0b30ubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtY2hlY2tib3gtZnJhbWV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7Ym9yZGVyLXdpZHRoOjJweDtib3JkZXItc3R5bGU6c29saWR9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtY2hlY2tib3gtZnJhbWV7dHJhbnNpdGlvbjpub25lfS5tYXQtY2hlY2tib3guY2RrLWtleWJvYXJkLWZvY3VzZWQgLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1zdHlsZTpkb3R0ZWR9Lm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSxvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke3RyYW5zaXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtY2hlY2tib3ggLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQ6bm9uZX0ubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXI6aG92ZXIgLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4wNH0ubWF0LWNoZWNrYm94LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMTJ9Lm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LWNoZWNrYm94Lm1hdC1jaGVja2JveC1kaXNhYmxlZCAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcjpob3ZlciAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyOmhvdmVyIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpub25lfX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3t0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MjIuOTEwMjU5O3N0cm9rZS1kYXNoYXJyYXk6MjIuOTEwMjU5O3N0cm9rZS13aWR0aDoyLjEzMzMzMzMzMzNweH0uY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzAwMCAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre3dpZHRoOmNhbGMoMTAwJSAtIDZweCk7aGVpZ2h0OjJweDtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWCgwKSByb3RhdGUoMGRlZyk7Ym9yZGVyLXJhZGl1czoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3toZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDttYXJnaW4tdG9wOjJweH0ubWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZSAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcntvcmRlcjoxO21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1jaGVja2JveC1sYWJlbC1iZWZvcmUgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6OHB4fS5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWNoZWNrbWFya3tvcGFjaXR5OjF9Lm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MH0ubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoLTQ1ZGVnKX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmt7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGVYKDEpIHJvdGF0ZSgwZGVnKX0ubWF0LWNoZWNrYm94LXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh9Lm1hdC1jaGVja2JveC1hbmltLXVuY2hlY2tlZC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1pbi1iYWNrZ3JvdW5kfS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tY2hlY2tlZC11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHthbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLXVuY2hlY2tlZC1jaGVja21hcmstcGF0aH0ubWF0LWNoZWNrYm94LWFuaW0tY2hlY2tlZC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2FuaW1hdGlvbjo5MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1jaGVja21hcmt9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmt7YW5pbWF0aW9uOjUwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1jaGVja21hcmt9Lm1hdC1jaGVja2JveC1hbmltLWluZGV0ZXJtaW5hdGUtY2hlY2tlZCAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246NTAwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FuaW1hdGlvbjoxODBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1mYWRlLW91dC1iYWNrZ3JvdW5kfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246MzAwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtaW5wdXR7Ym90dG9tOjA7bGVmdDo1MCV9Lm1hdC1jaGVja2JveCAubWF0LWNoZWNrYm94LXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7dG9wOmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRDaGVja2JveC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogQXR0cmlidXRlLCBhcmdzOiBbJ3RhYmluZGV4JyxdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfQ0hFQ0tCT1hfQ0xJQ0tfQUNUSU9OLF0gfV0gfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfQ0hFQ0tCT1hfREVGQVVMVF9PUFRJT05TLF0gfV0gfQpdOwpNYXRDaGVja2JveC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGFyaWFMYWJlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnYXJpYS1sYWJlbCcsXSB9XSwKICAgIGFyaWFMYWJlbGxlZGJ5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydhcmlhLWxhYmVsbGVkYnknLF0gfV0sCiAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICByZXF1aXJlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBsYWJlbFBvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgY2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBpbmRldGVybWluYXRlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBfaW5wdXRFbGVtZW50OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnaW5wdXQnLF0gfV0sCiAgICByaXBwbGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW01hdFJpcHBsZSxdIH1dLAogICAgY2hlY2tlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBpbmRldGVybWluYXRlOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NoZWNrYm94L2NoZWNrYm94LXJlcXVpcmVkLXZhbGlkYXRvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE1BVF9DSEVDS0JPWF9SRVFVSVJFRF9WQUxJREFUT1IgPSB7CiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcikpLAogICAgbXVsdGk6IHRydWUKfTsKLyoqCiAqIFZhbGlkYXRvciBmb3IgTWF0ZXJpYWwgY2hlY2tib3gncyByZXF1aXJlZCBhdHRyaWJ1dGUgaW4gdGVtcGxhdGUtZHJpdmVuIGNoZWNrYm94LgogKiBDdXJyZW50IENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3Igb25seSB3b3JrIHdpdGggYGlucHV0IHR5cGU9Y2hlY2tib3hgIGFuZCBkb2VzIG5vdAogKiB3b3JrIHdpdGggYG1hdC1jaGVja2JveGAuCiAqLwpjbGFzcyBNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yIGV4dGVuZHMgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciB7Cn0KTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIE1hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JfRmFjdG9yeSh0KSB7IHJldHVybiDJtU1hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JfQmFzZUZhY3RvcnkodCB8fCBNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yKTsgfTsKTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbIm1hdC1jaGVja2JveCIsICJyZXF1aXJlZCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIm1hdC1jaGVja2JveCIsICJyZXF1aXJlZCIsICIiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsibWF0LWNoZWNrYm94IiwgInJlcXVpcmVkIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbTUFUX0NIRUNLQk9YX1JFUVVJUkVEX1ZBTElEQVRPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKY29uc3QgybVNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcik7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY2hlY2tib3gvY2hlY2tib3gtbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaGlzIG1vZHVsZSBpcyB1c2VkIGJ5IGJvdGggb3JpZ2luYWwgYW5kIE1EQy1iYXNlZCBjaGVja2JveCBpbXBsZW1lbnRhdGlvbnMuCiAqLwovLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y2xhc3MtbmFtZQpjbGFzcyBfTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvck1vZHVsZSB7Cn0KX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBfTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvck1vZHVsZSB9KTsKX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBfTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvck1vZHVsZSkoKTsgfSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl0sIGV4cG9ydHM6IFtNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yXSB9KTsgfSkoKTsKY2xhc3MgTWF0Q2hlY2tib3hNb2R1bGUgewp9Ck1hdENoZWNrYm94TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0Q2hlY2tib3hNb2R1bGUgfSk7Ck1hdENoZWNrYm94TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0Q2hlY2tib3hNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0Q2hlY2tib3hNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgIE1hdFJpcHBsZU1vZHVsZSwgTWF0Q29tbW9uTW9kdWxlLCBPYnNlcnZlcnNNb2R1bGUsCiAgICAgICAgICAgIF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlCiAgICAgICAgXSwKICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRDaGVja2JveE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRDaGVja2JveF07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRSaXBwbGVNb2R1bGUsIE1hdENvbW1vbk1vZHVsZSwgT2JzZXJ2ZXJzTW9kdWxlLAogICAgICAgIF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdENoZWNrYm94LAogICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICBfTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvck1vZHVsZV07IH0gfSk7IH0pKCk7Cgpjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KTsKLyoqCiAqIEFuIGluamVjdGFibGUgc2VydmljZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIGF1dG9maWxsIHN0YXRlIG9mIGFuIGlucHV0LgogKiBCYXNlZCBvbiB0aGUgZm9sbG93aW5nIGJsb2cgcG9zdDoKICogaHR0cHM6Ly9tZWRpdW0uY29tL1xAYnJ1bm4vZGV0ZWN0aW5nLWF1dG9maWxsZWQtZmllbGRzLWluLWphdmFzY3JpcHQtYWVkNTk4ZDI1ZGE3CiAqLwpjbGFzcyBBdXRvZmlsbE1vbml0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9wbGF0Zm9ybSwgX25nWm9uZSkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgdGhpcy5fbW9uaXRvcmVkRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudE9yUmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtb25pdG9yKGVsZW1lbnRPclJlZikgewogICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgIHJldHVybiBFTVBUWTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnRPclJlZik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZWxlbWVudCk7CiAgICAgICAgaWYgKGluZm8pIHsKICAgICAgICAgICAgcmV0dXJuIGluZm8uc3ViamVjdC5hc09ic2VydmFibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNzc0NsYXNzID0gJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsZWQnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICgvKiogQHR5cGUgez99ICovICgoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAvLyBBbmltYXRpb24gZXZlbnRzIGZpcmUgb24gaW5pdGlhbCBlbGVtZW50IHJlbmRlciwgd2UgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgYXV0b2ZpbGwKICAgICAgICAgICAgLy8gQ1NTIGNsYXNzIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVhbCBjaGFuZ2UgaW4gc3RhdGUsIG5vdCBqdXN0IHRoZSBpbml0aWFsIHJlbmRlciBiZWZvcmUKICAgICAgICAgICAgLy8gd2UgZmlyZSBvZmYgZXZlbnRzLgogICAgICAgICAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0JyAmJgogICAgICAgICAgICAgICAgIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNzc0NsYXNzKSkgewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTsKICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gcmVzdWx0Lm5leHQoeyB0YXJnZXQ6ICgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKSwgaXNBdXRvZmlsbGVkOiB0cnVlIH0pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCcgJiYKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNzc0NsYXNzKSkgewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNzc0NsYXNzKTsKICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gcmVzdWx0Lm5leHQoeyB0YXJnZXQ6ICgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKSwgaXNBdXRvZmlsbGVkOiBmYWxzZSB9KSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25zdGFydCcsIGxpc3RlbmVyLCBsaXN0ZW5lck9wdGlvbnMpOwogICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZCcpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5zZXQoZWxlbWVudCwgewogICAgICAgICAgICBzdWJqZWN0OiByZXN1bHQsCiAgICAgICAgICAgIHVubGlzdGVuOiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbnN0YXJ0JywgbGlzdGVuZXIsIGxpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgIH0pCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdC5hc09ic2VydmFibGUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50T3JSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0b3BNb25pdG9yaW5nKGVsZW1lbnRPclJlZikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50T3JSZWYpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fbW9uaXRvcmVkRWxlbWVudHMuZ2V0KGVsZW1lbnQpOwogICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgIGluZm8udW5saXN0ZW4oKTsKICAgICAgICAgICAgaW5mby5zdWJqZWN0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkJyk7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCcpOwogICAgICAgICAgICB0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9pbmZvCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoX2luZm8sIGVsZW1lbnQpID0+IHRoaXMuc3RvcE1vbml0b3JpbmcoZWxlbWVudCkpKTsKICAgIH0KfQpBdXRvZmlsbE1vbml0b3IuybVmYWMgPSBmdW5jdGlvbiBBdXRvZmlsbE1vbml0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXV0b2ZpbGxNb25pdG9yKSjJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChOZ1pvbmUpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovCkF1dG9maWxsTW9uaXRvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogTmdab25lIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIEF1dG9maWxsTW9uaXRvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIEF1dG9maWxsTW9uaXRvcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEF1dG9maWxsTW9uaXRvcijJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChOZ1pvbmUpKTsgfSwgdG9rZW46IEF1dG9maWxsTW9uaXRvciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwovKioKICogQSBkaXJlY3RpdmUgdGhhdCBjYW4gYmUgdXNlZCB0byBtb25pdG9yIHRoZSBhdXRvZmlsbCBzdGF0ZSBvZiBhbiBpbnB1dC4KICovCmNsYXNzIENka0F1dG9maWxsIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfYXV0b2ZpbGxNb25pdG9yCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfYXV0b2ZpbGxNb25pdG9yKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX2F1dG9maWxsTW9uaXRvciA9IF9hdXRvZmlsbE1vbml0b3I7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgYXV0b2ZpbGwgc3RhdGUgb2YgdGhlIGVsZW1lbnQgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNka0F1dG9maWxsID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLl9hdXRvZmlsbE1vbml0b3IKICAgICAgICAgICAgLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZikKICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZXZlbnQgPT4gdGhpcy5jZGtBdXRvZmlsbC5lbWl0KGV2ZW50KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9hdXRvZmlsbE1vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZik7CiAgICB9Cn0KQ2RrQXV0b2ZpbGwuybVmYWMgPSBmdW5jdGlvbiBDZGtBdXRvZmlsbF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtBdXRvZmlsbCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChBdXRvZmlsbE1vbml0b3IpKTsgfTsKQ2RrQXV0b2ZpbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQXV0b2ZpbGwsIHNlbGVjdG9yczogW1siIiwgImNka0F1dG9maWxsIiwgIiJdXSwgb3V0cHV0czogeyBjZGtBdXRvZmlsbDogImNka0F1dG9maWxsIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KQ2RrQXV0b2ZpbGwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogQXV0b2ZpbGxNb25pdG9yIH0KXTsKQ2RrQXV0b2ZpbGwucHJvcERlY29yYXRvcnMgPSB7CiAgICBjZGtBdXRvZmlsbDogW3sgdHlwZTogT3V0cHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3RleHQtZmllbGQvYXV0b3NpemUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERpcmVjdGl2ZSB0byBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBhIHRleHRhcmVhIHRvIGZpdCBpdHMgY29udGVudC4KICovCmNsYXNzIENka1RleHRhcmVhQXV0b3NpemUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgKiBAcGFyYW0gez89fSBkb2N1bWVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX3BsYXRmb3JtLCBfbmdab25lLCAKICAgIC8qKiBAYnJlYWtpbmctY2hhbmdlIDExLjAuMCBtYWtlIGRvY3VtZW50IHJlcXVpcmVkICovCiAgICBkb2N1bWVudCkgewogICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogVmFsdWUgb2YgbWluUm93cyBhcyBvZiBsYXN0IHJlc2l6ZS4gSWYgdGhlIG1pblJvd3MgaGFzIGRlY3JlYXNlZCwgdGhlCiAgICAgICAgICogaGVpZ2h0IG9mIHRoZSB0ZXh0YXJlYSBuZWVkcyB0byBiZSByZWNvbXB1dGVkIHRvIHJlZmxlY3QgdGhlIG5ldyBtaW5pbXVtLiBUaGUgbWF4SGVpZ2h0CiAgICAgICAgICogZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtIGJlY2F1c2UgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSB0ZXh0YXJlYSdzIHNjcm9sbEhlaWdodC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmV2aW91c01pblJvd3MgPSAtMTsKICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgIHRoaXMuX3RleHRhcmVhRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTsKICAgIH0KICAgIC8qKgogICAgICogTWluaW11bSBhbW91bnQgb2Ygcm93cyBpbiB0aGUgdGV4dGFyZWEuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbWluUm93cygpIHsgcmV0dXJuIHRoaXMuX21pblJvd3M7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG1pblJvd3ModmFsdWUpIHsKICAgICAgICB0aGlzLl9taW5Sb3dzID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpOwogICAgICAgIHRoaXMuX3NldE1pbkhlaWdodCgpOwogICAgfQogICAgLyoqCiAgICAgKiBNYXhpbXVtIGFtb3VudCBvZiByb3dzIGluIHRoZSB0ZXh0YXJlYS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBtYXhSb3dzKCkgeyByZXR1cm4gdGhpcy5fbWF4Um93czsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbWF4Um93cyh2YWx1ZSkgewogICAgICAgIHRoaXMuX21heFJvd3MgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgdGhpcy5fc2V0TWF4SGVpZ2h0KCk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgYXV0b3NpemluZyBpcyBlbmFibGVkIG9yIG5vdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl9lbmFibGVkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBlbmFibGVkKHZhbHVlKSB7CiAgICAgICAgdmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgIC8vIE9ubHkgYWN0IGlmIHRoZSBhY3R1YWwgdmFsdWUgY2hhbmdlZC4gVGhpcyBzcGVjaWZpY2FsbHkgaGVscHMgdG8gbm90IHJ1bgogICAgICAgIC8vIHJlc2l6ZVRvRml0Q29udGVudCB0b28gZWFybHkgKGkuZS4gYmVmb3JlIG5nQWZ0ZXJWaWV3SW5pdCkKICAgICAgICBpZiAodGhpcy5fZW5hYmxlZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgKHRoaXMuX2VuYWJsZWQgPSB2YWx1ZSkgPyB0aGlzLnJlc2l6ZVRvRml0Q29udGVudCh0cnVlKSA6IHRoaXMucmVzZXQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSB0ZXh0YXJlYSBhcyBkZXRlcm1pbmVkIGJ5IG1pblJvd3MuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2V0TWluSGVpZ2h0KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLm1pblJvd3MgJiYgdGhpcy5fY2FjaGVkTGluZUhlaWdodCA/CiAgICAgICAgICAgIGAke3RoaXMubWluUm93cyAqIHRoaXMuX2NhY2hlZExpbmVIZWlnaHR9cHhgIDogbnVsbDsKICAgICAgICBpZiAobWluSGVpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhRWxlbWVudC5zdHlsZS5taW5IZWlnaHQgPSBtaW5IZWlnaHQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgdGV4dGFyZWEgYXMgZGV0ZXJtaW5lZCBieSBtYXhSb3dzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldE1heEhlaWdodCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5tYXhSb3dzICYmIHRoaXMuX2NhY2hlZExpbmVIZWlnaHQgPwogICAgICAgICAgICBgJHt0aGlzLm1heFJvd3MgKiB0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0fXB4YCA6IG51bGw7CiAgICAgICAgaWYgKG1heEhlaWdodCkgewogICAgICAgICAgICB0aGlzLl90ZXh0YXJlYUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGhlaWdodCB3aGljaCB3ZSBzdGFydGVkIHdpdGggaW4gY2FzZSBhdXRvc2l6aW5nIGlzIGRpc2FibGVkCiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxIZWlnaHQgPSB0aGlzLl90ZXh0YXJlYUVsZW1lbnQuc3R5bGUuaGVpZ2h0OwogICAgICAgICAgICB0aGlzLnJlc2l6ZVRvRml0Q29udGVudCgpOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7CiAgICAgICAgICAgICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykKICAgICAgICAgICAgICAgICAgICAucGlwZShhdWRpdFRpbWUoMTYpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkKICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMucmVzaXplVG9GaXRDb250ZW50KHRydWUpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7CiAgICB9CiAgICAvKioKICAgICAqIENhY2hlIHRoZSBoZWlnaHQgb2YgYSBzaW5nbGUtcm93IHRleHRhcmVhIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNhY2hlZC4KICAgICAqCiAgICAgKiBXZSBuZWVkIHRvIGtub3cgaG93IGxhcmdlIGEgc2luZ2xlICJyb3ciIG9mIGEgdGV4dGFyZWEgaXMgaW4gb3JkZXIgdG8gYXBwbHkgbWluUm93cyBhbmQKICAgICAqIG1heFJvd3MuIEZvciB0aGUgaW5pdGlhbCB2ZXJzaW9uLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBoZWlnaHQgb2YgYSBzaW5nbGUgbGluZSBpbiB0aGUKICAgICAqIHRleHRhcmVhIGRvZXMgbm90IGV2ZXIgY2hhbmdlLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpIHsKICAgICAgICBpZiAodGhpcy5fY2FjaGVkTGluZUhlaWdodCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIFVzZSBhIGNsb25lIGVsZW1lbnQgYmVjYXVzZSB3ZSBoYXZlIHRvIG92ZXJyaWRlIHNvbWUgc3R5bGVzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdGV4dGFyZWFDbG9uZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl90ZXh0YXJlYUVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKSkpOwogICAgICAgIHRleHRhcmVhQ2xvbmUucm93cyA9IDE7CiAgICAgICAgLy8gVXNlIGBwb3NpdGlvbjogYWJzb2x1dGVgIHNvIHRoYXQgdGhpcyBkb2Vzbid0IGNhdXNlIGEgYnJvd3NlciBsYXlvdXQgYW5kIHVzZQogICAgICAgIC8vIGB2aXNpYmlsaXR5OiBoaWRkZW5gIHNvIHRoYXQgbm90aGluZyBpcyByZW5kZXJlZC4gQ2xlYXIgYW55IG90aGVyIHN0eWxlcyB0aGF0CiAgICAgICAgLy8gd291bGQgYWZmZWN0IHRoZSBoZWlnaHQuCiAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CiAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS5ib3JkZXIgPSAnbm9uZSc7CiAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS5wYWRkaW5nID0gJzAnOwogICAgICAgIHRleHRhcmVhQ2xvbmUuc3R5bGUuaGVpZ2h0ID0gJyc7CiAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS5taW5IZWlnaHQgPSAnJzsKICAgICAgICB0ZXh0YXJlYUNsb25lLnN0eWxlLm1heEhlaWdodCA9ICcnOwogICAgICAgIC8vIEluIEZpcmVmb3ggaXQgaGFwcGVucyB0aGF0IHRleHRhcmVhIGVsZW1lbnRzIGFyZSBhbHdheXMgYmlnZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBhbW91bnQKICAgICAgICAvLyBvZiByb3dzLiBUaGlzIGlzIGJlY2F1c2UgRmlyZWZveCB0cmllcyB0byBhZGQgZXh0cmEgc3BhY2UgZm9yIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhci4KICAgICAgICAvLyBBcyBhIHdvcmthcm91bmQgdGhhdCByZW1vdmVzIHRoZSBleHRyYSBzcGFjZSBmb3IgdGhlIHNjcm9sbGJhciwgd2UgY2FuIGp1c3Qgc2V0IG92ZXJmbG93CiAgICAgICAgLy8gdG8gaGlkZGVuLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGVyZSBpcyBubyBpbnZhbGlkIGNhbGN1bGF0aW9uIG9mIHRoZSBsaW5lIGhlaWdodC4KICAgICAgICAvLyBTZWUgRmlyZWZveCBidWcgcmVwb3J0OiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzY1NAogICAgICAgIHRleHRhcmVhQ2xvbmUuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdGV4dGFyZWFFbGVtZW50LnBhcmVudE5vZGUpKS5hcHBlbmRDaGlsZCh0ZXh0YXJlYUNsb25lKTsKICAgICAgICB0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0ID0gdGV4dGFyZWFDbG9uZS5jbGllbnRIZWlnaHQ7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RleHRhcmVhRWxlbWVudC5wYXJlbnROb2RlKSkucmVtb3ZlQ2hpbGQodGV4dGFyZWFDbG9uZSk7CiAgICAgICAgLy8gTWluIGFuZCBtYXggaGVpZ2h0cyBoYXZlIHRvIGJlIHJlLWNhbGN1bGF0ZWQgaWYgdGhlIGNhY2hlZCBsaW5lIGhlaWdodCBjaGFuZ2VzCiAgICAgICAgdGhpcy5fc2V0TWluSGVpZ2h0KCk7CiAgICAgICAgdGhpcy5fc2V0TWF4SGVpZ2h0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nRG9DaGVjaygpIHsKICAgICAgICBpZiAodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgIHRoaXMucmVzaXplVG9GaXRDb250ZW50KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXNpemUgdGhlIHRleHRhcmVhIHRvIGZpdCBpdHMgY29udGVudC4KICAgICAqIEBwYXJhbSB7Pz19IGZvcmNlIFdoZXRoZXIgdG8gZm9yY2UgYSBoZWlnaHQgcmVjYWxjdWxhdGlvbi4gQnkgZGVmYXVsdCB0aGUgaGVpZ2h0IHdpbGwgYmUKICAgICAqICAgIHJlY2FsY3VsYXRlZCBvbmx5IGlmIHRoZSB2YWx1ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNpemVUb0ZpdENvbnRlbnQoZm9yY2UgPSBmYWxzZSkgewogICAgICAgIC8vIElmIGF1dG9zaXppbmcgaXMgZGlzYWJsZWQsIGp1c3Qgc2tpcCBldmVyeXRoaW5nIGVsc2UKICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpOwogICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZGV0ZXJtaW5lZCB0aGUgbGluZS1oZWlnaHQgeWV0LCB3ZSBrbm93IHdlJ3JlIHN0aWxsIGhpZGRlbiBhbmQgdGhlcmUncyBubyBwb2ludAogICAgICAgIC8vIGluIGNoZWNraW5nIHRoZSBoZWlnaHQgb2YgdGhlIHRleHRhcmVhLgogICAgICAgIGlmICghdGhpcy5fY2FjaGVkTGluZUhlaWdodCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0ZXh0YXJlYSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0YXJlYS52YWx1ZTsKICAgICAgICAvLyBPbmx5IHJlc2l6ZSBpZiB0aGUgdmFsdWUgb3IgbWluUm93cyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlc2UgY2FsY3VsYXRpb25zIGNhbiBiZSBleHBlbnNpdmUuCiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLl9taW5Sb3dzID09PSB0aGlzLl9wcmV2aW91c01pblJvd3MgJiYgdmFsdWUgPT09IHRoaXMuX3ByZXZpb3VzVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJUZXh0ID0gdGV4dGFyZWEucGxhY2Vob2xkZXI7CiAgICAgICAgLy8gUmVzZXQgdGhlIHRleHRhcmVhIGhlaWdodCB0byBhdXRvIGluIG9yZGVyIHRvIHNocmluayBiYWNrIHRvIGl0cyBkZWZhdWx0IHNpemUuCiAgICAgICAgLy8gQWxzbyB0ZW1wb3JhcmlseSBmb3JjZSBvdmVyZmxvdzpoaWRkZW4sIHNvIHNjcm9sbCBiYXJzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCBjYWxjdWxhdGlvbnMuCiAgICAgICAgLy8gTG9uZyBwbGFjZWhvbGRlcnMgdGhhdCBhcmUgd2lkZXIgdGhhbiB0aGUgdGV4dGFyZWEgd2lkdGggbWF5IGxlYWQgdG8gYSBiaWdnZXIgc2Nyb2xsSGVpZ2h0CiAgICAgICAgLy8gdmFsdWUuIFRvIGVuc3VyZSB0aGF0IHRoZSBzY3JvbGxIZWlnaHQgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSBjb250ZW50LCB0aGUgcGxhY2Vob2xkZXJzCiAgICAgICAgLy8gbmVlZCB0byBiZSByZW1vdmVkIHRlbXBvcmFyaWx5LgogICAgICAgIHRleHRhcmVhLmNsYXNzTGlzdC5hZGQoJ2Nkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmcnKTsKICAgICAgICB0ZXh0YXJlYS5wbGFjZWhvbGRlciA9ICcnOwogICAgICAgIC8vIFRoZSBjZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nIGNsYXNzIGluY2x1ZGVzIGEgMnB4IHBhZGRpbmcgdG8gd29ya2Fyb3VuZCBhbiBpc3N1ZSB3aXRoCiAgICAgICAgLy8gQ2hyb21lLCBzbyB3ZSBhY2NvdW50IGZvciB0aGF0IGV4dHJhIHNwYWNlIGhlcmUgYnkgc3VidHJhY3RpbmcgNCAoMnB4IHRvcCArIDJweCBib3R0b20pLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBoZWlnaHQgPSB0ZXh0YXJlYS5zY3JvbGxIZWlnaHQgLSA0OwogICAgICAgIC8vIFVzZSB0aGUgc2Nyb2xsSGVpZ2h0IHRvIGtub3cgaG93IGxhcmdlIHRoZSB0ZXh0YXJlYSAqd291bGQqIGJlIGlmIGZpdCBpdHMgZW50aXJlIHZhbHVlLgogICAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7CiAgICAgICAgdGV4dGFyZWEuY2xhc3NMaXN0LnJlbW92ZSgnY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZycpOwogICAgICAgIHRleHRhcmVhLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJUZXh0OwogICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3Njcm9sbFRvQ2FyZXRQb3NpdGlvbih0ZXh0YXJlYSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2Nyb2xsVG9DYXJldFBvc2l0aW9uKHRleHRhcmVhKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX3ByZXZpb3VzVmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLl9wcmV2aW91c01pblJvd3MgPSB0aGlzLl9taW5Sb3dzOwogICAgfQogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIHRleHRhcmVhIHRvIGl0cyBvcmlnaW5hbCBzaXplCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNldCgpIHsKICAgICAgICAvLyBEbyBub3QgdHJ5IHRvIGNoYW5nZSB0aGUgdGV4dGFyZWEsIGlmIHRoZSBpbml0aWFsSGVpZ2h0IGhhcyBub3QgYmVlbiBkZXRlcm1pbmVkIHlldAogICAgICAgIC8vIFRoaXMgbWlnaHQgcG90ZW50aWFsbHkgcmVtb3ZlIHN0eWxlcyB3aGVuIHJlc2V0KCkgaXMgY2FsbGVkIGJlZm9yZSBuZ0FmdGVyVmlld0luaXQKICAgICAgICBpZiAodGhpcy5faW5pdGlhbEhlaWdodCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9pbml0aWFsSGVpZ2h0OwogICAgICAgIH0KICAgIH0KICAgIC8vIEluIEl2eSB0aGUgYGhvc3RgIG1ldGFkYXRhIHdpbGwgYmUgbWVyZ2VkLCB3aGVyZWFzIGluIFZpZXdFbmdpbmUgaXQgaXMgb3ZlcnJpZGRlbi4gSW4gb3JkZXIKICAgIC8vIHRvIGF2b2lkIGRvdWJsZSBldmVudCBsaXN0ZW5lcnMsIHdlIG5lZWQgdG8gdXNlIGBIb3N0TGlzdGVuZXJgLiBPbmNlIEl2eSBpcyB0aGUgZGVmYXVsdCwgd2UKICAgIC8vIGNhbiBtb3ZlIHRoaXMgYmFjayBpbnRvIGBob3N0YC4KICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWhvc3QtZGVjb3JhdG9yLWluLWNvbmNyZXRlCiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9ub29wSW5wdXRIYW5kbGVyKCkgewogICAgICAgIC8vIG5vLW9wIGhhbmRsZXIgdGhhdCBlbnN1cmVzIHdlJ3JlIHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbiBvbiBpbnB1dCBldmVudHMuCiAgICB9CiAgICAvKioKICAgICAqIEFjY2VzcyBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIGRvY3VtZW50IHJlZmVyZW5jZQogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXREb2N1bWVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0V2luZG93KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2MgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OwogICAgfQogICAgLyoqCiAgICAgKiBTY3JvbGxzIGEgdGV4dGFyZWEgdG8gdGhlIGNhcmV0IHBvc2l0aW9uLiBPbiBGaXJlZm94IHJlc2l6aW5nIHRoZSB0ZXh0YXJlYSB3aWxsCiAgICAgKiBwcmV2ZW50IGl0IGZyb20gc2Nyb2xsaW5nIHRvIHRoZSBjYXJldCBwb3NpdGlvbi4gV2UgbmVlZCB0byByZS1zZXQgdGhlIHNlbGVjdGlvbgogICAgICogaW4gb3JkZXIgZm9yIGl0IHRvIHNjcm9sbCB0byB0aGUgcHJvcGVyIHBvc2l0aW9uLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdGV4dGFyZWEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zY3JvbGxUb0NhcmV0UG9zaXRpb24odGV4dGFyZWEpIHsKICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IHRleHRhcmVhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgLy8gSUUgd2lsbCB0aHJvdyBhbiAiVW5zcGVjaWZpZWQgZXJyb3IiIGlmIHdlIHRyeSB0byBzZXQgdGhlIHNlbGVjdGlvbiByYW5nZSBhZnRlciB0aGUKICAgICAgICAvLyBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NLiBBc3NlcnQgdGhhdCB0aGUgZGlyZWN0aXZlIGhhc24ndCBiZWVuIGRlc3Ryb3llZAogICAgICAgIC8vIGJldHdlZW4gdGhlIHRpbWUgd2UgcmVxdWVzdGVkIHRoZSBhbmltYXRpb24gZnJhbWUgYW5kIHdoZW4gaXQgd2FzIGV4ZWN1dGVkLgogICAgICAgIC8vIEFsc28gbm90ZSB0aGF0IHdlIGhhdmUgdG8gYXNzZXJ0IHRoYXQgdGhlIHRleHRhcmVhIGlzIGZvY3VzZWQgYmVmb3JlIHdlIHNldCB0aGUKICAgICAgICAvLyBzZWxlY3Rpb24gcmFuZ2UuIFNldHRpbmcgdGhlIHNlbGVjdGlvbiByYW5nZSBvbiBhIG5vbi1mb2N1c2VkIHRleHRhcmVhIHdpbGwgY2F1c2UKICAgICAgICAvLyBpdCB0byByZWNlaXZlIGZvY3VzIG9uIElFIGFuZCBFZGdlLgogICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkLmlzU3RvcHBlZCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0ZXh0YXJlYSkgewogICAgICAgICAgICB0ZXh0YXJlYS5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKICAgICAgICB9CiAgICB9Cn0KQ2RrVGV4dGFyZWFBdXRvc2l6ZS7JtWZhYyA9IGZ1bmN0aW9uIENka1RleHRhcmVhQXV0b3NpemVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrVGV4dGFyZWFBdXRvc2l6ZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxLCA4KSk7IH07CkNka1RleHRhcmVhQXV0b3NpemUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrVGV4dGFyZWFBdXRvc2l6ZSwgc2VsZWN0b3JzOiBbWyJ0ZXh0YXJlYSIsICJjZGtUZXh0YXJlYUF1dG9zaXplIiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvd3MiLCAiMSIsIDEsICJjZGstdGV4dGFyZWEtYXV0b3NpemUiXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBDZGtUZXh0YXJlYUF1dG9zaXplX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gQ2RrVGV4dGFyZWFBdXRvc2l6ZV9pbnB1dF9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX25vb3BJbnB1dEhhbmRsZXIoKTsgfSk7CiAgICB9IH0sIGlucHV0czogeyBtaW5Sb3dzOiBbImNka0F1dG9zaXplTWluUm93cyIsICJtaW5Sb3dzIl0sIG1heFJvd3M6IFsiY2RrQXV0b3NpemVNYXhSb3dzIiwgIm1heFJvd3MiXSwgZW5hYmxlZDogWyJjZGtUZXh0YXJlYUF1dG9zaXplIiwgImVuYWJsZWQiXSB9LCBleHBvcnRBczogWyJjZGtUZXh0YXJlYUF1dG9zaXplIl0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpDZGtUZXh0YXJlYUF1dG9zaXplLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKQ2RrVGV4dGFyZWFBdXRvc2l6ZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG1pblJvd3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0F1dG9zaXplTWluUm93cycsXSB9XSwKICAgIG1heFJvd3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0F1dG9zaXplTWF4Um93cycsXSB9XSwKICAgIGVuYWJsZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka1RleHRhcmVhQXV0b3NpemUnLF0gfV0sCiAgICBfbm9vcElucHV0SGFuZGxlcjogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2lucHV0JyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3RleHQtZmllbGQvdGV4dC1maWVsZC1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgVGV4dEZpZWxkTW9kdWxlIHsKfQpUZXh0RmllbGRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBUZXh0RmllbGRNb2R1bGUgfSk7ClRleHRGaWVsZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRleHRGaWVsZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXh0RmllbGRNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbUGxhdGZvcm1Nb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVGV4dEZpZWxkTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0Nka0F1dG9maWxsLAogICAgICAgIENka1RleHRhcmVhQXV0b3NpemVdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbUGxhdGZvcm1Nb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ2RrQXV0b2ZpbGwsCiAgICAgICAgQ2RrVGV4dGFyZWFBdXRvc2l6ZV07IH0gfSk7IH0pKCk7CgpjbGFzcyBNYXRUZXh0YXJlYUF1dG9zaXplIGV4dGVuZHMgQ2RrVGV4dGFyZWFBdXRvc2l6ZSB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBtYXRBdXRvc2l6ZU1pblJvd3MoKSB7IHJldHVybiB0aGlzLm1pblJvd3M7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG1hdEF1dG9zaXplTWluUm93cyh2YWx1ZSkgeyB0aGlzLm1pblJvd3MgPSB2YWx1ZTsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbWF0QXV0b3NpemVNYXhSb3dzKCkgeyByZXR1cm4gdGhpcy5tYXhSb3dzOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBtYXRBdXRvc2l6ZU1heFJvd3ModmFsdWUpIHsgdGhpcy5tYXhSb3dzID0gdmFsdWU7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG1hdEF1dG9zaXplKCkgeyByZXR1cm4gdGhpcy5lbmFibGVkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBtYXRBdXRvc2l6ZSh2YWx1ZSkgeyB0aGlzLmVuYWJsZWQgPSB2YWx1ZTsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbWF0VGV4dGFyZWFBdXRvc2l6ZSgpIHsgcmV0dXJuIHRoaXMuZW5hYmxlZDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbWF0VGV4dGFyZWFBdXRvc2l6ZSh2YWx1ZSkgeyB0aGlzLmVuYWJsZWQgPSB2YWx1ZTsgfQp9Ck1hdFRleHRhcmVhQXV0b3NpemUuybVmYWMgPSBmdW5jdGlvbiBNYXRUZXh0YXJlYUF1dG9zaXplX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRUZXh0YXJlYUF1dG9zaXplX0Jhc2VGYWN0b3J5KHQgfHwgTWF0VGV4dGFyZWFBdXRvc2l6ZSk7IH07Ck1hdFRleHRhcmVhQXV0b3NpemUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0VGV4dGFyZWFBdXRvc2l6ZSwgc2VsZWN0b3JzOiBbWyJ0ZXh0YXJlYSIsICJtYXQtYXV0b3NpemUiLCAiIl0sIFsidGV4dGFyZWEiLCAibWF0VGV4dGFyZWFBdXRvc2l6ZSIsICIiXV0sIGhvc3RBdHRyczogWyJyb3dzIiwgIjEiLCAxLCAiY2RrLXRleHRhcmVhLWF1dG9zaXplIiwgIm1hdC1hdXRvc2l6ZSJdLCBpbnB1dHM6IHsgY2RrQXV0b3NpemVNaW5Sb3dzOiAiY2RrQXV0b3NpemVNaW5Sb3dzIiwgY2RrQXV0b3NpemVNYXhSb3dzOiAiY2RrQXV0b3NpemVNYXhSb3dzIiwgbWF0QXV0b3NpemVNaW5Sb3dzOiAibWF0QXV0b3NpemVNaW5Sb3dzIiwgbWF0QXV0b3NpemVNYXhSb3dzOiAibWF0QXV0b3NpemVNYXhSb3dzIiwgbWF0QXV0b3NpemU6IFsibWF0LWF1dG9zaXplIiwgIm1hdEF1dG9zaXplIl0sIG1hdFRleHRhcmVhQXV0b3NpemU6ICJtYXRUZXh0YXJlYUF1dG9zaXplIiB9LCBleHBvcnRBczogWyJtYXRUZXh0YXJlYUF1dG9zaXplIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7Ck1hdFRleHRhcmVhQXV0b3NpemUucHJvcERlY29yYXRvcnMgPSB7CiAgICBtYXRBdXRvc2l6ZU1pblJvd3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbWF0QXV0b3NpemVNYXhSb3dzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG1hdEF1dG9zaXplOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXQtYXV0b3NpemUnLF0gfV0sCiAgICBtYXRUZXh0YXJlYUF1dG9zaXplOiBbeyB0eXBlOiBJbnB1dCB9XQp9Owpjb25zdCDJtU1hdFRleHRhcmVhQXV0b3NpemVfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRUZXh0YXJlYUF1dG9zaXplKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pbnB1dC9pbnB1dC1lcnJvcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBcQGRvY3MtcHJpdmF0ZQogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE1hdElucHV0VW5zdXBwb3J0ZWRUeXBlRXJyb3IodHlwZSkgewogICAgcmV0dXJuIEVycm9yKGBJbnB1dCB0eXBlICIke3R5cGV9IiBpc24ndCBzdXBwb3J0ZWQgYnkgbWF0SW5wdXQuYCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pbnB1dC9pbnB1dC12YWx1ZS1hY2Nlc3Nvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluamVjdCB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIHNob3VsZCBiZSBzZXQgaW50byBgTWF0SW5wdXRgLiBJZiBub25lIGlzCiAqIHByb3ZpZGVkLCB0aGUgbmF0aXZlIGBIVE1MSW5wdXRFbGVtZW50YCBpcyB1c2VkLiBEaXJlY3RpdmVzIGxpa2UgYE1hdERhdGVwaWNrZXJJbnB1dGAgY2FuIHByb3ZpZGUKICogdGhlbXNlbHZlcyBmb3IgdGhpcyB0b2tlbiwgaW4gb3JkZXIgdG8gbWFrZSBgTWF0SW5wdXRgIGRlbGVnYXRlIHRoZSBnZXR0aW5nIGFuZCBzZXR0aW5nIG9mIHRoZQogKiB2YWx1ZSB0byB0aGVtLgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1BVF9JTlBVVF9WQUxVRV9BQ0NFU1NPUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX0lOUFVUX1ZBTFVFX0FDQ0VTU09SJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvaW5wdXQvaW5wdXQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gSW52YWxpZCBpbnB1dCB0eXBlLiBVc2luZyBvbmUgb2YgdGhlc2Ugd2lsbCB0aHJvdyBhbiBNYXRJbnB1dFVuc3VwcG9ydGVkVHlwZUVycm9yLgovKiogQHR5cGUgez99ICovCmNvbnN0IE1BVF9JTlBVVF9JTlZBTElEX1RZUEVTID0gWwogICAgJ2J1dHRvbicsCiAgICAnY2hlY2tib3gnLAogICAgJ2ZpbGUnLAogICAgJ2hpZGRlbicsCiAgICAnaW1hZ2UnLAogICAgJ3JhZGlvJywKICAgICdyYW5nZScsCiAgICAncmVzZXQnLAogICAgJ3N1Ym1pdCcKXTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgbmV4dFVuaXF1ZUlkJDYgPSAwOwovLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdElucHV0LgovKioKICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdElucHV0QmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcgogICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybQogICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybUdyb3VwCiAgICAgKiBAcGFyYW0gez99IG5nQ29udHJvbAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBfcGFyZW50Rm9ybSwgX3BhcmVudEZvcm1Hcm91cCwgbmdDb250cm9sKSB7CiAgICAgICAgdGhpcy5fZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyID0gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjsKICAgICAgICB0aGlzLl9wYXJlbnRGb3JtID0gX3BhcmVudEZvcm07CiAgICAgICAgdGhpcy5fcGFyZW50Rm9ybUdyb3VwID0gX3BhcmVudEZvcm1Hcm91cDsKICAgICAgICB0aGlzLm5nQ29udHJvbCA9IG5nQ29udHJvbDsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9NYXRJbnB1dE1peGluQmFzZSA9IG1peGluRXJyb3JTdGF0ZShNYXRJbnB1dEJhc2UpOwovKioKICogRGlyZWN0aXZlIHRoYXQgYWxsb3dzIGEgbmF0aXZlIGlucHV0IHRvIHdvcmsgaW5zaWRlIGEgYE1hdEZvcm1GaWVsZGAuCiAqLwpjbGFzcyBNYXRJbnB1dCBleHRlbmRzIF9NYXRJbnB1dE1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgKiBAcGFyYW0gez99IG5nQ29udHJvbAogICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybQogICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybUdyb3VwCiAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIKICAgICAqIEBwYXJhbSB7P30gaW5wdXRWYWx1ZUFjY2Vzc29yCiAgICAgKiBAcGFyYW0gez99IF9hdXRvZmlsbE1vbml0b3IKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfcGxhdGZvcm0sIG5nQ29udHJvbCwgX3BhcmVudEZvcm0sIF9wYXJlbnRGb3JtR3JvdXAsIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIGlucHV0VmFsdWVBY2Nlc3NvciwgX2F1dG9maWxsTW9uaXRvciwgbmdab25lKSB7CiAgICAgICAgc3VwZXIoX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgX3BhcmVudEZvcm0sIF9wYXJlbnRGb3JtR3JvdXAsIG5nQ29udHJvbCk7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIHRoaXMubmdDb250cm9sID0gbmdDb250cm9sOwogICAgICAgIHRoaXMuX2F1dG9maWxsTW9uaXRvciA9IF9hdXRvZmlsbE1vbml0b3I7CiAgICAgICAgdGhpcy5fdWlkID0gYG1hdC1pbnB1dC0ke25leHRVbmlxdWVJZCQ2Kyt9YDsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgYmVpbmcgcmVuZGVyZWQgb24gdGhlIHNlcnZlci4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc1NlcnZlciA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBhIG5hdGl2ZSBodG1sIHNlbGVjdC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc05hdGl2ZVNlbGVjdCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKi8KICAgICAgICB0aGlzLmNvbnRyb2xUeXBlID0gJ21hdC1pbnB1dCc7CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICovCiAgICAgICAgdGhpcy5hdXRvZmlsbGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3R5cGUgPSAndGV4dCc7CiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9uZXZlckVtcHR5SW5wdXRUeXBlcyA9IFsKICAgICAgICAgICAgJ2RhdGUnLAogICAgICAgICAgICAnZGF0ZXRpbWUnLAogICAgICAgICAgICAnZGF0ZXRpbWUtbG9jYWwnLAogICAgICAgICAgICAnbW9udGgnLAogICAgICAgICAgICAndGltZScsCiAgICAgICAgICAgICd3ZWVrJwogICAgICAgIF0uZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHQgPT4gZ2V0U3VwcG9ydGVkSW5wdXRUeXBlcygpLmhhcyh0KSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIC8vIElmIG5vIGlucHV0IHZhbHVlIGFjY2Vzc29yIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwgdXNlIHRoZSBlbGVtZW50IGFzIHRoZSBpbnB1dCB2YWx1ZQogICAgICAgIC8vIGFjY2Vzc29yLgogICAgICAgIHRoaXMuX2lucHV0VmFsdWVBY2Nlc3NvciA9IGlucHV0VmFsdWVBY2Nlc3NvciB8fCBlbGVtZW50OwogICAgICAgIHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgPSB0aGlzLnZhbHVlOwogICAgICAgIC8vIEZvcmNlIHNldHRlciB0byBiZSBjYWxsZWQgaW4gY2FzZSBpZCB3YXMgbm90IHNwZWNpZmllZC4KICAgICAgICB0aGlzLmlkID0gdGhpcy5pZDsKICAgICAgICAvLyBPbiBzb21lIHZlcnNpb25zIG9mIGlPUyB0aGUgY2FyZXQgZ2V0cyBzdHVjayBpbiB0aGUgd3JvbmcgcGxhY2Ugd2hlbiBob2xkaW5nIGRvd24gdGhlIGRlbGV0ZQogICAgICAgIC8vIGtleS4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzIHdlIG5lZWQgdG8gImppZ2dsZSIgdGhlIGNhcmV0IGxvb3NlLiBTaW5jZSB0aGlzIGJ1ZyBvbmx5CiAgICAgICAgLy8gZXhpc3RzIG9uIGlPUywgd2Ugb25seSBib3RoZXIgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIgb24gaU9TLgogICAgICAgIGlmIChfcGxhdGZvcm0uSU9TKSB7CiAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBfZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBlbCA9ICgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVsLnZhbHVlICYmICFlbC5zZWxlY3Rpb25TdGFydCAmJiAhZWwuc2VsZWN0aW9uRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IEp1c3Qgc2V0dGluZyBgMCwgMGAgZG9lc24ndCBmaXggdGhlIGlzc3VlLiBTZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGAxLCAxYCBmaXhlcyBpdCBmb3IgdGhlIGZpcnN0IHRpbWUgdGhhdCB5b3UgdHlwZSB0ZXh0IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGhvbGQgZGVsZXRlLiBUb2dnbGluZyB0byBgMSwgMWAgYW5kIHRoZW4gYmFjayB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyBgMCwgMGAgc2VlbXMgdG8gY29tcGxldGVseSBmaXggaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKDEsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5faXNTZXJ2ZXIgPSAhdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyOwogICAgICAgIHRoaXMuX2lzTmF0aXZlU2VsZWN0ID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc2VsZWN0JzsKICAgICAgICBpZiAodGhpcy5faXNOYXRpdmVTZWxlY3QpIHsKICAgICAgICAgICAgdGhpcy5jb250cm9sVHlwZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKS5tdWx0aXBsZSA/ICdtYXQtbmF0aXZlLXNlbGVjdC1tdWx0aXBsZScgOgogICAgICAgICAgICAgICAgJ21hdC1uYXRpdmUtc2VsZWN0JzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmRpc2FibGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5nQ29udHJvbC5kaXNhYmxlZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgLy8gQnJvd3NlcnMgbWF5IG5vdCBmaXJlIHRoZSBibHVyIGV2ZW50IGlmIHRoZSBpbnB1dCBpcyBkaXNhYmxlZCB0b28gcXVpY2tseS4KICAgICAgICAvLyBSZXNldCBmcm9tIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQgZG9lc24ndCBiZWNvbWUgc3R1Y2suCiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkgewogICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuX2lkOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBpZCh2YWx1ZSkgeyB0aGlzLl9pZCA9IHZhbHVlIHx8IHRoaXMuX3VpZDsgfQogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJlcXVpcmVkKCkgeyByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHJlcXVpcmVkKHZhbHVlKSB7IHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgLyoqCiAgICAgKiBJbnB1dCB0eXBlIG9mIHRoZSBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCB0eXBlKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fdHlwZSA9IHZhbHVlIHx8ICd0ZXh0JzsKICAgICAgICB0aGlzLl92YWxpZGF0ZVR5cGUoKTsKICAgICAgICAvLyBXaGVuIHVzaW5nIEFuZ3VsYXIgaW5wdXRzLCBkZXZlbG9wZXJzIGFyZSBubyBsb25nZXIgYWJsZSB0byBzZXQgdGhlIHByb3BlcnRpZXMgb24gdGhlIG5hdGl2ZQogICAgICAgIC8vIGlucHV0IGVsZW1lbnQuIFRvIGVuc3VyZSB0aGF0IGJpbmRpbmdzIGZvciBgdHlwZWAgd29yaywgd2UgbmVlZCB0byBzeW5jIHRoZSBzZXR0ZXIKICAgICAgICAvLyB3aXRoIHRoZSBuYXRpdmUgcHJvcGVydHkuIFRleHRhcmVhIGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgdGhlIHR5cGUgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAgICAgIGlmICghdGhpcy5faXNUZXh0YXJlYSgpICYmIGdldFN1cHBvcnRlZElucHV0VHlwZXMoKS5oYXModGhpcy5fdHlwZSkpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKSkudHlwZSA9IHRoaXMuX3R5cGU7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5faW5wdXRWYWx1ZUFjY2Vzc29yLnZhbHVlOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCB2YWx1ZSh2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlQWNjZXNzb3IudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciB0aGUgZWxlbWVudCBpcyByZWFkb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCByZWFkb25seSh2YWx1ZSkgeyB0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICB0aGlzLl9hdXRvZmlsbE1vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuYXV0b2ZpbGxlZCA9IGV2ZW50LmlzQXV0b2ZpbGxlZDsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoKSB7CiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpOwogICAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgdGhpcy5fYXV0b2ZpbGxNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhpcyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lCiAgICAgICAgICAgIC8vIGVycm9yIHRyaWdnZXJzIHRoYXQgd2UgY2FuJ3Qgc3Vic2NyaWJlIHRvIChlLmcuIHBhcmVudCBmb3JtIHN1Ym1pc3Npb25zKS4gVGhpcyBtZWFucwogICAgICAgICAgICAvLyB0aGF0IHdoYXRldmVyIGxvZ2ljIGlzIGluIGhlcmUgaGFzIHRvIGJlIHN1cGVyIGxlYW4gb3Igd2UgcmlzayBkZXN0cm95aW5nIHRoZSBwZXJmb3JtYW5jZS4KICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvclN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIC8vIFdlIG5lZWQgdG8gZGlydHktY2hlY2sgdGhlIG5hdGl2ZSBlbGVtZW50J3MgdmFsdWUsIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUKICAgICAgICAvLyB3ZSB3b24ndCBiZSBub3RpZmllZCB3aGVuIGl0IGNoYW5nZXMgKGUuZy4gdGhlIGNvbnN1bWVyIGlzbid0IHVzaW5nIGZvcm1zIG9yIHRoZXkncmUKICAgICAgICAvLyB1cGRhdGluZyB0aGUgdmFsdWUgdXNpbmcgYGVtaXRFdmVudDogZmFsc2VgKS4KICAgICAgICB0aGlzLl9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKTsKICAgIH0KICAgIC8qKgogICAgICogRm9jdXNlcyB0aGUgaW5wdXQuCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb2N1cyhvcHRpb25zKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxsYmFjayBmb3IgdGhlIGNhc2VzIHdoZXJlIHRoZSBmb2N1c2VkIHN0YXRlIG9mIHRoZSBpbnB1dCBjaGFuZ2VzLgogICAgICogQHBhcmFtIHs/fSBpc0ZvY3VzZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mb2N1c0NoYW5nZWQoaXNGb2N1c2VkKSB7CiAgICAgICAgaWYgKGlzRm9jdXNlZCAhPT0gdGhpcy5mb2N1c2VkICYmICghdGhpcy5yZWFkb25seSB8fCAhaXNGb2N1c2VkKSkgewogICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBpc0ZvY3VzZWQ7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbklucHV0KCkgewogICAgICAgIC8vIFRoaXMgaXMgYSBub29wIGZ1bmN0aW9uIGFuZCBpcyB1c2VkIHRvIGxldCBBbmd1bGFyIGtub3cgd2hlbmV2ZXIgdGhlIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgLy8gQW5ndWxhciB3aWxsIHJ1biBhIG5ldyBjaGFuZ2UgZGV0ZWN0aW9uIGVhY2ggdGltZSB0aGUgYGlucHV0YCBldmVudCBoYXMgYmVlbiBkaXNwYXRjaGVkLgogICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRoYXQgQW5ndWxhciByZWNvZ25pemVzIHRoZSB2YWx1ZSBjaGFuZ2UsIGJlY2F1c2Ugd2hlbiBmbG9hdGluZ0xhYmVsCiAgICAgICAgLy8gaXMgc2V0IHRvIGZhbHNlIGFuZCBBbmd1bGFyIGZvcm1zIGFyZW4ndCB1c2VkLCB0aGUgcGxhY2Vob2xkZXIgd29uJ3QgcmVjb2duaXplIHRoZQogICAgICAgIC8vIHZhbHVlIGNoYW5nZXMgYW5kIHdpbGwgbm90IGRpc2FwcGVhci4KICAgICAgICAvLyBMaXN0ZW5pbmcgdG8gdGhlIGlucHV0IGV2ZW50IHdvdWxkbid0IGJlIG5lY2Vzc2FyeSB3aGVuIHRoZSBpbnB1dCBpcyB1c2luZyB0aGUKICAgICAgICAvLyBGb3Jtc01vZHVsZSBvciBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBiZWNhdXNlIEFuZ3VsYXIgZm9ybXMgYWxzbyBsaXN0ZW5zIHRvIGlucHV0IGV2ZW50cy4KICAgIH0KICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IGhvc3QgaXMgYSB0ZXh0YXJlYS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pc1RleHRhcmVhKCkgewogICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RleHRhcmVhJzsKICAgIH0KICAgIC8qKgogICAgICogRG9lcyBzb21lIG1hbnVhbCBkaXJ0eSBjaGVja2luZyBvbiB0aGUgbmF0aXZlIGlucHV0IGB2YWx1ZWAgcHJvcGVydHkuCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZGlydHlDaGVja05hdGl2ZVZhbHVlKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTsKICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSAhPT0gbmV3VmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYWtlIHN1cmUgdGhlIGlucHV0IGlzIGEgc3VwcG9ydGVkIHR5cGUuCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdmFsaWRhdGVUeXBlKCkgewogICAgICAgIGlmIChNQVRfSU5QVVRfSU5WQUxJRF9UWVBFUy5pbmRleE9mKHRoaXMuX3R5cGUpID4gLTEpIHsKICAgICAgICAgICAgdGhyb3cgZ2V0TWF0SW5wdXRVbnN1cHBvcnRlZFR5cGVFcnJvcih0aGlzLl90eXBlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBpbnB1dCB0eXBlIGlzIG9uZSBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgbmV2ZXIgZW1wdHkuCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaXNOZXZlckVtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLl9uZXZlckVtcHR5SW5wdXRUeXBlcy5pbmRleE9mKHRoaXMuX3R5cGUpID4gLTE7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBpbnB1dCBpcyBpbnZhbGlkIGJhc2VkIG9uIHRoZSBuYXRpdmUgdmFsaWRhdGlvbi4KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pc0JhZElucHV0KCkgewogICAgICAgIC8vIFRoZSBgdmFsaWRpdHlgIHByb3BlcnR5IHdvbid0IGJlIHByZXNlbnQgb24gcGxhdGZvcm0tc2VydmVyLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsaWRpdHkgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpKS52YWxpZGl0eTsKICAgICAgICByZXR1cm4gdmFsaWRpdHkgJiYgdmFsaWRpdHkuYmFkSW5wdXQ7CiAgICB9CiAgICAvKioKICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZW1wdHkoKSB7CiAgICAgICAgcmV0dXJuICF0aGlzLl9pc05ldmVyRW1wdHkoKSAmJiAhdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlICYmICF0aGlzLl9pc0JhZElucHV0KCkgJiYKICAgICAgICAgICAgIXRoaXMuYXV0b2ZpbGxlZDsKICAgIH0KICAgIC8qKgogICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBzaG91bGRMYWJlbEZsb2F0KCkgewogICAgICAgIGlmICh0aGlzLl9pc05hdGl2ZVNlbGVjdCkgewogICAgICAgICAgICAvLyBGb3IgYSBzaW5nbGUtc2VsZWN0aW9uIGA8c2VsZWN0PmAsIHRoZSBsYWJlbCBzaG91bGQgZmxvYXQgd2hlbiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGhhcwogICAgICAgICAgICAvLyBhIG5vbi1lbXB0eSBkaXNwbGF5IHZhbHVlLiBGb3IgYSBgPHNlbGVjdCBtdWx0aXBsZT5gLCB0aGUgbGFiZWwgKmFsd2F5cyogZmxvYXRzIHRvIGF2b2lkCiAgICAgICAgICAgIC8vIG92ZXJsYXBwaW5nIHRoZSBsYWJlbCB3aXRoIHRoZSBvcHRpb25zLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3RPcHRpb24gPSBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMF07CiAgICAgICAgICAgIC8vIE9uIG1vc3QgYnJvd3NlcnMgdGhlIGBzZWxlY3RlZEluZGV4YCB3aWxsIGFsd2F5cyBiZSAwLCBob3dldmVyIG9uIElFIGFuZCBFZGdlIGl0J2xsIGJlCiAgICAgICAgICAgIC8vIC0xIGlmIHRoZSBgdmFsdWVgIGlzIHNldCB0byBzb21ldGhpbmcsIHRoYXQgaXNuJ3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucywgYXQgYSBsYXRlciBwb2ludC4KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCBzZWxlY3RFbGVtZW50Lm11bHRpcGxlIHx8ICF0aGlzLmVtcHR5IHx8CiAgICAgICAgICAgICAgICAhIShzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXggPiAtMSAmJiBmaXJzdE9wdGlvbiAmJiBmaXJzdE9wdGlvbi5sYWJlbCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gaWRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXREZXNjcmliZWRCeUlkcyhpZHMpIHsKICAgICAgICB0aGlzLl9hcmlhRGVzY3JpYmVkYnkgPSBpZHMuam9pbignICcpOwogICAgfQogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Db250YWluZXJDbGljaygpIHsKICAgICAgICAvLyBEbyBub3QgcmUtZm9jdXMgdGhlIGlucHV0IGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBmb2N1c2VkLiBPdGhlcndpc2UgaXQgY2FuIGhhcHBlbgogICAgICAgIC8vIHRoYXQgc29tZW9uZSBjbGlja3Mgb24gYSB0aW1lIGlucHV0IGFuZCB0aGUgY3Vyc29yIHJlc2V0cyB0byB0aGUgImhvdXJzIiBmaWVsZCB3aGlsZSB0aGUKICAgICAgICAvLyAibWludXRlcyIgZmllbGQgd2FzIGFjdHVhbGx5IGNsaWNrZWQuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTI4NDkKICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkgewogICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgfQogICAgfQp9Ck1hdElucHV0Lsm1ZmFjID0gZnVuY3Rpb24gTWF0SW5wdXRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SW5wdXQpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nQ29udHJvbCwgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nRm9ybSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChFcnJvclN0YXRlTWF0Y2hlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0lOUFVUX1ZBTFVFX0FDQ0VTU09SLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQXV0b2ZpbGxNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpKTsgfTsKTWF0SW5wdXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0SW5wdXQsIHNlbGVjdG9yczogW1siaW5wdXQiLCAibWF0SW5wdXQiLCAiIl0sIFsidGV4dGFyZWEiLCAibWF0SW5wdXQiLCAiIl0sIFsic2VsZWN0IiwgIm1hdE5hdGl2ZUNvbnRyb2wiLCAiIl0sIFsiaW5wdXQiLCAibWF0TmF0aXZlQ29udHJvbCIsICIiXSwgWyJ0ZXh0YXJlYSIsICJtYXROYXRpdmVDb250cm9sIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1pbnB1dC1lbGVtZW50IiwgIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2wiXSwgaG9zdFZhcnM6IDEwLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdElucHV0X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImJsdXIiLCBmdW5jdGlvbiBNYXRJbnB1dF9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fZm9jdXNDaGFuZ2VkKGZhbHNlKTsgfSkoImZvY3VzIiwgZnVuY3Rpb24gTWF0SW5wdXRfZm9jdXNfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9mb2N1c0NoYW5nZWQodHJ1ZSk7IH0pKCJpbnB1dCIsIGZ1bmN0aW9uIE1hdElucHV0X2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25JbnB1dCgpOyB9KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVob3N0UHJvcGVydHkoImRpc2FibGVkIiwgY3R4LmRpc2FibGVkKSgicmVxdWlyZWQiLCBjdHgucmVxdWlyZWQpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoImlkIiwgY3R4LmlkKSgicGxhY2Vob2xkZXIiLCBjdHgucGxhY2Vob2xkZXIpKCJyZWFkb25seSIsIGN0eC5yZWFkb25seSAmJiAhY3R4Ll9pc05hdGl2ZVNlbGVjdCB8fCBudWxsKSgiYXJpYS1kZXNjcmliZWRieSIsIGN0eC5fYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwpKCJhcmlhLWludmFsaWQiLCBjdHguZXJyb3JTdGF0ZSkoImFyaWEtcmVxdWlyZWQiLCBjdHgucmVxdWlyZWQudG9TdHJpbmcoKSk7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWlucHV0LXNlcnZlciIsIGN0eC5faXNTZXJ2ZXIpOwogICAgfSB9LCBpbnB1dHM6IHsgaWQ6ICJpZCIsIGRpc2FibGVkOiAiZGlzYWJsZWQiLCByZXF1aXJlZDogInJlcXVpcmVkIiwgdHlwZTogInR5cGUiLCB2YWx1ZTogInZhbHVlIiwgcmVhZG9ubHk6ICJyZWFkb25seSIsIHBsYWNlaG9sZGVyOiAicGxhY2Vob2xkZXIiLCBlcnJvclN0YXRlTWF0Y2hlcjogImVycm9yU3RhdGVNYXRjaGVyIiB9LCBleHBvcnRBczogWyJtYXRJbnB1dCJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBNYXRJbnB1dCB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTWF0SW5wdXQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgIHsgdHlwZTogTmdDb250cm9sLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfV0gfSwKICAgIHsgdHlwZTogTmdGb3JtLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgeyB0eXBlOiBGb3JtR3JvdXBEaXJlY3RpdmUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IEVycm9yU3RhdGVNYXRjaGVyIH0sCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0lOUFVUX1ZBTFVFX0FDQ0VTU09SLF0gfV0gfSwKICAgIHsgdHlwZTogQXV0b2ZpbGxNb25pdG9yIH0sCiAgICB7IHR5cGU6IE5nWm9uZSB9Cl07Ck1hdElucHV0LnByb3BEZWNvcmF0b3JzID0gewogICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgaWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgcGxhY2Vob2xkZXI6IFt7IHR5cGU6IElucHV0IH1dLAogICAgcmVxdWlyZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgdHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBlcnJvclN0YXRlTWF0Y2hlcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICByZWFkb25seTogW3sgdHlwZTogSW5wdXQgfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pbnB1dC9pbnB1dC1tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgTWF0SW5wdXRNb2R1bGUgewp9Ck1hdElucHV0TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0SW5wdXRNb2R1bGUgfSk7Ck1hdElucHV0TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0SW5wdXRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SW5wdXRNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW0Vycm9yU3RhdGVNYXRjaGVyXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgVGV4dEZpZWxkTW9kdWxlLAogICAgICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGUsCiAgICAgICAgXSwKICAgICAgICBUZXh0RmllbGRNb2R1bGUsCiAgICAgICAgLy8gV2UgcmUtZXhwb3J0IHRoZSBgTWF0Rm9ybUZpZWxkTW9kdWxlYCBzaW5jZSBgTWF0SW5wdXRgIHdpbGwgYWxtb3N0IGFsd2F5cwogICAgICAgIC8vIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBgTWF0Rm9ybUZpZWxkYC4KICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGVdIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRJbnB1dE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRJbnB1dCwKICAgICAgICBNYXRUZXh0YXJlYUF1dG9zaXplXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW1RleHRGaWVsZE1vZHVsZSwKICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbVGV4dEZpZWxkTW9kdWxlLAogICAgICAgIC8vIFdlIHJlLWV4cG9ydCB0aGUgYE1hdEZvcm1GaWVsZE1vZHVsZWAgc2luY2UgYE1hdElucHV0YCB3aWxsIGFsbW9zdCBhbHdheXMKICAgICAgICAvLyBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYE1hdEZvcm1GaWVsZGAuCiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLAogICAgICAgIE1hdElucHV0LAogICAgICAgIE1hdFRleHRhcmVhQXV0b3NpemVdOyB9IH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3NldHRpbmdzL2RpYWxvZ19jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KZnVuY3Rpb24gU2V0dGluZ3NEaWFsb2dDb21wb25lbnRfbWF0X2Vycm9yXzEwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LWVycm9yIik7CiAgICDJtcm1dGV4dCgxLCAiIFJlbG9hZCBwZXJpb2QgaGFzIHRvIGJlIG1pbmltdW0gb2YgMTUgc2Vjb25kcy4gIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IH0KZnVuY3Rpb24gU2V0dGluZ3NEaWFsb2dDb21wb25lbnRfbWF0X2Vycm9yXzE0X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LWVycm9yIik7CiAgICDJtcm1dGV4dCgxLCAiIFBhZ2Ugc2l6ZSBoYXMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQovKiogQHR5cGUgez99ICovCmNvbnN0IGdldFJlbG9hZFBlcmlvZEluU2VjID0gY3JlYXRlU2VsZWN0b3IoZ2V0UmVsb2FkUGVyaW9kSW5NcywgKC8qKgogKiBAcGFyYW0gez99IHBlcmlvZEluTXMKICogQHJldHVybiB7P30KICovCihwZXJpb2RJbk1zKSA9PiBNYXRoLnJvdW5kKHBlcmlvZEluTXMgLyAxMDAwKSkpOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUludGVnZXJWYWxpZGF0b3IoKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoY29udHJvbCkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBudW1WYWx1ZSA9IE51bWJlcihjb250cm9sLnZhbHVlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmFsaWQgPSBNYXRoLnJvdW5kKG51bVZhbHVlKSA9PT0gY29udHJvbC52YWx1ZTsKICAgICAgICByZXR1cm4gdmFsaWQgPyBudWxsIDogeyBpbnRlZ2VyOiB7IHZhbHVlOiBjb250cm9sLnZhbHVlIH0gfTsKICAgIH0pOwp9CmNsYXNzIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLnJlbG9hZEVuYWJsZWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRSZWxvYWRFbmFibGVkKSk7CiAgICAgICAgdGhpcy5wYWdlU2l6ZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFBhZ2VTaXplKSk7CiAgICAgICAgdGhpcy5yZWxvYWRQZXJpb2RJblNlYyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFJlbG9hZFBlcmlvZEluU2VjKSk7CiAgICAgICAgdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sID0gbmV3IEZvcm1Db250cm9sKDE1LCBbCiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsCiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluKDE1KSwKICAgICAgICBdKTsKICAgICAgICB0aGlzLnBhZ2luYXRpb25Db250cm9sID0gbmV3IEZvcm1Db250cm9sKDEsIFsKICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCwKICAgICAgICAgICAgVmFsaWRhdG9ycy5taW4oMSksCiAgICAgICAgICAgIGNyZWF0ZUludGVnZXJWYWxpZGF0b3IoKSwKICAgICAgICBdKTsKICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZEluU2VjJAogICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsdWUpID0+IHZhbHVlICE9PSB0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wudmFsdWUpKSkKICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHZhbHVlKSA9PiB7CiAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMucmVsb2FkRW5hYmxlZCQKICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wuZW5hYmxlKCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC5kaXNhYmxlKCk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWx1ZUNoYW5nZXMKICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGRlYm91bmNlVGltZSg1MDApLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sLnZhbGlkKSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAoIXRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWxpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGVyaW9kSW5NcyA9IHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWx1ZSAqIDEwMDA7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goY2hhbmdlUmVsb2FkUGVyaW9kKHsgcGVyaW9kSW5NcyB9KSk7CiAgICAgICAgfSkpOwogICAgICAgIHRoaXMucGFnZVNpemUkCiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh2YWx1ZSkgPT4gdmFsdWUgIT09IHRoaXMucGFnaW5hdGlvbkNvbnRyb2wudmFsdWUpKSkKICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHZhbHVlKSA9PiB7CiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnBhZ2luYXRpb25Db250cm9sLnZhbHVlQ2hhbmdlcwogICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZGVib3VuY2VUaW1lKDUwMCksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnBhZ2luYXRpb25Db250cm9sLnZhbGlkKSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGNoYW5nZVBhZ2VTaXplKHsgc2l6ZTogdGhpcy5wYWdpbmF0aW9uQ29udHJvbC52YWx1ZSB9KSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpOwogICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblJlbG9hZFRvZ2dsZSgpIHsKICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHRvZ2dsZVJlbG9hZEVuYWJsZWQoKSk7CiAgICB9Cn0KU2V0dGluZ3NEaWFsb2dDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzZXR0aW5ncy1kaWFsb2cnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxoMz5TZXR0aW5nczwvaDM+CiAgICA8ZGl2PgogICAgICA8ZGl2IGNsYXNzPSJyZWxvYWQtdG9nZ2xlIj4KICAgICAgICA8bWF0LWNoZWNrYm94CiAgICAgICAgICBbY2hlY2tlZF09InJlbG9hZEVuYWJsZWQkIHwgYXN5bmMiCiAgICAgICAgICAoY2hhbmdlKT0ib25SZWxvYWRUb2dnbGUoKSIKICAgICAgICAgID5SZWxvYWQgZGF0YTwvbWF0LWNoZWNrYm94CiAgICAgICAgPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8bWF0LWZvcm0tZmllbGQ+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgY2xhc3M9InJlbG9hZC1wZXJpb2QiCiAgICAgICAgICAgIG1hdElucHV0CiAgICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlJlbG9hZCBQZXJpb2QiCiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09InJlbG9hZFBlcmlvZENvbnRyb2wiCiAgICAgICAgICAvPgogICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+CiAgICAgICAgPG1hdC1lcnJvcgogICAgICAgICAgKm5nSWY9IgogICAgICAgICAgICByZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCdtaW4nKSB8fAogICAgICAgICAgICByZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpCiAgICAgICAgICAiCiAgICAgICAgPgogICAgICAgICAgUmVsb2FkIHBlcmlvZCBoYXMgdG8gYmUgbWluaW11bSBvZiAxNSBzZWNvbmRzLgogICAgICAgIDwvbWF0LWVycm9yPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdj4KICAgICAgPG1hdC1mb3JtLWZpZWxkPgogICAgICAgIDxpbnB1dAogICAgICAgICAgY2xhc3M9InBhZ2Utc2l6ZSIKICAgICAgICAgIG1hdElucHV0CiAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICBwbGFjZWhvbGRlcj0iUGFnaW5hdGlvbiBMaW1pdCIKICAgICAgICAgIFtmb3JtQ29udHJvbF09InBhZ2luYXRpb25Db250cm9sIgogICAgICAgIC8+CiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+CiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9InBhZ2luYXRpb25Db250cm9sLmludmFsaWQiPgogICAgICAgIFBhZ2Ugc2l6ZSBoYXMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgogICAgICA8L21hdC1lcnJvcj4KICAgIDwvZGl2PgogIGAsCiAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9kaWFsb2dfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClNldHRpbmdzRGlhbG9nQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNldHRpbmdzRGlhbG9nQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJzZXR0aW5ncy1kaWFsb2ciXV0sIGRlY2xzOiAxNSwgdmFyczogNywgY29uc3RzOiBbWzEsICJyZWxvYWQtdG9nZ2xlIl0sIFszLCAiY2hlY2tlZCIsICJjaGFuZ2UiXSwgWyJtYXRJbnB1dCIsICIiLCAidHlwZSIsICJudW1iZXIiLCAicGxhY2Vob2xkZXIiLCAiUmVsb2FkIFBlcmlvZCIsIDEsICJyZWxvYWQtcGVyaW9kIiwgMywgImZvcm1Db250cm9sIl0sIFs0LCAibmdJZiJdLCBbIm1hdElucHV0IiwgIiIsICJ0eXBlIiwgIm51bWJlciIsICJwbGFjZWhvbGRlciIsICJQYWdpbmF0aW9uIExpbWl0IiwgMSwgInBhZ2Utc2l6ZSIsIDMsICJmb3JtQ29udHJvbCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImgzIik7CiAgICAgICAgybXJtXRleHQoMSwgIlNldHRpbmdzIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJtYXQtY2hlY2tib3giLCAxKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50X1RlbXBsYXRlX21hdF9jaGVja2JveF9jaGFuZ2VfNF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vblJlbG9hZFRvZ2dsZSgpOyB9KTsKICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICDJtcm1dGV4dCg2LCAiUmVsb2FkIGRhdGEiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiZGl2Iik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAibWF0LWZvcm0tZmllbGQiKTsKICAgICAgICDJtcm1ZWxlbWVudCg5LCAiaW5wdXQiLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxMCwgU2V0dGluZ3NEaWFsb2dDb21wb25lbnRfbWF0X2Vycm9yXzEwX1RlbXBsYXRlLCAyLCAwLCAibWF0LWVycm9yIiwgMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTEsICJkaXYiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAibWF0LWZvcm0tZmllbGQiKTsKICAgICAgICDJtcm1ZWxlbWVudCgxMywgImlucHV0IiwgNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTQsIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50X21hdF9lcnJvcl8xNF9UZW1wbGF0ZSwgMiwgMCwgIm1hdC1lcnJvciIsIDMpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCDJtcm1cGlwZUJpbmQxKDUsIDUsIGN0eC5yZWxvYWRFbmFibGVkJCkpOwogICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiZm9ybUNvbnRyb2wiLCBjdHgucmVsb2FkUGVyaW9kQ29udHJvbCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LnJlbG9hZFBlcmlvZENvbnRyb2wuaGFzRXJyb3IoIm1pbiIpIHx8IGN0eC5yZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCJyZXF1aXJlZCIpKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1cHJvcGVydHkoImZvcm1Db250cm9sIiwgY3R4LnBhZ2luYXRpb25Db250cm9sKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucGFnaW5hdGlvbkNvbnRyb2wuaW52YWxpZCk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRDaGVja2JveCwgTWF0Rm9ybUZpZWxkLCBNYXRJbnB1dCwgTnVtYmVyVmFsdWVBY2Nlc3NvciwgRGVmYXVsdFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbFN0YXR1cywgRm9ybUNvbnRyb2xEaXJlY3RpdmUsIE5nSWYsIE1hdEVycm9yXSwgcGlwZXM6IFtBc3luY1BpcGVdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICA+IGRpdltfbmdjb250ZW50LSVDT01QJV0ge1xuICBtYXJnaW46IDEwcHggMDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICA+IFtfbmdjb250ZW50LSVDT01QJV06Zmlyc3QtY2hpbGQge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG5bX25naG9zdC0lQ09NUCVdICAgID4gW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuaDNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG4ucmVsb2FkLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufSJdIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3NldHRpbmdzL3NldHRpbmdzX2J1dHRvbl9jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgU2V0dGluZ3NCdXR0b25Db21wb25lbnQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRpYWxvZwogICAgICovCiAgICBjb25zdHJ1Y3RvcihkaWFsb2cpIHsKICAgICAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZzsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb3BlbkRpYWxvZygpIHsKICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKFNldHRpbmdzRGlhbG9nQ29tcG9uZW50LCB7CiAgICAgICAgICAgIHdpZHRoOiAnNDAwcHgnLAogICAgICAgIH0pOwogICAgfQp9ClNldHRpbmdzQnV0dG9uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnc2V0dGluZ3MtYnV0dG9uJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPSJvcGVuRGlhbG9nKCkiPgogICAgICA8bWF0LWljb24gc3ZnSWNvbj0ic2V0dGluZ3NfMjRweCI+PC9tYXQtaWNvbj4KICAgIDwvYnV0dG9uPgogIGAsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KU2V0dGluZ3NCdXR0b25Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE1hdERpYWxvZyB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc0J1dHRvbkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNldHRpbmdzQnV0dG9uQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdERpYWxvZykpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NCdXR0b25Db21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU2V0dGluZ3NCdXR0b25Db21wb25lbnQsIHNlbGVjdG9yczogW1sic2V0dGluZ3MtYnV0dG9uIl1dLCBkZWNsczogMiwgdmFyczogMCwgY29uc3RzOiBbWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMywgImNsaWNrIl0sIFsic3ZnSWNvbiIsICJzZXR0aW5nc18yNHB4Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU2V0dGluZ3NCdXR0b25Db21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYnV0dG9uIiwgMCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50X1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9wZW5EaWFsb2coKTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnQoMSwgIm1hdC1pY29uIiwgMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW01hdEJ1dHRvbiwgTWF0SWNvbl0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvaGVhZGVyL2hlYWRlcl9jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgSGVhZGVyQ29tcG9uZW50IHsKfQpIZWFkZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdhcHAtaGVhZGVyJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWF0LXRvb2xiYXIgY29sb3I9InByaW1hcnkiPgogICAgICA8c3BhbiBjbGFzcz0iYnJhbmQiPlRlbnNvckJvYXJkPC9zcGFuPgogICAgICA8cGx1Z2luLXNlbGVjdG9yIGNsYXNzPSJwbHVnaW5zIj48L3BsdWdpbi1zZWxlY3Rvcj4KICAgICAgPHRiZGV2LXVwbG9hZC1idXR0b24+PC90YmRldi11cGxvYWQtYnV0dG9uPgogICAgICA8YXBwLWhlYWRlci1yZWxvYWQ+PC9hcHAtaGVhZGVyLXJlbG9hZD4KICAgICAgPHNldHRpbmdzLWJ1dHRvbj48L3NldHRpbmdzLWJ1dHRvbj4KICAgICAgPGEKICAgICAgICBjbGFzcz0icmVhZG1lIgogICAgICAgIG1hdC1pY29uLWJ1dHRvbgogICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiCiAgICAgICAgdGFyZ2V0PSJfYmxhbmsiCiAgICAgICAgYXJpYS1sYWJlbD0iSGVscCIKICAgICAgPgogICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPSJoZWxwX291dGxpbmVfMjRweCI+PC9tYXQtaWNvbj4KICAgICAgPC9hPgogICAgPC9tYXQtdG9vbGJhcj4KICBgLAogICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgYAogICAgICBtYXQtdG9vbGJhciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogNjRweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB0YmRldi11cGxvYWQtYnV0dG9uLnNob3duIHsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMTZweDsKICAgICAgfQoKICAgICAgLmJyYW5kLAogICAgICAucmVhZG1lLAogICAgICBhcHAtaGVhZGVyLXJlbG9hZCwKICAgICAgc2V0dGluZ3MtYnV0dG9uIHsKICAgICAgICBmbGV4OiAwIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmJyYW5kIHsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfQoKICAgICAgLnBsdWdpbnMgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIEhlYWRlckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEhlYWRlckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIZWFkZXJDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSGVhZGVyQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImFwcC1oZWFkZXIiXV0sIGRlY2xzOiA5LCB2YXJzOiAwLCBjb25zdHM6IFtbImNvbG9yIiwgInByaW1hcnkiXSwgWzEsICJicmFuZCJdLCBbMSwgInBsdWdpbnMiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgImhyZWYiLCAiaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiwgInJlbCIsICJub29wZW5lciBub3JlZmVycmVyIiwgInRhcmdldCIsICJfYmxhbmsiLCAiYXJpYS1sYWJlbCIsICJIZWxwIiwgMSwgInJlYWRtZSJdLCBbInN2Z0ljb24iLCAiaGVscF9vdXRsaW5lXzI0cHgiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBIZWFkZXJDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXRvb2xiYXIiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgMSk7CiAgICAgICAgybXJtXRleHQoMiwgIlRlbnNvckJvYXJkIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAicGx1Z2luLXNlbGVjdG9yIiwgMik7CiAgICAgICAgybXJtWVsZW1lbnQoNCwgInRiZGV2LXVwbG9hZC1idXR0b24iKTsKICAgICAgICDJtcm1ZWxlbWVudCg1LCAiYXBwLWhlYWRlci1yZWxvYWQiKTsKICAgICAgICDJtcm1ZWxlbWVudCg2LCAic2V0dGluZ3MtYnV0dG9uIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiYSIsIDMpOwogICAgICAgIMm1ybVlbGVtZW50KDgsICJtYXQtaWNvbiIsIDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW01hdFRvb2xiYXIsIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyLCBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudCwgUmVsb2FkQ29udGFpbmVyLCBTZXR0aW5nc0J1dHRvbkNvbXBvbmVudCwgTWF0QW5jaG9yLCBNYXRJY29uXSwgc3R5bGVzOiBbIm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGhlaWdodDogNjRweDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIHRiZGV2LXVwbG9hZC1idXR0b24uc2hvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgbWFyZ2luOiAwIDhweCAwIDE2cHg7XG4gICAgICB9XG5cbiAgICAgIC5icmFuZFtfbmdjb250ZW50LSVDT01QJV0sIC5yZWFkbWVbX25nY29udGVudC0lQ09NUCVdLCBhcHAtaGVhZGVyLXJlbG9hZFtfbmdjb250ZW50LSVDT01QJV0sIHNldHRpbmdzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBmbGV4OiAwIDAgYXV0bztcbiAgICAgIH1cblxuICAgICAgLmJyYW5kW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gICAgICB9XG5cbiAgICAgIC5wbHVnaW5zW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH0iXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3BsdWdpbnNfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgYWN0aXZlUGx1Z2luID0gY3JlYXRlU2VsZWN0b3IoZ2V0UGx1Z2lucywgZ2V0QWN0aXZlUGx1Z2luLCAoLyoqCiAqIEBwYXJhbSB7P30gcGx1Z2lucwogKiBAcGFyYW0gez99IGlkCiAqIEByZXR1cm4gez99CiAqLwoocGx1Z2lucywgaWQpID0+IHsKICAgIGlmICghaWQgfHwgIXBsdWdpbnNbaWRdKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBpZCB9LCBwbHVnaW5zW2lkXSk7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBsYXN0TG9hZGVkVGltZUluTXMgPSBjcmVhdGVTZWxlY3RvcihnZXRQbHVnaW5zTGlzdExvYWRlZCwgKC8qKgogKiBAcGFyYW0gez99IGxvYWRTdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKGxvYWRTdGF0ZSkgPT4gewogICAgcmV0dXJuIGxvYWRTdGF0ZS5sYXN0TG9hZGVkVGltZUluTXM7Cn0pKTsKY2xhc3MgUGx1Z2luc0NvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqLwogICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgdGhpcy5hY3RpdmVQbHVnaW4kID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChhY3RpdmVQbHVnaW4pKTsKICAgICAgICB0aGlzLm5vRW5hYmxlZFBsdWdpbiQgPSBjb21iaW5lTGF0ZXN0KHRoaXMuc3RvcmUuc2VsZWN0KGFjdGl2ZVBsdWdpbiksIHRoaXMuc3RvcmUuc2VsZWN0KGdldFBsdWdpbnNMaXN0TG9hZGVkKSkucGlwZShtYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoW2FjdGl2ZVBsdWdpbiwgbG9hZFN0YXRlXSkgPT4gewogICAgICAgICAgICByZXR1cm4gKGFjdGl2ZVBsdWdpbiA9PT0gbnVsbCAmJgogICAgICAgICAgICAgICAgKGxvYWRTdGF0ZS5zdGF0ZSA9PT0gRGF0YUxvYWRTdGF0ZS5MT0FERUQgfHwKICAgICAgICAgICAgICAgICAgICBsb2FkU3RhdGUuc3RhdGUgPT09IERhdGFMb2FkU3RhdGUuRkFJTEVEKSk7CiAgICAgICAgfSkpKTsKICAgICAgICB0aGlzLmxhc3RMb2FkZWRUaW1lSW5NcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGxhc3RMb2FkZWRUaW1lSW5NcykpOwogICAgfQp9ClBsdWdpbnNDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwbHVnaW5zJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8cGx1Z2lucy1jb21wb25lbnQKICAgICAgW2FjdGl2ZVBsdWdpbl09ImFjdGl2ZVBsdWdpbiQgfCBhc3luYyIKICAgICAgW25vRW5hYmxlZFBsdWdpbl09Im5vRW5hYmxlZFBsdWdpbiQgfCBhc3luYyIKICAgICAgW2xhc3RVcGRhdGVkXT0ibGFzdExvYWRlZFRpbWVJbk1zJCB8IGFzeW5jIgogICAgPjwvcGx1Z2lucy1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgIHN0eWxlczogWydwbHVnaW5zLWNvbXBvbmVudCB7IGhlaWdodDogMTAwJTsgfSddLAogICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KUGx1Z2luc0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luc0NvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFBsdWdpbnNDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGx1Z2luc0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luc0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBQbHVnaW5zQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInBsdWdpbnMiXV0sIGRlY2xzOiA0LCB2YXJzOiA5LCBjb25zdHM6IFtbMywgImFjdGl2ZVBsdWdpbiIsICJub0VuYWJsZWRQbHVnaW4iLCAibGFzdFVwZGF0ZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBQbHVnaW5zQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJwbHVnaW5zLWNvbXBvbmVudCIsIDApOwogICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJhY3RpdmVQbHVnaW4iLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC5hY3RpdmVQbHVnaW4kKSkoIm5vRW5hYmxlZFBsdWdpbiIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4Lm5vRW5hYmxlZFBsdWdpbiQpKSgibGFzdFVwZGF0ZWQiLCDJtcm1cGlwZUJpbmQxKDMsIDcsIGN0eC5sYXN0TG9hZGVkVGltZUluTXMkKSk7CiAgICB9IH0sIHN0eWxlczogWyJwbHVnaW5zLWNvbXBvbmVudFtfbmdjb250ZW50LSVDT01QJV0geyBoZWlnaHQ6IDEwMCU7IH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3JlbG9hZGVyL3JlbG9hZGVyX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBSZWxvYWRlckNvbXBvbmVudCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3Ioc3RvcmUsIGRvY3VtZW50KSB7CiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSA9IHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlSW1wbC5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMucmVsb2FkRW5hYmxlZCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFJlbG9hZEVuYWJsZWQpKTsKICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZEluTXMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRSZWxvYWRQZXJpb2RJbk1zKSk7CiAgICAgICAgdGhpcy5yZWxvYWRUaW1lcklkID0gbnVsbDsKICAgICAgICB0aGlzLm1pc3NlZEF1dG9SZWxvYWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2UpOwogICAgICAgIGNvbWJpbmVMYXRlc3QodGhpcy5yZWxvYWRFbmFibGVkJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLCB0aGlzLnJlbG9hZFBlcmlvZEluTXMkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbZW5hYmxlZCwgcmVsb2FkUGVyaW9kSW5Nc10pID0+IHsKICAgICAgICAgICAgdGhpcy5jYW5jZWxMb2FkKCk7CiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKC8qKiBAdHlwZSB7P30gKi8gKHJlbG9hZFBlcmlvZEluTXMpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblZpc2liaWxpdHlDaGFuZ2VJbXBsKCkgewogICAgICAgIGlmICh0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnICYmIHRoaXMubWlzc2VkQXV0b1JlbG9hZCkgewogICAgICAgICAgICB0aGlzLm1pc3NlZEF1dG9SZWxvYWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChyZWxvYWQoKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSByZWxvYWRQZXJpb2RJbk1zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsb2FkKHJlbG9hZFBlcmlvZEluTXMpIHsKICAgICAgICB0aGlzLnJlbG9hZFRpbWVySWQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocmVsb2FkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5taXNzZWRBdXRvUmVsb2FkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmxvYWQocmVsb2FkUGVyaW9kSW5Ncyk7CiAgICAgICAgfSksIHJlbG9hZFBlcmlvZEluTXMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2FuY2VsTG9hZCgpIHsKICAgICAgICBpZiAodGhpcy5yZWxvYWRUaW1lcklkICE9PSBudWxsKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVySWQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlbG9hZFRpbWVySWQgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLmNhbmNlbExvYWQoKTsKICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSk7CiAgICB9Cn0KUmVsb2FkZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdyZWxvYWRlcicsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJycsCiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpSZWxvYWRlckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfSwKICAgIHsgdHlwZTogRG9jdW1lbnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBSZWxvYWRlckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFJlbG9hZGVyQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlbG9hZGVyQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBSZWxvYWRlckNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSZWxvYWRlckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJyZWxvYWRlciJdXSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBSZWxvYWRlckNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IH0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9kZWVwbGluay9oYXNoLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8vIFRPRE8odGVuc29yYm9hcmQtdGVhbSk6IG1lcmdlIHRoaXMgbW9kdWxlIHdpdGggdGZfc3RvcmFnZS9zdG9yYWdlLnRzIHdoZW4KLy8gdGZfdHNfbGlicmFyeSBjYW4gYmUgcmVmZXJlbmNlZCBieSB0Zl93ZWJfbGlicmFyeS4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBUQUIkMSA9ICdfX3RhYl9fJzsKY2xhc3MgSGFzaERlZXBMaW5rZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZlN0b3JhZ2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtc3RvcmFnZScpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRmR2xvYmFscyA9ICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Zi1nbG9iYWxzJykpKTsKICAgICAgICAvLyBOb3RlOiBgbWlncmF0ZUxlZ2FjeVVSTFNjaGVtZSgpYCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYHNldFVzZUhhc2hgLCBzbwogICAgICAgIC8vIHRoYXQgdGZTdG9yYWdlIHJlYWRzIGZyb20gdGhlIGFjdHVhbCBVUkwsIG5vdCB0aGUgZmFrZSBoYXNoIGZvciB0ZXN0cwogICAgICAgIC8vIG9ubHkuCiAgICAgICAgdGZHbG9iYWxzLnRmX2dsb2JhbHMuc2V0VXNlSGFzaCh0cnVlKTsKICAgICAgICB0aGlzLnRmU3RvcmFnZS50Zl9zdG9yYWdlLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFN0cmluZyhrZXkpIHsKICAgICAgICByZXR1cm4gdGhpcy50ZlN0b3JhZ2UudGZfc3RvcmFnZS5nZXRTdHJpbmcoa2V5KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFN0cmluZyhrZXksIHZhbHVlLCBvcHRpb25zKSB7CiAgICAgICAgdGhpcy50ZlN0b3JhZ2UudGZfc3RvcmFnZS5zZXRTdHJpbmcoa2V5LCB2YWx1ZSwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFBsdWdpbklkKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZyhUQUIkMSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luSWQKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldFBsdWdpbklkKHBsdWdpbklkLCBvcHRpb25zKSB7CiAgICAgICAgdGhpcy5zZXRTdHJpbmcoVEFCJDEsIHBsdWdpbklkLCBvcHRpb25zKTsKICAgIH0KfQpIYXNoRGVlcExpbmtlci5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpIYXNoRGVlcExpbmtlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtdOwovKiogQG5vY29sbGFwc2UgKi8gSGFzaERlZXBMaW5rZXIuybVmYWMgPSBmdW5jdGlvbiBIYXNoRGVlcExpbmtlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYXNoRGVlcExpbmtlcikoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIEhhc2hEZWVwTGlua2VyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEhhc2hEZWVwTGlua2VyLCBmYWN0b3J5OiBIYXNoRGVlcExpbmtlci7JtWZhYyB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3ZpZXdzL2hhc2hfc3RvcmFnZV9jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IENoYW5nZWRQcm9wID0gewogICAgQUNUSVZFX1BMVUdJTjogMCwKfTsKQ2hhbmdlZFByb3BbQ2hhbmdlZFByb3AuQUNUSVZFX1BMVUdJTl0gPSAnQUNUSVZFX1BMVUdJTic7CmNsYXNzIEhhc2hTdG9yYWdlQ29tcG9uZW50IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZWVwTGlua2VyCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRlZXBMaW5rZXIpIHsKICAgICAgICB0aGlzLmRlZXBMaW5rZXIgPSBkZWVwTGlua2VyOwogICAgICAgIHRoaXMub25IYXNoQ2hhbmdlID0gdGhpcy5vbkhhc2hDaGFuZ2VkSW1wbC5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uSGFzaENoYW5nZWRJbXBsKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhY3RpdmVQbHVnaW5JZCA9IHRoaXMuZGVlcExpbmtlci5nZXRQbHVnaW5JZCgpOwogICAgICAgIGlmIChhY3RpdmVQbHVnaW5JZCAhPT0gdGhpcy5hY3RpdmVQbHVnaW5JZCkgewogICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UuZW1pdCh7CiAgICAgICAgICAgICAgICBwcm9wOiBDaGFuZ2VkUHJvcC5BQ1RJVkVfUExVR0lOLAogICAgICAgICAgICAgICAgdmFsdWU6IGFjdGl2ZVBsdWdpbklkLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25Jbml0KCkgewogICAgICAgIC8vIENhbm5vdCB1c2UgdGhlIHRmX3N0b3JhZ2UgaGFzaCBsaXN0ZW5lciBiZWNhdXNlIGl0IGJpbmRzIHRvIGV2ZW50IGJlZm9yZSB0aGUKICAgICAgICAvLyB6b25lLmpzIHBhdGNoLiBBY2NvcmRpbmcgdG8gWzFdLCB6b25lLmpzIHBhdGNoZXMgdmFyaW91cyBhc3luY2hyb25vcyBjYWxscyBhbmQKICAgICAgICAvLyBldmVudCBsaXN0ZW5lcnMgdG8gZGV0ZWN0ICJjaGFuZ2VzIiBhbmQgbWFyayBjb21wb25lbnRzIGFzIGRpcnR5IGZvciByZS1yZW5kZXIuCiAgICAgICAgLy8gV2hlbiB1c2luZyB0Zl9zdG9yYWdlIGhhc2ggbGlzdGVuZXIsIGl0IGNhdXNlcyBiYWQgcmVuZGVycyBpbiBBbmd1bGFyIGR1ZSB0bwogICAgICAgIC8vIG1pc3NpbmcgZGlydGluZXNzIGRldGVjdGlvbi4KICAgICAgICAvLyBbMV06IGh0dHBzOi8vYmxvZy5hbmd1bGFyLXVuaXZlcnNpdHkuaW8vaG93LWRvZXMtYW5ndWxhci0yLWNoYW5nZS1kZXRlY3Rpb24tcmVhbGx5LXdvcmsvCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLm9uSGFzaENoYW5nZSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5vbkhhc2hDaGFuZ2UpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICBpZiAoY2hhbmdlc1snYWN0aXZlUGx1Z2luSWQnXSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBsdWdpbklkQ2hhbmdlID0gY2hhbmdlc1snYWN0aXZlUGx1Z2luSWQnXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcHRpb24gPSB7CiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgdXNlTG9jYXRpb25SZXBsYWNlOiBhY3RpdmVQbHVnaW5JZENoYW5nZS5wcmV2aW91c1ZhbHVlID09PSBudWxsIHx8CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGx1Z2luSWRDaGFuZ2UuZmlyc3RDaGFuZ2UsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhY3RpdmVQbHVnaW5JZENoYW5nZS5jdXJyZW50VmFsdWUgPT09IG51bGwKICAgICAgICAgICAgICAgID8gJycKICAgICAgICAgICAgICAgIDogYWN0aXZlUGx1Z2luSWRDaGFuZ2UuY3VycmVudFZhbHVlOwogICAgICAgICAgICB0aGlzLmRlZXBMaW5rZXIuc2V0UGx1Z2luSWQodmFsdWUsIG9wdGlvbik7CiAgICAgICAgfQogICAgfQp9Ckhhc2hTdG9yYWdlQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnaGFzaC1zdG9yYWdlLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJycsCiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpIYXNoU3RvcmFnZUNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogSGFzaERlZXBMaW5rZXIgfQpdOwpIYXNoU3RvcmFnZUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGFjdGl2ZVBsdWdpbklkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG9uVmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XQp9OwovKiogQG5vY29sbGFwc2UgKi8gSGFzaFN0b3JhZ2VDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBIYXNoU3RvcmFnZUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYXNoU3RvcmFnZUNvbXBvbmVudCkoybXJtWRpcmVjdGl2ZUluamVjdChIYXNoRGVlcExpbmtlcikpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gSGFzaFN0b3JhZ2VDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSGFzaFN0b3JhZ2VDb21wb25lbnQsIHNlbGVjdG9yczogW1siaGFzaC1zdG9yYWdlLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IGFjdGl2ZVBsdWdpbklkOiAiYWN0aXZlUGx1Z2luSWQiIH0sIG91dHB1dHM6IHsgb25WYWx1ZUNoYW5nZTogIm9uVmFsdWVDaGFuZ2UiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0sIGRlY2xzOiAwLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gSGFzaFN0b3JhZ2VDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyB9LCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvY29yZS92aWV3cy9oYXNoX3N0b3JhZ2VfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEhhc2hTdG9yYWdlQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLmFjdGl2ZVBsdWdpbklkJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0QWN0aXZlUGx1Z2luKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblZhbHVlQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgICBzd2l0Y2ggKGNoYW5nZS5wcm9wKSB7CiAgICAgICAgICAgIGNhc2UgQ2hhbmdlZFByb3AuQUNUSVZFX1BMVUdJTjoKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocGx1Z2luVXJsSGFzaENoYW5nZWQoeyBwbHVnaW46IGNoYW5nZS52YWx1ZSB9KSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KSGFzaFN0b3JhZ2VDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdoYXNoLXN0b3JhZ2UnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxoYXNoLXN0b3JhZ2UtY29tcG9uZW50CiAgICAgIFthY3RpdmVQbHVnaW5JZF09ImFjdGl2ZVBsdWdpbklkJCB8IGFzeW5jIgogICAgICAob25WYWx1ZUNoYW5nZSk9Im9uVmFsdWVDaGFuZ2VkKCRldmVudCkiCiAgICA+CiAgICA8L2hhc2gtc3RvcmFnZS1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgIHN0eWxlczogWwogICAgICAgICAgICAgICAgICAgIGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KSGFzaFN0b3JhZ2VDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFN0b3JlIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIEhhc2hTdG9yYWdlQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gSGFzaFN0b3JhZ2VDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFzaFN0b3JhZ2VDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIEhhc2hTdG9yYWdlQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEhhc2hTdG9yYWdlQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbImhhc2gtc3RvcmFnZSJdXSwgZGVjbHM6IDIsIHZhcnM6IDMsIGNvbnN0czogW1szLCAiYWN0aXZlUGx1Z2luSWQiLCAib25WYWx1ZUNoYW5nZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEhhc2hTdG9yYWdlQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImhhc2gtc3RvcmFnZS1jb21wb25lbnQiLCAwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uVmFsdWVDaGFuZ2UiLCBmdW5jdGlvbiBIYXNoU3RvcmFnZUNvbnRhaW5lcl9UZW1wbGF0ZV9oYXNoX3N0b3JhZ2VfY29tcG9uZW50X29uVmFsdWVDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblZhbHVlQ2hhbmdlZCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJhY3RpdmVQbHVnaW5JZCIsIMm1ybVwaXBlQmluZDEoMSwgMSwgY3R4LmFjdGl2ZVBsdWdpbklkJCkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbSGFzaFN0b3JhZ2VDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3NldHRpbmdzL3BvbHltZXJfaW50ZXJvcF9jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFNldHRpbmdzUG9seW1lckludGVyb3AgaXMgYSB0ZW1wb3JhcnkgaW50ZXJvcCBtb2R1bGUgdGhhdCB3cml0ZXMgc2V0dGluZ3MgaW4KICogTmdyeCBzdG9yZSB0byBQb2x5bWVyLWJhc2VkIFRlbnNvckJvYXJkIGNvbXBvbmVudHMuIEFzIGxvbmcgYXMgVGVuc29yQm9hcmQKICogcmVuZGVycyBQb2x5bWVyIGNvbXBvbmVudHMsIHRoaXMgbW9kdWxlIHNob3VsZCBiZSB1c2VkLgogKgogKiBOT1RFOiB0aGVyZSBhcmUgdHdvIGNsYXNzZXMgb2Ygc2V0dGluZ3MgaW4gdGhlIFBvbHltZXIgbGFuZDogKDEpIG9uZXMKICogcGVyc2lzdGVkIGluIFVSTCBhbmQgKDIpIG9uZXMgc3RvcmVkIGluIEphdmFTY3JpcHQuIFRoaXMgbW9kdWxlIGludGVyb3BzIHdpdGgKICogb25seSAoMikga2luZHMuIEZvciAoMSksIHBsZWFzZSByZWZlciB0byB0aGUgaGFzaF9zdG9yYWdlLgogKi8KY2xhc3MgU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqLwogICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB0aGlzLmdldFBhZ2VTaXplJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0UGFnZVNpemUpKTsKICAgICAgICB0aGlzLnBhZ2luYXRlZFZpZXdTdG9yZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtcGFnaW5hdGVkLXZpZXctc3RvcmUnKSkpKS50Zl9wYWdpbmF0ZWRfdmlldzsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgdGhpcy5nZXRQYWdlU2l6ZSQKICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFnZVNpemUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChwYWdlU2l6ZSkgPT4gewogICAgICAgICAgICB0aGlzLnBhZ2luYXRlZFZpZXdTdG9yZS5zZXRMaW1pdChwYWdlU2l6ZSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpOwogICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpOwogICAgfQp9ClNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6ICcnLAogICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInNldHRpbmdzLXBvbHltZXItaW50ZXJvcCJdXSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgfSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgQXBwQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChjb3JlTG9hZGVkKCkpOwogICAgfQp9CkFwcENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RiLXdlYmFwcCcsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vYXBwX2NvbnRhaW5lci5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2FwcF9jb250YWluZXIuY3NzJ10sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KQXBwQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBBcHBDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBBcHBDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBBcHBDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQXBwQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRiLXdlYmFwcCJdXSwgZGVjbHM6IDUsIHZhcnM6IDAsIGNvbnN0czogW1sxLCAicGx1Z2lucyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEFwcENvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiYXBwLWhlYWRlciIpOwogICAgICAgIMm1ybVlbGVtZW50KDEsICJwbHVnaW5zIiwgMCk7CiAgICAgICAgybXJtWVsZW1lbnQoMiwgInJlbG9hZGVyIik7CiAgICAgICAgybXJtWVsZW1lbnQoMywgImhhc2gtc3RvcmFnZSIpOwogICAgICAgIMm1ybVlbGVtZW50KDQsICJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW0hlYWRlckNvbXBvbmVudCwgUGx1Z2luc0NvbnRhaW5lciwgUmVsb2FkZXJDb21wb25lbnQsIEhhc2hTdG9yYWdlQ29udGFpbmVyLCBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyXSwgc3R5bGVzOiBbImh0bWxbX25nY29udGVudC0lQ09NUCVdLCBib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5bX25naG9zdC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5hcHAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgZmxleDogMCAwO1xuICB6LWluZGV4OiAxOyBcbn1cblxuLnBsdWdpbnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZmxleDogMSAxO1xuICBvdmVyZmxvdzogYXV0bztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufSJdIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dlYmFwcF9kYXRhX3NvdXJjZS90Yl9odHRwX2NsaWVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBUQkh0dHBDbGllbnQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGh0dHAKICAgICAqLwogICAgY29uc3RydWN0b3IoaHR0cCkgewogICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBSZXNwb25zZVR5cGUKICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHBhdGgsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHBhdGgsIG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgUmVzcG9uc2VUeXBlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEBwYXJhbSB7P30gYm9keQogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcG9zdChwYXRoLCBib2R5LCBvcHRpb25zID0ge30pIHsKICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QocGF0aCwgYm9keSwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBSZXNwb25zZVR5cGUKICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICogQHBhcmFtIHs/fSBib2R5CiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwdXQocGF0aCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQocGF0aCwgYm9keSwgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBSZXNwb25zZVR5cGUKICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVsZXRlKHBhdGgsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKHBhdGgsIG9wdGlvbnMpOwogICAgfQp9ClRCSHR0cENsaWVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpUQkh0dHBDbGllbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEh0dHBDbGllbnQgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gVEJIdHRwQ2xpZW50Lsm1ZmFjID0gZnVuY3Rpb24gVEJIdHRwQ2xpZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCSHR0cENsaWVudCkoybXJtWluamVjdChIdHRwQ2xpZW50KSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUQkh0dHBDbGllbnQuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVEJIdHRwQ2xpZW50LCBmYWN0b3J5OiBUQkh0dHBDbGllbnQuybVmYWMgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX2h0dHBfY2xpZW50X21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBUQkh0dHBDbGllbnRNb2R1bGUgewp9ClRCSHR0cENsaWVudE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1RCSHR0cENsaWVudF0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gVEJIdHRwQ2xpZW50TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVEJIdHRwQ2xpZW50TW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gVEJIdHRwQ2xpZW50TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gVEJIdHRwQ2xpZW50TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCSHR0cENsaWVudE1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbVEJIdHRwQ2xpZW50XSwgaW1wb3J0czogW1tIdHRwQ2xpZW50TW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFRCSHR0cENsaWVudE1vZHVsZSwgeyBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX3NlcnZlcl9kYXRhX3NvdXJjZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHBhcmFtIHs/fSBlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UGx1Z2luc0xpc3RpbmdRdWVyeVBhcmFtcyhlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcykgewogICAgaWYgKCFlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgIGZvciAoY29uc3QgcGx1Z2luSWQgb2YgZW5hYmxlZEV4cGVyaW1lbnRQbHVnaW5JZHMpIHsKICAgICAgICBwYXJhbXMuYXBwZW5kKCdleHBlcmltZW50YWxQbHVnaW4nLCBwbHVnaW5JZCk7CiAgICB9CiAgICByZXR1cm4gcGFyYW1zOwp9CmNsYXNzIFRCU2VydmVyRGF0YVNvdXJjZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaHR0cAogICAgICovCiAgICBjb25zdHJ1Y3RvcihodHRwKSB7CiAgICAgICAgdGhpcy5odHRwID0gaHR0cDsKICAgICAgICAvLyBUT0RPKHNvZXJnZWwpOiBpbXBsZW1lbnRzIFdlYmFwcERhdGFTb3VyY2UKICAgICAgICB0aGlzLnRmQmFja2VuZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtYmFja2VuZCcpKSkpLnRmX2JhY2tlbmQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZW5hYmxlZEV4cGVyaW1lbnRQbHVnaW5JZHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZldGNoUGx1Z2luc0xpc3RpbmcoZW5hYmxlZEV4cGVyaW1lbnRQbHVnaW5JZHMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyYW1zID0gZ2V0UGx1Z2luc0xpc3RpbmdRdWVyeVBhcmFtcyhlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhdGhXaXRoUGFyYW1zID0gcGFyYW1zCiAgICAgICAgICAgID8gYGRhdGEvcGx1Z2luc19saXN0aW5nPyR7cGFyYW1zLnRvU3RyaW5nKCl9YAogICAgICAgICAgICA6ICdkYXRhL3BsdWdpbnNfbGlzdGluZyc7CiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocGF0aFdpdGhQYXJhbXMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaFJ1bnMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGFGZXRjaCA9IHRoaXMuaHR0cC5nZXQoJ2RhdGEvcnVucycpOwogICAgICAgIC8vIEZvcmNlIGEgZGF0YSBsb2FkIGZvciB0aGUgcG9seW1lci1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBhcHAuCiAgICAgICAgLy8gVGhpcyBsZWFkcyB0byBkdXBsaWNhdGUgcmVxdWVzdHMgYnV0IGhvcGVmdWxseSB0aGUgc3RhdGUgaXMgdGVtcG9yYXJ5IHVudGlsCiAgICAgICAgLy8gd2UgbWlncmF0ZSBldmVyeXRoaW5nIGZyb20gcG9seW1lciB0byBhbmd1bGFyLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb2x5bWVyUnVuc1JlZnJlc2ggPSBmcm9tKHRoaXMudGZCYWNrZW5kLnJ1bnNTdG9yZS5yZWZyZXNoKCkpOwogICAgICAgIC8vIFdhaXQgZm9yIGJvdGggb3BlcmF0aW9ucyB0byBjb21wbGV0ZSBhbmQgcmV0dXJuIHRoZSByZXNwb25zZSBmcm9tIHRoZQogICAgICAgIC8vIGV4cGxpY2l0IGh0dHAgZ2V0IGNhbGwuCiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkYXRhRmV0Y2gsIHBvbHltZXJSdW5zUmVmcmVzaF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFtydW5zXSkgPT4gewogICAgICAgICAgICByZXR1cm4gcnVucy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJ1bikgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpZDogcnVuLAogICAgICAgICAgICAgICAgICAgIG5hbWU6IHJ1biwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaEVudmlyb25tZW50KCkgewogICAgICAgIC8vIE1ha2UgYSByZXF1ZXN0IGZvciBkYXRhIGZvciB0aGUgYW5ndWxhci1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBhcHAuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGFGZXRjaCA9IHRoaXMuaHR0cC5nZXQoJ2RhdGEvZW52aXJvbm1lbnQnKTsKICAgICAgICAvLyBGb3JjZSBhIGRhdGEgbG9hZCBmb3IgdGhlIHBvbHltZXItc3BlY2lmaWMgcG9ydGlvbiBvZiB0aGUgYXBwLgogICAgICAgIC8vIFRoaXMgbGVhZHMgdG8gZHVwbGljYXRlIHJlcXVlc3RzIGJ1dCBob3BlZnVsbHkgdGhlIHN0YXRlIGlzIHRlbXBvcmFyeSB1bnRpbAogICAgICAgIC8vIHdlIG1pZ3JhdGUgZXZlcnl0aGluZyBmcm9tIHBvbHltZXIgdG8gYW5ndWxhci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcG9seW1lckVudmlyb25tZW50UmVmcmVzaCA9IGZyb20odGhpcy50ZkJhY2tlbmQuZW52aXJvbm1lbnRTdG9yZS5yZWZyZXNoKCkpOwogICAgICAgIC8vIFdhaXQgZm9yIGJvdGggb3BlcmF0aW9ucyB0byBjb21wbGV0ZSBhbmQgcmV0dXJuIHRoZSByZXNwb25zZSBmcm9tIHRoZQogICAgICAgIC8vIGV4cGxpY2l0IGh0dHAgZ2V0IGNhbGwuCiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkYXRhRmV0Y2gsIHBvbHltZXJFbnZpcm9ubWVudFJlZnJlc2hdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbZGF0YV0pID0+IGRhdGEpKSk7CiAgICB9Cn0KVEJTZXJ2ZXJEYXRhU291cmNlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClRCU2VydmVyRGF0YVNvdXJjZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogVEJIdHRwQ2xpZW50IH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFRCU2VydmVyRGF0YVNvdXJjZS7JtWZhYyA9IGZ1bmN0aW9uIFRCU2VydmVyRGF0YVNvdXJjZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUQlNlcnZlckRhdGFTb3VyY2UpKMm1ybVpbmplY3QoVEJIdHRwQ2xpZW50KSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUQlNlcnZlckRhdGFTb3VyY2UuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVEJTZXJ2ZXJEYXRhU291cmNlLCBmYWN0b3J5OiBUQlNlcnZlckRhdGFTb3VyY2UuybVmYWMgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX3NlcnZlcl9kYXRhX3NvdXJjZV9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlIHsKfQpUQlNlcnZlckRhdGFTb3VyY2VNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1RCU2VydmVyRGF0YVNvdXJjZV0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCU2VydmVyRGF0YVNvdXJjZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbVEJTZXJ2ZXJEYXRhU291cmNlXSwgaW1wb3J0czogW1tUQkh0dHBDbGllbnRNb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLCB7IGltcG9ydHM6IFtUQkh0dHBDbGllbnRNb2R1bGVdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2ZlYXR1cmVfZmxhZy9zdG9yZS9mZWF0dXJlX2ZsYWdfdHlwZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBGRUFVVFVSRV9GTEFHX0ZFQVRVUkVfS0VZID0gJ2ZlYXR1cmUnOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2ZlYXR1cmVfZmxhZy9zdG9yZS9mZWF0dXJlX2ZsYWdfc2VsZWN0b3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3Qgc2VsZWN0RmVhdHVyZUZsYWdTdGF0ZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcihGRUFVVFVSRV9GTEFHX0ZFQVRVUkVfS0VZKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRGZWF0dXJlID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RmVhdHVyZUZsYWdTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gZmVhdHVyZUlkCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIGZlYXR1cmVJZCkgPT4gewogICAgcmV0dXJuIHN0YXRlW2ZlYXR1cmVJZF0gfHwgbnVsbDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RmVhdHVyZUZsYWdTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoc3RhdGUuZW5hYmxlZEV4cGVyaW1lbnRhbFBsdWdpbnMpKTsKfSkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvZWZmZWN0cy9jb3JlX2VmZmVjdHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgQ29yZUVmZmVjdHMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgKiBAcGFyYW0gez99IHdlYmFwcERhdGFTb3VyY2UKICAgICAqLwogICAgY29uc3RydWN0b3IoYWN0aW9ucyQsIHN0b3JlLCB3ZWJhcHBEYXRhU291cmNlKSB7CiAgICAgICAgdGhpcy5hY3Rpb25zJCA9IGFjdGlvbnMkOwogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLndlYmFwcERhdGFTb3VyY2UgPSB3ZWJhcHBEYXRhU291cmNlOwogICAgICAgIC8qKgogICAgICAgICAgICogUmVxdWlyZXMgdG8gYmUgZXhwb3J0ZWQgZm9yIEpTQ29tcGlsZXIuIEpTQ29tcGlsZXIsIG90aGVyd2lzZSwKICAgICAgICAgICAqIHRoaW5rIGl0IGlzIHVudXNlZCBwcm9wZXJ0eSBhbmQgZGVhZGNvZGUgZWxpbWluYXRlIGF3YXkuCiAgICAgICAgICAgKi8KICAgICAgICAvKioKICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICovCiAgICAgICAgdGhpcy5mZXRjaFdlYkFwcERhdGEkID0gY3JlYXRlRWZmZWN0KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoY29yZUxvYWRlZCwgcmVsb2FkLCBtYW51YWxSZWxvYWQpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRQbHVnaW5zTGlzdExvYWRlZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zKSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKSksIHRhcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKHBsdWdpbnNMaXN0aW5nUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssICwgZW5hYmxlZEV4cGVyaW1lbnRhbFBsdWdpbnNdKSA9PiB7CiAgICAgICAgICAgIHJldHVybiB6aXAodGhpcy53ZWJhcHBEYXRhU291cmNlLmZldGNoUGx1Z2luc0xpc3RpbmcoZW5hYmxlZEV4cGVyaW1lbnRhbFBsdWdpbnMpLCB0aGlzLmZldGNoRW52aXJvbm1lbnQoKSwgdGhpcy5mZXRjaFJ1bnMoKSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtwbHVnaW5zXSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChwbHVnaW5zTGlzdGluZ0xvYWRlZCh7IHBsdWdpbnMgfSkpOwogICAgICAgICAgICB9KSwgY2F0Y2hFcnJvcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHBsdWdpbnNMaXN0aW5nRmFpbGVkKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwogICAgICAgICAgICB9KSkpKTsKICAgICAgICB9KSkpKSwgeyBkaXNwYXRjaDogZmFsc2UgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaEVudmlyb25tZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hFbnZpcm9ubWVudCgpLnBpcGUodGFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVudmlyb25tZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZW52aXJvbm1lbnQpID0+IHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChlbnZpcm9ubWVudExvYWRlZCh7IGVudmlyb25tZW50IH0pKTsKICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmV0Y2hSdW5zKCkgewogICAgICAgIHJldHVybiB0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hSdW5zKCkucGlwZSh0YXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcnVucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJ1bnMpID0+IHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChmZXRjaFJ1blN1Y2NlZWRlZCh7IHJ1bnMgfSkpOwogICAgICAgIH0pKSk7CiAgICB9Cn0KQ29yZUVmZmVjdHMuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KQ29yZUVmZmVjdHMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEFjdGlvbnMgfSwKICAgIHsgdHlwZTogU3RvcmUgfSwKICAgIHsgdHlwZTogVEJTZXJ2ZXJEYXRhU291cmNlIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIENvcmVFZmZlY3RzLsm1ZmFjID0gZnVuY3Rpb24gQ29yZUVmZmVjdHNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29yZUVmZmVjdHMpKMm1ybVpbmplY3QoQWN0aW9ucyksIMm1ybVpbmplY3QoU3RvcmUpLCDJtcm1aW5qZWN0KFRCU2VydmVyRGF0YVNvdXJjZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gQ29yZUVmZmVjdHMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQ29yZUVmZmVjdHMsIGZhY3Rvcnk6IENvcmVFZmZlY3RzLsm1ZmFjIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvc3RvcmUvY29yZV9pbml0aWFsX3N0YXRlX3Byb3ZpZGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ09SRV9TVE9SRV9DT05GSUdfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0NvcmUgRmVhdHVyZSBDb25maWcnKTsKLyoqCiAqIEBwYXJhbSB7P30gZGVlcExpbmtlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Q29uZmlnKGRlZXBMaW5rZXIpIHsKICAgIHJldHVybiB7CiAgICAgICAgaW5pdGlhbFN0YXRlOiAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUpLCB7IGFjdGl2ZVBsdWdpbjogZGVlcExpbmtlci5nZXRQbHVnaW5JZCgpIHx8IG51bGwgfSkpKSwKICAgIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL2NvcmVfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIENvcmVNb2R1bGUgewp9CkNvcmVNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtDb3JlRWZmZWN0c10pLAogICAgICAgICAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoQ09SRV9GRUFUVVJFX0tFWSwgcmVkdWNlcnMsIENPUkVfU1RPUkVfQ09ORklHX1RPS0VOKSwKICAgICAgICAgICAgICAgICAgICBUQlNlcnZlckRhdGFTb3VyY2VNb2R1bGUsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDT1JFX1NUT1JFX0NPTkZJR19UT0tFTiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogW0hhc2hEZWVwTGlua2VyXSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogZ2V0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIENvcmVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBDb3JlTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gQ29yZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIENvcmVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29yZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbCiAgICAgICAgewogICAgICAgICAgICBwcm92aWRlOiBDT1JFX1NUT1JFX0NPTkZJR19UT0tFTiwKICAgICAgICAgICAgZGVwczogW0hhc2hEZWVwTGlua2VyXSwKICAgICAgICAgICAgdXNlRmFjdG9yeTogZ2V0Q29uZmlnLAogICAgICAgIH0sCiAgICBdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW0NvcmVFZmZlY3RzXSksCiAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoQ09SRV9GRUFUVVJFX0tFWSwgcmVkdWNlcnMsIENPUkVfU1RPUkVfQ09ORklHX1RPS0VOKSwKICAgICAgICAgICAgVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLAogICAgICAgIF1dIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShDb3JlTW9kdWxlLCB7IGltcG9ydHM6IFtFZmZlY3RzRmVhdHVyZU1vZHVsZSwgU3RvcmVGZWF0dXJlTW9kdWxlLCBUQlNlcnZlckRhdGFTb3VyY2VNb2R1bGVdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2RlZXBsaW5rL2RlZXBsaW5rX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBEZWVwTGlua01vZHVsZSB7Cn0KRGVlcExpbmtNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtIYXNoRGVlcExpbmtlcl0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gRGVlcExpbmtNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBEZWVwTGlua01vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIERlZXBMaW5rTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRGVlcExpbmtNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVlcExpbmtNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW0hhc2hEZWVwTGlua2VyXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3ZpZXdzL2hhc2hfc3RvcmFnZV9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgSGFzaFN0b3JhZ2VNb2R1bGUgewp9Ckhhc2hTdG9yYWdlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbSGFzaFN0b3JhZ2VDb250YWluZXIsIEhhc2hTdG9yYWdlQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtIYXNoU3RvcmFnZUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZWVwTGlua01vZHVsZV0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gSGFzaFN0b3JhZ2VNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIYXNoU3RvcmFnZU1vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIEhhc2hTdG9yYWdlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gSGFzaFN0b3JhZ2VNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFzaFN0b3JhZ2VNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBEZWVwTGlua01vZHVsZV1dIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShIYXNoU3RvcmFnZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtIYXNoU3RvcmFnZUNvbnRhaW5lciwgSGFzaFN0b3JhZ2VDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZWVwTGlua01vZHVsZV0sIGV4cG9ydHM6IFtIYXNoU3RvcmFnZUNvbnRhaW5lcl0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX2ZlYXR1cmVfZmxhZ19kYXRhX3NvdXJjZV90eXBlcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGFic3RyYWN0CiAqLwpjbGFzcyBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSB7Cn0KVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2UuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2UuybVmYWMgPSBmdW5jdGlvbiBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSkoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLCBmYWN0b3J5OiBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZS7JtWZhYyB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC93ZWJhcHBfZGF0YV9zb3VyY2UvdGJfZmVhdHVyZV9mbGFnX2RhdGFfc291cmNlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgdXRpbCA9IHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UGFyYW1zKCkgewogICAgICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgfSwKfTsKY2xhc3MgUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UgZXh0ZW5kcyBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEZlYXR1cmVzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJhbXMgPSB1dGlsLmdldFBhcmFtcygpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zOiBwYXJhbXMuZ2V0QWxsKCdleHBlcmltZW50YWxQbHVnaW4nKSwKICAgICAgICB9OwogICAgfQp9ClF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIFF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1ZmFjID0gZnVuY3Rpb24gUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2VfRmFjdG9yeSh0KSB7IHJldHVybiDJtVF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlX0Jhc2VGYWN0b3J5KHQgfHwgUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UsIGZhY3Rvcnk6IFF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1ZmFjIH0pOwpjb25zdCDJtVF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dlYmFwcF9kYXRhX3NvdXJjZS90Yl9mZWF0dXJlX2ZsYWdfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIFRCRmVhdHVyZUZsYWdNb2R1bGUgewp9ClRCRmVhdHVyZUZsYWdNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VDbGFzczogUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gVEJGZWF0dXJlRmxhZ01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFRCRmVhdHVyZUZsYWdNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBUQkZlYXR1cmVGbGFnTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gVEJGZWF0dXJlRmxhZ01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUQkZlYXR1cmVGbGFnTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICB7CiAgICAgICAgICAgIHByb3ZpZGU6IFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLAogICAgICAgICAgICB1c2VDbGFzczogUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UsCiAgICAgICAgfSwKICAgIF0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvZmVhdHVyZV9mbGFnL2FjdGlvbnMvZmVhdHVyZV9mbGFnX2FjdGlvbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBmZWF0dXJlc0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0ZFQVRVUkUgRkxBR10gRmVhdHVyZXMgTG9hZGVkJywgcHJvcHMoKSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvZmVhdHVyZV9mbGFnL3N0b3JlL2ZlYXR1cmVfZmxhZ19yZWR1Y2Vycy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IGluaXRpYWxTdGF0ZSQxID0gewogICAgZW5hYmxlZEV4cGVyaW1lbnRhbFBsdWdpbnM6IFtdLAp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IHJlZHVjZXIkMSA9IGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlJDEsIG9uKGZlYXR1cmVzTG9hZGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBfXzEKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgeyBmZWF0dXJlcyB9KSA9PiB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIGZlYXR1cmVzKTsKfSkpKTsKLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlZHVjZXJzJDEoc3RhdGUsIGFjdGlvbikgewogICAgcmV0dXJuIHJlZHVjZXIkMShzdGF0ZSwgYWN0aW9uKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2ZlYXR1cmVfZmxhZy9lZmZlY3RzL2ZlYXR1cmVfZmxhZ19lZmZlY3RzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgZWZmZWN0c0luaXRpYWxpemVkID0gY3JlYXRlQWN0aW9uKCdbRkVBVFVSRSBGTEFHXSBFZmZlY3RzIEluaXQnKTsKY2xhc3MgRmVhdHVyZUZsYWdFZmZlY3RzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhY3Rpb25zJAogICAgICogQHBhcmFtIHs/fSBkYXRhU291cmNlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGFjdGlvbnMkLCBkYXRhU291cmNlKSB7CiAgICAgICAgdGhpcy5hY3Rpb25zJCA9IGFjdGlvbnMkOwogICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgICAgLyoqCiAgICAgICAgICogQGV4cG9ydAogICAgICAgICAqLwogICAgICAgIHRoaXMuZ2V0RmVhdHVyZUZsYWdzJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGVmZmVjdHNJbml0aWFsaXplZCksIG1hcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0RmVhdHVyZXMoKTsKICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVzTG9hZGVkKHsgZmVhdHVyZXMgfSk7CiAgICAgICAgfSkpKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAZXhwb3J0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ3J4T25Jbml0RWZmZWN0cygpIHsKICAgICAgICByZXR1cm4gZWZmZWN0c0luaXRpYWxpemVkKCk7CiAgICB9Cn0KRmVhdHVyZUZsYWdFZmZlY3RzLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKXTsKLyoqIEBub2NvbGxhcHNlICovCkZlYXR1cmVGbGFnRWZmZWN0cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQWN0aW9ucyB9LAogICAgeyB0eXBlOiBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBGZWF0dXJlRmxhZ0VmZmVjdHMuybVmYWMgPSBmdW5jdGlvbiBGZWF0dXJlRmxhZ0VmZmVjdHNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRmVhdHVyZUZsYWdFZmZlY3RzKSjJtcm1aW5qZWN0KEFjdGlvbnMpLCDJtcm1aW5qZWN0KFRCRmVhdHVyZUZsYWdEYXRhU291cmNlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBGZWF0dXJlRmxhZ0VmZmVjdHMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRmVhdHVyZUZsYWdFZmZlY3RzLCBmYWN0b3J5OiBGZWF0dXJlRmxhZ0VmZmVjdHMuybVmYWMgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvZmVhdHVyZV9mbGFnL2ZlYXR1cmVfZmxhZ19tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KY2xhc3MgRmVhdHVyZUZsYWdNb2R1bGUgewp9CkZlYXR1cmVGbGFnTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgIFRCRmVhdHVyZUZsYWdNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShGRUFVVFVSRV9GTEFHX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQxKSwKICAgICAgICAgICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW0ZlYXR1cmVGbGFnRWZmZWN0c10pLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBGZWF0dXJlRmxhZ01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEZlYXR1cmVGbGFnTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gRmVhdHVyZUZsYWdNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBGZWF0dXJlRmxhZ01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGZWF0dXJlRmxhZ01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgVEJGZWF0dXJlRmxhZ01vZHVsZSwKICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShGRUFVVFVSRV9GTEFHX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQxKSwKICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtGZWF0dXJlRmxhZ0VmZmVjdHNdKSwKICAgICAgICBdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoRmVhdHVyZUZsYWdNb2R1bGUsIHsgaW1wb3J0czogW1RCRmVhdHVyZUZsYWdNb2R1bGUsIFN0b3JlRmVhdHVyZU1vZHVsZSwgRWZmZWN0c0ZlYXR1cmVNb2R1bGVdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3NldHRpbmdzL3NldHRpbmdzX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBTZXR0aW5nc01vZHVsZSB7Cn0KU2V0dGluZ3NNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0J1dHRvbkNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtTZXR0aW5nc0J1dHRvbkNvbXBvbmVudCwgU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IFtTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudF0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIEZvcm1zTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIE1hdENoZWNrYm94TW9kdWxlLAogICAgICAgICAgICAgICAgICAgIE1hdERpYWxvZ01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIE1hdElucHV0TW9kdWxlLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFNldHRpbmdzTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBTZXR0aW5nc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTZXR0aW5nc01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgTWF0RGlhbG9nTW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICBNYXRJbnB1dE1vZHVsZSwKICAgICAgICBdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU2V0dGluZ3NNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbU2V0dGluZ3NCdXR0b25Db21wb25lbnQsCiAgICAgICAgU2V0dGluZ3NEaWFsb2dDb21wb25lbnQsCiAgICAgICAgU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsCiAgICAgICAgRm9ybXNNb2R1bGUsCiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsCiAgICAgICAgTWF0RGlhbG9nTW9kdWxlLAogICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgTWF0SW5wdXRNb2R1bGVdLCBleHBvcnRzOiBbU2V0dGluZ3NCdXR0b25Db21wb25lbnQsIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXJdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3RiZGV2X3VwbG9hZC90YmRldl91cGxvYWRfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIFRiZGV2VXBsb2FkTW9kdWxlIHsKfQpUYmRldlVwbG9hZE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogWwogICAgICAgICAgICAgICAgICAgIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IFtUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgQ2xpcGJvYXJkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgTWF0RGlhbG9nTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnd2luZG93JywgdXNlVmFsdWU6IHdpbmRvdyB9XSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUYmRldlVwbG9hZE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFRiZGV2VXBsb2FkTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gVGJkZXZVcGxvYWRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBUYmRldlVwbG9hZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUYmRldlVwbG9hZE1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnd2luZG93JywgdXNlVmFsdWU6IHdpbmRvdyB9XSwgaW1wb3J0czogW1sKICAgICAgICAgICAgQ2xpcGJvYXJkTW9kdWxlLAogICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgTWF0RGlhbG9nTW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgIF1dIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShUYmRldlVwbG9hZE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudCwKICAgICAgICBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudCwKICAgICAgICBUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lcl0sIGltcG9ydHM6IFtDbGlwYm9hcmRNb2R1bGUsCiAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICBNYXREaWFsb2dNb2R1bGUsCiAgICAgICAgTWF0SWNvbk1vZHVsZV0sIGV4cG9ydHM6IFtUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudF0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvaGVhZGVyL2hlYWRlcl9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgSGVhZGVyTW9kdWxlIHsKfQpIZWFkZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICBIZWFkZXJDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luU2VsZWN0b3JDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgUmVsb2FkQ29udGFpbmVyLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtIZWFkZXJDb21wb25lbnQsIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyLCBSZWxvYWRDb250YWluZXJdLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBNYXRUYWJzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIE1hdFRvb2xiYXJNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgTWF0U2VsZWN0TW9kdWxlLAogICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBDb3JlTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIFNldHRpbmdzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIFRiZGV2VXBsb2FkTW9kdWxlLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIZWFkZXJNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBIZWFkZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGVhZGVyTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFtdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdFRhYnNNb2R1bGUsCiAgICAgICAgICAgIE1hdFRvb2xiYXJNb2R1bGUsCiAgICAgICAgICAgIE1hdFNlbGVjdE1vZHVsZSwKICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBDb3JlTW9kdWxlLAogICAgICAgICAgICBTZXR0aW5nc01vZHVsZSwKICAgICAgICAgICAgVGJkZXZVcGxvYWRNb2R1bGUsCiAgICAgICAgXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEhlYWRlck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtIZWFkZXJDb21wb25lbnQsCiAgICAgICAgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQsCiAgICAgICAgUGx1Z2luU2VsZWN0b3JDb250YWluZXIsCiAgICAgICAgUmVsb2FkQ29udGFpbmVyXSwgaW1wb3J0czogW01hdEJ1dHRvbk1vZHVsZSwKICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgIE1hdFRhYnNNb2R1bGUsCiAgICAgICAgTWF0VG9vbGJhck1vZHVsZSwKICAgICAgICBNYXRTZWxlY3RNb2R1bGUsCiAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgIENvcmVNb2R1bGUsCiAgICAgICAgU2V0dGluZ3NNb2R1bGUsCiAgICAgICAgVGJkZXZVcGxvYWRNb2R1bGVdLCBleHBvcnRzOiBbSGVhZGVyQ29tcG9uZW50LCBQbHVnaW5TZWxlY3RvckNvbnRhaW5lciwgUmVsb2FkQ29udGFpbmVyXSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tYXRfaWNvbl9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTVkdfUEFUSCA9ICcuL2ljb25fYnVuZGxlLnN2Zyc7CmNsYXNzIE1hdEljb25Nb2R1bGUkMSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9tU2FuaXRpemVyCiAgICAgKiBAcGFyYW0gez99IGljb25SZWdpc3RyeQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihkb21TYW5pdGl6ZXIsIGljb25SZWdpc3RyeSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB1cmwgPSBkb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFNWR19QQVRIKTsKICAgICAgICBpY29uUmVnaXN0cnkuYWRkU3ZnSWNvblNldCh1cmwpOwogICAgfQp9Ck1hdEljb25Nb2R1bGUkMS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGltcG9ydHM6IFtNYXRJY29uTW9kdWxlXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpNYXRJY29uTW9kdWxlJDEuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IERvbVNhbml0aXplciB9LAogICAgeyB0eXBlOiBNYXRJY29uUmVnaXN0cnkgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gTWF0SWNvbk1vZHVsZSQxLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0SWNvbk1vZHVsZSQxIH0pOwovKiogQG5vY29sbGFwc2UgKi8gTWF0SWNvbk1vZHVsZSQxLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0SWNvbk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRJY29uTW9kdWxlJDEpKMm1ybVpbmplY3QoRG9tU2FuaXRpemVyKSwgybXJtWluamVjdChNYXRJY29uUmVnaXN0cnkpKTsgfSwgaW1wb3J0czogW1tNYXRJY29uTW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdEljb25Nb2R1bGUkMSwgeyBpbXBvcnRzOiBbTWF0SWNvbk1vZHVsZV0gfSk7IH0pKCk7CgovKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2YXIgTG9hZGluZ01lY2hhbmlzbVR5cGU7CihmdW5jdGlvbiAoTG9hZGluZ01lY2hhbmlzbVR5cGUpIHsKICAgIExvYWRpbmdNZWNoYW5pc21UeXBlWyJDVVNUT01fRUxFTUVOVCJdID0gIkNVU1RPTV9FTEVNRU5UIjsKICAgIExvYWRpbmdNZWNoYW5pc21UeXBlWyJJRlJBTUUiXSA9ICJJRlJBTUUiOwogICAgTG9hZGluZ01lY2hhbmlzbVR5cGVbIk5HX0NPTVBPTkVOVCJdID0gIk5HX0NPTVBPTkVOVCI7CiAgICBMb2FkaW5nTWVjaGFuaXNtVHlwZVsiTk9ORSJdID0gIk5PTkUiOwp9KShMb2FkaW5nTWVjaGFuaXNtVHlwZSB8fCAoTG9hZGluZ01lY2hhbmlzbVR5cGUgPSB7fSkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvcGx1Z2luX3JlZ2lzdHJ5X3R5cGVzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIFRoaXMgREkgdG9rZW4gbXVzdCBub3QgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBmaWxlIGFzIFBsdWdpblJlZ2lzdHJ5TW9kdWxlCi8vIG9yIGVsc2UgaXRzIGNvbnN0cnVjdG9yIGluamVjdGlvbiBjYXVzZXMgQW5ndWxhcidzIEFPVCBjb21waWxlciB0byB0aGluawovLyB0aGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUExVR0lOX0NPTkZJR19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignW3BsdWdpbnNdIFBsdWdpbiByZWdpc3RyeSBjb25maWcnKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3BsdWdpbl9yZWdpc3RyeV9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBwbHVnaW5OYW1lVG9Db21wb25lbnQgPSBuZXcgTWFwKCk7CmNsYXNzIFBsdWdpblJlZ2lzdHJ5TW9kdWxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb25maWdzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3MpIHsKICAgICAgICBpZiAoIWNvbmZpZ3MpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGx1Z2luTmFtZXMgPSBuZXcgU2V0KGNvbmZpZ3MubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbmZpZykgPT4gY29uZmlnLnBsdWdpbk5hbWUpKSk7CiAgICAgICAgY29uc29sZS5hc3NlcnQocGx1Z2luTmFtZXMuc2l6ZSA9PT0gY29uZmlncy5sZW5ndGgsICdDYW5ub3QgcmVnaXN0ZXIgdGhlIHNhbWUgcGx1Z2luIG11bHRpcGxlIHRpbWVzLicpOwogICAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHsKICAgICAgICAgICAgY29uc3QgeyBwbHVnaW5OYW1lLCBjb21wb25lbnRDbGFzcyB9ID0gY29uZmlnOwogICAgICAgICAgICBwbHVnaW5OYW1lVG9Db21wb25lbnQuc2V0KHBsdWdpbk5hbWUsICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRDbGFzcykpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFuIE5nTW9kdWxlIHRoYXQgZGVjbGFyZXMgYSBDb21wb25lbnQgY2FuIGNhbGwgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGhlCiAgICAgKiBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQgd2hlbiBhIHBsdWdpbiBpcyByZXF1ZXN0ZWQgYnkgbmFtZS4gTW9kdWxlcwogICAgICogcmVnaXN0ZXIgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbjoKICAgICAqCiAgICAgKiBcQE5nTW9kdWxlKHsKICAgICAqICAgaW1wb3J0czogWwogICAgICogICAgIFBsdWdpblJlZ2lzdHJ5TW9kdWxlLmZvclBsdWdpbignc2NhbGFycycsIFNjYWxhcnNEYXNoYm9hcmQpCiAgICAgKiAgIF0sCiAgICAgKiAgIGVudHJ5Q29tcG9uZW50czogW1NjYWxhcnNEYXNoYm9hcmRdCiAgICAgKiB9KQogICAgICogQHBhcmFtIHs/fSBwbHVnaW5OYW1lCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudENsYXNzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZm9yUGx1Z2luKHBsdWdpbk5hbWUsIGNvbXBvbmVudENsYXNzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmdNb2R1bGU6IFBsdWdpblJlZ2lzdHJ5TW9kdWxlLAogICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBQTFVHSU5fQ09ORklHX1RPS0VOLAogICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB7IHBsdWdpbk5hbWUsIGNvbXBvbmVudENsYXNzIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luTmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Q29tcG9uZW50KHBsdWdpbk5hbWUpIHsKICAgICAgICByZXR1cm4gcGx1Z2luTmFtZVRvQ29tcG9uZW50LmdldChwbHVnaW5OYW1lKSB8fCBudWxsOwogICAgfQp9ClBsdWdpblJlZ2lzdHJ5TW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe30sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KUGx1Z2luUmVnaXN0cnlNb2R1bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW1BMVUdJTl9DT05GSUdfVE9LRU4sXSB9XSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5SZWdpc3RyeU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFBsdWdpblJlZ2lzdHJ5TW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luUmVnaXN0cnlNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBQbHVnaW5SZWdpc3RyeU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQbHVnaW5SZWdpc3RyeU1vZHVsZSkoybXJtWluamVjdChQTFVHSU5fQ09ORklHX1RPS0VOLCA4KSk7IH0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9wbHVnaW5zX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCBfYzAkOSA9IFsicGx1Z2luQ29udGFpbmVyIl07CmNvbnN0IF9jMSQ4ID0gWyJuZ1BsdWdpbkNvbnRhaW5lciJdOwpmdW5jdGlvbiBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCA1KTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImgzIik7CiAgICDJtcm1dGV4dCgzLCAiTm8gZGFzaGJvYXJkcyBhcmUgYWN0aXZlIGZvciB0aGUgY3VycmVudCBkYXRhIHNldC4iKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJwIik7CiAgICDJtcm1dGV4dCg1LCAiUHJvYmFibGUgY2F1c2VzOiIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgInVsIik7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJsaSIpOwogICAgybXJtXRleHQoOCwgIllvdSBoYXZlblx1MjAxOXQgd3JpdHRlbiBhbnkgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLiIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgImxpIik7CiAgICDJtcm1dGV4dCgxMCwgIlRlbnNvckJvYXJkIGNhblx1MjAxOXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLiIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGV4dCgxMSwgIiBJZiB5b3VcdTIwMTlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0byBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUgIik7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAiYSIsIDYpOwogICAgybXJtXRleHQoMTMsICJSRUFETUUiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGV4dCgxNCwgIiBhbmQgcGVyaGFwcyB0aGUgIik7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDE1LCAiYSIsIDcpOwogICAgybXJtXRleHQoMTYsICJUZW5zb3JCb2FyZCB0dXRvcmlhbCIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybV0ZXh0KDE3LCAiLiAiKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMTgsICJwIik7CiAgICDJtcm1dGV4dCgxOSwgIiBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZSAiKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMjAsICJhIiwgOCk7CiAgICDJtcm1dGV4dCgyMSwgInRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXMiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGV4dCgyMiwgIiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4gIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgyMywgInAiKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMjQsICJzcGFuIiwgOSk7CiAgICDJtcm1dGV4dCgyNSk7CiAgICDJtcm1cGlwZSgyNiwgImRhdGUiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgyNSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiTGFzdCByZWxvYWQ6ICIsIMm1ybVwaXBlQmluZDIoMjYsIDEsIGN0eF9yMi5sYXN0VXBkYXRlZCwgIm1lZGl1bSIpLCAiIik7Cn0gfQpjbGFzcyBQbHVnaW5zQ29tcG9uZW50IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luUmVnaXN0cnkKICAgICAqLwogICAgY29uc3RydWN0b3IoY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBwbHVnaW5SZWdpc3RyeSkgewogICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOwogICAgICAgIHRoaXMucGx1Z2luUmVnaXN0cnkgPSBwbHVnaW5SZWdpc3RyeTsKICAgICAgICB0aGlzLmV4cGVyaW1lbnRQbHVnaW5Ib3N0TGliID0gKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RmLWV4cGVyaW1lbnRhbC1wbHVnaW4taG9zdC1saWInKSkpOwogICAgICAgIHRoaXMuTG9hZGluZ01lY2hhbmlzbVR5cGUgPSBMb2FkaW5nTWVjaGFuaXNtVHlwZTsKICAgICAgICB0aGlzLnBsdWdpbkluc3RhbmNlcyA9IG5ldyBNYXAoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25DaGFuZ2VzKGNoYW5nZSkgewogICAgICAgIGlmIChjaGFuZ2VbJ2FjdGl2ZVBsdWdpbiddICYmIHRoaXMuYWN0aXZlUGx1Z2luKSB7CiAgICAgICAgICAgIHRoaXMucmVuZGVyUGx1Z2luKCgvKiogQHR5cGUgez99ICovICh0aGlzLmFjdGl2ZVBsdWdpbikpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYW5nZVsnbGFzdFVwZGF0ZWQnXSkgewogICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW5kZXJQbHVnaW4ocGx1Z2luKSB7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMucGx1Z2luSW5zdGFuY2VzLnZhbHVlcygpKSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgewogICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAwLAogICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLAogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBXZSBmdXJ0aGVyIG1ha2UgY29udGFpbmVycyBpbnZpc2libGUuIFNvbWUgZWxlbWVudHMgbWF5IGFuY2hvciB0bwogICAgICAgICAgICAgICAgICogdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBzZXR0aW5nIHRoZSBtYXgKICAgICAgICAgICAgICAgICAqIGhlaWdodCBoZXJlIHRvIDAgd2lsbCBub3QgaGlkZSB0aGVtLgogICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnBsdWdpbkluc3RhbmNlcy5oYXMocGx1Z2luLmlkKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMucGx1Z2luSW5zdGFuY2VzLmdldChwbHVnaW4uaWQpKSk7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2Uuc3R5bGUsIHsKICAgICAgICAgICAgICAgIG1heEhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgIG92ZXJmbG93OiBudWxsLAogICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogbnVsbCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBudWxsLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGx1Z2luRWxlbWVudCA9IHRoaXMuY3JlYXRlUGx1Z2luKHBsdWdpbik7CiAgICAgICAgaWYgKHBsdWdpbkVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5JbnN0YW5jZXMuc2V0KHBsdWdpbi5pZCwgcGx1Z2luRWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwbHVnaW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZVBsdWdpbihwbHVnaW4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBsdWdpbkVsZW1lbnQgPSBudWxsOwogICAgICAgIHN3aXRjaCAocGx1Z2luLmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSBMb2FkaW5nTWVjaGFuaXNtVHlwZS5DVVNUT01fRUxFTUVOVDogewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudFBsdWdpbiA9ICgvKiogQHR5cGUgez99ICovIChwbHVnaW4ubG9hZGluZ19tZWNoYW5pc20pKTsKICAgICAgICAgICAgICAgIHBsdWdpbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnRQbHVnaW4uZWxlbWVudF9uYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHBsdWdpbkVsZW1lbnQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBMb2FkaW5nTWVjaGFuaXNtVHlwZS5JRlJBTUU6IHsKICAgICAgICAgICAgICAgIHBsdWdpbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgc2hvdWxkIHVzZSB0aGUgRE9NU2FuaXRpemVyIGJ1dCBpdCBpcyBub3QgdXNhYmxlIGluIFR5cGVTY3JpcHQuCiAgICAgICAgICAgICAgICBwbHVnaW5FbGVtZW50LnNldEF0dHJpYnV0ZSgnc3JjJywgYGRhdGEvcGx1Z2luX2VudHJ5Lmh0bWw/bmFtZT0ke3BsdWdpbi5pZH1gKTsKICAgICAgICAgICAgICAgIHRoaXMuZXhwZXJpbWVudFBsdWdpbkhvc3RMaWIucmVnaXN0ZXJQbHVnaW5JZnJhbWUocGx1Z2luRWxlbWVudCwgcGx1Z2luLmlkKTsKICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHBsdWdpbkVsZW1lbnQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBMb2FkaW5nTWVjaGFuaXNtVHlwZS5OR19DT01QT05FTlQ6CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZ0NvbXBvbmVudENsYXNzID0gdGhpcy5wbHVnaW5SZWdpc3RyeS5nZXRDb21wb25lbnQocGx1Z2luLmlkKTsKICAgICAgICAgICAgICAgIGlmIChuZ0NvbXBvbmVudENsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShuZ0NvbXBvbmVudENsYXNzKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luQ29tcG9uZW50ID0gdGhpcy5uZ1BsdWdpbkNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgcGx1Z2luRWxlbWVudCA9IHBsdWdpbkNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm8gcmVnaXN0ZXJlZCBBbmd1bGFyIGNvbXBvbmVudCBmb3IgcGx1Z2luOiAke3BsdWdpbi5pZH1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIExvYWRpbmdNZWNoYW5pc21UeXBlLk5PTkU6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgcGx1Z2luJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwbHVnaW5FbGVtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVsb2FkKCkgewogICAgICAgIGlmICghdGhpcy5hY3RpdmVQbHVnaW4gfHwgdGhpcy5hY3RpdmVQbHVnaW4uZGlzYWJsZV9yZWxvYWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWF5YmVEYXNoYm9hcmQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5wbHVnaW5JbnN0YW5jZXMuZ2V0KHRoaXMuYWN0aXZlUGx1Z2luLmlkKSkpOwogICAgICAgIGlmIChtYXliZURhc2hib2FyZC5yZWxvYWQpIHsKICAgICAgICAgICAgbWF5YmVEYXNoYm9hcmQucmVsb2FkKCk7CiAgICAgICAgfQogICAgfQp9ClBsdWdpbnNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwbHVnaW5zLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vcGx1Z2luc19jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICBzdHlsZXM6IFsKICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLnBsdWdpbnMgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLm5vLXBsdWdpbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgIC53YXJuaW5nLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDA7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgfQogICAgICAubGFzdC1yZWxvYWQtdGltZSB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIC5wbHVnaW5zIDo6bmctZGVlcCBpZnJhbWUgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KUGx1Z2luc0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0sCiAgICB7IHR5cGU6IFBsdWdpblJlZ2lzdHJ5TW9kdWxlIH0KXTsKUGx1Z2luc0NvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHBsdWdpbnNDb250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwbHVnaW5Db250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0sCiAgICBuZ1BsdWdpbkNvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ25nUGx1Z2luQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSxdIH1dLAogICAgYWN0aXZlUGx1Z2luOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG5vRW5hYmxlZFBsdWdpbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBsYXN0VXBkYXRlZDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFBsdWdpbnNDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBQbHVnaW5zQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsdWdpbnNDb21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbHVnaW5SZWdpc3RyeU1vZHVsZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luc0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBQbHVnaW5zQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInBsdWdpbnMtY29tcG9uZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIFBsdWdpbnNDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzAkOSwgdHJ1ZSwgRWxlbWVudFJlZik7CiAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzEkOCwgdHJ1ZSwgVmlld0NvbnRhaW5lclJlZik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5wbHVnaW5zQ29udGFpbmVyID0gX3QuZmlyc3QpOwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgubmdQbHVnaW5Db250YWluZXIgPSBfdC5maXJzdCk7CiAgICB9IH0sIGlucHV0czogeyBhY3RpdmVQbHVnaW46ICJhY3RpdmVQbHVnaW4iLCBub0VuYWJsZWRQbHVnaW46ICJub0VuYWJsZWRQbHVnaW4iLCBsYXN0VXBkYXRlZDogImxhc3RVcGRhdGVkIiB9LCBmZWF0dXJlczogW8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdLCBkZWNsczogNSwgdmFyczogMSwgY29uc3RzOiBbWzEsICJwbHVnaW5zIl0sIFsicGx1Z2luQ29udGFpbmVyIiwgIiJdLCBbIm5nUGx1Z2luQ29udGFpbmVyIiwgIiJdLCBbImNsYXNzIiwgIm5vLXBsdWdpbiIsIDQsICJuZ0lmIl0sIFsxLCAibm8tcGx1Z2luIl0sIFsxLCAid2FybmluZy1tZXNzYWdlIl0sIFsiaHJlZiIsICJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiXSwgWyJocmVmIiwgImh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiXSwgWyJocmVmIiwgImh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciXSwgWzEsICJsYXN0LXJlbG9hZC10aW1lIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigyLCBudWxsLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCAyNywgNCwgImRpdiIsIDMpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Lm5vRW5hYmxlZFBsdWdpbik7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmXSwgcGlwZXM6IFtEYXRlUGlwZV0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIC5wbHVnaW5zW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgLm5vLXBsdWdpbltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgIH1cbiAgICAgIC53YXJuaW5nLW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMDtcbiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDtcbiAgICAgIH1cbiAgICAgIC5sYXN0LXJlbG9hZC10aW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICAgIH1cbiAgICAgIC5wbHVnaW5zW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgaWZyYW1lIHtcbiAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9kYXRhX3NvdXJjZS90ZmRiZzJfZGF0YV9zb3VyY2UudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENvbnZlcnRzIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBhIHN0YWNrIGZyYW1lIGludG8gdGhlIG9iamVjdAogKiByZXByZXNlbnRhdGlvbi4KICogQHBhcmFtIHs/fSBhcnJheQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3RhY2tGcmFtZUFzQXJyYXlUb1N0YWNrRnJhbWUoYXJyYXkpIHsKICAgIHJldHVybiB7CiAgICAgICAgaG9zdF9uYW1lOiBhcnJheVswXSwKICAgICAgICBmaWxlX3BhdGg6IGFycmF5WzFdLAogICAgICAgIGxpbmVubzogYXJyYXlbMl0sCiAgICAgICAgZnVuY3Rpb25fbmFtZTogYXJyYXlbM10sCiAgICB9Owp9CmNsYXNzIFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBodHRwCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGh0dHApIHsKICAgICAgICB0aGlzLmh0dHAgPSBodHRwOwogICAgICAgIHRoaXMuaHR0cFBhdGhQcmVmaXggPSAnZGF0YS9wbHVnaW4vZGVidWdnZXItdjInOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaFJ1bnMoKSB7CiAgICAgICAgLy8gVE9ETyhjYWlzKTogT25jZSB0aGUgYmFja2VuZCB1c2VzIGFuIERhdGFQcm92aWRlciB0aGF0IHVuaWZpZXMgdGZkYmcgYW5kCiAgICAgICAgLy8gbm9uLXRmZGJnIHBsdWdpbnMsIHN3aXRjaCB0byB1c2luZyBgdGZfYmFja2VuZC5ydW5TdG9yZS5yZWZyZXNoKClgLgogICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL3J1bnMnKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBydW4KICAgICAqIEBwYXJhbSB7P30gYmVnaW4KICAgICAqIEBwYXJhbSB7P30gZW5kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHMocnVuLCBiZWdpbiwgZW5kKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvZXhlY3V0aW9uL2RpZ2VzdHMnLCB7CiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgYmVnaW46IFN0cmluZyhiZWdpbiksCiAgICAgICAgICAgICAgICBlbmQ6IFN0cmluZyhlbmQpLAogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICogQHBhcmFtIHs/fSBiZWdpbgogICAgICogQHBhcmFtIHs/fSBlbmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZldGNoRXhlY3V0aW9uRGF0YShydW4sIGJlZ2luLCBlbmQpIHsKICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9leGVjdXRpb24vZGF0YScsIHsKICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICBydW4sCiAgICAgICAgICAgICAgICBiZWdpbjogU3RyaW5nKGJlZ2luKSwKICAgICAgICAgICAgICAgIGVuZDogU3RyaW5nKGVuZCksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgKiBAcGFyYW0gez99IGJlZ2luCiAgICAgKiBAcGFyYW0gez99IGVuZAogICAgICogQHBhcmFtIHs/PX0gdHJhY2VfaWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZldGNoR3JhcGhFeGVjdXRpb25EaWdlc3RzKHJ1biwgYmVnaW4sIGVuZCwgdHJhY2VfaWQpIHsKICAgICAgICBpZiAodHJhY2VfaWQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYWNlX2lkIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgZmV0Y2hHcmFwaEV4ZWN1dGlvbkRpZ2VzdHMoKSB5ZXQnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvZ3JhcGhfZXhlY3V0aW9uL2RpZ2VzdHMnLCB7CiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgYmVnaW46IFN0cmluZyhiZWdpbiksCiAgICAgICAgICAgICAgICBlbmQ6IFN0cmluZyhlbmQpLAogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICogQHBhcmFtIHs/fSBiZWdpbgogICAgICogQHBhcmFtIHs/fSBlbmQKICAgICAqIEBwYXJhbSB7Pz19IHRyYWNlX2lkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaEdyYXBoRXhlY3V0aW9uRGF0YShydW4sIGJlZ2luLCBlbmQsIHRyYWNlX2lkKSB7CiAgICAgICAgaWYgKHRyYWNlX2lkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cmFjZV9pZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGZldGNoR3JhcGhFeGVjdXRpb25EYXRhKCkgeWV0Jyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL2dyYXBoX2V4ZWN1dGlvbi9kYXRhJywgewogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHJ1biwKICAgICAgICAgICAgICAgIGJlZ2luOiBTdHJpbmcoYmVnaW4pLAogICAgICAgICAgICAgICAgZW5kOiBTdHJpbmcoZW5kKSwKICAgICAgICAgICAgfSwKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBydW4KICAgICAqIEBwYXJhbSB7P30gZ3JhcGhfaWQKICAgICAqIEBwYXJhbSB7P30gb3BfbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmV0Y2hHcmFwaE9wSW5mbyhydW4sIGdyYXBoX2lkLCBvcF9uYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvZ3JhcGhzL29wX2luZm8nLCB7CiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgZ3JhcGhfaWQsCiAgICAgICAgICAgICAgICBvcF9uYW1lLAogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmV0Y2hTb3VyY2VGaWxlTGlzdChydW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9zb3VyY2VfZmlsZXMvbGlzdCcsIHsKICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICBydW4sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgKiBAcGFyYW0gez99IGZpbGVJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmV0Y2hTb3VyY2VGaWxlKHJ1biwgZmlsZUluZGV4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvc291cmNlX2ZpbGVzL2ZpbGUnLCB7CiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgaW5kZXg6IFN0cmluZyhmaWxlSW5kZXgpLAogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lSWRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaFN0YWNrRnJhbWVzKHJ1biwgc3RhY2tGcmFtZUlkcykgewogICAgICAgIHJldHVybiB0aGlzLmh0dHAKICAgICAgICAgICAgLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9zdGFja19mcmFtZXMvc3RhY2tfZnJhbWVzJywgewogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHJ1biwKICAgICAgICAgICAgICAgIHN0YWNrX2ZyYW1lX2lkczogc3RhY2tGcmFtZUlkcy5qb2luKCcsJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSkKICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJhd1Jlc3BvbnNlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmF3UmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHN0YWNrX2ZyYW1lczogcmF3UmVzcG9uc2Uuc3RhY2tfZnJhbWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVBc0FycmF5CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoc3RhY2tGcmFtZUFzQXJyYXkpID0+IHN0YWNrRnJhbWVBc0FycmF5VG9TdGFja0ZyYW1lKHN0YWNrRnJhbWVBc0FycmF5KSkpLAogICAgICAgICAgICB9OwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgKiBAcGFyYW0gez99IGJlZ2luCiAgICAgKiBAcGFyYW0gez99IGVuZAogICAgICogQHBhcmFtIHs/PX0gYWxlcnRfdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZmV0Y2hBbGVydHMocnVuLCBiZWdpbiwgZW5kLCBhbGVydF90eXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgICAgcnVuLAogICAgICAgICAgICBiZWdpbjogU3RyaW5nKGJlZ2luKSwKICAgICAgICAgICAgZW5kOiBTdHJpbmcoZW5kKSwKICAgICAgICB9OwogICAgICAgIGlmIChhbGVydF90eXBlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcGFyYW1zWydhbGVydF90eXBlJ10gPSBhbGVydF90eXBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9hbGVydHMnLCB7CiAgICAgICAgICAgIHBhcmFtcywKICAgICAgICB9KTsKICAgIH0KfQpUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogVEJIdHRwQ2xpZW50IH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlLsm1ZmFjID0gZnVuY3Rpb24gVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2UpKMm1ybVpbmplY3QoVEJIdHRwQ2xpZW50KSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZSwgZmFjdG9yeTogVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2UuybVmYWMgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9kYXRhX3NvdXJjZS90ZmRiZzJfZGF0YV9zb3VyY2VfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUgewp9ClRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1RmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUZmRiZzJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBUZmRiZzJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW1RmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlXSwgaW1wb3J0czogW1tUQkh0dHBDbGllbnRNb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSwgeyBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2luYWN0aXZlL2luYWN0aXZlX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBJbmFjdGl2ZUNvbXBvbmVudCB7Cn0KSW5hY3RpdmVDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdpbmFjdGl2ZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2luYWN0aXZlX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2luYWN0aXZlX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEluYWN0aXZlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlQ29tcG9uZW50KSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gSW5hY3RpdmVDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSW5hY3RpdmVDb21wb25lbnQsIHNlbGVjdG9yczogW1siaW5hY3RpdmUtY29tcG9uZW50Il1dLCBkZWNsczogNTQsIHZhcnM6IDAsIGNvbnN0czogW1sxLCAiY29udGFpbmVyIl0sIFsxLCAidGl0bGUiXSwgWzEsICJjb2RlIl0sIFsxLCAiYXJnIl0sIFsxLCAiZXhoaWJpdHMtY29udGFpbmVyIl0sIFsxLCAiZXhoaWJpdCJdLCBbMSwgInNjcmVlbnNob3QiXSwgWyJzcmMiLCAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFUWUFBQUUyQ0FZQUFBRHJ2TDZwQUFBb3lIcFVXSFJTWVhjZ2NISnZabWxzWlNCMGVYQmxJR1Y0YVdZQUFIamFyWnhwZGh5NWNvWC9ZeFZlQXVaaE9SZ0M1M2dIWHI2L2kySnJlbXFybisxV2k2U0t4VXdrRUhHSFFJRE8vdXMvci9zUC9odXRaWmRMNjNYVTZ2a3ZqenppNUl2dVAvK045ekg0L0Q2Ky8xTDkraXI4L0xyNzlvM0k1NlIzZnI3UjV1ZHptTHhldnYvQVgvY0k2K2ZYWGYvNlR1eGZGL3I2QmhmK2pFQjMxdGZueDBIeWV2eThIdkxYaFlaOXZxaWp0eCtIdXI0dXRML2UrSWJ5OVRkL0c5Ym5rLzd0Zm5xaE1VdW5jS01VbzZXUS9QdVlQeU5JbjcrVHYrMTlqTHd2OE5wTUtRWDMrZlIxTVNia3A4Zjc2N1AzUDA3UVQ1UDgxMWZ1MTluLzl0VXZreC9uMSt2cGw3bXNYM1BrNisrL0Vjb3ZyNmR2dDRrL2hjTzNFY1dmdjNGN3pQL3lPRjkvN3ozOVh2czgzY3lWR2ExZkVmVW0rNjhaMGhzWFU1N2VqMVgrTlA0V3ZtN3Z6K0JQOTlOdmx2ejQ3UmQvZGhnaHNpclhoUnhPbU9FR2U1OTMyQXd4UjR1Tnp6SHVtTjVyUGJVNDRrNWFwNncvNGNhV1JqcXBzMjQ3bW1QTmNvcmZ4aExlZmNlNzN3NmRPNS9BVzJQZ1lscnF2LzNqL3Fkdi9qdC8zTDFiVXhSOC96WlhqQ3NxcmhtR1ZrNGZlUmRMRU83WHVwVTN3WC85K1ZwKy8wUDhFS3FzWUhuVDNIbkE2ZGZuRXF1RTc3R1Yzam9uM2xmNC9Gbmo0TnI1dWdCVHhMMExnd21KRmZBMXBCSnE4QzNHRmdMejJGbWd5Y2hqeW5HeEFxR1VlQmhrekNuVjZGcnNVZmZtWjFwNDc0MGwxcWlYd1NZV29xUktiblZXYUxKWU9SZmlwK1ZPRE0yU1NpNmwxTkpLZDJXVVdWUE50ZFJhV3hYSXpaWmFicVhWMWxwdm84MmVldTZsMTk1Njc2UFBFVWNDQTh1b280MCt4cGd6dXNtTkp0ZWF2SC95eW9vcnJiektxcXV0dnNhYW0vRFplWmRkZDl0OWp6MVBQT2tBRTZlZWR2b1paMXB3QmxKWXRtTFZtblViTmkreGR0UE50OXg2MisxMzNQbHQxYjVXOVYvKy9CdXJGcjVXTGI2VjB2dmF0MVhqVmRmYVg1Y0lncE9pTldQRllnNnNlTk1LRU5CUmErWjd5RGxxNWJSbWZrU1Nva1FHV2JRMjdnU3RHRXVZTGNSeXc3ZTErNzV5LzJqZFhPbi9hTjNpbjFiT2FlbitQMWJPc1hUL3VtNi9XYlVqbnR0dnhUNVpxRG4xaWV5N1paeTQzSTV4MVRMbnRKbGFTMlh1RlhNTGFaZVFXejIxcm5xQms5dlBMdDNIeHJlNlo1WVBuTU1rSEw5eVBhSG9RcjJtZk9QeEUzaGZwZDAxMDJGcGs1NnlNNDY5VHI2NTMxVVlMWmNHLzg0OE83UmozTFNzdUZkWTV0bzBuaXVsZlhua2x2SStucVFzQndCZGZXOG1kZDhXb20rc1pPbzk1NTcrNG9Za0tMOWxualpqSnlENU9IVnptNld1V2M1Y1paZVRKeW52emZPNDJZYzZSbzhSclNHU1BubE1TMjNuY1FtMWZJL0N4YVVlVGkzd2Rkc2d3dHAzN2JwdXlNWGFZYkpydjFZQTd1WFRhY2JUNWREYTNLekRDbTB5ZjVVeE0zM2I1UWs5aEYxbjRhWjNTUlNFczI4ZnpXSTZWbWVJeVd4czQxcStyaDdXT0MwYVZ6RGl1Sy9HUEJFUXdTbUpDT24reEVSYVk5N00wRWJidmh6aXRuYXlvTEdFUE1Kc3UxcGlrUWZnTmN0bDZYc0kxdGZObGgxejNHOG9kcEtGd2NNaHV5NlA0bEVUUU9IdU00Mnk3QjdOU0NJT1Q3cDlYeVkvSE9YMlFpSzFmUlp6MUhZRU9YaVlma3JOK2FSbHUvaFZmUitSbUdSdHlUSTduWm1vaWNnNy91WnlEOEc5RHprNkVvTm9zYUdQYWd4NVpSS05jWVo4V3puN2lBdlA5YlBaS0dZa0p2Y05QTkQxblljK1BDUndQWTFReUhEdGF0WGM2clhDeEpkSmJaT1JNaGVWZExCK2EwdVJteElSaGNsazJPZTBib2N3N2l5RUorWnpWTUR5Z2YrZHhOMlllc3Jyci9YVHlOaTlXcG41OU0wMDNXT05CU1lWRXZkVjZCYXVIUFpLREROV0d4VllLYmU0V0VjU2NHdytFNkVreHNuSjBCTTl0QktZdDZBYlZ6MU9HZ3VnSWZmdkhFVDZKRm9MNHdRY3ptQ3lLOHpXU0tNYWh3Zkh5R0dHa3FZR0VOWUJUbk9Eak10Y1p4RlkyYllWY0FPUUkySWh0N3VOcFNSRjlrUkNkQ1lZUE9Uckd5QS9WcmN1WW1IY1hhK0ZuUmx5T1luWnRWRFMzandPb2RwdFNmQWt3VTh5Tnk2WjFYakFLYUJZdVord2hiVWtGQWhhQS9SSkZ2bytRUVZiQXpDdWJTY0ZveWRrSnBOL2JpSG1ISUhPdHd1aHRuZE9lMG1Fd1FmTEc4aFIwd2dsS3hSSjIySnhFMUNEZk40VGVyZGJ3RURHeVBWV2REc3RBR08yQzhMYjZDL21SZ1BMbUpoNGdLcld6eVNtZ2Y0RkZsZndqNWNKVUZEa0trd09rWFBuY1kxWkpnS1BFVmFnRzZuUW9KU0lka3N4ZDhWUU8xbXkrUzRrbVMyRnhCWUVWTll1bHlRa1k1RlEvaUVNYjZjUWp1T3NreEppbEZnRE1venc4S1lCR1ZFNlJoaXgxaEk5dDI5a1h5ZEtZanl6TGxZaEkydVl5cEdDZ2VNMUFYZmVHeUEwODlPa3FKdE1lbWYwaTF3SE1GNitmMjRrSk1oRmhFWFFpamdDSGJFTzVCdjh1Qy81SW1JbEJnT01DbW9DZzJQN1RhaUIzQUVBQlZ0Um1KTUZKaVN6cUdIQUthN3VBVU9QQnBwMEJtU1E0Z1VOSVJOZllQMUZWTnpjL0Q0QWQwR2VvbzByVXUwQ1lSQUJUeXFXdTJrNFVCVHR0WGhXSXdSTnJBc3hEakozcmQxWDdjSUtoV3VUS1NBU2VTQm1IMGlZeXRXTnNBYWhocm1qbFNXVldDTHoyekpFT3NZOUZRNnJ3dmJlYlY4aWtFdWtzbGx5TE5DTnN6YUE2S1lKM3kyTEFjeTJ1UmcweVpoV211aVV4aFVFQUxWWklsUVBjTVRWR3pSUHN2TG9teENjRnhBYXJXUkN3dGExQ0VtNlRQZ1F1eGkvamE2ditBQWVHc1FpcXcxOEl0cFlSMEplT0N3V0FVbExZdXIyS3NNSTBvNG5JTlhONVRTWStoeFo5WFA1RnBkY0NsZWdzRVBIWUdKaDRVajJVbFlnL05ybEduTXNKbU1qVkxoWllFWFRsbUlERlZtV3hKU2pvekFPeEJjcTJZUGxVVTQzTjVIVS9ZYUZ2Ly9zOUVVR3Rrc21hcm9BZE84TEJaRUVaeUlsZGtKUTlUQnJSUjhjVXJiSVhvTVBNazNNU2dPelpvRkY3QklYRnpGWUdxTlpyQng2eUxOZWdFc2luL3FHdUlLdWpoelBIVG15UkhDRUJybG1FalI4ZTlUbGtPZG5sYXRaUGF1bnd3ZmpuZHc4STFvV2RBYjdveU1rNDlCZXFYSFBHTWxsRW1PVVJzQU1ORXczNXFoQW53QnlPY2c4a0RPVG0ydjRZd1VoZ0tISUJLVUZwQ0RQQy9xeHRQNTZVR1JzWUw4RkNROGdMVG1JbnA4eEtaQXVkTUNJOHNPWGZBT29BTGs4RGcrVnpqYVdwMHBIbkFlUjZDbG01YVRaaTVYVEY5bS96MTdFSjFtTWNvbDVBeDFNSmVBT3djcTk0QjJSUFFnSlFoalVIdWdWcEJ5TWRBVzRBR1dVT0hQdGpnSTgvL0t5WG0zS0F3eHcyUU5RUWhxUU44RlNYL25vRWJHVzVXQTkwYTdNclhjTFcyVm9TaUl5Q2VrdnJIK1R4S29FemcxaTEwWlcyRHBHOGd6WWQzZDRJMjhtZ1hVaGNxUmRqME5paVhlUUJtUStTNW9CcTFTUUNQUEZ2TUlFekc1Rm9yU1IrSWhHNUJ3aU95dG1FN0NBcko4N09UaUlOWVJseEs5ejM1bVk5N29XSWdmb1prYWdNUzdNNElBSmNDNGRucG1CY291TDZZZEh0dGVrdUNCc3F1ZUFKT1EycXlueERIc3N6QURZVEhEQkJ3aG5IcFV2Q0ljTm1QWUo4MkVJZ2hJelNOd3ZoNjIvcUZzd2hhZVRrQ0kwWUN4U0hXeVgrcjlEVG1LQlRqMGI4RUE0cys0c0N4K2hjNStSYVh2RElvaGhZN3ExNUh4ajRKcEtZV2FHeVVFVXlEcXNSa3gxNjUzRnVNSVd4WFZGekVHWkNJMlRKWGhkUWh6QVc0Q3B1QUh5WlJSb05BWUwvUmdQMjVFUmdYa284R2ZlaW0rVVEwZkFMY0tTak9DQlFiTHQ5bjdnYXZDVHNmRGNualMxOUFaVmlIbk1Gb01mOHhSQkdxZzVHQkRmZytsNncwMUp3bTcwdTF0Z1dGV2dYQ1J6SnYyUk5RMkdKOVluaUxtdzUwUnJKa2lNeVFWcDBvSktrVFFxc3MwbkpvWW0zQlVGL0VDOTZNWUVTVU5HODB6eHpSREFqR3RvT0x1cWRWK0UyRWxkNm9INUtLclRsZkQxMllWZlh2ajFNODhCa1pzbkNsanl4bUl5VUZLM3l0b05MUThxc1UrRTFzQjRJRmcydWg4K1JCSWhEOGtlUkRodndTMHVGQVQyVSthcGlxOE5vMWdEVmdYcnBlVURNMkZJYzBDZXg5QzBwK1BCTDZJUlRhNE0rZDJyS3lkRXlueGdqUjBDYmtFYU1BZFZ5d3VKckx4ZHM0N3N4WHppVWdsbUZuNGx3Qms3QWRIamFKc1BiUzJ1d0dBTnhvQmUwYUdRRjdCR0hIa1VvaWN4VHdmUlZFRUJBSW9pdjRwRmlmRHRLdzRuNFMwR0U5d0pkVmdSYkR0bnM4QjRpYVRLUUhNWEpZSVc2dklzVEs3aGl1RENuUUZKSmd5OWg3Y0dTMEc1eEZ2SnZxYUVoM0ltU2JkSW1hcVVhTTF4MzRyY1FQZmlJOUNIdlVhRmp3M21zaEtBZ3hoSDVzSE9BRGswRUZQQXFSNVZoZGZYMHZKeFpnZU1FaTZicVNNZkVTOWR3N0ViNUNNbFI3a2Q3RFBJVjdJQkc3dEVDWmZ3R2cwRkhBY1RmZ2pBN2JBK3Q2Sk1JNHh0aytuRVRseS9JSTJEbDAxWk1yMFU0blVEblNqOVBVSDlLamtQOVZ3RUppNWhnRytPdDZBWUt2aUJiQ0RNTXRRbWRzemt1eW90ZCtFdnNYNVFNSW1QNmlYNFdaS085UWVsTzJBWjhUdTVPR3c1VUF5aCtRWlJqZ3VYYmlCTmRFbCtHdzZLQzQxRWttOWlPWkE4MWE5UjBaeTRMaWhBaFcxV0ZvSWtzUnZFK3lpMXdWa3pOMlJqQnQrd3RnU1NLZ3U2RzNHeUFlTzdoQ2xIVm9oYm9ZYWliSkJOUndBMjVvN2NSbGVTdTFjMmhjVmxaZ0ZnMXAweG1PUzJuWndOYWdHSVdCWFFFaVdGWTY3Z3NETFpUVEM4TlZWQnlIOXVMV0YzeUh3TWZWUmQxMGZJbERCREJhYVM1bEJRL2U3bXpqUTJ3TFpDMTc4WjJ6LytydnNmdm8zZ0haaTN5ZFJVS0xzMlNSQ01qT0ZFdkNwRHlNazRUd0R6ZW5UbzRIdDV0QlY1TnVnYVROOThaNG0yOFlmcENXSnNmODhrZlNqSTZnVCtJa1RDU0lBeXVyYnNCdGc1ZURObC9HVnR3V3ExRFpWMWdnK2RqaEN6d3p5cE5vTjBRYjUrZ0xYVXZ2UVYyZ1gyUlZrdGVVeUVWcG1xUW52Qko4K0dpY2QrNFR3YnVuUVQyd0Q1Qld0eVJBOE5WQnZQUXlEakk5QWFyOGFBUldBc2p0eHZDRVY0RUcvanNSRkhRa1FDRStlaDBWL0JLa2xEWEJYUU1PRlhVVnBnRm1TbllrWnZxbTc4YmtTQWRFU25JNlRKeGJoTlBuTGpwZzJzQkpjYk1tZzlNMDlpTnp5MjdjQkZIWFpVOGdSOXgzU3Jhc0VpQmxid3hTWDRKVzBYa0Nua2VJbUl4YkxGSCtURTVDbVpLV1ZGR3NjamozRXU0QWdESVlMUjJDVU9wQS9LREsyTFl1WTlleXF1cXkzNDRGNUxCOE9sUzd5UGNXTEk3aTFFZGdHMWZsVnJPS21Hak84cFFXbXYybmlJTnhneDQ3VFFRd3Z6WFB3d0g2SlFpb3M0M0IrNCtEN2dCUEJJNlhOUnJvQ0lHZktvcVJJY2hFZzRpUUJoL1lKbG5QVEtFQmxTQ0hZREtoeGtrb1RHajNoT3dXeVJTd2d6M204NVNCa2ZDRkFlaFZzMnBvbVhxa3o5UUVBMStBSUtCZnpOWGNnY2pUa2hNcThLQ240a2toaEFScFhyRFBDOHlCeTh4QUZNWkJiT1pKY3FmNGR3dzVpaEN0RWhKQzN4Q1FaUFJvdmI1MmFBT3ZmbjdmQkswVmNCalZGd1BKMm5JdzVzVjdRWERFSkFFRUVvdmdoeTRtbU5NYkpTNGFyWVNycXEvbnNtUzRYNWd4OExlbjZBSDd0TUJXYmdzZmRXOVJQa2hza05rTHc1WXRjQkpjeTJhcXdOVDBHdUhkWURwVFZ4bXN3ZkFGUUIrb2t4SVFMdzQ3VjI4Sk0xeERHZWNGRjNHZXJPeWNXQUJPTXVpR2dFRUtwcXlKbVFhd05LNlVPS0dtSWpFcmFQZUU5R3ZiaENYVGwzTXBKMU5JbmZpb2hBMnkxa1BLNFIrWUlNNDUxUVR1WGZDSE9WRVpKa1BKUFVXZElMTUdSQnJIeXI3QVY2SFU2NHJUcFpLbXd2VkhNU2JIZXhlZ3ViblVPdlNPbkV4ekVRWXl0NjhaTEhDU0FMaVcrQ0JBVk1qc1labnM2V2pidklBVU1XY0dNeXF3a0hrUWdlRWlxcXZmQ293UGlSZWNKVGRlVWJnZ0xpT29RSXlTM1RWRjNRczdBaXZqT2ZzOS9Tb20yNEMwc2FJWWVMb216blZVSEhFRGt6NXF4NitleDVBeGVxUS9oWmdaRnd0TmtoK2NnNlRHTnRUU1ZmOE55L0VoMm9nK2hEUGIrcUp2WW5RTXZHY3JFRVE3VjRMeWU5dGh1NGJweER3QTJnVlZCQlhwVm5Ndi9qSjFYckI4MkRaeUZJWGkvQmVCTHVCVFdIWXEvSWVpUVVvd0w4eGRqbnFKeUFkQXRGK1FGUXNrWmpTQ1ZEclVpM2hIS3pESUZnc2p6Q284cndrejNqcXRUSHVGM0RpV09FOGF4WUh1eW9TSUpVVkhYNTdyVkFRNjM5VUIxc1RPdm9TRGpHQms3KzY0dk50VTgwZ0kySEd1aEF4TnJWWnNFSjBtUE1JQkdLQ0d4eXBmZGdMUzdQdFVPZHFnaHB4OFpqb1ZSM04yVGhySzVDWStPQkNMbzF2eS8xUlNFeURja1crRGZqQis5SWpmakFsUzlCdWw0RW5ieGk1U0dZUXhlRzk3VytxQ3lXOXZhRWtyKzkrRTgvL2UxSEJidnU2NmRiVEtvK0JGUnhyZHR2WkJCOHB2SU1NWWs2UkdhR3ErMmRGanNxVG9WbnJJK3NYUmZWMTRpRkdCRnpxdDBlNmROS2x0aldyb0JDOEVyTkdRQnp1RHMwYjNEMDFnNUVPcFhwcXFyTjRMUXJWM2ZpQ29LaW8zdWdSa2dVMFRvQWM5SXJSQkZac2l6UGd6TVc4eFRWS3JBMmtJNThIc2E2RTVrV3Iwc0pzQWhycUJvQ3Ywa2hKSFNXYW9tL0cxbDRTdlBvVmNVSldYdUZKZ0VZR2ZCVXhNWmZraCtmbThZejBvaDRMQWhjb2tKSlBXbVRFUEN6MTI2cWFvM1pneWFFUUJ5d3pDSUVuZmEydDBwUjhBeWFQTDNTa1hReWNycVhteUtZbHlPd3dwZm9ZNzVHT2FKQW1ERVl2Z0ZkTHlTdXc5NUZXRUZWdGd5S3hhekJMUFQ4bG1iRTZTSHJTMGhlVlhTZ0hZbWVzUVlySWFqSjV2RllWc2JML1k2RVlacDR4dWFLZVJFbWFDWkJueWw4OEdha1l6RHVjODZJOFBDQVhCR1ZibmhtS2lnOXF4eXpuQm1BUEJIanFGa1Rtc0I1VnNpSjF5UXlaY1poT1NnVEVJQVd5SFFWZnhvd3drd0RXRUEwc3U0bXdJWFVUSFBDbW9DdHFyUmtrcmdLTERJNUdXQVR4c3RQaHFPWFZaQkM3VGlzUVlCK042a0VaUnRMS2hSRVJxTy9Gb01sZ1FFOG5wWHd3L3N4TmlnUTlxNHF5dXdsbUVZbVpubVJIc2w5TWtkQ1MrVVZ4TDMyRXU2K01DTDNiQ1FISVFqMVFhWDRoQTV1cEpMeFVFSGlGNGF1ekswMjZneEZ6aktEZzdXY2pETW40N1JaaHRzayt2RjNDUDJMNWdDcDRaMmxuUWswSGlGZk1URGNxNG9xWGNaMHF1d252UUk5Vk5nWGxrbGh5NkZjWkRPRyt3NmJweUQvc0xwSG13L1l5Q0NyMjdZMitIWlAreUxZSTBNSHVDZGloQXRnRXduWkNWNVd4QWhCS0tPWENwRmFZb0ZpWDNLUWl1US9PWUtlWlFXUVBPcEFXTng4NVl2YjN1bzVXTklUZzBGNm1aSXdpcW8xaFFnSlN4bU50MEpXRnRFdmNoVFdrclB5aTF3RDFIZThlbU5FUm5WdDIxN3BxNGtNWmg0WUVyb2ZoQnlsOTZaS1ZkY21NaElJNVEwcUk1ejh3V0E0ZVY2MEM3T1o0TW9yelVUS3pqdUp5NTJhc09ZRTdSd2lSclRGRkFMRUtKbGVWVXlPamNXZlJDWk1TdzZTTVFQZ0RGKzdjbUhQWDNjYy92elovYzAzWG1IU0U1dy9TTjJ2Y3VVdnI2cEhqQ2R5cWt5a2xMQ1djMnpzWGNLR0k3bmdRcEFEYTNFYUdOcVRnbEpJQXAvQXNRTk5VbVBUdHIreEZqdys4dmdRRlIxUWdOR3k3R1lDUWxSZ3kwd1NycCs4Z2VJSUREeXNvVHAyMkU4Y1cwZmpzYzRORUc1NGZUZmxXclZuSmpkVnREdGREN0pMR2FpRXZkNnlqSnNCN0ppaHNIYnZHZE9qS2hta3N5Q1RLTlUrSEhTdjRtUXd3R20rVFgreXRXRWpOaG1Kb29GeDFnczFmRkdUN3VIbmtOZkp3M0tkSUdWY21EMHVoTWJjSWloTWlCbldhOG1LU3FXTnl1T0JtVmZLSEIyRE5zWlR0eldJa1JyWDFQNEt1S3hTTGZlT3JrM3lHV21PMzFQeGtmalJOaHpENXo0Qkx3cG1JenUxVmNmUEFIMnFEUU5IUU5sUnV3eFFjM0tKSHFnRmNlR2xxdDJVM2hsd1dERkJmSGhHMUlnSzl5U2p0T3diQWdtT2gyTTJVTHNrTEZRSmlGL0ZPYmwybVZUVUlZemJ4dUV5VExOWHBxUEZWSkFQU3U1VzRPQmxxcEtSRmRyU2FkcEpDVWM0Z2lpNzNTbkFNTUNHeHNHTzUxSzg0YW9YRDhmejUzYXM3UEhJU0Z4WVZGQlNGV2hGbmh0R3haQm1NZ1c4ZCtpSmdVMEdCNEhhdXJGZkFBUE1wbklmUXMyUGlYc2FVQWJVckZLQXFjaFVieGwzZWhVM1ZBdzFkTHNqRU10WlNFVWlKK01TeHpiOE9qUFVDSVBKZEdPd3lwK0tsWHgyZjNyRCs1emJVMEUvRVZ6OCtWWDNlVG1yQ3dFMUxNd0hTR1MzZVZrODhzYzg0L01iRWRyMGRMNW9pZUFlaUpuYlNacFRtU0JBaUh5cFEvVW1WbzJsZWMwT3NvbWdjdVN4UVM0aXZpZ1VIU3EvQmsvVVJ1SVpBOENpd1FHbWJaRUloVm81b2x5dXQwbHNFQkJYU0pUV3lXMHJ0OFFjVGZTemJhZlMxbEZUeVdpVmNGUlJDVzdXUHVrY1FsR1lrclFQNUV3STZQa0JBSWoxNEdtR2hqeEFTRU91Q3pFS3dqNWZqUXJLaFFraTZrMGJoVHcvZEE2cFFKdkVnOTVUQ1Q2VU5NK0xXVXJ5SEtqL2hoUW5UUnpBak9KQ1pHUVlhNm1LZkRHSkFCTjZmV3RQRWZPOGt1MkNMa0U5TU9jZ1E1QnBTVlBrV0RFTHJZNnR6UU95NUx5WjU1SDl2NC9XbjgvdS80clduK2pRaFY2QUlONWVpQkQ3djRtbURmZWVFYkJ2MkJZK2EvRGFHcG96djY0ZWRLNTMwaGp3TjRZbUxNZ1dhWXBya08vcnVKVlUrdXpwWksrZXlibThkdW15OWhDS1pEbzZuaWtoNVRyNndxbkpETmdadUJUMVRYalY3R0FYZFdBWXd2dW8xWURBQXluNHVZbG5EYjFMM2xRVllWR0MvYUliTnhZQzJMUFgrWUF4UktQYVJlMGxoTGxLdjlNRFJoNlUyRVc5VW9BQXh1eXFrMkdzMGh1Mlo5WlNGcE5SMFVjc09KTVdzV1RBd2xqTVFGTjdCUkorcVdta3k2V2lBZmpPUGdUNHhBVm0rQm9JeG9iaDQ5Q1RDUHZ1d0JjR3B4M3FITHN1THEvWjFRZ0ptdFhOY3NGYURYdkthbkFYVlJYVTB6bTFTZEJVNXNYVEkwbVN3ektqaDAvdFhiMDZuVkRFdHZMb1VNWlJGWWhIcjFlbHZmREs0dkJ2VUwrTmpPd1psOGxFQTZwTHhtSEk3OXUyZXdWeCtiSmpyM3F2SFd2RUlhbEw4aUI5RzFCdnRjYnBWUWRmb0FKK0FmcjdDa0Qzdnc3bG55TllZdlEzSWZ4THhlMkhFUDRSNElnVE1MSWhYbXRSaTE2TytHUDhlQ3lMOWNaS1Y1UXZENDlWcTdhckhEaUMwQlBCWHFVY25FQkNBN0lBMEZtTVdBaHRsM09oczJ0bFBWdkhmS3BYRWdFYXVqb3NKcm9ZMHVFMlBWZVZabUJORUFqRVMwdVhaQVdYQ2hzcDVSclVNdHp4OUFvZG1DaE9ST1lHYUk4d1Y5eFZRR0IrSkRlcC9KaXZqRmhxVE1DRGZSekgzUklXTXoyQ0hLZ1lUUVc4aFRoT0ZRVzBzR1RvRHoreHlsME5mYUJjVWsrYi9pNFFEbjdVWmtkaE5SSFNZemdWR0Rmeit2YmEwVWZoVTZYRURCYis3OXB6ajNIWHJkUlZxVmNEa0xTZTRoNmlHckV3d0lEQVpNUFBVSHA3WlNwOFJZalNYZ0psOGxON250eWxvNUgwczRDOHVxbndmSmdXRmF0dHFQMk5WR3BnZG42ZFl2QXl3a3I5a3RxM1N5Sm5pQU9Sb0oyREE5MWpRZkVUSktSeVFyWTlZNzE0WGxENFlwM2RaTFZtdW42cGxRMmxzeFR6MVlNRzZyVWlzQzdTWHAxN3ZxdXZpMUVBYVVubVVBb0d4YzZUcy9MWmVRekszbFBjYnpxM0VDZm1GTy9lRmsvelF3cjhLY0xkUDAyQlAyV0ErNjY1SnpGQWtCYjFkQmdxR1hhQ3R2ZEQ5TFl3SE5BaUdNZUhvdWJWWDZEZC9RdTJBM1NZWmdUMHh1Z0ZtZTBBNmswWUwycm5IaVNESDhwU0dHc24vVldkbVdXbk1pZ3NnRGd2U2QyQ1c1b1dUUXhvRXZwRkVCZEdaT0g1MzJRRU1vRGZWSG9sSnF3a05WV24xWWREemtFcEV2LzFxcHplRVlKamFkZGhFcG5WdDZGT3kycTNSSVhjQVJtbjlvNkkyeUVzWjl5djU4Z1ZiUS9rR2xscGhuWXpTWktsdTVjaEdncjNLNFhuQVJ6NUJtRzZNdGsyY05Zd2lYWlF5QWk4T0NEZ3VBcEVQdFJPY05ET2ZUTFJST0JjK0xySURYaUNKSDBhZEhMZ3pqQ1phckMvZzhyMVhCZ3NaZ3hqUG01bjlmaU5PekxlRDhIRGk2OWZTNVZFeUdFOHo0cDFxUW5CMzlYd2VSUExJUUhQOGhYYjBKMTZOUndqVi9GdG1rcHBpSDFTS2wzMWNRSHZ4eWNtekFoNEZXYmc0bnlueWc3RStWQmhiRFFQd2krR2I4QUlwa2ZvcmpJRDZRMVdvYXlERGhQY1h0UkFoc0kyNld2dHA1ZFpBMDRWRmNlanFYOXBrQ3BxMDU3TlpkYnU5bGZ4dnIzSkRLc1hpSndwYWdHTTJpVkkya0pLNW9XUWg0ZjA4QTVvQmFXcENXUEM2QUNucXdoVFZvL3BobU1Cd1NVZHBkTTFVVHZjWGZYNkJvWXZoQ1NlQW9TZWMzejIzSHRWblhSMXRDcHI0bkQwbURVY0VFYTc0dFhCMWpUN3Q0MzRmL3paL2MwMy9uRUhRUGNSVlJFV1RLdWU4Q0hMa3JTQjFaQkJWYVVpZ0swQUtPUjQrb1doZ0RyZDhMRko3RXhmcUFOWm8yL3FjQW5DeXF1aUZyMmFraEhLUkhMeWFpbFI0MnBHamVGYU1IZG9LQndkWWw0ZEhPRkQ3VGd0Sis5Y0IrSGl0Vm1POThSMnQvcXFWTWdQTld6TzlieDhYZ2dSd2NMeE9EYkFDcDkva0NBNGNpSTU0aUN6Zi80WWVKcnFBdDdJNGw3VTF4WXlENnYrWDNnTGd0S21xVFFMa1NvMkpaRUo4UzY2emt3WjVsaW5uMWo4cmtNNE5ZbFFoN1lsVmluaSs1cTM2cDJLZnZTYVFmYmhxS3JZeUo1ZHkyY1hJZGZrdUVtQlVQdkNlTXZLWFczWXNCTFlmdVk5SUhhT091eWdBalhMUVpseG4wL0hGM0NHY2lkLzhUelp1Mnp3NUZveUorcmdYYzE0WjFRNXdSNnA2RmpLVklzaGRwODFTRExDWktHRnZYYnpReTF6K0V1Zm5IeWtSL2g5K3I5UldsbU44aWdPaTFQWlJxWjNiYXRVQmM0ZUxLaTZMMEUxa2tBZE85QVpDQnUzazlLTnpXdDdxNmszbDh4Z210V2xIZFF1aHVPNEFXUzhJbUlzanFtK0RrSGtyRnVnVEJlYTB6ZWJ6dmZYTFhLMGN1b05xLzlXWW56LzdQNXZpZkU5TDl5M3hBajRST1EvRGltRG1BaVRFVjRESWw2M3YrUkltREg1WmRPUk1lU1pybmVlMTlNL25JREFOcjREYVFMOXExdU1EQXRMNHFsK2RoamVQOFJyQm5JMlhDQ3oxaVFMcHRwTWtDREVmbk5lTGVzSXlzSnRPOXgyY1l4Uk85SE1jbzNxdGNjcTQzNGFjWVBnWW1JRFpCUUdMTUZkV1NodHYrQ0VBVFo3SGVuWUdwQmQ1MTlBYVJSOEt3akRZUXVGQWZibWdsR0c3NU8wcTA0OHFPOXlxWFlHR3Vzd3lYUlh4MFJJdTZCR1dmamJBcUY4Y01RV2tBVHE0OWV1ZG9aQnNUUGNQaHZ1TkpQVUdWKzd0V0hwcHpiK0hlN0U5NW5nT1NRRG8yd3I5NzUwS0lYb1FkZGxGVVJpYndmazNXQnBxcXFXb1Vrd01CTll6VUdsaU5JY3p3QnJBTXVnTXpsTnRBTFM2cEQxS3VZYTFOSktVSEo1Yk5aTjRENUtOdXl0WHNRYk1wT2cweCtZbW1pZWFiN3Z1Q1QycFRJejRHTUptRzNFNHRYMlBNdDVYdTh6Q1NpTmhzcjBPZ1QwTm52RkVVZ0E1c2hVcEIzcTBvd2E1NnZpcXZWbEY1M0NQRnNOU2lUTStuREhVQ0VyVkpSbkp3cXpDdXIrMVYyY0hldG9nLzE2Q1pva210cXIwaXovcUl6ei9iUDdUWDNuZDlXZEgxOTdwUjNNSmRhdTdwWFJhWUFKeTcrQlhpa1ZNbWZzakFpMVFmd1VzbVpvbjlsT1FIR29LRmkwcDNMUVlIVjRTZTNTMUJhcm5YZnN0QXZxd2tmL3FscXBYaS9rSWRaYXh1WU1zU2JYQng1bTBlR0tpVUFDSmtrVVFGejFRM0JPTFpPcS9qZ1NwV24vSE5xV0pBdmlBTFJVbFprWWFtUUYvZFdvUkZqaFBHVFIxTGFoUmxrTkhUV0Zaamp6SEFjVGxZNUdyVmpwUnBDQ20rUjRtN2U5MHc3Vkp4ekc5OUVrWlE5c0ZZL0NwTlNtUFdsWkJMZGhrS3J4b1AzOThBZGlxbm9XSzd5WllQSGFud3NKVk9ISGRCZjFJdllnWnd1blFhMkQvSzFIVUp2VTI1dkdheWwvYmJ4RFhiaDdhWWNReUZpWWtLRjJPZ0ZXclhKalRDTmNxNjNScXRhblR2UVdad3c4b3FEbTYrRFI5Z1N1NFNKOEhtVGhvZFlOUVdZb1BkakdDWllMQ0lKQW9ha3lUU1pLbTNxbmJVMFVkbVpBNnRBTjZqNWcrUkVRR1JOSEhNVStJQ3BtVDczdGlHcXp0cU8yTjlvcFVYS1BVSWFlZFg0dHFXVzlkWjlmNHgzcUtlcmZDWnlRNzBGZ0NDM1JtRnhDeDRWVy81eXAxbEZ3U1Voc0kvYldTU1lqbnRYcGkreWRiK1dtOW02VXpGV1ZWUndMTWhuUWp4ay9nSEpYR3l5cE91L0NIRUpJa3UvZGFZOExUWUdzMW9iSzdDM3F6SnR3ajF6Z3ZlMGxLNTRuZ1FVNm1ZY1c2dGxYblN3ZFBJZk9rTEZzSHU0L0Z6T29HckpPd09tSVUxRUw2NmhLNDZQakJkdFFRSFVQMU0zU3h1THJuK1NCbm9FSWtsVEFpc3NxSGswMVBZTVcwdU9NQ1FPcHBuVWdub2pCWUNObW9UM2VwZlhzQzdCY0c1Vm16Qjc0Q0FDR0Zwd0twZHlmaHdyYTJsSEpDOEdFNmxWanY0NVlScEQxblJscDBrb3czSXJxUWR3cU1QU2tZelh2b0k1TEJEcldnMkFHakRUUUZkV3NpWXdqdTNsc3hXc2lLRkYraGJRaGp6K3RuQmVWM2xFUTI3VHBoUlZkcWF0QndWVG9najJLOWlCMStvL2swNm15cmhhY1B4dzZlSi9kcnkvTTlMdWQyL0UzcjdPZXFKdUdsM09laHdHc1ZJWll0aEljcWJOaHBZeWtVd0ZFWEs1cUdBeXFkTUUzcGlOanFGQjd1L05xTURiWkJ2eGE4Tk5EMTd2TC9jazZNamoxT0VpQmJqVm9TK3NPblk5VXBJV0c2RDFGaUtCK1ZBbEV3cHAvZEtkOEpXWWovT0VKTGtsVG5lbkQwbGlvUjNaSnZXMUJGcStUL3dGS1U2cGxqQmp5QkJ0RTdzdnZ1bFdJYS9ScG04QU5ZVUZXdmdYZEVwa1o4RUM4SWdrbTRwVU1XOEd2cmpPTVlhc3JDQURRMFNBQUQzMkViaHpLcGw1UVFLQW5qMDBFR0dNeDlWdXk2T3Ixd0hsbEhXdTl3TjZWS3U5bElLWHFhK1VOd0pSalBkU1RyejZucmEwUzFVRUtRT1Y1WjUvb1JCRFFncDdneU5vaU9XV2xwb1MycFdoYkpZc09RanU4YnFoZGxuT2hYOHRXUjdqc3ZGdzdzNnp6NklTMkNGdzFBZWd2cVdhVFg2ZFJ3QktpME9mcmlZaFp2ZmxKaGpBeHYxcTJPc0xNVjgzbXI5T0NwQVFtY3RvZEpVVGViUjFuSkttNmpuUXd6NkJXeXViVWRyaW5BcWRtZ0hyeCtKTWxCWnNnVi9XQTRMcTNmUHhsRkNTY2VvSjdmM1FFWi9LZHFqT1hJenBDVTZrNm5ncHJhalNLa24yV2Rmb0wycGl2c3E1TmcyWmJBZ3ozUEpwa3ErcUZFYVFsNmRVUFNVNHY5VWxqL09QVjRReEYvbFRmb2piODBIdUd4b01UWm9TcEoyK3BZSGw4aldGTFRXYmM4YlVFT2ZKYkoxNkFFU09KbDFwSWNBWjNFMFhhMXpxZlFqNUNPd2VVS2dZcE05Y1hzNHhlclZERFZlRWVnbkxJNmxkcTBqR2Y1RitQT2dDS3dQQ0FUWHp0MThoS0tPa2RTbjBIVU9NZUNSZmVXTkt3SlpGTHhmZlB0SEdJVWU3MEMwT0hIZ0tGck9PSE9vWHhyaW0yQUxOUk9HcjNVUmRNZm0zN09nQlVNNGJQZlc3WnNEczZqRHQxSXJQS1BvMUlNbkQ1dzRyc3FlMHJJcDI1YjZvMnZPTy8rTTJyZmpFR2l2U0ErNitPaGJHc0N5dHdHZlJnRFVHSkZnT0dMUmw4QUhleTNNanR3OCtsRjFzNmp3bHA0NGFJYWxYUTNLMDZKc1BVa2lKODVKdUhSQU9Qang2b2l6TUJIeUcyT29TOVBBeVdzR3ZWcDg0bklhZ1FOYjQ2ajNNaytIQnJ5RTFDZmFwd3k5QkV0NHhZUFFWNGtJSk9QeXBRRkIwUDFXN1RodmtCWmxSOEVsY1dMb1I5a2xiRHFmMEJsbjlDWTM3aWc3dENYYkNZeUphdFZsbGhFNkZCSjRlWkV4M3pHMkFHeXorMFYySWVvRjBCa1UwdUJ6S0FuMkx3T3BhbWszaDRTdkRvNkt3bllZMmhWSU9LZ0UwS3RLbUFYVnRXNlRjRHNXU2Nqa3NPbmhwSm9VS2pqb1MrdmdmVVNISkVBaDU2WHZWbkQwQzM2VmlnTkl5S0ZzQXFybm9kblJiczZ0WEkxbHFHSjBhWHpIdE9Tc2VYUnlsdXZoTURLZW9hZ1ZVNjc4ak11a1huVUxZUkVzZ2l1Smo1eWZtZGs5Rk9USTA0eXFzeXM3cXh0UlBzSkpTaEFyVlNWMG1GaGVQV3I2MjU2dDdQcWhudlpFK2JBL3cxcWJ0S25TaWlKcEFjeU9rZ0l1SHRWRGNKUnljNU1zR1RtWVp5RkU5eEREV3VFUW9vdEtRNmRiaXZaZk1wYlZURzhUcllyK28xZEp5bVcrQ2xLdlBBSGdZMEpqa3E0TEV1ZFUyVHJvcjVPS3NpVmh5S2VyRFBmblpXUjR5QlJPS0N0OEhTMUZRKzlRc0lNaG44ZGo5VnFpUFJaMUNIdGFvWHFBVUpUOVB2cUNEUmdITldpNFRTcjJKSTZxRUVhaGtkV1ZSUDJhL3lBKzljRFdRTzdmSEx2cE80QkUvU01ic2RtZVdWdEJzY01KVUhZYTBUSS82QzJWT0hYL0Rzd09XNGI0Y0JPNG84TmtuUXE5TkdOcE5hM2wvZktObWdNMk1BMXdGOFZWS3hMQVJ0RmFiRmVDUEJDaytQTDBtSzN1NWYrWDZ0MTROQ1dIeTBCNlJxcVByeGRWOTEzTTJueG5YdnQ4SHk2KzNWNE1ZQWpyUXluSy9EakpMd0VSdFE2K2Y0cTlyaXdOSmZ5NGRwWktVWk1ZWDF0VDdHVWN5OFpWV2hhMG9KQnBBa0xjR2l1ZzY1REc4SSt0ME5ERXZLZituM1ZEUzEzNm9TRWdSTmJZWFArVDRjSGNnVDFkR2lYc0pRbEJmSTNYY20wZFRPTlB4K0hjVTZUbjNlaG9yWXB4Nk5pU1RmMnVrRE1Kdk9WbW9mVUlDdlg3WUJaVmJwVmNFT1VlNjFKNDRDdU15eG0xN3RPUGhzOUJiNkJBcDg5SU9LYVdyQzBXWlBsM2dGMThBNFJOZGE4QktvNjBkUEhTK042QUVsc3RPMlZ3T3pXYURYdVF0dlgyL0kwVVNHS05QaWlqb0JIMUdFb0tFZUdROEU4Ukh4YXFXYVJCakxrVndSUEwvcUJhNU5PeHc0Zi8wK0RaVjJlbEVsQVJhRUVvUE1VOXBQaE9GZHVWL2ZYN1VBMlQwQlczajlKaWhTTEUxQ0Y5dXVPcStsM3hRUTlCdCs1dGF2cGpBVTMyZzZFM3VmTDcwSFVia01TMFYweEs3K28vZFRyNTZvSTlmOEd4UmxUaEUrVFM1U3BlOGhRWXBxNE9uUnZWM1NRRDAvckVaUVh3eHhhZzd1bklvUUpDcGZxS1g2ODdzZmpuNnpDVzlhOEFzb2RaZHlHclFoOVhFZFcrY0tjbFRic2s0R0FhNk9XZlNNWXVoWDZhaHpYNHAxZkIwZ0lNYUFDSXVTblRtclpCckhmTXo3MlZmbFdkUnZ0SXduZFgzamlmRHFhbU5xS01BSVRPdHdJaUtWbU4rVy9ZNkNmR2d2YWc5NnBQU000SDZTRnl5RHdOVTA1L0NDQWREV1daQ3NMZHd1Y2FIZnpoV0NUcXFvazZRaE1WajhoYmhDK3Bhalh5S2hCaEIxV09nYjJMZ1ZuRndxNGs2VHFzNHRwbmF0WFpaK3BZYzY1L1Zkc2E1T0M2SmxtT2hjbFVncmFhY0NrR28rZVQyakF4SzMyczlYMExtTmRGak5nUk5ucHByeVE4ZHcxU3ljVkNNc1BESkprTFhGcVpOeE9qTHoxNi9NY2dpRTlmZVZJUndqNXRUOU45Q3V0aGpnNnQxNEFBQUJnMmxEUTFCSlEwTWdjSEp2Wm1sc1pRQUFlSng5a1QxSXcwQWN4VjlUcGFJVkJUdUlPR1NvVGhaRVJSeTFDa1dvRUdxRlZoMU1MdjJDSmcxSmlvdWo0RnB3OEdPeDZ1RGlyS3VEcXlBSWZvQTRPVG9wdWtpSi8wc0tMV0k4T083SHUzdVB1M2VBVUM4enplb1lCelRkTmxPSnVKakpyb3FoVjRRZ29CODlDTWpNTXVZa0tRbmY4WFdQQUYvdllqekwvOXlmbzFmTldRd0lpTVN6ekRCdDRnM2k2VTNiNEx4UEhHRkZXU1UrSng0ejZZTEVqMXhYUEg3alhIQlo0SmtSTTUyYUo0NFFpNFUyVnRxWUZVMk5lSW80cW1vNjVRc1pqMVhPVzV5MWNwVTE3OGxmR003cEs4dGNwem1NQkJheEJBa2lGRlJSUWhrMllyVHFwRmhJMFg3Y3h6L2sraVZ5S2VRcWdaRmpBUlZva0YwLytCLzg3dGJLVDA1NFNlRTQwUG5pT0I4alFHZ1hhTlFjNS92WWNSb25RUEFadU5KYi9rb2RtUGtrdmRiU29rZEEzelp3Y2QzU2xEM2djZ2NZZkRKa1UzYWxJRTBobndmZXoraWJzc0RBTGRDOTV2WFczTWZwQTVDbXJwSTN3TUVoTUZxZzdIV2ZkM2UxOS9idm1XWi9QOGE3Y21MdzBYeHZBQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINUFjQ0VCOGZCVnhIdEFBQUlBQkpSRUZVZU5yc25YbDhWT1c5LzkvUG1TMDdrSVd3aE1VRUFSRUVwQVcwSW1vUnBZcTFpRld3L2tURnVyU2lYY0M2ME5xQ1hiRDF1dHdxV21xeHJkRDJJcmRYc2JUSTlZcExDeWlpVXRrREVSSWdlektUV2MrYzgveittSE1tSjVNSml5SWs4THhmci9NS1pDWXprek5uUHZudVgvSDlyMTNBbXExVlJIMTlHVGJ4WnVaZCtBRzN6MXRGMFIycldEdHZHRkRMaWhuam1MZGhISXMrV003MFBLRDhHYTY0OUZIS0wxM005bWNuMDRxZkZiUEdNdS9OMFN6WXNKd2JpdXp2UnlsZnNZQ0hGci9DNWowQmZJVm5NZjdtZTdpbWJnRjMvQzdLekdVYldUaWVMa2s0SE9iQWdRUFUxTlJRVjFkSFkyTWpUVTFOQkFJQldscGFDQWFEaE1OaHd1RXcwV2lVYURSS0xCWWpGb3VoNnpxNnJoT1B4NU9IWVJqSnI0WmhZSnFtODkvQ05FMmNoNVRTL2lxa2xOZ0hJRksvQWtncGhmWFNrMTlUdmlkMjdkcFZYRkJRME52bjh4VzdYSzVpVGRPS05FMHJFRUxrQXoyQVBDRkVIcEFOWkFHWmdOYzZYSUJtUFo0SkdFRE1Pc0pBQ0FoS0tmMkFYMHJaSktWc2tGTFdHNFpScCt0NmRTUVNxVGw0OE9EQmtTTkgxbGlQSXgxSHUvOExJVkp2czc4SElJVVE3YjQ2RHFscEdrSUlORTFMUGFUTDVjTGxjcUZwR3ZhLzNXNTM4cXQ5ZUR3ZTNHNDNobUhRdlh0M2ZENGZQcCtQek14TU1qTXp5YzdPSmljbmg5emNYTHAzNzA2UEhqMG9MQ3lrWjgrZTlPblRoOHpNekdPNDZ2eXNtenVKbXpkUFpkWGErUXhEa1lwOTBiZWVzaFd6R0R2dlRVWXYyTUR5Vm1YNkhJaXliczVZYmw1VnhCMnIxakt2aTcwN3NWaU1Bd2NPY09qUUllcnE2bWhvYUtDcHFRbS8zNThVdEZBb1JDUVNJUktKSEZIUW5HTG1QRXpURkxiQXBZaFpHeUd6eGNrcFVxbUM1ZngvVFUzTjRKeWNuRUZ1dDd0TTA3UlNJY1JBSWNRQVlBQ1EwVWxPY3dUWUo2WDh4RFROQ3NNdzlzWmlzVDJOalkzbEF3WU0ySjBpY1BJd2d0ZE9BRzNoRTBLMEVUcE4wMlNxeUZuQ2xoUTU1K0VVTjVmTGhXRVk1T1hsNGZWNjhYcTkrSHcrTWpJeXlNaklJQ3NyS3lsd2VYbDVkTy9lbmZ6OGZBb0xDK25WcXhkOSt2VEI2L1VlVnRDMnJuaVJsOTVjeFlwVmxReGI4Q3JMYnloUktwWUdkeTNRYWxodFpmSHYxaFBqTEM0Y1gzVGNCR3pyTTNOWlZqS1ArVk5MOE5uZkxWL0I0blVCNkR1VlM3dVlxTzNmdjU5RGh3NVJXMXRMZlgwOWpZMk4rUDErQW9GQVV0REM0ZkJoQlUzWDlhUjFsaXBxNmNUTXRzcHNZYlAvS0tVUnNqYi8zN1ZyVjg4K2ZmcU04SGc4STF3dTE5bENpTE9Cc3lENVZuUm1Nb0RCUW9qQnRwQjR2VjV5Y25Jd1RUTUtiRE5OYzJzOEh0OGFEb2MvM3JsejU4Zmp4bzJyc3l4RktSTW5TdHIvZDRxY2xGSUtJZXo3SkFYT01JeWs5V1piYzlZaE9oSTVwN0NacG9tbWFYZzhIandlRDE2dmwzQTRqTS9uSXhRS0VRd0dhV2xwSVJBSTRQZjdhV3Bxb3JHeGtZYUdCbXByYStuVnF4ZjkrdlhyK0xPMDZnbCt0NzZJY1RjL3laTksxRHEyMklaY2NEMlRKdzZqaUZvMnIxdkRCMVZRZXZOU1ZzNGZUOTV4ZVlwS1ZzeWF4cnczL2ZRZE5aR0pvMHZBdjVYMXIyeGdUNnd2Vnk1ZXlaT1RpN3JFeWFxdXJtN25kalkzTnlmZFRxZWdSU0tSZG9KMkJDdE4yRzVuaXFDSkRxeXlkaGJadGRkZTYxcXlaTWtYTXpJeXZ1Qnl1Y1lJSWM0RkJwOW0xL1F1MHpUZjEzVjlzOS92Zi8vclgvLzYrK3ZXclRNZDRwWVVPU0dFbWM2aVMyZk5hWm9tMDFoeHVGeXVOaUlucFNRckt5dnBuam9GenV2MUpxMjN6TXhNc3JLeWt1NXB0MjdkMnJtbnhjWEZTcUUrcmJCOS82YXZzRzc5TnVySXBiQnNORk52bnNjOTA0Y2RKMUd6cVdYOWkwK3dlTms2TnBkWEVhQ1EwdkdUdWZtZWU3aGhkT2NYdGVibVpxcXFxcEpXV2pxM00xMGNUZGQxWXJGWTBrSkxFMGNUempoYUdzdE1wSW1YMlZhWitONzN2dWQ2K09HSEwvRDVmT2RwbW5hK0VPSThJRWRkMW0xb2tWS3VqOGZqNndPQndNYTc3cnByL1YvKzhwZDRHcUV6bmE2clErU2NjVG1aYXNtbHhOK2tsSktNakl4MnNUZXYxNXNVdUk3aWIwNzN0S2lvaUY2OWV0RzNiMSs2ZGV1bTNzWFBHbU5UdEtMck92djM3MjlqcFRVMU5TV3R0S09KbzZWTER0aUNsbUtkSmQxTWgwV0dVOGlrbEZwRFE4T3duSnljaTF3dTE0VkNpSW1BdXVxUDhlK1VhWnB2NmJyK2RuVjE5ZHNEQnc3Y2JvbGJPNnZPYWRIWjFwdnozM2FDd1NseVVrcDhQcDlNbDF4SXRkN1N4ZDlzNjYxNzkrNXRyTGQrL2ZyaDhYalV1NmVFN2JOeDZOQWhLaXNyMnlVSG5HNm5MV3EybFdaYmFFY3JhSVpoSk4xTTB6UTdGTE5RS0hTeDErdWRwR25hSkdDRWVuZU9LLytPeCtPdisvMytOd29MQzk4bWtjVTFVOFd1STVHemt3MjJ1d3JnOVhxVEZseEhBbWRiY0xiMVpvdWIwejFOVFM2VWxKVFFxMWN2OVk0cFlUdDJnc0VnKy9idDQ4Q0JBMVJYVjZkTkRoeXBmQ1BGN1JRcGlRR25kU1pTTExTa21JWEQ0U2xlcjNlS0VHSUswRmU5TXllRUtzTXcvaEVJQk5ibTUrZXZwYlZjSmEzSU9XTnl0cXNLNEhhN3BiTTh4QmE1STFsdnFlNXBibTR1ZVhsNTlPalJnNEtDQW9xTGkrblRwdy85Ky9jbk96dGJ2VnRLMkk2Ty9mdjNKNjAwWnl3dFhYSWdOWmFXeGtvN2txQ0oxSmhaTUJpOHhPZnpYU1dFdUZLSldhY1F1ZFZOVFUycmk0cUtiRXV1amNpbFduSDJ2eDN1YVR1QmM3dmRIUXFjMDNwTFRTNmt4dDVLU2tvT2t6MVZLR0VEQW9FQW4zenlDVlZWVlcyc3RPYm01alkxYVVkWlpDdHMxOU4yTnc5am5XbU5qWTNEYzNKeXZxWnAydFdnYWkwN0tkdGlzZGdyQnc0YytGdHBhZWxXaDhBWkRwRnp4dWJhV0hGMjl0UVdPVXZZWkRyM05OVjZjOWErMlpsVDIzcnIyN2N2QXdZTUlEYzNWNzFEU3RqYVcybDJnaUJkeHJPakVnNWIxTklKbXJOTHdDbG90cGl0V3JVcVk5S2tTZGU2M2U3cFFvakwxR1hZZFRCTmMwMG9GSHI1cWFlZWV1WEJCeDhNQS9HT1JDNmR3RGxyNE5JSm5DMXVIWldHcEdaTzdjU0NzdDZVc0FFUUNvWFl1M2R2dXdTQmJhVzF0TFFrWTJsSDZCdzRuS0FKcDl2WjFOUTBJanM3K3pwTjA2NEQxSlhZeGY4bTZyciswdjc5Ky84NmFOQ2diUTVYMVVoMVZSMENKNDhrY0IxbFR1M1lXMDVPVHRKNlMwMHNuSEhHR1dSbFphbDM1blFWdG9NSER5WmR6NXFhbWpZSmdpUFZwVGxFTGEyZ1dRVzFiZHpOVUNnMHhldjF6aEJDWEtzdXVWUFNpbHZaMU5UMFVtRmg0ZXRTeXJnUXdpbHdodE9DczRYT0dZZExGYmlPWW0vcDZ0NXMxN1JuejU1SjE3UjM3OTZuL1h2aVBwMStXY013S0M4dlo5KytmUnc4ZUREWkV0WGMzSXpmN3ljWURDWkZMUnFOcHUwZXNBWE5FVWRMSzJnMzNuaWphOG1TSlRlNjNlNGJnUXZVeC8vVVJkTzBhZm41K2ROaXNkZzdPM2Z1L1BNdHQ5enkwc2FORytPV20ycElLZHRsVmczRGtLWnBTazNUN0Zpc2RKWUV4ZU54NlN3WHNqMEVaeWpFL3FOci94RU9oVUxKZHEyeXNqSmNMcGNTdGxPZHBxWW05dXpaMHlicjZXeUpPbEt4YlJxM1V6aTZCSktDdG1uVHB0d1JJMGJNY3JsY042RnF6azR2OTBlSUwyVm5aMy9wWC8vNjF6Y2prY2p5WmN1Vy9lVzIyMjd6VzlaYnZDT0JrMUpLUjZHMlUrQmthZ3VlczlmNFNBSlhXbHBLOSs3ZGxTdDZxbEpaV1VsRlJRV1ZsWlZwYTlQU0Zkc2V4a3BMRzBQYnRtMWJqN0t5c2x0Y0x0Y3R3Q0QxTVQvOU1BeUR5c3BLQmd3WVlIK3JQQktKL09HVlYxNzU4M1hYWGRkb1czRDJZY1hnekhReE9HZmRtOU05VFMwTHNZdDYwOVc4bFpTVU1IRGdRRXBLU3BTd25VcElLZG01Y3llZmZQSkpzdUQyY0ZuUDFBNkNEdHhPTzh1cFNTbkZoeDkrbUhmV1dXZk5kcmxjczRFeTlmRld3dVlRTnBzOTRYRDQ5My82MDUrVzMzcnJyYzFIRURqVDBYU2YycmtnMDNVc2RKUTF0UXQ2Qnd3WXdPREJnN0c2SlpTd2RXVUNnUUM3ZCs5T3h0TnFhbXFTV1U5bndXMEhycWRJYllWS3NkSzArZlBudStiUG4vOU5sOHYxVFZUOTJRbDhZdzlCOVE1b3FJQndVK0lBeU95ZU9QSUhRdkVReU8zVm1ZVE4va083TFJRS3ZmRDFyMzk5MmVyVnEyT1d3TmtpWnpvRXpreTEzcHdDNS9GNFpFZjlwczVwSWZuNStmVHMyWlBldlh2VHYzOS9CZzBhZE5yVXZKMlN3bFpkWFUxNWVUbjc5Ky9uNE1HRDdVbzVVdU5wem9Cc09yZlRUZ3pZV2M1SUpISzl4K081RXhpbmxPWUUwVkFCdTljbHZoNE4rUU5oME1URTEwNGliQTZCMitqMys1ZDI3OTc5RlNHRW5pSnc3VnhVUndlRFRMWGVVbXZlVWd0NjdaS1EzcjE3MDY5ZlA4ckt5azZMY1VpblhQS2dvcUtpVFpMQW5wdldVVHpOYWFYWmdWbW4yK2xJREdpaFVPZ1NyOWQ3bDlYeXBEaFJiUGtyVkgxNDdFSzRzUUw2am9JUlgrMWMxb1FRWTd0MTZ6YldNSXdyYTJwcWx2YnUzZnVmVG9GTFRUTFlDUVpyV0lKTW1kOW4vLytva2d5UlNJUndPTXpBZ1FPVnNIV1ZlTnFPSFR2WXMyZFBzalhLSGpQVVVUeXRBOWV6bmR2WjBOQXdPQzh2NzF0Q2lEdVV5cHhBNGhIWThFTEMvZnkwVkgyUWNGZlB2UTdjR1ozcTE5TTA3U3U5ZXZYNlNpd1dXL0x4eHgvL2Z2VG8wZVVPZ2JQTFJBekFORTNUdFBkYjJObFR1MlhQS1c2cEltY253RkxGTFJLSk1HVElrRk0yN25aS0NGczRIR2JIamgxVVZGUzA2ZmUwNjlNNmlxZWxXbW1XcUNYZHpsbXpacm1lZSs2NXUxMHUxeHhBeldFKzBXeFlDb0hxNCtQR3Z2OW5HSHRUcC93MVBSN1A3RkdqUmswSkJvUFBUcGd3NGZlYk4yK09BYnBsdldtMml5cWxOTzF4NWxZQ1N6cUhLNlFLWExwU0VXZll4UmEzWTFza280VHRoTkRZMk1qT25UdXBxS2hJRG9SMFR1VklWNTltL1JWemlwclRTdE9rbENJVUNrMzIrWHozQWw5V0NuT1MzTS9qSVdwT2NkdnlQNTNPTFhYUU55c3I2eWZ2dnZ2dXhUVTFOVXQ2OSs3OWxoQWk1bkJQQmEwOXFUTEZnbk1LbkV5M0ZDaWRlMnBYQVF3ZVBKZ2VQWHFjWXNMbVg4R01VZlBZa0hzTnYvdndVU1oyb1JkZlhWM2RwcHpEYm1KUFYzVHJLT1VRdG5tZXhrclRLaXNyZXhVWEY5K3JhZHAzbExxY0pCb3FqajJtZHJSdWFkK1JKelNoOENuYzA0dDc5ZXAxY1RRYS9mWHJyNy8rdXlsVHBoeXkzRlBOS1hDSlhUVEM3TWg2YzdpcUhJMmJPbmp3NEZNcXFkQmxMYmI5Ky9lemE5Y3VQdm5razJRNWg3T1RJRjJTSU5WS013ekRhYVZwa1Voa3VzZmorUTR3UnFuTFNXVFhHNjMvMWcveDBJLy93YklHR0RmajZ5eWZrQWtZVkg2NGlZZGUzY3Y2eWdoa1pqTjY1QWptVFIvQ2FLc0hQTHAvTnd0V2JPR1Z2WDRDWkZBNnVEOTNUQi9MOU4zcllPekFUbjhLdkY3dnR5Njc3TEx6Nit2cm55MG9LRmd0aEhCWjdxbnVpTDBKWi93dGpjQjFHSHRMdGVCc2dldnlVMEw4NWF4N1pSbnVTYVBtc1FjZzhCSTNsNjVqNWtzYldWaTJsUmNYUE1UaU5WdXBpdnJvTzJ3aU44OWZ5QzJqOHpyRmF5OHZMMmYzN3QxSlViUExPVktiMkRzU05XZkdVMHFwVlZkWDl5c29LUGl1RU9JdXBTb25tY0FoYVB3aytkK3RyMjlrUlVQS3Rmdnh2NWp4YkRsVmVDZ2RXSXl2b1pZTjY5Y3pveDdXZm1jSUpjMTdtZlA0Tzd3V2hzTGlZb2JSeklhdE81bjNlSXk4SDdxWWZOYWhrMUxuZHF3SUlVYm41K2N2anNWaXYzbm5uWGVldi9qaWl5dUZFSnJEUFkxanRmTFprMFRzektsVDNKeGJ6NXpMZyt6WXNuTzRReXdXbzZ5c0s5YVpsN05pemh3V3JkbUczNWVMZStiTUMvbmRzamVwOHBaeTZRM1hjR21SbjNVUHpXTCtLajk5TDV6T0hTWGx2TEpzRlF0bitjbGJ1NVRwSjNtcDFQYnQyNU9GdDg2ZXo4TmtQb1d6MTlOUmw2WkpLVVVrRXBubThYaStCM3hCcVVwbmlDOXNiLzEzL1E0V3ZOcElMT1V1VzdmV0VzM0w1c0lyTG1mcGhCd0k3V2JXRDk3aHpiMzdXQjhhd3VTS2ZXejFaTkIzMkZoVzNub0dSYlR3L0tLWFdGaFJ4YXE5TUxtK29rc0ltNDNINDdsdDRzU0pZMnByYXhjWEZSV3RzV0p2bWlWcXR2Vkd3bkNUcWRhYlNJbkRrZXFpT2plbjJRSTNkT2pRTG5iaFJLSG9HdVl2bjhya3ZCVzRiNWwzSmE4dGU1TXEzMmhtenIrVGlaVHpUSGtkVU1yVWVmT1pOeXpLcFdjdFp0V2VYUEw4T0xZcm4xaWtsSHo4OGNmczNyMjd6Y0ppZTJ1VVBaa2pKVW1RS21ySmVOcjI3ZHU3bDVXVmZWL1R0SGxLVFRvUjlSWFdQMktzK2VzSGJLQUg0d2Eyc0tGQ1Q5NWwvTFZmWTJPNkFWQWVMM2tleUJzNWtiZEdwbnR3RjNrZVN6d0hqdTlTcDBVSWNXNWhZZUZ6a1Vqa2lULys4WSsvblQxN2RxTmx2ZW0wanNneWJFRnp4dDdzUWFkT2NVdGQrNWdRdVNoTkZlL3k1eWYyVWpqclAzbHM1dGxkcUJ4a0dOUG5EN09OdDNReHRqSW1Yam1LSjdaOXdPSXJ4N0ptMUhqR1gzb05NKytaekxDVDVJbnF1czdISDMrYzdDWklMYnhOTGVldzB0bXBXYzlrZ2lBWURGN284L25tQ2lFbUt5WHBaRmd0VXRHOW0xaXdLVUxmQ3laeWMzeGRHMkd6cWYxd0V3dmVhNloyYnhVYjRobGNlTzBvSmpzMzFCM2F6VU92VmxGWmY0ajFGUnA5eDR6bGpzRkFQTnBsVDQvUDU3dm41cHR2UG52U3BFblBEaHc0OEYwcjloYXpYRk1oaERBU2hscHIzTTNwbXFaTUVra0lXenhDM2Q0dHZMNS9Qd2Y4SnU2TVhreWR2SU1QUDR4ejl0bG5kOG0xZjJtVEI4UHVYTTdhMFN0WXR1dzExcTFmeDdKSFgyUFo3NjVrOGRvbm1YeUN4UzBTaWFRVk5idndOdDArQW9lbGx1cDZhckZZN0hhWHkzVWYwRWVwU0NjazBndzA4L3p5M1ZSbDl1T0pxM3VSdHlMOVhmMTc5N0Zxa3oveG43eHVEQ3RPcWNmeTE3Sm1Vd1YxQU81c2hwM1JMYkVJL0xNVS9IWUNORTJiTkdEQWdHRit2LzgvOC9MeS9neG9sbnVhdE54d0pCWnNqOGV5M29UbHNtS2FVUnFyeXFsdENxT2o0YzNyeWFCemh6UDIzSE00UzZ0ZzU4NkVxM3IyMldlVGtaSFJ0YzRSZ00veVVhTlJ3TCtlWitiTVpkRnJlY3g4Y2ltdmJsekxRNk9BdW5XczJueGlYMXd3R09Tamp6NDZiSjFhU2x4TnhHSXhZZmQ4V21hMlpwcW1WbFZWMVNjZWp6L21jcm1lVUtMV3VhbjkxMFlXVjhLNHE4Y3k5VENUcnN1dS9ocDdudjRHRys0OWk3TkMxU3grOWwrc0NUbnVNUGc4Tmo1OUU5c1dYTXcxQlVGZVcvRTZpL1lhcDhwcDZwT2JtL3ZUYURSNi82cFZxMHFrbEJuV1I5a0xlS1NVTGltbFpsLy9WZ3hOMk41TUpCSVI0V0F6MVEwaG9xWWdvK2dNUm80WXpCa0ZHZWpOTlJ3NGNJQ0tpZ3AyN3R6SlJ4OTlSREFZN0dJV202K0l2Rndnc0lZRjAyWlJ2bkFoZWJWcldMVnFIVnNyUDJCeVNTM3J5Z0Z2R2FOT1lMSWtFQWkwc2RTY0xWSzJvRG5IZDl1dXAxV2YxaWJyR1F3R0ovaDh2dnVFRUpjcTJlamtaQmlzK0w4REJJQU55MStpZEhuclRSdVcvNFVKKzcvQ3E1ZDVxZFZkNUJYa1VPUnhVVFI0R05lVWJHTmhSUzBicW1GaWZndVZZUU5mWGpkS3NzQlgwSitadzdKNXFUckk1cDB0Y003Z1UrWjBlYjNlMlZPbVRDbmR1M2Z2TTJlY2NjWjdWdHpOVGl3SUlZUmhtcVpwTDNodUczZHppVzdkTW1WTE1FSzRlamNiYXo4aHQ3QXZaV2NPWXFqRFhiV1BzODgrdTh0TUIzSGptOGc5ODY5azY0STE3Q2t2cHlwYXdwMVBMc1gvMEFKK3QrNTNMSTU1S1R6clV1Nll0NUJiVGxCVFVYTnpjMUxVN0diMit2cjZkdTduWVRLZnlYaGFOQnI5aHR2dHZoODEvTEZya05tVHNqUDdjS0VqNUZGYmVZaHRmcFBjNG1MR255RllzL3hsNW0yRmNUTyt4dklKT1JCcTRJTUdBQytGbVZDNS9uVXUvWjlHY3NkY3pGdTM5aWVQTU9YVllVQWpMOC9iNlhwR2o0TnJlc21BQVFNR05EUTBQSldmbi8rSzVacUtGTmNVWjl6TkZqbVBKMU4wTCt3bVBlZ0VBMzZhYXovaGc5b3FhdU9YY3FIVjJlRHNVVDM3N0xQcDFxMWIxNGl4bFUxL2tyWFRuZDhlejUzUHZzcWRKK0VGTlRVMWZXcFJjeVFKdEZ0dXVjVzFlUEhpSDJpYTlpQ24yVzZITGszQmNDWmZleW5Pck03NjMvK1ptZXNqREx0a0lvK2VsMG10cHkrRlcvZXpZZm5MVEhvdkgxOTFMZHY4a0h2bUVLYjJnaExQRU1hdFdjK0dUZXVZVkYxRW1kN01obW9UOHZveGMxZ21GQTg5NVU2YkVLS3NSNDhldnd5RlFuM0dqeCsvNUtPUFB0SWMxcHR1aVZreTdoYVB4OXRrVEtYWEszTUtlbFBZRzJMQklPNW9NNDJOeWJLUk5zZlpaNS9kNlVlT2Q2b1BmR05qNHhGRkxaMzdtWm9rT0hUb1VMK0Nnb0w3aFJDemxWSjBNWXFISnVhdUhZYWlMMHhrT1p0WXNHWXY2M2RWUTJZZTR5NFl3ZnlyQnlVbUZSUU00ZGw3WFN4YXNZVTFlNnZaUUFabkRUdUxPNmFQWVdvM29HRGdxWHIyM0ptWm1mUGVlKys5NHRkZmYvMDNsMTkrZWFWdHVWbldXOXkrWTdxa1F1S0xqOHpjQWpKbEM4M042WVhORnJmTzNGL2FhUVpOT2tYTnpuN2FvdWFNcWFXeDFPeldLTTAwVFJFSUJMNlFtWm41Z0pxWjFvWFpzTFJOOThGeHBjY0FHRGZyYzNub294MDBlU0l3REdQMXpwMDdGdzhiTm13TEVMV3lwanFRWEErb2Fab1VRcGpXZEY1cDdWU1F6cEhqOWtUZTd0MjdVMUJRUUs5ZXZaSURLenV6dUhVS2k4M3BmcWFLMnVIY1Q2dmZNK2wraHNQaHk3eGU3NE9veWJaZG16TXZnbzB2Zkg2UGZScmdjcm1tREIwNnRLQ3lzdkxwa3BLU3Q2eEVnbTI1SVlUQW1WU3dnMjZ0bGxzeUZzZmhqSi9odzRkM1NyZjBwQXViTTFIZ0ZMWEd4c2EwRXpwUzNNK2txRVdqMFJsdXQvdEI0RXlsREYyYy9JR0pLUnpIZThKSEo1L3M4VG5FM2NiMjZkTW52NjZ1N3FuQ3dzSy9TU21kU1FVZFIxTEJJV0RTY2wzYnFWazZnUk5DTUh6NDhFNlhVRGlwd3VZczZYREcxR3hSTzV6NzZSUzFXQ3gyaDh2bGVvaVQxdkNsT082TXVCcjhoNDdmVExZZUF4S1BlWm9oaEJoVVVGRHdVRk5UVTA3Mzd0My95Mkc1dFFsRjJlSVdqOGZUaWx0SG9tWWZJMGFNNkZTbElDZE4ySUxCWUllSmdqUjFhc0s1NDlNcGFycXV6OVUwN1NFZ1E2bkJLY2E0V2NkbmltNlBBVERtK3RQNVRCWjE2OVp0Zmt0TFMzWk9Uczd2blc2cFU3VFNpWnVkWEVnVnRGUmgwelNORVNOR2tKMmQzU2wrWWUxa1BLbXpUZW9vc3AvQ3VVSEtqcWs5L2ZUVEhsM1hmNmhwMmtJbGFxY283Z3o0MGgwSkYvS3p1Si9qWnAxeXRXdWZnb3pzN093SFFxSFE3VmRlZVdXMm8xUEJBN2l0VGdXWGFackNNQXpoNkZJZ0dvMEsrL01ZREFieCsvMDBOVFZSWDEvUG9VT0hxS3lzcEx5OG5JOC8vcGhJSk5JcGZsblh3dzgvZkVLZlVOZDEvdjN2ZjdjWlBlUzAxRkppYXNMZXlHNG5DcVNVNHQxMzM4MzV5bGUrOGlOTjAzNmdQdjJuQWNWREU3R3hVSlBWUzNxVVZ0bzVWNS9RS1I1U1N2eCtmNmV1OGZKNFBPZE5tellObDh1MWRkMjZkZkVPcG5mSU5Ja0RrZXFTT3ByczJ4eEZSVVc0WEs3VFI5aWtsR3pac3FXTnFLWGJKSlU2ZHNncGFqdDI3T2d4ZE9qUUgycWE5bDMxaVQrTnlPd09KYU1TSXVmTFNUaEtuZ3lJV1QyTXVjV1FYWmdRc2lHVG9QU0N4TStjUUxxQ3NBRzQzZTZ4NTU5L3ZpZ3VMdDcrdDcvOVRYZG1SanNTTjZjQU91dlpVZ1hPL2xwY1hIeFNSeDZkMEJoYlI3MmZUdmV6bzVJT0thVW9MeTh2Nk4rLy80TkNpTHZWSi8wMEpiZFg0bEFOY3A4Sm44OTMrMjIzM2FaNXZkNGx0OTkrZXkyMHhzNGNWcGxoR0lidGFiVkpLRGpqYTg0NG04dmx3dDVhUDN6NDhGTmYyT3pKdHgyTkhqcE04VzNTVWxPaXBsQWNWM0c3N2FhYmJpSWFqVDQzWjg2Y0JxZGxsazdjY0dSTE94SzJWSEU3V1pONFQ0Z3JXbDVlbnR3bWRmRGd3UTdIZWFjcjZiQmphcGI3T1VkZGpvck9TbGR4UlZQYzBqRWpSNDZVUW9oL3Yvbm1tNFpsamJWelMxUEVybDI4elhrT25PNnB5K1VpUHovLzFMUFk5dS9mZjlReHRYUjFhazgvL2JSbjVNaVJEMnFhZG8vNjZDZ1V4NStNakl6YkgzamdnZmltVFp1ZVhiMTZOZWtzTjlNMERXZ3RCYkhLUmVUaDNGR1h5NFhWcG5YQ3QxOTlyc0pXWFYyZFhKR1h1bmpsY0RFMVo1M2E3Tm16SDlRMDdmdnE4bE1vUGo4eU16Ty90V0xGaWxoMmR2WnZiVUZ6aUp2RVd0SnMrYWJKbUpzUVFqcmRVT2RodTZPMnVKM0l2YVdmbTdEWkc5cWQ3bWRINDd4VFkyb3B4YmNQcXN0T29majh5Y3JLK2s0Z0VJams1dWIra2JaWlVwbGF4R3QvWHlTUUhjWFpiS3ZORnJjVDFUVC91UWhiT0J4dUkycjI0cFhtNXViRHVwL1dLTzlrbTVUVlVhQlFLRTRRT1RrNTMybHNiQXoxNk5GanBXVzFTVkppYkphNE9TMDJJWVNRdHFnNUJjNjIyR3hoTytlY2M4ak16T3g2d2lhbFpNZU9IZTEyRktSYWF0WTJLZWNTWSt5Rks5Rm9kSWJWKzZrNkNoU0tFMHRHOSs3ZDUxUlhWd2VMaTR2L0xoUDlWMjArMy9aWGUyQ2xaYTIxc2R5Y0ZwdlRKZlg1Zkl3Y09mSnpyM0U3N3NMbUZMWFU3S2U5OTdPanliZW1hWXB3T0h5Wk5hVkROYlFyRkNlSG9xS2lvcnYyN3QzclArT01NLzZaWXJuWjhUYTc5QU9Ib0FsTjAyUkhjVFpiMkRJeU1qNzNNcERqS213VkZSWHMyYk9IcXFxcXBLV1c2bjQ2dWdwSUtldlFBb0hBRjZ4NWFtcjBrRUp4RWhGQ0RPcmZ2Ly90bXpkdmJobzlldlRIbHVXV25Oc21oR2hqdFpHU0lVMk5zN25kYnR4dU4xNnZGNi9YUzBaR0JnTUhEdXo4d2xaZFhaMFV0ZXJxNnFTbzJmMmZEdmV6VGF1VWM1eDNabWJtQTZnaGtRcEZwMERUdEMrT0dERmk5c3FWS3grZE5tMWFsVVBjcEdOMkc2WnBtbmFtTkozVlpzZmFuQmxTZTBMdjU1VXBQUzdDRmdnRWtwTTZxcXVyMnpTMU8yTnE2Y282cEpUaWxsdHVjVms3Q3RRNGI0V2lFK0Z5dVM2LzRvb3Jhb2NPSGZyWTl1M2J6UlJ4c3pPbjB0NHFiNHViTTVsZ1cyejJWNi9YbTNSSnM3S3lQcGM1YnA5WjJLU1U3VnFsbkpaYXVxYjIxQXpvNHNXTGY2QVdyeWdVblJPdjEzdmp1KysrVzVPYm0vdDdTOURNRkhHVHFabFNUZFBhV0c3cFNqOThQaCtabVptTUdqWHF1Q2NUUHJPdzdkeTVrMzM3OWlYTE9vNW1UVjVLQnZRYnFsWk5vZWpjNU9UazNGTmRYWDJvdUxqNDc0Q1p4aTF0RTNPenlqNlM0bmE0V0Z0V1ZoWkRoZ3pwUE1KV1dWblpybGF0ZzFZcDBtVkFnOEhnQkd1WnNkcjdxVkIwYnR4RlJVVjNiTjI2OWRDd1ljUGV0Nnd6MjBwcmx5bU54K095bzRMZGRMRzI3T3hzU2txTzMwYjJUeTBvVFUxTmFXdlZPaEExa2JLbFhUdHc0RUFmbjg5M0gyb0FqVUxSSlJCQ2xBMGVQUGlXRjE5ODhjQU5OOXh3d09HU0ppMjRsUHEycEV1YVR0aWM0cGFWbFVWT1RzNXhHeURnL2pUN0d3M1RaTSsvdDFLNWV3L1YrNnRvT0ZSRGMzMDlnYVptUXY0QWtXQ0lTQ2hFTkJKQmo4U0Vyc2VJNjNGaEdxYVFNaUZzUFQzaGVhSnAzNlhxY2xHY25FK3BCaTRQYUo3RXdFcHZ0am9uUjRITDVicDQyclJwRmNCVHRNYmJUTklrRTFMRnpabEljTHFremtUQ3lKRWpqOHYwM1U5bHNaWHYvWVRLcW9OVTE5VFIwTkJJczk5UFMwdVFVQ2hNT0JJaEVvMFNqY1hRWTdyUTQzSGljU014TmxoS0lTVmFySHIzN1VLSXU5UmxvamhwU0JQaVVTQUtzUllJTlVKR0xtVGsyZDZVb2dNeU1qSnVycSt2cnlnb0tQZ3JZSFNVVEJCQ1NEdmVsbXE1T2QxUnA3RGw1T1F3ZVBEZ0V5OXNCNnRyMkZkWnhhSHFXdW9iR21scTloTUl0QkFNaFFpRkkwUWlVYUxSR0hwTUp5RnFjUkl4TlNta2xDSll0ZTFDbDh0MW43bzhGSjFMNkF3SU40RWVocHllQ1l0TzBTSDUrZmwzYk4yNnRjS0t0NWtwaDVSU3lvUzJDZUx4ZURJN0dvMUc2VWpjTWpNemsrVWZ2WHYzUG5IQ0ZncUYrV1IvSlFjUDFWQmJYMDlqVXpNb01qSUJBQUFnQUVsRVFWVCtRQXN0U1ZHTEVJM0ZpT2t4OUhoYzZQRTRodEU2Z21qN2h2L3Q3dlA1NWdKOTFLV2g2SlRFbytBL21CQTNsK2R6ZjdwMTY5WjFtbC85b29zdU9wYTc5d1p1QXZhU2lMRzFFVFpBV2lWZHBtRVl4T054R1l2RlJEUWFsZmEycTVhV2x1UzJxK3JxYXFxcXFxaW9xR0RuenAyVWxaV1JrZkhwVzhXUFNkajI3dHRQMWNGcWF1dHNVUXZRRW5SWWFyRVlzWmlPcnNlRnJzY3hEQk5EV2k0b2lMSXpCbnhmd0dUMTZWRjBhc3c0aE9vVHV4Vk9BR1ZuZnJhK3lmSmQyd0h3OWYzaXAzNk1hTlc3QUZTZCtlU3gvTmdsWVRPMmJWRDU5MzlMWXF1OGdaMUlBQ2tRVWtncE1FMUpYRUxVZ0dCY2FDSW1OV0pvSW9KTGhIQ0pJRzZYSDdlckNZK25Eby8zRUFjWFpYSEdHV2R3NW0wZmZhcmY1Nmp0N2YxVkI2aXNPa2hOYlIzMWpVMDArd01FV29LRXdtRWk0VVJjTFJhTEVkTjFkRDFPM0RBd0RGTklNeEZYaXh6Y09VM1R0SG5xVTZQb01wYmIwYTc2TzQzSjFMemZlbmZnanllUW1NVGpBN3lXd2VTU1NKY0VUU0tGaVJRR2tqZ21PZ1l4NGtSbG5JalVDY3NvUVROS3dBelRhQVNwaS91cHJhMmxwcWJtVTcrdW94SzJRRXNMK3lzUGNLaW1sdnI2UnBxYi9RUmFXaExKQXFlb1dkWmFzbDdOeW9CVzczaXZuOGZqL3A2NkRCUmRpbkJ6SXNtZ09MeFA2dWsrNjltaVdiMDdFRGROZ21ZNnhFMlhwa2lLR3pvUnFST1NVVnJNQ0g0alRHTThtSFJQVzR4UHQ0RDVxRnpSVC9aVmNhQzZocnI2QmhxYkUzRzFZREJNeUpFQmpTV1NCYmFvWVpvU0thV1FTSzBndjhkM2dTK29TK0FVOHRhYVl3U2UyMEhrWDlVWVZhRXU4WnBkZmJQSk9LOG51ZDhjZ3RiTmV4US9JUk43UzMyNUorMDFmL0xYSjNtR2EvbjUxYjFQOXRuRDkvT2JLTGlpanNZeEx4T090ZDRpRUtNdnpSdnhkV3I1dGUyU1NqQ0VNNWtBMGtSS0F4TUJhTklRTGlHa1MycTRoWVpidXZDWVViekNqYzl3b3pVM2s1bVpTYVVlWWFqcjJFUHlSN1RZOWxjZHBPcmdJV3JyNm1td2tnV0pES2l6c1YxdjY0SmFHZENFQzdwcnVpcnRPUFh3UC9FeHdSVjd1NHlvQVJoVlFZSXI5dUovNHVPai95RTlyTjdzbzhDbmVXNStiK0JQSmpnc05pL2dBZHdTcVFHYUJHRkNXcGMwS25YQ1VyZGMwZ2grdjUrbXBpWU82VTBjMEJ1UHI4VVdESWFvUEhDUTZ0bzZHaHFha3ZWcXdaQXRhakdpbHFqRjQzRVJONndzcU9XQ1ZuNjh2cGZINC82T2V0dFBQU0wvcXVteXJ6MjZxZjdvN3h5UGRzbmZzZm9mai9EUzNtSUszSDVhR2dPNGgwMWtjR0FMZTVyOE5JZUxHZitObXppMzZQaG1mWHQ1dXQwRWZKek9hcE5JQ1VLYVNGTUFCbExHcFNrMFlVZzNjYUpvdUhFUmxpNjhwaHNSRE5MYzNFeXRIaVZIeTZDN0s0c3N6WGQ4TExaRXZWcE5zbDdORnJWRUVXNHNVWVNiR0JocHVhQW1walJ0RjFRVUZ4WGRDNHhSTW5CcUlRTTZaa08weTc1K296YU1HZENQOHBmdHVqRzJlT0dYK09yczczTHJ0eThuWStOYTZzKzlneHZ1ZUpDWlkvMjh2YTdpdUQrZlFJd0NwbHRXbXcvd1NpdldabW1OSUdHMVlWdHRjV21JR0FZeGFSQ1ZPaEVaSXlTamhFSWhXbHBhYUl3SHFZMzdxWW8xSEI5WDlGQjFMUWNPVlZOYjE1QW83V2hwb1NVWUlod0pFN1dLY0dOSmE4Mnd1d3ZzTEtnSUhkZ3hXZE9Fc3RaT1FVU3VwMnYvQW9aRTYrcS93eEh4a0oyYm0xZ2FrcGxQZGs0eC9mc2xmdWVjM0V6aWtjL054ZjdtSC8vNHgzUFR1S1IybGxTa1prbmpHT2pFaVVrclUycnFSQ0lSUXFFUVRVYUkrbmlBUTNvek5ici9zd21iSG85YkxtZzlEVlpweHlmdnJPS3ZmOS9BM3VZb2tWZzBVWVNyNjhTakFkSFU3Q2VzdDNZWHpKcHhqY3ZuOWQ2YjdyRTMvL1I2U3MrN2x4Y1BwTnhROXpJenpwdkdRKytsY1IzKzd5ZU12V2taNVVwVFRpT3l5UGoxTGZUWitUV3lDeDBYN0lUenlGOTlDNzEzM2szdmQ2Nm54emY3dDdtSWozUzc0dk9uVDU4K013ZUk3aGtPcTgxamhiMDBhY1hhWkVMWUV1TFdKa3NhSjBKQzJNTGhjS0lFSkI2aUxoN2dvTjVJWEJxZlh0aVNwUjBOalRUNS9iUUVnMFIwQTB3L0ZlWFZoR0s2blFVbGJpUk1kZGxhaUtzOTkvalA3d2ErM09HenhqNWswYTllcC9hb1htSUxhMVo5UU1uVVN5aFQxOHpwWXhWT21rQzNTMU1hMDB2SGtQLzBDRndiLzBuOVZYK2s3cGQxdU8rK25PNWZ5enE2MnhVbkJFM1RKcTQrNHdkVEhWYWJwMVhjcEl1a3VMVzZwRHBHNHBCeFlsSW5HbzBTaVVRSUdoSDhSb2pHZUl2bGtqWitPbUZyOWdjNGNLZzZVZHJSMUp6b0F3MkdpTVJOcEFEWmNwQ3F4b2pkQnlyaWhreTQxMUlLcEJRTjVSOE1kcmxjY3c3N3JEblo4TVovc3VpZkxVZCtoWFZ2ODlKN2c1aDVVUzkxeFp3dTVQWW43NEVCR0s5VllqcENlZTVKWitLcDNVbnpJOXVKYlc5RS8rODNhZG5nd2plcDcxSGRyamh4ZEhObDNmVEg0dHY3T2NXTnRyVnR3bG5iNXJUYVlzU0p4V0pFbzFGQ01rYUxHYUhaQ0ZFZmI2RTYza1RBQ0IrN3NGVWRTSFFYTkRRMk9WcW13c1RpSnJpN2taOGhDZGZYRWRUajF1REk1S1FTSVpGYVhwNzQxdVpsUHltWk5ua3lwV01tTS9hYWVTejZaOXZBbjNmZ1Zkd3pHVjc2NlhOc1BrSU11dmFOdjdQNUM1Y3p1ZkJ3NHJlUHpWdjI0VmZYVXljVHFCNTRKL1RGN1N3REczc1JSZS9kUU43WWprYlR1UERjUFlITXVrMDAvM2ZiVXBMNDB2L2kwT1Z2RVl1bC9JalBkVlMzZDBVR1hEM25VOVd3RlY4Mmoxc3Zzd2MzbnNtVmMrL21IR3RQc2Z1Y08vbnVOODQ1eGtjMGlQN2dlUTZNYUZ2RGRoajZucDh6K0dwU0V3bEN1S3hEUXhOSnE4MUlKQktJVzRrRVhkZUp4V0tFWll5UUdTVmdSR2lLQjZrN295L2gzMXhFejlkdlNoNUYvM0ZtdTNrc2JjbzlxbXZyT0ZSVFM1MDl0Y05xbVFwSG9zVGlFa3hCWmxFM1hBZWE4RGU3UkphM3RROFVpUWdmMkg1SjNhcjVkOHg2TnNZTlAxdkNzNE5oNi9LZk0rZit4emhyMVVLbUppL3dmQ1ovNzl0c3VPYm5QUFRjVmJ4NmQwZXpKZy94eWl2N0dEOXJMSG4ydHc2OHpZS2ZMbU56ckQvWDNQMXRKZ2VlWTg3U0ZzcDZ0N0Q1cVZFOCt0Uk1odm1VcHB4d3ZJVmsvZUppc2t2anhGZitrK1lOUlhUN3labXdKNHJyZ2JGRXZ2TXlMZHNOcU5wSDVOVW8rcDRPWWlWRHg5SjlHb1J1L1FDOWFGSktDTU5BT2dUUU5XRWNPZU9pUk83YmQzUzNueVljMkZmQkM4Lyt4eEh2TittS3IvSEY4eTg2cXNmMFhUU1FndWVtQWhCYXVZMm1INnc5OHM5b25wdmU2UGZBT3hmdC8ra21JRzRkaVg1U3BBbkNORUdBeEFCcElJV09JVjNFRVphd1JXU2NrQm5ESnlKa0dsNmFtM2JRd0Jlbzk0U1RHNjVpZGFPUTdPcFkyQTRjVEdSQm01cWFDYlFrQ25IRFlhc0kxNUJJYWFETERISjlRalJHd2tRMGo5Qk1LVWk4T00zcjlkNlZkOTYzV2JrOG43SStPUUJNbkhFNXc1WXQ0NE1LbURyQzhXU0ZsekQvN3BlWjlLdkhlUDZhcDdrbFhTSDQzdGQ1NmVBbzVwMmZrL3pXK3FYTDRQYkhXZGw3SzRzZXVJc1p1ZE41OXJtcktBUFcvL1JlWHRvNWsyRWpsTTZjOExqS3RQUEpxbjJUMnZ0aVpQemlNb3F1OStQLzFuOFQzZ1BpYTFkUmNFVVBXcmJYUWRVZUFqL2EwOEdqOUNEN0p5TVFyLzZkd0ljR1RPckFvbnZnZWdwbjVDTjhjZUlyLzBIejMwTEhjUHVwVDUvK0E3bi9rU2VPNjJORzM2amd3T0NuanZublNuMDlyd0grRGVpQUxxV01DN3ZPVGFLUjZFckFCT0tZVXBOQ3hJVWhSVHllc05wa25BaHVRbWJDSlcyb3JHSEhkUzhRenlobWVHYS9JN3VpKzZ0YVhkQm1mOElGVGZTQkprWVI2WVlFYVJDUHg4SG53eVVraGg3SHF2TFI3di9icnV1RkVGZjZDbk9vL2NkalRMdnlTb2FlTjVuU3kvNkREYkVZNlR6T2t1bmY1cDZCdTNuaXAzK25NczN0VzFmOUhmOUZWekhlWVlINXZGQzVZeDliZCs2bVBPb2xMN0NQeWdCQUMvNUE0bmJGaVVmNjQ0aWlIbmhIRmVQckMyYk1oNmN3OFdab2VTNWs0TWpaTE5mMUU4anQrd24rWCs1eldGN3RYU0w5dWI5UmUrMWZhUGpoTHVTa1NmUzRxY2N4M0s0NGtiaUVkdG1tZ1QrNXdPR1NlbHByMjVJZENaaE9sNVRFOUYxZDE1TmRDUkVaUzNRbEdHR2FqQ0IxZXVDd0hRbHVnSml1YzZpNnB0VUZEYlpPdzdYcjFlSm1RdGlNZUZ6RURZSEhKWVFSTjRWaENtMW9YcUZMYzdudkJDaGY5aEN6WHVyRndsLzlucWxEOHZFRi9zNk15YzkxOFBTRHVPV0JxM2hwMW5Nc2VtTjZxcXl4N0I4eEp2OXNGRTdQY3ZUZFArREs1NWJ4dTRwQjNQeXJKWXl1ZjVtNTM3Nkx4YlFRSFRpTEo0ZW9pK21rQ052ZjNzQmZkRDdaTStMRW5ucVY1bTA5eVB1UGFSVGx1WUJxQW5jZEladmxMU2I3bXdQUWlxREhQMHV0djJKdUJORHQvKzRrYStsL1VmdXJPaXVtMmtpOER1TGI2ekRQNmt2QnRLRzRYL2dYOFdUTTlRaTNLMDRvUFQzZHJoMmg5ZjdYRnZPZ2JsbHVUcGRVZ3BBU2FWcmlKdVBTRkNJZWx5NlhDeDB6VVFJaWRjSm1qQllqUXJNV3BzRm9vVVp2cHNpZGgwZTQwZ3ZiQWFzWHRMR3B5V3B3VDh4WWk5b043cnBPM0FDa2FZOGp3aFF1TkJFWHBwVENrOS92bThBNGFHSHpQM2VUTithYlRCK1NuM2lHUUF1SHl3LzRSc3hpL3BXdmMvTlR5OGlOZVpNbEhkSDNYbWFON3hLV3BycVZ2djVNdmZzSFRFMjZ0RmZ4NUF0WEVZMkNUOFhXVGlJaG9pK3NKZnFDL2Y4QS9odjNnZGNGc2FPb1BZclYwVEo3T1NHbnhUM3FmQXAva2tYdzFyV0U5L2p4UG5BOTNVdTMwVEQ3dzZSSXlTaUpuQnN1dkE5Y2U1amJGU2N0VElINDRySUJkMDhlc2ZlQlZVbVhGR3lYMUdxNVFpUk1wMFQ1aDVZWVRva3VUWFJjUk5FSnl4ZyswME9MRWJFS2QxczRwRGZSejF2US9qbkRrUWlIYWxwbnJMVUVnNG5Ca2RGV2EwM1hkZUpTSWpHRkVVOHVPaFpDQ0hGTldlKzhGaUcrbVhpNEhNb0c1bFAzcjJVOC84L2RiSDN2N3p4MC8xSStpRUcwUTNYTFllTGQzK1pTZ2dSYXIzTFd2YlNSb2lzdlo5aFJuandsYXAyVVZGSHJXMHJ1ejgvRFY5amV4VFQzMUJIZjdqanFvaENOSnI1ZkYwUGZXSWNZTjRhOGI1YmlMdTJCWjlKWThxN0lJdjdXbmtUMSttRnZWNXhNZXJpenI3MDc1OHU1cERUSUoxeFJxYVYySkJpR0lRekR3RmtDa21pVWp4RTBJd1NzOFVhMXVwK0kyYjQ5VG10WHM1WmNuZGNxYXJvZXg3Q0dqNWltYVMxbVFVaUVlR3p1Mk5sZVd2Vm45TzAvNUtFUmgzamllN2N4N1lFVitDK2J4Y3poT1VUckQxT3pWbmdKOCs4ZTJmcUhOZkEyTC8yekY5ZGMxbDlkRWFjYWZmdVRPYWtVWDk5akw4R1FhLytQK2gvdVFYeHRFa1YvL3dhRlB5NUZ2cnFXeGw5V0g5WHRpcE9IUUF5OXMrZWxsOUsyYUxkTkg2bGR0R3NtaEEzRFNKUi82Tkx1SlUySVc4aDJTWTBROVVZTDFYcFQrK2Y3NXo5ZVlsZDVSYnNGTGY0V3l5VnQzVHdsb3RIRUxvTzRZUWhwU20zcmh2L05IMXgyeGp0d25Kc0NEcnpOOC8vTVllcjBVUlNwYTZKVGNtRGN5MTM2OWZmWmNOVXhtQnNEanVwdWhtRlFXVm5KZ0FFRGp2cWh1L0RPZ3c1NTQ0MDMwdjloa25MUEgvN3doenVlZi83NU9pQUloSUN3RUNKbXVhaUdFTUswdGxsSmE5R0x0TGRZMmN0ZWNuSnk2TmF0Ry9uNStSUVhGMU5TVXNLZ1FZUGE3RWh3MTlXM3IxbXpWdWNsckRWcjAxUThibUJZMXBxVUNYVXRHempnbHVNdWFnQjlMdUNXNlVvOEZLYytFeWRPN0RTdnBYVXQ2T2RHNmFoUm95WTkvL3p6SysxWW14QkN4eXIvRUVLWVFvamttajduM2xGN1czeE9UZzU1ZVhuazUrZFRWRlJFNzk2OTZkKy9QNE1HRGFLc3JGV0tOSHNwU3pEb3FGbXpkeGZZb21iNXU2WnBDdE5xbmRyMGY2dHlYUzd0Rm5WcEtoU0tvNlZidDI3WHpKMDdOemZwamtycHNkelJwRXVhV05kcENtdTdsYkJMUHhMckJ4S3RWdmFtSzcvZlQyTmpJelUxTllSQ3JmV0ttajFuTFJRT3Q0NzV0dUpxdXA0VXRuYlcyb2hoUTJZQmc5UmJkWHJpNnBWMWVyeDJ6YVhlN09PSUVLTHN2dnZ1dTVqMlNRU1hsRkpMVE42V3dqUk5MR0ZMMXJUWjRtWTN5TnN6Mit3VmZvY09IV3A5MnhJZEJna1hOR0tOK1U2NG9EcHhvNjIxSmkxcjdjYXZYKzF5dVZ3M3FiZnA5TVUzcHFEcnZ2WXZGQjZEQ3FwYWtlTk5mbjcrVjB0TFM3MXByRGJOdHRvc2NXdG50ZG5pWm84MUNnYURCQUlCR2hzYnFhMnRKUkpKTEgvUm5OYWFNd3RxRDQ4MERBUFRNSzNsTEFscmJjbVRpMjRFVk9QU2FVemVQV2VUZFhWL1hIMnp1NDZsMWplTDdPbG5rRGRuMk5IL2tDZFR2ZG5IMzJvNysrMjMzNTV3TkZiYjRTdzNwOVhXM056Y3htcHpKL1lYUk5QRzFoSzFKQ2FHWmExWkZwdm1kcnR2VkcvUDZZM1d6VXYzKzBlZDRwOUFEYnc1NnMzK0hDZ3VMcjRDZU5NU3RwaVUwaTJFY0pOSUpHZ3lnYkRLUHFSaEdDSWVqOHZVV0Zza0VtbGp0ZFhWMVZGU1VvTGJLdVd3ZDRJbWxURnUxWkVZcG9FcEpWSktKSWpRd1IxVGdBdlVXNk00NWNuc0JrSjgvczlqR25Cb0s3VFVuRFpic1RRNGIrZXJpMGNOdnVLT2paYkY1a0ZLSFlGTFNnd1NoaFNtTkRHa2dTRjE0bWFVdUJFbUhnK2l4d1BFWWsxRW9nMkVJelcwaEEvUUhQeUUrcGJkSFBML095RnN5V0xjdUcydEdSaTJHMnBLcEpsWXpnSlNlRDJlR2VxS1Y1enl1SDNneS92OG55ZlVDSldiUVErZGRxZDRZTi9pU2NBSFNhc05QRUlTUjBnWENGTWloWlJnU2lrTnc4UXdUT0tHaVc0WTZMcEJUSThUMVhYQ2tTakJjSlJBTUV4VG9JVzZ4bWEwYUNUaGd1cHh2VzBXMUhKRHJhUUJVaUthOW00WklZUzRWbDMxaWxQYm5IQkJUczhUODF3dE5hZWxxQUY0M082ci92ZTNDL3NsTGJaRW5DMWxOd0tZVWdvakVXc1RjU01SKzllTk9IbzhUaXltRTQxWjRoWUsweHdJMGRBVVFIT1dkeVFMY1cwWDFEUVRibWpDV3RPeXM3T3VVMWU5NHBTMzFQSjZKK0pySjRMbUE2ZjE2UjQ3WXNpRnBHeXpRbG9aVW9rbXBSU21sSmlteExBVENiYTR4UTFpOFRqUm1FNGtHaU1ZaVJJSWhtZ01CTkdTVGU1T1VVdGFhM2JDQUxIcVQ3L0wwRFJOQ1p2aTFFUzR3SnNOdWIwUy96NVJuT2FiNW5PeU1xNllPV1ZDaG0yMVNWdmNFclBhQkltWlJpSmh0VWtNd3hRSmw5U2EvcUhIaWVseElwYlYxaEtPNEE4RTBld3NxRzY1b0hiU0lHbXRXU1Vla3k2NjRGcWduL29FS0U0TklkTVMxcGszQjdJTG9Yc0piZmI4blNpNjhFTG00MFRKbzNOdkhaZkdIWFZKMEtTMGhZMmsxUlkzVE9KeEU5MjIydlJXcXkwVWpoSUloWEhydUluanhzQkZYQW9NS1lRaEJZWWxhSlpxYXU3QzB1a25KRU9rVUNoT0szb1dkTDhFZU50aHRibUZ4SVdRV3VJdmtKUlNJZ3dwTVV3cERkTVFjY09RdHVXbXgxT3N0bEFFcmRVTmpTZEhoU1JhcDZSOWlNYkd4dUZDaU12VVc2QlFkRDJpYi82R29YZTh6TlpPK3ZyY0x0Y2xhNWNzU0UwaXVDeXJMVG5PU0pyU0t0ZzFMY3V0TmRabUp4SVNWbHNFZDdKdXpSSTJNOWtUbWhBMVFPVGs1SHhOWFI0S3hRbWs4ald1dVBNVnRyVisvTW50T1pESjA2Y3hmMG9KaHkxRWFkekZpLy9yWi96ME1TZHd5Zmd1SHJyeEtaYWxqa2J6bk12aWxiT1lmSVNmL3VMd3dlT0FUMUtzTmgyQmhpUlIraUdRcG1rbEVxelNEenQ4MWpiV0Ztc1Z0dGFrZ1RYRnd6UnROMVJvbW5hMXV0SVVpaE9NWnhBTGZqdUhHM29BNkZSdVdzMmNSNTlpYnZhUGVQYkN3elR5TjI3amQ4dXF5THQ4REdVbnRISEN6YVVQUHNhejQ0LzlKM096TXljQi8wM2JPSnNiWk55cWtoYW1GV3N6VEZNYWlUNVNtWWkzR2VoR2E2d3RISTJocGJxZzlvSFZpQm9NQmk4QmhxbXJUS0U0cVNwSHlaZ3AzRHhFWi9PV0dpci81MWR0M2N2cU41ZzI3UmY4OHIrZVlld0RiN0JIMzhYYzJROHpkNU4xdTE3TlM0Ly9pZ25UNWpEMCtvWE1XVnVkM0VVU3JkekVRL2Mvek1ocDMyWG9qYi9nOWhXN3FMVnVXLy80ZzR6OTBaK1plLzh2bUhUamZZeTg0eG1lMzM2TWRYZXhTcDZaODEydVdGcVplTTdHVGR4Ky9ZUGMvcWExNHJ6Nkl4WSs4TWpRUWYzNkRiVUVyZFVkbGJoTUtUWERsQ0p1bUNKcW1CaW14TlFqSEt6elV4K3p5ei9DN1A3dzM3eTVQOFR1RFcraDJhS1dMcjRHQ0ovUGQ1VzZxQlNLazQxTzdmWjNXTGJEdzdBaCtaUmNPSTdSTlIreHlsclJXdnYrUjJ3dE9aZXZYWHNuRzM5NkVhV2VNM2wweWNNOE9zYjY4Wm9xYW9kL2cxZFgvb3ExczR0WnYrUmwxclFBc1FvV0xmd0xXNGZjd05xVmovSGh6eWJoVzcyRU9hdnJrODljVnhubTBudnZZKzBmRnJKMFREMkxYbmcvS1h4SGhiZUVXKzY5Q1A3K1oxNnM5TFB1Tnl2WlBQd3FGbDZZQjdFS0Z2em9SVFlQdVk3WC8vcjRlYzQ0bTdReW80Q21DU0ZjQWpCTklvYkVNRUZDTXVhV0dLMEdwbUhTOCt4ekU2Nm93LzNFYm5hM0RrMEljYVc2cUJTS2s2Rmx1NW4vLytZd1B4bGo2OHZFNmJPWlB5a1BPSWRyaHF4azhadVZ6Q3ZOWjkzNktzb3V2SzdqbUZyZmM3bGpVakY1UU42WWN5aDcrZzFxZ3hEZDhUWXJnaU40ZHVhWmlUSDhKV09ZUC8wZEpxeCtuL0lwbHdKUU9PSkxUQzVPV0kyalI1VEErbW9xSWMzWS9qaXZQVEtIVXNkM0xyem41eXlkbElXdmRBcVBYcjZOR1F1ZkpDOVl3cndueDFFRVJMZTh3WXJnQ0o2Y2VTYjl2RndDTEUyMTJvUklkQ0lnaEttQlFFck1oUFVsVE1PVWlUaWJoaUhCdEZ4U2Q2cTFacnVoZ0FpSHcxT0F2dW9LVXloT2Rvd3RsVHdtZnZsTUZyeThqZkxwK2J5Mkk1OHJieXMrV3E4MjRZTHFFRzBNRUMwK2l4TEgyTG1pbnZuNEdxczd0TXA4bnlyRzVtSFlWeTlpOU1zdlV2N2w2NWh1L1U3UlJqK0JwZ3B1di81OWdENERCdlFmOGNrbis5NXJHMmREQndRU0lZUVFta0NhMWhSejB6U3RqZ1F3cFV3S201WXFhcGFsQmlDOFh1OFVkWFVwRkoyVG92RmpHVjN6UHN2K3ZvWE5KZU9ZV25Mc2orSHJrWW12dXByS1dPdjNhbXNhaVBZb1BzNkxsRUtzWDdhYXpTVUQ4TDIxbWhldHhXRytuRHh5ZTM2SjVTc2ZZL3ZLeDlpKzhqKyttR3F4U2RuYWlXQktpU0dsTUdXcUsyb21GcFNhaWRJUHpSSTBlNmlic01zOExEZFVDWnRDMFZuSk9ZdHJoamZ3NHJLUEtKa3dncVN1ZVRQeEVhS3k2Y2hCZnQrSWk1anVmWjlGeXlxb0JhTFZtMWl3b29yUlU4NDlycVVpMFMydk1QZXRmT1k5T0lkSHYreG4wZU52VXduNGhvOWxNaHRadEtJQ1A1Q2hOMTZVWXEwbFYvUkpwR1phb21hQ0VFaWlFVjNvUnB4d3dFOWRIS1NacUd0enB5WU5iRGMwRkFwZHJOeFFoYUl6azhYRVNZUHdiZkJ6NVhqSHFQYVNjN2o1M0hkNDZNNGZzKzNCaFR4NnVJZndEbVRlajcvT2dsOHZaZEkwUDlIc2ZDWitkVFpQVHZrMG85L2J4OWpnTEJhOU1Ja1BmcjJCb2huM2NVT3hCMlpNWS9JOUx6QjM5VmtzbnpLTWhUK2V4b0pmTDJYQ01qOVJiMTZmeTJaK2U4Zy9sdjNuaHlUN1JuRkptUmdaamhCQ0F5R2xrRjZYSUtwSE9WZ2Z3K1Z5NDlNa3BsWCtJWHIyN0VrMEdoV3hXSXg0UEM1TTA5U2tsQzVkMTMrbWFkcDMxTVdqVUJ3ZG4yYXZLQit2K215VzBLWS9NbWw1Q2N0L2VSRWxwOGg1RElZaVMzTEdYdnNpMEFJRWdLQ0FNSUtvUU9oQ1lHaENtRzZYSnIwZUZ6NnZSMmI2dkdUNmZHUmwrc2pPekVCTHpZYVNxRi9UTkUyYnBDNVZoYUx6RW0yczRQa1YyeWo1OHJtbmpLZ0JaR1g2emt2bmltTE5hY051czVKU0pEb1JUR3VGZ1pIc1JOQlNpbktSVW9xR2hvWmhxR1V0Q2tYblpjL0xYSEhyTTd6VTR5b1dUc2s3cFg0MUljVFpxNS81VWU4T3hFMUlpVUNDS2ExTXFMT0gxRHJjcVEzdkpIcERMMUpYamtMUmlTbTlpclVyVDkzYStURm5uemtNMkc4TG13U1hrR2dJMjJLVFFvS1VkdStvZGRoYnJaSlpVVnBIRkFtWHkzV2h1bklVQ3NYSm9udGV6aWpMU2t0TytrZ2NzbFdycE4wL0twT1ZIWVoxYUtrVzIvZSs5ejJYRUdLaU9yVUtoZUprNFhHN3podDVacitVaHZoa25LMTFsQkdXS3lyYnVxTmFpaHZLd3c4L2ZBSFFUWjFhaFVKeEV1bjIvQ1BmTFhWYWJUTFJGSi9ZRmkvQm1xNkx0RVF0T2RMSWFiRlpDSi9QZDU0NnB3cUY0bVJUV3RKclNIdFhGSzNWSFUwWVphWjFHTEkxRWFvNXl6eEl6RjQ3WDUxU2hVSnhzc25Kemp6SFliRzFLZnV3OVVwYVdWSnA3VDgyWkdLc2tXWmJhMUpLY2UyMTE3cUVFTXBpVXlnVUp4MjN5L1dGQWIzeVhTa1dtOHNTTkUxS0JGaHh0amJ1YUd1TVRRQml5WklsWHdSeTFDbFZLQlNkd1doYjl1aDkvWjJpSnExOW96aFc4eVhpYk02YU5vZkZCcENSa2ZFRmRTNFZDa1ZuNGN3QmZkc2tFR2diWnlNMXppYWxpU25OVnVValViODJScDFLaFVMUldlaVdteldFZHNtRHRuRTJISEUyMDB5MFdia2RZNHFFRU9KY2RTb1ZDa1Zud2VOMkQ2ZDlqQzNaTDRxem5pM3BqclphYk96YXRhc25NRmlkU29WQzBWa1FRZ3o2NWZkbTVYUWtiaVJVTFZuUFpydWxkb3hOOU9uVFJ6VzlLeFNLVHNlbDU1L2J4eEl5YStBa0doSmhUOVdWV0pVZFZoZUNsSTdzZ3NmalVjS21VQ2c2SFgyTEMvbzdyTFIydFd4WUk0eGF1eEFTd29hVVVyaGNyclBWS1ZRb0ZKMk5uS3pNTXh5aTFrYllyRGhid2lPVkNNc1ZGWnJkSXlxRVVNS21VQ2c2SFI2UGUxQ0txTGtjRmh1dDRwWklJTml1S05ZZHpsS25VS0ZRZERZMElZWTRyTFQySlI5cEVnZ2FJR3BxYWdaenVIV0JDb1ZDY1NTcU56RjN6b01NblhvZmM5YnJ4L09SZlNzZnY3L1FLV2pTbXNkR3N1VERUaUE0TExhY25KeEI2bDFSS0U1WC9MeDQveTlZVkFsVXY4RzA3NzlCNVRFL2hzNmFGLzdDdXA1WHNmYWxYL0RrZUUvYm03ZS94SVFibDdJbTl1bGU0ZERTZmtXa0xkSzFPeEFTZ3FickJ1RzRaYkc1M2U0eTllWXFGS2NwTGJ0NHMzRWdGNVpBN1padFJJY1AraFRMWWNMVU51cVVqQmpVWnF0OGt0S0xlSExlRk1aN1A5MUxMT3lSVjV6R0hSVnREeWtNMHhTNkFXNHBwZEEwclZTOXV3ckY2Y1pXNXQ3Nkl1dUNZZXBpSGpiZitCSFJZSUNvdDVJSk5kZXhkdDQ1YmVOVHNVcGVmUHJQTEY1ZlJTMlpERHQzQ2d2dnVvQmhPWlU4OC8xbmVHSkhuTmlPUll4ZFBaWm5GMS9EYU9mUDdsakw3WS9vUFBxbmJ6RCt6ZDh3Y2huY1VCcG0zWTVxYW1PWlRMenBOaDZkVkl5djhXMW0zUG9PZVJkbVVybTlnZG9tS1B2eU5CYmNPS1JQVzBzdEdWOFRKbEpvZ0c3YXhtTTA0WW9LSVFhcU4xbWhPTjBZeHFPL2ZZU1ZNL295YXVaMzJmaUhPZHhSTW9qNXp6ekNXNm1pUm9nMWp6L0RFNDFqZUhiSlkyeGZjaWZYQkZjejYvRk4xRkxDbmIrOGovbkQzWXk2YVI0YlUwVXRIVFVOTUdVV2EzLzdDRy9kTzVEMVMxNW1UVXVyYTh6d0cxaTUrR0UyUGpPTm92VXY4cE0zUTcwdHk2eTl1QUZTQ09GMmljUWQzTjdFRFVLSUFlcE5WaWhPUjNTMjdnaFFka1l4dEZUeVFhd3Z3M3FrYzFlM3NHeDlKdE52dW9oaE9VQk9DVGZjTm82ODk5OWhYZU9uZU5xZVozSE5pTVRhd0x6U015bUxOVkFidEc4czVzSXhCUWxoN1hFT2QweklaZU03TzBvNkVEVjdzUXNrQnhWSjNOWU5TdGdVaXRPTXl0WFBNR05aSmY2bU1HeDVrSFdFcVF0NjJIeHJCVGMvK0QzdWRBYW9tdnpVVWtCcFQ2YzQ5YVdFajlqVENQVDREQy9FeWpORWRTQk5ESzZvT0EvK0hlbVhZckVKQ1pwSW1hWnJ5NXUyYTlldVlpQkR2YzBLeGVsRnlaUTdlZXVaYVl6dit5V1cvdUVSWHAxNUptZGRkVGNiZjVzaWFnRGQ4eWlpbmowMWJkM0pXdklvN2ZINXZzN0t5Z2JJenMzNDJieGJjanEwMkZMUUNnb0tlcXUzV0tFNFRhbXBvSmt2QnFBQUFDQUFTVVJCVkx5NGhES2dmRTg5SmFYRjZlK1hNNEtaNDhPc2VPRnR0cllBTFpXOHVQUU5hcy85RWhPUHU3QlZzZXAvSy9BRDBjcTNlZUxOTU9Nbm5Na1hCNStSNXhDeTFucTJGS1JwNHZiNWZNWHEzVlVvVGsvOGxRMVFNb1k4L0pSWGVpaWI0dW5nbmxsTXZ2ZE9hcC8rTTdObXI4UWZ5NlJzL0JTZXZXc01SY2Y5VmVXU1Y3bWFhZGZ2b2pLV3grZ3BOL0RvcER5YWQvZkk2OEJhYTExR0pSQ0dhVWdSalVidjlIcTlUNnUzV0tINGJCaUdRV1ZsSlFNR0hFUEkrdU5WNnNRNWFYeWJHYmUrejVXL25jTU5LWlpnWlhYZGduNWZ2dmtkSUdBZkFrSUlJZ0lSRXdKREU4SjBhWnAwYTVwV3BNNm1RcUhvN0dSbCtQSWNibWdiUzgwNTVRTWttcVpwQmVxVUtSU0t6bzdYNDI0WFl5TmRqQTF3Q3lIeTFTbFRLQlNkZ2g0WHNIemxCV2x2Y3J2YkNGdjdReUpzbWRQNGJCVW9Db1ZDY1VKd2FWbzZWNVEyVnB0VnFLc0JlZXFVS1JTS3pvNm1pUnpTeGRaa0czRVRFdENFRUVyWUZBcEZwMGVJOXNLV2FyblpYVlVha0sxT21VS2g2UFRDbHRBcXAvdVpwdXRBSm9VdFM1MHloVUxSQlN5MnpCUlJjMmllYkNOd0dwQ3BUcGxDb2VnQ1pCekdEVzFqdFdtazdhZFhLQlNLVG9lM3ZYZWFUdFpRd3FaUUtJNkdFSnRYUE1PRTY3L0wwTysvUnZuSkU3WjJDWU4yQWlkYjU0Y3JGSXBUbFMxL1p0TENqNGlpczI3UlF1WnUraFFicENyZjRhRmxmaVkvdkpEdHY3eVU0N2NrcFo1MS8vTUdhNnFQNnM2dXcxaHMxa1o0TUdsdFMxQW9GS2NvV3pkVlVEUm1JRDZxZUcxUE1SY084Uno3Z3pRMlVKdmRsd3VISHU5Y1l3T3ZyVmpOYTBlM0ZrdnIwRXF6VExYRUpuZ1FVa3FwM25xRjRyUFQyYVo3bFAvUGs4eFlVWVcvU2NmWFBST2ZubGphVXBqZGs1dC8zSDZZWk8ybWw1bjdtM2RZWDZQajYza20wMmQ5bmZuakM0aXVYOHFFeHoraUxnaTUyWm1NbjMwZnowNXFXLzRhcmR6RWdsKy93aXM3L0VTemk1bjQxV2tzbkg0bVJjQzZSZmN4TjNzMkc3OTFadUxPNjMvRDBOL2tzL3pIZVN5NGZ5MWJtOEtRblV2WjViZng2bGNyMHk1emVmUzJjeWdCeFBDcDA0QWdpZWtlZnFBRkNBcUlTdENCT0NBMUVwYWJRcUU0eFNqNzZodzIvdlltcHZZOGgwZC8rd2h2M1hzT2ZTK2N6Y1kvcEptUVcva2FzeDc5aUpKWjgvaHc1UzlZZTFzKzZ4NWZ3cUk5NEJzL2k0MFBqcU93KzdrOCthZEgyb2thc1FvV0xmd0xXNGZjd05xVmovSGh6eWJoVzcyRU9hdnJELzhDU3k1bDVSOW1NNzE3SmxQblBzS3Jzd1phTjdSZjV2TFFXaitIMVNxUm1CT2VHTXFtb1FHR3VnUVVpbE9VbWlyS2V3NWltQmZLdDFkVE5yeHYycnR0WHYwT2xjT25NRzk4QVQ0OEZJMlp5cnpoRGF4WVhYSEVwNGh1ZVpzVndSSE1tNW13MEh3bFk1Zy92UytiVjcvL0taTU03WmU1ckg5ckcvNzJXdFcrVjlUQ0RjUklybE5RS0JTbkJsdDU2STYvc0tiSlQxMHNrMmszcms3c0RNMStoQW52VCtQVmVXUGFOSW5YTm9iSkt5NXdmQytMa3BKYy9KWDFSQm1Zc29vdlJkZ2FBMFNMejJxektMbW9aejYreG1wcWo4TnZrbGptRXNhZjBLcWpRdU1ZN3F4UUtMb0t3MWk0K0dHV2ZqbWZDKzk2a0kxL21NWFVuaU1TTG1tS3FBRVU5Y2pFWDEyUFAva2RuY3FhQUhrOUNnNHJhZ0MrSHBuNHFxdXBkQ2hKYlUwRDBSN0ZpYkhobjdHZ3pGcm1RbDU3clpJcFg5c0lXMWhkQkFyRnFVaUk4bW9vSzhtQ3htckt2Y1dVZFNBeW82ZDhpWkovcjJYUkpqOVJFb21FSjk3UFovcVVnVWQ4RnQrSWk1anVmWjlGeXlxb0JhTFZtMWl3b29yUlU4NmxEQ2dweWNlLzVTUFdOK3BFR3l0NGZuV0ZRNkU4K0x3NnRUWDFSSlBmUzcvTUpROGlSL1ZyeTRRckdsSVhnRUp4S3RMQUI1VUZuRlVDN0syaXR1ZWdqdXZQU2k1bDZkd3djMy96Q0NNZnNiS2k5ODVtWHVsUlBJMTNJUE4rL0hVVy9Ib3BrNmI1aVdibk0vR3JzM2x5U21JNGQ5bmwxM0hQbHFYYy92L1dFZTArZ0trajhzbE4vbkJmcnBreWtGbS9lWVJKZSs3a3JablEwVElYS1dVNGpYWG0rTDlBQ0lrcFRTbWtsQjhBSTlWRm9GQjhOdFF5bCtQQVlaYTVtRkp1Y1kyNDZvZTBsbnM0RjdwRUJVSVhncmdtaEtsSktmM3FiQ29VaXM2T2xMS2xZMnZObnAyYlFBT1VzQ2tVaWs2UGFjb1doNERKZElKbWVhUzRwWlJOUWdoMTFoUUt4Y25uTU10Y0RNTUlITVppYytvYW1wU3lRWjFOaFVMUjJZa2Joai9GWXBQcHhVMmdTU25yMVNsVEtCU2RuV2hNOTNmZ2Zrckh1Z01BTk1NdzZ0UXBVeWdVbloxUUpCcWdmV3hOdG5kRVFkTjF2VnFkTW9WQzBkbHA4Z2M3Y2tXVFltZG5DOXlSU0tRbUp5ZEhuVFdGb2hQeHlZRWFkUkpTK0dEN25rREhvaWF0RmFPSlFXenVnd2NQSGl3c0xGUm5UYUhvUkF6bzAxT2RoQlNxNnh2dGNnL1RGaldSOEQ2bDdZSUtJZEEwZ1RaeTVNZ2FqcllIUzZGUUtFNE9rYm0vV2hvNmpDdjYvOXQ3OC9pbzZudi8vL1U1Mit4TGxza2VFaEtXRUVSQUsrRHZpbGgvNk5XcWJTOVlXclM5U2x1K2FQdXIxRzhMMVFxOXRxQnRvY3RGYnl0V3IxaGJzRnFnVldwUlJCVFVGbGNVTlN5YVJDQVFRc2pDekdTWm1YUE81L2ZIbkhQeW1aTXpTYkJzd3VmMWVCd1RBbWFaTS9QTTY3MTkzdFRhQ1krK28zYjM4OGVOaTR2clRCV2w5SUFOWkRyajNESkVETEJSU3VrKy90QnhjWEdkcWRKMC9hQU5haGx1emR5WWJBU2thYkRwdXY0eGYraTR1TGpPVkNXVGFyT0RZM05zK1NBa3ZmT0FhcHJXeUI4NkxpNnVNMVh4N3A1bWh4QTBhK3VIbEtaaHNrRlIrTjVrTGk2dU0wRXBiRmo2QTh4L1RVMy9zV0FhZm43SFoxb3hoQndiSVNSZEdRVkFPem82NnZtRHljVjFaaW5SOUJZVzNYazN4bDkzRzJxKzlrc3MyTnpFbkRJN05FRFViWDRlYTNlZnJMTmtXN0JwN1N2WTNuR2lQNitNNnhiOUNydlcvUkx2TEJnSEJVQkQvYjQyQm1ZMjEyYU9VeEhydndJQVdsRlI4UkZ3bkk4WkZ4Zlh5VlB5UXl4WitpUjJWTTNBK3NkL2hzMEx6MGZUd3c5Z3dmYmpnVlFQZHJ5d0VXdjJuS3pULzF1d2JzMUwyTlp4Y2o2N1M1RVJUQWVTaVR1K3Y3ekQ3dFFJb0lOazlMU2xDd2drSFlxYTFtNFhnQW44R2NYRmRmb1YzZjRTTm1BU0hwMTdmdm80NzNGWFlPbjFiK09hcDk1RDY1VEppRGljTkx0cDZmL0Zrc0xiOFBMY1N1eDQ5T2VZOTJ3N29sMHFrbnVXWWZ6akFPUVJXSHpmWEZ5ZkEwUTNQNEJKYXlWY1Y5aU9IUTN0YUZWS2NmM2NHN0Y0U3ZvNDc4UzJoekIrVFNIV3IvdzhhZ0VBSDJMUjF4NUc5THMveDMwWHR1Q1JPKy9EaWtZVmlWUVB0djd3QjFnTndEWDhhanorMDh1eUh6K2VvVzVzWDdzYVM1N2FoZm91SUZnMkJuUG1maG0zamdzNi9GdTZ4d1kxSFlCT0FRb0tDcVMzdmhOaUxCYWxlanJIaG5SbHRFNFFCQTQyTHE0elFFME5MVURWWkFNcWFWV1Bya1R3cVE5Umo4bnA3VThEYU9MTlA4RHJOMGV4K3M2N3NXN0tRcXovUWw3L2Y5U3BZc0tpLzR2bFpUSmF0eitLR2YrOUdsVXJic09OaFlOOWQ0WDQray92d2RleEUvTm1QSTNxZXhjTmJUY0NHMmEvdFI2M1BRVXMvT25QY1gxWkNuVWJmNCtiNzFtUDZvZHZ4cFcyQ1U5ZDErdlJQN2VtQTlDSjJaUkxRVFZLSVlHQUNDSUVRZ2dGUUZWVnJlTlBKeTZ1TTBPSkxoVXVSY3BjZmVlVDRFcXBKeTVuVkRBQ1U4clNLNFVqVTY3R0RRVWY0Mi92bmFJRHRSVVpybFFQV2p1aWlNS0wycXUvaWMwUHpNSTBoN0YxWFV2dVEvLzhHaE9DRWlvUUFKUkNBMU04QUVCN2Vubys0RThuTHE0elF5NmZoRVRTQnJFdUZRbFpHblRQNXlkVEFHVTVRTFR6MUd6amRJMmJnY2UvT3dhNzFqeUE2Vis1QzlQL2F6MDJ0S2lPUDF1eU4zN1FCalFOOXBZUFFpaEpUOEpUUXZwR3F1amV2WHM1MkxpNHpoQlYxeFFDZXo1RVhVWjQyb1JvMlVnamh5VURTQ0Z4d3RhZHg5RFVBZ1REbmpSNEZCbXVWT3FrVlJRVExTMUlqTDRNOS8xMEVWNy8wMTI0YjJvUFZ0NjlHbXNkQ2hIUjlnTXRCc0EwQm1yR1pWUkVLUVVGSUJDU3ZremlUWjQ4K1NpQUQvbFRpb3ZyREhCc0YxeUI2K1hYc2VTaE90VEh1OUc2K3lVc1dOdU9LNzh3THAxZnl5bEZiY0ZCL08zbEprU1JRdXZ1NTdIcWZkWDJXVHdveTVGUi8vWXUxQ2VCUkR5S0tBdkNJenV4YVhjM2dCVHFOeitOVlVjcWNhMlp2QjllaWVxT1hmamJlOTBBdWxHMytTVnM2clIvbDBHVTViUmorOXROaUFLSWRuUVBHWVN0MjUvQU5YYytnVTB0S1FCZVJBb0RjQ1g3ZzdRM2dZK09IZDdaZzZ5dEh1bExwd0NJQUpta2l3aFc4UUNBcnV2NjI0SWdqT1JQS3k2dTB5eWxFZ3NYemNLUzN6eUphMmEzQStGU1hIbkRyVmcreFd2OGd6TE0vL1psbVBmZnY4S0UzOHNvUGU4Q1hIbGVBRTBabjBUR3RKdG00TXA3bnNZMU01OEV3aFdZZjlmM2NHdU44ZGMrTDNZOS9pdE1lcThkMFp4S1hML3d4cjdDUWVHL1llbE5IK0syZXhaaFZkS0RDWmRlZ0NtbDltK3lFcmZNbll4NXYva1ZKdndlQ0pUK0crNjdieWFtRGFIWHYrd0xOK1BCanZWWTl2MGY0TFl1d0ZWUWlldS9lNk5SNGUxcjBLV1VmdUFVaHBKMFZWU242ZVBYQUVLb0xLYmRHaUVFUkJSRldkZDFDWURjMDlOenE4dmwraGwvVm5GeEhiOCtUUXVUbzVzZndLU25SK0NaKzY0WVludkc2ZEhob3gyL0xMN3NQMTlGZWtseUhKbExrbnNCa2hJSVZFS0lMZ2tDVlNTQktvcWN6ckdabGRGb05QbzJmM3B5Y1hHZEtkcmRjR0NmemEyeE9UWktqSkVxb3pHWGtuU09qUXBzbkRwcjFxeTNEU3B5Y1hGeG5XN0Z2L2FENVMzSXJJUm1nTTI4Q0NHVWtMNFRkQ1ZDaUhGS09QU3RXN2ZxbE5MdGhKRHAvREhsNGpwN0ZaeCtLM2FmNGE5eVZkUGVhbXJ0N0FjMVk1U0tBc1J3YmVhTWFCcHFiQjhiakxlNnFxcmIrVzNuNHVJNjNZckd1OTkzQ0VQWmNKU21ZMUJZYm8yWTdSN0dINmlaWjR2RllxL3poNVNMaSt0MGErL0hCeHNHZ2hySk9EbVhRQ0JHSDVzZ0lDUEhCa0QvMXJlK3RSM0FNZjZ3Y25GeG5VWWQrOGFpWHpkbGdacERqZzJVQ0FTQ1FLZ2dHSTZORVgzeXlTZFZYZGRmNW84ckZ4ZVhreWc5K1Y4anBhcXYxVFVlWXNOUU5STnVmV2V3TWVFbkNCRWdFQ0ZkUENDRW1IMXVGSUNlU3FWZWNibGMxL0pieU1YRkJhUzdZUStuUERpU1VLQ0JJSjdRVHVyWGEydHIyNWt0REtYcEFnS2w1dFFCQ0ZLVUFGUUVxQWlxaTJtd0FWWXZtMDRwcFMwdExhOE1HemFNMzAwdUxpN29GTmdSQ3dLdUFQeDVRZmg4ZmhTZTVLLzU0VWQvcjNlQW1nWkFNMWxGQ0tGRUVDQUlBbVJaaHFLNDRISzU0SGE3MDhjV21ZVUQwN0ZWVmxidUJ2QSt2NlZjWEZ5SFUyN0FGVUJoVVFsOFB2OHBDSFZwM2R4dmZyM05Gb2FxQnRSc1J4YVpQV3lDa1Y5TGcwNFFCQUZNbnMyQ202cXFXL2d0NWVMaU9wSlE0QThFVDluWDYrcnFlZzNPdWJXK2ltamFrQmt0SGdJRWdjQ0NtaWhZN1I1bUtBcmpmOVNqMGVoTC9KWnljWjNib2hUUXFKRGRxYlZ0eDhydmZRV2Z1L3hpVEwvcVAvRER2emNEQUpxZi9DWXV2ZVJpNC9vbS90dzg5SzlaWC85UkhUTHphN2JDQVhUTGlCbVRCb0lnZ0JoUUV3VVJrdW5ZR0xoUlNxbWVuNS8vaXA3ZXZsektieThYMTdrcFFvQjRVc3VTVTR2aDVmc1c0MWw4Q3l1ZStnK01WR0tJSVFBQUtKNzFNTFo5SVlGRSs5K3g0TVpuanVkTEhycjJjMWZ0dDRXZ3htVVBReWswVllja3A2RW1zbzdOc0c5T1MwYzFUZE9lNDdlV2k0dkxXYzM0NE1Na2FxLytIRVlHQUxnQ0NMQkg0THBjY0IzbnV1S2VucDV0MmR3YUlkQ1FzWEtQVWwzWHFKNTJiRlFRUklpQ0NGSHY3Ty9ZekxsUkFIb3NGdHNjRG9lL3ptOGdGeGNYRTM5aTQ1My9pZnQzSkpHTUo0RmZYSXZQL1FLQU1nVjMvbmtKcHJxRzlqbGUrK015UFBqa2R1eVBLeWlhZUEzbWZmKzd5TzlzZk5jR05hdHdZTFI1NkFSSUE4MzRUTWw0SE8zeE9BUlBCRlZsUG9qRW5RYWJlZW02bmdHMzNOemN6VHdjNWVMaXlsUWVydjdwTTdnYWU3SHlocm5ZLy9XLzRkN3B4N2VKWWQrVFA4Q1AvMTZCT3gvY2hLbTVjYnkyOG5iOCtIdS9QZlRlMXA4MEdzWkt0WU1ObE9vZ2hJSVFLZ29pUktJaHFSSjR3aUVFalRZUFVSUWdlbklncEMyY2tERXZ5cFJVZFUzVE52SWJ5Y1hGZGVLMEZ4di8raUZxdi9wZFRDMTJBYTQ4VEw3bEc1aDQ5T21YNEpoYjZ6OUtSVWg2T3hVaEFESENVRUVVSVlvaVJFbUNJSXFpNWRqTWtCUjkrL3UwenM1T0RqWXVMcTRUcUhhMHQvdFJWQnpvKzVDckFnRnYyNDVzWWFnRnQ0dzJEd0FnU0VNdFhRMFZSUkdTS0tiQlpzS05nWnJWenhhSlJGNUJla3M4RnhjWDF3bFFMbkp6NHpqY0ZyTStRbnViOS96bWpRUDJhbWpLaEJySlBESFhPQ2szL2YreVVCTkZDWklXNjZ1S21tK1pZNHlzQWRSa01ybUIzd3d1THE1UHJJdzFnYU53OVJkSG91NlIzK0xsNWdTQU5yenkyd2RlUXY5Smc0ekNnWFd3cE1Fb1FSUkFvTk5Fa2tJVUNYUUtTSklJaWNZZ3NZNk55YlVScGpxcUhUcDA2TytWbFpVTCtkM2g0dUlhaXBxZi9DYStmRi9mcXVKM2Jyd1k5d09ZOU1OTitNWG5BcWlZOVhQOFY5c1MzRC92U3Z3NHJrQUxqWGpYd2EzWkczTXBUT01sQ0JCa0JYNnRHL0dPSTJqc0pKRDlaUmlYbXdNNU1CSmt4SWdSNk8zdFJXOXZMMGtrRWtpbFVrUlZWYUxydWtBcGxaRGV6T3BTVmZXUGdpQmN5VzhaRjVlelBrMWJxb1lxU29HM1kyRVVWcHk4clp5cXFyNDR2S0pzSllCZTlHMmpNcTl1UWtnQ1FJb1FvaEpDZEZFVXFTVEpWRkVVdU53dTZuYTc0WEY3NFBWNjRmUDdFUXdFSUVpU1pEcTJqT3FvUFJ6dDd1NSttajkxdWJqT0xSRUNTRVJIVjlmSjIvSFUzSHpvVlljUU5BVkFKWVJrYnFVeTJDUUlBa1JSb0ZadVRSSWhTUkprU1lLc0tIM0ZBM3NSd1ZZZDFlKy8vLzROQUE3d1c4M0ZkVzZwUUVtZ0szWnlEdFdtbERiOTE0OFc3MkxBbHJLRm9Uck1JNHJNblFiVzJGUWZ0eVJSU29OTmxxRW9TcDlqWS9Oc2dpQ0FvYU1PUUx2cnJydDZVcW5VT242YnViak9MUlVwQ2RCRUhFZWFtMDY0YzR2SDQ4ODl2K201bEpOYkE0Zzl2NWFHbXpFWGFvZWFKTXVRRlFVdWx3dVNKS1UvYVB3aktvb2kwVFNOQ29JQVRkTW80OXJVQXdjTy9MV3FxdXE3L0ZaemNaMWI0ZWdGZ1NpT0pMcHh1QzJPMkZFUlhja1RjNEx1SzYrODhuWVd0NllDMUJ4OFQzT0lHdEoxYUpwR05VMkZxcWFRU29sSUprVkl2U0o2WlFrOUxxVVBiRXl1alExSE0yWkhSNHdZc1V0VjFmV0NJTXpndDV1TDY5eUNXNkZiUmFFN0JrcUJ6RlVwbjB5SlpPcHZseTFhZE5UbTFGSUFVZ1JRUWN3d0ZGUWdvQ0lCWkJGUUpNQ3RFSGdVd09zQ3ZHNGc0QVZDZmlBM0NCVGtBSUlzeTdDNU50Z0g0NDFSS3czcFNRUWVqbkp4bmVPUU94SGEzWGpnVlFlM2x0SG1rYkZpenpoM1RSVFRvYWdraXBBa0ViSWtRcFlrS0lvTXQwdUIxK1B1QTVzb2l1WmJhb2FsekpIaFZuVTBQejkvQzZYMFZYNTd1Ymk0UHFrMFRkOCtZZWI4eGdIY210WjMvbHJhWEltRVVGRWdFQVdSU3FJSVVVekRUWllrS0xJRXR5TEQ0M2JCNzNWRFVCUUZzaXpEN3R4c0RidFdFUUdBMnRYVjlRUy9OVnhjWEo5VUJ3NjN2akNBVzFNTnQ2YVQ5SlozS2hCQUVJamgxQVJJa21BNE5SR0tMTUZsdVRVWEFsNVBIOWdjaWdqbWlGWEc3Q2dBYmZyMDZlc29wWHpaQ3hjWDEzRkxwN1J1NmxlLy8zNFd0MmJNaC9ZVkRkSmdNOXlhS0ZEVHFhWGJPMnh1emVOR01PQ0Q0SEs1a0FWdUdhNk5EVWRmZi8xMXRiZTM5M0YraTdpNHVJNVhSOW82bjIxcTdXU2hsalN1Tk5TSWVaSkh1bjlOTVBZYW1DMGViRzVOa2ZyY21zL3RRc0RuUlk0ZGJEYTRzYTdOUGhpdnJsbXo1a2tBOWZ3MmNYRnhEVldVMG9ZZjNmK0hIWU9Fb2RaSnVRUkEycTBKRU1WMGJrMlNSTWlpWkJVTVhJWmI4M2s5Q0FXOHlBMEhJSGc4SGpqQnpWWWhaVU5TRFlBMmQrN2NhRzl2N3gvNHJlTGk0aHFxV2p1aUd4NWE5M3pDeWEwUklHVVVEVFRBUEVneTdkaEVVVENLQlFKa1VZUXNHN2sxMllDYXg0V0F6NE53d0kvOG5GQWFiRzYzdTE4NG1xWDlJNlAxWThPR0RVOEFhT0MzaTR1TGF3aHVyWEhadzArK1pZTWE2OWo2V2p6U1JRTUloRUMwaWdacHQyYk9oQ3F5RExkTGhzZWx3Ty8xSUJUd0lTOGNRRkZlRGdTZnp3ZTMyMjI1Tmhadzl0WVBXNjVOL2ZLWHY5elIwOVB6R0w5bFhGeGNnN3ExOW1OUC8vS3hwM3R0SWFqcDFsU1F2aFY3cGxzVEJVTFRiaTBkaHFhQmxsa0o5WG5jQ1BnOHlBbW0zWm9raVJEOGZqKzhYbStHYXp1ZTFvOC8vZWxQajFOSytRbTdYRnhjQTdtMVBYZi81bzl2T2tETmRHME9MUjVHMFVBVWpSWVBlek91REsvYkJiL1BjR3VoQUlyeWN3QUFRaUFRZ00vbmd6MGtaZURtMVBwaFZVaS84WTF2SE92dTd2NDl2M1ZjWEZ6WjFOemEvdlFEVHo0M1dHNHRveUZYTU55YUpBcTBIOVFVR1I2WEs4T3RSWEpEY0J1TFRJVndPQXpXdFExUUpjM3EybWJObXJXR1V2bzZ2MzFjWEZ4MjZicis1dlJ2L0hDSEE5UUdjR3VBS0JCSWdqbGQwRGRoNEpKbHVKVjBNNjdmNTBFNDRFTmVPSWlpL0Z6cmF3bzVPVGtJQm9PV2EzUEt0Ykd1amRrYWIyMXIzcmh4WXpJYWpUN0tieUVYRjVkZERVMkhuOW5WZUVqRjRKVlFIU0JVU0I4a1NVVkJnQ1NKaGx0TFEwMlJtZllPanh0Qm54YzV3UUFLY3NQd2V2cDJtd3I1K2ZrSWg4TUlCQUx3ZXIwVzNFekhObFRYRmc2SE4raTYvbmQrRzdtNHVFeWxWUFg1a1orYnQ4dkJxUTN1MXNSTXR5WWJCUU9QMnhpZDhua1FEdnFRbnhORVVTUW40K3NLQlFVRnlNM05SVEFZaE4vdnQzSnREaE1KQTdrMmxSQ1NPbkxrQ0hkdFhGeGNsbmJzcXQrRXpHWmNDMnlHVzFPSDZ0WmNWbnVITVRybDl5STNGRUJCWGhnK2p6c1RiQ1VsSmNqUHowZE9UZzdNUXNKUWNtMW1NWUYxYmNYRnhmOUlwVklQODl2SnhjWFYxZE83WnZMczd4K3dRUzJSemEwSlJpWFV5YTBwc2dTWHkyenZjQ0hnOTFydEhTV1J2SDVmVy9CNFBDZ3FLa0plWGg1Q29WRFdRb0pUaGRUZTEwWUlTWDN3d1FlUEFUaklieXNYMTdrckNoejg2K1ovYm9OendZQjFheGw5YTFZbDFPN1dGS05nNEhhbjJ6djhYdVNGZ2lqS3o0SEhyZlFIR3dDVWxKUWdFb21BTFNSNHZWNjRYQzVrRzVMUGxtdWJPSEZpZlhkMzk0UDgxbkp4bmJzNmNyVGp5YS9lK2FzT20xUEw2dFpJaGxzVE04NVpjeWt5WElvQ3IxdUJ6MnNVREVJQlJISkRLQ25JYy96NkFnQW9pb0tpb2lKa0t5VFlxcVRVbkVxd3IrZ3pYZHZVcVZNZjAzWDlSWDU3dWJnR2tlSTc2MzRrVmROZS9zeVhibnRqQ0c1Tk05eWFiazRaU0ViZldyOHFxSEV5YnNDYmJ1L0lEd2RSRk1tRklrdlp3UVlBNWVYbE1Bc0paa2pxVkVoZ2grU1pHVktkZFcwN2R1eElIamx5aE9mYXVMZ0dVNmprclB1UmR1NXBmS2FwdGRNK1haQUFrQ0RNQmlyRHJlbkVPa1NTV0U1TnRvMU5lVHpwazNITjB6c0s4c0lvTDhyUCtqMEk3Qi9Na05SMGJRUDB0bG11alpsSVlKMWJxcmk0K09Wa012a2Ivc3psNGhwQWtaRm5sV3VMeHJzZnZYRFc3UjhiYm8yRld0L0FlLy96MXFoSUNFMFB1SXMwZlNxdW5PSFcwaE1HWG9TRGZrUnlzb2Vnam1BckxDek1HcEk2akZ0UlNaSXlDZ21zYXlPRUpMZHMyYktLVXJxRFAzdTV1TEtJQ0VEMXBVQk9CU0I3UHRVL2lxN1RkeC80MHpQMmdvR1ZXeU5BMGd4Qm1mUFdxR0NGb0dtb1paeUs2eFNDNXVlaU1DODg0UGZTTDBBdExTMUZlM3M3b3RFbzR2RTRlbnA2a0Vna2tFd21rVXdta1VxbG9Lb3FWRldGcG1uUU5BMjZyb05aMDZkUlNnVUE2dFZYWDMyNHJhM3R3ZHpjM0pYOEdjekZsYzFlaUVESnVFLzlqL0hobmozcjcvanZ4K0lPVUVzN05rTFNCUU5DTkNOOVJRVlJoQ2pMa0Z3dVNDNFhaSThIaXRjTGw5OFBkekFJYnpnTWYxNGVnb1dGeUIwMkRBVWpScUIwM0RnZ0ZCcTZZd09BVUNnRXA5NjJMSTI3R1NFcEhKcDI4L0x5TnFaU3FZZjRzNWVMNit4VlBCNWZYVk5UczRjSlFUT2dSZ2hoMStycEFOS051S0pJelZZeVdaYWhHSnZjM1c0M1BCNFBmRDRmQW9FQWNuSnlrSitmajVLU0VvUUdnWm9qMklCMEljSHNiV09INUxQTmt0cWFkblZDaU5WcFRBaEp2ZnJxcTQ5UVN0L210NStMNit5VHJ1dnZQUHJvb3kraWYxNk5oVnJLTURzYUlVUTNKcGlzdFo4bTFFeXdlVHdlZUwxZStQMStoTU5oNU9YbG9haW9DT1hsNVVNendVNGZsR1VaWldWbEtDd3M3RmNsZFRoeGQ2QkNnZ29nOWRuUGZyYXByYTJOaDZOY1hHZWg5dXpacy80NzMvbE9OR3NJMnRlM1pteDJKMW5kbXVuVVBCNFAvSDQvUXFFUWNuTnpVVmhZaUxLeU1zaXlQS1R2U2NyMkYwVkZSZWpvNkVBMEdrVlhWMWZXWEJ1Ylo5TjFuZXE2Ym02MTBpaWx4SEJ0UWlRUzJkVGIyN3ZDNVhMTjUwOEZMcTZ6UThlT0hYdTR0cloyN3dCdXpkbytaYmcxYW9MTmJQaG5uWnJwMXZ4K1A0TEJJSEp5Y2hDSlJGQlNVb0tpb3FJaGYxL1NRSDg1Yk5nd2RIWjJJaGFMb2J1N093TnVaZ0hCdUtpdTY4UldTS0FBZEVxcFZTWDk0eC8vK0w5ejVzd1pLd2pDZFA2VTRPSUM5dTNiOTZuOTNsVlZmZW1lZSs1NTJRYTFYcHRieThpckFhQ0VFT3R6R0NZSUFKREdSdnF0d1JIclk4ZjdXQTBJTnAvUGg3S3lNc3UxZFhkM1cyQkxwVkoyMTBZMVRTTzZybFBqRzlNTngyYm0yNFJ2ZnZPYkhkT25UMyt3b3FLaUZrQUpmMXB6bmV1cXFLajR0SDdyemErKyt1cUdWYXRXOVRpRW9MMndGUXlNdkpwdU9EVnFPRFJxNXRMTUlrRTRIRVp1Ymk0S0NncFFWbGFHcXFvcTFOYldEam0zTmlTd0FlbEN3ckZqeHl6WDF0dmJtd0UzdHZYRENFZEIwNExSMTBZb3BXb2F6a1Nvckt4OEl4cU4vazhnRUxpWFA2MjV1RDZkT25qdzRCOHZ1ZVNTSmdOcUxORHNJYWhxVGlZUlFxeThtcjFZNEhhN0xjQUZnMEhrNXVZaUVvbWd0TFQwdUtFR1pDa2VPUDFXWVZ0QTJFRjVXd3NJZFJpU1o4ZXRVb1NRWkRBWWZDS1pUUEtSS3k2dU0xUjFTNmFpcXVwbXJJMzIvN3Q0UEw2NnJLenNiV1MyZGxnaHFDMnZaa0hOVmdXbDJhREd0blo4VWtjN0pMQUZBb0dNRnBCUUtPUTRsV0NEbTFrbHpSaVNOeCtJNTU5Ly9tRmQxN2Z3cHhBWFYxclJ1clZZTXU4YVRCMWZnNnFxR295Zk5CMnpGenlDcmExbnp2ZW9xdXJXbFN0WGJvRnpCZFNBRzAxU1NsVktxYWJydXE1cG1xNXBPdFZodVRXcUtBcEV0UXZ0N1RFazVYUTRHZ2dFRUFxRk1sbzdBb0hBSi9vK3BhSCt3L0x5Y3NkcEJJZGNXN2FRRkViT1RTV0VKSys5OXRwRGpZMk5EMVJVVkZRUVFxcjUwNXJyWEZicjFnV1lQVzhkR29JVGNPMzE4M0ZES1JEYnRRMGJOaXpGbksydlljVXpEK0s2eU9uOUhpbWxEZHUzYjM5NndZSUZNWWNRdEJmcElmY2twV2JCZ0dpRXBFZW5LTlZwS3RHRGhNZUhnR0dDeEdnem1vOG9DTmVjbHdFMU03LzJTVUxRNHdZYkFBd2ZQdHl4UXVvd1prVjFYU2RtWlFNQTFYV2RiUUVoaEJCaCtQRGhiN2EzdDkrZms1UHppK1A5WHJpNHpoNnJ0aFhMRnF4RFEyUW1WcTFmam1rV3dHN0ZMVGNzd1l5WnE3QmsyVlpjdVh3YVhLZlJyRFUyTnE2Wk9uVnFrODJ0WllhZ2xLWUxCa1RRUk1IcVY0TWthT2p1U2FFM25xQkNYaEF1bHd1aUxJQVFFVzV2Wm10SGFXa3BoZzhmL2k5OXM4THgvR092MTR1S2lnb1VGeGRuSEV5WjVkUmRLc3R5djVEVU5wV1F5TTNOM2REVDAvTXIvdXptT25lNXRnWWJqaXE0ZFA1QzBTQXhzZ0FBSUFCSlJFRlVCbXBwQlNmZWdzVUxic0NWa1FSYWJmbXZaYXNYWU1iVUdsU05YNEN0YWQrSHJRL2NoaGxUeDZPbXFnbzFrNjdCelVzMm9TbkJmTUt0dDJGODFYUXNXcnNhaTJaUHgvaWFLdFNNbjRvWkM5YWl6aUdmbHFqZmdFV3pwMlBzaUlxSHFxdXIzMmVjV2k5N0VVSVNZQStRVEovY29adU51TExMQjc4a1VJSHFJSG83OW43d0FkNDdsQVFoY2J5LzZTOTQ1Sy92SXhXSm9QaklVNWd6YXc1dS8vMmZjTnMxazFCVE5SVkw2Z0JzbW9lYXFrbFlzRDN6Kzl1NllEeXFhdVpoRS92QnBxM0g3NUtLaTRzSGRHMW1PTXFHcEdZTGlCR2FzdmsyQVlBd1pjcVVoOTk4ODgxQ1daWnY0azl6cm5OTmRhL3RRQksxdUdLS1U2d1p3YlJibDJKYXY0OXZ3OHBsVmJqaSt2bFlWRldMYWtTeGRkRU16Rm1Ud09RYjVtUHBCQmRhWDF1SGxhdHV3ZXpvS216T2NIc05XTE5vRmE2ZFB4LzN6UThpdW0wVmxxMWNpTmxSRnpZL2VCMzZ2b3Z0V0haekhTbysrL2tuOXJmOGcrMVg2eGVDc2xBRG9GTUtTb3pGVCttOG1nSi9VU21LdlY3NFBCSnl4cFlCeHhyd3dXRTN4bDR4SFJlUEhvTnhSVVVZNWcxQmtSSjRmdmtLakxuMlJzeWZXWVdKRVFCTlEzZS9DMmJQK1dUaFgzVjFOZUx4ZU5iMkR3WnNHU0VwcFpUcXVtNXZBU0U3ZCs0VXRtelo4dEQwNmRNTFJGRzhtai9WdWM0ZEpkRGFHZ1dVQ0NJczE2S3RhR1dkRmx3SVJvSU1uRW94ODc3MVdENHRhUHo3VFZpeEhaaHd5NE40ZE9IRTlMKzcvanBFV2lkaDRhYS9ZZnZ5YVF3Y0ZVeGUvRGp1dTlINGdsT21vQ3d4SFROWHJjQ3F1dXV3c0xidmE0Ni84NG5ObnpteTRma044UjZuWGpWN0ZWUWxBdEdoVTUxU25hWlNLVkFJVUVRWnNpeFRhN2pkbHc0OUpia1p1NDU0VVRsdUlpNDV2d0xEeThwUWZTeTlScS9xbHNleGZtSHRjWWZlZFN1WFlOM0JxazhHTmxFVVVWVlYxUTlzN0RTQ2JjeUttSVVFSStmR0ZoTUlJVVM0NnFxcm11cnE2bGJXMU5Ua0VVSW04U2M4MTdrQ3RrUWlEUkVYOHlyZXZ1UWEzTER1YU44SEFqT3g2dDNsREp5cU1YbGlrSWxacjhUeXpWZmFQbmNRMVdVUllIc3JvZ21nanhJdVJNb2lHZENjT1BNNlZLMWFpZTA3V29GYTgrOG12Rld1N0gxNi92ejVVVnRPcmNlNGVtMzlhdWxHWElsUVVKMXF1azdWWkMrT3RTZG8zT1ZIVVhrSWVVWnJSeUFRZ0JTVklZb3VCUE1McldaYzhWMENJSURheWJXZklKOVlqNjFiRzRBeEN6NTV3ajRjRHFPeXN0S0NXN1lLS2V2Y1RMZ1pVd2tnaEpqRkJJRVFRbXByYTk5cmFtcjZiVWxKU1M0aFpBUi8wbk9kL1RLQlpnRE9lRFhYM25JZlZsMmJBQkRGdG1YenNXb29vVmkwRG10WHJNQ2FUZHRSZHpDR3BHWFFxdE5JR29nVVpWVW9BMURmMEFRZ0FrcFIzOVBUOXVkN1oxN1ZZb05hWHdXVXlhc1p1WE1ycnliTExpckxNbVJCcDJxaUYvR2VPSm9iUGdMMVRjYmtrclJqa3pzVVNKSUw0Y0lTVkZaV0lod08vNHVQWlNzYVdnRmxZdlcvVm9rc0t5dXpCdVJadUdYTHRSbFFNNGUvekxCVU14NGNBa0FvS3l0NytlalJvL2ZuNWVVdEFoRGhUM3l1c3gxc2tVZ1FTRGFocVJWQW1lRzFxcWRnV2pVQVJORzZTaGxDanFrT0Q4eWVnZVd0RXpGbjRYSXNyQzVEMEFYVXJid1pDemNOMVR0YU9ucWd2WHYxNGNPdk5DSnpzTDNYSWErV012TnE1akoxZHJyQTdYYkRrMStFU2lXRnByMzdjS1RoTURDaENqazVPVkRhWFpBa0QvTExLbEJXVm5aQ0g5Vi91Y1ZpMUtoUkdhNk5EVW50SjM5UVN0bDhtMjRPd3hyaEtTR0VFRW9weWMvUC8zdG5aNmMvRkFvdEJ1RG1UMzZ1czFtMWwwNUVZTTFXL0cxVEU3Nys5VS80QXQreEJtdDJBWmV1ZUJDTHIrc0xVUlBCSVFaMDllK2dDVUNrcXF6MzRNR0RxNjVlOFhZZCt0bzZ6UENUZFd2OVFsQkNxSzRtazBpSkxuaDlNaFJGc2ZKcTNrQWV5dk1Qb0xNdGlWUWdqUHo4ZkxpT3VxRW9QaFJWalJyU0x3QWdrVUhmL29xZ0tnSWttNXFPcjkzRFNZUVFqQmd4d3BwTXlNL1B0eVlUN0dOWFpndUliZkd5T1hKbHRvQWtBU1RDNGZDZnU3cTZlQnNJMTFtdjRMUmJjSDFwRXUrc1dJQkg2aEw5d3F2VzF1UVE3RllDVVFDSktQUC9KK3J3L0k1V3V4c0RFRU45WFQwYncyTFRxazA0aURHWU1nb1BHZU5TTE5SNkdiaGxuTEZtdm43TmZqV0JnRkk5aFNUcEt4WjR2Vjc0UENuRTRnU0NQdzlsaGZrb0tpcENSV0VJaXFJZ21TU0QvM3lSQ0NLSW9iNitLZVBuZTYwdXh2eWpha3liVmdYc1duTmltbUlEZ1FDcXE2djdGUkkwVGNzMklEOVlNWUZRU29uZjczK3N1N3ZiNC9GNGJ1ZFBmNjZ6TnhxZGlJVVBMa0xkN0tWWU9tTTZuci91U2x3NnBoUTQyb0RYTm0zQXRvWUFKdHd5RXhNSHRIM1g0c3I4ZFZpM1pEYm1OVnlKYXJSaXg2WU4ySEV3Q1NDS1JCUUFVMnZZdFh3MlpqUmNqMnNuNU9Qb2EydXcrbTlIRWI3MDlnZC9NS25nSHc2aFp3OHlqeU95T1RXekVWZWliaDhRNjByUytORVdKTHVEeUFtbjBCTnJ3NzcyTnJRblhhaWVQaFVYR0lkR2puU05RdWlKTFZpelpBbHd4YVc0N3NacEtCdm81eXRkaFZYTGJzYThnek14d1hVUTcyemFnT2NiQURDTDRHdHZXWXlaRythY3VHNy93c0pDeDF5YnFxcHNQMXRHV01vV0U0eFBvOW5EMGxtelpqMzg1ei8vV1hHNzNkL21yd0N1czVadHRWL0g0NXRyOGNpeUZWaXpkUzFXcklzaHFlU2pxbllhYmxrNUgvT3ZyQjY0U2hpY2hxV1BMNE5yMFFwc1dMMFNXMTFWbUhMOWZYaDh3dk5ZdExJSkI1bjhIUkRBRllzV28yemJDcXhjMG9Db3F4UWpyNzM3a2ZwWGY3a1YvYWNLckJDVUVDUW9OVmZvV1ZEcmE4S1ZaU2lLajVhR0tIcWljY1I3WTJnOUhNTlJRVUc0c0FwVHAxNk9hLzl0SkVwTFMxRlZWWVh5eSsvRTRqZWJzV3pES3F4b3pjZTBHNmNORFA5SGx5RzZZQVUyclZxT3JZRXFUTHh1TVpaTlhJR0ZHeklmaCtXUHJ3UmhEM0k3RWRxOWV6ZDI3OTZOeHNaR0hEcDBDRWVPSEVGN2UzdkcwVWNHQUFrRFFHTDB1d2tBUkVxcEJFQUc0S0tVdW4vMG94K0ZmL2pESDk3aWNybm04WmNBMTVrcVRkUFExTlIwWnAreHR2VTJqSit6RmROV3ZZdjdESTdFWXJIZmYvdmIzOTc4aHovOG9ZZHhaVDBBdW8yM1BZUVFxMkJBakcxVDdQbHF6TkhlMWhscjV2eW5lYjVhU1VrSmhnOGZqcHFhR3RUVTFKelVIL09FejJlT0hqM2FDa250N1I5WlhKdDU0aTZRV1NtMXd0S2YvT1FublpGSTVPRzVjK2NLTHBkckxuOEpjWEdkR01WaXNUOHNYcng0aXdHMUpBTzFIZ1pxL1U3RGRhcUFzc1VDbjgvbmVMeDNaV1VsUm84ZWZkSi9yaE1PTmtJSVJvOGViWUhOM3ZxaGFacDE1QytUYjh0V0tiVSs1M2UrODUwMlJWRWV2dW1tbThEaHhzVjFZcUMyZE9uU3pTdFdyT2hDWnFHQWJjRE5sbGZUQlVGZ04weFJjeEdML2NCSTA2MlpVR09QQnYvVWdBMEFQQjRQUm8wYTFhOXAxOWJQMXErWVlMZzAwN1d4Y0NPRUVESnYzcnpXUkNMeHU3bHo1K3B1dDV1SHBWeGNuMURKN3RqdkZ5OWV2R1VBcUxGT3JkL3FQT1BBU0dwM2F1Ykt2RkFvWkIwWVdWeGNqSXFLQ293YU5Rb2V6Nm5aZGkvZWZmZmRKK1VUbXdkUW1uQXpLNlFzM0d6WFlCaW5BTEJ4NDhZVUllVDlpeSsrV0pWbG1ZOWVjWjB4b3BRaUdvMmVnQTc2azZqS3EzSER6VGM4OHZTeS8yL0w3MzczdSs1c1RnME9rd1Zzb2NDRW1zdmxvdXdKdVBhVmVXYWhZTXlZTWNqUHp6OWxQK1pKUFFPdHNMQ3czelNDUTRVVVRKN05xcFFDZ0cxZ0hvUVFVRXF4ZE9sU3ZQWFdXdyt1WGJzMjZmVjZlU3NJRjljUTFkSFI4ZUFWVjF5eDlhMjMza3BtYzJxd0hVUEVWajh6SzZCOVRzM2MyczdtMUlxS2lsQlJVWUdSSTBlaXNMRHdsUDZjSi8xd3gvTHk4Z3pYeGs0ajJGMWIrcGNlSlFDb3Fxb20zRFEyTERYaHRuSGpSdmg4dnYrTnhXSzlmci8vZHZBSkJTNnVnZFRiMnRyNlVFRkJ3VC9RLy9UYmdhQ21FVUkwb2U4SW9xemhaekFZUkRpY25pb29LaXJDc0dIRHJPYjlVNjFUY21wdGRYVjExdVBEbVZOMlRUdHY1ZHBVVlRYL3poRnVBQkFJQlA3WTBkSFJIUTZIYndPZkxlWGljdExSZ3djUHJqSW1DdGpaeng1YitPa0lOV2JCY1FiVW5GYm5tVkFyTHkvSGlCRWpVRjE5ZWs3OVAyWEhjZGZVMUdUYmkrRG8zRXk0QWVuK29BSGdSbk55Y3RhM3RMUjBSU0tSYi9GVFFiaTR3QnFGK3ZyNit0VWpSNDZzRzhTcEpiSkJqYzJwWlFzL25hQjJzbnZWemdpd0FjRFlzV1A3d1MwTDJDeTRtUW0zYkhBei8xeFlXUGhzWTJOamROaXdZZk1FUWJpSVA2VzV6blZwbXZiV3UrKysrK2NMTDd5d0VmMW5Qd2RyNmJDZ05saE96WVJhWVdFaHlzdkxVVjFkamJGang1N1duLzJVZ28wUWdyRmp4MloxYlE2L2JWZ0g1d2czNC9OU1Npa2RQbno0UDNiczJORTVidHk0YjRxaWVCVi9hbk9kOFRyMnU1UHlhVk1wYmZPV2JidWV2bXJtL1MxTStHbWYvZXdoeHJxOFRLaFJqUkJLUllGUVVhQlVsblRJb2c2WHBNSXRxL0FxS2ZqZFNRUTlDWVM5UGNqemQ2RXdGRWQ1WGhUVmhaMFlXOTRHRW4zOTNBRWJBTWl5Yk1GdEVNZkc1dHV5d1kwYUg2ZG1hRHB4NHNRUDFxOWZ2L3lhYTY1cFZSVGxhL3lWdzNXdXFiczcrY1REajIxN2Z2NGRmNDRPQUxWZUFpUkFZS3QrUWlNRWFhaUpoTXF5QUVVVzRYSkoxTzJXNGZVbzhQbGNDUGpkQ0llOHlNdjFvNmd3aFBMU1hGUVBMOERZbWxMSWtuamFINFBUc3ZMTzdYWmo3Tml4am5rMjFxMnhJU2toQktsVUtuMFVTUHIvMC9yWWx1bmNac3lZY2JDbXB1WlhiN3p4eGhHLzN6OGZmTFVmMTdraHRhMDkvdEQ0Zi91dmx3ODJ4KzA3Q3RqejFFeW8yWndhZElHQUNnS2hrZ0UxV1JhUTZFelF6cUFMWTNMU1VBc0dHS2dWaEZCV21vdnE0UkdNSFZNQ3QxcytJeDZJMC9hQzkvbDhGdHpzWUxPSHBZUVFhdVRUN0swZzlna0Zhc0p0OSs3ZGVpQVFlS3lscGVWd0pCSzVoUzlsNWpwVHRmMmUrM0h6MGY4WDcvNjY5aFB2RGFXVU5qVHVPN3FtZXNLaTk1RzVUYXJmZVdvTTFOU0JvS1lvSW5VcElxaVFSRktSNGZlNUVUQ2hsdWRIVVVHd0QybzFwZkI1WGFoLzlwL1luajhPTjM3RzcvQmR4ckgxdm1ldzVPbjlhSXBKaUl3Ymg4VS9tWTRyUzg0aXNBSHBjOXpHamgzcjZOall2Qng3L3dhQkcyV2RHd0JhV0ZqNGJGMWQzZUZSbzBaOVhSVEZ6L0tYRWRkWlo5TlViZXYyTnhxZW5ucjFMNXlXR2R1UDgwNkE5QjNwM1FjMVFnVUJWSklFS2t2RWdKb010MXVBSmhLSUxoY0NBVGR5V0tkVzFnZTFRTUFOUUVYZGM2OWdaVW1WSTloYW4zMEd0ejB0WWVsanQrTzZrbDVzL2RFYXpMdmpEV3grN0NLVW5VMWdBNEJRS0dUQmJSQ285WU9ia1c5anozT3pnR2JBVFFlZzE5Yld2cjE2OWVwRE0yYk0rTmp0ZHMvaEx3V3VNMVdKWjlkaC9JUEFqYU1UMkxxekRhMUpGNmJkTmhQTFA1OEhGMXF3N0QvV1lQdm9LcmoydEtBcGxvQllOV2IxZVNQVkxiKzU1eTh4WkxaejJNTlBhKzZUVXFRRVFqUVE2Q2JVUkFGVVRlazBtZFFCUXFnZ0U1U1Z5dkI2UkdnUzBPMTJHVkR6UUR1MEgzOTZMb1pPM1l2eUM4ZmpoejhlanV1Qys3SGtQNTdDMmtNYVlsaURTWHN1d2VNUFg0UytNRW5GanVjT0lmanZzM0JkaVFUQWoybHp4cUg2S3g5aWUrd2lYSitvdzd5dmJFWGtaN2RpNldmT0FyQUI2WTFYQTVXSFRjQVJRc3lMRWtLSW1YTXpjMjI2cmxPMnY0MTFiamZlZU9NaEFQZTN0YlY5bkp1YmV3dUFZdjR5NGpvamRlZ1ljTmNzYlA2Wkg5RlhuOEgwTzE3Q3BzL094SFVCQUVpZ1ZSbUQ5WC81UW5QeTQvMS9MSnR3ejl0Yis1YXFKQm1Jc1VkNUp3aEJrbEtrUUtBS0lCb0lOSUdBRW9Ib29rQkFVeHJWaUlDY1BCZjFTeFR0clFtMGRJc29LM0JCbFFVbzNuVDQ2VG42TVZidkN1SzJIOC9Bdk10ejhmRmp6K0xtYjI5RzVDOVhZZkZmYnNXRTIzK05aU1UzNE9VRjloR3FYclRHVkVSS0dDZVg3MGNFdldnOUNtRDRNTnh5MTc4ak9PNHNjV3ltY25KeU11REdRS3dmMk96T0RRQmg1a3I3T1RjQXV1SGVhRjVlM2wvcjZ1bytIalZxMUUyaUtGN09YMFZjWjV4S3FqRFRDT1dDbzRlaE92a0dXbU1BQWdBZ29tWnl4VXQ3dDMrNDRaS3JmdEdFZ2Jlejk5cENUeFZJaDU2RVFCY0VRZ1dCUUpJSUpScEJVZ2NsZ2dpWDM0VVJ1VUVvWGkrQ0FRa3BSVURVNzBOeGdRdjFyM1doK2t1Zng3ekxoeUVuN0VYT2JaZmh1cWZYWWMwL3BtUEtZSW1lZnFzYlJBQXFZa2tBOEdQaVovMW5UeWhxaDl0NTU1M1hEMm9EUUk2U3RQcmwzQ3diMTljT1lvYW1XbTF0N2RzLys5blBHci96bmUvczhucTkvTWh4cmpOWFJqVWhZV3hqNlVscEQ3L3kyTnFYSDM1dVc0OHRuOVovN3llUXBFQ0tXRkNERHZSQlRSUUpsU1FDV1JLZ2VDWHE3a2toMnQ2TnpyWWVCQ0s1T0wvWWpaeXdncVJiUkdjb2lQSXlOeHBVTDJvdkhJR2NzTmRNSnFHcVJNWHpSM3N4NkxpMll2K0FCa0JDUURueEQ5c1oxd1lSRG9lSEJEZDdXR3ErYnh5TnBKdEFZNG9LT2lIRWRHNzZIWGZjb2Q5eHh4My9lK0RBZ2IybHBhVTNFMEltOGxjUjE1a3FxdE4zZHUwNXN2N3VWeHIzQW8ycVF6NHR3NlVSZ2lTb0JUU05FR2lnMEVGQUJaRlFTU0JVa3RMdEhJb2lVZ2tFdmtJL3l2MEtmTEtPNW8rTzR0Mm1mRXdZNFVmU0k2RXROd2NqcXZNUXJYZ2ZyMFoxNWp1TG8rR29oRWorWUdkUXVCSEpsOUI2S0E0Z2xQN1EwVGhhNFVQa0pKeG1KSnlKTnpFVUNtSGN1SEVZT1hJa2hnMGJodUxpWWtRaUVlVGs1R1JiN1VjVlJRR3oybzh5cS8wMDQ0ejJGSUFrSVNSQkNESFBjKzh1THkvZnVtN2R1aC8yOXZhdTRpOGZyak5ScXE2dGZ2R0pMZjlUTy9sL2RpTnp6NmYxUEdZdWEwVWVOWjJhY1paYStoYzgyODRoR0kyM0lsTEhlckMvVFlYc2RTT1U0MGUrWDRMaTg2RzRLSWg4bjRKQVFUN0dqYW5CRjJjUFI5MnFGN0Roa0FxZ0Z6c2UyWW9OR0lNYi9oOEpnQVNYUzBLaTdSaGFFLzA5MUpUTGhpSDYzSGFzYlZTQnhERnNXdlVPNnNlTndwUkFHcEE3WG14QWZlSXNkV3ltQW9FQXhvMGJCMEVRSEM5Q2lQMnQ1ZHhTcVpSWk1XV0xDcFFKVFUzM3BnSFF2dlNsTHpVQitFMVRVOVBPa3BLU213Z2hFL2pMaWV0MFM5ZnB1eC9XdDY5ZisrR2JlN0RzVFpVSlBaT09MbzJCR2FWOSt3bEl1ajlORnloRlN0ZHBUMUtFenl0Q1VTVHFka2x3dTJYa2oxQ2dISXpoblRmam9LS01nb3BobUgxVkdTckt2VWdFWERoWVdvSkF3STNBNTcrQUI0OCtneVgvK1dzc2lFbUlqQjZEeGIrWmppbEd5RHpsK25Fb3UrTXBUUDNQUy9ETUV4ZURiUjROWHZYdmVQRFFjMWcwOTlkWVpQU3gzZmVUaWVsV2o2UDdzZkpIVzFIMm0xdXgrUHgvL2JFNzRWdXFUclI2ZTN2eHdRY2ZvTDYrSGdjT0hNRGh3NGR4OU9oUmRIWjJJaHFOb3F1cnk5cDhsVWdrekYwTGhObCtCVjNYQ2FWVU1DOGpheWtCa0NtbGlwSEpjQUZ3clZxMUtqSnIxcXpydlY3di8rRXZMYTdqMFNmYVVwVmxWalFhNjNuMGdmOTljZHNkZHo4VlIxK0JnQjJQWXNQUWRPZ0pOdlFrT2tIL0lvRXNDWkJsa2JxVXRMdnl1R1Y0dmE2TWlZTDh2QUNLQ2tJb0w4dXh4cVRPbEltQ1Q3MWpzeUp6dHh2bm4zOCtSRkhzZDdIdXplYmdzaFVWS0pON000c0tPdEpWVXcyQU9tZk9IRzNPbkRrUDdkMjc5NjJxcXFvYlJGR2N4bCt5WEtjczdGVDFsM2UrZitDWkN5Kzc5Mk1EVW5hWHh1YlVrZ1JJWmt3Um9LOC96WEJxVkJTWUlvRWlVa1dSNEhiSmNCdFE4L3RjQ0FZOHlBbDVrWi9Iekg1V0ZXRHNtRE5qOXZPc0F4dVFIcHdmUDM0OEpFbnFCemI3V3daMlZCQUVJZ2dDVkZXbHpMNkY5TjYvdnREVXFCUVJ6UXhOQWFpalJvMTZmY1NJRVR0ZmYvMzE2M0p5Y200Q1VNcGZkbHduUzVUaTRKSFdZMDkrWnRwUDNtaEt6M215VUVzNFhFa0hsOVlYZXBxVEJHSmZrU0R0MUdTNDNSTGNiZ1UrYjNyMk14VHdJQnoySVdKQ3JTd1hJNFlYWXV5WVVweUNoVkxuTHRpQWRIdkhlZWVkQjBtU2pnZHcvU3FtaEJCcWhLWmduWnVaZDBONkc3MEdRUDNvbzQvVTNOemM5UnMzYm56anNzc3UrNkxiN2I2SnZ3UzVUcWhDL3dkZFhWMXIvdnJYdjI3NzZsZm5kUXppMGd5Z0VSTm9LZU1Yc1hWK0dyT2JBSklrT2U3OE5FKyt0ZS85WkkvelBwMkhSSjVUWUROVlUxTURXWmJOQ2lpTU5XQ09JYW9KTitNdFllQUdQUzNyU0NTemdkZkp2VjE5OWRXTkFINWJWMWYzNnNpUkkyZEtrdlR2L0JYSjlhOHFsVW85djJQSGprMlRKMDgrd0FBdEc5U1NETlJVOUEyd214R0h0V3pGT01iYmZKMVFSVkZnUHlEU2hGcHVibTdHaXJ6VGVaejNPUTAySUwxRHdXenZNQzhXY0U2aHFYSERyZENVcVpwYXJvMEpUVFhHdlZsUG90cmEycmNBdk4vVTFQUkNjWEh4bC9oSnZWeWZSTHF1djluUTBQRE15SkVqZDVtL1BHMUFTenE0dEpTRFM5T1ppeHEvMkxOQ3pldjF3dXYxSWhBSVdIcy9Dd29LTEtpTkhEbnl0Q3hlNFdCalZGNWVuZ0UzODJhYW9hcmR4Um1ncytDV1NxVW9JY1E4OE5KZVdOQVp3R1c0TndDcHNyS3lGeSs4OE1KL1B2dnNzMWZtNWVWOWlSQlN3MSt1WElQbjBlaWU1dWJtcDZkUG43NWoxNjVkS3BNZlkzTnA3TnVrRFdvcTgwdlhBcHE1RWs4VVJmYVhQWFc1WEJsUU01ZXVtSHMvSTVFSVNrcEtyR1hHcDNwRjNzblVTVnVZZkNwazJtbW5mSno1ZG9CeExIdGExSndyaFFFNEdIQ3pHbjFOMkFIUW01dWJ0ZVhMbHpla1Vxa1hMcmpnZ21hMzIxMUNDTW5oTDk5ekdseU9DNU1wcFkydHJhMlBMVnk0OEUrelo4L2VmL1RvVWJzcjYzZGtOOUxMVlhydCtUUm1jYkhUUm5Zb2lrSVZSZW1YUzJPQnhpNWRxYTZ1UHVYTGpMbGpHNEp5Y25Kdy92bm53L3p0eEV3Z1pPVGgyQ3VSU0RpR3BveDdNNGZyQlZ0NHFnRlFqZkEwQlNCMTc3MzNKdSs5OTk2L0xGMjY5SVZ2Zi92YjAwT2gwRXgrcUNXWEFiU0cxdGJXRGN1V0xYdnJsNy84WlMrVEczUEtwYkZoYUFycDQ0VlVRbUJHQ3hwQStrWUZBVXBBYVBxcFNrQkJRQ21vVGdGS0NYUUthRHFGcGdPcVJwSFNnSlFHSkZXS2hBb2tVa0J2aXFBblJiRDdvd01BRHB4VmovMm4yckdaa21VWmhZV0ZqcWVBREhIZTFHN2d6Qk43MlJOQzdOVlR5NzBCMExaczJaTDQrYzkvdnJlN3UvdjVDeTY0b01uajhlUVNRZ3I0eS92Y2MyekJZTEN1cGFYbEQ5LzczdmNlbnoxN2R1TS8vL25QWGdlSDFtK25weTJucGhKaWdkRElwNldmaTRRSUVBV1JpcElJU1RKeWFiSU1SVW4vY25lNTNYQzdQZkI2ZmZENS9BZ0VBd2lGd3NqSnlVVitwQURGeFNVb0h6WU1WZFVqSUVueVdYa3Z6dmpKZytQVnh4OS9qSWFHQmpRMU5WbFRDaDBkSFloR280akZZdWp1N2taM2R6ZDZlM3VSU0NTUVRDYk5UZldFWGVxczZ6b3hMK054TXFjVzJNa0ZpVklxQTVDUlBydkF1cXFxcXBSWFhubGxhbUZoNFRXQ0lGek1YL1pudjVMSjVQWTMzbmpqaGE5ODVTdnZOelUxbVNOTnJFT3pGd2d5SEpveDA4eU1RaEh6bHlobEs1NW1vWXd0RUdRckVwanRIR2I0V1ZaV2hxcXFLbFJXVnA3VjkrS3NXM0pTV1ZrSmo4ZGpEc2ViZVllaEZCaW9VVTBscXFwYTRhblo5MmE2TlNNODFRY0lUNU1BbElhR0JxV2twT1FGQU52Mjd0MDdvYkt5Y3Jvc3k1L25MLyt6VDRsRTRtKzdkKzkrZGNLRUNZME16Tml3TStrQU5SWjJxZ0UxcTlwcGdJMmF4UUhqdVVtWjU2NEZORE9ueGhZSi9INS9SazZ0dUxqWXlxbWRUVVdDY3dac0FGQllXQWl2MTJzQnp1MTJnMzBTMk9IVzI5dHJBUzZaVEdiTHZWRktLV0hQZURQUGQyT2VtQ25Ed1ZtQUE2Q01HalhxZFFEdnZQRENDMDlNbWpUcFVyL2ZmdzF3d285NTV6cTFZV2RUTEJaNzdzVVhYM3o3aTEvODR0RXNRSE9DbXVuT3JHRjFJNCttMjZ1ZEJ0UmdWanpONTZ1VFN6T2haaThVbU8wY1p1TnRJQkE0Sis3UFdSZUsybk1lZS9mdXhiNTkrM0RvMENHMHRMU2d2YjNkR3FDUHgrUFdBTDBabWhwRDlFZ21rMUJWMVhSdkdlR3BzWGhHb0pRU3c4R1o0YWw1c1NFcUc2cktBSlFiYnJqQnZYejU4c2tGQlFXWFM1TEVUL0g5RkVsVjFSY1BIRGp3NnUyMzM3N3JxYWVlU2cwUmFDazcwQUMyS0pBQk05MmNkMmJEVHRhbHliSU10cFhEUGtrUURvZVJtNXVMd3NMQ2pIWU84bW1kaitKZ2MxWlRVeE0rL3Zoak5EVTFvYVdsQlcxdGJRUG0zY3pjV3lxVmdubEtDQU00WXF3TUpPdzFBT0NrTElDVEFjaWJOMjh1ditpaWl5WUhBb0hwdkIvdWpQMEZ1YWV6cy9PbGJkdTJ2ZnZGTDM2eGpRR1NFOUJTV1lDbTJvRm1IbnhxaHB0Mmw4WUN6ZXhQTTEzYVFQbTB2THc4RkJZV29xeXNESldWbFNnck8vZUNnM01DYkFEUTJkbVpVVlJvYlcxRlIwY0hqaDA3aGxnc1poMS8xTnZiNjFSWWdBRTJZcm8zRm5CTWdZRUZIRnRrRUEwSFo0ZGN4dlhlZSsvVlZGZFhYK3p4ZUM0SFVNS1JjbHBoZHFpN3UvdWx1cnE2SFpNbVRkcVB2aXI0WUVDejU4NVlWMmNQT2FsNUlBT1Q0MlZkR2p2cjZSaDZzazIzN015bldTU3c5OVJ4c0oyRjBqUU45ZlgxMkw5L1A1cWJtOUhhMm9xMnRqWWNPM2JNT3R1dHE2dkxPdHV0dDdjM0EyNE83czBNVDgwejN3WUMzRkFnWjM1TTJyMTc5N2lLaW9xTDNHNzNaUnh5cHc1bVBUMDkyejc2NktOM3g0OGYzMmdMRjUyQXBnNFJadjJBQm1zUEJ5Z1JDQlJaN2hkMnNpN05MQkM0WEM1cjN0UG44eUVZRENJVUNpRXZMdytSU01US3AxVlhWME1VeFhQMlhwNVRZRFBWM055TWZmdjI0ZURCZ3poeTVFaEdhQnFQeHkyNHNZZFhzbkJqQWNjVUZ3WUNIREhBSmppRXFaSU5hckx0WTlMT25UdEhWMVZWVGZCNnZSY1RRc1p5QkowNDZicGUxOVhWOWRxZVBYdnFMcnJvSXRhWjZReVlCZ0theWdCTnBaU3FScVhjNm5FME42V3hRRE1ybmJxdVUwRVE0WGE3K2dITkhucDZQSjUrUSt4bTZGbFFVSURTMGxKVVZGU2d1Smh2bGp3bndRWUEzZDNkYUd4c3pPaDNhMjl2eDdGanh4Q1B4eEdQeHkyNE9ZV21XY0pUQzNBT09UakNPTGlNWEJ3RE9DZlFaZnpkeG8wYml5Kzg4TUxhY0RnOFFaYmxpMkZ0eHVBYW9vNmxVcW5YMnRyYWR2N3puLytzbnpGalJwc0JJSDBBZCtZRU5mYUVqWDdGQU1haFdia3pOb2RtRmdZMFRZY29pdkQ1dk96d2VyL1EwNFNhMysvdjE4cGhocDdEaHcrSDErdmxkL2hjQnB1cEF3Y080TUNCQXpoMDZCQmFXMXNIckpxeW9ha3Q5ellZNE1BV0dXeVFNNTJjR2FhS2RwZzVBUTZBT0g3OGVQbVJSeDZwcXFxcUd1MzMrOCtYSk9rekFQejhhWjJodUtxcWIwV2owZmYzN3QzYjhJMXZmS09wcnE2dTMrU0lMWFRNQmpRV1p1ei9vOXVBWmprMDQ0SWRhR2JZcWFvYUZTVUpBYjh2QTJoc2IxcTJxcWM1eEY1ZVhuN1duTXJCd1hZQ0ZZdkZyTkNVclpxYTdzMXByMElXOTVZQk9GM1g3VlZVWkFsVDdaQXpRMVVyTCtjQU5zbjJkMkpGUllXNFpzMmFZU05IanF3S2hVS2paVmsranhBeTRoekxrMzJVVENZLzZPam8rR2ozN3QzN3Z2YTFyN1UwTlRYcE5sZm01TTZ5dVRUcjc4eG1iTnZueUlDWnphR0JyWEtheDJteGhZRmtTb1VrU1FpSGdoa3V6UXc5N1EyM2JOWFRERDNQbGQ0MERyWi93YjJ4VlZQVHZjVmlzYXc5Ync2NU53dHdwbnN6SVdjUFV4bkFPWVdxOW5CVnRBSE82WDNSZnYzaUY3L3dYM0hGRlNXbHBhWEQvSDcvY0ZtV1J3aUNNQnJXS3Q1UHJSSzZydTlKSnBQMXNWaHMzLzc5K3c4Kzk5eHpMWGZkZFZlUENaaEJZSllOYWhudk04NHNJOHhrUTAzWTVvbVp3MDJJcFFpWEFBQUdHVWxFUVZRdG1ERXVqVEtOdGtna1U1QWtHWG01NGF5OWFZRkFJTU9sbWFFbmQya2NiRU5XVjFjWDl1L2ZielgwMm52ZXNoVVdzZ0ZPMDdUQkFHZDNjU2JnaUFQa0JBZklEZmErNk9BR2hmWHIxK2ZYMU5SRTh2UHpDLzErZjRrc3k4V2lLSllSUXNveDZFcnZVNlplU3VrQlRkTU9KcFBKNW5nODNuemt5SkhXdXJxNnRpOS8rY3NkWUE0bUdBUm0yUnlhNC92MjVEOExNL1F0QUtKc01jQjBad0FnU1ZJL29MRjlhV3h4b0tjM21UN0VvU0MvWDRIQXFUZXRwS1FFdzRZTmc4L240eTlXRHJiajErSERoL3NWRnV6dXpkN1VhMDRzT0xnM3EvZU5CWnltYVNiWXdQVEN3Y0hGMlNGbkFZcUIzR0NYWUh0ZnNMMXY1ZjkrL2V0Zis4ZU5HeGNzS2lvS2hrS2hvTmZyRFNxS0VwUWtLU2lLWWxBUUJEOGh4RThJOFJGQ1BBWUl6UU1Bek04SkJnelcyamhLYVErbHRJdFNHdGQxUGE1cFdreFYxV2dpa1loMmQzZkhPanM3bzgzTnpiR2RPM2ZHRnl4WTBNM0FpOXBBUmdlQW1XNXpXTnBnbC8yOHZXd3dZMEZtdWpObVN4b0ZBRVZSTEpqWldqZ3lpZ095TEtPN0p3bEZVVkJTWEdBMTI5cGRHbHNnS0NvcTRpOU9EclovVGFsVXlpb3NIRGx5eE5wbk90U20zcUVDenViaVdBYzNFT1FjWWNkTVB3Z0RRRTEwQUp2OVlyL09RQmNjM3RyZnowaURPYnpQdmgzb3NvUE1mbVZ6YWYzZU40OStkNExZWURBejM3ZnQxSUFvaXFDVXd1VnlaUVdhdmVJWjcrcUZ5K1ZDeGJEU2pHYmJjRGlNL1B4OEZCUVVXQVVDV1piNWk1S0Q3Y1RwMkxGak9IandZTC9jMjFENjNveVpVM3Q0bWhHbUd1N05ncHd4eldDRnFzeDlzdWZraUFPRXNzRk95QUl6Y1FoZ1l3RW5PRUJ0SU1BTkJEYzcwT0FBc1lFY21wN0ZyZGtUKzROQ2pDa0FVRnVZYWNMTUtnUXdGYzZNSFJ1aUtGSktLZHh1ZHdiUUpFbXlISnE5T0JDTmRjUHQ4V0RVaU9IOUtwNUZSVVVvTFMxRktNUTdlampZVHFKYVdsb3kzQnM3a2pWUWEwZzI5OGEyaDVqVlU1dUxBek4wYjdvM2UwNE9EbzV1VU9EWnFyRk9RQnNJYnNmajNJNEhiTWNUZGpvQ2pxbE9aZ1VZQXk4V25tQnpadWFmMlRDVFhRN0VBSTJ5dVRSS0tieGViMWFYWm0vaDZJeDJ3ZXYxNGZ6emFxeHowMHlYZGk0Y0w4VEJkZ2Jwd0lFRGxudHpLaTdZcTZkT3JTR3BWTXB5YmpiQVFkZDE0Z0E0MXNuQkZxcmEzWno5ejNZb1pYVmlEdUV1R1FSczJWeWJQU1NsQThCdElNRHBUbjltb0RTUXM3UC9QeGxmaS8yekxkU0UzWm5aZ0VadGxVN3JiRDlkMStIeitRWnN0R1ZuUE5zNllnZ0VncGd5YWFMbDBuaTFrNFB0dENtWlRPTFFvVVA5aWd0c2VEcFkvbTBBOXpZZzVNeGlBK1BrN0c0T1dSeWRIVVJPMTZET2pBMkhUMGFPemJaVWh3NFJlUFlMdGlQZFlRZVozWldaem96Sm4yV0ZtUjFxSnRnMFRVTXdHQnh3YUoxdHRHMDVlZ3poY0E2dXVQd1NsSlNVUUZFVS91TGlZRHY5NnVucDZSZWVzdFhUb2JTSDJPRm1tMkJ3bWtlMVE0NXRIWUZEWGc0MktNSEIyV0VBSnpiVWZKb1R6TEk1dHFFV0V1eUF3d0FBZ3gxYzlqd1preStETFc5bTMwT2JBVE8yZllOZDFHM1BwV21haG5BNG5IVyswNngybW1IbndjUHR5SThVNExKTCtJcmFFeW1KUHdUL21qd2VENnFycTFGVVZJVERodzluRE5XeitUY1RjSFlITjFEMTFBRndsTW5ERVJ2Z3FBMTA1a1ZOb0ZGS3pjTUcyVjlvZzRMS0NZWUR3R3lvcHhuU29VTE9ZUzBpYkNFbCsyOHozbWVjbVNQSUhJQkc3VXUzQndNYWUybWFocHljbkg1YjE5bWpoY3loOWFLaUlrQ3E1eThpRHJZelZ6NmZEOVhWMVNndUx1NlhmMlBiUSt5QXM4K2VabWtQY1FwUnFRazFUZE9zL0pzVDZFekFNYTdPaEYwLzE4NUFiREJvWlFQWUp3VmJWc0F4SjcvMjBiZ1BkckE1c2d5STJjTE1maUF6TjZqYlE4L0J3azU3RHMyOFZGVkZmbjYrZGF5UUhXaG1IbzBQcTNPd2Zhcms5WHBSVlZXRmtwSVNLLy9XMXRhVzBmL21WRUU5SGdkbkMwOHozQnliZzNOd2NIYlltWEJqMzJaQWovMjdVNUhDWUIyWDdXUDk0R1Y3NndneEI2Qmw1TkJZcU5uRHpzRWNtajJINW5hN2tVcWxVRkpTa3RHUGxwZVhaelhadXQxdS9pTGhZUHYweXUxMlc4Y3lzd1VHdG9MS0F1NTRjbkFPN3MycFRjUU91bjRGQjlQWjJRSEgvSmt5UlFuVzFmV2ptaFA4aHVMVW5NN2haei9HZ3N2bXh1enVMQU5tYkl0R2x2eVpZN2c1VklkbXo2R1pVd09wVkFxVmxaWEl5Y25KbUJxUUpQNVNPNVg2L3dIRjFGblo4ajFpeHdBQUFBQkpSVTVFcmtKZ2dnPT0iXSwgWzEsICJkZXNjcmlwdGlvbiJdLCBbInNyYyIsICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVRZQUFBRTJDQVlBQUFEcnZMNnBBQUJNQzNwVVdIUlNZWGNnY0hKdlptbHNaU0IwZVhCbElHVjRhV1lBQUhqYXJmMVp0aVc1bFdVTC9rc3JvZ2tpcUFSb0Rpb1o0L1VnbTU5ejRpaU5SdEk5SXZ4bG1sSUwzbnV1Rk1BdTF0b1ZydjMvK1grKzYzLzlyLy8xdktta0srVzNsbGJLelgrcHBSWTYvNmozNzc5Mi9uenVkUDQ4LzhYeTUxL1B2Mzc5K3VzYmdiK2puL3g5NCsyL3Y1L08xL00vZitBZjkzakd2Mzc5cW4rK0UrcWZDLzM1QmhmK1BZRjM5dC9yN3cvSjE4UHY2MC82YzZHMmYvOG9yYjUvZjlUeDUwTHp6d2ZQby96NW5mNTZyTjlmL3Yvclg3N3dza29yYzZNWXdvNVB2TStmNmZjRThmZTc4L3M5ZndZKzkvQzFIbU1zRjM4OThmMXpNUmJrWDE3dkgzL2Y5OThYNkY4VytSLy91djU5OWYvNjE3OHRmdWgvdmg3L2JTM0xuelc2eTMvOWpTZi8yOWZqWDdjSi95SU9mejFSK05kdjNDSEYvM2lkUDcrL2I5WHYyNyszNjBoaFMrV1BSSjNGZnY1eEdUNDRXUEo0ZnF6dzYrVjM1dC92K2RYNFZlOStUN1o4M2ZNZS9KcFBld0s3OGwxUGV0YlRuKy9aNSsvNVRCNHhoUjFlL2c1aGhuaStWdU1iV3BqUmZVcitlcjd3eGhaWHJPemJEUHRpNjFJTWZ6M0xjKzdienYzbVU3bnpldmhvZUxpWVcvM2YvcnIrZDkvOG4veTZ2bSs2Uk05ZC8xb3JuaXNvMXp5R08rZWZmSW9OZWI0Lys1YlBBdi9qMTUvdHYvOG1QNGdxTzVqUE1sZGVzTi9qZDRtUm4zL0tWano3SFBsYzV1K2ZDajNYdS81Y2dDWGkzcG1IZVNJN2NKY241cWM4OXh2Qyt6eXNZMldET2s4ZVlncURIWGh5RG91SFJGNWlDZGNiYXZEZS9NejduTStHSEVyd3k5Z21OaUxIZ201VmRxaXpXU2xsNU9kTkZSbnFPZWFVY3k3NXpmWEtMZmNTU3lxNWxQSVdqVngvNDV2ZS9KYjNmZXZiM2w1alRUWFhVdDlhYTZ1OWhSYXhnYm1WOXJiYVd1czlYSjBiZGE3VitYem5LeU9NT05MSW80eDMxTkZHbjRqUFREUFBNdDlaWjV0OWhSVVhabUtWOWE2NjJ1cjd1VGFXWXFlZGQ5bnZycnZ0L2lGclgvelNsNy95dlYvOTJ0Zi8yclUvdS9vZnYvNEh1L2I4MmJWd2RzclB2WC90R2wrOTN2Y2ZsM2cwSjlrOVk4ZENldGp4MXgxQW9JTjdkdGNucGVET3VXZDNDeWhGRGp4a2RtK3U5YmhqYkdIYVQ4amY4OWZlL1hQbi9xLzI3Y3IxLzJyZnd2OXA1eTYzN3Y4Zk8zZXhkZis1Yi8vRnJpMzkzRHc3OXROQzEvU09hQitmNmFGZS9MNXYvdmpyYng2cDdwN0w2SG4xa1dkZXFhTWk5NzdmRjRmeWNObVpZbjkzdjFOWU82VXZocFRlSzliUWE4Wk81YStOc2Q1N2JOYzhzRFp2K3VwVDhGclBkcW5penBVMXJuMitiWS82MUw3ak84dkhoM2R1VjRtNHlCRXdaWVZscjJGekU0eGYvN2hvU3l6QnlPL3FmYzMwM2pQdzFud1hieHZZMGR4YS9ZbytPbzc3WXNPL09ubVorTDVmcVd6RDJobWZIc1lJdmV5TVJ3UUlQTHhsbmFPdHROTllMZk9jdVlYTXBuN0lFd0pVcjRFUlhwWG5DcW4xUFYvZXVlYjFmbThyOWV1MWpQWStYMEVvSXErNVcxOGRPOU16Ky9IdVozQ2hOMjA4d1hzOTdCNHVvdll2NTQ4djFQeWw4ZDFuVC9IZ2RjZTYyVS8ycnFlRW9JNVVTd2hydHZmRncxUldaQjNkdWNvN25sMTR6VmxIaWp6TllBay8xQUlkd0g0OXBha01uMUw1N2Z6bCtaWEpvOFZudDd6MnF1K2VIMXRjVUpGNWYzM3R3ZDUrTWRZNzl6QlN1dG1kOTVsMXphVVhXdC9kZWNiOERsNXZmVWhQV09OYisvbG1yeXU5Kzd0NGlxeDQ3UGNwNzNkdmZNSEx6OHhSMm14WXlQZDk0c2F2enBCdjlndWREM2ZKZGFQckc2ZjI3SW5FUFN0Y0kwMWVrajhpdCtvKzloZm5qWmNiM3JPbFhka3lkaTZ1Kzlzam9Wbzk4WWc3c0lNWWx6SkNyU0d4L1JPUmFDbjB2VldudVQ3V2xsdVArYjBvM1U0RnVZajM3clBpZFhkZ0M5QzV3YzY5TGgxWHcvWWdGL25DUG9Ua3hTcHFGbmZ4L2R0dXdiL1hOOC8vZjNwaHM1Nm5aVFM3M1RFMmZYZ1liM2kvMkhkZUk2MXJMRjRtM1BWTHJHRmlEenNPS2JjUmUvdFFjT0J1VzJOZ21DYmJ3Zjh3Vm14VGIvRWJvV0Nwa0tuVTN0d3ZmTk5DTXdjN0hWSkJxZ2VHQjdBQXNwdklGelp1YllUanJldkxBMlVaZS9LWU55L2xEU0pyMitabXQ2K05UajF6RlV4YlExYjd5bHZkZjdGSTkrQlJFS0cxUUl4ejhyRTNIRDBzV0krZXhoeiticXYwOWFDMDJpYmM1NDVlTGN6R005MnJwcktScjRhdGlieDFmN25MZzB6c2pxbGFxN1FXTUZBcGxkcnZ2TGdPeUw5aXhQWWNEeVlaUk5YQlZ4R2JJaTVlNmR0UC9saFdWZ3ZKU2JraU1hM3hrYlhxTE9sN0VOUVhGVTF4UWlFKzNqUnJUQkhWK21Jd3NBWCtMOFRCNXM0K1o4UWZvTHgzVGhnbDlCZ2wzOXc5THBUM2V3RjZvUTlzZHJ2ZFl2UVQrTVhiOCsrWSsxMnd6YkgzdDk1alloZmkzZG8zSzR2Q1U5MjVZVTE0aFRsQi9yRXNsdnZDek1YTmpzeGNucFI3VFJqcThLUTNJSU1kTHFDSHV3dUxneWZJZzQwYWhlY2N1d0ZXeHV4bGxZU0hBRVRVbVBKNGNrVFVKMnBYc084VDNMcmJmTit1TUxIM3JPUERzaURzdlBsdUdBM1cwVjNFcDdFay9VWXZMcGE1cE1ETEQyMUw0c1ZRSUM1MmYvNTRYaXhmd2dFTlJHVy8yTitNU3FMMGZLNDJibzZ3aDgwRjl0VzRZNHQ1cnJjTzFCem5zSEJ5dURLRUR1L1YwZmZZNTUxS0tNL0h2MnY1VUY5TU9UOHhQOXhGM0R2anhhRlpHNXVYRTUvQUFLWStzRTY4YnVVdlRENWVBdUY4ZTZxajNCT0ZCbVVETmpGeGVYd0ZiVVlpTXo3andXV3ZoUnRwWGg5bm05N2FlbVpWMFFoV0Z2SEg2bUtHZmVmQk15TmhyNUx4ZklNbmEvVjQzdlcxV2E5SEN5S3c1eG5SRnN4NUx3RkJ3STY2L0E4K0d5ZVJ0SWpOVmVUYkJiRFBXN0RTN0ZoVDBsNFpwRnVNVVFOS1lIa2p0cFJYeTFoUlZpYS82RCtDV1ZyR2tDTSsrR0YwclFxbnY3bGJTWURSa2p2T1pWelNndzlHOElZUlpzVUF5VlhDOXVJZG1VSmxrSjVVUGtES2hpdjBnWWdqSDBYUDlXSE1jWWhMYTMwOXFPVVJwWFhqejlhSDJyZHYrWUg3UXhLaEVBVVFrR0NtTENieXhZOGhBN21pTkI4cnpSODM5dll0MTFzbkYwY0pWd2U4N2JleUl3cmRNeFl1ODFiZXNONVR3SUF2akJxMnIyYzgyQXg0eHc5UitmYis4Q0s4SytnQTRJSVJ3b2hqOFlCbGoyNmQ3V3Y3Z3gwTkVNOUNLRUZCS0M2QzhHMFdQN0o2SDc0Qng5QVJodXZHQ29SM0RGejBERHpqM1dOUkZWa3NTQUtQMnBDRDJZb2NXQlB6WWNBQk9Ed1M5OGFWWWtqdzdSSGp2M2paamRGSndDVllJVGRhZU8xajlNZUdaUDM5SnhyS3picC83NUdma0F1N2dZWlhEUGVGN2VVaURTZ3hwRVRsUlZ0QkZHOTlYTlZieGVkR1BDdTdFU2FlVDBjTGF2eGFqZ3BPeGcxaTBGOEFPeVlVQlh1ZlVQQUtlQSswbGdzQXk5Qlp4SGgvZ3hYTEdLRGVubmV5K3FrOEQ1Z25nVGg1SWxaUWczYTlFL1BMT3BaUFUrbEs3YWNDSDBabDYzc3JlYlQwRnFBVzBvaWZIamp5K1FEWXBqR0NxcmlpM1R3WFFHdlA5dUVBRmV3RjZzR2xjR0hVRkNlUGlSTTVndDJ3VDAvSEZVajlVRHBzVlB0dXR2RURmTU9Obm5JMW5BWXFnM0haQmJERjVvQWZzVnFaalgzQU9NMTM1MllWZzg0LzhYMlFYY3dsL2pHT3dpYmphUkhBZENIdFNGbGNRVU1PbW4vVGdpRUNWc1E0b1VBcWNvQktsSXhqdUpWdGRBaVpQOGdETkFFdUwySGdsYTVibUlOb0taTVF4M0dXSGhkWGdhWW85WU92QmdLK0dHTitQSlNXbG55UzF3c1pnY1gvSWNaM25lbWFGVE8xVmU4bXdjZER4L3VOMEZYV1RjU1IwVXpFSFMvT1ZvTlhjcGh6QXdyeGlZSEwzQ3c3TnFpVks3SUhXTGdHL0FNN0k3MW9PU3Yxdks3eWc1NkhoZy9EK0FZd05nUVB1UHNoZWVLdG1yazVxcFVnVFB2cTZCUXdJUmVjV0FJeklBZ29QcThGT1lZYUpZZ0hkMEh5SjJDVkhaL0lGWmoxdzNOdnZBSGZPVngrWFZpbXg4akpDeVg1eDllUHZ5NTFQVEtHOWZzQUZ1VHZINW5IcHYzdEo2Ly85ei82cno5NW5SL2RvK1M3WWd4N2F0aWVDSnFjWTJKT1lTbUk2SVBSaFphQzlMRGZDR25MRUlDWEhTcWlrZC9iWHZOSUs5Ymh4ZTIvOCtBQWRMVCtZeVYrMzRCRitDMlY5MEFaVE5ETnphS2F6eTNuVGhjQ09QRnlvTCtBSG1GdFhpQXI2b082SHVUSFBrSms4Z3NkMkYySGt6SHU3S0M0SFVCWC9mUERNMStMN1VHNzN4VUVkZy9NQU1VT01zOGN2VFdrWmVEbWNXOTR1dyt2SkU2TGdNUTNkamowRFJBZlJqb3VjSERCR1dPQnNac05nY0dBaHhlNENLWm1LYmduZG0wQWNnR2JQR3BNY1dnVEVxaDFwTHVCYWhOeTNPTjFieTRGcWNHUGJSWm5vQzJzQk9hUGp3VEpJSzQrUkZ3WVZvbEhHYkFqckxEUlQ0aGpiM3VQdmRhbzMyWG9DdUFxb0ZMUDBTelVEWjRjV0JBWU5adGJFbWF2cy8wTkdaMDRwcG1mTU1TbjdEUFVHMk4wZi9tcWNHdUFKZENndmtwSmlobjNCUHY0S3A0NUQ1eCtydHh6ZGhGWVNWS01oQ0dhK203czBvSTJMNjU5VFRRU1NsamZJVHBpalhDV2NUenBHOUQvUGxnMWVQNkh6TUNTeDFmeGRqc0hIQlppMVdTUkQyNityUEZnMkxqekIrd0FqZUJESUFqdm01OThLQVIrQWxTR0NQWENZdDBpL1RkTTlMNjlBVjVRUlNKdzZ3UmtYeGVxSGZSVUJidUJ0SDFmKzRQSEFPOXhZNWphRVZoZ0lkWXN3bmcvWE5QODhEdm9pQnl4QXRUWnp5dGovUnF3SDZ6K3BNQnQ1ZUxuaDFHS0cvekE0K1hJM21ON2VDM2VuMzFubFo4TUZvcEE4WTRGRGUwRnNiRWZRRTJlQTFvQjJVS3FOb1JpcHdSNVlVZUN6QXVVOG9DY01KNll4QWc5d3RtaHVDelhEZVNTb2x6RlhjZkRBWFIxbkJtbUpibzNwaWd3TGVnZnNBR1V6dTQwT0lBc21wL2xIYll1YWNKOU1XUGh1WDc4ck9MdG9KYTd2MndUb3BCNWQ1VDFabFZ1VER1MjFUQUdEQjZ6Q1ppTE9NQ2huMDI4WGtxbzdydzZJQnRFaGs0VWJTK09DSGpUV1V6OENZNUJ6b1RvWWVqaE14MUVDQk9GVGtpMjJNNEhhQVhrZkRSc0NUM283eDRzUFJzeThLcUdIOUNXRFBERGMyRW5CTU0za09jYjJBQnNUeEFuZWowZUwyRE1XYjN5WG1VamU5c2NBekNzMyt4U3llOUJoMi9HdjdGRU9OWlZXUkxqYnM4TFRPa2JHN0x3ZExPQWpockVtblcvUU5aWWlpQlpLdm5CaVJvMUFhYkEyTytXSDNYemhNTEV2RGpZd3JPM0ZjTXFBRng0Q2VqdlpRM3ZjcTNxSG1TbGNIVE1Sb1hpSkw0SUJJMlNZdkFOc0czaGpZYVNBdHlJaWdXaTlPb0gxUW53ejQyS0hDWVBtTUpVOFNCcnZTQjZsQi9oNEw2YlZjS0pZYzRDQ2kwWkc1V05CY0hOVzdXOTN3RWhoRzdzQzRJTDlrSFV3ZGY1L011ZGcrT3pZcENxZ0kxR1lQa1NXTmVRNHR3dk9CZWJuc0V1aGlSUVhBUzhYNENZZ0YvQUM1YU5QT0NLdFZ0VG1NRHl1ZXlvVGw4R0NtS29idzRxY3BlMnNtNExFUXlWRndQNnNUZ1lEVVFNdFVSY3VUZXlFUnFNSE13R2FoQ2xWR3c4SGtxdml6MWx6WkNNelRibWdUSFJoT1BicjVNNkFhQXZzUld3Qm16NUhTZ2RjQ0RmMjNIdXJDRzYvQUVPY0pPZjRmWVhIS2tDQVg0MmN1Sy9UVUpwRU1ieFo0TmJJZnBZZm9CV1FMNXF5TytFTFhXOERsNElLNDJkbCtrQkdQazhKQUtXaVZLOXo1VmcrVGphdHU3ZHE2ckFOcUlEckdMSUlqak1icm1CS3dOZXQ5bkhKUDJHb2Y3alNmN3hJTmVmSjBFUCtyR0tCbjBFMVh5SzNVRkl2N3hPZkplMWhnMFhTRFBZQzhWaWRlSmROSjYzRHYzS01GZE1yczVBRXQxUWJYNmcxSUpBWTdaaGM0akFnNmJmZmNsWnZ2TG4xbmp4OVAzejl0ZmY3eDgvd0sxb0F5TEtBcDBGN1N2ajBnRzZCbG1rUWMzb21ORS9CYlBINTJ1WXROd3ZURnFTaWhiSWZ4TkFnOEZiZERGbHNDOE1EUG4rak9nbTZhQ3hJSmdqdHBVdE5jUjlGbjIwY0NVOFVPQ3hmRGZNTnFBVi93YWlEcytJUU9JQWoxUm1jYWI1T1NMellzV2hWTU9jNE4vQ0dwZHhqZFlibmdIZmNvUmdISkFsc1AwRHQvNXRmLzdyN2JuKzJoOHQvd0NCNEN6eWcvK0YzK0JaRjZRSEd3YnN5TFZnT2xJNFVjVWJwTERuMFU4ajZTakx0YkNRYStiS0MwekRCZ0hsWWRNYjJzYzJicnhVbEZzY29MNm1pQXQrTm5CNzZBQVB4eGFEVEZoWUxPUytIeUQ5MHpvdktNM0xFM3M0MEV5TWJOREh3MGw1NmdlSzYxN2lZOS96cW8veDhyMzdUMW11dTVRNzdxckZFeGd2dlB0RUd5RzFrcTRURTRPWHlScll1eE9kVG51QU96NXN6RjVWNW84Q2xIcE5IQ0hLWFRMd3B3Q1RFSVEzd25OQnFCQVVLSGRmVDNCdEIxNk42L085VlFXdWZDTHlUT3dydXJrMEk0anlQV0RBS0JSbW1MWHBFU0tNbTB3UlVJSGx1Q1Zhc21EZUh5dUUxUVVsU1lDZVZlSEtHM2YwakF1RU53d2FHTjFIWmhkcUpOVjh4MmQ4R0JRTWJPblF3aGhpVWRrTldBL2o4SzlCbEtYeGI2dUVkU0hOTUdtRG5Ed2prZzFkZ0thT2IyWWM3YU5aNkJXeWdLeGxLTXFlMHFHeXNaUEdwa1BTbmlKVkkxMUd6bHBubFg1N1d4dE9RQWdIcW1oUWQ3T3JyQ0Uvelpla3B4aGhRK25pdXNERmNaVGdLL2pLVlJzVzJEVDMvYXBMb3J4dkYwWFlUQVJNc3FPQ09JcVYyc2J3c3pOQTA2NVMzRkJsdkRyUGlud1lRS2g0aW5yamJpclVxT25raGlRS1JJKzNpUk1VQTdQN01zdUNnWTN6Qjd3Z2VSR29rbVlBOEVNbzZoVkVRaER1bGNGUCsyQTE0T3YzYmlRYVVpd0kzem5pOHlGbkgxcXc4Ym52QjVUaEpoK1dISk5UOEpoVHhKYkJIK3JzUE9xNGpTMFhWZzI4T1NlMGMrQWpqQUZEUW5HdllHTjR4c2RGY2VHWXpGWnJpZERRQzE3OExwZGQwYTA0RGZnUnEyaUFrNFZQT0dXZUZ3K3dZaDlyNTJXQXc0MVBPck9HRUppb3h0NWY0Snh0M0NFMGJyaGtMM2xVMEUweUFZQVRPK0lYUG53c1duaVhiNlBhS1R6b2Z0WG56VGRXZ05LYVY5MjRiMURZbDJ0Q3NjRE1DTzhOOFgxZ05pdHh1N3FCT3hEdS9EN2dINU1uY0RVdzJNMXRBQXREM1dueE1qUTBaY2NRNm9DdHdEd2x0UmlTZ0dEK0kzUmZzVTFQaHRpKzBFaDBialhFUndlUVZvc2dqU2RmQVMxeVlUZGVlRWltOTZ0MTI1aUNEREsrTzdnVWZ3cnZpMGEwUUxJYkMzaFhjekdGSmZwKzBQN2tSWkJnby9PUEllMG5KYUF6QXNVK0JoMHkwZzNPM2RLQ1J6ZGw0bjdNOVFCSmNWTy9uQkpMbks4aEdETGtnUkZwaUJ2YWJqRHhSSStCSlZKWUVGWXZFcGtRVVNIZUQ1SEZ0Y016dExwUVg2U3FYeGlVa1JBRVZnRi9OdlBocjF0bkFMaUlRcldGSEdKM3NSY0w4OGJydzlJU3VBaWZlWnM0ZUJhVWFGKzZTendIMndTSGhvYTJwMFlBUENKeWcwL3lFWGJJTDZ6dzQ0RmZTQ0FmUUdLNWIwYnVRZjVnUlJ6WkJYcGNieXFEYjQwSi94NzhSalc1aEtIbkFxb0VSeGovdUxHendNY25MK0g0L1Z2aXB4cWdXeXc0K0tpYXQ5ZWNpWE1OdjJoMHFrYkpid0J4bnR1ZzI5MTF5WWFsMEg1WTJtNXhQWGxHSlFIbHVNU01ZS0tOMFVSV09oQnFwaStFYm5YTjFwMXJ0K2FTR2d5SkFQaVVaY05oY1MrTWNZakJqRW9HUkZTd1pQOFA0UlBuLzIzZE1BaDhNR09ySS9BaG9vV1ovOTdYZVBhZEowK0s4VzhtcGRDeEpkbXl4Q2ViSkdXZkRURmhGZmNHNjBNUEJDYi9manNFOHNjRDQ2VTR4bi9lL2NGVFlDbnJNSTJrU0p0clN5Y3FBaitCZE1TVGhHTFhhOCt4Ui9OK3JZZnhYcCtGTGJWalAxSFIyOWcxUk9NRi9KZit6OXVkdTAyREFGdDRPdXVCRUR3UTNuUGh1d0JQRjhKZkUzZ2Y0SVE1eDhzVUF3SjREM3dxZnROMFg2eVloMSt1RDdNWmtzOHdOL0tCUWdCVnh0RFdYUHpiVDZZdllpaTNBZnp2WkFsOTE3TWdmeTBIK0pnSGlUZHdQT0NDc1cyNDFsWngxWERrKzJLSHh6M2h1cmp6cmFpQk5iV3ZrbzErdGg0OGhkbHIvNGViWFArNFN6NFNBVWptM1lFR2FMVUxEOFpENFRDWXVMc09UOG5uOFYvQS9NdDJBQTdteWZMaGZDN2diUnpZNTR4dmVqNFVHb3ZzbXM2VGpmM1hCL2pidHYvTGU4WWFRUDRzRFJ3REl3Rml3b1ZrVGZHSjZXQXlHOXVDRFVIWlFaZEdrYnFrNWUrN2gvWEMrdlN4TDBnNldvbFV5dEFOT09LWEkyWVZNWmJzakNkQzVORkY3REc4NTMyQnYrQTVKS2RYNUMvcXZrenhLWkQ0YnpZQUlpU016bFdhTnF1R3pqaUNGQkZZQnJvcVg5RUdoWm54UkRqdzl5OVFXaWFROFNyQ3VmRUhtcU9WRTRxTFA4VWxRNUFiMmdRVktDK1diVXYvYnBPRnoxR0NabUprUDloUmRIYysxNUJjR01xQnd0enhYdWptTU04SzFvVE5taHpCaEpaM2M5Rzh6d2FBUlQ0enRaQWhQMzFqUExBb2x6NXZtT21ZK0lOOUloRGNqMlhHeDZmNjRXNHhsU2JKd0NhTlp3UTVyY0x5c3VLc25RVmxHYVRSOTJYQWNuMG1ia3J2WEFWbmhJaU1lbWRaRlR1QzZaOW8wSy9LWmZMcTIxZ1lQamF6UWRVOHZrWVN1cjRUeGlQd1hpYlJYK09kNFBScFRka1RQak5VOG9yZXNaWGJJQnY4MzJqWlNRVWE2Q3JyYWV3UHFMWUI4aDgwZnhnOWovMEJFTEd6Y24xY1NHZGpKcVprakNQU1ZVSWhpREFTemNydllPWTRocThIdkVnNzlZbHd1ME1sUHJqbGhMc1ZUR1FHcFVXcjZmZ1paQzByS1ZQSlI2WndhOXorUzVnU3J2Mll6bEE0VFRWSGxwMVZnU3hiaHZDTGFZSDd1NVVqM0RzTmdCNTcyTER5TDh4UlB3aGdCdFVDTFo1OVJlQWxaQ0dEeE9SNG90MjNJWGxKWklodkxTdkRxMXFZNlFTbjJFeUFDK3lETlRTK1h2UEo1RDJtNlJ0MExCWFRHY2FvOFMxY1RFdHV2WU4wVlN5cytjUEhyRU9WWUlOZ2p2UWtCSjM3NDIyeGtkZnptSFNva3gzQVdJeGpXOFBQKzhLanVPTWI0SU1MaElDSUFIQlJhTVRydFdnbWZnQXpBQW52SFBjRlJ2QmJxSk5xdytzaGpMTjNKQjhvQmwrdGVMWnZRZUdXZ1k3OEdMSlMvLys2NDdtZnlVejkweERpb3lUb2RjVHg0TEFnL2pIaGJzVmhpVjJER0NCSCtIU1RnUG5GVTZNQmo5OFB4a3UrZmpYOE5ONW5BblhhKzVqNkJDV0M4WEEyUXFCUWpBTHhMbENXdUZHa2x2QlhKOWxkQVErZ3laR0tNT3JpVVlCd0E0dUREdDVZVThnQ05HcURBU3JZTytYNFlMYVEvMmNOOXEwY0hnYktRWW5CNFA2NUVKaUpQZnBiamtIY0QwQkt0NG5vWDhidnh4VWp5cHpMNFlxWUdmalJCL1FCNUpna1MrOER3Uy9YMXdjWUtpMWVDU2tDSWdMU3A3YnpPWWtIeGRtNm9CdWptdzB5Z3preGozbGpKdzJyOFB3WStyb25oaTNrb1o1dU1XMHlWN3RNdTNmTE9VQ0NTR1FVdExlbDdSUm5Md1AzM1NEaFNVekdYOHIrMHZGSGpPVUh1TTNscERSK2JQN0J1ZTRIQk1iM3Y2YVIrcjJNMG94d3ZMb0JNVFJlQS9xTzBsYVVITitiSVNuV3ZTQ2tCaTd4aVR4L1J5eXl0VXlnRi9CQnJnQ2h1azRCTlVDTHI0RGg0YTVKTk5KTWVrUlVKUFZYVHplTnpnRmFVNDl2d2lJaWdZWWhlU3VVdmNSa3JBNXZQWUJJMGJEY1l4WVJRbnhGODVQc1RyQktSY3FLalZZTnhoaStoN1JCcnhLTHNWV2NTTVhaWW1DeExqaTdjcTlmREtDVUN3c0NyVGdMRmtvK1A0UVJnT2dCL2pDL3JBK0FBNXVCYU93RjhBY0NBcUVtR2phd0pwZ1M3aHRHWFNCL2ZLSkpBTmxOUlJSV3g2RVpOK0RkYmpsQ040akJicUhYVm9weHp3UytFbTZNdjczNEJVK0hHRm1PdHdZdzRzRk9mTUhhRlRnak1tNGxqd2dKbSszV205RUFxeVFnR080WXVDaGVoSzNkMjByZnVBQUZ0UjVCNFBkU0g3SDRIK2dQQUc3cXE4UGxBK3hyak00aWxjejZXRHRpNlZHMFhNRDgyZ2N1aEd3K3hnQS85dVhCcVBQS3JHUnNRMFdDa3FOZ3dMSnlGcTJlOVFQUW16cWYzSVJyWVJMcTFhQVBrSU1ialc4dzluTFNveDlXRVhPSDgrTDN4cDRNakg5OVRmbnZDbWZsZmdLYzIwVFc4YjRqWHRFUTFYbVg4UDZXTUJzVndIWkIzVzVqN29BdGtDTW9CRVNVZ2hsQlNCR2NXNS95R3ZaK2tKNThJWmEzRjBMZVlEd3NVTG9iajlqUjduYkNFam1mdEJhMElxQjdWaXhpa3RrTHNhakpVdlBGT05lejJKWEw1SGREaTRlbEFZY1ZRU0JBRWF3S3lHNXVFSXFBUWJMQVhtQUxjQjVJc01WU1pSbzltWmVSUVpacytkN28xUnJzY0RReXRBeWU2VG0ybVFjNG82Vi9vby83TTBzeEFhdDgwWW9qci9kZE1JV2VyZUVTTW9kYWNJbzMxczJ5aHdTQTJQR1lpUnRuQXhQY2x2NEJDbnZkRFU4Q1dNMElHRVJ0dGdzTGJFUkdlSmg3TlErRlBxTG5HTFo2U20wQXl0V0VOSStYWXNaNkEvQkFoVkNqOVZoU2NHUHVNQWlBQ0o4SDZHRFdMWnJiUndicVFoYkJUK1UrSmRrWnNqMXcyaGJJWTdBTndBRDhkVVliRnkzZ3llT2FXSWVOQi84c21RSlUxMnJBUWIyTTNDSVhnekhmSVJHc3RlbDYxamRYby9pbXdaRHFWSkc0TmkremY1dDdmNERLOXZaaTZHcytJRHVYR0E2QUlOekJNT1g5amZHcjNMOTNISllWQ3NuTnY3SnFMMDhVNzdSUHJTRWdoMGV0cHJjTTJRd2xQT0NkTUtVR2kzQWNpYlY5bXFVTXhnaTNWZWdBc1g1cVF5K3NNcFRLekUweUNtbHBPbERBU2dZeGlMY0hZbVJFeitvQjYzYkFRUjBFanMxN0UzSTF1blVYRDd0V1VUME1NRGZNMnpJelh1M1JqbjI4UGpDaFdTZG9jQTJ2MExSZFlMM0JUc09WbGNOVmVYYkFON3EydDZVVkpvWUFZNy9rUE1TZWEvbyswTGREQTVCa05CYy9oSERMQkxKNTcySlFOb1lUdVYyc2tmZ0llUVludkJWUVBqSkVKQmpEZkRBZ3dMTStoNldURmVqRzZrSUYrNHVBRnhZWkV6YjdBeUR1YjduMkN4UkZiZ0EyWnJSYTNOTTBtcFV2Z0IzaklkKzB3SEVhY0R2NTBSUGJUMzU1TEdReEh3VDJvR3RUSjQxTzdveHQ0WGRTcmpWOGVLWUVlOENXM01naVd4V01WdFlwU2VhS0FsM1E2N1FjTmdmcklRM001WEkva0JaV2hFdmkrcE5PYW9mT3ZyQVh0NFdsNzdES3cyenVsRHVlY0hzM2pKaGVFT0ZsTmVTZnJFUFYxa2JyUmZqaUwxZUwwVFNDekplZzVjbXlhYXRXMUFSNWk2V2UrME1KY0R3Zy93Y0VCUy9PMll2MXRuR01PTS8zUmErbjRSS1RaRHdRV0FBRDJ3empyMmd4Z0xWalNpVk1qQVc4MHZydkh2YmZuMVZUYlREelZ5TVJiaFpDN3d3UVp6L0RaWmhMYVR4MW1LZzlHS0Nua0tCKzBEUTBLV0NacGd5bDUxTyswR1JCVmpKTlhBZG1Ca0lGQTQvcENtd0NnQWhROWVpcXpCQWExZWFudnYvcXFmNDgvbC9KalQ4dk1QSmwwZnc2M3dJcEhCdUZtQlJjNllrQ2hjT3RjenN4M21DVUVvcWJtb0YxSE9EM0V6TGp3Zmw2MVhkMFBJckhrVEVBeWR4OFNzZ0tsSHQxMDEyc2dyeTk3TU1OMTFxditCV29CL01HQjdNb3NLT3EyWVA4VDR2cUJDalZOSElDL21KdThzbGdKK1N2WWVzQVFCYXZKUFBxa05NTUdKbFkrRzRjQjNka08wRDY2VWI0ZmtwUWZsVnN1azZBblJVMXI3c2FUelhiOGF6YjZrRTRMRitZRFNkWjhnVUJZTjlnUmV3WXptSGpBbmx6WEhFQ3lHUFo1MHdnbmhNUldzYWVIMnM1Z1IxQVZaYm13Nyt4YXZsYjEwa1BRRnh1cUhUYkp0T01oVUFzc0grUHhaTGhHMko4bnE3OEl4bjExNk1kMGpST1U4bUZoRXR1VDJ6OXMwSmxHUWxvL3JpUDBIbzB2NkkxSHZoTXN6bTV6aUFWVXZqNXMwNDg0dXFYRnVqR3dUYXd1dVdrMVlMbFZYaE5pQXQyQmM2RUh3WlNscHdOQ2NrT0FpNGlXL0J6M2hIT0JBYStEQTdNZitUSlhPWHh5NkQ5YzVYLzgyVitVT2JGb1lsc29rYjVRWTRPMjhERUE2QlNNTXp5enZITFZvbS9oQ213aHBGWnhWQnV1OFFDNjgxYW5DUkNBd0ZqUHRFMXl4NEVJVkNiKzFldkx1ZEZzd0xNQmljZnNSd3dDQUFsUUJQNkF2Y01tbGFXaDFkRDlMRmFzb01yS1hRNG5BZEVpSWdpaWpDQS9QNWFmVjVERWMxQThuZGFackNTMnR3aGZZYnlCMUNwVFB3R0YxNUdPSU5PMDRRRmFONW1rLy9wcW8wT3AvMUxPTlAzV3pZWWJJNTJKeVRRL1lpamJMTmtKcGZTdEpRQlMyTWR2dVd5ZVJvZEttMWo4VnpzbUc1Z1dNTkNza0R1UFdhUzJ4c1BBMzBYaUdyRy9YSVIvQU9Zb2dQTit1RVcxb1ZEN0VMZ0JhOW45T2VuWWN0V2pHS2NnL1VWclUwNDlyT2EvbnZITzFjdk8wVVArRGFjTDVRWHNIbi85SE9mcEhnL0pGTmptdUl2NEcySjJIRzEvVFV6S1RWM0RmQ01acFBZNWJidUNlZTAxSHh1Q0NPNkZxcmRWY2JPY1VDMkpKZzNlMW13WllrTW9CMUVqZ3V3akJta2lnQmFZR1kwNXpIcmZVUlR2M0VwT1hIVzMxNTgzQlVlUE8yQ1lUMStYN1BraEZkQWhJOFh4VWppUW5oM05nTHppRU8yL21GZUZyN3hxaFhrcjc0OXVNME9vUVF2c1Y3TE5FblpBOXFDRmJFYWN6MW1IaXhtZk15K1ZlUHQ3T29ET1k0NjBQRWZxd01xdjMreWhHRndFYlg4K1FDVytBdmF3YWp2MzRMWk9IQk4yelVSdTN0TGFSQXZaQmJNaEttd3pjc2FJOGpEampnUkMxOTdmV2Y4UUkvc0t5eENYdnZsWW16NytsanhhaTJMelNSWlBwdngwYmZ0TGkvT0FlLzE5dnNFVlgydUIzS04yMnRZbTEydEFVSEYwVHN3TUo2Mnd3M1JSVjU4V2M5a2p1WlRwbUlwa0M0QlNZVGdQbmlhaWRtTDJDalFLMWJpQkdhbXhkNUFMeE4xMml6OGVRbWdKTU5LcGxUdmFtMEFVTHNBWTRWWXRoeFptd0pJKzdSKzRLenZUNUxsdDdzWEx0UTBtWjRudlBCUGxobWJ6MlpJK0FNcktWNkRackhoRnYxSTBvSEttUFFuVnd0ajd0ZmkvejJ1ekRmYk5vQWM1ZytUdlVheE9raFpKQUFUQ0xZbHhYeHlXZmlXK2t6SXJFVlFBZnJiakI1YW9IOHRnQVVnSVNCZDFlUjlZWGRuTFR3RkdQUzI1OHNWV0pZSmdqS0xKWW80WHcwVlZoWEEvaHBWZzNkY3I5MFhjZ0owcWhpUmg4RStXaXBUTGpPQ1NOZW9keHNOaWRnYlc4bHF2OFppbzQwVnBXTlN4b1BzWHRrNkJIemQrMkJ5Z2xIQitTdkFRYmFCRzQvMTNValQ5QVhaZDVNSXNCbXJkTmtIYkhoa2I4Q2J6OVhNVkcxb3h5bTNoc3MrVm1qRENrQjdvSE13R3JUaWZubkJ0NTMvaSt3OHdJZkM0NWI3eTgrbzJKUUpZcHQyUFVCcWpvdkVmaUVxN0NuSU52Q0R2QWI4aTMxL0Nnd01lbXY1MHdPaGd5c0F2bkpHMEFPWUxkNlhqMnpqajdsTWtOakhtMWRiUWxsTGtWMHhEbjRiZGhrbm1vK2t0bWJlRklsNVBvc1dSQzZQRHZKVEVjNDJjbWZ3RDQ3TnFzTXRSOVNzeFpQWHQwVUxGTmpFZmJOYVVNSUw1OU1qOHV3S283dXlyWFFEeTEveUNDZ1M1aXpmS1ExZkIwYkFRMmJjOTJNczB0b1JNMVJ2ejZlMUNkTTVnRkxSeXFyN21paE5BcXdIaVNEMk5PT2EwaTgzYW1yZjZrbzA1OWxOeW1SZWZwWmZkVmNDYzMwTFd3a2wrdVVnc1VVL2ExT3M5VWtuUFduOVpZVDkzeWM2Rk4vL3ZOamY3bm51ZUV3dHlCWklhY0V2bG9WZGVMSFJvVC80K1JmOEJhS0d0UmdOQk12SUNic0I5OWZvaUltUmIwNlVOVi90Ly9LTy83d2grQVlUdml4RHJTYTg3YzVGYWEzd1NSSFBnREIydUdjSGZleW84N3J4QXljYTlWb2hnYW5VdW9TVFBaQWduU0lDRVlOZUNRWlpRSGw5TmE2UC83VDdnMGMyM1JsaHNSRGZvVnRLRWR4eGVqOHdVYk5ZSklXaFJ5Y0JlQmxrYlJFdHZoOVl4N1hjL0lCMVEyM1JWOVFPbWRQNk50OEQwcCtSLzJVN0ZwK0hwRTE0NUVKYjhaSmNHOFp4d1NXVEtkaGZLOVFHWHFIcEZ2MW1TR0RoU3NzTU1wU1l4MEJoaDJuYlVYRExCWE13Wmg0R2NRVVJ6ekJuY1dCTHNYQ25tVHAvMFVVOGNMYXdEM2lDOEQzUmN0YmJMUFJ0bjJOUGFMaWhTalFScWxXUTdGUWI3OXZTblpHemQxbHpjb3YzT2g5ZkZVS2F0dlY1Q1JObk1NeGtxc0VHNjlnQ1hzVU9UdnZQcnJzZ0hiYStueHdQL3k0ejdPM0RBV1hRUW4wcFc0YmMvT3FScFU1NGw5UFJDcjh3QXdlbnVOc1YwQXRydU5Lako3NFBUbjRWb2JFTUFVRXQ4ZjRiUkpPZko3MFdMNXJBd3loQUt1dmRyWm01YlhpNUxNTXg3V3I0OUhQYnJIdVozUzVsaUxpdG9XWWR6Ly9rODM3QlVoYWtJRFpBVmx0OCtFRXFMNzBremdHaWpWTkRIbitVWloyWUNzOVhzbDAxdHNXODJVNndiOThMNjQ3ODNnYVFSb21vVk5peEE5Z25iZ21pZ3hldnZCeUdOZHZMdGF6N2U1QzlPN1lLbEY2R1RTZlMxSzF1Wkd0aE11aW1WWE8zelpHWHdBQXRPRzA0M1M0NFdJaTE0QWFBeStoSlRtaWpkYlVOVkZ6SGZvN0dTeGE4R2dhQ1MvRXlrSnBxWVVlMFR0Z1FOV3NIZU9rZDN3cUJ3NDNWOXJKSkEzRTBoSG9IYlBtOHhRc1p0cnB2T1N6dmsyYTZVS014dWpLQVkwRWlZSkJXQmtQanpLMmNlcEtWTEtCQjhLMXJRTXBDTWRVL2JCL2IvdUJudzlZRnYzaGF0Sm5Gc29rQXhjM0JlUmYzcjlidVJuZnRkc2FpUG5iZEJRdFJjbzg4S0x4MlFwTXR0T0VScmxvd1hKYUw1ZklyNGx0VzRDZjRLeXNRQkZiVHd2VngrbTROUDBBZlpoSjNSQi9KZm9udEY2NXBFQ3lDUEFNN3lRNmR2SVVKSWR1T3JkaFd1RzhiWG80K2RvakhpWjBsYkRJMDZaVVRBQ2NhaUMzYkNZVWtBOWNBQ3ZNR2wvSmNHS2JIUWtUK0Z5SFpFMkNMYnpzWGh1R2hTSjkxcHNrY0J1UWVNUHE5eTQ2QnZaZUZFVHh3MDZIanZMQitFN2VRd3BrZmczSkdheFhTeEQ4Nm9jTW5xVkNjKzdITE9kMFhUSFBxUjVMSkt2WUhEeFAxMHlDR1lZSHpLb2FnNUErMVlRVWVwOGRnVEIzK1lldkdON1hJNzNkZnRqbEE2Y3FKTTBGVTY3QktwMzVyMWV3NjFjOE12c2g0L1lDQnFNbHNBQ0RsRVdBQXd1NDA4MVY5bTJ3N245NzBzL2UxL0JyWDVtNkdsUnFMZ0sycDVvd2UrTTNhVWxOSkZMU2ExWURlRyt3RytWdkdZNzdIM21BMGtLZDVnRlZmaXZZTVRzdUVPeUsxb3kzaEZRT2FkZmpXMmUzYkpCNm9kd1BKcm1KVlNtT0RiNlhSdmNCbnJiQ2JuWlh3M1c3VmtCR0s3TndJNjdRRm90RTFLOUFkSU9MSE5oVjgvelRpakUxOGJQSkh5SGwrOERPU1p2a2IzcVRaK1hCcXRZQkdwdy84Tlo3UDB4a0gyWGsvTDFoM1h3NmpFTk4rMDU3Sk5uUWt4WWc2R0JuUUFZNDNhMmZhK2IxMXhVRjJEWFlBVU5wNTNwTFY5M2RmMXRXZWR0MWhXNER4WTc0Tk9zTU5JSXdmYm5uV2hCV1BCZ1FRZUFQb0ZkWlJtcGp6VFNrT25TbFUxTmdzUDVBQTYxZ3RLOGJITkVsclZwZWwvekJoUm5kcjBoNThBTnBuV1hsLzkvWktYSGpZZUtvVnJ4V3RJUWkxc0JlZ1k2Zzdvb0FPZ1RkZmROT3VOaXo5YWNROWxCMVViVHZMQnpFQWgyQzVYeXZWNTc3YStCV1pEbXNQZGJ0bXhnUG10cUFaN1o4QmoxOVY4bXQxQ0FvZ285c0YycmJtYTZRNVAxNEkwYmp6MDRDY3ZHK3lwdmdCdFg4RkRXVDVnTDQxb0dHUHIvdVlxYnF0Uzc3TmVlZFdPZzdJZlBuMS9xcnhoNE5jOERsUEhJWURwb0hvejNRREtzSnF1dFJnak1lSW5WV3RwcFFOa3RoaW5ubjUrVnc0QlR1UldBdWNyQ0pxdEJOMStVNWhFbTRjQjJBUExONm0zS2dDcUw0cVU3Y0Y0U2lJVVVCem5sZTI2djdyanJWd3B0T3ZJanR1eWZnN3NYamdlREFHdUczaDY3Q2p1T1JpTlFPMFl1c1owMzc3aGpkY1dDS00xTVFzN1JhNEsvY0ZhQ0diZ3FLVEdMVFVZYkZJOVFiRmZraVY3UENKb0NORXIvRkpmTUtLRjVhZGwwSUoyVXRjb0ROTE9tK0thaTV6NmFjRkhYc045YmVieFhqTXRPTUM4Y0w1N2RIdDlXUTN3b1VUc2Nwaldlc0lXMlB2UU9vTDA3Vk1jdHBtanBHMGZBVCtEN1JmV2VVd2lZQVhlaHhLMEZLSEp0Y0xrTm1xZVNxdzl2MUFsRjQ3eVJxdXhraE5ONHhnZWJ3c09laVgrTmZEVXE1VHBldGJQalpqM2VXeWxla3RQNmxGZ3NISHhoTGk5eE8yQlVuL0pyTFBBd3dqK3JvS3FCNXVHUmRtbmhSMGhIM285NFZmL0xhanZuZ0ExdGU1Tm05SmVpSk10L2xJYS9WUS9mYldkVHVNQnZDVjlPV2dNRVF1Yjl0Zys4YlRzc3ZSeGdRdzlPbi9LRnpEZkgwMndqenN0dWtuczVxc1h4Qms4WDc3QVBvTndaNGlnNDFEdjlBZnE0cmlabHRmRUhKSTNEajVpbVpqV0RTZ3haTlBCOGs3ZVV3YjZONWs4M0VDOUo3WUp0YmlUbGMxeExiakVjVFhDb2J5TEhOMm16VjVPdVRPTWxKOVg1ejJHSlFUMjRoQUFXTWtDYkxDRG9BWnRpb0NKbTAyNFFGdmwyTnFESWFGVTRzTWpnY293bVpWOTNVeU5MeFVzRFNqbi9BOWdORWVSejV4L1I4K01qVjRqaFZ3QkUyMjlRbDZISVRQdVFnVG12U2c3VEV1bHVPRWt1b25BRDVZSFAvUXJWNXpoQXZDYkR3K0FUeFo3aTdFd2p3Q2NEQWVlbDVuTmZRT2w3MldOVnZMSG5XMjNqamo1NVFTU0REbU5waUtyS2U2NmdSMGJMbEIrT0VxQmdoNUpKTjZFOU1BNmRhd0xXTXhXRmNnQnNZODNGYStOMXcrWkFiYk5MdVc2Yk5DTEM1OFZiWlFxanFKQjVjSEFnSzJodzFndHlZa3VndjVzWnFrVDhFTU9qMDZTQXlpNEpnTmk5YmdReG5sQWtuQU5CQ0xHMUF2OXVqSUdSRHh1d0xpL3FIengrWTFhUjBQaiswelBsVW4ydzZrUU9vVHB2UERKSnRZMFgxdHl4ZmduY1hDT0V6dGdJc0FLOUgzZnFyUkM3b2hjUi9WK241OGJNYUJRTCtlSUZuWXAyOHJhd3M2QUdvTHE0OFZBb2RmV2xyOUV0TEhTMWg2K0oxRjVnYnZ2NGlEZEREYkFTOXpTSFl5c2s3b0FCQUhyQUFWeGM5ejlSSE5LNE1WeXd0d0dNRVVCMjRmSzNTZnlVaC9YVk42YnpEMng1WEdMMExBQ2x4bjJKSlZhNWhhczByclYzUno2bDMvN2N2RzBITDlieTU1L2ZPYS83OWQ4dnF2SHZQL3pTV3YvLzJiczd5b0lpUTBZRzV2YStLRTBpZjZrSDRMZVRjY24zRklKejhzZyt6MytJL0wvQ3lIY3hCK3RzTXNwZTIrTVBlZ252ZmY0SUJUdTN6OSs5Y05IdjBYTDJ1ZEpPWUZOZDZJbzUxVXVmMW8xN0xNOUF1WFExdWdaSmdpZkNkVzBNTG5Qait3SWh3cGgybzhoSFd3Wk85VEZHMW0xQ1RvaDBRVHVEV3JOc3ZWM20wUEtmYndYTisrS0J6eHJLNFpvR1pWc0RVZUQ3dXd3cHdPdlVHWjRKSExrbmowUmtoczZPYjZiT2I3ckhVR1c1U0JaZGhXZ3pWNzlEc2VheHNVL09JeDNWWnliSXRoYjl1QkhQMFJzRG1mSTVRc3EzN3QrZnF3elJsc2lFTkV4Wko5YXYxNUxJUUFEZk0xVE1vQ2htclA3Q2ZBQW42R21kakU2YlNEMUM4c2FJZkR0RlFDak8wV2pqdEQ3eGpPTjd6THJqSEwvWUp4TlNjZzdRRGdkdnJNNTJ3MTUwN0FDWnBnRk9XSENzT3VvZzJyZU96UDhIODUxWnJSQnVwa21mVm5kYUxmMUNkRE81Rkt5STNKMHUva3RpNFdDNE1KN3Rxd1NDaUNwc2R3ZExGMHlkaTVmdmZPUHB3ellaQkE4UWtJeUM0bDJ5QUNIaUdZcDUxbjlscTNsWDdjRWtNcHhiUXF4Z2Q3VHFPRkpYcXV6MGtmbWRHRUFkejFjTXJIbUR3c0hONlBpdVR1OXA5Q1dNVHh3MlZEN1NQR1pqeXVaUlVHRnlpcDJhdzE4QU1CcDFLQlIxQkV4ZkNiVmlBNDYwTU90VXdhaFZPZkc1emZ4ZzRub3phVzRTNG43U1FMR3V4VWorQXNiUE50UlFxK3JEM3c0eXZjZ29xU3dRYThUY1R4NXo4Vm8zc3NpZFp0WU1PeHBILzl6Zk82RzlYSmZBQnJLT2Q2KzJrNlpZc0ZLamY3QnZDMFZ1aXpNc1FhVllBOGtFYWkxRSt2L3lmYTNXQk9tT1NMVHp5N0NFLzhlRFVUZElvanFNbm04NDRvZ2M1aWJhQkI1eVhzYWY4RlBnWFFCNUp1eHJUZ0NwSzc1THlPamg5YSs4cllvd25LZi9LcDFFZ1dQeWN1RVIxamd4cW5XRXl6Qk9kQ0RXdlljVTdnOVR3aDNSVStMRlYyVE5hRmxDYzI2OHVIcVlJZGRGK0RIWjIrSDhBR2pKWWN1bW1GRFI1OGRoT2lmaFZENHJnWk5JbWRYSmRSSWhNUW9KaU5YSDJ2cERuZXpyNTY0WDRxVjA4akE2YWRXY1crckZTY0ZLZ0REWTVYbTg0OEt0bW8zOWRPSTlkMkxnK3lETDhRbTIyTVUxYjlUMjJ0ZzV6QTNOemxEbVhQMCtBMnNKbVFLR3U4OXJwMHE5QWpPT1pHSmV5N0dNQWdlSkRCTXJHM1JvRFhXYzZGM2ZPa3VrOXgyTnJQbVRsa3JSRlk1bkxTaGZrdExyRGhmMWdpVUt3OXJvNGNhbGhHN004d0NnUVlTaCs2RDIxaC9leGJDZllKWXRjL2N5QVhhQkwvMEU5UzFwQ1ZMc0ZhdFdMT3o1UkR3VmFjVVlmOU9mV2RJZzZ6UVFzQXI3a3JnSVFTeDNWaW5MRllDZHJ2VmNvOWZHM2N1SE1FNnNNWGlnR3RaQVZBZkQ2UXJ6MHM2N1NQYUtqR3I5UXpYVGFyWlhZQk84SnRSc0MyZDJmZzJhMThRMWJ0ZVVnZENXZEo0VkNBYlg4WTJ4a21ycVpOMlBZMFQyUy95Qm03QnVGN0R4NTZONHNrUTg2aVZNU3UyS2pGbi9kb0xMSnhOaU5ucDZNcG41U01jMENRYkpocXNMYnZrTjdxYUtUMWE4MEY5Wm5ZUEpNNVdqVmRtaUhoblo5dk1lUG53bE1iaU1iWmNuMlB5d1FlNzRrdk5uUTUyc24rTzUzUWNWdFlBc2NFYXA0c2NqMnp3Nnh6Y3ppRjB4ak9hdy9SS2RBUDlKNmp5cE5ZNTJVMzFRamxRY1N4VHJFa3kzcHU3MitGNlBQc1dqRDhUcmw3TFNacnR4TjJIcmp0ZGFmakQ4dy9yejJqdFZIZHlISjJobDl1em5jS1JVTGZUNWs5aG5qeDJmdXhiUGlaaGc2YzZ3VmQvL25YZWlxYkhjVmg0ZWRuL3dYNm9iSUgrK2JMWTVQeGQ0dnBIWGgxaGlnYUhyVmMwMExDbmk5WEptRUxNL3R1YkxMYk8zUjNqSThpblo2K2tuT3k3dXhrcEZoNEcyQUpCaW80ZCtwR3E4Nk9MOW1SUGRZMkNaY1BVQXBzeHJJajdOREtZRWtHUGhkYmJWSHJOSXI5dnBGcnB2WWFjc0NsWUFaUlpCemVaWWtRSnBkZnh0anc2Z2dYcERTYmNJeEFHa0dXeVFNY0UwYldHVWRMaWV0Mkx5Sy9xWnJEUi9pdkh0OWpkNFdEZVZ2Q3NoeXlkaGVuRmpxV1l0c0Q4Q0MyR2FZNzdhZVAwYkdNRmlmYUFZeHd3SG4yOVNURnlqSTJRelN2UmFaV3RGblpDV000Q1ZVYkh4elhOL01OSTMyek5YeHMxVDR6Ry9qQmJ1bm1sYzR3UDd1VExhRnc3aGxMNTU3ajNuU01mQXREWWVVc2l6OC95NTk1OU9lTVQwVFJxMmxBVEVtNEZvNm5JMXloTzIvcVBVbUo5U3dzbXoyR1RrZUM3VXdzTnM0aldyeWFMVWFTejhDRjdER2NKclhMZDdHcEFkRWNmQmljQlNiQWU3Q3I5Mm1CZ0pEZ3pzemtETXpZc2xyRE1rellDaUp1bEd3WVlhaldLRjdSOFpOdlNoTllaREwvTnhjeXNxbjZLQTBscEZ1ZG5mWjhuZ0dnYjNST1N2dWdheGpqTUhyQUZrSkY0V3UzMC92TWlnS2dINmpxWjBzTTJtd3I4R09zekM3MVlWTDJzZllyNUk3VzI1WGk0Rm9NZkovOXNvL0hvVzdRK2ZLY1dBSzJIbmdGRkhvNmNtckxTM1JpREFidlVEVTg4SXZCc3NEVEVHZVZRdS8yWHY5KzE2YzVqTEtPdi9jOGZZYm1ZL3lYai83NnN2NzY4SHV0OTlkVy8xOSsyb28ybTJZY3MyRTIwWG04dU05OU85UmdSSXhMZXh6WFluRUZGZzhuc2o0aHB5WGIrMUVOWUFzWmZ5QkJmTWRVdXZsak9rdXRtalVCeWlLbXhjRmZyOVdhVmVMMzNkVnFKZENRUFBxSGplS2ZSTUZwZEJIQ0c3ZGF6YWhzTXFBRU5FaC9taW02NGNocEVnb2R4dVUxaDhvNHRndGJheGNNTG1WYnhCckFSc3ZlZFdjVW1WZDAxSWR3ekVsc2dGZm5XWHd2YkpnMVNoWnhPbm9EVmNkdk81bkYydVFIWTVmNEY1UTRkSWUxMmd6bkZJVzdDZzJSSFQ2emJLaTNjdmU3T202a3h0amRWRXdGTmxhaHRvUnhWa3lpcWZmZEg1Tmh3QlV3eTBRSFR2QjQyQzJCcDhyMloyS1BCdHVHR1J5T3RJTHl4OU15UEgvVk0vdXpFRktKRjlDZU52UDNoeS90TU1nc084c2F1cFBhL296aytYM2l6L2Vmdnk3WC8zNDVuRUw5MTd2NTdiL3VkZjF1OXU4WCszT3pZWnY3KzRBNXdWbzRHSUM1ZnRZSmV1dTBBSm5RUWNEYm50ZWZCV25sdjdqZC8rM0xPWFhwTW1nSkttR2xMVEhGQm1sZklVYWZVb1ZYaGhYQ1g5N3o5ZGFIeGN0RGFobFAvTkZSRFRndDAvU25nK1kzWFhTViswOWxKazl3aXNrUTAxT3lqSE0zRHY0Q2NFYzZVVDRINTVuM2h1RmFIeEZRMnBGTzJXaHp1RkpDbVVCM1RsdnFqckxVNFJ6QVA3czVxWk1NZ1AwKy9UUGJacmV2ZFJ3MzhEcGV1Nlh0dUJIczJENnIwK2RaZk50Sy96enM3MUZ0MVhQU2I5UmxPaThRZC9SYVpmZllmRjJ1VXV1WVozelV2RSt6VE5vQ01qMDJTL0hzcms1N3lBTm9CUHk1bmFXS0FZZEFSTjFXL2NmY0U1RC9mejRKcE5zaEtkRVorZEJ1YTN1TElkb2MwWFZuWUJRMEpGbjNaSjNLWjA5NXU4Qkx2cXdlSXI0aUhpOW9tOG5FYnlaVEozek1OaVY4VzBOZzdFWlhkRWFNelp6M3dOb0tqSzVvYk1GSm1OYitQK0FTcDVjMHAwM01GSVVXay9mb2o2MjExWEc0SVFHUU1USHhWR25nMjRlOWZXVmNqOFBFQnRwbEZCaW9hT1U4Zmo5aGtuTUZhNHJOeStoeWhkMTJjWnpTRkJra0VCN290STZZdWcyMGw2MVYzU1lDUG4xTTFZMG5ldXhtNDRraXZpZndvbkQxM2NOcnRQZ2RDYnJqcXQ0T2NWYjZNRXRmdll6em5xNnp4eXBIVUtqMW5lY2dDZXhLa0gvYjBkUUJHZFpKWWUxNFRJK1hlREIzRDg0WFI4NFNMVlRFZEFBT3lFamx4NElEY2Ezc2M5ekZzbitUSmNNM2RTSENWZ2Ewejh1U1FHN3NTSVIvekNmSEhUbWtDY0M1Q2p6ZXdZZmdGNFVrR3ZBM2JlSElqZkE2d2hoOFVSMXVCcjIwUUxJMWdLVXpYKzFydHUzTStsN0FvNTFyeHIyWDRSQ2JvMWFSa2JYeHE2Und0eDNmaEMxWmpyYnNOdDA2bXJUWkpoMHV4eCtFaEg4RklJSUNiOGU2R01rNEpZb3hPeGtITUhVYjRyUnJhY3ZHckJoNlBXakRnbjBUREVqOGhZWVg2Yk1KV3JNWUMzTDE4R0pwREljQlliZC9NNkRPZkkvYlFWcE9ZZ05RU0hZVjd3ZVozMjFkZGErVFJuZWtLcHdqTy9kMU9FWWt2bzREZGhqK0djRTBucnV5dUdjMkZvRFNzckU3OVpxbFdPV2N3dkR1bk9ZNE15dXpnL0dCYXdyaTQ5em1NNGhrbEYvaG5vYlVtSVVzSHdQZ3pDelRTaGlDQmRHLzBFaFFITlRWdVRaQ25MYVBWZXY2dVhRN1p2Nk1lVisyemZJU29oZHJZVnQzSUlLbGFyQktRT2pGN2pkc2UvSkpIL2t4OStuamNkemN0b0tGMVRlU2J3R1Vsc2lBRkFyOG1DT2Jwb1k3dEFjb0VDNlA0bkE2aHVVTXAxUlNaQXUxL1pWTXZHY3k3ZW5yZDlhVk9lbmwrUS9RUWg3dHBIczYzaFk1WWRmczNPZS9aYk1pVW1TZ1dDNEQvTXZSbWppSFg2RDMzNGtyNlZKTVhyWlNMRmdLMWlzaXM3a0RqNDA3T2t3aE9CaXVRSHZDeWVNNW9VTHNhbkhhWWd1ZEZ2QnQzUUo3S2tWdlR0aVMrRmwyczY1ZG0wMDF3UmpQNUhtZHZNdWwzcE1iZzBBNTNXN0FPRHFJWTlvTEVneldMSHZjc2pLNk16QUE4Ym84cldHaVhzVmhQZ2tFYmwwd0dJR2ZldTM5QSt0SDUyMWlEcjVwODJNcGdoRWJwTzFTYmJhUGFnSXVQcEhuTktYY25QLytBdmRaVVpPUTJRNTlGSGFoM0V1MzdieVFWTGNRMEs0SkdOeGZZNnNReVBjNHhYOGJYU1U3TmdCNUI4ZFEyQnpDbDE5WDNjd29QdEVDQjE4K1FVMjNTWmIzUWw4dytzV3VKMjluSGF3VG1DcytvVGtZMzk2WmFuK2VrUmhkcTEzOWF4Z3lmUzN5UDJWTWQ3b3YwVlpsMjUyNlpnc05FcThZdjZmZGFUazN4dk9Gd3EvQkhxWUU3Ri9SbWhTbk85OUdmZmNKbjF4bzl3ZU4rRHl5Qld6czNNdHpwc2lYbm1pUnFaMGsyUmR5dE42L0pJTnQ0UG5uOUtyckgrT3JUS0RDR1ROY1o3RzVEaWMwL0dYenRPYzFGQ3YxK002MkpnWlB3UVo4VHRSeElqUU9NYldyQkFzNllNUGZWL0swWVE3U1o5UTFzejBRNHJVMTNwYk9Jay93WFNFUUsycHJFdHVLeW1wRTBhekxtY2VtaW02TXFIUFFVU3hXODhYcllhdTFOZEdPdTU0ek1vQjJzOEFzVnJIYkdHeGcvL2hJNHdNMlgvekViZ1dLZHVielduSUwvd3c0clhMR0w3L0FzQWFZRlpwaG84YXRNTllEWlhHMlJsRVFQbEJMdXh5MVpXOHlaSHBiWFZ4US9TQmN5cGEvcy8rc2lpMHNFK1Z6cUluaXNrOVN6V0J4YzJnNE9qNDMwSzh0eStudEdKeVc3ejdPdUxUekZsS0NKUGRqZHJHWThqMEVGa3A0VzhnVzdTMHZkalZhN3ZhT0s1WnNsNS9sbHVaYkxWcEhzT3B2c3VGdGRHSGdZdkNkR3ZjWm5aZFRuSXlRNjNJOVR3Sk5ZQWluL1pPNk94bGQwVU5VTVIwYTR1a1ZSdHFHRXdhaHFvZ2J6Z1FENUtEdzRXd3g0SktqVkR3bTVESzAvMWl0Q1RNMWh1ZjhWNHdHckFUcVlEN0U2Z04rMnFrZ0huNnc5bTVOUDJER0huVlBJempMT1Y5R2N3VmF4YzRzWHVqTVZpeUNZWFNXbDEvT202MU9sd3ptTVQzSVkySnRicTRNamlwWWFSczdXN3lTSmN3V2UzZ1NUN2RkeHE2Wnp3SkI1Nzg3MkRlbHoyS1U3cUJvVzVSOXdBWVE4WkFKamJyenZMN0w3cDdITWo5ci9lMVl6YzV0QmtMd0FqZHd4RzVlNEtUZGNmZm5EQlI3MjdOczEra2tnS2xsRnRTb0g1TG9kSGVZUFU0ME9lcjZYbzdkNG9HcUk1UU02emxWeGxaT0FGV1Foajl2cWc2akFzS01BWjVCQ0s4Y3ExV2p4OHJaTGZJdHAvS2lBT09NZER6YW5mcDYwalRnbUFxUW96alV5cWJGS0RjbzQ0VGpyN2dkTlpSQWpzYWg4Q0dhTlJ2MzdQVzMwdmFjS3VBRXlSSzVQZThlSGd2UERYTy80YlI0bm5rV0YwaU1hK05ieTRCMHoxMnRyTm0ybnpza0paaitCM0k1dTk2aFA5aU1kaVl1QThHclUwT0FBVHJxV2ZCcjRjbkcrZmM2UlgrYWZGYmx6QUZ3aERsNjVVU284Zm9zemFsYzFlbkhqNTJjRS92blJ2Q0NrSnJQU2FMZENiMjJ3L01Hd2VnaDdCZFcvc3lGRllxWkpXdmwxcnc2dE43REVTQWFxS2I5cEkrVHR1TzRUa2xqUGlOdGVYVUhFUlM3a3M0RzhNcjl6SVhVVE85VHkrR0V0MkszK1BLNEJZQklldkZ2MElQTGVwZDU2dGlzcGtBRnN4bDJHM2lUNGNWMHlwMUJ5S2MxcmhlYkdCOXIyRUcraUFZd3J0NW5jUDNGYXRnNmNzVFplcTBqMEZiTW1pZHF2L1RKZzVmL2paMCtFWXBkQnliQzNwdS82Y0FGTk1oT3JuQW9POThZOVVGcDU2K3QrKzNoc3gzODN5NTUzTVcvL0JUN2Z2MVRxSjczRGhXYzhadGZZckZyLy9kTDVwOVgvdHZQOFBRT3g1N3JPbTJUKzBhZHNSdFNhdERGdWoxbUFTY2QyK256WDh0SjFyRmdYdS84cGpQTzRIWkduYk9qMmpodmVQMXpYWDd2S0VQOVBlLy83UG11ZjMzQWZ6eGZCQXkxVlJ5bSs4QVQrMnRhYmp2SXltcmhRMXl6aFdUM2hIZ0hlKzh2Si9hbDkwK2IxOUVXREdob1dIL2tlK1V6Z2p3QWRvS1JHbmI5SElqenJDK2ZTanFMYUNOUTlKa1hacVpGQi9zdW85Vm5Ndmo0NEVleHZ0bm9mTFVrc1owT2lnZU54Rm5EUkR5MkIzNjZmS0w2RnVOL09NaHpSb1V6MVZ5YU5OZzdRTy9lVHA1ajllMVhyTGFpbndwcGlFVURuajhOV2pyMGZjMTRDY3YzWGF2Vlg1djA5MXRJQ2E3elVESXdkd3RPUUFnVGtRZC9ZV3FEWFp2WWs5Y1JCbVU3Ui9nSTZjMGFtV3Q1REV6djRUU3p3Q3Fpc3RZYkJ0Ti9Ob0VOY1VYVnZ3V25yR0VmdjM0N0ZOUVJjSjQwOGE1d2RZODYrdXhmOEFYT21GdkxWbmZ3K0ozdDZ6Nk92SE0yY1hWMkpaWUVZTHVhQ25lT0g5aW5GaVZmbHFQYVRIeE9mTE4xSU5qQ2J3SUVQYmYwZnZ4NjUrQjJtQ3Nza29YUnhlcFE0KzFHdzlLUksvdjd2OXVoSXlmYnlzOVpCV2pmb3FNWnJDMndXVDJmVXlhSDFYVk8vLzh6YXVXY0paWnhwZTB0OGJJWXhrazUzUW01TmlUb3pWNGpNN2dBOGU5WDg2L3lvUUFxTXErRGV3TDBKUHNFdUFOYytuR3c5OFVLZUpsdDdRRTNQNE94c3pkK2s0ZXN4TjRobUNGM1l6cmRvc2o4Y1p2eFdGenVYSWJqeDVEMHF6dkdjejhuaUtIdnJUYm1aTFBpYk13Wk1tcXpUZ2Rhb25RQlJ1bm8zZjQ2WGRKdW1uRG5DY1Z0VHF0K3pWREpIZU1haGp5QmRmYW1PRWpRR0M4S2dWbSsyN2JjYWxxQ09VNWVFRGZhOFJQR3doY28rS3IxeklhWVFxVG1DSU8yeHVOSktmSUttNVF4SXUxZEh0amxxVkZHMEl5L0EvS2NNeFZDZGd5RXNSR1dZWTFpQXl0SzQ4UUE1NDJiQzdZTFlOdEo2SW1ZemRQV0tqaW1DMTBkaXJlc0szRGUza25Jd1duWm1OZFl6YXRCeHNGQkdCMTlaUWUzalh6T0ZzV0ZoWFBnbUFIV1J6RGtsT3BxLzQ1VEJWN0lTZ2NlNHpsWE94cnlaL1N1cDJ2QWR4T0FFTjRJYnVGQy9PY2NEUWRjUEwybWF1TnBIcFpRWVFYcVBuWCtzTmd6NldlOURqVEJ2TDRPRUpsUS9XV0I5N1pIUERudTFRbW1BOUtQNlFBQ2R0WURhY0pwclFlcGdFSmc5QUtJSlRzWFpNOEhON2xnSlU5ZTZEWTR5NVkrYkxUSFVEUlBXektHSEhqR3gzSnBRZloyd0Jpa0pqdEVibjNPemJiSDdBN2I0SlBSRmRUVzdybGx6WnFKdzVGc3REdmI5OERaUEJPdzVXankzOU5WMkRVNzNMZW54bGh3NGlHc096bnpGdkF5RUIzbnpOZ0RjM3VjWEMvL01ndmJ3cVl5L3ZUVHJyK1pzNXovL3ExLy9jNFptbW5hMElIWXcrRjRTOVNRem5sc0ZqSlZxRGtneTU0OUozNGoxL0VjMVZOdFFSdW5yZ1loVHNueDBKYmNJQWpiM3JMVkZwN2Y4ZXpEYWNUMWdqMEQ4bkowSU1ZcGJiSkw1VDBaaVBramR1Q2svKzdyRzNRS0NhczlOb2Nwc0pvNVFKNnFjMlphc01FNnozTjQwV3RJTldHN25qNGQ2M3BtVE5zMGRRcElteFgvQUc4ZStZa1hGc3l3OFRZMWZsc045ajk4cG1LZmZCd0RtcldPcTBxMVNxOGZFSmVlRnhLQVpRNnZoWXlmQjl2QkFaYjcxb0tWQWw4emNPdEpUWFo1UEU0WnhvUlg2eUtBMG0xRDBXMHlkNmJTaVNMWFgyVFlzMjRNVW5pNG5tTWg0NWxZZ3BOMHJ2Q0p1K1Z3cllWN21WYm9POW9SOFppdjRZUHFxQmN3Tjl0NG5qLy82YS8vRFFhM21lc2M5MlVtNk1oTHZJNjRIR0ZoMWY0cFNQSGZ2aTU5M2JxcWZCRC9hMEdEVll0V21zQUVlcnlLM1NnQTh3cTczc1hJMkZxZUJ3QnlIQTcvZENZemJNMDVkbllreE5xQ25pT1krUmVkUDVLaENJVzROZHJzV0xJWWY4azFrM05qMlYvRGljTW12QS9XMEkyS25LbXJ3VnJuNHJGY0ZsSTRJZVdrMWEvL05xL3VtWGIyWWV1NFVZY3prQW9HNGxRVXlQUDBFS1VCV2hTTTQ4UHlKZkMrblV4Z0JiZlJRS2VncmVuOFM2T1pnODEzcUxlVkx2czljNnN0MDlKYWFFL0RtOUY5UXdZWE1LTURUQ1FRY0xKdUlIS2hoUG11VGxWL25DTnVCMkg5bkwvRXowaEwwam5BemtIb0EvNTlnNGJnSW13aE8zWG5BdXBvNW4wL1IxNkJOWndVTmswR2RTbmU2N3dMUkpBMTNBWnJzRWlHcnozaVlJQXNjNGNjODNPbUwvczlTbUczcG1jdW5CcG0yTFZJQmF2bHFaaUlQSTZTSGZIY1NLZytUc3ltclZHSHVZam53b0FCY1l6ZExOU2dUVXc4cmcvbytTNEw4WjdIdHVuaTNOeHNPKzNub0JnYjd5d1pibmZCVEJlanAvQitUS2FuQVZUcmhMTjFFL0djM2dPZ3ZIZkZjSDlHSEVCaVdGV0xXSVlENDdkRE1MbjE2N2xOc0U3ZUJGMnp2QitIZXRjS0JuRzBlUDg4eEk3bk5HY1RuMmRZWi9mbnlDdVB3b0hTL3M3SWFyZ293K1hoSEp5RXE3SC8rM01NdHVld05tZTA0QzdSWUtSb2ZSVWJ3U1dkVStRWXpISnlMYTloeUF6QkJlMTRFa091bDNQSFc3V1h3bmx0ck84SHRrYWVuWWtsbFB0ekdpT2dFUTd4MDd4UExPM1FobmVkempsWTUwVDdiNFBtT3g2bGdmLzliMzdVb0hZOThZVHFKSlhpYVdmQlRuZFcxTUM0VSs2c25KYm1lOUFkZ3Y3OEFOV050Sm5nRzhsTUNWemRtd0h0SEFFenpsR1JxNkRZb0RHbkREZjcweE13cVlLUW5EWDdIQ0x0eU5LN2ZkWFRPejA1OWN4M1FmcnJjRHlEZHJMQUxJRDdEbEQ1S3J1bXhKeUlpWlRIczE4OFpRL2s3YUc0dytIK3dTRkw4VDdCbHBvZHZnZUtWNTVQZHZCclRxcXpXMHhvNFBTNjRjUkZEMGV0UUtLNlBDUFM4U3hkc3V5cjhrOUFoVlUvejMwYUFUeWYwN3A0YkVudjdUcUpGOUNsZzJhVmllaWg1WkM5UitvdkI3REJBb2RRN0hBby9WUWEyMEpsMVE4bTBIR0pTTjFiQUtOcm56TW5vR0JCL1p1Ty9Cb3ZiQnNEYWsyZFo1M1lsb3ZpUEFHaTFQM0JkZWJWb2pPZXc0YkphNWZwL2pySzQwUUtYTXp6TEQzZEVna0oydTNhVC9ZemRyUGxZR2d3RkovSmY1MTNXcitUKzIrWGRZSDNPZHJIQks1UlRNdTFxb25pWUR0TFlWMkFOcERJSTJKL0JBeGt6RlliY3dkbDJpQ1lFY2hUc1c4OThmQW93SGxLWmw2bkhqaFFFMlZ6aXA1OXlSQ2RmV3V0djJqRjdqNk5uTk9CZFpDdmpvWHN2NGtoeTlFUDZWK1Z3b2cvTUJiejI2b0htb0phV2NFRG5XMTVsWDBYNXp4N0NvTVRiMDZ4Mll1dUJ5VVZNMncweFZOdVlyQUZyVnJwNDZrdGtBZnJHZi8yaWtlSGpnWmQ5emxDcHRXRDZJc1RLb0taaXZ2YnhUa1ljWGhnQVlUVUh1dlg4ZGU1ZUE0Wmh0VVUrdHhXaUdEQjM4dVdCQ2R3Mld0NzZ2L3pMMGJDNHRaUWYyWHAzNS8zenZpUCtEcGtPR0liWXJubFpmMTBIcS9MZzJYUVZDZlFUSDRZeEZxc1Q0Mi9uaFljMWZyZlhmcmtyWUtEMDY4bCtMWnRBUmlNT0ZyZGhqbVl4NDk1Mk5BNTZRNi9GZlJYNW91dHpFUHpEVnhDQVlQdE9pYkFMMzJDZ1NlRGpZNmJEeDRQZ0dMQ2NzN1p3STdBZkR6cEdMVjUwMWgydUtmYndmYnY4YTNnVzZoV0hGYzk3V2FtZE9YeVJWeGN6UzNvZjdjVkVjT2h3Q2ExQzQ3S2s1QTlabU1iZ0JxZVZYc0x1a3l3T0hJWExDbjdpNmJjUHFjdEd0TXNRVXAwVGlscUo2ZDVvMzJtSXg4blY1YUQ1aEgrYUlOem1QUDZwU29GYXNIMHROT2YwMkQ5bHFOM25kRWI0enJUbWMyc3RUT1l6VURmNDRtb3poN3BKeTN6b212ak50MWpxV0p4aXFPbE0veVk4MU1xSy9VQXBSMm1XVytQdXdSSEZEdGNBQmt0Z2ZkZTV5SzNQL05xZVVpWThNblF6TlNkQzJTZStINHdBTHVlU1BHTXU4YmtNYjdaREJlT3VucWVGTXpRTXQxNENtRytDd2RXSCtjQ3ZtVTFzQTk0Mm41YnozNTF2TUE2WTF3ODBleHhMay8rZFZNOGY4N1Z3c0J0VDY0QmRGMVdUTnVRNy9HQXJMT1QvZmM1SE9aOHRCNjNQSm9ub0p3SVRzQzdyNG9yaTU1NitwMVJxeDdNbU9EOVZyRkFRSjBYamJleWlMLzhUUzA5Ly91RkJNZm1hUXBPZFRRRVpxT0RTZnVURVR4RFVDOU1qR2JaZVFmSXlHMEZuUU9tSEhhMFR6cXQ1Tjg1UHRaZEZhZXMyMEg0bi9wLzZVS2RvL0NkdlAzZks4M2ZadkFXUkhMYUJUM2w3VTM0eFZvZFRGQTgzdkp6T1BuNzRnKzNaL253bzlwS2VJaGQzazZVQ3c1OXkwaVEyNDM4VktNcjAyTlZzSDhuVHZTZTA3V2hDajFZRGNvbnJuaHFUWkRrVTNuVG5aNTRzeUxvd0x6UElRT2oyVzZKRUU4bktOcDhiM0d5SWJieU9Ea1poZ0RvU0pjTkx0YVBXVG0yaHZQaGtzZmtnYUVmaDhNSEo1YS9uZ3I2Mmd6ZG5PMnBMM0w2cVJXWW5yV0J2RUhYMzlmanc4VHhqL044K1Jtbk8rQ0lkYVpXN0s3b3NNOXUvUTRPK3daMk8zcjhPY1Z5ZUFCMmFEcE00RG9oRkFDNStHVTYyZ0ZnNWJBZ2c5UFJVOEtEeHhFNS9NekRUNnl0aE94Nzh0M3lhRGxJaEFLUzhQMC8wb0tjTjFOaWdHWkQxMkU2cmNhSjJxK05EaW44OHRIMmJpZlU4UFdjS1N1dGNlWEpRdWRRN3N0Y2RRd1oxbStlZHppdVl0M0NRanZSRGV1Yks1SXh6eE9UdzMyV09UQWxveDhrMGV1SUtET28xck1Ta1dYZFRJRkkyS2xSREpuK0NpdzFUTTZlM3RGRGZLM3g3UmFFYnVNTDJHSGtkVHYwc1RuWjY4OWswN25QSVhNZTBwREZhR3hyR3lmVmhLa2YyOWxtRW1qUFMweW1mOHpqLzg0N0F1cjlacks4QzFPQmVTMmUrUHhyZ2JRbXBKNGhua1hHNlFHTjFWbmlGaVpoNHExbWZteDF4S2ZiakhRNldLWm52enpid1ZPNGpUZWVmQjJ2M2U5d3N1YU9uclJvekJTVnc1ejVUQTdBaHZyMWc5YnZEeVhEdFhtMldKYVlwdGtTQW96bU90SGZFNmxONFFHbHpwRkdOcFFBOHl3TEhSNjEzaDJpM0o1cXM0SDlXTTZybFdBODV0M1J5eGgyUUdNTW5qMm1EeDNRVUIyY1d5eWVsdVp0TEhnemNlRXVPNURXSkNPc3RsMW53aXcyMi9PL3krZTVndmFOVEpkbHRHTTVrY1BuOUkwNkNPSjJCb09EWWhUTlpGdnJPUXNsTFk5eWFpZjV4MjRhWGJIeHFXbmVUdnJPWkp3elJ0WFk3V25BVmt4Z0V1SDEvdGpkalZMakE2dERGSk1CYnE5L2gyTWhEcEhTWEVIZWx0bjltTTVSV3g3QXhMN1pHOHU3MnJpaHF6WWN1YkgybDlVZXJ6bnpjelM5REdlbk03YXBXZk53Q2xkVzV6WGY5M1I4WTVGd21kbkdHNk9BbnZzVHo3SGZGK1ROZ2pWTFM1cjhJdU81N3p3OGRDSmo2UlpiWUNWRkVoMDYrUTAzalgzVElYZ3YrWkJkcDlhd3Z4N2VpZzJ3RU1hS0pydzZUMlgwZEZwMyttWHJZVDh1Q01IQ3VaZmxvUjNZeDlJTlpUM3VnTW5UeTAxWVo5Nzk0TW51NVpFWUNJQnpSb1NrRm0rSm9MZkYzR2RtMWhsbzdSQ3d1czhCMzFhN2xQWmRBUy9aN00wS1R0d2Q5em5zT1ZuVHREekJRalY5ekN1YkVuUzRQUGFlYjJlSHdsYjcxN09uRmZlK0w5dWpIVCtGM21WUDMrck9CdkRjUC90WHduTU9WUExRR0E5eHFpYmcyRi9KWnZmSWVnK3R3YXpwZjY1ekxDckk1ZnIvQXBZVHFBOGFKZXJZQUFBQmcybERRMUJKUTBNZ2NISnZabWxzWlFBQWVKeDlrVDFJdzBBY3hWOVRwYUlWQlR1SU9HU29UaFpFUlJ5MUNrV29FR3FGVmgxTUx2MkNKZzFKaW91ajRGcHc4R094NnVEaXJLdURxeUFJZm9BNE9Ub3B1a2lKLzBzS0xXSThPTzdIdTN1UHUzZUFVQzh6emVvWUJ6VGRObE9KdUpqSnJvcWhWNFFnb0I4OUNNak1NdVlrS1FuZjhYV1BBRi92WWp6TC85eWZvMWZOV1F3SWlNU3p6REJ0NGczaTZVM2I0THhQSEdGRldTVStKeDR6NllMRWoxeFhQSDdqWEhCWjRKa1JNNTJhSjQ0UWk0VTJWdHFZRlUyTmVJbzRxbW82NVFzWmoxWE9XNXkxY3BVMTc4bGZHTTdwSzh0Y3B6bU1CQmF4QkFraUZGUlJRaGsyWXJUcXBGaEkwWDdjeHovaytpVnlLZVFxZ1pGakFSVm9rRjAvK0IvODd0YktUMDU0U2VFNDBQbmlPQjhqUUdnWGFOUWM1L3ZZY1JvblFQQVp1TkpiL2tvZG1Qa2t2ZGJTb2tkQTN6WndjZDNTbEQzZ2NnY1lmREprVTNhbElFMGhud2ZleitpYnNzREFMZEM5NXZYVzNNZnBBNUNtcnBJM3dNRWhNRnFnN0hXZmQzZTE5L2J2bVdaL1A4YTdjbUx3MFh4dkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg1QWNDRUNRU1IxL1VNUUFBSUFCSlJFRlVlTnJzWFdkNEZGWGJ2cy9NMW5UU0V3SkpxRUtvU3ErQ1NGRXNLS0orb29DZ2lJclN1d2d2dlNnZFFTa1dSSDFGUklvRkMvS0NnQ0NDUWlDMGtKQzJ1OGx1eXZhZGNyNGZPek5zR29ZU2l1eHpYWE50c2p1N00zUG1uSHVlZWorRVVvcTdWZjc4ODArTUdERUNmLy85TjhMRHc5R3paMC9FeHNiaXE2Kyt3dG16WndFQUd6ZHV4T3paczVHYm00dEhIMzBVTE1zaUpDUUVhOWFzQVFEczNic1hJMGVPeE9uVHA1R1ltSWhHalJyaHQ5OSt3OWl4WTJHejJiQjU4MllVRmhiaTBVY2ZoZHZ0aHNQaHdOR2pSMkV5bVFBQW9hR2hTRTVPaGlpSzRIa2VnaUFvcjRJZ1FCUkYzNytKS0lydzNTaWw4aXVobEVMZUFKQ3lyd0JBS1NYUzVTdXZaZDRqNTg2ZGk0bUlpSWpUYXJVeExNdkdNQXdUeFRCTUJDRWtIRUFOQUNHRWtCQUFnUUFDQU9nQmFLU05CY0JJdnljQ0VBQjRwTTBKd0FIQVRpa3RBVkJDS1MyaWxGb29wV1pCRUFvNGpqTzZYQzVUWGw1ZVh2UG16VTNTNzFDZnJkei9oSkN5bjhudkFRQWxoSlI3OWRrb3d6QWdoSUJobUxJYlpWa1dMTXVDWVJqSWY2dFVLdVZWM3RScU5kUnFOVFFhRFRRYURiUmFMYlJhTGZSNlBmUjZQUUlEQXhFVUZJVGc0R0NFaFlXaFJvMGFpSXlNUkhSME5PTGo0M0g0OEdIVXJYOFAvSEpqaE56TndIWTk0dkY0a0p1YkM0UEJnSUtDQWxnc0ZoUVZGYUdrcEFRMm13MTJ1eDBPaHdNdWx3c3Vsd3R1dHhzZWp3Y2Vqd2NjeDRIak9QQThYMnFUQWN4M0UwV1J5QUJYQnN4S0FabjhmeGtBS3dWWXZ2OXYyN2F0Z1Y2dnI4ZXliRjJHWWVvQVNDS0VKQUpJQktDN1RZYlpCZUFTcFRTVFVwb2hpdUpGanVQU3JWYnJoUUVEQnB5WHdjMEgyQ29EdkhJQVNBaWgwbmhSRUhKNVlBZ3BCWHkrSU9jTGVtWEJ6aGYwZk1GT3A5ZERwOVVpTkRRVU1URXhDc0NGaElRZ0xDd000ZUhoaUl5TVJFWkdCdHEyN3dTMVd1MWZYSDVndTNZWk9YSWtWcTVjZVZ1ZFUzUjB0RmZOcVFETVpLMU1CamI1M3NtYW1pOTQrZjYvYi8vQjZKalkyS1pxdGJvcHd6QXBoSkFVQUkwQWFPL3dXK2dHY0ZvVXhWT0NJSnh5dVp5cDZSZlNVeC9wMjZkQTBoUjlRVTBzQTRDZ2xDci9YMEdqbzRSaHdCQUdERVBBTURLWU1aUmgyQXBCalZXeFVLblVVS3RVVUtuVjBLalZFaGdTcURVYTFFcElRRUJBQUFJREF4RWNISXlRa0JEVXFGRURPVGs1YU5xc0pRUkJRRXhNakIrWi9NQjI4OFJvTkNJM054Y21rd2tGQlFVb0xDeEVjWEV4ckZZcmJEWWJIQTRIbkU2bm9xV1YxZEQrUVVzanN0bFpCdEI4TmJOUzJsaFpVSHU0N3lQczRuZVd0TmJwZEswWWhybVBFSEl2Z0FaMzJXMDZKNHJpbjdrNVdjYzBHdldmWThlTStYUHYzcjJpRDlpSmxRQ2VaTVlTU2dnb1FFQklaU0RIZ0dFWnNBd0RobUZwS1lCVHNWQ3hsN1UybFd5aXF0VVFSUkhCd1VHSWlJaUFYcTlIUUVDQVlwNGFqVWJVYjNBUGFrZ2FYR3hNTENLam92eUx6ZzlzMVNmRnhjWEl5Y21Cd1dCQWZuNStoV2FuMCttRTArbUUyKzFXekU2TzQrRHhlTUR6ZkNsUTgvR2pFVjgvV2dXYUdhbkFYNlpvWm1QSGptVWZlK3p4VHVHUlVlMkRnb0k3RUVMYUF3ankzekhBYnJmQldsS01WdmZkYTZPVUh1SjUvcERWYWozODZxdXZIdnJpaXk5NFFraFpvQk1yTW0zTGFIRzBsRitPVWNBTkxNdUFZYjBncDJKWnNMN2dKZ0Vjd3pCZ2lGY3pMK3QvTTV2TnFGVTdDYUdob1Y0VE5TSUMwZEhSaUl1TFEzQndpUCtHK29IdHhnbkhjY2pLeWlxbHBSVVZGU2xhV2xYOGFHVzFORms3OHcwT3lKcVpiR2I2YUdTK3ZqSkNLV1VzRmt2am9LQ2crMW1XN1FLUXJrZU9IQW1OVDZqdHYxa1ZTRzdPSmJScDNicmNjK3JRNzRmM1JVWEg3aThveU4vZnZtM3JOQW5VS3RMcXhFcEE3cklteHpDVUlUNGFITXVDbGJXNGN0cWJDcUlnSWpJeVFna3c2SFE2NkhRNkZCVVZJUzZ1SmdLREFoRWNISUxRMEZCRmU0dUppVVZ3VUJDeXN6Smh0OXNxdmQ3QXdDQWtKZGRGU0dqb0xSdnprdUppWkZ5OGNNdlBVM1czVFhaS0tRd0dBMHdtRTNoQmdNMXFyWEEvaThVQ2s4bFVTanV6MisyS2R1WUxaUDhBWWhWR05XV0h2MlQvZ1BqNHg4cUNtY1BoNktiUmFIb3dETk1EUUZQZjgzUTZIWDRFcTBTY2pnckhKdFR0Y3ZiVmFyVjlhOVpNd0tYc3ZKTTh6LzlpczlsK2JaclNhRDhoRUh5QmpsSmFUcU9UL0hNQUlaU0lJa1JDd0lnTUJNSlFoaEhBc2d4aEdCWXN6MUtlNWFGU1NSb2NwNElnOExEWnROQm9OSXAyNzNLNVVGSlNBcTFPRDZmTHEvazdITjY1WnJOYVVWSlNnaUpMQVFJREF4RVdGblpGTFRYajRnVTBhM0h2TFJ2emkrbm40WERZLzFHYnJ1N3pWTjF0b0hiczJER0FNQWdNQ2taZ1lCQmlZa3Z2NDNBNGtKT1REYmVIQjhlTDRBUVJna2doVWlpdkZLVDBSbEZtbzZBVUVDbUZLRklpS3BGTDcxYld4S1NVRWlxWm1jUWJybU9jVG1jZmpVYlRoeERTQjBETmE3M21IM2YvZ0kwYjFzTmtNaUkrUGg0ZmIvb001ODZkeGRBaGc1UjlKazJaaG9jZWV2aHV4YjhtS3BXcVNWaFkyQnRaT1hrNWdpRDhZTGZiZjBwcDFPQW55VndWS2dVNVNpa0ZvZDRBS3dVaElrU1JRQkI4QUk1bHdmTXNXQlZQVmJ3S29pakE0WENBNHppbzFXckZYV0czMjZFcExsYUFUblp0T0J4MjJPdzJGSmlNQ0EwTmhjMW1RMlJrSkhRNlhhV2djU3ZsbjBEdFpwM25YUVZzQm9NQklBeWlZK0lxTmwxeWM1R1htd3RUdmdsbXN4bEZoWVdLSDgzaHNNTXBtNTF1Tnp4dU56eWNCNXhIMHRaNEh4OGFMMEFRZU1uY0ZDR0tzc2xKQ2FVaUtBVUJLTGxzY25yLy8rMjNBOTBURTJzL0doOGYzL2Q2d016M2VoYk1uNHVacythZ2RlczJLQ2twQVFEVXExY2ZQLzc4S3dEZ3BhR0RxMjI4TjZ4Zmg4Y2U3NGVJaUloeTU3VnN5VHM0Y2VKdmFEUWE5SGl3RjBhOCtocFlsZ1VBWkdkblk4V3lKVGh4OGdTMFdpMTY5dXlGbDRlUFVENnZEcEdPV2ZQRXlSTXZhclhhRjZkTW5aWXpkTmpMMzludDl1K2FOV20wWHdJNG9ZelpXbGFMazRJUElrU1JnU2dTeWdnQ0JJWUZLekJFWUhtSW9raWRUbWM1WUhNNEhGQ3JOVjVYaGpTLzNHNDNuRTRYSEE0bkNpMEZFdEE1WUxmYkVSRVJnY2pJU0w5YTdnYzJ3R1RLUjJCUWNMbjNiVFlic3JPenZEbHArZm13RkZwUVhDVDcwUzVITzkwdUY5d2VOenh1anhmVU9BNDh4NEZUQUkwSEx3Y0VGRkFUSlRDVEUyaTlJQ2FibWFkT24yMFNFQmpZajJHWXgrMTJXK1A4L0h6RXg4ZmZrT3M5azNZYWtaR1I2Tml4RXdBb0M0RVFBcTFXcS94ZFhmTGh4dlhvM0tWTE9XQ2I4ZlkwTkduU0ZQK1pQUmZGUlVVWU0vcE4xRXlvaVg3OW5vUW9pcGcwWVJ5NmRYOEFzK2JNZzhsb3hMaXhveEFWRlkzK1R3Mm9sdk9zNUpnMW82S2loL1YvYXNDd3JCekQ2YzRkMiszNHoreTUzNzR3OFA5T0FSQWs3VTBneEt1WVg5YmtLS1dVVUVJRVNpa2hvaWhTUWtRSUFrTloxdXVPY0xsY1VLbFVWQTRxcWRWcXVGd3VxTlIyeWFYaDlkTzZQUjdKWEhXaHVLaFEwZVpjTGhjY0RnY2NEZ2Vpb3FLZzErdXY2YnEvMnZJbDNsdTlFai85c2hjQThNckx3MkN4V0VxNVl5Wk5ub0llRC9ZRUFKdytmUXE3ZHU1QTgrWXQ4R0RQWHRXK1hoZk1uNHR2ZCsxVTV1anJJOTlFLzZjR0lEMDlIVXZlWFl5UzRpSUVoNFJpNHFUSnFGWEw2MmMrZU9BM3JGbXordTRDTmw3Z0VSZ1lWRVo3eUVGdVRpNk1SaVBNWm04S2gxZExzMTcycDhuUlRvL2tVL1BJL2pRdnFBazhENTczRFFnSXZta2FwSFJBQU14SEgzK2k2OXlsNjFNc3kvWW5oUFR5ZGFyYVNvcXUrenFQSHorR0dkT25LWnJBNDQ5NnpjeCtUL1RIb01GRHF2UWJodzRld01vVnkyRXc1Q0V4TVFsanhvNUhTcE1teXVkN2Y5MkREUnZXSWQ5a1FreHNMSVlQSDRGMjdUc0FBRWErL2lxeUxtVUNBRWEvK1FaVUtoWUpDYld3Y3ZVYWlLS0lybDI3NGVHK2ZhSFZhaEVkRTROV3JWdmo3Smt6eW1LcUVSNk81d1lPaEVhalFVS3RXdWpZcVRQUzBrNVgyN3lvd2pFYkVVSWF4Y2JHVHJpVW5iZmI2WFJzbnpIOXJSMmZmYmJaQ1lDWE5EY1o3QlNRazMxeGhGQlE2alZUS2FYVTdYYUQ1M2tpQlJVb3ovTnd1OTFnV1JWNE5RK092K3l6NWFSZ2xMV2tSQWxNZVR5ZVVnQVhHUmxab2ZZbWlpSVloaW4zTndEazVlWGgyMTA3UysyLzV2MTF5dDl1bHd0REJyK0FqcDA2QXdCV3IxcUo5UFFMY05qdHFGZXYvdFhaK2syYUtJbnNWenJIc3Y5YnpHYTh0K1lETkU1SktmV2RXZjk1RzZOR2pVSHpGaTJ4YStjT0xGKzJGSXNXdnd1WHk0bUZDK1poNWVxMVlPNG1ZUE1ORkRpZFRwdzVjd1puejU3RnhZdnB5TTdPUWw1ZUh2THpUUXJBRlJjWHd5cVpvamE3SFE2N0EwNkgweWRYelEyMzIwM2NiZy94QmhFODRIbU9TRGxwUkJSRlJoUkZobExLVWtyWjFOTm5tMmRjeXA3ZHJmc0RKMVFxMVFlK29PYXJQVjZ2dEdqUkV0dTI3OEtibzhhZ1pzMEViTnUrQzl1Mjc2b3lxRjA0Zng1dlRadUNFYSs5amwzZjdjWlRBNTdHbU5GdndHUTBBZ0F5TXpNd2U5Wk1USnc0QlR1Ly9RR1BQUElZcGs2ZERJZmtyRit4Y2pXMmJkOEZBRml5YkRtMmJkK0ZsYXU5SldnTXcrQzVnYzhqTEt5RzE5bDhNUjBIZnZzTmJkdTJVN1RLRlN0WFE2ZlRLeFA5K0xGamFOYXNlYlhOaTZzNUppR2taMEJBNE1vRmk5N1pYNzlCZ3lscjMxL1hqRktxaFRmaFdRTkFEVkFWcFZRbDMzZDVIa2h6Z25BY1J6eVNOdVp5dVlqTDVTSXlXRG1kVGpnZFRqanNEdGpzZHRoc05saWx3SlhOWmtOeGNURUtDd3RoTnB0aE1wbVFsNWVIckt3c1hMcDBDVzYzV3puUEkwY09ZK3JraWVBNERoYUxCUzhOSFZKS0cxdTBjRDVHdnZGbXBXUHkzWGZmb2xQbkxvbzJPT3lsbDdING5TV29VN2Z1Vlk5dlNFZ0lOQnBOaFordFgvYytObis2Q1FCdzRzVGZlUE9OMThzOWNNcjZ5Ujk5N0hFMGI5RVNBSERQUFkxZ2xnQXpMeThQWVdFMVVMTm16YnN2S3VvMVNZM0l6c3FXbmlMNUtDeTA0TUtGQzlqOXcvZm8xdTBCdUZ4T09GMnV5NmFucEtWbFptWWdyRVlORUVJZzhEemhlYStHNXZHNElRZ0NZVlVxOEJ4SFpKSE56ZDY5Ky9SWis4SDZaL2Y5Yis5VEgyN2NBSTdqVUxkZVBVeWFQRVZaVExlVDdOeTVIVjN2NzZhWXNMMzdQSVR2dnR1RjNidC93TURuWDBCRVJDUTJiUHdZdFdwNzFmOUhIbjBNUzVlOGc2eXNTMmpZc0dyMWpxa25UMkwwcUpGd3VWeTR2MXQzZE9sNmY0WDdyWGx2RmZRQkFYam80YjQzN2ZxcmNreENTSzJJOEloUlFjSEJvekt6Y3JlV2xCUi8xVFNsMFM4QTRhWElxaUJwYllLdkJnZUE4anhQR1lhUjh4ZXBsTmRJR0lZQkw2Z29ML2dtY1h2OXQwNkhvMVErcEt6UmVSUnoxV3VtUmtsSnZhMWF0Y2F2ZTM3QnpCblRrWk9UalNlZmZBcmhFa2hzLzJZYjZ0YXRoMGFOVXlvMXpiZCs5U1VXTG41WGVhOHlZTHBlZWZiL0JtTDBxRGRnTmhkZzMvLytoMWx6NWlxZm1TMW1USjgyQldhTEdXM2F0TVhvTWVPZzFXclJyOStUeWo1ZmZQNFpldmJ1RFFDSWpZMkR4V0pHZW5yNjNhV3hpYUtJOVBRTE9IUG1qS1NsWFVKZVhoNU1KaFBPcEtXQjUzbGN5cnFrVkJMSWVXcE9oeE5PbHhPVVVuamNIdUp4dTB0cGFGTGFCcUdpeUJCQ0dFb3AwKytKSjFVWExsNGFQRzc4aEIrN2RMMS9xOWxzZm1yRjhtVjRkK2t5ZlBMcFoxQ3IxTmo2MVZlM2JaQWxMcTYwbjY5MjdTUVlESGtBZ0tDZ0lCdzkrZ2VHdnp3VXp6MzdOQWEvTUZBWjM2cEtTcE1tMlAzVEhueng1VmJrNWVWaHcvcDE1ZmI1K0tNUDhmdnZoekIzN255b1ZEZm5HVnpWWTFKS1lTbTBJQ2d3Q0F6RFBCRVdWdVBUUzlsNVc5TE9ubisyZWZNV2VrcXBEcGVKQVh3MU9JWlN5Z2lDd1BBOFQzaWVKeHpIRVo3bjVjQUJjYnZjeE9WeWVWTS9IRTRsVjFJT0h2QThyMVFzaElhR1FxL1h3MlF5SVRjM0YxbFpXVWhQdndCS0tZWVBINEUvai80QnJVYXJnTFRSYU1DTzdkOWcyTENYS3IyMjMvYnZRMUp5SGNUR3hsM1hXUGJ1M1J2OSsvZEhmSHc4T25Ub2dQNzkrNk54NDhhbDlna0tDc0lycjd5S0wvLzdCYnAxNzE3cXdUaCsvRVM4OCs1U2JQcjBjNWpOWm55OWRVdXA3Mjc1OHI4b01CZmdxYWVlQmdEbzlYcE1uaklOOCtmTnZuczB0cUtpSXB3L2Z4NnNTZ3RUdmhFV3N6Yy96V3IxbXBwWldaY1FHeGVIM053Y3hNVEVLRTlDUTE0ZU9JNERJUVNVVXNKeEhnQUVITWNSUWVDQjBqV2FaUE5uWHdRdldqaC84SktseXdjUlFwb2VQSGdBOCtZdkJCVkZ2REZxdEdLQ05iem5IdVRsNWQ2V1l4VVRFd05EWGw2cDkzSnlzdEd5cFRmdmFOLy85dUxUVFo5Z3lkTGxTS2hWQ3dEUXBWUDdpclNhY21EbmRybnczWGZmb2srZmg2RFY2UkFYRjRjZVBSN0UvdjM3eWszYUgzZi9nR1VyVnQyMGhOT3JPZWFSSTRlaFVhdlJvR0ZEMyt2dEdCZ1kySEg3em05ZmRydmRuMzM5OVZmL25UQnViQWtoUkpCOGNiSVdwL2ppQkVHZ2xGSXFpaUk0am9NZ2lKUmxSUWlpUUFSQm9JSktnQ0I0UWM4M0o5SnV0ME9qMFVDbjB5bmxXYkwvN2Z5NTh5aklMOENhTmFzdzhQbEJPSHNtRFF2bXo4V2t5Vk94YzhjT1dHMVd2REw4SllCNHlSeUdESG9lYTlaK0FLMlVRdkxGNTUvaDVWZEdYUGQ0ZnYvOTl3Q0FEaDA2SUNNakE3bTU1ZWY3aFFzWE1IL2VIUHhuMWh4czNMQU90Uk9UOFBERGZTRUlBbHEwdkZjeGhYdjI3SVhEdi8rdWZPL1hQYi9neHg5L3dMdExscGVLbHJkcjN3SHQybmU0T3pTMjdPeHNuRHg1RWxsWldjakt1b1M4M0R5WVRKZURCVWFEQVlJZ0lpZ3dDRVdGaFlvZnJTQS9INElnSUNRa2xHaTFPa0lwaFNBSWhCZDRJZ2c4WVNRQndEejVaUC93aTVuWll6dDE3bklvSmpaMmNkcnBVMDJ6c2k0QkFKS1NraEVWSFkzT25ic29pM3ZIam0vUW84ZUR0eTZRSXBrNkFFQWx5aVFaaEI3dSt3ajI3dDJEdzRkL0I4L3orT1dYbjVGNjhnUjY5dks2Qk0xbU13Z0JHSlpGY1hHUjRpT2hZdWtxbHJqNGVCdzZlQkFjeHlGZm9tblNhTFg0NU9PUDhQbm5tOEZ4SElxS0NyRnYzLy9RckZtenk2YndqdTNZOXZWV0xGMitVakdmcXQzOHJ1SXgzVzQzZmo5MEVQUG56Y0h3VjE1RllHQmdSWURlUktmVHpYbjIyZWUrUDM4aFk4VHE5OVpHU1JxY2xsS3FvWlNxZlRVNHlRL0xlTWtQZU1MeEhQRUdEZHpFN1hZVGw4c05INTljS2UzTmJyZkRLaVh4eXI2M3JLeExPSFRvQU9yVXFZdHUzUi9BdE9rem9ORm9ZYkZZTUhUWVMvajhpeTNZK05FbldMTjJIVFFhRFRaKzlJa0NhcWRQbllMYjQ2bFduNmF2SFAzakNDWk5ub3I3dTNYSHUwdFg0RlRxU1ZCS1VWeGNqQmNHL3ArU29uVDgrREVrSlNjcmYzLzA0VWJNWDdDb3d2RUgvdVhwSHBSU25EMTdGcG1abVFyRkVLdFNvNlM0QkZhYkZRNjdIUTZuRTlrNTJRZ0kwRXZPVjRMaTRtSVFoc0RsY2hPMVdnVVA1NEVvQ2dCQWZPaUJHQURraHg5L0NibDBLWFBZZ2YzN2hqRU1VeGNBT25ic2pJTUhEeUl3TUJDZE8zY3RadzdQbVRNTER6elFvMUlmUjNWTDJRVGRCZlBuWXNIOHVYaXdaeSs4TlgwRzZ0ZHZnTGRuenNKN3ExZkNrSmVIMm9tSldMajRYY1JJMmN4OUhub1lKMCtld05BaEw0QmxWWGpzOFg2b1g3OEJMSVdXVXNjWk0yWWNGaTlhNkgwUzE2Nk5kUnMrZ2thandZS0ZpN0Z5eFRKODhmbG5VS3ZWNkhwL053d2EvQ0lBUUJBRUxGcm9OUU9mZmJwL2FUTngwK2JyTm84cWtxb2VjK1JycjRJUUlERXhDV1BIVFZCOGtGZVF1bHFkYmtiZlJ4NTlvY2VEUFQvK1p0dlhuNDBiTzdwWTF0NGsvNXVpeFhsVFE0aElLQVgxVnFoUVFSUWhpZ0xoZVI0c3kxSzVjcVVpaWl2NVlXVXc1S0ZHalhBMGFOQVFaOCtlZ2NQaHdKaXg0NnFVMnZQNVo1L2lxUnVjVm5QZ3dJRktQeHZ3OURQSzN4RVJFUmcvWVJJQUlEdzhIQzhPRzRiWFh4ME9Tb0hrT25YUTd3bXZiMjMrdkRsd3U5MFk1Uk5vbVByVzIyalFvQ0VLQ3kxNGVkalFmMit0cU5WcXhmbno1M0hwMG1VLzJsOS8vUVdHVmNGdXM4SHVrNXVXbG5iNnN2WkNLZFJxTmRIcGRMQmFyVEx2RnBHSUlBbkRNSVJTeWlRbEpiRjc5dTUvbVdYWmwzLzY2Y2ZHKy8rM0Z6UCtNeHNBa0o2ZWpubHpaeU1vTUJDRFh4eUs1czFiS09lMWJPbTc0RGdPNDhaUHJEZ2llUzROWGJ0MnJmSjE3dDI3MTA5UVdJbFVOcGEzY014T3A1NDQvdEh5NWNzM2YvZmRkeDRKNEJRVEZkN2FWUG1WeXNYMkRNTlFRUkFVL2plVlNrVlpsb1ZhcllaS3BWTElMV1hUTkNtNWpzVDNKcEZaeHNTZ1pzMEVKQ2NubFV0M3V0Rnk4TGYvVlhuZjloMjdWTnQ1L0NzMU5xUFJpQXNYTGlBcnk1dkM0VXNFeWJBcXJ6UFc2WVRMN1lMZGJnZlA4NGlPaVFIUGNYQzZYTVJodDROaFdSQkNpQ0FJY2k2YUV1VThmZWI4TXk4TS9MOFJScU94Ylh4OFBQTEsrQTdxMUtrRHU4Mkdnb0o4TkcxNjJjVGEvT2ttbU0xbXpKZzU2NFpkcTE0ZjRFZXdxeHliV3pobWpXclVDSisvYytmT0owcEtTajRNQ3d2YlFRamhmQUZPMHVLSVY0c0RwVlNnb2xTckovbmpJSW9pVWFsVTFKY1ZSdGJhQUlLaW9pTHdISzhrKzdyZGJyaGRMcmhjVGlRbEpsVXJIVkpBUUdDVnlxb0NBZ0tyZGFEL2RjQ1drWkdCOVBSMFpHZG5LMG1CY3RLdDFXb0Z3N0JLS29mSDQ0SEZiSUZLcFlMYjVTWTh6NE5LQmVyZXRBMkdpQ0pQQkVFZ0FKZzJiZHAyZjJmSjBsY0RBd1A3VHBveUZWTW5UMFNOOEhDb1ZDd0N5aXlXanAwNm82UzRTRWsyTkJvTldQUGVLaVFrMU1LUVFkNG9Jc093MlBqUko5ZDF2U3pMd202M1ZmdVQrRTRUdTgxYWFRa1djNHZHekc2emdsV3BRQWhwRXhvYTJrWVFoTDRtaytuRHVMaTRBNFFRamxMS0UwSmtnQk5CSUlKQ2hDZ3FCSm1pNk0wYWthbXRSRkZVekZNQTBPbjBzSmFVZUZOQ2VEa2xoTHRjeWVCeXcrbHlvWllVOUxuUmtseW4zajhXd2djRUJDSzVUcjFxSGV0L2pTbEtLY1daTTJlUW5wNk9uSndjR0kxR2hXWklydmZNeWNrQllSZ3ZLMGVwc2lpZWVOazRlRi82SUZsTFkwNmtwalVJRGc1K2pSRHl5cTB5bnlvSDhreVlMUmJFeE1iNzBjeFhhemZrSWpJeUFvbTF5MU02WldSbXdteSsrV05tTk9RaUlpSUNTWW1sejRuanVIV3BxYWtmdDJ6WjhnSUFEZ0F2UlZJVkg1ek1IK2ZMQ2VkRGNFbkxtcVV5SlpJY01aVlRROExEd3hFVkZZVzR1RGpVcmwyN1drdnFicVg4S3pRMnVZb2dJeU5EQVRXejJZemk0bUtmSW5ZSDNHNDNSRXA5eTZJSXovUGdCUjZpUWl0RUNRVWxvSlQwZjJvQXUzRFJPeU5abG4wRFFNTE51SmFnNE9DcjJqOHhzVGJ5ODAwd0duSVJGQnh5MTJ0dWRwc1ZOcHNWQXM5WENHb0FrSlNZQ0pQcDVvMlpmRTZpSUpRRE5RQlFxOVhEV3JSbzBjZHV0Ni90M0xueng4ZU9IZlBJQUFkdmtNcTNBRi9oaHBOQmptRVlJdm5mcUV4Ujd0dGNSZ1k0WDlaZXVlZEN3NFlOcjduVzlIYVdPMTVqS3l3c3hObXpaNVU4R1Y4T3RiSmtrSVdGaGZCV0MvRGdLdGZTR0FEazNJV01uaHFOWmhTQUIyN21vblM3bldqV3RPbFZhNnNYTXpKaHNaZ2g4Q0pjcnJ1VG8wMnZEd0REc29pTWlFUmlZcTEvMUVZeU15OGh2NkFBQWk5VTI1anA5UUZnVmFvS05iV0tSQlRGUFNhVGFWMWNYTncrUW9odmdJR1hORGRCQWpSUkRpNndMRXQ5d0l5cTFlcFNKSmErUFJia0JqSnlkNnlrcENRMGFOQUFOV3JVOEFQYmJXTnVHSTJsMGpsazJ1NktHRzdkYmpmc2RqdGNMaGNSS1lVZ0VVRXFXaHFsQktETWthUEhZcU9pb2tjUlFrYmY3T3N4R2ZNUUZ4dUR1TGc0K09YdUZvL0hzK3FYWDM3WjJLZFBINE1VWUpBMU9NRW5jaXFERzVXMU5WbFRVNnZWVkc0QldCYmNmRTNTK1BoNEpDWW1va0dEQnYrcUpqSjNyQ21hbFpXRmMrZk9JVE16VTBubjhHMnVJdE82K0RMZENvSkFQQjZ1SXZZTkJnQno0ZUtsL2lxVmFqU0ErMjdtdFRqc050aXNKUUNvSDlUOEFnRFFhRFN2OWVyVnE0UFpiRjRiRVJIeEhTR0VsY0NOODhsL0kxNGxUeFI5R3Y1UUg2cDVXbG11VzJWMXA5VVZWUEFEV3hYa3dvVUxPSC8rdkFKcWNqcEgyZVlxWmVpN0NjZHhBS2g4MCtVdVQ4eTJiZHRxaFlTRWpNbThlUDdWbTMwdHdjSEJVS2xVaUkrUFEyeHNySDlGKytXeU9VVkl5L0R3OERVZWorZUQzMzc3YlVPM2J0MnlDU0dNYkpwU1NubGNabDRXdlY0SjZoc3BKYjVSMDdMcElUSjl2UysxdmNmalFkMXJZUER3QTl0MVNscGFtcEo0SzNlTktpekZkT3NvQzJyRXB4ZUI0a3VEVkRuZ2RydWZVS3ZWWXdHMDhpOGx2OXlPb2xhclgrcmF0ZXQ5K2ZuNWE2S2lvblpMdmpkR0FqVlplNU5UUWNwcWIrWFNRc3BXTHZoMlRwTUI3cDU3N3V5a2I1S1JrWEZIbktoY0hpVUhDWHo5YVdXMU5KOU9VY1JiV096dERDV25jRkJLeWM4Ly94eVdtSmc0am1HWUNmNmw0NWM3eVBlMmJPdldyZXNuVFpwVUNNRGprK0FyeVA0M3VXcEJTZ254OWIxUjN3b0Z1ZlZmVUZCUU9iK2JIRlM0VTlOQlZJbUppYmY5U1hJY2g5VFVWTVYzVmxHSHFBcTZRdmwyVS9jRk5jWnV0M2ZSYXJYakNTRTkvVXZGTDNlWXZEbCsvUGlVWjU1NVptMVNVdElSQUN3QU9YcEtVSnJKRjZJb2doQWlsMlFSbWYrdHJJYm1XMlR2Y0RoZ3RWcFJWRlNFbEpRVXFOVnF2eWw2bzhYbGNpRTFOVlVwa1pLckNYeGI0aWs5Q1NUQ1BWbFRrMDFQQ2RnWVNpbmo4WGlHc3l3N0VZQS9vOVV2ZDZRd0ROTWpNVEd4Y1VsSnljcVFrSkF2QURDU2VTb25sWmNLTE1nV0QvVUtrYXNYZlByWTRrckY5U2twS1pWMnhicHRUZEhiT2QzRGJyZVhBcld5MVFSbEd4YkwvalRKL0pUclBCbFJGRWx1Ym01OGRIVDBCRUxJcS82bDRaZmIxZDFpTUJoZ05Kb2dDQUpzTnVzL2ZvZm4rWFZIamh4Wk4zbnk1RnhKYzVNckY1VGllcCs4TjBpcElYSVNyNUx6Sm5lbUwxdWxFQjBkalpvMWF5STVPZm0yQUxmZzRCQ3dMSVBvNk9nclpoRGN0aHFiMVdxdEZOUmtobHU1OTZKdmtFQUdOWi9JSjJPMzJ6dHJ0ZHFKaEpBSC9jdkhMN2NycUIwN2Rnd1VSS21HcUdKVzJiRDZEUnZYNmRydGdmYzZ0R3Z6QndBRzNzaXBUSURxcFVYeS9rT2x2cmRlalkxU0wwT1MxQWRYM3VRZXVvSkl3UXNVSEMvQzdSR1FtSnlBb0tCYlg5bGl0OXVRbTJkQWJsNGU3cnYzM2pzSDJJcUxpeFZRazR2WnpXWnpoWnBhSlpGUHhaL21kcnNIcWxTcXlRRHErWmVQWDI1WE1SZ01vQ0RYVkwvS01FejNXclZxSjU1TVRWdlJKT1dlSGFDVW9ZQnYzdzFCb2dzUnZiRUFDc2tDQmJ6cmhDb21xUnhSbGN4VVVhUVFxUlJOcFNJYU5taUk0SkNRV3pwV2dZRkJDQXdNZ3NtWUI0UEJVR0dhMUczRm9QdkREeitnZmZ2MmlJbUpRZGV1WFRGaHdnVHMyYk5IWWVpb0tBTHFWdm9QZUgxcTBzYUlvcWlhUDMvK2xQVDA5TFhmZi8vOWJRTnFQTTlqMUtoUmlJNk9SbWhvS0lZUEg2NTBkL0xMM1NzbVV6NkNncThMTU9xR2hvVXRQbmYrNHZDRzl6UUtBS0NUdW1mSlBSZFlTc0ZTS25mTEVnalBjL0J3bkplcDErV1dlaXg0dTJOWnJWWVVGeFhCWWpIRFpEUWhKeWNIR1Jjdkl1MU1Ha3FLaTIrTE1Rc01Db1pSNnB4V1Z0Z1pNMmJjRmllNWQrOWU5T3paRXlrcEtYamdnUWVRbEpTRW9xSWlIRDU4V0k3c0tJQlcxdnlVdFRRdnRiTEFwS1NrMVByODg4L25kdTNhZGN5QUFRT1lrSkFRZE9uUzViYTR6b2tUSjJMYnRtMzQ5Tk5QOGV5enoyTHAwcVU0ZGVvVUhudnNNZi9xdm9zbE56Y1hOY0lqcnZwN3AwK2xZdDVVN01lSEFBQWdBRWxFUVZTYzJlalZ1dzhBTUNxMXV1T3ovL2RjU0t2V2JTNTh2ZlVyQitCVjNTb3pmeWxBY0xtUnQyU08wc3VicEtrVkZPVGowTUdES0N3c1JFUkVCSUtDZ3FIVDZmRDExMTloL3R6WjJMWnRLd290aFdncG1ZYjUrZmw0YTlvVWJONjhDVC8vOUJPYU5HMkswTkF3QU1CZmZ4M0h0Q21Uc0hYckZody85aWRhdDJsN1RWMndOQm9Ock5aaXhGZmdhN3R0VE5HMWE5ZWlhZE9tZU9hWlo1Q1ZsUVZDQ0ZxMmJJbUNnZ0tjT1hNR0tTa3BsU1hlbGdvU1BQamdnNjBhTldvMHBWdTNibjNsbTNlN2lOMXV4NnBWcTdCcDB5YUZtdWo5OTk5SHo1NDlzV0RCZ2dxYjN2cmw3aENydFFUUjEyQ0dOcnluRWQ2ZStaOVM3Nm5WNmtGZHVuU0ovdVhYLzYzcGZuK1hFNVJTUmtJM3hUU1ZzVTBVQkpHWGZHMkE5OVVMZUJLd2dlSkMrZ1Z3SEFlV1lSRVJFWUdNakF4UUFJR0JnZGk2WlF2V2ZyQWVHbzBHWThlOGlTTkhEcU4xNnpaWXZXb0Z1bmQvQUgwZmVSUi8vSEVFQytiTnhhcjMxb0xuZWN5Yk13dnpGeTVHVWxJeTFuM2c3U3Y2MHN2RHIybmNmSHNGMzNhbWFGRlJFZXgyTzNKeWNuRGh3b1ZTUHJYRXhFUWtKaVlxS1IxMnV4MzUrZm1rc0xBUU5wdU51Rnd1SWdnQ0k0b2lrNVNVMVB2SEgzOWNzbno1OHI2RUVIVHAwZ1ZIang3RlcyKzloWGJ0dkExNTI3VnJoOW16WjZONzkrNElDQWhBdlhyMThQMzMzMlBac21WSVNFaEFhR2dvaGcwYnBoRDNVVW94Yjk0ODFLOWZIeHFOQmhFUkVSZzBhQkRzZGpzOEhnK2FObTJLQngrOEhKUFl0R2tUdEZvdGpoOC9EZ0RvMzc4L1dyWHlGalVjTzNZTVRxZXpGTjlhNTg3ZVR0c0hEeDcwcjI2L2xCT3oyWXl4WTBaaDBQUC9oOEdEQnVMM1E5NTVrcDJkalFIOW44Q1QvUjdGcURkR2x2ck81SW5qTVdUUTgzMW0vMmZHMUpTVWxDNEFkS0RVdDVFTUs0b2lLNjhicFlrTXg2R2twSmdZREhsZVFrcW50M0Z6WkdRa0dqWm9DSTFXZzVLU0V1VG01aUF6SXdPN2YvZ0JLVTJhSUNEQVM3SmFJNndHL3BMbS9WOS9IVWVYTHQ1NUhob2FpclMwMC9CNFBERGs1VUduMXlNcHlkdVlKVHc4SEg4ZFAzYkR4KzJXYTJ4eW9LQmR1M2I0OXR0dk1YZnVYTVRGeFNFa0pBUjZ2UjR5MTd1YzBtRTJtd2tBcUZRcVFpbVZ1NjR6VnF2MVdZMUdNN1Z2Mzc3MUd6WnNpRVdMRm9GaEdMUnYzeDZQUFBJSXBreVpvaHh6L3Z6NTJMRmpCenAxNm9SWFhua0YvZnIxdytPUFA0N1RwMC9qMUtsVDZOYXRHeDU2NkNFODhjUVRXTFZxRlJZdVhJak5temVqY2VQR09INzhPQVlPSElqbXpadGp6Smd4K1BEREQ5R3VYVHQ4OHNrbjZONjlPMGFPSEltWk0yZWlSWXNXQ3JBVkZoWUNBSEp5Y2hSdzlIbTZJaUlpQXRuWjJmNVY3SmR5OHNYbm05R3NXVE1NR3Z3aTB0UFRzWHJWQ3JSdDF4NEpDUW40NzVhdE9IZnVMT2JPTGswMVAyL0JJbWx0RmJVWi90TFE4QTgvK21URjRFSFBmeXNwTWtTeVRqa0tDTjRIT0JHbGZGNFFRcWhLcFNKdXQ5dXJ4QUdnb0NDRWdkdmxnczFtUTc0cEh3QkJabVlHQWdJQ2NQRmlPbFlzV3dwQkZCQXMrUW1MaTR1aDFlbXdZL3MzK09tbjNkQm9OTERaYkNncEtZRldxNFhINDhIS0ZjdVFtNXVMb3FLaUd6NXV0MVJqODAzcEVFVVJBd2NPUk4yNmRXRXltWERxMUNrY1BYb1VxYW1wS0NrcGdkdnRSa2xKQ1pIQVFJbjRNQXpEQkFjSHYvTGxsMTh1MG1nMDllV0dGenFkRGhxTkJvUVFoVmxVbG43OStxRmJ0MjVRcTlWNDRva240SEs1TUhmdVhBUUhCNk50MjdabzBxUUpVbE5UQVFCSlNVbFl2MzQ5K3ZUcGc4VEVSRHoyMkdQbzJyV3I4dmw5OTkySFNaTW1ZZno0OFJneVpBaWFOR21DQ1JNdVYyazk4OHd6R0RIQzI2UFI0WEJVbUF1azFXcWxEbGwrOFV0cGFkMm1MWDcrNlVkODlPRkd1RjB1TEg1blNaVytKNG9pWnM1NEd3LzNmYlRlQXowZW5IWXE3ZHdBQURwcDAxQksxYUJVQllBRktLT2tSd0dFWlZYZ09BL3h1RDArcmY3c2NIczhjRGdjc0JSYWtKOXZRbEZSRVU3OC9SZkdqeHVENTU1L0FkMjZsYVl1bkRkbkZqSXlMbUx4TzB1aDFXcExLVE5qUnIrSnhvMVRNUEtOTjZ0bDNHNFpzUGttMzhvcEhTNlhDM1hxMUVHclZxM1F1SEZqUkVSRVFCQUVHSTFHNG5hN0pYWU83eE5IemxIak9HNThTa3JLZ3RUVTFDcDNxUEF0STVNSFBDRWhvWlJUVWdhYXZuMzdvbmJ0MnBnNWN5YWVlKzQ1dEdqUkF0OTk5NTNVT01NcjA2ZFBSMFJFQlBiczJZT1BQLzVZNlhOUVZ2UjZQVHdlVDduMzNXNTNwZjBSL1hLWEExdnJObGk1YWcxcUppVGc0NDgyNHUyM3BsYnBlK3ZYdlErZFRvZUJ6NzhBQUZIQndjRnZmZjNOOXNFQTlCSzRhUWtoYWtLSWlsTEtBbUI4QW5DRTQzaDRPQTlSSXFaT0p6aVBGK2hLaW90aHNWamdjYnRSWEZLQ3h4OS9BZ1FFSmRZU2hJYUZLZVpuaDQ2ZE1QS05VVkNyMWZCNFBBcHpiMGx4TVVhUEdZZmVmUjZDeStWQ21QU2RPeDdZZk11a3NyT3prWk9UZ3kxYnR1RGl4WXRLbmhySGNkRHI5UWdKQ1NHQWwvN2JGOVJXcjE2dDVqaHVPc013czBWUjFKWHRPSDVGKzF0VjNnS3ZyTmgzeVpJbDZOQ2hBekl6TTlHaFF3ZXNYYnNXdlh2M0xyV1AwV2hFVGs0T0tLWDQ5ZGRmS3oxdVFrSUNYQzVYS2RXYjR6aVl6V2JVckZuVHY0cjlVazdteloyTncwY09vMGVQQnpGNXlqUWNPblFRL3pUWDkrL2ZoNzIvL29vcFU5L3luZGU2SmsyYVRybjMzbnVITjJ2V1BCQlNPZ2lsVkEwcEhRUUFTMFdSOER4SEJJRW5QRmM2SFlUbmViamRic1drVkdzMGNEZ2NLQ2pJeDhXTDZkajl3L2RvMUxneEFLQkZpNWJLZWY1NTlDaVNrcEtoMFdnUUd4ZUgwTEF3YUNVTGF2KytmV2plb3NXZDcyT1RDOXA5YXorTGlvcVFuNThQaDhPQjVPUmszK1JiSW1zNGN2czdBR1RuenAxQlBYdjJuTW93ekxpaW9pS2NPblVLUTRjT3JmQjQxOHRPc0dUSkVreWVQQmt6Wjg1VTNzdkl5Q2dWd1h6cHBaZlFva1VMOU92WEQ2TkhqMGJQbmowckJLcVdMVnRDcjlkajM3NTllT1NSUjZSSnVCOE13eWpCRGIvNHhWY0dEbndCaXhjdndPZWJQNFVvaWhnemRqd1loa0YyZGpiR2pIb0RIT2RCY1hFeEJ2Ui9BdmZlZHg4bVRaNktsY3VYd3VWeTRiVVJMeXUvczNMMVdnUUhCMlBCb25kR3Y3Tm9vYWFnSUg5ZGJtNnUvSVNWbzZXOHROWUViMk1zd2V0aWsvYmhlWUY2T0s4NUNnSUVCd1VqTGk0ZW4yN3lkcEsvOTk3N0VCd2NESjduOGVwckl6Ri8zaHg4K2Q4dm9OZnJNWEh5RkVXcG1ETDFMY3lhTlFPY2gwT3RXclV3WWRLVU94dllLS1hseXFUazZHZHljakxPbnorUDFOUlVCQVFFUUJBRXVOM2Vwd1FoUkNiVEl5a3BLVFZtejU0OU5TSWk0azIxV28wcFU2WWdKQ1FFQXdaVTNMMDZLQ2dJQnc4ZXhLRkRoNjRKUE1MRHczSGd3QUhrNXVaQ0VBUXNYTGdRcDA2ZFFsT3BMOEg2OWV1eFo4OGUvUDMzMzZoWHJ4NDJiZHFFbDE1NkNkOSsreTBBNFBQUFAwZGhZU0ZHakJpQndNQkFEQjA2RksrLy9qcUNnNE9oMFdnd2ZQaHdEQmt5Qk9IaDRmNVY3SmR5VXF0MmJTeGJ2cXBDN2YrL1c3WlcrSjNQLy90VnBiOTN6ejJOOE1INmphKzUzVzdWNWs4M3JadisxbFN6dExaOGxBRUdsSXFDS0RLbHdDMG9LQWdhclVhMm5rQkFVQ01zREVsSlNZaUlpRUJNVEN3eU16TEFzaXdhTjA2cDFCL1l0R2t6ckgxL2ZiV08yMDAxUmE5VTBCNFVGSVRZMkZpSW9paWJvMFFHTlpabENhV1VYTGh3SWVMNzc3OS9LeTR1N3MwSEhuZ0FYYnAwZ1ZhcnhmNzkreXUxMDE5NzdUVWNPSEFBZ3djUHZxWnozckJoQTBwS1NsQzNibDIwYTljT05wc05reVpOd3A5Ly9vbXNyQ3lNR1RNR1U2ZE9SWU1HRGNBd0RENzQ0QVA4K09PUDJMQmhBd0JneTVZdFdMLys4azFjdkhneEhucm9JVHorK09QbzI3Y3Y3ci8vZml4YnRzeS9ndjF5VTBXcjFRNS9idURBbCtjdFdCUUZRQ3RWS2FpOXlvNVNwVUJFMFp0NTRHM0E3QTBvdU4zZUtnV0h3K0UxU3lXZm04bGtRbTV1TGpJeU1uRDJ6SmxiZW4wM2pkMGpMUzBOYVdscFNvczh1WnVVWENibHkzeGJKdm1XVUVySm1UTm5hdFNwVStjdFFzaEkvN1FzTGFJb0lpUHpFaXdXQ3dSQmdNdDVkNVpvNmZSNnNDeUw4Qm9SU0VxcVhXa1FSN1lldkdObUJzOVgzNWpwOUhxb1ZDcEVoRWNnS2FseTdzTzllL2VpYnYyYnoxcnJjYnMvMkxUcGsvZmZuajdOQXNCRkNIRkRhUnhEQkVJZ0VNSW9EV1BVYWhYVUdnM1ZhcVMrcFFFQkNBb01STERVemk4aUloS3hzYkdvWGJzMjZ0YXJqM3IxcXJlYXNiSSt2RGZGRkpWN0ZKVGxVNU03U1IwL2Z0eTNRb0Q0MnYzU0ZsU3ZYcjJwQVA3Vm9HWXdHSzY2VTVEYjdjRmZmLzBGVnFWQ2NFaW92NitvM1liQ29rSVVITTFIaStZdG9OR29Ld1MxUC80NENvWmxFUlJjL1dObXQ5dGd0bGlRWDVDUDFxMnV6RUNmYy9QekdWL3ExcTI3ZUhISWkycy8zTGhCV1lkZTA5UmJZZ1dJZ2loU1VHOHhQQlVFa1FpOFFKVnU4ejRrbFU2SEEzYTdEVlpyQ1lvS2kyQXVLQ2lWY1hBanBlWVZmcmZhZ1Mwcks2dFVqNEt5M2RrZERnZHExNjZ0YUdvZWo2ZFU3ZWZxMWF2Vnc0WU5tOG93ekp2d1N6bkpNK1NCVmFuOG5lQWxrWmtmaklaYzVPYmxJcWtDaHVpTEdabGdXUGFtalpudk9XVm1Ya0xpRmZxTDFreEl1QlhETm56cXRPbDhSa2JHMmwvMy9GS1poaXRjQmp1UlVpb1NTc3YzVWVBbFpsNlBoNFBMNDgyQkk0UWcvaVpIL2FzVjJJeEdvOUlpcjJ6amxRbzZTWkdLdU5Ra1VCdm5YN0lWaTduQWpLQ1FVUDlBbEpHZzRCQVVGSmdyQkRhTHhZTGdXekJtUWNFaEtEQVhYQkhZYnBrWnI5Tzk5djRINnowTjZpV3ZsN1ZhT2FCQXZkRUZLcGJLTXlFVUlBUWdjbGQ2RUVMQWVNa3N3VEFzV0phRmlsVkI1VFZmRVJVVmRlY0RtOXloWFc2Umw1K2ZYeW1kZDFtZm1tL3lMY013VS8zTHRESS9FU0FJd2wxdmZsYW1KUlVYV1NyODdGYU5XV0JnRUlvTExkZjAzWkxpWW1SY3ZBQzczWGJGMzA5S3JvdVEwR3NEYmIxZVB6cnQ3QVhYUFEzcWJwTHdUSmxxUG1NblhtN2Z4MUdPOHhBSitFQVlBc0l3RXJBeFlGa0dLcFhDMWd1TlJvUFEwTkE3RjlpY1RtY3BVQ3ZMcDFZSlNhVGNmSVZJdlFsZVlSaG0ycFVYOXRWVEtkOXVVbFdxNDRxRUVNRHA5SE81VlRvUEsrRzV1NVhCbFd1OVh4ZlR6OFBoc0Y5eEg3dmRob3lMRjlDc3hiM1hBYjZCbzArZU91Tm8wcmpoVmg5UW8yVTBPQkVBRlVXUjhEeFBuVTRIWVZtV01vU0FFQVlNUXlDWE5ubzNGVlJxTlRScURSbzFibnhUS01adk9MQlJTbkhtekJtbFRaNGMvU3lycVpXSmZzcU5KUmlKOWZaWmxtV253VnY2VWVseHJwRksrYmFUcWxBZFg2djh1UHNIYk55d0hpYVRFZkh4OGZoNDAyYzRkKzRzaGc0WnBPd3phY28wUFBUUXczNGt2STNsbjBETmR5NWRyMVVhR2hyNnhyRy9UdHBiTm0veXZhKzJWZ2JjQUVDa2xIcDlhcHlIZUhzclhBWTJobVhCTWhLd3lWcWJWb1BHalZPcXZhM2ZEUWMyWDFBcjI4ellicmRYU09mdDYxZHpPcDI5VkNyVlZBQlhOTWl2aDByNWRqU2Ivb25xK0Zva056Y1hDK2JQeGN4WmM5QzZkUnVVbEpRQUFPclZxNDhmZi80VkFQRFMwTUhWZGwwYjFxL0RZNC8zSzhWbUlwL1hzaVh2NE1TSnY2SFJhTkRqd1Y0WThlcHJZRmtXZ0plU1o4V3lKVGh4OGdTMFdpMTY5dXlGbDRlUFVENnZEdm1uWTNicDFCNXF0UnFFTUVoS1NzS1FvY1BRc1dPbmZ5dU9Sa1ZFUkx5NmN1WEtrdGRmZi8xQUdjMk5Fa0tvOUQrUm0yRHhIT2ZsSW1jSUpRd0JReVEvbTZTNUtjQ20xa0NyMGFKZS9mclZlZ0UzTkVFM0l5TUQ2ZW5wbGVhcHlkUkRVb3M4K0xMZlVrb1pxOVhhU3FQUlRBWHdqMWQ5QTZpVWJ6K0F1d0xWOFRVOVpOSk9Jekl5RWgwN2RvSkdvMUhLd0FnaFNtZWk2bnh5ZnJoeFBTd1djN24zWjd3OURUVVRFdkQxTnp2eC9nY2JjT2pnQVd6ZnZnMkFOeWR2MG9SeGFORHdIbXo3WmlkV3JGaU52Yi91d2RkYnY2cTI4NnpxTVZldVhvTWR1NzdEa0tIRHNIamhmR3o5YXNzdG1TZUVFTng3NzczbzJiTW5ldlRvZ2ZqNHEzdTRDNEtBMzM3Ymo4a1R4eU03SzZ1eVk5U0xpb29hdm1EQmdzYVM1U1RUakt1VnVsSks1VzcwaE9kNThKdzM5Y05US3ZYRGpzS2lRdnowNDI2c1hmTWU1cytmZy8zNzl5RkxPbTdXcFVzWStmcXJlUGFacHpCbTFCc29LaXBVenVHakR6Zml1V2VmeGpOUDk4ZXVuVHR1amNabU5Cb1ZVRE1halFxb3libHF2bDNhZlRxMEs2Qm1NQmhxNmZYNktRRGFWdlhtL051YzVvR0JRYkJacjU5UC92anhZNWd4ZlJvOEVzM000NDk2emN4K1QvVEhvTUZEcXZRYmh3NGV3TW9WeTJFdzVDRXhNUWxqeG81SFNwTW15dWQ3ZjkyRERSdldJZDlrUWt4c0xJWVBINEYyN1RzQUFFYSsvaXF5TG1VQ0FFYS8rUVpVS2hZSkNiV3djdlVhaUtLSXJsMjc0ZUcrZmFIVmFoRWRFNE5XclZzcm1lb1dpd1Uxd3NQeDNNQ0IwR2cwU0toVkN4MDdkVVphMnVscUcvZXJPYVplcjBmSGpwMmduaklOYjArZmhsNjkrOXgwWnBiazVHU3dMSXZkdTNkRHE5V2llL2Z1eU0vUGg4UitVd3F3NVNSbDM3L2ZmT04xMUt4WkU2ZFBuNElnQ2xjQzBOYUppWW5EeG80ZHUraWRkOTdKa2JVMkg1K2JIR0FRQlVFRUlieTM3cEV3bERBTUNFUEFzQXh5YzNOQkNNRURQWG9BbEdMRCtuV29WNzgrOURvZGxpNTVCNDg5M2c4OWVqeUlMejcvRE8rdFhvWEpVNmJoeEltL3ZYTnM0MGR3dTkwWVBud1lXdDU3WDVWQi9JWm9iRmFyVldIcThLMy9sRHUzWHltdGcxSktYbnp4UlRZaUltSXlJYVJ2MVk5WmNrTW5pOWxzeHVSSkUvRGNzMDlqM3R6WnR3emNLcU02dmhwcDBhSWx0bTNmaFRkSGpVSE5tZ25ZdG4wWHRtM2ZWV1ZRdTNEK1BONmFOZ1VqWG5zZHU3N2JqYWNHUEkweG85K0FTZEltTXpNek1IdldURXljT0FVN3YvMEJqenp5R0taT25hdzBwVm14Y2pXMmJkOEZBRml5YkRtMmJkK0ZsYXZYZUNjY3crQzVnYzhqTEt5RzF5bCtNUjBIZnZzTmJkdDY2M2dqSXlPeFl1VnE2SFI2WlVFZVAzWU16Wm8xcjdZeHY1Wmp0bTdURmg2T3V5V2xRNUdSa2NqTnpWVjhYYUlvb2thTkdxWDJPWExrTUtaT25naU80MkN4V1BEUzBDR3dXTHdSMlhlWExNUGtLZE9xcEJnd0ROUDd2dnZ1R3h3VEU2T1h0RGFmMGl1d0FCaHZSemlSdUZ3dTRuSzV3SEVlWWpHYmtaZWJDNWZUaGVMaUlnUUdCcUtrcEFRcXRScUNJQ0QxNUFsa1pHWWdMZTIwY3U4ZmVyZ3ZEdjkrQ0FCdy90eFp0R2paRWxxZERpR2hvV2pmdmdQK09ITDQ1cG1pbE5KeVZRVyttcHB2Qk5TM1E3dHZCSFRObWpXVENDSERic1JOLzJyTGwzanUyYWZ4N0ROUFlmNjhPWEM3WEZYNjN2dHIzOE05OXpUQ3A1OTlnYkhqTGhORm1veEc3Tnl4L2E1eVZPL2N1UjFkNysrR2poMDdRYXZWb25lZmgzQlBvMGJZdmZzSEFFQkVSQ1EyYlB3WWpWTlN3REFNSG5uME1YQWVEN0t5TGxYNUdLa25UNkpuajI0WTlQeHp1S2RSSTNUcGVuK0YrNjE1YnhYMEFRRjQ2T0crTiszNnEzSk1RZ2pDYTRURGR2M08rcXNXalVZRFFSQVFFUkdCVHAwNlFSVEZVa1NPQU5DcVZXdUVSMFJnNW96cEdEdm1UZlI3NGttRmFPRnFHNmVvVktybkZ5MWFOQkJlTGpkZmsxUWxZUWdqVWtvWWhvSEg0eUUybXcwdWw0c0VCZ2JDN1haRHBWTEJZTWlEMVdwRmRuWTJDZ3N0eU0zTlJXNU9EaUlqb3lBbkJSODZlQUJXcTNjODY5U3RoNk4vSEZFb2tsSlRUOEptczkwOFlEdDc5aXd1WGJxa3BIVlVwZmRubVFqb3dCdVZxM2JpeE4vWXN1Vy9XUHZCZW55NitRc3dESVAxNjlkVjZidm56NTFEaDQ0ZHk5MzQvUHg4N05qeHpWMEZiQWFEQVhGeHBWWCsycldUWUREa0FmQ3lQQnc5K2dlR3Z6d1V6ejM3TkFhL01GRFJkS29xS1UyYVlQZFBlL0RGbDF1Umw1ZUhEUlhjcDQ4LytoQy8vMzRJYytmT3I1QkRyenFrcXNla2xNSlNhRUhRTFhLSEpDY25vMUdqUnZqdHQ5K1VvRkJaNEIwK2ZBVCtQUG9IdEJydGRUMFk5SG85Qmc0YytLYkJZT2haZ2IvTnE3bDUvVzBNSVFTQ0lFQ3Qxa0FRQk9MeHVCRVVGQXhlRUhENDkwTTRmU29WRE1QQTRYREFaREtoVjYvZStPYWJyekZrOFBOSVRUMkp3RUJ2LzRUbXpWdWdaNjgrR1BuNkNFeWZOZ1VCK2dEb0EvUTN4OGVXbloxZExsZk50MVRLQjlSUVVRVFVicmQzbHBvWjM1QlphN05hRVJRVWpJQ0FBREFNZ3hlSHZvU0xGOU9seFpxSFJRc1hJTjlrUkdoWURZd2JQd0dKaVVuNCtlZWY4Tjh2UGtObVppYm16cGtGalVhRDU1NTdIbDI2M28rbFM5N0JzVCtQd21Bd1lQakxYcjYzdGUrdng0YjE2L0RubjBkaE5CaVEwcVFKTHFaZlFHUlVOTjU1ZHlrb3BWaTlhaVgrK09Nd09BK0g5aDA2NHJYWFI0SlNpbkZqUnVIK2J0M3h5S09QNGNTSnZ6Rm45bit3YnYySHQwVjNiVitKaVltQklTK3YxSHM1T2RsbzJkS2Jpckx2ZjN2eDZhWlBzR1RwY2lUVXFnWEFHeldzYUhHVkJUdTN5NFh2dnZzV2ZmbzhCSzFPaDdpNE9QVG84U0QyNzk5WGFyOHRYLzRYUCs3K0FjdFdyTHJtaE5PcmxhczU1cEVqaDZGUnE5R2dZY09iZm4ra3NrUDgrZWVmQUFDV1pjdFJ5OXRzTm93ZlB3WURueCtFczJmU3NHRCtYRXlhUFBXYWdrVk9weE5idG14UkFYamxyNy8rTWpSdjN2eFB5ZGNtU3Y0MkpXSktLU1VNdzhMamNWT24wOXVVbmpBTW9xS2lFQkFRQUoxT2g3Ly8rZ3VpSU1KaU1VTWJGNC9uWHhpTUJnMGE0bUo2T2k1bFppckhmVzdnODNodTRQTUFnSmVHdllpNmRhdGVVSC9OR2x0UlVWR0Z1V3FWZ0JvcDA2V2R5YzNOamRkcXRSTnhBenUwdDI3VEZqVnIxc1RMdzE3RTExdTNRS2ZUb1hYck5nQ0FPYk5ub1dmUFh2aDQwMmQ0L29WQm1DNVJMRC93UUErc2ZYODlhdGFNeDdTM1ptRHQrK3NWczJqVTZMR1lNSEVLa3BLVHNmYjk5YVU0cE5xMmJZY1pNMmNoTXpNREgzMnlHWmN5TTJHeFdHQTBHaEFZR0lBTkd6L0d4NXMySS9Ya0NSdy9mZ3lFRUV5Wk5oMmZidm9ZYVdtbk1YZk9MRXg3NisxYkJtclMvZkJxSDZLb2FOSUE4SERmUjdCMzd4NGNQdnc3ZUo3SEw3LzhqTlNUSjlDelZ5L0ZIMGtJd0xBc2lvdUxzUG5UVGRMdmxHYUtpWXVQeDZHREI4RnhIUEpOSnE4MnJOWGlrNDgvd3VlZmJ3YkhjU2dxS3NTK2ZmOURzMmJOTHB2Q083WmoyOWRic1hUNXlwdkdVMWZWWTdyZGJ2eCs2Q0RtejV1RDRhKzhla3NvM2ZQejh4V0EwbWcwQ0FzTEs5Y1E1Y0tGOCtqYXRSdis3N21CbURaOUJqUWFyZUpqdXc2cFc3OSsvUmRIalJvVlc1Ry9qVkxLTUF6RHlGUmpIbzhISE04UnpzUEI0M2JEWVhmZ3pKa3ppSXFLZ3QxaFIxRlJFUW9LQ21BMEdQREhIMGV3Zk5rU1BQbFVhVjVGanVPdzZaT1BRWWlYeDYxYU5UWkJFSkNlbnE0RUMzd2pvQldrZFpBeWFSMkVVc3BFUjBkUElJUThlQ052dUVxbHdveVpzM0Q2VkNxKy9mWmJESDVoSUdiTm5vczZkZXZpN0prMDlGemhKZXhyMDZZdDNuVzVZRElhRVIxemJXbTlXcTBXT3IxZU1Wc0RBdlRnT1E2eHNYR0lqSXpDeEFsandUSXNERWF2MzlIcm00ckE2REhqOFBxcnIrRDVGd2FqU1pPbXR3VFV5aWJvTHBnL0Z3dm16OFdEUFh2aHJla3pVTDkrQTd3OWN4YmVXNzBTaHJ3ODFFNU14TUxGN3lJbXhwdGYxK2VoaDNIeTVBa01IZklDV0ZhRnh4N3ZoL3IxRzhCU3BseG96Smh4V0x4b0lUWnVXSWZhdFd0ajNZYVBvTkZvc0dEaFlxeGNzUXhmZlA0WjFHbzF1dDdmRFlNR3Y2ak1yVVVMdldiZ3MwLzNMMjBtYnRxTTJOaTRHejRlVlQzbXlOZGVCU0ZBWW1JU3hvNmJjRVB6MklLRGc2dThiMFpHQnNMQ3d0Q2pSdzhBd1BIang4djEwbWpldkFXYU4yK2hySXV4NDhiZklQL3J6bTZ0VzdmT0FMRENSMnNUQVZCQ2lEZEdTa1VxMTR2eVBFOFp3cEFTYXdubE9RNmhvV0dJam9tRjNXNkhXcVdHV3EzR3JsMDd3RElzbm5yNmFiU1hJdXVBbCtKOCtkSjMwYng1Uzh4ZnNMaENiYk95Y2JzbVlQT05nRmJHcVZZRzFHUUdBTGxjYWpnaDVOVWJQVUZQbno0Rm5VNkhSbzFUMEtoeENyNzl0akUrK0dBdDVzMWJvSmhHaXBuRU1LQzQ4VngwZi8xMUhMdDI3c0RTWlN1ZzFla3dZM3JwcWpDSHd3RzFXZzJYeTFudEFOYXJkeCs1UTNncHFWKy9BZjYzLzhwOVREdDI3RlRwd3RWcXRaajIxdHVsM3F1bzRXMmJ0dTBxWkhtdFY3OCtsaTVmV2VGdnN5eUx2ZnNPM0ZTZ3I4b3gvMm04YnNRNTJPMjJLa1VxNWFxYjY1VlBQL3ZpbXI2blZxdUhiTml3SWVQRkYxL2NCaS9GcmtnQktyV1NwL0NtZ1lpaUtGS0JGOEFURG9FQkFVU3IxVkdkWGdlMzJ3V253MXVOb0ZLcjBLMWJkOFRHeHFGV3Jkckl5TGlJT25YcUFnQTZkZXFNVHAwNlYzb2VkcHUxVWovb1ZadWllWGw1Q2dXUmIxcEhCUkZRK0lDYW9xM1o3Zll1TE10T3JJN0prWFhwRWhiT253ZTczVnQrWWk0b1FHaG9LTFE2SGVvM2FJZ2ZwYWplSDM4Y2dWcWxRblQwUDJ0cm9hR2hLTWd2cUxDN1ZFVmlOcHVoMSt1aDFtaVFuNS92ellXU2lva05oank4dDNvbDN2OWdBdzcvL2p1T1hFWDR1bkxIYmdEOGNuVmpjeXZIckxKalIwZEh3M0dGV3VlQWdLcVp2RlhkNzNwL0t5Z282SlYzMzMyM2hSSk1rSnJDeUNhcG5BSWlpZ0xoZVFFY3o0UGpQUEI0WkFaZUZ4d09CK3cyRzBxS1M3d012UGxHS2JtL2FrbnFkcHNWMGRIUjF3OXNEb2VqRkZ2SFB3UUx5aVhocHFXbGhXbTEydkVBcXFVT3FtZXYzdWpjcFN0ZUh2WWlubjNtS2FTZVBJSFhSM3BwM0taT200NXZkKzNFNEVFRHNYSDlPc3o0ejV3cU9WSVRhdFZDMjNidDhQU0FKL0hDd0dkaE5CcXV1SCtuVHAyaDArdngxSlA5TUgzYUZOU3RWeDkydXgwOHoyUG0yOVB4MHN1dm9GYnQycGo2MXR0WXZIRCtkZnM5NUNlOVg4cFArc3BLc0poYk5HWjJteFZzSlJwR1hGd2NLQldSYjh5cjhOeVM2OVQ3UjlBS0NBaEVjcDBieDFqN0Q4ZU1pNCtQSC9UQ0M0TnF5T0JHeTRNYlF5a2xvaWdRZ2VmQmNiemtiL1BBN1hMQjVYVEM3bkRBYXJPaXVMZ0lGck1GSnFNUjJWblpTbCtGeXNiUlpNZ0ZDQ290UDd3cWF2RFUxRlNrcGFVaE16TlRxUVgxTlVWOUtneUlyTFZKdmpWR29pR2F4VERNaEJzeDZMZUtTcm02cFRLcTQ4cjlMWmt3V3l4K29za3lZalRrSWpJeUFvbTF5M09mWldSbXdteSsrV05tTk9RaUlpSUNTVmZnWXpPWlREQVlET0I1SGxicjdjOVc0M0s1VnZYdTNYczlBSWUwdVFCNENDRWNBSjRRSWhKQ1JJbGFYS1l2b2xxdGwxbzhJQ0FBZ1lHQkNBNE9SbzBhTlJBUkVZRzR1RGpVcmwwYnljbko1VFhGNEdDb1ZTckV4c1pXcXExZGxZOHRLeXNMMmRuWk1KbE1NSnZORlFZTFBCNVB1ZFFPT1ZqZ2NybWV1RkdnZHJYTzFqdEpydmE2RWhOckl6L2ZCS01oVjJFNXVkczFOWnZOQ29Ibkt3UTFBRWhLVElUSmRQUEdURDRuVVJDdUNHcXlTWHFsQlhzYnltdFpXVmxuYTlXcXRWZjJ0eEZDbElBQ0FIaFpQd2hrY0ZPcFZOQm9OTkJxdGREcjlRcXdoWWFHSWp3OEhGRlJVWWlMaTBPZE9uVlFTMG9udWxxcEVyQlpyVmFsc3FBc3FQbldnUHFtZHZpYW9FYWpzWlphclI1N3E1eXRkOUtpdk5wRVZFSUlXclZxaFlzWm1iQll6Q2l5V09CeTNaMGNiWHA5QUJpV1JXUkVKQklUcjd3ZzJyUnVqY3pNUzhndktLaldNZFByQThDcVZQK29xZDNKVXJObXpjRmZmdm5sMmFlZWVpb2JsNk9rTXJCUk9aTGdKYWZrS2NNd2hHVlp5cklzWEM1WEtTSktHZXdDQWdJUUhKdGcwTndBQUNBQVNVUkJWQnlNc0xDd2ExSmlxclNLWk5QVE53bTNnc29DWDFDVHF3c0lwWlNKaUlnWUE2RFZqUnpNNk9ob0dBekdmeDJ3eGNkZmZUb0RJUVIxa3BOUUp6bkpiNE5lcGJhYitDOEZtNXNwaEpDV2ZmdjJIUUJnRlFCQjZvL2dqWlpLcEpUd0VsTlNDZHpBY1p3Q2JpcVZxa0p3Q3d3TVJFaElDSnI0a0M5VVZmNHhlSkNWbFlXY25CekZuMVlacUYzQkJPMWZIYWtkaXJQVlpJRGpEbmVlTyt3MnJ6TVU5SVp4c2ZuRkx6ZFRkRHJka096czdNNlF5cTBvcFJwSXlidStnUVJCRUlnRWJBcHV5QjJ1SEJMTlVVbUpOMHFhbjUrUG5Kd2NoZUxvaG1sc2RydTl3bncxWDhKSUdkaDRuaTluZ21ablo4ZXExZXJSMVRXWTk5NTdMNHhHSTR3bUU2d2x4WGNrTmJqc0RFMUlxSG1uK1ZiODRwZFNFaDhmUDJqanhvMnBRNFlNRVNSL20rQnJscFkxU2FYcUJPcExSR20zMnhXdFRRNHNoSVNFSUR3OC9LcXFQSzRJYkdYejFjcEVQbjN6MVNveVFVbE1UTXdvQVBkVjUyREd4TVJjZFM5T3YvakZMOVZpa3JZWU1HQkEveUZEaG53QWdQY3hTUVhKSkJYaFpkMVZURktHWVloS3BhSXlDNGh2WUtHb3FLaVVyNjFSbzBaVkI3Wk1uNkpUWDhuUHo4ZVpNMmRLTVhlVTlhK1ZEUno0Y3F5bHBhWDF6TXJLR3UyLzNYN3h5MTBsTCsvWnMrZG90MjdkRHN2Z0JpbFNLaGZMUzAxZzVLcDVoVlB1Y3Zlcnk2WnFXVE8xcWkzOFZJbGhQNVI3aytNRjVGL01BbkVhUU54bUVFOHhDR2NESTloQkJCY2d1QURCNDkxRWpsQlJBQ2dsOGpiNC85cXc5YVAzalBMZlk3LzQ1ZTZUaEdiaS85VkxydkgzK1l1RlBBQ0JBQUpBWmJPVWdSZk5BQ3FDaWp5RjZDWVFYQlNDQXhDc0lJSU9qR0FCNGZKQlBMa2c3a3dRNXpuQWxvcjQ1RnBRcS82NTkwV0Z3WU9zYkFzTXBtS1lMVFlVRlR0aHM3bmdjTHJoZEhKd3V6bDRQRHc4SEErT0Y4RHpJZ1NCUWhRcFJFb0pCWmozbHcwZUNlQUIveTMyaTErdVRTaTljOCtkWlptdWgvZE1md1J5SU1FYlJKQURDU3lWaUNsRmtVSVFLSGhlQk1jTDhIQThQQjRlYmpjSHA1T0R3K21HemVaQ1ViRVRab3NOQmxNeExtVlZyVktubkkrdHVNU0ozTHdpRkJSWVVWamtnTlhxaE4zaEJUV1htNFBidzhQakVjQnhBbmhlSkx4QUlRaVVpSlFTVUJETHhYY2JzQ3p6aG45cStzVXZWeWNpQlF5V1NKZ0t3eUNJTEd4M2RqcmlvQVVMRmh5Wk9ISGlSYTlKNmcwbWVFMVNpSklGU2tSS3dBdUVjZ0pEUER4TDNad0tUbzhhTnBjYUpVNHRDbTA2RkZqMU1CWUZJdHNjQkVOeENQSks0bEFuZ1VOY2VBRXFxNG9zQjJ3NXVZVXc1WmZBVW1oSGlkVUptOTBOaDlNRGw4c2pnUm9QanVQQisycHJGS0FVaEFKTVNJaitOUUFKL21ucUY3OWNIYWdkTzFjZllNTVFGSEpuOThtVnBHWkM3ZVRISjA2Y3VCb0FEMitFVkg0VlFRZ0Z2RzM4Q0NFZ1VyTmxJdEVkc1NvMVZDbzFWR29OMUJvdE5Gb2R0TG9BaUNRUXhUWTE4b29Ta0djT3c3MzF6MWNJYnFWTVVXTitDUXpHWWhSWWJDZ3Fkc0JxYzhIaDhNRHA0dUJ5eTZBbXlDWW80YjBtS0tFaUpaU0NPUEpXZENlRXZQSnZtbkRqcG0zQi9YM2Z1V0cveC9NQ1JrMytBdEgxeGlHMDlwc1lQbW9USEE2UGYyWGY1V0lvakFUWU1NVEV4djlya3M2MVd1MmdQYi91YTQ3TFZPSWFTdUZESmU3Tm5oQkZrUWlDQUY3Z0NjOTVBd2VjNS8vWk8rL3dLS28yaXY5bXRtVlRJRTE2Q1VoSGFWSkUwQUFmVWtSQkJDc2xJQWdxTFlMU2xkNkQ5TjVFcFNnSWlpQktFWkFlbENJSVVnVUVFdEo3c21WbXZqOW1kNUpOSXlCTjJmTTgrMEIyWm5idTNwMTU1MjMzSENzV3F3V0xROFpQMVQ1SUpENHVqdVNVRkhRNkErZ0tjelBlTDlkenV4aTJHeEVKUk1jbWs1Q2dHclhVTkF2cEdkYk12SnJEc05udHNtQzNPMEpRR1VFQkFSQ05Sc1A3N2tzMGZ3d2JzNUZOUC96T3VzOTZzV2wxSDNidStaTitnOWU2SitZUlIxUjhvZitjVGk1QXVmTGxPMlF4YkFaUURHU3FXNG5PMWpCSmxnWEpMbUczMndXYjNaWlpGYlZtVmtWVFVsSklURXdrTGphV3lKdVJlUHY0M3Rxdy9YMDlUZzFCNDFKSlRFb2pKZFZDZXBxVmpBd2JGb3VqV0pEcHJTRkpNcktzT0FzY1lrYlV2RGNFZ1JmZGwyamVTRTIxTUcvcGJzTEdkeUM0Y1NXQ0cxZGk4YXpPckZ4emtKaFlOL1hRb3dwRkFVblMzNUduZHViMEh3d012ZmNwN1ROblRoTTJiWXJHYWVqRXhvM2ZFTkxsTFVLNmRuSVI1SW1Pam1iZ0J3TjR1M3ZYbGkxYXRtcE1GaXB4UlZIVUlvS2lpQTdtSHhSSHE0Y2syYlYyRHlmRlVZYWo1U00xTlpYazVDU05Vand4TVFtN3JNKzEwQ0lDV0cxMk5RU05UU0VoS1kza0ZBdHBhUmJTblViTldUQ3dTOWp0a21DWFpDUVp4N0lweEk4L2FxMHo2SFh2UGVnTDVPbm1rd2tkOWhYQmJjSUlxakdjSnhxTzRmdXRKN1R0ZFp0TVpQallqVlN0UDRyaWxUL2k3UGxJTEJZYll5WnZwbnpORVhnVTdVTzlwaFBac2R0VktOZG1rK2dkK2lYZUpmdFR2UEpIZkRwdmUrWVBHSlBNSzUwWDRsZjJBN3hMOXVlRlYrZHc0VktVdHIxajEwWFViVElSZ0dPLy8wMTZ1bzNnUnBXMDdjODJWRVh2RDRaZmROL2hqeWdFQVZMU2hEczZ0bktWcW93YU0vYWVqbS8rdkxrc1c3cUVTeGN2YWlTdUFGZXZYbUhEK3ZVc1dMU1VaY3RYY3VMRU1ZMDhkZjY4T1RScjlqOVdmcjZLZDk5Ny8xVVBEN09ITXh6RlVTRVZCRUVIT0kyYnl0c21TVWlPVlV3Mm13MnJMWXV5ZkhvNnFTbXBKQ2FxSVdsMFZCUUppVkt1T1RZOXdJMGJDVVRISkJPZmtFcFNrbG9GVFhPMGRsaXNkcXlhcHliaHFJSTZ2RFUxRFAxNDhFdTlLS0NDKzczR2dtVy9zSFY5UDVvOVY0WE5QLzdPSzEwV2Nuam5VR3JYVUJjN3o1aS9rNVVMdW1FeTZxbFVvU2c5KzMzQmp6di9ZT0duYjFHcFFsR1dmcjZQRjE2ZHcvRzlJNmxXUmVYck9uRDRJdVhLQm5CMHp3aU9ucmhLajM2ZlU4akhUTSt1alFrZDlqVVdxNDN3bjRjQzBHL3dWNFM4OXhuN2YxSVptanEycTBOOGdscmV1aDZSZ05Hb0o4QS84OGxzTU9nSThQZmkybzBFOXgzdVJnN0V4c1l5Y2NJNFlxS2pFRVNSOTk3clE0T25HM0x0MmpVR2h2YkhaclBpNit2SGlwVmZaS1k3aG56RWpSdlhBVlYweWRQTGl6VnIxd0VxcmYrY1dUTklURXJFMzgrZndVT0hhVm9XQU91Ky9vb05HOVpyK3dQMGZLY1hScU9Sc0dsVFhNYjIrNGtUUEZXM0xwNmVudGp0ZHZ4OC9UaHgvRGoxNnRYbnhJbmpmUENCU3VqajYrdGJyMFNKNGkwdVhicTBHYkE1WGxvaFFWRVUyUkdTT2xZa1NPaDBkdXgyR3phYkhxdk4wYWlibms2YVNRMUpFeElTaUltTndXVEl2YWRObjU1dTFYcldFcE95VkVFMW8rYklxemx5YTQ0UTFPbXRDU2YyZlZ4SXB4TjdQU3dYd2xzZDY5SHNPWldBOHNWV05XamVwQ29MbC8vQ29wbXE5bVdiRmsveVdudVZhQ1F1UHBYUFZoOWcxWklldk5SYVZmMmVOcTRqaDM3OWl5bXpmbUxsQWxVNXZWalJRaXliMHhXVHlVQ2xDa1g1N2ZnVjVpemVSYyt1amJsOE5aYlNKZjBvV2R3UFQwOGp5K2QyNWRxTmVHMDhiM1NvcC8wL0xkMktoNGMrbHlTckhvdlY3cjZMM2NpQnI5YXVwa2FOR29SMGU1dExseTR4Zjk0Y0dqemRrRktsU3ZIMStnMmNQMytPaWVQSHVSd3phY28wQUJJVEUrajlUZzgrR1BnaG9NcjJUUncvbHZFVEoxTzhlSEYrK25FckMrYlBZL1NZek9OcjFxcVZnM2s0TDRIbHhNUkVQRHc4aUk2T1p0S0VjVWl5aEk4alQ1aVltSWpKdzRQdk4zM0hqaDNiOFBUMGZMVkh6M2YyTEZ1NnhPbzBiSTVWQ1pJajM2YklpaUlJYWtpcTJDVzdZTFByRkwwekpEV29JV2w2ZWpxcHFTbHFTQm9majBFdmtwNHVZemE3amxHOEVhbUdvUEdKbVQxckdlbVpCUU9iemRtemx0VmJBOW5oclZXdFhMd25VTzFodVJEcTFIU2xvYWxlcFRpbnp0elEvcTc0ZU9aQzh6Tm5JNUJsaFliMXlyc2MwL2pwQ3Z4eEpsTlhzMjd0SUV3bWcvWjMvYWZLOGVlNVNHUlpac2lBbG56LzQrOEVQajZRTnEvTjRic2ZUbEM5U3U3TXJHWVBBMWFybE9OOWk4V09sNmZSZlJlN2tRUDE2amRnNTQ3dHJQeHNCWmFNRE1LbXp5alFjYklzTTJiMEtOcTgySmI2OWRWZzZxKy9Mbkh0MnQ4TUh6cVk3aUZkV0wzNlM2SnV1dW9MVktwVW1WYzZkQ3p3K0U2Zi9vT1JJNGJ5VHU5M2FkclV0U2QvMG9SeFhMNzhGMkhUWjJJeW1hcDA2OTdqZVZ3S0NZNEtxWm9TRTFDOU5tUlpRckpMU0hhN1F5dEJyWkphTFJZeUxCbWtwNlZyaFlURXhFUnVSQ2JtOU5qVW5yVVVraHplV3JyVFc3TTRRbEJuejVva0M1SmQ5ZGFjemJobndzZjQ2WFJpejRmcFFwQ3phVnRtV096b2RKbkYzNndHSkx1Vnovb1pXWVYramRuY1hiMWVSSzhYRVVXUnRpL1U1UHFaS1h5LzlYZCszUGtIdzhkK3kveGx1em04WXhpZTJZeFZxUkorWkdUWVNFaE13N2V3cDVhL2k0MUxwV1J4WC9kZDdFWk93MWF2UG5QbkxTVDhTRGlmcjF5QjBXaGt6TGdKdHp4dTJkTEZlSGg0MExsTDF5eTVZaHZGaWhWekNWdi9DUW9YTGt4R1JnWmgwMmRTcUZBaFRwdzRUbUZmWDIzYk00MGEwNkpsSzgxYkxGNjgrS3U5ZXIyN2MvSGloZFlzNGFpZExMeHRMbDZiWFJKMGRydmlVaVcxV0VqUFNDYzFOWTNrNUdUME9vR29hSmxpUlF2aDVXbks5TmhpWXBOSlNFeFhlOWJTclZyQndLWlZRZVZNYjAxV3ZUVm5idTN4Y28rOURUeitNRjBJNFVjdnUveDk2TWdsYXRmSW5VMjFZdmtpNlBVaUI0OWNjbm4vUVBoRnFsVEt6RHVjdmVENlZEdCs4bStxVlZZSklZZU0yc0Q1aTFGMGVlTnBWaTNwd2Y2ZlB1TFU2UnNjUDVtVFE2cDJqZEtZelFiMkhqaXZ2YmZ2MEFWRVVlRHBiRjZqRzI0QVRKbzRudkFqNFRSdi9qekRoby9rMEtHRExnL2QzTEJ2MzE3MjdON044QkVmdXdnV1ZhaFFnYVNrSkg3WnMxdkx0MzIvNlR1WFk4K2ZQOGZHamQ4VWFHeFAxcWlCMVdyRlpESWhTUklIRCt5blppMVZ5N1JXcmRyYU9JLys5aHRCUWVVd21VemwrL1R0MTV4c1JZVHNYcHZzOU5yVVFrSm1sZFNtQ2k5Yk1qSklUMWR6YlNrcEtjVEVKaE41MDlWcjA4Y25xQ3NNVWgzZW1zVmlVOWRzT1VOUW04TmJrMXk5dGQvMkRQZlI2Y1MzSDdxY3hJWmZlYWIrNHp6ZnRDb3JWaDNnNU9ucnJGclNJOWQ5Zlh3ODZOZXJHWU5HcnNmYnkwU2xDa1ZaL3VWK0RvWmZZdXJXRDdYOS9qaHpnNFhMOS9EdTI4RWMvdlV2NWl6YXhkSTVYUnhHTDVJK0g2NWhYdGliQlBoN3NXTFZBYnk5VFpwaFhQdk5FZUlUMG5pdlJ6QmVYaVo2ZEdsTTM4RnI4Zkh4d0dqUTB6djBTN3AzZWdaL1B5LzNYZXhHRG5UdTNKV3dzQ21zWGIwS1daWVpPT2dqUkZGMEtSNGtKaWJ5V3NkWHFQUFVVd3dkTm9LNXMyZVNrWkZCbi9jeVU5OXo1eS9DeDhlSFNWT21NZlBUNlN4YXVBQlBUMDhHWmhOU1BuYjBLQnMycktkOSt3NjNIRnZac2tHMGI5K0JkM3YxUkVIaDJXZURxVmV2UGdEdjkrbkg1RWtUV1BmMVY1ak5ab1lNR3c2QW43OS9oL2F2ZE5pK2NjTTNOc0RxTUc1MlZHVXJsVzFYYmRwMTVOcFVyeTFybGRSaXRXcTliVG9SNGhNa29xS1RLVjdVVjR1U2hGbVRYK1ZHUkR4Uk1jbkV4NmVTbUt3dWVrOU5zMnBMcVRJc2ttQzFTdGp0aWlESmlxZ29pTmJvK2YxME9qSHNZYm9Jbm00K21TZXFsdURDWDlFY09uS0pHdFZMTVgxOFI1NTlSbTJwcU50a0lpKzNxY25Jajlwb3gxaXRka2FPLzQ0dnZqcEVRbUk2dFo0c3pmaVJiZmxmc01yOTlPSEk5Wnc1RjRHZnJ5Yy8vM0lXblU1a2FHZ3IrcnpUQkZEYlBRWU0vWXJ0dTg2UW5KSkJuWnBsbURhMkE0MmVWbVhRT25aZHhPV3JzZnk2ZTdnam4yWWpkTmpYclBubUNLSWcwTEZkSFdaUGVRTVBENFA3TG42RXNlZDQ1ZitrNmxwdWlJK1BuMWpqaWFyZkF5bEFLcEFtQ0lJRlZkM0s3bEMxa25VNm5XSXdHakVaVFlxSGh3a1BzeGxQc3lkZTNsNzQrQlRDdDdBdm9nZ05hMG1VRDNxTWFsVktVRDVJcFRVU3hvOTh5WFVabGNON1MwMnprcDVoSlNQREpsaXNFamFiSWtpU0xNZ3lZdWZYNitrL1c5RGpNUERrdzJiWVdqV3Z6dWloTHoyeU40aWlnQ0M0di92RE1tY0YvZXhIeWJBcGl2SkhvNFlOM3YvNzc2c3BEdU9XSmdoQ09tQkJsZXlUUkZHVVJWRlVEQWFEb2hKUGVpZ2VIaDZZUGMxNGVucmg3ZTFONFVLRkVRU0Zlay9LbENubFQ2VUt4YWo1UkdrOFBBem9VeHk1dFl3TUcxWkwxdFVGV1JhNVordGJXenFuVzVlSHphaGxoK0RiKzEvM2cwZWVtMGJSSXJlL3JFWlM5RnlPcWt4OGtoNUpGc2xJZnpSVnFqek1ablNpZ244aE8wRkZ6aUlLZWJmUXlBcGNpYWxNYklJSlNkYmRzemxUeHlRVFdOaEMyY2ZPM3RMSVhiOTI3Vkg0cWFvdldMajQyUmZidE5ycHlMWFpGRVd4Z1dBWEJMV1FJTXV5QUNnMm15M1RJT0pZNlNTckt4VThUQ2ExdVRsRklqRXBrOW9vcUV3Zyt0UTBpNE81STF0dVRaS1JKRm1RSk1XeHlrQjlvU0RxOWJvdUQvMVRJV0hSSTNFenA5djkrUDFDS2ZRR0Qzd0t1M1ZGVTFOVGlFOU9JaWFoS2pVZnY0cEpuNWlyVWZ2MTNCUG85T2I3TW1lcHFTbkVKaWNSRmY4RTlTcWR5dGU0bFN6MWFCRGpGQzlSb2czd2k4T3dXUUc5SUtESDBkZUdxbXdscU12UUJRVUVRUlFFUlJUVmJnUlJwOE5pdFNLZ2tKb21rWnljUVh4Q0dqRXh5WlFxNFllWW5tNVR2VFdyU3lNdWRydUVKTWxxSmRSQm5xU0FrSFp6Ym11ZzhjTTRXWWQyREgza3d0REl1Q0xvRFI3L0tWYUlmd0l2TDIrS0ZpdUJUdTlCUkZ6dWlsK1hvNnVoMDV2djI1eGxqc25NbFpqS3VBR2lLRGJjcy9kQUxUSkpLQTJLb3VoUUs2U3FOVk1VRkVWV0s2U3lNNHJNdXBaVWxTUklUN2VSa3BwQllsSWFzZkdwUkVZbElhWnJQR3RxejVyTkxtR1hIRWJOR1lKbU1uZ0lSb1B1VGZmUDh2QWdOdEgwbjJTRitLZnc5aWxFVEtJcDEyMXhpZm9ITW1mZVBvV0lTVEM1Znh3SFNwY3VuYjMxdzhuOG9YT3lmamhvalpBbHRmM0Q3bGdrYjdmWnNEcGFRTkl6cktTbVdVbE95U0FoSVkyWTJHVDBGa3NtZWFUV3M2Ym0xZ1MxYjAxeFdFNkVoQ3N6bnhRRTRkWGJDZ2tmNFdUMnZaNGZTZFloeVRxM3A1YUhsNVFZSDRzc2d5aTZ6dmVEbWpOMVRIRjM5SnNuSlNaeSthK0xwT2Fqb2V2bDVVMVF1Y2NwVkxqd1hSbnZ2VDZud1dCb3UvYXI5Vis5OFhySEMyUlNoK3NGUWJBN3dsRlpsZXhUQkVtU0ZVbVNCTWt1S1U2dnpXNnpBUW9XaTB4NnVwWFVWQXVKeWVuRXhhV2lWM05yV1pkTnlRNXZUVmFMQmdvNCtkYTh2RXl2RjJUQS96R0s0M3Y3RlBjRW5VNmlpRzlDdmxUSHVVRW5Tbzlzb2FBZ1NFOVBkekZxb0JxVUJ6bG42ZWxwZC9RZysrdlNCZExTVXZQZEp6VTFoY3QvWGFSR3JUcDNaYXozNDV5MTY5UitEcmlhSmRkbWRYaHRrcUtvdVRaRmtSVlZ4VXB5cFRheTJ4RlFzRmdsTWl3MjFXdEx6aUErTVExOUZ2MENOYTltenl3YXlBNVhFQVZoODFkOVBFUlJlTDBnUnUwL1JuRjh6NUdhbWtKRWdsKytWTWQzaXUzYmZtTEY4bVZFUmQya1JJa1NmUDdsR3M2ZlAwZVA3aUhhUGtPSGorU0ZGOXE0ZjRpSEdMY3lNRm12cFgvVE9UMDl2ZHEwZTduOSt1KyszV2pKekxWaEV3UkVVQnk1TmtGUUZCbEpraFZKbGdTN3VrZ2V1OTJHQUZpdE1oa1dHK25wVmxKU00waEtTa2VmblVEU25pVzNsblg1VlBPbTFWNEZTdDlxb0ZrcGp0MG9lSWppNWVYTnpVaVptL0YrRlBPUHZ5dWZlK1BHRGFaTW5zaVljUk9vVjY4K1NVbEpBRlNvVUpIdE8zY0Q4RTZQYnZmc2V5MWZ0cFIyTDdjbklDQWd4N2htelpqT3laTy9ZelFhYWY1OFM5NTd2NC9HS25IdDJqWG16SnJCeVZNbk1abE10R2pSa2w2OTM4dkJPbkUzY2F0elB0ZTRJUWFEQVVFUUNRb0tvbnVQbmpScTFOaDk4ZjV6bEJyNThhZ0czMzI3Y1JmYUVpdEZEMEttUG9KS0lhNWt6YldwaStRbFFNRnFrN0ZZN0dSWWJLU2xxN2syMFJtQ1NwS2MyZUloWjdaNDRHengwT2tLdE9UL3YwcHhmRi9DMG55b2p1OEVaLzg4UTJCZ0lJMGFOY1pvTkJJWUdPZ0l4d1JNSmhNbWs4bGxMZUhkeG1jcmxoRVhGNXZqL2RHalJsS3lWQ2syZnJlWnhVdVdjK2pnQVRadCtsYjErR1dab1lNL3BGTGxLbno3M1dibXpKblBudDI3MkxqaG0zczJ6b0tlYys3OGhYeS9aU3ZkZS9Ra2JPcGtObnl6L29GY0o0SWdVS2RPSFZxMGFFSHo1czBwVWVMMm5BaEprdGkvZngvRGhuekV0Yi8vdmk4cGdiRmpSdkhXRzYvUnZWc1h6cHcrclczNysrcFZ4bzhiMDR3czFWRWM2MGVkREx1U0pBbVNKQW1LSWd1U2F0d0VwN0N5SktrUnA5VnFkL0hhTk1QbTB0NGhPU20vMVJhUCtLc3puaEFFV3Q3cUMvd1RpbU0zVk04dEw2cmoyOEh4NDhkNHVXMGJwazJkVEdSa0pDKzNiY1BMYmR1dzhyTVZCZjZNUXdjUDBQbXROMmplTEpnZTNVUDQ0OVFwbCsxN2R1OGlwR3NuWG1qMVBOMjdkZUhRd1FQYXRuNTkzK2ZsdG1wbys4R0EvcnpjdGcxOTMzOVhNeUxCd1UzcEd0SU5rOGxFa2FKRnFWdXZIdWZPbmdVZ0xpNE9QMzkvT25YdWpORm9wRlRwMGpScS9DeC8vbm5tbnMzNzdaelRiRGJUcUZGamhnMGZ5WkxGQzEwWVplOFh5cFVyaDA2blk5dTJiZXpkdTVlYU5XdGlNQmh5TmRpNS9YOUEvNzc4c21jM1o4NmNScEtsMnpwMzQ4YU4wZXYxZVQ0Z2N2dDczZGRmNGVucHllcTFYek40OEZER2p4dUQ0cmpJWjg2WXpzdnRYMm0yWnUyNjBtVFRId1YwZ2lBSW9pZzYxNDRpYXpVQVNYczVxZFdzRmpzWkdUYlMwcXlJem9LQlhTc1lPTFVNdEtLQjRPM2wwYjVnVDVJN3B6aDJRMFZLcXZDUGMyeTFhdFhtMjAxYkdCQTZrSklsUy9IdHBpMTh1MmtMSWQyNkYrajRpeGN1OFBISTRielhweTlidG03ajFkZGVaK0FIL1RYdXJpdFhMak4rM0JpR0RCbk81aDkrNHFXWDJqRml4RERTMHRTay9KeTU4L2wyMHhZQVpzeWF6YmVidGpCMy9rSUFSRkdrVStjdStQcXFudWxmZjEzaXdQNzlOR2p3TkFDQmdZSE1tVHNmRHcremRuTWNQM2FNR2pWcTNyTTV2NU56MXF2ZkFLdk5waG5rKzRuQXdFQnUzTGpoY0NaVWlpMC9QMWRQLzhpUmNFWU1HNExOWmlNdUxvNTNlblFuTGs0VkcvNTB4aXlHRFI5NVJ3NUlRRUJBbmw3K2h3TkRPWDdzcUdiTUZzeWY1N2llem11L2I5VnExVEVhalZ5N3BucUs1OCtmbzBHRHA2bFZ1MWFEWEx3MkVSQVZCVUVRQkxYdFE4bGFSSEMwZ05pemVtMTIwak9zaUhaSjFzUlpuR0dvckdTeWVLQW9naWdLTC8rVEgyTFF3RkJlNjlpZWtDNXYwYlh6bTJ6Wi9MMlcxM2l0NHl1MGIvY2kzVVB1N1dLRzdpRmR1SGp4OW5RRnR2MzBJNjkxZklVWFdyZGc5cXk4Q2Y1MjdOak82RTlHL21lTTYrYk5td2h1MHBSR2pScGpNcGxvMWZvRnFsU3R5amFIa0VkQVFDRExWM3hPdGVyVkVVV1JsOXEydzJhMTh2ZmZWd3Q4amo5T25hSkY4NmFFZE9sRWxhcFZlUzY0U2E3N0xWd3dEN09uSnkrMHVYODZRUVU1cHlBSStQdjVrNUo2LzBWNGpFWWpraVFSRUJCQTQ4YU5rV1VaazhtMVA2NXUzWHI0QndRd1p2UW5EQm80Z1BhdmRNRGYzMTg3L2w2Z1Q5LytUSnd3bnJselpyUDFoeTEwNmFvV3FCNnZVSUZmOXV4QmxtVXVYYnJFelp1UnBDU3I4L2I0NHhYWXMzc1hYbDdlemJNWk5YMm1jY3ZzYVZOa1J6anExRWVRVk1kTVZaS1hzRmh0cEdmWUVMTVlOYTFnSUN1QW8yaVFHakczR1hlQklmZWpJY05ZK2NWcTVzeGJ3T2NyVjNEcDBpV04zbmhxMktjUDVRM2VvbVVydmw2L2dXN2QzdVpSUW1Sa0pNV0x1K1p0eXBRSklqSlNaUlgyOXZibXQ5OStwWGV2SG5SNjgzVzZkZTJjYXlpU0g2by84UVRiZHV6aXEzVWJpSWlJY0ZFNGN1THpsWjl4K1BBaEprNmNuR2Y0YzdkUjBITXFpa0pjZkJ6ZUR5anRVcTVjT2FwV3JjcisvZnUxb2xCMnc5dTc5M3NjL2UxWFRFYlRQM293bU0xbU9uYnNTTWVPSFRFWURMUnIxNDZPSFR2eTJHT1B1ZXozZUlVSzZqM3oxUnA2OVg2WFFvWFVYUHVycjcyQlRxK2plN2N1ZlBINVozaDdlMlAyVkwzalFSOE81dWVmZC9KMjk2NVZ1b2FFVkhFWXM2eDVOcDJpS0NwWG0zTTFnaXdqT1VOVFdkWTZPbFN2VGNKaXNhR1hzcXd5Y0RUa09zTlFBTUZrMHJlOW16OUk0Y0srUFBGa0RTNWVPRS81OG5tVEt5WW1KakI1NGdTaW9xS3cyMjEwNnR4VlkrTThjK1kwTTJkTUp6MHRqU0pGaXpGMDJBZ3RNYjU3MTgrc1h2MGxsb3dNcWoveEpCOE0vRkRMUCt6NmVTZGpSMzlNZW5vR2ZmdjExN3lFYjlhdlU1UFhpa0xUWnYralcvY2V0L3dlUjQ2RTgrbjBhWWlDU01sU0pmRTBlMnJiOGh0RDgyYkI5Qi93QVV1WExFSlI0UHN0V3g4NncxYTBhRkVpSXlKYzNydCsvUnExYTZ1OVNudC8yY09xTDc5Z3hzelpsQ3F0RnNxZmE5d3cxNXNydTdHelpHU3dkZXNQdEc3OUFpWVBENG9YTDA3ejVzK3piOTllbC8zV3IvdWE3ZHQrWXRhY2VYZXQ0ZlJXdUoxekhqa1NqdEZnb0ZMbCs3OUV5bXExWXJmYk9YcFVEZnQwT2gwV2k4VTFwWkdTd2tjZkRhUnpseERPbmYyVEtaTW5NblRZaURzcUZxV25wN04rdlZvb2FkZXVIVC84OEFOWkY2ZG5qWEIyNy9xWjhSTW1NVDFzR2hNbVRhWlNwY3FZeldhR0Roc0JRRkpTRW0rODFvRVNKVW9DVUtwMGFUNmRNY3R4Myt4cStQbktsWDlrTld5Q0lEakNVVVhJR25xcktUTUpSUkdRSkFXN1hmWGFiRFk3Rm90ZERVVlZiMDBXSEVVRFRhaEZVUlJSRUlTN0dnTkVSMFZ4NnVUdlZLbFNOZC85enAwN3gvK2FQOCt5RlN1Wk0zY0JzMmJPd09wWUd6YnE0eEdFaGc3azh5L1g4TXd6alZpeWFJR1dyMW0vZmgxejVzeG41UmVyQWZoaHkyYnRNMzE4ZkZqNXhXcEdqeG5IL1BsekFaVlliL1BtVFN4Y3RKUWx5ejdqdDk5K1k5ZlBPL01kbThWaVljSzRNWXdhUFpZdlY2K2xUT215MnJaYmpjRnV0eE1WRmNXNmI3NWwvVGNiSDVqeGNuWnZBeWl5ak4xdTE0eFFteGRmWXMrZVhZU0hIOFp1dC9Qenp6djU0OVJKV3JSVTYwZXhzYkVJQW9nNkhZbUpDYXhlOWFYamMxeXJIc1ZMbE9EUXdZUFliRGFpbzFSSlFxUEp4QmVmcjJUdDJ0WFliRFlTRXVMWnUvY1hhdFNva1JrS2Y3K0piemR1WU9ic3VWcjRkTS9EN3dLZTAyS3hjUGpRUVNaUG1rRHZkOS9IeSt2K0U0UkdSMGRyQnNwb05PTHI2MHRDZ3F2SzJjV0xGd2dPYnNwYm5Ub3o4cFBSR0kwbUxjZDJyM0R5NUVrK25UR0w1NEtiTU9MalQvanQxeU11MjVPU2twZzJkVEl2dnRRMlJ6ajg5OTlYV2JaMGNiTXNJYWhXUkhCNGJLSWdDQzdMckZRYU5kbFJJM0ROdGVuVlNxaXNlV3V5eW1FcEFFSjY1THpXUU1tNzhhV25oMDNGN0dIR2FETFNwMjkvU3BjcGsrLytOV3ZXWXZteUpXemI5aU02blI2TEpZUGs1R1FTNHVQeDl2YWhhclhxQUx6VXRoMU5telVENFBEaFExejcreXJ2OW41SGU3SjVlL3RrNWgwYzdKNVZxMVhURXVIaDRZZDQvdm1XbU0ycWEvemlpeThSSG42WXBzMytsK2ZZcmw2OXdtT1BGZEdNYzVWcTFkajN5NTRDalFHZ2EwaTNlNWJuS0FpeU4raE9tVHlSS1pNbjhueUxsbno4eVdncVZxekVxREhqV0RCL0xwRVJFWlFwVzVhcFlaOXFNbTJ0WDJqRHFWTW42ZEc5S3pxZG5uWXZ0NmRpeFVyRXhidmVPQU1IZmtqWXRLbXNXTDZVTW1YS3NIVDVTb3hHSTFPbWhqRjN6aXkrV3JzR2c4RkFjSk9taERqQ2ZVbVNtRFpWRFFQZmZOMjF3K2p6TDFkVHJGanh1ejRmQlQxbnZ6N3ZJd2dxYyt5Z0R3ZmZ0VDQyUlFGdno0S1h3aTlmdm95dnJ5L05temNINFBqeDQxaXQxaHozdzYyQXVRQUFJQUJKUkVGVVQ4MmFLazIzWHE5blVEYW0zRHZGZDk5OWwzY3VQY3M1YXRXcVRhMWF0YlcvRnk5YXdPNWR1L2hmOCtkekZMSDY5M3VmbE9RVVFycS9YV0wwMlBGUE5ubXUwYS9aOG13MlFiWGt6bkJVVVlzSU1vS2dlbXlTbzFiZ3pMWHBKYWZ5bEhQNWxKcGJBeENNUmwzcnUzWHhEUHB3c0VZYlhCQ3NYYk1LdTgzT2xLblRFUVJCYXg5d2hqaE9HQXdHL1B6VUo2ek5haU80U1ZOTmJpeS94Ry9XRUNtcmR5NElnbGFLemkrL2tsZXphRUhHSUdaZjUzT1AwTEpWYTFxMnl2a1RWcXhZaVYvMkhjejMyRWFOR3VkNTQ1cE1Ka1orUE1ybHZYZDY1ZVMvcTkvZ2FiNWV2eUhIK3hVcVZtVG03TG01ZnJaT3AyUFAzZ1AzMWRBWDVKeTNtcTkvQWtFQXZjNU9hbXBLZ1NxVmlxSnc3Tml4ZjN6ZVZXdSt1bTl6M0t2M2UvVHFuYnVtK3V3NTg3T21LdW9CeDdPRm83cHM0YWlneUxJaVNYWkVRVVNTQk1maWdreXZUWlNkWWFpakdxcVN1V2xoYUdzZUVLS2pZL0QyOFVZUUJJNGZQMFpTVWhLS29sQzZUQm1TazVNNWYvNGNBRC85dUZVVGNxMVh2ejQvNzl6SjlldXFXT3pPblRzNGVmTDNmTTlUdDI1OXRtL2JSbnA2T2phYmpSKzJiS2Erb3pTZEY4cVdEU0k2T2xvcnVVZmN5SlQzdTVNeC9KTW52VGxMYnMrTjdFbHZ6eHc5Z1E5NnpuSWJFMEFSM3dSU2svTVd6ZmIwTEZqSVc5RDk3dVpuM2Mxem1qdzhtbVR6MXB3OWJhTGo1U0RsVUFSSmtoQUV1eUE3bzg0c1hwdGVDME1WQlNWTEdKb1dNYmZwM1FwRDgwSitnaFN2dmZZNlk4ZU00b2N0VzZoY3BRb1ZLbFlrTVNHQndNQkF4b3diejZkaDA3QllMQVErRnNpUW9XcGlza3FWcXZUclA0Q2hnei9FWnJkUkxxZ2NnNGNPeTNjTVQ5V3RTOHRXclhtM2wxb3dlUGE1SmpSdDJreExoaTVkc3BpVTFCUmtTV0xmM3IxMDZSckNTMjNiTVhUNENFWU1HNEtmdno5NnZVNHJIdHpKR1A3SmsxNFU1UUkvNlI4bHBLWWtJNHB5anA1QWRjNmtCekpucVNuSjZFUXAxejdGWXY1eDNJajFKeXBTd2N2SEw4Zll5cFd2Y010RjZaNmVYcFFyWCtHdWpmZEJuQk1vc1gzSHJzclBOMjk2Z2l3MFJrNmpwaG8yQkZtV0hlNGJTTEtnZFhZNEs2UkNrVUF6RnF0ZHNGcGw3SklpeUtwWWk4NFdzMkNTS0FvZjNPNm9IaVh1OW51QmkrZi9KTGhXd1pzK0wwZFZKamE1a0h0dGJqYmNqTHhCUUtFa2doN0xPWmVYb3lzVG0zVC81eXkvTVRtOXlhajRRa1RHQjJDVGpLUStvc1F0NmVucFMxdTNicjBLVlE4aEdWWHdKZDBoK0dJVEJDUlJGR1NEWGxDTVJoR1RVYStZUFF5WXpRWTh6U2E4dkV6b25XR29rb1hKUTFFVVVSU0Y1dmM2Q2VwR1RuaDdLcmZGMTFVbThEeFI4ZFc1R1hrRGJ4ODNOWGhxU2pJcEtjblliUm1VQ1RpWGV5b2g4Q3hSY1UvZXR6bHpqa215cDFNMjhHeStIbmhSL3lTSytpYzk0cUk4U2tQZ3F5emhxTTdCOXFGV1J4RWNDK05CbGhWRlZwdDJGVWxTMUFxcFhVS2ZyU2tYQllTNHl6T3FjUWRpTGJlYkJIVWo1dzJnMTlsdjY0SVdSWm02bGM1d09ib3ljWWxXRXVMaXlNaDROQi8xWnJNbm9pZ1RVTmhHMmNmT0lRcEtudGRwdlVvbnVSSlRtWmdFeXoyZE03UFpFNTBvRWVCcm9XemcyUUwvdG84eU9hc2dDTlczcnU5YnZIWEh1WDlweGsxQmgrRElzWUVnS0tyTmttWFViZzVIWmRUNTBxdlUzOW5XaG5wN05MblRRUlh4VFNBaUljRnQyTzRBS1NtSmxQUzdmY29pVWJCVHZzZ2ZsQy9pbHQrN0hjTVI5TmhaZ2g1N09PVDMzSERGVTdXQ3FnRi9PdzJiQWpvaGF3RkJ6YlVwaXFOTlRYS3NSbkQwdHlFNnZEVUJiVzBvZ2s0VW43dlRBUlh6ajBPUkVvaTZlWTIwQjdDTzd0K0l0TlFVb2lLdWdwUklVYjkveHNYMmFEL3BINzQ1Y3h1MU80T3ZyMmN0MUtLQm5zd0NnaXIwb3RHcEtZS3NJRGk4TmtHV2xTd2VtNU9leU9HeERlclhUQ2NJQlArVEgvS3BTcGU0R2UvRHpmZ0FraE9OcEtTNmY2aTg0TzBGQnAyVlVvRnhGUEZOY2srSUcyNEFCcjJ1WWMzcXhRd24vb2pVWndsSFJRUkVCVVVBUVZBVXh4SXJ4Ykc0d0VHN0pza3lncGRaSjlqc2lpQ3AxVkF4K2Zyc3BwNW00NC91cVhYRERUY2VKSTZldU5MbnFlQ0pwOGhTSFJVRTBnR3JJQWcyUVVEV2FkVlJIUjRtdmVMaFljQnNOcUszUzFrV3ZpdUtjRE1xc2VIOTZveDN3dzAzM01qVGF6UG9LZ04vWmcxRkZRVlJFRkE3T0JDUVpRVzdCSUpOUmhEc2FzZ29nT0RoNFNIYTdYWkJVUlJSVVJTZDNXN2ZKQWpDOCs1cGRjTU5OeDRrN0hiN2JvUEJNREdMeDVZaUNFSXFZQkVFd1NvSWdpUUlncXpYNnhXajBhZzQ2TzRWczltTTZGd1hxU2lLOE9xcnIrb0VRV2pvbmxJMzNIRGpRVU92MTljdFc3WnMxc0tCVmtCd09HS3VWRVpaWG9MUmFCUWxTUklWUmRFbEppWTI5UGIyM3VXZVVqZmN1UDlRRklYSXlFaHUzb3hDa2lSU1VwSWYrVGs1ZGVwVTc3NTkrNTUxZW15T1Y3b2dDRmJBN3ZUYWREcWRvdGZyTVJnTWlzbGtRcCtWeWNMRHc2T3UrL0p5dzQwSFk5U09IVHVHZ3FDdGhuRHI4WUt2LzJQbGdRdGthZnR3a0U5cWpUU0NJQ0FJQXFLb1E2L1hvOWNiTWhlV0FvSk9wM3ZxMy9qbFEwTkRhZFdxVllIMlRVbEpRUkFFZHUvZWZjZm5xMVdyRnBNblQ3N1R2QUdob2FFVUtWS0V3b1VMMDd0M2IwMEV4WTFIRjVHUmtTZ0lGQzFXd3QzY25nVStQajZWczRXaG9wTjRNcXZ0VWhtSlpMV2ZUWkhWSEp0em5hZ2dDSFhjVTNsdk1XellNRFp0MnNTNmRldll0R2tUTzNmdXBGKy9mdTZKZWNRUkZSWHQxdVBOQlFhRDRRbHk1dGl5R1RVRmxXNU5RVkZrRkZuV2R1RDgrZk5GZ0VydXFieDNTRTFOWmQ2OGVZU0ZoUkVjSEV4d2NEQ0xGeTltNWNxVnhNVEV1Q2ZvRVlZa1NYZmtxWjA1L1FjRFEvdmY4L0dkT1hPYXNHbFQyTzVRS25OaTQ4WnZDT255RmlGZE83a0k4a1JIUnpQd2d3R0VkTzFFM3o3dmNmWHFGVzNiaVJQSDZmbDJON3FGZEdiMEp5UHoxV1lWQktIQ3lJOUhlZWRqM0FBRUhBc05uTTI2enFxb1VLSkVpU2YvS3hmSmQ5OTlSLzM2OVRHYnpYaDVlZEc4ZVhQT25YTmxldmpsbDErb1ZxMGFIaDRlTkd2V2pMLysra3ZiSnNzeVk4ZU9wWFRwMG5oN2U5T29VU1AyNzkrZjY3bWlvNk41NVpWWDhQUHp3OXZibXhkZWVJRUxGeTVvMndNREEvbndRNVZOOTlpeFk2U25weE1jbkxtdzQ5bG5ud1hnNE1HRDdydjdFVVp5OHAydE9xbGNwU3FqeG95OXAyT2JQMjh1eTVZdTRkTEZpeTVHNk9yVksyeFl2NTRGaTVheWJQbEtUcHc0eHBFajRZNWo1dENzMmY5WStma3F1blYvbXltVEptcXBtRWtUeGpIeWsxRjh0dkpMU3BVdW8ybG01SVZubndzdTRUQmtMb1NUanJCVVc0R2dLbGlwWHB2bTBoa01oditFWWZ2OTk5OTU1WlZYNk55NU0yZk9uR0hIamgzY3ZIbFRNeTVPekpvMWkwbVRKbkg4K0hHOHZiMXAxcXlacHJ3emNlSkVsaXhad3BJbFN6aDU4aVFkT25TZ2VmUG1uTTFGSERjME5CU0x4VUo0ZURqSGpoMURsbVZDUWpMMUJBWU5HcVJ4MDErL2ZoMmowVWhBUUVCV1Y1dUFnQUN1WGJ2bXZydmR5SUhZMkZnR0RRd2xwTXRiZEF2cHpPRkQ2Z1BRcWNuYm9YMWJRdnU3cGpLR0RmbEk5YUs2dkVXN2wxN2d6VGRlMWJaZHZIaVIwUDU5NmQ2dEM0TStHTURObTVFdXg2NzcraXVYL1FGNnZ0T0xzT2t6S1AvNDQ2NzMyb2tUUEZXM0xwNmVLc21xbjY4Zko0NGYxN3l5NTU1VEgrQ0ZDeGZtenovUFlMVmFpWXlJd01Oc0ppaW9IQUQrL3Y2Y09KNC96WG54WXNYS1pERnFqanhiMW5CVXlReEoxVHdiZWxCNzJIUTZYZlgvd29XZ0tBcWZmdm9wL2Z1cjdubFFVQkFoSVNFc1dMREFaYjlQUHZtRWR1M2FBYkJpeFFwS2xTckY1czJiZWVtbGw1ZzhlVExMbHkvWENoSURCdzVrMTY1ZHpKdzVNOGZuWEw1OG1kS2xTMU95WkVrOFBUMVp2bnk1aTVFYU5peVRQVGN0TFEwUEQ0OGNZemFaVERuazA5eHdBK0NydGF1cFVhTUdJZDNlNXRLbFM4eWZONGNHVHpmVU5IblBuei9IeFBIalhJNlpOR1Vhb0VwWTluNm5oNmEvWWJWYW1UaCtMT01uVHFaNDhlTDg5T05XRnN5ZngrZ3htY2ZYckZVcmg1NUhYc0pEaVltSmVIaDRFQjBkemFRSjQ1QmtDUjlIbmpBeE1SR1Rod2ZmYi9xT0hUdTJZVFFhU1VsSklTa3BDWlBKaE5WcVplNmNXZHk0Y1NPSHdsWjJlSGw3bDh0aTFCd0dUaEVkRkFPT1hqYWN0UUpGVVJSQjcyeHlFd1RoUDJIWWF0YXNTVUJBQU5PblQrZk1tVE9jUFh1V1gzLzlsYUpGWFl2bmpSdG5DcFVFQkFSUXZueDUvdmpqRDU1ODhrbFNVMVBwMXEwYmI3K2RLWlJzdFZwZGpuRml5SkFodlBubW13UUdCdEswYVZOZWZQRkZ1bmJ0bXV2WXpHWnpEalVoVUNYZEhvU01teHNQUCtyVmI4Q2NXVE1BZ2ZyMUd4QTJmVWFCanBObG1UR2pSOUhteGJiVXI5OEFVS1VocjEzN20rRkRCNnY3S0RKZTJmUUtLbFdxVEtWS0JkZEtQWDM2RDQ2TkdFcm9CNE00KytlZlhNeVNocGswWVJ3QmdZR0VUWi9KcXgxZWRqR0lBejhZd0lzdnZrU0hqcTh5WXRqUWZNOWhNQmdxWk11dDVjeXhvYUNBVmtEUVoyNmc2bi9oUWpoNDhDRE5taldqU1pNbU5HM2FsTmRlZTQzdzhIQ1dMbDJhNzFOSXI5ZGpOQm8xcmMwMWE5WlF2YnFycmMvTjIycmJ0aTNYcjEvbisrKy81OGNmZjJUNDhPSE1ueitmdzRjUGF5NjZFNlZLbFNJakk0T0VoQVI4ZlgwQnNObHN4TWJHVXJKa1NmZGQ3RVpPdzFhdlBuUG5MU1Q4U0RpZnIxeUIwV2hrekxnSnR6eHUyZExGZUhoNDBMbEw1a1BXWnJOUnJGZ3hWcXo4NHE2TXJYRGh3bVJrWkJBMmZTYUZDaFhpeEluakZIWmMxNFVMRithWlJvMDFrWE5WaHRLYlFvVUtrWlNZeUlTSlUzajg4Y2M1ZS9aUDdWN0lDNElnVk02U1c4dWFaOHRlUUZDY0JRUVJFS0tpb2lvQnB2L0NoYkJnd1FMcTE2L1AxcTFiR1R4NE1DMWF0T0RHalJzNUpQV3k1c3VTazVPNWVQRWkxYXRYcDN6NThwaE1KaTVjdUVDRkNoVzAxNkpGaTlpeVpVdXVIdHY1OCtmcDBxVUxxMWF0WXYvKy9adzZkWXJqamx4RFZ0U3VYUnV6MmN6ZXZabXE1L3YyN1VNVVJaNSsrbW4zWGV4R0RreWFPSjd3SStFMGIvNDh3NGFQNU5DaGd5N1NrYmxoMzc2OTdObTltK0VqUG5hUnFxeFFvUUpKU1VuOHNtZTNsbS83ZnBPclR1ajU4K2ZZdVBHYkFvM3R5Um8xc0ZxdG1Fd21KRW5pNElIOTFLeWxhcG5XcWxWYkcrZlIzMzRqS0tnY1JxT1JZc1dMVTlqWEY1UERzZGkzZDY5MlRENHdMVjY2UERBWGc2YjFzQUZaUERaSGpzM2IyN3ZDZitWQzhQZjNaK2ZPblp3OGVaS1NKVXV5YnQwNmxpMWJocCtmbjh0KzQ4ZVBwM0hqeHZqNitoSWFHa3JGaWhWcDNibzFvaWd5Y09CQXhvNGRTN0ZpeFdqWXNDSHIxNjlueG93WmJOKytQY2Y1enA0OVM1OCtmWmczYng0QkFRR3NXTEVDYjI5dnFsUlJCVzBtVFpwRTdkcTFhZFdxRlY1ZVh2VG8wWU8rZmZ2aTQrT0QwV2lrZCsvZWRPL2UvYjRwbnJ2eDcwTG56bDBKQzV2QzJ0V3JrR1daZ1lNK1FoVEZmQlhlNXM2ZVNVWkdCbjNlNjZWOXp0ejVpL0R4OFdIU2xHbk0vSFE2aXhZdXdOUFRrNEhaaEpTUEhUM0toZzNyYWQrK3d5M0hWclpzRU8zYmQrRGRYajFSVUhqMjJXQk5PL2o5UHYyWVBHa0M2NzcrQ3JQWnpKQmh3N1hJYVBpSWp4azNialEycTQzU3BVc3plT2p3VzU2clFvV0tqd0hYYy9mWUhEb2hHcmVrZ2lDS29vZkZZaG1nMStzbi8xdC8vTkRRVVA3ODgwOSsvUEZIWW1OajZkbXpKenQzN3NSZ01QRFVVMC94eGh0djBMTm5UNjVldllxdnJ5OCtQajVNblRxVmxTdFg4dmZmZjlPb1VTTVdMbHhJR1ljNnZjMW1ZOHlZTVh6MjJXZkV4TVJRdVhKbFB2bmtFenAwNk9CNEd0WGlqVGZlWU9qUW9VUkhSek5nd0FDMmI5OU9jbkl5ZGVyVVlkcTBhVFJxMUFoUTJ6MjZkZXRHV0ZpWWxrOExEUTFselpvMWlLSkl4NDRkbVQxN2RxNWhyaHVQRHZiczJlTldkOHNIY2JHeFlUVnJWTitPdW1iVStVb1RCQ0VEVlNsZUVrVlJYVE5xTUNpQ0lBaG11OTArVXhURlh1N3BjOE1OdDJGN0dKR1JucjY2WW9WeVgyUXpiS2xaREp0ZEVFUlpweE1WdmNHZzZCM0p1YUIvNnhlZU4yOGVmZnYyL1UvOGVKR1JrVG1xdHdXQkxNdGN2bktWdUxnNEpFa2lJLzNSWEh2cVlUYWowK253OXdzZ0tLZ00rUkdtS29yaW1MTlk3UFo3TjJjZVpqTjZ2WjRBL3dDQ2dzcmVjdi9yN243R1hDRkpVbkVjVGJsWlg0cWlwaEhWN2c0WldRYkpMaUVJZ3VBcHkvSlJvTEo3K3Y1OXNGaXNuRGh4QXAxZTc5WVZCVkpUVTBoSlRrS1M3TlNxV1F1ajBaQ3JVZnYxMTk4UWRicjdveXZxR0pNc1M5U3JXOWZ0c2QwQkZFVTVYNlpVOFEvSUpKMTBFazg2cWNMdGpuQlUwZXYxaXJPNlVOWTlkZjlPUkVSR29OUHIzYXdRRG5oNWVWTzBXQWwwT2owM0ltN2t1czlmbDY4ZzZuVDNiYzZjWXhKRkhWZXVYSFZmdEhjQVFSQktaL1BZc3YvZnBWbFhQSC8rZkZIQW5ibitseUkySnRiTkNwRUx2SDBLRVJNVG0rdTJ1TGk0QnpKbjNqNkZpSWwxa3gzY2FWVC95ZWd4M3VUWjh1SFViUUZRMEFjRUJCUjN6OW0vMVQyL2MxYUlSOEZ6UzB5SXkzWGJnNW96THk5dkV1UGo3dWpZcE1SRUx2OTFrZFI4dEhxOXZMd0pLdmM0aFFvWGZtRHpmaS9IV2JWS3RVSkFUQzdlbXZPT3dObjZvVGVaVEVYdi9nM25wamd1S0h4OENxSFRpUlFwVW9UaXhXL3ZHU01Ja0o3dUpxbk1DK2w1RUhnK3lPTEtuZjVlZjEyNlFGcGEvZ0s5cWFrcFhQN3JJalZxUFRoYXhYczV6c2VLRkNtVTNWdHpGQThFMTNCVVVmUTZuZTZ1R2pZM3hmSHRJelUxaFJzUmtkeUlpT0NwT25mM290eSs3U2RXTEY5R1ZOUk5TcFFvd2VkZnJ1SDgrWFAwNko3SlFESjArRWhlZUtHTis0ZDRpSEVyWTVIMVd2cXZqck5Rb1VLRnNoZ3daM091NEZnTW56V1NFZlNpS0Q1Mk43OVlWb3BqTndvZW9uaDVlUk4xTTRMSXlFaUtGU3QyVno3M3hvMGJUSms4a1RIakpsQ3ZYbjJTa2xUT3J3b1ZLcko5NTI0QTN1blI3WjU5citYTGx0THU1Zll1TkUzT2NjMmFNWjJUSjMvSGFEVFMvUG1XdlBkK0g0MVY0dHExYTh5Wk5ZT1RwMDVpTXBsbzBhSWx2WHEvbDROMTRtN2lWdWQ4cm5GRERBWURnaUFTRkJSRTl4NDlhZFNvc2Z2aXZZOHdtejBLdVJxMUhDL0gwa2tGVVJURmdMdDVjamZGOFQ4d2NONCszTHg1ODY1OTN0ay96eEFZR0VpalJvMHhHbzBFQmdZNlFsZ0Jod2FqeTFyQ3U0M1BWaXdqTGk1bkFuLzBxSkdVTEZXS2pkOXRadkdTNVJ3NmVJQk5tNzRGMUo2OG9ZTS9wRkxsS256NzNXYm16Sm5QbnQyNzJMamhtM3Myem9LZWMrNzhoWHkvWlN2ZGUvUWtiT3BrTm55ei9vRmNKNElnVUtkT0hWcTBhRUh6NXMwcFVlTDJuSWlEQi9ZVDByVVRyNy82Q2pNK0RkUFdkTnBzTnNLbVRTR2t5MXQwRCtuQ3ZuMlphNXJ6WThTOWQ1Rk1LcHUrKzVhaGcxWGFKWVBCbU4xakUzRVVEckpHakZhckZWRVFoTHU2U05HZHpQNW5ucHRka3Y3eDV4dy9mb3lYMjdaaDJ0VEpSRVpHOG5MYk5yemN0ZzByUDF0UjRNODRkUEFBbmQ5NmcrYk5ndW5SUFlRL1RwMXkyYjVuOXk1Q3VuYmloVmJQMDcxYkZ3NGRQS0J0NjlmM2ZWNXVxNGEySHd6b3o4dHQyOUQzL1hjMUl4SWMzSlN1SWQwd21Vd1VLVnFVdXZYcWNjNUJTaEFYRjRlZnZ6K2RPbmZHYURSU3FuUnBHalYrbGovL1BIUFA1djEyem1rMm0yblVxREhEaG85a3llS0YrZEphM3l1VUsxY09uVTdIdG0zYjJMdDNMelZyMXNSZ01PUnFzTFAvUHlNam5hbFRKakZ4MGxSV3IxMUhURXdNMjM3NkVZQ3RQMndoSXlPRGxWK3NadnFNV2N5ZSthbm01ZWZGaUZzUVBQSEVFOXBETmI4eFp2MDdKaWFHZDNwMDU4S0Y4OXJ2b05mckMrWGhxV2t2V1piUjYvV0lnTi9kblBRN3BUaDJRMFZLOGo4dnROU3FWWnR2TjIxaFFPaEFTcFlzeGJlYnR2RHRwaTJFZE90ZW9PTXZYcmpBeHlPSDgxNmZ2bXpadW8xWFgzdWRnUi8wSjhyaFRWNjVjcG54NDhZd1pNaHdOdi93RXkrOTFJNFJJNFpwYWx0ejVzN24yMDBxRThxTVdiUDVkdE1XNXM1ZkNJQW9pblRxM0FWZlgvV3krK3V2U3h6WXY1OEdEVlIyazhEQVFPYk1uWStIaDFtNzBJOGZPMGFOR2pYdjJaemZ5VG5yMVcrQTFXYlREUEw5UkdCZ0lEZHUzTkE4RkZtV2M1QThIRGtTem9oaFE3RFpiTVRGeGZGT2orN0V4Y1VSRVJHQnI2OGZKVXVXUktmVDBhcFZhdzRmUGdTb3JMZlBQdnVjNDNjU01CaU1uRHQzVnR1V0d5TnVBWE5qZVpKVkxsdTZXS01HUDNueWR3YjBWMWNSK2ZyNjhzV3FOWVIweStSRTFPbDB1WVdpdUlhaHFrY3JBdmM4Ymh3ME1KVFhPcllucE10YmRPMzhKbHMyZjYvbE5WN3IrQXJ0MjcxSTk1QXU5M1FNM1VPNmNQSGl4ZHM2WnR0UFAvSmF4MWQ0b1hVTFpzL0ttK0J2eDQ3dGpQNWs1SC9HdUc3ZXZJbmdKazFwMUtneEpwT0pWcTFmb0VyVnFteHpDSGtFQkFTeWZNWG5WS3RlSFZFVWVhbHRPMnhXSzMvL1hmRG0wejlPbmFKRjg2YUVkT2xFbGFwVmVTNjRTYTc3TFZ3d0Q3T25KeSswZWZHK2ZmK0NuRk1RQlB6OS9FbDVBTWw2bzlHSUpFa0VCQVRRdUhGalpGbkdaSEpsSGF0YnR4NytBUUdNR2YwSmd3WU9vUDBySGZEMzk2ZFlzZUxFeGNWeTZkSWw3SFk3NGVIaHBLU28zOEhKaUh2cTFFbUdEUDRRbzhsSVltS2l0czNKaUR0M3ppeU5FZmVmNHMyM09yTnIxOC9NbVQyVGNXTkcwN2RmZjZkM2xpT25LZ2lDZHo2NU5SY2pweGNFNGI0a3hENGFNb3g2OWVxVG1KaEFyNTV2VTdXYXluMldGNzN4dzRBV0xWdlJvbVVydnY1cUxaR1JFWStNMXhnWkdVbUZDaFZkM2l0VEpraWJBMjl2YjNaczM4YjQ4V05JU1U3Sk02eklEOVdmZUlKdE8zWVJFUkhCSngrUFlQbXlwZlI4eDVXSDRmT1ZuM0g0OENIbXpKbVBYcSsvTDkrOW9PZFVGSVc0K0RpOEgxRGF4Um1PN3QrL24xcTU4SmtKZ2tEdjN1L3h4dXNkS1ZPbXJHYWt6V1l6dzRhUFpQS2s4WTdmdFN5ZVpyTjIzUGZmYnlJOVBaMUprNmN4ZSthbkxwK1pGeU51WG1qVnFoWGUzdXI4T1BPQXAwK2Y1dlRwMDlvKzN0N2V2UHZ1KzN3UTJvODMzK3BFNWNwNUx5c1RSZEU3bnpCVU0ybzJtdzA5Y0Y4NXFRc1g5dVdKSjJ0dzhjSjV5cGN2bitkK2lZa0pUSjQ0Z2Fpb0tPeDJHNTA2ZDlYWU9NK2NPYzNNR2ROSlQwdWpTTkZpREIwMlFvdmhkKy82bWRXcnY4U1NrVUgxSjU3a2c0RWZhdm1IWFQvdlpPem9qMGxQejZCdnYvNmFsL0ROK25WcThscFJhTnJzZjNUcjN1T1czK1BJa1hBK25UNE5VUkFwV2Fva251Wk10dHo4eHRDOFdURDlCM3pBMGlXTFVCVDRmc3ZXaDg2d0ZTMWFsTWdJVjBOKy9mbzFhdGRXVzFIMi9yS0hWVjkrd1l5WnN5bFZ1alNnVmcxenU3bXlHenRMUmdaYnQvNUE2OVl2WVBMd29Iang0alJ2L3J4TG9ocGcvYnF2MmI3dEoyYk5tWGZmR2s1djU1eEhqb1JqTkJpb1ZQbitMN0cyV3EzWTdYYU9IajNxRE5GeWFHYWtwS1R3MFVjRDZkd2xoSE5uLzJUSzVJa01IVFlDUVJCNHV1RXpQTjN3R1VmdWJLNUdTMSs0Y0dITVpqTmp4MDFBRkVVc0ZndUZIZk9RRnlOdWZ2anhSelYzOTh3enozRDU4bVV0ZkhaSmUxeTh5T1JKRXhnN2JnSXJsaStsVE5rZzJ1VHRLWHRsTTJKWmpKcVFOV1JGQkR6djU0OFNIUlhGcVpPL1U2Vksva3prNTg2ZDQzL05uMmZaaXBYTW1idUFXVE5uWUxWYXNWcXRqUHA0QktHaEEvbjh5elU4ODB3amxpeGFvT1ZyMXE5Zng1dzU4MW41eFdvQWZ0aXlXZnRNSHg4ZlZuNnhtdEZqeGpGLy9seEFKZGJidkhrVEN4Y3RaY215ei9qdHQ5L1k5ZlBPZk1kbXNWaVlNRzRNbzBhUDVjdlZheWxUT25PcDdhM0dZTGZiaVlxS1l0MDMzN0wrbTQwUHpIalo3WGFOQmwyUlpleDJ1MmFFMnJ6NEVudjI3Q0k4L0RCMnU1MmZmOTdKSDZkTzBxSmxTMEJWVGhJRUVIVTZFaE1UdEJ5SklydXlGQmN2VVlKREJ3OWlzOW1Jam9wU3d5aVRpUzgrWDhuYXRhdXgyV3drSk1TemQrOHYxS2hSSXpNVS9uNFQzMjdjd016WmMrOGJBV2RCejJteFdEaDg2Q0NUSjAyZzk3dnZQeEN0aXVqb2FLMmFiVFFhOGZYMXpTR0ljdkhpQllLRG0vSldwODZNL0dRMFJxT0p1RGpYVlErSER4MWt4NDV0V2c5anJWcTFzZHZ0aUtKSVFrSThGeTllcEZMRlN0cTIzQmh4L3lsKysvVUlRNGVOb0VuVFpudzZjdzZuL3ppVmcrMDZ5NFBTbk0yb1pYMkd1cFQzOVlENWZ2d1kwOE9tWXZZd1l6UVo2ZE8zUDZVZHBJNTVvV2JOV2l4ZnRvUnQyMzVFcDlOanNXU1FuSnhNUW53ODN0NCtWSzJtNmhHODFMWWRUWnMxVTMrb3c0ZTQ5dmRWM3UzOVRwYW5pazltM3NIQjdsbTFXalV0RVI0ZWZvam5uMitKMmVHT3YvamlTNFNISDZacHMvL2xPYmFyVjYvdzJHTkZOT05jcFZvMTl2MnlwMEJqQU9nYTB1MnVYQlIzaXV3TnVsTW1UMlRLNUlrODM2SWxIMzh5bW9vVkt6RnF6RGdXeko5TFpFUUVaY3FXWldyWXB4UXRxdmJYdFg2aERhZE9uYVJIOTY3b2RIcmF2ZHllaWhVckVaZHR1ZERBZ1I4U05tMnEraVF1VTRhbHkxZGlOQnFaTWpXTXVYTm04ZFhhTlJnTUJvS2JOTldTeEpJa01XM3FaUFI2UFcrKzN0RTFUUHh5TmNXSzNmMFZnQVU5Wjc4Kzd5TUlLblBzb0E4SDM5VStOaDhmbndMdmUvbnlaWHg5ZlRWWngrUEhqK2RJNU5lc1dZdWFOV3RwK2FwQldaaHk0K1BqNk5XekI2VkxsMmJpcENrOFZxU0k5cnVlTzNkT3kzZjNHeENxZWE1NU1lSVdCQWNPSE1oejIydXZ2Nkg5UHlBZ2dJOEc1eXZzNHBGUEdPcXdjQ0tTSktFSDdzc2ROdWpEd1JwdGNFR3dkczBxN0RZN1U2Wk9SeEFFclgzQWFaNmRNQmdNK1BtcFQxaWIxVVp3azZhYTNGaCtpZCtzSVZMV1ZpNUJFUEo4WW1UTnIrVFZMRnFRTWVUSEUzWTMwYkpWYTFxMmFwM2ovWW9WSy9ITHZ2d0ZtaHMxYXB6bmpXc3ltUmo1OFNpWDk5N3AxVHZIZnZVYlBNM1g2emZrZUw5Q3hZck1uRDAzMTgvVzZYVHMyWHZndmhyNmdwenpWdk4xTjhhUW1wcFNvRllwNStxZU80V2Zuei9yY29rV3NodkFyQWdNREN5d1F0YmRSRUJBZ0ZaaHo4VldDZG50Z1NDQVRxZTJlenc0MXlGZmR6c0dieDl2QkVIZytQRmpKQ1Vsb1NnS3BjdVVJVGs1bWZQblZXWDNuMzdjU3RpMEtRRFVxMStmbjNmdTVQcjE2d0RzM0xtRGt5ZC96L2M4ZGV2V1ovdTJiYVNucDJPejJmaGh5MmJxTjhoZldLVnMyU0NpbzZPMW5FRkVsdHpCbll6aG44QnM5c1NOMjV1YkJ6bG5lWjI3U0pFaXBPV3pwdHJUczJBaGIwSDN1MWU0eCtNMDV1S3BDVW8ycjgwWml1b2UxQ1RrSjBqeDJtdXZNM2JNS0g3WXNvWEtWYXBRb1dKRkVoTVNDQXdNWk15NDhYd2FOZzJMeFVMZ1k0RU1HVHBDRFFtclZLVmYvd0VNSGZ3aE5ydU5ja0hsR0R4MFdMNWplS3B1WFZxMmFzMjd2ZFNDd2JQUE5hRnBVelcwM2ZiVGp5eGRzcGlVMUJSa1NXTGYzcjEwNlJyQ1MyM2JNWFQ0Q0VZTUc0S2Z2ejk2dlU0ckh0ekpHTzdYay81UlFtcEtjcDVldGZpQTVpdzFKUmxkSHBYVzRzV0xFeEVSUWZUTkNEeTlmWEtNclZ6NUNyZGNZTzdwNlVXNThnOVdsK2tlajFPWG04ZVdXOTVOVUc0VmQ5MG1qaDQ5U3BGaWJvM01PMFZVNUhYcTNNWkMrTXVYcnhBYkYrZGVtNXNOTnlOdkVCZ1lRTmxjY3JtWHIxd2hOdmIrejluTnlCc0VCQVFRVkRidi9ISlVWQlNSa1pIWTdYYVNrOTJzT05uUnBFbVQ5a0FhS29OdUVwbWlMaFkwN1FOQnZ1dk5RVzRQNHA4OTBXKzNYNnRzMlRKRVIwY2pudHFQQUFBZ0FFbEVRVlJ4TS9LR214cmNNWWNwS2NsSWRudXVSZzBncUd4Wm9xTHUzNXc1eHlSTFVyNUd6Um1TRm5Fazg5M0lGZG5EVHNHWll4TUVRVjExSUlxQ29DaUtoTHBFNGE0Z0lpS0N5TWliUEZiVXpWOTUrOTdhRFVxVUtIN2I3QjZLb3ZEWDVTdkV4Y1VpMldVeU1oNU5qamF6MlJOUnB5TXdJSkN5WlV2ZmNvSC9sU3RYaVk2SlFiSkw5MnpPekdaUGRIcjlMVDAxTndvRVdSQ0Vqa0JxRm84dFJSQ0VWTUFpQ0lKTkVBUzdLSXFLb0NpS0ZURGM3WEJVRUhWNGVYbmo2ZmJjYm9rMGg5Z0hLTGNWaHJyaHhpTUdteUFJcjJjeGJNbEFzaUFJYVVCR1ZzT21CKzY2WWF0VHB3NDNiOTdrWmxRVXlVbUpiZ2JkZk9EdDQ0TkJyNmRVcVpMdUVNUU5OL0tIdGFBN09nM2JYYThSRnkxYTlJNDBNdDF3d3cwM0NtallsR3ovYWhDQmRQZDh1ZUdHRy84Q1pCVFlZN3R5NVlwYkRjUU5OOXg0NktFb1Nub3UzcG1pT0JSZG5KMXJpcUlvK3JKbHk2YTZwOHdOTjl4NDJDSExjbXFXMEZNemNObmJQUVJCUUZRVXhVMTU2NFliYnZ3YlBMYnN6SlpLdHY5cmYrdFJlMEhjY01PTkIzL2p1dlY0ODRIZGJrL0pZc0NVTEtHb2tqVVVsV1VadmFJb0NmZFNxY2dOTjl3b21GRno2L0htRDR2RmtweWJ4K1pxdnpKRDBiaEhiWUpLbFNwRnRXclZjaFdqOFBiMjVyUFBQcnVYVHgxQ1EwTXBVcVFJaFFzWHBuZnYzcG9JaWh1UExyTHE4YnFYSStaNTd5Umw4OWdVY21uMUFOV3d4VDZLazNUbXpCa21UWnAwMzg4N2JOZ3dObTNheExwMTY5aTBhUk03ZCs2a1g3OSs3cXYyRVlkYmovZldzRnF0U1ZrOHRWenlhNExLclNpQUtFbFN6S000U2VYS2xXUGl4SW1jT1hQbXZwMHpOVFdWZWZQbUVSWVdSbkJ3TU1IQndTeGV2SmlWSzFjU0V4UGp2bklmWWR5cEh1K1owMzh3TUxUL2ZYQUVUaE0yYlFyYkhVcGxUbXpjK0EwaFhkNGlwR3NubGk5YnFyMmZuOER5aVJQSDZmbDJON3FGZEdiMEp5TUxyTTJhbnA2V2pHdFRicmJxcU5OZkE5Rm1zOTE4RkMrazNyMTdVNzE2ZGQ1NTU1MThHWFBYcjEvUGswOCtpZGxzcG5yMTZpeGR1dFJsKzg4Ly8weWRPblV3bTgzVXExZVBzTEF3RjNIWXdNQkFQdnhRWmRNOWR1d1k2ZW5wQkFjSGE5dWZmZlpaQUE0ZVBPaSt1eDloM0trZWIrVXFWUmsxWnV3OUhkdjhlWE5adG5RSmx5NWVkREZDVjY5ZVljUDY5U3hZdEpSbHkxZHk0c1F4amh3SmR4eVR1OEN5M1c1bjBvUnhqUHhrRkordC9KSlNwY3RvbWhtM1FsSmlVbDZoYUk0VkNQcU1qSXlvVzZuTi9CZWgwK2xZc21RSkRSbzBZTkdpUmJ6NzdyczU5dG03ZHkrZE9uVmk5dXpadEdyVmlxTkhqOUs3ZDI5ME9oM2R1M2ZuNHNXTHRHblRocjU5KzdKbXpScCsrZVVYK3Zmdjd5THdNV2pRSUdyWHJnM0E5ZXZYTVJxTkJBUUVhTnNOQmdNQkFRRmN1M2JOZlhlN2tRT3hzYkZNbkRDT21PZ29CRkhrdmZmNjBPRHBoaTRrcmI2K2ZxeFkrVVZtdW1QSVI5eTRvVEk0SnlRazRPbmx4WnExNndCVkZXck9yQmtrSmlYaTcrZlA0S0hETkMwTGdIVmZmOFdHRGV1MS9RRjZ2dE1MbzlHb01WVTc4ZnVKRXp4VnR5NmVucDdZN1hiOGZQMDRjZnc0OWVyVjU4U0o0M3p3d1NEQVZXQTU2dVpOUE14bWdvTEtBZUR2NzgvUE8zY1VhQzV1UnQxTUxvQlJVd0QwRVJFUkVYbkp6Ly9YOGRSVFR4RWFHc3FRSVVObzI3YXRwbjNveElRSkUralJvd2U5ZTZ0OC9tWExsdVhTcFV0TW5UcVY3dDI3czNEaFFxcFVxY0swYWRQVXAyZmx5cHc4ZVpMVnExZTc1TlNjU0V0THc4UERJOGM0VENaVER2azBOOXdBK0dydGFtclVxRUZJdDdlNWRPa1M4K2ZOb2NIVERTbFZxbFNlbXJ5VHBxalhZMkppQXIzZjZhSHBiMWl0VmlhT0g4djRpWk1wWHJ3NFAvMjRsUVh6NXpGNlRPYnhOV3ZWeXNFOG5KZndrRk5nT1RvNm1ra1R4aUhKRWo2T1BHRldnZVVkTzdacEFzdEpTVW1ZVENhc1ZpdHo1OHppeG8wYk9SUzI4ZzY3VHp2YlBlUzhQRFZuTUNyV3JGa3ppdHRZZy9WZnc5aXhZd2tJQ0tCdjM3NDV0cDA2ZFlwbHk1Ymg3ZTJ0dlVhT0hNbUZDeGVRSkluang0OVR2NzZyUUUyalJvM3lQSmZaYk02MUVtdXhXQjZJakpzYkR6L3ExVy9BemgzYldmblpDaXdaR1FVV1ZKRmxtVEdqUjlIbXhiYlVyOThBVUtVaHIxMzdtK0ZEQjlNOXBBdXJWMytwcWJVNVVhbFNaVjdwMExIQTR6dDkrZzlHamhqS083M2ZwV2xUVjJXM1NSUEdjZm55WDRSTm4rbWlWSitZbU1qQUR3WlFyVnAxK3ZVZlVOQlRaVXdZUHpZdG4xQlVNM1NDb0Rib0Fsd0ZLajJLRjQ2bnB5Y0xGeTZrWmN1V2JOem9xdHhqdDlzWk5HZ1FiNy85ZG83alJGRkVyOWZuRUFUT0wxOVhxbFFwTWpJeVNFaEl3TmZYRjFCVnEyTmpZeWxaMGsybjdrWXVocTFlZmViT1cwajRrWEErWDdrQ285SEltSEVUYm5uY3NxV0w4ZkR3b0hPWHJ0cDdOcHVOWXNXS3VZU3Qvd1NGQ3hjbUl5T0RzT2t6S1ZTb0VDZE9IS2V3NDdyT1MyQzVVS0ZDSkNVbU1tSGlGQjUvL0hIT252MVR1eGZ5ZzZJb2YyY3pZSElXenkzbi9ha2VvMXg1bEMrZUZpMWEwTGx6Wi9yMjdhdUpDQU5VcTFhTmt5ZFBVcUZDQmUxMTRNQUJaczJhaFNBSVBQbmtreHc1Y3NUbHM3TC9uUlcxYTlmR2JEYXpkMittNnZtK2Zmc1FSWkdubjM3YWZSZTdrUU9USm80bi9FZzR6WnMvejdEaEl6bDA2R0NPaDJsMjdOdTNsejI3ZHpOOHhNY3V6YXNWS2xRZ0tTbUpYL2JzMXZKdDMyLzZ6dVhZOCtmUHNYSGpOd1VhMjVNMWFtQzFXakdaVEVpU3hNRUQrNmxaUzlVeXpVdGd1Vmp4NGhUMjljWGtDRy8zN2QyckhaTWZKRW02bnMybzVlR3RxZjBlZWtDUlpmbHlYb28randwbXpKaEIxYXBWWFhKZFE0WU1vVldyVm93ZVBacE9uVHB4K3ZScCt2ZnZ6OENCQXdIbzI3Y3ZzMmZQWnVqUW9iejk5dHNjT25TSUJRc1d1SVNWa3laTm9uYnQyclJxMVFvdkx5OTY5T2hCMzc1OThmSHh3V2cwMHJ0M2I3cDM3MzdmRk0vZCtIZWhjK2V1aElWTlllM3FWY2l5ek1CQkh5R0tZcjRLYjNObnp5UWpJNE0rNy9YU1BtZnUvRVg0K1Bnd2FjbzBabjQ2blVVTEYrRHA2Y25BYkRxaXg0NGVaY09HOWJSdjMrR1dZeXRiTm9qMjdUdndicStlS0NnOCsyeXdwaDJjbDhDeVhxOW4rSWlQR1RkdU5EYXJqZEtsU3pONDZLM0ZsMjAyVzBRdUhwdWlxdSs1ZW0yQ2dDSUlndUNka1pIUnoyZzBUbnhVTHBaU3BVb1JHaHFxdFdFNDhjVVhYOUMxYTFkV3JGaEJ0MjdkQUZpMWFoVVRKMDdrd29VTEZDdFdqSjQ5ZXpKeTVFanRTZmpUVHo4eGNPQkFMbHk0UU8zYXRXblFvQUhyMTYvWGRFVURBd1BwMXEwYllXRmhXajR0TkRTVU5XdldJSW9pSFR0MlpQYnMyYmtXRmR4NGRMQm56eDRlcjFqRlBSRjVJQ1ltNXRQYU5aLzRCVmRhOEJRbkxUZ3FiYmdraXFLczArbFZ3NWFVbE5URzI5dDdyWHY2Ymc4blQ1NGtMUzJOQmcwYWFPK05IajJhSDM3NGdmRHc4UHMyRGxtV3VYemxLbkZ4Y1VpU1JFYjZvN2xFeThOc1JxZlQ0ZThYUUZCUUdVUlJ6QzluNDVpeldPejJlemRuSG1ZemVyMmVBUDhBZ29MS3VnM2JIZUxzbjM4T2EvNi9KcWZKS2VTU0RqaWs5MFJKRkVWWnI5Y3Bla0NKajQrLytDajBza21TZE52eWR2bmRHQmN1WEtCTGx5NnNXcldLV3JWcWNmTGtTZWJObThmdzRjUEpqUGNManNqSXlOdW1VN2RZckp3NGNRS2RYbzlQb2NKdStiM1VGT0lUNG9uNUxacGFOV3RoTkJweS9lMSsvZlUzUkowT2I1OTdQMmVwcVNuRXhzVVJIUk5OdmJwMTg5MzN1cnVmTVZjY09uZ2dsc3lDZ1ZZNGNEQjdPRUpSQlFVRldaWVJCRUh3Qkl6L1orKzc0NXVvLy8rZmQ1ZGNkdmVtcFlXMkRGR2dTQUUvRkJGL2JCemdGMFVGUkN4WWtDRWdJaFFVRkdRclFnc2lVNUNsSUdKWkFySmt5aXBZaG15UTBxYnBidE9SY1hlL1AyNDBTZE5Tb0dYbTlYaEVhZFpkM25mM3ZOZDhQbG1XMVFOUXVKYnc3bXpxMUtsWXZIZ3gwdExTRUJ3Y2pMaTRPSXdlUGJwU2I2RTY3V0dKL3o3cXhvc1RleUVzdEx5WGRPMzZEZVRtNWo0VXdXUWZiMitFT3BIaGMzbHNsZCsvUTJvRjlBRXZZMkIwQ0VWTEFKZ0ZvV1NHSkVsT0pwTnhKTXFTY1JkYzYzZjNGaDhmait2WHI4TmtNdUhxMWFzWU0yYk1Bd00xQU1qT3luWU5UenN4cmM0TldWbk8rUjF5Y25JZXlwcHBkVzdJeW5iTkJOOURxdVVpN0ZzOGJGczk3SXNISW9PdTZKMnpMSHZldFlTUGwzSGN2UTlQUCttbTBXakJza3lGS1ltSHNXWWFqUmFNbFhFZG5MczBpOFZ5RmVYNzF4ejcySGgyRHdIY1pBUkJjQnpIY1ZhcjlYeEZveE11ZXpTTklJQ1NFaGVYVzBWV1VnSFAzY01zcnR6cjhTckl6OGVONjFkUlZHU3NGRGpENm9URHpkMzlvZjIrbXRoUG83SHdwaE5BSytleEVVU1o3b0ZNZktHa3BPU2NDOWdxODQ1NDJtYUR3UUFydzhCWVdEMjB6VnF0RGpLNURINit2Z2dNREt6Mi9kNjFjd2VXTDFzS2d5RURRVUZCV0xscUxTNWZ2b1RZL3Yyazk0eU5uNEN1WGJ1NUR2SWpiTmV2WFVGeGNlWDBQa1ZGUnR5NGZoV05telo3b3Ziejl1MjAydzZBeGdCZ2hhSkJ1WWNJYkFEQVhicDA2VngwZExUckRLb0ExSktUa3dHQ2hFYXI0Mm1iQTZydis0dUtqRWpYWnlBOVBSM05tbFhmU1ptV2xvWVowNmZpeThsZkl6cTZCUW9LZUdxY2lJaEk3TnE5RHdBd01QYjlHbHUzWlV1WDRQWHVQZXpZVE1UOW1qdm5HNlNrL0FPYXB0RytReWNNL21pSU5IeWRtcHFLaExsemtISTJCUXFGQWgwN2RzS0hjWU5SazAza2Q5cm1pekV2UUM2WGd5QkloSVdGb1gvc0FMUnVIZlBBenNFN2dZWHR1ZlF3clNiMmMvKyt2UmtDYURFaXFObDdiYnlYQmx1VktoSGxXclpzbVFYZ3Nndkd5cHRlcndjSUVuNytnVFdTbTlGb3RQRHpEd1JBSUQwOXZkcSs5K0svRitEajQ0UFdyV05BMDdURUUwY1FCQlFLQlJRS0JXcFM3K0xINVV1UmsxTStnVDlwNGdUVUNnN0diNzl2d2FMRnkzRDB5R0VrSlcwQ3dQZmtqUjB6R3ZYcU44Q20zN2NnSVdFQjl1L2JpOTgyL2xwaisxblZiU1l1V0lqTlc3ZWpmK3dBeko0NUhSdC8zZUM2T0dyZXFiZ3ljOGEwa3NyQ1VJSVFRbEhZaDZJUTNzQ3lMSHVLSk1sSTEzTGFtOEdRQ1kxV1YrUGIwZWpjWURBWTdqc2tQWDA2R1pPK21BQ3oyWXppNG1KMGY0MFBNM3U4MFJQOTN1OWZwZTg0ZXVRd0VoUG1RYTlQUjJob0dFWjk4aWthUGZ1czdWMFV5NVl0UWFiQkFQK0FBTVRGRFVhckYvNEhBQmcyOUNQY0VoaFRSMzQ4SERJWmhlRGdFQ1F1V0FpV1pkRzJiVHQwZStVVktCUUsrUG43bzNsME5DNWR2QWlBcjFoNmVubWhkNTgrb0drYXdTRWhhQjNUQnYvK1czTkYrN3ZacGtxbFF1dldNWkRIVDhERUx5YWdVK2N1angwekM4TXdPSHIwQ0xZay9ZNGhRNGNqT0NRRUFEOGtQL2U3YjVIeXp4bVFKSVhZZ1I4aUpvWW5RczNNek1TMHFWT1FuWjBGbmM0Tll6NGJpOXExUXl2ZERrRVFpSXFLZ28rUEQxaVd4Zm56NTVHV2xsYmwvVnp4NDNMOHNYM2JPV2RoS0FDVzR6aTJMTDlHY0NBSXZrRzlvRUFxSGdBQVo3RllraFVLUlM4WGxObWJsYkUra0NxYVJxT0ZzU0R2dnIrbmFkTW9iRXJhaWgxL2JNZktGVDlpOWRxZjcrcnpWNjljd2VjVDRqSHBxeWxvM2p3YWUvZnN4cWlSdy9IVHFyWHc4L2ZIelpzM01HWHlsNWc3Yno0YU5HeUlUYjl0eFBqeDQ3QjV5M2FvMVdva0pDNlF3cmM1YytjaE1yS01PSVlrU2ZUdTA3Y3NKM1A5R2c0Zk9vU1BodkMwVVQ0K1B0TG5SVy9xZEhJeVh1L2VvOGJXL1Y2MkdkMmlKY3dXQ3k1ZHZJaW9aczBleWZPV1pWbXA5Y2oyM3g4UEg0cGF0V3Jod29YellHd3F4OXUzYlVWcGFTbFcvTFFHT1RrNUdQUmhMQm8zYmdJM056ZUpFZmVWVjEvRGlSUEhNV1BhVk16Ly9vZEt0MStuVGgxUUZJV2RPM2RDb1ZEZzVaZGZSbVptSml3V2k5Tjl0UDA3SmVVZjdOKzNGN05tZjN2bGhWYlJqbUdvYlk0TklvQVJBamhydFZxKzNVTk13aFVVRkp4eXdWaDVxNjVDUVpXMlpUUSs5Tis3WlVzUzJyN1VEcTFieDBDaFVLQnpsNjVvMExBaGRncDg5OTdlUGxpMmZDV2VhZFFJSkVuaTFkZGVoOFZzeHExYi8xVjVHK2ZPbmtYSDl1M1FyMjl2TkdqWUVDKzJmY25wK3haK1B4OHF0UnBkdTczeXdINS9WYlpKRUFTOFBMMWdMREkra3VmczhlUEhNSDdjWjdCWUxNakp5Y0hBMlA3SXllRUY2YjZkTXhmajRpZVV1MW1mT1hNYWJkcThLTnlBQ01qbE5DNWR1aWk5OXVLTFBLVzlMU1B1blc0WW9vZkdjZnhFZ0tlbnA5MTdsaTVaSkZHRHA2VDhnNCtIOHplNEs1Y3ZvV2xVRkc3eHJyK3R0OFk0Q1VmQmNad0VjSEk1YmRlZ3k3MzExbHVud0hmMnVxd1NPM1BtTkRwMWVCbDVlYm1TaDlPdjc3dFBWRTR4TU5DK0s3OTI3VERvOVh6K1Q2dlY0dVRKRTRqN01CYTkzK21GOTkvckk5MXRxMnFObm4wV08vL2NpNS9YYjBSNmVycWRFSWhvSzFmOGlMLy9Qb3FwVTZkWDJ5amNuYXlxMitRNERqbTVPZEErb2oyRXpadEh3OHZiRzE5TytnS2ZqUG9ZUGQ3NFA0bEI1azZNdUdmUHB1Q3pNYU5CSzJqazUrZExyNG1NdUlrSmN5VkczTXFNcG1rd0RBTnZiMi9FeE1TQVpWazd3a2tBZU9mZFB0aTdkdzhTNW4ySHlWOU93dEJodkRCTjNmQUluRHh4M0RoMHlFY1pEaUdvSGJBSllGWk8xSVVVa3NjY0FIYi8vdjBzeDNGSFhkQjFaeXNwS2NHYTFhdWZ5Ti9tNys4UHZVTVI0L2J0VklrYi84QmYrN0Y2MVUvNC9QTkpXTDMyNXdwRFhZSWd5b0dkcWJRVW0zN2JDRk1wVDlvY0dCaUk5dTA3NE15WjAzYnYyN0QrRit6YXVRTnp2a3Q0WUgxWmQ3UE40OGVQZ1piTFVhOSsvWWR5ZkRwMjdDZzlIRm1jeGJXUGl4dU1VeWRQUUVFcnF1enhidDZjaE9YTGxtTGE5RmtJZGNpaFZjU0llNmR3dEdIRGhqaDA2SkJVbGJjMXJWYUxRWU0rd3ZwZmZrYTdsMTlHL2ZyOFdGbVRKazNSdmtPbmt3WkRSbVdneHBiTmlZckJLSy96UU1LZU41eTFXcTB1WUt2aUFkdTdaN2ZrM3R2YXZyMTc4T0hBRDlDdjc3dVlPV09hbEZOSVMwdkRvQThIb1BjN3ZUQnI1blFwcWY5UThvWldxMFNxeWJFc3JGYXJCRUxkWG5rVisvZnZ4YkZqZjhOcXRXTFBudDA0ZHpZRkhUdDFBc0FMakJBRVFGSVU4dlB6cEZDQ1krM0pUQU9EZ25EMHlCRllMQlprR2d6OFhWeWh3RThyVjJEZHVqV3dXQ3pJeTh2RmdRTi9vWEhqeG1XaDhPWWtiUHB0STc2YmwvakFlT3FxdWsyVHlZUy9qeDdCOUdsZkkyN1FSdytsY0pDUmtZR2RPM2RLRDJkTU1rYWpFWjkrT2dwOSt2WkRRRUFBWmt5ZldpbTdzeGhpZW5oNFlOYnNiK0hsNVFXVHlRUjNBZUJGUnR4aHcwZEFMcGRMakxpVm1kbHNoc2xrd3NHREIyRXltVUJSVkRsdGo2dFhyMkw2dEsveDFlU3ZjZlRJWVd6ZHVrVjY3ZFZYWHp2ckpBeGxiSE5zb21OR0VJU1VxM056ZDRkTUtJOXlvbHRYV0ZoNHpFVjZlR2RUcXpYbzJLa0xWcTlhaVM1ZHlnRHErdlZyMkxCaFBSSVNGa0NoVkdMbWpHbll0blVMWHUvZUEzUG5mSVAySFRxaTU1dHY0ZGpmUjNIbzRJR0hzdStPRGJvenBrL0ZqT2xUMGFGakozeit4U1JFUnRiRHhDOG40L3NGaWRDbnA2TjJhQ2htenY1Vzh0aTZkTzJHczJkVEVOdi9QVkNVREs5Mzc0SEl5SHJJeWJVSCtWR2pSbVAyckpsWXZtd0phdGV1alNYTFZvQ21hY3lZT1J1SkNYUHg4N3Exa012bGFQdFNPL1I3bjZkZlp4Z0dzMmJ5WWVBN3ZleTU5MWV1V29PQWdPcHZZcTdxTm9jTitRZ0V3Uk1zZmpKNnpBUHRZN3RidTNyMUN0cTJiWWQzZS9lQjFXckYzTy9tSUNjbnAxeFBvYTAxYlJxRmMrZk9naVJKNU9YbDR1clZxNmduRkg0cVlzU3R6REl6TSszQ1h3OFBqM0xDTFNkUEhNZlljZVB4ZlBQbWVLNXhFeXhidWhoZHUzWURRUkM0ZHYzYXRZcEFEUTVUQnlSSlFTYWpZRFlERkVtVlRSNklIdHRISDMxMGROMjZkZmtBM0Yzd1ZibTk4WDg5MGE5dmI0azFGQUQrL3Zzb1VtLzloMEZ4QTZXN2xsWm9GVWxKK1FjVEJVV2c4SWlhNzZycDFMa0xPblh1VXU3NXlNaDYrT3RnNVRxbXJWdkhWSGpoS2hRS1RQaDhvdDF6QXorTUsvZStGaTFiNFpjTkc4czlIeEVaaWUvbUpUcjlib3Fpc1AvQTRRZDZIS3V5elR1dDEvMmFUbGU5N1VSTm1qUkZreVk4NWJaTUpzTW5Ea3k1enF4TDEyNjRkT2tTK3ZmanE5YkRQaDRoaGVRVk1lSldaamR1M0lDSGh3ZmF0MjhQQURoOStuUzVnc05idmQ2Vy91M3Q3WTFQeDR5VlVuNXhBMk5UbllJYVFiRGdPSllUakNSSmppUUpqaUJJYUxWYUxqYzNoL2ZZYkhPaXYvenlpM1hObWpVSFNKSjh4UVZkRlJ0QkVGQ3BWSGlqWjArc1dsVW1qbUV4VzlEMnBYYVM1Smxqd3JrbUcySmQ5dmdhUlZFb0tqSSswT0Y4eDl4b1pRRG80K05UWllVczIvTTlPVG41bnZiTllySDhyZGZyYmNOUXF3aHVCQTl1bkRSbFFKSWdDQklrU1lCV0tPRHU3c0VYRHh4bXJsaUx4WExRZGFyZEdkZ0FvRWYzTjNBNzlaYjBmSFNMRnRpemU3ZEVEYjU3OTU5SVNmbEhjdWUzYjl2S2g0TkNHZjErVGFWU3V3N0dYYTdOdzF5emlyYnQ1K2VIWW1OaHBhbVBxcVpJSG5hS3BqcmVsNXViKzA4bFlhaERLQ3FNVXBFa1NJSUVTWkpTVlJSQ0lvNEZ3R1ZrWkxpQXJZcW1VQ3JScDI5WnZxcEJnNFlZTnZ4ampCMHpHbS8zNm9rL2QrNUFjSEF3QUdENGlGSFl1ZU1QOUg2bkY3WnQyd3F5R21ZZnhUdTl5K3l0eUZoWTRXd3ArWkRXck1oWUNLcUNGcExBd0VCd0hJdk1qSFNuKzFhbmJzUWR3VUN0MXFCTzNZaUh1dTdWdForblRwNjQ2Z1RVeEVlWm1BdEI4SVVza2lnRE5aSUVvVktwQ0t2VlNyQXNTM0ljUjNFY0p3ZWdZRmwySDRCblhaY0ljUExVS2ZnSDNML3U1NFVMNTFHclZqRGMzTnl3Wjg5dWJOKzJGYk5tZjJ2M25nejliVHgvRjUzc04yN2NSSGFPaTBIWDBUTDBhZkR4OFVabzdmSnN0UStMZFpobjlmVkdtQk1HWGRFTUJnUDBlajJzVmlzS0gyQmorS05rSE1lZGI5ZXUzU1R3SWkyMjRpMUZBSW9KZ2hBMERnaUdJQWlXSkVtT29palFOTTNSTkEyRlFnRVpINTlLZVI4cEhMVmFyWHRrTXBrTDJBRElxaW4vVVZwU2lqR2pSL0hLNzFvdFBoczdydHdkWFM2WDM5VjNob2JXUm1hbUFSbjZOR2gxYmk3TkEyTWhqTVpDTUZhclUxQURnTERRVUJnTUQyN054SDFpR2FaU1VCTkRVajgvdjZmNkdCWVdGdjROSjdrMUFJd1lWWXF0SGhSRlFTNlhnNlpwS0pWS0tKVktxRlFxRUZxdGxyQllMQVRETUFUTHNoVEhjUlFBT2lzcjYyVXZMNitOTGxnRDB0UFRrYTdQRUJnNGFzNE1HZWtJRFBDLzZ5RjRqdU53L2NaTjVPUmtnN0d5S0MxOU9za25WU28xU0lxQ2o3Y1BRa05EN2xpb3VYbnpQMlJtWllHeE1qVzJaaXFWR3BSTWRrZFB6V1ZsZHVMRWlVK2pvNk92QWloR21jYUJrU0NJSXNHTE13djZCZ3hGVVp4Y0x1Y1VDZ1dVU2lXblZDcWhWcXRCdUxtNUVXYXpXUVEyMjNCVXliSnNNb0JhcnFVR1RwMUtCa0VRMEdoMVVGZnpIYjY0eUFoallRRUFybHI1MkZ6bXNzY3dERTBqU1hLa1RSaHFDMndsQUVvSmdyRFJFS1U0bXFZbFlGT3BWRkNyMVh3b1NwSWt4ekNNYlNqS0FXQVlodGxCVWRRSHJ1VUdtaldMUW5wNk9neUdUQlFXNUZYYnNMcE9wNE5NSmtOUVVDQUNBZ0pjQysyeXA5cEtTa3IrZ24wMTFDNFVkY0Fvb1llTnh6Q1NKRUZSRkNpS0tzdXhpVzBmd2xBcEM0QXRMQ3o4MDhQRHd3VnNnZ1VHQnRZSWZiZkxYT1l5M3E1Y3VYTEdBZFNzQUt3RVFkaTFlaEFPZld3aW9Jbi9Kc1h5cURoblpkUFR4bnA1ZWYwSjRMWnJ1VjNtTXBjOWlEQzBTWk1tMXdYd3NqbzhHRnRRQXdCYjdMSUZONHFpSUdOWmx1TTRyb3h0MHNaakE4QmV1M1p0TzBWUkExekw3aktYdWF5R3c5QjlqcDZhQTZpSnpMbWNHRjBLUEc4Y3d6QmdHQVpXcXhVV2l3VXloVUloa3JSSjAvOEMyTEVBR0hkMzkrM2UzdDR1WUhPWnkxeFdvM2I4K1BIa1NzSlFpZEZEOU5Ca01obmtjam1Fd2dIRXdvRldxd1ZwRzV2YWNMTko0YWl2cis5QnVGVGlYZVl5bDlWc0dIcXhSWXNXL3ptQW1nVVZNSG80NXRha0VGUW00eDgyRlFXQ0pFbU9aVmxDaUdGRnNRVEdiRFp2cG1tNm9XdjVYZWF5R3IyNG9kZnJrWkZoQU1Nd01CcWZuc21Ed3NMQ2ZiQnZ5cFVlSE1lSmpia2l3U1JZbHVVc0ZndHNkQS9BY1p3VWpzcHNQVGJCYStPSU1vVVhGZ0NUbHBhMkxTd3NiSXpyMUhPWnkyb08xSktUazhHQmtLWWgvSitpMzc5enh4OW5uSGhyVnZEVEJuYkVraVJKY3BSTUJscE9RNkdnb1ZBcW9WS3FvRktyb0ZGcm9OUHB5a0pSVzNCekRFZnIxcTE3bm1YWm5VL2FZaVltSmtLcFZEN1FiVnF0Vm93WU1RSitmbjV3ZDNkSFhGd2Npb3VMWFZmMlUyNTZ2UjRjQ1BnSEJEMTFZM0ZXcTNWdjdBZnZaOXNBbThYQmF5c2Zob29ENzdaaEtDV0RUQzZIWEM0SEtaUEpSRkRqYkR3MnpvYnRnd1hBRkJjWEo3bE92L3UzY2VQR0lTa3BDZXZYcjBkU1VoSjI3OTZOWWNPR3VSYm1LVGVESVJOYW5kdFQrZHZUMDlNT09RbEJMYWk0ZjAxb3hpVTVpaFNBVGNibjErUXlHZVEwWFJhS09oWVJDSUt3YS8xSVNFallQRzdjdU04QWhMaE93M3V6b3FJaXpKOC9INnRXclVMYnRyeVUyYUpGaTlDeFkwZk1tREZEVW1wMzJkTm5ETVBjazZkMjRmdzVMRjcwQTc3OWJsNk43dCtGQytleGRjdG1OR25TRkIwNmRwS2UvKzIzWDdGcDQ2OEFRYUJ0MjNiNElKWnZvS2hNWVBuTW1kTkltUHNkckl3VllhRmhxZGV1WDcvZzRLMUpZYWlJUDQ0TnVTUkZnaVFkdkRXaFNrclRkSm5IWmh1S2l1R29qZGZHakI4L3ZzUmlzZno2dEoxd2E5ZXVSWk1tVGFCU3FWQzNibDNNbTJkL0F1M1pzd2ZObWpXRFNxVkNkSFEwWnMrZWJRZFFQWHYyUlBQbXpRRUF5Y25KS0NrcGtVQU5BTnEwNFpXMmp4dzU0cnE2bjJJckxDeTRwOC9WYjlBUUU3Lzhxa2IzYmNIOFJDeGRzaGpYcmw1RlVWR1I5UHgvLzkzRXhnMGI4UDBQUzdCMDJRcWNPWk9NNDhlUENaL2hCWlpYckZ5TjkvdC9nQm5UcGtxcG1HbGZUOGFFTHliaXh4V3I0T1BydDJQdm50MFdaOTRhUU5oWFJFVndJMGxRdHVOVEFxako1SExJUmRvaXNUd3F2SW1qS0lwZ0dJWWpTUklNdzBoNU5nRFdXN2R1YmFwYnQrNklwK1ZrKyttbm54QWJHNHR2dnZrR25UdDN4bDkvL1lYaHc0ZERyVlpqd0lBQnVIcjFLcnAxNjRhaFE0ZGk3ZHExMHV1MnlrVTllL1pFYmk2dlAzcjc5bTNRTkcwbnFDR1h5K0h0N1kzVTFGVFgxZTJ5Y3BhZG5ZMnBYMDlHVnFZQkJFbGk4T0FoYU5ucUJhU21wbUxVaU9Hd1dNenc4UERFOGhWbDlQVGpQdnNVYVduOHdGQmVYaDdVR2czV3Jsc1BnRmVGU3BnN0Iva0YrZkR5OU1LWXNlTWtrUjRBV1AvTHo5aTRjWVAwZmdBWU1QQkQwRFNOMmJObTJPM2JQMmZPNFBubXphRldxMkcxV3VIcDRZa3pwMDhqT3JvRnpwdzVqWkVqUHdGZ0w3QnN5TWlBVXFWQ1dGZ2QwYk03VllHM1ppVUlNYjlHY0FEQkVRQkhrQ1JIa1NSSWt1S2tTRk1NUXdWdlRhRlFsZ0diVGE3Tk5oeTFteDJOaUlpNFlMVmFONUlrK2NiVGNGSjk4ODAzK09DREQ2UWNXR1JrSkc3Y3VJSEpreWRqd0lBQldMaHdJUm8wYUlCWnMyYnhkOC82OVpHU2tvSTFhOVpJMy9IMjIyVmlGY1hGeFU2TEZRcUZvcHdzbWN0Y0JnQS9yMXVEeG8wYm85LzdIK0RhdFd0WU1EOEJMVnU5Z09EZ1lQeXlZU011WDc2RXFWTW0yMzFtMmd6K2ZNelB6MFBjd0ZoSmY4TnNObVBxbEs4d1plcDBCQVlHWXNjZjIvSDlndm1ZOVBqTzdyUUFBQ0FBU1VSQlZHWFo1NXMwYlZxT2VmaE9Bc3VabVptWTl2VmtNQ3dEblpBbnRCVlkvdlBQblpMQWNrRkJBUlFLQmN4bU0rWis5KzJXWlVzWFp6bDRhcmJnSm9TaDRQaUhXRFN3U1ovSnlydzFXbWpXVmFtVUlPVnlPUnk4TmpnT3hndTlJZ3dBSmk4djc2a0pSOCtmUDQ4WFhuakI3cm1ZbUJqODk5OS9NQnFOT0gzNmREbXgydGF0VzFmNGZTcVZxcHhLRDhCclZUNE1mVXFYUGZvVzNhSWxkdis1Q3l0K1hBNVRhV21WQlZWWWxzV1hreWFpMnl1dm9VV0xsZ0I0YWNqVTFGdUlIenNHL2Z2MXhabzFxMkRJeUxEN1hMMTY5ZkhHLy9XOGkydmtIQ2FNSDR1QmNZUFFydDMvc3dmWUNnU1c4L1B6TVdya3gvQnc5empreEZ1ekxScEliQjYydVRXS3NnbERaUlJrTXJtTnQ2YUFTcVdHVEFRMnNXdFhERWNwaXVJRUhVSGIyVkhHeDhkbkQ4TXdod2lDYVAya24xUXFsY3JwQ1NQK1h5YVRsVk02cjB5VU5qZzRHS1dscGNqTHk0T0hod2NBd0dLeElEczdHN1ZxdVdqdlhPWUUyS0piSUhIK1FodzdmZ3dyVnl3SFRkUDRjdkxYZC96YzBpV0xvRlFxMGFmdmU5SnpGb3NGQVFFQmRtSHIvWmk3dXp0S1Mwc3grNXZ2NE9ibWhqTm5Uc05kT0s5RmdlV09uVHBMM3FKV3E0V2JteHNLOHZNeGVjcTBveSsvMU9aNkpkNmEyTHZHbG5WcENHRW9qMUdTUXlhWHlVREw1YUFWQ2lpVktxZzFhcEEwVFVNdTlINVVFSkxhRlJFQVdJdUtpbjUrR2s2cWhnMGJsa3ZxSHo1OEdJR0JnWEJ6YzhOenp6Mkg0OGVQMjczdStMZXRSVVZGUWFWUzRjQ0JNcUhrZ3djUGdpUkp0R3JWeW5VVnU2eWNUWnM2QmNlT0gwUDc5aDB3TG40Q2poNDlVdTVtNm1nSER4N0EvbjM3RUQvK2N6c1c0WWlJQ0JRVUZPQ3YvZnVrZk52bXBOL3RQbnY1OGlYODlsdlZnckxuR2plRzJXeUdRcUVBd3pBNGN2Z1FtalRsdFV3ckVsZ09DQXlFdTRjSDhuSnpkMWZrclFHRUhac0hRTmg0YkdWNU5jck9XMU5BcVZCQ3JWWkJxOUZDSmdKYlJVVUVtN1lQYVJLaGZmdjJ2eDQ1Y3VSRGdpQWVlMDBFbG1YeHh4OS9sSHUrYmR1MmlJK1BSOCtlUGZIc3M4K2ljK2ZPT0hqd0lPYk1tWU9KRTNteDRLRkRoMkxldkhrWU8zWXNQdmpnQXh3OWVoVGZmLys5WFZpNWJ0MDY1T2JtWXZEZ3dkQm9OSWlOamNYUW9VT2gwK2xBMHpUaTR1TFF2MzkvU1RIYlpTNnp0VDU5M3NQczJUT3diczFxc0N5TFVaOThDcElrN1lvSCtmbjVlS3ZuRzJqMi9QTVlPMjQ4RXVkOWg5TFNVZ3daL0tIMFBZa0xmb0JPcDhPMEdiUHczYmZmNEllRjMwT3RWbU9VZzQ1bzhxbFQyTGh4QTNyMCtMODc3bHRvYUJoNjlQZy9EUHB3QURod2FOT21yU1FlWHBIQXNrd213N2o0Q2VkZmU2WHIyUXE4TlF0QmlLQW1GQTBJOE40YVJZSWlLVTRtVlVMbFV0OGFyYUNoVkNtaEZpWVBpSjQ5ZXlJL1B4K0ZoWVVvS2lwQ2NYRXhTa3BLWURLWkNKUEpCQnM5QkpMak9Ca0FPUUJsVVZIUkFKVks5ZlhqZk5Ja0ppWlcyQng3L2ZwMWhJV0ZZZG15WlpneFl3WnUzTGlCc0xBd0RCOCtIRU9HREpIZXQyUEhEb3dhTlFwWHJseEJWRlFVV3Jac2lRMGJOa2k2b2oxNzlzU05HemR3NHNRSktaODJZc1FJckYyN0ZpUkpvbWZQbnBnM2I5NERuNEJ3MmFObCsvZnZSM2hrZzZmaXR4b01obStmajJwOEJEejl0NmhyWUFSUEJWNUNFRVFwRDNDRWxWZWhvamlaVENZcVVIRzJUQjRhclJZNm5RNmVucDd3OGZGRlVGQVF3c0xDUVBUdTNSdDVlWGtvS0NoQVVWRVJpb3FLVUZKU2d0TFNVcGhNSnNKc05zTnF0WklzeXhJMmVnajA0c1dMdldKalkvOEFFUDYwbm93cEtTa29MaTVHeTVZdHBlY21UWnFFYmR1MjRkaXhZdy9VNjd4eDh6L2s1T1NBWVJpVWxqeWRJMXBLbFFvVVJjSEwweHRoWWJVbDhsUm54bkdjc0diWnNGcHJiczJVS2hWa01obTh2YndSRmhiNjFBTWJ4M0hYUGhzemV1TGFOYXVMQUpTZ1ROZkFDRjVhcndTQVdRQTJScERXWTRWd2sxTW9GZnhjcUVvRnRVWURuVllMTjNkM2VIbDV3OS9mRDhIQklRaVBpSUJNcFZLaHBLUUVORTNEYkRaRExwZkRZckU0VmtodFExSUdBRE53NE1DQzNyMTcvNlJVS2ljOWpnczhiTmd3SkNZbTNzOEJ3cFVyVjlDM2IxK3NYcjBhVFpzMlJVcEtDdWJQbjQvNGVON3R2cE5La3FQcDlYcjQrOS9kNkxQSlpNYVpNMmRBeVdUUXVibTc1UGVLak1qTnkwWFd5VXcwYmRJVU5DMTNldXhPbkRnSmtxS2cxZFg4bWhVVkdaR2RrNFBNckV4RUM4M2FGZG50Sjd5Zk1UYzNkL1BhTmF0Tk5pR29XUVF5QUJZT1lBZ0hiUVB4UHh6SGdXTTVzQ3dMbG1WNUpnK0J6Y05xdGNCaXNjQmlOc05zTXZQQXBsUXFVVkpTWXBkcms4bGtzRnF0b0NnS0RNT0E0emlKTnB6ak9BWUFzM256NXAvZmZQUE45d0RVZmR3V09DRWhBUWtKQ2ZmMUhUMTY5RUI4ZkR4R2pCaUJ0TFEwQkFjSDQ5TlBQOFhISDM4c1hVQTFiZW42ZEZBeW1Vc3dXVENOUmd1TlJvc01mUnJTMHRNUUZscmVTN3ArNHlaSWlucGdhMmE3VHpkdi9vZlFTbVQ0YWdVSFA4bmUydldsUzVlY2RBQTFtOXhhV1l0SEdhRWtCYmxNMUEzbHE1Nml0NmJWYXVIdTdnNVBUeS80K2ZraE9EZ1lkY1BEMGFqUnN5QTFHZzJVU2lVVUNnVm9tb1p0TVVFb0lvQ2lLTTZtbjAxcy9iRDI2dFVydDZTa1pPWFRmQ0hGeDhmait2WHJNSmxNdUhyMUtzYU1HVk5wQ0ZUZGxwMlYvZFFPVDFkbVdwMGJzckt5bmI2V2s1UHpVTlpNcTNORFZuYldVM3RNc3JPemt4WXZXbGdLKzRLQkNHNFNrNGR0aXdjZmlwS2daQlJIVVE3TnVNS1VnVnF0a2tETzI4c2JNcGtNcEZhcmhWcXRobEtweEwyMGZxeGJ0MjR0eDNFdWh0MkhjZ2U4OStIcHA4RnpZMW5HNldzUGE4MDBHaTBZSy9PVW5xdmN4VzltenpyaEJOVEVmRm81d1JaZTZaMTBtQWZsUjZma0FxaXBWRXBvTkJxNHVibkJ3OU1Udm42K0FBQ1pUcWVUS3FKQ3djQXUxeWFUeVRpcjFVb3dET08wWVRjMk5qYi9yYmZlV3FIUmFLWS80UWNHZXIwZUJvTUJWb2FCc2JCNjJFMjFXaDFrY2huOGZIM3ZXdHFQSUlDU0VoZVhXMFZXVWdIUDNjTXNydHpyOFNLU00wSE1Ud2F1NU4zYmhpTTh3QTJKQWhmbFd5Mi9veUEvSHpldVgwVlJrYkZTSUErckV3NDNkM2RrWkdRa3JmcHBSWVc1TlRocHlDVkprdVA3MW1TY1RFYnhvQ2FUZzZiTGRBNTRqUU1kNzYxNSswQ2g0THNMWkI0ZUhpZ29LSURSYUpTcW9XYXpXUUkzcTlVS21Vd0dobUhFcEozVTB5YmsycXh2dmZYV21pMWJ0cnhCRUVTTEp4WFVrcE9UQVlLRVJxdmoyVTJyVWR1NHFNaUlkSDBHMHRQVHExMEpmdGZPSFZpK2JDa01oZ3dFQlFWaDVhcTF1SHo1RW1MNzk1UGVNelorQXJwMjdlWkN3a2ZaRXBPQnEzbjMvdmtyZVNEbUo0TmIwckZhZHVmNnRTc29MaTY2NDNsOTQvcFZQTnU0NllsM2VyMlo3QVRVbkhwcmtKaHliWWZjNVpETDVKRFRmRE91UXFHQVVxV0NSc05QTTNoNjhYazIwV1NlbnA3SXk4dERZV0doYlE4YmFKcm1xd3dPWHBzTjY0ZWsxcng5KzNaelFVSEJqKzd1N2s4a3NPbjFlb0FnNGVkZk0yTEpZbkxab0U5RGVucDZ0WWt5cDZXbFljYjBxZmh5OHRlSWptNkJnZ0tlR2ljaUloSzdkdThEQUF5TWZiL0cxbTNaMGlWNHZYc1BPellUY2IvbXp2a0dLU24vZ0tacHRPL1FDWU0vR2lJTlg2ZW1waUpoN2h5a25FMkJRcUZBeDQ2ZDhHSGM0SExEMmRWcGQ5cm1pekV2UUM2WGd5QkloSVdGb1gvc0FMUnVIZlBBemtIaWZrRE5CdHlxeSs0RWFyYmc5dC9ObTF1dlhMbHN2WU8zeHBUUHJWR1FVUlFualU3SjVUd2RPRTJYZVdzNkxkdzlQT0R0N1dNM0FrbjYrUGpBdzhNRE9wME9hclVhS3BVS0NvVkN5clU1eTdjNXk3VjVlSGhzWmxsMjI1TUliQVpESmpSYVhjM25ZSFJ1TUJnTTFmWjlGLys5QUI4Zkg3UnVIUU9hcGlXZU9JSWdvRkR3ZDcyN2JVbTVHL3R4K1ZMazVKUlA0RSthT0FHMWdvUHgyKzlic0dqeE1odzljaGhKU1pzQThEMTVZOGVNUnIzNkRiRHA5eTFJU0ZpQS9mdjI0cmVOTmNlOVVOVnRKaTVZaU0xYnQ2Ti83QURNbmprZEczL2Q0UElrNzJCV3EzVlhtNWdYTGpqeDFDcjAxa2c3YjYwTTFPVENQS2hDcVlSS3hjdnN1YnU1dzh2VEMvNDIzaG9Ba0g1K2Z2RHk4b0tibXh1MFdpM0U5Zyt4U21vRGJKd05oYmpkaUJYNGFYeUx3V0Q0OFlrOE9JejFnU1NiTlJvdHJGYnJmWC9QNmRQSjZQNWFOOHlhT1IxNnZSN2RYK3VHN3E5MXc0b2ZsMWY1TzQ0ZU9Zdys3NzZOOWkrM1JXei9mamgzOXF6ZDYvdjM3VVcvOTNxamErY082UDkrWHh3OWNsaDZiZGpRajlEOU5UNjBIZm54Y0hSL3JSdUdmalJJQXBHMmJkdmh2WDd2UTZGUXdNL2ZIODJqbzNIcDRrVUFmTVhTMDhzTHZmdjBBVTNUQ0E0SlFldVlOdmozMzVxclQ5M05ObFVxRlZxM2pzRzQrQWxZdkdpaEhmSGlrMkJGUlVWSStuMFR4bzRaWFQwaDYvWHJPMkUvRTJvSGJCekhXVG1PWXppT1kxbVc1UWhBOHRaS1NvcTVUSU1CcWJkdW9hQ2dvSXk5UTZtQ1JxT0dRcUhBZ3ZtSk9IandMNmpVYW50Z0N3b0tnbytQRHp3OVBhSFQ2ZURZL2xGSmxiU2MxeFlZR0hqWVlyRXNlZEtBcmJvS0JWWGFsdEY0MzkvUnRHa1VOaVZ0eGNjalJxRldyV0JzU3RxS1RVbGIwZS85L2xYNi9OVXJWL0Q1aEhnTUhqSVVXN2Z2eEp0djljS29rY01saXB1Yk4yOWd5dVF2OGRsbjhkaXliUWRlZmZWMWpCOC9UaEtsU1VoY2dFMUpXd0VBYytiT3c2YWtyVWhjc0pBLzRVZ1N2ZnYwaFllSHAzRGlYOFBoUTRmUXNpVlBBdURqNDRPRXhBVlFLbFVTRUo1T1RrYmp4azFxYk0zdlpadlJMVnJDYkxGSWdQdzRtZU1RdmZoM1ZsWVdCc2IyeDVVcmw2dmxSbEphV3JwbS9Qanh0eHhBemVUb3JmRmpVenllTUF3RGtxVEFzZ3dzRmdzL1NSQWVqc3lzVExBY0I2VkNDWlhRM25IczJGRW9sVXE0dWJtWDJ6YXBVcWtRRUJBQWIyOXZ1THU3dzdiOW96S3Z6VmxmRzBFUWxuUG56cTBFY052bGhEKyt0bVZMRXRxKzFBNnRXOGRBb1ZDZ2M1ZXVhTkN3SVhidTNBRUE4UGIyd2JMbEsvRk1vMFlnU1JLdnZ2WTZMR1l6YnQzNnI4cmJPSGYyTERxMmI0ZCtmWHVqUWNPR2VMSHRTMDdmdC9ENytWQ3AxZWphN1pVSDl2dXJzazJDSU9EbDZRVmprZkhST1hBRW9QMGdDbTZqL3dkQ0tZUHF0ZnB3RzljR2hKdkM3bTJqUjQzQTZlUlRBSGpHM084WHpBY0FlSGg0NEtmVmE5SHYvUStxWTI5dUh6dDI3SzhLUERYYjNqVVc0SE5yRkVWeEhNZHhGRVdCWlZsT29WQUl3KzBxZUh0NXdXZ3NoRW9vR09UbDVjRnNNdUhGRjErRVhGNSt1b1FFZ0tDZ0lQajYrc0xUMHhOdWJtN1FhRFJRcTlWU0hzWVpBMGhGdWJhb3FLaXJ4Y1hGUHp6cEYzL1h6aDFRV1Boa0N0cnE5WG9FQnRwMzVkZXVIUWE5UGgwQW9OVnFjZkxrQ2NSOUdJdmU3L1RDKysvMWNlb0pWR2FObm4wV08vL2NpNS9YYjBSNmVqcVdMUzN2Nks5YzhTUCsvdnNvcGs2ZERwbE05a0IrZTFXM3lYRWNjbkp6b0gyRWVnaVZIU05BcU9SZ2Mwcmd2ZlExcU45b2lOSS9yOEw5VTN2cXhDRkRoMlBxMTFPUW1EQVAyN2R0UmQvMytBcTVlRzFYaCtYbDVmMlNtSmlZNitDcG1aem4xaml1VE1vWWtNa29LSlJLbU0xbVVDU1BOY1hGeFNBSVFuQzZGRGg4NkJBR0RJaUR6czE1bzdVTTRLbC9Bd0lDa0pPVFUySHJoOFZpRVdheXJKekE5c0d4TEF1Q0lGaU80d2piWEZ1Yk5tMVdIajkrdkIxSmt1MWMvcy9qWi83Ky90Q25wOXZmZm0rbklpcUtiMFU1OE5kK3JGNzFFK1o4TncvQklieG8yWXN4THpqMWFoekJ6bFJhaXUzYnQ2RkxsNjVRS0pVSURBeEUrL1lkY1BEZ0FidjNiVmovQzNidDNJRzVDZlBoNXU3K1FINzMzV3p6K1BGam9PVnkxS3RmLzRFZkgwWHJFTGpIdnlqOWJmazNFN21mN0lTOG5qZEt0bDJHOVhvdWRNTmJJbmZrRHBpUHAwSDdnWDBMVVhoRUJEcDI2b3lWSzVaajVxeHY0T1oyNzFNWWNya2M3ZHJaWCtZN2R1dzRNSHIwNk9OVjhOWVlBVDlZcTlYS0NaRWdLSm1NVXlxVUlBa0NOMjVjbDRZSGVEWVBEVTZmVHNaTDdWNUd2UVlOOE8vRkN4VURHd0NFaElRZ0t5dkxhZXVIQ0d3aXVERU1JejJFR1ZJV0FDSDJ0U1VuSjVzTkJzT1NnSUNBcHhMWWZ0MnducS95Y1J6YXZmei84SDcvV0FCOG04TlhrNzVBWVdFaG1rWkY0ZERCQTFJdTZrR2JiWkdDWTFsWXJWWnB3cVRiSzY5aXlPQTRkT2pVQ2MyYVBZKy8vdHFQYzJkVDhOblljUUI0Z1JHQ0FFaUtRbjUrSHJadTJTSjhqLzFzYkdCUUVJNGVPWUs2ZGNPUmw1c0xYejgvMEFvRmZscTVBdm41ZVhpM2QxOFVGUmx4NE1CZmFOS2tMSisxWlhNU052MjJFWE1UNWo4d25ycXFidE5rTXVGMDhpbk1tREVOY1lNK2VpaVU3cVpEdDJEb3RycjhNYjJlQzdxSlArVFArY0Y2TXcrcVYrdkJjamtiY0RndU8zZjhnWDE3OTJESzE5UHd6ZXhaK0hyYWROU3JkMjhBYmJGWXNIT252WmI2dFd2WHRoWVVGRGhPRjRnZVd6bUdYSXFpUUZJVXdIRlMzNnhjTGtkQVlDQTBHZzEwV2gzKytlY00vUDBEUU5NS1hMMXlCWVVGaGJqNDd3WGs1R1NESkVuSTVYTDBldnVkOHNBbWhxUzV1Ym5JejgrSDBXaEVjWEV4VENhVEhialplbTBNdzNBY3gwRjRTTk1JQUN5QmdZRUhUQ2JUZkpxbWh6eE5vSlo4NmhTMmJFbkN3aCtXZ0tJb2ZESnFCRUpEdzlEdTVmK0h1WE8rUWZzT0hkSHp6YmR3N08rak9PVGdwVHdvYzJ6UW5URjlLbVpNbjRvT0hUdmg4eThtSVRLeUhpWitPUm5mTDBpRVBqMGR0VU5ETVhQMnQ1S2FVWmV1M1hEMmJBcGkrNzhIaXBMaDllNDlFQmxaRHptNU9YYmJHVFZxTkdiUG1vbmx5NWFnZHUzYVdMSnNCV2lheG95WnM1R1lNQmMvcjFzTHVWeU90aSsxay9JNkRNTmcxa3crREh5bmx6MzMvc3BWYXhBUVVQMjloRlhkNXJBaEg0RWdlSUxGVDBhUGVhQjliRld4a3UyWDRmYkovMEQ1cUpIVmV5TTBiejREOTg5aWtEL2pvTjM3VWxKUzhPMmN1ZkR6OTRlYnV6dE9uamgrejhCV2JoOUtTbjRjTjI3Y0RRRzh6STRGQTFRd1pRQ0FzMWdzMEdpMW5OeEd3MEF1cDVHV25nYVpUSVk2ZGVyQ3o4OFAwMmZPUm9QNkRlRGo2NHVGMzgrSFZxdXpBN1Z5d09idjc0L3M3R3prNWVWSndDYU9XWWtlbTQzWDVoaVMyazBqRUFSaDNyTm56L0pPblRyOWp5Q0lxS2NGMkk0ZE80b09IVHBKellLdnZQSXFqaDM3RysxZS9uOUlTZmtIRXdWRm9QQ0l5QnJmbDA2ZHU2QlQ1eTdsbm8rTXJJZS9EbGF1WTlxNmRVeUZGNjVDb2NDRXp5ZmFQVGZ3dzdoeTcydlJzaFYrMmJDeDNQTVJrWkg0YnA1enlpaUtvckQvd09FSGVzeXFzczA3cmRmOW1rNVhEWDJTREllQ21ZZWtQNDNMVHdQTFQ1ZDcyeWMyckxsTm0wYWhhZFBxdVR3NWpqdnp4eDkvT0JZTWJITnJaaW0zUmhDc1FQbk5XYTFXRGdDVVNpV24wK21rV2RDaW9tSmN1bmdSL3Y0QjZOQ3hFOC9rSVV3WStQaFdQaHBXTGp0YXExYXRjcmsyMFdOejhOcWtjSlJsV1Z2VmVJYmpPQktBdFV1WEx2cnM3T3dmdkx5OEZqNU5YcHR0ejZ2QVl5Y2xuR3V5SWRabGo2OVJGSVdpSXVNalFXamc3ZTE5VHltU3RMUzBqV3ZYcmpVNkFUV1RIYWp4bkdzc1FZQWpTWktuOXBielBXcmkySlNDcHVIdDVZWDY5ZXNMdEVTKzhQRHdnSStQajkxa3pxREJ6Z1BDY3Z3Njd1N3VjTmJiVmtIakxpZlNHMVhVdE92dDdiM2RZckVzZmxwTzBPYk5XMkRYenAwb0tTbUJ4V0xCdHExYjBFTG8wV3JhTkFyYnQvRW56T1ZMMWRQL3BGS3BYYWh3bDJ2ek1OZXNvbTM3K2ZtaDJGaHhsWjBMOTdoL2o2b2F2a00wdGRvK3QxaGFXcnA2NU1pUkYyMUNVSk9EdDJaWE1DQUlnaU9FWm44WnJ6akZ5ZVV5WVJhVWxtWkIrU0YzZ1NYWDJ4disvZ0dTZHVsZGVXd0FYMGdRdlRaYnFuQkhyODIyaUNCNmJTeGZCbU9FU2lsSkVBUjE2TkNoWlczYnRuMmVJSWhtVDlLRk0rQ0RmaUFFN2pWZlh6OGtKQzdBODgyYm8xUG5MaGowSVY4d2FQUGlTMmpYN21VQXdQQVJvL0RseE0veDY0YjFDSStJNEJPbVQ5Q2QvbEd5SW1OaGhhMEw1RU5hc3lKaklhZ0tXa2dDQXdPUm5wNk96SXgwcUFXaUJUc2JHZ1V1TWZtZVowYTVjQTlnYVBWbGhPclVqWkFHNFRtT083MW56NTY5VHZKcXR1MGRqa1VEZm5SS0hKdVN5eUNYQzU0YkxZNU5sUTI1ZTNsNndjL1hyOG95bFU1WFdTNlhJemc0Mks2SVlFdHBKSWFpanUwZlRnb0pWZ0NXZHUzYXBXWm1aaTcwOGZGWjlEaGVKRm9uK1k5dGYreXE4UDI5M242blhESVRBUEx5Y2pGejlyZHdjM1BEbmoyN1VWSlNVcVZ0M1Nsc3lNN0pjUUdiZ3htTmhmRHg5WEg2bW8rUE43S3pIL3lhR1kyRjVRZ0JiSzFaczJZd0dBelE2L1VvS3N5Mzc1UFVBaGhiRzBEdCs5aURiT0J5ZHZWZEYxb050Rm9OYnQ2OHVmSEhIMzhzcUNnRWhZT3lPNStWRVpUdk9BNGN5M0ljeTRKbEdUQ01sWDlZTGJCYXpMQ1lTMkV4bDhKVVdneFRhUkZ1WHI5eTc4QUdBQUVCQWNqTnpiWHoycHpsMm13OU5vZENndWkxV1FpQ0lIMTlmWGVXbHBiT1ZTZ1VIejl1RjRtc211N3dwU1dsR0RONkZLLzhydFZLN1JPMmQzUm5YZFNWV1dob2JXUm1HcENoVDROVzUrYlNQREFXd21nc0JHTzFJclMyY3hBSUN3MkZ3ZkRnMWt6Y0o1WmhFQlphT1RENStmblowZTg4NnBhZm43L2twWmRldWxTUnQwWVFoQWhzREVFUWpNamNJYXBPMFRRTmxVb2xlR2RsZE45ZVhsN3c5UzFUbldyUW9BRWFObXhZOVd1MnNoZHIxNjVkWVYrYm85ZkdzaXpoVUVnb1Z5VmR0V3JWMHY3OSt6Y2lTYkw5NDNTeCtQbjVJVjJmY2Q4WFFGU3pabGk0cU9KUjJxSWlJd0lEN2s3TWhTQUlORy9lSE5kdjNFUk9UamJ5Y25KUVd2cDBraytxVkdxUUZBVWZieCtFaG9aVSt0NFcwZEc0ZWZNL1pHWmwxZWlhcVZScVVESVp2TDI5N3docWo1dFpyZFo5RXlkT1BPQUFhcVVpc0FtZ1pwOVhFN1FNUkNWM3VWek95ZVZseEpHMkFPZmg0UUZ2YjI4RUJBU2dkdTI3V3p2aVRvSWp0Mjdkd3ZuejUzSHQyaldrcHFiQ1lEQWdKeWRIQWp4SExWSUI5QWlXWlFtV1pTbU80eWp3V3FRMHgzSEtHemR1dEFvTkRaMEw0TEZTSHpsMUtoa0VRVUNqMVVGZHpYZjQ0aUlqaklVRkFMaHFKNXAwbWN0cXlOSVBIVG8wT3lZbTVwWUFaQ1hnTlVLTFlLOFBhaXVseDloNmF3cUZncFAwUVRXODBMR0hod2U4dkd6RVdlcld4VFBQUElPUWtKQzdpN0x1OUlhUWtCQkpVTmt4MStiWStpSEtZbkc4MlU0a1dIbm5naUREd3NLT0Z4UVVKT3AwdXFtUDAxRnMxaXdLNmVucE1CZ3lVVmlRVnkwc0hBRGZ2eVNUeVJBVUZJaUFnQURYNWVLeXg4SnUzNzY5S2lZbUpsVUlNOFhRczlSSkNHb1Z2RFZwMEYwaWpSUkNVVnVhYjFHL1FBeEZhOVdxZGRlZ1ZpVmc0L000b1U1emJVNTYyc1JDZ21Odm16aHVaU0VJZ25KemMvdlpaRExWcFdsNndPTjBNQU1EQTZ1TjNkWmxMbnRjeldnMHJnNE9EajRGKzlZT3h4RFVZaE9Dc3M1QzBJcEFqVmQxOTBGUVVCQkNRMFB2YVIrcnBCT24wK2tRRWhKaVIyOWt5N2dyRHFrSy9XMTJ2VzJDMXliMXRva0xzV3ZYcmlVc3krNXhuU1l1YzlsamxWZmJ2M0Rod2oxd1hnR1ZQRFk0eklNSzVKR2NMYWpSQXNXM0dJN3FkS0lvQzU5WEN3a0p1ZWVKRE5uTm16ZXJqb0k4VlpIVDdubnhPZkYxNFNFbThGaWhBNThRd2UyVlYxNUpPM0Rnd1BjaElTR2hBTUpkcDR6TFhQWm9HOGR4MTA2Y09KSDA2YWVmRmpvSlFjdUJtaUNBYkNlblo0c2ZGZUVJTCtSQ2dtVlozQTArMlFIYjNiaDZ2cjYrVGljUmJBU1dZVU1mVHBoTUpoQUVBVUc2VDJvQklmaGZSTFpwMCtaRVRrNU9ncWVuNSt5cWhzVXVjNW5MSG82emR1M2F0VFZ2dnZsbXFvTzM1aXdFdGRxMmRvamhwOER2S0JVTXRGcXRYZWdwVmo4akl5UFJ1SEZqcU5YM1BpRnlWMkNpVnFzUkdocGFib2EwZ3ZsUmptVlpRaXdrY0J6SENnVUYyNmtFMHN2TGEzTnhjWEdRU3FVYTR6cDNYT2F5UjlPeXM3TVhoNGVIbjdYeDFFcHRId1JCbUd4QnpURUVGU1FHeXVYVmJNSE5WOURXRFEwTnZTOVF1MnRnQS9nRWVrVjhiYzdHck1UR1hRSGNPR0VxUWN5M2tRRElWcTFhTFRseDRvUy9YQzd2NXpxRlhQWVVoM3JRNi9YSXlEQ0FZUmdZalk4R1EzTnBhZW5QNzc3N3JtMi9XcmtRbE9NNENkUTRqbU1GUmx5T1pWbU9ZUmc3dmo4eHNoTWZZcFZVb1ZCQXJWWkRMcGZqMHFWTER4YllBQ0E4UE56cHFKV1RhUVJPNkdjVFI2M0VXVkxiRmhEaW4zLytJZmZzMmJPNGZmdjJmaFJGZFhHZDRpNTdHa0V0T1RrWkhBaHBHc0wvRWRndmk4WHk1MDhyVit6S3ljbXhPQUUxMndrRGZteUtJRmdDWVBsMEZLL2VMakIzY0VvbEw4U2kwV2o1bmpWM0QzaDVlOEhmUHdDMWdvTVJYamRjMHRHNFg3dW5iNkFvQ25YcjFrVndjREQ4L2YzaDVlVmxWeWxWS3BXMitUZE9aQUt4VmJZUzNGVXIrQllRYytmT25WTXZYYnEwa09PNFk0L3pDYnBwMHlZb2xjcUtFeFZXSzBhTUdBRS9Qeis0dTdzakxpNU9VbmR5MmROcmVyMGVIQWo0QndROU1tTnhMTXVlUEhUd1lOTEVMeVlVT09UVVNvUkhxUjJvU1hSRUpGZStDbHArdWtEbnBvT0hoNmRFUlZRN05MUmFRTzJlZ1EzZ0ZXM0N3c0lRRkJRRVIyMVNKeXBYb3BxelhRdUlBN2labm5ubW1aUzB0TFFGSE1kZGVWSlA0SEhqeGlFcEtRbnIxNjlIVWxJU2R1L2VqV0hEaHJtdTdLZmNESVpNYUhWdWo4eitjQngzOWR5NWMrdjc5bmtud3dIVWJDdWdKanRRRTNyV1NGS2FCNFZjSnVma3RDaDBySUJLWlQ5bDRPUGpBLytBQUlTRTFMNHY3WVZxQXpZQUNBNE9SbWhvS0FJREF5WCt0a3JBRGJiOWJRSi9tMFFsTGp4TXdjSEJCM0p5Y2hJQVpENXBKMjlSVVJIbXo1K1AyYk5ubzIzYnRtamJ0aTBXTFZxRUZTdFdJQ3NyeTNWMVA4WEdNTXc5ZVdvWHpwL0RxQkhEcTN0M3NtN2V2TG02YStjTzEyRS8yRzRIYkFSQldEaU9zNGlDeHh6SENSeHJGRWVRSklxS2pNak56VUdtd1FBQ3ZOaTBScTJHMldUQ2diLyt3cFl0bS9IbnJwM3c5dmF1OXNiMysvYjc2dFdyaDlxMWEwdmc1dUhoWVNmaFp3TnVZa2dxOXNPeHprSlNBQ1lmSDU5dCtmbjUzd2tMV0tQV3FsVXJUSmt5QlMrLy9ETFVhalVpSWlMd3h4OS9ZTzdjdVFnT0RvYTd1enNHREJnZ3FTMk5HREVDblR0M3R2dU83dDI3WTlDZ1FVNi92MmZQbm1qZXZEa0FJRGs1R1NVbEpXamJ0cTMwZXBzMmJRQUFSNDRjY1YzZFQ3RVZGaGJjMCtmcU4yaUlpVjkrVloyN1VxclhweTl2MDdyVmVaUzFkWlRhaEo2OHQyYlgya0V5SkVteEhNZXg0RGpJWkJUTUpoTlVLalVYRWxJYi9nRUJTRTlQaDFxdGdWcWpRVXJLUDNqbDFWY3hldlFZUkVSRTR2Q2hROVcrbnZmZE8wWVFCQ0lpSXB3cVdqbXJqb290SUFBSUFFNkxDUnpIa1I0ZUh1dU5ScU5HbzlIRTEvUkpOWDM2ZEd6ZXZCa3hNVEVZTkdnUWV2VG9nZTdkdStQQ2hRczRmLzQ4MnJWcmg2NWR1K0tOTjk2NDYrL3UyYk1uY25OekFRQzNiOThHVGROMm5GeHl1UnplM3Q1SVRVMTFYZDB1SzJmWjJkbVkrdlZrWkdVYVFKQWtCZzhlZ3BhdFhrQnFhaXBHalJnT2k4VU1EdzlQTEYveFUxbTY0N05Qa1piR2E1Ym41ZVZCcmRGZzdicjFBSUNyVjY4aVllNGM1QmZrdzh2VEMyUEdqcE5FZWdCZytiS2xpNy80ZlB3cEIxQXJ0UUUzdmxnQVdJUnJsaVVJc0FSSmNBUkhnT000VGlhVGdXVlp6dDNESFFxRkFnUkJRSitlRHJWS0RZcWlvRmFyVWI5QlF3VFZxb1dpSWlNT0hUejRNcm5Fd0FBQUlBQkpSRUZVNkFFYndJOWNoWWVIbHlPakZNdThUZ2JrYmZ2YklJU2s0bVNDQ0c2RVZxdGRXVnhjckZLcFZDTnI4dVRwMGFPSHBJMzR4aHR2WU5teVpaZzZkU3AwT2gxYXRteUpaNTk5RnVmT25ic25ZSHY3N2JlbGZ4Y1hGenN0TENnVUNwaE1KdGRWN0xKeTl2TzZOV2pjdURINnZmOEJybDI3aGdYekU5Q3kxUXNJRGc3R0x4czI0dkxsUzVnNlpiTGRaNmJObUFVQXlNL1BROXpBV0l3Y05Sb0FZRGFiTVhYS1Y1Z3lkVG9DQXdPeDQ0L3QrSDdCZkV3U0JJYnk4L04rK09MejhZZWRoSjRsZDhpcmNTekRpRlJsa010cFVad0ZSVVZGTUFwc3hrb1ZINzFwdEZyNCt2cGkrN2F0eU0vUFIxNWUzcU1KYkFDdmNHVkxJVzdidEd2anNkbjJ0VW5neHBhcDZqSUMwRW5nOXRaYmJ5MVp2MzQ5clZRcWEwekd6M2I2UXFGUVNQbEQwV2lhcmhiZ1VhbFVNSnZONVo0M21Vd1BSWi9TWlkrK1JiZG9pWVM1Y3dBUWFOR2lKV1ovTTZkS24yTlpGbDlPbW9odXI3eUdGaTFhQWdDdVg3K0cxTlJiaUIvTDk4S3pIQXVOb0YxUVdGaTQ3SjFlYisxSCtha0MreERVUmtKUEZEdG1HSWFUeStVYzc1eUFvMm1lTERYVFlJQkdvMFYwZEF2OC9mZFJ1THQ3UUtWVWdtVlpyUGh4T1hyMWVoc05uM2tHNDhlTmZYU0JEUURDd3NMc3RCRWNweEZzaUNoaDQ2MXhBdmlKa3drUW12MUFFQVN4WmNzV1l0cTBhVXZpNCtObENvVWlyaVpPSHBrVEh2cUsxS1NjUFcreFdLcTBuZURnWUpTV2xpSXZMdzhlSGg3U1o3T3pzNnZNNWU2eXB3ellvbHNnY2Y1Q0hEdCtEQ3RYTEFkTjAvaHk4dGQzL056U0pZdWdWQ3JScCs5N2R1ZHBRRUNBWGRnS0FFYWpjY1dFK0hGN1UxTCtjZXhUY3dRMU96WmNvZG1lb3hVS2pwYkxZYlpZUUpFa2FJVUNGRVhCMTljWGRlclVoYnU3QndpQ1FHQlFJSFJhSFJpckZSTStuNGp3OEhCY3ZQaXZkQzA4c3NBR0FQWHIxeStuUmVvWWpqcDRiU0s5RVd4eWJveVFneU1JZ2lDKyt1cXJQRjlmM3lVREJ3NGtGUXJGd0lkNW90RTBYYzUxdm5UcFVwVTRvNktpb3FCU3FYRGd3QUc4K3VxckFJQ0RCdytDSkVtMGF0WEtkUlc3ckp4Tm16b0YwUzFhb24zN0RtZ1IzUUp2OXV3QmxtVXI3ZmM2ZVBBQTl1L2JoNFdMbHRqZGlDTWlJbEJRVUlDLzl1L0RpMjFmd3RXclYzSHE1SW1menA0OXUyZmp4ZzBsTnA1YWljUERSQkNFV2NpcDJiSGhNaXpMeVNnWlpESTVTa3BLT0hjdmJ5aVZTdWgwYmxBbytQK1hta3I1SnR4YXdRZ0xEVU5BWUNBVU5NM3Y2NEVEYU5LMDZhTVBiQVJCb0g3OStoS3dPWHBzRE1QWWVteTI0QVpoRkFOQ3ZzM3VPNGNORzVaTjAvU1NmdjM2NFdHQ1c4dVdMVEY3OW13c1c3WU16WnMzeDZKRmk1Q2VubDdoKzlldFc0ZmMzRndNSGp3WUdvMEdzYkd4R0RwMEtIUTZIV2lhUmx4Y0hQcjM3dzh2THkvWFZleXljdGFuejN1WVBYc0cxcTFaRFpabE1lcVRUMEdTcEYzeElEOC9IMi8xZkFQTm5uOGVZOGVOUitLODcxQmFXb29oZ3orVXZpZHh3US9RNlhTWU5tTVd2dnYyRy95dzhIdlFOUDJUaDZmbm54dlcvMUlFKzBLQmJRT3V5WEVPVk9wWG95Z1FESU9Ta21LVWxwWndhclVhbmw1ZVVLbFVxRmUvUG03ZXVJR2pSdzlEcDlPaDE5dnZJaVE0QlBYcTEwZjgrTTh4ZWZJa1dNd1doSVNFWU16WStFY2YyTVJjVXIxNjlld3FwTGE1TmlHdlZxNllBUHRLcVMyNEVRUkJFSEZ4Y1prbWsyblJ3SUVEV2FWU0dmY3dUclRYWDM4ZEkwZU94T2pSbzhHeUxQcjE2NGNCQXdhZ3ROUjVaOHFHRFJ0dzQ4WU5EQjQ4R0FBd2UvWnNXSzFXZE8vZUhTUkpvbWZQbnBnN2Q2N3JDbmFaVXd1cFhSdHo1ODEzbXRiNFpjTkc1emZUWDM2dDhQc2FOR2lJaFl1V3dHZzBycGcxYzhhZVpVc1hWd1Jxa3FjbWdocEprZ3hRUmhvcG95aE9ybFNDcGhVYzMzd3JpTEtvTlhCemQwZGtaQ1Q4L1B3UUZGUUxZWFhxb0c1NE9KUktKWjU3cmpGK1dMUzBSdGZ0anBvSDkyTVpHUms0ZCs0Y3JseTVndFRVVk9qMWVtUm5aNWZUU3hCQ1YwSUFRRUpnNFNVNGppTnROQlBrSE1jcEFDZ25USmpnSGg4Zkg2dFNxWWE0VG4wK1VYemo1bi9JeWNrQnd6QW9MWGs2UjdTVUtoVW9pb0tYcHpmQ3dtcFhHcTV4SENlc1dUYXMxcHBiTTZWS0JabE1CbTh2YjRTRlZVd1J0bi8vZm9SSE5uZ2c2MVJZV0xoc1F2eTR2VGJocHpOUXMyWHNzSWlNSFdKelBVWEpPSUhlbXdjMXBiMjRzYWRubWNwVWFGZ1k2dGR2QUY5ZjN3ZDJMdFFvQjVxL3YzKzU0WGduRlZMWTVObWtTcWx3d2RyMnVJbUZCVXlaTWdVblQ1NzhZY09HRFdhMVduM1ByU0FkT25UQW4zLysrY2hjbUhxOUh2NytkemY2YkRLWmNlYk1HVkF5R1hSdTdpNzV2U0lqY3ZOeWtYVXlFMDJiTklWWW9YTUV0Uk1uVG9La0tHaDFOYjltUlVWR1pPZmtJRE1yRTlGQ3MzWkZkcnVHK3hrTENncCtHRHBrOFA1TGx5NmFLd00xbEZWQUpUMVFnVGhXVUpvaUlJeE9TYXdkSkNWUWYxTVU1RElaeFBsUXRWSUZzOGxVNDcvdGdRRWJ3SXZCaU9CV1dYVlVySkFLdld5YzFXb1Z3WTJ4RFV0RmNOdStmVHMwR3MzU3dzTENVcTFXT3hLQThtNzNiZGV1WFkvOWhaeXVUd2NsazhFL0lBZ3VBelFhTFRRYUxUTDBhVWhMVDBPWUV5TFY2emR1Z3FTb0I3Wm10dnQwOCtaL0NLMUVocStXVFp0Uk5WdHBkbmIyNGxZdG14OUdlZmJiaWp3MUt3aUNJUUNHRUR3MUdVVnhNcG5ncVlsRDdXbzF0Qm9OZEhha2tZR29YVHNVa1pHUkNBMExlK0Rud1FOaHJRMFBENjlJWUZrQ09KdTdxWlJyczFxdDRtdE93UTBBZERyZHF0emMzR0lQRDQvaEFIeWZ0Z3M1T3lzYldqZDNGNkk1bUZibmhxeXNiS2ZBbHBPVEE5MURXRE90emcxWjJWbVZBbHNOV1paZW43NDgrdm1vVTdDZi9YVDAwdXhCRFFLb0VTUkhFaVJIa1FKYkIyMURHQ25NZjJvRnZRSStCUFZEclZwOFh1MWhnTm9EQXpZK2FkbkFLYkE1ZW0yaTV5YUNHOEFQQ0ZjQ2JweW5wK2ZHakl5TUlsOWYzNDhJZ29oNFdpNWVqcnYzNGVtbndYUEx6OHR4K3RyRFdqT05Sb3Y4M0p4NytpeVJuQWxpZmpKdzVlNjY5RGx3VjIrYXNsYTMvbS95K1R0NGFxWnlvRVlJb0VZU0FndXVESEk1elNsb2thbERBRFdKQmRjTGJqb2RMT1pTNU9WbUl6TkRnOHlNTktmckVGWW5IRzd1N284L3NBRkFvMGFOeW9GYkJjQW1nWnVZY0tzSTNNUy8vZjM5LzdoKy9YcEI3ZHExNDBpU2pLNStFT0haVFEwR0E2d01BMk5oOWJDYmFyVTZ5T1F5K0FtMHlIZDFzaE5BU1ltTHk2MGlLNm1BNSs1aEZsZnUrWGdsSmdOWDd3N1VXSEFuejVYY1d0ODVkZloxbEovOXRHL3BzTXVwbFFjMW1RQnF0SUwzMUJ5TEJhTElzZFZpZ29lSFI2WEs3VVZGUnR5NGZoV05telo3TW9DTklBZzBhdFNvUXEvTkdaalllSEJPd1UzNFhvN2pPSzVPblRxSGs1T1Q4NTU3N3JrQkZFVjFyazVRUzA1T0JnZ1NHcTJPWnpldFJtM2pvaUlqMHZVWlNFOVByM1lsK0YwN2QyRDVzcVV3R0RJUUZCU0VsYXZXNHZMbFM0anRYOGJDUGpaK0FycDI3ZVpDd2tmWWlMc0VOUXZIL0htdzhHSlNuNHlGR1RiaHArUHNaNGtBYXVaeU9UVTdVSk9ERmdTT2xRcEJMay9qV0FIMVEyQlFFSXdGZVpXQ211MDUvMFNFb3FMSjVYSUozTzdnc2RubTJ5b0NOM0h3bGhORDA2aW9xSE1iTjI2YzFhMWJ0MHlhcHZ0V3h6N3I5WHFBSU9Iblh6Tml5V0p5MmFCUFEzcDZlclZ4VTZXbHBXSEc5S240Y3ZMWGlJNXVnWUlDbmhvbklpSVN1M2J2QXdBTWpIMi94bzcxc3FWTDhIcjNIblpzSnVKK3paM3pEVkpTL2dGTjAyamZvUk1HZnpRRUZFVUJBRkpUVTVFd2R3NVN6cVpBb1ZDZ1k4ZE8rREJ1c1BSNlRkaWR0dmxpekF1UXkrVWdDQkpoWVdIb0h6c0FyVnZIUEpxZUttditlVTMyb1YxZjVQMVdVQW1vbGZQVUJBTFlDa0NONzFWVHFrUVJGbDBacVBueGJSMWhvV0hJejh1dTBlTlVWU01meGthVlNpVWFOV3FFOFBCd0JBY0hTMExNdGx4dVlyT2ZRcUdReEZWbE1obG5JOFRNMkhLNUNUbUNVZ0FsYjd6eHh1MG1UWnA4YXpRYXZ4RmV2eTh6R0RLaDBlcHFmRjAwT2pjWURJWnErNzZMLzE2QWo0OFBXcmVPQVUzVDhQSHhrVHhuUVFxdHdwblk2ckFmbHk5RlRrNTJ1ZWNuVFp5QVdzSEIrTzMzTFZpMGVCbU9Iam1NcEtSTmZQakVzaGc3WmpUcTFXK0FUYjl2UVVMQ0F1emZ0eGUvYmZ5MXh2YXpxdHRNWExBUW03ZHVSLy9ZQVpnOWN6bzIvcnJob1Z5MDNqOTJoOXZvLzBsL2V5VjBoYkpUQkFCWWM2MUYzN2UrTnZIM0wvSit5M2ZJcFJVTGo3THFweTJvZ1dCZ1UvMmtLRms1VUFNSFpHWm1vcmk0V01xcCtmcjZJaWd3Q0tHaFlhaFh2ejVvWVZSS1BNK2FOV3VHamgwN29uMzc5Z2dLdXJzcTlJb2ZsNlAzTzczd2RxK2UyTHBsYzVrM2FyRmc5cXdaNk5mM1hmVHYxeGNIRHg1NCtCNWJtWmVpUWFOR2pad054WmNMUzBXeFZkaFVTNFVUMG5GQ2dSUEQwbi8vL1pmVjZYUXJNekl5OUw2K3ZvTUlncmhuVVdZclkzMGd5V2FOUmd0andmMVR1Sncrbll4SlgweUEyV3hHY1hFeHVyL0doNWs5M3VpSmZ1LzNyOUozSEQxeUdJa0o4NkRYcHlNME5BeWpQdmtValo1OVZucDkvNzY5V0xac0NUSU5CdmdIQkNBdWJqQmF2Y0JmYk1PR2ZvUmIvL0ZDdHlNL0hnNlpqRUp3Y0FnU0Z5d0V5N0pvMjdZZHVyM3lDaFFLQmZ6OC9kRThPaHFYTGw0RXdGY3NQYjI4MEx0UEg5QTBqZUNRRUxTT2FZTi8vNzFRWSt0K045dFVxVlJvM1RvRzh2Z0ptUGpGQkhUcTNPV2hNTE5vK2pTR2NWa3kySndTSVp6aHJ2MW56bHJ6d3MydnpzSmVUY29abjVvUWZoSldnQk5CamVVZEJ0S21VQ0RuYUtGUWtKK2ZEMFpRbXFKcEdsNWVaWjVhYUJnUGFvNlNlWFhxMUFGRlVkaTVjeWNVQ2dWZWZ2bGxaR1ptMnBGR09NNjlpbitucFB6RG4yUExWOEJrTWlFdWJnQ2ltajJQb0tBZ2JOKzJGYVdscFZqeDB4cms1T1JnMElleGFOeTRpVVF0bnA2ZS9uQThOdEYwT3AxVHo4M1QweE02bmM0WnhiaWRNSXlvbitEZ3Vaa0Z6NjBVUUxHL3YvOGYvLzc3N3lTR1lmYmU2MzVXVjZHZ1N0c3kzbi91b1duVEtHeEsyb3FQUjR4Q3JWckIySlMwRlp1U3RsWVoxSzVldVlMUEo4Umo4SkNoMkxwOUo5NThxeGRHalJ3T1EwWUdBT0RtelJ1WU12bExmUFpaUExaczI0RlhYMzBkNDhlUGswUnBFaElYWUZQU1ZnREFuTG56c0NscEt4SVhMT1JEQkpKRTd6NTk0ZUhoQ1lDbjBqbDg2QkJhdHVSSkFIeDhmSkNRdUFCS3BVbzYwVThuSjZOeDR5WTF0dWIzc3Mzb0ZpMWh0bGdrUUg3UVpqbHJnUGJENS9rYkwydmQvL2Z0Yy9OZnVQbFZDdXdaYjRzZEhxVUUvekFEaEFVRXlrQ056K3h3VnF1Rms4bDVDdis4dkh6STVES29WQ3JVQ2F1RHFHYlB3OHZiRzFxdEZyNitmcnluRmhhRyt2WHFRNnZWT2wzWHRMUTB5VmxoV1JhZW5wNTI3MW02WkJIV3JGNEZBRWhKK1FjZkR4OEtBTGh5K1JLYVJrVkJvVlRDemQwZEw3endQNXc0enVzOG5UbHpHbTNhdkNpY1R3VGtjaHFYTHBVZGgxa3pwejljWUFNQWQzZDNDZHhDUWtMc3dPME9GT08yWVNrcmhLYmluVW9FdHhJQXhjODg4OHlwbjMvK2VVcHBhZWx5VnhyNnpyWmxTeExhdnRRT3JWdkhRS0ZRb0hPWHJtalFzQ0YyN3R6QmgwTGVQbGkyZktVa2xmYnFhNi9EWWpiajFxMy9xcnlOYzJmUG9tUDdkdWpYdHpjYU5HeUlGOXUrNVBSOUM3K2ZENVZhamE3ZFhubGd2NzhxMnlRSUFsNmVYakRXY0JLOHdodmd5ak5RZFk1QWlTZTFPdUhYNVN1Ny9UYm1sZ09vT1FKYkNRR1VBb1NaZjhCS0NLcFNKTUNSSURpYXBqbVNKRkZTWE13VkZCVEEzY01kT3EyT24vMTBjNE83dXp0VUtoWGMzTno0bkpvQWFyb0tSRmhvbWdiRE1QRDI5a1pNVEF4WWxwWDREa1Y3NTkwKzJMdDNEeExtZllmSlgwN0MwR0c4ZmtQZDhBaWNQSEVjUnFNUkJRVUZPSGZ1ckhUVHo4L1BoMUtweE5tektmaHN6R2pRQ2hyNStma0FnS1RmTnlFOFBPTGhoYUsyNXVIaGdVYU5HbFY2RW9uL0Z4NGNRUkNFeFdMaGJPc01MTXR5dHYxdFlsZ0tnT3ZkdTNjYWdJVHM3T3diWGw1ZWd3RGNjNGIrd29YemlCc1lpMlhMVnlJaU1oSkxseXpHNXFSTmtwZFNrWDAzNXhzY1BuUUlPVGs1bURqcFM3UjVzZTBqQ1d4NnZSNFJFWkYyejlXdUhRYTlubWN4MFdxMStIUFhUa3laOGlXTWhVYTdNS0txMXVqWlo3SHp6NzFJVDAvSEY1K1B4N0tsU3pCZzRJZDI3MW01NGtmOC9mZFJKQ1FzY01xWlZ4TlcxVzF5SEllYzNCeG9IMUlQSVZka1NiODhmL2VxaHNlR25NSXhpZnhSQkRaVEJhR25CZUJFcFhhR0FNRUp3QVlLQkNlWHk2RlVxcmk4dkZ4UWxBd0IvZ0ZDOVZNSE56YzNlSGw1UWEvWHdOUExTd2cvRzl5eEYwME1SdzhkT29TbVR1aUp0Rm90QmczNkNDTkhETU03Ny9aRy9mcjh2R3lUSmszUnNWTVhEQnM2R081dTdsQ3IxRkNwVmRMbk5tOU9Ra2xKQ2FaTm40VjUzMzBMQU1qSTBHTnowdTlJblAvOW93RnNBT0RwNldrSGJqWWdWZzdZeEdPTHNpWmV3bWF1VkFRNmFhNE5BQ3VTNG5sN2UyODZmLzc4alhyMTZ2V2pLT3JsZTkxZnVWeU92LzdhajRqSVNCdytWRFhPOWhFalA4R0lrWjlnbk1CZytxaWF2NzgvOUE1VVRMZHZweUlxaW05Rk9mRFhmcXhlOVJQbWZEY1B3UUlQM1lzeEx6aTlJVG1DbmFtMEZOdTNiME9YTGwyaFVDb1JHQmlJOXUwN2xFc0FiMWovQzNidDNJRzVDZk5ydEpIelhyZDUvUGd4MEhJNTZ0V3YvOENQajVXeDd2dGJmMzV6dHgvalUxR0pPcnQ5Z1lDUWV0UUFnaVVKZ2lWQWNDVEhnZ0xKeVVCQ0pwTnorZmw1Y0hOM0IyTzF3bURJd0xQUE5TNmJLUER6aFZ2cUxmajYrcUYrL2YvZjNwbkhSMVhlKy8vem5HWDJ5YjRNeVlTRWtJUmN0dUNsd3JWaVhTNHVWRnNwdUsrWHFxMC8vZlc2SWxhOXJiVjFCWmNxeXExNlJhdTFldVVWYmRVZjlkNjZ3cjBnb2xHSkNZUWtKQ1FrSVNHUVpTYVptYk04dnovT2VVNmVPWmxKUUFGSnpQTjZIZVprTXBNWnpweDVuODkzTDBmcUtNZUlOWnY5N0xQUEFCanppTzJkcUJzYUd2REEvZmZpbnQvZWk3WFBQWXZKaFVVNDIxVEtsMTUyT1M2OXpFaHN1T2JxbjJMcTFCTEx5bk83M2JqbnQvZENFQVJFbzFHa3BxYmlyVGZmUkgrb0g5ZisvSnB2M3hTMXcyM216SmtvS1NsQlFVRkIzRmkvMU5SVXkrZm1kcnVaYVVyWjNGS2JXY3I4Ym9yTk5CMWdwdW1xVmF2dUhoZ1llUExydnRkL21ENERIMys4Q1hWMU94RGcwak0rM3J3Sks1YmZZdjM4NkNPcnZyWG8yWWhmRHJPN01RQlFYYmZhU2dIQTJlZjhDQjkrK0Q2MmJQa1lxcXJpdmZmZXhWZlYyM0RHbVdjQ01BYU1FQUlJb29qZTNoN0xSMEwxK0tEUHBMdzhiTjYwQ1lxaW9NdU05anFjVHJ6NHh4Znd5aXN2UTFFVTlQUWN3SVlOSDJIMjdObERwdkNiZjhVYnIxZmlzY2RYSDdVK2RRZjdtdEZvRkI5djNvUUg3cjhYUDcvMnVxTWVPT2pUQnArOS9mSGZyVDM3YjNlTVpub09BSWlZMDZSaUFCUkN6SUhHRkxvZ2lWUWtBcFVnVUJrQ0hFU2toQUIrZndyeTg0T1lWdjRQY0xuY2NMdmN5TWpJUkU1T0R2THo4cEdlbG82OHZMeFJvUVlZRVZRbVJCd09COUxTMG9ZMWFmMTA2eWU0L1pkMzRwUlRUOE1qanoyQm1xK3E0NEtIaXFMZ3BSZi9DRUtBV2JObVd6NWsxUXhrOVBRY1FFTkRBOHBLeTNEVjFkZmdsVmZYWWUwTEx4NDdpbzAzUzJmT25EbE1zWTJ3VVdJc0VFS3NOdU9ta3FOY2dxL09lclFEMEcrLy9YYjk5dHR2LzQrV2xwYTYvUHo4ZnlHRUhIY283OU1oeS9CNlBIanhqeTlnd1VrbjRhdnFiV1BHaDJaUDBIM3dnZnZ3NEFQMzRmUXp6c1MvL2VwdWxKYVc0ZGUvK1MzV1BMVWFIZTN0bUZ4WWlJZFdQV0pOTTFyMHc3TlJYYjBOVnkyN0FxSW80ZHpGUDBGcGFSbjIyOHFGYnI3NVZxeGErWkJ4Slo0OEdjOCs5d0ljRGdjZWZHZ1ZWai94ZTd6NnlwOGh5ekpPUHVWVVhQa3ZQd1ZnNUNtdWZPZ0JTSktFaXk4OEw5NU1mT2xsQkFLSFA1ZndZRi96RjlkZkIwS0F3c0lpM0hMcmJVYzFqMDBIL2J3aHNyZnlsSmI3NnRBNGxPSmtVMnJXTGNGUUh6VUFSaVVCaUE1UUtnQlVwSVJLZ2dCUkEyUWlVaWNrT05QU2gyby9mVDRVRkJRTTVhbVpnWUlkTzdZUGkzNG1XMDFOVFVoTFM4UENoUXNCQUo5Ly92bXdtUjhYWERnMDdDZ3pNeFBMYnh1YWY3Qng0d1k4L3RnanFLZzREZzg4dU1xQzVLSWZubzI2dWpvc3U5SlFjNys0NGNaaENsczZGcjk0cWFtcG1EVnJsdFVPaFJCaTNmTDczSDBXM0FCUXJxcEI1M3h3aVV4VHJhQ2c0TVBYWG51dDdweHp6cm5BNVhJdE85ajNxS2dxVHZ2bmhmajlZNC9naGh0dnhoL1dQSFhNSGNjenoxcUVNODlhTk96KzB0SXlmTFJ4NURtbUo1NjRJT2tYMStsMDRxNS8rM1hjZmRmOGJIamZ6M256L3lsaE04U1MwbEk4OXZqcWhIOWJGRVY4dU9GL2orcHhPcGpYSE8xNGZkUGw5eWZQa3h3SWgvLzAycjRQMzcvclFHVWZaM3JHRWdITjlLY3BBRFdnUmcyZ0VRcWRnRklDUWtVUUtpb2FKQUF5a1F5b1FZYmI0ekdTYi8xRFByWHM3QndqcGNQTVUvdmU5dzYrV3RHcTJQbWFhOEdDazdCZ3dVbkQ3cGNrQ2JmY3VuekU1eDZUWUdNZk5BODMrNVlBY0JiY0ZFV2hab1VDSDFTZ1hLVUNVMjhhQU8zODg4OXZCZkJrYTJ2cmwzbDVlVmNTUWtadHdxNXJHcjUvNGdJME5UWEZSWG9FVVlSK0JKdDNUcXp4dVVSUlJEZ2Npc3VYMUhYOWkxMjdkbFdlOG9NVGQ0QkxaeG9CYWpFeXBOSllkdzZkQUdhUWdFQUVvUklFeUJBc3FMa2d3K1gwd09QendlZnpXVDYxbkJ5alRLcW9NSEdlV3FMbDhYZ3hNQkErcU1jZHlTVWR5eCsyMSt2RjdObXpJWXFpdFkwQ09tb3FPQll4dFFjVm1HMnEyMDFUQUZvd0dQeGc3ZHExWDExd3dRWG5lVHllbjQzMi9qSXlNdkIvZi9HdjZPZnkzUEx6ZzlqZDNJUllMQWFxNjZpdHJVRmhZZEVSTzBadXQyZUNDb2Q0Ykw3Tlk1YnN0WE55Y3REUnNkY0NXeWpVLy93ZlgzaitvL3Z2dXpka1UybDg1SlBmZUtpWlppZDBFMmpVaUh3S1ZBS0JURVRxZ0FnSFpMaUlETGZEQTA5SkRueG1TZ2VER3QvOTFwNm1rV3hOS1M3QnJzYjZFZUhtOFhneHBiamt1d3Myd0NpL3NzUE5EcmtFSmlwVGIvWXFCY3I1M3BocHFwdW1xUVpBWGJac21iWnMyYkpuNnVycVBpMHVMcjVFRk1WRHlzbkl5OHZEcWFmOU15Ni85Q0trcEtSYVpVeEFmTHJIVjlYYjhNVGp2OGY5RHp5RXFTVmYvME5PZEtXZldFRFlITktiYUFuZjBqRUxoL29oSmtraG1UUnBFdHJiMjlIUjFycGhkMHZyMjB1WExHNUtvdEo0bnhvTGpNV0dWSm94UmNxNGNCczFuNElnVWtrU0lVbG1odzZIREFkckVtbk9LR0Q5MUN6ek16L2Z5Rk9iVm41SXFUWXBxYW1vT0c3dXQvNzVIOUdaQjRkelVVcXQrUWt0TFMzbzZPaEFWMWNYZW5wNjBOdmJpM0E0akhBNGpFZ2t3by8vSTl6Z1pxTHJPcHVsUUFDd2VRcWlDWGlaVXVvQTRBRGdCT0FzS1NseGJkbXk1VWVOdTNaZG1SczRPb00vOTNic3dkeEQ2UERSMU5TTTd2MzdKenJvRGp1T2Jjakt5a1JoZ2s0VFRjM042TzQrK3Nkc2IwY2JNak16VVpTZzBTU2xkRTluWitkL3pwa3o1NU9Pamc3RkJyVm9Jb1VHSzlwSlZCaU5JVFRURXFGc015dDBJRWtTSk1tYVV3QW5CemFQeHdPLzM0KzB0RFJrWkdRZ056Y1grZm41bURKbHloR3RKZjVPS3phTHdJUmc1c3laN0FNYXB0enN0K1kyTEdKS0NLRW0zTUFyTjJhYXdwaEdyd0ZRNit2cjFZeU1qTW9ubjN6eWt3VS9PR1Z4UmtibWxVZjZpaTdMOGlFOXA3QndNcnE2T3JHM293MCtmOHJFeklOUVAwS2hmbWlxbWhCcUFGQlVXSWpPenFOM3pOaDcwalV0SWRUQzRmRExiN3p4eGtlWFhYYlpnVkZVV3BSVGFOWkVkbE9sYVNiTWRBNW1Sc2RiMmRiSzI4MzFValBiZVdkblp5TVFDR0R5NU1rb0tTbEJlWG41bUQ0UHhveGk0MWREUXdQcTYrdlIzTnlNOXZaMjdOdTNEL3YzNzBkZlh4OUNvUkRDNFRBR0J3Y3Q1V2JPWENEY0dFQmV2UW1tZWhOTTBFc0FKRTY5V1FydS9RODJWRXdwTGw0cWl1S1pSK0wvMWJtM0haTUN1WWZjdG9oU2lsMU56ZGkvdnh1YXFpTVMrVzQybjNTN1BSQkVFVm1aV1Nnc0xCaFZiVFEzNzBiWHZuM1FWTzJJSFRPMzJ3TlJraElxTlVWUi9ydXFxdXEvNXMrZjM4SUJMUm5VRXBtZDZwRFphUUhObUUxZ0FzMG9aSTlYYUY2djE0SmFSa1lHc3JLeU1HblNKQlFXRnFLa3BBUlRwMDRkOCtmQ21BUWJBTFMwdEdEbnpwMFczRG83TzNIZ3dBSDA5dmFpdjc4ZkF3TUQvR2kvWVhEVE5JMll3NXZabUQ4R04yYWVzcEYvTWc4M0FNNVBQcTFha0pPVGUvN2g2dFE3RUE0aDFOOEhnQjcyUnBNVDY5aGJ1cTV2Yld4c2ZMdTB0TFRXVkZ4MmxSWkxvTktVQkNwTjV6WnFXakJKb2VZeDB6bjgxbnlDZENQeWFVS3R0TFFVQldZbHlWaGYwbGg5NHdVRkJUQ3JEbUFXeFZ1M2ljeFYwMFNsZ2lBUVFSQ2dLQW9saExDR2wvYkFnaFVwSllRdzA5UTZBWStmZTl6N0pTVWxteDUrK09FelVsSlN6aWVFZkczZDd2ZjdJVWtTOHZJbUlSQUlUSHpyeC9HaWxPNW9iMi8vNjhLRkM2dHFhMnNaek95K3RKak5oOFpEelJZY3NJWVhVMUVVcVNpSzF2ZEJsbVhLZXU0eHFIbTlYZ3RxUnBEQWJEdFVXSWl5c3JKREh2MDRBYllqdEhKemM4R2FVUEtBU3dRMXp2ZkdaaUVTUlZGQUNHRUp2WlFPRFRYVmJXa2hHZ0RWbkcrcW1QNDM1ZHh6ejMzcmpqdnUrUERXVzI4OVBTMHQ3WHhDU1BIRTEzZGlKUURhcnE2dXJyL2VmZmZkVzllc1dSUGxUTWxZQXRPVDNTcDJzNU9kaTh5WHhpYXkyMVdhTE1zVzBPeFFZd0VDbHM1UlZGU0Vzckt5WWUyRXhyd3AydFRVTk9iL0U1RklCSTJOalZhMGROKytmVmEwTkJRS1lXQmdBSU9EZzRoR281WlphaGJvRWxZenljeFNMbXBLYkthcFNDbVZtSW5LK2Q4Y0FKeTMzSEpMeWhWWFhMRXdKU1ZsNlRkcGFqbXh4aFhRR3ZmdjMvL21talZyUG4zMjJXY2pIS0NVSkVDTGNiQ3pSenVaVXJPaW5jejg1S3dVcTlzMFUydDhvQ0ExTlJWcGFXbm0zTThBQ2dvS1VGeGNESmZMTmU2Ty9aajFzU1U0aWJCanh3NDBOalppejU0OTJMdDNyd1U0RmxSZ2dPUDlic3ozeGdHT21GMTlDZk8vSVQ0MVJJUVJYRWdFT01meTVjdjlLMWFzT0RVakkrTmNRc2lNaWEvM2Q5S0hWdFBaMmZtM1gvM3FWMVhQUFBOTWRBU2cyVGZGTkR0VkRtWWFiM2JhVlpxcDFPS0FsaWp5eVlER1VqbUtpNHN4YmRxME1adk84WjBCRzF0TlRVMW9iR3hFYTJ1cnBkNE9IRGlBdnI2K3BFR0ZCSUdGdU1ncFUyOE1jaGpLZlVzS3VPTGlZc2ZHalJ0UHlzM05QVnNRaEJNbXZ1N2pmMm1hdHJtbHBlWGRrMDQ2cWJxMXRaWEJpUWVhY2hCQVk4K3pBZ01BS0IveFpDcU5EeEFrQ3hLa3hFMW5EeUFZREtLNHVCaEYzOUlnNHdrZjI5ZGNSVVZGZkZ1ak9CL2NLQUVHZGlWazZvMXFtbWJsdmNITWRUUFZXMXh3d2VaL2l3RndORFkyT3ZMeTh0NEY4RkZkWGQyY29xS2loYklzLzNqaTZ6LytWalFhZld2Nzl1My9NMmZPbkYwY3pIaVZGa3NBTlNVSjBQamdRRnlTTGEvU2VMUFQ0WEFNODZjeDA1TlA1eWdvS01EVXFWUEhWWkRnT3dNMndBZ3E4SDNiWEM0WCtKUEFEcmRJSkdJQkxoYUxXWkZUQmpjdXVFRDRrWCtzUXdpTWZDSVZnR0lxT0F0d0FCeGxaV1ZiQUh6KzdydnZ2anB2M3J3ZitIeStzd0VFSjVBd3BsMGZyZjM5L2UrOC8vNzdueTFldkhoZkVxQWxncG95a2tJekw1aDhsQjRzcHNXdGtKVHlBQUFUVGtsRVFWVG1CdWk2VG5WZGg2WnBWbDh5UlZHc0JIV202QndPQjhMaE1OeHVOL3I3KzlIYjI0dnQyN2RqKy9idGgrVVkrUDBwRUVYQlNobVpNRVdQb3QrdHJxNE96YzNOYUd0cnc5NjllN0YvLy80Ui9XNW1LVmJDNEFLWDFBdlROR1dsV1hGQkJwdUp5cHVxTWdESEpaZGM0bHE1Y3VYOG5KeWMweVJKT20wQ0UyTm5xYXI2Zmt0THkvL2NkTk5OdFgvNXkxK1Vnd1Nha2dCbzlxQUFnNWxPaUFDanhsT2dnaWhDRWtXSXJDUktraUU3WkRoa0I0eXA3S1pTYzd2aDhYcmg5L21Sa21xTXhzdkt5a0p1SUlCZzBBZ1NIQWwvV3BqTHdaeDdET1Znaml1d1hYVFJSWGoxMVZkeC9mWFhZL1hxb1g1ZnJhMnRhR3Bxd2cwMzNJRFBQdnNNNTU1N0xnb0tDcEw2M2JpRVhwaCt0NUdDQzJRVXdFbEpBQ2NEa0JjdFdsU3dkdTNhK1RrNU9RdS9TVDdjeERxaUY4Z2RQVDA5SDN6MDBVZGZMRjY4dUp1RFVpS2dLVW1BcGlZRG10a2prREpmR2hFRWlLWXZUUlFOb0VteVdSb2xPeUE3SEhDYVVITzdYSERINWFnWjZSeFoyZG1tK1RuNXFLaXB6cjN0eUpzVU9HWnlNY2VkS1NyTE10NTQ0dzA4OGNRVDFoVXFHQXhDRUFSVVYxY0RNRHAxQmdLQllUNDRleTVjTEJhREtJcFFGSVZsZFpORTVxbk5COGM2aFFpbWlTcHhKcXBrbnZBVzJOYXZYMThmQ0FTYUFieStiZHUyOHFsVHA1N2dkcnRQQXpCUjFmN3R3cXh0WUdEZ2c1cWFtcXA1OCtidFpqN1Znd0FhdjZtbVF0TVNtWndNYUlJZ1VFcXBtVjlwSk5xS2tnaEpaTFdlRW1UWllTZzFGaVJ3R3BGUHR4bjU5UHVOeUdkR1pnWnlzbk9SbDVlSHlZV0YxcXpOSTcyOFBqLzI3dDA3QWJZanRSWXNXSUFOR3paZ3k1WXRtRDkvdm5YL3hvMGJNV2ZPSEd6ZHV0VXE5alVuemNjQkxod09XMEdHU0NSaUFjNVViOVFlWE5CMW5ROHdKQW95YUFCRTg0b3RVVW9aMk94S1RwNDFhOWJuQUw0QzhQejI3ZHRuRlJZV0h1OXl1VTZaZ056Umc5bmc0T0JIOWZYMVgxUlVWT3ppMVZVU29La0hDYk9FUU9NREE3cXVVMW1XTVV5bHhabWVUcmo0ZEE2dkY3Rm9GRnMvK1FRWFgzSUpNak96a0dPbWN4UVZUWWtiUlB4TlYyMXREZDUrNjAxVVZNekI2V2NNTDVYMmVuMEk5ZmNlTTUvbHVBTmJSa1lHVGozMVZGUldWc2FCYmQyNmRiamdnZ3Z3NmFlZkloZ01vclMwRkI2UEJ6VTFOYWlzckVSUFR3L2NiamZLeTh1Um41K1B3Y0ZCU0pLRW5UdDNZdCsrZmRhZ0UwbVNhR1ptSmtSUkpLRlFDSkZJaElxaUNOYXhGd0FSUmRFQ25LN3JnbWwyaUdia1ZEUlBmR2FtU2dsQUo1V1hsMjhGOERtQXRWOSsrZVcwNHVMaU9SNlA1NFNKM0xqRHUzUmRyd21Id3gvdjJMR2o1dmpqaitlVm1jNkJhU1NncVJ6UTdPWW1pNXpUWkVCajZSdXFxc0xoY0VCa0hUa2swNEpnS3MzaGhOTTEzUFQwcDZSZ3puSEhJUmljYktSekZBU1JrM040bzU1UFBia2FqWTBOR0FpSGg0MWw1TmZSSEN6K25RTWJBQ3hkdWhRUFAvd3dIbnp3UVFEQTRPQWcxcTlmajVVclYyTEZpaFZJVDAvSDdObXpVVmRYaCtlZmZ4NlhYSElKQ2dvS1VGdGJpemZmZkJPeUxDTVlER0wzN3QzbzZ1cENhV2twWkZsR1QwOFA5dXpaZzRHQkFhU21wdEpZTElaSUpFSjBYWWZYNjZXYXBpRVNpVURYZFNwSkV1R2lxTVM4V2dzMk01V3ZhT0EzSG5UUzdObXp2ekNWM0t2cjE2K2ZOSGZ1M09scGFXbHpaRmsrQVVEcUJKNE9hZlVxaXZKeGQzZjNsNXMyYldwWXNtUkpONFlpa2NuVVdTS284UjAyVk50emRVNmhVYjQvR2t1d0ZTd2ZtaEhCRkFTQk9wMHVQajhOc3NNQmdSRHMzcjBibXFwQ2xDVE1ualViK2NFZ0tBWCszOXR2UVJBRXBLZG40SkhISHJlc2tGK3VXSTYydGowQWdKNmVIbmk4WHZ6NWxkY0FHSjF4bnZqOW8ranQ2MFZHZWdadXUvMlgxcEFlQUhqdFAxOUZaZVU2Ni9FQWNQVTFQNFBENGNDcWxRK09tUTk1WElKdDhlTEZ1TzY2NjFCZFhZMlpNMmRpL2ZyMW1ENTlPZ29MQzYzSGVEd2V2UHp5eTdqNDRvdHg3YlhYb3EydERjRmdFS0ZRQ0pzMmJVSkZSUVZ5YzNQaDkvdVJsWldGU0NRQ244K0hmZnYyUWRNMHVOMXVSQ0lSQUtEcDZla1FCTUV5VVZWVmhTaUtiTllDaTZJUzB6UVZ6UHNZNEVUeml5S1pxazYwUVk0SG5iUm8wYUpkQUZvQS9MMmlva0orN3JubmlvdUxpNmY1Zkw3WmtpUjlEOEJFSzEyYmtGQlY5ZE8rdnI3cXVycTZ4cXV1dXFxMXBxWkd0eWt6eldZNkpnTWFEelArT2JyTjNMUVVtcmtoR2RCWXp6UkNDRnd1MXpDVnRxZHREM0t5Y3pCOXhneW9xb3J0dGJXWS8wOG5JRDA5SGQvLy9vbUl4YUo0OVpVL1l4bzMzL1QrQjFjYUJPL3R3Yyt2dVFvMzNYd3JBR1BPNTMyL3V3ZS91KzhCVEpvMENlLzhiVDNXUFBVazd2N05iNjNuVnN5Wk02enpzTVBoR0hNZityak5ZMXV3WUFGZWYvMTF6Snc1RSt2V3JjTjU1NTAzN0hIVjFkWG82dXBDWldVbHVNbFcwSFVkMmRuWmNMbGNhR3hzeE02ZE82MDBFVVZSa0pLU0FxL1hpNEVCbzRlWDMrK0hwbWxVVlZVTURnNFNWVlVoeTdLVmEyUkdVVmsrRWpYSGFRMVRjS2FaYWxVMmNKQkxCRHZwaXkrK2tPYk9uVnNOWUR1QXR3b0xDOFdYWDM1NWNtbHBhWEZxYXVvMFdaWm5Fa0pLdmtzVW81VFd4Mkt4cnc0Y09GQy9mZnYyNXNzdnYzeHZhMnVyYmxObGlkUlpNcFZtL1k0bFk5ditCdTgzaXpNM2VhQnhDZUJ4UUdNS2pSQUN0OGM5bE1aaG1wN0JZQUYyMXUxQVcxc2JTa3BLY01sbGx5RWozWWg2QmdJQlJLTlJ1TjN1UkNZMmZuUDNyM0gyT1QvR3ZIbUdTMmJYcmthMHRyYmdEbk5ndDA1MWVHMURWY3JLcHFHc2JOcVlQdytrOFhxQ0wxMjZGR3ZYcnNWdHQ5Mkd0OTkrRy9mZWUrK3d4NmlxaWx0dXVRVS8vYWt4MDdLOXZkMXFPUzZLSXQ1NDR3Mjg4ODQ3S0M0dXh1VEprekZqeGd4VVZWVkJraVQ0ZkQ1cmlJdlg2N1ZTUTJSWnB0Rm9GRTZuazVqUlUycUxvREt3V1ZQc0thVzZlUitEbkFBalJZQXZ3QmR0Z0J1MjM5emNMSjU0NG9rN0FOUURlQmVBdUdyVkt0L3BwNStlbDUrZlA5bm44MDJSWmJsRUVJUnBNSHJMamVVVjFYVjlSeXdXYStqdjcyL2V2WHYzbm5mZWVXZnZuWGZlT1FndUoyd0VtQ1dEV3R3K3A4eml6RXliT3FNMm9GRytrd3pmWWNZT05MWUJnTmZqalE4UWVEekl5OHZIak9uVGNhQ25CenZyZHFDOXJRMDMzblFMSnVYbElTOHZEenQzMWlVOE9QL3g3Tk53dVZ5NDdQSXJyUHNVUlVFZ0VNRGFGMTRjOXhlNGNRdTJKVXVXNE1ZYmI4VFRUeitOc3JJeVRKa3laZGhqcGsrZmptM2J0cUhFSEtaU1VsS0NaNTU1QmhzM2JzUlZWMTJGVFpzMlllSENoVml3WUlHVjg3WjU4MmE0M1c3NC9YNXJxclhYNjdVaXB3NkhnNWtWbEc5b3FXa2FCRUdncXFxQ1VncFJGQ21sbEpoQkI4S3BPRlo0VHpqSUNTYmtoQVNRRzNILzFsdHZIUVRRRGFDR00zMkZ5c3JLclBMeTh1eXNyS3hjbjgrWEo4dnlKRkVVZzRTUUFnREhTcnVIQ0tXMFJkTzBQYkZZckQwVUNyVjNkbloyMWRUVWRGOTQ0WVVITUpTZHI0OENzMlFLTGVFK0J6UGREak1NRFFDaXlkUlpJcURaaXRhdGpVWGpBY0RuOThlVlJ2bDhQbXpkK2dtbVRTdkhxYWVlQnJmYmpYdC9kdyttbFpmRDUwdnVjZGk0Y1FNKy9PQUQvUHZUejhZbDVaYVVsS0N2cnc4ZmZmZ0JmbkR5S1dob2FFRE5WOVg0MFkvUHRSNnpjMmNkcXF1MzRTYy9XVG9CdG1OeEJZTkJ6SnMzRDNmZGRSZnV2UFBPaEk5WnNXSUZ6anJyTE54OTk5MjQ5TkpMVVZOVGcrWExsK1BtbTIvR2pCa3prSldWaFk2T0R2ajlmaWlLZ3ZmZWV3K1JTQVN5TENNOVBSMzc5eHVUejMwK24xV3h3RTVTdDlzTlZWV3hmLzkrcWlnS2ZENGZKRWtpZzRPRDBEU05NajhHU3hjUkJJRVYyNE1CYmdUSVdZQ3lkUjBaYWVPVGg0VWxTNVlNQU5qRC9WMzJHdVRSUngvMXpabzFLeVVRQ0tTa3BxYW1lRHllRklmRGtTSkpVb29vaWltQ0lQZ0lJVDVDaUpjUTRqWkJ5Qm9Bc05jQ0J3WnJiQnlsZEpCU0dxYVVoblJkRDJtYTFxK3FhbDgwR3UwYkdCam83K25wNld0dmIrLy84c3N2UTh1WEx4L2c0RVZ0SUtNandFeTNLU3h0dEkxMTBVZ0FzamlZOFNBRFM2ZzFwNlR4NWlhRG1hMnRVQnpRV044MHA5TUpTaWxTVTFOdHJidFRjZFpaUDhTNzcvNDNHaHZxNFhRNmNlZGR2NExQNTBOcmF5dHV2dkZmb1NneDlQYjI0b0x6bHVBZjU4N0Y3Yis4RTZzZmZ3eVJTQVRYLzUraENaS3JuL29EL0g0LzduOXdKUjU3NUdIODRkL1h3T1B4NEdiYjRPR3F6ejVEWmVXNk1RKzJjVmQ1b0tvcTFxMWJCd0JZdVhJbGJydnROalEwTktDNDJPZ0JLVWtTWG5ycEpWeDAwVVVBZ0QvOTZVKzQ3Nzc3VUY5ZmowQWdnS3V2dmhwMzNYVVhDQ0hZc21VTHJyNzZhdFRXMXNMajhhQzgzSml2V0ZWVmhXWExscUcydGhaLy8vdmZzWGp4WXF0cVlkZXVYV2h1YmtaRlJRVVVSY0hPblR1aHFpcUN3U0NibG9YdTdtNm0xQ0FJQWp1eENlZUxzeURIOWhOQUxnNTJuSm9URW9Fc3dUNS9tMmpqWDJla0RRbHU3ZnR4YnJBRSsvenRTSnNkWlBZdG1Vb2J0czhHOXlTQzJHZ3dZL3UyeHFVSEJUUmVwZkhOSUh0NmVqQnBVajY4UGkvOGZuTytwMW5BbnBzYlFINSsvaUdOd2ZzMlZzUE83VGo1NUpNbndEWldWbTl2TC9iczJXUDUzK3oxcG14NGpMMlpKVmR6Q200TW9GVzh6TXhVUHNqQXlyVzRzaTMrY3lJMjBNVkJqbElRZ0E2RDNTSCtuQWhzUE9DRUJGQWJDWEFqd2MwT05DU0EyRWdLVFUraTF1eU8vVkVoWm5zOTNtL0dZR2JkY3FhbmZYQTN0WGR0WmpCenVkeElTZkVQYXdMSkZGcDNkemNLSmhkWnpTQXpNak90NG5LL1AyVk1mRStPSmJDTkcxUDBoQk5Pd09iTm04ZGNFSSsveUtTbXBqTHpsSEpkSEFqWDNZRVFRdUpVSEl4eGdjVHcwMEVBQ0VrRUpVb2gyS0JIUmdIYVNIQTdGT1YyS0dBN0ZMTXpHZUNvRFdnakFVeTNBd3dnbEJCUWdJQVFDMlFHekFRQkFqRWhKZ29RK1JJb3RobWxVRU5xVFpZaENBUUNJVkExRGRtcHFjTWFRZnI5ZmhCQ0VBd0dvV2thZkQ0L1VsTlM0ZlY0MGRmYmg3N2V2bVArUk00UEhsdk5hc1lOMkRadDJuVFVYb3NmMk56ZDNSM1h5REljRG8vVXFkZFNib3FpV01yTlZHOThEU3JoRkJ6bGxCeTdwVFpUbGNGRTU5VWRyN0lJQVVrRVBRNlNvNEZNR0FWb3lhQkdFa0I4TkxWR2t5aTNaS0JqY05KSGVnNXo5ck9ac3B6elA1RXFzOEdNUUJEWTdGcUJDc0x3bVJxU0pCbGdrMlRJSnRRY1pxS3QwK0dBcnV1UUpCbVptWmxXNVFCckJDbUtJb3FMcHlMYm5FVXdzU2JBZHRSWFFVRUJjbk56MGRiV1puWHBUV1Nlc280aEl3R08zeGpZUm9NY0J6aG9ta1lKa3hoRFFJdURqVTNoeFVHUFN6MFpCakRUdEIwSlpFZlN4MmI3bVNtcHBNQ2ppWjdQZGM3QXNIMkQ5Z2JRQ0FFQkFSRUlGUWhCbkRvekZCb1ZCUUdDS0VLMFEwMlNJRW5NcDJaQVRYWTQ0SkJsT0V5ejA2Z3FFQ0dLQWdLQmdOV3VteldDbEdVWjAyZk1PT1NCMlJOckFteUhkVGtjRGhRVkZWbUE2K3pzdE5xUTkvVDBvTCsvZjBUL1d6TEFjZjQzcTRNSUR6a3VpZGlDbkdtZUluNjRQYS9jQ0V4QVlRaDJJT3c3bmd4WU5wVTNxaitOc24wNmltSWoxczNCUUc0VTRQRS9HK1lqLzNkc1RuOEFvTHBPSVFnQ0RKNFJhdlkvQTdHVW1jQUZCa1RUN0RSdmVZVW1Nb1hHQWMxVWFQSEJBVGM4SHNPWHBpb0tKaytlYkxYclp0T2lvdEhvaUZBalZWMGdUMVlCOVQySC8yUXVTUU85L2pqUTQ3SW53RFllRjZVVUhSMGQ2T3pzaEtwcGgxVFVHNGxFME4vZmI1bWpiRXZXeUpKdGxBSTZwWkFrQ1U2bmN5VEFRZE0wdnByQmdwd2dpS0JVcDdwT1RjRHBvQlNnb0t6OUtnQkNUUENaMzNlWUlCd09LaTZnUkVhNWpkdTNlSFZ3L1F6cElTcTUrRGVmNEhkY3poWmwrYytpS0ZyUFllYWxwbWtRUldrWXpBaWZnMmI0enl5b2plWkhrMDJ6MCtGd3d1RjB4QUhONHhtYXZENFE3a2RwYVNseWNuSVFDQVRnOVhvUDdnUmJYUVUwOUJ5WkU3KytCK1RKS3RCbno1Z0EyM2lFV2xWVkZVQUVlSDErZUwwKzVINk4xbEtEZzRQbzdPeEVkL2MrOUppVDZmdjYreEFPaFJBT0QyQndjQUNSd1FnaTBRaGlwbm9iR0J4RUpESUlWVkdNcTNwaTh6UnVZNHBOVlZWSWtnUmRwMFNuT3FpdXd3Q2NNUnFWUldWTkFCRFo0WUJ1bXJxTVJ5eTZOOFFuQWs3TklZbDV5WU1TQjJHQ2pnSTJBa0tTQWk0T1dQR1A0MzRtaEplYW9KUmFkWmpzLzBnSU1TcEVIQTdtTzZNTWFoYk1ERC9hY0xOelJLQ3h0a0l1dU53dXVOMGVlTDBlZUgwK3BKanBHMm5wNlFqMzk2S2lvZ0llaitlUXppdHlwS0RHd1czQ0ZCMkhxNk9qQXlBQ2NuSy9XYmRSdDl1TndzSkNCQUs1Nk9yc1F2ZCtNN2pRMjJ1WnB3TURZUXdNR0RDTFJxTndlenlJeFdMbzcrdUZKRWx3dTkwam1xaE10V21hQmtWUklFbnlVSkJoQ0c1RVZZMi80WFE2emNlWS9qaFJoSzRiMWxzMEdqV1VpaWhpeUpaRkhOZ1NwQVF4Zm1Bb2RrRVRYaXlTdGFObWJhRGkxWlQxUEdyL3ZablF6SVBOQWxnQ3B6OElJZEEwRFE2SHd3SWFNeThCd09sd3hxZHFpSUwxR1ZGSzRUTHJORjF1RjBSUndoZWZWMWwvMStQeG9LUzBGSG1abVhIcEczYUY1dmY3a1pLYWl2VDBkR1JtWkNJN0p4dXR1NXNPR1dvVGF3SnNYM3QxZG5iQjYvTWZ0ci9uZExvUUxDaEFZTklrTS9ldDIxSncvZjM5Q0lWREdEQVYzT0JnQk5Gb0JBNVp4dURnQUh3KzM0ZytPSDZMeFdLUVpVZGNBYjhKT0txR0ZCQkM0UGY3VFJWSENhVTZkTXBNVm1vTXJ5RUNaRW5pL1hTY3YyN0lGY1lCei9xSERPME5neDhiTkdLREcxVlYxWUlWcFlDbXFTQ0VRaENNYWd4RlVVQUVBWkpvdkNkVlZhRHJsQnJGNGtNcXpYTDYyemFCR0NhbXBxblU1WElOeXpkajRPS2hGZ3FGRUFxRlVGdzhGUzYzRzNzN090RFd0Z2V6WnMwR1UzM2ZPMzRlMHRMUzBOZlhoK3B0WDhMcGNHTEd6Rmx3bXdyTjQvWEE1L1daTGJvTmhaYVJrWW5zN096RG1seWIrZnhpS05XZDZGdjF2d0NBakNkK2lJRzM2aEI1cHo3cGMvelhIUS9uS1VYWWQ0SFJqc2g3K1d4SVU5TFJlOCtIQi8yNm96V2JQSmJXL3djYUx0Ynd1T0xUcXdBQUFBQkpSVTVFcmtKZ2dnPT0iXSwgWyJzcmMiLCAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFUWUFBQUUyQ0FZQUFBRHJ2TDZwQUFCS29ucFVXSFJTWVhjZ2NISnZabWxzWlNCMGVYQmxJR1Y0YVdZQUFIamFyWjF0bHVXNHJXWC9heFJ2Q0JLL09SenhRMnYxREhyNHZUY2pzMXhWdGwvN3JXNlhxeUl6NHNhOUVna2NuQU1DMExYLzkvLzZydi82ci85NlNtdmhTcm0yMGt1NStWL3FxWWVYUDdUNzUzLzkvUGU1MC9uditWOHN2LzcwL1BYNzF4OC9DSHlOdnZMbkIvWDkrZnE4ZkQvLzR4ZCtmOFl6L3ZyOXEvMzZTV2kvM3VqWEQzampueXZ3ay8zeit2TkY4djN3OC8wbi9YcWp2bi8rVUhxcmY3N1U4ZXVONXE4WG5rdjU5Vy82NDdKK3Z2ajM2eS9mcUt6U3lueFFER0hISjk3bnYrbm5DdUxQdnkvLzF2UGZ3T3VlR1BuekU5dDF2dnkrSlJia0w3ZjMrK3Q5LzNtQi9yTEl2LzkwL1gzMS8valQzeFkvdkwrK0gvKzJsdVhYR3QzbFgvL2d5WC83ZnZ6alk4SmZ6T0dQS3dwLy9jRVk2Wjl2NTllLzM3ZmE5KzJmdTN0VFlVWExMNHM2aS8zOGZodGVPRmp5ZUg2dDhFL2wzOHlmNi9tbjgwKzczM3V5NWV1ZTkrQ2YrZlFuc0N2ZjlhUm5QZS96UGZ0OG5jL2tFbFBZb2ZJMWhCbmkrVjZMTmZRd28vdVUvT2Y1UW8wOXJ0all5eG4yeGZhbEdQNjRsdWQ4YmorZk41L0dKNitIbDRhSE4zdjRsWC83ei9YZi9mQi84cy8xZmRNbGV1NzJ4MXB4WFVHNzVqTGNPZi9McTlpRDUvdTFiL2tzOE85L2ZtMy8vU2Y3d1ZUWndYeVd1WEdEN3oxKzNtTGs1eCsyRmM4K1IxNlgrZnF6eWM5VjE2ODNZSW40N016RlBKRWR1TXNUODFPZXU0WlFuNGQxYkd6UXk1V0htTUpnQjU2Y3crSWlRNHF4aEt1R0Z2eHNmcWMrNTdVaGh4TDhOdGpFUnVSWThLM0dEcjFzVmtvWis2bXBZVU52ampubG5FdXV1VjI1NTdmRWtrb3VwZFFpeUwwMTFsUnpMYlhXVm50OVcyeXA1VlphYmEzMTl2YlFJeGlZZSttMXQ5NzcrNGJyNVlOZTN1dmw5Uy9mR1dIRWtVWWVaZFRSUmgvdnhIeG1tbm1XV1dlYmZiNHJyTGlBaVZWV1hXMzE5ZTduMmlERlRqdnZzdXR1dSsvM3c5YSsrS1V2ZitXclgvdjY5LzZ4YTc5MjlaLysrUi9zMnZOcjE4TFpLVjlYLzlnMXZudlYrdnN0SHVFa3UyZnNXRWdQTzE3ZEFRdzZ1R2QzZTFJSzdweDdkdmVBVStUQVJXYjM1bHFQTzhZV3B2MkUvRDEvN04wL2R1NC8ycmNydC85bzM4TC9iZWN1dCs3L3g4NWRiTjAvNzl1LzJMVmxuSnRueDM2ODBEVzlJOTdIYTk3QUZYMWpmZnkxeEMrLzhhdmoyN051WWRJZi8rYy92Vjd2WjcvMTRWN0x1K3BUYzBpbHZXeHVISjNMR0hQaVYybEVMMlcvaVplTUhkTFhXbnk1ZzluV00rODlyakJuSEx1MkorODZkc3hmZTRHNmIreTFWNTRKZTlxVHoxcTEzMnZ0OFhBZk0rOTNqVFZDR256dUUvb01xVjVQNDYwbTY0WDEzWHZYbVFZMnNMK1k3LzU4TmUzNjhMT1k1NzNtSHAzdEhQVWVUOHBqczJPQS84c3VZbFRYVEtMVnMrYXFMOFFreDAxNGZkZkxPblF1TWVUQm5sYldKNHpTQWZZM3ovcU5WTi93TFN4cmZpWE9YRWU2SURWMTNpeEdiUW1EN2tTWjNzdjNzTUZmM1N6R0hQeHh4YS9OTDl4Y252NHpvQ0YxOHE2eHpvQnp6cTlkYmVXUzBtS2RacjVIdVZzUDdQc2NRSDdmcTRVMVMxeGhyUHRMK1ZzWTBGejRRWTk1cnhwcTN5V3dFU21YcTdTSFBmbHE1dWFNTit1NzJZek82OXpZZjdQNXo4eXJjVEhBUVN6OXUwY3ExekRneGJ1VXRRYXd3cTJGdVBFakRCT3pqV3NVdGpseUtYUEUvUElKQmNkL0I1Kzg0NmhjeW9NaDhHdlhHTWVxL2p1TCt4Yy9tNldNV1BhWThjT3A5MnpmRmRZcUhmZU9pYkRPUFdNYktVeFhwc2MyVi9iVzFqNjMrWHd2WVAvSFcyTXRJYkFoUlByMmZCZWgvUUY5Rm1DQ0tmVzV1Y2YreGxBeDRtZVh3WEtYOFJVK3ZSUjg4eVBDWXlmdFRmZWJXbnQ1VDh4OXJuVzE4dVVKaUgzSG5NcUxEWDcvN2dxK2Z2UGlyNlZ2eC9weFFUR05zSHRib09QMXNvUDh0WHdSQU1LN3VVcFFETjhIRlVibmZuTUFTY1NzMk9WKzc3TmViQ0FhQlJmLzVvOVg3NjllVWg0dXZ0ZnZpZC9aL2YwMVhlRmxpMnJCV3A1Wmd1YXk4NFFtTGp4azgvNnNJZXlHVDMyMGxUQmh0WVNUeElja1BReDMvUGFqNXc1c2FvUm52UFZqSzdqK1k1Y2RNSzZ3QlJjdTFkYmZML0xoa1hlNE5sRzZsOGFPRHVnU0sxUlQrYkJqWGpsSEw5dDdYdnloRlpha2g2Zm5HMnNMS1FmdWI3L1M3N3JHODE2cGpGV2VkL0lwZ0d0dkJBS3dHT04vOGx2elIrQnZOVTd3bEwvT0F6NHpweGIzeUN6TWZqVEhjV05VMThNOVZaejBUYk0yN2g1SGU5ZFJFSm05bEk3SkxsTEExMEpnSmYrZHlWNy91VDAvWHZIS0d3NFhKamZOQlJjaVQrY2VwRFUzeGplQlZUeGFPbHBEd1RLSnJ2VXRHeU5zN3k3bEc0REFncERsY3ZmUmltdkVSWTlLR0oxVlRIb0hWOVF6VkRFQnBwT1FwcmtXUHJUenlnMXV3bm40Ly9leWlyRU5ZSktWNHA3NTB6RDJBVHZzeVZwUHY4clRkTFdPTlFKUWZPSnU4ZEN1elhzOWhDOENZa3hFeE1kUEdSdThpZ1JWSW1rcHNkMEU4L1JpR3Z0YS9VNDVnbytkbmNlblM4WlFIbHlyUHgxOFlKOW01QmNxY2NaUFdxVytYd3Q3RWpJbi9zUnZiYUlBY1kzN3dGclo1a0JFWHVuZXhNLytlTnN2aUFPeURkQjExNEpvV2tEREEwWmhNYy9nZDBkcS9UN3NHKys1UU9Ga1ZEV0NEWUpjMjFYa3hlaStBdEJrUWhQb2NFK0MvaUQrczdKMVBqdmk5eDNHVXg5RHpxNDVYV1BpN3ZFUkVNRFl4a0p5K2J6bG5BVCtHcm1pTWNxenVNM2IwQVFSZ09oOEhTd0IvaU4rR1NBcmZPOUs4U1U4Y2h2OHpTVWhxbUM2NWRrcEc4YkFKVlovODR0bjhUR0xsZ0ZySXhXL2p6a2xzQUV5RWErUkZvc09RSTZheFNob0ZQenEvbmFBT3NDMjlvZFlMUU5DUmRRalhvekFIY0FpcW1qYTBpSWNmNU4xdXpaT0NJWkZTRWVxd0Q2VVkwbENwdFlEakVTUXNTOGlUU0c0VmpDc05MNnV2WjhKZk1TVmhiRXZ2VmRKYTk4Z3dkNzNPd2kza1dDZVh1dzhBeThmNy9IdFlwQzVVMkVsWjl2SWNiQUsvME9Mc1Z2WVBwenRKa0MraE9RYnVwZDBwenV2dFVJbTNMN2JDd1VFU3N6NVdibEJIT3VIUzNQUm1NS1FKUkxTWURFZnNCSFlOUnkrbHd4Mjlsc3RCYnppUVJ2Q3h3ZGpmZEFVR0NBeHpVV0Z4TFZhQ09GakE5RGd4UWZkWkhNSkpSZTZ6SENDelJQZUlVaDRONWZQNHNQMVFIWjQzczBOc1U0cERhSW1kbkFMQmpLbi92NWNGamVXNHhVeVJHaStIWExZQy82Q3hBS1ZjQ1A4amhzaHFPWm52d1Rtc0RiMm5FRFZpVE1RWmUvYWlYN1lLSmF2OEl2UXhnNW05NEY1WUV6M0I5b0FHNG1MNzhBdzlLamczVVIwZGg0RVozWGVuTmhaM3BkYnhXVDczbnRkUzM1Qk5Bb1lkNHNEejNnN0x2cEpBL0FhS0JadmdCTVgxbjI5V01tY0hkYlJjeUNZSlNWVzVYZDZ2ZlNlUlBnSThCdEM5YXVkd0NnbXVBNmxJLzdjQi9XUUJrQU1aQksrV041UUZ3cWg1QUZZMWM2UEJtL1VlUGxzM25YaVZyRU1wQ0Iwbm8xRFgxZU1JeHZuZW9OSmdnRUxyYzZhYWt1YlZYbFlsNFZsQlFJa2JNck5UYzBkUmNla0dnaG9xSWMyYyt0NTRva1RNd0F1UUFiZWUyRTFpMUQ2UU1ZQzBnQ3FTZVJZRjh5dW1TS0FqcVVxSGlCSWNBNTVHVkV3c1pSUXBEay9zRyt4SVlTckNVMEJSM1p1V2dwc1ljTDUyRFhBdkd2S1BVYWlBd0lLbHdXcFdIUHpQZndXVkJOa2p0QXdUQ09XYjc1Z25vdCtRaFd2d0tucnZuckNtOVlMMnpUeVBUVUF6SVFMNERKa2RBV1hEZ3FoUGtDWVoyM2VIUndCYU54cTJHcnFPQWc3ZW9QWmdBaDREdUpxaHZkVGpUTnFzQmNKWFREQ1JIUjkyTURwWndnT04yRTd3OHBCYXdJekRsb0Q0SG9CNUhDTFVESjQ5UWJXQ3hUaUFvbit5QURzNWUyd2kvS0NuRVFYakhiMzV4NHZDeHpCVW9JSVc4cldvVVdncjBRYi9IT05wQldqLzFpeFR1QmhZKytwejU1MEd5c0VSdHh3NXA0aklUZE9JaGlVQUVKOEEvSVFyU2VWaFlZSlFqczc3SDIrY0NRdUdYOGtIQkM4T3ppRkhHMGhKY0lzWVZNZ0x0Z3ZVcVVTUDlVTUYwUXBqdTh1SHg2c1dnbnpZekhuVThIa3IrY0t4emRTQVR5VERZSWtUcmJ1Z1RBQ1BCV1RmckdyaEc5ZUw5SEtQNkpNK1JOR1VKUCs2eTkxYmlYQnM3aXFnSjRDMUFITGhRUkNWZ1NrVEpROVlrZTRMTlFQdklrZEpvQ09pbEk1Q2RHQWs5VVhoSTRFS1p4OCs4R0dPdDhYcXBiQ3k5b0RVNUNLeXBLMVdjZUZmVXdZd3JjQ29oWDkzUk1zRUg3b1RzQUUwYm04QVFnd0NNUHBVYlJCMEkzRkw2UUVuSWEwc010M3ZkQWszME5jaEtHeXBIRGFKalhldDFJYlUrcVRpOWs5WkpnZjlQZzFqSGtGRXpLR0c2S0Y3N0loMXduaFI2ajFwaURqalNVT29OSU5GQnByQnlHTy8rQlplc3o3NWM1MUZSVGxCb2xiSU9KbC9CcEp4MVplRWN2K2pJMTNsNCtDd29FWTlMSzJSRVZleUowdlROMFBZVk1KRngyVGF3Z3hnak9ZaXhIdFBJQ2tDN2NZSCs4UDRuMUxUZjY5TjA2dmpnVG1VbWhnQzR1SHc0RW8yQ1RPQWdFRDZpQlZud3VHUlkvOHRnczBqSHNoQkZBRkRmY05tRXIyY3hDNGkrQnVLcXl6NmdNbjdxQVF3Wk5vam5jMTFTdm1HSEM4dUhFUlhna01ic3hHNU1pR1lRSlFma3Q2QU5lMzRWSE5uV2NORGlEMWsxWkU0MzV2T3pGcDRqQUQ0Y2ZIc2hNSndoSmc1VEFGRnVmODFnQThNQ2VEVWRzR0lseTVKeE9hSXhMcDJEc3dDc2tNbnNCOEx2Z0FmSng5TndvTXdQcmVJTjNOdlJDN01lTVhPNGJFVHBZZlB2NkNnMXdGaThWMTF3VHJlZ3NiMlVhNFpITWdCYW9laVdzdUZhTkpYTE04cEJOcDl0RW9tTWVJQ2VEN3lyR3psNlZsS1RFL1NEWkxQNUVRZ0F2aytOWGpsMlpHNEFkbG9CTzRTQ1ZTd2ZpSUlaVi92LzVFTXpSSWlVZVhKbXBPQmQ0SVk4enJUUmc4a1FXK3pXOVhXR0UwUlRKQ3g0ZUpFZ0FnZHdIeWZGTjVYekVTMVA0OXNGem8zM29FUVpZbFh5MFo3REdMNzNPN0lqSWNUY2w2dlFDSXYwNFVia1pvZmlXUEQxSStFeVNCZUFQSGJmenBYUWlKSFM1MFlNNjl3MnZML2d5NkJQUEtWdnhhRGhjakVZaFFpYjJiZ0lBQ3N6aFBUVGRScWJHMXlBUVd0SmxoZi9nNzN4WEhTNUFCYktRczFvNmpDT3lBVWlvemViQXdFVFZmUmczNlNZZzNLRzNKTit2Tkc3WHdCTmpkNEhLSStNQVBjYWtpNUhCdEREZWorOWd6akdLWU1NVEppQUFnMjUzNFhGa04vQ0dHaGNWZEUwdmVDazZrNWJjaUsvMXpRZHlFbHlUcUhhNzI1VUdZUURIenVaRy9vbnBCNVlyU2ZSQ1RmVU5HWWRZM25IUElaQUp5RC82Y1h6d0tCb25QY1NQQUZaclBlNFpWd2pqR3FNWHdTaVI4TlBET3hTQ3pxdkQ1cjVhVmdJaVlSSk1VUkQ1ZThiNHFQdmk3RjVNQzcwY29ieGdwa3BBcllpK2hLWXFMcGQ4azRpTjMrbUhwa0txZ1pzbTVoSFBrbFhsditJcVp0STQ3OFQyRTIyOWJ2LzdwUWhBZUtQQnpKZ0ZTWVk2c0NPeHRDM2gzQUtJRDJpamVSbGxXKzhHTEhpUlJ1dmhsNlR1Y0srSlZoSVlNT1VJT1FEVUtaUDhMTE1obWxYQnN5REFoeWp3bWw3Lyt0anZYOTN0emNORWNEanZtRGJpaG5ST09qL2FSZmtjMkN5WjFDR0Ria0RGd0Z4U3FLNXZVSzE5WkYvcm1JUndUN0x4VGoyWk1GV2YyRmliL25aTTVLQndvUUhqZDNCWnM5Zzl6L2NkRnNVYmJLNjhaSy9sdTFFOHd6TytoNjBLOHdHejhEVm5SZUs4bHIwVmF4TmRNTDZSdTkzR2I2VVdXaG5qQmZGT3Jwc3JVWlZrVWhYR0VvZjM5cTA4bVpraTFUWCtpTFlBYStYSjl1S0o5bTl0bUhXQ0ZIYnF5WmlEV29MaUFmQ3pIQ0FkWVlxY212QkZRRDMrRHQyYnNHVjRIcVFhbjBLa1E5ZzRUTzRtbnR5SkNTL3czVjhJSzZMR3h3amhZckZBTmY4cCtJQlV5ZVJHdUN0RVRNWVZBOEpSMm0wTUM4OStCL1g1MXcrYWdLT3dPa2ZkTzV1S1d5bWlnQkF2cUxHZ0s0TTUxbjh2NC91eW9mNzZRanowRzlwQ3hqU2hDN01ZUHdSKzJGT1dOci9EK2NQVFNHOENHVm1nTkpYdC9CVllHKzBQQmh5R2hCTnc3SVRQQkFHV3FSUC94cW8wZ2FaZ1k0UDdlQURpa0FUVnk3ZWVGdHU2dDlvSk9RYzRGRlJnNnZQckYxTUdlWFQvRStnUHFwZzlXaHRTRmdBTytDSWVaM0lzS3hGN1FRZUwxY3p3am0zc3NDTWlDZXF2VG81UzRoemtuMlExdm5EbzZIVm9raHFzTHdUVEMyQU1EMlJlaG5zV0FNM1NvMndmdGh5WkFHRDUzNVhuNVZhUWx3bXVtd20wUU5NQ0ZDRDNDTmN2dTdETWVEVXlPWmo3N2h4N2g1TmdIVXRJczJEc1ZpSWJLYkNvYVZwMENNYWg1akFQM2ZURkxlQlVFbGlnSFArU1NML1V1bGt6UTNyZkhISkFPVUN4NnF0eTBjeWtBZXJzWGt5VVRHQnovR2dhdmhHUStad1BsSEZpblEvL1FPL0RCVi9rSGNHV2NBZG5VNEc0Z2F6REI0UTd5bGpCYnJqZHIvM2cvUDJMMWtXOW1zQkFTWTZGWVJNMTM0WktZRGZzaUFRRXZDU2Q4Q2pzUGkzaWYyMFRJUkdzOHhPenJnLzNpaHFCUFdEQ0xZV29NQU52YjdCYkxTcHlHMVNDUVFGNUFHQ2RwR3lmL3pMbWlUSi8yRmMrdUlGcS9Udm1Gck1kZk9Cbnh5V1ZMVzdEdmlWRWlrZUR4QTFXRm0wWHNoSFVCNXpCck5NR0UxbTZQTXdoUllFMHp3NW5RSGV6YURWamVJQk52akE3NTdwOFU3NFJqTFBPazNQZDRidStmVUJSWit2VEdjdmtsdjhvOUluQlA2QStwSkp2aGtWaEJJeGRUaEJEZWd4QlFOcUprSUFpR2ovLzRuVHRqOE4rK1ZMcmZDYlh3NTRWQkJST2lHd0dBNWJObHZDMXZUT0FKQ2l6VGNZWjBvZ0lCN21ObFpRNHZ0ZzhlZ1lWUVFTNCtlS2JOZGlEY0Nhc0RCelJONUJGOU4rV0pWdW1IUFJWK0JNaThUL21NZnFsNTFDMGJlZmRFV3crd3Jua3dBeTBFNHdsaER4d1RpMERUV0g0dzNFdm9Zei9aSFJWMkI3d3plSTJ3TitucllrVFByNVE5aXBYRi96S01pbmovSWdNQlhXeHB0aVp2NzNqam8vR0NhV3lmS1FLMmMwRVRMNndOSWJvbnV4WERBSm1PM0drUmh0RnVkcmlhYWtWSjg1WTM4U1NaUk1kQXVGeklVM3h1WG0rZVoxNG1hajBCd3lhQS9jd09zc3FtR0VCU0xuMWdHYmVIbWhOR1VRTUJDVWJLeTdpVTBSVmpOY0NTQW5nRWFya3NtZFhBSVZqM0NuU2pESkkveGN5QlRHUXpPNkk4QjUyUjFkeTRhR2d1SzNkQUdrQm8vV0xWb2tlcXNzOXNEdTR4VnlBUFVHVyt6OFIrc2ZSMWtzRXBuM091QUZBMHo0VjBqcW1TZStLQkVhaS8wb1YxWUZmTEIrZURQWU1XdzZRRndRZDJqSXdiZ05zMzRGcUxIWU1JUllUdnM4ZGtqK0hSMTRLTk5jMmRUOUNiSDh3bzlDOTQ2TldNLytJc3NjbnJKS0JETHdMWE5GNW9ubWVCaElaQm5Pckp6T2lSemdNNlJoRGszOWlKYzBob0V4MTNySEM4V2FiV3ZXK2NCVGg3TWlUWi9EcnhJUkhLc0RkQ2RvTlk4UlZIS0FEejlxelFROGU1SUFOUS9PK2NsajRCR1lCOFJJNDhBUlRuZ3JFbjNCeUZqUkRiclBpRnErVVlBV2hDVFpsZG93d3Y4Y2pNMkY0M2wyQysrYjZKdDgxY1hzOW5mWWdvQTBZSVBnTHNRTnAzZWZ6dFNUQkcwSENiNmFIV0xKNXd1a2k3UnMrOEFiU0hUNFdEWlVUcGpTY1hlWWZwWFQ0Y1dDeGdOcHUxYzRRVkVzQzVhNnlkcFJ2Nmdqb3dQbXE4a25FSk5BRGc0bm5CQjFPUXFkMEluSURZQXNtL3E1OGpNTmcwUGdqSHdPODhxbmpqUyt3SlVCOHdDZzdYSUpWUUhVRFFPTGwybmgwSG5hemZuSHhhN2RaRStLWGlaTUVjandvYzN2NmtLa1g2Q0JBTEZoMU1zV1d1QWxUOTlvdnA0QWJmSXBSZzIxZ1g2SHZsMG5OSnJZc0JIL3grbVVnejVueG9Ib2dWTEdzUzN5c3doZ3hoZFNxTEZFNTBja3NzQllCQTErZmlNL09UUUNUSURQakpkWHNZaUQyOXRiMWNVb1Fid3VYUGdjT1F5NkFGY3l0bWc3Y251UjlXaDZ5THZCRzhDUmFiTXBIOVBXd0hPNWRRQjVUOUY1STZLbU1ka3hnL0NadVlIYXZKSHNONzBMWVlvNnhtc212Zm5jMDhZS0ZwSEFUNElMRXNGUi9WTnZFUHMvOWtoNndLT3JPaFB6UFc0V0ZEZldEeGVEbnNrOFZPN2dYNkV3YVNZV2ErY1VsUjhYdHpTV0FxWEE0WEdjcmV3ZDNrN25FUTc3bVEwTzkza3Qrcy9jVkdKcE9ra2Y4MDFoYVZRY1NJcmlFT3pKNWl4Q3c4ekdNY2RjN21CdlZTdk5FTGo5aU5DL01wMk5FRFM5a2ZZUUxXMElFbU5JZXFIbDRVaktUYnN5YlF0TjE0V0l0WUszOERxVEliV0dja0ptUXpPSmM2ZW5xNGJWMVR6UExpRGpSWDdOd0VUVW9KTzBMYWNobUlmRm5Ga3FGR2t3T3RzeHozU29VUHZnamRjQXNVeWtsRHdUQXdOeTdWRTArV01KNkRHK0pzZ3cxemY2c1F1c2ZOOWQrZm1zTGp6R3pLZmx6S1FjQi9ReTlnSjdEM2llYTJrcVlBY3VGUUFoejN5NllvUDA5Y2YzMGwzRGVMVDI3WXlndDN2b0pPblkzOWhJNVVncDhGeXVRUDZzNzd3aUx4QjRIK2VWam9nby9pYjN3MWlKdVBCTE9KVjFoMjhJdjVXeUk3c2FpdVRyQStCUml5dm1heGdXeVdXSWJRUmdnaHpsNXA1VmdRbW1YVUFzc2hpVmZQcHBvdFp5anozbWI1WkdLeWdRUS9BaE1BWDBTZS9zNXRURUlIRVdjck5XR1BPVzAwSDBIckM5Zkh2V1lpREJidk1YRDd6Vmx1UzQ5K2NSWXM4SkFXdi82bUxZaDUvSXpsLzM0WTBPVjVFSmRyalV6R1ZxMkF5SXFRTG5GcVA1VVI2QnplMytOcGZBVTQrL1dEWDk5bU8vakJaZFZxT25VR2VFbzNrZmV3eWNTallLa1N6ckpZMFlEZEFPbHc1S1ZUK3hQam5adzZRUXVRM09rQ1FhTFJrOWptQWNOTTJYSWx3allVdHYyY1NTU0RBekg4c1c0bCtkb0pubnZ1RnN0NFQ2Vkp3dGVnVFNWc1hxMmNZeThOUmR3ZkYyL1FRZ2RtZUFndW1NMzhSZWpKaEtWSFZ3bDcrOVFwaUFiemtJc1lJT2hFTS90YUV1b0dTTUU5Vk9zZXA3TE5nNDBJckFYaFhtNEZrckhxbnF4dERCejlCQjZoOUVIQzRBbklVajE5b1NWakd3b0N2R2lldGQwVnJ1akI3Q3MzMEUvZWZGc1RnVDVDVDhZeFBZTHVVR2JjNGdWeUkrb3YvTmI2Wml3Slo0TVlXY3c0eFdhVklqd2huK053WkNmaWwwamJRWFlvOTdwWWZnZ2s1QW5VSnVLQkRvVllBSHNZYWdyZXNIbCtEaXlXNXNjQmVGaHdTYWpURzNPRkU4d1AwdmF1YTkxY0VpSWRjSzRwdnFhTU1ZTENCc0NYMlAzakpBREwxMFhtQU1nUkNEY1Jnc3VIZlNXSjJnSXVMZ3Q3SUtlM0NKQ2UxM3dqdmpiVUNwNGFxaExaeWpwWkpqWWVRTk1ldTBrRXp3cTRkeloxTGV3STRaVmJnb1JZVlFiUDNkQ1c1ZjJnUVJjWGt6eUlBd2R4Vi9RTTFNbFVUQWduU25iUGt2QnNERHhjeElsdUx1Z0cva0NOZUpManJ5SS9JQnBadlZjam1NM2dna3lUSTRWek52bXliY0NGcktTeUlOZlJkNmcxQkZFcVQwcVl4NENkbTNqMXZCeXVaQ0dKbEhhdER3R1JjRkhyYktaVlhOR2pRZXlKdjE4ZUZNN2lnZlhMQ3l1WWc1NTgyRndRRnZrTHVUV0JnMElwYVhKL2NJdDh2eDYwYmowekc5TzdTZGZydVNYamFFOU03KzNxY0dUOW5udENMS3pWWWc4Q2J4UHVVYWZsWTAwckdwaUFGUmdFQlRnZ2FpN0FqNVRDVmlYMjUyWTlEU1hFN0laeTVCZmhKNTR4RW0ySTFORTFoN0VIYXdMd2pBSXArRjd2QnY1YUxqYVB4U2RBaDZjdnJNTGp1Vjg2ejJScFJldDhlZzhNRFBhOENIQ3NBUmpTSUE0eG50U2haU1B6TXRld1BsUUNXRGd0bFVpc01rNlZ3Wk5RTEMrQnVSUEE4cHM4SXdDTlIzcmkxdWc5bzBKeWUyeWQrMlhWbWpVNzBDUElRbUZoa1hneHdtMWFMTzdJUE9WUnJEdThGREs0Z3JDMDViNzhnNlMyL3FMMTcxSVpubXo2dEtwa2VrcUhDc0Vpc1BiYU1pQ0Q3eEtUOFdvWTBJaEdHU0wrWXpVUlRJUlZnNHZ3MjlmRGo2QXMwTkVHdTErbzlLUDlQenlZeTN5UWMzMTd3S1dkTmVRVHNvZElJaU1SMTNGL2xDb1d2Szh5ZHJ2TmFZRUdYUENHMHpaUFg5NkFwMllyMW1CbVdCcDB5bE1tZ2ladWlzUUdLd1ozK3AxalBtd2NxSVdBRkNCbjREU1NLMUhaUElXbmFRK2g0VVB5V1U3U01QL2swV2dsZE9IdU94ZFVCM3QvZDBqQXZFNDJCL2ZTNE1EWkx4RDRKbHB5ZTdLTjhXWWdrNGlBbXYzd0tJZ3I4ZHdDQ2ZZaVc1MTFFem9lTk5wRjhKNFBTSkhRMEY1a3hLUGpCODVqREFuUkF1TjU5Y0pEWTE1UGdYQjloTXM4NVlIRUdlQkMyTGhxaGZtRCtPejdTcXd2aEpUMWpFK2MzNzA4V3VlOUVhZFZzNEpoR2RDK1UxaDFrdHk5S094MTlDdENNVlhFcFp0aXlkWTJBNGdtMXZzQTdWb2F0L2syNGV6VHhodkczaXhYd2k4SlpNTnlPMjRuWEVRZjFMNUhMK1lmZVZ0OEluRE5DT2ZRQnV1WlZTamQwK2lad2s4ZDJ3eEF5TU8yejRnZkhaSGJNRWhDQ3R6SFlnRllURnZOMG1OQzFTTDJWaVVPdUxJSGpOcmlrdzFmU3daaVl0MEgwQ293dVlIQXJSR3dZQkVCc252eWxlYU11WnpIY2w5V2VscUlTeHl0dzB6SG5ybi84SlprYVlGSElPTTdvc2pEVEhENVpFUlkwZk1WRHYyTk1ISUEyWWlNaDIxOFlENXM2MlJuV01uenRjSjM0SzJRNUdEUkhlcm81dzJhcXZwd0VXSUZIQ1Q4L09EUDM0WlhFd3dlWkRpMExDTkZFMnc3QWVnM1dFYUFCUElJKytpWEI5Q0t5WU5LWE55VFNjaUp1UlRFWnhqd05ZdlppWlpFYmlCWm8way9uQ216MzU5NVNGUFhWdUFUWXFFREVNZ1c4UTh6dzVEL3VBaVk0Wlg1VmlnVGRtb1JUOEFpcGIyZ0t5NDRadWFLQ0hNQTZpdWZIMGI3WXZFT1llOUZ6MkdjZ01IT2xpbndUbENBNWQ0UWM5TlgzbDA5K1FWRENRRHhhckNvaGs1QTd2S0dqM21LbHcvSGVPRGxuazkrZmdweTV6MFYzSEM5WWdVTXVCV2hMVmtqQkJnR2VJUU5WOUFEVVdQSmlRNUgrTXhRMFVXYy96d25oUGRnSGNYY1JSRUNpVEZyWVhnRXFSdUhSdlBpeGxjTm5qS2hCSWd6c21JUUdKd3djNWdzdkh6aGlNUDFnTHY0WlozOEJUYzM5L1pJNXlSSGFsd1c2R1pNSE9Xd01uYURHT0p0bGZ5WUpoNkk1NGxybm05a3MxYzFIY2s3WDE1aUVhSEozTDRURjM2eG15eGt5M0I3QUpXd1Y0Q1FETSt6Qm84UW9GS0tDQ0lQOHI5ZHoyazZvaWhaTW90VmdGR3ZSUm56UXA2NDc1bXdsamFNb2lnblBkdjR1dktkTFFIS1N1Y2pVcmYyMHZxU0d5M0FsUUhqQTVwa3p1Wk5PRzMwSFYrUGVqZXVUM1R5eUo3dzAwTUZvMkFjalUxbS8va0tBcHYzQmRTOUtTdFZMSmYwaUNCZitTbFdWdUxWWmhDeDUzbURxQVUvZ1lkYlFXN2VmcHRPV05YYU02djJUZjRzK1NyVUNtcVFpSUR6Z3BXV2JYRVpzU3lLRHAyVkczd0dZVDZaaks5ZjVkVmRoV050d2NaTTBTS29ibmh2REI0QXdwRkR2TjVILzRHZUkrekZTVTkwWFdnZ1RTcEhlQWtoNUJ0MDVoMWRvbXFsRnR3VWlFUDNZYUhxalZRdjB5TEZucFV2ZW9acndoaHYrMURCOE93TXNDNTdpeERxMzJ1bGRpdDRiSkZvS1RGbXk4U0lPVTJ5ZU9wY0xSeEoxb3lxV1pEVnFrWlc2MzNNb2lyZGNPQnMwY0Jqd2tPclQ1L3REbnlHOVNvUWpYaEphVisyV2U4Q21GczN0WEJiVjJkeGhwV1BlTEY1U25NWTFWREhkcU5Nc2FGOUo2UUpFaGVYYk5qUlNiaG1PTnRVN3JKNXNEcmk0L1FrWlhsWWhmaEE1UUg5dzN3Vm92U3pGU0Y4Q3ZscVFvZFhqTXM2bFRaT3E0OHgxQ28vVU02S0dxVHd1Yi9ObFhPRHkyYWdSQmh2NWkzUi9qYU5RRmJPcjVkMkhVanIxc1QwOS9FTS94UlhuYVFqTVJEKzFRamdYSEFMbnUvQnNPUnR1QkRyVjZ5bXp5Y2ZjcGRML3lERzRaVkpiYy9WRUNwOU8yNDJaUUZnNUlkZHNSNk1PSWVFWVlrdzZCaXlyb1F2aEpNcnVqeXd4Z0MyeDZaRmFaVXM5a1YrY3VHYldCSGI5eWJQdW9xOFc4ZTc3WlJCRWNKRVZPb0NBSmQwM2Q5SjlBS0VIbHdQUDFWRkNLUytaZ0poYVVITHQzajRzVzF2MndCUm9KSFlQNHVCdVhtKy9xekxFMWwzaWswQnZEcG8xMHpOUURSdjZ5Y2FQTmFUd0dMaEhnU1lTTWEvQ0RObzJYclZjWVgzZ25kZERaNVBJTVNJWHV2aGV6NUgwdWhucUhDc3l6d3ZKdndOM3JQZXdTS2YyMVJFVmtmZWtINkMvM29BdXdzejJnVkNZUzhFaXdycVlBTFpKUE80dDFrMmNCTTFpSHdIWVMxWDl6VDEyMUJZMW1ZL0hrU3RGeWUrYm16aHRscDJ2ZVZXYjRiMmVVTHdKUXRROW9zVWpCOWVDR1VLY0FDYkg5Z1FjNGFuSU1uY2FKU2xYQXQyK0x6UUdtRXlXdkVIa1BZT1Z5RVNZNDlKTmZ4cEJ6QVc1VEI2aEx2Q1VWOEVuR2tzcEdTRFJKeTRENzlGQkpVNVVlSXN0dm1iRXVBZWpiMnZwdXBOTWxxVFhDMTN4enFnVTRRRmx2UUoxZE9TdVMvTEpJbkZtRVVsRElBVWNIdlRXM1Z3ejduM1dsZ3NrTmdpRDZJZkVleTlUeFV6cXF0WTN5WXZoQVpjaU4rZmJrd3JlVEVuOFFFd2VIc3dvM01iZ0xjRm1obWlUZ1JBc1lCbkExNWs5QUZmWEdud1pWbFdiVWtaOGZ0VTh5SzRDV2tLcVNldFUzZUFJSUhRc2pBVDFRMko4S2dqRGZSTWg1Mjc1Mnd5Q0FqUFB0WDBsaVRlTnhvZGFkVjN0dGloRG8zTkl1bTBqREs1U25lRkpWdTgydDh5VGRkL25tcjZ0NWttSURLbkMrUElwNHArM2g3WVdjNWEybzAvUDJodXYvSGFqL3gvLzNyOUp5L0VRTCttdEE2N2JvczNRZHg0OWhlc2N1Tm1leS91RDZXUENsRDBnUkk1cXE0SlpjR013ZWtIR3F2VW8xWlBxUnBFUStoM2oxSHZ0cWZzNTBOQ3dKeXpaOStReldsNS9wUTAyK0ZRb1JrVi9QTXdiczNYdWtFTE9PcDlpaHlOMTdDUTVGbnVhOGZXWlNtZWFGdHRBU2xUa1lZclJRODFLc0lodnhXcUFTRUFnMUJkSGdpaWtwRFd1R0REWHdsaGZydW5pL2hiOXlsUXRHVFdnN255VTFhUjBLd1pOZzByVHMwMm12c2hVQkRGVE81YThFKzRHcWo1dE8yN2FWZmYyZ29zdDdIcFM0SzFRWjZBNXh4Ymg4cENQc3gvVkdMUFQwWjVla2h5anJiNVVKUW1TaWMvVndhbHJMdDZyRklEQVA1aFBOalVML09CbW1sQWZ0V0FOSi84VndIeHBPdmZDQWg4YjJIZjRBdUlaR0ZFQmxEdWN6eHVreUErckVKOGdrU21UVWpSeFk1aTV4NTkyN2tRWkNXdGV5alhJRVVHem1yWUd6Wi9lZkIrRTJxSXcvM2U3R3UwSCtXenlhTGUxNFp6eGVHaDJwdWg1emdzNGQzREQ1czdvaDFnRmphMUlpR0Mwc0w0dGdiSVVzSVVJVmlKdXdkdzdjeTB6aERtbUt4bEp3eG9SZWpWSXhJTVR5L2tpSVY4dm1MOEFrNmdWd2FGZEgrSVpoRHI1L1NYWGN2YURzRExpb0k3OW9GSEdadFpIeXR4Tmh3RWpJSkM4dGJiVnVPMUxIMzhpb01LQ09McE5hViszZWQwK2c3NFFyVE85QVVvdVdVVEdQYUNUSXROaThlR3E0R0gyS2JjRlBIb1llaExrTERKRzFWYUw4dTh4dnNoblR6NU5tY2EzM2RhUzVUTmlzcmdwODFMck1PdzJDMTZWNFFMbkRkNS90ZW5EUmxwWGo4VjU2bG15N3JZN2gxZ0NjTk9FSDRYLzRRVVBmT3dKYThNOXZqYUhPUlpTTlZPN1pQTy9IaGQvSWR0dktzbm51RldBVmI3djRMbnRESmNYQm13OXVoVkNSYzhyYmZYZ01BeThlVU1zRnVxa1BNRnRWWHpBckNzZDdFMEl3UjcxQklYeE1valFTZS94dHZpNHpETDU2MFFpSTVyTnUwaHhnOTl3RWFOcTJjQ3VjSzVuNDZCL21wQW8yV1BLbTdkS1U1NzVsRkJINFQvRlZjMkZ1MHBlYndKb3FlV0ZacEQ3RWV0UUJyU1k0M3g2ZitJbUNDS0ZwNXZUWTBvNVhrWHZMb3BxZ0R6ejJwS1lqTXFTMVVIMk11UGhMcHZuUHdvdDlId29wb3dEdUxhT1oxNEJTQzJGS0tCYXl4Z0RTNE1IOE0rSldGUW9LZEI1dUJIWlo1eVNtSjhabU04WG1MRllMeHNPcG9qdFBIZWZNY1FEa0xjTGc5QWNYdW1JbVNvMmM1WFN6Mm5hWUZsVVNNQkJhT1RRV2VyMEVHSzBXWG5xWCtiKzk1b3d6c0U5YmtsSkRNYWg4eGM0eWJYU2dSbDdnM2ViRGthWmxUYTV3NVB1MDdaT0tUNmQ1dndYYWFOTUQzQ09ZcmZQalUrUGRTZnZGSHhYTVFTR3NucHRsTEhYTTJyWG40dG5FUjZvR21lNm5FeEd0T2FZRFNOeFZidnVvblhZTndnU0FJeTEyTjVWTFJhUHhOMVlHeFFMU3dydktiNFBRYzF0STE0VHFmazcyQUdMbTlESDI2Q3FWaVk1cG5DbGMvRndzcHYwMGVCTlVmY04vanpZK0R4WEpMYlFtVFk5eFRQZWRmY2tHbnJUdEdaWUR4MHoya0NsNm1kblE2UE1OdGRUNEtubU9GNWY1MU0vU1hEODUzV1FmSDVCNTBQTmpzTDVQcFRmdWNIdFgveU96L1puWlBic1RUbmorek83eHdPUWVlUDFJN2lENmVWZXVJVWl4VjViWm4vVUxqSTdaMGxxRjhMbG1FWmlkTnRaK1l0c3drU1NNVzdad0xFUEpIaFF1aDdCSUEydHdTQW5Rc213M01GeW0wa2lXelRHc0JHUE4zRk1sMzdraXJ4TFJNSThiVGFQVzBjRjVRTFhxWFlSekIrdHAvY010RDUzdFk2dlRhdklwSlpQeFFvUW9ZcmdDbDdPcFdHNGlLQXJhMEM4ZGQwWlU5OWlGMDR0NW9VcndoV0x0aHNBRFlRRW9xZExRMlpjMC96UlZ0VFdxemE4T0FwWUxvUWRoUXVKTmFnZ2d5R280U0lpSjZqSFdtQlVQUFVzeVRCUkNRaFpFRzFWOFJEOGZyY1Q4Ky9mVEwxZ3NtaVl2QzNrK01paW1XUGRqMElGVkN0OWEwYjMzOExnc1B1cldIUkhDclZFKy9iT0hBVGlyOFhjZHhOVHJLaXFJYUFaeGU0OWxkcUJwRzVlSmoxTW45SXJHdXY5U1BkY29BMnJmQ3lSV1VvWGI2Ukc2TEdQbExQODBhQjZWdERsaXd2K09idE1ScSt2T1JDYU9GVEl6bTlaWDZLck1kYW9LRTIxQkdoUXI3UXJVUmlPRGhMRWs5dUdDUVlkN1lSRkNUQllma1FDL1E5czdNU2lBVjk4VmE0R0xhRVVXemJxRXU5MkdIb1U3Y1lIQ0grSnFqRUFxcUVacHlZejVBcysybndlalBhYjNES1FpSllSejB4UHVWVWJyRnJYN2FkRFNuV0xVZkZOWWoycGRzbEFKc3dock1SSG1zMGVjeUsvTEQ1U1MzOTJwRG5sWFJGdDM5aGs4bVNIbVNNS1FNN1pLMW9iVGJwM2dkSjgvM0hWNno2QnAwaEwvamVIWjVvRGNHOEwzWWNpOXozOTR5MUlUNXJRN0Z3dGlPQ1dVeVRKSldMK0N5TmVINFQ0bUNiU0R0MGVLYXY4V2FvSS9qM3AwREtKc2pNWlNRNGhiMittQ3BBc0N3ejZtOVZaMjVEVkp2V1hac1ZyZUV6Yk1VUExuRFoxNzM2R0NZSWhxek5YbVlZTDN6Wnl0TGtvWUt0RlhxU0xjM0VDQURIbWx4cmtqQzN1TGxKRnJ1c1pVOUxMQmtWdW9zRkI3alN5VzZDamZaemRvaFZ3ZS90Qk9yN0h0YXdveEllSzdaQ0xtWVBpTzRYcTJNdTFLUks5amlHVGNQQ2gwbWZhb2JaVG5YTDE2RU54ZlE5L0FvRFlYZmhOWGcwRy9WWThkaXUwL3FTMlR2N3A5RXFXQkMzWlhkVnVBZkV4V0t0R043cStaTHVhOWViZFMrSWJNaWtXY3FrcG9XTjdPVXBhRFNoUzR6N3FmZ2IwTk9EMktQR08zUXA0Mk4zcG9ZOTJkRnBDalFDc01tWlM4RCt3UHQvdWlUWnUwNjBZQzlZZVZ1SDRQTysydEJEbEFQV1E3ZW5vRU8zaGlYN0c1NXJkRkgxRTFiN1pRVWMzZ1d1NG9nZjhOWHR0UW4yQ09HbllJY2phOWdSWlB1dzlSVjd3RkFrbGllS3o5Y0dlUmloM2F2SWFIUzA0YWhDTWhiYU4zMGVTOGNCVlRwNUxIdk9pQmdJTFdMR3dCcHFxL0NjaVk5d2taOFdmOW1YaDdNRGI4cUxoQm9IWmp4VnREMFpBbmpiQm8wQ1p4c0F4bUU1Q2xTSEJidWYrL1RvUkdNNGxwMWh1QnFOODBGS3R1RUFEZFIrOG8rTHFJcW9RRm5jbGt4M3hWNTJSc3JDUHRpalU2WnNVZTVUOW1VaFpUUnhpeW5YRSt5MzhyejIwK0tFVzBOajJWakNZdlk4c3YzNUw4TmhXWitDYTZYTEdra0xEZ1BCMUp6ZWJTVjBoUnR2RHpHc0ViVHZQaWVQRmsvTjR1blJ0KzNKVXNzeHd5NDIrMEJHb2NvdnNZOG9CTENkcy9JYnptRW55TkwydUVlVzA4a2hoVlUzRWZ0dUFBVC90a2V2eXVFUXdkMHl4dUhCSXZZUjd0d3FCTUNUK2Zna0czcnM1Zy84UHhGWUhQMHdqVmVZU3pMcDlVWEFBdWpqOTNEeUM1ck9qOXdBU0ZQN3dDOWlSTUk0dCtWWEhYTzM4T0o5N2pRVml2S3djK0NETFRsT0FXTTB5OUhXaFNMSEpnbnBucHQ5TnQyMkV1N1hJMmcvMktKcDJ4VWdKWGFxQ3FTUFI3cDJPQ2RvS1ZLamdhWGh1ZXlHeDVreG51ZXJnN2ozdmQrcG93MFRVYkI0anlTQkpPU2paWitiQUx2TVBVSG9nS0o1aXZQeDc0YndlL055SGxoN2ZpWjVnS3JBNllBd25UYWRhcFUydjRWZlB4anVSSlRBMyswcE90MjM3TnhwNEJyajhpSWRKV0VkUW42SVlnNG13Ujc1dElEV0E2N2krb3pjSU54STdDSlhJQW0wc3ZCVW9UbThBS082VGxVUUgvQzZTdDMwcGJOaUdpeURoWlgvZWxaaEpUR0x4NElFNXg2d1U1NVc1UnY1WittYUp5S1hmVEFCTE90V2NNR1MwWjNvUGtTZ3hSaXdUbFEzRERFNjFhTU45Nmg2aEFQZ2oyZHBRRFkxUWRqQ0ZadU5ZOGw0NWtnbkdhQ0RKclRjUndWYVQ2NFI0OGNrclN6NzgxL2szR0F6cHZMV0N3STlaUnRRWkR6Z0JrQWdyN1lYWTZOV3dVdm1NenBHMXArVDFRL05BN0hIUm9EYVJKTEduZ1dIMy9GRGEzdUpIc1JLTFRCQ241TmRzczhQM3F6Ym5neUw0SUlWQVlYd0xzT3hwd21lT2cwYy9iditqSTVRU0dUSnpiSk1BMnF5TkFEdTlKMGdsODVRZzV1dHVnVzJmV2FBQ0ZXdlJ3SDlVaFI4QVdGekdyLzZHZ1JkQzltaVozMllkU0s4WVVESVUzUEZKcFd3UWJ1QlRuRXhmdFEyVG1CZjlzT3FPQnJrQ01NL3JhT0pSclBHT0pwRjFnKzAzZUplR0ZTeHpoSXo4S3dldjZ4SGtUbEtKVWxrVWZWbko0ZDUzZ2t6dDE3SEF6eEVzSDJReFY1Y2F3cTNLTkllUjhsNG9BSkZBK2dmTUx1K1o0b0k0R0xIYkxScDFyaVlQVkc2azQ1c2lmK2ZjYkh4NDJYenI0SE5RbVRzOGJzaVVKbXNsK0g2b1lqZGRQU1JjcFlkM3dMblBvVGNabEpMbTkzL1pZVnJxbnpPeTFYYVliYmpoYkRHK3NZbmdPcEpubityaXRmM1RCTXJzSTNIRG5tRVlCcW5aVWlDTjVFaGo3S253S0I3aG1wZXJLQXpaajdMV3VBY3g1QmVtMG1zajBBV2xRcFcyMkdUbWtJeVRadGxUcEUwRE51S1htdFBVM05rSVd5Z3lWTjFvM3FhMDdJQ2dLdHNaNTRPUUlFa0tGYnJtS3QwbGswd2pKNHBRaEZvdFQyK1hpekcrT3hiclF0VVlEWHNyVm13aG1EYk85dTFnYVZxalNuZlhCR0dVeDNZMHJGUjhHODVFTVZWVFJDdGFTcnlqT3F4aE9OTUFicWpmY29mOUwzWlJiT2t5WTFMZy9UQnFXN0xmeDlsMXluWXU2ME9PcnRtOVNxYW5IdTFkclZWbTJLUlhvbnZJVHRtYjZjZkZKYlNOckdJcTNqWFQ2NndudUVocHBEdWRZSHdkN1lCOWtXOXRwb0pPOXU1UXNQWGVMNnVCSUk5SUlvZWpOeWhBTXNVRU93YkZzSFczdmRKWmVFaVA2TVZ1R3RVaUFYTWR6SW5BbWRwNDRkYXg3L1hQL3lyOG9mcmYxei9BSDVhT0dRWk8zYk54UklkSDV1WG5SQVRQVWk5WlRYYmltcnpEY3NUZC9UZEFoSnFzbEVYTS9Ga0RuY2hkanZLeHNrNVlaNUUwLzFjNS9UYU9zenVTSkxRR3NRN0d5LzUzRzNsYW5Ed1RiV0hBbGNmaXU5UkZwYlppNTB0M1NpQldBNVhzRWxhaVpRL0hMeWFFaWNRSS9CT1NNYlZiNDlSa3RWUU5zZWNtVDVJWk0rSmFtK1lKeUxXWk5pRmdXQml1MzRkNDdKY25UQVNUZDNPQlZYRFZ6eENocEpWaHcwc1BxTm5DOG5QSUZEOStINXNuck43RlNUMllvWlZPdGd6cjNKWXh5MGxkQnBCOThEWlFUaEh2WVAxRVYzTGRSTVorS2tkeWRtRVNMbUtzelhnbnVneGpEb0hsRitIZUVHUXVoTXVjTHNWei9URDEwV3FUN0pQTUh1QXdHdXM1andkaVMrV2pVcXI0eUhhRlBTRDFSQjI0WHkxSWdrc2NKcTJYenU4SUp5WStrMC8xY2wvMHA2UmNlUTYyQVZMendGK3k3eUpjbndpVzlCdFdQeVFET3ErQUNFeXRXMzkxalFMalptQXZpeGlrbDlOVzdac0gwQ3VWOGQvbmVGVUwxaitUUnU5Mk53UDdvMDltUjA3ZGJiM1o0dDJSQlNqTTR2VlpjK1pSUURsUmZ6TmNkbVJCYld4bGZPMFFyV2Z3WE5JV2Q0Z3Z1eGNFakcrM0VVOUpKMUMydXpwdEhKS1FoU1ZDTTNoZDZETnVLWFhadWZBQVZzdUFCVGUzeDVPSWduc2RscXhseHpnWUYxQjFiV0p4T2FWSWJVMkFGMWw4T2xjbTJVYUpYSjlkYlAvN0g3QzBMdXBDOU1OVDdjc2hOV3A5czg5Rmc0b0tyL0tmZ0NvaFBpckVYbWJMZDRtdXJWaUd5ZWRhVG85UmJKUGZmd2E3bUg3RFBBTVM3RkVYckUwenNnUjFOTTRNMWxneXJlalJDcDRSNmd3R1dIVnh2VDh1aExXcWkySDZCdEgzamlKWWxybmlac2NvcGd5d1lLWU02LzM3cnphZ1FoT2F1R3VzUGVxOHM5bXcrNjFTaVVvMVFRZHQzdmVuR01oeUdLVTRaRW1oQWZrKzNLNGJrdmRMSWpaMGFiSzk1eUx6Mjd3TllzTCsvUFlEa0ZET1BPMDhsU2dja2ZWUllkNVJ1dmRVS1NYYzRsUWxJdUFnM2lBTjV4Q2NTcytYK2dBU2hqTDZsNEpLQXBmZjVUWHdZS2pLbTN5M0Y5aE5lUEZPOE83N0d4MHlvVkROTXZIaFVBQThQWEZ4OEVucDJPQXludFM4Q3dpYTJkRnJ5UHZITlhHMzFBVDRORlc0a0R6bDd5T0VEWFVrK2FrQXU1ejZoRTlNTnNxeVkyNnN5aTF2OTBqVi96YjdoZEUyazNzUCsydU5kbXoyMjR6NU9LTUtRR1A2aTBRS2tRNE8wS1NzOEtTVXl6RForSEVNemRFMWFwUy9lVmFlem12QUNPSHdyeVpDMjRRRUhBQTExMlc2ZUpka0hBN1dlUDRHWGxrU1h5dzZyYmFBRXVZUXpzTC9rNEpHU3RzeHpRZ3ZteFBzRnQ2MldCdTNTNTBWY2lxR3lyd2dXYk4yWDZ3Z2Q0dGNXQlg0QmI3Sm1RRHNEZHg4U3hzczE0ZFUvQ3VNRnVZbkszZWp2Y3N6Wll2UUxOemc0N1VPM1VoK2h3cUU3ZURaNzluZHFtZC9iQXZxK214SEpRWC9vL0xvcG83bjJGbmZKbElzMWpPWExQSVd3NTJObStoMHBsZWwxUGdMSWgrb1lKd0F4VHgrSWdjTHdwMU9hdkZnR0Z5eGhQbVlwUjRpM1hKYWFObHg1azBaNEZYeXBjK21leGFhU2RYeDM1VXMzWmFwNk15VzlXaGxtbktkVVlJV3REN2hNK0lZU1A0OHRBYzVRSFB0bjhtQmllRGZCNjZubzZNV3c2SnFGM09uSDNzeGMyNERCNXAzUXlNWnpZSFhrQTlVd0lSN1ovdEY5cTJtNTRtYW4rQ2xucTJPbXZtbE01MEJ3UWtTd05OUlc1SFhqb0V4Z2hKUkxKUkhSby9sYVE0TFNReGVycFI3SkRFZSs2R2ZIcUpLOEVhV09rM04zUjdLWjk5UnFma3ZwamZ4RGJRNU55OFF6K3VGdS90ZEpkS0dGek83SkNrVFlmdWVZUnAyOGMwTFh5Zll0eUsyT0dOcS9PTW5LNFFQVDY0dHpIZ3NnRVNJWnN3WXRUZ2E2LzVzN21aeW5JMFMvVWRIUXNZc0JIVHVUU2RLQlJNdnp3cURYQ1VpT0kwcEd0R3UwWXRPQjIzZzhMRUhZZFJzTVVPUWFtOHUvbEtMT3pHZ1pGS0VLQm9DZ2tLbUtFaGVxSG9jRms4YkwrVWZnTkxtOXRHTWtkTHdSNnhrOTZ6aGNOZVI3ZnUweDQ1WnhqbEpEc0J1MFIrczJqWC8xTkx6b1ppejFmemNoSno5QURqek9PREhTRUQwaU12eldNNUdjQjJRUGd1MjRjbTZoa2JDZWRJZWRsbGswOCt0U2NrclhPMFZoTkJiWDk3MFU3Slp2OXpXbzhhdkpYTkJhQUNYOTdYWWlTcmRvMVZ0c1ZBZFhyTlorb0FMa0pJY203SGVySXQ3Y1haUWV4TmkrdXp3UkFQRm1XeWxBNWNsOWVac0xBU2V3RGZnSms3YlRmRXRWbjFPdDVvK2xJeXR2ZGpVZjNLWUlCMTVSQ0ZibmNMaEtmcDJVb0VpNW5TaXpWbHQ2Sngvd0ZnSzlCbmk5ajRPN0hLbysvSFV2VjZjcTNCb2NyMmN4UzBQSWppNEJhdTZKd3FvQUdpdWRPN204cXpocDBkZHc0ZURNeEJZM2c4a1krWTFxM09NanRuL3FmSGMyRmVSRE45Ny9ESU1UTWgwUGw0dGZicmNmSUk4cXplVmdEY1FQSEo4NWc1S0k0RGFmOWhNY3YxK3c5OE5HNzJSYVVPWEJEVDd5OWFoOHZiclBlWWFIUEhCNVV6VlRPWTMzUWpVQy93eE05QkFhZGUvdTRPaFNWc09oSHI2VTY3TytkVzJBb0IxU1BISXlTeXd3Q3lyamYvaWkwSjVtL2JDUVJpbnZHb2U2eHBldEtxZVpUV1o4dXY5QVhGRGxOQUhIWTFpRDNzOXB1QUNmbE01UVh4NnVYczhlZE1NWUNQRFlKUnNlKzFubEUzZHMxdWFGNkFraVRuTmNCaWJpZHh2YTcvR2JOaWxzZngxKzFDTjRUVEFXRG5VYlE5Yy92QlhneGJvNzBOSjErelNPOHc3V0x4Ykhld1hpZXVudW9hWEJmLzFmdTN2WWdPb2Iybms0c2M2ZlhaeEl3OWdPZEZlRU14REtDc09SanFNMUxiL1AwUjl3aDZqcjd6ZUxXajhzcXBLdDcyb2lDV25MbGNGWU5nVm1nZVRGaGF0TTZBcmhid3ArYnNRMnVLQUlEUEN2eisxTXZvOGpxSHBYb1YxcUlVRC8xd05jY2RqWGJLeTJFT0NZV3hQZk1tSmlBcnBzV05udlRmWjd6M0d5Nm8yRCtoVVJwSzBMOXF5aGN6UTc2SjBLemhHVzdXWFlvSk8zM3g1c3VGY3dUVjQvZ2pPMm1LUXlUM0dWbnQvRG5JdlBVelV1Wmh2YVBkT1pLL2diZE9xLzhRUlE1eVFXVVRsOTJrWmU4RWEybkNEUzk4QVhMSDJFWFZwUzEwNFRRdlRST2JNQ01IK1U1RnAzbDRxMmF1dHdISkFXdElEclJHRmhhYlJBaDZ6bG90SGx0dWh3RTR3b2FWY3pqMjd6cVZ3OFhCRGxQckJXQkRkQTFGYVBTUXlmcVFHUnlNTFE1WHVOMVlEakV1am9TZGlkZHQxcFBkVzZaeFA1RFc1M2FZNXI2Y0UxeWNoK2MwUk16WjA1cHdMMkFTb3MvbHBETXZkWUdmNlJ5UjhnYzQrVElOem1kbVM3a0o3YzlqeWJDZWFIY3JLMnFnc3JrUGljajJlTnY4QkpvQkJ3bm05and1Y0pabzZkR1JIaXdnbE1Vc3VJOEZXWmFuZUk1NjBydVpiemcxQkRxMENyUnRXcGp3T3BqTi9DNFhIZHdTSU9XeE5HUTY0OEdwVit1S0VESWZyWUcyUXBCT094Mm1KVHZOVVlMV3U2TzN5K2VQY01DaXVMMmQrQ0FrTCtpQ3JVTUVESmgvK2Rna0R4Q2N6U0JiM1BsUnZGc0RBWDBPOVpTaU9zbjY3YmNucXRueFZCMnVQWkpqbTBHYlpZM3hoZHMvczJRa3E3TVdJY1QzR2VOYlljaDViL21QTzJXMWxtZVBWZzdkRGhNSjAyRWJjOHA2SVJibHVUdzJpMDdBNHo0cmZOUkJqa0dWSDUwemI5WWdyUTd2TVZVTXQwSkVKOGhGNmlDYjlTS0lUV2hiU2VtYUxwMUhkcEFLenppcWgrakJJOHh6eWJ4TlVnNDdUTTJUZFd4RVBoeU12ZzdaY2RablhKQzlpd1hNR1g3MGRzZnRvVDZSTXVoYWg3bzVFK0FJNHRjeVdCYURuNW1KUEtWMURucTVYeXNFaXIwRm5TdUtaNzRIUkxQWXJVMGc5c2hYZCtPMys0eUN3N0lrSndjZjQyRXEwdEwwUFRFL2JPSEIyZVoreTNWc2J1TzBoekh4NGEzWnJ1eGdPRXpiVG0zcjVtK1ZkYktzMytJbDV6VENWSTdzYU03Tm5ublp3Zko1RWpSTzlpS0FRd1RaRFdLeFdsOTN3dUZnLzRhZDVjRmF4RE80N01PT2loVnd6c2c4UisvenFpM3JqemJOZ2RYUm1tUkVhWTJuNlB1RlNqZ25TZllRem9tT2ZlUVlCS0xNcnZrendjN084Wnd2eCs2ZjRmWVBCRW5jZUNWS3o2bFdUYVlybTIycGNUUkxFZEE5MnF2MU1jNVV1Q0hhMi83MkJSc0JMQjEyQUs2SUhwUEx4clBmNUJ4Y0IwYlplQmZ0RkxHVXpFY0I1RmRldFUzMkVCZkwzUnhmaWJxNkFQSVVyYjYwMlQ2ZktkS1F2QUF2WTQzdDVxMDJ5Y1Y1WU9xZ1hQdXNERFdyOVZxTjhKWDk2L2tpMklUVlVEN1VZVm9Yb1BUbnNqMy9idHlDamNZaitScWN5enFOeHk0YmVlWGptTW5iVTJXZzR4cUtyL3NkVVgyS1FLMDJyc2V5cDd4M0VKK1JDQzlmUUt2bDVCK1JmRzNIbmRzUmxBYTNRd0FJbVYxTEp2ZWU0dWhsUWtSRzc3d0pLWmZzQ0szek9RZlVaeXFtd3pCdFYwcUVOTFlXdUZ5bWRxcWpWc0Rzd2ozc0V1d3RObG5vdENLei9VNmZIVXNtRE9kZUdvZnpzM2VkNXM2bmRhcjdER1FNVzBsZWlMUStnY05SMkZ4b0hSMEFlK0NJUUw2SFNjVjREeCtZRTJaZWtha1lGcklLc2ljTGJBWmdHN1R0Ukw3T0k0R3NCSHBRMFE2aTlqRVJuVWg0U21sTjljVmZxZng3UXVlUURpOTRWUW5FRG9vTVR0WGFsU0RER3RuUENvSVEwVmxzQTdXSC8yODlZNXdzNGZscjZIWWljMnRTQUtEd1RIekdBOUFzMXludXRDb3ArY3dJVC9CUmJhdWUyUlpPSW5KOHFWeFBtbnRPV0p4SmppSmJCVlZ4anVDUVpxaUN5N1pyWjArWVBZbE9SQXlFWVBTaUZMdDEvZ1ZjeHpsM3NUWGtPWk80bk0xb2wvUVpMc1JyUE0rL3duUXVISURDSWpwdWJsdUp2ejVCeko3NmhCNjNOTktaWE84cjZ4dmRZNEprZDVCSnErSzBicnQ4dG1NL1NuV29zTU9ETURFMDRISmkzRjJEeDRYUDhyRXY1dThkd3VOUUx0TVAzVDYrbkt4YkNjTitoaXZEYi9PWmlldUFHUWRPWlAySUc5NW8xZmM4cE1xU3B0UGJyZkpUZ0FZZktHTnZrdk9SdDA4Ym1SZjIwVzF0c0xUeVMrRXA0M2FjNG5PNi9aMUl2dTB3UjdYRTZ1eGkvTm1TYWY2KzdRSjg3R2lTNVRpdUdKYmtkVXJIaXBPMlRqc2hQdHV6dFUxV1BFVmt4bXNqa0djc0h0YTR6SzlqcEdBeFhEa2haVjlXaExQUVkwaENRZlpZbkM5dm5zbEdEMGVuVG84TkxTczJlTENndGlFTEZrUVBNQnEvUWszRWRLRVNCOXgzT0dHL09xemJjK1U3Ty9RTUVtcDlvek01WVhWTzdRa2UzVGtzSVU0Zkl3TTlaSU5abXpIcVpSZGV0MzRaV1VVMEhRU2F4MElBRUIxT2pIa1I4ZkZDM09YbitWVXpOYk93VG5NMmdlVEk3R1hkbk5QUFZ0V2o5KzFKOG5tRVRzc2UxVFRzT1ltaXFaekp6dDFDVWpiRWtsbElnaEpybm1kYkZRZExYZU04bUNHK0NDczczVnM4UFU1OW50SDBIaXdGaiszbnVUMHJONjJFaHFjaXFPZXBzYkZYUVdSQ2l3eXUzY2RWQ0lQZ3pIU0tsOVVWaEEvN2pYeWFGVngzbnlGeHp1Y2JFdUZEYWdlQ0VmUnB4cktMR01jRzFlYzh4b1ZGQzVaTXJzLzJVZ0xIWjhOZFBzT2Fzc1kvSE9BU3BKeTlyUWNkaGMvc2N4aDVXUlQ5QWxrZWpCSUMyRnJIcmZMU1JjQ1A4dVVXd21rblRFNk9WMkRZNEZPckpnNmRyYWRIOEN2WHF4Yy9uZ3dBek0yblhaU05wR3Z5aEdhQ2dxQktXSjR3bEJNVVhyTWFQbGZETTkwNUxibmtYVXU1SEJ5MWJ0NGhvSW1jUS9RWW1qeHJINUFkYnNXWnlDVTVCczRIakhtVU84L01obXpydU1oa3crQUxod1RtcEpycmcxVHBIMTgxVExOeU1TQWZJWVRyTm4rRUpZUjBDb285d2ZLd2E1eG5SdGd3TkNxUkZucmkwSG1IUFVyaGN2MmlVMW9jZzIvZUh2Tm4rM0JjWnpLa2RVb3hYZ0xrWmhjTWxPcTRNMHo3NGsxWk0wY3FQN2FHbXZaWGdIbTRwRU54MDMwNVRlRmsrZTR6c3ZSOWJTZ2JVL1ZPakVkc0Z3d3kzemEybjJlWmZPWVo0SnV3NW1CdkcwN3hSTWY3UTJ4WVJDZGVXcHdSZzhmanp1RDBFU0xUbThNanJ3b3RkRWhsUStaRGYxNVBVNkVoelluaDMybUVkY0tNRmQzYmlnVW5wOFg3MU5GL3RqbExNMWdPcENqVWFKdUhSSFIvWjA0M0dHQzN5TGY5bjhuUW5SRU1IaTZmS3Y3OXlVQkF0TVVGMzFhNHFicUxiSVMxVTd0dkhNWGlWK2RPT3RMRDZoTllLaUUvenVESk9EK05Nalo3UHM5UDE4L0lIMndFc0wrY1lnU1h4dGlqRThFc05Ud3R6cThBL2QyMnh6LzJDSFQyeE9ZV0pDT09DMkVHWCs0L3FzYUovUTdiUVFCWm9ZY0d1bFd1MWVvdnJORTVydHNwUjU4WWJNVUw3S0E2by9oOTY1bHJ1VEJNMU5ZR044OEFuRHRnQThGaG1Rak42U0RvQmVaREJMT1BCYkRqSEVMd1ZkNWNmWW1PdHBVQ1RRSTMybWRJMGhmU1pXMXZQNC9WSWFwRHhsNms5bnZMQUJPb0tmS3VNN05DUExDanZ5SzFST3FlYmM5NDdBaFN0OS9YdU8yVUtJK2pNbndDRGpRdTIrNEVQS2xXTk50bjJ2SXl2RWt2ZHFURXBRNE5qdDA3ei8wZzROakNNQjIrRG5URG1CRDBUc2YzSVZCemdOdlE2L1l6aGxOYXJycFNsVUdmdStmRnpRSEY4OFVnNDhldG9XQThnQi93TXp2TWF6blYvQTd3dHFycTdzNlVlbjEyaEYxUXZOZHRJVnBZQk1rSjA2c0ZUTVJSTDdPNGxoVTJzOENCMkhZR2FFcXdUL1hmYVlIeWNNaXgrWDM0a01KTUpCME9uTGM0MHJacktmZ0hyWEZXZzZqTisvdTRITVQ2NGMvYktHZVdEUUpqZ1l4ajc1MDZoaWdrREZuRkE0S21lVnQ1REZlOFFCWVk5TGQ2SU01ajhIYlR6UEVOMDYwZDh3VW9QWEVrZmkwUFBRaWtRUDd5MlFqczJtekIvRlZLbG52WUh4NThPQTlzM1B5U1RVZnVSOEYxTEE4M0NWaTRNd2RMMzI5d1lwV3gzajYrbi9Lb2F1TXByTmJ1c242ZThUTU9oWFhXUFFyOWNRZDlMQkRzMFVrblpwbnQwNEE5cUt6WTRvbmE4YXpUcWRkNVhzNHc3YWF6UUl3a0ZDRHBBQkFnd3JtY3IrYzBzcFhaekl0bXVCc1JvRG9VR2cyZjVEYW5ZZEU1RWRGSUxtcWRndkJtZHREeGRNTlgxV29OdlE5dUVRaWJkYURKUERYckxVTGIvRERIZVNiYWV3MWp3dU5rZnZqaXlhdGJ0R2RCdVBYRHlOSDdWNW5jNThEKzRQUzFCd0w1Rm9qaDZaRTVVN1F4eU41Zkg1UG5VOGhZVFo4UVVjeXJCeUtvVGRZQkgrNFB3WW5JNXFNZXN6T3liU2ExTnNwc01TQ1RuTWQrZlVLeVUzNThJcFVQRXdpT2tyV2IvTlRoWTFDRk5WYmsyRlBzT0IzRXJKVnFiL0k1S3BhUHlLekxOWjFBYzBvZG80OXV5RUZReHE4UUNmZVp4RHpFVFo5VDFxV3pEblRjSHFDOWZGcjBqTTBuNk93RnJRbE9EU3YyZlNWclZzcnBoTVZKVU5kbnlDQ1kwSUZNSTk2UTJKdzgzajdQbDR5T1dLOFJlZkxCSVovd3RYeFNIamFVbStvWjc3UXJKV1B4WEU1eFVDd0sxQWVzYktPU1RmR09mUG02UlBuTWdjVjZ6TlVTd3kyc0hpWGFPMHY0U0lNWE9lUVNORHhKMHRQNGZhYmFxZkZoL3N0YUpBSUN2L1k0Ynp0OVZ4WXBKRlVPMFhZdVR6cTUvbmtvdS9IQTFPeEpMSHYydkoyMEI3TnA1clBHTXZCeFh5eEZndm90RHc2WEIrakZicys1K2xpTzNMZlFHZWRJcCtyZXNyRzU3dWpjM1kzZE9zWWZZKy9ldm9PMTc4dkJFbmV5QkFNaTVFQVI5YlFkTHVPMGN5bTl6elJWck1zRFRzTmdSbTU2Ry9iUW1DWTdRWVBGdnNFVzNwd0xKRlo5VGthV0lqaHp4RWZ2UVdLY0F1LzRjWGpWTmdmcFdTRnJYV2RCcXZ1QWg0b2RYd2c2Zm9YUDVQcXdHK3hvQm56NnRJUmJ0TThpT2FTcE9mZlVzYm1Pa25qT3VJenB1ZkFjeXJmdzVzc1JyeXlKRlBQWHM5TXd5R2tUdU04NmVURStZTmI1ejQ0cjhmekVkb1RQeUF2NFBVNVhtVjEyNE9nQ3EzZHVNTG5JYkN0bys4Z0ZBRm1rMURxem8zem9uT3lMQmVSbXBhTWVSY0ZKelQ2WlB2dWVpNDFuUzU3WEd1M2d1WS9UV1FCVEtIZUZWNjl0VFprSCt5b21pMnpPYzl1ZUhjYm5ReC8wRngrTzFhLzNUQ2kxMU1oT1lHSUhyTEg3YkNlcnN0bERKOGRWSitoNnpPZkRQUndsa3AwNVdud0tUUEl1VGQxY0k3cFh6elB5VDVsZU5sdzYzZ0pHOXFBQ2xIQ1BMZnRRaXM4Q2hqUFB6dzQ1NjFFY1ZwbGZSL1plMklsUG5ZT2F4QXduODNnWmNJZ29DL1Q2eVZxRGJQWThuS2RkeldvditzTktCNFBSOC9qNEZ5NXMrckE3YTNGOG9wWjFteW1jWkZ4MDNOdXB0L1l4ZFAwdFVINjg5UjFuV3BXSE51d0tNdVdSMFFNSE02N3J1MC81S2Z2emhWVk9WdC9TTjVEVUo4UTVVTWFIUFZocU5NeVVtT3FMeEIrV21ZLzNzWWNJZTdhMlhZNlhkaWlpYlc0NDY4OU1aR3dheHZ1NUp5T2N4empzYmYvVFkxN2ZNanViQ3lDYnptbTRtd2ViNHpxUk8vbFlZZWh3OHJHUHk5UXc2SDZ5c2RzSDErSzI1N0EyMmhaamgyVXhreE45aEE4TUVaZUUrRHByYk5rc2thTVA4KzArb2M3UlRFZndMaXZHaUlSZUNuYmg4WUhzdnBzeWNKdzZFSXNmNVZQU2M1bFdVTGY2WUx2bkhHRFllSzBjUko3QVR4N2lCY3lMM2ZSSkl3NC94UE05S1gwajdscnN1emxubGxkRHl2aUloZWMyTFkyNWZQRk1Cdy9MVHI1Z2ZZUlRod2cyeEFlMjJ0a0U2T3poVStIV2N2NjRvK1MwbzIxZm9NbWplNXhIZTVid0ZKK3JNUUZseDFoOUJITWYrdVJqSEdCUitkZW9xZnYwejVpWVBYNE1IamtTeC9OcVdHVWoyRzJIRERyZ0t4TnBZWEhkWnBYaVE1a0x1T0Njc21id1JRSWFYeXl6OERQZmVvbTg2VmMvSTRycXRhd2ZOZXEwVWoyQTNiSTR4MGMzMmJuc1ExN3NRRDFQdWJLcEdOc3c3enoyUmJTWVJoV0hucHF0NHJjdG15WjhFb0FteEJiNVpycWJrQjNuTXg1YmFYd2l4T2NqSGgzRGlUcHNGdWdDbHMydU1xdHd5N2JTQkRuM3NEaDhFZ0JQd1BoVFR5UEI1UG5kblY3RkV2di9lWjh4aDdOOTdDS01TQ0dmQUZzSlJoNmJuVEdyWXpxNVBYdXNXWjJDR0lmUGQ0SUYvcjNoa2RXNHRrZDRQbjdya1lHYnFITGVFTzhDNnpCWUUybkVUWk9nVGpxUlFUc0lDWGVLMmVlY2RzYzZ4TGF1VTFXckJaaXRPZ1BiYTIxT0YvU1F6dkczVmt4Z3VYdEdCNVdkcHlDZFZ2N3VXQ1lUVXlMc2VDNEhXRnJ0WU10S2RBb1Fpc1FKNitOek5Ddlk4WnlSS3c0OHhRQ2hhOGdjT0tOWlZDdUtnazhwZlh6Q1FGWEtydkE1RTk4TzJlempCNnI5dmlqZjVUTi9HK0sxT1B5Nk84b1NVbkk3R3I5RGU3RjhJK0Rzbm1XajlUMmZ4eWlMSElvRmdJKzY4SjU3NFN4TzNhN0w1OFA0YkowQS9yM3FwU1JCL0V6eGVScVJmUUlUeGhpQVZwakZtRDdjYkp1MjlSamZrdjB6WHUwN0J4K081eEMrZlc1V1B1bW9lY29ZRVY4QWNydjJQTE5Na0dmd1JWWktVTVNKc3lVaUhqSEcxOW1IcVR1KzN4NlRIczZ6U2FCZXdJZkQrb29QZEE3MkhIK1Z1eHpXSjltcEJ1dDNqSHkyclF6RjNDcm9hbUlmbUx1ZE1NQ05RZFJzci9BNWo1czN3MkJadmV2TUFTay9sY1NPTER6UEo0V09MK05Hc1JseXFEemZYajIxRHo0Mk9QdG9pY2ZrY2JTbWZKMnoyNHVsSG83RTVpcVFpaGFrVHgrVEdwRGVNejFDMlVmNHpCMzE1Zk5VTFBXNTIrTmpxWjk3KzF5bllCSFU0eU5UblRSenBqZWljMzBHZWZsNXh0Z3BIL0xKQXNRWTQ3d2RhV0NWQTRKV2NUVHBNTjN0d1RUL3NtdTdWOCsrK0M3ckFEa0U5eDdIQ1ZodzhucGc3SU9wSFhYbzh4cDlxT09wL3ZGaHlMNFlrMzdVMDlGQmt6YkgzYWdEQnh1d1d0MjRPa2ExTldBbGowSVJGRDZ6YVpZR2VYcmlPY0MzV0ovbHJjdVd1Kzg4N2F5ZnJ2N2hnYVhqOHB5K1Z5Sm1kNXFISWMyV3Jqak13R01nS0JmVTJObzh5K1VyMHZpK2NWdWo4K1Y0ZzIwQmswK3N3NFk5aHVYQ2lVR09UWGZxR3BUWkp5RjUrajVmbjdzbWY5djI0enF4L3dUNHV1cFZQSElnTkhnVzVJRnVQN005dm9STGZkVkhEOEdJQWZmc0FjUjlHdmVURDBBYkJkbUhBM3lQZWVFWExkS0dtNHI3b1o3UFhFZjhCQ0p2blJxdjl4bU5WdDFHSHc1OWhwMWpIOFJ0SzFVc2kyRmxmWWJ0REQ2cHduejd6aEhFYzV6enJxZFFEQmFtaFN6cDU1bnpaYXNadm9FNUxnbms0WlRKczF2bGZFblRjWHp6MUpkRUg1eG1raUR5QnE5RDhyRmpiSWNGbC9MT3hmV2JnN1FteWhIV0R3U0J6NzQvYnFmN25HT3M2dlUwd1FmTkFSbk9yTHR0NWFocTYvYzh4V1BlT1RuY3MwV1RmRllyM1I0cHB6T2dUenpCUnk2cm5BQ0U4OHkwSncyV01xbW5pK045YmFheGU4Q0dmb21Dd3dMcy9mZzhlellWUEJ4a3JpdGFnV0NUZ2djelBUdkUzNGR1SnAraW1CMndkU3IxWDJ2WkFFRmo2RGVBeldLYXhJZHdQekEzdTNraW91TTZEMUpLWDVxZWZNdEt1ZEpsaHB0bzJIMU13WnVkdHdYRXF1ZWM4d3Vhc1dPQXJHTys2N1FqaStXK1BoOS8rNHFURmlXMERpQjZTTktHMC9odHowVzR3cGkyUmw4M3U1RVM4Z1BkeWZaNFBvaVJHYnZpWmJtbE5ZYVdmRm9saUxCWXBqU2ZkM1lGNE91RUZMdVgxdkRKdTJ2WTh1MkQ2dC8yWldRSWR1NVVtM3dWQzlXNmMrUnQ4YlBaR21kanlaM1l4QnJiTVh0Yjd2bjZDSEVjdy9QNTZwQVZiS2xaT2tDNDVJclM5VmtNZGR1VVo4TkVzTjNrdGtOM3diYmw3R0JwUXdDMm5nMCtub280OGppYXI4ZGo3TFVBWnY4UFBQZnZFYTZPMFU0QUFBR0RhVU5EVUVsRFF5QndjbTltYVd4bEFBQjRuSDJSUFVqRFFCekZYMU9sb2hVRk80ZzRaS2hPRmtSRkhMVUtSYWdRYW9WV0hVd3UvWUltRFVtS2k2UGdXbkR3WTdIcTRPS3NxNE9ySUFoK2dEZzVPaW02U0luL1N3b3RZanc0N3NlN2U0KzdkNEJRTHpQTjZoZ0hOTjAyVTRtNG1NbXVpcUZYaENDZ0h6MEl5TXd5NWlRcENkL3hkWThBWCs5aVBNdi8zSitqVjgxWkRBaUl4TFBNTUczaURlTHBUZHZndkU4Y1lVVlpKVDRuSGpQcGdzU1BYRmM4ZnVOY2NGbmdtUkV6blpvbmpoQ0xoVFpXMnBnVlRZMTRpamlxYWpybEN4bVBWYzVibkxWeWxUWHZ5VjhZenVrcnkxeW5PWXdFRnJFRUNTSVVWRkZDR1RaaXRPcWtXRWpSZnR6SFArVDZKWElwNUNxQmtXTUJGV2lRWFQvNEgvenUxc3BQVG5oSjRUalErZUk0SHlOQWFCZG8xQnpuKzloeEdpZEE4Qm00MGx2K1NoMlkrU1M5MXRLaVIwRGZObkJ4M2RLVVBlQnlCeGg4TW1SVGRxVWdUU0dmQjk3UDZKdXl3TUF0MEwzbTlkYmN4K2tEa0thdWtqZkF3U0V3V3FEc2RaOTNkN1gzOXUrWlpuOC94cnR5WXZEUmZHOEFBQUFHWWt0SFJBRC9BUDhBLzZDOXA1TUFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZrQndJUkVnK3NoME9xQUFBZ0FFbEVRVlI0MnV4ZGQzZ1UxZDUrejJ6THB2ZUVrSVJpQ0MwUWFnaGRPcUdJTkJGRVVjRUdJb0lGcFBoaHVWN0FjbTNYM3BBcktnb2lJQ0FpdllsMEVrcENTTzlsZTV2Wm1mUDlzVHZEN0daRFVVVFUvVDNQUEp2ZHpjeWVPWFBtbmZmWENhVVVmdm50WXJQWlVGNWVqdXJxYXRUVzFrS24wMEd2MThOa01zRnNOc05pc2NCbXM4Rm1zOEhoY01EaGNJQmxXYkFzQzQ3andIRWNuRTZudFBFOEw3M3lQQTlCRU9SL0UwRVFJTjhvcGVJcm9aUkMzQUFRNzFjQW9KUVM5OUNsVjYvUFNGNWVYbHhVVkZRVGpVWVRwMUFvNGhpR2lXRVlKb29RRWdrZ0FrQW9JU1FVUUJDQVFBQmFBR3IzcGdEQXVJOG5BT0FCc083TkJzQUt3RUlwTlFJd1VrcjFsTko2U21rZHovTzFITWRWMmUzMjZvcUtpb3IwOVBScTkzR29iR3Z3bmhEaS9aMzRHUUJRUWtpRFY5bEdHWVlCSVFRTXcwQVFCS2pWYWpBTUE0WmhxRUtoZ0VLaEFNTXdFUDlXS3BYU3E3aXBWQ3FvVkNxbzFXcW8xV3BvTkJwb05CcG90VnBvdFZvRUJRVWhPRGdZSVNFaENBOFBSMFJFQktLam94RWJHNHVFaEFSb3RWci96WFFkaGZpQjdiY0p5N0lvTHk5SFpXVWxhbXRyVVY5ZkQ3MWVENlBSS0FHYTFXcUYzVzZIM1c2L0lxREp3VXkrQ1lKQVJJRHpBak1QSUJQQlNRNVMzb0FsZjE5ZFhaMGFIQnljb2xRcWIyRVlwaVVocERraHBCbUFaZ0FDYnBKcHRnTW9wcFFXQ1lKUXlQTjhBY3V5RjNVNlhYNnpaczB1ZUFFY3ZRemdOUUJBRWZnSUlSNUFSeW1sU3FWU0JEWUowT1FnSjkvazROWVl3QVVFQkNBZ0lBQ0JnWUVTd0lXR2hpSThQQnlSa1pHSWpvNUdmSHc4RWhJU29GYXIvVGVYSDlqK0hDa3BLVUZsWlNWcWFtcFFWMWNIblU0SG85RUlrOGtrQVpyTlpyc3NvSEVjSjdFemIxRHpCV1lpS3hPQlRieDJQb0RNNDMxZVhsNXNRa0pDQjVWSzFVR2hVTFFuaExRSDBCYUE1cTk4RFhpZWQ1U1dscDVOU2tvNjQzUTZ6OWhzdHB6YzNOeWNIajE2MUxxWm9oelVCRGRUODJCMjNrQW5BcHNJYUNLYnV4TElpYUNtVUNpZ1Vxa3VDM0JhclZZQ3VKQ1FFSVNHaGlJaUlnSlJVVkdJaVlsQmZIdzhrcEtTL0RlWkg5aHVuRlJWVlRWUU93MEdnNlIyeWdITmJyYzNBTFFyc0RRaXFwMWVnRVlhWVdVTkdObkVpUk1WSDMzMFVmZUFnSUJ1Q29XaUt5R2tDNERVditPMTRIa2VwYVdsYU5hc21mZFhlWUlnSE9NNDdyalJhRHgyeHgxM0hOdTllN2NnQXpzSjlBZ2hnamVqY3dOYkF6YkhNQXoxQVhCUUtCVDBTdXhORG5BaWV4TUJUbFJQdzhMQ0dxaW5jWEZ4L3B2T0QyeC9uQmdNQnBTVmxVa3N6WmZhNmN1T3huRWNXSmFWR0pvUE94cVIyOUY4TURQaXcxNG1zakx5eEJOUEtKWXVYZHBIbzlIMFpCaW1GeUdrSjREZ2Y4STF1UXl3ZVl1WlVuckk2WFFlTXBsTWgyZk9uSGxvelpvMVRoOUFKNGpBNWdZMDZzTXVSNzJabkpmOWpYcmIzMFFHcDFhckpZQnJ6UDRtVjA5Rjl0YTBhVk9FaFlYNWIwSS9zRjAvNFRnT0pTVWxIaXhOcjlkTExPMXE3R2krbkFNaW9IbXhNMG5ObERFeXlJR01Vc3JVMTllM0N3NE92bFdoVVBRamhQUUg4STljOWRjQWJBMmVVNElnN09VNGJsOVZWZFcrNXMyYm4zT0RXd05XSjJkMEludVQveTA2R09RZ0p3SmNZODZGSzluZlJQWVdIaDd1d2Q2U2twS2dVcW44TjZVZjJINmZWRlpXb3JTMHRJRnpRSzUyaXFBbXNqU1JvVjB0b1BFOEw2bVpnaUEwQ21aV3EzV0FXcTBlekRETVlBQWQvRmZuZHdHYnQyUTduYzRkUnFOeFYzUjA5RDY0dkxpQ045ZzFCbklNdzBqcXFrS2hvRmNMY0NLREU5bWJDRzV5OWRUYnVaQ1ltSWo0K0hqL3hmY0QyN1dMeFdKQmNYRXh5c3ZMVVZWVjVkTTVjS1h3RFMrMWszZzVCdVRzakhneE5Bbk1iRFpibGxxdHppS0VaQUZvNnI4eU4wVEtlSjcvMFdReWJZK01qTnlPUytFcVBrRk9wcTU2cUtvaWkvUHlvTklyc1RkdjlkVGJ1UkFYRjRlRWhBUWtKeWNqS0NqSWY3WDh3SFoxVWxKU0lyRTB1UzNObDNQQTI1Ym1nNlZkQ2RDSXQ4M01ZckVNMUdnMHR4RkNSdm5CN0tZQXVTMTZ2WDVMVEV5TXlPUThRTTZieGNsQXJsR0FVeXFWalFLY25MMTVPeGU4YlcrSmlZbCs3NmtmMkM0dkpwTUpSVVZGS0NzcjgyQnBCb1BCSXlidEtvTnNpYWg2aXVybVpkZ1pvOVBwMG9LRGc4Y3lESE03Z0hiK0pYbFR5bG1XWlRlV2w1ZHZidG15NVJrWndQRXlrS095MXdZc1RxNm11b0dOWGsxd3J6ejJUZlNjaXV5dGFkT21hTmFzR1VKQ1F2eFh5QTlzRFZtYTZDRHc1ZkZzTElSREJEVmZnQ2JQRXBBRG1naG1telp0Q2hnOGVQQkVwVkk1Z1JBeXpMOE0vem9pQ01JMnE5VzY0YTIzM3RxNGFORWlHd0NuSE9Sa0xFNFEyWnUzbXVvVkh1SUJjQ0s0TlJZYTR1MDVGUjBMZnZibUJ6WUFnTlZxUlVGQlFRTUhnY2pTekdhelpFdTdRdWJBNVFDTnlOVk92VjdmSVNnb2FCTERNSk1BK0ZmaVgveVp5SEhjMnBLU2t2VXBLU2xuWmFvcTc2MnF5Z0NPWGduZ0xoZllxOVZxRVJ3Y0xMRTNiOGRDaXhZdEVCZ1k2TDh5LzFSZ3E2aW9rRlRQNnVwcUR3ZkJsZUxTWktEbUU5RGNBYlVlNnFiVmFzMVNxOVdUQ1NFVC9VdnViOG5pMXVuMStyWFIwZEU3M0F4T0RuQzhMelZWRmliU0FPQWFzNzM1aW5zVFZkUFkyRmhKTlczU3BNay8vcG9vLzBrbnkvTTg4dlB6VVZ4Y2pJcUtDaWtseW1Bd3dHZzB3bUt4U0tEbWNEaDhaZytJZ0Nhem8va0V0THZ2dmx2eDBVY2YzYTFVS3U4RzBNZC8rLzk5aFdHWWNaR1JrZU40bnQ5dnNWaStIang0OE5yRGh3ODdSWkNqbERid3JQSThUd1ZCb0dMaVBjL3pWQjRTNUhRNnFUeGNTTlFRNUtZUThhRXJQb1N0Vml2TVpqTk1KaE51dWVVV0tCU0tmeTVqS3l3cy9FZWNxTkZvOUFsb29zZFRyblplem83bVMrV1VzVE95YWRPbWtOYXRXOStyVUNpbXdSOXo5bzhVU21tMncrSDRjdjM2OVdzV0xGaGdKSVR3TWliWFFFMlZzVGh2Qm5kWis1dGNQUlVEZThXYzB5Wk5taUE1T1JtaG9hSC9UR0RqT081dmY1SmxaV1VvTEN5VXZKNWlCb0czNnRsWUdJZVgya2xrYVU4U3FHVm5aMGUwYk5ueWZvVkNjVCtBRlAvdDdSY0ErWGE3ZmRXbVRadStuakpsaXM1TFRlWGQ0Q2FwcU81Z1h5clBRZlZXVDMyRmhYaW5aRVZIUjB0ZTArYk5tNk5wMDM5ZTVORGYyc1pHS1VWdWJpNktpb3FrZ052TGVUMjlNd2dhVVR0Rkx5ZERLU1VuVDU0TWJkdTI3UXlGUWpFRHdDMytlOWt2UHVTaXpXYjcvS3V2dnZweSt2VHBoc3NCSENGRWtDWGRlMmN1VUY4WkM0MTVUY1dBM21iTm1pRTFOUlh1YkFrL3NQMlZ4V1F5NGNLRkM1TDZXVjFkTFhrOTVRRzNqZVI1RXU5VUtDOVBKN05reVJMRmtpVkxIbFFvRkEvQ0gzL21sNnQ3MEo2MVdxMHI3N2pqanRWYnRteGgzUUFucWFneWdCUGtIbFR2MUN5VlNrVWJ5emVWcTZXUmtaR0lqWTJWMU5LVWxKUi9UTXpiM3hMWXFxcXFrSitmajVLU0VsUlVWRFFJNWZCT1hwZmIxTHhZbW9kalFQUnkydTMyTzFVcTFTTUFldmh2VjcvOEJvQTdiRFFhUHdzUEQ5OUlDT0c4QU02YndWRlpCZ1AxWm0vZU1XL2VBYjFpU0VpVEprMlFsSlNFVzI2NTVSOVJEdWx2NXhVdExDekV4WXNYUGVMVDVMbWUzc25yY3BZbU9ncmthcWZNanNaWXJkYUJhclY2cGp2bHlTOSsrVzFzZ3BDTXNMQ3dESjduUjFWWFYzL1dwRW1UQTNLQTgvYWk4anhQM1FKQkVLaFgvVDd4UFh4NVVVV3ppdWhGdGR2dHNObHNhTjY4dVIvWS9pcjJ0UFBueitQaXhZdU5PZ2t1VTltMkFVdVRxNTMxOWZXcG9hR2hzd2doRC90dlM3OWNMMkVZWmtSOGZQd0lsbVUveXNuSitieHo1ODc1TW9BVHcwUjRBSUlnQ0lMWTM4SzlVVEZsVHc1dTNpQW5Pc0M4d2MxdXQ2TjE2OVovVzd2YjN3TFliRFlienA4LzcrSDVsTWVuTldaUDgyWnBibENUMU01Nzc3MVg4Y0VISDh4V0tCU1BBVWowMzRwKytTTkVwVkxONk5TcFU1YkZZbm0vYjkrK254OC9mcHdGd0xuWkd5T3FxSlJTcVJpbTI0RkY1Y1VWdkFIT3UxcXpIT0JZbHBYQTdlL1lTT1l2RDJ3Nm5RNjV1YmtvTEN5VUNrTEtxM0w0S2dicGZvckpRVTNPMGhoS0tiRmFyVU0xR3MzakFBYjViejIvM0FCcEdoZ1krUHl2di80Nm9McTYrcU1tVFpyc0pZU3dNdldVNEZKT0t2VmljSEtBbzc2YUF2bFNUOFVvZ05UVVZFUkVSUGlCN1dhUnFxb3FqM0FPTVluZFY0VmJXU2dIRWVtNUQ1YkdsSmFXeHNmRnhUM09NTXhjLzczbWx6OUJQUjBRSHg4L3dPRncvSGZIamgyZlptVmxWYnJWVTBZT2NLNEs1a1JvakwzSlZGVmNqWnFhbXByNnQzSXEvR1dCcmFTa0JIbDVlU2dxS3BMQ09lVE5WWHc1Q2J4WkdzL3pjcGJHMk8zMkNTcVZhbTdwdWVOZHl4M0J5RWh2ZFZPZGMzMTlQV3ByYTVHYW11cEhnTCtBNlBWNmJOcTBDUTZIQTRNR0Rib21nNzFhclo0MWJOaXdYblYxZGU5SFJVVnRJWVFvM09vcEo3TzlFYm45VFE1d0xNc1NsbVVidGIxNU16aU80MUJUVXdPejJRd0FpSWlJUU92V3JYODM4U2dvS0FBQXhNZkhYOVg1VjFSVXdPRncvRzduQnRQb042d2VueXg3RW9QN1p5SWpzejhlV2ZncXlrek9tMkxCNU9mbjQ4eVpNeDV4YXBmWW1nN0ZGODdnMkpGZmtaMmRnOExpTWxoc2RqZ2NEaUlDbkRzMWlnaUN3QWlDb0tpc3JFeDJPcDJ2cVZTcS93SG91dm8vODNEUHduZHVpbk05ZlBndzNuenpUUURBa1NOSDhOcHJyLzJwWS9nOXduRWNCZzBhQklQQjhLZU40WHJMMmJOblliZmJHM3p1ZERveFljSUVGQlVWSVRBd0VGYXI5WnFQVFFqcEhCa1orUjdMc290MzdOalJqRklhUUNuVndOV1lXa1VwVlZCS0ZZSWdLQVJCWUhpZUowNm5rN0FzQzVQSkJLUFJTRVF2cUR5UDFHQXdTRldpS3lvcVVGeGNqQXNYTHVEUW9VUDQrT09QOGZiYmIvL21kZmJTU3kvaHpKa3pBSUNDZ2dLc1c3Y09LMWFzd0twVnE2NXFQV3pac3NYbi8xN3JlbWdVMkxaOThDeGUvSFEzUms1L0J2KzM0RDdrL2ZnZUhubjI0ejk5SVowN2R3NW56NTVGZm42K1I3VmJrYTFWRmVjaHY2UWF5c0JRaEFRSGdITllTSDI5bm9pTXpjM1VpQ0FJSWtzYkZ4MGQvUlVoWk9iTitOVC84c3N2a1pHUjhiY1lnMHFsd3Z2dnYvK2J1aTdkRFBQZ1MrYk1tWU9Ta3BJR24rZmw1WUVRZ2tXTEZtSHk1TWxvMTY3ZDc1bTNCL3IzNy8vZkV5ZE9aQUhRd3RVVFZnUTNwUnZnR0JIYzNMMDBDTS96Y0RnY3hHNjNFeEhjTEJZTFRDWVRUcDQ4aVlLQ0F0VFUxRWo5UFZpV3haZ3hZekJ3NE1EZk5FNlR5WVRkdTNlalRaczJBSURNekV5c1dMRUN0OTEyMncxZkQ0MENXMUZSRVVoRWMweVpOQVlqYjc4WEx5OS9FY082Sk1FSlFGOTRGSFB2bjRDTWpFemNOdmtoN0Q1WEJRQTR1djVORE0rNkYzazJBSERpeFlkRzR1RmxYN3A1K1VsTXlocU9kNy9ZaURsVGIwZG1SaVkrMjEzb1ltQ0h2c2M5NDRZaUk2TVhwajc2SFBKckhTSnR4TlpQbG1QMGdMN0k3RHNZRHk1NEJhZlBuVU5CUVlIVURzKzdKMEZGZVRYQXFCQWFGQUNWV2t2VVNnV280SFNCbXROSk9JNWxuRTRuMDJQQWlQQnY5cDE1UWFWU2ZRbWcyNEZ2MzhUdy9yMHc4TFo3Y0xqUUpLZXVIbU5ZOHVZYU9HN1FUV00wR25IMjdGbjA2SEVwRHRocXRXTGV2SG5vMzc4L0hudnNNVGdjcnRHWXpXWTg5ZFJUR0RwMEtDWk5tb1JUcDA0QkFMNzQ0Z3M4K3VpakdEQmdBQll2WG95c3JDek1tVE5IYkxxTXRXdlhZdVRJa2NqS3l2TDVwUFExaGw5KytRWGp4NC9INE1HRHNXVEpFdGhzTmdCQWJXMHRacytlamF5c0xJd2ZQeDYvL1BLTHRNOWRkOTJGa1NOSFlzNmNPWks2SThxbm4zNks0Y09IWThpUUlYanR0ZGZnSFRUdVBZYnZ2LzhlNzczM252VDk2ZE9uc1dEQkFva3BMVnUyREVPSERzWFlzV09sTVpqTlpreWZQaDJ2di80Nmhnd1pnb2tUSjZLb3FBZ0E4TUlMTDJELy92M1M4VmF2WG8zVnExZGY5dHJzMmJNSEV5ZE9SR2xwS2ViT25ZdUpFeWRpNTg2ZEFJQ25uMzRhVHp6eEJDb3FLakJ4NGtSTW5EZ1JMTXRlOW5qcjE2L0g2NisvamhrelpxQmZ2MzVZdW5TcE5BL0xseS9IcUZHanVpeGN1UENEWGJ0MnpmM3d3dytqS2FVQkFEU1VVaFdsVkNrSWdwTG5lVWJjM01CR0RBWURhbXRyVVZ0YlMydzJHM1E2SFU2ZlBnMmowWWpzN0d4czI3WU5SNDhlUldWbEpjckt5bEJRVUlEaTRtTFUxZFZKdjUrWGw0ZDc3cmtIZ2lCSTQ1MDllemFPSGozcWNRNGJOMjdFcUZHandERE1GZGYyNWRiRHVYUG5NR0hDQkF3WU1BQ2ZmdnJwRmRma2hRc1hNSFBtVER6d3dBUG8zNzgvRmk1Y0NNaDBjNCt0OHNRRzlHamZFcDE2amNEU1Y5N0I2UkxYaVZMZWdGa2pPcUg3c0duNGJ0TjZ6SnB3SzFyM21JQVNPOFd1aitlalJZcytPR21tb0pUREk0TlNNR3oyVzY3OXF2ZWhTNHNXYU5tNkUyYk1tNDlGODUvRTNud3orTG9UR05DK0pVWS8rQ3cyckYrTjBUM2JZdFRqcm4xT3JGdUdsaTNhWXY3cksvSEswamxJaW9sQzFyUW5NSC8rZkV5ZlBoM2p4bzNENE1HRGtabVppWTRkT3lJMU5SVWFCUUZSYWhBWkdVbENRa0tJVnFzbGFyV2FVU3FWQ3VLeUthcFhyZmwyOE9JSFIvL1lzbTBmZXF5YW80N1NQYlJyU2dzNjlxR2xkUDNhbFhSWXQxVGFlc1RqbEZKS1Q2eGJSbHUyYUV1ZmVldC9kTzJuSzJpbmxKWjAyYm9UOUViSXFsV3I2TnR2dnkyOS8vSEhIMm4vL3YxcFdWa1pkVGdjOU00Nzc2UnIxNjZsbEZLNllNRUMrcTkvL1lzS2drQVBIejVNZS9Ub1FhMVdLMzM5OWRmcGYvN3pIM3JreUJFNmRPaFF5bkVjN2RXckY2MnRyYVVIRHg2a0kwZU9wSHE5bnVyMWVqcGt5QkI2OHVUSnk0NUJwOVBSN3QyNzA3Tm56MUtlNStuQ2hRdnBHMis4UVNtbDlQMzMzNmVmZi80NXBaVFNRNGNPMFg3OStrbjdtVXdtYWpRYWFYcDZPalVZRE5MbjU4K2ZwLzM2OWFNV2k0VmFMQlk2WmNvVStzc3Z2MXgyRERVMU5iUjM3OTZVNHpoS0thVkxsaXloYTlhc29aUlMrdnJycjlPbm4zNmFPcDFPZXZic1dacVptVW50ZGpzMUdBdzBKU1dGSGpod2dGSks2WW9WSytqOCtmT2xlWjA1YzZaMC9HSERodEhDd3NLcnVrWkRoZ3lodWJtNURUNC9jZUlFSFRObXpGVmY2NDgvL3BqZWR0dHRWS2ZUVWJQWlRBY09IRWgvL2ZWWFNpbWxOcHVOR28xR09tUEdEUHJqano5U251ZC9LaXdzbkFDZ0dZQW1BS0lJSVdFQWdnQUVNQXlqSm9Rb0NTRUt0VnJOQkFRRUVBQWtMQ3lNeE1mSEl6azVHUUVCQVdqZXZEa3lNek14ZVBCZ2pCczNEdE9uVDhmOCtmUHgwRU1QWWVEQWdUaCsvRGhZbGdXbEZHUEdqTUhPblR0QktjVzVjK2ZRdDI5Zk9KMU9EOHdZTjI0Y3lzcktHbURKcDU5K2l1ZWZmOTdqTTdlcWpQVDBkQmdNQnVuemp6LytHR1BIam9YWmJFWlZWUlV5TXpPUm5aM3RzZStxVmF2dzl0dHZTKzlQbno2TnJsMjdvcXlzREZhckZSTW5UbXljc2NXbGo4YldyZC9qdnF3TzJQL05leGd6ZUFnKytma2NoT0lEMkhIV2dJa1BQbzNiUjQ3Qm9zZnVCbHQ5Rkx0UDFsOFZDeG4xNkhKOCtPb3l2TGpzWmZScEdZU0NnN3RSYUdVd2ZkNGlqQjR6R1crOCt3Rm1qdXZ0ZWdKOHZ3RTBMQUY4eFJua0ZCa1FvSERpOVBHalVweWFkMGlIeldZRFR5a2c4QjZxcDh2cktUQVVVTXgrWTlQRFV5ZU9YN2xrL3N5aEduc1p0dTNPUmY2dmgxRFBCK0RCcDUvQm1ISDNZR0NYaEV0UG9lODNBQkZKU0ZBWVVXVUxSR0lFZzEyNzl0MFF4cloyN1ZxTUd6Zk80N00yYmRvZ0lTRUJhclVhM2JwMVEwVkZCUURncDU5K3dvd1pNMEFJUWZmdTNaR2NuSXdUSjA0QWdGUjFOU1FrQkVxbEVrRkJRV0JaRnBzM2IwYVRKazJ3ZHUxYXJGMjdGakV4TVRoMDZOQmx4M0Q0OEdGMDZOQUJiZHEwQWNNd1dMQmdBY2FQSHc4QW1ERmpCaElTRXZEMjIyOWo1ODZkcUttcGtmWVRmOTg3SURRdUxnNHFsUXJ2dlBNT1RwOCtqWlVyVnpaUU1iekhFQjBkalM1ZHVtRDM3dDFnV1JhN2QrL0dxRkd1WkpBZmZ2Z0JJU0VoV0xseUpRNGNPQUNHWVhEKy9IbHBERDE3OWdRQVpHUmtvS3JLcFdrTUhEZ1FPVGs1ME9sME9IbnlKT0xpNHE1SFc3OXJsdTdkdXlNOFBCeEJRVUZvMzc0OUtpc3JBUUFCQVFFSUNRbVI2cXN4RERPNFdiTm1iM3p6elRkVDNLcHBnS2lhQWhCVlV3VUFSc3llSVlRUXR5T04yTzEyOER3UHU5MHVxYVo2dlI1MWRYVlNZTHZSYUVSdWJpNU9uVG9GdTkyT0dUTm00UFBQUHdjQWZQWFZWN2pubm5zODZyM2w1dVlpSkNRRUNRa0pWM1d1amEwSEFPamN1VE9DZ29JUUd4dUxZY09HZVREL3h1NkxoSVFFSkNRa1FLdlY0cTY3N21vTTJGaHNXL01aOWhjeWVHenhNbXpic3hlM2QxRGhsZGZlZDNsUUFHZzBydWF0S3ZjcngvTHVmUVhJR0dzRENmZUtsMkU1QndBRk5CcVhnN1pGZWg5azllM3NvcHdtQ3ppYkhoZk9uMGRoWVJIQ2sxSVJHNks4WFBjb1FrRUlwWUpVTzgzcDVCaWU1NW5pdk8wSnZWcTJlQzFBcTMwRFFJSlNvNFlDQU1lejRKdzhBQVdVbW9aT1lydk5EaVhEbzZheUVwV1YxZWlTTlFWWnZkcmVFRnRpZUhqNFphdWhNZ3dqcVFzY3gwR2owVWpmYWJYYUs2by9OcHNOb2FHaDBqWjI3RmowNmRQbnNtUGdPQTVxdFZwNkh4SVNJcFhGZWUyMTE3QisvWHIwNk5FREkwYU11S3J6REFzTHc4YU5HNUdhbW9wdnZ2a0d3NFlOUTFsWjJSWG5ZZXJVcWZqMjIyK3hmZnQyREJvMFNBb3l0ZGxzaUl5TWxNNXA3dHk1UHVkUVBuZEtwUkxqeDQvSDk5OS9qM1hyMXVHdXUrNzYwMjEzaEJCY0lZODdRYTFXdnpSejVzeG5ObTNhbENpcXBqS0FFNEdOY2R1VElRZ0NjUWZuRWtFUWlNUGg4SEFxNlBWNjZkNnlXQ3dvTEN5VXdLMXYzNzdJejgvSHVYUG5zRzNiTmt5YU5NbGpNR3ZXck1HRUNST3UrenlvMVdySVM2dGR6WDJoMFdnYUF6WWxqdis0RWs4dGVCWjdUK2FqdExRUWVyUHJ4bEUwNjRaTzBTcjhzTzUvS0N3dHhhb3ZOd0NCTGRHdFl3emlZK0lBMU9HWGc5bklQN2tMRjZyNUt3NjhaWmNNUkNoWWJQcG1IY3BLOC9EWXVFejB2dWRGbUV3bU5FbStCWmJhS2dpaDhiaWxaVE1vQlJZQmFrV0RPRFYzeFZ2Q3Npd1VoQUJVSUN6TEVaN25HVUdnek5DSFgrM1hwSG5taDVudHcyYnUycmdHNTRwTDhlMnFOYkNRRUdSMGFZMWJPblJFSUN4WXYyb2RDczhmeGNtOE9tbDhmWHIzQktmWElTRWpDdzgvT0ExdDRzT1FrZEhsRDEvWWE5YXN3UjEzM0hGTlQvc3RXN1pJYnZiczdHeDA3Tmp4aXZ0VVZWVmh6Smd4bURCaEFscTNidTJ4WUh5Tm9YUG56amg2OUNqMGVyMzBQeDk4OElIa3RSMDNiaHk2ZCs4dXFRbFhrbDI3ZHVIbGwxL0diYmZkaGxkZWVRVnQyN2JGd1lNSHJ6Z1AzYnQzUjJscEtWYXVYSWtwVTZaSW4yZGtaSUJsV1V5WU1BRVRKa3hBUWtMQ1ZRV2ZUcG8wQ2V2WHI4Zmh3NGV2eVhpdTFXcFJWMWYzcDRCZmVubzZqaDQ5T3FOWHIxNHZGUlFVOVBEbFdBQ2dFQVNCRWRtYjZEV2xsTUtYVTBITTFySFpiRklKL2J5OFBKdzlleGFUSmszQ280OCtpcUZEaDNwVUNlRTREcnQyN2NMUW9VT3Z5M2tWRmhhQ1VncUh3NEhkdTNlalE0Y09WMXdQT3AxT3NqZi85Tk5QamNXeE1YanNwZitpZXY1Q3pCZzNCQndGb2x0Mndjc3Z6NEZTM1FUTFh2OFhaczU3SGdQN3JZSTZyQ21lZWVWdHBJVUNHSHduUnFWOWcrVVAzNFpQVy9kRGk2WmgwRjNoSkRUSi9mSEswZ2Z4MUw4WG9lKzdIS0thZDhWekM2Zmc5T25UaU80NEJKbXRMK0RuYno0RDYrU2gwSWFnWllvR0FYQjZ4NmhKOFdsUUtBZ1JCQ0lJUEFIQURKNzR5TlRYLysvaFp3alJwaXg0K1hVVVBUSVBJMjd0QjBWQUJPNWIraHFHdHRJQ0dJb2xEdzdCc3g4K2pSOVh4Nko5d3FXcW84TWZmaDZQbHo2Qk54NmZndVU4RU4ycUsxN3FQeGxBK0IrMllGbVd4WjQ5ZXlTRCtOWEkwcVZMTVhQbVRHemF0QWtWRlJWWXVuVHBGVy9vOGVQSDQvVHAwOGpLeWtKTVRBd1VDb1hrNW05c0RBa0pDWmc3ZHk0bVRKaUFtSmdZQUpEYzdqTm16TURDaFFzUkd4dUwyTmhZQ0lJQWc4R0FzTEF3akJzM0R2WDE5VENaVEJnMWFoU0Nnb0t3WmNzV1pHWm1ZdlhxMVJnelpvenJ3YWxRU0RmSTVlYUJFSUtKRXlkaXk1WXRTRW01Vk5kejRjS0ZlUFRSUnpGMjdGaFFTdEd1WGJ1cjhxYUtQUU5hdFdvRnBmTHF3enVuVHAyS09YUG1vSG56NWhnOWVqU21UcDE2M2RmRDg4OC9qeDA3ZHFDMnRoYkhqaDNEU3krOWhQZmZmeCt0VzdmRzFLbFRNV3JVcUlGeGNYSE5CZzBhOU5iUFAvKzgwWjJHSmEvc3pBTUFwVlJ3eDI1Q29WQlFrUkNvMVdvYUh4OFBzOW1NVTZkT1NXenhzODgrUS92MjdURnk1RWdJZ29BMmJkcWd1TGdZOTk1N3I4ZjRmdjc1Wi9UdDI5ZUR5UVBBaGcwYjhOcHJyOEZrTXNIcGRPTG5uMy9HSTQ4OGdrbVRKalc2SGtTUUdqdDJMUFI2UFhyMDZDR1pEeTYzSGh3T0IrNjk5MTRwOU9hS1pZdFlod2xXQjRQd1VLL08wNElUOVhvOWdrT2pvZlpZQndMMDlYb0VSMFplVS9TdndEcWdOOXNBQmppYmsrTVJ6bEZkWFlYYWVoMGNObHVEYkFJNXFNbXlDSmhwZDA5VkxQL1BmeGRFaHdjdGdrY2dzbXQ4MnVCd2FOU2VoTlZtMFFQS1lHaDlxS1Nzd3dLampVZDArQjlmYXZuczJiTTRjdVFJN3I3NzdtdmV0NjZ1RHFHaG9WQ3BWRmU5ajgxbUE4ZHhIbVdrcnpRR2xtVmhOcHNSR1JuWllJSFpiRGFFaDE4YjhKdE1KaEJDRUJ3Y2ZGM213V0F3UUsxVy8rNDh5Q2xUcGpTSXU5dTRjYU9INTAvc2tYR2xjeTR1THNZamp6emk4Vm43OXUyeFlzV0szenkrbXBvYWFMVmFNQXlEZi8zclg4N0V4TVRYM252dnZZOU9uVHBsZDZka2NlN042YTd6SmhCQ0JIa2hTNDFHQTdWYVRjWGFibUxwSTdGb1pWUlVGT0xqNDJFMEdwR1RrNE5WcTFaNW5PdW5uMzZLUG4zNm9GV3I2eGZRTGlicnkwTkJHbHNQMmRuWldMaHdJYjc3N2p2bzlYcEVSa2JlWFBYWWREb2RjcnhBVFhRU2lNMVc1TjJqWktBbXI1dkdWRlpXSmtWRlJUMURDSmtCdi9qbGJ5cUNJT0R1dSs5RzA2Wk53Zk04VHAwNmhhKy8vaG9oSVNFcmQrelk4ZUh3NGNOTENTRU9MM0RqdmNCTktqMHVncHU4RzVZSWJxV2xwU2dvS01Dc1diUFFwMDhmdEcvZi9xYkpMeFdCYmNPR0RaY1kvYzBDYkhKUUt5a3A4UUExZWNNVkgweE5USTFpQkVFZ0pwT3BtMWFyWGVpdm1lYVhmd3E0WldkbncyNjNJejA5WFhJZzhUeS9KVGMzOTcxMjdkcWRCdUNRc1RlbnU3a003KzZ4SUlpTlkrVGdKcFljRjcyWFlnMjNsSlFVcVdEbHpRSnVWcXNWaFlXRkhrSFFOd1d3NmZWNlpHZG4rd1Exa2FuNVVqOWxXUVNFVXNyWWJMWmhhclY2RWZ5VmJmM2lGMUJLRDVlWGw3K1RtSmk0MXd2Y09EZTRTY3pOWFg2OEFiZzFwcGFLNEphV2xuYk5ab2NiSVg5NkVyekJZUERKMUhRNm5jOEtIVjdxcHdScURvZGpzbEtwWEFTZ2xYOUorOFV2cmtxOUNRa0prYlcxdFc5RlIwZHZwcFF5eEJVNFJpaWxITnhPQmNHZFV1QW1PUlF1eHdQMUFaUytmZ05wYVdtL0tTM3Fid3RzSnBQSnAwMU5CTFhMcVo5eVVHTlo5bUdGUXJFWVFJeC9PZnZGTHg3QWt4SVZGYlZZcjljSGg0ZUhmK011ZDBTOE5UWVIzSnhPcDA5d2F3elV4SzFEaHc0M1ZhTVk1cy82WVl2RjBxaWp3RWNUWTlJWXFIRWM5NVJDb1ZqdUI3WEc3US8zM1hmZlRUV213c0pDL05VYWRiLzg4c3ZvM2JzM2hnNGRLcVVhVFo0OEdaTW5UOGIwNmRPdisrL3QzNzhmMTdIbmIweFlXTmdTczlsOEx3Q3RMSmhYbnFrZ1pTazRuVTdpcmxwSlI3UUFBQ0FBU1VSQlZOTW1KZERiYkRhUFFONjZ1am9wZVQ0L1B4ODVPVG13V0N3NGUvYXNsTkhoTGZQbXpaTXlaUnFUelpzM1N4a09memxnczl2dDErTDlKUElPVXFKTjdaMTMzbEZ4SFBjc3d6QXZ3cFZTNGhjZnd2TThqaHc1Y2xPTjZjVVhYNFRGWXBIZUc0MUd6SjQ5KzZhZHc1TW5UMkxMbGkzNDZhZWZzRzNiTm5UcTFBa3FsUXF2dlBJS25udnV1ZXMrdnpVMU5WaStmUGsxaGV6NGtvc1hMK0s1NTU0VDN3WUVCUVV0ckt5c2ZFaWowUVExQW00S1FSQ0l2UHlSdTlLdUJHNFdpd1ZHbzdGUmNIdmlpU2M4VXEza2N1clVLYWxnUW1OU1dWa3BGU2Y0UzZtaUhNZGQxdnZwWlZNVGN6NGhMOGZ5NjYrL0JxZW5weTlpR09iSnZ5TVlIVGh3QU0yYk44ZisvZnNSRnhlSHZuMzdTamwxWnJNWjI3ZHZCd0QwNmRNSDBkSFIwbjdsNWVYWXQyOGZJaU1qTVhEZ1FKOVZGazZkT2dXTlJpTVZFYXl0cmNYT25Uc1JHQmlJZnYzNmVhZ1RSNDhlUlY1ZUh2cjE2NGZjM0Z6Y2V1dXRrbHF5Yjk4K2xKZVhvM2Z2M2toTXZOUU9vcXlzRFB2MjdVTm9hQ2dHRGh6b2tlWUZ1TElpYW1wcTBMNTlld0JBVGs0T3pwNDlpOTI3ZDJQYnRtMEFnTDU5KzByeFo4WEZ4VGh3NEFDU2s1UFJxMWN2Q1FndlhMaUFtSmdZN04rL0g2bXBxZWpTcGNzVngwQXB4ZDY5ZTFGUlVZR2VQWHNpT1RsWjJpY25Kd2RSVVZFb0xTMUZibTR1K3ZYcmg4VEVST3pjdVJPSERoMUNSRVFFOXUzYkI3VmFMYzFEMDZaTllUS1pHbVdsaHc0ZFFsSlNFbnIxNmdWQ0NJNGRPNGJVMUZSb3RWcWNQbjBhblRwMXdvVUxGeEFZR09pUlk3bHUzVHFNSFR2Mml1dmgrUEhqaUk2T1JsSlNFZ0JJZWJPREJnM0NzV1BIY1BUb1VlemF0VXNLY0IwNmRDaTBXdTNjMXExYnE0Y05HL2JSeXkrL3JIZXJsS0xkemVsV1MzbDNxWHhSTFlYRDRTQ0NJRkNqMFFpMVdvM0V4RVFQVlpRUWdwS1NFZ1FFQkhqWTI4VHI1NnRzMDlHalI1R2JtNHR1M2JwNXhNQUpnb0FkTzNhZ3ZyNGVRNFlNa1k3M3l5Ky9vRTJiTmdnTEN3UExzamh3NElCMExleDJPN1p0MndhbFVvbDI3ZHJkV01aR0tmVUFOWGt5dTNmVEZWbHZBZzlRTzMvK2ZFUjZldnJTdnl1b0FhNHlPazgrK1NUMGVqMldMVnNtWlFQb2REcmNkdHR0S0MwdFJXRmhJVWFQSG8zYTJsb0F3TEZqeHpCcDBpVG85WHBzM3J3WkR6endRSVBqYnRteUJmUG56NWZBOE9MRmk1ZzRjYUtVL0QxbXpCZ3BMV1gxNnRWNCt1bW5ZVFFhc1dqUklqejk5Tk1lS3NYWFgzOE5vOUdJS1ZPbUlEczdHd0J3L1BoeDNIMzMzVEFhamRpNWN5Y21UNTdjd0RhemJ0MDZqd1RtdXJvNmxKYVdRaEFFRkJVVm9haW9TTFR6WU9mT25YamdnUWRnc1ZqdzdydnZTb0dzcGFXbG1EVnJGdDU0NHczb2REck1talVMdTNidHV1SVk1czJiaHkrKytBSW1rd2xUcDA3MUtGVzBhdFVxVEo4K0hlKysreTV5Y25KUVgrOHE2bEJTVW9LYW1oclliRFlVRlJXaHRMVDBpdGR2NTg2ZHVPKysrMkN4V1BEUlJ4OUprZkliTjI3RWtTTkhjUGJzV1R6eHhCTUFnUGZmZjk5RFBhT1U0dnZ2djhmdHQ5OSt4ZlZ3L3Z4NVBQLzg4OUwvYmQyNkZaOS8vamtZaGtGMWRUVXFLeXZCc3F3MHI2S3dMRHZMNFhBOFBISGl4R2dBWXZGS0ZRQ2xJQWdLQUFwS0tXRlpWbEpMVFNZVHFxcXFZTEZZVUYxZGpaeWNIQS9tVmxWVmhhMWJ0NkpkdTNiSXlja0JwUlJuenB6QitQSGpVVjFkamM4Ly85eGo3bDU5OVZXOC92cnJzRnF0ZU9TUlI3Qmp4dzdwdXcwYk51RG8wYU00ZmZvMHhvd1pJN0g3NWN1WFN5WU1vOUdJSjU5OFVnTENxVk9uWXZ2MjdjalB6M2RsZnpSV3R1aVAyRTZmUG8xdnYvMFdyN3p5Q3ViTm00ZXBVNmRpNU1pUjZOT25EenAxNm9UVTFGUWtKU1VoTmpZVzRlSGhKQ2dvaUdnMEdrYXBWQ29VQ29XeXNMQXdUaENFTituZlhJWVBIMDZ6czdNcHBaU1dscGJTRGgwNlVLZlRTV3RyYStteFk4Y29wWlN5TEV0bnpKaEJ0MnpaUWltbDlQNzc3NmViTm0yaTd0TFFkTUdDQlZTbjAxR2owVWpUMHRMbzFxMWI2WkFoUTJoVlZaWDBPNldscGZUTW1UUFM4Ykt5c3VqcDA2Y3BwWlQyNzk5ZkdrTjVlVG50M3IwN3BaVFM0OGVQMHhFalJsQlhOV3BLdi9ubUcvclVVMDlSU2luOTlOTlA2ZXpaczZuVDZaUytzOWxzMHU4SmdrQ3pzcktvVHFmek9OK2FtaHJhdFd2WEJ2TXdlUEJnYVF3V2k0VjI3dHlaT2h3T21wT1RRd2NOR2lTTjRZTVBQcURQUGZmY1pjZHc1c3daZXV1dHQxS3hSK2V1WGJ2bytQSGpwZCthUDM4K2ZmNzU1MzFlajAyYk50RlpzMmI1L001b05OS09IVHQ2ZkRacTFDaDYrUEJoU2ltbEhNZlJuajE3MHZ6OGZQcmRkOS9SZDk1NWgzNzQ0WWQwNE1DQnRMS3lrbzRkTzlaampvNGNPZExndHhwYkQzYTduV1prWk5EaTRtSktLYVYzM25rbjNiRmp4MlZMSnhrTUJwcVdsa1k1anFOMnUvMkQyYk5uWndCb0FTQUJRQlNBVUVKSUlNTXdHZ0JLaG1FVUdvMkdJWVNRd01CQUVoc2JpNFNFQkRBTWcwNmRPcUZQbno0WU9YSWtKaytlakNaTm1tREZpaFg0OXR0dnBScDVIMy84c1hULzkrdlhEL241K2Fpc3JFUkdSZ2JzZGpzb3BUaDQ4Q0NtVEpraWxTMWF0R2lSdE0vMDZkT3hmdjE2VUVveGR1eFluRGh4QXBSUzFOVFVvR3ZYcnFDVTRwZGZmc0dJRVNNZ3NzeTMzbnJyeHFtaTU4NmR3NFVMRnlUMVU5N3pVN1NwTlJKOEt6RzE1T1RrUllTUTJmZ0hpSml2MkxScFV6QU1BNlBSaUpDUUVLeGV2Um9yVnF4QWFHZ29jbkp5cENkN1lXR2hwRjRTUXZEdmYvOGJnTXZ6YkxmYk1YLytmUFRzMlZQSzd3UmNwV09lZi81NVdDd1dCQWNIbzZLaUFqelBTNnhJUEo3YzFwT2JtNHZ5OG5LTUhEbFNzdUcxYmV1cWRqSjU4bVFVRlJWaDJMQmhTRTFOeGJScDB4QVFjTW44ZWVUSUVhU2twRnhWM0JQUDg4alB6OGRUVHozbE1WNHgrVjZyMVVycWVYQndzRlRKcExFeEZCUVVvRzNidHBKNm5wYVdKdFhqRitWNnBRUmR2SGhSVXIyVVNpWGF0R21Ed3NKQ3BLZW5ZK2ZPblhBNEhKZzZkU29PSGp3SXBWTHBNVWVOSlhuN1dnOFJFUkdZT25VcVZxMWFoY21USjZPbXBnYjkrL2UvcXJYbDNoNFlOMjRjOXU3ZCs4R0pFeWZxdmJVcmQ4NG9MK2FYOGp4UFdaWVYrLy9CWnJOSmFtaDVlVGxpWTJOUlhWME5sVW9GaFVLQjA2ZFBTK1drNU9zb1B6OGZGb3RGVXJjRlFmQllFM0x6UldwcXFrZTFGMTlTVmxibTBTTlZwVkxkR0dETHo4LzNDV28rS25RMENPa1FiV290V3JUNHg0Q2FYSXhHSTFpV1JYQndNTFpzMlFLajBZZ3Z2M1JWSlg3MDBVZWwvNHVPamtaRlJZV1VFTDVueng1MDc5N2Q1U0ZpR0d6ZXZCbno1czNEZSsrOUorVXJybDY5R29tSmlWaXlaQWtBZUtnL1VWRlJxS3lzOUxDZmlaKzNiZHZXWjRYWnZMdzhQUHp3dzNqMjJXZHg3Tmd4UFBqZ2c5aTJiUnVpb3FJdWU5TVNRanlxc3dLQVFxRkFlSGc0UHZ6d1E2a3NraWlpK3UxTEdodERURXlNeHcxU1ZsYm1BZkxYVThUZkVwdnVpTC9WdkhselZGWldJakF3RUlNR0RjTGl4WXM5R3FaWUxCWWNQMzVjZWloZGFUMEFyaVQ4RVNOR2dHVlpUSnMyemNPdTZtdGV2VVd0VmovUXBrMGJZZFNvVWUrLytPS0xhQXpjUkFEaU9FNEtCUkVkQVlRUVhMeDRFZDI2ZFVOdGJTMFVDb1hrUURoKy9EaDY5KzR0SFU5Y1E5SFIwZGkwYVpOUE83Qjh6T1hsNWNqTXpCVEhLajNBNUNhT3FLaW9CdXI4SHc1c0pTVWxVdE1WYjZibWJWUHpGZEx4emp2dnFOeU9nam4vSkVCNzc3MzNNR1hLRkt4YXRRb2pSb3lBU3FWQ2JHeXNWQStydUxnWXUzYnRra3JzVEpzMlRmS2s1ZWJtNHF1dnZzS0dEUnZnZERxaFZxdVJrSkNBdDk1NkM3ZmZmanZhdFd1SC92MzdJeVltQmx1M2JzV09IVHR3NHNRSm5EbHpSckt4VFpvMENRc1hMc1NERHo3b2tZUFh0MjlmdlBMS0szajExVmZSdjM5LzdOaXhBMGxKU1pnOGVUS09IRG1DYmR1MlljNmNPYWlwcVlGYXJaYWV2bUxsaU9YTGx6YzQxL0R3Y0NnVUNuejExVmRvMHFRSjJyVnJoNWlZR0R6d3dBT1lNMmNPNXMyYmg3cTZPbXpac2dYLy9lOS9MenR2alkyaGE5ZXVJSVRnN2JmZlJrWkdCcFl0VzlhZ1NzVzFlcHMzYk5nQXU5ME9qdVB3M1hmZklUUTBGSU1HRGNMOTk5K1BKVXVXNE1rbm44VGV2WHNSRmhhR3RMUTBFRUlRR0JpSXRtM2JJams1R1VWRlJSNzlBRFp2M296aHc0Zjd2Tmw5clFmQTFVMXE4T0RCMkxCaEEvYnQ4eXlBbXBTVWhPTGlZdnp3d3c4SUNBaVFBTUpiRkFyRlF3c1hMblR1M0xuei9mMzc5emV3aTdyZjg0SWdTSEZ1bEZMaWNEZ29JUVR5cHVONnZWNEN0dFRVVkx6NzdydUlqSXlFeldaRGNYRXhBS0IxNjlabzNydzVGaTFhaFBIangrUFlzV093V0N5WU8zZXVOQTlkdTNhRnlXVEMvdjM3c1hqeFlnQkExNjVkOGZubm44UGhjT0NISDM2UXhwZVptWW4vKzcvL3czdnZ2WWRXclZwaHpabzFVQ3hkdXZRUHV6bXJxcXB3enQyalFON00yR0F3ZUJTSTlFNlRrc2VwclYrL2ZnbkRNQXYrU2FEMnhSZGZZTlNvVVRoNDhDQmF0R2lCdVhQblFxVlNJVEV4RVltSmlkaTNieC9pNCtNeFljSUVSRVZGSVRFeEVhMWF0VUpTVXBLckZwVlNpUmRlZUVIeUxDb1VDblR2M2gxQlFVSG8wYU1IenB3NWcvVDBkTFJyMXc0cWxRcUhEaDFDV2xvYWhnNGRpb1NFQk1URXhDQWpJd05XcXhWSGpoeEJ0MjdkY09qUUlVeWZQaDBLaFFLMzNYWWJjbk56Y2ZUb1ViUnAwd1lUSmt3QXd6QklUMDlIVUZBUWR1N2NDWXZGZ3NXTEYwdTlLdGV0VzRjbVRacElIanE1TUF5RFhyMTZZZCsrZmFpb3FFQmFXaHBDUTBPbGlyS2kralpyMWl5SnFRUUdCbnJVNllxTGkwT0xGaTBhSFFNaEJDTkhqa1IyZGphT0h6K09pUk1uTm1neTBySmxTOFRHeHZxOEpsRlJVUTA4ZDl1M2I0ZkZZa0czYnQxZ01CamdkRHFSbnA2TzlQUjBoSVdGWWZ2MjdZaUtpc0t6eno0cmxmU0ppSWhBdDI3ZEVCMGRqZWpvYUdSbVprcWU2T2VlZXc2UFAvNTRneWoreHRhRG5EdzBiOTRjQXdZTThOaFBxOVdpWThlTzJMTm5EM1E2SFRwMTZvU0FnQUFvRkFwMDY5Wk4rcit3c0RCMDdOZ3g0ODQ3NzdTLzlOSkxwMldNVDBRNEtxcWNjaWFuVkNxSjZOUUtDUW54cUtSQ0tVVmtaQ1NhTld1R0V5ZE9JQ2twQ1ZsWldVaExTNE5XcTBWV1ZoYXFxNnR4OE9CQnhNYkc0dDU3NzVYVTdkNjlleU12THc5bFpXVjQ5dGxuSmU5MXQyN2RVRnBhaXB5Y0hFeWFOQW14c2JIbzJyV3JWT3JxOE9IRHFLcXFRbng4L0IrWEs2clQ2WkNkbmUzQjFyeXpDcnpET3VSeGFtTHdyVHRPelM5Kzhjc05FTFBaL08rUWtKRC9BYkM1SzRNNEFMQ1FWUVlSYzB1VlNpVjFNMklxNXBXS1NmTVJFUkZTWG1seWNqSlNVbEtRbHBaMnc1TG0veEJWMUdhelNSM2FLeW9xVUZ0Yks3WEh1NXo2eWZNODVHbFNETU1zOWk4MXYvamx4a2x3Y1BCY25VNW5qWWlJV09kbVpoVHVXRGF2OUN2cUluWEVsYU5GQ0dVWUJnekRnQkFDOFcrbFVnbVZTZ1YzY2owNmR1ejR1MnZrL1NuQVJpbkYrZlBuVVZoWTZLRit5cXQwaUI1UWVaRkl0NnVXRVJQYTNibWYvb3dDdi9qbHhrcEFlSGo0WTFWVlZaYTR1TGl0MUpWYzZtMXZnN3VIZ3VCME9rWFBxQWh5SUlSSWRqWnhFd0ZPbzlFZ1BUM2RaeE9YbXhyWTVLQW1OaklXSFFVV2krV3lsVzhGUVNBMm0yMll1MHFIUC9mVEwzNzVjeVFtSmlabVprRkJnYkZGaXhZSHZKZ2JCVUFGUVJDOW81QUJHaEdMVjRxYkhOUkVZQXNJQ0pDYUt2OGxnSzJ3c0JBWEwxNUVXVm1aVDBlQjNXNXZrRlVnQyt0Z1RDWlROM2M5TlgvcEliLzQ1VThVUWtoS2NuTHlROGVQSDlkMzd0dzV4ODNjUkpXVWluMFJSTllHbVlOQlZFVzlHWnRTcVlSYXJZWmFyWmI2bXY1UmN0MjhvbFZWVlpKZHJieTgzS2RkclRFUHFGak9PelEwOUNWQ3lFRC9zdktMWDI0S2NHc2FFeE1UMnFsVHA5TmZmLzIxelExZWtxY1VQbXEydVZWUzhXLzU1NUIvTG9hK3lIdGNYRmZHZGoxYWg1bk5acHc1YzBaaWEySU9xSGViUElmRDRlRUJGZFhQdSs2NlN3SGdtZnI2ZW44NWI3LzQ1ZWFTNFptWm1UVXBLU212WGJod1FaQXhOMWY2Z2ZzUDl5dmNXUW5FblVJSCtlWjBPcVhOWFRVRTdkcTErMFBBVGZsN2F6NVJTcEdYbDRmaTRtSlVWRlEwc0tzMVZ0TGI3U3dnQUpobHk1WXRjRHFkTjZUeGl0aFQwYnZxeEpYRVlyRWdNRkFMUWhqL1V2ZkxQNDI1M2IxMTY5YnFsSlNVejkwNEpzakJqUkFSeHdUSzh6emhPSTY2YVJzVnZhUnlGZFhiWTlxK2ZmdnI3a3hRQmdVRi9xNEQ1T1hsb2JhMkJucTlEbWF6Q1ZhckJYYTdwSExLS25RNGlSaWRMUGVBMXRiV1RIVTdDMjZJOEx3VFRpZVBhejF2blU2SHlNaUlhK281YVRBWUVSSVM3RE9TM0M5KytTdEpVRkRnblB6OEM1VzMzSkt5RllBM2M1UCtUeEFFZ2VkNU9KMU9LQlFNNFRpT0twVktpYUhaN1RaWXJSYVl6U2JvOVRyVTF0YWdvcUw4dXJidUF3RGx0ZHlvM2xKV1ZvYXlzbkpVVjllZ3ZsNEhnOEVJczdsQmp3STN1RW1nUnR4VWxkVFcxdlFOQ0FoNEJqZXdMcHpyYVNIZ3Q1eTNhQUM5V2pHWlRBZ0xDOFh2bVdPLytPVW1FV1Y4ZlB6RHg0OGZxK3pjdWNzeFg4ek4vVW9FUVFEUDg1VGpuR0FZeml2a1F3bVZTZzIxV2dPTkpnQmFiU0NDZ29JUkdocmFJQ2Y0ZHcyMnNXcVhWNUxTOGpJY1Azc0JPbmRHZ2NGd0thbmRiTGJBYkxXQnZRUnNJbHNqdkNBUUtsQ21xS2d3SVNnb2FENkFsQnRMcXhrcHp1WmFWVzU1Y3U4ZnRjOGZJZnBqZTZCb2xvR1FxQnNURmtnNU82dzE5VkJHUkVPalZRTndvbUxySnRoc2dLcHBHeVJsdFBsYjNPbS9aVjV0aFRtd09LTVJuUkxYeUgvWVViWGpNQ0p2N1FlVm0rZzdpazZqN0ZnK0FJTFlRYU1SSE1wY3g3RkVJRG9sNFdwM3VhVjE2OWIzcjF5NXNuemF0R25sQU1SQVhmR1ZpcDVTbnVmaER0cVZRa0F1ZVVjdDd0QVB0YnNUbGhiQndVRUlDd3U3cHFZd2p0SmNHSXhheExaTGFuQk95bXRXazZnVml6N1lnUDFGNVNCMVpTaXZxVWZYdUZBb0xTWllMR2FVbEpXaHNONE13dGtnQ0VDSUVzVHBkTUxKY2NUQk9RbmdzcXU5azJ0KytybjQrQ0hrVDFpUWxPS2ExVU14UCs1YTl2c3QrL3dSVXZMWmNnUk4vZ3hodlFQLzhOK3EyL1laRHIveUpiVE5Xc0JSVm9CbTg5OUZtLzVKVUFVRXduSnVOODRkcUVLenpIWi9DMkQ3TGZOcU9MQUdoZnBNeEthT2JJem5JLys5enhEWTkxWm8zRVNmVVdxZzFnYmc0dHN2UUoxK0cwTERHNjZueXU4L1JzRHRhUWlMOFJ4THdmdExvZXoxR0pJNlJEYll4M3ppUjVRWU9pTTJOZkZhTko0QjQ4YU5LNXcyYmRwYk10WW15RmdiNElwemcxc2xwUXpERUlXQ29RNkhBa3FsYXhNekVkVHFTMjMrZ29PRDBiRmp4NnNtQXBiam0zSDJWQkxpMDVvMU9LZHJCemFvMFQrdERYbzJEVUZob1JxNzlwWmk3emtkdWtjb1lOYlg0V0tkRlluaGdlRHRRRVYxSFRFcmxWQUlUbkN1Q0dWQ0FNWlNtLy9ReURmMnpNekpURVhIRzV4YklEZGkvalkxbHZuRDl3RUVVREJ3NnF2QTBTQUVSbmg2alNnRUVEQ3dWNVZEMElRak1QelNZclpYbFlKWGhpSW9LdlRTRHF3ZG9BVE91bW9JbWpBRWhIcW10RGlOZGJBWkhRaU1pNGRDOWR0Qm1DL2RqLzJMVjZMSDJvMW8waXdVRUd5dzFuTmdHQTNpQjQ5QU1GT08vQUtMai9rUTRLaXBCc2NwRUpRUUE4K0hIUTliZVFVRVZUQUNZOEk5dnFNT0s4eFZ0ZERFeEVHdDFkeGs4K3I3bkFqUGdUb0ZVS3NCTmdzUUhCZmhPVDVuRFBwKyt4bUliSTYwemRxaGViTjJxUHhvQ1lDR2E1YzZuV2ovM0NvUVpjUFB6YWNPUU5scU9vZ1FEaWlWMGppbzRFVDg3Zk1RTC92czBqQTRXTXNyd0VUR0lTQlEwMkN0OEViSGZWVVZWWVZ4VGVMV0ErQjlxYVNDSUFpRUVPcDBPc0V3QkE0YkpZUXcxS1hCS0tGVXV0T3NWR29FYU5SUU9PelFLTFVJRFExMTI5c0UyQ3JMUVFNaVBhNERBSEM2S25Ba0JFVGdRSjI4TkIveWMxSmVxemVpb3FJZWFrNlBrcXBLMU5YVmd6aFoyTXdtV05RcTFPb01JQW9DY0M2N21vSlFjQ3dMRUVxb3E2WTZzVmhNL1pUT3V2a2NvMFN3a29DUUd3MXNsd0R1dHpDMmE5bnZ0K3dEQU9lZm1ZaUx1U293U2lXRXlvc0l2bjBoK3M0ZDdmclNlQXJyK3orRHBHRXhxRHlsQTh3NmRQamtKelJMTXVMUWZWTlJaNDJFeWxJR2tqWVJ0NzQ2R3lvR29FNE9oVy9OUjdGS0FYdkJHY1RQWG9IdWQ3a0tFaGIrNTFHYzNGU0NpT1lSTUY2b1E4WjNHeEVyUGR3ZE9QbmtUS2dHelVLN3JDNVhYaHMvckllcSt3UWtOSGVyRTRwQUJNbnlSd2dWUUhuQmF6NnFzWFB3ZUxBeExhR0NBU1pkS1BxdStoQ1JNUnBRVXpIMlRMa0g5dENXVUFzNjJCTUdJdXRWVjBrKy9lN1BzV2ZSSndodG13SjcyVVVrUC9rSjJnMXNmcFBNYStQbkJJR0g4ZWVWMkg3Z0t6Q1dNcUQxblJqNHhpd29BVlN1K3k5T2Zia0QrbU4xR0h4bUx5SzlzWnJqQUhpdUovYnN6OWo5L0Vld25QNFZyZC9laTdhM05uR3BaTWMyWWQvTFg4Q1NVd0pTOERqS1A5RWkrclpIMEdWeVB3QmxPSEQzazlBVm5rZkk3WXZSLytsTHBkcnR1WHV3ZTlZaU1FMWFnUzNNUTl4REw2SGJYWDE5clpXSDl4eklMdXpYSysyWVN4V2xBa0FFVVMxMXUwa0p6N0p3MnUxVVNRanNPaDM0NkhnM2ExT0M2TXRROVF1TFdwVWRRZXBnWEZUK2lJQjNYa0NndlF4NXp6d0hOclFaVUg4UlFVUG5vdmNUNDBBZzRPSnJzM0Z5WXlIQ1lqWGdXQWRJbTJUM2ZIaWUwelVCbTlWcWxjSTZhbXZyb0srdnh2SENTc1FGaDdyYWM5bnNJTHdBbzlFR284TkpGRlFBRlNpaERBaER3SXhic2lMOGtUVTduNnF2MHlkTUd6OFlLZW8vUXhIOWJjRDJlL2E3WmhEbG5YQkc5c0tvajU0Q01lWGhoOHp4cUpneUFnbnhTaGV2cURrRlJlWm1qRjdlRVFBTEo2dEUxZW8zVWFYcWg5SGZMNGJDYWNDdUlabkkyek1PN1Fja0Fyd1R5clFzREg1dUNwemxlN0Yrd0JLMEdyY0xFWUhWT1BmaFhtVHNPb1dFT0FCT0Zqd2pmOWdJTUp3NkFrMTczVldkZytYQ0JRUW45Mno4ZjZrQXdla05iQkhvczM0NzFDRXU2cDczd2hTYytXb1grajQySE9ZRFA2QStiRERHZmVFcWhNbXpyTFJ2NGVjZm9OblRuNkhUR05mVG5XZUZLNDd4eHMxcjQrY0VnWWNWeVJqNzdadFFDd2JzSE5RRCtZZnVRSnVlc1dneWZnNmFqQitMSDlwTWRBT1kxL2lkSEVBOWdVM1RiakNHZmpVWVIrN3FCdEJMYXkydzYyZ00vV28wanQvZkc2bzczMExhMEdUWmtSTFI1OHV2VVBMK1k3aFFUMlhIcytMSVkzT1FzT0JyZEJ6Y0dvTHBQRGIzbTRINk1Yc1JGZEpnclRSaHFXTGFzbVgvTGxpdzRCbUJVZ2lFUUlETVkwb3BCUVVFeWlpZzBBWlFGWnpFWEZ0RHRhR0JVQ2pzSUN3TGMxMDE0b2VQUkd5TEpvaUxqa1p0UlFWMi91ZFZKSTE4R2NObkRRR2NPdXdZT0FDbDQwYWlxZm9Ram41eUFVTVBiMFY0a0lEajl3OUdsZlNnOUR5bmEzTFhGUlFVb0t6TW5RTmFYNHVESjg3QW9RcENzc0lKczlrT2ptVWhjQUtjMUVuQVM0bnRFQVFRUWFERWtkenB5Ym45MncydEx6bVBWN2Nmd2FqVUVZaFR3UzgrSkxaUEwxZW5uWkJXaUdrRDFKOHFSMEs4ZTNGcVVuSEw2STZTYVVDcEJuUW5UeUt1NzVOUUFJQXlERTE2dDBmMTZkUEFBSmY5Sks2bnE0cXBNcUU3b3FJdW9qN2Zqb2dPa1lqdkdZa2pEMHhEOHBCK2lCODREUEh0NWZhV1FQVC82ZFFmZktZTXFqZStnOXp2ZHNObXRvT3RMa0tJdTV5ME5xMHJtRk1QWU5jY0IrSjZkRVh5eUpFSVVydm5wMmN2SFBqWExEalBqa0JVajM1SUh0RGxKcHBYWmFQbkJBQlJtWmxRTXdDWU1NUjNiNFg2N0d5ZzUwMlFjR1BLUlhXMkRZcTkzK0RZUVpkcVRwMmwwQldZRWRYUjUxb1pPSHYyN0xNTEZqenpzVnNsNWIzc2JkU04wSlRuZVRBcUJnTGxpYzNPVXFWQ0FjSnljQVpHUUNBc2pFWWpOQm9OQW1zS1VIK3NDSHowZWh5ci93VVVBT3Qwb0Q2bkJCR3FNMkRTTWhBZXhBQmdFTiszSjZyT05MYXFydFpRV2xLQzB0SlNWRmRYb2E2dUZrZE9uRUtKUTRIV29Vclk3YTVxSFZRUUlIQWNHTUpBelFDOFFBbEFDYVdVbWZiOGY4Wk5IZHJuNlo3TjR6R3lieCswNXdxeHJkRGlSN0JHNmNWbHZ0TUc0ZmRGa0JEM2xWZWk4MGZiMEh2eGRLaTVNdXdmUHhSNXgycCs4MUdEV2phSHNhRDRtdmF4N0YrSmd4K2ZSSmQzL29lUlc3YWc2LzFEM2RvTW9FenNnZEg3ZmtMS2tFNHc3VnFGSDI1L0RLeDd2NllQdkl3Ulg2NUFlSHdBemkrNUI0ZmUzM0hUek92bHpzbm5Yb3ppSmxsMEFxQ0tSUHpJTENSbVpTRXBheVI2ZkxvV1RXOEpiSFN0QkFZR3ppb3BLZTRMVnlVZURhVlVEVmY0bG9KU3FxQUFReWwxOXlybHdRUGdPQllzNjRDRDQ4QkJnTlZxaGNsa2hzRmdRRjJkRGpxT0FkdXFMVWlYTGtqS3lrS1hOLytIbEY3WEZncHlWY0JtTXBrOGVvQWVQM1VLWjR3VUhhSTBZTzAyMk8wT3NLd0RDZ0NVdFJPSEsyYU5VRUVnQkdDcXFrcVRRZ1BWVHhUVkdselRaemVneEVJUUhPQ1A3MnBNcXZjZWNCa3JUSG1vT1FkRWRyeThTejRpdlFPcTl1NEZEd0JPQXlyMjV5QlNWbUcyNnVCZWwvRzMvRmZVNlZvaHFrVUFBQmFzUlVCVVJqKzBtL2NzVXZyRndwZ3Y3K0xOSXVmLzV1RDg5cXRqYlFtang0SGR0eHBsQlFiM2ZXS0ZwZHB3eWUwVUdRbTJyQVJPdVhtanJBd0JyZElSSGhNRUNCYVUvYlQza3FIYVpBTEM0cEE0YWdLNnY3WVV5cEp6c0xwM1prMG1CTjNTQ1NuM1BveE9EOTRHL2JtOG0yWmVMM2RPQUZDM2J4OVl3WFc4eWwvekVOa2g3ZXJjZHBIaHNGeWhzWW0zS0RVYXNIWDFWL2ZQSVcwUTI5b0dxeWtjc2QyNklyWmJWNFMzYUFaVkVIUFp0ZEswYWRON3YvbG1UUk1SM0FCSTRBYUFvUUxQdU94dFRzSVRRSEJ5aEdVNU9EZ25XTjRKbTgwVnRPc0NOdzYwYVNES0NxdGdpd2lIdG5VcW9scTNoRG9rRUVHZE9vQm1INGJlSWdCd29uTHZ3Y2JQKzJyTzE1WFk3aTRZV1ZPS0EzbVZzTEYyN0NtM1FXRHRnQUFrQkNuaHBDQXF4dFc5QnRSVmg0NEJtS2lvdUhtUGp1emQ3WUZ2TitMb2tSam9hMnVSMExFblJpUnAvQWpXaUNocUQrTEhjWGVBcjc2STBBZGVjTnVCR3BmNE94OUgzQTkzNG9jUko2Q3lsWUdrUFlSVy9TK3BsZHpKTGRnNmNTdnNCV2ZRZk1sYmNEbWFxckZyMkZqd0NhbFFveDVHOHkwWU9GUWVpc0doY3RNM1VNY09SK3ZCSGE5OEV5WDNSNzkvVDhIKzIvc2pvRVVMT0VxTGtmTFNhblFZNm5JbWFMcU1SS3VXWDJGOXQ5N1FkQm1CMFI4c1F0U2dTVkMvZFJlMlREd0t4bGFQZ09oTERnRHp3Zi9oNThWZklxSk5DOWdLemlCNjVnS0V1YWZoN0lJN1VIUlJpNUFZTlhTNTFlajZ3ZU0zemJ3S2x6a25BTkFxeXZIVDdlUEFXTXJBZEhvTXQyUkVBZERoNEQzM1FGZnZnTkZRZ1FQalJrT3BiWUUrYTkrRTJNSzY5ZHo1MlBuWU9PUXZEVWI3bDc5RXE1NEp5RnZ4S1BMMkZNR2FXdzFTY2k4S1g5TWliZm4va056ZXRWZnlQUTlqMXhPUG9PeVRFTVRkK1RReXBnOUc3ZFozY1BqdExXQXJMOExCL1lyTisxZWl5WDBMMFhsOFQzUjc4M1hzZm5BcVN0NUxnWktyaGRtU2dDRS9mWXpneTZ3VlFram5VYU5HM1FIZ3Z6S1ZsSGZUVklGU1NnV25rd29BVlNyVmNEcWQ0RGlPRUo2bm5FQmh0OXZkd2J1dXloOVJQUWVnYXZ0S2JEeitFM0lpQXhCbERVUGZEZDhqSnI0dnVqN1FFajhQRzQ3UVdDMTRxbkUxREFRYW5CT2hHbW5RZ1FBQUlBQkpSRUZVVkxpaUNpb211SmVXaXVXSTZxRFhHM3gxbVhJbnVIT0U1d1ZDS1ZYWTdiYUpLcFhxZnk3ckw0ZHlnd1VhYlJDaXRIK09jYTI2dWhvc3l5RXg4ZHFvYlhaMkRsSlRXMG0xNi8rb2ZRRGc3Rk9qWWVtNkZCMkhKWUlUZ2hFVUZYVFYrN3JDRWtJUUZOVXcwTkZSVXdraElCVGFrRUFQOWNOV1dRa25WQWlPajhIMWNPZFExZ3B6ZVRWVU1mRUlDTHFLZUI2QmhhbTRFdXJZQkdnQ2xWNWZXV0dwcklVcUloWUJJWjdIWWcwMWNCZ2NDRXhJaEVKNWs4M3JaYzRKQUhoTEhXeG14aXZjNDJZUkFkYnlVbEJOQklLaVFxNTZyWlNWbGMxTlRFemFCY0FDVjJseE82V1VKWVJ3N3JMaXZIZEpjYTFXaThEQVFBUUZCU0VrSkFUaDRXR0lqSXhDYkd3czRrSUQwYXhaSzNUdW5ZbmtwRXRCdUd4ZEZaeE1NQUlqZ240Ylk3TllMQ2d0TFVWVmxieTJtZ2tXaTlXZEQzb3BiY3JwbEhKQmlTQzRnbkJMUzB2aVZTclYzRXVQU3hVU0lzUGhsNnNUZFVRYzFOZTRUMEJjNDhHV21waDRuOVlJYlh6Q2RSMDNVUWNpNUZwcWJURnFoRFJQYnVTclFJUWsrLzVPSFJZRGRkaE5PcStYT1NjQVVBUkZJVGpvWmwxNURBSVRrcTk1clNRa0pFejc5Tk5QY3U2NzczNGVBQTlRaWJYaFVvRktNWmVVS2hRS3dySXNkV1VrS0tCU0tXR3hxS1RPWW9HQldoaFlPOHBLU3hFVkdZbWdJTmVFcWFPdWZQMHVhMk83MUlURjFUSlBCRFZYYVc4SEhBNFdIT2VSTWlWNlFnbWxsTVRGeFQwT29Lc2ZvcTVORW1mOEgxSnVUZkZQaEg5ZS8xSkNDT2wweHgxM1RIRGIyVFNVUXU1SVlFUmNrR1VsZ09NNHduRXNIQTRXZHJzRE5wc05Gb3ZWblNTdlIxMWRMU29ySzZYV2ZWZHRXMnpzaThyS1NxL3kzaWFZelJiWWJGWVBwc2F5bkZSalNSQjRLY0hkYXJVTVpSaG1ydjl5WDd1RXRPN21ud1QvdlA0bEpUQXc4TUhjM1BOSFUxTmJId2JnZERHM1M3WTJTSW55VXJvVldKYURRc0ZLU2ZJMm13cG1zOXFkSks5RFVGQVFRa05ERVJFUmdmajQrS3ZrbkQ2RTR6Z3ZGZFJWVzgxbXM4Sm1zN3U5b0t4VTJsdXVnbEpLeWIzM1RsTm9OSnJIL1pmWkwzNzU1MG5MbGkybnBLU2t5RDJrS2plSll1QU8veEFFTVFURUNhZlRTVGlPQTh1S3JNME9tODBLczlrTWc4R0krdnA2VkZWVm83UzBGRmRiUDlJbnNMbENPNnJjS3FoQnFyTm1zOG1aR3V2UkFkcGRKWk5RU3BrUFB2aGdOb0JCL2t0ODdWSmRYWTNTMGpML1JQamxMeXNLaGFMLzRjTy9qQmFCalZLcUVzR05VcXFnbERMdTZ0bHlsVlRDRllmREJXNlg2cllaM0NwcEZVcEtTbjRic0JrTUJuZlBnaHJvZEhxWVRLNjJlV0xMUEhtTk5hZVRJL0l1VXdCSWZYMWRxa0toZU14L2VmM2lsMyt1UkVSRVROdXlaWE9TRjdoSnNXMEFpQ0FJTXRiR1Nhek5WWkRTN3JhM1dXQXlHYUhUNlZGYlc0UHk4bklZRElackJ6WjVoeWxYZVc4THJGWlBVRE9hektnMW1LQTNXV0ZqT2JuRGdCRTQ2NnhYTnV4TVhMQnVML2FXbVM0ZDJHbkhON3NQNGNtdnR1SGYyMCtneWtIOVYvOTZpOU9DMnRQblhjR2t2MU1xVnIrQWcrOXZ1KzVENUN0L3hZN1p5ejNHYURpMkhjZVd6TWUrMlhOeDVydTlFSDdYTHdqUW45aVA4eCsrZ3hOdnJvVEQ2N3VxclN0eGNQWmpPUExLaDdCYVpiL2tyTU8rKzJmQzVFK0d1VjdTOU5aYmI3M2REV3dlUWJzaWEvTjBKSGd5TnhIY3JGWWJ6R1lMakVhWFNscGRYWTJ5cXdoUzlnQzJxcW9xVkZaV3VoTGMzWEZxTGhYVUpyT3IyV0d3Mk1FUVZ5RVB3Y2tScHl0bWpWZ05GUU5uZjdUNVlTNHFFU05iL2o5NzV4MGZSWjMvLytmTWx1eG0wM3MyZ1NRa2hCWWdHQ0RTSVFLQ29LQUNJdllHbk9XOHM1ZXZEVTg1ejNMcXozWXFsa05SRWJGZ3BCY0ZSS1FIQ00yUWhQUmVOOXRuZm4vc0p0a1VVaENVMDNrOXpBT3ptNW41ek9mem1mZTg2K3R0NEtIM3Z1RkF2V3NMZjVUK0hVdHpiTXdkTVlqZzJqeHVYdkh6cjl6QUN0ckFkSlF0MXo3YVZIYjBxMlJrWFJtV3l0cXpQc1RqTHoxTDhNVXo4U3dpeXZsaUpYN0RKeEUzWXhUWmo5OU01b2JjWDNHRktqSmZlSVhxekQxa3Z2cHhpN21vM3Z3MlAvemphNkxuWG9lMmFDT2I3bnUxdWNKS0hVek1FQzBIM3QrZzdLT3pCSjFPZDBObTV1SEJIbHJiNmFLa0xiUzJsdjYyeHFvRWwwbGFYbDVCY1hFeEpTVWxYUmRzaFlXdVppelYxVlV0VEZDcjFZTE4xaWpZSlB5OXRZSldGQkFGQk5GVnhpOEFZdUhKN051UCtNVnkvNmplakVtK2dMa0pBaXYyRndCV05od3U0ZFpKSXhrYUU4SDhTMGRnUDNhVWcyWmw4YzhXaXI1ZXd2NlhsdUtvTzhuaHhZdlp2L2g1cWlxa1JpbEYxcHZQcy8yT085bjc4aElhVEYxN3BjaDFoUnhhL0FqYjczMkVnb3g4VDZsSDlqc3ZzZjJPTzluOTBwS1dtaytIZ3ZjSXg5YWFpSnZjcDhYSGc1OTVnNFJMSnhJMWNSYVJLU0dZQ290L3hVd0VNL0tqNWFUZWZ3MnRLekN6UDF4SzdNS0g2VEZxR0lNV1BZTDl1LzlTNW1IVlJNMituT0wvdm9kRmVlT2VOZlR1M2Z0S1dnWVJOQjdtYUtQVzFsUkw2aGxJc05tc1dLMHRUZExxNmlyS3lzb29MQ3pxbW1ETHkzTVZ1TGVPZ3JwTVVGZGFoMGVUNCthQWdTdUNLMW9zNXJuSHk2dW5KMFNFNEd5bzUxU2RsY1NJRUk2WFZnRk9ISktNU3VXK25LaENKZGR6c3RLdXJQeFpnay8vWVlTTkdZS29DU0k0TFkyd3RMSG85YTc1UHZIMEFvN3VxU0grdGx2UjVHOWt3OTB2ZGtsYkxscnhHZW9oMDRpZEVNZFAxOHlqdk1JQk9NaTRldzYvWkRwSldEQWZIL01lTnY3MTMxMDZYOTNQUDJCUEhJN2ZhYklyaTVjdElqdTNGLzB1SDNZT1pzaEM5ZEU4L1BzblVuL3lHRGF2UkFJaXlxbkphbmFYaUJFcEJJbDdLYzZ5S1J2cUxFR3RWbCtjbjU4M21xYmN0bVpmVzJOREp6ZWRlSXRBZ2t1NDJkMzViVzJqcEtXbEplVGw1WGNzMkd3Mkc4WEZybHJRNnVwcXR3bmE0QkVGUFUxNmg5TXB5TElzM3ZIUVl5cU5Sdk1YczgyR3QxYkZwMnZXY3MyS245RnIxTlRhSFlBM0krS0RXUEZqQm1YMURhemR1bzljV2NCc2RTZ3JmNWJnMjNzUXhtRkppTG9BSWxKVE1hYW1vdk1HS0NONzVTNlNIbjJjaU9Sa0JpNTZGT2U2NVZUVWQzNU8vNmxYMDNmS0tLS20zMGI4TUNjNUd6S1FTM2R5YktPVG9ZdnVJaWd4a2ZpNzcwWGNzWUtxaHM3UFYzdnlKSWJvbUhhL2E5aS9nbTJ2N1NOdCtSTDhmTThGbGJvSm14bFVtbUsyVEJ4TFpub3VhajA0Nmp6TkJoOThZblRVWlJVckcrb3NJakl5Y25aS1Nvck9yYlcxQ1NRMG1xWHRwWCs0dExiR0tHbUQyeVN0cHJ5OG5PTGlJbXkyOWw5Q2FwY0pXdGlpSDZpci9yT3haS3BaVzJ0TXhIVTZuYTQyZHBJa0NJSWd2UEwwWS9PQlZMMVdTNFBKeWRYVEwrRVNwNXE5T3pmanAzSFZoTjQyWXdyV3RUdTVmV2tXQS92MFpYelFDYndWZG85ekQwYzFEZFgrZUllNTFTVHZVUFMrMVZncWdVNzYxQm84a2lIMXhraktLOHR4bE5aaXRSU3k2OVlibTlSOXI2UWtzQUtkVVAvTE9PQTBOT2tWTzdZUmNQRnNBa1BQRlZlOEFhMGVuUFlJSnY2MEQwMUlFRDhzQnJXdnZ1MmZTazVsMzV4RmlLSTRiTTJhMVpORFE4TytCZXp1SHdkdVduRmN5YnVDdXk5cGs1engxTnEwV2xjZ1FhZHpCUktxcWhwTjBrSmkyeW5mVTV2TjVpWTZJbGN0cUdlVDQ1YjVhZzZIUTNBTE5jSHVjQW0xakFQNy9WUXExWHlBUHFHQi9ISzBITkZyTUtIQThlSnlFbnU0T2hKcHZRTzQ1L0tMM1M2YVFpWnM4K1grVUlWbDh1enVJQUZCY3Jha0hGTUg0QjFRUTBPcERlSzBZQ3JEWEJlQUxxZ0xPbzZIcjh0Y1dJUitzQkYxbUFFdlF6eWpQdjRVUXpmZlMzNlJjWmczdEorSEZEVHhXcEpzb2UwYmtTWDU0QjJJenZmWEZGZnFDT2pmZzVyTTQrZ3VHQWFtREtwTHd4Z1E3OXZDWEcwb01CRVNGOW51R0p4YWZ3eUJ2c28rT3hQUFozRHc3RWNlZWZqN1o1OWRiQVBzc2l3NzNBd2dUcmZXMXFKMW45c3lsSnVqcERaM2xMVFJKSzJob3NJVlNBZ1BEMGV2Yi9tQ0Vwdm9pS29hMitjMWVEUTh0amJXZ3VKd05QcldITmhzRGdBQldSYjIxRGh1WGJiL1ZIK0EyTDU5NlZlYncvUGJUN0JsLzE0K3paS1psZXdxSGk0NmxjdEhlMDZ3NmVBeC9yNTBFNE11SEVxY0l0Zk9zbElTZzYvNkJKbnZmVUhldWcwMG1BQkNpYjFpR0llZStRZkZHZnM1K01SaVZKUG5FT3pUK2VscTFuN00wVFhiS2ZqMkhiTDJhT2c1c1Q5Q1dDcDl4dHI0OGY3bktkNmZRZEhtTmV4KzRaMHVwWmo0alJpSmtMa0hVenNlaU1wTkt6bStlbmU3eCsyNWRnemJYMTdWNVdrbyt2WWpqbnkrQWFlOW5Ld1BQaVI3K3lFQWVsMTNQVGx2UEVQdTl6czU4UGl6YUtaY1M2aEhFYjFjY1lCeTB5QWkrclRWR2cvY01ZWHZuMTJ1N0xFemhDQUlmZSs3Nzc1SnRLMUc4RXo5YUpHMDYzQTArdldiVFZLTHhWVkxXbGRYNTg1dEsyODNrS0NhTy9jcWo5eTFLbXByYTlwcGVtekZabk9GWXAwT1J4Tjd4eVB2ZlJhazl2WjUzU3BxZzRaSEI0SEtpN1IrVVJ3NGxrVkdwWk03THgzSE1IZWZRNmZOd3BiTWJQYVgxREl3YVRBUGpJbm45K0FOTlpsTU9KMFNmbjUrM1RxdXRMU000T0RnYnZVSVBaTmp6blI4cnQzampYSFNoWmlPSHFRaHZ3akR3QXZSZXdzRWo1bU1xdXd3ZWF1M0lNYU9aUGlqZjBIYmhYNFR3ZU1tWXp1d2xwTE1XZ1krL1UvQ1kvd0FrZkFwTTFDVkhpUXZmUU8xaGJVRWp4eExVRnhrNTVSSCtranNHVXVwOFI1RFdLK1dMQytTdFFGMVdDeEJjYTFxQWFWaUR2L3piWXgzUEVaWWJOZVlZYXArMmtSRHJaYXc0UU1SR2t5SWZqMEo3bTFFRjNjQklWRjJUcVd2UllnZXpmQkhGcURWTkkrNjZKUFhhT2cxbmNReDdmYzk5UnN3ak9ENFNFVktuYW5Pck5NWk5Sck4razJiTmx0eDE0ODJVb2tMZ3REWVdkNnprNXdnaWdLaXFITC9pTzRPVnlwM2x5czFXcTBXbmM2TG9LQ2dGdlJnd2pmZmZPM1J5NkJSdU5XNm1Ud2FrM1BOV0N5TlhHc093ZWwwaXJJc2l6YWI5VjZWU3ZYcy85TGtudTk4YkdjNnZ2OFYyTEkyc1BIcEg1bjh3ZU5kZXJIWk1yNWcxU00vTStQYjV6aW5IbGxIQlZ1dStBdURQdnlVb0VCUmtVTG5DTlhWMWY4S0RBeGFpWXV6elNRSVFnTXVENjFORUFTSElBaVNTcVdTR2puYmREb3ZXYWZUNCsydHgyQXc0T1BqaTUrZkgwRkJnWVNHaGhFVlpTUXVMbzcrL2ZzVEh4L2ZiSXA2Qmd6Y1pKR05HaHAydThPdEVqb0ZkM3BIVStuVW5qMjdmVlVxMWMzS1Vpbm9EclR4RTVuYVJhRUdvRTJhd2VWZkxlYWNoNW5Vd1l6L1pya2kxTTR4L1AzOXI3ei8vdnQ4RzgxUmQ0UlVSYXRTSzNkdUd3NkhLMUpxdHp1dzJld2VVVkpYYmx0aklLRzB0SlNHaHViUXZPZ3FjcTl2WlhxMnpGbHJqMnR0NE1DQk53SUt1WldDY3d0UmphaFdoTTBmeU5jVy8rQ0REMDV3QzdaMmZXMnRPZHZhNXJaWld3UVNYRVh5cmtCQzA3WnBXZVRlbUsvV05oTHFadTRRQU9HNjY2NVZxVlNxRzVSbFVxQkFRWGNSRkJRMG8xZXZYdHAydERheFVXdnpxRWhveXAxdERpUjRrbEkyRnNtNzBqOHNGb3RMc0xtME5WZVJlenRDelpPU3FFbGJlL2ZkZDY4REJpcExkUGJoSXRWVFVnb1UvS0cxdGdIYnRtMGQweFd0clgzTnJWRzROUmJKdDB6L0FCQmJwbmZZV3ZqV25FNm5PMit0bVJrWEVOVnE5WFhLOHB4THdlYW5USVNDUHpUQ3c4T251UVZhbzlhbXBoVVpaV00xUXFNTWF1bHJzNTAyL2NQaGNLQnVyQWR0MU5ZYTg5V2FLd3lhZkd1NEtiK25BcU9yYTJ1cHNZdEVCZnJRcmd2RUtZT3FkUUtBazZLcU9nemV2dmg1cVpUVlBRMksxM3hLVmJFVk1hUVhmYWFQNmRJeHR2d2psQlNLOUJqZXA4dlhzUmNmSVd2Tno4aEErTVFyQ0lvK1Y1cWloT1JvVzAwcXFOVm5wU3RXaXl0VjVaS3p0NHhlRjNXREJyd3VuMk5mYkVRQ0FsTXZKcUpmMStpbks3YXZSdFY3SEFGaDNsMitWTVhXZEVxenloRjA0Y1RQbmNMWlN1V1VHaW9vM0xJTnEwbkVlT21sNkhXLzNYNDFuZGhOclRXVXlLU1lMaDhqaXVLSTQ4ZVBKYnNweEJ1TDQrMXVyYzNwTmtlYk5EYW4wNG5EWnNGVVg0OVRxNFhRU0x5OHZGclZrVFpxYlNXSXJuclE1Z29ERDIydFRjQUFFTFJxMjlWMy9mc0RwcjMxTFgvLzZFdEd2N1NDSGFXTjlYWldudnZvQzBZKzlSOFNGaTNIczBUVllhcGcvaXNmc2VDenpWejY0bEkrUEZLbVNMRFRRT1ZsUUZOemhEMnZmTjdsWXhyMmZjdStEOVoyenlRUXRXZ01Cb28vZVpIQ3pLcHpkaituM25tWWxTbERXWm1TekNmR2FENGZNcFNWS1VQWitNUkh2K3E4K1I4dDVzaUdJeTFmblFXNytQbUYvM2J2UktJYWpjRkE1ZG9QeWY3eGVKY1B5MzdqTVlvT1ZYZnZVbDU2dEdJNSs1OTZuYk5YYXU5ZzkwMlg4TXVtUTVoTHk1SE9JVHZKd1lkdW9yaXc1UVVxTnkwajg4dGQzVDVYYkd6c1JFOXp0RldFVkdnZFNIQTZuVGhsR1d0MU9mV1ZkVTBWQ1dhenBVbHJjOVdSbGlFMlVoSjVDalYzaFlGbjBBQlpsb1hxNnFxQmdrbzdlOEdzbVd4L1lCNHI3NzZPQi9wN3NXakR3Y1pIa3NrakwyVFZnb3RvL2U1ZjlmMlAxUFVjekRjTEwyZmxOVU41K2F2dFZDajBNTzBpZE1LbDlKcWNlbnJ0cktLRTJsT0ZPTnVaUDJkREhYWDVwYlNoOFpSc21FN2xZREZabWo1U2g4VVRQM3NXZ1ZHK3AzMWdHdkpQVVY5U3hhK2hCZTE1MjNQTU9yQ2ZXUWRXNGVjZHlLaTErNWwxWUQ4VG43cTJlWGlTUzdNejVlZGdxYk4wcnFFNEhKaU9IYURtVkRtU3cwR2I5cmlTamJxY2ZPeTJMbXd5UXdTOVpzOGlOUEUwcmVVY05rejVwekJWdE0vY2FpMHR4RnpUME01YTFGQ2JrOTlpblFLSHB4RS80eUpPRitpVkxDWnFjM0t3TmxpNk9Mc1NraU9mc24waVNZc2VwUDlmYnNEZ29VQTZUUlhVbmNwdmQ2L0lBQTRMZFRrNVhab255ZUdnZXVjV1REVTIxNXkzdS9lSzJ6Szl1SzloYldoWmNxTFJhQzdidUhGRER3K05yY2tjYmZLMXVWc091SVFhZ3VqdERSb1ZEbWRqTGFrSHRWRmREYVU1MlJSazU2SDJUTzlvTHB0eTRuUktTRkt6eGdhSUJvUGhLaEJKOHVqZzNqUElIMHRKSS8yUW1pRzlvcUFtcDgwVTdzZ3FaTUpGWXdFSWp1bEZQOGRXZHBZNXVTUmNNVW03WTlMdHZHb01aZVpJdkgwbHFyTWJTSDMvRTZMNnVKcnUyZzZ2WnMyc3pXaW93cXdmeHVSUG5rZXZCZk94TFd5ZS95QXFZeUxXN09ORTNQNHZobDgvcnNNcnlYVzViSms5RDR0dkw3UnlKWmFvU1V4N3Biay9qKzNZSnJZdVdrN3lHMjhSN1A4cjcrcklsM3l5NEhNU2V0VlJWaVJocjNJd2V2MWFMSi9ldy9IU2tWejAyQ3pBd3BhUi9ZajlPSnNZelE3Vy9lMUZMQ2NPWWpjOFJmVjNBUmhHem1ITVBYUGM1bWdXVzY2Ymk2MnVudXBTUHlhdlgwSEFHVnJaOWhQcldIWE4wL2oyN29WVWZoSXBiam9YdmZFZ1dyZGd5bjcxWG5MVktpelptVVRlL1JLcDE0OEhKRTY5OHdpN2wveUVmM3dRdGZsMlJuNjRqUERZamdkUnZmbDlOai80THY3OUU3QVVaQkh6NEZJR1RJenI4Smk4OS83QjRXOTJVbHRUeEUvejVxSldCekRzL1hjSjlvV0M5eDdocHplMkVSQVhTSFd1alpHZmZVcGtuR3V4Q3BmY3o0R2RFbUwyTHB3YWI2eit5Y3o4NUorbmRRMlVyL3NQdTk5ZVExMjJtWXA3cnVhRVFVWFArVS9SZi9JQUFNejd2bWI5dGN1UktuNUI2bk1OVTkrK0Z4VlF2V001UDl6OVBQbytmVEVkKzRYRWY3emJkQXpBOE9HcFk0RlRicTNOQnJJTkJCV3k3SlJsV1pSQWxweE9XUkJFMUdxWDVpWkxNb0xrYkpIKzBWQnlncjBydmlReTJraUoxSUM2dFcrdDBWSG4wdGFhVGRCdnYvMVdKNHJpVlMxWDNjUjdPN09ZTStteVRyYUhsYkk2QnlQOFJGNzRiQTNKbzBjUjdnTmx0V1lJOTFIa1ZkY05HWWE4dXdhdHIrc0JLZnJnRWZhL3M1S29GMjV4elhLMWxxbHJ2OFNnczdIN3FsRmtmcjJmbE5tSjdQN3IzNGgrN0RNR1RleURWSGVNNzhiZVNzWGxXd251NERtcjM1NU9WZkFVcnZqNE1kZmJ1QlU5akxPdWxJcjloN0NkSlh0S1ByR0h3QmMya3pyY0NBNExUcUR3ZENaMDlBaW1yRmpCOFNmbVVoWDNkMUp2YktuZFNxVW1CcTc5bW1CL2tkMVhEU2YzK3l3Q3BzZWZtVnNnYWdTWC9yZ1ZqUnJBd3JZcFE4bmRQWi9ldzEwdkUrM2dTNW40MUR3Y2hWdjVhc0pqSk03YWdpRjdOVHYvYzR5TE4yL0N6MWVrL0l0bitPbjU5NW4rZXNldFFMS1h2a3Zjb3grUVBLTTNJT0hzZ2hiVjQrYkg2WEh6S1ZZbFhNM0lGU3NJYXN4a3Jzdmc1Myt1Wi9TMnJZU0g2Y2gvL1c1MlBmYytsNzNWL0hLcTJubVVTemF0SXlCWWg5Tmk2ZERmR1RKNUFWTW1MMkRyaERpaVh2MmNYcjFicGt5YkhVWXUvK1k1MUpZYzBnZk5wS3ppWGlKOEM5bDUrejlJV3JxUlhrbWgyUE8zOFBYTXA0aWJ1QnczVlNBK1BvWnA4K2JOVzdGczJUS3J5eHhGSXlEYlpSQUZ3ZldmNENLenhlbDB5azZuVTVBbFdSYWNUbmN0cWJzQmpDR0E2Tm16aUl3TXAyZlBDTlNOVVZDWEdlcjBTUEZvNlYrYk9ISGliS0M1ejd4azUvVXZWdU5JU0dWQi8rQ3VlblV3NkRSb1JFR1JVV2VJbXUwcnlmdzRIVk5GSFk3cUVxUyt6ZThhUThwb0REb0FMU0dqaDNIOHdDR1lBcVdIektpMmZzN2VIU0FqSVR2eXFjcXVKM2pRNlY4cStxUVV4SXpiMkhLM2xmRFVGSHBPbTRiQm96Sk1QM1F1Y3c3UFBYczNGbk1odllhN1RVRzE3bGZWRWF2aWt3ajJkejE0aHVoSTZxcXJ6L2hjZ21qaHhQT0x5ZDk1QUx0VndweFRTMEJsRGVBU2JPRWpScm1HYkJ4R2NQQkpLck1zbUhkdkEyL0lldmxaVnd2MHloUFVIUFRDNlhZZW5RNWhJMGJ5NHpOMzREaHlDY0dwWStrNTRZSXpIcmZsV0FibXFHR0VoYm1pQ0JGangxQzdOTDNGR0FJbXppVEFYY3V0MHYyNmFFTmd5aEJYZFlndUFrTklEWlphY0pidm9yekdpNkF2LzBQVmw0QmtScXpNcEtZSzlNMGlJL3I1NS8rVnVtelpzczJONXFqc01rY2RJRHRsR2NubGI1TmtTWEsyMHRnOG9xUmFNOFUvYmFHaXBwNENqUmZxUmhQVTZXeWQ0dEdja0F1SWFyVnFsc2Y3bWs5WHJXYXJHTWY3VS92VGVWNjRGNkcrYXNwcW5meGx4a1ZBQS8rcGgxQS92U0twT3JZOFc3b3FUcTVqeTZQTEdmZkZmd21MRGFicTZ4Zlo4cld0SXdYUGRSSk5FQkhUcHVMalhxZ2VVNmZqRysvZDRiWFUwYWxjdW0wOVJWdTNVdmpOVXRMZldjdk16VytoUFVlM0t1b05wOWxIVXRPL2NoZDVTUVZQQjFZM2loYmFlOTFtdi9vUSthVXBqRjIyQ0oyM210M1hEVU9XNU5PZndYMDlyNWpCUkUyZDZ2NThLajF2RG1neGxQYXVGWFhiODF5U3RwK2lyVDl4N0xIcktienVWVVl0U0R0bjIwdnJjL2FlUDBFOFRkR2JmelJSVTZjMmxjVDFtRGE3alZzZ0xDd3NEZGpXeXRmbW1iQXJ1MUkvWEpSR3Nvd2dPSjJ5UzJhNTNHaFZtWWRCTmpKZ1NoclJQWXlJemNtNHp2YlNPNUJsV2FpcXFrd1NCT0hpUm45Wit2cjFmRllYd2p0WHBqU3BsSjF0bVpHSlJqWWZ5d2FnTFBja3g5U1JwSVlxL3JYVHpsaHdDT3J5WEV3ZWNzdGVWSVFjMlpmZzJHREFRZDY2bG8xSFRIdTJVVzhCc0ZHK2JSZWhBd2VCYjEvQytwaHBxQXNnYkdnS1lVTlRDSWlMUVdOb1hqaHRTQWgxQlMwYnFEanE2c0Evbk9qcHN4ajIwcE9vODQ3aTZmdTFaVzFsKzEwUFUxbDM3dWJBS3lDQUJqZjlzN1A0QUpWRkxjbVIxSG9EbHNyeXMvZWdod1JoT3RXU2JycWhvSUNBSWNQUWVhdHhWaHlpYUdkTFBybVNIVnRkODFXNGk0cXEzZ1RINlFnWlBocHIxaUgwL1lZMHpibWZNYWhabUJtQzBEcUtNVlcxbE5TMnVqb004Y2trM0xpUTVQbVhVWDMweEJuZmk2N1BJSFFGdXlndGRRVWhpbi9ZaWwveTRGL05xS1AyMVdNcjcxb0VYUlUzakJCeXNScGltK2NoTGdwTnE3ZWpXcTFPMjdCaGZZOTJCSnVxMFdKc2xFZVNKQ0VMNExEWlduUzJzcGdhRVB6OWNUaXQxSmRubzI0VWFtMnJESnFDQm9LUGo4L2x6Y1owQ1lzM1pWR3I4eUx0V1Zlb1hSdmFpKzBMSndEdzVOc2ZrRjVzbzg3bVlNYWlKU1FOSHNhSE13WXhmY3dvdm50bkZaZTllWkthcWxyK2V2azBncFVTd05NTHRyQVJESjRad3VvTFI2QTJwbkR4dDYraEh6WVZJMit6ZXVaY3RHSWR1cUNRbG9JZ1NPS0hXWmVqcGdxTDcwUW16eGdFd05CWFgrYjcrZGVTOTFZQ2FuczU5U1lqazlZdmFTTFE3WFhMUFd5NitUNitmRjlIM045ZkpQbktvZFR2K0lpTi8vY0pnWDNqTUdkbkVuTDdRL2g3dkpTZDVTZkovdXdyWWg1YlROQTVTbjhMbVhnRnFuL09JWDNtVDZqOUl0R0Z0TlJ6akpkZno5RmJIK0tiMWEvZ04vNTZ4ajk2N2ErNlh2VGNCWnlZTjUrVkk5OGs0cHFIR0huSE5HS3V1WlgxQ3haUXQzRWdsaHJRSjdSa1hiRWZXTTJhMld1d1pHY1MrOWovSThBYkdEQ1YxSnUyczM3Q09Qejd4V0krbFkzZnBROHk5cDVMM1U5eVR3YmZkeEZiMDBhZzhvdGhUUG9LZ24zZ3lFTnp5RDJweHpkVVM5WHhVbExlL3R1WjM0enZJRklmdXBqdDB5ZmpIeDlNZGJhTmtaOHMrdFZya25EVFFyYmZQWk5mL0EzRTNQMFNBNmNuZGZDbU1KTDYya05zdldrS0orTDdJbGVWWWdsS1pmcEhpOW9JMkdIRGhxVUN1WjdDVFpabHUrQ0trRXF5SUxqTlVRbVZsdzdKVkU5VnRnbGJZRGphV0M5MDRVWnFNMzhpcS93a0pZSU9ZZkRnd2U3K0JtWXNGb3RndFZxeDIrMkN3K0VRM0NGWGxkUHAyQVAwUHh1MlZVbFZQWHFEQVQvdDc2T3RuZSswUlozRGdTay9IMVZnQkRwRFc3K0lzNkdPaGxvTFBoR2hyY3dkaVliQ2ZHU3ZRQXpCWFpORWtxMEJVM0U1bXNBd2RMNjYzMlc5Wkp1Sit0STZ2S01qK0wzMGUyZERIUTJsTlhqM2pFYlZ6c3ZZV2xhTXBQTkQ3OXZTdkpjc0preWxGWGlGUmFEVmRXMFAyR3JLc05aWThUWkdvem9MbENaT1V3ME5GU2E4bzQzdGp2MjNjYW5ZTU9VWEkvcUhvUGR2UDVsWmx1V2pvcWk2QTZnSDZuQlJHcGtCaTRCZ0YwVEJLUWlDcEZhclpZMUdJM3Q1ZWFIVDZXUzlYbyszdDdlTDBzaGJqNDlXVDFqUEhpNk5yZGtFYmRiWWNDZkltVXoxYVdkSHFMa2NIdUdCU3JuUXJ6UUdNRVRIbmw3OTkvYkYxOXUzM2JuM052YnMzbXBwdmZIdDJmTjN2VnRCYThBMzJ2Qzdqa0hsN1l0dkI2a2FYcUh0VnlxSU9nTytQYnMzZHExL0tGci9zemgyZ3orK0J2L2ZkOHVLV2d5ZDdDTkJFUG9lUEpqUmQrREFRZnZibUtQSVRtUWtRUkFFU1hKcGJZMkJCTTg2VW9ja0kyblYyR3dXeE1iR0xNMjVhODMrTlVEdzh2SzZUQkVtQ2hRb09OZUlqNDhmMGNvVWJjMzRRWE9abFlTbjdQSXNrTGRhYllnZXZqWEI3VnNUUEJ4Mm9pQUkwNVVwVjZCQXdibUdYcTlQbzduNm9OMFdmYTRmcVpINVEyaWhzVFYxdHJJMWFteVNSK0RBcGFrQmd0bmNNQldJVXFaY2dRSUZ2d0dNUjQ4ZUdVakw4cXBHeG8vRzFETkJranlMNDVzMXQyYjJqeWJCMW9aenplWGUwR3FuS25QOTI2SzB0SlQ4L0FKbEloVDhLUkVURXpQTVUyTnptNk9xVnVab0M2NDJONFY0QzYxTmRBY01tbFM3eGdQZFpxZ2kyQlFvVVBDYlFhZlRqVytscmJWbmpyYVFXYTBEQ1hhN0hkSFRERzNVMUFDaG9jRTBvWDB6MU1uT2pNTXNXcm1CZTVkdjR2MTl1UjcwS3pKWmVYbDh1bTB2cjI0OFNLM0hVUTVyQTlzUEhlZXRqVHRabmxtaXJPQnZpRVAzWGNHSkhjWG53VWdrZnI1NlBBV24vamh6YXl2TnBicXc0Z3lQcm1QYlpaZFMycVhEYlZSbEhNSitGaGh4YWpjdFljTVRTOC9xUE1nTkZaUWV5VzN6K2MvWGpDVXZwM3ZtYUViR2dUNGVXbHNMamEzeHB5VlhtOVFtUWlxMk1rUHhNRU1udHI4MzYvaHFieUY5WW1QRXpSS1VBQUFnQUVsRVFWUzR0SDhVbTdkczRQRWZHa2R1NXIzMWV6aFNYTUpiUDJTMkVHeWxlVG04c3plYi9iK2M1SXRqaW1EN0xXRXRLOEJ1dHAwSEl4R0pucmNRdjhBL2tPdGcxU3ZzV2JMK2pBVzlwU0FQUjFlNlRWUE9qcXR2cE5wOEZsNHZwa29heXM0dS81NlUrd01iL3ZwaW04OHRlVG5ZN2QwN1Y2OWV2Wkk5TmJiVG1LTjRtcVBOV3B0THNLbWJvNkdOVEI0dU0xUVV4ZllGbXhqQTRoc25OZjBhMkZER1gvYm53dGhZd0p0bmJwNEpOVGw4YzNCblN6R2MwSjhQRXZxemVzTmFQcWhUaE0yNVFQWE9kSTR2WDQ4ZERRRWpwOUgveXZGTlNicTI0cVBzZSt4MXpGWmZFdjkyTnlGR1g4QkMzcklQS2RwN0ZMdGRUZkNrV2ZTWm5vb0FWUCtjVG1XbG5vWTlHNmlwRkltNzZYYU1TZTRpZFVjZDJlKy9RK0grazNqRkQ2SC93cHZ3OXU0NCs5TjA2QWRPck5vT29oYnYwYTBFYjg1K01wZDhncW5haWlGK0NIMFgzdEE1QSt4cHhsQ3pkdzFGQmY3MHZYUUVBSldiVjFJbEpSSi9VUkpsNno2aVFXMmtjbk02Rm1jd0NmUHZJRFRXMy8yd2wzTDhuWGVveUNyQmtEU08vcmRjaVZiZHFJMlVjZUs5OXlnN1VvQlh6MFFTYnI2VkFQOXFNbDkrbjRvOUdkVFZsYkYvY1RaQ1pES0RiM1I1Ynh3VldSeDk5ME9xVDlVU01QWXkrbDJWNWs0d3RwSDMwVnVjMm5tU2dMVEpkRVVCcS94K0JhZCszSS9aVk1PSkZ4WlRvQldKbkxPUThIaC8xL21XdlV2ZWpxT29qUWtrenAvZlZOamVzUUpZemJHWG42VTh1NHJJV1RmVGEweS9KczB3Ly9QM3lQdmhFS3FJUkJJWGRuNiszQTllb3ZMZ0FlVGlYUFl0WG95Z0NxVDMzeFkya1NhWVQreGs5NUpQc1h0Rk0rQ2V1L0Z6bDdCWThqTTQ5czdIMUZVN0NKMTZOWWxUaGlJQTN0N2VJNERQV3B1aWplWW9zaVE1SlVuQTZVUWxxbVZKSXdsT3UwMDIxZFJna3lRc1h0NklqVkxQblpTTExDTlVWbGIwcDR2TldvNlVscE5vREZHa3l1OE11V1FuRytZL1Qrak1hK2x6M1JVSTVwb1dSSUFubDM5RjZDV3pDZEJscy9YQjE1cE1vWnBDTzFHenI2UDN2R2tVdlhJN0I5Y2NBNkJtVnpvNy92WTRtcFJweEU3b3dZNnJyNldpUmdJY1pOdzloMTh5blNRc21JK1BlUThiLy9ydlRoOVFUWGdzWVdtaktmbjhWVnFTYlRTdzg2YnJjZmE1bUg3emI4US9RTUxhNlJ2KzlHUHc2enVJd2xmdjQ4VHVRbXhaVy9uaDRmOFFNQ2pScGZPcy80d2REN3hJNE9TNUdCTWRiTG4yVHN3T2x4V3k4NW9abEptTUpONTJJeHo5akIrZVc5NWtvZncwN3pJS0NuMUp1RzArNGIyOHFNMnRCTFV2d2VQUzhFOE1ReHZkbDdDME5NS0hKcnB2S1o4dE0rZlFFSkJDbjl1dW92N2JaOW45d1hZQVNqNTlsbDJmSGlMdXBoc1I5cTJrckxEenluNWQzRURDMGxKUmE3MElISk5HV05wNGZJSmNuSWlGU3g1ajE2Y1p4TjUwTXdHYWs2eWZkMStYbUhucjFuMUtRK1NGeE04Y3lhRTdyeUwzbUl0RU0rdTV2N0IvVlRheE44MG5OS3lVemRjOTFPbjUvSWVPSVdSWUV2aEdFSjZXUnRpNEM5MDBUeTZ0TkdkRk9zWloxNkF0M2NKUHp5OXpPYlJLOTdOdTVpMklneWJSWjk1bEZMNThCNGMzWlFHdVppK3JWMzhYMlo2ZkRWa1daQVJCRUFRUWFIS2pPZTFXbktqUkJJZWlEZENoYmwzd2pxczJkSHhYSHFaVDJZZDU4N0NUZCs3c3AwaVczOXQ3MVZDSnc2RkhiNHdtSkQ2Q2tPU1czOGRkZHlmUkkvb2pSMTFOeHVVZllBTzBoRExncnpkUnNYOC81bW9iL29QaUtOOTFFS2E0K2lZRVhId05mYWFNQWtZUnQrSTljamNkSTJoVUpjYzJPcG00Nnk1OE5CQjA5NzFrcFY1TFZjTzlCSGRBL2E4TjdZa3gxTWd2YlRRN0s1WnFLNEZoWVFRTVNDSjRZSExuUXJ4MFp3ZGpNREx5dGFkWmM4dHQ1QmhxNmZ2aVJ3U0hOcGN6UmM1YlNPeVlZVEJtTUxrZkRpQi9ieFV4NnZYa2x2ZG41cjFYb3dMODc3MkRyMmU4anVYUk9ZZ1pxOGtwVHVES3IyNTNNWnNrTjlkR2hxZW1ZajhVUVprMkhtTnFNeWRjMWZybDFCaW5NZjZHaTVHQlFYZmR5S3BGWHpIOHhsSGtybGhKNzc5K2pmR0NPSXo5NytmRWgxZDJlci9lUGZ2ZzNkTVhqVVpIU0dvcW9ZWm1vWkc5NGl2NlB2UTl4Z3NpSVBrSmNwWmVRTUdKbDRqcjNYRUpsK2FDUzBtK0tnMEI2RGZ6TTNMVGZ5QW1makJIbHV3aWVkT1BoSWFva2Z2ZlQrN1NFUlJsT1lpSlAzMTlWMERTTUh4VitRaUd2QmJ6MElqZUMvK09jV2dnZ2ZaWnJIck9WVjllOFBuN2FNYmZTdjlwbzVHQWdRdXVZTWZ5ZEpMU1hKeDFLU2twL1lFOFQzTlVFSVNtWkYwRVFVQVVaVUhFcFpocHZORDVhbkE2ck5nRkw1ZGdhK3p1M3ZpalVxbkdkamJaRlVVNUxQajhBSXR1bUVtaVFhbG0vNzJoaXB2RXlIc3lPSERuSEg0b3RHSzg1dStNZUdCdVUzMmxWNkNyNUYzUWFSRWNEaVRBV1pISitoazM0VDF5S2dFUi9qUVUxeVA1TkZOU2UwZUVOdjIvUGpTTTZzb1NIS1hsV0MyRjdMcjF4aVlhSHEra0pMQUMzbWN5OGtDR3Zmb00rMTk5bUMvK25rZkFpTXNZOGNxVCtIYXdweHlsUlIyT1FkZG5QREdKaXpoZU1KanhvMW8yR05HSE5kSi9hL0UyK3ROUVhrMkRzeGlwTW9OdE45ellQS29COFVpQXRiQVlUVXg4dCtpYTZvdnpjUnpkdzVZYm12c25CUGNlN2pwZmFSMUJZV0Z1VlN3Q1E4Q3ZLUWcxWXlrMW8ydTBtTVJBREdGZ3E2d0RPdVpJMUlWRk5ia3BkTVl3R3JJcW9hWUlzOW5Nb1h0djVXalRtK0FDVk5qYzh1WE0vS3JxUUpkVFZhVlJJVnV0cnBFWEZXRDY4UWliYjlqY3JQa05hUzV5Q2dnSVNBWTJlR2hycmg4QkFWa1dKS2RUa0oyU0lJb3FKRW1TSGVaYW9hYlVLaHQ4ZkJGMHRyWWEyNzMzM3FzU0JLRkQzdWk2aWdKdStXZ2JkODZkd2JnSWIwV3FuQmRRMC9PV0IrbDV5NFBZU2pOWU4yNDJSZGZPSmRyWWdlOW00d29jUTI1ZzdMOXVCK0Q0RTd2d0RGZzJGRGMzM0RHWGxlSjFZVGpxTUExZWhuaEdmZndwQnZYWkdYbmdtRmxNR0RNTDJWTEZqbm1UT2Y3ZEhGSm1uNTQxUWgwVzJlRVl5cjk1a2R6cUljVDMrb1dmWDkvQXFEdWEzY1htNGtJZ0JiRFJVRmhEWkVnQTN1b0lWSkdwVFBqc3RUYUY5alpqQlBiY25kZ2ttdWpBUFNFSUFuS3I3aWsrRWRGNHBZUXk4YjJIMndxVWNIL01wYVZBSEZpS01WVTd1aXdnQkZGcTFkdEJqeTVNajZXd0hIcEhnRlNGcVJTTVhhQmJzWlFXSUxzMUdVdGhLZDRSUWVBZmp0N2d6NUMzbGhFZWVBYktTamU2eU9nampmaGZOSk9KVDdmUHlLTFJhRVlNSGp4SWMrQkFScXRFWFVGMDZXdUNnQ3podE51Uk5HcnNaZ3NhbjJCMFlmN292SFdvVzVtaFBQbmtFNk9CMDFmTjJ1dTRjMGs2dXVnK1ZCWmtzN1FBVlBvQTVpVzdpbHkzSHpqRXlZcHlyRTR6WDI3UElDRThrcWtKb1VnTjFTdzdjSXJEcDZvcHRVa3MzUUdwQS9xUjZLZFJaTkpaZ0Mxck8wYzJGUkNaT2dCSC9rNnMyaGg4QWpveGNhSjYwTEFubllLZlIwUHhMbzU5dXcvOTlFdWFneEZyUCtib21rSDRPZzZSdmMvQStGZjZJUGhMOUJscjQ4ZjduMmZnRFJjalZ4VlNzQ2VQSWZmZDFpSDdSdFgrN1pocXJKaE5UaXAzYmtGOXlvdVExQkhvZEtVYy9OY0tnc2FOUkVzbDlhVjJnbVBDT3h5M0VKWjYyakU0czdhejdSOXJHZlhOTjRUNGxyRit5aHhPcFBhbjkxQ1hoQy82NUMxeVVpTVFzbGRUWXIrUVlSY0VvaFduMHRQM1JiWS9zNFErbDZiaUtEeEdTYmJFQlgrWmpYYlFWR0lqL3MzMi8zdUQvblBIWXN2ZGd4dzVpWjd1OC9uSDk2WHFnNjg0T1RRSWJXZ00wY1A3RVRocERqNHZYTTdQYi9ZbWJrd2k1cXhEVkp2Q0dEUnZJakZ6cm1UYnE0c0pDYm1kcXEvZW9MNnJjbzBRQW1JY25IaHpLZGJrU0FKU1J1TWJyQ051MWt4K2V2RkpBbndYVXIvcEEyb2lwaEhWdTNQOTByNDNuWDJmWFl3eG9vWWozeHhseUtmalFlMUx2NXNHc3Z1dWgwbis2eldvN2VVVWJkcFB3bVAzMEJtQnZ5bzZIbjNCTXh6NmZCWCtnVUdFangvVkZIeHBEMUd6YitUQUpYOGhvMzhJeGdGRzZvN3V4T3FUVE45TGhqVXBjTys5OTM2dmxKU1VRelEzVTFZSklDSUlJckxzUkVaQUZHUlpscEZGQWJ1NUZsdURCcm02RkpWYXJSYmNpYmtDSUQ3MTFKTlhpNko0ZWgrYlpLZktwaUxjb01GaWQyQ3hPN0NLV29aSEJ3RndMUGNVZVZZMVEyTkR3ZUZBcmZjbEtjd1gyVnJQRDlsbCtQZ0gwaS9JRzR2ZFFWUjRCQkg2MzVhTXhtUXk0WFJLM1c1S1hGcGFSbkJ3TUNxVjZwd2VjNmJqUTNCU3RXczdSWnMyVTFzcU1IRFIwNFFhbTdlamI3OFVESUh1NkpZbWdMQmgvZEgxSEV4Z1VBMDVYNjdCakpHazIyWmo2SkZBWUZ3NE5idlNjY1JjaEw1c0Q2WEhUUXg4K3ArRTkvQUZSTUtuekVCVmVwQzg5QTNVRnRZU1BISXNRWEdSSFhMbWw2MWJTZFh4Zkh5VFVoRnJDekVYbE9CelFTbzZMekJuSGFCbzB5YktEdWNRZmN1akpJNU42RlI3T2QwWXlyZHZKblQyWHpEMmpVRFFCaEE1b2k4Vmh3c0pHUmhQeGZwUDBJMmRpK1BnSnFyS2ZFaDU3Z244QTNRZ2VCRjEyVXhzUjdlVHYrNEhURlYyd3NhT3d6OHFCQVF2b2krYmdUMTdKL2xyZjhEcUNNQTRZUVE2YjlkVHE0MGRURWlVUVBYaDQxak1Xc0lIOXdhTkh6MW5US0x1NTgwVWJOeUsxYW9sWXV4NGZNTjhNUXdZZ2ErWVQrNDNtOUdObVUxTVNpK0NoZzdGcTFOWkpCSStNUTFiMWlIcTgvTFJ4U1ZqQ05MaGU4RTRmT1FDVHExYWo4MFF6L0JuSDhiZzNia3FiUmllaGxmQnorVC9uRVhDL2M4U2srd1MxRUdqTDhGSEtDSXYvVHVxc29yeHUyQTBZZjFpT2ljaTlnb25hbXcvYWpJT1lTNnN4bjk0Q28zTVpBSEpJOUM3RFR2Qk41eXdRUW1JaGtoaUx4bEJ4WlkxRkc3N0NZY1lUT1RZMFhnSE5GdUFlcjArNjdubm5qdUJxOStvSFhBSTRBQ2NnQ1FJb2l5cVJGa1FCTlJlT2xTU0U2bkJndG9RaUtEVDZVUlA3aldIdy82TklBaVQvcWlhemZuT3gzYW00enZieUgzOWRySk5reGovd09WL21MVS9jditsbUZLZVpPamNGRVhGL3grQXcrSFlvdEZvbjZXWm82MWVFQVFUWUJVRXdTWUl6Unh0V3EyTG84M0x5OFhSSnJvVGNwRmxXWmc5ZTVaS0VJUVJ5cFFxOEFxTHd5Y2k2QTkxVDdxWVJMeERGSi93LzR6WFdLMGVHaE1UMHh3NGFObE1XV3gwbjdtU2RSdC9YS2xyYXM4MGozZmZmWGNZb1BURFUwREU3UHVKK0lQZFU5eWRMeW9MKzc4Rm4yWExQdTQ1YXRUb1l6VDNRQkRkYVIrTnBWV0NMTXV5TERmbjQwcVMxS3l4QWVoMHVxSEtYQ3BRb09COFFlL2V2WHU1aFpwbjJrZWpZS09seHVicTFTSkpVc3ZDVXBWS3BUZ2Z6aUxDd2tLN0ZUZ0FNQmdNK1BuNUtwT25RQUhnNysvZnA1VVpLbnI4Q0swME55VEpSV21rOXFBcEVnUkJ1RUNaeXJNcDJNSzZmWXpCWUZBbVRvRUNOelFhVFJKdGZXeU54ZkJOVEIrZVJmR2VHaHNuVGh3UEF4Szdlc0hxMmxweUsrcHhuQzRuejltMnFhelZiQ2EzckJxelExWldUSUVDQloxQ0VJU0VGMTU0M3FlbFlKTmJtNk5DY3o2dVIvQUFFSXhHWTVlSzNwSHF1ZXVWRmV5MWF3bjNjbEpvMS9QdjY2Y3hJa3dQV0hudW8yLzVPcXVjVWltQUxVOWRSYlQ3c1BkWHJ1U056RHA2QkhpUlYyVmh3UldYY091QU1HWGxGQ2hRMENFbVRacGtCQ3BvSXB4RUZBUUVEODBOYVBhMXliS0V1dEZHMVdpMFhSTnNvb1lGczJhUzFNT1Yxcjd5dTFVczJuQ1ExZk9HQXlvbWo3eVFXeWVhbWZqbW5oYUhqVWdkeFRVenc5R0trSDkwRDVOWGJPUHlBVmQwVXRHbVFJR0NQenVpb3FKNkFwbHVRZGFpY3hWdG9xTXU0U2E2SloyZ1Vva0R1bllacnlhaEJ0QXp5QjlMRTgrTW1pRzlvZ2pXdDgxODdoc1YzbFJyRnhia2graXdZNVdVUlZPZ1FFSEg4UEh4aWZNUWFxMWI4alhsc3JrN1dDRkprdENVNUNZSXdvQnVYOUZ1NHIyZFdjeEo3ZHVOZzJRKzJYcVFZY09UTUNxa0lBb1VLT2dFR28wbW9aVlFhK0ZqYTUyb0s4dHlVd21ZQUhTUFZFMnk4L29YcTNFa3BMS2dmOWNOeWgwL2IrWGpjajllbURSQVdURUZDaFIwQ2xFVSszaG9hVzZoSm51YW85QWlnT0FTYkVKcGFVa2k0TlgxU3puNWROVnF0b3B4dkRLMVAxMVZ2QTVtN09LeG4ycDU1N28wZ2hWU0R3VUtGSFFOWGl0WGZoSGlJZHhFV2FZRmg2Um5BRUdXWGVrZStQajRKSFQ5R2pMcDY5ZnpXVjBJNzF5WmdyNkxVdTNFOFFQOGZWTUJiOXcwaFJodnhRWlZvRUJCMTlHM2I5OVFUcCtrNnlIVVhPYW9HaERVYW5WOGw2OWdMbUh4cGl4cWRWNmtQZXVpK2RXRzltTDd3Z2tBUFBuMkI2UVgyNml6T1ppeGFBbEpnNGZ4NFl4Qi9HZjFEZ29yUmE1NStVUDNpZlM4ZDk4OEJ1cVZSVk9nUUVISENBa0pEVzlyanJiVTJqek1VVmtRQkVIdmNOaGZGa1Z4L3A5aGduNUwyaUlGQ2hTY0haak41bVhlM29hbHVPaUw2b0E2TjRXUkJiQUxndUFRUlZGU3E5V3lScU9SUlFCQkVHS1ZxVk9nUU1INUNvMUdFK25XeXNUVG1LS2VhUit1THdSQmlGR21Ub0VDQmVjclZDcFY5R21FbXVBaDNBQVprSnUrVkFTYkFnVUt6bHNJZ3RDamxjWW15SEtMbEE5MzlRSElNb2duVGh3UEIzVEsxQ2xRb09BOGh1N2YvMzdKcDNPTnpXV09pc0hCd1pIS25DbFFvT0I4eDhDQkEvMDhCRm1iZEk5R29TYkxNcUtYbDFmNG1WemtUR2lMek9ZR2NzdXFNZG4vUExSRnN1UkFrcFNpV0FVS2ZpMGlJaUw4VHFPdHRmNUJyVktwdWlmWXpwQzI2S092VnZMbVVSUGh2bG9LSzAzY09HTXFDd2Y5d1pYRndrMHNUNzRlVlk4SVpKc0ZyN2dVaHIvNEVoRzlPeTlCTSszK21nUGJIWXk4KzBwbFJ5dFFBUGo3KzdmVzJFNW5pZ3FpS0lxaDNUcTdtN1pvK3dQeldIbjNkVHpRMzR0Rkd3NjZ2M1RSRnExYWNCR3R5YTJ2bkRxZDdROWR4OG83cmlMOTJxRzgrczFQVlB3WlZzTXJrVWw3ZGpQNzRINzZEbkd3L2YvK1g0dXZIVFZsMU9ZWEk3WFE4aVRzeGRtVUh2d0Z5ZEU5alU4R2NGaW95OG5CYnBQYzUzTjlaNnNxbzc2MHBzMHg5cG95YWsvbDQ3QXBtcVdDOHhmZTN0NStweEZxVGRUZ2phVlZhbEVVdTBtSjVrVlNqK2F5MHA1Qi9saEtXdElXVVpQVDVpaTlSMGRZQ1ZDcnhBNGI3UDd4b0Nac2VBcVd6VWR4QWlvc0hIdjZMZzV2eU1NL1ZFTnRiUkFUUGx0Q1FHQWRPK2ZmUnNXSkhCcktKTmJOM1FVQlNVeDQ5MG04S0NTOTcrVU0zN09UVUFOVWZybVliZXNOWFBiR1gxMEs0cEw3T2JCVFFzemVoVlBqamRVL21abWYvSk85TjZWU0lReEJObFhUY0RTRGlMKy94WWlieHdLUS9jSkM5bjJUUzJCc0VMVy9sSFBocXJXRU4rMElDL3YvdmdEMVJYZVJORjNwODZQZzk0VldxKzNVeCtiVzJGQUxnbkRtelNNYmFZc21YZGFsUC85cHp5NWUzWlhOeVFvci81aDNLVUYvaHRXUTZpamV0SWxxU3cwblgvdUN1R3VlUWdWVWIzaVBqQjBhTHR1NEJpODE1THc4bjMxdnJXTEN3NWR6NGJzcnFQbnVWVFovWldYSzIvZDM2M0pWTzQ5eXlhWjFCQVRyY0Zvc1RhdXU2VGVWQ1EvT3dMSjdHVi9ldTR6aE40OUZSU2xIbC96SWhWc3lNSVlERGh2T0ZtVzhFaldIOXVFMXNGcDVxaFQ4L3FxQld1MUh4NzQxb1ZtTmdNQXplMkM3VDFzMHNHOC9uakxHc0czdkhsN2R1SitMYmgzUEg3NTFpVlJMOGFwdkVZcVBVYU1meXVRYkpnSlF0bjA3R2tReUYvOERDYkRuVmxCbFBRVDh1czdyQVJObkVoRHN5dDVSNlpxemVNS0dEQVpBRngyTldGMk5IVkFSUk1TSUlIYmZkZ005SjQwbEl1MWlJZ1pFZXlyL2pGdWZvVHhSQ3M0THFGU3Fka3hSR1JDRTFnNFpFZkRyL2lYT2pMYklZUENoZDJRWU4wMGRqVi8rTVg2cytCTkVSOVZSSlAvN0pjWitzb3Bla2NmWTlWcDYwK1Fia2xLSm1qcVZIbE9uMG12aEk0eDkvSmF1U01ybTVXc25KSzMxYVo5VlFGQzdWMGxzYVI0UGVYY2RvLzd2RnJUMkFyWmZPWmtUZTh1VUowakJlUWxSRkgxbzQxdHJXVkxsL2d4UkVJUnVDcll6b1MyU0tLb3hOZjFXV1ZwTW5rTkxvTzdQNUdVVDZYZi9BNVFzZVo3S0dvblFVU09welR5QmYzSUtZVU5UQ0JzNkdFTlFzLzZxOWpWZ0w2K2twZWp5eGN1bmxvYkNCcGZXdDIvUHJ4eVREWnRKSW5qNFdQcmY4emdKWThPb3pTcHA4ZjNoSis3bTJBWkZhMVB3KzBNUUJKOU9UTkFtWGpZMWROTWFQQ1Bhb3I2OHN2UXp0cHQxaE9wRmNpdE16SmwrRVVQL1pDMDBOYkZwOUIzL0xBZi9rODY0QjI0bGFjZmRwSStiVEVDdmNPcHpmeUhxanBkSXVXcUVTN3RObVVva04vTE51SWxvSWxLNDZMUG4wT0ZMNytzbnNYUFd4UnhMQ0VkckVNSG4xNHlvbEMwWFg0N1RtSWlXU21ycjQwbWIzTi9qZXp2RjMzNk9ObXdLZlNZT1VwNHNCYiszWURQUXN1aTlUYW9IelJKT0tnQ012OFhBVEEwbUtpd09nbjE5TVdoK0g3TEo4NDIyeUdtcW9hR3FEbjJZRWJXMmEzTmlMU3RFMGdXZzkvVStDeU9RTUJjWDQwQ0RUMFRvbnl4U3JlQi9ERVdDSUM0RVRMaW9pMnFCZWtFUXpJQlZFQVM3SUFoT2xVb2xxWUhmak9yUjRHM0E0SzJzamlkVUJuOThEZjdkT3NZcjlHeStoMFQwRVVabElSVDhMMERYZ1JucUFWZndRR0ZPVktCQXdmOENXc3VxZGcwTVdVWVJiQW9VS1BpZkVteHRBZ2J0Q2JoRy9uQUZDaFFvT04raDZrQmpheUhnR3NzU0ZKd0RIRHAwR0p2TnBreUVBZ1ZuQjJKSFdscDdmNmhBZ1FJRi93c1FPdmtkUUJDQmJsSTZPTm1aY1poRkt6ZHc3L0pOdkw4dmwyYWRSQ1lyTDQ5UHQrM2wxWTBIcVczdmNJZUo5emYreEpiOEdtV0pPb0t0bU14L1BVZmUvdHpmNWZLL3ZIUXY2WmRNWXZub0cyZzRoOWN4WjZTVFB2MVNWZzRmd3RIdjgzL1hLYS9QT29TcFJ0R3d6Mk4wV1ZhSmdMTjdwNjdqcTcyRjlJbU40ZEwrVVd6ZXNvSEhmOGhwM0thOHQzNFBSNHBMZU91SHpIWUYyK290MjNqanh3eTJGTlFxeTlUUlE3YmphdzU5c0pUOS8vbnlkN2wrd2owdk11MlQ1eEdyS2ptWGhXLzZRZE9ZOXUwcWVpVjU0N0QrdnJSSko1NVpRUGJPWW1Yem5iOXdua1piYTZPMXFRRWJvT202bFJ2QTRoc25OZjBhMkZER1gvYm53dGhZd0p0bmJwNEpOVGw4YzNCbm0wTnJpN05aV3VqRDdEanZjNm9GL0JHUXQzb052ZTU5aVB5WFA2Ylc5amY4dWhDN3J0Nlp6dkhsNjdHaklXRGtOUHBmT2I1cHhVMUh0bk5zMlRlWWF5WDhMN3lZZmxkUFJJV0Z2R1VmVXJUM0tIYTdtdUJKcytnelBiWFRKTjJLN2F2SVhmMGpEVlVtZkFlTm9lOU5zMmxrcGFyYnU0N1NtaUM4U240aWQrdFJmTVpjd2VDNWFXZjhnaTc1YmluWmEzZUJYeFR4dHl3a05OYkYyU0EzbEhMczdYY29QMUdFbHpHR1hqY3NKRGpheFFKb09yeVZJeCt1eEdvVjhSazBsdjYzek9od2cxdXpkbkZrK1FaS2pwWWpybmdUeHg0Ly9FWmVTcTl4U1Uzbk83YjBLOHhXTFZGemJ5UTJ0UThBaFYrOGcyd2NST2wzS3pGYmZVbjgyOTJFR0YxanNPYnNKM1BKSjVpcXJSamloOUIzNFEzb2RSM2ZFNWc0OGZwU2dxZGNTTTZTcFZnY3Z2VDUyLzBFR3czS0ErRzJZN3Fqc2YwcTNmdElhVG1KeHBBdTdGRWJ6MzM3TXd1bkRzTkxTVy92Wks2cXlGK1hUZVRVT1VRbWxwRGZCUzFDTHRuSmh2blBFenJ6V3ZwY2R3V0N1YVpKMDdJY1djT2FlUStnRzNveGZXNmFnMURXNkQ2b282YlFUdFRzNitnOWJ4cEZyOXpPd1RYSE9yMVdYVll1Z1duVDZiZmdlcVRNei9qaG1ZK2F2OXUzbnIzMy9ZMVQyVjdFekpxSjJsRjN4aHBmOVliWCtPSFpkS0xtM2t4a25KTXRWOTVFcmZ1TmVQeloyOGt2REtUdjdRdUpITklEUzZXN0Z0bVd6L2Z6N3NJN2JRNTliNW1MSGhPT1RxNmpEb29pTEMwTjd4QURQb011SkN3dERmKzQ4T2E1dS81UmZOSm1rbkRGT0k3ZWV6M1pCNnNBS1BybVhYWSs5eUdobDh3bVFKZk4xZ2RmYzUreGdaMDNYWSt6ejhYMG0zOGovZ0VTVm52bjl3UW1zbDU3a1IvLzd6WDhSMTVNOUtnRUxPVjF5dk53ZXNFbXQvcTNoY1ptNWd5cGkwNWxIK2JOdzA3ZXViTmZwMy83ODg0ZFZQZElabXlvbG4zS0FuVUlhOFpHS254U0NUZHFrZExHY0dUdE92cVB1YjVqV2RoUWljT2hSMitNSmlRK2dwRGs1dTl5bHI1TjZIV1AwbitHUzNNS1NSN20vaWFVQVgrOWlZcjkrekZYMi9BZkZFZjVyb013cFUrSDE0cTkvblpxait5bnBxQWMvNlQrSEZ1eEc3aTIrVzJaa01hSWgyOURBS0oveFR6a0xsOUIzTzB2MFdQRUJUQmlFSVVyQjVIM1V6NEQwcUt4VmxhaWlRckJMNzR2SVFPU1BMWitOVmFUQ2wxWUJJR0Q0Z2dlTkt6VDY2Z0NqUmhUalpTRTZORWtEc0dZMnJONTd0Ny9EMkUzUEVTdnNjT1FnYjZ6aDVHZHZvbTRnUzdLOXJqcjdpUjZSSC9rcUt2SnVQd0RiSUFXSzVacUs0RmhZUVFNU0NKNFlIS1g3c24xaUpycGMrOXp4QThOVmg2RXRyQjBSMk03STZ1d29paUhCWjhmWU5FTlUwazBkQkpjdFZYd2o0M1pEQTNYc1A3d1NVN1cyTWtyTE9aUWhVbFpxblpRdUc0dEdyMkZvNisvUVVWZVBXVnIxMkx0N09HTW04VEllOFp6NE00NUxCK2N5clovZmRya2tEQVhGT0FiRjlmV1lWR1J5ZHEwTkRKWHJLZnEwR0VhaXV1UkhKM3RIUk83cjcrWUg1LzlMNVg3RDFPWFhZUmtzN1Y0WmZvbUpwNlZtbE5MWlNYZUlXRk43MkI5V0NDVzBuSUEranp3QWw1NVgvUHRpS0Y4ZmNtMUZKNXdFODM3SkRIeXBkczQrZVFDdmhpUXpLWUhYc2JxT1BNeG1Fb0tLZnZ5VGJiY2NDUGYzM0Fqdi94WWprOXdzMm5vRmVoaUlSQjBXZ1NIdyszZERtVFlxODlRL3M3RGZERXdtWFczUGs2ZFNlcjBubHdMR1lKdnZDTFUyclZLWk5uY2puYldua0VncTNFVmxIWUxkUlVGM1BMUk51NmNPNE54RVYwby9wUlZqQjBZUzI3dUtYS0I3SG83OXRKU1RsVEVraFNzK0E5YXY1VHkxMjhsZk1LOXFBeGFWSDFIRXBEK1R3b09tdWcxc0tPNVV0UHpsZ2ZwZWN1RDJFb3pXRGR1TmtYWHppWGFDUG9lVVpSa1p3TXROZXZLalN0d0RMbUJzZis2M1dYZVBiR0xVeTJrcFJyUjRXaXhjK1Q4SFp3NEhNR1ZlMTVHQzlSdWVJM0RPekpkZEgrTmI4c3pTQ0lTMUNxa1Judk5EVjFRRUEzbHBVQlB3SUc1dEFxL01KZmJ3eXYyQWk1ODYyUEFRZGJpQmV4L2F3WEdGeGNBRUg3WlFzSXZXNGl6SnA4dDB5YVFzL2NHK2d6dm9sSFNxcitFSWR4STVPaDdHSEhibUc3ZFQrQ1lXVXdZTXd2WlVzV09lWk01L3QwY1VtWW5kWGhQZERKL3RvcGliQTR2Zk1JRC82eUN6ZVFoekRyMGNLaGxXYTRWaEc2OFgrMTEzTGtrSFYxMEh5b0xzbGxhQUNwOUFQT1NYZXI3OWdPSE9GbFJqdFZwNXN2dEdTU0VSekkxSVpUN1pveHZPc1VySCtkVGxUQ0l5eE5ERlRuV1dvdksvNUhDM0o1TXZlKzJwb0NCZlBBcjhqZCtUNitCbDV4ZUtjN2F6cEZOQlVTbURzQ1J2eE9yTmdhZkFMZnBlTTE4RHM5N2lzeDRIV0Z4dnBSK24wSGNYYmZnSGRXRGhqM3BGUHc4R29wM2NlemJmZWluZTF6RHB4ZWhzVVZrdlBBaEVYMGlNVTZkakM0d0NtL3pRYkxXN1NEWVlPTHdxeDhEUTM3MWZZZW1qbURYZjEvQklFM0NmOUNGaE1TRjBuUE9MRFk4K1MvQzR4NUN5bHBOZmxFaUYxL29NdG15UDNnVm9lY3dmRU0xVkp6SXd5ZjVLcmNwY1lnRHkvWVFQaVlGb1NhTEJwTXZ2bDEwdnZ2MVR1RFk4bmZ4RmNmaUhUZUkwTjRSeE42d2dNTTNQTWJSeUNjSjZlbEg5ZDRmRUh2UG9OZW91QTdPVk1yQmY2MGdhTnhJdEZSU1gyb25PTWJscyt2b25qckRMMDllVDJicFNHWjk5dVNmVmJEVmQ2Q3R0UkIycWllZWVPSktRUkFTdSs3WXRsTmxVeEZ1MEdDeE83RFlIVmhGTGNPalhSME1qdVdlSXMrcVptaHNLRGdjcVBXK0pJWDV0amxOZEhnNHNYNi9mYmNPc2l3QUFDQUFTVVJCVkFONms4bUUweW5oNTljOWZzM1MwaktDZzROUnFWVG45QmhyUVNIcXZzUG9rUnpmOUpsM2xCR0hYVU5vLzlnT1ZCNG5WYnUyVTdScE03V2xBZ01YUFUybzBXVW1xVU1UaUJrM2dKSzE2UlQvZkFoOTcxVENCOGJpMVhNd2dVRTE1SHk1QmpOR2ttNmJqYUZIQW9GeGpSMFpOUmd2dmdqenNRd3NKU1lDaHFhZzlRN0ZtQnBMd2NvdnFjcXRwOTlkdCtNZEhrVjRjclA1NlJVWjczR09yc0UzZVF3K1lpVzFXYm1vSXhQeGp3eEEzMnNZb1VZYnA3NUt4MVFmeEpCL0xpSW8xRVZHNDZqTXBXalRaa3ArM0ljaGRTN0p0MTZDU2dSRWdkcU1IUlJ0MlVUbEwxVWtQdmcwMGYzQ3VxWmxEUnVQMmx4TTNTODU0QmRGWUd3WTZyQUVZc2IwcG5oTk9zVS9IVUR3amNVNGJqZzZneXZPNnRzdkJVT2dleDlyQWdnYjVtS1VObWNkb0dqVEpzb081eEI5eTZNa2prMEE2UENlWE5BU05Hd29Xblg3WXpUMEhrem9nTmcvNTB2ZjZUejY5TlAvK0JsWEVNSGErSzhnQ0hiQUtRaUNKQWlDTEFpQ0xEaWRqbzlFVWJ6bXp6STV2eVVmMjduaWNGT2c0RS9wcExGWVZ1cjEzditsTFI5YkF5MzQyRVJKbEdXNVVwa3lCUW9Vbk85d09CeTFIaWFuZkhwZm00QW95M0tGTW1VS0ZDZzQzMkcxV2h2TGxWb0x0RFlDVG5RNm5lWEtsQ2xRb09COFIwTkRReDB0azNKUEd4MFY3WFo3aVRKbDV3WmhZYUhkQ2h3b1VLRGc5S2l1cmo2ZEtkb2s3Qm96UEVTTHhWS3FUTm01RW14aGltQlRvT0Fzb2Fpb3FLNjFRQk9FTm1WVnNpQ0FXRlJVWEhSRzByTzJsdHlLZWh5bkkyUnd0dElRSlJtSFUycjZrYVEvejRMSTdueDB1UjNXbGRNVnV6VjlMaWtiV29FQ2dJeU1nL1h1UjBOcUZtNUNPNCtQZ0hydzRNR2xrdVMwNE9vQTB6bWtldTU2WlFWNzdWckN2WndVMnZYOCsvcHBqQWpUQTFhZSsraGJ2czRxcDFRS1lNdFRWelhWQ242MWJqV1A3Q2pBejUyZ00vckNVYnh3VWVJZmZ6VnE5dkRGcEg4ejQrY25TQjl3RDVNT3IycHE1SnEvNUI1TzFreWduL0VBQjQ0a01QR3B1VTJIYlp1UVJPeUhoeWk4SjVuUXAzZlRxNTlhMmRrSy9zeXczSC8vL1EwZG1LSXQvRzJOVDhzcG9HdFNSdFN3WU5aTWtucTQwdHBYZnJlS1JSc09zbnJlY0VERjVKRVhjdXRFTXhQZmJOdWxmT3FFQ2J3NFBrRlpJZ1VLRkhUUDZwSGx2RllDVFBMUTNGcnFhNEtBNkRwRzdnWk5xMWVUVUFQb0dlU1BwYW5HVDgyUVhsRUU2OXZYTHFxcnE5aHlKSWZzR3N1ZmFFa0VWRjVlZ0loS3IyOVJIQzZxdkJDMUlvSktoZGdxMVZ6VTYwRUUwVXZ2NGpsV29PQlBES2ZUV2RCS3FMWHl0UW15SUFnMEJnL1VnQ3hKVXM0Wk9ibnRKdDdibWNXY1NaZDErcWNhTHgzMmtuSlc3UzloNi9KMVRKOHloY2M5NkdIK3NQQy9nTXUzTGdIZzB0M0xXM3hsdkhFeHJsYkYwMmhOeFRqcXUxMEE5UGg0aDdLckZmenBZYlBaaXRyUjJOcE4rUkFFUVZZRHN0UHB6TzYyWUpQc3ZQN0ZhaHdKcVN6bzN6bk55clFKYVV4ei8zOVo3bUVtdkxlZDZ5L29TYXhHV1RRRkNoUjBqUHI2K3FKMlRORFQrdGxFdHpRODJVM0ZrRTlYcldhckdNY3JVL3QzdTlWVmFIUWtVWTU2VGluODRBb1VLT2dDU2t0THkraUNqNjNSSEJVQnVhcXFLcXZybDVCSlg3K2V6K3BDZU9mS0ZQUmkxNDZwckRjMy9aWjE3Q1FGK21ENitDZ0xwa0NCZ3M2Um1abFo0U0hNcEU1TVVRUkJFTHdCclNRNWl3R3ZUcTlnTG1iMG9pK28xWG5oSmJvY2RkclFYbXhmT0FHQUo5LytnUFJpRzFWbUIvNTZMNUlHRCtQREdRTzQ3NVgzMk9Qd3dWOGprVmNyY2Uvc3FjenJFL0tiVDlCdnllNmhRSUdDc3dLcklJalg0bXBqVUkrTDJhTk9FSVI2OTJjMlFSQWNvaWc2VlNwUjFtZzBzaUFJZ3Q0dDJMWUF5ZWR1YkJKbDFmV1luUUxoQWI1NC9VNEorWXBnVTZEZ2Z3dVNKR1dvVk9wRnVOb1llQW8yazRkZ2M3b0VtMHJXYURSeVk0NkJMRWxTcGlpSzUxQ3dpWVFHK0NtcnBFQ0JnbTdCWnJObDBkYTMxdHJISm51WW9ZaUNJTWlBN0hBNE1wVXBWS0JBd2ZtR3VycTYzSFlFV3BPUHJYVU9XMVB3QUpETlp2TmhaUW9WS0ZCd3Z1SFVxVk1GclFTYWs5T2tmRFFLdWNhWXBuejgrQWxGc0NsUW9PQzh3OXExNjByY2dzdnBJZFRhcEhzMG1hR2k0S284QU9UVTFOUnlTWEtlQUhyL3BxTis1OUsybjExd05hVE1VMVpVZ1lJL09XUlovdVhSUng4MXR6WkQzWFJGbnBxYWgzQVRtNHJnWlVDU0pHbXZLSXE5LzhnVDVWV1RpNm93RTZxNzE1VFc3OVFwUk1jSlVDc3NHd29VL0ZhdzJleUgyelZEWlNRRVdRSkJScFpCbG1SQmxoR2NJRGprcHVBQmdHeTMyL2QxZmlrbk96TU9zMmpsQnU1ZHZvbjM5K1ZpYTVhdlpPWGw4ZW0ydmJ5NjhTQzFyVzNsL0J5ZStYSWo5NjNZekVlWmhYKzZSU3JmdDVteFQzN1I0ck9UMjc1bCtyOVd0L3YzUDY1WndlalpkNUU4NjFIMjFuaDg0YWhsMFpQL1lOQVZkM1BKNHE5LzI1dHdGSFB0VFE4eTlJcUZYUHZHRDEwKzdJVW5IK0cvZTZ1NmRhbGwvM21OMGRmK25lZ1p6M0EyMlZDL1c3bjYvN04zN25GUjFmbi9mNTR6RjRaaEdFWVlZRVJFUkZKRFJFTXlKRFV6YzgzTXpGeHp5OHkxc2pJejEzVmJhMTF6L2ZVMXQyMjdtR3RtZGpNejE4ek1UTTFZTkRQWHlzeklDNWtSSVJJaUlnekRNTXpsZkg1L3pJVVp3R3ZxVnM3NzhUZ1BaYzdsOHpubjh6bXY4NzYrUHB6UjdITTNzS3VvbEJNdEtML21qWmZKR1RXWm5tUC9TY1Y1ZS9BdTl1MHJ4dGFNbjIvNWkwOHo1LzF2eitoS0JhdGZwKys0NmFSZCt3ZDIyODVoRnhVYlU2YlA0NEQ5M0pFSUhyZmFEclppaGdiNzJQQ1RUVXBJeUZKVDhBQi9aTlJxdGU0NmRlZnJXTE9ybkM2cEhiZ2hveDJidCtRemEydUpiMmNETDMvNEJmc3JqckJvNjc0UVlEdFdkb0RmdmJxTnVMYkpETDAwR2RubHZ1aUF6ZTJvcC9Sb2JjaHZzUjB5dU92cUxxMGNYY2ZzZjc3SHpQbFBzbnZWLzVFZDA3U24vTE9QZUxrOGdaMnJuMlg5d3pkZTJKdFFXMWoyeXQrWk55cUxHcnZyOUVIOWFDVld1K2VNbXJyMW5zbHNXemdKZGEyVmMvR3E1Rzk0ajRJRHh6aXc1eHVxN2NlWi8vSmFxazVuR3RwTEdYNy9pN1M2T0lpOW1Ca3ZGckpzNmJQc1h2WkhMT2Z0d2RjeWNkSmNpcG9SNDFpcnE2bXVkNTNSbFFhT3ZKMXRTLzlDa3F2dXhFU3haeUdGbTlheXIwMFduZlhuam82bXFQalFEODIwdFdBZm01RDg0T1lET0YrcWgxQUgyNm1qUjkreWEvUG1BaHR3NG1JbjJjVGo0NjhOL05uR2ZwVDdkdjhBL1ZNQlBmODNZUVRVbHJEMjYwOURUbHV4YlJmWERSckl2YmxKRnhXWU9ZNGY1c21YMTFKY3IyVm91aTdrQzd6c3RiY29zaXBZTHMwT09XZm50dit3NXN0dktheDJzM3JsVzJ4VFJUTHh6cHRKaWJTeitNVjMyTFgzYXh4Vkd1WTh0NHpZanBsTUc5YnpaM0d2YmxzVmkxZm1zL3Y3Q2hTZGtkRTMzY0RnalBnbWNDdjlob2ZtdklsTm44Q1UzNCtnYTV5MzBNVisvREFMM3RqSW5uSWJtYmw5bVRxOEY2ZEtnMVlhanJObzJYdnMrUDRZc1ltSmpCczlndXkyK3BPLzBBT3VZdG5LdGJ6OFNTRmJsRFU4TlA0bXpLZndMR3o1WUIzNVh4ZGpyVC9NRTg4dFE0L01yV1BIa05GR0p2Lzl0V3paOHkxbGpnYVd2UFFtZWwwYzArNitEdE1KcjliSTB0YzNVZU9xNXFBOWdhR2RuS3o4L0JqVDc3K2RqRGdOdXovL2hCVUZleWl2YlNEdDBoNU1IWE0xSmczcy91OW1WdTA4U0ltOW5rV0xsbUhSU0F5OTRVYnlVZzArQmI2S0p4Y3NaczlSR0QvMnR3eTRwTTFQR0VRN3k5OVl3Nlp2am1EcGVBbFRieHVLeFFkVVpVVzdlV0xGUnlodGtobWVGWThqdGhQRGU3UUxXSEtML2wzQXJWT2ZEckh1Vml4L0IyTnFlOVovOENtNnhJNU0vLzMxV0h4MW1EVWwrMW0yMzBtTzlrZVdGQlNSME9reVprNjRDajB1MXE5ZXg2b3ZmckM5c1dIcmtXWmFtZ2RRaE5jYzlWT0RDMGxDS0lxQ3JjR0RyZEdGN0hPNkNVRDU2S09QRkNIRWpqTjVEdnNycStpY2RLclNLQmQ3UzJ1SkVjZTVjL0ZiM1ByeUJqNzRvZVppOEJBd2ZkcHNEdXE3TUdsWU5zdmV5US9hcHlJN3B5ZGR0VWRabEIrYVFwamNJWjBodWQwd1NSSGs1V1l6Sks4N1JnMkFodDY5THlPdmN5SUdjeUpEcnN5bS82VnRUOW9ENjZFRHpGbjRKck9iYlp1S3p2M2laTTdxQ3FxMUNZeS9aVGhqKzdWbjZvTi9ZWHRWazVhMjVKMHREQm8yaE55b0h4bnloeGV4QXpRY1pkU0VSNm1NNmN5VVc2K2haTlByVFAvMzE2ZHNhOG44cDFoL0pKcHBkOXpJME80SlZCMXZPT1U1eFFmMnMrT0hPcExqNDBuUU9kajB5ZDRXcGwxelNldDhLVU42WDRKT1k2VC9sZGtNdWJJbkNUcnZpNW5lOVZLRzVLU2oweGtZZUdVMmd5L3ZjZ29hNmthV3Z2SW1jcWZlbEgrOG5NVjd0ZVJHVmZERXUxOEJjTENrZ3B3cjg1ZzJkZ2djS0dETXM1c0FTRXJweEpBck00alZhT2pkTzVzaFYxNUdTcHNtNkYrOTdqK2s5ZXJMc0k2QzBYOTVpWi9DTGZIcU0vOWdmbUU5RTI4ZFJ1eVBYekQ0cnl1ODZsRnRNVU1uelNjbDl5cEc5ekl5YmZaOFZuOFpaTkRiZm1EVGdTajZkb3NPQWJaVmI3N0JqTmMvWi9TbzY0aXQzTW5JdVUydWs1b2ZpcGo5NUhQTS8yOE5JNisvaWxTZEN3ZFFzSHdKVTk3OWp0dCtlOTBYVHBkYmFjVUU5WnVoaWlLRWtQRHFiWTF1QlkxR1RZeGVHNGlLQnNETjdYYnYwR2cwZzA3bklaUit2NWZuOTNwNGNmS2xwL29NWUhPNVdiL3ZDTStQR1lhdC9Cc212TGFSamcrTjRkZE1EcTVVN0dYRjkzSHNlV2tnRmhsbTN0NmZVUi80SDdkTVJyY001TU83NGZ2UTh5enRPMkJwcjhPZ2lTQ25Wd2FaQWExQ1E4OGVHYWpMZDJNb2o2UnZkc2FwTFVlTmxnUnpTeDNDb0RuM05XMzZsRXltRDYvaHMyKyt3eVpNWkNRNCtHeGZOWG45dlZyYm1OdCt5K0RzUzZEbkhiejgxbjFzT1R5SjFEMEY3RXZzdzZyUlZ5QURjKzRjU3NiVFc1bC9TL2VUdGxWOTNJcStiUXhwcVIzbzJTWHR0UG9uR3l6TWUrUStYcDc3REVObTNBZEYzeU9md21wSzZkaUpsRGczV20wMHVka1pJYVptYXFkTFNJMnBSeGNSVFY1MnhrazB0ZUR2V1J5RCtsMks4ME16U3EvTEdPQ3BaOVVYM28vTXFOL2VSUEczQnluNnNaYk1ycW5NWDFjRURDYWhYUW9KN2ZRWU5WcXlzelBJYWFhWURoeDJIU1A3Wk1EbDBjeGVPSThTSjJTY1ZlVmZEVXZYNzJmbXE0K1FsNklocjlNNGx2U2Z5Mjc3cmNnZmY0SXpheERUaDNpdGd3bFhmMGhoOEVmdHh6TEtZeEpJYVVVRHZ2Zk8yK25mUFliK0tXTlkrSnRGRkQ5NkUybSs0K3lHTkJiUEhPTTFFZk1BRkphLy96RlRKai9IWlIyMWUxb3hRejJBUjVLODRDWUVJQ0g4YTdxbzFTb2lJeUpRKzNJL2hQY2dJZXJxNmo2TGpZMDk1U000OW1NSjk3ejFGWFB1R0VIbnFGUFoxR3IwYWhqVyt6SlNqWkZnektKUDFIWStLN2YvcW9ITldWT0xyVTBjWnQvanNjVEdBeGQyVVRBNVFvZkYzTkkwTWVwUEhkMWR0dUJKWnE3ZEQ4Zzg4ZHg4Um5lSlBQbUhibGMrZzJhK3k1QkJ1U1JFcWFteWUzQzRtL3cveVdiZnZKS05XR0pjVk5ZMElsZFdZajM0RFNNZlBCUTRybmZIUzFIZ3BIUlk5OTUvUDQ4c1dFSDJzTmZSSlhaay92K2J5c0NPSnkvWlMrdlVBWUFoTjE5UEVtRHMydkhDVHdwWmpWb0dXYVZDMWtob1pSWDJSZ0UwTUhQS0kyd1JxUXpxWm9IalZUaGNweGVCTnh0OTk2MVdvVmE1VWNSWit4S29yRFZnTWZ0SUVpTk5KRVRaS0Q4TzZ0b2FMT1ltV3YrRTJKalFqemlneUZJckY5V1FsT0E3TmlhV0JNbEtwUjNTZkYxTzdwamN6Ty9WU0VWVkkwTXNKZzZVZkZ2Y0dxZ0YrOWVFZDBPU1piUW8xRGM0c05rZGhQallBR1hTcFB0M3JGanhaaTBRYzZMN3J6dDJtRHVYYldQeW1CdTV5cUkvalNlbW9XT2lBWmZiSFhnTUxvK0VSdjUxTDAybmpUVmhQSDZNS2dVc01sUlVIYjN3UHI3cW82ei82UE1XenZjaHBsUXkyMGFmOU55eGs2Y3pkdklKN2syanh1RUtEUWFzZW1jREl5ZE9aZDZJVG9DTDRpM3ZoT3d2cTZvQ3pLQllxYWpWa1JRYlFYSkNBZ2xaYmRqNDFOZ1RhRGdxWkxlblJVVFMxTDR6Qy84K0MvQ3diUDQvbVBuYUZyYlBIbjVhejZScnR6UE1hSklsWk1WenhnRU1tN1dXS3JzZzFYSWF1dHlQZTFuNFRSeWxIenlJQVNqWitqWlBmRkVTZElBRTBwbXY3dWEwMnlnLzNraHl1emlha2MralZTazRnb2RRYlNBaHhrWkZsUXRTTkdDdm9iTGVRRkliMEpuaktkM1dGUE10cXpnS1FkOFJYV0k4Q2NjcktWY2dUUTUxUTVVZnFZRVVFOVJXVXltTW1JTWdRMjRCaGhGWXpCR1VWOVRVUHZyNE0yVW5BTFdRa2lyWlYzRVFxZFBTUnFzUkdoVmVqUzFJeE1xVks5M0xsNy94c1N6THcxcDNsOVV4K2FYMzBTVjNvZnJ3OTd4K0dGU1JKbTd0NmFYNS91U3JQUlFmcTZMUjA4QTdueFNTbnRpVzY5TGp1YkhYcFV3bytDODlqVG5VSHo3STU0cUZ2N2FMK0ZVRG01eVF3YTNweDVqeHdtWW1YMkhpc1RjK2hvUytYc0NwUGNxMmZZY3BQZkFqOXFOcTh2KzdHMU5DTWptZHppMlZrNmxUZHhiL3JmczV2N2VzN3Qwb2V1a2RGbWZwU1UxdXorQWVIVWhwbDhDS3JWdlkyVlZpMzhjZnNQNEhKVVFqWC9uRzJ3eE9HVTNscCs5VDJxRWZmZHZLNkUwRFNWdjBDTk5lYThldFY2UlFXVkxNSG5zYkhocVo0ejBwcWgwRDJoOWp6dk1iR056SnpNQ0JseE9yaGxYL1hnWHR1dExackdibjk1V2taMTV6L2daU24waFhkUmtMVm54RVh0c29jaTdQNFhTKzV4dmZYTXlZZFI1czc4MDQ5Ukp3TWZFa09iNWoyVWQ3eU5FN2VPS2xEd25ObFRlUjBkN0RvcVVicWV4bUppTXJpN1EycDdZM0N6ZTl6ZVZ6ZC9IdFo4OFN1b3hTRFAxN1JQSFVvcmNwNzJVaEw2OFB5UVlUNDRaZXltUFBMaVgyenY1c1cvVW11djVYMDFNUGNyOStKRDg5ayttdnBaQVRXY1dybng0aE4zaHdqZWtNN2xqTDlxSUcwakpDTmZ0Rkx5OGpNL0kzYkYrMWt1UnJCNUIrVWtWVTV0YnIrM0hQOHk5OWV2RDc4bUF6MUIwQ2JzSy9NcVd2UmxRbzFEc0VraVNqdUQybzFHcTFKSVJBQ0NINXRILzU0WWNmVGxDcjFhMzcyUlFYeDUwcUVxTTBPRnh1SEM0M2piS1czc2xlTStPYkgwbzUxS2dtSnpVZTNHN1VrZEZrSmtSalRreWltNzZSRFYvL3dJOUtKQStQNkVjbmd4cDJ2ZG15amJiZElhbjdlWm1qamRYbEtIVkgwZXYxWjNSZWJXMHQwZEhSeVBLWmhMSlZET2lYdzRHZE8valAvcVBjY2Nzd09xVWtrZHU1TGJhS1VsWit2SWRhS1pvZVNWR1VWbFJoMTVySTdoZ01iRnA2WlhjbXFoVU5QeW91Z1p5TzhmOHowTmFaVXhqYzFjZ1hSVDlRcjRtaGQzb2lHZDJ6RU9VSGVQdWpRcUl1N2N1OTEzU2tVM3BuVXRwNFAyRFhYM1U1LzhuZnpBOVNJZ3YrZkN1SmtTclFSSEh6YjNMNDlzc3ZXZmZKVjFRNnRRenNjeGtkNHZRQk44WTFBM0w0OGJ0aVNxb2E2TkdqQzlGcXNOZFVzT21UWGVSL2ZvQ1U3RUhNdmpXWGlQTzE2STJrNHpmOXUxRjhzSmppOG1Pa1hacEJmR1RRb0dnTTlPbVJTbXZ2YTN4U0NsZDFUd2t5cTFYMDZKRk9KSkRjc1JQSk1WcDBKak9YWFpMRzRPeTJyRnUvbGMvTEduaGd3azIwaXpmVHIxdjd3QXQvVmI5ZVZKVjh6N2VIajVLWWtrNTdrOVlYWE9oSWVrSlVZTTdrWkhjaDJEc1ViYll3b05jbE5IY2s5TDN5Q3VvclN2anV4K09rZGUxR2dsNmlaKy9lNkt1L1orWG1MOUVrWjdMZ3dadUkxa2lnTVhMVG9Dd09mRjFFamI0OS9SSWFPR3JxeWczZExZSDdTaEJWTE5oVnoyMTlPZ2FDQnl2ZmZJOGJ4bzVpZS80V0dpMFpMSGpnQnFJMFRjOU9aekxUT3owMFNhWmo5NTdFV2crOTg4NzJ2WWNBSjlBSU9Iei9PZ0dYSCtCVXNxeW9KQW0xU2taUkJFNjNCNmNpSWVsME90bnRka3RDQ0ZrSW9SSkNhRXRLdnUrZWtwS3k3WUs4SVJlNHBLcjIyODl4bCs4akx1N01LZzlLUzB0SlNrcENIYTQ4Q010RktrWGZmRWRxcDA2b25jZTU5ZmQvWk9qTXB4bmZQY2hqNWFwaDFMMVBNZWZaMldRWVpNREpxQnZHTVhiUkNrYWNHZjBoNytSdnYyL2tIK2I5U0NnSG0wMkNlaVFhSlNTbkpPR1JKRWxSeTdMUXFtVVJvZFVRRWFFUi91Q0JrQ1FKNFkwdkNFQkpUZTFZcENpZVBVQm1lRGpERXBhd0FHejljQTNqWnBlaFNKRU1IVFdKY2QyYnVlRTFKbGE5TkNmRUw1amV0Uk94WjdoZ2t5TEV2cEYvbUhlc21SbnFwbVc2aDVCOE9XeitJS2hLa2xISkVtcFpsZ255c3dYQXplMTJGNmpWNmw4ZHNMa2pZbkRIcGtGQzRwbVpzTFVTSWo0Vk5PRmx0Y0p5Y2NyRU9TOHc4UXpQbWZmYVcyZmNUcjJ0L3RNVCtOWThTSklYMUNRRWtvUWt5OTRJczFxTFNxTkYxa1lnUitnQzZSNUlrdVJUMnJ5SWFMVmF0OFRHeGs3NXRRMk9SMmZDSlVkQndwbnB4bzJWTGtUOEpSQ21CZzlMV002cmZGTzZjeCtoYVI1dXdDTkpVcERHSmlGSnNwQmtGWkpLZzZ6UkltdDF5Rm9kcWdoOWs4YldMSjlOTVp2anR5bUs1ekRRN3J6ZVJmYnZXdjdXdG50NGRNTVNsb3RRaEJEbGwxL2V1N1NaQ2VyZmZKUkZVZ2hycml6TGdVMmxVcUZTeVY1Z2syVlplRHllWUZOVUFCNlB4L09CU3FXYWNGN3ZKTXk3RnBhd2hNVW5EUTBOVzF2VDFvSzJFQjQyV1phRkg4Tzh3T1lGTjdrMWpjMlBqSFYxdHZ3VGRhREdhdVdIWTdZVHN3TjRRdE9mRlVYQjdRbmRmdldpVkxOaThTSVdMVnJFK3UxRnY3cmJxeWt2WXZXSzVTeGZkeUVDNkU0S1ZxK20wbkVSdk4yT0t0Ym5mM2JDM2Z1MmI2U3dOTFRXZXZlV05SUlZ0RjRsV2xtOGs1WExsN05teSs1bTg5UEpad1ZyV2I1c0dYdEttN2g0UGl0WVQ1WHpmM1ByQnc5KzkxVXpVSE1EN2xBemxCWWFXeE9ncVZDcDFGNWc4MjhRNERZU2dCSWJHNXNQSEE1OUdEWWVlUHBWcmwrMGpqOHNlNGUrVDYzaXY1WCtBdVJHL3I3c2JmTCs5Z0xwYzFaU0Zqakp4VVAvZW8yKzgzemI0eTl6NmN3bGZGUWpmdVV6Vk1aZ01GQzY0eTBXcnQ3eGkrdTl1MlFMbzZjODFmcE82eDRHNVYzUDlxSlNLaXByT1ArZktUdFBUSHVRd291QU8ySGRNMzlpL2I0VEU2V3RYL3d3cTdlWGhmeTI4ZFcvcysyQXRTVkdsbXdpZCtDZDdDa3RvN0k2OU9HdG5mZDc3bjNpYmNyS0s3RGFtMm83Ykh2V01IMyt4ditKR2RxalI0L3ZmZURWM0F4dEtxWHlGWVlHWTVjWDBKbzJ0VStGazVyU1BpUWhTU2hDQ0FWUVBCN1BCcFZLZFZmVHU2cmhubEVqeUd6dkxSTlp2ZjQ5NXVSL3pZWmJld01xQnVmbGN0ZWdCZ1k5LzBWUWx6VTgrY0R2QTMrVkYzM0p5TTNINldPU2Z1VzRabUxZcldQUlZYOUNZY2tKdEo3S01tcmNPbEtiTTZRb1RzcEt5NUFOWnBMTW9UV1FEbHMxNVpWV3pFbkpHSFhuS2E5T1VYRFVsTEZwKzFlNDNXNlFaZFQrNUdSRndWcTBrMUxMUU9iTm5PNmRXS2QxVFVBR2UwMFZsVFpJVFc2Nlo2ZTlocklLSzBtcEtlaUNMK1oyVUZKV2lTWGxESmR1Vkp5VWxaYWpqN1VRYTlTRmRLS3lyQlMzM2t4U3JPSDBBTjVocGNvR2xsZ3RaZVUxSkNWYm11N1hOMDQ2Y3hKbVEyZzcxUlhsV0oxcVVsSXNJYzlIQVJTN2xiSXFHOGtwU2FHSnZjNVM1aTNaeWNMZHI3UjRlQldscGVqTUxXbS9GTGViNlVzK1FhMldXMWhKeFR0MllPaDdDN09tVDBPVzFTSG5iTisrZzNGVE5qTjVjR2grNXNEeGs1aWEvUUNsVTRhUWNnRmpaWGE3ZmNzSmZHdWVJUCthQWdFZlc4QU05V3RzYXJVS3RWcU4ybWVQRW15UytzS2pDdUNwcWFuWkVCY1gxd1JzUkpEWnZxa1VLaVUyQnNjUmY2R3ptc3ZTMmtGdHlVbHY0SzJkZXhtV2ZUVVhkWHhSc1RGMy9BMjhXdWdtUlY5RGxiRXZHOWM4ajBVSDlySWREQjUwRzdyMG5zaldNbUw3MzgrS3g4WUJzT1hWdjNEWDNQVmtaYVpRZXVBQU01Wi96cWdzd3pudjNoT1RoN04rNXcvWURsUXhhTWgxcU9WRUZxNWRSbWNkUERaeENKdDJINmJtWUExRGhseUhuSG9WRzVmTVBDVzRqZS9kQm4zL0NXek4zNEplZGpCZ3lnczhNU0dQdGZNZlpPcUNyV1IwTmxOVTJzaXJhOWJUTjgySXJYUTdnd2I5RGwxNkZnNkhpNW9nanFFeG1aR01XdFhBcUs1UXMyTUpYYWQrU3NXT0Z3RTRzRzBwbzhjL1Ntem5MSnhWSlF5YTlpS3p4L1RHWHI2TDBTTnVvOHFZQmxVSFNCM3hLTXRuanoxcHY4Zm50cVhFbkV2cHJzL29tdHNIYS9GWDlKejRBZ3NtRGFSeTN5WkdqcmtmYlhJR05RZjNNWEQ2OHp3NWNSQlF3Y2lzZmxRbWRDYVdHZzVVbTFpNS9tMnlMRG8yUG5NM2o2dzlRaXlOMkt1S2NHYmN5ZllWc3dMdlFrbkJLaW82LzRhUUlYVldNV25FTld5clNjQ0VBN2V0bXNGRGZJcHo0VHBHVG51V29sM2JtTDc4VzZZT1NmYWRWTVdVa2I5ajU4RURGRmZLREJteUdVdnVMU3g3N0M1S3R5NWp3cHpYS05wVmpxSDhOdFk5cFdQY3JKY1kxOTliRm9teEo0TTdsN09xb0lScFExSXYyQ3V4YjkvK0wwOWloZ1pwYktGQmd5WVQxR3VHcXRWcVNFNXVoOWxzbHFLam82V0lpQWhaclZhclpGbldTSklVS1VtU1VaS2tCQ0dVZlVJb29zWG1yQlAzUGZPU1dMajNhT2p2TmNXaTU2dzN4YUZXem5IVkhSSjVzNWVLL1EydFhPOENiRWVPVkloRGh3NmQ4WGxmZi8yMWFHeDBuRldiSHo1M2o3aitqeStIL1BiREIwK0t4RjYzaUZxUElvUndpRDlmZjZsNDhJV3RRZ2hGL09lNWU4WFY5eTBNSEJ2Yzd1Mlh4WWhYUHJmNi9uYUt4a2IzU2R2KzhhUEZvbTFpb2toc3RqMzZ4bWVuN0hmRDE4dEZUSzg3V3QxMy9QT1hSZUtWOTV6UmM3aWpWNVM0NXI1bmhNdC8vUWE3cVAxcWxVanNlSlg0dnRaN0gxKzhNVVAwdW4ydUVFSVJ6OTdkUi96dThUWGU5cjVhSVdLa1JQSGhqOTV6YitrV0lkN2E3K3ZMZnhlTHhDdnU5TGJqS2hOWHQ0OFhyM3hTNW12WExZNGRyeEZDS09MUm03dUwrNTdOOXgxWEpXN3MxazY4KzYzOTVIMitJbEc4dGQ4cFh2dno5ZUwyZjZ3Unh6NVpJcnI5ZG80UXdpWitmM2s3OGZmMzl3Z2hGT0dwM1NONnRiOVVmRkhySGMvYTJxYnJ2dmJuNjhUdHZ2dlk4UFNkb2wyL2UwVzlVSVJvT0NoNnRXa25QajdhMU41YmY3dEYzUGp3MHBBK2ZQSEdJNkxqdGRORW8xQ0VhQ2dWVjdYVGlFZmZMQXc1NXMvWGR4QlBieWh0T1cvZm5DVjYzUEZFcS9mMngrczdpT2MrTEc5MTMrc1AzeWh1K2R2S0MvWmVLb3FuQ0JnTkRBY0dBYmxBTnlCVmtxUUVIeFpGeXJLc1VhdlZxb2lJQ0RrNk9sb3ltODFTY25JNzB0UFR5Y3JLb2srZlBseDc3YldvWlZubGp5aElzaXdMUlZFa1h4REJiNDU2bkU3bmUxcXROcFIwVFhIeHI3YzM0RTYvZ25zeVRyODhhZHZPL2NSZjJwV3VPaTVxMmJYclMzcjJ2UWFqREtCbHdPQThIdHU1R3liMkpiTjNmdzdNL1RQajVSTDY1dlZsNU1paCtJbWtCZ3pzeTV5N2J1VEF5T3ZvTzJnb1EvTk96c2xtNlg4WDVSVjMvV3g4am1QR2pnMllYanFkamgzYkNsRDBzR2p1WDd6VHFxcUlQYnQwS01DdW5Yc1lPTUZMR21ES0drQlA4NmtOWHZlQmJYd205Mlp0WGxLZ3pWaVRFYWhreTlZRHhKby9ZTWFNRDcwNmpkdEI0ZTRTaHFkM1Bja1Y5UmdNYWpBYU1CbGlNUmp0T093MnNPNWp5MjQ3Y3NIcnpOanFOUldkN2xMMkhMU1JuYTFqeDZvbldiamlReXF0RG1vcWlra2RkWFBnaWoxemU2TUgwQ1dSbWxCRFZRM2dzOHFycTZzd0pZZXlnUlR1L3BLOEFYZDZ0VHBkTWdQejBzKzdUOU1ZYTZLcTdNSTVOR3RxYXJiUXN0SWd4QlNWSkVrSnJCc2FFZzBOOHEycDFXZzBHcThwMnN3Y0ZWSlR0cTRDZU1yTHk5ZW5wcVkrRkJUeVpNVjdHL2hZN3NncjEyVncyclhIU2lNcnNTT2dwQUFBSUFCSlJFRlVkeFl6Y3NSRmx1Snhoc1haQ2IzSHNHOTNMZ1g1QmF4ZStqZWVYTEdkZld2bklnTVRubnlYL3J1MlViQmxDek5HOVdQM3dvOTRaTVNKQzBRcWQ2eGc4TDEvYi9IN3VObXZNVzFFMW9VUHBoaGJrZzlZMG5veFlvUi83WVliR1RVNTlwU1B6T3ZWOHpydEZFVnBldEZQZXFLZUFVTnZvbmVDOTY4UkkyNGtKVDNsOUFaUDlqRkVlT0VUVUZDMFpnYVB2SkVVMlgrOW0wbnJyS2Q4eTBJbUxQaUMvSTN2MFRYQndQb243MlIrUlJNVXFlVVQrMFdOSmhOV3E3V1ZQc2dYZEtSc1Zpc21rK0dDdGJkMTY4ZGZOUU0xMTBuTVVCR2F0eGJrVy9NQm0reFBhR3NDdHdCVmVDQTZtcGJXYVoraUtKdDhzUXZlLy9CRC9sMW41c1diZXhGNUJzLzc2QS9mOEltbkxjUFREQmNWcmxsaTIxSmNYQkx5bGMzT3ZvemQyLzZEVlFGd3NtWGpkbkp5ZWdZbWxTRWhsUkczVG1EeE13OVRzVzgvRHA4RDJXcTFrNTdkbjRuVFp2SFErTDdzMlhmZ3BHMmJzNGV6ZnQxN3JHdTIzVFc0NnluN3JkWHBVS3FyZkgwOGZWbjJ4QlRtTHMwL3JXT3ordzZrNnNCWEpHWDJKamMzbDl6Y1hOSjhRWVhzM0o0VWJQR21rdFFVYm1GWFZWTkhZczFHU2t1OGtjRWQyM1lFbnEwNnZTKzlsYzlZR1lnYUt0VFVXSUVFQnZSUDVtQ0ZNOUJPZGtiblZvSDI5RlNhVEFabTJDbTF4Z2F1bDVtZWh0RWdVMUZhU2tMWFhuUk5NSUJpWSsyNmd0TytiRTUyTC9idENhV0t6ODYrak8xYnRubFhnM09Va2IvOTRQbjNkKzNaUTA1MnpnVjVQOXh1OStZUkkwWWNDd0kyRnkwVGM0TnkxNlNRWk54ZzM1cEdvMGFyMWFKV3E5VitVUE5GUjJVaFNRck56Vkc3dldHdHdSQTFtSVlqUEY3d0hWWmRCQVBuN3ZlK0FQRnBmSEx2MVFETVh2d3E3MWM0cVhPNnVYSE9TMlQydUp6WGJ2UnFCbTkvdnA5K3ZYcGhraThxWENOeitBVHlYcjZKdEs1dmtUWDBQdFkrTlptVVFST1pzdng5Y25LdUlrVm5wY3JZbjQzanZHYlhaeXRtTS9HWmo4bnNta0p4NFc0bVBmS1MxM1RCelVQRGU3QkxTU2ZKNktTd3hNM3k5WU5Qcm05bzlTUWxuOTNMSzZjUFpHcnZaOG5KdWd5aklaVmxCZS9ROVRRdXRXUFRXK3hPNzh3ajQwN05NRy9NR3NIaVNSOHhzR2QzdW1hbVUxVnlrSzZqL3Nhck0wZHgxeU4vWitYZzN6Rmc2NHM0M1lMa0lGTjAzTVM3R1RxK0g1dXlPbU14UnlEalcvdEJuY1NpNWY5Z3pMaXJXTlkxRTZXcWpFRlRuMmZtbU40OE5QOFZ4bzY4blp6bHlWaTBEZzZXQ1padDNVck9XVkhnNlpuMzZrdU1Ibk1EYTUvcWlzNVpTYW10SGZrN1Y1RTFkRHptSjY0bmIvQ242T3hWV0JMU1R2dXE2WU5HWXBoMkd3Y2RqK0ZmK3lkcjFCU0dMYjJHbkx4cmlaVmRLT1ltbXArWFo5L0J5L25GRk8rclFGZHlFNnNlMHpOajRYc015ektlL1lTMUgyRGpMaVBMbDZWZmtQZmowS0d5VDFveFFWMG5NRU9GSk1sQjBkQW1UYzJ2cldtMVdxUnUzYnJSME5CQVEwTURqWTBPcWJIUmljdmxraFJGa1JWRmtZVVFha0Q3Zi8vM21QSGhoeC9lQnJUL0pZTk1aV1VsVHFlTDVPUXpxeFRiczJjdm5UdGZndlljMTRyV1ZKVmpkV3RKc1lTK1hVNjdsZkxLYWt3SlNaajAyaGJuVk50bFVwSXRxSDhsSHdtM3cwWjVSUld4bGlRTU9tM3dEc3JLcWtoSVNVYmI3RjV0VmVYWU1HSXh0MklCS0U3S1M4dlJtUzNFR2tJZHV0VVZwVGpRWTdHWXo0R0JwMUJSVmdxNldDekJhVG1LazlLU2NveVdaRXo2TTB2SldUN3JKbmFuUGN3VDQzdUh0Rk5aWG9iT2xIUmF0TzQvUmJZdm1jYVRwVG1zbm5QK1hVWkNpTEtiYmhyNTUzZmZmZGRPRTBXUkRiQkprbVRIeThQbWxDVEpMY3V5SXN1eW90Rm9SRVNFbG9nSW5ZaU1qQ1F5TXBLb3FDZ01CZ05HbzVIWTJEWklQWHIwd0c2MzA5RFFnTVBoa0JvYkczRzVYRkl6ampZTm9HdHNkRHlpMFdpbWhvRXRMR0U1ZjZKWWkxbTZxWVR4b3diK1Q5b3ZXUFVxNlVQR2tXSTQvMTlOcTlYNlVreU02UU9nZ1ZEdXRYcEpraG9BaHlSSkxrbVN2TnhyYXJYd0Fsc0VPcDBYMlBSNlBWRlJVVVJIUnhNVEUwTmNYSnpYRlBXYm95cVZTcWhVS3NuajhRaFpsdkI0UkhDSmxmdlFvVU5yMHRMU3BvYW5YbGgrUFZMRDhvWExxRzdGajJqSjdNdW9BUmQrelZiWm1NYjRVV24vc3ljeWNOVDRDOWJXNXMxYmRqWHpyWjNRdnliTGt2Q2JuejZzQ2pKQjFXaTFHaUlpSW9pTTFQbUJUVVdRcjgwWEhaWHh4a1lEMFZFbFBmMlMvVzYzYTdVc3l5UERMMFJZZmgxaTR0WkprOE9QNFg4Z2pZMk42MGFNR0ZGRnFGL05CYmdrU1Fxd2VSQ29EUTFsOFFqR0xyOXZUYWVMSURKU2o2elJhQUlIQktkK0JCZkcrd0lKSHJ5VkNHK0hoeVFzWVFuTFQ1V2lvcUpQV3RIV2dvTUdudFlvaXBxbmVHZzBHalFhTFZwdEJEcWREcjArQUd5YVFMalVyK0twVkxKb3p2WUJlTXptK0FJaHhDZmhZUWxMV01KeXR1THhlSGIwN0huWjl5ZlIxbHF3ZWFoVVRXYW9GNnZVcU5XYUZ0cWF3UkNGV3F2Vm9ORjRiVlNYeTR1QWJyY2JiMFdDZ3FJb0FYQVRRbmdBZDMxOS9iL2RpbkpsclV1bVhSdEQ2NUU1andCVnN5SjNqNHZ5NHpZaW9nekVSWVlwdG4vT3NydGdOVHNPVklJdWlYSGpoNk1QUDVLd25FTTVkS2pzUHlmUjF2eU11VXBvc2JzcXhBVDE0NWJmdDZiVGVRTUowZEhScUxWYUxScU5GclhhMlVvUXdkMWlvUmZBazlJbDgrMUxINXc3TVRIQ2sxbnVpdVRwY2RmVEp5RVNMMjNST3Q3OXJvcEt4Y1NXdjkyQ3Z5VDN5S0Z2R2I5c0czR1dlSTVYSHFWenJ6eitPYWdMY25pTVc1WHlIVEJuQ3l5YThiOXBYNnZUWTVBcm1mclFHNHdJQTF0WXpxRW9pckt2WDcrK2UxclgxcHFXMXNPL1lJc2tDVm1XV2drYStFMVF2N1lXaWNFUWhkRVlneHdSRVlGWGEvT2FwRTNnSnZ1ME5qbVFyT3NIdHVQbGg5ejVEOXowNXVvSGIrZWhqQWptNUgvdDY3S1h0dWk5ZTY2aCtScmpiMno5bE81NVY3UHM5OE40ZDlLMWZMcDVPMTgxWENRRDZmdlhXZ1ZsRmFINzdEVlFYRXJJU3VlS0FyWnkyTG9MM0c3T2FQVnZCZTlVS1NrR3V6TzBBN2JxbHUyZlNETHloakIyOUZCT0ZQRjNPNndVRjVkZ2Q3YnNYRTFsR1NXbDViVFlwVGdwS3ltbXZNb2FmcnN2WXFtc3JOeFlWblk0R05TY0JOWUxEU21oVWtLMXRlQ2dnZDhFYmRMV29xSzgybHFiTmlia2lBZ2RXbTJFendIWGxNR3JVcW1GdnlJaEtJamdhd3ozOHVYTFZ3TGZwY1RHNEdnTXBTMktpMnlaUUdqUWFsSDVsN09YQUxVV2crcmlHTWorRnBqMkVPUU5ndUdEWUlHdk9HM3hET2paSDZaTWdLemVVRlR0L2YyaE1UQnVOcFJzZ1NGRFlQQVk4TzBpMXd5N2ZSeUVlMVpBejdGTjdlUXZnQUZqWUhBdWpCa0wyU084djg4WUNVTkd3c2d4TUNnYkppLzhpV2JxMm1mbzNMa1hVNmJjUTlmT1BWaTVvOVMzeDhtVEU2K2g3OUE3bURyNTkvVE1IbzUvajcxc0IzMHpMbVg4NUQ4eGZ1UzFqSm01TlB5R1g0UWloQ2llTmV2UkwwOWhocllvZVBlVlRZbmc5QTR2c0VVUUVhSHpKZWthaUltSklUWTJGblZrcEk2R0JxODY1M1JxZkw0MmRmTUlhYkJKNmdFOGQ5ODkwWHJiNkJHdnYvenBkN05IWHp2OGxEZDB4M1hYOE1Ecm14aGZ2SmZxWXpYY09mcGFMcmxZY2wzZEV0V3hnajArWm1hSEE0clh3Mk5ib1hBWG1OU3dkaTQ4OUJTc2ZReWVYQWtIMThDSUZaQy80c3lhMnJrTmR1NkdETE8zbmNDSEpSTld6WUdhSFpBNkVaNlpCR2VWdjY1VU1tM1MvK094dGQ5d2E3YVpmYXRtTTJEYVk0ell2aGh0elc0V3JMS3lwZXB6VW1WUW5NNkF0cnBqelZLMEEvOUUvc0o3dlJEb2RJYmY4b3RRamg0OSt0NkxMNzdZMkpxMkprbVMzd3oxMEVUL0xVSWpvY0dncGlVaVFrdGtwQzZnclpsTUpzem1lT1RJU0QwNm5ZNG1YNXVHWmttN3dla2ZJYWtmazJiKzM3L2Q2VmNVbnc1dDBaYlB2cUJTWitHZXE3SzU1L0oydkpHL2t3QS81YTlkWk1HdFFacVZUZ2ZidG9BZW1EY1Rac3lBamJ0aFQrRlBiNnJuVUMrbytkdnhTNTZ2T3NlVUFycHFiM3IzMlRuL0NpbTBaekFnMjl0SXhzQkJxQXMvcDFRQmpPbjBUNjlrekxEYm1mdk1JbmFYMVFUQU03TjNmdzZzZVp6eGsyZXdaUGs2YklvNi9KWmZmTnJhOTA4ODhjUVh6VUF0V0dOcmtlTFJITlJhK3RaMHZraW9JVkIxWUxFa0lrZEY2ZEhwSXZINjJyVDRvNlNocVI4cUVRUnFDdDRJcWZ1VitjOGMvL3VBamt0UEhRQm9aT1duMzNMYnRWZlNKOVhDOWYzNjBzMVZ3cWFTK29zRTJNQm9hT2tMUytrSkkwWjR0M0hUWU5VVForYXpVOXd0OXhsUFVQc2NZTW81bjlFYU9aYWwyL2N5Zi9vdHlCVzdHTno3Y3JhV2VUVXpMeFhUUjR6STY4eldwWDhqYi9STWxQQzdmckZwYTJ2LytjK25ITTFNVUwrMjF1b1NlOEVZRkZ4aDROWFdXdnJXekdZemFyVWEyV0F3b05kSGhtaHRUVW03NnRhNDJuemdKbmtrU1hLdldibmlUU0hFL3BQZmtncERoSW9mcW1xOUw2U2psa1AxRWdiZHhmdlY3ajhBRGhSQzF4ekl6ZlZ1S1VGMThIb2pXQ3REZ3dvQUNVWW85VEh5YlB2c1BIZlNZTWJzTHFla09xZ1hTWmxrNmZleFpWY1ZBUHNLOG5GblhlN2xKSFBhc0xyMTlCNDRqQm56RmpJaTNVRlJpVmMzUERFVlUxZ3VFbTN0bTltelorOXNCZFNjUWY2MVZsSThaRUpMcDBLMU5iMCtzcG0yNW1VK1VVZEhHNm1ycTZPKzNvN0QwVUJqWXlOT3B4YU54b1hMNVVLdFZndTMyeTE1UEI2aGVNTnpRZ2dVRUlvUWVDWk11TFAyaFRyTGF6dW1YRGNQVGt4Yk5QbjZLN2w3MVh0OHNUT2VtcW9xa3JMNk1EUm83WVNMVGRLR3dzeXRrSk1GbWVuZUtPYlFoMkR1T0I5KzVIcjVrYk95d0pBRUd6ZENMREJoSXR3MUNCWjJCYk1CT0ovVWR1cFVaczhheXEwOXU2QTNwYkZpKzRka0dpdzh0ZUN2akJyWmgrV1phZXpaVjg2QzVlOTcyVjFyQ3VtZmV6dm1qQ3prbWhKcUVzWXdMOWZML1h0aUtxYXdYQXp5NDQ4L3JuMysrVVduOHEyRkpPUUcwUktKbHFBV0VXRDFpSTQyMHFaTkcrTGo0OUg1L0MvU2E2KzlTbWxwS1JVVlJ6aDJySXFhbWxycTZxelliUFdueS9xaHZlNjZJZnAxNjlhdGtpU3A5MG52enVPaXZMYWVpTWlvLzFtQzdzK04zY05oZzRwcXNGaEFkNXFYcnE0RVJRZG00Lzl1b3JvZE5zb3Fxa2hJVGtFZm5LR3RPS21vS01ldE5wR2NFRXB4ZlRJcXByRDhla1ZSbEoyWm1kMmYycjkvdndNdmkwZTliN01CZGgrTGgvTjBXRHdNQmkrUW1Vd3h4TVdac1ZnU1NVbEo0WkpMTHFGSGp4N285ZDdQcGJwTm16YlUxTlJRVjJmRGJxK25vY0ZCWTJNRVdxMFRsOHNiSVZXclZjTHQ5ck4reUhnOG5rQ3lMdURac0dHajAycTF2aG9URTNOeVlGTnBTSW8xaFVjNlNIUUdTRDFEclNzMjRYL2ZiN1hPUUdwckhaZTFXSkpTV3oxSHF6ZVNtbW9NRC9wRkpzWEZ4ZS92MzcvZnpha2pvUXBOcTd2N3RMWG12clVJSDRPSFYxc3pHcjNhV2tKQ1FnRFVBR1N6Mll6SlpDSTYyb0JlSDBWa3BJNklpQWlmcjYxMWYxdFExQ0t3K0lMSjFPWTlSVkhXaDRjeExHRUppMTljTHRlSGwxelNlWDh6UUR1bGI2MDF2NXBHb3czUUV1bjFVVVJIRzN6cEhlYUFieTBBYkFrSmljVEd4bUkweG1Bd1JPRk4vNGlncVNKQjdVc0JVWWtnQ3ZHUUVpdThpeTY0S2lzclh3MFBaVmpDRWhhL2ZQbmxsNXNJVGNZTkFKdFBXM09mWEZ2VE5Lc0hiU3AwTnhxOXliZ0pDWWxFUlVXRkFsdFNVbHZNWmpOdDJwaUlqbzRtTlAwaklraHIwelNQa3JiUTJ0cTJUZHJ1Y3JtV2hJY3pMR0VKUzMxOS9mSXJyc2c5MUF6VUdrK2tyZm1YMUd0ZU51V25KRHBSZWtkU1V0dVdIcEhJeUVnc0ZndHhjWEhFeE1UZ1RmL3dKdTFHUkdoOUtTQUJjelM0ekVvMHF5RjFTNUxrMnJ0MzcxTGc4Szl0a0RJenU0VnB3Y01TbHRNVUljVGhOV3ZXYkcxTlUydW1yWVhrcmJVV0NmVlhHUGk1MXBxbmQwUkdScllFTm9Da3BDVGk0K05wMDZZTlJxT1JxS2dvOVBwSUlpTDg0S1k1YlYvYlpaZGxmMmUzMjE4SUQyMVl3bkx4U21WbDVjcXhZMjgvM2t4VE82RzJkaUxmbXRjRTFSSVI0YzFaQ3c0WXhNZkhrNVNVMUdyNzNuWEl0Vm9zRnE5SjZnMGtSS1BYNndPQkJLMDJJbGh6RTRvUU9OMGU0ZllvUWhGTnJCOStkTzdhSTN2cHMvbUZtME00SE53TzN2cG9COU5YYk9MeC9OMGNhUlRoMFE5TFdINkY0bmE3UDg3SnlmbjhOTFMxa0tYMS9OVUZ2bFFQWHlWVVJGREFJTGdlMUl6RjB2YUVWbFFnQWFsOSsyVDhnWVNZR0NNR2d3Ri9IV213MXFiUnlEamRvTlpvVUtsVUlBVEMxemsvdUIwNmVNQzVZTU4vbHdRRDI3TDMxL042aVpNeGZiS0lzeDVpd3FyUHdpVTFZUW5McjFBS0N3dmZMeXM3M0x5Nm9CRm9EQVkxSDZBcHdUV2hUVkhRSm0wdHRCN1VHQWdZdEcrZmZNSStoRlFPSmlXMUpUNCtIcE9wRGRIUlhwTTBNdEpya2pacGJUck1iYUtGSVRLQ0NLMUdxRlN5OEdKYndGYjJTQkt1ZzAvZDk3SEw2ZnlYOThxTjVPODl3bDNYNXBIVHdjTEVHL3JnK3FhSXJ4dkNreUFzWWZrMWlkVnFmYlZYcjV3U0gzZ0ZnMXB3d1h0enZqV2Z0cVpxUlZ2VGhWUVltRXgrRTdUdFNmc1JBbXlKaVlsWUxCYk01amhNcGhpZlNlb0ZONTJ1eVJ6MVJVbUZXcTFHQk5HTE5HbHRraHR3Ymlzb2VFVUk4U1Y0Y0NzQ2xjclhuS3hDSld3VVY3dkNNeUVzWWZtVmlLSW9YejMvL0tMbUFZT0FiMDJTSkNldCs5WjhKcWhHTkdsclRXVlQzcHkxYUV5bUdNeG1iOEFnTVRIeDlJRU5vRjI3ZGlRa0pQaHkyNHdZREZHQkluay9BNGcva0FBS2lwQlFhOVFCSWtwSkNqQmd1c2RkTjdUaStQSGpMNENlUHAxaVdiVzlrS00yT3g5OC9DVS9DSW1HUm5kNE5vUWxMTDhTK2ZiYmIxZlBtREhEMWdxbytUVTJQNmdGcDNpMFdIR3FpYm5EWCtRZTVWdmhQWmFFaEFUYXRUdDFPV1FMWUl1SmlTRXBLUW16T2Q2WDI5WmtrZ2FEbXl4Qm5jTWpkSG85R3BXcTFhUmRKTWtWRjJmZTRISzVYcno3eGlGMDV3aVRYdC9BcDBvaUEySlY2SFZoVHE2d2hPWFhJRGFiN1kydVhTLzlKc2dFYld5bXJiV2FqTnNVTU5DSTVxQVdXdVR1SlpCTVNrb2lKaWJtbFAxcEZWbmF0MjlQZFhVMVZxdVYrdnA2WHlGOEkwNm5FNmZUaWFPaG5pTzJSb3dtRTJxUGs4WkdCVVZSRUVJSVJWRVVFQjRoa0NTUWtTVFZKNTk4OHZKVlYxM1ZhOXBOdjhrR2NOZVZjL1cyYVA0VUgxNnBLaXhoK1JXWW9MdGZmZlcxemEzNDFZSkJ6WVUzMTlValNaTFNQQm0zeWE4V1dqWmxNRVNIRkx5M2I5Lyt0UHJVS3JCcE5CcVNrNU9wcmEzRlpxdkRicmZqY0RpOGxFYU9CcjQrVm9jcU1ncEp1R2h3SzhJdEpFbXRVZ2toRkR3ZThOSWFTWW9BTndMWDFWY1BMTnZ6NWE1RlgzcWlGaWRwRmQ3NStIT3ljbnZUTVl4cllRbkxMMTYrK2VhYjFRODg4SUQxSkNab2kyUmMzNnBUTGRJN3ZINjFsbEhReE1RRWtwT1QwV2hPRHpST3lLZHFzVmlhSmU1RysycEpJNG1QaThPa2p3Q1ZDa21sUXBLOXFDdkxLaUZKQ0NSSlNKS3ZZbC9DSlVtU00vT3k3RTJsSlNYUHJpODZUTS9lZlhsNmNPZndqQWhMV0g3aFVsdGJ1eVFqbzl1QmsyaHJmbUR6KzlaOEFZTUFxSVV3NG5xam9QNWEwT2lRUk56bWhlNW5yTEg1SlNVbEpZalN5TzZqTkdva1BWbnhjYmJacUsrMzA5RFFJQm9iR3lXUHg0TmFyY2JqOFFpZkJCWlpsaVRKbVZoVCt0S00zLysrbXl6TGc4SlRJaXhoK1dXTDIrM2U4dWlqc3o5dUJtb09tbkxXVGhRRkRUWkJoWmUxSTVnOFV1OHpRVTArRTlSQ1NrcktHZlh0cEF6NFVWRlJKQ2NuazVpWTRFdmNqY0ZnQ0M2VWJ3b20rR3U3Vkw1QWduK3BQb0lxRXU2NjYrN2podzRkZWdFb0QwK0xzSVRsRnkwL2Z2cnBwKzg5Kyt5ekRhMllvSTVtSm1pZ3dpQTBZS0FXd1pxYXY4RGRZSWdPTEtQbk4wR2JzM2Y4SkkwTnZJR0UydHJhZ05ZVzhMVTV2ZFRoYnJjYnQ5dU54K05CVVpxQ0NFSUlmT0FtQ1NIY2dDUkprcHlhMnZGenE3VjJRWFIwOU56dzNBaExXSDZaY3ZqdzRXVjkrL1lyODRGWE1LQTFOMEhkUVJVR29tbFJsdEJnZ2IvQVBTcks0RXZ0YUVOOHZEZTE0M1FEQm1jRWJBQWRPblR3UlVodE5EUTAwTmpvd09sMDRuSTVnNEROamNmakVSNlBSd29HT0ovV0p2bE1VcGNrU1Nxak1lYmZqWTJPTksxV2UxZDRpb1FsTEw4c3NkbHNieVFudDk5RmFHcEhjeFBVUldqWlZBc1R0SWxqTGJqQVBaU09xRU9IRG1mVng5TmFqQzA2T3ByMjdkc0gwUnNGTSs3NnF4TDh4SlNhVTVta1RxRHh3dy96bHlpS1VoQ2VKbUVKeXk5SDNHNzNSNHNXTFNxZzlRaG9RR003bVFucUJ6V3ROcUpaZFlHQm1CaFRnSTZvZmZ2MlJFZEhuMVUvVHp0RHRuMzc5bGl0M2tWZVFyVTJ2MG5xd2VQeDRQRW9KekpKRVVKSVB0WFVPV3pZc1BMdnZ5OSt2a09IMUE2U1JLZndsQWxMV0g3ZUlvUW8zckZqeDlvLy9lbWh1bFpNVUFjdEF3YWVFNXVnWGsxTnA0djBzWGI0T2RhOEJlN0p5Y2xuWllLZWtjYm1sNDRkTzlLdW5UY0ZKRkt2QjAwaytxaW9JR0xLQ0xRYURaSXNDMW5sWDBrK2hHMDNFRWlRSk1uWnNXUGF6cHFhNDgvUmN2bk1pMGFzcFh0WXYyM1B1Ym5POW4wWHBNL2IxcStnelBwemY2NndmdHVGYXMxT3dmb3RPSDhoYzZXNWZMWnBOUWVyVC9rS3VvdS8vdS95ZnYzNmx6WFQxbG96UWYySnVMN3FBcThKcXRINHRiVlF2NXEvWktwTm0xamk0K05wMXk2SmpoMDcvcVI3T2lOZzArdjFkR2h2NXExUENubjk2ekkrS1NsbjAzZVZOS2k5TnJJa1BKUlUxM0hNN3NScWR3aTdTMEZXcVlVc1MwS1NVQlRoWFl0VUNPRVdBcGNrU1kyeHNYSHZOVFEwUFBWTEFhSW5KbzlrVzltNUkxeXFMTXpubVpWYmZ2SjF5ajlieFNNTDExNlFlMXJ3ME8vWjhUT1BhMWNXd2pNclczbE9PK0RlZWVlMnJkMHI1L0Zrd1VHMHY1QzUwbHhlbm5NLzI0cHRKejNtMkxIcUY5Tjc5TjBUcEtrNWdqZEpraHFEUWEzSkJKV0VTcVVXWGxEVGloUFZnWHJ6MWN5MGJadEVodzRkUWxhY091L0FCdEMyWFhzbS9tNE04MzgvZ2dkdUdFUy85a2IyMXppSmlvckNFQjNEcFIzYWtaNlVRTHVFTmtoQ3dZV01MS3VFSW9RQVNjaXl2MUJlK0JrQUduTnpjNWU0WEs3WGZnSCtCUXEzZlVoWmpUZG9FaXJlQ2F3NGJCUVhsK0lNbXMvMm1pcUtpMHV3dTBNbnVhSW9wQTZaek1iNWsxdTlsc05XUlVsWjFabjEwVzZscExTaUJkZWR3MVpEU1hFeE5vZjdETzdKdTM1b2NVa3BkbWZMRjdTbXNveUs2cFl2aEsycXZOVitLMDQ3SmNYRlZGbnQ1M1djRkFWU2g4REcrUzEvdDVYRDFsM2dkbnYvRHRudmdKSVNzTGVpZWlsNDdZcVM0dWI3N1R6NXhCdE1talQybHpWWEZDZGxKU1hZV2huWDV1Tmt0OXYvM2FOSGorQjh0UlltS0MxVE8zeHJHS2hFTU1kYTgyQ0Jueml5S1YrdFBXM2J0djNKYytBc3F0QWp1SzV2VDc3NlNzWnVieURGa3NDbnRkVVlEQkc0WEc0a1djYUdnc2ZqUWExUkM2RlNTMm9aSEkxT1pGa1NFaUtRQWlLOEtTQlNZZUhYY2tGQndZdURCZzFLVUtsVTEvMGNRYTF3M1ROTWUrWmRDZy9hMlgzWGRTd3hxQmsyOVo5TUhaWUZ3S3ZUYjJSMVRVY3FQOXNNZWgzcXpKdlp0bVFHVDl3N2lHVzdQYVFsNk5penI1elpyNzdOMkw3cGdJTlo0NGFUWC9nTnRxejcyTE5zUnFDdFJWTi93NG9EY2FqZHg2azZXRWpLNk1kWk8yLzhLZnRZWGJpR0FZTStRRWMxRmZvOEN0WS9UNElXVnM0Wnk2elYzOU01MWN6QndpTEdQL0VHRDQzS09lVTlyVnZ3SUZPZTJrUkdWbWZLRHhRemQrMFhERW4zNmlYTFpvOW5zZlVJKzNidVl1ckwvMkg2c0V4d1Z6TnIvTTJzTEZKSTBkdXBOdlJtM2VwL1lkRkJ4ZTQxREI3MUoxSXlzN0JWSGlSNy9OTThOWEhnZVJtcldlTWd2eEJzV2JCbldkUHZENDJCYlVWUVVnRkRoZ0N4c0hJbHhBSTdWc0w0R1pDZUNRZUtZTzV5R0pYalBTOS9BY3paQnJxRFlOVkNqUW1LZkF0Tk9vcldVMkRQWVVtYTdoY3pWNVNhZzR3Yy9Cc3FERjJSN1EwNEtwM2srdlkxSDZlZXQvOGpQODMxelllSER4OXVMVmV0TlJOVUNhNEY5YThKcXRGb1JkTXFVNUdCT3RDWUdCT3hzWEVrSmlhU25OeWVUcDNPa2J0ZENPV3N0dVBIcS9sNDh3ZjB2MlU4MTkzL1orNjc3ejVHai80dDExNTdMVmRjY1FXZEwwbEROc1FSYjJsTGJHd2JTVktwSkpWV0swdXlySkprV1FOU0JKSVVKVW1TU1pLa1JLRER2bjE3aHl1SzUxTnZ3Y0w1Mlk0Y3FSQ0hEaDA2Ni9OdjZ4RWwzdHJ2YlBIN0szKzhYc1QzR2lWK3JIY0xJUlRSMEdnWFFpaWl0clltY016M0c1NFFIYTZkR25MZS9yZG1pVzYzelEzNTdma0hyeEdYM3paWGVJUWlYSWNMUkx1NEs4UVBucFAzYS85YnM0U21YVDl4cUVFUlFqakVIMy9UVWZ6cDljOWE5S0Z1L3lvUjMrVm1VWCtLZTZyOWFwV0lhM2VGMkgvTTRmMnRzVVljci9QZTJ5M2RWT0tQTDI0WFFpaGk3NzluaWs0M3pCQkNLR0x6YzVORWo1c2ZFWTFDRVVLNHhkTjNYeW4rOE9JMjMvTzVUdHp4ajdXQjZ6YzJPazcrckJ2M2lUNXRFMFZpWXVoMjlmM3pUMnVjOXIrbGlHNjN0Zno5MjNjVTBlMlcwTjg4UnhYUktWRVJueHoyL3Yzang0cG8zMDhSTHQvK0Q1OVRSR1E3UmV3OTZ2MjdvYUhwM0M5ZW15RzYvKzZ4WDlSY2VmZnhzYUxmZmQ3bjJIaGtoK2dVcVJLdmZGN2RZcHpjYnRmTzk5NWIrd0R3VzJBNE1Cam9DMlFEWFlFT2tpUWwrdDdoS0ZtV0kxUXFsVWF0VnFzaUlpSmtnOEVneGNiR1NtM2J0aVV0clNPWm1kMjQ0b29ydVBiYWF4azkrcmZjZDk5OS9PMXZmK09WVjE3bTQ0KzNjdng0OVZualVmUHRySG1EVE1Zb3R1d3RKckpiSDRiRmV5Z3ZLL05GU04wME50Unp5T3JDa2hpSHh0MklRM2lFSk1tU0pLdUUxL3lXRkNGNWtMeHFxd1RJa2lSSkdSbmR2aTRyTzdRd0tTa3BWcEtrOUY5YUlHRHd5RnV4NkwzV3ZVN3IvWUpYRkc1aThqT3ZjS0NzR3NWUlJhV2NkMXJYNnAyWGl3eklTY21ZbmRWWW5ZRHU1T2VrNVY1TnNnNUFTLytCZVN6Y3VSdkc1bUFyM2NtTWVmOWk5OEVLRkxlTm1tb2pWdUJrWG94ZE93cElIWFF6WFdOOW5pT3RFWk8yU2RIdm5lZFZaNUpTVXJCVmZRN0ExcTJiMGRwem1EWGpZUUJLUyt4VTZBcUJQTEw3OW1QRzVEOXhiOFZuNVBYdHo2aGhnempwbWwvYXJtd3YvL0dDakZ2SmRpaFh3NXI1c05acnBXSGQ0eTJQOFJmeTlCd0tHV2J2LzNWQjQxQlpmUlNqTWZrWE5WZDI3ZnljL2lPbmV4OXpRZzU5TTR5QmZVM2o5T2wzU1cyVDNucDArdjFIbWdVS2dpT2dKL0NyeWFKcEJYZC9zS0FwQW1vd0dIeHJnclloSWNGYkI1cWFtb3JKWkRwblkzcVd3T1poeFhzYjJCT2Z3eFBYR1BqK215S2NQbG9qaDcyT1Q0N1cwUzQ1bVdqRlFYMjkxejhncTFSSXNwb0lMY0xqY2VOVUVFaVNnaTl4MXc5d3ljbnRQNjZxT3ZwY1hGemNUQ0QrbHdSc09xT2htYk9wa0ZHai9zcGo2ejlnV0hZSzlsMUxzVXo0OFBRR1JnNGFHdm5NSGRDSzM0T3FWREZoK0cwTVcvUWg4d2Rub3E3Y2dpWHpyejg1REMwSDk4L25yRktBck54ckdUSFk5MDBhY1NQR2hGUUFza2JNWUYvT2NQSTNGYkIwM24wczNmSkg4cCs1OThRTk9BOHlJdSszbERUcmFOZGhEN0Rpc1FubmZPeU15VEJ5Uk5QZkk4ZEFRdkIrWSt2bm1ZM1IyT3pXWDlaY2tlWFczSFRCNDFTMTdQVi92L0hnOVB1L0o3U3czZEdLWHkxQTlSMjAyTEh3cnduYU1nSnE4QVVMdlB4cWJkdDZrM0NUazVQUDZYaWVCYkFKM3Yvd1EvNWRaMmJwNzNwaGtBV2VoZ1ljRGdjT1d3M3JkaHdqT1MyZFJCeFlyYlY0ekZOaUFBQWdBRWxFUVZTQlVxdW95QWhSNXhTU1RxMUc4YmdCU1pFbENRRjRDeFM4L2pZaGhHUTJ4Nit2cVRsdWlJbUorZXVwOVpRTEt3YWpucXJLYXVpYWNPcURxOHNvVmFmUXQyY0tNckIremJ1NDBaKzN2aFh2MkV5Wll6YkpPaWZiQ3JhVE0vWVA0SzZrdE5wSS83eE0xTUNPOWV1cFZFNTlUOW01QXltWjh3K0txcWQ0dFRhM2xScUhBWlBoeFBHbUFmMnY1cUZ0eFdUUEd1dlZ4aFE3VlRYZXhxeFdLN0hKR1l5ZWtFRnVrcHU4SjR0T2ZqUGFWQmF2ZlkvbXZtMnQ0YWQ5MWZWR3NGWjZ2ZHoreVorYUI0WlNrRk9odDQ5QW9xcnE5Q1plMTU0NWxEK3pBU2UwMEVCL3JuT2xkMDR2NW0zYkNyZG00YXpjeWJZaUt3TjgrNnhXcTZOQmlubmx3VWYrM3o2YTBqb2NRRU1JcUxWTTdmQnJhOEg4YXFLMXlnTC9LbE50MjFwSVNlbEE1ODdubnVubnpJR3Q0UWlQRjN5SFZSZkJ3TG43QVZCRlczaXFkd3FGaFY5eVNOR2lQbktNYit4MXVCdnN0TkZIWXRicGlEWEZVSC9rbUtodjlFakNJNFJLclpaay9NU1VJZldra2hCQ05wbmF2R1d6MVVWRlJVVTk4bk1DdGdtVC9zRDRDVmV4MkdSZ3pDTXY4dERJbmljK09HVUFVL0llcFcvdU5hUVpGTXdwOFlFSFhyRmpCYU9tL3d0N1ZRa2xWVEo5Kzc1UDVyQUhXVFJqMUZuM3pXTDJNSGJRMWFpcHB0STRsSUxSMmFCVm1ENmhNOE56KzlBeldZK2MxQjZMZk9wN01tYU40TlVaSHpFMHB3Y1pXWjJwTEMzbHNaV2ZNamo5eEFia2dJbHpHUHJaYjhuc2VTVVpLU1lPSGlobThvTDN1WGVRZ2JWUGpPZXg5VWZKU0kxbFgyRVJqeXg4KzVSVE15SHB6TC9pRlR0ZzFIU3dWMEZKRmZUdEM1bkRZSkhQMzU2VUM0T0FyQ3d3Sk1IR2pSQnJodVh6WVZ5ZU4zaGdMUWR0RHVRdk9vMFBYYytoNUxrZlpXdVprMEhKMmwvRVhCbHk3eXhlSG5ROXVRTS9RTzEwWWJRMHFhUExIdjNkaS9jL3MyRlhNMUJ6QklHYnR4YTBsV0NCZjZGalh3UlV0QllCallreEJkWXRhTjgraGZUMFRraVNkTTdmVTBtSWM1Tm5jK1RJRWZidTNjdDMzMzNIb1VObEhEbFN3YkZqeHpoK3ZJYTZ1anJxNjcxRjlQWDFEVGhkVHNudExhQ1hQQjZQSklTUWZac2EwQUJhSVlRT2lMVGI2KytKakl6OHc3bTY0Y3JLU3B4T0Y4bko3UzRZR0ZhVmxlRFdtN0hFR3M1N1cyNjdsZklhQjhsSkNTRzVQRFdWWmRnd2tKeHdaaHFQMjJHanZMSWFzeVVadmZiMHNvUHNOWlZVV2QxWWtwTFFCbjA2SGJZcXlxdHNXSkpTVHZ0YUYxSVVONVNWZ2RFTXBqTVlxbTFMcGpLL05JK1ZjMGIvZ3VhS20vTFNja3hCNDNyOCtQRVhZbVBqdGpRelBSc0F1KzlmcjlZbVNVN0ptMlFmQURaZlpZRS9UMDAwQVpxQjZHaHYvV2RjWEJ5SmlSYmF0MCttVTZkT2RPdlc3WlNMc3B5dHFHYlBmdlRjbUdnR0E1SWswZGpvTFk1M3VmeUY4UXFLNHZHWFdQbERzVDVRRlUyL0JkdTZYczBOZ0srKyttclB5SkVqVWF2VnZjOUZQK3ZyNi9GNEZJd25jcHFjQjlFYlRSZ2l0UmVrTFZrVFFVeDBGTTIvZ2Jvb0k4YW9NN2ZxWmJXV21KZ1lOS3JULzZwcWRGSEV4RVNqYW9aZGFxMmVOaWJUR1YzclFvb2tRNHdKZEdjNFZDbFp2V2s4WEViWEhsMVIvV0xtaWt4MDBMalcxdGErUEdqUXRadC8vUEZIVnl2QTVrM0M5Zm5WSkVseU5UTS9BNkRtTnovOUN4ejdBd1Z0MnJUeHJWblFObUIrbm11LzJqa0lIclF1cWFtcE9Cd09uRTR2clpIYjdRcFFHbms4aWcva3ZHRFdCR3BDZUpNbEZjVlhWNG9Rd3VWM3VxMWI5NzcwK09Qemxqenl5TVBxaUlpSWU3aG9wWWJsQzVkUjNZcUNiY25zeTZnQlBRbkwvMGpVc1l3ZE4rSVhPMWZxNnVwZWUrQ0JCelovOGNVWHpmUFVta0ROR3dIMWEyb2VmTXdkL2dobzh3UmNid1RVbjZzV3VzSlVXbHBIVWxOVHorK1FuT3NMZHVuU3hjZlo1Z3lrZi9nTDVQMmFtMjhUUWdpZjFrWkFsVk1VNFdjQ2tmdyt0emx6NXRURXg1dVgzSDMzM1hKRVJNVGRGK2ZiWStMV1NaUERJQktXY3pwWDZ1cnFYdi9yWDJjVnZQNzZzb1lnVGEwaGVQT0RHa0dWQmJJc3RSWUJEZmpWdklTUmhxQWEwSVJBV2tlWExsM08vN2Ztbkt2emtrU1hMbDFvYkd6MDhiVzUvRnh0QWMydEtaRk9CSUdiUUFpaCtJaEFRa3hVU1pKNDRJRXB4N1JhN1pJNzdyaURpeGZjd2hLV2N5ZDFkWFd2UC9iWVkvblBQdnRzUGFHQmdvQS96UWRxSWZscVhoTlViaEVCOVMvRTBwd3cwcHVyMXBiVTFBNTA2ZExsdkFRTHpqdXdBVVJHUnRLNWMrY2dXaU92MXRia2EvT2FwRDZ6MUE5dXdxZWwrU09sd2VBbVNSTFNQZmZjZTdTeHNYSHgzWGZmcmVoMHVudkNVek1zWVRsclVIdnRyMytkVlhBU1VHdVFwTkJWcG9LWHpndU9nRFpwYWswSnVERXh4b0JmelorcjFybHpaeUlqSXkvSS9aMno0RUZyNEtiVDZRTGc1dkg0d1MzQTFlYlgydnliRDhiRmlYUkJBYkJodzBhWEpFbDcrdlRKZFdzMG1qTU9LUHd2Z2dkaENjdlBTV3ByYTErZVBIbHl3ZUxGTDlwUHBLblJTbVZCRTZqSndyL0FjV2dFTktyRmVnVituOXFsbDE2SzJXeStZUGQ0RmpGM0Q1OFc3bVhPNm56K3VMS0FWNzc4SWNCRDFWaGZ3L0tQUG1YR3Z6ZnhsM2UzVTZ4RWNja2xsOUNoUXdvSjVqZ2FGSW5EOVkzVUNLMXZkWGw5OE9yeVFxUFJvRktwaFQrRDJSOTFvWW5EclJGd1BQYllZN1UzM3p6cUJidmQvdlNGbmhRSDkreWsybkd1cnVaazM2N2QyRTQ3NDZhY2tUbS80Y0JaRUg5Wks0b3BPZ1AyaDIydlBzSzlUNjc1MmIra0kzT2dxSlhuc1c4WFovQmNUMGZjekx0ck5GdEs3RC9wdVo1S0trdUxLS2s4UzdJNzl3R0daTjlNMlVrT09YNzgrQXZYWERNb1A4aW4xa0pUb3lVTlVYQmh1NCtHS05TbkZobXA5eVhnZXFzSzR1UE5XQ3h0NmRBaGhVc3V1ZVM4cFhXY08yQlQ2bGl6cTV3dXFSMjRJYU1kbTdma00ydHJDUUEvRkpmd2RiM00xZDA3a3gwcmVPQ0ZWUncydENVOVBaMW9uWWI5RFJMMUhzRVJSWVBSYU1SZ2FFWlM2UU0zdGRvUGJsNXl5bVlFbFkyQVk4T0dEZlZSVVlhWGJEYmI0NzZCdVNBeWUrelZGSlNjSzE3TVNpWU92WWtpKytrRFlXbEpNYzZ6ZUdFL1cvVTQweGVzTyszamJUVkhxYWl5L2V5QmJmeFVTR2hsRms4Y3loazgxOU1ZcVIxTFdWR1JSdjlVL1U5NnJxZVN0ZlAvd0x6VmhXZjlvU3dwTGoxUnVaemo2TkdqejhYR3htMEppbjZlRHFoNUpFbnkrSU1GTGMzUFVMSklmMVdCbjRJb1BUMzlKekhoWGpnZm0yemk4ZkhYQnY1c1l6L0tmYnQvZ1A2cGRPN2VrOGU3Ky9la3NtdnZmclorWDgxRDJaMXd1UVlTazlDTzl6ZXVwNkRjZ2NraytjelNRTm9IUHI5YXdOZm1kdU1ySmNVVDdIUHpwWVFBRUIxdFhIYjhlTFhkWkRKTjRUeldscGJ1WE1maU5aOVNXT0hFL3N5ajdEYkw1STY0bTJFNTNqTHBmVnRYczJUNSsxamxOb3k1ZHlxRHNydzVPb3E5Z2tYUHpHZEgwV0Zpa3pzeTd0NXBaS2NZMloyL2pGVmJ2cURFVnNPaU9YL0ZvcFVaT3U0UDVIVStkUUx0N3Z5bHpGKzFtWVNNcTVnK2JUd21OYml0WlN4ZTlESzdpNzVIMGNjeGVzSVVCbWVuZ0xPY3ArWSt6ODRkdXpoZ3JXVG16Ty9RSmZkaTVyMGpBaTlEL3NyRnJOcjRCUmphTW1yQ0pBYjE5UFhkV2MyU3VZK3c3ZUF4aGszNEk2UDYra3BmM0ZaV0xKelBwcDNma3RENWNxWk9teFFvNk42M2JUV0xscjZQRFMwWkEyNWkycTJET1IrcHVQdTJ3dkpOM2huY08rVFp3S290VUdLRFJYUEFvb1doNHlEUDEvWHQ2MkRaR25BYllPSTB5UEZYdVR2Z21RVXdaREFzWGdCMkEweWZCZW0rNFhoMThRc01IL3RDMDcyYzRybmFxdzZ3WVA0aTlwVFVram5vdDB3ZE55UlFjclZqM1dKZVhmMWZuRm9qZWNOdjQ2Nmh2VkdxOWpIbi83ZDM3dUZSbEhmNy84enNJWnZOWnJNc0lRa2hpVEZnaUNIRWlCZ1JJeUlpSWxKRVJLU0lpSlFpV3FyV29yVktLUzh2UHp6VUlxVVVyVkk4SVo0UUVSRXBJcVVVRVJBUk1VYU1NY1FRWWdnaGhHV3oyZXpPenZQN1kvWXd1em1BZUtLK1B0YzExNTVuWm1lZXVlZitudTd2d2hmWXRiV0N1cksvTTZ2bW42UVZYc2FNY1lOUHdOSmNMRi80Q0J0THYyTEkySXVqa2F5aGdvVUxGMU5XZmF3aFBqbjlxU2NlZldBMzBiV2ZMVEhtWjd1Z3BtdHdIQVZxa1VCQkFvbUowYUNtVlJYMCt2WmtpTDV6WUlzWm45WTNrSnQrVnRzUC9NZXBPS0l5S1RVSmdMeThQQlJGb1Z0S04rSmJXa2hPUnVkckN5MWg4QXFERzBBZzBDbTRpUzVkbktzT0hhcHI3dGF0MjIzZmxTcUlQU09QNGNOdGJIL3hFWXBLTG1OSXRwbTBETTFQVjc1aEVTUHVmSTBGaS82WFpGOGxNOFpjeGRKdDcxT2NZbWJwZlRleXpuY0Y4MmFPbzc1eUR3ME5ic2l5azk2ckg4TXRGdFlzZVpIaUlWZVFiNE9zNUpOSW9GV3FXUFp5T1EvZS9rdFd6TCtEeVhNc3JKNDNIbDk5SlkyV2JDYmZOZ3BmL1c1dUczMFpTM2QreXNBVU80T0dYb0hzMmsxbGJSK0dENzhDMlJhcFhYeHg5ZzNNMjJabndaeGJzWHBxS04xWEhnYTJMUzgveDhnbER6RWhleHNUeHQ1TWNmVzdaSmtWSHB4eUJadk5WekQ3empzb1hma29JeVkzc3V2bDJWQzNsUkhqLzRjRnovNmRiTHVQYlhzMHdjdk9nRzNicXNmWnNQZFF6TTJ6SzdmZE40T1VUbVpuU2pZTUh3cFRSOFBZZXlFdCtOMzBYakRjQW11V1FQRVFnc2MxYUY0dmc2bFB3TUpIZ0ZvWVB3dzI3WUVzU3hEWTVzRzY3VEIxTXRBSWpTN0FBZERBK3ZXVjNEZXZVSGZsZEhKY1BkV01IWHdGK1ZNZjR2WlJhU3liK3h0bWVpd3NtajZZeHQwckdEM3pGWll2ZXdpSDJzRHVhczJNbGEwcERCMStCZDd5RGNoWkZ6QjhlQkhXNUJNM0NWNDU3eGNzM0p2Qm92dCt5YnBGOTFLaG8ydHpwdjZNK25ObmZYSDk5YmJuUjQ2OEpsVDdHWnVuRmxwYU93SzFVRlZCWithbkJtcGRTVXRMSlRNemsxNjllcEtYbC9lRE1mbHZCR3pWK3ovaHNVOENQRG5qN0ZoN2xXZldiQ1R1N0FGYzJTTXUvRzZmUG4xSVQwOG5vYm1aMUZRNkNpSUV2eTBFaEtPbEhZSWJhSUNZbXBxMmZ2LysvYTZzck14YlpGaysvOXMrVUk2MFhwU2s5U0xOWmlTLy95Qks4aUtIYnVuQ3Z6QngxcXVNS01rRCtqTjE2Rk9zV0x1TDRpa0RhV3hvd0pxVlFrNXVBVVdGUmJvTE01K1ViRHQyczRWK0pTWDBQOWtLR3RuS3pMbHpLTTQyVWpqM3Q2U01lZzdYdlBIWWV3MWk1cVE4ZHU3WmpWdE5JVC9kemM3ZHRRd2NrVVgva2hLYTlxU1RiTTZscEtSRUI1TFZMRnk4bFFWN3ZtUllsaGtvUnZjcEJTTnZaTnFvSVVBeEEyZjltYjIxa0dYWnlzSjFDcHNyN3lYYkRQM3Urd05QOVBvWnBaN1o1THNiYUZLc3BHUmswUzgzblg3OVQveDNMQTRuYVdsdGJpTVlUMER6a3JPZ0pBdHN4cmFBbDVJTmRqUDBLeUhxdUM1NkJPNTZBZ1lIOTJ2MDA3QjZLOXcrTlBnRkQ5eTdDSWFreDJ5c3FaSktWd2JaK2lKYjJkYmhjUzFiK3l4bEdkZXdjdm9vWkdEdXZiZVNmOCtMTEpvK0dHOURJNnJGUmxwR05nVlovUWdmSW1zeUpTVWw3RnZ0cEtsWFVmUjU2dGhod1BJVkc1bTU2aUFEQzZ3VXo3MkhKYXYvRVBHbkhXcjhvTFhWL2NySWtUZnVwMjN0cDY1RWlsYUpqa0hOWURBSWs4bUkyV3pTZ1Zwc1VYdW9YQ296WEM3MVE0NVRCcllqWDFWeHl5c2ZNZmVtMGVRbTZHZWhZTU9tamJ4NlBKbmxOeFpHM2EwbFNTSTdPNXZFNHk0eU05Q1pvbXFVT1JwYWo4YmdvRFBtQmhJYWVSUGl6RFBQM1BiaGg3dWIrdmJ0TzlWZ01Bei92ZzVpZFhVdFpZdC94NjVuUS8vV3d0Q2gydlBwYy8vT2ZiUCtsMzY1OTJQSktHTFJzcWNZa3ZjTm9rTnlDdWxCZW1KSnk4RGFWRThqMExUMWFZWk9mcFRoWTY0bXhXNm13YTNnOVowZ3l1Q3VwVVpOSXllci9SS2VaSWN6UEUzTVpnVkZBVzlkRFkzZUd1NGNkMDNrZTBYbm9IckIyR3Nrejg3YXpheEpWMUJlNDJYNDFQdDVmTTdrVG5YWGJJNFUwdEppdmlIYnY1TThwT3BhV0RvTFZ1bUljVC85aGh5UW05NnVZeGxGL2pyYitSSlg2WGJHalA0MC9GNXgza1dvUVByUXlUdzRwb0twSXkrazJpVXorZDVIbVQvOVZLZHFFM1gxRmpLU05iK2ZNUzBOWjNBLy9YNy94b3NuM3I3bXhobTNIdEtabjNwUUN4ZTFTN1JSNm9nQk5STW1VM3NOV0VLeTNtMUI3ZnZJVmZ2V2dlMzRrWVA4WXZsV1pveS9ta3ZTb3AycDc3NzNILzd5dWN6VE4xK012WjNDT1lQUmdDT3JKejNQRktocUlJYXRoWUFzNUc4TG02UWRnVnNJRFVYSU5EMzMzSDZmckZyMTZwK3V1dXFxdzJheitjWnZQZG9peTZneFl2bFpXUmtVVGY4Yjk0NXFhd1U3Y29wWnN1SU5RR0g1cko4emE4Rnl0ajF4WnlSMkk2dHR0UGM3RDk3VVUxT3JVSlJqeEZ0WGc4ZVpRVEx3eExMSEdEUHJLUjZjM0Evd1Vibm16N0U3M21hL3NhV1RJZGRSV2UyalY5YkoxU2VhMHpKdzJuSjVldTFiWWZOUFA1MUd6WmpMcUJsemNkWHRabkRoNVd5ZU9wbGhuWlFFVnU3Wnd0cHRCMkpXazByeGlDSFl2NGx6VG03YjB5QXJIY1lzaHZFRlh6T1U1c2dteDFKSFRRUDBTdUdFeHpVci9ReFNCcVN5ZnVXOGRyWmhZOHJzaFV5WnZaRDYwbFVVRGZ3OVU2WU9wNWRSUDc5T05qamxJRDNGUzAyREI5S3NLSFYxTktyUTR2Rzg5TmpTZjd4OXh4MS9jSFVDYWw2ZFdhcVBmcllCdFVoaGU3eE9xY091NjFXUUdpeHN6NkZQbno2WVRLWWZQS2owOVlITmY1d1ovM2dUUzBadkdnL3U1N21EWUloM01LRW9pLzNsZTdqMXJjKzU0ZEwrclA5QWkreWNkY2FaREVoUFJQVTBzZUtqYWo2cGJ1S0lUMlZ2TnlmMnREUElVS045YkRwUUN6MFhJYXZUNzlkeTJiUkVYd0lSYkFzelFpR0VFR1BHWEhzd0x5OXZ3ZnZ2NzZ5MzJXeDM4QzBtSXVmbjkyTDVvZ1ZZUmhiUXEzQWcrVmxPcHQ3NUs0YmY5VXR5elA5RHJsTm01NmIxNUl5Nmg2SDVkbFkrL2lCa0R5UTN6Y3l1ZlZYMDZuK1QzbkFpUDBmaDhRVlBVTjgvZy93QlE4ZzVrWjlOOWJKZ3ppeFNiaC9GaXZsL1p0akUzMkVEc3JLemVYSHQ4K3dxa2lsYjl3VHJ5aFgwS2xlNXVYM1l2ZVFsWGh5UWpDTXRoK0VEQzhDWXhaMHpTcmhyeXEwc21QTXJyTjRhOWpYYW1EcXU0MTRFY2xvSmR3NzFNWG42SEdaTkh3V05OYXpkWHNYYzJiZmpLOS9Nb3ZYVkRDa3B3bE85bFFaekR0bk96di9POENtekdYNEt1cEc3dDBLakYxdysyTDRKR3F3d2NIQkVGVGcvQng1ZkFQWDlJWDhBNUNURDdUTmg2alN3emRlQ0Nsdld3K0Rib2Q4SkNYUWF3NGFtc0cxN09ZTkhSV3VIdFhkYzgwZE9JbWZ1cGR5MUlJOEpRL0twTDk5RHFUdU5lNmFNb0dycmFsYVYreGpjTDVmYTNidVFzN0pKMXMzT3ZGNW44K0NLZjdBcXcwMXlSaDZEK25YbU1yWXhjZUp3NXMrK242ejdmczZhUlk4b3h4WGx5VXR6ZS8vblVOc2VCWHBBODBxUzFDcUVhQ2Y1Vmg4b01JYVltb2lQRDVtZk5oMVQwMEF0MUt1Z1Q1OCtXQ3luaDN6aTEwL1FWZjBjOVJsSVRURGg5U3Q0L1FxdHNwbmlEQ2ZIbTF1dzJteVlSQ0Q4V1ZJWEp6bEpGa1NybXkzN0QyTkw2c0xaVGl0K0laR1htNHZUS0ZBVUJWV05sRnVwcWdpYm9qcXlSb2k5Q2RIaDNnbEprZ1FnR2hvYTFBY2VlS0RzdHR0dXJiSmFyVDBsU1hMQ04wL1FMUjV5RlVyZFBqNnRxQ0srUng5eTA1UG8ybk1BVnhZNVdmUHFxMngrdnd4clpsK0dYbndlaVhFeW5vWktOcXovSnhzMzd5U3JaREp6ZmoyYU9EbENFUzRaY1NVTjVYdjRmSDgxcWIzNms5bjFCQk5EVG1YVXNETjQvcG1WT00vOU9RL2RNNTQ0R2ZJdnVCUlJ0WU5YMy9nWENmM0dNWDEwRVQzN0ZKT1ZyR1Y2SitXY3g0QXNpZDBmZlVxZHg4ekY1Mm1PM1lKTFI1TnJxZU8xVjEvbjQyb1hGdys5Z3V4VTdkZzRNM3BUa0pNYTN0Yyt4UmVUSEM5VE1tb2Nscm9QV2JWcUhaOGVPRWEvUzRaeVRxOGVHQ1NGRDdmOWl3M3IvMG5aVnhKL1dQQW81L1ZJL0U0bTd0c3Z3MGNWMFBkQ2NCK0U2aG80ZDFBRTJDNFpBUTNsOFBsK1NPMEZtVjBoNjF3WTBCMVd2UW83UG9LMFBqRDRmTEFZSXJmNUFRTWhycDN0WlhmeE0rZnBYVXdiZTBuVSsrMGVWMU1TMTQ2N2lzL2ZYYy9hdHpaUjN4ckhrS0hET0NQVmpveVg3WnZmNXEzMTcvQmxTemNlL3NzRG5Ka1VPZWVaNTVad1Z0d3hQaXdyeDIxMGNuNStkcWZINGV5TGhtRS85QUV2clh1M01tZncxWSt0WC9uWSs4M0hqM2VrMEtGUDUvQUZBUzBxK1RZMitobHF2aElmcjVtZmlZbjJvQVNSSmhTcEJRcDZVVkJRZ00xbTQzUVozNW9lMjZtT1k4ZU9VVnBhU2tYRkZ4dzRjSUM2dWpxT0hHbUkwWEZyQ1JiV3QrTHorU1IvVU10TlZWVkpWZFdRbnBzQk1LRHB1Wm1FRUhGb2M5UlNWdlpKVVc1dTdoU0R3WERwRDZISDl0UDRNUXdQZDQ2K2tsRUwzMkpJdHZXMDJqTkZVZjY5ZmZ2Mk5SMDBNKzZnVDRId0MwRkFsdVdBUHZtMi9UeTFXRjIxVUVxSEZ2MHNLQ2dnS1NucHREb214aDk2QjVLU2t1alRwNC9POU5TYmxsRkVUVS9mSk5CNkoyaW1hZGpKSVVKK3Q2QlpxZ0pxZm42ZjNjOC8vM3p0bURIWFZBRTNuODZYVC9tdVRleXRhbXpuRXp2RHhnN2pwMEt3SDJwWVdiajYzOS83Vm4wTkZhelp2S2ZkejNLTGg1TGpORDcvK09PUGI3cjc3bnVPRTUzT0VXdCs2dHZrK1NWSkRrZ1NxcjVNcXIyS2dsQ2VXcXo1cVJlTFBOMUE3YlFBTmdDSHcwR2ZQdms2VUpOMGoxSVk0Q1JKQ2kxQ2tpUko4N2twUVVCVFVWVWg5UGx0SVo4YklHNjQ0WVphNEsrZmZiYXZ5bXBObUE1MFB4MHZuNHk4SXV3WjdVUXpaU08ybjlEbC85d3cyak1ZVkdLakhidnFLN2ZIdFR3eE1Uc2s0NjFQNTlDYm9PMzEvZ3dBQWEyeVIxYmJMMmpYZkdvaDh6TVUvZFNZV2dqVThyL1Z6bEkvT21BRDZOS2xTekQzSlFKbUdvaUZtSnNVZmgzTDNBQkpWU1VWVkNrRWFucm1CcWhCOWlaNjk4NWJ2V25UcHFydTNkTnVNaGdNUTA2M0UySzFPYkgraEdBL2pkRDl6R3doSlNiUlQxR1V6VHQyN0hpanBPVGlHanJ2enE2dkpHaXY4VXFvcVhHYmlvSkk4bTFIZ1lKOHVuVHBjdG9ldCs5TTNlTlVSbng4UEhhN1BhemZGZ29raExJNk9nZ2FkSll3RTdadFF3QUhpR2VlZWVhdzFXcmQwYTlmUDgrcEtJVDhOSDRhUDlRNGR1elkwdnZ1dS8vMVcyNjU1WWpPOUR4UnpXZFVNYnRPZWlnbW5jT2k2OUllS3oyazk2bjFPYTFCRFU2RDRFRUhKNDlQUGluaml5KytvS2JtQUhWMWh6aHk1QWhOVFUyNFhDNmFtNXZ4ZUR6dEJCVDhLRW9nRkZDSURTb1kwWUlLWm9KQkJTRHV3SUhxaTN2MDZERlprcVJ6Zjdwc2ZocW42MUJWZGM5bm4zMjJLaisvVDNtUXBjWDYwL1FtYUpUcGlTYmpIV0pxSXRMUTJFVEhQalc5K1JuTjFFNUhuOXEzeHRpYVhDNE91ZjNZTEdaa1BXY0tLTlEySHNNakROak0wUm02clMwdEhHeHFKaTR1RHBQY01kR3lXQ3c0SEk1d1Q5TG82Z1RDdnJpWTVHYXBJL0lXU2dIUm02YWgxNDgrK3VqQmdvS0NuVGs1T1g2ajBmaTlnNXVydXBSM1BxN25yS3lVay8rUnQ1NVZhM2JROCt3enYzSHprTk5wVk8zZHl2cDN0bERYWWlHblI5ZnZmd2RPOGJodVhmc2ljbG9COXJqdlpyZmNidmZ6VHo2NTlPV1JJMGNlcFAxNlQzMHFoMWZxdU9lbnJ1N1RIR1pxUXZGaHRqbXcyeEpJVEl3MFh3bEpENFZVT2dvS0NrNllKclYzeXpvQ1hYdVNhSlpBYmVURko1OWg2L3U3cVBmWk9DdnorOU5qKy9vK050WE5yLyt5a3QxK002bHhBV3I5OFR3NjZTb3VUSW1uNXZPUHVlN0ZIVGdkZGp5dTQzVHYxWmUvWDFkTW9neFByVnJGa3JMalpEcmlPSERVeXkxalJqQzFUOGNYYzJKaUluMzc5a1dXWldUWkVIeU1MSktrZjR3RUZDUkp3dS8zaTJDRmdoQkNvS3BxVkNBaHFQR21DazA2SkhEZGRlTnFnTC9WMUJ6WW01NmVmcE1rU2Q5cVo1VDFTMmRSa1Q2ZUdTUGFwcnpYNzkzSXdnMUdScFFVblB3S1BWWE1mM0FwZzhjTXdmbGZCRng3MWl4a1ZXTUJjeWNQYmZOWjNiWW5HRFRsT2FaUC9obHlpdWM3MjRmYTdTOHpkN1BDNC9kTytKYU9xOHFLQlg5a1ZNRjRNcjdsa0xXcXFoOTkvdm5ucS9MeXp2NU14OUppTzdOM3hOSVVTWklDUXFpcUVBalphRklOQmdPUkVxbElubHJkb2E4d2RjMGlNVEV4cXFBOVVpYWxWUlFrSkNSMGZsK28zc3prV1Mrd1pjdUlrSWNRbTgzRzNnMVBzYmJDd29pQmVhY3hzTWttYmhrN21vSk1MUnF5YXQwYnpOMzRNVzlOS01icVRPZlYzOTVFdXRXRTZuTXphY0Z6dkZTZXg5UThPeGRlY0JFM2pFN0ZMRVBOdmc4WXRuSXIxL1FaUTJmMzVZU0VCQW9MQzlGT2lJekIwQjdJU1VGZ2t3bUtVNkpGVFAzQm9FSzRJVE5ocE5NWW15cEpVaWlvb0FLQmpJek16VTg5dGV5VGNlUEdqYlZhcmRQYXZYczIxVlB2VXNuS1NvczZlQ3JnZFRYUTRKYkpTbzljRnFxaVVGMzJBYVcrSVNpS2dpd2JrZVh3eENWNytBeldqelMydVZqY2pmWDR6RTdzc29jNnQweEdpajM4bVdMdng4N3R5OXRVQUNsS2RDbU9iRFJHdnFQNnFLbXV3WktjVHJMTkVyczVrRlhxcXFzd090Skp0bi83MmVPcXFsQlg5UW03YSt6dEhBZUZuZHZlbzkvWVc3aG41bmhrNDhsTlM4WHJvcnEya2JTTW1ENmxLcWlLbStyYUp0S3pNOEsxcXFxcTRxNnRZTXR1YjNBZnREbDB3dVBxZGRIZ2hqU25tWnJhSnRJejBzTGZVUlNWUlJzL2JWTzByeXBLVkNSVC8zOEJtdXFxY2N2Mk5uMWVRMm9vQi9lWFAvMjNmNnpZOHNEL20rc21FaURRbDBmcHpkRDJURTlWa2lSVlZUWHJSS2dpdXBteDJZd3N5OFJackpoa2lFK3c0WEE0dE1WdXcyS09JeTA5Zzl6Y3M0SVZCV1p0RHRVMmtwNlJSa05OTmJhMExLeTZVL1hzd2djWU12bC9JdEY3MmNISUNST3hOTDdMM3FvTzd0Rk45ZFM1RkxLeTBxT3VKOFhycHFhMkhrZEtPbzdZK1JvOFNvMjExZmdzenFnZXJLclBRM1Z0dzZsRVJlTW95SXh3N2l4bkV0NURmZ0NjWFNNd0pac1R5TEFiYWZGcEYxdGVqNGlDWm9yVGpxejRhVDJScGszUUxJMkFteUVHNUNLc0xjTGdwQkRBU1pJa2lkREZIZ1E0Z1M1aTJnNTdVMjYrZVVyZzVwdW5QRmxlL3RrSE9UazVFd3dHd3lXaGcvbjBmVDluenVwSzh0TmtLdHpwckY3M0V2bkpabFkvY2lPelZoN0FialFnZTZveEY5M0N1bVV6TVZkdllmaVUvNlZtMzI2YWJIZFRzY3BKOXVBYldUcHJFdUJsOXFSUmJOejdHZTdDV3lsZEhteFY3dDVEYnRiUEtDakpZL3ZlUmdiMFMyUGY3cjNNVy8weFk0b2NySHg0Qm8rdjJjRzJLaWZWTlc4VEp2YzFXeGcrL3Y2ZzRxYVAwcDI3V2JUOUtKUDYyYWd2MjhDWThiL0NuSkZQVTBVWlEyWSt4aVBUTk5ha2xMNklZL3h6VE1rOXh0WWFnYWRSWWNXdUhmVDdOcVA0M25JbWpmb1ZaZFdsVkxtM01YejNDMWh5TDJmdGtudkFWY3I0c2IraHZMeVVHblVYdzdjL1E5SG9PM2hreHNnVHNyOHhNLzVHZm1FT2UwdHJlZVRGTnhrM0lJdW03VXZKbWZBWVJTbFdMRmFGZmU1ME5teDhoVjcySnU0WmZ6MWI5MVZRVmFjeWZQaDc0RHlIbDE5K0JDZDBlRnduRCtoT1ZmSUFxbmZ2SkcvQWhiZ3FQNkpvMnQ5WmZOc1F5amNzNWJhSG4yZnY5dTBzMmRQQzJIRDFrNHU3eHYyTVhmVWF0Rlh2MjgzUVdhK3c3TTRScUs1S3BvMjlqdDBlSnc1ZlBSVDhuTFhMN2cxV1ROUnhjV3IvLzV3eHJPak5GNWF2cStxQXBlbk5VRjhRMEh4NmxoYTZhVXRhdUUzRW1ReWlWVkVKOWYwMEcrR3Iyb09vQmhQeVY0ZVFWTEFtSnRHMXE1TkRuL3lIMXlzOVpHZWs4UHd6eTdubDBaYzU3endMeSsrOWh2bWJtckc3UDhXWWNSNDI1U3ZxazY5azk4dHpncGRIUFMrK1hNYnNlMDgyRnVmbGlhY3h2RGdBQUNBQVNVUkJWSHR2NHBGMVZlU21tS2wwSmJOcS9TdmtPWTFzZmZvK0pqLzhOZ1c1NlZTWGxUTHd0cit3K003Z2ZHamFSWGJlcll3ZG5jcUdYVWRRWEkzTVcvTVIrYVdQTVB6aExSUTVCRTFOdGVnNlJwM0M0anZPclF2L3daSlBEcmY1ckhaL0tSZk9mNFVEM3RqZkJYaDY1VW9tdi9ueDE5cVdxZ2I0K09POXZQYmFheXhhOUJmdXUrLzMvUEtYditTNjY4WXliTmd3THJwb0lFVkZSZVRsOVNZN081dnUzYnVUbkp3c0pTVWxTUWtKVmlrdUxrNDJtVXdHZzhGZ2xHWFpKTXR5bkNSSlZrbVNFaVZKNmlKSlVncVFBZVFBWndORnZYcjFHdERZZU9UL0NhSFdOSCs2U25UdGZxSFkzNndJSVZUeHQxOWRLbjUyLzdOQ0NGVzg5cWNiUkxjTEpvdmpBVlVJZjRPNCt1eXU0cWtkRFVJSVZRaWhpaWQvZTRXNDViRXQ0ZGY2NWROWFpvcytOOHlQdkhkOHR6aXJ4Nlhpc0ZERXplY2xpWCs4M3loZWUrQUc4YXZITmtXK2MzaUw2TkhqTW5HNG5mVUpvWXAzSHZ1MU9QZnFlN1Q5RVc1eDgvazl4RU52bGdvaFZCRTRWaXJPeXp4YmZIQk0rNjcvNHhYQ1lPZ2lubnEzV3Z1OTN5TmEvTzJ2VndoVnZQLzhiSkdhbWhxemRCZFAvcnUydzkrRWxyZi8rZ3R4MWUrV3RmdlpHMys2U1Z6N3h4VW5YSWNRcWhDQk9uRnBqeTdpK1EvcWhSQ3ErT1NWMmFMYmhWTkZxMURGMGZlZUVJYjRzOFNPdzE0aGhDcisvTXVMeEUwUHJRMy85dlBYNW9zKzE4OXVmNzN0SE5lYkxrZ1ZyM3pxRTgvODdpcHg0NTlXaXlQdkxoVjlycHVyKzUxUFhOOG5RYnp5ZWZ2Nyt0V0hLMFh2M2lYaTQrRCtQSFgzVmVMSzN5NFRBYUVLSVR6aWpzdk9Fbjk1cDFxb2FxQ21ydTZqQlRMOEhCZ0xqQWF1QWk0SEJnRVhBRVhCdVprRFpFaVNsQktjdTRtU0pGbGxXWTZUWmRsa01CaU1KcFBKWUpRbEdja2dKZGtUSkFra1oycDNzck96U1hQRVliS25jdEZGQTdsODhQbVlKQ2k1ZWhMMzNmZDdIbnJvSVY1NzdUVSsvbmd2cnJLVmRPdDlMYzFDNWJuZlhjMnZIOXZNbDI4OFRPWlZkeUlDNVp4NzVpVWNDbDZmZ2YzcjZOTDlNZzYzYysyKy9kZGJ1T3EzeTZMZSsrTE5oOG04OEFhTytyWFhyLysvNi9uWi9Tc1FRdVg0c1NZQ29mVWUzVTdQcnVmeVJmQjc0dWhPempDWitNTUx1NExyOHRMU3F2RHBLM09KUC9NS0RyV3FDT0g2Qm5sc3FwKy92Zm9XU3E4THVDVS8ycUJzYnZ5S1cxLytnUHR2dUlhTUdJZnFlenYvdy9NTmRsNlk4dlgwbWlSSm9xQ2dBS1BSaU5Gb3dHQXdoaG1jTE9zZm8zeHhZYitiSkNraDlpWlVWUTByaHVqWVc2aS9RaURFM2lvcUtoU25zK3VxdDk1YTkzN1hROXRIT3dkY2VsTjJVQ2wyNkpETG1QL0VibUFpQU1XREJtR1RBZG5KNElFNTdOcGR5dVRpUWFkMGFHV2JIUnN5ZG9jZHU4Mk96V2JEN1RrNW1lN3FyYzh5ZlVrNTY3YThvZTJQcTR6TmV6ekltNTdqM2kwYTgvUXAxWlJXdU9uWFQ2UHc1cHhCakI4WWxPQXdXdWpNRU8wL1lRNTFFK2I4c002NjJyM3M5ZVF6T0ZpOW5qOWtLTWJKdjZaYWhXVEFuaitRL3NtYUFUcGswTVVzVzdzTEdIR0tHN05pc3huQmJzTmhjMkt6ZS9DZTVMbndOWlF5YnZ6OXpIL3hYeFFFOTJmVHhpMzRjck81Nzk3UEFDaDNxeHg1Zi91S0ZWKzFicGs0OGNhakoyQnBvUnBQbnlSSm9UU09nQzdxS2ZUNWFUN0ZMNHh4OFpqajRqRWJQS0xWRDlhdThiZ1ArZW5hb3p0MmV4SjJleUtaOXQwa2RVMmhSNDhNRWtRakx5NWRUSFdEQjFWeDA5Um9KOVNCd1c2elkzWFljZG84SU51dzRpYmtEZlUyTmVDeE96aFpvcjkxODcreEl2UGdyTjlySExleW5sTHZIbUE4YWxNRjk5NzFKM2FXVmVGVmZkUzdHMmh3UTA1bzVaWjhKbzN0RjN4aHhoTDBOV1QzdjRBVU00RHRWSUV0d0l0dnZNVi81RE41NnNyOEtHdXkxZDNBcmM5dTVOcXJyK0txck9oTTA0LzN2czhmdHJ2NHg5UVJkRDFGWlpPOHZEeEN6aytqMFlqQkVBSzZpSm1xK2VIQ3ZqZ1JmSlNDRVZHZGJ6WUs0RlFkd0lYQUxRQW9WMTQ1WWord0pQT3lYNzZyS01xMVJxUHhpcE54S24veklVZHM5Wk5ZbmFkMk4rT24vSm5GcS85Rkw0Y3h2QitxT1psaFk2NG1LN2lxMGFPdkpTYzNVdThvVzIyY3JGZHQ3K29GVEpyelhKdjM3MzM4bjR3ZmtNS1BiOGpoaDhqWk9BbFpJYVdKMjhmZlFNbnNweGhUbEJhMXZnRkRyMlprZ1ExRlVkNCs2NnhlRzZaT0hYZGdlUVRRT2dJMXZZOU4wWm1lWVg5eHFFK0lMQnVFMFNEd2VrSDF1a1ZEYXpNSWdiL0ZTMEtDalRpempNbHFvMHVYTGppZERxeEdpYTZwUGVoNVpsZm0vZklQWEw5c005T0hGV0NzMzB4YXdSOWkvbTM3YzlKaXQyUDJ1SEJCMjhDTDNON1ZvWkpWZERHalI0ZHUvbGN6MVpFQktOdzM2V29zazU1bnd4T0RNRk5OY2ZKRjBkUGZhc1BTRG5MSnN2RWJCQThRdlBuMjI3eDBQSmxuZjM0ZThicWRWanhOM1BIVWVnWU9HY2FOdmFQLzN1ZmxIL0diVFFkWjhvdVJuR0g5WmlyNFBYdjJ4R3cyQndIT2lNa1VEWER0TUxjZ3dFbFNSSG84VXFFUVltMjZ3RUpBeDk3Q2srakFPMDkrWURJOVdWcFRjK0NkdDkvWmVGMi8vbFBDU3IwN3QyekJyVTdHcGpheWVWc2xvNlpHWktSdFZodU5EZlhmN2ZYbnEyZjZ1QnNZK2VBTERNdlhIWHQ3QVVQeVBWUzduSXdicmtudXVCc2FNTnBPN1J6a0RadksydjdqMnN4Y1o4cUpRL2xXYXlJTkRWKzNvNU9QaFRPbll4MHlnMmtqZ25mcDlBSUtyV1ZzM3QzQWhIN0psRzNhaUZKNFBsa3llQUJYMlZaMk5mZ29UamF6YWN0LzZOL3Y5NUY5c050dzFkZWc4RjJXM2Fnc3ZlZEdhZ3AvelpJSkE2SStHVEowSUs5K1hyTnIwdUNTTjN1ZmxmdHA2T1laQTJqdGdKcmtseVFOK0lRUUFRRUJPWnh3aXhvSXFBTEpnTmxvRWthakVlRnJCdGtrenNoTTF3UWlaUzhmZi9ZVlJsc2k2YWxkK2R6dG9WdTNiaml0WGc0MkJSaWVjU2I1dVFrY2NYZGwwTUFDak1EMmRldW9QOG43czV6ZGowTGZQc29hb1NRRzJkS2MzYW5jV0JVbEV6OW84Q1hNbWY4WmVmM3ZRYnNISzVwc1BoNnFxejFNTFNuR0xFUFZwalhzUFlXbVhWLy8zTFljNG9GTlgrQ3l4REZrdnFZUWF1Nld3N3ZUTDJYSGh4K3lzZTQ0SDd5K2xuKzhIbVFIbHcvai9nR1ovUDJ0OTZodGxMbGg0VFBCRmNXemJPWUUrcDVpLzlUTXpFd2R1Sm5Ra2cyTllWTTFtc1dGZ1U0SUlhUmdQYW1RcEVBb1Z5NGNXTkN4dHhEQVJiRTN3SitSa2ZrdjJSai8zcjgvZVg2WUVPSTZJQytGU29ZTnVneWpwd1p6eWUrWk1DQnlkb2VOdjRWRjQzNUYwZW9IeUJ0MkN5L09uMHJkOWhjWk8vTnZlQnFxcUdxUUtTbDVrNEtSZC9ENGpFNzB0N3o3R0Rmc2w5UjZYZFRYVnpPeTVHTE1HUmV6OGNYNTFHOTZrZVc3NmlpY2V6TXZ6OVZPN2J3Vi8yWmt2cFVIbi80SDQ4Yi9qRFVMOHJENDZxbDI5MkRqcnBWa25NSnhOMXZ0WkZoUExhK2gvOGhKT0I2L2dZS2lGM0FXWGNPV3AyZWRGTEJ0WFBrY2pyUlJFV0NUMDFpdytBK01IWE1oS3dweUtDMnJaZkdLTnpHakFaczl6YzY5SXkvRmFsVXBkMmV3N3BHSVFtMzZnTkVNNVJvS0M4L0RsbjRCNjljdndkbkpjZTFzeko5MkJldkszT3lyOUxCMzNFVXN0RHBZc09wTml1MTdlWERSZXNpcm9WL1IzN1RyWU9aZitlTU5GMzAyOUJlejF2eXE3NkFQZXo4Y1VIUlJUTDBpaHkrV29VbmdGNW9haHhLY2gyb0UxQ1FoeXdoRkVVSklNbWF6ZGowY2IzWUpjMEp5dUF1YzFlckVZVHlBcXpXTzR1S0xhRmozVDE1K3pVVzgwWVN6YXp3WlBmUEk3Tm1MbVZOeUdUWGdRb295ck1qcG1hU2Q3UDFQem1EYzZDeldiOWhEeWZqb2JLbUNVVk1ZdU93YWN2SmVvWERFcmF4Wk1JT2NFYmN6YTh2TjlDODhuNEplNlZSVjdtUEVQVTh5ZjlJZ2JydHpBbE9IWDhDeWdqUzgxdTcwT29XY3B0T3k4dURyaktOSGoxSmVYazVWMVpmVTF0WlNYMTlQWStNUm1wcU9CV1dQUWxVS0xYaTlyWGc4SG53K0gwS29rdGFoWGlFUUNFakIvZ3VoYWdVcFdMRWdCOEhmQ0JpRFZRc210TW9GTXhCMzMzMi9UenpiVW5INTZzQTExeTIvYTJoT2cxY21JK1YwekM1VHFhdXBCb3VUdE9RZmgwYUk0blZUVTlkQVNrWVcxbUMrUmRQMnBlVE4vSURhVFgraXBzNUZla3dhd1E4eGhCRDdEeDgrdkdiT25EbTdIbnZzOFZhZEtlbHJ4L1FNUGZxREVVOUZ0Nmg2WDFxd2lvQmcwbTNRZWpHSEdobGpzVVM2czJ1cXQ0azRIRWs0blYxSlNlbEt2Tm5DMmVlY1IyR2YzbEVsVWszMU5iaXh0VWxGT2RGd2xhMmhaTVlHZG01YWZOS3VEYSs3aWJwR0YybHBHVmgwS1R2dXhub2FQREpaR2NtbjFPWE0rTjgrdWJ0MDZVSmhZU0Z4Y1hIRXhabkRkeXc5ZzlNek55SFVVSWNySWN0K1NaWmxGRVVSZ1VBVWV3c1YxOHN4NW1rQVVJTG1xUi93ejUvL2dBOTRyZmNnOFk3M3p1RkRlM1JMdWhib2Vmb2RLWm0wak93ZmxmZkxhTEdSbmQyK1lvQnN0cEdWWmZ1aEFhM3k4T0hEYnp6ODhNTWYvUG5QQzd3NmdQSjNBR2l4Z1FGRkh4d0lBcHNJbFVVRjVidlJRRTNMVHd0V0UwU0JtczJtcWQ0bUpZWDZFMmdkMnJPenMrbmR1emZ4OGRGbWt5TWxnMVBKOXJIbmoyTGhqRVpxWFNvNUo2bnJickU1eUxhMTNack5tWUx0Ry9DRC8zckdwcHRFZlBiWloxUlc3dWZnd1JvT0hUcEVRME9rdnRUdGR1UHhlSEM1anRIUzRrVUlnYy9udytmejRmZjdKVVZwbDcxSlFnZzVDSENobWxORGtMMlpndXpOckYvdXZudG00dTkrOTd0TG5VN24xWklrOWVHbjhmMnl1S1lhdHV4ek1XUkEvZy9IalZXMXJMNitmdjNzMlgvODhNa25uMnp0Qk5CaUYzOFExTm9ETkQyb2hWbGFFTlJFTUVjTnZlUlFCTlQwMVFTcDlPaVJRVTdPbWZUdTNmc0hiN3J5WFkwZkRiQ0ZSbFZWRlpXVmxkVFUxRkJYVjBkRGc2Ykc2M0lkNC9oeE4wZVBIc1hqOFNDRUNCYlF0K0x6K2ZINy9TRmwzaUJ6QzBpcUtxUmc1RFJrb29aQ1FnYWRlZG91d09YazVKaTNidjNQeGFtcHFWZkpzbnpoVDVEejR4K0JRR0Q3Z1FNMTcxeDhjVWxwVGMxQkpTWXcwQm1vNlFFdDdFY0xWUThBUWgveGJNdlNUSmpOY2VnVmI2MVdmZDFucEpGeFJrWUdPVGs1Wkdkbi82alBoZkhIOW9leXM3T0pqNC9IWW9rbkxpNE9zemt1SEdRd0drMEVBZ0ZrV1VZSW9UTlRXekVZREtFN1lZaTlpVUFnZ0NSSm9ieTNrRWtxeHdZWFlzeFRIMkN1ckt3MHA2ZjNlQWZZVWw3K1dWRjJkdlpRazhrMDZxZkwvOGMzV2x0YjErN2J0Ky9kb3FKejkrdkFUTS9TZk8yQW1yOERRQXZvVWpqQ1ptY3NTek1halVHV3BvR2F4V0xSeVhnbllMTWxrcFNVaE5PcGx4M0tvbWZQSEZKVFUzLzA1OFQ0WS94VHFhbXBXSzNXSU1CWnNGZ2lBQmNJS0JnTUJsUlZEVWRRdlY1akNOencrWHhDbHVYMmZHOGlhSnJHUms4REJKdGlvSVhpVFhxQUE4eTV1YjEzQW52ZWVXZmpTOFhGRnd5eTJSS3VnbE1LU3Y0MFRoL1hSODN4NDhmLythOS9iZDQ5ZXZUb2hnNEFyVDFRODNmRzBEb3lPME1zclgzVFUrOVAwNElFU1VrT25FNG5LU25kNk42OU8xbFpaOUNyVjA4U0V4UC9UNXlmVXpaRm0xd3VqdmxsZW5TeFJSY0FCeFJxang3SEVKOUFha0owcjhxV0ZnLzFiaC9KamlRU1ROTDNNZmtvTHkvbnl5KzFpT21oUS9VY09GRE4wYU5OcUdvQXQxdUxtTGEwUkpyRnRMYTI0dmY3OFBtMGhqRTYzeHVoNWpGcVFLQUtJUWZibVlaTTFJNThjSHBUMVFTWUoweVlZUG5Ubng2K0lDVWxaWWpSYU94UXhYZlA1dFZZOG9hUmwzYnl6VU5xeTZCQ2dVR0ZQNjZKV3JGck0ycEdNYm5oWTZHaUtGRmw1aGlERS9GRUpjaXFxdXFLMzZNK29iNm1HcC9aMFNZaTJOUlFRNk1iMHRMVC9uWG9ZTTI3di9uTmJ6NTkvZlhYL1NjSmFQNTJBQzNRQVVOVFEvWE93UUFCMFN3dDByeTRyVDh0b3FQbWRHcEJndlQwZE00NDR3eHljM08vVTM5YTlkNnR1SjJGNUdlY0hoSDM3MDIyYVBucVZUeTJyNW5VUkRPMWpjMU12dnBLcGhkK3QyMEhKRW1pZCsvZUpDUWtCUE41NHZINy9SZ01SbFExRUpYa0c1azhCbHBialJnTVB2eCt2OUMrTDB1S0VrQlJGS0g0QXZoVkZVa1NLdHBOTmF3V0VzeDNNd1FuYTRqQkdZT0E1Z3NCMjRvVksxcFhyRmp4TDJEcnhvMXZQM1grK2VkZmtKaVlPRlNTcENoZGwvVlBQMFR5bEFGZkM5ajJiWU1WalQ4dVlGTmQ1VXlaK3Y5WXNmM3Q4SHNyNTkzQXhBZlhrK3l3aGFmeUkycytZbnkvUm9wdDV6SnYzMUdHdDhlSlBXVVVwQlZnSC9jdzI1Zk9qQUJYeFZiR2pidUpXbU1HZHFVZXVmQm10ajU5RDNqcnVXUEMxWit0L3NTM09jblEvTkhIbjVZZjBZRlNlNERtN3dEUWxCTUFtbWcvT0dEQWFEVHBwWWFJaXpNVEYyZHB4NSttS2Q1MjdacE1hbW9xR1JrOTJQMzZZdHpYTGFMM2R4d2tzQ2sxakptK2xtMXJIOFI4R3N5WlUyQnNyWlFlYUltU0xYcXlLWlczSmhUVGVPUUkzbmg3bEd6UjRORTNNRFhQVGt1cmovZzQ3UzhmMmIrWGk1Ly9ndi9NdW9idlMwNndxYW1KeXNyOWxKYVdVbHRiU3lBUTRPalJSbzRkMDRJS3NmbHVRV1hlVU5RVVJWSHcrLzFTOC9FQWZqVkFuRGtTUGRVRkdDUWhrS0ZOa01FUVpIREdHQllYdFh6ODhkNjhuajE3WGhnZkh6OUVWWlIwVmNkQ1Rnb0FWRzJSalRHTUpVaGgzSTNRNUlPTXRLOEpMRjZvcW9XTWJBaWxHbm1hb0s0UjByS0lrcTRKMWI1VVYwRnlCbGgxczF6eFFuVWRaR1czdmFPcXdjOVMwcU4vQTdCeDBUU1dOQTVoMVp6eE9tRDdPUXRyTG1IcjQ5TmoxbFJGLzA2QXJYTHRnNHhkc2d0MzJXRTJWL3liZENPQW0wbjllMktmOWhLTHB3MEdvTFMwclBiTU04L1kvTkpEMHo3OHhmKytVQjN5cVo0RW9Pa1hKY2pRQXUyWm5BU0ZUNE0xelRGbXB3R0R3UlJzV215aUk5TXpJU0dCUkpzVkNZa3VLZW4wek00SUJna3l5YzdLNHBGcEEzRk1mcE83Um1SSHkxZ0I3b1phR3J4bXNqT1MyOHlWeHJwcUZHc3lLZmJvbTZxbnFaNjZKaTlwNlJuUlVsSDRtRDZvRDRNWHZzLzRmajk4ZzVmdlRiWW9CR3FoWTJjMHlIeWZnV2FIdzhFNTV4VFMydXJGWkRLaEtIN2k0eTNFeFZtQ1FRYk5FZHZjYk1Kb2JNRmtNdUwxYWl6TzUvUGhiL1Z6cE1FZ1ZGV1JCQXF0cllxUTVBQm1rNHFFSkh4K0RkeENRUVpaRGdjWkFrSmdBQ2xZeFNOQ3pLME55UFh0VzdnSCtBUjQrb0lMTHVoNzRMTVB6Ny83aFlyQmR3N1BTRCtaL3podE9PeXFnT3dKc0hwZTVQMTd4OEFlR1ZRM1ZKZkMwRm13K0xZVHIrL3BtYkNxQ2VwM0FsWXdGc0RXcGZEd2RGaStCM0pTb0xRTTVqd05FMHZBdlFjeXhzSElYR2h3d1o0NjJMSUxjdTFRdHhzR2o0YU1RdTJmNzlzTVc1c2dHOWorTWt5K0Yzb1ZRUGsrbUw4Q3h2WVB3eUVyVnJ6TzZFVVBmeXZ6WU0zcU54ZzY0Vkc4UzY5bDdmWUdwcFVrNDkyM250VVZXZXlaZkVtdHgrUFpVbEh4eFVmbm5IUE9majI3NmdEUTJnTzIwSHVob0ZJZ0RHaXlyRXBDcUdxb0l6Z0lKRWtZVFNZTXNpUzhMUzNJNWdTNldPUEEzeXdhanJySXpNN0dhdEZBeldLSkl5NHUxSkhkU2tLQ2pYakp6ZXN2djRFMTdRemkxR1pTaXNmeDVKekIyQnAyTTI3OFBaVHZxY0ZZZVJNYkZsa1pNUDV1NWswZEJrb2pzeWRmeTh2N1ZMS3NIaHB0eGF4ZDlUZlNMREJ6UkNiYlBIMHhtZzNVVis1bDlPem5lSEN5VnMvNTR0d2JtUFZ5SllXOWtxbllWODhUVzNjd0lJeUpaa2FOdW9nbEw2OWxmTCtKVWNmY1ZiYWVDZmM4eTd6bEt5aHluTGJBcGh2K1pwYnQrSUp4bDdjTjluMVY5U2xiampsNVdWY3p1djJEOTFuMC9uNHFqN1F5YjhMUHZuZjFWNFBCUU0rZVBZbUxzK0R6dFdLMUpnUzdYTWNDbkptV0ZpMksydHJhcW9HYjBjY1oyVWFPMXZtRksrQ25TNklXUFEwRUFxTEZGd0JKeFd4U2hhcXFrcUlnQ1JDU0ZJNmlCZ0NESktHQVpBaE9mR1BRVERXMkEzVEdIVHQyN0FMMi9PYktyS2N1Mi90Ujc1eWNuQ0tyMVhwaFo3bHhTemZBMm9Xd3RKMXlURnNCckp3TFRkc2hleG9zdk8za1R2NzJQYkIzTzZSWndSdnNDamo5WWJnbjZFcXBXZytENThMRURjRTdlaDNjc3hNS0hYRFBjRmk1RWU0YkF3L2ZDMk1maEhrVG9Hb0Q5Tm9Zdk1rMXdNVGI0ZG5kTURBZDZyWkM4VjB3ZWt0dy8zd1Y3Q3kxYzN0QjJ5dWlkTTFmR0ZyeHFqYVIweTVnOWZKNW5XZThxM1dzWGxmRjdIbjk4ZFJleXVOcjF6RjE0TVN5OGcvMzdmQjBjWlQxakRQb21abXFZMW1kQVpxaVkyZUtIc3drQ1RYWWxGaG9pZ3VTa0dSSkdNT1JUb2xXYjZ0UWhZRjRzNG40T0JPTlRjZEZnSGlPSFdzaExhc25TYmI0c0Q4dDBqM0tpczJtcWQwZStiU1VoTDRqZWZpdWNmVG9rVTU2ZWpwWldWbVFtOHZHamVPWk5mWnNISk9mWitiSTdQQmgyUHo0Yk5aNEwyTHZybm1ZVVZrNDdSSWVYcjZOQlZNSGFpUmd3RGpXUFR3WlQvVkdldlcvbTJuamQ1QmpxV1BKNHMwczIzdVFRV21BNHNNWFkwd1VGaGF4NjhHZGhCUnZ3cmNtVngyN2RuMkUyL2ZmRUJVOUJkbWl2bmxuOHovcFo3QjE5d2NzZW1jUGwwMGRUTUlQUUZOVFVsSndPcnVRbUppSXpaWVFGVUhWSnRGeDNHNHpack9IbGhhTjRZVk0wMmF6RDhsdnhHTHhpMkJnUWZLNEZReW1nREFhdFI0TkFVVVZJQ1JaRGtkUkpRM2toQnk4VU9UZ2hXQUltcW5oc3ExMmdNNVlXSGpPUjBFbTk5SmJiNjNyZnQ1NTUrVTdISTRpazhsMElYQlNuVFVHQnZYL0hGbGdhUVEzbkZSMitiQXhHcWdCWVhtWXVyMHdZeUdVMTJnbVpMMXVndHR5TlZBRHlNcUNVTy9uWGJ0aDl0UGE4K3lCa0JHY2VWWGJvTllJcXhmQkdrRDFnYXNVYW9Fc0FGY0RqVVlIam5iY2pEbURybVB4bktERXQ5RjJRdDlPNC9hMWxLWmRkdXo4cm9FZDlVWEZlOStaOU5jdkRBOU5QaEx5a1hiQ3p0b0ROYjNDUnJUdkRGU0JwR3FQUW9SN2JzaXlNTWdJN1lhb0NKQzAzcEVHSXhhTFJSaU5SdEtOY1BCd0EvYlViTHAzdGVzQ0JCcW8yV3pScVJ6WkNlZnorcUtWUExzeWdXSERScEJiZEdLaHh5MWIvb1haMDUvWjkvNCs2RGJ3VUdmWkMyakFObVNRWm81YnN3WlNiQzlsZDVWQ1RsNHlRd1lsYzl1NGF4ZzM4aklHRHgvRm9NS3NxUFhhblE1YzlVZmFiTTg1WURKMWRaTlBkMU1VVGxXMktDSEJ4bGtKTnM2NnNvUTM1cTVnMjVGTHVMenJENVA1YkxWYTZkT25EM2E3bmNURVJCSVNiRml0VnF6V2VKcWFOQWJuZHNkaE5qZGpOcHZ3ZWsxNHZhMGNOeHN4NENjK1B1eDdFN0xrQjJOQU1wczFCdWRyMVJpY0xHc3BJb0dBUUpLRmhBZ0g3S1RnWFYzV21KemsxL25pRERFZ3B3YzZZMUJDNlFDdzhaeHpDazNMbGoyVms1TnpabStielZab05CcjdRL3Q5bGNPS0xsK3o4TTRTRytSeXc5aXhNRzhkak93SG50MlFOcVdkN2NSc1N6YUNUNG40SXZTZVhYc0dqQmtkZVQxbVBJUUZrT3dPN0lvTGx4ZGk2WmpWa1U1ZTNnbDE5TjJLb256Z2NybEtGejcrVk9XUkQ3ZlgyTTNMMVJobUZvanhnM1VFYUhvdzAvOUcxZnZQZ28waVZVbENJQkN5TEtNR0FrS1dEYWhLcXhESUpOb1RNWnVNSEd0c0VBYVRCbDRta3dtUDV3aXlMT0h6SzlnU2JjVEh0TVFMOWZsME9wMTA2NVpDZXZxRmJMdm1Kajc3OUZOV1Bmc2dmMzN0QThyV3pPODhLZ3dVRHJpYzBjT0NnZ3VqcjhhZWtuMUNxSmp6OHZ1TTNyNkZMWnMyTUhISStUeTQ3bU1tRkVla3F0eE5MbXpPMDZPRDFmY2tXNlR5MWJFV3VpZHAvS3l4dm80RGlwa3VsaCsrbkNNek14T0h3eEVFT0ZzWTRPTGpqMkt4YU9DbUJSWmFNSmxhT0JabndvQ1BoQVJqcUdLQmhEZ2pMc1V2TEhZRGlpOGd1WVdDeVJ3UUpsa2xFQWpnOTZ0SWtpRFlUeWJVNkZsdnBzckJDOFFnU1ZJNDZLQUR1ZmJBenZqUlIzdU41NTEzWGltd0QxaDd4aGxuR0c0YjlYeFdxK0dzSEo4dnFiZkpaQ3FRSktuWHQzckFHcUhhQ0NWRjJrNnZXMzFTNm1RTUdnanIxOENJR2JCM1BkUW9FZlptcXdZNUc0cURRWTJHQmgyR21YTXB6bTJrdE54RFllR0pvOE5DaUFwVmlFK09IcTZyMkZ5eDc4c2JiNXgwcUthbVJvMWhaZTJ4czQ1WVd2aXpvTktMRXJNT1ZRaWhUOVVRV2d0Y1NjZ3lCRlNFd1dCQThmdUZ3V1JDVlZveG1PS3h4c2NKZ3hSQVVTRStUbXQ3Sjd4TmZIVk0wSys0bU9xOUgxRGp5dWI4TkljdTRWWWY5ZFRxUGJ0MjZVSnFqeDZjZmU2RkRPL25JRzNrYzNnMWw2akdvQzBXNmhzYTBMeVoyaGc4NkZMdTJWcEp2OWtUTlphcmVtaG9pdHhxTm0zWnhNeVJVL0JVYjJPbnE0QUYyVWJBaDh1dFVqUndLRVVEaDlKVStrL0t5bXRCQjJ4bFphVVU5Vy9MR04zbG01Z3hmeFgzTEZwTXZ2MTBCYlpUa2kxSzVTL1B2Y1M3TFJhNnhjdDhlYVNaY1NNdm8zL0NhUUh1SkNZbVVsQlFRRkpTa2c3Z0VyQmFHMmxxaXNkaWNSRVgxMHhjbkpuR09ETW00Y1ZtTTlIYXFrVk4weko5dUN0TTFCLzJJMVJGeUdZRmU0SWlCWk43aGRjYlFEYXFRaGFxRkVyMDFRVWFRaUFYWm5IQnZEZy8wYmx4aGhpQWEvUDh5eSsvTlB6dXJ5V2ZBUlZ4QzNrSE1Eenl5SjlzaDVvdVQwOTA5Y2hxYmJXZGFSS21YaUQzUmxNbytmb2pDMjRmQ0NVRElNY0d5VmtuTjRudWVoaEdqNEg4cFpEYkg3S0NkcU9jRENzV3dhU0JXdkRBVlF2bS9yRHg4WWhUZXV5NEsxaTVmaU1UQ2tkRmgrZUYrTXpyOVg1eC9QanhMNnVycXcvKzg1OGJEdDEvLy8wdGdEcWhYN280QVpoMUJHcXh6OE5MOFB4RUpkSUcyd01KaUtScklFbENRc0pva0lSZjBkS0tmSzFlVE9ZNExDWlZIR2x5YzdqQkMwTENhSkF3eDhWak5jUGVmWFhrOVJ0SWFsYzdHWU12NHUyTk8vSGs5eWE3VzNKUWxjTkp0Mjdkd3FWUm1abVpiSHJpTGk1ZStCOEs4cktvM0x1SDIrNzdCM3I0SHp2dE40eWRkZ01iRjlzWlBQbC9XREJqQklPbnpXWEV6dXNvS0xxSS9Dd0hGZVdWekZqOEp0T0hhbVMvYWZ2TERCcjZHazJWcFV4NitCbHlMQUIxakMrK0ZIZEdQbllhcUhUbnNtWmtZUlI1V2J2bTM0eWRPNi9OdWZmV2wvUE1NeTh4OGNIdkQ5aSsxMXJSWms4elI3d0tYUk1UU1RESlB3aUkxZGZYNC9QNXljam8wZjQrTmpkVFhWMGRUdWc5Y2lSVWErb0t5eUMxdEdpK3Q5WldieERjdEhwVGo5dUhJaFNFcXFXSGhJcnFROVVMd1JwVWdqV29vVUo3UWtDbmU1U0RnQ2ZybHBDTWtpR21DZlNKbmh0aWZ3L0lxMWE5bXB5WGw5Y3RPYmxicXMyV2tHNHltYm9iRElZTVNaSXkyeHA5YlVkRERTaFdTUHVhRVNCRkFXb2hheWlVbDBmc1psV0JtaHF3SjRNallreDdoUkFIV2cvdk9qaHcrQisvV3JIMjZhK1V4dnJEWldWbFI2Ni9mdnhSSWhwNjRmU0pEc0NzSTRiVzRmTlE4Ym51OS9vVWpYQ3FSdWd4MkIwdHFOWXNpWkJjdlc2SmxFTVpaQVFTMWdRYmxyaFFuYWM1R1BFTUJRZ1N3dTN3dW5SeGhGbGFLRGlnYjRYbjg3aW9yVy9VT2pwWlR6Nkx6Tk5VVDROTElTMDlIWFB3N2pSemVDYlpNOTluWXFHQ1luR1NISlh1b2RKUVc0c2JNMW5wS2RHcEkvdldNbkQ2T3JadlhvTDFOQ0FyUDdvaStHOEtiS0ZSVjFjWExLUS9SRVBEWVJvYkc0TWFieEdsRUkrbi9Zb0Z2OThmem4zVFZ5NEVBb29VQ0toaGdBc0UxQ0N3cWFocUdOVFFNYnFPUUM0TVVER3FJNTB0Y3N4ek9lWjVhQnZTbzQ4dXNQWHQyOWVlbHBabVQwcEtzbHV0VnJ2WmJMWWJqVWE3d1dDd3k3SnNreVRKSmtsU2dpUko4VUVnREFrQUdIVGV0UkF3K0dxMzRwdjVMTjV6ZTR1V2JhK0o1dlFKd3Izd2w2bzdFQWdjVnhURjFkcmE2dko0UE1lYm1wcGNYMzMxMWZHOWV6OTIzMzMzM1I0ZGVJa1lJQk9kYisvMDRnQUFDOHhKUkVGVWdKa2V5RHBpYWxGTEowQVdCV1o2SUFPRUxFdEM2NUltWVRESU9rQ1RNUmlNc1pVRFJCSnQyMVlRYU1tMm1pSkhZcUk5ek5LU2s3c0Z1N0ZyT1dyZjVRZ0IyNHloWDI4Nys3YXRwY0ZSVEVuKzZTRVAveE93ZFpiTjR2ZHo0TUNCc0lDbEpvTjBsR1BIWE8yS1dFYXJoZmlDQUtlMEEzQVJGcWQxdWxkRDVWckVNTGpPUUs1ZHNOT1ZkOG1kZ0pxaEhXQ0xYZlRiNld5aG5jZlk1OUZPMnJiUDlZK2RMYkZBRnJ0MHhOTGFQQTlKdjdjSFlpY0NzOUR6bUo0YVVleXNMYUNGUUMxU3VONlJHR1JTa2gySG93dkp5VjF4eUc3KzgyRWxEbWNYREliby92VDloNDFuUU82MzIxMTkzODdOV0hzTkpNdHAvcSsrem44Q3RwTVl4NDRkNCtEQmc5VFYxWEg0Y0lpOVJYVGVtcHM5T3ZNMFVyVVFxVG1OQnJoQUlCQmxwcXFxR2dWeVFxaVNxb3F3cVVxNDRiT1FoRUFQZEZJN0lCUURVTUtnVlVPMHk5STZBemVwQTRDVDJ3RzF6Z0N1TTNDTEJUVGFBYkhPR0pyYUFWdUxlcTJsMmtpZGdsalFaNmJyTnh2Mm00WEFMR2hxU2toU05KanBRRTJFRkdQMGdHWTBSaGhhcUhxZ2JWNmFUVmZuR2ZHbDllalJnNlNrSkg0YTMzbFU5UC9lU0VwS0lpa3BpYTVkdTFKYit4WDE5WWVDT205SGd5Vlp4NE1GOWMzaGducXZWMStTcFdkdklSTTFFS1Vlb2dsY0JnZ0VWRlJWRlVHUUU2cXFTcUYrTTFxL0JxSllYUEFDam1WME9nQ1NaRW1LQlR3aEJ3R3lNMERyRE55K0RuUDdPc0QyZGN6T2RnRXVDRWlkQWhqUnpiTERvS3IzbVlWZUJ3RXRpcGxwUUNhSDJqNktFRk9MMUhZYXd3ck9FWllXcVI2d1JLVndoRmhhRWwyNmRDRTVPWm1VbEZUUzA3di9uNUFYK2duWWZ1QlJXdm9KdWJsbmtacWF5b0VETmRUVmZjWGh3NGM1Y3VSSWxKQmx5RHpWSzRib2EwNDEzNXNHY29GQUdPQUlCQUo2aVNSSngrQkVoTW1KMEtPSU1WWFJSMWNqYkZ4STdZTlNGTmhGZmFjZGMxYzZBYkIxeE5waVRWTFJDYmgxQm5CcWU2OTFvTlFaczR2OVRkUzI5SzlqVEUxa1dkWUZBL1NBWmlDa3VoRUxhQVpEaEtIcGk5YmJVN2JWek02SUVHVFhybDJETEswN21aay9LVnI5Qkd3L3dNak16Q0ExTllYYTJ0cXdTbTliODdRNUdGd0lBWnd2eHYvV2hyMkZBZ3hCa0ZNN0JEa2R3QkhONXFSWW9JdDYzczVuYlpaZ0hsMG56RXhMMHZvdWZXeEIxbld5VEs2akJiMXBHZk9hOWxoWmlKbnAvR2Z0Z0ZuSTdEUjJ3dEwwZmpSelVCTXdYaWNDR1cxMmh0UnQwOVBUTVp2TlAxMWdQd3l3QmRpeGR4Ly9yUGlLWTRwTXdWazl1ZUhjTXpBRHJjMU52THJyTS9iV0hjTmdzVEd5dUpBTHU4Y2t3aXZOUFBYdmp6bXo5OWtNenZqdjlSMll6V2F5czdOSlRVMXRZNTdxbzZmUi9qYzlnK3M0ZXFvb0NvcS9sWlpXQ1l0WmlnSTVYYkNoUFpBajBpWVZLZlpSVlZVa1dRNEoyTVF5T3pwaFlyclhVa2pXNjJUQnJDUEdGdldlQ05uWkoyWnlkQUpna2Q4TElWUlZZRERJVVV4TTV5OURuNklSQzJhaHdJQytDYmVlb1hVVzdZejQwU3h0L0dpaGFHZXMyUm5iVUtXOVViWWJzb3FnM1phdzdpb21USG1ZeFN1VzROUmQxYlhsZTVCVDhrbHpmRHVBNlNsZHhlQzV1OWo1OHZ4dnZKNGhjM2V4L1JUV2N6TC82UlQwMkk2emVuY3RSWVhacEpwVmxyMjlrYytPWDhhRGc3TDVzcktLajV0bEx1MmJpL3ZJUVg3OTk1VXN2bU1pQTdwRU52UFc1cTBzZWU5THJyTDErSzhHdHRDSWo0K25aODhjMHRKU3FhdXJvNzYrUG1pZTZ2MXZJWUJyYVNPTDFGSDB0TG5oQ0ljYkErUmtwZWpUUTRUT0Q2Y0hPWVJRaFJad1VBa0dIc0pBRjd6T0pTRUVraXdqUmNDT2syRmRNY0IzSWpBNzJYS1NOcWFwaVB3NENxUkM3S29qdHFjSHhQRHo0UDh6R0F6aDkyTUNBRVFlWThGTTFqWGQxZ09hSWRpWXU2Tm9aN1NzVUVpRlF3TzBpQit0YTlldXBLU2trSmFXRnBXUGRxSXhiUVFzcklEKzdSVE5yVnN5Qjh1QThWR2dCckRrdnAvam1QeFdWQkg4TjdxaHB4VncrNlJ2bnRLaGVsMVVWUjgrcGQrZXpILzYrc0FtTzNoZzh1WGhsMTA4aDdsMXo1Y3dLSnZjdmtVODBEZjBTVGE3UC9tVUxmc2JHZEJGT3hDdXV2MDhWMnZqdWpPdGVINWsxRGNoSVlHZVBYdlN2WHYzY1BUMFNPMW5QUC9DZS9RdEtjSGVjaHpYb1VvMmZWSkxuNzY1SkxTMkJBTU1zUXpPeTRFdnZxRHBXRE5DRVJ3NWNnUlZNcEdTNG9SQWdJRGk1ZkRoWTFpdFJuSE01VUpGeHA3a1FCWit5ZVZ5b3dTMFdJSXB6aUpNUmdraEJBRy9EMThnSUFCSmxnMUloTUJPUlZGVUxTQ2hxcUN4bHBNRnJUWUFwa1hZcFRDbEM2YmtJN2N2Y2lqQzN3bUJyUGI5WUY0WVlZQUs3bTJRMVdtQUpJUXFoTkIrTDBreVJxTWhCSEFFRkQ4Q0NVbldvcFFoVUF2NFcxRXhvclMyRWhCZ3RkbXh4cG5DUU5aTzJnWnRmV250TXpTdDcwQVEwSXp4N1BuRVN1NFpOblpzUzZSYlRoSTNUM1NRM2szem94MnRTT052ejFoeHlUQitPZ3d0QkR5d2NCR012eFBTTE9DcmgwZWVoUmwzUWVVbVdMa1pxdHp3K0Z4SU04T0lTVEF3TjRRU2pTeCs0bC9jdFdWcCtPQTJsVzlqd2JOdnNibTBIc3Z5UDlPMDNVSGU0R3VaT0ZSclpseTVjeTFibTVKSnFkM0NpNXMrSVhmSXo3bHY4bkFxZDIzZzZaZmZvcnF1a2ZUYzg1bHgrM1RTN1JwTXJIdjZZYlpWSE1lYWRYN1VpYXpZdm9idGpYYThlemF3dGVJSUk2ZjhsckVsdVNkeDFmaFl2V1FlYTNaK1NiK1JOM0hiMkJKa29MNThPMHVmWFVWNTlTR2NHYjJaZHZ1ZDVLVlpUL2lmVkU4OXl4WXZabXZwQWI1eCt2K245UTNrcHJlVFMrTS9Uc1VSbFQ2cFFWYW0rbmhvN1U2bVgzaytjVC9PamwrQVZseWZrNVBET2VlY1EvNjVnempIMGNDTEc4dkl5a3BqeC9vMW1EUHl5VXhMcFZ1M0ZKS1R1K0owT25FNHVvVEx1ZXgyTzZrOU1raDFKaUtaRTBoTFN5TTFwU3NKVm8wQnhNY1pjTHVQYytSb00zYUhFN3ZOZ3RFY1I1eFJGcklwVHRpVGtvUXR3U3g4TGMxZ0RHYTBXelE1SnMwMk13bVR5U1NNUnFNd0dpUVJCQWhoTUJxRTFzUkJVZzBHZ3lyTGNudExJTGlFR3ZkR0w1cjJuQ0pKa3FaNG9kVlZobC9ITEFGSmtnS3lKQVZrV1E0bXlXcnJsbVVwdkIyQlVJV0d1bXB3dTZyQllGQWx0STVOSnBOUlNLaENDYWpDYURRS2s4a2tUQ2F6TUVpSWdDcDBpck54aUlCQ2EydXJzQ1FrQ3B0WkZtN1hjUkVYci9tL0lvNzk0SEdPajhkcXRYQzhzWjVEaHc1UlYxZEhiVzB0Qnc4ZTVLc2pidXgyTzBsSlNUZ2NYWUorc3E1MDY1WkNhbW9xNmNuZGVXOUxCbVVOWjNEOTlUazA3c3hsVzEwKzU1eHpEa3BGRHRmZWFhVmtMRXdhQ1hlTmdaMzFnQld5ZkREcEhrMHNkTllVY0tXQlhZYjBYakI4T0RqTlVEeEVlNTZsdStSODVadllLZmRuUUhxRXAxaVNzeGcyL0FxeVUyejA2bmN4dzRkZlFiOWVFVm0veXAxdmN0KzBYN0Nxd3NMNGlkZGpWVndBVkZXVTAydkFsZHgrMXgxa3VkOWoySlI1WWNHQ3ZINkRLY2tLOE1peU4yS0E3UTFtVExzYnRXQW9FNFptTW4zc3pWU2ZoRVJSMCs1VmJIRDFZdnFVYTFrOSt6b1diNmdFb0theUFtZCtDWGZlZFFjbEtZY1lOdUlXM0NmNlQ2cUxHU011WmwyTm5XbTMzL0hOZ2dmVit6L2hzVThDUERuajdGaWl5VE5yTmhKMzlnQ3U3S0dWSk83YzhSNU5tVVVNNm1ibXcvOER6a3VMeFVKMmRqWjNMWDZCVHkrL21NY2YvNERHekpITXZ1NFMzQzU5aW9pblRZbVcxWnFJVGJpbzlQakp5TWlJOXNFWnRSbVRjVlp2RWcxQ1o2WmFNTWY3YVBZMG8wanh5SEtMVURFUUYyZEdtTTNFV1ZRYVdyMlMwUnhIbkNGb3NpcUNGcTlmeE5zU2tJV2d0YVVaUllEUmFDUml3WXFRT1JvbVdrRWlGa1craE5EaXBxby9BTEtNakNvRkFtQXdHSkdsamsxUWpXUkorSDArSklNUm94eDVEMEFFQWdRa0NZc2xMc3FrTkp0TkJCU0ZnQ293R21SOEFVRmNuQmxKa3BFc0ZwUVdGNjVXU1Znc2NXRnpzL1c0aENrdWlXU25BMWxLNEhobExYSmNQUEZHZmJXQVBqQWcwMnBMSkk1b2M5U2MyQVduczB1VUQwM2ZTTVZPRWlhamc5LyswVW0vMUc1MFA1N0txelZHTEJaWXVoQW16b0lSSmRyL256b1VWcXlGNGlrd1poWnNIZ0ZqeGtCVENtd015cHFsWkd1TDNRejlTdHFhb3JYbFZWaHlNcU5rWFN6T0RFcEtNbGlmWXNXUlgweEpTVnV6elpoM0JZL1B1eDBaR0I1OGI4ajRHZFJXN0dWdmVRMFpoZWRTOSt4Yk5BTEpRRTVoTVNtK011UmxiVTNJZ3BFM01tM1VFS0NZZ2JQK3pONWFUU201MDVFK2lQbjNqc2NCekpweERmZTh1SXJiaDgyazMvQ0paRmZ2WTA5WkplWmU1MkNwZklBS054UjE4cDljdTFlenZEYVBtczB6c1FQL0gzaXhnSm1RTzV3dUFBQUFBRWxGVGtTdVFtQ0MiXSwgWzEsICJkZXRhaWxzLWNvbnRhaW5lciJdLCBbMSwgImRldGFpbHMiXSwgWyJocmVmIiwgImh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9kZWJ1Z2dpbmcvZXhwZXJpbWVudGFsL2VuYWJsZV9kdW1wX2RlYnVnX2luZm8iLCAidGFyZ2V0IiwgImJsYW5rIiwgInJlbCIsICJub3JlZmVycmVyIG5vb3BlbmVyIl0sIFsiaHJlZiIsICJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvZGVidWdnaW5nIiwgInRhcmdldCIsICJibGFuayIsICJyZWwiLCAibm9yZWZlcnJlciBub29wZW5lciJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEluYWN0aXZlQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDEpOwogICAgICAgIMm1ybV0ZXh0KDIsICIgRGVidWdnZXIgVjIgaXMgaW5hY3RpdmUgYmVjYXVzZSBubyBkYXRhIGlzIGF2YWlsYWJsZS4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCg0LCAiVG8gdXNlIHRoZSBkZWJ1Z2dlciwiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgIm9sIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAibGkiKTsKICAgICAgICDJtcm1dGV4dCg4LCAiIEFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gdGhlIGJlZ2lubmluZyBvZiB5b3VyIHByb2dyYW06ICIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgImRpdiIsIDIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoMTEsICJ0Zi5kZWJ1Z2dpbmcuZXhwZXJpbWVudGFsLmVuYWJsZV9kdW1wX2RlYnVnX2luZm8oIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAic3BhbiIsIDMpOwogICAgICAgIMm1ybV0ZXh0KDEzLCAibG9nZGlyIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGV4dCgxNCwgIiwgIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNSwgInNwYW4iLCAzKTsKICAgICAgICDJtcm1dGV4dCgxNiwgInRlbnNvcl9kZWJ1Z19tb2RlPVwiRlVMTF9IRUFMVEhcIiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoMTcsICIsICIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTgsICJzcGFuIiwgMyk7CiAgICAgICAgybXJtXRleHQoMTksICJjaXJjdWxhcl9idWZmZXJfc2l6ZT0tMSIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyMCwgInNwYW4iKTsKICAgICAgICDJtcm1dGV4dCgyMSwgIikiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIyLCAibGkiKTsKICAgICAgICDJtcm1dGV4dCgyMywgIiBSZS1ydW4gdGhlIHByb2dyYW0uICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjQsICJkaXYiLCA0KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI1LCAiZGl2IiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyNiwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50KDI3LCAiaW1nIiwgNyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI4LCAiZGl2IiwgOCk7CiAgICAgICAgybXJtXRleHQoMjksICIgQXV0by1hbGVydHMgZm9yIHByb2JsZW1zIGZvdW5kICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMwLCAiZGl2IiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzMSwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50KDMyLCAiaW1nIiwgOSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMzLCAiZGl2IiwgOCk7CiAgICAgICAgybXJtXRleHQoMzQsICIgSW50ZWdyYXRlZCBkZWJ1Z2dpbmcgdG8gdHJhY2UgcHJvYmxlbXMgdG8gdGhlaXIgY2F1c2VzICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDM1LCAiZGl2IiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzNiwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50KDM3LCAiaW1nIiwgMTApOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzOCwgImRpdiIsIDgpOwogICAgICAgIMm1ybV0ZXh0KDM5LCAiIExpbmsgbG9nIHRvIGNvZGUgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0MCwgImRpdiIsIDExKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQxLCAiZGl2IiwgMTIpOwogICAgICAgIMm1ybV0ZXh0KDQyLCAiIFRoZSBsb2cgZGlyZWN0b3J5IG11c3QgY29udGFpbiBUZW5zb3JGbG93IERlYnVnZ2VyIChWMikgZGF0YS4gdGYuZGVidWdnaW5nLmV4cGVyaW1lbnRhbC5lbmFibGVfZHVtcF9kZWJ1Z19pbmZvKCkgd2lsbCBjb2xsZWN0IHRlbnNvciBkYXRhLCBncmFwaCBzdHJ1Y3R1cmVzLCB0aGUgYXNzb2NpYXRlZCBzdGFjayB0cmFjZXMsIGFuZCBzb3VyY2UgY29kZSB0byB0aGUgc3BlY2lmaWNlZCBkaXJlY3RvcnkgbG9nZGlyIGFzIHRoZSBpbnN0cnVtZW50ZWQgVGVuc29yRmxvdyBwcm9ncmFtIGV4ZWN1dGVzLiAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNDMsICJkaXYiLCAxMik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0NCwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDQ1LCAiIFNlZSAiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQ2LCAiYSIsIDEzKTsKICAgICAgICDJtcm1dGV4dCg0NywgIiBkb2N1bWVudGF0aW9uICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoNDgsICIgb2YgdGhlIFB5dGhvbiBBUEkgb2YgRGVidWdnZXIgVjIuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0OSwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDUwLCAiIFNlZSAiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUxLCAiYSIsIDE0KTsKICAgICAgICDJtcm1dGV4dCg1MiwgIiBoZXJlICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoNTMsICIgZm9yIG90aGVyIFRlbnNvckZsb3cgZGVidWdnaW5nIEFQSXMuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0sIHN0eWxlczogWyIuYXJnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGNvbG9yOiBsaWdodGJsdWU7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5jb2RlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIG1hcmdpbjogMTBweDtcbn1cblxuLmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgcGFkZGluZzogNTBweDtcbn1cblxuLmRldGFpbHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmRldGFpbHNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDEwcHggNjBweDtcbiAgd2lkdGg6IDUwJTtcbn1cblxuLmV4aGliaXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uZXhoaWJpdFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAxMHB4IDYwcHg7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIHdpZHRoOiAzMTBweDtcbn1cblxuLmV4aGliaXRbX25nY29udGVudC0lQ09NUCVdICAgLmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdpZHRoOiAzMTBweDtcbn1cblxuLmV4aGliaXRbX25nY29udGVudC0lQ09NUCVdICAgLnNjcmVlbnNob3RbX25nY29udGVudC0lQ09NUCVdICAgY2FudmFzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGhlaWdodDogMjAwcHg7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4udGl0bGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZm9udC1zaXplOiAxMzUlO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luLWJvdHRvbTogMjVweDtcbn0iXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2luYWN0aXZlL2luYWN0aXZlX2NvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBJbmFjdGl2ZUNvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqLwogICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICB9Cn0KSW5hY3RpdmVDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGluYWN0aXZlLWNvbXBvbmVudD48L2luYWN0aXZlLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovCkluYWN0aXZlQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZUNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEluYWN0aXZlQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZUNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBJbmFjdGl2ZUNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSJdXSwgZGVjbHM6IDEsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBJbmFjdGl2ZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiaW5hY3RpdmUtY29tcG9uZW50Iik7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtJbmFjdGl2ZUNvbXBvbmVudF0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgovKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKioKICogQWN0aW9ucyBmb3IgRGVidWdnZXIgVjIuCiAqLwovKioKICogQWN0aW9ucyBmb3IgdGhlIERlYnVnZ2VyIENvbXBvbmVudC4KICovCmNvbnN0IGRlYnVnZ2VyTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIERlYnVnZ2VyIExvYWRlZCcpOwpjb25zdCBkZWJ1Z2dlclVubG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIERlYnVnZ2VyIFVubG9hZGVkJyk7CmNvbnN0IGRlYnVnZ2VyRGF0YVBvbGxPbnNldCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBBIE5ldyBEZWJ1Z2dlciBEYXRhIFBvbGxpbmcgRXZlbnQgQmVnaW5zJyk7CmNvbnN0IGRlYnVnZ2VyUnVuc1JlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBEZWJ1Z2dlciBSdW5zIFJlcXVlc3RlZCcpOwpjb25zdCBkZWJ1Z2dlclJ1bnNMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gRGVidWdnZXIgUnVucyBMb2FkZWQnLCBwcm9wcygpKTsKY29uc3QgZGVidWdnZXJSdW5zUmVxdWVzdEZhaWxlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBEZWJ1Z2dlciBSdW5zIFJlcXVlc3QgRmFpbGVkJyk7Ci8qKgogKiBOdW1iZXIgb2YgYWxlcnRzIGFuZCB0aGVpciB0eXBlIGJyZWFrZG93biBvciBkZXRhaWxlZCBhbGVydHMgYXJlIHJlcXVlc3RlZC4KICovCmNvbnN0IG51bUFsZXJ0c0FuZEJyZWFrZG93blJlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBOdW1iZXIgYW5kIEJyZWFrZG93biBvZiBBbGVydHMgUmVxdWVzdGVkJyk7Ci8qKgogKiBOdW1iZXIgb2YgYWxlcnRzIGFuZCB0aGVpciB0eXBlIGJyZWFrZG93biBhcmUgbG9hZGVkLgogKi8KY29uc3QgbnVtQWxlcnRzQW5kQnJlYWtkb3duTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIE51bWJlciBhbmQgQnJlYWtkb3duIG9mIEFsZXJ0cyBMb2FkZWQnLCBwcm9wcygpKTsKY29uc3QgYWxlcnRzT2ZUeXBlTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEFsZXJ0cyBEYXRhIG9mIGFuIEFsZXJ0VHlwZSBJcyBMb2FkZWQnLCBwcm9wcygpKTsKY29uc3QgYWxlcnRUeXBlRm9jdXNUb2dnbGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEFsZXJ0IFR5cGUgRm9jdXMgVG9nZ2xlZCcsIHByb3BzKCkpOwovKioKICogQWN0aW9ucyByZWxhdGVkIHRvIHRvcC1sZXZlbCAoZWFnZXIpIGV4ZWN1dGlvbgogKi8KY29uc3QgbnVtRXhlY3V0aW9uc1JlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBOdW1iZXIgb2YgVG9wLUxldmVsIEV4ZWN1dGlvbnMgUmVxdWVzdGVkJyk7CmNvbnN0IG51bUV4ZWN1dGlvbnNMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gTnVtYmVyIG9mIFRvcC1MZXZlbCBFeGVjdXRpb25zIExvYWRlZCcsIHByb3BzKCkpOwpjb25zdCBleGVjdXRpb25EaWdlc3RzUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEV4ZWN1dGlvbkRpZ2VzdHMgUmVxdWVzdGVkJywgcHJvcHMoKSk7CmNvbnN0IGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gRXhlY3V0aW9uRGlnZXN0cyBMb2FkZWQnLCBwcm9wcygpKTsKY29uc3QgZXhlY3V0aW9uU2Nyb2xsTGVmdCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBTY3JvbGwgTGVmdHdhcmQgb24gdGhlIEV4ZWN1dGlvbiBUaW1lbGluZScpOwpjb25zdCBleGVjdXRpb25TY3JvbGxSaWdodCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBTY3JvbGwgUmlnaHR3YXJkIG9uIHRoZSBFeGVjdXRpb24gVGltZWxpbmUnKTsKY29uc3QgZXhlY3V0aW9uU2Nyb2xsVG9JbmRleCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBTY3JvbGwgdGhlIEV4ZWN1dGlvbiBUaW1lbGluZSB0byBHaXZlbiBJbmRleCcsIHByb3BzKCkpOwpjb25zdCBleGVjdXRpb25EaWdlc3RGb2N1c2VkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEV4ZWN1dGlvbiBEYXRhIE9iamVjdHMgQmVpbmcgRm9jdXNlZCBPbicsIHByb3BzKCkpOwpjb25zdCBleGVjdXRpb25EYXRhTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEV4ZWN1dGlvbiBEYXRhIE9iamVjdHMgTG9hZGVkJywgcHJvcHMoKSk7Ci8qKgogKiBBY3Rpb25zIHJlbGF0ZWQgdG8gaW50cmEtZ3JhcGggZXhlY3V0aW9uCiAqLwpjb25zdCBudW1HcmFwaEV4ZWN1dGlvbnNSZXF1ZXN0ZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gTnVtYmVyIG9mIEludHJhLUdyYXBoIEV4ZWN1dGlvbnMgUmVxdWVzdGVkJyk7CmNvbnN0IG51bUdyYXBoRXhlY3V0aW9uc0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBOdW1iZXIgb2YgSW50cmEtR3JhcGggRXhlY3V0aW9ucyBMb2FkZWQnLCBwcm9wcygpKTsKY29uc3QgZ3JhcGhFeGVjdXRpb25EYXRhUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEludHJhLUdyYXBoIEV4ZWN1dGlvbiBEYXRhIFJlcXVlc3RlZCcsIHByb3BzKCkpOwpjb25zdCBncmFwaEV4ZWN1dGlvbkRhdGFMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gSW50cmEtR3JhcGggRXhlY3V0aW9uIERhdGEgTG9hZGVkJywgcHJvcHMoKSk7CmNvbnN0IGdyYXBoRXhlY3V0aW9uU2Nyb2xsVG9JbmRleCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBTY3JvbGwgSW50cmEtR3JhcGggRXhlY3V0aW9uIExpc3QgdG8gR2l2ZW4gSW5kZXgnLCBwcm9wcygpKTsKY29uc3QgZ3JhcGhFeGVjdXRpb25Gb2N1c2VkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEdyYXBoIEV4ZWN1dGlvbiBpcyBGb2N1c2VkIE9uJywgcHJvcHMoKSk7Ci8qKgogKiBBY3Rpb25zIHJlbGF0ZWQgdG8gZ3JhcGggb3BzLgogKi8KY29uc3QgZ3JhcGhPcEZvY3VzZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gR3JhcGggT3AgSXMgRm9jdXNlZCBPbicsIHByb3BzKCkpOwpjb25zdCBncmFwaE9wSW5mb1JlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBHcmFwaCBPcCBJbmZvIFJlcXVlc3RlZCcsIHByb3BzKCkpOwpjb25zdCBncmFwaE9wSW5mb0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBHcmFwaCBPcCBJbmZvIExvYWRlZCcsIHByb3BzKCkpOwovKioKICogQWN0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBmaWxlcyBhbmQgc3RhY2sgdHJhY2VzLgogKi8KY29uc3Qgc291cmNlRmlsZUxpc3RSZXF1ZXN0ZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTGlzdCBSZXF1ZXN0ZWQuJyk7CmNvbnN0IHNvdXJjZUZpbGVMaXN0TG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNvdXJjZSBGaWxlIExpc3QgTG9hZGVkJywgcHJvcHMoKSk7CmNvbnN0IHNvdXJjZUxpbmVGb2N1c2VkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNvdXJjZSBGaWxlIExpbmUgSXMgRm9jdXNlZCBvbicsIHByb3BzKCkpOwpjb25zdCBzb3VyY2VGaWxlUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNvdXJjZSBGaWxlIFJlcXVlc3RlZCcsIHByb3BzKCkpOwpjb25zdCBzb3VyY2VGaWxlTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNvdXJjZSBGaWxlIExvYWRlZCcsIHByb3BzKCkpOwpjb25zdCBzdGFja0ZyYW1lc0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBBIFNldCBvZiBTdGFjayBGcmFtZXMgSGF2ZSBCZWVuIExvYWRlZCcsIHByb3BzKCkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdnZXJfdHlwZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBERUJVR0dFUl9GRUFUVVJFX0tFWSA9ICdkZWJ1Z2dlcic7Ci8qKiBAZW51bSB7bnVtYmVyfSAqLwpjb25zdCBUZW5zb3JEZWJ1Z01vZGUgPSB7CiAgICAvLyBOT1RFKGNhaXMpOiBUaGUgc3RyaW5nIG5hbWUgYW5kIG51bWJlciB2YWx1ZXMgb2YgdGhlc2UgZW51bXMKICAgIC8vIG5lZWQgdG8gbWF0Y2ggVGVuc29yRGVidWdNb2RlIGluIHRlbnNvcmZsb3cuIFNlZQogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUvcHJvdG9idWYvZGVidWdfZXZlbnQucHJvdG8KICAgIFVOU1BFQ0lGSUVEOiAwLAogICAgTk9fVEVOU09SOiAxLAogICAgQ1VSVF9IRUFMVEg6IDIsCiAgICBDT05DSVNFX0hFQUxUSDogMywKICAgIEZVTExfSEVBTFRIOiA0LAogICAgU0hBUEU6IDUsCiAgICBGVUxMX05VTUVSSUNTOiA2LAogICAgRlVMTF9URU5TT1I6IDcsCiAgICBSRURVQ0VfSU5GX05BTl9USFJFRV9TTE9UUzogOCwKfTsKVGVuc29yRGVidWdNb2RlW1RlbnNvckRlYnVnTW9kZS5VTlNQRUNJRklFRF0gPSAnVU5TUEVDSUZJRUQnOwpUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLk5PX1RFTlNPUl0gPSAnTk9fVEVOU09SJzsKVGVuc29yRGVidWdNb2RlW1RlbnNvckRlYnVnTW9kZS5DVVJUX0hFQUxUSF0gPSAnQ1VSVF9IRUFMVEgnOwpUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLkNPTkNJU0VfSEVBTFRIXSA9ICdDT05DSVNFX0hFQUxUSCc7ClRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEhdID0gJ0ZVTExfSEVBTFRIJzsKVGVuc29yRGVidWdNb2RlW1RlbnNvckRlYnVnTW9kZS5TSEFQRV0gPSAnU0hBUEUnOwpUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLkZVTExfTlVNRVJJQ1NdID0gJ0ZVTExfTlVNRVJJQ1MnOwpUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLkZVTExfVEVOU09SXSA9ICdGVUxMX1RFTlNPUic7ClRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuUkVEVUNFX0lORl9OQU5fVEhSRUVfU0xPVFNdID0gJ1JFRFVDRV9JTkZfTkFOX1RIUkVFX1NMT1RTJzsKLyoqIEBlbnVtIHtzdHJpbmd9ICovCmNvbnN0IEFsZXJ0VHlwZSA9IHsKICAgIEZVTkNUSU9OX1JFQ09NUElMRV9BTEVSVDogIkZ1bmN0aW9uUmVjb21waWxlc0FsZXJ0IiwKICAgIElORl9OQU5fQUxFUlQ6ICJJbmZOYW5BbGVydCIsCiAgICBURU5TT1JfU0hBUEVfQUxFUlQ6ICJUZW5zb3JTaGFwZUFsZXJ0IiwKfTsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IENvZGVMb2NhdGlvblR5cGUgPSB7CiAgICAvLyBUaGUgY29kZSBsb2NhdGlvbiBmb3IgYW4gZWFnZXIgKHRvcC1sZXZlbCkgZXhlY3V0aW9uLgogICAgRVhFQ1VUSU9OOiAwLAogICAgLy8gVGhlIGNvZGUgbG9jYXRpb24gZm9yIHRoZSBjcmVhdGlvbiBvZiBvZiBhbiBvcCAobm9kZSkgaW4gYSBncmFwaC4KICAgIEdSQVBIX09QX0NSRUFUSU9OOiAxLAp9OwpDb2RlTG9jYXRpb25UeXBlW0NvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OXSA9ICdFWEVDVVRJT04nOwpDb2RlTG9jYXRpb25UeXBlW0NvZGVMb2NhdGlvblR5cGUuR1JBUEhfT1BfQ1JFQVRJT05dID0gJ0dSQVBIX09QX0NSRUFUSU9OJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3N0b3JlL2RlYnVnZ2VyX3N0b3JlX2hlbHBlcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIHRoZSBzdGFjayB0cmFjZSBiZWluZyBmb2N1c2VkIG9uLgogKgogKiBUaGlzIGV4YW1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgZm9jdXNlZCBjb2RlIGxvY2F0aW9uIGlzIGZvciBhbgogKiBlYWdlciAodG9wLWxldmVsKSBleGVjdXRpb24gb3IgYSBncmFwaC1vcCBjcmVhdGlvbiwgYW5kIHRoZW4gcXVlcmllcwogKiB0aGUgY29ycmVzcG9uZGluZyBzdWJzdGF0ZXMgYWNjb3JkaW5nbHkuCiAqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEZvY3VzZWRTdGFja0ZyYW1lc0hlbHBlcihzdGF0ZSkgewogICAgaWYgKHN0YXRlLmNvZGVMb2NhdGlvbkZvY3VzVHlwZSA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN0YWNrRnJhbWVJZHMgPSBbXTsKICAgIGlmIChzdGF0ZS5jb2RlTG9jYXRpb25Gb2N1c1R5cGUgPT09IENvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OKSB7CiAgICAgICAgY29uc3QgeyBmb2N1c0luZGV4LCBleGVjdXRpb25EYXRhIH0gPSBzdGF0ZS5leGVjdXRpb25zOwogICAgICAgIGlmIChmb2N1c0luZGV4ID09PSBudWxsIHx8IGV4ZWN1dGlvbkRhdGFbZm9jdXNJbmRleF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgc3RhY2tGcmFtZUlkcyA9IGV4ZWN1dGlvbkRhdGFbZm9jdXNJbmRleF0uc3RhY2tfZnJhbWVfaWRzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gVGhpcyBpcyBDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OLgogICAgICAgIGlmIChzdGF0ZS5ncmFwaHMuZm9jdXNlZE9wID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCB7IGdyYXBoSWQsIG9wTmFtZSB9ID0gc3RhdGUuZ3JhcGhzLmZvY3VzZWRPcDsKICAgICAgICBpZiAoc3RhdGUuZ3JhcGhzLm9wc1tncmFwaElkXSA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICFzdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdLmhhcyhvcE5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBzdGFja0ZyYW1lSWRzID0gKC8qKiBAdHlwZSB7P30gKi8gKHN0YXRlLmdyYXBocy5vcHNbZ3JhcGhJZF0uZ2V0KG9wTmFtZSkpKS5zdGFja19mcmFtZV9pZHM7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzdGFja0ZyYW1lcyA9IFtdOwogICAgZm9yIChjb25zdCBzdGFja0ZyYW1lSWQgb2Ygc3RhY2tGcmFtZUlkcykgewogICAgICAgIGlmIChzdGF0ZS5zdGFja0ZyYW1lc1tzdGFja0ZyYW1lSWRdICE9IG51bGwpIHsKICAgICAgICAgICAgc3RhY2tGcmFtZXMucHVzaChzdGF0ZS5zdGFja0ZyYW1lc1tzdGFja0ZyYW1lSWRdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdGFja0ZyYW1lczsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdnZXJfc3RvcmVfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEZpbmQgdGhlIGluZGV4IG9mIGEgZmlsZSBzcGVjIGFtb25nIGFuIGFycmF5IG9mIGZpbGUgc3BlY3MuCiAqIEBwYXJhbSB7P30gZmlsZUxpc3QKICogQHBhcmFtIHs/fSBmaWxlU3BlYwogKiBAcmV0dXJuIHs/fSBUaGUgaW5kZXggb2YgYGZpbGVTcGVjYCBpbiBgZmlsZUxpc3RgLiBJZiBub3QgZm91bmQsIGAtMWAuCiAqLwpmdW5jdGlvbiBmaW5kRmlsZUluZGV4KGZpbGVMaXN0LCBmaWxlU3BlYykgewogICAgcmV0dXJuIGZpbGVMaXN0LmZpbmRJbmRleCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChpdGVtKSA9PiBpdGVtLmhvc3RfbmFtZSA9PT0gZmlsZVNwZWMuaG9zdF9uYW1lICYmCiAgICAgICAgaXRlbS5maWxlX3BhdGggPT09IGZpbGVTcGVjLmZpbGVfcGF0aCkpOwp9Ci8qKgogKiBEZXRlcm1pbmVzIGlmIGEgc291cmNlLWxpbmUgc3BlYyBwb2ludHMgYXQgdGhlIGJvdHRvbW1vc3QgaW4gaXRzIGZpbGUKICogaW4gYSBnaXZlbiBzdGFjayB0cmFjZS4KICoKICogQHRocm93cyBFcnJvciBpZiBgc3RhY2tGcmFtZWAgaXMgbm90IGEgZnJhbWUgaW4gYHN0YWNrRnJhbWVzYC4KICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lcyBUaGUgc3RhY2sgdHJhY2UgdG8gZXhhbWluZS4KICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lIEEgc3BlYyB0aGF0IGRlc2NyaWJlcyBhIGZyYW1lIGluIHRoZSBzdGFjayB0cmFjZS4KICogQHJldHVybiB7P30gV2hldGhlciBgc3RhY2tGcmFtZWAgcG9pbnRzIHRvIHRoZSBib3R0b21tb3N0IHN0YWNrIGZyYW1lCiAqICAgKGluIHRoZSBQeXRob24gc2Vuc2UpIG9mIHRoZSBmaWxlIGl0IGJlbG9uZ3MgdG8gYW1vbmcgdGhlIGZyYW1lcyBpbgogKiAgIGBzdGFja0ZyYW1lc2AuCiAqLwpmdW5jdGlvbiBpc0ZyYW1lQm90dG9tbW9zdEluU3RhY2tUcmFjZShzdGFja0ZyYW1lcywgc3RhY2tGcmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hdGNoaW5nSW5kZXggPSAtMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBib3R0b21tb3N0SW5kZXggPSAtMTsKICAgIHN0YWNrRnJhbWVzLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAqIEBwYXJhbSB7P30gaQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHsgZmlsZV9wYXRoLCBsaW5lbm8gfSwgaSkgPT4gewogICAgICAgIGlmIChmaWxlX3BhdGggPT09IHN0YWNrRnJhbWUuZmlsZV9wYXRoKSB7CiAgICAgICAgICAgIGJvdHRvbW1vc3RJbmRleCA9IGk7CiAgICAgICAgICAgIGlmIChsaW5lbm8gPT09IHN0YWNrRnJhbWUubGluZW5vKSB7CiAgICAgICAgICAgICAgICBtYXRjaGluZ0luZGV4ID0gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pKTsKICAgIGlmIChtYXRjaGluZ0luZGV4ID09PSAtMSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhY2sgZnJhbWUgJHtKU09OLnN0cmluZ2lmeShzdGFja0ZyYW1lKX0gaXMgbm90IGZvdW5kLmApOwogICAgfQogICAgcmV0dXJuIG1hdGNoaW5nSW5kZXggPT09IGJvdHRvbW1vc3RJbmRleDsKfQovKioKICogRmluZHMgdGhlIGJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUgaW4gYSBzdGFjayB0cmFjZS4KICoKICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lcyBTdGFjayBmcmFtZXMgb2YgdGhlIHN0YWNrIHRyYWNlIHRvIGxvb2sgaW4uCiAqIEBwYXJhbSB7P30gZm9jdXNlZFNvdXJjZUxpbmVTcGVjIFRoZSBjdXJyZW50bHkgZm9jdXNlZCBzdGFjayBmcmFtZS4KICogQHJldHVybiB7P30gVGhlIHN0YWNrIGZyYW1lIHRoYXQgaXMgaW4gdGhlIHNhbWUgZmlsZSBhcyBgZm9jdXNlZFNvdXJjZUxpbmVTcGVjYCwKICogICBidXQgYXQgdGhlIGJvdHRvbW1vc3QgbG9jYXRpb24uCiAqLwpmdW5jdGlvbiBnZXRCb3R0b21tb3N0U3RhY2tGcmFtZUluRm9jdXNlZEZpbGUoc3RhY2tGcmFtZXMsIGZvY3VzZWRTb3VyY2VMaW5lU3BlYykgewogICAgaWYgKGZvY3VzZWRTb3VyY2VMaW5lU3BlYyA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZm9yIChsZXQgaSA9IHN0YWNrRnJhbWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YWNrRnJhbWUgPSBzdGFja0ZyYW1lc1tpXTsKICAgICAgICBjb25zdCB7IGhvc3RfbmFtZSwgZmlsZV9wYXRoIH0gPSBzdGFja0ZyYW1lOwogICAgICAgIGlmIChob3N0X25hbWUgPT09IGZvY3VzZWRTb3VyY2VMaW5lU3BlYy5ob3N0X25hbWUgJiYKICAgICAgICAgICAgZmlsZV9wYXRoID09PSBmb2N1c2VkU291cmNlTGluZVNwZWMuZmlsZV9wYXRoKSB7CiAgICAgICAgICAgIHJldHVybiBzdGFja0ZyYW1lOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBGaW5kIHRoZSBmaXJzdCByYW5nZSAod2l0aCBiZWdpbiBhbmQgZW5kIHByb3BlcnRpZXMpIGluIGFuIGFycmF5IG9mIHJhbmdlcwogKiB0aGF0IGVxdWFscyBgW2JlZ2luLCBlbmQpYC4KICoKICogQHBhcmFtIHs/fSByYW5nZXMgVGhlIHJhbmdlcyB0byBzZWFyY2ggaW4uCiAqIEBwYXJhbSB7P30gYmVnaW4gVGhlIGJlZ2luIG9mIHRoZSByYW5nZSB0byBzZWFyY2ggZm9yIChpbmNsdXNpdmUpLgogKiBAcGFyYW0gez99IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZSB0byBzZWFyY2ggZm9yIChleGNsdXNpdmUpLgogKiBAcmV0dXJuIHs/fSBJbmRleCAoPj0wKSBpZiBmb3VuZC4gLTEgaWYgbm90IGZvdW5kLgogKi8KZnVuY3Rpb24gZmluZEJlZ2luRW5kUmFuZ2VJbmRleChyYW5nZXMsIGJlZ2luLCBlbmQpIHsKICAgIGlmIChiZWdpbiA+PSBlbmQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJlZ2luIHRvIGJlIGxlc3MgdGhhbiBlbmQsIGAgKwogICAgICAgICAgICBgYnV0IGdvdCBiZWdpbj0ke2JlZ2lufSwgZW5kPSR7ZW5kfWApOwogICAgfQogICAgcmV0dXJuIHJhbmdlcy5maW5kSW5kZXgoKC8qKgogICAgICogQHBhcmFtIHs/fSByYW5nZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJhbmdlKSA9PiByYW5nZS5iZWdpbiA9PT0gYmVnaW4gJiYgcmFuZ2UuZW5kID09PSBlbmQpKTsKfQovKioKICogRGV0ZXJtaW5lcyBpZiBhbiBhcnJheSBvZiByYW5nZXMgY29udGFpbnMgYSByYW5nZSB0aGF0IHN0cmljdGx5IGluY2x1ZGVzCiAqIGBbYmVnaW4sIGVuZClgLgogKgogKiBAcGFyYW0gez99IHJhbmdlcyBUaGUgcmFuZ2VzIHRvIHNlYXJjaCBpbi4KICogQHBhcmFtIHs/fSBiZWdpbiBUaGUgYmVnaW4gb2YgdGhlIHJhbmdlIHRvIHNlYXJjaCBmb3IgKGluY2x1c2l2ZSkuCiAqIEBwYXJhbSB7P30gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIHNlYXJjaCBmb3IgKGV4Y2x1c2l2ZSkuCiAqIEByZXR1cm4gez99IGBUcnVlYCBpZiBhbmQgb25seSBpZiBvbmUgb2YgdGhlIHJhbmdlcyBvZiBgcmFuZ2VzYCBzdHJpY3RseQogKiAgIGluY2x1ZGVzIGBbYmVnaW4sIGVuZClgLgogKi8KZnVuY3Rpb24gYmVnaW5FbmRSYW5nZXNJbmNsdWRlKHJhbmdlcywgYmVnaW4sIGVuZCkgewogICAgaWYgKGJlZ2luID49IGVuZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYmVnaW4gdG8gYmUgbGVzcyB0aGFuIGVuZCwgYCArCiAgICAgICAgICAgIGBidXQgZ290IGJlZ2luPSR7YmVnaW59LCBlbmQ9JHtlbmR9YCk7CiAgICB9CiAgICByZXR1cm4gKHJhbmdlcy5maW5kSW5kZXgoKC8qKgogICAgICogQHBhcmFtIHs/fSByYW5nZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJhbmdlKSA9PiByYW5nZS5iZWdpbiA+PSBiZWdpbiAmJiByYW5nZS5lbmQgPD0gZW5kKSkgIT09IC0xKTsKfQovKioKICogQ29tcHV0ZXMgYm90dG9tbW9zdCBzdGFjayBmcmFtZSBpbiB0aGUgY3VycmVudGx5LWZvY3VzZWQgc3RhY2sgdHJhY2UuCiAqCiAqIEBwYXJhbSB7P30gc3RhdGUgSW5wdXQgRGVidWdnZXJTdGF0ZSAod2lsbCBub3QgYmUgbXV0YXRlZCkuCiAqIEByZXR1cm4gez99IElmIGBzdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZWAgYW5kIHRoZXJlIGlzIGEgc3RhY2sgdHJhY2UKICogICBpbiBmb2N1cyBhbmQgaWYgYSBib3R0b21tb3N0IGZyYW1lIGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZSBjdXJyZW50bHkgaW4KICogICBmb2N1cywgcmV0dXJuIHRoZSBib3R0b21tb3N0IGZyYW1lLiBFbHNlLCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YKICogICBgZm9jdXNMaW5lU3BlY2AgaW4gYHN0YXRlLnNvdXJjZUNvZGVgLgogKi8KZnVuY3Rpb24gY29tcHV0ZUJvdHRvbW1vc3RMaW5lU3BlYyhzdGF0ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3VycmVudEZvY3VzTGluZVNwZWMgPSBzdGF0ZS5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWM7CiAgICBpZiAoIXN0YXRlLnN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlKSB7CiAgICAgICAgcmV0dXJuIGN1cnJlbnRGb2N1c0xpbmVTcGVjOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9jdXNlZFN0YWNrRnJhbWUgPSBnZXRGb2N1c2VkU3RhY2tGcmFtZXNIZWxwZXIoc3RhdGUpOwogICAgaWYgKGZvY3VzZWRTdGFja0ZyYW1lID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGN1cnJlbnRGb2N1c0xpbmVTcGVjOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYm90dG9tbW9zdCA9IGdldEJvdHRvbW1vc3RTdGFja0ZyYW1lSW5Gb2N1c2VkRmlsZShmb2N1c2VkU3RhY2tGcmFtZSwgY3VycmVudEZvY3VzTGluZVNwZWMpOwogICAgaWYgKGJvdHRvbW1vc3QgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gY3VycmVudEZvY3VzTGluZVNwZWM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gYm90dG9tbW9zdDsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdnZXJfcmVkdWNlcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBERUZBVUxUX0VYRUNVVElPTl9QQUdFX1NJWkUgPSAxMDA7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVGQVVMVF9HUkFQSF9FWEVDVVRJT05fUEFHRV9TSVpFID0gMjAwOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxFeGVjdXRpb25zU3RhdGUoKSB7CiAgICByZXR1cm4gewogICAgICAgIG51bUV4ZWN1dGlvbnNMb2FkZWQ6IHsKICAgICAgICAgICAgc3RhdGU6IERhdGFMb2FkU3RhdGUuTk9UX0xPQURFRCwKICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBudWxsLAogICAgICAgIH0sCiAgICAgICAgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDogewogICAgICAgICAgICBsb2FkaW5nUmFuZ2VzOiBbXSwKICAgICAgICAgICAgbnVtRXhlY3V0aW9uczogMCwKICAgICAgICAgICAgcGFnZUxvYWRlZFNpemVzOiB7fSwKICAgICAgICB9LAogICAgICAgIC8vIFRPRE8oY2FpcykgUmVtb3ZlIHRoZSBoYXJkY29kaW5nIG9mIHRoaXMsIHdoaWNoIGlzIGNvdXBsZWQgd2l0aCBjc3Mgd2lkdGgKICAgICAgICAvLyBwcm9wZXJ0aWVzLgogICAgICAgIGRpc3BsYXlDb3VudDogNTAsCiAgICAgICAgcGFnZVNpemU6IERFRkFVTFRfRVhFQ1VUSU9OX1BBR0VfU0laRSwKICAgICAgICBzY3JvbGxCZWdpbkluZGV4OiAwLAogICAgICAgIGZvY3VzSW5kZXg6IG51bGwsCiAgICAgICAgZXhlY3V0aW9uRGlnZXN0czoge30sCiAgICAgICAgZXhlY3V0aW9uRGF0YToge30sCiAgICB9Owp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEdyYXBoRXhlY3V0aW9uc1N0YXRlKCkgewogICAgcmV0dXJuIHsKICAgICAgICBudW1FeGVjdXRpb25zTG9hZGVkOiB7CiAgICAgICAgICAgIHN0YXRlOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQsCiAgICAgICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogbnVsbCwKICAgICAgICB9LAogICAgICAgIGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ6IHsKICAgICAgICAgICAgbG9hZGluZ1JhbmdlczogW10sCiAgICAgICAgICAgIG51bUV4ZWN1dGlvbnM6IDAsCiAgICAgICAgICAgIHBhZ2VMb2FkZWRTaXplczoge30sCiAgICAgICAgfSwKICAgICAgICAvLyBUT0RPKGNhaXMpIFJlbW92ZSB0aGUgaGFyZGNvZGluZyBvZiB0aGlzLCB3aGljaCBpcyBjb3VwbGVkIHdpdGggY3NzIHdpZHRoCiAgICAgICAgLy8gcHJvcGVydGllcy4KICAgICAgICBkaXNwbGF5Q291bnQ6IDEwMCwKICAgICAgICBwYWdlU2l6ZTogREVGQVVMVF9HUkFQSF9FWEVDVVRJT05fUEFHRV9TSVpFLAogICAgICAgIHNjcm9sbEJlZ2luSW5kZXg6IDAsCiAgICAgICAgZm9jdXNJbmRleDogbnVsbCwKICAgICAgICBncmFwaEV4ZWN1dGlvbkRpZ2VzdHM6IHt9LAogICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlczogW10sCiAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzOiB7fSwKICAgICAgICBncmFwaEV4ZWN1dGlvbkRhdGE6IHt9LAogICAgfTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxHcmFwaHNTdGF0ZSgpIHsKICAgIHJldHVybiB7CiAgICAgICAgb3BzOiB7fSwKICAgICAgICBsb2FkaW5nT3BzOiB7fSwKICAgICAgICBmb2N1c2VkT3A6IG51bGwsCiAgICB9Owp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgaW5pdGlhbFN0YXRlJDIgPSB7CiAgICBydW5zOiB7fSwKICAgIHJ1bnNMb2FkZWQ6IHsKICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogbnVsbCwKICAgIH0sCiAgICBhY3RpdmVSdW5JZDogbnVsbCwKICAgIC8vIFRoZSBpbml0aWFsIHZhbHVlcyBvZiBsYXN0RGF0YVBvbGxPbnNldFRpbWVNcyBhbmQKICAgIC8vIGxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zIGVuc3VyZXMgdGhhdCBpbml0aWFsbHksIGJlZm9yZQogICAgLy8gdGhlIG9uc2V0IG9mIGFueSBkYXRhIHBvbGxpbmcsIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28KICAgIC8vIGlzIDAsIHdoaWNoIGNhdXNlcyBhIGJhY2tpbmctb2ZmIHBvbGxpbmcgYWxnb3JpdGhtIHRvIHVzZQogICAgLy8gdGhlIGxvd2VyLWJvdW5kIHBvbGxpbmcgaW50ZXJ2YWwuCiAgICBsYXN0RGF0YVBvbGxPbnNldFRpbWVNczogLTEsCiAgICBsYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNczogMSwKICAgIGFsZXJ0czogewogICAgICAgIGFsZXJ0c0xvYWRlZDogewogICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgICAgICBsYXN0TG9hZGVkVGltZUluTXM6IG51bGwsCiAgICAgICAgfSwKICAgICAgICBudW1BbGVydHM6IDAsCiAgICAgICAgYWxlcnRzQnJlYWtkb3duOiB7fSwKICAgICAgICBhbGVydHM6IHt9LAogICAgICAgIGV4ZWN1dGlvbkluZGljZXM6IHt9LAogICAgICAgIGdyYXBoRXhlY3V0aW9uSW5kaWNlczoge30sCiAgICAgICAgZm9jdXNUeXBlOiBudWxsLAogICAgfSwKICAgIGV4ZWN1dGlvbnM6IGNyZWF0ZUluaXRpYWxFeGVjdXRpb25zU3RhdGUoKSwKICAgIGdyYXBoRXhlY3V0aW9uczogY3JlYXRlSW5pdGlhbEdyYXBoRXhlY3V0aW9uc1N0YXRlKCksCiAgICBncmFwaHM6IGNyZWF0ZUluaXRpYWxHcmFwaHNTdGF0ZSgpLAogICAgc3RhY2tGcmFtZXM6IHt9LAogICAgY29kZUxvY2F0aW9uRm9jdXNUeXBlOiBudWxsLAogICAgc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGU6IGZhbHNlLAogICAgc291cmNlQ29kZTogewogICAgICAgIHNvdXJjZUZpbGVMaXN0TG9hZGVkOiB7CiAgICAgICAgICAgIHN0YXRlOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQsCiAgICAgICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogbnVsbCwKICAgICAgICB9LAogICAgICAgIHNvdXJjZUZpbGVMaXN0OiBbXSwKICAgICAgICBmaWxlQ29udGVudHM6IFtdLAogICAgICAgIGZvY3VzTGluZVNwZWM6IG51bGwsCiAgICB9LAp9OwovLyBUT0RPKGNhaXMpOiBBcyBgZXhlY3V0aW9uc2AgaXMgZ2V0dGluZyBsYXJnZSwgY3JlYXRlIGEgc3VicmVkdWNlciBmb3IgaXQuCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgcmVkdWNlciQyID0gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUkMiwgb24oZGVidWdnZXJSdW5zUmVxdWVzdGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHJ1bnNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucnVuc0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KTsKfSkpLCBvbihkZWJ1Z2dlclJ1bnNSZXF1ZXN0RmFpbGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHJ1bnNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucnVuc0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuRkFJTEVEIH0pIH0pOwp9KSksIG9uKGRlYnVnZ2VyUnVuc0xvYWRlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gX18xCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIHsgcnVucyB9KSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydW5JZHMgPSBPYmplY3Qua2V5cyhydW5zKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFjdGl2ZVJ1bkNoYW5nZWQgPSBydW5JZHMubGVuZ3RoID4gMCAmJiBzdGF0ZS5hY3RpdmVSdW5JZCA9PT0gbnVsbDsKICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBsYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNczogYWN0aXZlUnVuQ2hhbmdlZAogICAgICAgICAgICA/IERhdGUubm93KCkKICAgICAgICAgICAgOiBzdGF0ZS5sYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNcywgcnVucywgcnVuc0xvYWRlZDogewogICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FERUQsCiAgICAgICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogRGF0ZS5ub3coKSwKICAgICAgICB9LCBhY3RpdmVSdW5JZDogcnVuSWRzLmxlbmd0aCA+IDAgPyBydW5JZHNbMF0gOiBudWxsIH0pOwp9KSksIG9uKGRlYnVnZ2VyRGF0YVBvbGxPbnNldCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBsYXN0RGF0YVBvbGxPbnNldFRpbWVNczogRGF0ZS5ub3coKSB9KTsKfSkpLCBvbihudW1BbGVydHNBbmRCcmVha2Rvd25SZXF1ZXN0ZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGFsZXJ0czogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hbGVydHMpLCB7IGFsZXJ0c0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hbGVydHMuYWxlcnRzTG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FESU5HIH0pIH0pIH0pOwp9KSksIG9uKG51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gX18xCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIHsgbnVtQWxlcnRzLCBhbGVydHNCcmVha2Rvd24gfSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG51bUFsZXJ0c0luY3JlYXNlZCA9IG51bUFsZXJ0cyA+IHN0YXRlLmFsZXJ0cy5udW1BbGVydHM7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6IG51bUFsZXJ0c0luY3JlYXNlZAogICAgICAgICAgICA/IERhdGUubm93KCkKICAgICAgICAgICAgOiBzdGF0ZS5sYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNcywgYWxlcnRzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmFsZXJ0cyksIHsgYWxlcnRzTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmFsZXJ0cy5hbGVydHNMb2FkZWQpLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURFRCwgbGFzdExvYWRlZFRpbWVJbk1zOiBEYXRlLm5vdygpIH0pLCBudW1BbGVydHMsCiAgICAgICAgICAgIGFsZXJ0c0JyZWFrZG93biB9KSB9KTsKfSkpLCBvbihhbGVydHNPZlR5cGVMb2FkZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IG51bUFsZXJ0cywgYWxlcnRzQnJlYWtkb3duLCBhbGVydFR5cGUsIGJlZ2luLCBhbGVydHMgfSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHVwZGF0ZWRBbGVydHMgPSB7fTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGV4ZWN1dGlvbkluZGljZXMgPSBzdGF0ZS5hbGVydHMuZXhlY3V0aW9uSW5kaWNlc1thbGVydFR5cGVdCiAgICAgICAgPyBzdGF0ZS5hbGVydHMuZXhlY3V0aW9uSW5kaWNlc1thbGVydFR5cGVdLnNsaWNlKCkKICAgICAgICA6IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25JbmRpY2VzID0gc3RhdGUuYWxlcnRzCiAgICAgICAgLmdyYXBoRXhlY3V0aW9uSW5kaWNlc1thbGVydFR5cGVdCiAgICAgICAgPyBzdGF0ZS5hbGVydHMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzW2FsZXJ0VHlwZV0uc2xpY2UoKQogICAgICAgIDogW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsZXJ0cy5sZW5ndGg7ICsraSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbGVydEluZGV4ID0gYmVnaW4gKyBpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbGVydCA9IGFsZXJ0c1tpXTsKICAgICAgICB1cGRhdGVkQWxlcnRzW2FsZXJ0SW5kZXhdID0gYWxlcnQ7CiAgICAgICAgaWYgKGFsZXJ0LmFsZXJ0X3R5cGUgPT09IEFsZXJ0VHlwZS5JTkZfTkFOX0FMRVJUKSB7CiAgICAgICAgICAgIC8vIFRPT0QoY2Fpcyk6IERlYWwgd2l0aCBvdGhlciBhbGVydCB0eXBlcyB3aXRoIGV4ZWN1dGlvbiBpbmRleC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmZOYW5BbGVydCA9ICgvKiogQHR5cGUgez99ICovIChhbGVydCkpOwogICAgICAgICAgICBleGVjdXRpb25JbmRpY2VzW2FsZXJ0SW5kZXhdID0gaW5mTmFuQWxlcnQuZXhlY3V0aW9uX2luZGV4OwogICAgICAgICAgICBpZiAoaW5mTmFuQWxlcnQuZ3JhcGhfZXhlY3V0aW9uX3RyYWNlX2luZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBncmFwaEV4ZWN1dGlvbkluZGljZXNbYWxlcnRJbmRleF0gPQogICAgICAgICAgICAgICAgICAgIGluZk5hbkFsZXJ0LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChzdGF0ZS5hbGVydHMuYWxlcnRzW2FsZXJ0VHlwZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIE9iamVjdC5hc3NpZ24odXBkYXRlZEFsZXJ0cywgc3RhdGUuYWxlcnRzLmFsZXJ0c1thbGVydFR5cGVdKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBzY3JvbGxCZWdpbkluZGV4ID0gc3RhdGUuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGdyYXBoRXhlY3V0aW9uRm9jdXNJbmRleCA9IHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5mb2N1c0luZGV4OwogICAgaWYgKGFsZXJ0VHlwZSA9PT0gQWxlcnRUeXBlLklORl9OQU5fQUxFUlQgJiYgYmVnaW4gPT09IDApIHsKICAgICAgICAvLyBUT09EKGNhaXMpOiBEZWFsIHdpdGggb3RoZXIgYWxlcnQgdHlwZXMgd2l0aCBleGVjdXRpb24gaW5kZXguCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsZXJ0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0c1swXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleGVjdXRpb25JbmRleCA9IGFsZXJ0LmV4ZWN1dGlvbl9pbmRleDsKICAgICAgICAvLyBUcnkgdG8gc2Nyb2xsIHRoZSBmaXJzdCBhbGVydCB0byB0aGUgY2VudGVyIG9mIHRoZSB2aWV3LgogICAgICAgIHNjcm9sbEJlZ2luSW5kZXggPSBNYXRoLm1heCgwLCBleGVjdXRpb25JbmRleCAtIE1hdGguZmxvb3Ioc3RhdGUuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQgLyAyKSk7CiAgICAgICAgaWYgKGFsZXJ0LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICBncmFwaEV4ZWN1dGlvbkZvY3VzSW5kZXggPSBhbGVydC5ncmFwaF9leGVjdXRpb25fdHJhY2VfaW5kZXg7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucyksIHsgc2Nyb2xsQmVnaW5JbmRleCB9KSwgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgZm9jdXNJbmRleDogZ3JhcGhFeGVjdXRpb25Gb2N1c0luZGV4IH0pLCBhbGVydHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzKSwgeyBhbGVydHNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmFsZXJ0c0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BREVELCBsYXN0TG9hZGVkVGltZUluTXM6IERhdGUubm93KCkgfSksIG51bUFsZXJ0cywKICAgICAgICAgICAgYWxlcnRzQnJlYWtkb3duLCBhbGVydHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmFsZXJ0cyksIHsgW2FsZXJ0VHlwZV06IHVwZGF0ZWRBbGVydHMgfSksIGV4ZWN1dGlvbkluZGljZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXMpLCB7IFthbGVydFR5cGVdOiBleGVjdXRpb25JbmRpY2VzIH0pLCBncmFwaEV4ZWN1dGlvbkluZGljZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmdyYXBoRXhlY3V0aW9uSW5kaWNlcyksIHsgW2FsZXJ0VHlwZV06IGdyYXBoRXhlY3V0aW9uSW5kaWNlcyB9KSB9KSB9KTsKfSkpLCBvbihhbGVydFR5cGVGb2N1c1RvZ2dsZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IGFsZXJ0VHlwZSB9KSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGFsZXJ0czogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hbGVydHMpLCB7IGZvY3VzVHlwZTogc3RhdGUuYWxlcnRzLmZvY3VzVHlwZSA9PT0gYWxlcnRUeXBlID8gbnVsbCA6IGFsZXJ0VHlwZSB9KSB9KTsKICAgIC8vIElmIGFsZXJ0IGRhdGEgaXMgYXZhaWxhYmxlLCBmb2N1cyBvbnRvIHRoZSBleGVjdXRpb24gZGlnZXN0IHRoYXQKICAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBhbGVydC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGN1cnJlbnRGb2N1c1R5cGUgPSBuZXdTdGF0ZS5hbGVydHMuZm9jdXNUeXBlOwogICAgaWYgKGN1cnJlbnRGb2N1c1R5cGUgIT09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXhlY3V0aW9uSW5kaWNlcyA9IG5ld1N0YXRlLmFsZXJ0cy5leGVjdXRpb25JbmRpY2VzW2N1cnJlbnRGb2N1c1R5cGVdIHx8IFtdOwogICAgICAgIC8vIFRyeSB0byBwdXQgdGhlIGV4ZWN1dGlvbiBkaWdlc3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QKICAgICAgICAvLyBhbGVydCBhdCB0aGUgY2VudGVyIG9mIHRoZSB2aWV3LgogICAgICAgIGlmIChleGVjdXRpb25JbmRpY2VzWzBdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbmV3U3RhdGUuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4ID0gTWF0aC5tYXgoMCwgTnVtYmVyKGV4ZWN1dGlvbkluZGljZXNbMF0pIC0KICAgICAgICAgICAgICAgIE1hdGguZmxvb3IobmV3U3RhdGUuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQgLyAyKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ld1N0YXRlOwp9KSksIAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFJlZHVjZXJzIHJlbGF0ZWQgdG8gdG9wLWxldmVsIGV4ZWN1dGlvbi4gLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpvbihudW1FeGVjdXRpb25zUmVxdWVzdGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IG51bUV4ZWN1dGlvbnNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FESU5HIH0pIH0pIH0pOwp9KSksIG9uKG51bUV4ZWN1dGlvbnNMb2FkZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IG51bUV4ZWN1dGlvbnMgfSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG51bUV4ZWN1dGlvbnNJbmNyZWFzZWQgPSBudW1FeGVjdXRpb25zID4gc3RhdGUuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zOiBudW1FeGVjdXRpb25zSW5jcmVhc2VkCiAgICAgICAgICAgID8gRGF0ZS5ub3coKQogICAgICAgICAgICA6IHN0YXRlLmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zLCBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IG51bUV4ZWN1dGlvbnNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FERUQsIGxhc3RMb2FkZWRUaW1lSW5NczogRGF0ZS5ub3coKSB9KSwgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLCB7IG51bUV4ZWN1dGlvbnMgfSkgfSkgfSk7CiAgICBpZiAobnVtRXhlY3V0aW9ucyA+IDAgJiYgc3RhdGUuZXhlY3V0aW9ucy5mb2N1c0luZGV4ID09PSBudWxsKSB7CiAgICAgICAgbmV3U3RhdGUuZXhlY3V0aW9ucy5mb2N1c0luZGV4ID0gMDsKICAgIH0KICAgIHJldHVybiBuZXdTdGF0ZTsKfSkpLCBvbihleGVjdXRpb25EaWdlc3RzUmVxdWVzdGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSByYW5nZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCByYW5nZSkgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvYWRpbmdSYW5nZXMgPSBbCiAgICAgICAgLi4uc3RhdGUuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLmxvYWRpbmdSYW5nZXMsCiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWF0Y2ggPSBmaW5kQmVnaW5FbmRSYW5nZUluZGV4KGxvYWRpbmdSYW5nZXMsIHJhbmdlLmJlZ2luLCByYW5nZS5lbmQpOwogICAgaWYgKG1hdGNoID09PSAtMSkgewogICAgICAgIGxvYWRpbmdSYW5nZXMucHVzaCh7IGJlZ2luOiByYW5nZS5iZWdpbiwgZW5kOiByYW5nZS5lbmQgfSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucyksIHsgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLCB7IGxvYWRpbmdSYW5nZXMgfSkgfSkgfSk7CiAgICByZXR1cm4gbmV3U3RhdGU7Cn0pKSwgb24oZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gZGlnZXN0cwogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCBkaWdlc3RzKSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbG9hZGluZ1JhbmdlcyA9IFsKICAgICAgICAuLi5zdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubG9hZGluZ1JhbmdlcywKICAgIF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXRjaEluZGV4ID0gZmluZEJlZ2luRW5kUmFuZ2VJbmRleChsb2FkaW5nUmFuZ2VzLCBkaWdlc3RzLmJlZ2luLCBkaWdlc3RzLmVuZCk7CiAgICBpZiAobWF0Y2hJbmRleCAhPT0gLTEpIHsKICAgICAgICBsb2FkaW5nUmFuZ2VzLnNwbGljZShtYXRjaEluZGV4LCAxKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBleGVjdXRpb25EaWdlc3RzTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCksIHsgbnVtRXhlY3V0aW9uczogZGlnZXN0cy5udW1fZGlnZXN0cywgbG9hZGluZ1JhbmdlcyB9KSwgZXhlY3V0aW9uRGlnZXN0czogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzKSB9KSB9KTsKICAgIGZvciAobGV0IGkgPSBkaWdlc3RzLmJlZ2luOyBpIDwgZGlnZXN0cy5lbmQ7ICsraSkgewogICAgICAgIG5ld1N0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c1tpXSA9CiAgICAgICAgICAgIGRpZ2VzdHMuZXhlY3V0aW9uX2RpZ2VzdHNbaSAtIGRpZ2VzdHMuYmVnaW5dOwogICAgfQogICAgLy8gVXBkYXRlIHBhZ2VzTG9hZGVkSW5GdWxsLgogICAgaWYgKGRpZ2VzdHMuZW5kID4gZGlnZXN0cy5iZWdpbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBkaWdlc3RzLmJlZ2luIC8gc3RhdGUuZXhlY3V0aW9ucy5wYWdlU2l6ZTsKICAgICAgICBuZXdTdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQucGFnZUxvYWRlZFNpemVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXdTdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQucGFnZUxvYWRlZFNpemVzKSwgeyBbcGFnZUluZGV4XTogZGlnZXN0cy5lbmQgLSBkaWdlc3RzLmJlZ2luIH0pOwogICAgfQogICAgcmV0dXJuIG5ld1N0YXRlOwp9KSksIG9uKGV4ZWN1dGlvblNjcm9sbExlZnQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiB7CiAgICAvLyBUT0RPKGNhaXMpOiBMZWZ0LXJpZ2h0IG5hdmlnYXRpb24gc2hvdWxkIGhhdmUgbW9yZSBjb250ZXh0LWRlcGVkZW50CiAgICAvLyBiZWhhdmlvciwgZS5nLiwgd2hlbiBhbGVydHMgYXJlIHByZXNlbnQuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHNjcm9sbEJlZ2luSW5kZXggPSBzdGF0ZS5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7CiAgICBpZiAoc2Nyb2xsQmVnaW5JbmRleCA+IDApIHsKICAgICAgICBzY3JvbGxCZWdpbkluZGV4LS07CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBzY3JvbGxCZWdpbkluZGV4IH0pIH0pOwp9KSksIG9uKGV4ZWN1dGlvblNjcm9sbFJpZ2h0LCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgLy8gVE9ETyhjYWlzKTogTGVmdC1yaWdodCBuYXZpZ2F0aW9uIHNob3VsZCBoYXZlIG1vcmUgY29udGV4dC1kZXBlZGVudAogICAgLy8gYmVoYXZpb3IsIGUuZy4sIHdoZW4gYWxlcnRzIGFyZSBwcmVzZW50LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBzY3JvbGxCZWdpbkluZGV4ID0gc3RhdGUuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4OwogICAgaWYgKHNjcm9sbEJlZ2luSW5kZXggKyBzdGF0ZS5leGVjdXRpb25zLmRpc3BsYXlDb3VudCArIDEgPD0KICAgICAgICBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucykgewogICAgICAgIHNjcm9sbEJlZ2luSW5kZXgrKzsKICAgIH0KICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IHNjcm9sbEJlZ2luSW5kZXggfSkgfSk7Cn0pKSwgb24oZXhlY3V0aW9uU2Nyb2xsVG9JbmRleCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gYWN0aW9uCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIGFjdGlvbikgPT4gewogICAgaWYgKGFjdGlvbi5pbmRleCA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIoYWN0aW9uLmluZGV4KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBzY3JvbGwgdG8gbmVnYXRpdmUgb3Igbm9uLWludGVnZXIgZXhlY3V0aW9uIGluZGV4IGAgKwogICAgICAgICAgICBgKCR7YWN0aW9uLmluZGV4fSlgKTsKICAgIH0KICAgIGNvbnN0IHsgZGlzcGxheUNvdW50IH0gPSBzdGF0ZS5leGVjdXRpb25zOwogICAgY29uc3QgeyBudW1FeGVjdXRpb25zIH0gPSBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ7CiAgICBpZiAoYWN0aW9uLmluZGV4ID4gTWF0aC5tYXgoMCwgbnVtRXhlY3V0aW9ucyAtIGRpc3BsYXlDb3VudCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHQgdG8gc2Nyb2xsIHRvIGV4ZWN1dGlvbiBpbmRleCAoJHthY3Rpb24uaW5kZXh9KSwgYCArCiAgICAgICAgICAgIGB3aGljaCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBpbmRleCBgICsKICAgICAgICAgICAgYChudW1FeGVjdXRpb25zPSR7bnVtRXhlY3V0aW9uc307IGRpc3BsYXlDb3VudD0ke2Rpc3BsYXlDb3VudH0pYCk7CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBzY3JvbGxCZWdpbkluZGV4OiBhY3Rpb24uaW5kZXggfSkgfSk7Cn0pKSwgb24oZXhlY3V0aW9uRGlnZXN0Rm9jdXNlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gYWN0aW9uCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIGFjdGlvbikgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IGZvY3VzSW5kZXg6IHN0YXRlLmV4ZWN1dGlvbnMuc2Nyb2xsQmVnaW5JbmRleCArIGFjdGlvbi5kaXNwbGF5SW5kZXggfSksIGNvZGVMb2NhdGlvbkZvY3VzVHlwZTogQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04sIHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNvdXJjZUNvZGUpIH0pOwogICAgbmV3U3RhdGUuc291cmNlQ29kZS5mb2N1c0xpbmVTcGVjID0gY29tcHV0ZUJvdHRvbW1vc3RMaW5lU3BlYyhuZXdTdGF0ZSk7CiAgICByZXR1cm4gbmV3U3RhdGU7Cn0pKSwgb24oZXhlY3V0aW9uRGF0YUxvYWRlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IGV4ZWN1dGlvbkRhdGE6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGF0YSkgfSkgfSk7CiAgICBmb3IgKGxldCBpID0gZGF0YS5iZWdpbjsgaSA8IGRhdGEuZW5kOyArK2kpIHsKICAgICAgICBuZXdTdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRhdGFbaV0gPSBkYXRhLmV4ZWN1dGlvbnNbaSAtIGRhdGEuYmVnaW5dOwogICAgfQogICAgcmV0dXJuIG5ld1N0YXRlOwp9KSksIAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gUmVkdWNlcnMgcmVsYXRlZCB0byBpbnRyYS1ncmFwaCBleGVjdXRpb24uIC8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpvbihudW1HcmFwaEV4ZWN1dGlvbnNSZXF1ZXN0ZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiB7CiAgICBpZiAoc3RhdGUuYWN0aXZlUnVuSWQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgbnVtRXhlY3V0aW9uc0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMubnVtRXhlY3V0aW9uc0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KSB9KTsKfSkpLCBvbihudW1HcmFwaEV4ZWN1dGlvbnNMb2FkZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IG51bUdyYXBoRXhlY3V0aW9ucyB9KSA9PiB7CiAgICBpZiAoc3RhdGUuYWN0aXZlUnVuSWQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBudW1HcmFwaEV4ZWN1dGlvbnNJbmNyZWFzZWQgPSBudW1HcmFwaEV4ZWN1dGlvbnMgPgogICAgICAgIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zOiBudW1HcmFwaEV4ZWN1dGlvbnNJbmNyZWFzZWQKICAgICAgICAgICAgPyBEYXRlLm5vdygpCiAgICAgICAgICAgIDogc3RhdGUubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXMsIGdyYXBoRXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMpLCB7IG51bUV4ZWN1dGlvbnNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhFeGVjdXRpb25zLm51bUV4ZWN1dGlvbnNMb2FkZWQpLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURFRCwgbGFzdExvYWRlZFRpbWVJbk1zOiBEYXRlLm5vdygpIH0pLCBleGVjdXRpb25EaWdlc3RzTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkKSwgeyBudW1FeGVjdXRpb25zOiBudW1HcmFwaEV4ZWN1dGlvbnMgfSkgfSkgfSk7CiAgICBpZiAobnVtR3JhcGhFeGVjdXRpb25zID4gMCAmJiBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZm9jdXNJbmRleCA9PT0gbnVsbCkgewogICAgICAgIG5ld1N0YXRlLmdyYXBoRXhlY3V0aW9ucy5mb2N1c0luZGV4ID0gMDsKICAgIH0KICAgIHJldHVybiBuZXdTdGF0ZTsKfSkpLCBvbihncmFwaEV4ZWN1dGlvbkRhdGFSZXF1ZXN0ZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IF9fMQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCB7IHBhZ2VJbmRleCB9KSA9PiB7CiAgICBpZiAoc3RhdGUuYWN0aXZlUnVuSWQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMgPSBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLnNsaWNlKCk7CiAgICBpZiAoZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLmluZGV4T2YocGFnZUluZGV4KSA9PT0gLTEpIHsKICAgICAgICBncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMucHVzaChwYWdlSW5kZXgpOwogICAgfQogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGdyYXBoRXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMpLCB7IGdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcyB9KSB9KTsKfSkpLCBvbihncmFwaEV4ZWN1dGlvbkRhdGFMb2FkZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IGRhdGEKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgZGF0YSkgPT4gewogICAgaWYgKHN0YXRlLmFjdGl2ZVJ1bklkID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQogICAgY29uc3QgeyBwYWdlU2l6ZSB9ID0gc3RhdGUuZ3JhcGhFeGVjdXRpb25zOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzID0gc3RhdGUuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcy5zbGljZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplcyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBncmFwaEV4ZWN1dGlvbkRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhKTsKICAgIGZvciAobGV0IGkgPSBkYXRhLmJlZ2luOyBpIDwgZGF0YS5lbmQ7ICsraSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBNYXRoLmZsb29yKGkgLyBwYWdlU2l6ZSk7CiAgICAgICAgaWYgKGdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcy5pbmRleE9mKHBhZ2VJbmRleCkgIT09IC0xKSB7CiAgICAgICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcy5zcGxpY2UoZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLmluZGV4T2YocGFnZUluZGV4KSwgMSk7CiAgICAgICAgfQogICAgICAgIGlmIChncmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXNbcGFnZUluZGV4XSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplc1twYWdlSW5kZXhdID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGdyYXBoRXhlY3V0aW9uRGF0YVtpXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplc1twYWdlSW5kZXhdKys7CiAgICAgICAgfQogICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YVtpXSA9IGRhdGEuZ3JhcGhfZXhlY3V0aW9uc1tpIC0gZGF0YS5iZWdpbl07CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLAogICAgICAgICAgICBncmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXMsCiAgICAgICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YSB9KSB9KTsKfSkpLCBvbihncmFwaEV4ZWN1dGlvblNjcm9sbFRvSW5kZXgsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IGFjdGlvbgogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgIGlmIChhY3Rpb24uaW5kZXggPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGFjdGlvbi5pbmRleCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHQgdG8gc2Nyb2xsIHRvIG5lZ2F0aXZlIG9yIG5vbi1pbnRlZ2VyIGdyYXBoLWV4ZWN1dGlvbiBgICsKICAgICAgICAgICAgYGluZGV4ICgke2FjdGlvbi5pbmRleH0pYCk7CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgc2Nyb2xsQmVnaW5JbmRleDogYWN0aW9uLmluZGV4IH0pIH0pOwp9KSksIG9uKGdyYXBoRXhlY3V0aW9uRm9jdXNlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gYWN0aW9uCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIGFjdGlvbikgPT4gewogICAgcmV0dXJuIGdyYXBoT3BGb2N1c1JlZHVjZXJIZWxwZXIoc3RhdGUsIGFjdGlvbi5ncmFwaF9pZCwgYWN0aW9uLm9wX25hbWUsIGFjdGlvbi5pbmRleCk7Cn0pKSwgCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBSZWR1Y2VycyByZWxhdGVkIHRvIGdyYXBoIHN0cnVjdHVyZXMuICAgICAgLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCm9uKGdyYXBoT3BGb2N1c2VkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHJldHVybiB7P30KICovCihzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICByZXR1cm4gZ3JhcGhPcEZvY3VzUmVkdWNlckhlbHBlcihzdGF0ZSwgYWN0aW9uLmdyYXBoX2lkLCBhY3Rpb24ub3BfbmFtZSk7Cn0pKSwgb24oZ3JhcGhPcEluZm9SZXF1ZXN0ZWQsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcGFyYW0gez99IGRhdGEKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgZGF0YSkgPT4gewogICAgY29uc3QgeyBncmFwaF9pZCwgb3BfbmFtZSB9ID0gZGF0YTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBocyksIHsgbG9hZGluZ09wczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHMpIH0pIH0pOwogICAgaWYgKG5ld1N0YXRlLmdyYXBocy5sb2FkaW5nT3BzW2dyYXBoX2lkXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbmV3U3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHNbZ3JhcGhfaWRdID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCFuZXdTdGF0ZS5ncmFwaHMubG9hZGluZ09wc1tncmFwaF9pZF0uaGFzKG9wX25hbWUpKSB7CiAgICAgICAgbmV3U3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHNbZ3JhcGhfaWRdLnNldChvcF9uYW1lLCBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgfQogICAgcmV0dXJuIG5ld1N0YXRlOwp9KSksIG9uKGdyYXBoT3BJbmZvTG9hZGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBkYXRhCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUsIGRhdGEpID0+IHsKICAgIGNvbnN0IHsgZ3JhcGhPcEluZm9SZXNwb25zZSB9ID0gZGF0YTsKICAgIGNvbnN0IHsgZ3JhcGhfaWRzIH0gPSBncmFwaE9wSW5mb1Jlc3BvbnNlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ3JhcGhJZCA9IGdyYXBoX2lkc1tncmFwaF9pZHMubGVuZ3RoIC0gMV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGdyYXBoczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaHMpLCB7IG9wczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaHMub3BzKSwgeyBbZ3JhcGhJZF06IG5ldyBNYXAoc3RhdGUuZ3JhcGhzLm9wc1tncmFwaElkXSkgfSksIGxvYWRpbmdPcHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHMpLCB7IFtncmFwaElkXTogbmV3IE1hcChzdGF0ZS5ncmFwaHMubG9hZGluZ09wc1tncmFwaElkXSkgfSkgfSkgfSk7CiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGdyYXBoT3BJbmZvUmVzcG9uc2UuaW5wdXRzKSB7CiAgICAgICAgaWYgKCFpbnB1dC5kYXRhKSB7CiAgICAgICAgICAgIC8vIGBpbnB1dC5kYXRhYCBjYW4gYmUgdW5kZWZpbmVkIHdoZW4gdGhlIGJhY2tlbmQgZmFpbHMgdG8gbG9vayB1cAogICAgICAgICAgICAvLyBkZXRhaWxlZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGlucHV0IG9wIChlLmcuLCBmb3IgY2VydGFpbgogICAgICAgICAgICAvLyBURi1pbnRlcm5hbCBvcHMgc3VjaCBhcyBTdGF0ZWZ1bFBhcnRpdGlvbmVkQ2FsbCkuCiAgICAgICAgICAgIC8vIFNhbWUgZm9yIGBjb25zdW1lci5kYXRhYCBiZWxvdy4KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIG5ld1N0YXRlLmdyYXBocy5vcHNbZ3JhcGhJZF0uc2V0KGlucHV0Lm9wX25hbWUsIGlucHV0LmRhdGEpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmFwaE9wSW5mb1Jlc3BvbnNlLmNvbnN1bWVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgZ3JhcGhPcEluZm9SZXNwb25zZS5jb25zdW1lcnNbaV0pIHsKICAgICAgICAgICAgaWYgKCFjb25zdW1lci5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXdTdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdLnNldChjb25zdW1lci5vcF9uYW1lLCBjb25zdW1lci5kYXRhKTsKICAgICAgICB9CiAgICB9CiAgICBuZXdTdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdLnNldChncmFwaE9wSW5mb1Jlc3BvbnNlLm9wX25hbWUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ3JhcGhPcEluZm9SZXNwb25zZSksIHsgaW5wdXRzOiBncmFwaE9wSW5mb1Jlc3BvbnNlLmlucHV0cy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5wdXQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChpbnB1dCkgPT4gKHsKICAgICAgICAgICAgb3BfbmFtZTogaW5wdXQub3BfbmFtZSwKICAgICAgICAgICAgb3V0cHV0X3Nsb3Q6IGlucHV0Lm91dHB1dF9zbG90LAogICAgICAgIH0pKSksIGNvbnN1bWVyczogZ3JhcGhPcEluZm9SZXNwb25zZS5jb25zdW1lcnMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNsb3RDb25zdW1lcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzbG90Q29uc3VtZXJzKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBzbG90Q29uc3VtZXJzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29uc3VtZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb25zdW1lcikgPT4gKHsKICAgICAgICAgICAgICAgIG9wX25hbWU6IGNvbnN1bWVyLm9wX25hbWUsCiAgICAgICAgICAgICAgICBpbnB1dF9zbG90OiBjb25zdW1lci5pbnB1dF9zbG90LAogICAgICAgICAgICB9KSkpOwogICAgICAgIH0pKSB9KSk7CiAgICAvLyBSZW1vdmUgdGhlIGxvYWRpbmcgbWFya2VyIGZvciB0aGUgb3AuCiAgICBuZXdTdGF0ZS5ncmFwaHMubG9hZGluZ09wc1tncmFwaElkXS5zZXQoZ3JhcGhPcEluZm9SZXNwb25zZS5vcF9uYW1lLCBEYXRhTG9hZFN0YXRlLkxPQURFRCk7CiAgICByZXR1cm4gbmV3U3RhdGU7Cn0pKSwgCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFJlZHVjZXJzIHJlbGF0ZWQgdG8gc291cmNlIGZpbGVzIGFuZCBzdGFjayB0cmFjZXMuIC8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCm9uKHNvdXJjZUZpbGVMaXN0UmVxdWVzdGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZSksIHsgc291cmNlRmlsZUxpc3RMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZS5zb3VyY2VGaWxlTGlzdExvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KSB9KTsKfSkpLCBvbihzb3VyY2VGaWxlTGlzdExvYWRlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gc291cmNlRmlsZUxpc3QKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgc291cmNlRmlsZUxpc3QpID0+IHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc291cmNlQ29kZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zb3VyY2VDb2RlKSwgeyBzb3VyY2VGaWxlTGlzdExvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zb3VyY2VDb2RlLnNvdXJjZUZpbGVMaXN0TG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FERUQsIGxhc3RMb2FkZWRUaW1lSW5NczogRGF0ZS5ub3coKSB9KSwgc291cmNlRmlsZUxpc3Q6IHNvdXJjZUZpbGVMaXN0LnNvdXJjZUZpbGVzLCBmaWxlQ29udGVudHM6IHN0YXRlLnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzLnNsaWNlKCkgfSkgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdOdW1GaWxlcyA9IHNvdXJjZUZpbGVMaXN0LnNvdXJjZUZpbGVzLmxlbmd0aDsKICAgIGNvbnN0IHsgZmlsZUNvbnRlbnRzIH0gPSBuZXdTdGF0ZS5zb3VyY2VDb2RlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdOdW1GaWxlczsgKytpKSB7CiAgICAgICAgZmlsZUNvbnRlbnRzW2ldID0gc3RhdGUuc291cmNlQ29kZS5maWxlQ29udGVudHNbaV0gfHwgewogICAgICAgICAgICBsb2FkU3RhdGU6IERhdGFMb2FkU3RhdGUuTk9UX0xPQURFRCwKICAgICAgICAgICAgbGluZXM6IG51bGwsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBuZXdTdGF0ZTsKfSkpLCBvbihzb3VyY2VMaW5lRm9jdXNlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gZm9jdXMKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgZm9jdXMpID0+IHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZvY3VzZWRTdGFja1RyYWNlID0gZ2V0Rm9jdXNlZFN0YWNrRnJhbWVzSGVscGVyKHN0YXRlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc291cmNlQ29kZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zb3VyY2VDb2RlKSwgeyBmb2N1c0xpbmVTcGVjOiBmb2N1cy5zdGFja0ZyYW1lIH0pIH0pOwogICAgaWYgKGZvY3VzZWRTdGFja1RyYWNlICE9PSBudWxsKSB7CiAgICAgICAgbmV3U3RhdGUuc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUgPSBpc0ZyYW1lQm90dG9tbW9zdEluU3RhY2tUcmFjZShmb2N1c2VkU3RhY2tUcmFjZSwgZm9jdXMuc3RhY2tGcmFtZSk7CiAgICB9CiAgICByZXR1cm4gbmV3U3RhdGU7Cn0pKSwgb24oc291cmNlRmlsZVJlcXVlc3RlZCwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gc291cmNlRmlsZVNwZWMKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgc291cmNlRmlsZVNwZWMpID0+IHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc291cmNlQ29kZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zb3VyY2VDb2RlKSwgeyBmaWxlQ29udGVudHM6IHN0YXRlLnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzLnNsaWNlKCkgfSkgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmaWxlSW5kZXggPSBmaW5kRmlsZUluZGV4KG5ld1N0YXRlLnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3QsIHNvdXJjZUZpbGVTcGVjKTsKICAgIGlmIChmaWxlSW5kZXggPj0gMCkgewogICAgICAgIG5ld1N0YXRlLnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzW2ZpbGVJbmRleF0ubG9hZFN0YXRlID0KICAgICAgICAgICAgRGF0YUxvYWRTdGF0ZS5MT0FESU5HOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUgaW4gZmlsZSBsaXN0OiBgICsKICAgICAgICAgICAgYGhvc3RfbmFtZT0iJHtzb3VyY2VGaWxlU3BlYy5ob3N0X25hbWV9IiwgYCArCiAgICAgICAgICAgIGBmaWxlX3BhdGg9IiR7c291cmNlRmlsZVNwZWMuZmlsZV9wYXRofSJgKTsKICAgIH0KICAgIHJldHVybiBuZXdTdGF0ZTsKfSkpLCBvbihzb3VyY2VGaWxlTG9hZGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBzb3VyY2VGaWxlUmVzcG9uc2UKICogQHJldHVybiB7P30KICovCihzdGF0ZSwgc291cmNlRmlsZVJlc3BvbnNlKSA9PiB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZSksIHsgZmlsZUNvbnRlbnRzOiBzdGF0ZS5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zbGljZSgpIH0pIH0pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZmlsZUluZGV4ID0gZmluZEZpbGVJbmRleChuZXdTdGF0ZS5zb3VyY2VDb2RlLnNvdXJjZUZpbGVMaXN0LCBzb3VyY2VGaWxlUmVzcG9uc2UpOwogICAgaWYgKGZpbGVJbmRleCA+PSAwKSB7CiAgICAgICAgbmV3U3RhdGUuc291cmNlQ29kZS5maWxlQ29udGVudHNbZmlsZUluZGV4XSA9IHsKICAgICAgICAgICAgbG9hZFN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURFRCwKICAgICAgICAgICAgbGluZXM6IHNvdXJjZUZpbGVSZXNwb25zZS5saW5lcywKICAgICAgICB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUgaW4gZmlsZSBsaXN0OiBgICsKICAgICAgICAgICAgYGhvc3RfbmFtZT0iJHtzb3VyY2VGaWxlUmVzcG9uc2UuaG9zdF9uYW1lfSIsIGAgKwogICAgICAgICAgICBgZmlsZV9wYXRoPSIke3NvdXJjZUZpbGVSZXNwb25zZS5maWxlX3BhdGh9ImApOwogICAgfQogICAgcmV0dXJuIG5ld1N0YXRlOwp9KSksIG9uKHN0YWNrRnJhbWVzTG9hZGVkLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lcwogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCBzdGFja0ZyYW1lcykgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc3RhY2tGcmFtZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3RhY2tGcmFtZXMpLCBzdGFja0ZyYW1lcy5zdGFja0ZyYW1lcyksIHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNvdXJjZUNvZGUpIH0pOwogICAgbmV3U3RhdGUuc291cmNlQ29kZS5mb2N1c0xpbmVTcGVjID0gY29tcHV0ZUJvdHRvbW1vc3RMaW5lU3BlYyhuZXdTdGF0ZSk7CiAgICByZXR1cm4gbmV3U3RhdGU7Cn0pKSk7Ci8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEBwYXJhbSB7P30gZ3JhcGhJZAogKiBAcGFyYW0gez99IG9wTmFtZQogKiBAcGFyYW0gez89fSBncmFwaEV4ZWN1dGlvbkluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBncmFwaE9wRm9jdXNSZWR1Y2VySGVscGVyKHN0YXRlLCBncmFwaElkLCBvcE5hbWUsIGdyYXBoRXhlY3V0aW9uSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBocyksIHsgZm9jdXNlZE9wOiB7CiAgICAgICAgICAgICAgICBncmFwaElkLAogICAgICAgICAgICAgICAgb3BOYW1lLAogICAgICAgICAgICB9IH0pLCBjb2RlTG9jYXRpb25Gb2N1c1R5cGU6IENvZGVMb2NhdGlvblR5cGUuR1JBUEhfT1BfQ1JFQVRJT04sIHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNvdXJjZUNvZGUpIH0pOwogICAgbmV3U3RhdGUuc291cmNlQ29kZS5mb2N1c0xpbmVTcGVjID0gY29tcHV0ZUJvdHRvbW1vc3RMaW5lU3BlYyhuZXdTdGF0ZSk7CiAgICBpZiAoZ3JhcGhFeGVjdXRpb25JbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbmV3U3RhdGUuZ3JhcGhFeGVjdXRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMpLCB7IGZvY3VzSW5kZXg6IGdyYXBoRXhlY3V0aW9uSW5kZXggfSk7CiAgICB9CiAgICByZXR1cm4gbmV3U3RhdGU7Cn0KLy8gVE9ETyhjYWlzKTogUmVmYWN0b3IgdGhlIHJlZHVjZXJzIGludG8gc2VwYXJhdGUgY2hpbGQgcmVkdWNlcnMgYW5kCi8vIG1vdmUgdGhlbSB0byBzZXBhcmF0ZSBmaWxlcy4gQ29tYmluZSB0aGVtIHdpdGggYGNvbWJpbmVSZWR1Y2VycygpYAovLyBmb3IgYmV0dGVyIG1haW50YWluYWJpbGl0eS4KLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlZHVjZXJzJDIoc3RhdGUsIGFjdGlvbikgewogICAgcmV0dXJuIHJlZHVjZXIkMihzdGF0ZSwgYWN0aW9uKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdnZXJfc2VsZWN0b3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3Qgc2VsZWN0RGVidWdnZXJTdGF0ZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcihERUJVR0dFUl9GRUFUVVJFX0tFWSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0RGVidWdnZXJSdW5MaXN0aW5nID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBzdGF0ZS5ydW5zOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0RGVidWdnZXJSdW5zTG9hZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHN0YXRlLnJ1bnNMb2FkZWQpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRBY3RpdmVSdW5JZCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiBzdGF0ZS5hY3RpdmVSdW5JZCkpOwovKioKICogR2V0IHRoZSB0aW1lIGVsYXBzZWQgZnJvbSB0aGUgbGFzdCB0aW1lIGF0IHdoaWNoIGEgZGF0YSBwb2xsaW5nCiAqIHlpZWxkZWQgbmV3IGRhdGEgYW5kIHRoZSBsYXN0IHBvbGxpbmcgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgogKiBUaGF0IGlzOiB0aGlzIGlzIGhvdyBsb25nIHBvbGxpbmcgaGFzIHlpZWxkZWQgbm8gbmV3IGRhdGEuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZ2V0UG9sbFNpbGVuY2VUaW1lTXMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gewogICAgcmV0dXJuIHN0YXRlLmxhc3REYXRhUG9sbE9uc2V0VGltZU1zIC0gc3RhdGUubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM7Cn0pKTsKLyoqCiAqIEludGVybWVkaWF0ZSBzZWxlY3RvciBmb3IgYWxlcnRzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IHNlbGVjdEFsZXJ0cyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiBzdGF0ZS5hbGVydHMpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRBbGVydHNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICogQHBhcmFtIHs/fSBhbGVydHMKICogQHJldHVybiB7P30KICovCihhbGVydHMpID0+IHsKICAgIHJldHVybiBhbGVydHMuYWxlcnRzTG9hZGVkOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0TnVtQWxlcnRzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0QWxlcnRzLCAoLyoqCiAqIEBwYXJhbSB7P30gYWxlcnRzCiAqIEByZXR1cm4gez99CiAqLwooYWxlcnRzKSA9PiB7CiAgICByZXR1cm4gYWxlcnRzLm51bUFsZXJ0czsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEFsZXJ0c0ZvY3VzVHlwZSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEFsZXJ0cywgKC8qKgogKiBAcGFyYW0gez99IGFsZXJ0cwogKiBAcmV0dXJuIHs/fQogKi8KKGFsZXJ0cykgPT4gewogICAgcmV0dXJuIGFsZXJ0cy5mb2N1c1R5cGU7Cn0pKTsKLyoqCiAqIEdldCBudW1iZXIgb2YgYWxlcnRzIG9mIHRoZSBhbGVydCB0eXBlIGJlaW5nIGZvY3VzZWQgb24uCiAqCiAqIElmIG5vIGFsZXJ0IHR5cGUgZm9jdXMgZXhpc3RzLCByZXR1cm5zIDAuCiAqIFRoZSByZXR1cm5lZCBudW1iZXIgaXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZXRhaWxlZCBBbGVydHMKICogZGF0YSBoYXZlIGJlZW4gbG9hZGVkIGJ5IHRoZSBmcm9udCBlbmQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZ2V0TnVtQWxlcnRzT2ZGb2N1c2VkVHlwZSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEFsZXJ0cywgKC8qKgogKiBAcGFyYW0gez99IGFsZXJ0cwogKiBAcmV0dXJuIHs/fQogKi8KKGFsZXJ0cykgPT4gewogICAgaWYgKGFsZXJ0cy5mb2N1c1R5cGUgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBhbGVydHMuYWxlcnRzQnJlYWtkb3duW2FsZXJ0cy5mb2N1c1R5cGVdIHx8IDA7Cn0pKTsKLyoqCiAqIEdldCB0aGUgQWxlcnRzIHRoYXQgYXJlIDEpIG9mIHRoZSB0eXBlIGJlaW5nIGZvY3VzZWQgb24sIGFuZAogKiAyKSBhbHJlYWR5IGxvYWRlZCBieSB0aGUgZnJvbnQgZW5kLgogKgogKiBJZiBubyBhbGVydCB0eXBlIGZvY3VzIGV4aXN0cywgcmV0dXJucyBudWxsLgogKiBAdHlwZSB7P30KICovCmNvbnN0IGdldExvYWRlZEFsZXJ0c09mRm9jdXNlZFR5cGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICogQHBhcmFtIHs/fSBhbGVydHMKICogQHJldHVybiB7P30KICovCihhbGVydHMpID0+IHsKICAgIGlmIChhbGVydHMuZm9jdXNUeXBlID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYWxlcnRzLmFsZXJ0c1thbGVydHMuZm9jdXNUeXBlXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gYWxlcnRzLmFsZXJ0c1thbGVydHMuZm9jdXNUeXBlXTsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEFsZXJ0c0JyZWFrZG93biA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEFsZXJ0cywgKC8qKgogKiBAcGFyYW0gez99IGFsZXJ0cwogKiBAcmV0dXJuIHs/fQogKi8KKGFsZXJ0cykgPT4gewogICAgcmV0dXJuIGFsZXJ0cy5hbGVydHNCcmVha2Rvd247Cn0pKTsKLyoqCiAqIEludGVybWVpZGF0ZSBzZWxlY3RvciBmb3IgZXhlY3V0aW9ucy4KICogQHR5cGUgez99CiAqLwpjb25zdCBzZWxlY3RFeGVjdXRpb25zU3RhdGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gc3RhdGUuZXhlY3V0aW9ucykpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldE51bUV4ZWN1dGlvbnNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGV4ZWN1dGlvbnMubnVtRXhlY3V0aW9uc0xvYWRlZDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldE51bUV4ZWN1dGlvbnMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5udW1FeGVjdXRpb25zOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0RXhlY3V0aW9uU2Nyb2xsQmVnaW5JbmRleCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEV4ZWN1dGlvbnNTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICogQHJldHVybiB7P30KICovCihleGVjdXRpb25zKSA9PiB7CiAgICByZXR1cm4gZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4Owp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0RXhlY3V0aW9uUGFnZVNpemUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGV4ZWN1dGlvbnMucGFnZVNpemU7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXREaXNwbGF5Q291bnQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGV4ZWN1dGlvbnMuZGlzcGxheUNvdW50Owp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0VmlzaWJsZUV4ZWN1dGlvbkRpZ2VzdHMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlnZXN0cyA9IFtdOwogICAgZm9yIChsZXQgZXhlY3V0aW9uSW5kZXggPSBleGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7IGV4ZWN1dGlvbkluZGV4IDwgZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4ICsgZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQ7ICsrZXhlY3V0aW9uSW5kZXgpIHsKICAgICAgICBpZiAoZXhlY3V0aW9uSW5kZXggaW4gZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzKSB7CiAgICAgICAgICAgIGRpZ2VzdHMucHVzaChleGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNbZXhlY3V0aW9uSW5kZXhdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRpZ2VzdHMucHVzaChudWxsKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZGlnZXN0czsKfSkpOwovKioKICogSW50ZXJtZWRpYXRlIHNlbGVjdG9yIGZvciBhbGVydHMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3Qgc2VsZWN0R3JhcGhFeGVjdXRpb25zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHN0YXRlLmdyYXBoRXhlY3V0aW9ucykpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldE51bUdyYXBoRXhlY3V0aW9uc0xvYWRlZCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEdyYXBoRXhlY3V0aW9ucywgKC8qKgogKiBAcGFyYW0gez99IGdyYXBoRXhlY3V0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KKGdyYXBoRXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0TnVtR3JhcGhFeGVjdXRpb25zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIHJldHVybiBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5udW1FeGVjdXRpb25zOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0R3JhcGhFeGVjdXRpb25TY3JvbGxCZWdpbkluZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0R3JhcGhFeGVjdXRpb25zLCAoLyoqCiAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICByZXR1cm4gZ3JhcGhFeGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRHcmFwaEV4ZWN1dGlvbkRpc3BsYXlDb3VudCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEdyYXBoRXhlY3V0aW9ucywgKC8qKgogKiBAcGFyYW0gez99IGdyYXBoRXhlY3V0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KKGdyYXBoRXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5kaXNwbGF5Q291bnQ7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRHcmFwaEV4ZWN1dGlvblBhZ2VTaXplID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0R3JhcGhFeGVjdXRpb25zLCAoLyoqCiAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICByZXR1cm4gZ3JhcGhFeGVjdXRpb25zLnBhZ2VTaXplOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0R3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0R3JhcGhFeGVjdXRpb25zLCAoLyoqCiAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICByZXR1cm4gZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlczsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplcyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEdyYXBoRXhlY3V0aW9ucywgKC8qKgogKiBAcGFyYW0gez99IGdyYXBoRXhlY3V0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KKGdyYXBoRXhlY3V0aW9ucykgPT4gewogICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5ncmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXM7Cn0pKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRHcmFwaEV4ZWN1dGlvbkRhdGEgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICogQHBhcmFtIHs/fSBncmFwaEV4ZWN1dGlvbnMKICogQHJldHVybiB7P30KICovCihncmFwaEV4ZWN1dGlvbnMpID0+IHsKICAgIHJldHVybiBncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhOwp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0R3JhcGhFeGVjdXRpb25Gb2N1c0luZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0R3JhcGhFeGVjdXRpb25zLCAoLyoqCiAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICByZXR1cm4gZ3JhcGhFeGVjdXRpb25zLmZvY3VzSW5kZXg7Cn0pKTsKLyoqCiAqIEludGVybWVkaWF0ZSBzZWxlY3RvciBmb3IgdGhlIGdyYXBocyBzdGF0ZSBvZiBkZWJ1Z2dlci4KICogQHR5cGUgez99CiAqLwpjb25zdCBzZWxlY3REZWJ1Z2dlckdyYXBocyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiBzdGF0ZS5ncmFwaHMpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRGb2N1c2VkR3JhcGhPcEluZm8gPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlckdyYXBocywgKC8qKgogKiBAcGFyYW0gez99IGdyYXBocwogKiBAcmV0dXJuIHs/fQogKi8KKGdyYXBocykgPT4gewogICAgY29uc3QgeyBmb2N1c2VkT3AsIG9wcyB9ID0gZ3JhcGhzOwogICAgaWYgKGZvY3VzZWRPcCA9PT0gbnVsbCB8fCBvcHNbZm9jdXNlZE9wLmdyYXBoSWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBvcHNbZm9jdXNlZE9wLmdyYXBoSWRdLmdldChmb2N1c2VkT3Aub3BOYW1lKSB8fCBudWxsOwogICAgfQp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0Rm9jdXNlZEdyYXBoT3BJbnB1dHMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlckdyYXBocywgKC8qKgogKiBAcGFyYW0gez99IGdyYXBocwogKiBAcmV0dXJuIHs/fQogKi8KKGdyYXBocykgPT4gewogICAgY29uc3QgeyBmb2N1c2VkT3AsIG9wcyB9ID0gZ3JhcGhzOwogICAgaWYgKGZvY3VzZWRPcCA9PT0gbnVsbCB8fAogICAgICAgIG9wc1tmb2N1c2VkT3AuZ3JhcGhJZF0gPT09IHVuZGVmaW5lZCB8fAogICAgICAgICFvcHNbZm9jdXNlZE9wLmdyYXBoSWRdLmhhcyhmb2N1c2VkT3Aub3BOYW1lKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGdyYXBoID0gb3BzW2ZvY3VzZWRPcC5ncmFwaElkXTsKICAgICAgICBjb25zdCB7IGlucHV0cyB9ID0gKC8qKiBAdHlwZSB7P30gKi8gKGdyYXBoLmdldChmb2N1c2VkT3Aub3BOYW1lKSkpOwogICAgICAgIHJldHVybiBpbnB1dHMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlucHV0U3BlYwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGlucHV0U3BlYykgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNwZWMgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dFNwZWMpOwogICAgICAgICAgICBpZiAoZ3JhcGguaGFzKGlucHV0U3BlYy5vcF9uYW1lKSkgewogICAgICAgICAgICAgICAgc3BlYy5kYXRhID0gZ3JhcGguZ2V0KGlucHV0U3BlYy5vcF9uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3BlYzsKICAgICAgICB9KSk7CiAgICB9Cn0pKTsKLy8gSG93IG1hbnkgZ3JhcGgtZXhlY3V0aW9uIGluZGljZXMgYXQgbW9zdCB0byBsb29rIGJhY2sgaW4gb3JkZXIgdG8gZmluZCB0aGUKLy8gaW5kaWNlcyBvZiB0aGUgZ3JhcGgtZXhlY3V0aW9uIGV2ZW50cyB0aGF0IGNvbnNpc3R1dGUgdGhlIGltbWVkaWF0ZSBpbnB1dCB0bwovLyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZ3JhcGgtZXhlY3V0aW9uIGV2ZW50LgovKiogQHR5cGUgez99ICovCmNvbnN0IE1BWF9MT09LX0JBQ0sgPSAyMDA7Ci8qKgogKiBNYWtlcyBiZXN0LWVmZm9ydCBhdHRlbXB0IHRvIGZpbmQgdGhlIGdyYXBoLWV4ZWN1dGlvbiBpbmRpY2VzIHRoYXQKICogY29uc3RpdHV0ZXMgdGhlIGltbWVkaWF0ZSBpbnB1dHMgdG8gdGhlIGN1cnJlbnRseS1mb2N1c2VkIGdyYXBoLWV4ZWN1dGlvbgogKiBldmVudC4KICoKICogSWYgbm8gZ3JhcGgtZXhlY3V0aW9uIGV2ZW50IGlzIGN1cnJlbnRseSBmb2N1c2VkIG9uLCByZXR1cm5zIGBudWxsYC4KICogSXQgbWF5IHNraXAgaW5kaWNlcyBpZiBzb21lIG9mIHRoZSBkYXRhIGZvciB0aGUgZ3JhcGgtZXhlY3V0aW9uIGV2ZW50cyB0aGF0CiAqIGFyZSBpbW1lZGlhdGUgaW5wdXRzIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LgogKiBJZiB0aGUgY3VycmVudGx5LWZvY3VzZWQgZ3JhcGgtZXhlY3V0aW9uIGV2ZW50cyBpcyBhIG5vLWlucHV0IG9wLCByZXR1cm5zCiAqIGFuIGVtcHR5IGFycmF5LgogKiBJZiB0aGUgaW1tZWRpYXRlIGlucHV0IGV2ZW50cyBhcmUgbW9yZSB0aGFuIGBNQVhfTE9PS19CQUNLYCBiZWZvcmUgdGhlCiAqIGN1cnJlbnRseSBmb2N1c2VkIGluZGV4IChyYXJlKSwgdGhlIHJldHVybmVkIGFycmF5IG1heSBiZSBpbmNvbXBsZXRlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IGdldEZvY3VzZWRHcmFwaEV4ZWN1dGlvbklucHV0SW5kaWNlcyA9IGNyZWF0ZVNlbGVjdG9yKGdldEdyYXBoRXhlY3V0aW9uRm9jdXNJbmRleCwgZ2V0R3JhcGhFeGVjdXRpb25EYXRhLCBnZXRGb2N1c2VkR3JhcGhPcElucHV0cywgKC8qKgogKiBAcGFyYW0gez99IGZvY3VzSW5kZXgKICogQHBhcmFtIHs/fSBkYXRhCiAqIEBwYXJhbSB7P30gb3BJbnB1dHMKICogQHJldHVybiB7P30KICovCihmb2N1c0luZGV4LCBkYXRhLCBvcElucHV0cykgPT4gewogICAgaWYgKGZvY3VzSW5kZXggPT09IG51bGwgfHwgb3BJbnB1dHMgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlucHV0Rm91bmQgPSBvcElucHV0cy5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSBfCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoXykgPT4gZmFsc2UpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlucHV0SW5kaWNlcyA9IFtdOwogICAgaWYgKG9wSW5wdXRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBpbnB1dEluZGljZXM7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBncmFwaF9pZCA9IGRhdGFbZm9jdXNJbmRleF0uZ3JhcGhfaWQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWF4KDAsIGZvY3VzSW5kZXggLSBNQVhfTE9PS19CQUNLKTsKICAgIGZvciAobGV0IGkgPSBmb2N1c0luZGV4IC0gMTsgaSA+PSBsaW1pdDsgLS1pKSB7CiAgICAgICAgaWYgKGRhdGFbaV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvcElucHV0cy5sZW5ndGg7ICsraikgewogICAgICAgICAgICBpZiAoIWlucHV0Rm91bmRbal0gJiYKICAgICAgICAgICAgICAgIGRhdGFbaV0uZ3JhcGhfaWQgPT09IGdyYXBoX2lkICYmCiAgICAgICAgICAgICAgICBkYXRhW2ldLm9wX25hbWUgPT09IG9wSW5wdXRzW2pdLm9wX25hbWUgJiYKICAgICAgICAgICAgICAgIGRhdGFbaV0ub3V0cHV0X3Nsb3QgPT09IG9wSW5wdXRzW2pdLm91dHB1dF9zbG90KSB7CiAgICAgICAgICAgICAgICBpbnB1dEluZGljZXMucHVzaChpKTsKICAgICAgICAgICAgICAgIGlucHV0Rm91bmRbal0gPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kaWNlcy5sZW5ndGggPT09IG9wSW5wdXRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlucHV0SW5kaWNlczsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEZvY3VzZWRHcmFwaE9wQ29uc3VtZXJzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJHcmFwaHMsICgvKioKICogQHBhcmFtIHs/fSBncmFwaHMKICogQHJldHVybiB7P30KICovCihncmFwaHMpID0+IHsKICAgIGNvbnN0IHsgZm9jdXNlZE9wLCBvcHMgfSA9IGdyYXBoczsKICAgIGlmIChmb2N1c2VkT3AgPT09IG51bGwgfHwKICAgICAgICBvcHNbZm9jdXNlZE9wLmdyYXBoSWRdID09PSB1bmRlZmluZWQgfHwKICAgICAgICAhb3BzW2ZvY3VzZWRPcC5ncmFwaElkXS5oYXMoZm9jdXNlZE9wLm9wTmFtZSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBncmFwaCA9IG9wc1tmb2N1c2VkT3AuZ3JhcGhJZF07CiAgICAgICAgY29uc3QgeyBjb25zdW1lcnMgfSA9ICgvKiogQHR5cGUgez99ICovIChncmFwaC5nZXQoZm9jdXNlZE9wLm9wTmFtZSkpKTsKICAgICAgICByZXR1cm4gY29uc3VtZXJzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzbG90Q29uc3VtZXJzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoc2xvdENvbnN1bWVycykgPT4gewogICAgICAgICAgICByZXR1cm4gc2xvdENvbnN1bWVycy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnN1bWVyU3BlYwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnN1bWVyU3BlYykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3BlYyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbnN1bWVyU3BlYyk7CiAgICAgICAgICAgICAgICBpZiAoZ3JhcGguaGFzKGNvbnN1bWVyU3BlYy5vcF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHNwZWMuZGF0YSA9IGdyYXBoLmdldChjb25zdW1lclNwZWMub3BfbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3BlYzsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KfSkpOwovKioKICogR2V0IHRoZSBmb2N1c2VkIGFsZXJ0IHR5cGVzIChpZiBhbnkpIG9mIHRoZSBleGVjdXRpb24gZGlnZXN0cyBjdXJyZW50IGJlaW5nCiAqIGRpc3BsYXllZC4gRm9yIGVhY2ggZGlzcGxheWVkIGV4ZWN1dGlvbiBkaWdlc3QsIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczoKICogLSBgbnVsbGAgcmVwcmVzZW50cyBubyBhbGVydC4KICogLSBBbiBpbnN0YW5jZSBvZiB0aGUgYEFsZXJ0VHlwZWAKICogQHR5cGUgez99CiAqLwpjb25zdCBnZXRGb2N1c0FsZXJ0VHlwZXNPZlZpc2libGVFeGVjdXRpb25EaWdlc3RzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJlZ2luRXhlY3V0aW9uSW5kZXggPSBzdGF0ZS5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmRFeGVjdXRpb25JbmRleCA9IHN0YXRlLmV4ZWN1dGlvbnMuc2Nyb2xsQmVnaW5JbmRleCArIHN0YXRlLmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWxlcnRUeXBlcyA9IG5ldyBBcnJheShlbmRFeGVjdXRpb25JbmRleCAtIGJlZ2luRXhlY3V0aW9uSW5kZXgpLmZpbGwobnVsbCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb2N1c1R5cGUgPSBzdGF0ZS5hbGVydHMuZm9jdXNUeXBlOwogICAgaWYgKGZvY3VzVHlwZSA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBhbGVydFR5cGVzOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXhlY3V0aW9uSW5kaWNlcyA9IHN0YXRlLmFsZXJ0cy5leGVjdXRpb25JbmRpY2VzW2ZvY3VzVHlwZV07CiAgICBpZiAoZXhlY3V0aW9uSW5kaWNlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIGFsZXJ0VHlwZXM7CiAgICB9CiAgICAvLyBUT0RPKGNhaXMpOiBFeHBsb3JlIHVzaW5nIGEgU2V0IGZvciBleGVjdXRpb24gaW5kaWNlcyBpZiB0aGlzCiAgICAvLyBwYXJ0IGJlY29tZXMgYSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIGluIHRoZSBmdXR1cmUuCiAgICBmb3IgKGxldCBpID0gYmVnaW5FeGVjdXRpb25JbmRleDsgaSA8IGVuZEV4ZWN1dGlvbkluZGV4OyArK2kpIHsKICAgICAgICBpZiAoZXhlY3V0aW9uSW5kaWNlcy5pbmNsdWRlcyhpKSkgewogICAgICAgICAgICBhbGVydFR5cGVzW2kgLSBiZWdpbkV4ZWN1dGlvbkluZGV4XSA9IHN0YXRlLmFsZXJ0cy5mb2N1c1R5cGU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGFsZXJ0VHlwZXM7Cn0pKTsKLyoqCiAqIEludGVybWVkaWF0ZSBzZWxlY3RvciBmb3IgdG9wLWxldmVsIGV4ZWN1dGlvbnMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3Qgc2VsZWN0RXhlY3V0aW9ucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICogQHBhcmFtIHs/fSBzdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlKSA9PiBzdGF0ZS5leGVjdXRpb25zKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0Rm9jdXNlZEV4ZWN1dGlvbkluZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RXhlY3V0aW9ucywgKC8qKgogKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICogQHJldHVybiB7P30KICovCihleGVjdXRpb25zKSA9PiB7CiAgICByZXR1cm4gZXhlY3V0aW9ucy5mb2N1c0luZGV4Owp9KSk7Ci8qKgogKiBHZXQgdGhlIGRpc3BsYXkgaW5kZXggb2YgdGhlIGV4ZWN1dGlvbiBkaWdlc3QgYmVpbmcgZm9jdXNlZCBvbiAoaWYgYW55KS4KICogQHR5cGUgez99CiAqLwpjb25zdCBnZXRGb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RXhlY3V0aW9ucywgKC8qKgogKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICogQHJldHVybiB7P30KICovCihleGVjdXRpb25zKSA9PiB7CiAgICBpZiAoZXhlY3V0aW9ucy5mb2N1c0luZGV4ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB7IGZvY3VzSW5kZXgsIHNjcm9sbEJlZ2luSW5kZXgsIGRpc3BsYXlDb3VudCB9ID0gZXhlY3V0aW9uczsKICAgIGlmIChmb2N1c0luZGV4IDwgc2Nyb2xsQmVnaW5JbmRleCB8fAogICAgICAgIGZvY3VzSW5kZXggPj0gc2Nyb2xsQmVnaW5JbmRleCArIGRpc3BsYXlDb3VudCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGZvY3VzSW5kZXggLSBzY3JvbGxCZWdpbkluZGV4Owp9KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0TG9hZGVkRXhlY3V0aW9uRGF0YSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEV4ZWN1dGlvbnMsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gZXhlY3V0aW9ucy5leGVjdXRpb25EYXRhKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0TG9hZGluZ0dyYXBoT3BzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogKiBAcGFyYW0gez99IHN0YXRlCiAqIEByZXR1cm4gez99CiAqLwooc3RhdGUpID0+IHN0YXRlLmdyYXBocy5sb2FkaW5nT3BzKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0TG9hZGVkU3RhY2tGcmFtZXMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gc3RhdGUuc3RhY2tGcmFtZXMpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBnZXRGb2N1c2VkRXhlY3V0aW9uRGF0YSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEV4ZWN1dGlvbnMsICgvKioKICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAqIEByZXR1cm4gez99CiAqLwooZXhlY3V0aW9ucykgPT4gewogICAgY29uc3QgeyBmb2N1c0luZGV4LCBleGVjdXRpb25EYXRhIH0gPSBleGVjdXRpb25zOwogICAgaWYgKGZvY3VzSW5kZXggPT09IG51bGwgfHwgZXhlY3V0aW9uRGF0YVtmb2N1c0luZGV4XSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZXhlY3V0aW9uRGF0YVtmb2N1c0luZGV4XTsKfSkpOwovKioKICogR2V0IGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgb3AgdGhhdCdzIHRoZSBvcmlnaW4gb2YgdGhlIGZvY3VzZWQKICogY29kZSBsb2NhdGlvbiAoc3RhY2sgdHJhY2UpLgogKiBUaGlzIHNlbGVjdG9yIGNvdmVycyBib3RoIGVhZ2VyIGV4ZWN1dGlvbiBhbmQgZ3JhcGgtb3AgY3JlYXRpb24uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZ2V0Q29kZUxvY2F0aW9uT3JpZ2luID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgZ2V0Rm9jdXNlZEV4ZWN1dGlvbkluZGV4LCBnZXRGb2N1c2VkRXhlY3V0aW9uRGF0YSwgZ2V0Rm9jdXNlZEdyYXBoT3BJbmZvLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHBhcmFtIHs/fSBleGVjdXRpb25JbmRleAogKiBAcGFyYW0gez99IGV4ZWN1dGlvbkRhdGEKICogQHBhcmFtIHs/fSBncmFwaE9wSW5mbwogKiBAcmV0dXJuIHs/fQogKi8KKHN0YXRlLCBleGVjdXRpb25JbmRleCwgZXhlY3V0aW9uRGF0YSwgZ3JhcGhPcEluZm8pID0+IHsKICAgIGNvbnN0IHsgY29kZUxvY2F0aW9uRm9jdXNUeXBlIH0gPSBzdGF0ZTsKICAgIGlmIChjb2RlTG9jYXRpb25Gb2N1c1R5cGUgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjb2RlTG9jYXRpb25Gb2N1c1R5cGUgPT09IENvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OKSB7CiAgICAgICAgaWYgKGV4ZWN1dGlvbkluZGV4ID09PSBudWxsIHx8IGV4ZWN1dGlvbkRhdGEgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvZGVMb2NhdGlvblR5cGU6IENvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OLAogICAgICAgICAgICBvcFR5cGU6IGV4ZWN1dGlvbkRhdGEub3BfdHlwZSwKICAgICAgICAgICAgZXhlY3V0aW9uSW5kZXgsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIFRoaXMgaXMgQ29kZUxvY2F0aW9uVHlwZS5HUkFQSF9PUF9DUkVBVElPTi4KICAgICAgICBpZiAoZ3JhcGhPcEluZm8gPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvZGVMb2NhdGlvblR5cGU6IENvZGVMb2NhdGlvblR5cGUuR1JBUEhfT1BfQ1JFQVRJT04sCiAgICAgICAgICAgIG9wVHlwZTogZ3JhcGhPcEluZm8ub3BfdHlwZSwKICAgICAgICAgICAgb3BOYW1lOiBncmFwaE9wSW5mby5vcF9uYW1lLAogICAgICAgIH07CiAgICB9Cn0pKTsKLyoqCiAqIEdldCB0aGUgc3RhY2sgdHJhY2UgKGZyYW1lcykgb2YgdGhlIGV4ZWN1dGlvbiBldmVudCBjdXJyZW50bHkgZm9jdXNlZCBvbgogKiAoaWYgYW55KS4KICoKICogSWYgbm8gZXhlY3V0aW9uIGlzIGZvY3VzZWQgb24sIHJldHVybnMgbnVsbC4KICogSWYgYW55IG9mIHRoZSBzdGFjayBmcmFtZXMgaXMgbWlzc2luZyAoaS5lLiwgaGFzbid0IGJlZW4gbG9hZGVkIGZyb20KICogdGhlIGRhdGEgc291cmNlIHlldCksIHJldHVybnMgbnVsbC4KICogQHR5cGUgez99CiAqLwpjb25zdCBnZXRGb2N1c2VkU3RhY2tGcmFtZXMgPSBjcmVhdGVTZWxlY3RvcigKLy8gVE9ETyhjYWlzKTogUmVuYW1lIHRoaXMgZnVuY3Rpb24gYXMgYGdldEZvY3VzZWRTdGFja1RyYWNlKClgIHRvCi8vIG1pbmltaXplIGNvbmZ1c2lvbiB3aXRoIGBnZXRGb2N1c2VkU291cmNlTGluZVNwZWMoKWAuCnNlbGVjdERlYnVnZ2VyU3RhdGUsIGdldEZvY3VzZWRTdGFja0ZyYW1lc0hlbHBlcik7Ci8qKgogKiBJbnRlcm1lZGlhdGUgc2VsZWN0b3IgZm9yIHNvdXJjZSBjb2RlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IHNlbGVjdFNvdXJjZUNvZGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gc3RhdGUuc291cmNlQ29kZSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldFNvdXJjZUZpbGVMaXN0TG9hZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0U291cmNlQ29kZSwgKC8qKgogKiBAcGFyYW0gez99IHNvdXJjZUNvZGUKICogQHJldHVybiB7P30KICovCihzb3VyY2VDb2RlKSA9PiB7CiAgICByZXR1cm4gc291cmNlQ29kZS5zb3VyY2VGaWxlTGlzdExvYWRlZDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldFNvdXJjZUZpbGVMaXN0ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0U291cmNlQ29kZSwgKC8qKgogKiBAcGFyYW0gez99IHNvdXJjZUNvZGUKICogQHJldHVybiB7P30KICovCihzb3VyY2VDb2RlKSA9PiB7CiAgICByZXR1cm4gc291cmNlQ29kZS5zb3VyY2VGaWxlTGlzdDsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEZvY3VzZWRTb3VyY2VGaWxlSW5kZXggPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RTb3VyY2VDb2RlLCAoLyoqCiAqIEBwYXJhbSB7P30gc291cmNlQ29kZQogKiBAcmV0dXJuIHs/fQogKi8KKHNvdXJjZUNvZGUpID0+IHsKICAgIGNvbnN0IHsgc291cmNlRmlsZUxpc3QsIGZvY3VzTGluZVNwZWMgfSA9IHNvdXJjZUNvZGU7CiAgICBpZiAoZm9jdXNMaW5lU3BlYyA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiBmaW5kRmlsZUluZGV4KHNvdXJjZUZpbGVMaXN0LCBmb2N1c0xpbmVTcGVjKTsKfSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGdldEZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdFNvdXJjZUNvZGUsIGdldEZvY3VzZWRTb3VyY2VGaWxlSW5kZXgsICgvKioKICogQHBhcmFtIHs/fSBzb3VyY2VDb2RlCiAqIEBwYXJhbSB7P30gZmlsZUluZGV4CiAqIEByZXR1cm4gez99CiAqLwooc291cmNlQ29kZSwgZmlsZUluZGV4KSA9PiB7CiAgICBpZiAoZmlsZUluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzW2ZpbGVJbmRleF0gfHwgbnVsbDsKfSkpOwovKioKICogR2V0IHRoZSBzb3VyY2UtY29kZSBsaW5lIGJlaW5nIGZvY3VzZWQgb24uCiAqCiAqIElmIHRoZSBgc3RpY2tpbmdUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGVgIHN0YXRlIGlzIGB0cnVlYCBhbmQKICogYGZvY3VzZWRMSW5lU3BlY2AgaXMgbm90IG51bGwsIHRoaXMgc2VsZWN0b3Igd2lsbCByZXR1cm4gdGhlIGJvdHRvbW1vc3QKICogc3RhY2sgZnJhbWUgaW4gdGhlIGZpbGUgaW4gYGZvY3VzZWRMSW5lU3BlY2AuCiAqIEVsc2UsIGl0J2xsIGRpcmVjdGx5IHJldHVybiB0aGUgdmFsdWUgb2YgYGZvY3VzZWRMSW5lU3BlY2AuCiAqCiAqIFRoaXMgc2VsZWN0b3IgYWxsb3dzIHRoZSBVSSB0byAidHJhY2siIGxpbmVzIGluIGEgc291cmNlIGZpbGUgb2YgaW50ZXJlc3QKICogYXMgYSB1c2VyIG5hdmlnYXRlcyBleGVjdXRpb25zIG9yIGdyYXBoIG9wcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBnZXRGb2N1c2VkU291cmNlTGluZVNwZWMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gc3RhdGUKICogQHJldHVybiB7P30KICovCihzdGF0ZSkgPT4gc3RhdGUuc291cmNlQ29kZS5mb2N1c0xpbmVTcGVjKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZ2V0U3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAqIEBwYXJhbSB7P30gZGVidWdnZXJTdGF0ZQogKiBAcmV0dXJuIHs/fQogKi8KKGRlYnVnZ2VyU3RhdGUpID0+IHsKICAgIHJldHVybiBkZWJ1Z2dlclN0YXRlLnN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOwp9KSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9hbGVydHMvYWxlcnRzX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCBfYzAkYSA9IGZ1bmN0aW9uIChhMCkgeyByZXR1cm4gW2EwXTsgfTsKZnVuY3Rpb24gQWxlcnRzQ29tcG9uZW50X2Rpdl85X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgY29uc3QgX3IzID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBBbGVydHNDb21wb25lbnRfZGl2XzlfVGVtcGxhdGVfZGl2X2NsaWNrXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjMpOyBjb25zdCBicmVha2Rvd25fcjEgPSBjdHguJGltcGxpY2l0OyBjb25zdCBjdHhfcjIgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMi5vblRvZ2dsZUZvY3VzVHlwZS5lbWl0KGJyZWFrZG93bl9yMS50eXBlKTsgfSk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCA4KTsKICAgIMm1ybV0ZXh0KDIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDkpOwogICAgybXJtXRleHQoNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnQoNSwgImRpdiIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBicmVha2Rvd25fcjEgPSBjdHguJGltcGxpY2l0OwogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1cHJvcGVydHkoIm5nQ2xhc3MiLCDJtcm1cHVyZUZ1bmN0aW9uMSg0LCBfYzAkYSwgYnJlYWtkb3duX3IxLnR5cGUgPT09IGN0eF9yMC5mb2N1c1R5cGUgPyAiZm9jdXMiIDogIiIpKTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBicmVha2Rvd25fcjEuZGlzcGxheU5hbWUsICIgIik7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUyKCIgIiwgYnJlYWtkb3duX3IxLmRpc3BsYXlTeW1ib2wsICI6ICIsIGJyZWFrZG93bl9yMS5jb3VudCwgIiAiKTsKfSB9CmNsYXNzIEFsZXJ0c0NvbXBvbmVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgYWxlcnRzLgogICAgICAgIHRoaXMubnVtQWxlcnRzID0gMDsKICAgICAgICB0aGlzLmFsZXJ0c0JyZWFrZG93biA9IFtdOwogICAgICAgIHRoaXMuZm9jdXNUeXBlID0gbnVsbDsKICAgICAgICB0aGlzLm9uVG9nZ2xlRm9jdXNUeXBlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgfQp9CkFsZXJ0c0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2FsZXJ0cy1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0c19jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9hbGVydHNfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICB9LF0gfSwKXTsKQWxlcnRzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgbnVtQWxlcnRzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGFsZXJ0c0JyZWFrZG93bjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBmb2N1c1R5cGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgb25Ub2dnbGVGb2N1c1R5cGU6IFt7IHR5cGU6IE91dHB1dCB9XQp9OwovKiogQG5vY29sbGFwc2UgKi8gQWxlcnRzQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gQWxlcnRzQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFsZXJ0c0NvbXBvbmVudCkoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0c0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBBbGVydHNDb21wb25lbnQsIHNlbGVjdG9yczogW1siYWxlcnRzLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IG51bUFsZXJ0czogIm51bUFsZXJ0cyIsIGFsZXJ0c0JyZWFrZG93bjogImFsZXJ0c0JyZWFrZG93biIsIGZvY3VzVHlwZTogImZvY3VzVHlwZSIgfSwgb3V0cHV0czogeyBvblRvZ2dsZUZvY3VzVHlwZTogIm9uVG9nZ2xlRm9jdXNUeXBlIiB9LCBkZWNsczogMTAsIHZhcnM6IDUsIGNvbnN0czogW1sxLCAiYWxlcnRzLWNvbnRhaW5lciJdLCBbMSwgImRlYnVnZ2luZy10aXRsZSJdLCBbMSwgIm51bS1hbGVydHMtY29udGFpbmVyIl0sIFsxLCAibnVtLWFsZXJ0cy1sYWJlbCJdLCBbMSwgIm51bS1hbGVydHMtdmFsdWUiLCAzLCAibmdDbGFzcyJdLCBbMSwgImFsZXJ0cy1icmVha2Rvd24tY29udGFpbmVyIl0sIFsiY2xhc3MiLCAiYWxlcnRzLWJyZWFrZG93bi10eXBlIiwgMywgIm5nQ2xhc3MiLCAiY2xpY2siLCA0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMSwgImFsZXJ0cy1icmVha2Rvd24tdHlwZSIsIDMsICJuZ0NsYXNzIiwgImNsaWNrIl0sIFsxLCAiYWxlcnQtdHlwZS1uYW1lIl0sIFsxLCAiYWxlcnQtdHlwZS1jb3VudCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEFsZXJ0c0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICDJtcm1dGV4dCgyLCAiRGVidWdnaW5nIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJkaXYiLCAzKTsKICAgICAgICDJtcm1dGV4dCg1LCAiQWxlcnRzIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJkaXYiLCA0KTsKICAgICAgICDJtcm1dGV4dCg3KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAiZGl2IiwgNSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDksIEFsZXJ0c0NvbXBvbmVudF9kaXZfOV9UZW1wbGF0ZSwgNiwgNiwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVhZHZhbmNlKDYpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24xKDMsIF9jMCRhLCBjdHgubnVtQWxlcnRzID4gMCA/ICJub24temVybyIgOiAiIikpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4Lm51bUFsZXJ0cywgIiAiKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguYWxlcnRzQnJlYWtkb3duKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW05nQ2xhc3MsIE5nRm9yT2ZdLCBzdHlsZXM6IFsiLmFsZXJ0cy1icmVha2Rvd24tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogMTBweCAxMHB4IDEwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmFsZXJ0cy1icmVha2Rvd24tdHlwZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItcmFkaXVzOiAwIDEwcHggMTBweCAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBhZGRpbmc6IDZweCAwIDZweCA1MHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uYWxlcnRzLWJyZWFrZG93bi10eXBlLmZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmVlZTA7XG59XG5cbi5hbGVydHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcbn1cblxuLmFsZXJ0LXR5cGUtY291bnRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgXG4gIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgY29sb3I6ICNmZmY7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogM3B4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAyMHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uYWxlcnQtdHlwZS1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogM3B4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uZGVidWdnaW5nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cblxuLm51bS1hbGVydHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAzMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5udW0tYWxlcnRzLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuXG4ubnVtLWFsZXJ0cy12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDIwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDI0cHg7XG59XG5cbi5udW0tYWxlcnRzLXZhbHVlLm5vbi16ZXJvW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmI3ODA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufSJdIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvYWxlcnRzL2FsZXJ0c19jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBBTEVSVF9UWVBFX1RPX0RJU1BMQVlfTkFNRV9BTkRfU1lNQk9MID0gewogICAgW0FsZXJ0VHlwZS5GVU5DVElPTl9SRUNPTVBJTEVfQUxFUlRdOiB7CiAgICAgICAgZGlzcGxheU5hbWU6ICdGdW5jdGlvbiByZWNvbXBpbGVzJywKICAgICAgICBkaXNwbGF5U3ltYm9sOiAnQycsCiAgICB9LAogICAgW0FsZXJ0VHlwZS5JTkZfTkFOX0FMRVJUXTogewogICAgICAgIGRpc3BsYXlOYW1lOiAnTmFOL+KInicsCiAgICAgICAgZGlzcGxheVN5bWJvbDogJ+KInicsCiAgICB9LAogICAgW0FsZXJ0VHlwZS5URU5TT1JfU0hBUEVfQUxFUlRdOiB7CiAgICAgICAgZGlzcGxheU5hbWU6ICdUZW5zb3Igc2hhcGUnLAogICAgICAgIGRpc3BsYXlTeW1ib2w6ICfilqAnLAogICAgfSwKfTsKY2xhc3MgQWxlcnRzQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLm51bUFsZXJ0cyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldE51bUFsZXJ0cykpOwogICAgICAgIHRoaXMuYWxlcnRzQnJlYWtkb3duJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0QWxlcnRzQnJlYWtkb3duLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhbGVydHNCcmVha2Rvd24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChhbGVydHNCcmVha2Rvd24pID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbGVydFR5cGVzID0gT2JqZWN0LmtleXMoYWxlcnRzQnJlYWtkb3duKTsKICAgICAgICAgICAgYWxlcnRUeXBlcy5zb3J0KCk7CiAgICAgICAgICAgIHJldHVybiBhbGVydFR5cGVzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWxlcnRUeXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYWxlcnRUeXBlKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgdHlwZTogKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0VHlwZSkpIH0sIEFMRVJUX1RZUEVfVE9fRElTUExBWV9OQU1FX0FORF9TWU1CT0xbYWxlcnRUeXBlXSksIHsgY291bnQ6IGFsZXJ0c0JyZWFrZG93blthbGVydFR5cGVdIH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5mb2N1c1R5cGUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRBbGVydHNGb2N1c1R5cGUpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhbGVydFR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uVG9nZ2xlRm9jdXNUeXBlKGFsZXJ0VHlwZSkgewogICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWxlcnRUeXBlRm9jdXNUb2dnbGVkKHsgYWxlcnRUeXBlIH0pKTsKICAgIH0KfQpBbGVydHNDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1hbGVydHMnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxhbGVydHMtY29tcG9uZW50CiAgICAgIFtudW1BbGVydHNdPSJudW1BbGVydHMkIHwgYXN5bmMiCiAgICAgIFthbGVydHNCcmVha2Rvd25dPSJhbGVydHNCcmVha2Rvd24kIHwgYXN5bmMiCiAgICAgIFtmb2N1c1R5cGVdPSJmb2N1c1R5cGUkIHwgYXN5bmMiCiAgICAgIChvblRvZ2dsZUZvY3VzVHlwZSk9Im9uVG9nZ2xlRm9jdXNUeXBlKCRldmVudCkiCiAgICA+CiAgICA8L2FsZXJ0cy1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovCkFsZXJ0c0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gQWxlcnRzQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gQWxlcnRzQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFsZXJ0c0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gQWxlcnRzQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEFsZXJ0c0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiXV0sIGRlY2xzOiA0LCB2YXJzOiA5LCBjb25zdHM6IFtbMywgIm51bUFsZXJ0cyIsICJhbGVydHNCcmVha2Rvd24iLCAiZm9jdXNUeXBlIiwgIm9uVG9nZ2xlRm9jdXNUeXBlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQWxlcnRzQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImFsZXJ0cy1jb21wb25lbnQiLCAwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uVG9nZ2xlRm9jdXNUeXBlIiwgZnVuY3Rpb24gQWxlcnRzQ29udGFpbmVyX1RlbXBsYXRlX2FsZXJ0c19jb21wb25lbnRfb25Ub2dnbGVGb2N1c1R5cGVfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblRvZ2dsZUZvY3VzVHlwZSgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJudW1BbGVydHMiLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC5udW1BbGVydHMkKSkoImFsZXJ0c0JyZWFrZG93biIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4LmFsZXJ0c0JyZWFrZG93biQpKSgiZm9jdXNUeXBlIiwgybXJtXBpcGVCaW5kMSgzLCA3LCBjdHguZm9jdXNUeXBlJCkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbQWxlcnRzQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7Cgpjb25zdCBfYzAkYiA9IFsic2xpZGVyV3JhcHBlciJdOwpjb25zdCBhY3RpdmVFdmVudE9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogZmFsc2UgfSk7Ci8qKgogKiBWaXN1YWxseSwgYSAzMHB4IHNlcGFyYXRpb24gYmV0d2VlbiB0aWNrIG1hcmtzIGxvb2tzIGJlc3QuIFRoaXMgaXMgdmVyeSBzdWJqZWN0aXZlIGJ1dCBpdCBpcwogKiB0aGUgZGVmYXVsdCBzZXBhcmF0aW9uIHdlIGNob3NlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1JTl9BVVRPX1RJQ0tfU0VQQVJBVElPTiA9IDMwOwovKioKICogVGhlIHRodW1iIGdhcCBzaXplIGZvciBhIGRpc2FibGVkIHNsaWRlci4KICogQHR5cGUgez99CiAqLwpjb25zdCBESVNBQkxFRF9USFVNQl9HQVAgPSA3OwovKioKICogVGhlIHRodW1iIGdhcCBzaXplIGZvciBhIG5vbi1hY3RpdmUgc2xpZGVyIGF0IGl0cyBtaW5pbXVtIHZhbHVlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IE1JTl9WQUxVRV9OT05BQ1RJVkVfVEhVTUJfR0FQID0gNzsKLyoqCiAqIFRoZSB0aHVtYiBnYXAgc2l6ZSBmb3IgYW4gYWN0aXZlIHNsaWRlciBhdCBpdHMgbWluaW11bSB2YWx1ZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBNSU5fVkFMVUVfQUNUSVZFX1RIVU1CX0dBUCA9IDEwOwovKioKICogUHJvdmlkZXIgRXhwcmVzc2lvbiB0aGF0IGFsbG93cyBtYXQtc2xpZGVyIHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAqIFRoaXMgYWxsb3dzIGl0IHRvIHN1cHBvcnQgWyhuZ01vZGVsKV0gYW5kIFtmb3JtQ29udHJvbF0uCiAqIFxAZG9jcy1wcml2YXRlCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTUFUX1NMSURFUl9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLAogICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gTWF0U2xpZGVyKSksCiAgICBtdWx0aTogdHJ1ZQp9OwovKioKICogQSBzaW1wbGUgY2hhbmdlIGV2ZW50IGVtaXR0ZWQgYnkgdGhlIE1hdFNsaWRlciBjb21wb25lbnQuCiAqLwpjbGFzcyBNYXRTbGlkZXJDaGFuZ2Ugewp9Ci8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0U2xpZGVyLgovKioKICogXEBkb2NzLXByaXZhdGUKICovCmNsYXNzIE1hdFNsaWRlckJhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgX01hdFNsaWRlck1peGluQmFzZSA9IG1peGluVGFiSW5kZXgobWl4aW5Db2xvcihtaXhpbkRpc2FibGVkKE1hdFNsaWRlckJhc2UpLCAnYWNjZW50JykpOwovKioKICogQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBmcm9tIGEgcmFuZ2Ugb2YgdmFsdWVzIGJ5IG1vdmluZyB0aGUgc2xpZGVyIHRodW1iLiBJdCBpcyBzaW1pbGFyIGluCiAqIGJlaGF2aW9yIHRvIHRoZSBuYXRpdmUgYDxpbnB1dCB0eXBlPSJyYW5nZSI+YCBlbGVtZW50LgogKi8KY2xhc3MgTWF0U2xpZGVyIGV4dGVuZHMgX01hdFNsaWRlck1peGluQmFzZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICogQHBhcmFtIHs/fSBfZm9jdXNNb25pdG9yCiAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICogQHBhcmFtIHs/fSBfZGlyCiAgICAgKiBAcGFyYW0gez99IHRhYkluZGV4CiAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICogQHBhcmFtIHs/PX0gX25nWm9uZQogICAgICogQHBhcmFtIHs/PX0gZG9jdW1lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgX2ZvY3VzTW9uaXRvciwgX2NoYW5nZURldGVjdG9yUmVmLCBfZGlyLCB0YWJJbmRleCwgX2FuaW1hdGlvbk1vZGUsIF9uZ1pvbmUsIAogICAgLyoqIEBicmVha2luZy1jaGFuZ2UgMTEuMC4wIG1ha2UgZG9jdW1lbnQgcmVxdWlyZWQgKi8KICAgIGRvY3VtZW50KSB7CiAgICAgICAgc3VwZXIoZWxlbWVudFJlZik7CiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgIHRoaXMuX2FuaW1hdGlvbk1vZGUgPSBfYW5pbWF0aW9uTW9kZTsKICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgIHRoaXMuX2ludmVydCA9IGZhbHNlOwogICAgICAgIHRoaXMuX21heCA9IDEwMDsKICAgICAgICB0aGlzLl9taW4gPSAwOwogICAgICAgIHRoaXMuX3N0ZXAgPSAxOwogICAgICAgIHRoaXMuX3RodW1iTGFiZWwgPSBmYWxzZTsKICAgICAgICB0aGlzLl90aWNrSW50ZXJ2YWwgPSAwOwogICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDsKICAgICAgICB0aGlzLl92ZXJ0aWNhbCA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2xpZGVyIHZhbHVlIGhhcyBjaGFuZ2VkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2xpZGVyIHRodW1iIG1vdmVzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgcmF3IHZhbHVlIG9mIHRoZSBzbGlkZXIgY2hhbmdlcy4gVGhpcyBpcyBoZXJlIHByaW1hcmlseQogICAgICAgICAqIHRvIGZhY2lsaXRhdGUgdGhlIHR3by13YXkgYmluZGluZyBmb3IgdGhlIGB2YWx1ZWAgaW5wdXQuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKi8KICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIG9uVG91Y2ggZnVuY3Rpb24gcmVnaXN0ZXJlZCB2aWEgcmVnaXN0ZXJPblRvdWNoIChDb250cm9sVmFsdWVBY2Nlc3NvcikuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIHRoaXMuX3BlcmNlbnQgPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB0aHVtYiBpcyBzbGlkaW5nLgogICAgICAgICAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIHNob3VsZCBiZSBhIHRyYW5zaXRpb24gZm9yIHRoZSB0aHVtYiBhbmQgZmlsbCB0cmFjay4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc2xpZGVyIGlzIGFjdGl2ZSAoY2xpY2tlZCBvciBzbGlkaW5nKS4KICAgICAgICAgKiBVc2VkIHRvIHNocmluayBhbmQgZ3JvdyB0aGUgdGh1bWIgYXMgYWNjb3JkaW5nIHRvIHRoZSBNYXRlcmlhbCBEZXNpZ24gc3BlYy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzaXplIG9mIGEgdGljayBpbnRlcnZhbCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHNpemUgb2YgdGhlIHRyYWNrLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3RpY2tJbnRlcnZhbFBlcmNlbnQgPSAwOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBzbGlkZXIuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc2xpZGVyRGltZW5zaW9ucyA9IG51bGw7CiAgICAgICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBEaXJlY3Rpb25hbGl0eSBjaGFuZ2UgRXZlbnRFbWl0dGVyLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgcHV0IHRoZWlyIHBvaW50ZXIgZG93biBvbiB0aGUgc2xpZGVyLgogICAgICAgICAqLwogICAgICAgIHRoaXMuX3BvaW50ZXJEb3duID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgc2xpZGVyIGlzIGRpc2FibGVkIG9yIHRoZQogICAgICAgICAgICAvLyB1c2VyIGlzIHVzaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIG1haW4gbW91c2UgYnV0dG9uLgogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLl9pc1NsaWRpbmcgfHwgKCFpc1RvdWNoRXZlbnQoZXZlbnQpICYmIGV2ZW50LmJ1dHRvbiAhPT0gMCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9ydW5JbnNpZGVab25lKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJQb3NpdGlvbiA9IGdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShldmVudCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VlbnRlcigpOyAvLyBTaW11bGF0ZSBtb3VzZWVudGVyIGluIGNhc2UgdGhpcyBpcyBhIG1vYmlsZSBkZXZpY2UuCiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kR2xvYmFsRXZlbnRzKGV2ZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlRnJvbVBvc2l0aW9uKHBvaW50ZXJQb3NpdGlvbik7CiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZU9uU2xpZGVTdGFydCA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludGVyUG9zaXRpb25PblN0YXJ0ID0gcG9pbnRlclBvc2l0aW9uOwogICAgICAgICAgICAgICAgLy8gRW1pdCBhIGNoYW5nZSBhbmQgaW5wdXQgZXZlbnQgaWYgdGhlIHZhbHVlIGNoYW5nZWQuCiAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gdGhpcy52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRJbnB1dEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KTsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlaXIgcG9pbnRlciBhZnRlcgogICAgICAgICAqIHN0YXJ0aW5nIHRvIGRyYWcuIEJvdW5kIG9uIHRoZSBkb2N1bWVudCBsZXZlbC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wb2ludGVyTW92ZSA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykgewogICAgICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgc2xpZGUgZnJvbSBzZWxlY3RpbmcgYW55dGhpbmcgZWxzZS4KICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gZXZlbnQ7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZUZyb21Qb3NpdGlvbihnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQpKTsKICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSByYW5nZSBlbGVtZW50cyBhbHdheXMgZW1pdCBgaW5wdXRgIGV2ZW50cyB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VkIHdoaWxlIHNsaWRpbmcuCiAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gdGhpcy52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRJbnB1dEV2ZW50KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgbGlmdGVkIHRoZWlyIHBvaW50ZXIuIEJvdW5kIG9uIHRoZSBkb2N1bWVudCBsZXZlbC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wb2ludGVyVXAgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJQb3NpdGlvbk9uU3RhcnQgPSB0aGlzLl9wb2ludGVyUG9zaXRpb25PblN0YXJ0OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBvaW50ZXJQb3NpdGlvbiA9IGdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShldmVudCk7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsRXZlbnRzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZU9uU2xpZGVTdGFydCA9IHRoaXMuX3BvaW50ZXJQb3NpdGlvbk9uU3RhcnQgPSB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlT25TbGlkZVN0YXJ0ICE9IHRoaXMudmFsdWUgJiYgIXRoaXMuZGlzYWJsZWQgJiYKICAgICAgICAgICAgICAgICAgICBwb2ludGVyUG9zaXRpb25PblN0YXJ0ICYmIChwb2ludGVyUG9zaXRpb25PblN0YXJ0LnggIT09IGN1cnJlbnRQb2ludGVyUG9zaXRpb24ueCB8fAogICAgICAgICAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvbk9uU3RhcnQueSAhPT0gY3VycmVudFBvaW50ZXJQb3NpdGlvbi55KSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBoYXMgbG9zdCBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLl93aW5kb3dCbHVyID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvLyBJZiB0aGUgd2luZG93IGlzIGJsdXJyZWQgd2hpbGUgZHJhZ2dpbmcgd2UgbmVlZCB0byBzdG9wIGRyYWdnaW5nIGJlY2F1c2UgdGhlCiAgICAgICAgICAgIC8vIGJyb3dzZXIgd29uJ3QgZGlzcGF0Y2ggdGhlIGBtb3VzZXVwYCBhbmQgYHRvdWNoZW5kYCBldmVudHMgYW55bW9yZS4KICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3RQb2ludGVyRXZlbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJVcCh0aGlzLl9sYXN0UG9pbnRlckV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4KSB8fCAwOwogICAgICAgIHRoaXMuX3J1bk91dHNpemVab25lKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX3BvaW50ZXJEb3duLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHNsaWRlciBpcyBpbnZlcnRlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBpbnZlcnQoKSB7IHJldHVybiB0aGlzLl9pbnZlcnQ7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGludmVydCh2YWx1ZSkgewogICAgICAgIHRoaXMuX2ludmVydCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNsaWRlciBjYW4gaGF2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBtYXgoKSB7IHJldHVybiB0aGlzLl9tYXg7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbWF4KHYpIHsKICAgICAgICB0aGlzLl9tYXggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCB0aGlzLl9tYXgpOwogICAgICAgIHRoaXMuX3BlcmNlbnQgPSB0aGlzLl9jYWxjdWxhdGVQZXJjZW50YWdlKHRoaXMuX3ZhbHVlKTsKICAgICAgICAvLyBTaW5jZSB0aGlzIGFsc28gbW9kaWZpZXMgdGhlIHBlcmNlbnRhZ2UsIHdlIG5lZWQgdG8gbGV0IHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGtub3cuCiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNsaWRlciBjYW4gaGF2ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBtaW4oKSB7IHJldHVybiB0aGlzLl9taW47IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbWluKHYpIHsKICAgICAgICB0aGlzLl9taW4gPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCB0aGlzLl9taW4pOwogICAgICAgIC8vIElmIHRoZSB2YWx1ZSB3YXNuJ3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIHVzZXIsIHNldCBpdCB0byB0aGUgbWluLgogICAgICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fbWluOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wZXJjZW50ID0gdGhpcy5fY2FsY3VsYXRlUGVyY2VudGFnZSh0aGlzLl92YWx1ZSk7CiAgICAgICAgLy8gU2luY2UgdGhpcyBhbHNvIG1vZGlmaWVzIHRoZSBwZXJjZW50YWdlLCB3ZSBuZWVkIHRvIGxldCB0aGUgY2hhbmdlIGRldGVjdGlvbiBrbm93LgogICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgdmFsdWVzIGF0IHdoaWNoIHRoZSB0aHVtYiB3aWxsIHNuYXAuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc3RlcCgpIHsgcmV0dXJuIHRoaXMuX3N0ZXA7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgc3RlcCh2KSB7CiAgICAgICAgdGhpcy5fc3RlcCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHRoaXMuX3N0ZXApOwogICAgICAgIGlmICh0aGlzLl9zdGVwICUgMSAhPT0gMCkgewogICAgICAgICAgICB0aGlzLl9yb3VuZFRvRGVjaW1hbCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9zdGVwLnRvU3RyaW5nKCkuc3BsaXQoJy4nKS5wb3AoKSkpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgLy8gU2luY2UgdGhpcyBjb3VsZCBtb2RpZnkgdGhlIGxhYmVsLCB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgY2hhbmdlIGRldGVjdGlvbi4KICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgIH0KICAgIC8qKgogICAgICogV2hldGhlciBvciBub3QgdG8gc2hvdyB0aGUgdGh1bWIgbGFiZWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdGh1bWJMYWJlbCgpIHsgcmV0dXJuIHRoaXMuX3RodW1iTGFiZWw7IH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHRodW1iTGFiZWwodmFsdWUpIHsgdGhpcy5fdGh1bWJMYWJlbCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgIC8qKgogICAgICogSG93IG9mdGVuIHRvIHNob3cgdGlja3MuIFJlbGF0aXZlIHRvIHRoZSBzdGVwIHNvIHRoYXQgYSB0aWNrIGFsd2F5cyBhcHBlYXJzIG9uIGEgc3RlcC4KICAgICAqIEV4OiBUaWNrIGludGVydmFsIG9mIDQgd2l0aCBhIHN0ZXAgb2YgMyB3aWxsIGRyYXcgYSB0aWNrIGV2ZXJ5IDQgc3RlcHMgKGV2ZXJ5IDEyIHZhbHVlcykuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdGlja0ludGVydmFsKCkgeyByZXR1cm4gdGhpcy5fdGlja0ludGVydmFsOyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCB0aWNrSW50ZXJ2YWwodmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgPT09ICdhdXRvJykgewogICAgICAgICAgICB0aGlzLl90aWNrSW50ZXJ2YWwgPSAnYXV0byc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aGlzLl90aWNrSW50ZXJ2YWwgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RpY2tJbnRlcnZhbCkpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3RpY2tJbnRlcnZhbCA9IDA7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBWYWx1ZSBvZiB0aGUgc2xpZGVyLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZhbHVlKCkgewogICAgICAgIC8vIElmIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSByZWFkIGFuZCBpdCBpcyBzdGlsbCB1bmluaXRpYWxpemVkLCBpbml0aWFsaXplIGl0IHRvIHRoZSBtaW4uCiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9taW47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYpOwogICAgICAgICAgICAvLyBXaGlsZSBpbmNyZW1lbnRpbmcgYnkgYSBkZWNpbWFsIHdlIGNhbiBlbmQgdXAgd2l0aCB2YWx1ZXMgbGlrZSAzMy4zMDAwMDAwMDAwMDAwMDQuCiAgICAgICAgICAgIC8vIFRydW5jYXRlIGl0IHRvIGVuc3VyZSB0aGF0IGl0IG1hdGNoZXMgdGhlIGxhYmVsIGFuZCB0byBtYWtlIGl0IGVhc2llciB0byB3b3JrIHdpdGguCiAgICAgICAgICAgIGlmICh0aGlzLl9yb3VuZFRvRGVjaW1hbCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQodGhpcy5fcm91bmRUb0RlY2ltYWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9wZXJjZW50ID0gdGhpcy5fY2FsY3VsYXRlUGVyY2VudGFnZSh0aGlzLl92YWx1ZSk7CiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgYWxzbyBtb2RpZmllcyB0aGUgcGVyY2VudGFnZSwgd2UgbmVlZCB0byBsZXQgdGhlIGNoYW5nZSBkZXRlY3Rpb24ga25vdy4KICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBzbGlkZXIgaXMgdmVydGljYWwuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdmVydGljYWwoKSB7IHJldHVybiB0aGlzLl92ZXJ0aWNhbDsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgdmVydGljYWwodmFsdWUpIHsKICAgICAgICB0aGlzLl92ZXJ0aWNhbCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRpc3BsYXlWYWx1ZSgpIHsKICAgICAgICBpZiAodGhpcy5kaXNwbGF5V2l0aCkgewogICAgICAgICAgICAvLyBWYWx1ZSBpcyBuZXZlciBudWxsIGJ1dCBzaW5jZSBzZXR0ZXJzIGFuZCBnZXR0ZXJzIGNhbm5vdCBoYXZlCiAgICAgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcywgdGhlIHZhbHVlIGdldHRlciBpcyBhbHNvIHR5cGVkIHRvIHJldHVybiBudWxsLgogICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5V2l0aCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy52YWx1ZSkpKTsKICAgICAgICB9CiAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY291bGQgYmUgaW1wcm92ZWQgZnVydGhlciBieSByb3VuZGluZyBzb21ldGhpbmcgbGlrZSAwLjk5OSB0byAxIG9yCiAgICAgICAgLy8gMC44OTkgdG8gMC45LCBob3dldmVyIGl0IGlzIHZlcnkgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlLCBiZWNhdXNlIGl0IGdldHMgY2FsbGVkIG9uCiAgICAgICAgLy8gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS4KICAgICAgICBpZiAodGhpcy5fcm91bmRUb0RlY2ltYWwgJiYgdGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlICUgMSAhPT0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS50b0ZpeGVkKHRoaXMuX3JvdW5kVG9EZWNpbWFsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwgMDsKICAgIH0KICAgIC8qKgogICAgICogc2V0IGZvY3VzIHRvIHRoZSBob3N0IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvY3VzKG9wdGlvbnMpIHsKICAgICAgICB0aGlzLl9mb2N1c0hvc3RFbGVtZW50KG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBibHVyIHRoZSBob3N0IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJsdXIoKSB7CiAgICAgICAgdGhpcy5fYmx1ckhvc3RFbGVtZW50KCk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBzbGlkZXIgdGhhdCBjb2luY2lkZXMgd2l0aCB0aGUgdmFsdWUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGVyY2VudCgpIHsgcmV0dXJuIHRoaXMuX2NsYW1wKHRoaXMuX3BlcmNlbnQpOyB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGF4aXMgb2YgdGhlIHNsaWRlciBpcyBpbnZlcnRlZC4KICAgICAqIChpLmUuIHdoZXRoZXIgbW92aW5nIHRoZSB0aHVtYiBpbiB0aGUgcG9zaXRpdmUgeCBvciB5IGRpcmVjdGlvbiBkZWNyZWFzZXMgdGhlIHNsaWRlcidzIHZhbHVlKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBfaW52ZXJ0QXhpcygpIHsKICAgICAgICAvLyBTdGFuZGFyZCBub24taW52ZXJ0ZWQgbW9kZSBmb3IgYSB2ZXJ0aWNhbCBzbGlkZXIgc2hvdWxkIGJlIGRyYWdnaW5nIHRoZSB0aHVtYiBmcm9tIGJvdHRvbSB0bwogICAgICAgIC8vIHRvcC4gSG93ZXZlciBmcm9tIGEgeS1heGlzIHN0YW5kcG9pbnQgdGhpcyBpcyBpbnZlcnRlZC4KICAgICAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbCA/ICF0aGlzLmludmVydCA6IHRoaXMuaW52ZXJ0OwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBzbGlkZXIgaXMgYXQgaXRzIG1pbmltdW0gdmFsdWUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgX2lzTWluVmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGVyY2VudCA9PT0gMDsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGFtb3VudCBvZiBzcGFjZSB0byBsZWF2ZSBiZXR3ZWVuIHRoZSBzbGlkZXIgdGh1bWIgYW5kIHRoZSB0cmFjayBmaWxsICYgdHJhY2sgYmFja2dyb3VuZAogICAgICogZWxlbWVudHMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgX3RodW1iR2FwKCkgewogICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHJldHVybiBESVNBQkxFRF9USFVNQl9HQVA7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc01pblZhbHVlICYmICF0aGlzLnRodW1iTGFiZWwpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlID8gTUlOX1ZBTFVFX0FDVElWRV9USFVNQl9HQVAgOiBNSU5fVkFMVUVfTk9OQUNUSVZFX1RIVU1CX0dBUDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAvKioKICAgICAqIENTUyBzdHlsZXMgZm9yIHRoZSB0cmFjayBiYWNrZ3JvdW5kIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgX3RyYWNrQmFja2dyb3VuZFN0eWxlcygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXhpcyA9IHRoaXMudmVydGljYWwgPyAnWScgOiAnWCc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy52ZXJ0aWNhbCA/IGAxLCAkezEgLSB0aGlzLnBlcmNlbnR9LCAxYCA6IGAkezEgLSB0aGlzLnBlcmNlbnR9LCAxLCAxYDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2lnbiA9IHRoaXMuX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCkgPyAnLScgOiAnJzsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAvLyBzY2FsZTNkIGF2b2lkcyBzb21lIHJlbmRlcmluZyBpc3N1ZXMgaW4gQ2hyb21lLiBTZWUgIzEyMDcxLgogICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUke2F4aXN9KCR7c2lnbn0ke3RoaXMuX3RodW1iR2FwfXB4KSBzY2FsZTNkKCR7c2NhbGV9KWAKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBDU1Mgc3R5bGVzIGZvciB0aGUgdHJhY2sgZmlsbCBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IF90cmFja0ZpbGxTdHlsZXMoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBlcmNlbnQgPSB0aGlzLnBlcmNlbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF4aXMgPSB0aGlzLnZlcnRpY2FsID8gJ1knIDogJ1gnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMudmVydGljYWwgPyBgMSwgJHtwZXJjZW50fSwgMWAgOiBgJHtwZXJjZW50fSwgMSwgMWA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNpZ24gPSB0aGlzLl9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpID8gJycgOiAnLSc7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgLy8gc2NhbGUzZCBhdm9pZHMgc29tZSByZW5kZXJpbmcgaXNzdWVzIGluIENocm9tZS4gU2VlICMxMjA3MS4KICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlJHtheGlzfSgke3NpZ259JHt0aGlzLl90aHVtYkdhcH1weCkgc2NhbGUzZCgke3NjYWxlfSlgLAogICAgICAgICAgICAvLyBpT1MgU2FmYXJpIGhhcyBhIGJ1ZyB3aGVyZSBpdCB3b24ndCByZS1yZW5kZXIgZWxlbWVudHMgd2hpY2ggc3RhcnQgb2YgYXMgYHNjYWxlKDApYCB1bnRpbAogICAgICAgICAgICAvLyBzb21ldGhpbmcgZm9yY2VzIGEgc3R5bGUgcmVjYWxjdWxhdGlvbiBvbiBpdC4gU2luY2Ugd2UnbGwgZW5kIHVwIHdpdGggYHNjYWxlKDApYCB3aGVuCiAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBvZiB0aGUgc2xpZGVyIGlzIDAsIHdlIGNhbiBlYXNpbHkgZ2V0IGludG8gdGhpcyBzaXR1YXRpb24uIFdlIGZvcmNlIGEKICAgICAgICAgICAgLy8gcmVjYWxjdWxhdGlvbiBieSBjaGFuZ2luZyB0aGUgZWxlbWVudCdzIGBkaXNwbGF5YCB3aGVuIGl0IGdvZXMgZnJvbSAwIHRvIGFueSBvdGhlciB2YWx1ZS4KICAgICAgICAgICAgZGlzcGxheTogcGVyY2VudCA9PT0gMCA/ICdub25lJyA6ICcnCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQ1NTIHN0eWxlcyBmb3IgdGhlIHRpY2tzIGNvbnRhaW5lciBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IF90aWNrc0NvbnRhaW5lclN0eWxlcygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGF4aXMgPSB0aGlzLnZlcnRpY2FsID8gJ1knIDogJ1gnOwogICAgICAgIC8vIEZvciBhIGhvcml6b250YWwgc2xpZGVyIGluIFJUTCBsYW5ndWFnZXMgd2UgcHVzaCB0aGUgdGlja3MgY29udGFpbmVyIG9mZiB0aGUgbGVmdCBlZGdlCiAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgcmlnaHQgZWRnZSB0byBhdm9pZCBjYXVzaW5nIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgdG8gYXBwZWFyLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2lnbiA9ICF0aGlzLnZlcnRpY2FsICYmIHRoaXMuX2dldERpcmVjdGlvbigpID09ICdydGwnID8gJycgOiAnLSc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50IC8gMiAqIDEwMDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAndHJhbnNmb3JtJzogYHRyYW5zbGF0ZSR7YXhpc30oJHtzaWdufSR7b2Zmc2V0fSUpYAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIENTUyBzdHlsZXMgZm9yIHRoZSB0aWNrcyBlbGVtZW50LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IF90aWNrc1N0eWxlcygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRpY2tTaXplID0gdGhpcy5fdGlja0ludGVydmFsUGVyY2VudCAqIDEwMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGJhY2tncm91bmRTaXplID0gdGhpcy52ZXJ0aWNhbCA/IGAycHggJHt0aWNrU2l6ZX0lYCA6IGAke3RpY2tTaXplfSUgMnB4YDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGF4aXMgPSB0aGlzLnZlcnRpY2FsID8gJ1knIDogJ1gnOwogICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIHdlIHB1c2hlZCB0aGUgdGlja3MgY29udGFpbmVyLCBwdXNoIHRoZSB0aWNrcyB0aGUgb3Bwb3NpdGUKICAgICAgICAvLyBkaXJlY3Rpb24gdG8gcmUtY2VudGVyIHRoZW0gYnV0IGNsaXAgb2ZmIHRoZSBlbmQgZWRnZS4gSW4gUlRMIGxhbmd1YWdlcyB3ZSBuZWVkIHRvIGZsaXAgdGhlCiAgICAgICAgLy8gdGlja3MgMTgwIGRlZ3JlZXMgc28gd2UncmUgcmVhbGx5IGN1dHRpbmcgb2ZmIHRoZSBlbmQgZWRnZSBhYmQgbm90IHRoZSBzdGFydC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNpZ24gPSAhdGhpcy52ZXJ0aWNhbCAmJiB0aGlzLl9nZXREaXJlY3Rpb24oKSA9PSAncnRsJyA/ICctJyA6ICcnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcm90YXRlID0gIXRoaXMudmVydGljYWwgJiYgdGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgPyAnIHJvdGF0ZSgxODBkZWcpJyA6ICcnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3R5bGVzID0gewogICAgICAgICAgICAnYmFja2dyb3VuZFNpemUnOiBiYWNrZ3JvdW5kU2l6ZSwKICAgICAgICAgICAgLy8gV2l0aG91dCB0cmFuc2xhdGVaIHRpY2tzIHNvbWV0aW1lcyBqaXR0ZXIgYXMgdGhlIHNsaWRlciBtb3ZlcyBvbiBDaHJvbWUgJiBGaXJlZm94LgogICAgICAgICAgICAndHJhbnNmb3JtJzogYHRyYW5zbGF0ZVooMCkgdHJhbnNsYXRlJHtheGlzfSgke3NpZ259JHt0aWNrU2l6ZSAvIDJ9JSkke3JvdGF0ZX1gCiAgICAgICAgfTsKICAgICAgICBpZiAodGhpcy5faXNNaW5WYWx1ZSAmJiB0aGlzLl90aHVtYkdhcCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzaWRlOwogICAgICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkgewogICAgICAgICAgICAgICAgc2lkZSA9IHRoaXMuX2ludmVydEF4aXMgPyAnQm90dG9tJyA6ICdUb3AnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc2lkZSA9IHRoaXMuX2ludmVydEF4aXMgPyAnUmlnaHQnIDogJ0xlZnQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0eWxlc1tgcGFkZGluZyR7c2lkZX1gXSA9IGAke3RoaXMuX3RodW1iR2FwfXB4YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IF90aHVtYkNvbnRhaW5lclN0eWxlcygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGF4aXMgPSB0aGlzLnZlcnRpY2FsID8gJ1knIDogJ1gnOwogICAgICAgIC8vIEZvciBhIGhvcml6b250YWwgc2xpZGVyIGluIFJUTCBsYW5ndWFnZXMgd2UgcHVzaCB0aGUgdGh1bWIgY29udGFpbmVyIG9mZiB0aGUgbGVmdCBlZGdlCiAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgcmlnaHQgZWRnZSB0byBhdm9pZCBjYXVzaW5nIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgdG8gYXBwZWFyLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW52ZXJ0T2Zmc2V0ID0gKHRoaXMuX2dldERpcmVjdGlvbigpID09ICdydGwnICYmICF0aGlzLnZlcnRpY2FsKSA/ICF0aGlzLl9pbnZlcnRBeGlzIDogdGhpcy5faW52ZXJ0QXhpczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG9mZnNldCA9IChpbnZlcnRPZmZzZXQgPyB0aGlzLnBlcmNlbnQgOiAxIC0gdGhpcy5wZXJjZW50KSAqIDEwMDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAndHJhbnNmb3JtJzogYHRyYW5zbGF0ZSR7YXhpc30oLSR7b2Zmc2V0fSUpYAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFdoZXRoZXIgbW91c2UgZXZlbnRzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gYSBzbGlkZXIgcG9zaXRpb24gYnkgY2FsY3VsYXRpbmcgdGhlaXIgZGlzdGFuY2UKICAgICAqIGZyb20gdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlIG9mIHRoZSBzbGlkZXIgYXMgb3Bwb3NlZCB0byB0aGUgdG9wIG9yIGxlZnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLl9nZXREaXJlY3Rpb24oKSA9PSAncnRsJyAmJiAhdGhpcy52ZXJ0aWNhbCkgPyAhdGhpcy5faW52ZXJ0QXhpcyA6IHRoaXMuX2ludmVydEF4aXM7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBsYW5ndWFnZSBkaXJlY3Rpb24gZm9yIHRoaXMgc2xpZGVyIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldERpcmVjdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMuX2RpciAmJiB0aGlzLl9kaXIudmFsdWUgPT0gJ3J0bCcpID8gJ3J0bCcgOiAnbHRyJzsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yCiAgICAgICAgICAgIC5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRydWUpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob3JpZ2luKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2lzQWN0aXZlID0gISFvcmlnaW4gJiYgb3JpZ2luICE9PSAna2V5Ym9hcmQnOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLl9kaXIpIHsKICAgICAgICAgICAgdGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5fZGlyLmNoYW5nZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IG51bGw7CiAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsRXZlbnRzKCk7CiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpOwogICAgICAgIHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25Nb3VzZWVudGVyKCkgewogICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2F2ZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgc2xpZGVyIGhlcmUgc28gd2UgY2FuIHVzZSB0aGVtIHRvIHVwZGF0ZSB0aGUgc3BhY2luZyBvZiB0aGUKICAgICAgICAvLyB0aWNrcyBhbmQgZGV0ZXJtaW5lIHdoZXJlIG9uIHRoZSBzbGlkZXIgY2xpY2sgYW5kIHNsaWRlIGV2ZW50cyBoYXBwZW4uCiAgICAgICAgdGhpcy5fc2xpZGVyRGltZW5zaW9ucyA9IHRoaXMuX2dldFNsaWRlckRpbWVuc2lvbnMoKTsKICAgICAgICB0aGlzLl91cGRhdGVUaWNrSW50ZXJ2YWxQZXJjZW50KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbkZvY3VzKCkgewogICAgICAgIC8vIFdlIHNhdmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHNsaWRlciBoZXJlIHNvIHdlIGNhbiB1c2UgdGhlbSB0byB1cGRhdGUgdGhlIHNwYWNpbmcgb2YgdGhlCiAgICAgICAgLy8gdGlja3MgYW5kIGRldGVybWluZSB3aGVyZSBvbiB0aGUgc2xpZGVyIGNsaWNrIGFuZCBzbGlkZSBldmVudHMgaGFwcGVuLgogICAgICAgIHRoaXMuX3NsaWRlckRpbWVuc2lvbnMgPSB0aGlzLl9nZXRTbGlkZXJEaW1lbnNpb25zKCk7CiAgICAgICAgdGhpcy5fdXBkYXRlVGlja0ludGVydmFsUGVyY2VudCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfb25CbHVyKCkgewogICAgICAgIHRoaXMub25Ub3VjaGVkKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9vbktleWRvd24oZXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwogICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkgewogICAgICAgICAgICBjYXNlIFBBR0VfVVA6CiAgICAgICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnQoMTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgUEFHRV9ET1dOOgogICAgICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50KC0xMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBFTkQ6CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBIT01FOgogICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWluOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgTEVGVF9BUlJPVzoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IEZvciBhIHNpZ2h0ZWQgdXNlciBpdCB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UgdGhhdCB3aGVuIHRoZXkgcHJlc3MgYW4gYXJyb3cga2V5IG9uIGFuCiAgICAgICAgICAgICAgICAvLyBpbnZlcnRlZCBzbGlkZXIgdGhlIHRodW1iIG1vdmVzIGluIHRoYXQgZGlyZWN0aW9uLiBIb3dldmVyIGZvciBhIGJsaW5kIHVzZXIsIG5vdGhpbmcKICAgICAgICAgICAgICAgIC8vIGFib3V0IHRoZSBzbGlkZXIgaW5kaWNhdGVzIHRoYXQgaXQgaXMgaW52ZXJ0ZWQuIFRoZXkgd2lsbCBleHBlY3QgbGVmdCB0byBiZSBkZWNyZW1lbnQsCiAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIGhvdyBpdCBhcHBlYXJzIG9uIHRoZSBzY3JlZW4uIEZvciBzcGVha2VycyBvZlJUTCBsYW5ndWFnZXMsIHRoZXkgcHJvYmFibHkKICAgICAgICAgICAgICAgIC8vIGV4cGVjdCBsZWZ0IHRvIG1lYW4gaW5jcmVtZW50LiBUaGVyZWZvcmUgd2UgZmxpcCB0aGUgbWVhbmluZyBvZiB0aGUgc2lkZSBhcnJvdyBrZXlzIGZvcgogICAgICAgICAgICAgICAgLy8gUlRMLiBGb3IgaW52ZXJ0ZWQgc2xpZGVycyB3ZSBwcmVmZXIgYSBnb29kIGExMXkgZXhwZXJpZW5jZSB0byBoYXZpbmcgaXQgImxvb2sgcmlnaHQiIGZvcgogICAgICAgICAgICAgICAgLy8gc2lnaHRlZCB1c2VycywgdGhlcmVmb3JlIHdlIGRvIG5vdCBzd2FwIHRoZSBtZWFuaW5nLgogICAgICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50KHRoaXMuX2dldERpcmVjdGlvbigpID09ICdydGwnID8gMSA6IC0xKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFVQX0FSUk9XOgogICAgICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50KDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgUklHSFRfQVJST1c6CiAgICAgICAgICAgICAgICAvLyBTZWUgY29tbWVudCBvbiBMRUZUX0FSUk9XIGFib3V0IHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHdlIGZsaXAgdGhlIG1lYW5pbmcuCiAgICAgICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnQodGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRE9XTl9BUlJPVzoKICAgICAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudCgtMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJldHVybiBpZiB0aGUga2V5IGlzIG5vdCBvbmUgdGhhdCB3ZSBleHBsaWNpdGx5IGhhbmRsZSB0byBhdm9pZCBjYWxsaW5nIHByZXZlbnREZWZhdWx0IG9uCiAgICAgICAgICAgICAgICAvLyBpdC4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG9sZFZhbHVlICE9IHRoaXMudmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZW1pdElucHV0RXZlbnQoKTsKICAgICAgICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX29uS2V5dXAoKSB7CiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0V2luZG93KCkgewogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gKChfYSA9IHRoaXMuX2RvY3VtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVmYXVsdFZpZXcpIHx8IHdpbmRvdzsKICAgIH0KICAgIC8qKgogICAgICogQmluZHMgb3VyIGdsb2JhbCBtb3ZlIGFuZCBlbmQgZXZlbnRzLiBUaGV5J3JlIGJvdW5kIGF0IHRoZSBkb2N1bWVudCBsZXZlbCBhbmQgb25seSB3aGlsZQogICAgICogZHJhZ2dpbmcgc28gdGhhdCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8ga2VlcCB0aGVpciBwb2ludGVyIGV4YWN0bHkgb3ZlciB0aGUgc2xpZGVyCiAgICAgKiBhcyB0aGV5J3JlIHN3aXBpbmcgYWNyb3NzIHRoZSBzY3JlZW4uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB0cmlnZ2VyRXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9iaW5kR2xvYmFsRXZlbnRzKHRyaWdnZXJFdmVudCkgewogICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBiaW5kIHRoZSBldmVudHMgdG8gdGhlIGBkb2N1bWVudGAsIGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIGNhcHR1cmUKICAgICAgICAvLyBkcmFnIGNhbmNlbCBldmVudHMgd2hlcmUgdGhlIHVzZXIncyBwb2ludGVyIGlzIG91dHNpZGUgdGhlIGJyb3dzZXIgd2luZG93LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2RvY3VtZW50OwogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNUb3VjaCA9IGlzVG91Y2hFdmVudCh0cmlnZ2VyRXZlbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1vdmVFdmVudE5hbWUgPSBpc1RvdWNoID8gJ3RvdWNobW92ZScgOiAnbW91c2Vtb3ZlJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmRFdmVudE5hbWUgPSBpc1RvdWNoID8gJ3RvdWNoZW5kJyA6ICdtb3VzZXVwJzsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtb3ZlRXZlbnROYW1lLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudE5hbWUsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgaWYgKGlzVG91Y2gpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93KSB7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fd2luZG93Qmx1cik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIGFueSBnbG9iYWwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2UgbWF5IGhhdmUgYWRkZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlbW92ZUdsb2JhbEV2ZW50cygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLl9kb2N1bWVudDsKICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudCkgewogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cpIHsKICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl93aW5kb3dCbHVyKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEluY3JlbWVudHMgdGhlIHNsaWRlciBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHN0ZXBzIChuZWdhdGl2ZSBudW1iZXIgZGVjcmVtZW50cykuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBudW1TdGVwcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2luY3JlbWVudChudW1TdGVwcykgewogICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9jbGFtcCgodGhpcy52YWx1ZSB8fCAwKSArIHRoaXMuc3RlcCAqIG51bVN0ZXBzLCB0aGlzLm1pbiwgdGhpcy5tYXgpOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxjdWxhdGUgdGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBuZXcgcGh5c2ljYWwgbG9jYXRpb24uIFRoZSB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBzbmFwcGVkLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcG9zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmFsdWVGcm9tUG9zaXRpb24ocG9zKSB7CiAgICAgICAgaWYgKCF0aGlzLl9zbGlkZXJEaW1lbnNpb25zKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLnZlcnRpY2FsID8gdGhpcy5fc2xpZGVyRGltZW5zaW9ucy50b3AgOiB0aGlzLl9zbGlkZXJEaW1lbnNpb25zLmxlZnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzaXplID0gdGhpcy52ZXJ0aWNhbCA/IHRoaXMuX3NsaWRlckRpbWVuc2lvbnMuaGVpZ2h0IDogdGhpcy5fc2xpZGVyRGltZW5zaW9ucy53aWR0aDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBvc0NvbXBvbmVudCA9IHRoaXMudmVydGljYWwgPyBwb3MueSA6IHBvcy54OwogICAgICAgIC8vIFRoZSBleGFjdCB2YWx1ZSBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIGV2ZW50IGFuZCB1c2VkIHRvIGZpbmQgdGhlIGNsb3Nlc3Qgc25hcCB2YWx1ZS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBlcmNlbnQgPSB0aGlzLl9jbGFtcCgocG9zQ29tcG9uZW50IC0gb2Zmc2V0KSAvIHNpemUpOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpKSB7CiAgICAgICAgICAgIHBlcmNlbnQgPSAxIC0gcGVyY2VudDsKICAgICAgICB9CiAgICAgICAgLy8gU2luY2UgdGhlIHN0ZXBzIG1heSBub3QgZGl2aWRlIGNsZWFubHkgaW50byB0aGUgbWF4IHZhbHVlLCBpZiB0aGUgdXNlcgogICAgICAgIC8vIHNsaWQgdG8gMCBvciAxMDAgcGVyY2VudCwgd2UganVtcCB0byB0aGUgbWluL21heCB2YWx1ZS4gVGhpcyBhcHByb2FjaAogICAgICAgIC8vIGlzIHNsaWdodGx5IG1vcmUgaW50dWl0aXZlIHRoYW4gdXNpbmcgYE1hdGguY2VpbGAgYmVsb3csIGJlY2F1c2UgaXQKICAgICAgICAvLyBmb2xsb3dzIHRoZSB1c2VyJ3MgcG9pbnRlciBjbG9zZXIuCiAgICAgICAgaWYgKHBlcmNlbnQgPT09IDApIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWluOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwZXJjZW50ID09PSAxKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhhY3RWYWx1ZSA9IHRoaXMuX2NhbGN1bGF0ZVZhbHVlKHBlcmNlbnQpOwogICAgICAgICAgICAvLyBUaGlzIGNhbGN1bGF0aW9uIGZpbmRzIHRoZSBjbG9zZXN0IHN0ZXAgYnkgZmluZGluZyB0aGUgY2xvc2VzdAogICAgICAgICAgICAvLyB3aG9sZSBudW1iZXIgZGl2aXNpYmxlIGJ5IHRoZSBzdGVwIHJlbGF0aXZlIHRvIHRoZSBtaW4uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2xvc2VzdFZhbHVlID0gTWF0aC5yb3VuZCgoZXhhY3RWYWx1ZSAtIHRoaXMubWluKSAvIHRoaXMuc3RlcCkgKiB0aGlzLnN0ZXAgKyB0aGlzLm1pbjsKICAgICAgICAgICAgLy8gVGhlIHZhbHVlIG5lZWRzIHRvIHNuYXAgdG8gdGhlIG1pbiBhbmQgbWF4LgogICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fY2xhbXAoY2xvc2VzdFZhbHVlLCB0aGlzLm1pbiwgdGhpcy5tYXgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRW1pdHMgYSBjaGFuZ2UgZXZlbnQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QgZW1pdHRlZCB2YWx1ZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZW1pdENoYW5nZUV2ZW50KCkgewogICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7CiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpOwogICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIGFuIGlucHV0IGV2ZW50IHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QgZW1pdHRlZCB2YWx1ZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZW1pdElucHV0RXZlbnQoKSB7CiAgICAgICAgdGhpcy5pbnB1dC5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KCkpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBhbW91bnQgb2Ygc3BhY2UgYmV0d2VlbiB0aWNrcyBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHdpZHRoIG9mIHRoZSBzbGlkZXIuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZVRpY2tJbnRlcnZhbFBlcmNlbnQoKSB7CiAgICAgICAgaWYgKCF0aGlzLnRpY2tJbnRlcnZhbCB8fCAhdGhpcy5fc2xpZGVyRGltZW5zaW9ucykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnRpY2tJbnRlcnZhbCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHJhY2tTaXplID0gdGhpcy52ZXJ0aWNhbCA/IHRoaXMuX3NsaWRlckRpbWVuc2lvbnMuaGVpZ2h0IDogdGhpcy5fc2xpZGVyRGltZW5zaW9ucy53aWR0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGl4ZWxzUGVyU3RlcCA9IHRyYWNrU2l6ZSAqIHRoaXMuc3RlcCAvICh0aGlzLm1heCAtIHRoaXMubWluKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3RlcHNQZXJUaWNrID0gTWF0aC5jZWlsKE1JTl9BVVRPX1RJQ0tfU0VQQVJBVElPTiAvIHBpeGVsc1BlclN0ZXApOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBwaXhlbHNQZXJUaWNrID0gc3RlcHNQZXJUaWNrICogdGhpcy5zdGVwOwogICAgICAgICAgICB0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50ID0gcGl4ZWxzUGVyVGljayAvIHRyYWNrU2l6ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3RpY2tJbnRlcnZhbFBlcmNlbnQgPSB0aGlzLnRpY2tJbnRlcnZhbCAqIHRoaXMuc3RlcCAvICh0aGlzLm1heCAtIHRoaXMubWluKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBzbGlkZXIgY2hhbmdlIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/PX0gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jcmVhdGVDaGFuZ2VFdmVudCh2YWx1ZSA9IHRoaXMudmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IE1hdFNsaWRlckNoYW5nZSgpOwogICAgICAgIGV2ZW50LnNvdXJjZSA9IHRoaXM7CiAgICAgICAgZXZlbnQudmFsdWUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNsaWRlciB0aGF0IGEgdmFsdWUgaXMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2NhbGN1bGF0ZVBlcmNlbnRhZ2UodmFsdWUpIHsKICAgICAgICByZXR1cm4gKCh2YWx1ZSB8fCAwKSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKTsKICAgIH0KICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWUgYSBwZXJjZW50YWdlIG9mIHRoZSBzbGlkZXIgY29ycmVzcG9uZHMgdG8uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwZXJjZW50YWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2FsY3VsYXRlVmFsdWUocGVyY2VudGFnZSkgewogICAgICAgIHJldHVybiB0aGlzLm1pbiArIHBlcmNlbnRhZ2UgKiAodGhpcy5tYXggLSB0aGlzLm1pbik7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiBhIG51bWJlciBiZXR3ZWVuIHR3byBudW1iZXJzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IG1pbgogICAgICogQHBhcmFtIHs/PX0gbWF4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2xhbXAodmFsdWUsIG1pbiA9IDAsIG1heCA9IDEpIHsKICAgICAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbih2YWx1ZSwgbWF4KSk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgYm91bmRpbmcgY2xpZW50IHJlY3Qgb2YgdGhlIHNsaWRlciB0cmFjayBlbGVtZW50LgogICAgICogVGhlIHRyYWNrIGlzIHVzZWQgcmF0aGVyIHRoYW4gdGhlIG5hdGl2ZSBlbGVtZW50IHRvIGlnbm9yZSB0aGUgZXh0cmEgc3BhY2UgdGhhdCB0aGUgdGh1bWIgY2FuCiAgICAgKiB0YWtlIHVwLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRTbGlkZXJEaW1lbnNpb25zKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zbGlkZXJXcmFwcGVyID8gdGhpcy5fc2xpZGVyV3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogRm9jdXNlcyB0aGUgbmF0aXZlIGVsZW1lbnQuCiAgICAgKiBDdXJyZW50bHkgb25seSB1c2VkIHRvIGFsbG93IGEgYmx1ciBldmVudCB0byBmaXJlIGJ1dCB3aWxsIGJlIHVzZWQgd2l0aCBrZXlib2FyZCBpbnB1dCBsYXRlci4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZm9jdXNIb3N0RWxlbWVudChvcHRpb25zKSB7CiAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBCbHVycyB0aGUgbmF0aXZlIGVsZW1lbnQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2JsdXJIb3N0RWxlbWVudCgpIHsKICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpOwogICAgfQogICAgLyoqCiAgICAgKiBSdW5zIGEgY2FsbGJhY2sgaW5zaWRlIG9mIHRoZSBOZ1pvbmUsIGlmIHBvc3NpYmxlLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9ydW5JbnNpZGVab25lKGZuKSB7CiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIGBfbmdab25lYCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4KICAgICAgICB0aGlzLl9uZ1pvbmUgPyB0aGlzLl9uZ1pvbmUucnVuKGZuKSA6IGZuKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJ1bnMgYSBjYWxsYmFjayBvdXRzaWRlIG9mIHRoZSBOZ1pvbmUsIGlmIHBvc3NpYmxlLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9ydW5PdXRzaXplWm9uZShmbikgewogICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgUmVtb3ZlIHRoaXMgZnVuY3Rpb24gb25jZSBgX25nWm9uZWAgaXMgYSByZXF1aXJlZCBwYXJhbWV0ZXIuCiAgICAgICAgdGhpcy5fbmdab25lID8gdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSA6IGZuKCk7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIG1vZGVsIHZhbHVlLiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgd3JpdGVWYWx1ZSh2YWx1ZSkgewogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLgogICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAqIEBwYXJhbSB7P30gZm4gQ2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgdG91Y2hlZC4KICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgKiBAcGFyYW0gez99IGZuIENhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgd2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSBkaXNhYmxlZC4KICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkgewogICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkOwogICAgfQp9Ck1hdFNsaWRlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNsaWRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTbGlkZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1aW5qZWN0QXR0cmlidXRlKCd0YWJpbmRleCcpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxLCA4KSk7IH07Ck1hdFNsaWRlci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRTbGlkZXIsIHNlbGVjdG9yczogW1sibWF0LXNsaWRlciJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRTbGlkZXJfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXZpZXdRdWVyeShfYzAkYiwgdHJ1ZSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICB2YXIgX3Q7CiAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fc2xpZGVyV3JhcHBlciA9IF90LmZpcnN0KTsKICAgIH0gfSwgaG9zdEF0dHJzOiBbInJvbGUiLCAic2xpZGVyIiwgMSwgIm1hdC1zbGlkZXIiLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogMjgsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0U2xpZGVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bGlzdGVuZXIoImZvY3VzIiwgZnVuY3Rpb24gTWF0U2xpZGVyX2ZvY3VzX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25Gb2N1cygpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIE1hdFNsaWRlcl9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25CbHVyKCk7IH0pKCJrZXlkb3duIiwgZnVuY3Rpb24gTWF0U2xpZGVyX2tleWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbktleWRvd24oJGV2ZW50KTsgfSkoImtleXVwIiwgZnVuY3Rpb24gTWF0U2xpZGVyX2tleXVwX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25LZXl1cCgpOyB9KSgibW91c2VlbnRlciIsIGZ1bmN0aW9uIE1hdFNsaWRlcl9tb3VzZWVudGVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25Nb3VzZWVudGVyKCk7IH0pKCJzZWxlY3RzdGFydCIsIGZ1bmN0aW9uIE1hdFNsaWRlcl9zZWxlY3RzdGFydF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiAkZXZlbnQucHJldmVudERlZmF1bHQoKTsgfSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1aG9zdFByb3BlcnR5KCJ0YWJJbmRleCIsIGN0eC50YWJJbmRleCk7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoImFyaWEtdmFsdWVtYXgiLCBjdHgubWF4KSgiYXJpYS12YWx1ZW1pbiIsIGN0eC5taW4pKCJhcmlhLXZhbHVlbm93IiwgY3R4LnZhbHVlKSgiYXJpYS1vcmllbnRhdGlvbiIsIGN0eC52ZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCIpOwogICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1zbGlkZXItZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtc2xpZGVyLWhhcy10aWNrcyIsIGN0eC50aWNrSW50ZXJ2YWwpKCJtYXQtc2xpZGVyLWhvcml6b250YWwiLCAhY3R4LnZlcnRpY2FsKSgibWF0LXNsaWRlci1heGlzLWludmVydGVkIiwgY3R4Ll9pbnZlcnRBeGlzKSgibWF0LXNsaWRlci1pbnZlcnQtbW91c2UtY29vcmRzIiwgY3R4Ll9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpKSgibWF0LXNsaWRlci1zbGlkaW5nIiwgY3R4Ll9pc1NsaWRpbmcpKCJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmciLCBjdHgudGh1bWJMYWJlbCkoIm1hdC1zbGlkZXItdmVydGljYWwiLCBjdHgudmVydGljYWwpKCJtYXQtc2xpZGVyLW1pbi12YWx1ZSIsIGN0eC5faXNNaW5WYWx1ZSkoIm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2siLCBjdHguZGlzYWJsZWQgfHwgY3R4Ll9pc01pblZhbHVlICYmIGN0eC5fdGh1bWJHYXAgJiYgY3R4Ll9pbnZlcnRBeGlzKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCBjdHguX2FuaW1hdGlvbk1vZGUgPT09ICJOb29wQW5pbWF0aW9ucyIpOwogICAgfSB9LCBpbnB1dHM6IHsgZGlzYWJsZWQ6ICJkaXNhYmxlZCIsIGNvbG9yOiAiY29sb3IiLCB0YWJJbmRleDogInRhYkluZGV4IiwgaW52ZXJ0OiAiaW52ZXJ0IiwgbWF4OiAibWF4IiwgbWluOiAibWluIiwgdmFsdWU6ICJ2YWx1ZSIsIHN0ZXA6ICJzdGVwIiwgdGh1bWJMYWJlbDogInRodW1iTGFiZWwiLCB0aWNrSW50ZXJ2YWw6ICJ0aWNrSW50ZXJ2YWwiLCB2ZXJ0aWNhbDogInZlcnRpY2FsIiwgZGlzcGxheVdpdGg6ICJkaXNwbGF5V2l0aCIgfSwgb3V0cHV0czogeyBjaGFuZ2U6ICJjaGFuZ2UiLCBpbnB1dDogImlucHV0IiwgdmFsdWVDaGFuZ2U6ICJ2YWx1ZUNoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0U2xpZGVyIl0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW01BVF9TTElERVJfVkFMVUVfQUNDRVNTT1JdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGRlY2xzOiAxMywgdmFyczogNiwgY29uc3RzOiBbWzEsICJtYXQtc2xpZGVyLXdyYXBwZXIiXSwgWyJzbGlkZXJXcmFwcGVyIiwgIiJdLCBbMSwgIm1hdC1zbGlkZXItdHJhY2std3JhcHBlciJdLCBbMSwgIm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCIsIDMsICJuZ1N0eWxlIl0sIFsxLCAibWF0LXNsaWRlci10cmFjay1maWxsIiwgMywgIm5nU3R5bGUiXSwgWzEsICJtYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lciIsIDMsICJuZ1N0eWxlIl0sIFsxLCAibWF0LXNsaWRlci10aWNrcyIsIDMsICJuZ1N0eWxlIl0sIFsxLCAibWF0LXNsaWRlci10aHVtYi1jb250YWluZXIiLCAzLCAibmdTdHlsZSJdLCBbMSwgIm1hdC1zbGlkZXItZm9jdXMtcmluZyJdLCBbMSwgIm1hdC1zbGlkZXItdGh1bWIiXSwgWzEsICJtYXQtc2xpZGVyLXRodW1iLWxhYmVsIl0sIFsxLCAibWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0U2xpZGVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDIpOwogICAgICAgIMm1ybVlbGVtZW50KDMsICJkaXYiLCAzKTsKICAgICAgICDJtcm1ZWxlbWVudCg0LCAiZGl2IiwgNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiLCA1KTsKICAgICAgICDJtcm1ZWxlbWVudCg2LCAiZGl2IiwgNik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiLCA3KTsKICAgICAgICDJtcm1ZWxlbWVudCg4LCAiZGl2IiwgOCk7CiAgICAgICAgybXJtWVsZW1lbnQoOSwgImRpdiIsIDkpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJkaXYiLCAxMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMSwgInNwYW4iLCAxMSk7CiAgICAgICAgybXJtXRleHQoMTIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3R5bGUiLCBjdHguX3RyYWNrQmFja2dyb3VuZFN0eWxlcyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N0eWxlIiwgY3R4Ll90cmFja0ZpbGxTdHlsZXMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIGN0eC5fdGlja3NDb250YWluZXJTdHlsZXMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIGN0eC5fdGlja3NTdHlsZXMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIGN0eC5fdGh1bWJDb250YWluZXJTdHlsZXMpOwogICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4LmRpc3BsYXlWYWx1ZSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ1N0eWxlXSwgc3R5bGVzOiBbIi5tYXQtc2xpZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtvdXRsaW5lOm5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCk6YWN0aXZlLC5tYXQtc2xpZGVyLm1hdC1zbGlkZXItc2xpZGluZzpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpe2N1cnNvcjotd2Via2l0LWdyYWJiaW5nO2N1cnNvcjpncmFiYmluZ30ubWF0LXNsaWRlci13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10cmFjay1maWxse3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybS1vcmlnaW46MCAwO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7b3ZlcmZsb3c6aGlkZGVufS5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDtiYWNrZ3JvdW5kLWNsaXA6Y29udGVudC1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1mb2N1cy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNmb3JtOnNjYWxlKDApO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZywubWF0LXNsaWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYntjdXJzb3I6LXdlYmtpdC1ncmFiO2N1cnNvcjpncmFifS5tYXQtc2xpZGVyLXRodW1ie3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xMHB4O2JvdHRvbTotMTBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXI6M3B4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwLjcpO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm9yZGVyLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1yYWRpdXMgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7ei1pbmRleDoxO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcnt0cmFuc2l0aW9uLWR1cmF0aW9uOjBtc30ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci13aWR0aDowO2JvcmRlci1zdHlsZTpzb2xpZDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLWhhcy10aWNrcy5jZGstZm9jdXNlZDpub3QoLm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2spIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVyLC5tYXQtc2xpZGVyLWhhcy10aWNrczpob3Zlcjpub3QoLm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2spIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye29wYWNpdHk6MX0ubWF0LXNsaWRlci1oYXMtdGlja3MuY2RrLWZvY3VzZWQ6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKSAubWF0LXNsaWRlci10aWNrcywubWF0LXNsaWRlci1oYXMtdGlja3M6aG92ZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKSAubWF0LXNsaWRlci10aWNrc3tvcGFjaXR5OjF9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2Rpc3BsYXk6bm9uZX0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6ZmxleH0ubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCV9Lm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke3RyYW5zZm9ybS1vcmlnaW46MCAwfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLWZvY3VzZWQubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1ie3RyYW5zZm9ybTpzY2FsZSgwKX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JvcmRlci1yYWRpdXM6NTAlIDUwJSAwfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtvcGFjaXR5OjF9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstbW91c2UtZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay10b3VjaC1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItd2lkdGg6MnB4O3RyYW5zZm9ybTpzY2FsZSgxKX0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne3RyYW5zZm9ybTpzY2FsZSgwKTtvcGFjaXR5OjB9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLXdpZHRoOjRweDt0cmFuc2Zvcm06c2NhbGUoMC41KX0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5Om5vbmV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbHtoZWlnaHQ6NDhweDttaW4td2lkdGg6MTI4cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci13cmFwcGVye2hlaWdodDoycHg7dG9wOjIzcHg7bGVmdDo4cHg7cmlnaHQ6OHB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7aGVpZ2h0OjJweDtib3JkZXItbGVmdC13aWR0aDoycHg7cmlnaHQ6MDt0b3A6MH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7aGVpZ2h0OjJweDt3aWR0aDoxMDAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHtoZWlnaHQ6MnB4O3dpZHRoOjEwMCU7dHJhbnNmb3JtOnNjYWxlWCgwKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7aGVpZ2h0OjJweDt3aWR0aDoxMDAlO3RyYW5zZm9ybTpzY2FsZVgoMSl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7aGVpZ2h0OjJweDt3aWR0aDoxMDAlfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7aGVpZ2h0OjA7b3V0bGluZTpzb2xpZCAycHg7dG9wOjFweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tze2hlaWdodDoycHg7d2lkdGg6MTAwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcnt3aWR0aDoxMDAlO2hlaWdodDowO3RvcDo1MCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne3RvcDotMTVweDtyaWdodDotMTVweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse3JpZ2h0Oi0xNHB4O3RvcDotNDBweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgyNnB4KSBzY2FsZSgwLjAxKSByb3RhdGUoNDVkZWcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOm5vbmV9Lm1hdC1zbGlkZXItdmVydGljYWx7d2lkdGg6NDhweDttaW4taGVpZ2h0OjEyOHB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXdyYXBwZXJ7d2lkdGg6MnB4O3RvcDo4cHg7Ym90dG9tOjhweDtsZWZ0OjIzcHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7d2lkdGg6MnB4O2JvcmRlci10b3Atd2lkdGg6MnB4O2JvdHRvbTowO2xlZnQ6MH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10cmFjay13cmFwcGVye2hlaWdodDoxMDAlO3dpZHRoOjJweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10cmFjay1maWxse2hlaWdodDoxMDAlO3dpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGVZKDApfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7aGVpZ2h0OjEwMCU7d2lkdGg6MnB4O3RyYW5zZm9ybTpzY2FsZVkoMSl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye3dpZHRoOjJweDtoZWlnaHQ6MTAwJX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcnt3aWR0aDowO291dGxpbmU6c29saWQgMnB4O2xlZnQ6MXB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7Ym90dG9tOi0xNXB4O2xlZnQ6LTE1cHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3N7d2lkdGg6MnB4O2hlaWdodDoxMDAlfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcntoZWlnaHQ6MTAwJTt3aWR0aDowO2xlZnQ6NTAlfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7Ym90dG9tOi0xNHB4O2xlZnQ6LTQwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMjZweCkgc2NhbGUoMC4wMSkgcm90YXRlKC00NWRlZyl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LXNsaWRlci12ZXJ0aWNhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2xlZnQ6MDtyaWdodDphdXRvfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCV9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHt0cmFuc2Zvcm0tb3JpZ2luOjAgMH1bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbHt0cmFuc2Zvcm0tb3JpZ2luOjAgMH1bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJX0ubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdGlja3MsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVyLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7dHJhbnNpdGlvbjpub25lfVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKLyoqIEBub2NvbGxhcHNlICovCk1hdFNsaWRlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogQXR0cmlidXRlLCBhcmdzOiBbJ3RhYmluZGV4JyxdIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9LAogICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ck1hdFNsaWRlci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGludmVydDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbWluOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIHN0ZXA6IFt7IHR5cGU6IElucHV0IH1dLAogICAgdGh1bWJMYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICB0aWNrSW50ZXJ2YWw6IFt7IHR5cGU6IElucHV0IH1dLAogICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZGlzcGxheVdpdGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgdmVydGljYWw6IFt7IHR5cGU6IElucHV0IH1dLAogICAgY2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBpbnB1dDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgdmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIF9zbGlkZXJXcmFwcGVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnc2xpZGVyV3JhcHBlcicsXSB9XQp9OwovKioKICogUmV0dXJucyB3aGV0aGVyIGFuIGV2ZW50IGlzIGEgdG91Y2ggZXZlbnQuCiAqIEBwYXJhbSB7P30gZXZlbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzVG91Y2hFdmVudChldmVudCkgewogICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHBpeGVsIHRoYXQgdGhlIHVzZXIgaGFzIGRyYWdnZWQgc28gd2UgbmVlZCBpdCB0byBiZQogICAgLy8gYXMgZmFzdCBhcyBwb3NzaWJsZS4gU2luY2Ugd2Ugb25seSBiaW5kIG1vdXNlIGV2ZW50cyBhbmQgdG91Y2ggZXZlbnRzLCB3ZSBjYW4gYXNzdW1lCiAgICAvLyB0aGF0IGlmIHRoZSBldmVudCdzIG5hbWUgc3RhcnRzIHdpdGggYHRgLCBpdCdzIGEgdG91Y2ggZXZlbnQuCiAgICByZXR1cm4gZXZlbnQudHlwZVswXSA9PT0gJ3QnOwp9Ci8qKgogKiBHZXRzIHRoZSBjb29yZGluYXRlcyBvZiBhIHRvdWNoIG9yIG1vdXNlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KICogQHBhcmFtIHs/fSBldmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UG9pbnRlclBvc2l0aW9uT25QYWdlKGV2ZW50KSB7CiAgICAvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcG9pbnQgPSBpc1RvdWNoRXZlbnQoZXZlbnQpID8gKGV2ZW50LnRvdWNoZXNbMF0gfHwgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0pIDogZXZlbnQ7CiAgICByZXR1cm4geyB4OiBwb2ludC5jbGllbnRYLCB5OiBwb2ludC5jbGllbnRZIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zbGlkZXIvc2xpZGVyLW1vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBNYXRTbGlkZXJNb2R1bGUgewp9Ck1hdFNsaWRlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFNsaWRlck1vZHVsZSB9KTsKTWF0U2xpZGVyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0U2xpZGVyTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNsaWRlck1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIE1hdENvbW1vbk1vZHVsZV0sCiAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0U2xpZGVyTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFNsaWRlcl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsIE1hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRTbGlkZXIsCiAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKCmNvbnN0IERUWVBFX0VOVU1fVE9fTkFNRSA9IHsgIjE5IjogImZsb2F0MTYiLCAiMSI6ICJmbG9hdDMyIiwgIjIiOiAiZmxvYXQ2NCIsICIzIjogImludDMyIiwgIjQiOiAidWludDgiLCAiMTciOiAidWludDE2IiwgIjIyIjogInVpbnQzMiIsICIyMyI6ICJ1aW50NjQiLCAiNSI6ICJpbnQxNiIsICI2IjogImludDgiLCAiNyI6ICJzdHJpbmciLCAiOCI6ICJjb21wbGV4NjQiLCAiMTgiOiAiY29tcGxleDEyOCIsICI5IjogImludDY0IiwgIjEwIjogImJvb2wiLCAiMTEiOiAicWludDgiLCAiMTIiOiAicXVpbnQ4IiwgIjE1IjogInFpbnQxNiIsICIxNiI6ICJxdWludDE2IiwgIjEzIjogInFpbnQzMiIsICIxNCI6ICJiZmxvYXQxNiIsICIyMCI6ICJyZXNvdXJjZSIsICIyMSI6ICJ2YXJpYW50IiwgIjExOSI6ICJmbG9hdDE2X3JlZiIsICIxMDEiOiAiZmxvYXQzMl9yZWYiLCAiMTAyIjogImZsb2F0NjRfcmVmIiwgIjEwMyI6ICJpbnQzMl9yZWYiLCAiMTIyIjogInVpbnQzMl9yZWYiLCAiMTA0IjogInVpbnQ4X3JlZiIsICIxMTciOiAidWludDE2X3JlZiIsICIxMDUiOiAiaW50MTZfcmVmIiwgIjEwNiI6ICJpbnQ4X3JlZiIsICIxMDciOiAic3RyaW5nX3JlZiIsICIxMDgiOiAiY29tcGxleDY0X3JlZiIsICIxMTgiOiAiY29tcGxleDEyOF9yZWYiLCAiMTA5IjogImludDY0X3JlZiIsICIxMjMiOiAidWludDY0X3JlZiIsICIxMTAiOiAiYm9vbF9yZWYiLCAiMTExIjogInFpbnQ4X3JlZiIsICIxMTIiOiAicXVpbnQ4X3JlZiIsICIxMTUiOiAicWludDE2X3JlZiIsICIxMTYiOiAicXVpbnQxNl9yZWYiLCAiMTEzIjogInFpbnQzMl9yZWYiLCAiMTE0IjogImJmbG9hdDE2X3JlZiIsICIxMjAiOiAicmVzb3VyY2VfcmVmIiwgIjEyMSI6ICJ2YXJpYW50X3JlZiIgfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3N0b3JlL2RlYnVnX3RlbnNvcl92YWx1ZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUGFyc2UgYSBudW1iZXIgYXJyYXkgdGhhdCByZXByZXNlbnRzIGRlYnVnZ2luZyBzdW1tYXJ5IG9mIGFuIGluc3RydW1lbnRlZAogKiB0ZW5zb3IgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gcmF3CiAqIEByZXR1cm4gez99IEEgRGVidWdUZW5zb3JWYWx1ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcwogKiAgIGNhcnJpZWQgYnkgYGFycmF5YCwgYnV0IHJlcHJlc2VudGVkIGluIGEgbW9yZSBleHBsaWNpdCBmYXNoaW9uLgogKiAgIEZvciBudW1iZXJzIHRoYXQgcmVwcmVzZW50IGJyZWFrZG93biBvZiBudW1lcmljIHZhbHVlcyBieSB0eXBlCiAqICAgKGUuZy4sIGNvdW50cyBvZiAtaW5mLCAraW5mIGFuZCBuYW4pLCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMKICogICBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgZGVmaW5lZCBvbmx5IGlmIHRoZSBjb3VudCBpcyBub24temVyby4KICovCmZ1bmN0aW9uIHBhcnNlRGVidWdUZW5zb3JWYWx1ZShyYXcpIHsKICAgIGNvbnN0IHsgdGVuc29yRGVidWdNb2RlLCBhcnJheSB9ID0gcmF3OwogICAgc3dpdGNoICh0ZW5zb3JEZWJ1Z01vZGUpIHsKICAgICAgICBjYXNlIFRlbnNvckRlYnVnTW9kZS5OT19URU5TT1I6IHsKICAgICAgICAgICAgaWYgKGFycmF5ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWRseSByZWNlaXZlZCBub24tbnVsbCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgJyArCiAgICAgICAgICAgICAgICAgICAgJ3VuZGVyIE5PX1RFTlNPUiBtb2RlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KICAgICAgICBjYXNlIFRlbnNvckRlYnVnTW9kZS5DVVJUX0hFQUxUSDogewogICAgICAgICAgICBpZiAoYXJyYXkgPT09IG51bGwgfHwgYXJyYXkubGVuZ3RoICE9PSAyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZGVyIENVUlRfSEVBTFRIIG1vZGUsIGV4cGVjdGVkIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSBgICsKICAgICAgICAgICAgICAgICAgICBgdG8gaGF2ZSBsZW5ndGggMiwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KGFycmF5KX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaGFzSW5mT3JOYU46IEJvb2xlYW4oYXJyYXlbMV0pLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXNlIFRlbnNvckRlYnVnTW9kZS5DT05DSVNFX0hFQUxUSDogewogICAgICAgICAgICBpZiAoYXJyYXkgPT09IG51bGwgfHwgYXJyYXkubGVuZ3RoICE9PSA1KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZGVyIENPTkNJU0VfSEVBTFRIIG1vZGUsIGV4cGVjdGVkIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSBgICsKICAgICAgICAgICAgICAgICAgICBgdG8gaGF2ZSBsZW5ndGggNSwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KGFycmF5KX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gewogICAgICAgICAgICAgICAgc2l6ZTogYXJyYXlbMV0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcnJheVsyXSA+IDApIHsKICAgICAgICAgICAgICAgIHZhbHVlLm51bU5lZ2F0aXZlSW5mcyA9IGFycmF5WzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheVszXSA+IDApIHsKICAgICAgICAgICAgICAgIHZhbHVlLm51bVBvc2l0aXZlSW5mcyA9IGFycmF5WzNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheVs0XSA+IDApIHsKICAgICAgICAgICAgICAgIHZhbHVlLm51bU5hTnMgPSBhcnJheVs0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIGNhc2UgVGVuc29yRGVidWdNb2RlLlNIQVBFOiB7CiAgICAgICAgICAgIGlmIChhcnJheSA9PT0gbnVsbCB8fCBhcnJheS5sZW5ndGggIT09IDEwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZGVyIFNIQVBFIG1vZGUsIGV4cGVjdGVkIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSBgICsKICAgICAgICAgICAgICAgICAgICBgdG8gaGF2ZSBsZW5ndGggMTAsIGJ1dCBnb3QgJHtKU09OLnN0cmluZ2lmeShhcnJheSl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByYW5rID0gYXJyYXlbMl07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNoYXBlID0gYXJyYXkuc2xpY2UoNCwgTWF0aC5taW4oNCArIHJhbmssIGFycmF5Lmxlbmd0aCkpOwogICAgICAgICAgICBpZiAoc2hhcGUubGVuZ3RoIDwgcmFuaykgewogICAgICAgICAgICAgICAgLy8gVGhlIFNIQVBFIG1vZGUgdHJ1bmNhdGVzIHRoZSBzaGFwZSBhdCBoZWFkLgogICAgICAgICAgICAgICAgc2hhcGUgPSBuZXcgQXJyYXkocmFuayAtIHNoYXBlLmxlbmd0aCkuY29uY2F0KHNoYXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZHR5cGU6IERUWVBFX0VOVU1fVE9fTkFNRVthcnJheVsxXV0sCiAgICAgICAgICAgICAgICByYW5rLAogICAgICAgICAgICAgICAgc2l6ZTogYXJyYXlbM10sCiAgICAgICAgICAgICAgICBzaGFwZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2FzZSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEg6IHsKICAgICAgICAgICAgaWYgKGFycmF5ID09PSBudWxsIHx8IGFycmF5Lmxlbmd0aCAhPT0gMTEpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5kZXIgRlVMTF9IRUFMVEggbW9kZSwgZXhwZWN0ZWQgZGVidWctdGVuc29yLXZhbHVlIGFycmF5IGAgKwogICAgICAgICAgICAgICAgICAgIGB0byBoYXZlIGxlbmd0aCAxMSwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KGFycmF5KX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJhbmsgPSBhcnJheVszXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHsKICAgICAgICAgICAgICAgIGR0eXBlOiBEVFlQRV9FTlVNX1RPX05BTUVbYXJyYXlbMl1dLAogICAgICAgICAgICAgICAgcmFuaywKICAgICAgICAgICAgICAgIHNpemU6IGFycmF5WzRdLAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoYXJyYXlbNV0gPiAwKSB7CiAgICAgICAgICAgICAgICB2YWx1ZS5udW1OZWdhdGl2ZUluZnMgPSBhcnJheVs1XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlbNl0gPiAwKSB7CiAgICAgICAgICAgICAgICB2YWx1ZS5udW1Qb3NpdGl2ZUluZnMgPSBhcnJheVs2XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlbN10gPiAwKSB7CiAgICAgICAgICAgICAgICB2YWx1ZS5udW1OYU5zID0gYXJyYXlbN107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5WzhdID4gMCkgewogICAgICAgICAgICAgICAgdmFsdWUubnVtTmVnYXRpdmVGaW5pdGVzID0gYXJyYXlbOF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5WzldID4gMCkgewogICAgICAgICAgICAgICAgdmFsdWUubnVtWmVyb3MgPSBhcnJheVs5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlbMTBdID4gMCkgewogICAgICAgICAgICAgICAgdmFsdWUubnVtUG9zaXRpdmVGaW5pdGVzID0gYXJyYXlbMTBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgY2FzZSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9URU5TT1I6IHsKICAgICAgICAgICAgLy8gVW5kZXIgRlVMTF9URU5TT1IgbW9kZSwgdGhlIGZ1bGwgdGVuc29yIHZhbHVlIGlzIHN1cHBsaWVkIHZpYQogICAgICAgICAgICAvLyBzZXBhcmF0ZSBtZWFucy4gTm8gc3VtbWFyeSB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciB0aGUgdGVuc29yIHZhbHVlLgogICAgICAgICAgICBpZiAoYXJyYXkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZGx5IHJlY2VpdmVkIG5vbi1udWxsIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSAnICsKICAgICAgICAgICAgICAgICAgICAndW5kZXIgRlVMTF9URU5TT1IgbW9kZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCB0ZW5zb3JEZWJ1Z01vZGU6ICR7dGVuc29yRGVidWdNb2RlfWApOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZGVidWdfdGVuc29yX3ZhbHVlL2RlYnVnX3RlbnNvcl92YWx1ZV9jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnQoMCwgImRpdiIsIDQpOwp9IH0KZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgOCk7CiAgICDJtcm1dGV4dCgyLCAiTmFOIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIsIDkpOwogICAgybXJtXRleHQoNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjIgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1YWR2YW5jZSg0KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJcdTAwRDciLCBjdHhfcjIubnVtTmFOcywgIiIpOwp9IH0KZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgOCk7CiAgICDJtcm1dGV4dCgyLCAiLVx1MjIxRSIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMywgInNwYW4iLCA5KTsKICAgIMm1ybV0ZXh0KDQpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IzID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoNCk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiXHUwMEQ3IiwgY3R4X3IzLm51bU5lZ2F0aXZlSW5mcywgIiIpOwp9IH0KZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgOCk7CiAgICDJtcm1dGV4dCgyLCAiK1x1MjIxRSIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMywgInNwYW4iLCA5KTsKICAgIMm1ybV0ZXh0KDQpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoNCk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiXHUwMEQ3IiwgY3R4X3I0Lm51bVBvc2l0aXZlSW5mcywgIiIpOwp9IH0KZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgMTApOwogICAgybXJtXRleHQoMiwgIi0iKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgOSk7CiAgICDJtcm1dGV4dCg0KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yNSA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVhZHZhbmNlKDQpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIlx1MDBENyIsIGN0eF9yNS5udW1OZWdhdGl2ZUZpbml0ZXMsICIiKTsKfSB9CmZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDcpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIsIDEwKTsKICAgIMm1ybV0ZXh0KDIsICIwIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIsIDkpOwogICAgybXJtXRleHQoNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjYgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1YWR2YW5jZSg0KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJcdTAwRDciLCBjdHhfcjYubnVtWmVyb3MsICIiKTsKfSB9CmZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfNl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDcpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIsIDEwKTsKICAgIMm1ybV0ZXh0KDIsICIrIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIsIDkpOwogICAgybXJtXRleHQoNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjcgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1YWR2YW5jZSg0KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJcdTAwRDciLCBjdHhfcjcubnVtUG9zaXRpdmVGaW5pdGVzLCAiIik7Cn0gfQpmdW5jdGlvbiBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA1KTsKICAgIMm1ybV0ZW1wbGF0ZSgxLCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzFfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgIMm1ybV0ZW1wbGF0ZSgyLCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzJfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgIMm1ybV0ZW1wbGF0ZSgzLCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzNfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgIMm1ybV0ZW1wbGF0ZSg0LCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzRfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgIMm1ybV0ZW1wbGF0ZSg1LCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzVfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgIMm1ybV0ZW1wbGF0ZSg2LCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzZfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMS5udW1OYU5zICE9PSB1bmRlZmluZWQgJiYgY3R4X3IxLm51bU5hTnMgPiAwKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bU5lZ2F0aXZlSW5mcyAhPT0gdW5kZWZpbmVkICYmIGN0eF9yMS5udW1OZWdhdGl2ZUluZnMgPiAwKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bVBvc2l0aXZlSW5mcyAhPT0gdW5kZWZpbmVkICYmIGN0eF9yMS5udW1Qb3NpdGl2ZUluZnMgPiAwKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bU5lZ2F0aXZlRmluaXRlcyAhPT0gdW5kZWZpbmVkICYmIGN0eF9yMS5udW1OZWdhdGl2ZUZpbml0ZXMgPiAwKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bVplcm9zICE9PSB1bmRlZmluZWQgJiYgY3R4X3IxLm51bVplcm9zID4gMCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMS5udW1Qb3NpdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCAmJiBjdHhfcjEubnVtUG9zaXRpdmVGaW5pdGVzID4gMCk7Cn0gfQpjb25zdCBfYzAkYyA9IGZ1bmN0aW9uIChhMSkgeyByZXR1cm4gWyJjb250YWluZXIiLCBhMV07IH07CmZ1bmN0aW9uIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfZGVidWdfdGVuc29yX2R0eXBlXzBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudCgwLCAiZGVidWctdGVuc29yLWR0eXBlIiwgNSk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1cHJvcGVydHkoImR0eXBlIiwgY3R4X3IwLmRlYnVnVGVuc29yVmFsdWUuZHR5cGUpOwp9IH0KZnVuY3Rpb24gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9kZWJ1Z190ZW5zb3JfcmFua18xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnQoMCwgImRlYnVnLXRlbnNvci1yYW5rIiwgNik7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1cHJvcGVydHkoInJhbmsiLCBjdHhfcjEuZGVidWdUZW5zb3JWYWx1ZS5yYW5rKTsKfSB9CmZ1bmN0aW9uIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfZGVidWdfdGVuc29yX3NoYXBlXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudCgwLCAiZGVidWctdGVuc29yLXNoYXBlIiwgNyk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1cHJvcGVydHkoInNoYXBlIiwgY3R4X3IyLmRlYnVnVGVuc29yVmFsdWUuc2hhcGUpOwp9IH0KZnVuY3Rpb24gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9kZWJ1Z190ZW5zb3JfaGFzX2luZl9vcl9uYW5fM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50KDAsICJkZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4iLCA4KTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVwcm9wZXJ0eSgiaGFzSW5mT3JOYU4iLCBjdHhfcjMuZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTik7Cn0gfQpmdW5jdGlvbiBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9udW1lcmljX2JyZWFrZG93bl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnQoMCwgImRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biIsIDkpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yNCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoInNpemUiLCBjdHhfcjQuZGVidWdUZW5zb3JWYWx1ZS5zaXplKTsKICAgIMm1ybVwcm9wZXJ0eSgibnVtTmVnYXRpdmVJbmZzIiwgY3R4X3I0LmRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVJbmZzKSgibnVtUG9zaXRpdmVJbmZzIiwgY3R4X3I0LmRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVJbmZzKSgibnVtTmFOcyIsIGN0eF9yNC5kZWJ1Z1RlbnNvclZhbHVlLm51bU5hTnMpKCJudW1OZWdhdGl2ZUZpbml0ZXMiLCBjdHhfcjQuZGVidWdUZW5zb3JWYWx1ZS5udW1OZWdhdGl2ZUZpbml0ZXMpKCJudW1aZXJvcyIsIGN0eF9yNC5kZWJ1Z1RlbnNvclZhbHVlLm51bVplcm9zKSgibnVtUG9zaXRpdmVGaW5pdGVzIiwgY3R4X3I0LmRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVGaW5pdGVzKTsKfSB9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgYmFzaWNEZWJ1Z0luZm9TdHlsZSA9IGAKICA6aG9zdCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIG1hcmdpbjogMCAycHg7CiAgICBwYWRkaW5nOiAxcHggM3B4OwogICAgd2lkdGg6IG1heC1jb250ZW50OwogIH0KYDsKY2xhc3MgRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudCB7Cn0KRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnLXRlbnNvci1kdHlwZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAge3sgZHR5cGUgfX0KICBgLAogICAgICAgICAgICAgICAgc3R5bGVzOiBbYmFzaWNEZWJ1Z0luZm9TdHlsZV0sCiAgICAgICAgICAgIH0sXSB9LApdOwpEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgZHR5cGU6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50KSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnLXRlbnNvci1kdHlwZSJdXSwgaW5wdXRzOiB7IGR0eXBlOiAiZHR5cGUiIH0sIGRlY2xzOiAxLCB2YXJzOiAxLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dGV4dCgwKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4LmR0eXBlLCAiICIpOwogICAgfSB9LCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICB9Il0gfSk7CmNsYXNzIERlYnVnVGVuc29yUmFua0NvbXBvbmVudCB7Cn0KRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZGVidWctdGVuc29yLXJhbmsnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIHt7IHJhbmsgfX1ECiAgYCwKICAgICAgICAgICAgICAgIHN0eWxlczogW2Jhc2ljRGVidWdJbmZvU3R5bGVdLAogICAgICAgICAgICB9LF0gfSwKXTsKRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgcmFuazogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yUmFua0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIERlYnVnVGVuc29yUmFua0NvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z1RlbnNvclJhbmtDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvclJhbmtDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnLXRlbnNvci1yYW5rIl1dLCBpbnB1dHM6IHsgcmFuazogInJhbmsiIH0sIGRlY2xzOiAxLCB2YXJzOiAxLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybV0ZXh0KDApOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHgucmFuaywgIkQgIik7CiAgICB9IH0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgcGFkZGluZzogMXB4IDNweDtcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gIH0iXSB9KTsKY2xhc3MgRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudCB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBzaGFwZVN0cmluZygpIHsKICAgICAgICByZXR1cm4gKCdbJyArCiAgICAgICAgICAgIHRoaXMuc2hhcGUKICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRpbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRpbSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGRpbSA9PT0gdW5kZWZpbmVkID8gJz8nIDogU3RyaW5nKGRpbSk7CiAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAgLmpvaW4oJywnKSArCiAgICAgICAgICAgICddJyk7CiAgICB9Cn0KRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnLXRlbnNvci1zaGFwZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgc2hhcGU6e3sgc2hhcGVTdHJpbmcgfX0KICBgLAogICAgICAgICAgICAgICAgc3R5bGVzOiBbYmFzaWNEZWJ1Z0luZm9TdHlsZV0sCiAgICAgICAgICAgIH0sXSB9LApdOwpEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgc2hhcGU6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50KSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnLXRlbnNvci1zaGFwZSJdXSwgaW5wdXRzOiB7IHNoYXBlOiAic2hhcGUiIH0sIGRlY2xzOiAxLCB2YXJzOiAxLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dGV4dCgwKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgc2hhcGU6IiwgY3R4LnNoYXBlU3RyaW5nLCAiICIpOwogICAgfSB9LCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICB9Il0gfSk7CmNsYXNzIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBicmVha2Rvd25FeGlzdHMoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLm51bU5hTnMgIT09IHVuZGVmaW5lZCB8fAogICAgICAgICAgICB0aGlzLm51bU5lZ2F0aXZlSW5mcyAhPT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgIHRoaXMubnVtUG9zaXRpdmVJbmZzICE9PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgdGhpcy5udW1OZWdhdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCB8fAogICAgICAgICAgICB0aGlzLm51bVplcm9zICE9PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgdGhpcy5udW1Qb3NpdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCk7CiAgICB9Cn0KRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8ZGl2IGNsYXNzPSJzaXplIj4KICAgICAgPHNwYW4+c2l6ZTo8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJzaXplLXZhbHVlIj57eyBzaXplIH19PC9zcGFuPgogICAgPC9kaXY+CiAgICA8ZGl2ICpuZ0lmPSJicmVha2Rvd25FeGlzdHMiIGNsYXNzPSJicmVhayI+PC9kaXY+CiAgICA8ZGl2ICpuZ0lmPSJicmVha2Rvd25FeGlzdHMiIGNsYXNzPSJicmVha2Rvd24iPgogICAgICA8ZGl2ICpuZ0lmPSJudW1OYU5zICE9PSB1bmRlZmluZWQgJiYgbnVtTmFOcyA+IDAiIGNsYXNzPSJjYXRlZ29yeSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBpbmZpbml0ZSI+TmFOPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1OYU5zIH19PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdgogICAgICAgICpuZ0lmPSJudW1OZWdhdGl2ZUluZnMgIT09IHVuZGVmaW5lZCAmJiBudW1OZWdhdGl2ZUluZnMgPiAwIgogICAgICAgIGNsYXNzPSJjYXRlZ29yeSIKICAgICAgPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgaW5maW5pdGUiPi3iiJ48L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bU5lZ2F0aXZlSW5mcyB9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYKICAgICAgICAqbmdJZj0ibnVtUG9zaXRpdmVJbmZzICE9PSB1bmRlZmluZWQgJiYgbnVtUG9zaXRpdmVJbmZzID4gMCIKICAgICAgICBjbGFzcz0iY2F0ZWdvcnkiCiAgICAgID4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGluZmluaXRlIj4r4oiePC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1Qb3NpdGl2ZUluZnMgfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2CiAgICAgICAgKm5nSWY9Im51bU5lZ2F0aXZlRmluaXRlcyAhPT0gdW5kZWZpbmVkICYmIG51bU5lZ2F0aXZlRmluaXRlcyA+IDAiCiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IgogICAgICA+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBmaW5pdGUiPi08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bU5lZ2F0aXZlRmluaXRlcyB9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgKm5nSWY9Im51bVplcm9zICE9PSB1bmRlZmluZWQgJiYgbnVtWmVyb3MgPiAwIiBjbGFzcz0iY2F0ZWdvcnkiPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgZmluaXRlIj4wPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1aZXJvcyB9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYKICAgICAgICAqbmdJZj0ibnVtUG9zaXRpdmVGaW5pdGVzICE9PSB1bmRlZmluZWQgJiYgbnVtUG9zaXRpdmVGaW5pdGVzID4gMCIKICAgICAgICBjbGFzcz0iY2F0ZWdvcnkiCiAgICAgID4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGZpbml0ZSI+Kzwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtUG9zaXRpdmVGaW5pdGVzIH19PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGAsCiAgICAgICAgICAgICAgICBzdHlsZXM6IFsKICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAycHg7CiAgICAgICAgcGFkZGluZzogMXB4OwogICAgICB9CiAgICAgIC5icmVhayB7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsKICAgICAgICB3aWR0aDogMDsKICAgICAgfQogICAgICAuc2l6ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4OwogICAgICAgIG1hcmdpbjogMCAzcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAuYnJlYWtkb3duIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMTFweDsKICAgICAgICBsaW5lLWhlaWdodDogMTFweDsKICAgICAgICBwYWRkaW5nOiAycHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAuY2F0ZWdvcnkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgICAgICBtYXJnaW4tbGVmdDogNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDJweDsKICAgICAgICBoZWlndGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgICB9CiAgICAgIC5jYXRlZ29yeS10YWcgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwYWRkaW5nOiAwIDJweDsKICAgICAgfQogICAgICAuZmluaXRlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhOwogICAgICAgIGNvbG9yOiAjZmVmZWZlOwogICAgICB9CiAgICAgIC5pbmZpbml0ZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1MjU5MjsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sXSB9LApdOwpEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBzaXplOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG51bU5hTnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbnVtTmVnYXRpdmVJbmZzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG51bVBvc2l0aXZlSW5mczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBudW1OZWdhdGl2ZUZpbml0ZXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbnVtWmVyb3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbnVtUG9zaXRpdmVGaW5pdGVzOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCkoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnQsIHNlbGVjdG9yczogW1siZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIl1dLCBpbnB1dHM6IHsgc2l6ZTogInNpemUiLCBudW1OYU5zOiAibnVtTmFOcyIsIG51bU5lZ2F0aXZlSW5mczogIm51bU5lZ2F0aXZlSW5mcyIsIG51bVBvc2l0aXZlSW5mczogIm51bVBvc2l0aXZlSW5mcyIsIG51bU5lZ2F0aXZlRmluaXRlczogIm51bU5lZ2F0aXZlRmluaXRlcyIsIG51bVplcm9zOiAibnVtWmVyb3MiLCBudW1Qb3NpdGl2ZUZpbml0ZXM6ICJudW1Qb3NpdGl2ZUZpbml0ZXMiIH0sIGRlY2xzOiA3LCB2YXJzOiAzLCBjb25zdHM6IFtbMSwgInNpemUiXSwgWzEsICJzaXplLXZhbHVlIl0sIFsiY2xhc3MiLCAiYnJlYWsiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImJyZWFrZG93biIsIDQsICJuZ0lmIl0sIFsxLCAiYnJlYWsiXSwgWzEsICJicmVha2Rvd24iXSwgWyJjbGFzcyIsICJjYXRlZ29yeSIsIDQsICJuZ0lmIl0sIFsxLCAiY2F0ZWdvcnkiXSwgWzEsICJjYXRlZ29yeS10YWciLCAiaW5maW5pdGUiXSwgWzEsICJjYXRlZ29yeS1jb3VudCJdLCBbMSwgImNhdGVnb3J5LXRhZyIsICJmaW5pdGUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIpOwogICAgICAgIMm1ybV0ZXh0KDIsICJzaXplOiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIsIDEpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl81X1RlbXBsYXRlLCAxLCAwLCAiZGl2IiwgMik7CiAgICAgICAgybXJtXRlbXBsYXRlKDYsIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9UZW1wbGF0ZSwgNywgNiwgImRpdiIsIDMpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHguc2l6ZSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmJyZWFrZG93bkV4aXN0cyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmJyZWFrZG93bkV4aXN0cyk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmXSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4O1xuICAgICAgfVxuICAgICAgLmJyZWFrW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGZsZXgtYmFzaXM6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgfVxuICAgICAgLnNpemVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTFweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDExcHg7XG4gICAgICAgIG1hcmdpbjogMCAzcHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICB9XG4gICAgICAuYnJlYWtkb3duW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBoZWlnaHQ6IDExcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICAgICAgICBwYWRkaW5nOiAycHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnlbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICAgICAgICBtYXJnaW4tbGVmdDogNHB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICAgIGhlaWd0aDogMTAwJTtcbiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgICAgfVxuICAgICAgLmNhdGVnb3J5LXRhZ1tfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICAgIHBhZGRpbmc6IDAgMnB4O1xuICAgICAgfVxuICAgICAgLmZpbml0ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhO1xuICAgICAgICBjb2xvcjogI2ZlZmVmZTtcbiAgICAgIH1cbiAgICAgIC5pbmZpbml0ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH0iXSB9KTsKY2xhc3MgRGVidWdUZW5zb3JIYXNJbmZPck5hTkNvbXBvbmVudCB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBpbmZvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc0luZk9yTmFOID8gJ0hhcyDiiJ4vTmFOJyA6ICdObyDiiJ4vTmFOJzsKICAgIH0KfQpEZWJ1Z1RlbnNvckhhc0luZk9yTmFOQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8ZGl2IFtuZ0NsYXNzXT0iWydjb250YWluZXInLCBoYXNJbmZPck5hTiA/ICdoYXMtaW5mLW9yLW5hbicgOiAnJ10iPgogICAgICB7eyBpbmZvU3RyaW5nIH19CiAgICA8L2Rpdj4KICBgLAogICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgYAogICAgICAuY29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAjNjY2NjY2OwogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgICAgIG1hcmdpbjogMCAycHg7CiAgICAgICAgcGFkZGluZzogMXB4IDNweDsKICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgLmhhcy1pbmYtb3ItbmFuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSxdIH0sCl07CkRlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBoYXNJbmZPck5hTjogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBEZWJ1Z1RlbnNvckhhc0luZk9yTmFOQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvckhhc0luZk9yTmFOQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQsIHNlbGVjdG9yczogW1siZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuIl1dLCBpbnB1dHM6IHsgaGFzSW5mT3JOYU46ICJoYXNJbmZPck5hTiIgfSwgZGVjbHM6IDIsIHZhcnM6IDQsIGNvbnN0czogW1szLCAibmdDbGFzcyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24xKDIsIF9jMCRjLCBjdHguaGFzSW5mT3JOYU4gPyAiaGFzLWluZi1vci1uYW4iIDogIiIpKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eC5pbmZvU3RyaW5nLCAiICIpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdDbGFzc10sIHN0eWxlczogWyIuY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY29sb3I6ICM2NjY2NjY7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgICAgIG1hcmdpbjogMCAycHg7XG4gICAgICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgICAgIHdpZHRoOiBtYXgtY29udGVudDtcbiAgICAgIH1cbiAgICAgIC5oYXMtaW5mLW9yLW5hbltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH0iXSB9KTsKY2xhc3MgRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudCB7Cn0KRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnLXRlbnNvci12YWx1ZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGRlYnVnLXRlbnNvci1kdHlwZQogICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSAhPT0gdW5kZWZpbmVkIgogICAgICBbZHR5cGVdPSJkZWJ1Z1RlbnNvclZhbHVlLmR0eXBlIgogICAgPgogICAgPC9kZWJ1Zy10ZW5zb3ItZHR5cGU+CiAgICA8ZGVidWctdGVuc29yLXJhbmsKICAgICAgKm5nSWY9ImRlYnVnVGVuc29yVmFsdWUucmFuayAhPT0gdW5kZWZpbmVkIgogICAgICBbcmFua109ImRlYnVnVGVuc29yVmFsdWUucmFuayIKICAgID4KICAgIDwvZGVidWctdGVuc29yLXJhbms+CiAgICA8ZGVidWctdGVuc29yLXNoYXBlCiAgICAgICpuZ0lmPSJkZWJ1Z1RlbnNvclZhbHVlLnNoYXBlICE9PSB1bmRlZmluZWQiCiAgICAgIFtzaGFwZV09ImRlYnVnVGVuc29yVmFsdWUuc2hhcGUiCiAgICA+CiAgICA8L2RlYnVnLXRlbnNvci1zaGFwZT4KICAgIDxkZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4KICAgICAgKm5nSWY9ImRlYnVnVGVuc29yVmFsdWUuaGFzSW5mT3JOYU4gIT09IHVuZGVmaW5lZCIKICAgICAgW2hhc0luZk9yTmFOXT0iZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTiIKICAgID4KICAgIDwvZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuPgogICAgPGRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93bgogICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5zaXplICE9PSB1bmRlZmluZWQiCiAgICAgIHNpemU9Int7IGRlYnVnVGVuc29yVmFsdWUuc2l6ZSB9fSIKICAgICAgW251bU5lZ2F0aXZlSW5mc109ImRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVJbmZzIgogICAgICBbbnVtUG9zaXRpdmVJbmZzXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1Qb3NpdGl2ZUluZnMiCiAgICAgIFtudW1OYU5zXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1OYU5zIgogICAgICBbbnVtTmVnYXRpdmVGaW5pdGVzXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1OZWdhdGl2ZUZpbml0ZXMiCiAgICAgIFtudW1aZXJvc109ImRlYnVnVGVuc29yVmFsdWUubnVtWmVyb3MiCiAgICAgIFtudW1Qb3NpdGl2ZUZpbml0ZXNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlRmluaXRlcyIKICAgID4KICAgIDwvZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duPgogIGAsCiAgICAgICAgICAgICAgICBzdHlsZXM6IFsKICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQogICAgICBkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sXSB9LApdOwpEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgZGVidWdUZW5zb3JWYWx1ZTogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnVGVuc29yVmFsdWVDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnVGVuc29yVmFsdWVDb21wb25lbnQsIHNlbGVjdG9yczogW1siZGVidWctdGVuc29yLXZhbHVlIl1dLCBpbnB1dHM6IHsgZGVidWdUZW5zb3JWYWx1ZTogImRlYnVnVGVuc29yVmFsdWUiIH0sIGRlY2xzOiA1LCB2YXJzOiA1LCBjb25zdHM6IFtbMywgImR0eXBlIiwgNCwgIm5nSWYiXSwgWzMsICJyYW5rIiwgNCwgIm5nSWYiXSwgWzMsICJzaGFwZSIsIDQsICJuZ0lmIl0sIFszLCAiaGFzSW5mT3JOYU4iLCA0LCAibmdJZiJdLCBbMywgInNpemUiLCAibnVtTmVnYXRpdmVJbmZzIiwgIm51bVBvc2l0aXZlSW5mcyIsICJudW1OYU5zIiwgIm51bU5lZ2F0aXZlRmluaXRlcyIsICJudW1aZXJvcyIsICJudW1Qb3NpdGl2ZUZpbml0ZXMiLCA0LCAibmdJZiJdLCBbMywgImR0eXBlIl0sIFszLCAicmFuayJdLCBbMywgInNoYXBlIl0sIFszLCAiaGFzSW5mT3JOYU4iXSwgWzMsICJzaXplIiwgIm51bU5lZ2F0aXZlSW5mcyIsICJudW1Qb3NpdGl2ZUluZnMiLCAibnVtTmFOcyIsICJudW1OZWdhdGl2ZUZpbml0ZXMiLCAibnVtWmVyb3MiLCAibnVtUG9zaXRpdmVGaW5pdGVzIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dGVtcGxhdGUoMCwgRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9kZWJ1Z190ZW5zb3JfZHR5cGVfMF9UZW1wbGF0ZSwgMSwgMSwgImRlYnVnLXRlbnNvci1kdHlwZSIsIDApOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9yYW5rXzFfVGVtcGxhdGUsIDEsIDEsICJkZWJ1Zy10ZW5zb3ItcmFuayIsIDEpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9zaGFwZV8yX1RlbXBsYXRlLCAxLCAxLCAiZGVidWctdGVuc29yLXNoYXBlIiwgMik7CiAgICAgICAgybXJtXRlbXBsYXRlKDMsIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfZGVidWdfdGVuc29yX2hhc19pbmZfb3JfbmFuXzNfVGVtcGxhdGUsIDEsIDEsICJkZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4iLCAzKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNCwgRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9kZWJ1Z190ZW5zb3JfbnVtZXJpY19icmVha2Rvd25fNF9UZW1wbGF0ZSwgMSwgNywgImRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biIsIDQpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmRlYnVnVGVuc29yVmFsdWUuZHR5cGUgIT09IHVuZGVmaW5lZCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmRlYnVnVGVuc29yVmFsdWUucmFuayAhPT0gdW5kZWZpbmVkKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSAhPT0gdW5kZWZpbmVkKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTiAhPT0gdW5kZWZpbmVkKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZGVidWdUZW5zb3JWYWx1ZS5zaXplICE9PSB1bmRlZmluZWQpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudCwKICAgICAgICBEZWJ1Z1RlbnNvclJhbmtDb21wb25lbnQsCiAgICAgICAgRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudCwKICAgICAgICBEZWJ1Z1RlbnNvckhhc0luZk9yTmFOQ29tcG9uZW50LAogICAgICAgIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgICAgfVxuICAgICAgZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH0iXSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2V4ZWN1dGlvbl9kYXRhL2V4ZWN1dGlvbl9kYXRhX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCBfYzAkZCA9IGZ1bmN0aW9uIChhMCwgYTEpIHsgcmV0dXJuIHsgdGVuc29yRGVidWdNb2RlOiBhMCwgYXJyYXk6IGExIH07IH07CmZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb21wb25lbnRfZGl2XzRfZGl2XzE5X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTIpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTMpOwogICAgybXJtXRleHQoMik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMTQpOwogICAgybXJtWVsZW1lbnQoNCwgImRlYnVnLXRlbnNvci12YWx1ZSIsIDE1KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHNpbmdsZURlYnVnVGVuc29yVmFsdWVzX3I1ID0gY3R4LiRpbXBsaWNpdDsKICAgIGNvbnN0IGlfcjYgPSBjdHguaW5kZXg7CiAgICBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoMyk7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgT3V0cHV0IHNsb3QgIiwgaV9yNiwgIjogIik7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybVwcm9wZXJ0eSgiZGVidWdUZW5zb3JWYWx1ZSIsIGN0eF9yNC5wYXJzZURlYnVnVGVuc29yVmFsdWUoybXJtXB1cmVGdW5jdGlvbjIoMiwgX2MwJGQsIGN0eF9yNC50ZW5zb3JEZWJ1Z01vZGUsIHNpbmdsZURlYnVnVGVuc29yVmFsdWVzX3I1KSkpOwp9IH0KZnVuY3Rpb24gRXhlY3V0aW9uRGF0YUNvbXBvbmVudF9kaXZfNF9kaXZfMTlfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMCk7CiAgICDJtcm1dGVtcGxhdGUoMSwgRXhlY3V0aW9uRGF0YUNvbXBvbmVudF9kaXZfNF9kaXZfMTlfZGl2XzFfVGVtcGxhdGUsIDUsIDUsICJkaXYiLCAxMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4X3IzLmRlYnVnVGVuc29yVmFsdWVzKTsKfSB9CmZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb21wb25lbnRfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIpOwogICAgybXJtWVsZW1lbnRTdGFydCgyLCAiZGl2IiwgMyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgNCk7CiAgICDJtcm1dGV4dCg0LCAiIE9wOiAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJzcGFuIiwgNSk7CiAgICDJtcm1dGV4dCg2KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCg3LCAiZGl2IiwgMyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDgsICJzcGFuIiwgNCk7CiAgICDJtcm1dGV4dCg5LCAiICMgb2YgaW5wdXQgdGVuc29yczogIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgxMCwgInNwYW4iLCA2KTsKICAgIMm1ybV0ZXh0KDExKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgxMiwgImRpdiIsIDMpOwogICAgybXJtWVsZW1lbnRTdGFydCgxMywgInNwYW4iLCA0KTsKICAgIMm1ybV0ZXh0KDE0LCAiICMgb2Ygb3V0cHV0IHRlbnNvcnM6ICIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMTUsICJzcGFuIiwgNyk7CiAgICDJtcm1dGV4dCgxNik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgxNywgInNwYW4iLCA4KTsKICAgIMm1ybV0ZXh0KDE4KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtXRlbXBsYXRlKDE5LCBFeGVjdXRpb25EYXRhQ29tcG9uZW50X2Rpdl80X2Rpdl8xOV9UZW1wbGF0ZSwgMiwgMSwgImRpdiIsIDkpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSg2KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLmZvY3VzZWRFeGVjdXRpb25EYXRhLm9wX3R5cGUsICIgIik7CiAgICDJtcm1YWR2YW5jZSg1KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLmZvY3VzZWRFeGVjdXRpb25EYXRhLmlucHV0X3RlbnNvcl9pZHMgPT0gbnVsbCA/IDAgOiBjdHhfcjAuZm9jdXNlZEV4ZWN1dGlvbkRhdGEuaW5wdXRfdGVuc29yX2lkcy5sZW5ndGgsICIgIik7CiAgICDJtcm1YWR2YW5jZSg1KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLmZvY3VzZWRFeGVjdXRpb25EYXRhLm91dHB1dF90ZW5zb3JfaWRzID09IG51bGwgPyAwIDogY3R4X3IwLmZvY3VzZWRFeGVjdXRpb25EYXRhLm91dHB1dF90ZW5zb3JfaWRzLmxlbmd0aCwgIiAiKTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAoZGVidWcgbW9kZTogIiwgY3R4X3IwLlRlbnNvckRlYnVnTW9kZVtjdHhfcjAudGVuc29yRGVidWdNb2RlXSwgIikgIik7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMC5oYXNEZWJ1Z1RlbnNvclZhbHVlcyk7Cn0gfQpmdW5jdGlvbiBFeGVjdXRpb25EYXRhQ29tcG9uZW50X25nX3RlbXBsYXRlXzVfVGVtcGxhdGUocmYsIGN0eCkgeyB9CmNsYXNzIEV4ZWN1dGlvbkRhdGFDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZW5zb3JEZWJ1Z01vZGUgPSBUZW5zb3JEZWJ1Z01vZGUuVU5TUEVDSUZJRUQ7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBhbnkgZGVidWcgdGVuc29yIHZhbHVlcyBleGlzdCwgdW5kZXIgbm9uLUZVTExfVEVOU09SIGRlYnVnCiAgICAgICAgICogbW9kZXMuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5oYXNEZWJ1Z1RlbnNvclZhbHVlcyA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIERlYnVnIHRlbnNvciB2YWx1ZXMgdW5kZXIgbm9uLUZVTExfVEVOU09SIGRlYnVnIG1vZGVzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuZGVidWdUZW5zb3JWYWx1ZXMgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIER0eXBlcyBvZiB0aGUgdGVuc29ycy4KICAgICAgICAgKiBEdHlwZXMgYXJlIGF2YWlsYWJsZSB1bmRlciB0ZW5zb3IgZGVidWcgbW9kZXMgc3VjaCBhcyBGVUxMX0hFQUxUSC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmRlYnVnVGVuc29yRHR5cGVzID0gbnVsbDsKICAgICAgICAvLyBTbyB0aGF0IHRoZSBlbnVtIGNhbiBiZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBodG1sLgogICAgICAgIHRoaXMuVGVuc29yRGVidWdNb2RlID0gVGVuc29yRGVidWdNb2RlOwogICAgICAgIHRoaXMucGFyc2VEZWJ1Z1RlbnNvclZhbHVlID0gcGFyc2VEZWJ1Z1RlbnNvclZhbHVlOwogICAgfQp9CkV4ZWN1dGlvbkRhdGFDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdleGVjdXRpb24tZGF0YS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2V4ZWN1dGlvbl9kYXRhX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2V4ZWN1dGlvbl9kYXRhX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgfSxdIH0sCl07CkV4ZWN1dGlvbkRhdGFDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZm9jdXNlZEV4ZWN1dGlvbkRhdGE6IFt7IHR5cGU6IElucHV0IH1dLAogICAgdGVuc29yRGVidWdNb2RlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGhhc0RlYnVnVGVuc29yVmFsdWVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRlYnVnVGVuc29yVmFsdWVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRlYnVnVGVuc29yRHR5cGVzOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKiogQG5vY29sbGFwc2UgKi8gRXhlY3V0aW9uRGF0YUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRXhlY3V0aW9uRGF0YUNvbXBvbmVudCkoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIEV4ZWN1dGlvbkRhdGFDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogRXhlY3V0aW9uRGF0YUNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJleGVjdXRpb24tZGF0YS1jb21wb25lbnQiXV0sIGlucHV0czogeyBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6ICJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCBmb2N1c2VkRXhlY3V0aW9uRGF0YTogImZvY3VzZWRFeGVjdXRpb25EYXRhIiwgdGVuc29yRGVidWdNb2RlOiAidGVuc29yRGVidWdNb2RlIiwgaGFzRGVidWdUZW5zb3JWYWx1ZXM6ICJoYXNEZWJ1Z1RlbnNvclZhbHVlcyIsIGRlYnVnVGVuc29yVmFsdWVzOiAiZGVidWdUZW5zb3JWYWx1ZXMiLCBkZWJ1Z1RlbnNvckR0eXBlczogImRlYnVnVGVuc29yRHR5cGVzIiB9LCBkZWNsczogNywgdmFyczogMywgY29uc3RzOiBbWzEsICJmb2N1cy1leGVjdXRpb24tY29udGFpbmVyIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImxvYWRpbmdfc2VjdGlvbiIsICIiXSwgWzEsICJleGVjdXRpb24tZGF0YS1maWVsZCJdLCBbMSwgImV4ZWN1dGlvbi1kYXRhLWtleSJdLCBbMSwgImV4ZWN1dGlvbi1kYXRhLXZhbHVlIiwgIm9wLXR5cGUiXSwgWzEsICJleGVjdXRpb24tZGF0YS12YWx1ZSIsICJpbnB1dC10ZW5zb3JzIl0sIFsxLCAiZXhlY3V0aW9uLWRhdGEtdmFsdWUiLCAib3V0cHV0LXRlbnNvcnMiXSwgWzEsICJleGVjdXRpb24tZGF0YS12YWx1ZSJdLCBbImNsYXNzIiwgIm91dHB1dC1zbG90cyIsIDQsICJuZ0lmIl0sIFsxLCAib3V0cHV0LXNsb3RzIl0sIFsiY2xhc3MiLCAib3V0cHV0LXNsb3QtY29udGFpbmVyIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJvdXRwdXQtc2xvdC1jb250YWluZXIiXSwgWzEsICJvdXRwdXQtc2xvdC1udW1iZXIiXSwgWzEsICJvdXRwdXQtc2xvdC1kZWJ1Zy10ZW5zb3ItdmFsdWUiXSwgWzMsICJkZWJ1Z1RlbnNvclZhbHVlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRXhlY3V0aW9uRGF0YUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBFeGVjdXRpb25EYXRhQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCAyMCwgNSwgImRpdiIsIDEpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBFeGVjdXRpb25EYXRhQ29tcG9uZW50X25nX3RlbXBsYXRlXzVfVGVtcGxhdGUsIDAsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDIsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IF9yMSA9IMm1ybVyZWZlcmVuY2UoNik7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiBQeXRob24gRXhlY3V0aW9uICMiLCBjdHguZm9jdXNlZEV4ZWN1dGlvbkluZGV4LCAiICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5mb2N1c2VkRXhlY3V0aW9uRGF0YSAhPT0gbnVsbCkoIm5nSWZFbHNlIiwgX3IxKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIE5nRm9yT2YsIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdLCBzdHlsZXM6IFsiLmRlYnVnLXRlbnNvci12YWx1ZXMtdGFibGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5kZWJ1Zy10ZW5zb3ItdmFsdWVzLXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMDAwO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uZGVidWctdGVuc29yLXZhbHVlcy10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV0ge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uZXhlY3V0aW9uLWRhdGEtZmllbGRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmV4ZWN1dGlvbi1kYXRhLWtleVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMTIwcHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB3aWR0aDogMTIwcHg7XG59XG5cbi5leGVjdXRpb24tZGF0YS12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uZm9jdXMtZXhlY3V0aW9uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZkNGIzO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgaGVpZ2h0OiAxMjBweDtcbiAgcGFkZGluZzogNXB4O1xuICB3aWR0aDogMzYwcHg7XG59XG5cbi5vdXRwdXQtc2xvdHNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiA2MHB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4ub3V0cHV0LXNsb3QtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIHBhZGRpbmc6IDJweCAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuXG4ub3V0cHV0LXNsb3QtbnVtYmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xufVxuXG4ub3V0cHV0LXNsb3QtZGVidWctdGVuc29yLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDNweCAwIDNweCAzMHB4O1xufVxuXG4ub3V0cHV0LXRlbnNvcnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufSJdIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZXhlY3V0aW9uX2RhdGEvZXhlY3V0aW9uX2RhdGFfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgVU5LTk9XTl9EVFlQRV9OQU1FID0gJ1Vua25vd24gZHR5cGUnOwpjbGFzcyBFeGVjdXRpb25EYXRhQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25EYXRhJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0Rm9jdXNlZEV4ZWN1dGlvbkRhdGEpKTsKICAgICAgICB0aGlzLnRlbnNvckRlYnVnTW9kZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldEZvY3VzZWRFeGVjdXRpb25EYXRhLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBleGVjdXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChleGVjdXRpb24pID0+IHsKICAgICAgICAgICAgaWYgKGV4ZWN1dGlvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFRlbnNvckRlYnVnTW9kZS5VTlNQRUNJRklFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb24udGVuc29yX2RlYnVnX21vZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9KSkpKTsKICAgICAgICB0aGlzLmhhc0RlYnVnVGVuc29yVmFsdWVzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Rm9jdXNlZEV4ZWN1dGlvbkRhdGEsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV4ZWN1dGlvbikgPT4gewogICAgICAgICAgICBpZiAoZXhlY3V0aW9uID09PSBudWxsIHx8IGV4ZWN1dGlvbi5kZWJ1Z190ZW5zb3JfdmFsdWVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNpbmdsZURlYnVnVGVuc29yVmFsdWVzIG9mIGV4ZWN1dGlvbi5kZWJ1Z190ZW5zb3JfdmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmdsZURlYnVnVGVuc29yVmFsdWVzICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZURlYnVnVGVuc29yVmFsdWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5kZWJ1Z1RlbnNvclZhbHVlcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldEZvY3VzZWRFeGVjdXRpb25EYXRhLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBleGVjdXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChleGVjdXRpb24pID0+IHsKICAgICAgICAgICAgaWYgKGV4ZWN1dGlvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uLmRlYnVnX3RlbnNvcl92YWx1ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9KSkpKTsKICAgICAgICB0aGlzLmRlYnVnVGVuc29yRHR5cGVzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Rm9jdXNlZEV4ZWN1dGlvbkRhdGEsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV4ZWN1dGlvbikgPT4gewogICAgICAgICAgICBpZiAoZXhlY3V0aW9uID09PSBudWxsIHx8IGV4ZWN1dGlvbi5kZWJ1Z190ZW5zb3JfdmFsdWVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXhlY3V0aW9uLnRlbnNvcl9kZWJ1Z19tb2RlICE9PSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEggJiYKICAgICAgICAgICAgICAgIGV4ZWN1dGlvbi50ZW5zb3JfZGVidWdfbW9kZSAhPT0gVGVuc29yRGVidWdNb2RlLlNIQVBFKSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9naWMgZm9yIG90aGVyIFRlbnNvckRlYnVnTW9kZXMgd2l0aCBkdHlwZSBpbmZvLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkdHlwZXMgPSBbXTsKICAgICAgICAgICAgZm9yIChjb25zdCB0ZW5zb3JWYWx1ZSBvZiBleGVjdXRpb24uZGVidWdfdGVuc29yX3ZhbHVlcykgewogICAgICAgICAgICAgICAgaWYgKHRlbnNvclZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZHR5cGVzLnB1c2goVU5LTk9XTl9EVFlQRV9OQU1FKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkdHlwZUVudW0gPSBTdHJpbmcoZXhlY3V0aW9uLnRlbnNvcl9kZWJ1Z19tb2RlID09PSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEgKICAgICAgICAgICAgICAgICAgICAgICAgPyB0ZW5zb3JWYWx1ZVsyXSAvLyB0ZW5zb3JfZGVidWdfbW9kZTogRlVMTF9IRUFMVEgKICAgICAgICAgICAgICAgICAgICAgICAgOiB0ZW5zb3JWYWx1ZVsxXSAvLyB0ZW5zb3JfZGVidWdfbW9kZTogU0hBUEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGR0eXBlcy5wdXNoKERUWVBFX0VOVU1fVE9fTkFNRVtkdHlwZUVudW1dIHx8IFVOS05PV05fRFRZUEVfTkFNRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGR0eXBlczsKICAgICAgICB9KSkpKTsKICAgIH0KfQpFeGVjdXRpb25EYXRhQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGYtZGVidWdnZXItdjItZXhlY3V0aW9uLWRhdGEnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxleGVjdXRpb24tZGF0YS1jb21wb25lbnQKICAgICAgW2ZvY3VzZWRFeGVjdXRpb25JbmRleF09ImZvY3VzZWRFeGVjdXRpb25JbmRleCIKICAgICAgW2ZvY3VzZWRFeGVjdXRpb25EYXRhXT0iZm9jdXNlZEV4ZWN1dGlvbkRhdGEkIHwgYXN5bmMiCiAgICAgIFt0ZW5zb3JEZWJ1Z01vZGVdPSJ0ZW5zb3JEZWJ1Z01vZGUkIHwgYXN5bmMiCiAgICAgIFtoYXNEZWJ1Z1RlbnNvclZhbHVlc109Imhhc0RlYnVnVGVuc29yVmFsdWVzJCB8IGFzeW5jIgogICAgICBbZGVidWdUZW5zb3JWYWx1ZXNdPSJkZWJ1Z1RlbnNvclZhbHVlcyQgfCBhc3luYyIKICAgICAgW2RlYnVnVGVuc29yRHR5cGVzXT0iZGVidWdUZW5zb3JEdHlwZXMkIHwgYXN5bmMiCiAgICA+PC9leGVjdXRpb24tZGF0YS1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpFeGVjdXRpb25EYXRhQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07CkV4ZWN1dGlvbkRhdGFDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKiBAbm9jb2xsYXBzZSAqLyBFeGVjdXRpb25EYXRhQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFeGVjdXRpb25EYXRhQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBFeGVjdXRpb25EYXRhQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEV4ZWN1dGlvbkRhdGFDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjItZXhlY3V0aW9uLWRhdGEiXV0sIGlucHV0czogeyBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6ICJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiIH0sIGRlY2xzOiA2LCB2YXJzOiAxNiwgY29uc3RzOiBbWzMsICJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCAiZm9jdXNlZEV4ZWN1dGlvbkRhdGEiLCAidGVuc29yRGVidWdNb2RlIiwgImhhc0RlYnVnVGVuc29yVmFsdWVzIiwgImRlYnVnVGVuc29yVmFsdWVzIiwgImRlYnVnVGVuc29yRHR5cGVzIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiZXhlY3V0aW9uLWRhdGEtY29tcG9uZW50IiwgMCk7CiAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoNSwgImFzeW5jIik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1cHJvcGVydHkoImZvY3VzZWRFeGVjdXRpb25JbmRleCIsIGN0eC5mb2N1c2VkRXhlY3V0aW9uSW5kZXgpKCJmb2N1c2VkRXhlY3V0aW9uRGF0YSIsIMm1ybVwaXBlQmluZDEoMSwgNiwgY3R4LmZvY3VzZWRFeGVjdXRpb25EYXRhJCkpKCJ0ZW5zb3JEZWJ1Z01vZGUiLCDJtcm1cGlwZUJpbmQxKDIsIDgsIGN0eC50ZW5zb3JEZWJ1Z01vZGUkKSkoImhhc0RlYnVnVGVuc29yVmFsdWVzIiwgybXJtXBpcGVCaW5kMSgzLCAxMCwgY3R4Lmhhc0RlYnVnVGVuc29yVmFsdWVzJCkpKCJkZWJ1Z1RlbnNvclZhbHVlcyIsIMm1ybVwaXBlQmluZDEoNCwgMTIsIGN0eC5kZWJ1Z1RlbnNvclZhbHVlcyQpKSgiZGVidWdUZW5zb3JEdHlwZXMiLCDJtcm1cGlwZUJpbmQxKDUsIDE0LCBjdHguZGVidWdUZW5zb3JEdHlwZXMkKSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtFeGVjdXRpb25EYXRhQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvdGltZWxpbmUvdGltZWxpbmVfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmZ1bmN0aW9uIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl82X21hdF9zbGlkZXJfN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yNSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXNsaWRlciIsIDExKTsKICAgIMm1ybVsaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiBUaW1lbGluZUNvbXBvbmVudF9kaXZfNl9tYXRfc2xpZGVyXzdfVGVtcGxhdGVfbWF0X3NsaWRlcl9pbnB1dF8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I1KTsgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3I0Lm9uU2xpZGVyQ2hhbmdlLmVtaXQoJGV2ZW50LnZhbHVlKTsgfSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVwcm9wZXJ0eSgibWluIiwgMCkoIm1heCIsIGN0eF9yMy5zY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdCkoInZhbHVlIiwgY3R4X3IzLnNjcm9sbEJlZ2luSW5kZXgpOwp9IH0KZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICBjb25zdCBfcjcgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDYpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAiYnV0dG9uIiwgNyk7CiAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzZfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzFfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjcpOyBjb25zdCBjdHhfcjYgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNi5vbk5hdmlnYXRlTGVmdC5lbWl0KCk7IH0pOwogICAgybXJtXRleHQoMiwgIiA8ICIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDgpOwogICAgybXJtXRleHQoNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCg1LCAiYnV0dG9uIiwgOSk7CiAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzZfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzVfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjcpOyBjb25zdCBjdHhfcjggPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yOC5vbk5hdmlnYXRlUmlnaHQuZW1pdCgpOyB9KTsKICAgIMm1ybV0ZXh0KDYsICIgPiAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGVtcGxhdGUoNywgVGltZWxpbmVDb21wb25lbnRfZGl2XzZfbWF0X3NsaWRlcl83X1RlbXBsYXRlLCAxLCAzLCAibWF0LXNsaWRlciIsIDEwKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSg0KTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUzKCIgIiwgY3R4X3IwLnNjcm9sbEJlZ2luSW5kZXgsICIgfiAiLCBjdHhfcjAuc2Nyb2xsQmVnaW5JbmRleCArIGN0eF9yMC5kaXNwbGF5Q291bnQgLSAxLCAiIG9mICIsIGN0eF9yMC5udW1FeGVjdXRpb25zLCAiICIpOwogICAgybXJtWFkdmFuY2UoMyk7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjAuc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQgPiAwKTsKfSB9CmNvbnN0IF9jMCRlID0gZnVuY3Rpb24gKGEwLCBhMSwgYTIpIHsgcmV0dXJuIFthMCwgYTEsIGEyXTsgfTsKZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzdfZGl2XzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICBjb25zdCBfcjEzID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxNCk7CiAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzdfZGl2XzFfVGVtcGxhdGVfZGl2X2NsaWNrXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjEzKTsgY29uc3QgaV9yMTEgPSBjdHguaW5kZXg7IGNvbnN0IGN0eF9yMTIgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjEyLm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZC5lbWl0KGlfcjExKTsgfSk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxNSk7CiAgICDJtcm1dGV4dCgyKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGRpc3BsYXlEaWdlc3RfcjEwID0gY3R4LiRpbXBsaWNpdDsKICAgIGNvbnN0IGlfcjExID0gY3R4LmluZGV4OwogICAgY29uc3QgY3R4X3I5ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZSgidGl0bGUiLCBkaXNwbGF5RGlnZXN0X3IxMC5vcF90eXBlKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24zKDMsIF9jMCRlLCBkaXNwbGF5RGlnZXN0X3IxMC5pc19ncmFwaCA/ICJmdW5jLWdyYXBoLWV4ZWN1dGlvbiIgOiAiIiwgaV9yMTEgPT09IGN0eF9yOS5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4ID8gImZvY3VzZWQiIDogIiIsIGN0eF9yOS5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXNbaV9yMTFdIHx8ICIiKSk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgZGlzcGxheURpZ2VzdF9yMTAuc2hvcnRfb3BfdHlwZSwgIiAiKTsKfSB9CmZ1bmN0aW9uIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTIpOwogICAgybXJtXRlbXBsYXRlKDEsIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl83X2Rpdl8xX1RlbXBsYXRlLCAzLCA3LCAiZGl2IiwgMTMpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4X3IxLmRpc3BsYXlFeGVjdXRpb25EaWdlc3RzKTsKfSB9CmZ1bmN0aW9uIFRpbWVsaW5lQ29tcG9uZW50X25nX2NvbnRhaW5lcl84X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgwKTsKICAgIMm1ybVlbGVtZW50KDEsICJ0Zi1kZWJ1Z2dlci12Mi1leGVjdXRpb24tZGF0YSIsIDE2KTsKICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IiwgY3R4X3IyLmZvY3VzZWRFeGVjdXRpb25JbmRleCk7Cn0gfQpjbGFzcyBUaW1lbGluZUNvbXBvbmVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmFjdGl2ZVJ1bklkID0gbnVsbDsKICAgICAgICB0aGlzLmxvYWRpbmdOdW1FeGVjdXRpb25zID0gZmFsc2U7CiAgICAgICAgdGhpcy5udW1FeGVjdXRpb25zID0gMDsKICAgICAgICB0aGlzLnNjcm9sbEJlZ2luSW5kZXggPSAwOwogICAgICAgIHRoaXMuc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQgPSAwOwogICAgICAgIHRoaXMucGFnZVNpemUgPSAwOwogICAgICAgIHRoaXMuZGlzcGxheUNvdW50ID0gMDsKICAgICAgICB0aGlzLmRpc3BsYXlFeGVjdXRpb25EaWdlc3RzID0gW107CiAgICAgICAgdGhpcy5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMgPSBbXTsKICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25JbmRleCA9IG51bGw7CiAgICAgICAgdGhpcy5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4ID0gbnVsbDsKICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25EYXRhID0gbnVsbDsKICAgICAgICB0aGlzLm9uTmF2aWdhdGVMZWZ0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25OYXZpZ2F0ZVJpZ2h0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25FeGVjdXRpb25EaWdlc3RDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25TbGlkZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICB9Cn0KVGltZWxpbmVDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0aW1lbGluZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3RpbWVsaW5lX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3RpbWVsaW5lX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICB9LF0gfSwKXTsKVGltZWxpbmVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBhY3RpdmVSdW5JZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBsb2FkaW5nTnVtRXhlY3V0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBudW1FeGVjdXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIHNjcm9sbEJlZ2luSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgcGFnZVNpemU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZGlzcGxheUNvdW50OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBmb2N1c2VkRXhlY3V0aW9uRGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBvbk5hdmlnYXRlTGVmdDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgb25OYXZpZ2F0ZVJpZ2h0OiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICBvbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIG9uU2xpZGVyQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFRpbWVsaW5lQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGltZWxpbmVDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBUaW1lbGluZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBUaW1lbGluZUNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0aW1lbGluZS1jb21wb25lbnQiXV0sIGlucHV0czogeyBhY3RpdmVSdW5JZDogImFjdGl2ZVJ1bklkIiwgbG9hZGluZ051bUV4ZWN1dGlvbnM6ICJsb2FkaW5nTnVtRXhlY3V0aW9ucyIsIG51bUV4ZWN1dGlvbnM6ICJudW1FeGVjdXRpb25zIiwgc2Nyb2xsQmVnaW5JbmRleDogInNjcm9sbEJlZ2luSW5kZXgiLCBzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdDogInNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0IiwgcGFnZVNpemU6ICJwYWdlU2l6ZSIsIGRpc3BsYXlDb3VudDogImRpc3BsYXlDb3VudCIsIGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOiAiZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMiLCBkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXM6ICJkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMiLCBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6ICJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCBmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4OiAiZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCIsIGZvY3VzZWRFeGVjdXRpb25EYXRhOiAiZm9jdXNlZEV4ZWN1dGlvbkRhdGEiIH0sIG91dHB1dHM6IHsgb25OYXZpZ2F0ZUxlZnQ6ICJvbk5hdmlnYXRlTGVmdCIsIG9uTmF2aWdhdGVSaWdodDogIm9uTmF2aWdhdGVSaWdodCIsIG9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZDogIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsIG9uU2xpZGVyQ2hhbmdlOiAib25TbGlkZXJDaGFuZ2UiIH0sIGRlY2xzOiA5LCB2YXJzOiA0LCBjb25zdHM6IFtbMSwgInRpbWVsaW5lLXRpdGxlIl0sIFsxLCAiZXhlY3V0aW9uLWNvdW50Il0sIFsxLCAidG9wLWxldmVsLWV4ZWN1dGlvbnMiXSwgWyJjbGFzcyIsICJuYXZpZ2F0aW9uLXNlY3Rpb24iLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImV4ZWN1dGlvbi10aW1lbGluZSIsIDQsICJuZ0lmIl0sIFs0LCAibmdJZiJdLCBbMSwgIm5hdmlnYXRpb24tc2VjdGlvbiJdLCBbIm1hdC1idXR0b24iLCAiIiwgMSwgIm5hdmlnYXRpb24tYnV0dG9uLWxlZnQiLCAzLCAiY2xpY2siXSwgWzEsICJuYXZpZ2F0aW9uLXBvc2l0aW9uLWluZm8iXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDEsICJuYXZpZ2F0aW9uLWJ1dHRvbi1yaWdodCIsIDMsICJjbGljayJdLCBbImNsYXNzIiwgInRpbWVsaW5lLXNsaWRlciIsICJzdGVwIiwgIjEiLCAzLCAibWluIiwgIm1heCIsICJ2YWx1ZSIsICJpbnB1dCIsIDQsICJuZ0lmIl0sIFsic3RlcCIsICIxIiwgMSwgInRpbWVsaW5lLXNsaWRlciIsIDMsICJtaW4iLCAibWF4IiwgInZhbHVlIiwgImlucHV0Il0sIFsxLCAiZXhlY3V0aW9uLXRpbWVsaW5lIl0sIFszLCAiY2xpY2siLCA0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMywgImNsaWNrIl0sIFsxLCAiZXhlY3V0aW9uLWRpZ2VzdCIsIDMsICJuZ0NsYXNzIiwgInRpdGxlIl0sIFszLCAiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMCk7CiAgICAgICAgybXJtXRleHQoMiwgIiBQeXRob24gRXhlY3V0aW9uIFRpbWVsaW5lICIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgInNwYW4iLCAxKTsKICAgICAgICDJtcm1dGV4dCg0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgMik7CiAgICAgICAgybXJtXRlbXBsYXRlKDYsIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl82X1RlbXBsYXRlLCA4LCA0LCAiZGl2IiwgMyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDcsIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl83X1RlbXBsYXRlLCAyLCAxLCAiZGl2IiwgNCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDgsIFRpbWVsaW5lQ29tcG9uZW50X25nX2NvbnRhaW5lcl84X1RlbXBsYXRlLCAyLCAxLCAibmctY29udGFpbmVyIiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAoIiwgY3R4Lm51bUV4ZWN1dGlvbnMsICIpICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5udW1FeGVjdXRpb25zKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgubnVtRXhlY3V0aW9ucyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmFjdGl2ZVJ1bklkICE9PSBudWxsICYmIGN0eC5mb2N1c2VkRXhlY3V0aW9uSW5kZXggIT09IG51bGwpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgTWF0QnV0dG9uLCBNYXRTbGlkZXIsIE5nRm9yT2YsIE5nQ2xhc3MsIEV4ZWN1dGlvbkRhdGFDb250YWluZXJdLCBzdHlsZXM6IFsiLmV4ZWN1dGlvbi1kaWdlc3RbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgY29sb3I6ICM0MjUwNjY7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxMHB4O1xuICBoZWlnaHQ6IDE1cHg7XG4gIHBhZGRpbmc6IDFweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMTJweDtcbn1cblxuLmV4ZWN1dGlvbi1kaWdlc3QuZnVuYy1ncmFwaC1leGVjdXRpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M3ZGJmNTtcbiAgY29sb3I6ICM0ZTU2NjQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmQ0YjM7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5JbmZOYW5BbGVydFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuXG4uZXhlY3V0aW9uLWRpZ2VzdFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmV4ZWN1dGlvbi10aW1lbGluZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLnRpbWVsaW5lLXNsaWRlcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogNDhweDtcbiAgbGVmdDogMzQwcHg7IFxuICBwYWRkaW5nOiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiA0MHB4O1xufVxuXG4gIC50aW1lbGluZS1zbGlkZXIgLm1hdC1zbGlkZXItdGh1bWIge1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIHJpZ2h0OiAtNDBweDtcbiAgd2lkdGg6IDgwcHg7XG59XG5cblxuLm5hdmlnYXRpb24tcG9zaXRpb24taW5mb1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICBtYXgtd2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm5hdmlnYXRpb24tc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDQ4cHg7XG4gIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxMDAlO1xufSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy90aW1lbGluZS90aW1lbGluZV9jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBGVU5DVElPTl9PUF9UWVBFX1BSRUZJWEVTID0gWwogICAgJ19fZm9yd2FyZF8nLAogICAgJ19fYmFja3dhcmRfJywKICAgICdfX2luZmVyZW5jZV8nLApdOwovKioKICogR2V0IGEgZGlzcGxheSB2ZXJzaW9uIG9mIHRoZSBleGVjdXRpb24gZGlnZXN0LgogKiBAcGFyYW0gez99IGV4ZWN1dGlvbkRpZ2VzdAogKiBAcGFyYW0gez89fSBzdHJMZW4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEV4ZWN1dGlvbkRpZ2VzdEZvckRpc3BsYXkoZXhlY3V0aW9uRGlnZXN0LCBzdHJMZW4gPSAxKSB7CiAgICBpZiAoIWV4ZWN1dGlvbkRpZ2VzdCkgewogICAgICAgIC8vIFRoZSBleGVjdXRpb24gZGlnZXN0IGF0IHRoaXMgaW5kZXggaGFzbid0IGJlZW4gbG9hZGVkIGZyb20gdGhlIGRhdGEgc291cmNlLgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG9wX3R5cGU6ICcoTi9BKScsCiAgICAgICAgICAgIHNob3J0X29wX3R5cGU6ICcuLicsCiAgICAgICAgICAgIGlzX2dyYXBoOiBmYWxzZSwKICAgICAgICB9OwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZnVuY3Rpb25QcmVmaXhlcyA9IEZVTkNUSU9OX09QX1RZUEVfUFJFRklYRVMuZmlsdGVyKCgvKioKICAgICAqIEBwYXJhbSB7P30gcHJlZml4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAocHJlZml4KSA9PiBleGVjdXRpb25EaWdlc3Qub3BfdHlwZS5zdGFydHNXaXRoKHByZWZpeCkpKTsKICAgIGlmIChmdW5jdGlvblByZWZpeGVzLmxlbmd0aCkgewogICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4ZWN1dGlvbiBvZiBhIHRmLmZ1bmN0aW9uIChGdW5jR3JhcGgpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVXaXRoU3VmZml4ID0gZXhlY3V0aW9uRGlnZXN0Lm9wX3R5cGUuc2xpY2UoZnVuY3Rpb25QcmVmaXhlc1swXS5sZW5ndGgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG9wX3R5cGU6IGV4ZWN1dGlvbkRpZ2VzdC5vcF90eXBlLAogICAgICAgICAgICBzaG9ydF9vcF90eXBlOiBmdW5jdGlvbk5hbWVXaXRoU3VmZml4LnNsaWNlKDAsIHN0ckxlbiksCiAgICAgICAgICAgIGlzX2dyYXBoOiB0cnVlLAogICAgICAgIH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvcF90eXBlOiBleGVjdXRpb25EaWdlc3Qub3BfdHlwZSwKICAgICAgICAgICAgc2hvcnRfb3BfdHlwZTogZXhlY3V0aW9uRGlnZXN0Lm9wX3R5cGUuc2xpY2UoMCwgc3RyTGVuKSwKICAgICAgICAgICAgaXNfZ3JhcGg6IGZhbHNlLAogICAgICAgIH07CiAgICB9Cn0KY2xhc3MgVGltZWxpbmVDb250YWluZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgIHRoaXMuYWN0aXZlUnVuSWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRBY3RpdmVSdW5JZCkpOwogICAgICAgIHRoaXMubG9hZGluZ051bUV4ZWN1dGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXROdW1FeGVjdXRpb25zTG9hZGVkLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2FkZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChsb2FkZWQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGxvYWRlZC5zdGF0ZSA9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkc7CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5zY3JvbGxCZWdpbkluZGV4JCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0RXhlY3V0aW9uU2Nyb2xsQmVnaW5JbmRleCkpOwogICAgICAgIHRoaXMuc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXROdW1FeGVjdXRpb25zLCBnZXREaXNwbGF5Q291bnQsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG51bUV4ZWN1dGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IGRpc3BsYXlDb3VudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG51bUV4ZWN1dGlvbnMsIGRpc3BsYXlDb3VudCkgPT4gewogICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgbnVtRXhlY3V0aW9ucyAtIGRpc3BsYXlDb3VudCk7CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5wYWdlU2l6ZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEV4ZWN1dGlvblBhZ2VTaXplKSk7CiAgICAgICAgdGhpcy5kaXNwbGF5Q291bnQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXREaXNwbGF5Q291bnQpKTsKICAgICAgICB0aGlzLmRpc3BsYXlFeGVjdXRpb25EaWdlc3RzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0VmlzaWJsZUV4ZWN1dGlvbkRpZ2VzdHMsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZpc2libGVEaWdlc3RzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmlzaWJsZURpZ2VzdHMpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHZpc2libGVEaWdlc3RzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlnZXN0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGlnZXN0KSA9PiBnZXRFeGVjdXRpb25EaWdlc3RGb3JEaXNwbGF5KGRpZ2VzdCkpKTsKICAgICAgICB9KSkpKTsKICAgICAgICB0aGlzLmRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzQWxlcnRUeXBlc09mVmlzaWJsZUV4ZWN1dGlvbkRpZ2VzdHMpKTsKICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25JbmRleCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRFeGVjdXRpb25JbmRleCkpOwogICAgICAgIHRoaXMuZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgpKTsKICAgICAgICB0aGlzLm51bUV4ZWN1dGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXROdW1FeGVjdXRpb25zKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uTmF2aWdhdGVMZWZ0KCkgewogICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZXhlY3V0aW9uU2Nyb2xsTGVmdCgpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25OYXZpZ2F0ZVJpZ2h0KCkgewogICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZXhlY3V0aW9uU2Nyb2xsUmlnaHQoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZChpbmRleCkgewogICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZXhlY3V0aW9uRGlnZXN0Rm9jdXNlZCh7IGRpc3BsYXlJbmRleDogaW5kZXggfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblNsaWRlckNoYW5nZSh2YWx1ZSkgewogICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZXhlY3V0aW9uU2Nyb2xsVG9JbmRleCh7IGluZGV4OiB2YWx1ZSB9KSk7CiAgICB9Cn0KVGltZWxpbmVDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi10aW1lbGluZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHRpbWVsaW5lLWNvbXBvbmVudAogICAgICBbYWN0aXZlUnVuSWRdPSJhY3RpdmVSdW5JZCQgfCBhc3luYyIKICAgICAgW2xvYWRpbmdOdW1FeGVjdXRpb25zXT0ibG9hZGluZ051bUV4ZWN1dGlvbnMkIHwgYXN5bmMiCiAgICAgIFtudW1FeGVjdXRpb25zXT0ibnVtRXhlY3V0aW9ucyQgfCBhc3luYyIKICAgICAgW3Njcm9sbEJlZ2luSW5kZXhdPSJzY3JvbGxCZWdpbkluZGV4JCB8IGFzeW5jIgogICAgICBbc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXRdPSJzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdCQgfCBhc3luYyIKICAgICAgW3BhZ2VTaXplXT0icGFnZVNpemUkIHwgYXN5bmMiCiAgICAgIFtkaXNwbGF5Q291bnRdPSJkaXNwbGF5Q291bnQkIHwgYXN5bmMiCiAgICAgIFtkaXNwbGF5RXhlY3V0aW9uRGlnZXN0c109ImRpc3BsYXlFeGVjdXRpb25EaWdlc3RzJCB8IGFzeW5jIgogICAgICBbZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzXT0iZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzJCB8IGFzeW5jIgogICAgICBbZm9jdXNlZEV4ZWN1dGlvbkluZGV4XT0iZm9jdXNlZEV4ZWN1dGlvbkluZGV4JCB8IGFzeW5jIgogICAgICBbZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleF09ImZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgkIHwgYXN5bmMiCiAgICAgIChvbk5hdmlnYXRlTGVmdCk9Im9uTmF2aWdhdGVMZWZ0KCkiCiAgICAgIChvbk5hdmlnYXRlUmlnaHQpPSJvbk5hdmlnYXRlUmlnaHQoKSIKICAgICAgKG9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCk9Im9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCgkZXZlbnQpIgogICAgICAob25TbGlkZXJDaGFuZ2UpPSJvblNsaWRlckNoYW5nZSgkZXZlbnQpIgogICAgPjwvdGltZWxpbmUtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpUaW1lbGluZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gVGltZWxpbmVDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUaW1lbGluZUNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gVGltZWxpbmVDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogVGltZWxpbmVDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjItdGltZWxpbmUiXV0sIGRlY2xzOiAxMiwgdmFyczogMzMsIGNvbnN0czogW1szLCAiYWN0aXZlUnVuSWQiLCAibG9hZGluZ051bUV4ZWN1dGlvbnMiLCAibnVtRXhlY3V0aW9ucyIsICJzY3JvbGxCZWdpbkluZGV4IiwgInNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0IiwgInBhZ2VTaXplIiwgImRpc3BsYXlDb3VudCIsICJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyIsICJkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMiLCAiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IiwgImZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgiLCAib25OYXZpZ2F0ZUxlZnQiLCAib25OYXZpZ2F0ZVJpZ2h0IiwgIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsICJvblNsaWRlckNoYW5nZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFRpbWVsaW5lQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRpbWVsaW5lLWNvbXBvbmVudCIsIDApOwogICAgICAgIMm1ybVsaXN0ZW5lcigib25OYXZpZ2F0ZUxlZnQiLCBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9UZW1wbGF0ZV90aW1lbGluZV9jb21wb25lbnRfb25OYXZpZ2F0ZUxlZnRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbk5hdmlnYXRlTGVmdCgpOyB9KSgib25OYXZpZ2F0ZVJpZ2h0IiwgZnVuY3Rpb24gVGltZWxpbmVDb250YWluZXJfVGVtcGxhdGVfdGltZWxpbmVfY29tcG9uZW50X29uTmF2aWdhdGVSaWdodF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uTmF2aWdhdGVSaWdodCgpOyB9KSgib25FeGVjdXRpb25EaWdlc3RDbGlja2VkIiwgZnVuY3Rpb24gVGltZWxpbmVDb250YWluZXJfVGVtcGxhdGVfdGltZWxpbmVfY29tcG9uZW50X29uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCgkZXZlbnQpOyB9KSgib25TbGlkZXJDaGFuZ2UiLCBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9UZW1wbGF0ZV90aW1lbGluZV9jb21wb25lbnRfb25TbGlkZXJDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblNsaWRlckNoYW5nZSgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg2LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg3LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg4LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg5LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgxMCwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMTEsICJhc3luYyIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1cHJvcGVydHkoImFjdGl2ZVJ1bklkIiwgybXJtXBpcGVCaW5kMSgxLCAxMSwgY3R4LmFjdGl2ZVJ1bklkJCkpKCJsb2FkaW5nTnVtRXhlY3V0aW9ucyIsIMm1ybVwaXBlQmluZDEoMiwgMTMsIGN0eC5sb2FkaW5nTnVtRXhlY3V0aW9ucyQpKSgibnVtRXhlY3V0aW9ucyIsIMm1ybVwaXBlQmluZDEoMywgMTUsIGN0eC5udW1FeGVjdXRpb25zJCkpKCJzY3JvbGxCZWdpbkluZGV4IiwgybXJtXBpcGVCaW5kMSg0LCAxNywgY3R4LnNjcm9sbEJlZ2luSW5kZXgkKSkoInNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0IiwgybXJtXBpcGVCaW5kMSg1LCAxOSwgY3R4LnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0JCkpKCJwYWdlU2l6ZSIsIMm1ybVwaXBlQmluZDEoNiwgMjEsIGN0eC5wYWdlU2l6ZSQpKSgiZGlzcGxheUNvdW50IiwgybXJtXBpcGVCaW5kMSg3LCAyMywgY3R4LmRpc3BsYXlDb3VudCQpKSgiZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMiLCDJtcm1cGlwZUJpbmQxKDgsIDI1LCBjdHguZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkKSkoImRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyIsIMm1ybVwaXBlQmluZDEoOSwgMjcsIGN0eC5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMkKSkoImZvY3VzZWRFeGVjdXRpb25JbmRleCIsIMm1ybVwaXBlQmluZDEoMTAsIDI5LCBjdHguZm9jdXNlZEV4ZWN1dGlvbkluZGV4JCkpKCJmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4IiwgybXJtXBpcGVCaW5kMSgxMSwgMzEsIGN0eC5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4JCkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbVGltZWxpbmVDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2dyYXBoL2dyYXBoX29wX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpmdW5jdGlvbiBHcmFwaE9wQ29tcG9uZW50X2Rpdl81X3NwYW5fMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iKTsKICAgIMm1ybV0ZXh0KDEsICIgT3V0cHV0ICIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSB9CmZ1bmN0aW9uIEdyYXBoT3BDb21wb25lbnRfZGl2XzVfc3Bhbl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIpOwogICAgybXJtXRleHQoMSwgIiBJbnB1dCAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpmdW5jdGlvbiBHcmFwaE9wQ29tcG9uZW50X2Rpdl81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNik7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgNyk7CiAgICDJtcm1dGVtcGxhdGUoMiwgR3JhcGhPcENvbXBvbmVudF9kaXZfNV9zcGFuXzJfVGVtcGxhdGUsIDIsIDAsICJzcGFuIiwgOCk7CiAgICDJtcm1dGVtcGxhdGUoMywgR3JhcGhPcENvbXBvbmVudF9kaXZfNV9zcGFuXzNfVGVtcGxhdGUsIDIsIDAsICJzcGFuIiwgOCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtXRleHQoNCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoIiwgY3R4X3IwLmtpbmQpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsICJpbnB1dCIpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsICJjb25zdW1lciIpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIHNsb3Q6ICIsIGN0eF9yMC5zbG90LCAiICIpOwp9IH0KZnVuY3Rpb24gR3JhcGhPcENvbXBvbmVudF9kaXZfNl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDkpOwogICAgybXJtXRleHQoMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yMS5vcERhdGEub3BfdHlwZSwgIiAiKTsKfSB9CmZ1bmN0aW9uIEdyYXBoT3BDb21wb25lbnRfbmdfdGVtcGxhdGVfN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxMCk7CiAgICDJtcm1dGV4dCgxLCAiIChPcCBpbmZvIHVuYXZhaWxhYmxlLikgIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IH0KY29uc3QgX2MwJGYgPSBmdW5jdGlvbiAoYTApIHsgcmV0dXJuIFthMF07IH07Ci8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIEdyYXBoT3BDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5vbk9wTmFtZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgfQp9CkdyYXBoT3BDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdncmFwaC1vcCcsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2dyYXBoX29wX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2dyYXBoX29wX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgfSxdIH0sCl07CkdyYXBoT3BDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBraW5kOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG9wTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBzbG90OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG9wRGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBvbk9wTmFtZUNsaWNrOiBbeyB0eXBlOiBPdXRwdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIEdyYXBoT3BDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBHcmFwaE9wQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEdyYXBoT3BDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaE9wQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEdyYXBoT3BDb21wb25lbnQsIHNlbGVjdG9yczogW1siZ3JhcGgtb3AiXV0sIGlucHV0czogeyBraW5kOiAia2luZCIsIG9wTmFtZTogIm9wTmFtZSIsIHNsb3Q6ICJzbG90Iiwgb3BEYXRhOiAib3BEYXRhIiB9LCBvdXRwdXRzOiB7IG9uT3BOYW1lQ2xpY2s6ICJvbk9wTmFtZUNsaWNrIiB9LCBkZWNsczogOSwgdmFyczogNywgY29uc3RzOiBbWzEsICJvcC1jb250YWluZXIiXSwgWzEsICJpbnB1dC10ZW5zb3ItbmFtZSJdLCBbMSwgIm9wLW5hbWUiLCAzLCAibmdDbGFzcyIsICJjbGljayJdLCBbImNsYXNzIiwgInNsb3QiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgIm9wLXR5cGUiLCA0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbIm9wSW5mb01pc3NpbmciLCAiIl0sIFsxLCAic2xvdCJdLCBbMywgIm5nU3dpdGNoIl0sIFs0LCAibmdTd2l0Y2hDYXNlIl0sIFsxLCAib3AtdHlwZSJdLCBbMSwgIm9wLWluZm8tbWlzc2luZyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEdyYXBoT3BDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYnV0dG9uIiwgMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiYnV0dG9uIiwgMik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEdyYXBoT3BDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzJfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25PcE5hbWVDbGljay5lbWl0KHsgb3BfbmFtZTogY3R4Lm9wTmFtZSB9KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgR3JhcGhPcENvbXBvbmVudF9kaXZfNV9UZW1wbGF0ZSwgNSwgNCwgImRpdiIsIDMpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDYsIEdyYXBoT3BDb21wb25lbnRfZGl2XzZfVGVtcGxhdGUsIDIsIDEsICJkaXYiLCA0KTsKICAgICAgICDJtcm1dGVtcGxhdGUoNywgR3JhcGhPcENvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCA1LCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBfcjIgPSDJtcm1cmVmZXJlbmNlKDgpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24xKDUsIF9jMCRmLCBjdHgua2luZCA9PT0gInNlbGYiID8gInNlbGYtb3AtbmFtZSIgOiAiIikpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4Lm9wTmFtZSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmtpbmQgIT09ICJzZWxmIik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Lm9wRGF0YSAhPT0gdW5kZWZpbmVkKSgibmdJZkVsc2UiLCBfcjIpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdDbGFzcywgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZV0sIHN0eWxlczogWyIub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDJweCBzb2xpZCAjYzZjYWQxO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJveC1zaGFkb3c6IDFweCAzcHggI2VlZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBtYXJnaW46IDAgNXB4IDAgMDtcbiAgcGFkZGluZzogMnB4IDZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHdpZHRoOiAyMDBweDtcbn1cblxuLm9wLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4ub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmQzYjI7XG59XG5cbi5vcC1pbmZvLW1pc3NpbmdbX25nY29udGVudC0lQ09NUCVdIHtcbiAgY29sb3I6ICM4MDgwODA7XG59XG5cbi5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbiAgcGFkZGluZzogMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGhlaWdodDogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIG1hcmdpbi10b3A6IDNweDtcbiAgcGFkZGluZzogMXB4IDNweDtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xufVxuXG4uc2VsZi1vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5zbG90W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGNvbG9yOiAjNzA3MDcwO1xufSJdIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGgvZ3JhcGhfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmZ1bmN0aW9uIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl8xX2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgY29uc3QgX3IxNSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTMpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTQpOwogICAgybXJtXRleHQoMik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZ3JhcGgtb3AiLCAxNSk7CiAgICDJtcm1bGlzdGVuZXIoIm9uT3BOYW1lQ2xpY2siLCBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9kaXZfMV9kaXZfMl9UZW1wbGF0ZV9ncmFwaF9vcF9vbk9wTmFtZUNsaWNrXzNfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjE1KTsgY29uc3QgY3R4X3IxNCA9IMm1ybVuZXh0Q29udGV4dCgzKTsgcmV0dXJuIGN0eF9yMTQub25HcmFwaE9wTmF2aWdhdGUuZW1pdCh7IG9wX25hbWU6ICRldmVudC5vcF9uYW1lLCBncmFwaF9pZDogY3R4X3IxNC5ncmFwaElkIH0pOyB9KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGlucHV0T3BJbmZvX3IxMiA9IGN0eC4kaW1wbGljaXQ7CiAgICBjb25zdCBzbG90X3IxMyA9IGN0eC5pbmRleDsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiBJbnB1dCBzbG90ICIsIHNsb3RfcjEzLCAiOiAiKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJraW5kIiwgImlucHV0IikoIm9wTmFtZSIsIGlucHV0T3BJbmZvX3IxMi5vcF9uYW1lKSgic2xvdCIsIGlucHV0T3BJbmZvX3IxMi5vdXRwdXRfc2xvdCkoIm9wRGF0YSIsIGlucHV0T3BJbmZvX3IxMi5kYXRhKTsKfSB9CmZ1bmN0aW9uIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTEpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2Iik7CiAgICDJtcm1dGVtcGxhdGUoMiwgR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzFfZGl2XzJfVGVtcGxhdGUsIDQsIDUsICJkaXYiLCAxMik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjUgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eF9yNS5pbnB1dE9wcyk7Cn0gfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTYpOwogICAgybXJtXRleHQoMSwgIiAoVGhpcyBvcCBoYXMgbm8gaW5wdXQgdGVuc29yLikgIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IH0KdmFyIEkxOE5fMTsKaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgIGNvbnN0IE1TR19FWFRFUk5BTF80OTU1MTMzNzQwODQxMjk5ODUxJCRURU5TT1JCT0FSRF9QTFVHSU5TX0RFQlVHR0VSX1YyX1RGX0RFQlVHR0VSX1YyX1BMVUdJTl9WSUVXU19HUkFQSF9HUkFQSF9DT01QT05FTlRfVFNfX19fMiA9IGdvb2cuZ2V0TXNnKCJ7VkFSX1BMVVJBTCwgcGx1cmFsLCA9MCB7Y29uc3VtZXJ9ID0xIHtjb25zdW1lcn0gb3RoZXIge2NvbnN1bWVyc319Iik7CiAgICBJMThOXzEgPSBNU0dfRVhURVJOQUxfNDk1NTEzMzc0MDg0MTI5OTg1MSQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fXzI7Cn0KZWxzZSB7CiAgICBJMThOXzEgPSAkbG9jYWxpemUgYDrikJ9mZTU1ZjliMTkzZWEyMGFhZTViNTYzNWU2OGQ5Mzg2NTAzODQ3NzQ24pCfNDk1NTEzMzc0MDg0MTI5OTg1MTp7VkFSX1BMVVJBTCwgcGx1cmFsLCA9MCB7Y29uc3VtZXJ9ID0xIHtjb25zdW1lcn0gb3RoZXIge2NvbnN1bWVyc319YDsKfQpJMThOXzEgPSDJtcm1aTE4blBvc3Rwcm9jZXNzKEkxOE5fMSwgeyAiVkFSX1BMVVJBTCI6ICJcdUZGRkQwXHVGRkZEIiB9KTsKdmFyIEkxOE5fMDsKaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgIGNvbnN0IE1TR19FWFRFUk5BTF81NTU2MzQwMzQzODUwMTY1NTE2JCRURU5TT1JCT0FSRF9QTFVHSU5TX0RFQlVHR0VSX1YyX1RGX0RFQlVHR0VSX1YyX1BMVUdJTl9WSUVXU19HUkFQSF9HUkFQSF9DT01QT05FTlRfVFNfX19fMyA9IGdvb2cuZ2V0TXNnKCIgeyRpY3V9IiwgeyAiaWN1IjogSTE4Tl8xIH0pOwogICAgSTE4Tl8wID0gTVNHX0VYVEVSTkFMXzU1NTYzNDAzNDM4NTAxNjU1MTYkJFRFTlNPUkJPQVJEX1BMVUdJTlNfREVCVUdHRVJfVjJfVEZfREVCVUdHRVJfVjJfUExVR0lOX1ZJRVdTX0dSQVBIX0dSQVBIX0NPTVBPTkVOVF9UU19fX18zOwp9CmVsc2UgewogICAgSTE4Tl8wID0gJGxvY2FsaXplIGA64pCfYmFhNDYwZTJmMmI4NTdlMjYyOTJiMjQ2ZmMxOGFlMGVhOWI1ZTUzN+KQnzU1NTYzNDAzNDM4NTAxNjU1MTY6ICR7STE4Tl8xfTpJQ1U6YDsKfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9kaXZfOF9kaXZfMl9kaXZfNl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMjIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDIyKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImdyYXBoLW9wIiwgMTUpOwogICAgybXJtWxpc3RlbmVyKCJvbk9wTmFtZUNsaWNrIiwgZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfZGl2XzJfZGl2XzZfVGVtcGxhdGVfZ3JhcGhfb3Bfb25PcE5hbWVDbGlja18xX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyMik7IGNvbnN0IGN0eF9yMjEgPSDJtcm1bmV4dENvbnRleHQoNCk7IHJldHVybiBjdHhfcjIxLm9uR3JhcGhPcE5hdmlnYXRlLmVtaXQoeyBvcF9uYW1lOiAkZXZlbnQub3BfbmFtZSwgZ3JhcGhfaWQ6IGN0eF9yMjEuZ3JhcGhJZCB9KTsgfSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjb25zdW1lck9wSW5mb19yMjAgPSBjdHguJGltcGxpY2l0OwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoImtpbmQiLCAiY29uc3VtZXIiKSgib3BOYW1lIiwgY29uc3VtZXJPcEluZm9fcjIwLm9wX25hbWUpKCJzbG90IiwgY29uc3VtZXJPcEluZm9fcjIwLmlucHV0X3Nsb3QpKCJvcERhdGEiLCBjb25zdW1lck9wSW5mb19yMjAuZGF0YSk7Cn0gfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9kaXZfOF9kaXZfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE5KTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDIwKTsKICAgIMm1ybV0ZXh0KDIpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIpOwogICAgybXJtWkxOG4oNCwgSTE4Tl8wKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGV4dCg1LCAiKSAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGVtcGxhdGUoNiwgR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfZGl2XzJfZGl2XzZfVGVtcGxhdGUsIDIsIDQsICJkaXYiLCAyMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IHNsb3RDb25zdW1lcnNfcjE3ID0gY3R4LiRpbXBsaWNpdDsKICAgIGNvbnN0IHNsb3RfcjE4ID0gY3R4LmluZGV4OwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMigiIE91dHB1dCBzbG90ICIsIHNsb3RfcjE4LCAiOiAoIiwgc2xvdENvbnN1bWVyc19yMTcubGVuZ3RoLCAiICIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1aTE4bkV4cChzbG90Q29uc3VtZXJzX3IxNy5sZW5ndGgpOwogICAgybXJtWkxOG5BcHBseSg0KTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgc2xvdENvbnN1bWVyc19yMTcpOwp9IH0KZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxNyk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiKTsKICAgIMm1ybV0ZW1wbGF0ZSgyLCBHcmFwaENvbXBvbmVudF9kaXZfNF9kaXZfOF9kaXZfMl9UZW1wbGF0ZSwgNywgNCwgImRpdiIsIDE4KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yOCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4X3I4LmNvbnN1bWVyT3BzKTsKfSB9CnZhciBJMThOXzU7CmlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICBjb25zdCBNU0dfRVhURVJOQUxfNTE1NjcxMjkzNTE1MDU4Njg3OCQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fNiA9IGdvb2cuZ2V0TXNnKCJ7VkFSX1BMVVJBTCwgcGx1cmFsLCA9MCB7dGVuc29yfSA9MSB7dGVuc29yfSBvdGhlciB7dGVuc29yc319Iik7CiAgICBJMThOXzUgPSBNU0dfRVhURVJOQUxfNTE1NjcxMjkzNTE1MDU4Njg3OCQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fNjsKfQplbHNlIHsKICAgIEkxOE5fNSA9ICRsb2NhbGl6ZSBgOuKQnzZhYTc1ZjYyN2UwZGMxNjE1MGVmNDQ4NDY0ZTBjODU3YWFhMGRjMTjikJ81MTU2NzEyOTM1MTUwNTg2ODc4OntWQVJfUExVUkFMLCBwbHVyYWwsID0wIHt0ZW5zb3J9ID0xIHt0ZW5zb3J9IG90aGVyIHt0ZW5zb3JzfX1gOwp9CkkxOE5fNSA9IMm1ybVpMThuUG9zdHByb2Nlc3MoSTE4Tl81LCB7ICJWQVJfUExVUkFMIjogIlx1RkZGRDBcdUZGRkQiIH0pOwp2YXIgSTE4Tl80OwppZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgY29uc3QgTVNHX0VYVEVSTkFMXzI0NjA2NzA1MzczNTE2MjYzNCQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fNyA9IGdvb2cuZ2V0TXNnKCIgeyRpY3V9IiwgeyAiaWN1IjogSTE4Tl81IH0pOwogICAgSTE4Tl80ID0gTVNHX0VYVEVSTkFMXzI0NjA2NzA1MzczNTE2MjYzNCQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fNzsKfQplbHNlIHsKICAgIEkxOE5fNCA9ICRsb2NhbGl6ZSBgOuKQnzg5MzQ3NmMyYzQyMWNlZTQ3NjYzYzk3MzJmYTQxYTc1MGQzYTczZGbikJ8yNDYwNjcwNTM3MzUxNjI2MzQ6ICR7STE4Tl81fTpJQ1U6YDsKfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9uZ190ZW1wbGF0ZV85X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjMpOwogICAgybXJtXRleHQoMSk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJzcGFuIik7CiAgICDJtcm1aTE4bigzLCBJMThOXzQpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybV0ZXh0KDQsICIgYW5kIG5vIGNvbnN1bWVyLikgIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yMTAgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgKFRoaXMgb3AgaGFzICIsIGN0eF9yMTAub3BJbmZvLmNvbnN1bWVycy5sZW5ndGgsICIgb3V0cHV0ICIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1aTE4bkV4cChjdHhfcjEwLm9wSW5mby5jb25zdW1lcnMubGVuZ3RoKTsKICAgIMm1ybVpMThuQXBwbHkoMyk7Cn0gfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMjQgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgybXJtXRlbXBsYXRlKDEsIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl8xX1RlbXBsYXRlLCAzLCAxLCAiZGl2IiwgNCk7CiAgICDJtcm1dGVtcGxhdGUoMiwgR3JhcGhDb21wb25lbnRfZGl2XzRfbmdfdGVtcGxhdGVfMl9UZW1wbGF0ZSwgMiwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNSwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImRpdiIsIDYpOwogICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgNyk7CiAgICDJtcm1dGV4dCg2LCAiIE9wOiAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJncmFwaC1vcCIsIDgpOwogICAgybXJtWxpc3RlbmVyKCJvbk9wTmFtZUNsaWNrIiwgZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfZGl2XzRfVGVtcGxhdGVfZ3JhcGhfb3Bfb25PcE5hbWVDbGlja183X2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyNCk7IGNvbnN0IGN0eF9yMjMgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMjMub25HcmFwaE9wTmF2aWdhdGUuZW1pdCh7IG9wX25hbWU6ICRldmVudC5vcF9uYW1lLCBncmFwaF9pZDogY3R4X3IyMy5ncmFwaElkIH0pOyB9KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtXRlbXBsYXRlKDgsIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl84X1RlbXBsYXRlLCAzLCAxLCAiZGl2IiwgOSk7CiAgICDJtcm1dGVtcGxhdGUoOSwgR3JhcGhDb21wb25lbnRfZGl2XzRfbmdfdGVtcGxhdGVfOV9UZW1wbGF0ZSwgNSwgMiwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgMTAsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IF9yNiA9IMm1ybVyZWZlcmVuY2UoMyk7CiAgICBjb25zdCBfcjkgPSDJtcm1cmVmZXJlbmNlKDEwKTsKICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjAuaW5wdXRPcHMubGVuZ3RoID4gMCkoIm5nSWZFbHNlIiwgX3I2KTsKICAgIMm1ybVhZHZhbmNlKDYpOwogICAgybXJtXByb3BlcnR5KCJraW5kIiwgInNlbGYiKSgib3BOYW1lIiwgY3R4X3IwLm9wSW5mby5vcF9uYW1lKSgib3BEYXRhIiwgY3R4X3IwLm9wSW5mbyk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMC50b3RhbE51bUNvbnN1bWVycyA+IDApKCJuZ0lmRWxzZSIsIF9yOSk7Cn0gfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDI0KTsKICAgIMm1ybV0ZXh0KDEsICIgKE9wIGluZm8gdW5hdmFpbGFibGUuKSAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjUpOwogICAgybXJtXRleHQoMSwgIiBObyBncmFwaCBvcCBzZWxlY3RlZC4gQ2xpY2sgYSB0ZW5zb3IgbmFtZSBpbiB0aGUgR3JhcGggRXhlY3V0aW9ucyB0YWJsZSB0byB2aWV3IHRoZSBuZWlnaGJvcmhvb2Qgb2YgdGhlIHRlbnNvcidzIG9wIGluIGl0cyBncmFwaC4gIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IH0KLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KY2xhc3MgR3JhcGhDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5vbkdyYXBoT3BOYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBJRCBvZiB0aGUgaW1tZWRpYXRlbHktZW5jbG9zaW5nIGdyYXBoIG9mIHRoZSBvcC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBncmFwaElkKCkgewogICAgICAgIHJldHVybiB0aGlzLm9wSW5mby5ncmFwaF9pZHNbdGhpcy5vcEluZm8uZ3JhcGhfaWRzLmxlbmd0aCAtIDFdOwogICAgfQogICAgLyoqCiAgICAgKiBUb3RhbCBudW1iZXIgb2YgY29uc3VtZXJzIG9mIGFsbCBvdXRwdXQgdGVuc29ycyBvZiB0aGUgb3AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdG90YWxOdW1Db25zdW1lcnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3VtZXJPcHMucmVkdWNlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvdW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzbG90Q29uc3VtZXJzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY291bnQsIHNsb3RDb25zdW1lcnMpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGNvdW50ICsgc2xvdENvbnN1bWVycy5sZW5ndGg7CiAgICAgICAgfSksIDApOwogICAgfQp9CkdyYXBoQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZ3JhcGgtY29tcG9uZW50JywKICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9ncmFwaF9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9ncmFwaF9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgfSxdIH0sCl07CkdyYXBoQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgb3BJbmZvOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGlucHV0T3BzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGNvbnN1bWVyT3BzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG9uR3JhcGhPcE5hdmlnYXRlOiBbeyB0eXBlOiBPdXRwdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIEdyYXBoQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR3JhcGhDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBHcmFwaENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJncmFwaC1jb21wb25lbnQiXV0sIGlucHV0czogeyBvcEluZm86ICJvcEluZm8iLCBpbnB1dE9wczogImlucHV0T3BzIiwgY29uc3VtZXJPcHM6ICJjb25zdW1lck9wcyIgfSwgb3V0cHV0czogeyBvbkdyYXBoT3BOYXZpZ2F0ZTogIm9uR3JhcGhPcE5hdmlnYXRlIiB9LCBkZWNsczogOSwgdmFyczogMiwgY29uc3RzOiBbWzEsICJncmFwaC1zdHJ1Y3R1cmUtY29udGFpbmVyIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbIm9wSW5mb01pc3NpbmciLCAiIl0sIFsibm9PcEZvY3VzZWQiLCAiIl0sIFsiY2xhc3MiLCAiaW5wdXRzLWNvbnRhaW5lciIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibm9JbnB1dHMiLCAiIl0sIFsxLCAic2VsZi1vcC1jb250YWluZXIiXSwgWzEsICJzZWxmLW9wLWhlYWRlciJdLCBbMywgImtpbmQiLCAib3BOYW1lIiwgIm9wRGF0YSIsICJvbk9wTmFtZUNsaWNrIl0sIFsiY2xhc3MiLCAiY29uc3VtZXJzLWNvbnRhaW5lciIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibm9Db25zdW1lcnMiLCAiIl0sIFsxLCAiaW5wdXRzLWNvbnRhaW5lciJdLCBbImNsYXNzIiwgImlucHV0LW9wLXNlY3Rpb24iLCA0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMSwgImlucHV0LW9wLXNlY3Rpb24iXSwgWzEsICJpbnB1dC1zbG90LWhlYWRlciJdLCBbMywgImtpbmQiLCAib3BOYW1lIiwgInNsb3QiLCAib3BEYXRhIiwgIm9uT3BOYW1lQ2xpY2siXSwgWzEsICJpbnB1dHMtY29udGFpbmVyIiwgIm5vLWlucHV0cy1pbmRpY2F0b3IiXSwgWzEsICJjb25zdW1lcnMtY29udGFpbmVyIl0sIFsiY2xhc3MiLCAic2xvdC1jb25zdW1lcnMtY29udGFpbmVyIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJzbG90LWNvbnN1bWVycy1jb250YWluZXIiXSwgWzEsICJzbG90LWNvbnN1bWVycy1oZWFkZXIiXSwgWyJjbGFzcyIsICJjb25zdW1lci1zZWN0aW9uIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJjb25zdW1lci1zZWN0aW9uIl0sIFsxLCAib3AtY29uc3VtZXJzLWNvbnRhaW5lciJdLCBbMSwgIm9wLWluZm8tbWlzc2luZyJdLCBbMSwgIm5vLW9wLWZvY3VzZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCgyLCAiIEdyYXBoIFN0cnVjdHVyZSAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDApOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBHcmFwaENvbXBvbmVudF9kaXZfNF9UZW1wbGF0ZSwgMTEsIDcsICJkaXYiLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBHcmFwaENvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCAyLCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg3LCBHcmFwaENvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCAzLCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBfcjMgPSDJtcm1cmVmZXJlbmNlKDgpOwogICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5vcEluZm8gIT09IHVuZGVmaW5lZCAmJiBjdHgub3BJbmZvICE9PSBudWxsKSgibmdJZkVsc2UiLCBfcjMpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgR3JhcGhPcENvbXBvbmVudCwgTmdGb3JPZl0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLmNvbnN1bWVycy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmNvbnN1bWVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogNXB4IDA7XG59XG5cbi5ncmFwaC1zdHJ1Y3R1cmUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmlucHV0cy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigwLCAwLCAwLCAwLjEyKTtcbiAgbWFyZ2luLXRvcDogNXB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmlucHV0LW9wLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xufVxuXG4uaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmYwOTk7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLmlucHV0LXRlbnNvci1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ubm8tb3AtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBjb2xvcjogIzgwODA4MDtcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEzcHg7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbi5zZWxmLW9wLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4uc2VsZi1vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigwLCAwLCAwLCAwLjEyKTtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cblxuLnNsb3QtY29uc3VtZXJzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2IoMCwgMCwgMCwgMC4xMik7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbi5zbG90LWNvbnN1bWVycy1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGgvZ3JhcGhfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEdyYXBoQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLm9wSW5mbyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRHcmFwaE9wSW5mbykpOwogICAgICAgIHRoaXMuaW5wdXRPcHMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkR3JhcGhPcElucHV0cykpOwogICAgICAgIHRoaXMuY29uc3VtZXJPcHMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkR3JhcGhPcENvbnN1bWVycykpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkdyYXBoT3BOYXZpZ2F0ZShldmVudCkgewogICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZ3JhcGhPcEZvY3VzZWQoZXZlbnQpKTsKICAgIH0KfQpHcmFwaENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RmLWRlYnVnZ2VyLXYyLWdyYXBoJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8Z3JhcGgtY29tcG9uZW50CiAgICAgIFtvcEluZm9dPSJvcEluZm8kIHwgYXN5bmMiCiAgICAgIFtpbnB1dE9wc109ImlucHV0T3BzJCB8IGFzeW5jIgogICAgICBbY29uc3VtZXJPcHNdPSJjb25zdW1lck9wcyQgfCBhc3luYyIKICAgICAgKG9uR3JhcGhPcE5hdmlnYXRlKT0ib25HcmFwaE9wTmF2aWdhdGUoJGV2ZW50KSIKICAgID48L2dyYXBoLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovCkdyYXBoQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEdyYXBoQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEdyYXBoQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBHcmFwaENvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1ncmFwaCJdXSwgZGVjbHM6IDQsIHZhcnM6IDksIGNvbnN0czogW1szLCAib3BJbmZvIiwgImlucHV0T3BzIiwgImNvbnN1bWVyT3BzIiwgIm9uR3JhcGhPcE5hdmlnYXRlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gR3JhcGhDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZ3JhcGgtY29tcG9uZW50IiwgMCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJvbkdyYXBoT3BOYXZpZ2F0ZSIsIGZ1bmN0aW9uIEdyYXBoQ29udGFpbmVyX1RlbXBsYXRlX2dyYXBoX2NvbXBvbmVudF9vbkdyYXBoT3BOYXZpZ2F0ZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uR3JhcGhPcE5hdmlnYXRlKCRldmVudCk7IH0pOwogICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1cHJvcGVydHkoIm9wSW5mbyIsIMm1ybVwaXBlQmluZDEoMSwgMywgY3R4Lm9wSW5mbyQpKSgiaW5wdXRPcHMiLCDJtcm1cGlwZUJpbmQxKDIsIDUsIGN0eC5pbnB1dE9wcyQpKSgiY29uc3VtZXJPcHMiLCDJtcm1cGlwZUJpbmQxKDMsIDcsIGN0eC5jb25zdW1lck9wcyQpKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW0dyYXBoQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGhfZXhlY3V0aW9ucy9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfZGl2XzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMik7CiAgICDJtcm1dGV4dCgxLCAiIFx1MjVCNiAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpjb25zdCBfYzAkZyA9IGZ1bmN0aW9uIChhMCwgYTEpIHsgcmV0dXJuIHsgdGVuc29yRGVidWdNb2RlOiBhMCwgYXJyYXk6IGExIH07IH07CmZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19kaXZfMV9kaXZfNV9kZWJ1Z190ZW5zb3JfdmFsdWVfNl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50KDAsICJkZWJ1Zy10ZW5zb3ItdmFsdWUiLCAxNyk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgaV9yMiA9IMm1ybVuZXh0Q29udGV4dCgyKS4kaW1wbGljaXQ7CiAgICBjb25zdCBjdHhfcjcgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICDJtcm1cHJvcGVydHkoImRlYnVnVGVuc29yVmFsdWUiLCBjdHhfcjcucGFyc2VEZWJ1Z1RlbnNvclZhbHVlKMm1ybVwdXJlRnVuY3Rpb24yKDEsIF9jMCRnLCBjdHhfcjcuZ3JhcGhFeGVjdXRpb25EYXRhW2lfcjJdLnRlbnNvcl9kZWJ1Z19tb2RlLCBjdHhfcjcuZ3JhcGhFeGVjdXRpb25EYXRhW2lfcjJdLmRlYnVnX3RlbnNvcl92YWx1ZSkpKTsKfSB9CmZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19kaXZfMV9kaXZfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMTEgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTMpOwogICAgybXJtWVsZW1lbnRTdGFydCgyLCAiYnV0dG9uIiwgMTQpOwogICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19kaXZfMV9kaXZfNV9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMl9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTEpOyBjb25zdCBpX3IyID0gybXJtW5leHRDb250ZXh0KCkuJGltcGxpY2l0OyBjb25zdCBjdHhfcjkgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjkub25UZW5zb3JOYW1lQ2xpY2suZW1pdCh7IGluZGV4OiBpX3IyLCBncmFwaF9pZDogY3R4X3I5LmdyYXBoRXhlY3V0aW9uRGF0YVtpX3IyXS5ncmFwaF9pZCwgb3BfbmFtZTogY3R4X3I5LmdyYXBoRXhlY3V0aW9uRGF0YVtpX3IyXS5vcF9uYW1lIH0pOyB9KTsKICAgIMm1ybV0ZXh0KDMpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImRpdiIsIDE1KTsKICAgIMm1ybV0ZXh0KDUpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGVtcGxhdGUoNiwgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX2Rpdl81X2RlYnVnX3RlbnNvcl92YWx1ZV82X1RlbXBsYXRlLCAxLCA0LCAiZGVidWctdGVuc29yLXZhbHVlIiwgMTYpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBpX3IyID0gybXJtW5leHRDb250ZXh0KCkuJGltcGxpY2l0OwogICAgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZSgidGl0bGUiLCBjdHhfcjQuZ2V0VGVuc29yTmFtZShpX3IyKSk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3I0LmdldFRlbnNvck5hbWUoaV9yMiksICIgIik7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3I0LmdyYXBoRXhlY3V0aW9uRGF0YVtpX3IyXS5vcF90eXBlLCAiICIpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjQuZ3JhcGhFeGVjdXRpb25EYXRhW2lfcjJdLmRlYnVnX3RlbnNvcl92YWx1ZSAhPT0gbnVsbCk7Cn0gfQpmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfbmdfdGVtcGxhdGVfNl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE4KTsKICAgIMm1ybV0ZXh0KDEsICIgTG9hZGluZy4uLiAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpjb25zdCBfYzEkOSA9IGZ1bmN0aW9uIChhMCkgeyByZXR1cm4geyAiaW5wdXQtb2YtZm9jdXMiOiBhMCB9OyB9OwpmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA1KTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDYpOwogICAgybXJtWVsZW1lbnRTdGFydCgyLCAiZGl2IiwgNyk7CiAgICDJtcm1dGVtcGxhdGUoMywgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX2Rpdl8zX1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgOCk7CiAgICDJtcm1dGV4dCg0KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1dGVtcGxhdGUoNSwgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX2Rpdl81X1RlbXBsYXRlLCA3LCA0LCAiZGl2IiwgOSk7CiAgICDJtcm1dGVtcGxhdGUoNiwgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX25nX3RlbXBsYXRlXzZfVGVtcGxhdGUsIDIsIDAsICJuZy10ZW1wbGF0ZSIsIDEwLCAxMSwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGlfcjIgPSBjdHguJGltcGxpY2l0OwogICAgY29uc3QgX3I1ID0gybXJtXJlZmVyZW5jZSg3KTsKICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjEoNSwgX2MxJDksIGN0eF9yMS5pc0lucHV0T2ZGb2N1cyhpX3IyKSkpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBpX3IyID09PSBjdHhfcjEuZm9jdXNJbmRleCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgaV9yMiwgIiAiKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLmdyYXBoRXhlY3V0aW9uRGF0YVtpX3IyXSkoIm5nSWZFbHNlIiwgX3I1KTsKfSB9CmZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIGNvbnN0IF9yMTQgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCIsIDMpOwogICAgybXJtWxpc3RlbmVyKCJzY3JvbGxlZEluZGV4Q2hhbmdlIiwgZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX1RlbXBsYXRlX2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF9zY3JvbGxlZEluZGV4Q2hhbmdlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjE0KTsgY29uc3QgY3R4X3IxMyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IxMy5vblNjcm9sbGVkSW5kZXhDaGFuZ2UuZW1pdCgkZXZlbnQpOyB9KTsKICAgIMm1ybV0ZW1wbGF0ZSgxLCBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfVGVtcGxhdGUsIDgsIDcsICJkaXYiLCA0KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eSgiY2RrVmlydHVhbEZvck9mIiwgY3R4X3IwLmdyYXBoRXhlY3V0aW9uSW5kaWNlcyk7Cn0gfQovKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpjbGFzcyBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5vblNjcm9sbGVkSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgdGhpcy5vblRlbnNvck5hbWVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLnBhcnNlRGVidWdUZW5zb3JWYWx1ZSA9IHBhcnNlRGVidWdUZW5zb3JWYWx1ZTsKICAgICAgICB0aGlzLlRFU1RfT05MWSA9IHsKICAgICAgICAgICAgZ2V0Vmlld1BvcnQ6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMudmlld1BvcnQpLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGlmICh0aGlzLnZpZXdQb3J0ICYmCiAgICAgICAgICAgIGNoYW5nZXNbJ2ZvY3VzSW5kZXgnXSAmJgogICAgICAgICAgICBjaGFuZ2VzWydmb2N1c0luZGV4J10uY3VycmVudFZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnZpZXdQb3J0LmdldFJlbmRlcmVkUmFuZ2UoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzY3JvbGxJbmRleCA9IGNoYW5nZXNbJ2ZvY3VzSW5kZXgnXS5jdXJyZW50VmFsdWU7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbmRleCBpcyBzY3JvbGxlZCB0byBvbmUgdGhpcmQgdGhlIHZpZXcgcG9ydC4KICAgICAgICAgICAgLy8gVGhpcyBpcyBuaWNlciB0aGFuIHNjcm9sbGluZyBpdCBtZXJlbHkgdG8gdGhlIHRvcC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aGlyZFJhbmdlID0gTWF0aC5yb3VuZCgocmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQpIC8gMyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1heChzY3JvbGxJbmRleCAtIHRoaXJkUmFuZ2UsIDApOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVzZVNtb290aFNjcm9sbGluZyA9IHNjcm9sbEluZGV4ID49IHJhbmdlLnN0YXJ0ICYmIHNjcm9sbEluZGV4IDwgcmFuZ2UuZW5kOwogICAgICAgICAgICB0aGlzLnZpZXdQb3J0LnNjcm9sbFRvSW5kZXgodGFyZ2V0SW5kZXgsIHVzZVNtb290aFNjcm9sbGluZyA/ICdzbW9vdGgnIDogdW5kZWZpbmVkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25JbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VGVuc29yTmFtZShncmFwaEV4ZWN1dGlvbkluZGV4KSB7CiAgICAgICAgcmV0dXJuIChgJHt0aGlzLmdyYXBoRXhlY3V0aW9uRGF0YVtncmFwaEV4ZWN1dGlvbkluZGV4XS5vcF9uYW1lfTpgICsKICAgICAgICAgICAgYCR7dGhpcy5ncmFwaEV4ZWN1dGlvbkRhdGFbZ3JhcGhFeGVjdXRpb25JbmRleF0ub3V0cHV0X3Nsb3R9YCk7CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGVzIGlmIGdpdmVuIGdyYXBoLWV4ZWN1dGlvbiBpbmRleCBpcyBhbiBpbW1lZGlhdGUgaW5wdXQgdGVuc29yIHRvCiAgICAgKiB0aGUgZ3JhcGggZXhlY3V0aW9uIGN1cnJlbnRseSBmb2N1c2VkIG9uLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25JbmRleAogICAgICogQHJldHVybiB7P30gSWYgbm8gZ3JhcGggZXhlY3V0aW9uIGlzIGZvY3VzZWQgb24sIGBmYWxzZWAuIElmIGEgZ3JhcGggZXhlY3V0aW9uCiAgICAgKiAgIGlzIGJlaW5nIGZvY3VzZWQgb24sIGB0cnVlYCBpZiBgZ3JhcGhFeGVjdXRpb25JbmRleGAgcG9pbnRzIHRvIGEgZ3JhcGgtCiAgICAgKiAgIGV4ZWN1dGlvbiBldmVudCB0aGF0IGZvcm1zIHRoZSBpbW1lZGlhdGUgaW5wdXQgdG8gdGhlIGZvY3VzZWQgb25lLgogICAgICovCiAgICBpc0lucHV0T2ZGb2N1cyhncmFwaEV4ZWN1dGlvbkluZGV4KSB7CiAgICAgICAgaWYgKHRoaXMuZm9jdXNJbnB1dEluZGljZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5mb2N1c0lucHV0SW5kaWNlcy5pbmNsdWRlcyhncmFwaEV4ZWN1dGlvbkluZGV4KTsKICAgIH0KfQpHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vZ3JhcGhfZXhlY3V0aW9uc19jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICB9LF0gfSwKXTsKR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgbnVtR3JhcGhFeGVjdXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGdyYXBoRXhlY3V0aW9uRGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBncmFwaEV4ZWN1dGlvbkluZGljZXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZm9jdXNJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBmb2N1c0lucHV0SW5kaWNlczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBvblNjcm9sbGVkSW5kZXhDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIG9uVGVuc29yTmFtZUNsaWNrOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICB2aWV3UG9ydDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHN0YXRpYzogZmFsc2UgfSxdIH1dCn07Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50KSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXZpZXdRdWVyeShDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIHRydWUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgudmlld1BvcnQgPSBfdC5maXJzdCk7CiAgICB9IH0sIGlucHV0czogeyBudW1HcmFwaEV4ZWN1dGlvbnM6ICJudW1HcmFwaEV4ZWN1dGlvbnMiLCBncmFwaEV4ZWN1dGlvbkRhdGE6ICJncmFwaEV4ZWN1dGlvbkRhdGEiLCBncmFwaEV4ZWN1dGlvbkluZGljZXM6ICJncmFwaEV4ZWN1dGlvbkluZGljZXMiLCBmb2N1c0luZGV4OiAiZm9jdXNJbmRleCIsIGZvY3VzSW5wdXRJbmRpY2VzOiAiZm9jdXNJbnB1dEluZGljZXMiIH0sIG91dHB1dHM6IHsgb25TY3JvbGxlZEluZGV4Q2hhbmdlOiAib25TY3JvbGxlZEluZGV4Q2hhbmdlIiwgb25UZW5zb3JOYW1lQ2xpY2s6ICJvblRlbnNvck5hbWVDbGljayIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDQsIHZhcnM6IDIsIGNvbnN0czogW1sxLCAiZ3JhcGgtZXhlY3V0aW9ucy1jb250YWluZXIiXSwgWzEsICJncmFwaC1leGVjdXRpb25zLXRpdGxlIl0sIFsiaXRlbVNpemUiLCAiMzgiLCAiY2xhc3MiLCAiZ3JhcGgtZXhlY3V0aW9ucy12aWV3cG9ydCIsIDMsICJzY3JvbGxlZEluZGV4Q2hhbmdlIiwgNCwgIm5nSWYiXSwgWyJpdGVtU2l6ZSIsICIzOCIsIDEsICJncmFwaC1leGVjdXRpb25zLXZpZXdwb3J0IiwgMywgInNjcm9sbGVkSW5kZXhDaGFuZ2UiXSwgWyJjbGFzcyIsICJ0ZW5zb3ItY29udGFpbmVyIiwgNCwgImNka1ZpcnR1YWxGb3IiLCAiY2RrVmlydHVhbEZvck9mIl0sIFsxLCAidGVuc29yLWNvbnRhaW5lciJdLCBbMSwgInRlbnNvci1pdGVtIiwgMywgIm5nQ2xhc3MiXSwgWzEsICJncmFwaC1leGVjdXRpb24taW5kZXgiXSwgWyJjbGFzcyIsICJncmFwaC1leGVjdXRpb24tZm9jdXMiLCA0LCAibmdJZiJdLCBbNCwgIm5nSWYiLCAibmdJZkVsc2UiXSwgWyJjbGFzcyIsICJ0ZW5zb3ItaXRlbSJdLCBbImRhdGFMb2FkaW5nIiwgIiJdLCBbMSwgImdyYXBoLWV4ZWN1dGlvbi1mb2N1cyJdLCBbMSwgInRlbnNvci1uYW1lLWFuZC1vcC10eXBlIl0sIFsxLCAidGVuc29yLW5hbWUiLCAzLCAidGl0bGUiLCAiY2xpY2siXSwgWzEsICJvcC10eXBlIl0sIFszLCAiZGVidWdUZW5zb3JWYWx1ZSIsIDQsICJuZ0lmIl0sIFszLCAiZGVidWdUZW5zb3JWYWx1ZSJdLCBbMSwgImxvYWRpbmctc3Bpbm5lciJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICDJtcm1dGV4dCgyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfVGVtcGxhdGUsIDIsIDEsICJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiBHcmFwaCBFeGVjdXRpb25zICgiLCBjdHgubnVtR3JhcGhFeGVjdXRpb25zLCAiKSAiKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgubnVtR3JhcGhFeGVjdXRpb25zICE9PSBudWxsICYmIGN0eC5udW1HcmFwaEV4ZWN1dGlvbnMgPiAwKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCwgQ2RrVmlydHVhbEZvck9mLCBOZ0NsYXNzLCBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50XSwgc3R5bGVzOiBbIi5ncmFwaC1leGVjdXRpb25zLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4uZ3JhcGgtZXhlY3V0aW9uLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmdyYXBoLWV4ZWN1dGlvbi1pbmRleFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBjb2xvcjogIzc1NzU3NTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB3aWR0aDogNDBweDtcbn1cblxuLmdyYXBoLWV4ZWN1dGlvbnMtdGl0bGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNoYWRvdzogMCA1cHggM3B4IC0zcHggI2NjYztcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cblxuLmdyYXBoLWV4ZWN1dGlvbnMtdmlld3BvcnRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZmxleC1ncm93OiAxO1xuICBmb250LXNpemU6IDEycHg7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi5pbnB1dC1vZi1mb2N1c1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjA5OTtcbn1cblxuLmxvYWRpbmctc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZGlyZWN0aW9uOiBydGw7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGhlaWdodDogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIHBhZGRpbmc6IDFweCAzcHg7XG4gIHdpZHRoOiBtYXgtY29udGVudDtcbn1cblxuLnRlbnNvci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi50ZW5zb3ItaXRlbVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIGhlaWdodDogMzhweDtcbiAgbGluZS1oZWlnaHQ6IDM4cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4udGVuc29yLW5hbWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXJlY3Rpb246IHJ0bDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIG1hcmdpbjogMnB4IDAgMXB4O1xuICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDJweCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmc6IDAgMnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udGVuc29yLW5hbWVbX25nY29udGVudC0lQ09NUCVdOmZvY3VzIHtcbiAgb3V0bGluZTogMXB4IHNvbGlkICNjNmNhZDE7XG59XG5cbi50ZW5zb3ItbmFtZS1hbmQtb3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXJlY3Rpb246IHJ0bDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB3aWR0aDogMjQwcHg7XG59XG5cbmRlYnVnLXRlbnNvci12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMnB4IDA7XG59Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2dyYXBoX2V4ZWN1dGlvbnMvZ3JhcGhfZXhlY3V0aW9uc19jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB0aGlzLm51bUdyYXBoRXhlY3V0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldE51bUdyYXBoRXhlY3V0aW9ucykpOwogICAgICAgIHRoaXMuZ3JhcGhFeGVjdXRpb25EYXRhJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0R3JhcGhFeGVjdXRpb25EYXRhKSk7CiAgICAgICAgdGhpcy5ncmFwaEV4ZWN1dGlvbkluZGljZXMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXROdW1HcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG51bUdyYXBoRXhlY3V0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobnVtR3JhcGhFeGVjdXRpb24pID0+IHsKICAgICAgICAgICAgaWYgKG51bUdyYXBoRXhlY3V0aW9uID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtR3JhcGhFeGVjdXRpb24gfSkubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKF8sIGkpID0+IGkpKTsKICAgICAgICB9KSkpKTsKICAgICAgICB0aGlzLmZvY3VzSW5kZXgkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvbkZvY3VzSW5kZXgpKTsKICAgICAgICAvKioKICAgICAgICAgKiBJbmZlcnJlZCBncmFwaC1leGVjdXRpb24gaW5kaWNlcyB0aGF0IGJlbG9uZyB0byB0aGUgaW1tZWRpYXRlIGlucHV0cwogICAgICAgICAqIHRvIHRoZSBjdXJyZW50bHktZm9jdXNlZCBncmFwaCBvcC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmZvY3VzSW5wdXRJbmRpY2VzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0Rm9jdXNlZEdyYXBoRXhlY3V0aW9uSW5wdXRJbmRpY2VzKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsZWRJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25TY3JvbGxlZEluZGV4Q2hhbmdlKHNjcm9sbGVkSW5kZXgpIHsKICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoRXhlY3V0aW9uU2Nyb2xsVG9JbmRleCh7IGluZGV4OiBzY3JvbGxlZEluZGV4IH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25UZW5zb3JOYW1lQ2xpY2soZXZlbnQpIHsKICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoRXhlY3V0aW9uRm9jdXNlZChldmVudCkpOwogICAgfQp9CkdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMnLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudAogICAgICBbbnVtR3JhcGhFeGVjdXRpb25zXT0ibnVtR3JhcGhFeGVjdXRpb25zJCB8IGFzeW5jIgogICAgICBbZ3JhcGhFeGVjdXRpb25EYXRhXT0iZ3JhcGhFeGVjdXRpb25EYXRhJCB8IGFzeW5jIgogICAgICBbZ3JhcGhFeGVjdXRpb25JbmRpY2VzXT0iZ3JhcGhFeGVjdXRpb25JbmRpY2VzJCB8IGFzeW5jIgogICAgICBbZm9jdXNJbmRleF09ImZvY3VzSW5kZXgkIHwgYXN5bmMiCiAgICAgIFtmb2N1c0lucHV0SW5kaWNlc109ImZvY3VzSW5wdXRJbmRpY2VzJCB8IGFzeW5jIgogICAgICAob25TY3JvbGxlZEluZGV4Q2hhbmdlKT0ib25TY3JvbGxlZEluZGV4Q2hhbmdlKCRldmVudCkiCiAgICAgIChvblRlbnNvck5hbWVDbGljayk9Im9uVGVuc29yTmFtZUNsaWNrKCRldmVudCkiCiAgICA+PC9ncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovCkdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1ncmFwaC1leGVjdXRpb25zIl1dLCBkZWNsczogNiwgdmFyczogMTUsIGNvbnN0czogW1szLCAibnVtR3JhcGhFeGVjdXRpb25zIiwgImdyYXBoRXhlY3V0aW9uRGF0YSIsICJncmFwaEV4ZWN1dGlvbkluZGljZXMiLCAiZm9jdXNJbmRleCIsICJmb2N1c0lucHV0SW5kaWNlcyIsICJvblNjcm9sbGVkSW5kZXhDaGFuZ2UiLCAib25UZW5zb3JOYW1lQ2xpY2siXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZ3JhcGgtZXhlY3V0aW9ucy1jb21wb25lbnQiLCAwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uU2Nyb2xsZWRJbmRleENoYW5nZSIsIGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcl9UZW1wbGF0ZV9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudF9vblNjcm9sbGVkSW5kZXhDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblNjcm9sbGVkSW5kZXhDaGFuZ2UoJGV2ZW50KTsgfSkoIm9uVGVuc29yTmFtZUNsaWNrIiwgZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyX1RlbXBsYXRlX2dyYXBoX2V4ZWN1dGlvbnNfY29tcG9uZW50X29uVGVuc29yTmFtZUNsaWNrXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25UZW5zb3JOYW1lQ2xpY2soJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgybXJtXBpcGUoNSwgImFzeW5jIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVwcm9wZXJ0eSgibnVtR3JhcGhFeGVjdXRpb25zIiwgybXJtXBpcGVCaW5kMSgxLCA1LCBjdHgubnVtR3JhcGhFeGVjdXRpb25zJCkpKCJncmFwaEV4ZWN1dGlvbkRhdGEiLCDJtcm1cGlwZUJpbmQxKDIsIDcsIGN0eC5ncmFwaEV4ZWN1dGlvbkRhdGEkKSkoImdyYXBoRXhlY3V0aW9uSW5kaWNlcyIsIMm1ybVwaXBlQmluZDEoMywgOSwgY3R4LmdyYXBoRXhlY3V0aW9uSW5kaWNlcyQpKSgiZm9jdXNJbmRleCIsIMm1ybVwaXBlQmluZDEoNCwgMTEsIGN0eC5mb2N1c0luZGV4JCkpKCJmb2N1c0lucHV0SW5kaWNlcyIsIMm1ybVwaXBlQmluZDEoNSwgMTMsIGN0eC5mb2N1c0lucHV0SW5kaWNlcyQpKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW0dyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qKgogKiBTaGltIGZvciB0aGUgYGxvYWRNb25hY28oKWAgZnVuY3Rpb24gaW4gZGlmZmVyZW50IGJ1aWxkIGVudmlyb25tZW50cy4KICoKICogVGhpcyBmaWxlIGV4cG9ydHMgdGhlIHZlcnNpb24gb2YgYGxvYWRNb25hY28oKWAgYXBwcm9wcmlhdGUgZm9yIHRoZQogKiBvcGVuLXNvdXJjZSBlbnZpcm9ubWVudC4KICovCnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsKICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgIH0pOwp9OwpmdW5jdGlvbiBnZXRXaW5kb3ckMSgpIHsKICAgIHJldHVybiB3aW5kb3c7Cn0KY29uc3QgdXRpbHMgPSB7CiAgICBnZXRXaW5kb3c6IGdldFdpbmRvdyQxLAp9Owpjb25zdCBNT05BQ09fUEFUSF9QUkVGSVggPSAndnMnOwpjb25zdCBNT05BQ09fSU1QT1JUX1BBVEggPSAnL3RmLWltcG9ydHMvdnMnOwovKioKICogcmVxdWlyZS5qcydzIHJlcXVpcmUoKSB3cmFwcGVkIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFByb21pc2UuCiAqCiAqIFRoaXMgd3JhcHBlZCB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2stZnVuY3Rpb24gYXJndW1lbnRzLgogKgogKiBAcGFyYW0gcGF0aHMKICovCmZ1bmN0aW9uIHJlcXVpcmVBc1Byb21pc2UocGF0aHMpIHsKICAgIGNvbnN0IHJlcXVpcmUgPSB1dGlscy5nZXRXaW5kb3coKS5yZXF1aXJlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgcmVxdWlyZShwYXRocywgcmVzb2x2ZSk7CiAgICB9KTsKfQovKioKICogSWYgYHdpbmRvdy5tb25hY29gIGlzIHVuZGVmaW5lZCwgbG9hZCB0aGUgbW9uYWNvLWVkaXRvciBBUEkgb2JqZWN0IG9udG8gdGhhdAogKiBnbG9iYWwgcGF0aCBkeW5hbWljYWxseSB1c2luZyByZXF1aXJlLmpzLiBJZiBgd2luZG93Lm1vbmFjb2AgaXMgYWxyZWFkeQogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AuCiAqLwpmdW5jdGlvbiBsb2FkTW9uYWNvKCkgewogICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBjb25zdCB3aW5kb3cgPSB1dGlscy5nZXRXaW5kb3coKTsKICAgICAgICBpZiAod2luZG93Lm1vbmFjbyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHdpbmRvdy5yZXF1aXJlKSB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmUgPSB3aW5kb3cucmVxdWlyZTsKICAgICAgICAgICAgcmVxdWlyZS5jb25maWcoewogICAgICAgICAgICAgICAgcGF0aHM6IHsKICAgICAgICAgICAgICAgICAgICBbTU9OQUNPX1BBVEhfUFJFRklYXTogTU9OQUNPX0lNUE9SVF9QQVRILAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHlpZWxkIHJlcXVpcmVBc1Byb21pc2UoW2Ake01PTkFDT19QQVRIX1BSRUZJWH0vZWRpdG9yL2VkaXRvci5tYWluYF0pOwogICAgICAgICAgICB5aWVsZCByZXF1aXJlQXNQcm9taXNlKFsKICAgICAgICAgICAgICAgIGAke01PTkFDT19QQVRIX1BSRUZJWH0vcHl0aG9uL3B5dGhvbi5jb250cmlidXRpb25gLAogICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZE1vbmFjbygpIGZhaWxlZCBiZWNhdXNlIGZ1bmN0aW9uIHJlcXVpcmUoKSBpcyB1bmF2YWlsYWJsZScpOwogICAgICAgIH0KICAgIH0pOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zb3VyY2VfY29kZS9zb3VyY2VfY29kZV9jb21wb25lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY29uc3QgX2MwJGggPSBbImNvZGVWaWV3ZXJDb250YWluZXIiXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBERUZBVUxUX0NPREVfTEFOR1VBR0UgPSAncHl0aG9uJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBERUZBVUxUX0NPREVfRk9OVF9TSVpFID0gMTA7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUkVTSVpFX0RFQk9VTkNFX0lOVEVSQVZMX01TID0gNTA7CmNsYXNzIFNvdXJjZUNvZGVDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5saW5lcyA9IG51bGw7IC8vIFRPRE8oY2Fpcyk6IEFkZCBzcGlubmVyIGZvciBgbnVsbGAuCiAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHNwaW5uZXIgZm9yIGBudWxsYC4KICAgICAgICB0aGlzLmZvY3VzZWRMaW5lbm8gPSBudWxsOwogICAgICAgIC8vIFRPRE8oY2Fpcyk6IEV4cGxvcmUgYmV0dGVyIHR5cGluZyBieSBkZXBlbmRpbmcgb24gZXh0ZXJuYWwgbGlicmFyaWVzLgogICAgICAgIHRoaXMubW9uYWNvID0gbnVsbDsKICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtdOwogICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25Jbml0KCkgewogICAgICAgIC8vIExpc3RlbiB0byB3aW5kb3cgcmVzaXplIGV2ZW50LiBXaGVuIHJlc2l6ZSBoYXBwZW5zLCByZS1sYXlvdXQKICAgICAgICAvLyBtb25hY28gZWRpdG9yLCBzbyBpdHMgd2lkdGggaXMgYWx3YXlzIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgLy8gdGhlIHdpbmRvdyBzaXplLiBEbyB0aGlzIHdpdGggYGRlYm91bmNlKClgIHRvIHByZXZlbnQgcmUtbGF5b3V0aW5nCiAgICAgICAgLy8gYXQgdG9vIGhpZ2ggYSByYXRlLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNpemVQaXBlID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpCiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBkZWJvdW5jZSgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBpbnRlcnZhbChSRVNJWkVfREVCT1VOQ0VfSU5URVJBVkxfTVMpKSksIHRhcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IubGF5b3V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSkpCiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTsKICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgaWYgKHRoaXMubW9uYWNvID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lcyA9IGNoYW5nZXNbJ21vbmFjbyddCiAgICAgICAgICAgID8gdGhpcy5saW5lcwogICAgICAgICAgICA6IGNoYW5nZXNbJ2xpbmVzJ10KICAgICAgICAgICAgICAgID8gY2hhbmdlc1snbGluZXMnXS5jdXJyZW50VmFsdWUKICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICBpZiAoY3VycmVudExpbmVzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdXJyZW50TGluZXMuam9pbignXG4nKTsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IHRoaXMubW9uYWNvLmVkaXRvci5jcmVhdGUodGhpcy5jb2RlVmlld2VyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogREVGQVVMVF9DT0RFX0xBTkdVQUdFLAogICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBERUZBVUxUX0NPREVfRk9OVF9TSVpFLAogICAgICAgICAgICAgICAgICAgIG1pbmltYXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRGb2N1c2VkTGluZW5vID0gY2hhbmdlc1snbW9uYWNvJ10KICAgICAgICAgICAgPyB0aGlzLmZvY3VzZWRMaW5lbm8KICAgICAgICAgICAgOiBjaGFuZ2VzWydmb2N1c2VkTGluZW5vJ10KICAgICAgICAgICAgICAgID8gY2hhbmdlc1snZm9jdXNlZExpbmVubyddLmN1cnJlbnRWYWx1ZQogICAgICAgICAgICAgICAgOiBudWxsOwogICAgICAgIGlmIChjdXJyZW50Rm9jdXNlZExpbmVubyAmJiB0aGlzLmxpbmVzICYmIHRoaXMubW9uYWNvICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnJldmVhbExpbmVJbkNlbnRlcihjdXJyZW50Rm9jdXNlZExpbmVubywgdGhpcy5tb25hY28uZWRpdG9yLlNjcm9sbFR5cGUuU21vb3RoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gdGhpcy5saW5lc1tjdXJyZW50Rm9jdXNlZExpbmVubyAtIDFdLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZWRpdG9yLmRlbHRhRGVjb3JhdGlvbnModGhpcy5kZWNvcmF0aW9ucywgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJhbmdlOiBuZXcgdGhpcy5tb25hY28uUmFuZ2UoY3VycmVudEZvY3VzZWRMaW5lbm8sIDEsIGN1cnJlbnRGb2N1c2VkTGluZW5vLCAxKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzV2hvbGVMaW5lOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0RlY29yYXRpb25zQ2xhc3NOYW1lOiAnaGlnaGxpZ2h0LWd1dHRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IG5ldyB0aGlzLm1vbmFjby5SYW5nZShjdXJyZW50Rm9jdXNlZExpbmVubywgMSwgY3VycmVudEZvY3VzZWRMaW5lbm8sIGxpbmVMZW5ndGggKyAxKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNsYXNzTmFtZTogJ2hpZ2hsaWdodC1saW5lJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgfQp9ClNvdXJjZUNvZGVDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzb3VyY2UtY29kZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3NvdXJjZV9jb2RlX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3NvdXJjZV9jb2RlX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICB9LF0gfSwKXTsKU291cmNlQ29kZUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGxpbmVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGZvY3VzZWRMaW5lbm86IFt7IHR5cGU6IElucHV0IH1dLAogICAgbW9uYWNvOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGNvZGVWaWV3ZXJDb250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydjb2RlVmlld2VyQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSxdIH1dCn07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VDb2RlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gU291cmNlQ29kZUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTb3VyY2VDb2RlQ29tcG9uZW50KSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gU291cmNlQ29kZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTb3VyY2VDb2RlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInNvdXJjZS1jb2RlLWNvbXBvbmVudCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBTb3VyY2VDb2RlQ29tcG9uZW50X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJGgsIHRydWUsIEVsZW1lbnRSZWYpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgdmFyIF90OwogICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguY29kZVZpZXdlckNvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgIH0gfSwgaW5wdXRzOiB7IGxpbmVzOiAibGluZXMiLCBmb2N1c2VkTGluZW5vOiAiZm9jdXNlZExpbmVubyIsIG1vbmFjbzogIm1vbmFjbyIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDIsIHZhcnM6IDAsIGNvbnN0czogW1sxLCAiY29kZS12aWV3ZXItY29udGFpbmVyIl0sIFsiY29kZVZpZXdlckNvbnRhaW5lciIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTb3VyY2VDb2RlQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJkaXYiLCAwLCAxKTsKICAgIH0gfSwgc3R5bGVzOiBbIi5jb2RlLXZpZXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5bX25naG9zdC0lQ09NUCVdICAgICAuaGlnaGxpZ2h0LWd1dHRlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxMTEsIDAsIDAuNyk7XG4gIHdpZHRoOiA1cHggIWltcG9ydGFudDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICAgLmhpZ2hsaWdodC1saW5lIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDExMSwgMCwgMC4zKTtcbn0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc291cmNlX2NvZGUvc291cmNlX2NvZGVfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIFRPRE8oY2Fpcyk6IEV4cGxvcmUgYmV0dGVyIHR5cGluZyBieSBkZXBlbmRpbmcgb24gZXh0ZXJuYWwgbGlicmFyaWVzLgovKiogQHR5cGUgez99ICovCmNvbnN0IHdpbmRvd1dpdGhSZXF1aXJlQW5kTW9uYWNvID0gd2luZG93OwovKioKICogU291cmNlQ29kZUNvbnRhaW5lciBkaXNwbGF5cyB0aGUgY29udGVudCBvZiBhIHNvdXJjZS1jb2RlIGZpbGUuCiAqCiAqIEl0IGRpc3BsYXlzIHRoZSBjb2RlIHdpdGggdmlzdWFsIGZlYXR1cmVzIGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nLgogKiBJdCBhZGRpdGlvbmFsbHkgcHJvdmlkZXMgZnVuY3Rpb25hbGl0aWVzIHRvOgogKiAtIFNjcm9sbCB0byBhbmQgaGlnaGxpZ2h0IGEgZ2l2ZW4gbGluZSBieSBpdHMgbGluZSBudW1iZXIuCiAqCiAqIFRPRE8oY2Fpcyk6IEFkZCBzdXBwb3J0IGZvciBsaW5lIGRlY29yYXRpb24gYW5kIHN5bWJvbCBkZWNvcmF0aW9uLgogKgogKiBVbmxpa2UgU291cmNlRmlsZXNDb21wb25lbnQsIFNvdXJjZUNvZGVDb250YWluZXIgaGFuZGxlcyBvbmx5IG9uZSBmaWxlIGF0IGEKICogdGltZS4KICovCmNsYXNzIFNvdXJjZUNvZGVDb250YWluZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLy8gTGluZXMgb2YgdGhlIHNvdXJjZS1jb2RlIGZpbGUsIHNwbGl0IGF0IGxpbmUgYnJlYWtzLgogICAgICAgIHRoaXMubGluZXMgPSBudWxsOyAvLyBUT0RPKGNhaXMpOiBBZGQgc3Bpbm5lciBmb3IgYG51bGxgLgogICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBzcGlubmVyIGZvciBgbnVsbGAuCiAgICAgICAgLy8gTGluZSBudW1iZXIgdG8gc2Nyb2xsIHRvIGFuZCBoaWdobGlnaHQsIDEtYmFzZWQuCiAgICAgICAgdGhpcy5mb2N1c2VkTGluZW5vID0gbnVsbDsKICAgICAgICB0aGlzLm1vbmFjbyQgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uSW5pdCgpIHsKICAgICAgICB0aGlzLm1vbmFjbyQgPSBmcm9tKGxvYWRNb25hY28oKSkucGlwZShtYXAoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gd2luZG93V2l0aFJlcXVpcmVBbmRNb25hY28ubW9uYWNvKSkpOwogICAgfQp9ClNvdXJjZUNvZGVDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtY29kZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHNvdXJjZS1jb2RlLWNvbXBvbmVudAogICAgICBbbGluZXNdPSJsaW5lcyIKICAgICAgW2ZvY3VzZWRMaW5lbm9dPSJmb2N1c2VkTGluZW5vIgogICAgICBbbW9uYWNvXT0ibW9uYWNvJCB8IGFzeW5jIgogICAgPjwvc291cmNlLWNvZGUtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KU291cmNlQ29kZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtdOwpTb3VyY2VDb2RlQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgbGluZXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZm9jdXNlZExpbmVubzogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUNvZGVDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBTb3VyY2VDb2RlQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNvdXJjZUNvZGVDb250YWluZXIpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VDb2RlQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNvdXJjZUNvZGVDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjItc291cmNlLWNvZGUiXV0sIGlucHV0czogeyBsaW5lczogImxpbmVzIiwgZm9jdXNlZExpbmVubzogImZvY3VzZWRMaW5lbm8iIH0sIGRlY2xzOiAyLCB2YXJzOiA1LCBjb25zdHM6IFtbMywgImxpbmVzIiwgImZvY3VzZWRMaW5lbm8iLCAibW9uYWNvIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU291cmNlQ29kZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAic291cmNlLWNvZGUtY29tcG9uZW50IiwgMCk7CiAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICDJtcm1cHJvcGVydHkoImxpbmVzIiwgY3R4LmxpbmVzKSgiZm9jdXNlZExpbmVubyIsIGN0eC5mb2N1c2VkTGluZW5vKSgibW9uYWNvIiwgybXJtXBpcGVCaW5kMSgxLCAzLCBjdHgubW9uYWNvJCkpOwogICAgfSB9LCBkaXJlY3RpdmVzOiBbU291cmNlQ29kZUNvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL3NvdXJjZV9maWxlcy9zb3VyY2VfZmlsZXNfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNik7CiAgICDJtcm1dGV4dCgxKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLmZvY3VzZWRTb3VyY2VMaW5lU3BlYy5maWxlX3BhdGgsICIgIik7Cn0gfQpmdW5jdGlvbiBTb3VyY2VGaWxlc0NvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNyk7CiAgICDJtcm1dGV4dCgxLCAiIE5vIGZpbGUgc2VsZWN0ZWQuIENsaWNrIGEgbGluZSBudW1iZXIgaW4gdGhlIFN0YWNrIFRyYWNlIHNlY3Rpb24gdG8gc2hvdyB0aGUgc291cmNlIGNvZGUuICIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSB9CmZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29tcG9uZW50X3RmX2RlYnVnZ2VyX3YyX3NvdXJjZV9jb2RlXzdfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudCgwLCAidGYtZGVidWdnZXItdjItc291cmNlLWNvZGUiLCA4KTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVwcm9wZXJ0eSgibGluZXMiLCBjdHhfcjMuZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50LmxpbmVzKSgiZm9jdXNlZExpbmVubyIsIGN0eF9yMy5mb2N1c2VkU291cmNlTGluZVNwZWMubGluZW5vKTsKfSB9Ci8qKgogKiBSZW5kZXJzIHRoZSBjb250ZW50IG9mIHNvdXJjZSBmaWxlKHMpLgogKgogKiBVbmxpa2UgYFNvdXJjZUNvZGVDb21wb25lbnRgLCB3aGljaCBkaXNwbGF5cyBvbmx5IHRoZSBjb250ZW50IG9mIGEgc2luZ2xlCiAqIHNvdXJjZS1jb2RlIGZpbGUsIGBTb3VyY2VGaWxlc0NvbXBvbmVudGBpcyBhd2FyZSBvZiB0aGUgbWV0YS1pbmZvcm1hdG9uIGFib3V0CiAqIHRoZSBmaWxlcyBiZWluZyBkaXNwbGF5ZWQsIHN1Y2ggdGhlaXIgZmlsZSBwYXRocy4gU3VjaCBtZXRhLWluZm9ybWF0aW9uIGlzCiAqIGRpc3BsYXllZCBieSB0aGlzIGNvbXBvbmVudC4KICovCmNsYXNzIFNvdXJjZUZpbGVzQ29tcG9uZW50IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50ID0gbnVsbDsKICAgICAgICB0aGlzLmZvY3VzZWRTb3VyY2VMaW5lU3BlYyA9IG51bGw7CiAgICB9Cn0KU291cmNlRmlsZXNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzb3VyY2UtZmlsZXMtY29tcG9uZW50JywKICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9zb3VyY2VfZmlsZXNfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vc291cmNlX2ZpbGVzX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgfSxdIH0sCl07ClNvdXJjZUZpbGVzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGZvY3VzZWRTb3VyY2VMaW5lU3BlYzogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUZpbGVzQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gU291cmNlRmlsZXNDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU291cmNlRmlsZXNDb21wb25lbnQpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VGaWxlc0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTb3VyY2VGaWxlc0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJzb3VyY2UtZmlsZXMtY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50OiAiZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50IiwgZm9jdXNlZFNvdXJjZUxpbmVTcGVjOiAiZm9jdXNlZFNvdXJjZUxpbmVTcGVjIiB9LCBkZWNsczogOCwgdmFyczogMywgY29uc3RzOiBbWzEsICJzb3VyY2UtZmlsZXMtY29udGFpbmVyIl0sIFsxLCAiaGVhZGVyLXNlY3Rpb24iXSwgWzEsICJ0aXRsZS10YWciXSwgWyJjbGFzcyIsICJmaWxlLWxhYmVsIiwgNCwgIm5nSWYiLCAibmdJZkVsc2UiXSwgWyJub0ZpbGVTZWxlY3RlZCIsICIiXSwgWzMsICJsaW5lcyIsICJmb2N1c2VkTGluZW5vIiwgNCwgIm5nSWYiXSwgWzEsICJmaWxlLWxhYmVsIl0sIFsxLCAibm8tZmlsZS1zZWxlY3RlZCJdLCBbMywgImxpbmVzIiwgImZvY3VzZWRMaW5lbm8iXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTb3VyY2VGaWxlc0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyKTsKICAgICAgICDJtcm1dGV4dCgzLCAiIFNvdXJjZSBDb2RlICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDQsIFNvdXJjZUZpbGVzQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCAyLCAxLCAiZGl2IiwgMyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDUsIFNvdXJjZUZpbGVzQ29tcG9uZW50X25nX3RlbXBsYXRlXzVfVGVtcGxhdGUsIDIsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDQsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNywgU291cmNlRmlsZXNDb21wb25lbnRfdGZfZGVidWdnZXJfdjJfc291cmNlX2NvZGVfN19UZW1wbGF0ZSwgMSwgMiwgInRmLWRlYnVnZ2VyLXYyLXNvdXJjZS1jb2RlIiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IF9yMSA9IMm1ybVyZWZlcmVuY2UoNik7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmZvY3VzZWRTb3VyY2VMaW5lU3BlYyAhPT0gbnVsbCkoIm5nSWZFbHNlIiwgX3IxKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50ICE9PSBudWxsICYmIGN0eC5mb2N1c2VkU291cmNlTGluZVNwZWMgIT09IG51bGwgJiYgY3R4LmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudC5saW5lcyAhPT0gbnVsbCk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBTb3VyY2VDb2RlQ29udGFpbmVyXSwgc3R5bGVzOiBbIi5oZWFkZXItc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgZGlzcGxheTogZmxleDtcbiAgaGVpZ2h0OiAyNHB4O1xuICBwYWRkaW5nLWJvdHRvbTogNnB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmZpbGUtbGFiZWxbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgcGFkZGluZzogMCAyMHB4O1xufVxuXG4ubm8tZmlsZS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGNvbG9yOiAjNjY2O1xuICBwYWRkaW5nOiAwIDIwcHg7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbi5zb3VyY2UtZmlsZXMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4udGl0bGUtdGFnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZy1sZWZ0OiA2cHg7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLXNvdXJjZS1jb2RlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZsZXgtZ3JvdzogMTtcbiAgd2lkdGg6IDEwMCU7XG59Il0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zb3VyY2VfZmlsZXMvc291cmNlX2ZpbGVzX2NvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBTb3VyY2VGaWxlc0NvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqLwogICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgdGhpcy5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkU291cmNlRmlsZUNvbnRlbnQpKTsKICAgICAgICB0aGlzLmZvY3VzZWRTb3VyY2VMaW5lU3BlYyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRTb3VyY2VMaW5lU3BlYykpOwogICAgfQp9ClNvdXJjZUZpbGVzQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzJywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8c291cmNlLWZpbGVzLWNvbXBvbmVudAogICAgICBbZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50XT0iZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50JCB8IGFzeW5jIgogICAgICBbZm9jdXNlZFNvdXJjZUxpbmVTcGVjXT0iZm9jdXNlZFNvdXJjZUxpbmVTcGVjJCB8IGFzeW5jIgogICAgPjwvc291cmNlLWZpbGVzLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovClNvdXJjZUZpbGVzQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdG9yZSB9Cl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VGaWxlc0NvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNvdXJjZUZpbGVzQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VGaWxlc0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTb3VyY2VGaWxlc0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtZmlsZXMiXV0sIGRlY2xzOiAzLCB2YXJzOiA2LCBjb25zdHM6IFtbMywgImZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCIsICJmb2N1c2VkU291cmNlTGluZVNwZWMiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTb3VyY2VGaWxlc0NvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAic291cmNlLWZpbGVzLWNvbXBvbmVudCIsIDApOwogICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQiLCDJtcm1cGlwZUJpbmQxKDEsIDIsIGN0eC5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkKSkoImZvY3VzZWRTb3VyY2VMaW5lU3BlYyIsIMm1ybVwaXBlQmluZDEoMiwgNCwgY3R4LmZvY3VzZWRTb3VyY2VMaW5lU3BlYyQpKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW1NvdXJjZUZpbGVzQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc3RhY2tfdHJhY2Uvc3RhY2tfdHJhY2VfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNvbnN0IF9jMCRpID0gWyJzdGFja0ZyYW1lQXJyYXkiXTsKZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfM19zcGFuXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIiwgMTMpOwogICAgybXJtXRleHQoMSk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IGlmIChyZiAmIDIpIHsKICAgIGNvbnN0IGN0eF9yOSA9IMm1ybVuZXh0Q29udGV4dCgzKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAjIiwgY3R4X3I5LmV4ZWN1dGlvbkluZGV4LCAiOiAiKTsKfSB9CmZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzNfc3Bhbl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDE0KTsKICAgIMm1ybV0ZXh0KDEpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjEwID0gybXJtW5leHRDb250ZXh0KDMpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yMTAub3BUeXBlLCAiICIpOwp9IH0KZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgybXJtXRleHQoMSwgIiBFYWdlciBleGVjdXRpb24gIik7CiAgICDJtcm1dGVtcGxhdGUoMiwgU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfM19zcGFuXzJfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgMTEpOwogICAgybXJtXRlbXBsYXRlKDMsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzNfc3Bhbl8zX1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDEyKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3I2ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjYub3BUeXBlICE9PSBudWxsKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I2Lm9wVHlwZSAhPT0gbnVsbCk7Cn0gfQpmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X2Rpdl80X3NwYW5fMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxNik7CiAgICDJtcm1dGV4dCgxKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IxMSA9IMm1ybVuZXh0Q29udGV4dCgzKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiBcIiIsIGN0eF9yMTEub3BOYW1lLCAiXCIgIik7Cn0gfQpmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X2Rpdl80X3NwYW5fM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxNCk7CiAgICDJtcm1dGV4dCgxKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IxMiA9IMm1ybVuZXh0Q29udGV4dCgzKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHhfcjEyLm9wVHlwZSwgIiAiKTsKfSB9CmZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgIMm1ybV0ZXh0KDEsICIgQ3JlYXRpb24gb2YgZ3JhcGggb3AgIik7CiAgICDJtcm1dGVtcGxhdGUoMiwgU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfNF9zcGFuXzJfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgMTUpOwogICAgybXJtXRlbXBsYXRlKDMsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzRfc3Bhbl8zX1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDEyKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3I3ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjcub3BOYW1lICE9PSBudWxsKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I3Lm9wVHlwZSAhPT0gbnVsbCk7Cn0gfQpmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X3NwYW5fNl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxNyk7CiAgICDJtcm1dGV4dCgxKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3I4ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIChIb3N0IG5hbWU6ICIsIGN0eF9yOC5zdGFja0ZyYW1lc0ZvckRpc3BsYXlbMF0uaG9zdF9uYW1lLCAiKSAiKTsKfSB9CmZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iLCA4KTsKICAgIMm1ybV0ZW1wbGF0ZSgzLCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X2Rpdl8zX1RlbXBsYXRlLCA0LCAyLCAiZGl2IiwgOSk7CiAgICDJtcm1dGVtcGxhdGUoNCwgU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfNF9UZW1wbGF0ZSwgNCwgMiwgImRpdiIsIDkpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiKTsKICAgIMm1ybV0ZW1wbGF0ZSg2LCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X3NwYW5fNl9UZW1wbGF0ZSwgMiwgMSwgInNwYW4iLCAxMCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaCIsIGN0eF9yMC5jb2RlTG9jYXRpb25UeXBlKTsKICAgIMm1ybVhZHZhbmNlKDEpOwogICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCBjdHhfcjAuQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04pOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGN0eF9yMC5Db2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OKTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IwLnN0YWNrRnJhbWVzRm9yRGlzcGxheSAhPT0gbnVsbCAmJiBjdHhfcjAuc3RhY2tGcmFtZXNGb3JEaXNwbGF5Lmxlbmd0aCA+IDApOwp9IH0KZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTgpOwogICAgybXJtXRleHQoMSwgIiBDbGljayBhbiBlYWdlciBleGVjdXRpb24gb3IgZ3JhcGggb3AgdG8gc2hvdyBpdHMgb3JpZ2luYWwgc3RhY2sgdHJhY2UuICIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSB9CmZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzdfZGl2XzJfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAyOCk7CiAgICDJtcm1dGV4dCgxLCAiIFx1MjkxMyAiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gfQpjb25zdCBfYzEkYSA9IGZ1bmN0aW9uIChhMCwgYTEpIHsgcmV0dXJuIFthMCwgYTFdOyB9OwpmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl83X2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgY29uc3QgX3IxOSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjIpOwogICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMjMpOwogICAgybXJtXRleHQoMik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMjQpOwogICAgybXJtXRlbXBsYXRlKDQsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzdfZGl2XzJfZGl2XzRfVGVtcGxhdGUsIDIsIDAsICJkaXYiLCAyNSk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiLCAyNik7CiAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfN19kaXZfMl9UZW1wbGF0ZV9kaXZfY2xpY2tfNV9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTkpOyBjb25zdCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUgPSBjdHguJGltcGxpY2l0OyBjb25zdCBjdHhfcjE4ID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3IxOC5vblNvdXJjZUxpbmVDbGlja2VkLmVtaXQoc3RhY2tGcmFtZUZvckRpc3BsYXlfcjE1KTsgfSk7CiAgICDJtcm1dGV4dCg2KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiLCAyNyk7CiAgICDJtcm1dGV4dCg4KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKfSBpZiAocmYgJiAyKSB7CiAgICBjb25zdCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUgPSBjdHguJGltcGxpY2l0OwogICAgY29uc3QgY3R4X3IxNCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24yKDYsIF9jMSRhLCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUuYmVsb25nc1RvRm9jdXNlZEZpbGUgPyAiZm9jdXNlZC1maWxlIiA6ICIiLCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUuZm9jdXNlZCA/ICJmb2N1c2VkLXN0YWNrLWZyYW1lIiA6ICIiKSk7CiAgICDJtcm1YWR2YW5jZSgxKTsKICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJ0aXRsZSIsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5maWxlX3BhdGgpOwogICAgybXJtWFkdmFuY2UoMSk7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5jb25jaXNlX2ZpbGVfcGF0aCwgIiAiKTsKICAgIMm1ybVhZHZhbmNlKDIpOwogICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxNC5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSAmJiBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUuZm9jdXNlZCk7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgTGluZSAiLCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUubGluZW5vLCAiICIpOwogICAgybXJtWFkdmFuY2UoMik7CiAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5mdW5jdGlvbl9uYW1lLCAiICIpOwp9IH0KZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE5LCAyMCk7CiAgICDJtcm1dGVtcGxhdGUoMiwgU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfN19kaXZfMl9UZW1wbGF0ZSwgOSwgOSwgImRpdiIsIDIxKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0gaWYgKHJmICYgMikgewogICAgY29uc3QgY3R4X3IzID0gybXJtW5leHRDb250ZXh0KCk7CiAgICDJtcm1YWR2YW5jZSgyKTsKICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eF9yMy5zdGFja0ZyYW1lc0ZvckRpc3BsYXkpOwp9IH0KZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9uZ190ZW1wbGF0ZV84X1RlbXBsYXRlKHJmLCBjdHgpIHsgfQpjbGFzcyBTdGFja1RyYWNlQ29tcG9uZW50IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuc3RhY2tGcmFtZXNGb3JEaXNwbGF5ID0gbnVsbDsKICAgICAgICB0aGlzLm9uU291cmNlTGluZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgdGhpcy5Db2RlTG9jYXRpb25UeXBlID0gQ29kZUxvY2F0aW9uVHlwZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdBZnRlclZpZXdDaGVja2VkKCkgewogICAgICAgIGlmICh0aGlzLnN0YWNrRnJhbWVBcnJheSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YWNrRWxlbWVudCA9IHRoaXMuc3RhY2tGcmFtZUFycmF5Lm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvY3VzZWRGcmFtZUVsZW1lbnQgPSBzdGFja0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLmZvY3VzZWQtc3RhY2stZnJhbWVgKTsKICAgICAgICBpZiAoZm9jdXNlZEZyYW1lRWxlbWVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBTY3JvbGwgdGhlIGZvY3VzZWQgZnJhbWUgaW50byB2aWV3IHdoZW4gdGhlcmUgaXMgYSBmb2N1c2VkIGZyYW1lLgogICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudChzdGFja0VsZW1lbnQsIGZvY3VzZWRGcmFtZUVsZW1lbnQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsYXN0RnJhbWVFbGVtZW50ID0gc3RhY2tFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGFjay1mcmFtZS1jb250YWluZXI6bGFzdC1jaGlsZCcpOwogICAgICAgIGlmIChsYXN0RnJhbWVFbGVtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHN0YWNrRWxlbWVudCwgbGFzdEZyYW1lRWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2Nyb2xsVG9FbGVtZW50KHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpIHsKICAgICAgICBwYXJlbnRFbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wOwogICAgfQp9ClN0YWNrVHJhY2VDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzdGFjay10cmFjZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3N0YWNrX3RyYWNlX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3N0YWNrX3RyYWNlX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgfSxdIH0sCl07ClN0YWNrVHJhY2VDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICBjb2RlTG9jYXRpb25UeXBlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG9wVHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBvcE5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgZXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgc3RhY2tGcmFtZXNGb3JEaXNwbGF5OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG9uU291cmNlTGluZUNsaWNrZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgIHN0YWNrRnJhbWVBcnJheTogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3N0YWNrRnJhbWVBcnJheScsXSB9XQp9OwovKiogQG5vY29sbGFwc2UgKi8gU3RhY2tUcmFjZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RhY2tUcmFjZUNvbXBvbmVudCkoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIFN0YWNrVHJhY2VDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU3RhY2tUcmFjZUNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJzdGFjay10cmFjZS1jb21wb25lbnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMCRpLCB0cnVlKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIHZhciBfdDsKICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnN0YWNrRnJhbWVBcnJheSA9IF90LmZpcnN0KTsKICAgIH0gfSwgaW5wdXRzOiB7IGNvZGVMb2NhdGlvblR5cGU6ICJjb2RlTG9jYXRpb25UeXBlIiwgb3BUeXBlOiAib3BUeXBlIiwgb3BOYW1lOiAib3BOYW1lIiwgZXhlY3V0aW9uSW5kZXg6ICJleGVjdXRpb25JbmRleCIsIHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOiAic3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUiLCBzdGFja0ZyYW1lc0ZvckRpc3BsYXk6ICJzdGFja0ZyYW1lc0ZvckRpc3BsYXkiIH0sIG91dHB1dHM6IHsgb25Tb3VyY2VMaW5lQ2xpY2tlZDogIm9uU291cmNlTGluZUNsaWNrZWQiIH0sIGRlY2xzOiAxMCwgdmFyczogNCwgY29uc3RzOiBbWzEsICJzdGFjay10cmFjZS1jb250YWluZXIiXSwgWzEsICJzdGFjay10cmFjZS1oZWFkZXIiXSwgWzEsICJzdGFjay10cmFjZS10aXRsZSJdLCBbImNsYXNzIiwgInN0YWNrLXRyYWNlLWF1eC1pbmZvIiwgNCwgIm5nSWYiLCAibmdJZkVsc2UiXSwgWyJub1N0YWNrVHJhY2UiLCAiIl0sIFsiY2xhc3MiLCAic3RhY2stZnJhbWUtYXJyYXkiLCA0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImxvYWRpbmdTZWN0aW9uIiwgIiJdLCBbMSwgInN0YWNrLXRyYWNlLWF1eC1pbmZvIl0sIFsxLCAiY29kZS1sb2NhdGlvbi1vcmlnaW4iLCAzLCAibmdTd2l0Y2giXSwgWzQsICJuZ1N3aXRjaENhc2UiXSwgWyJjbGFzcyIsICJzdGFjay10cmFjZS1ob3N0LW5hbWUiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImVhZ2VyLWV4ZWN1dGlvbi1pbmRleCIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAib3AtdHlwZSIsIDQsICJuZ0lmIl0sIFsxLCAiZWFnZXItZXhlY3V0aW9uLWluZGV4Il0sIFsxLCAib3AtdHlwZSJdLCBbImNsYXNzIiwgIm9wLW5hbWUiLCA0LCAibmdJZiJdLCBbMSwgIm9wLW5hbWUiXSwgWzEsICJzdGFjay10cmFjZS1ob3N0LW5hbWUiXSwgWzEsICJzdGFjay10cmFjZS1hdXgtaW5mbyIsICJuby1zdGFjay10cmFjZSJdLCBbMSwgInN0YWNrLWZyYW1lLWFycmF5Il0sIFsic3RhY2tGcmFtZUFycmF5IiwgIiJdLCBbImNsYXNzIiwgInN0YWNrLWZyYW1lLWNvbnRhaW5lciIsIDMsICJuZ0NsYXNzIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJzdGFjay1mcmFtZS1jb250YWluZXIiLCAzLCAibmdDbGFzcyJdLCBbMSwgInN0YWNrLWZyYW1lLWZpbGUtcGF0aCIsIDMsICJ0aXRsZSJdLCBbMSwgInN0YWNrLWZyYW1lLWxpbmVuby1mdW5jdGlvbiJdLCBbImNsYXNzIiwgInN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yIiwgInRpdGxlIiwgIlN0aWNraW5nIHRvIHRoZSBib3R0b21tb3N0IGZyYW1lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdoZW4gbmF2aWdhdGluZyBleGVjdXRpb25zIGFuZCBncmFwaCBvcHMuIFRvIHJlbW92ZSB0aGlzIHN0aWNraW5nLCBjbGljayBhbnkgbm9uLWJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUuIiwgNCwgIm5nSWYiXSwgWzEsICJzdGFjay1mcmFtZS1saW5lbm8iLCAzLCAiY2xpY2siXSwgWzEsICJzdGFjay1mcmFtZS1mdW5jdGlvbiJdLCBbInRpdGxlIiwgIlN0aWNraW5nIHRvIHRoZSBib3R0b21tb3N0IGZyYW1lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdoZW4gbmF2aWdhdGluZyBleGVjdXRpb25zIGFuZCBncmFwaCBvcHMuIFRvIHJlbW92ZSB0aGlzIHN0aWNraW5nLCBjbGljayBhbnkgbm9uLWJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUuIiwgMSwgInN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJzcGFuIiwgMik7CiAgICAgICAgybXJtXRleHQoMywgIiBTdGFjayBUcmFjZSAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCA3LCA0LCAiZGl2IiwgMyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDUsIFN0YWNrVHJhY2VDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZSwgMiwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNCwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg3LCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl83X1RlbXBsYXRlLCAzLCAxLCAiZGl2IiwgNSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDgsIFN0YWNrVHJhY2VDb21wb25lbnRfbmdfdGVtcGxhdGVfOF9UZW1wbGF0ZSwgMCwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNiwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgX3IxID0gybXJtXJlZmVyZW5jZSg2KTsKICAgICAgICBjb25zdCBfcjQgPSDJtcm1cmVmZXJlbmNlKDkpOwogICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5jb2RlTG9jYXRpb25UeXBlICE9PSBudWxsKSgibmdJZkVsc2UiLCBfcjEpOwogICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkgIT09IG51bGwpKCJuZ0lmRWxzZSIsIF9yNCk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBOZ0Zvck9mLCBOZ0NsYXNzXSwgc3R5bGVzOiBbIi5mb2N1c2VkLWZpbGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5mb2N1c2VkLXN0YWNrLWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAxMTEsIDAsIDAuMyk7XG59XG5cbi5uby1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBjb2xvcjogIzgwODA4MDtcbn1cblxuLm9wLW5hbWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd29yZC13cmFwOiBhbnl3aGVyZTtcbn1cblxuLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGhlaWdodDogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIHBhZGRpbmc6IDFweCAzcHg7XG4gIHdpZHRoOiBtYXgtY29udGVudDtcbn1cblxuLnN0YWNrLWZyYW1lLWFycmF5W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA4cHgpO1xufVxuXG4uc3RhY2stZnJhbWUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYTBhMGEwO1xufVxuXG4uc3RhY2stZnJhbWUtZmlsZS1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIG1heC13aWR0aDogMTgwcHg7XG4gIHdpZHRoOiAxODBweDtcbn1cblxuLnN0YWNrLWZyYW1lLWxpbmVuby1mdW5jdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnN0YWNrLWZyYW1lLWZ1bmN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICB3aWR0aDogMjAwcHg7XG4gIHdvcmQtd3JhcDogYW55d2hlcmU7XG59XG5cbi5zdGFjay1mcmFtZS1saW5lbm9bX25nY29udGVudC0lQ09NUCVdIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogODBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIHdpZHRoOiA4MHB4O1xufVxuXG4uc3RhY2stdHJhY2UtYXV4LWluZm9bX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbiAgcGFkZGluZy1sZWZ0OiAyNHB4O1xufVxuXG4uc3RhY2stdHJhY2UtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW4tbGVmdDogOHB4O1xuICBtYXgtaGVpZ2h0OiAzNjBweDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBvdmVyZmxvdy15OiBoaWRkZW47XG4gIHBhZGRpbmctbGVmdDogOHB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuLnN0YWNrLXRyYWNlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3gtc2hhZG93OiAwIDVweCAzcHggLTNweCAjY2NjO1xuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xufVxuLnN0YWNrLXRyYWNlLWhvc3QtbmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBjb2xvcjogIzgwODA4MDtcbn1cblxuLnN0YWNrLXRyYWNlLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uc3RpY2stdG8tYm90dG9tbW9zdC1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG59Il0gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zdGFja190cmFjZS9zdGFja190cmFjZV9jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgU3RhY2tUcmFjZUNvbnRhaW5lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqLwogICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgdGhpcy5jb2RlTG9jYXRpb25UeXBlJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Q29kZUxvY2F0aW9uT3JpZ2luLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW5JbmZvCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob3JpZ2luSW5mbykgPT4gewogICAgICAgICAgICByZXR1cm4gb3JpZ2luSW5mbyA9PT0gbnVsbCA/IG51bGwgOiBvcmlnaW5JbmZvLmNvZGVMb2NhdGlvblR5cGU7CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5vcFR5cGUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXRDb2RlTG9jYXRpb25PcmlnaW4sICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbkluZm8KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChvcmlnaW5JbmZvKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5JbmZvID09PSBudWxsID8gbnVsbCA6IG9yaWdpbkluZm8ub3BUeXBlOwogICAgICAgIH0pKSkpOwogICAgICAgIHRoaXMub3BOYW1lJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Q29kZUxvY2F0aW9uT3JpZ2luLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW5JbmZvCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob3JpZ2luSW5mbykgPT4gewogICAgICAgICAgICBpZiAob3JpZ2luSW5mbyA9PT0gbnVsbCB8fAogICAgICAgICAgICAgICAgb3JpZ2luSW5mby5jb2RlTG9jYXRpb25UeXBlICE9PSBDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3JpZ2luSW5mby5vcE5hbWU7CiAgICAgICAgfSkpKSk7CiAgICAgICAgdGhpcy5leGVjdXRpb25JbmRleCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldENvZGVMb2NhdGlvbk9yaWdpbiwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luSW5mbwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG9yaWdpbkluZm8pID0+IHsKICAgICAgICAgICAgaWYgKG9yaWdpbkluZm8gPT09IG51bGwgfHwKICAgICAgICAgICAgICAgIG9yaWdpbkluZm8uY29kZUxvY2F0aW9uVHlwZSAhPT0gQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04pIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5JbmZvLmV4ZWN1dGlvbkluZGV4OwogICAgICAgIH0pKSkpOwogICAgICAgIHRoaXMuc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRTdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSkpOwogICAgICAgIHRoaXMuc3RhY2tGcmFtZXNGb3JEaXNwbGF5JCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Rm9jdXNlZFN0YWNrRnJhbWVzLCBnZXRGb2N1c2VkU291cmNlTGluZVNwZWMsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVzCiAgICAgICAgICogQHBhcmFtIHs/fSBmb2N1c2VkU291cmNlTGluZVNwZWMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzdGFja0ZyYW1lcywgZm9jdXNlZFNvdXJjZUxpbmVTcGVjKSA9PiB7CiAgICAgICAgICAgIGlmIChzdGFja0ZyYW1lcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgICAgICAgICAgLy8gQ29ycmVjdGx5IGxhYmVsIGFsbCB0aGUgc3RhY2sgZnJhbWVzIGZvciBkaXNwbGF5LgogICAgICAgICAgICBmb3IgKGNvbnN0IHN0YWNrRnJhbWUgb2Ygc3RhY2tGcmFtZXMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgaG9zdF9uYW1lLCBmaWxlX3BhdGgsIGxpbmVubywgZnVuY3Rpb25fbmFtZSB9ID0gc3RhY2tGcmFtZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhJdGVtcyA9IGZpbGVfcGF0aC5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29uY2lzZV9maWxlX3BhdGggPSBwYXRoSXRlbXNbcGF0aEl0ZW1zLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVsb25nc1RvRm9jdXNlZEZpbGUgPSBmb2N1c2VkU291cmNlTGluZVNwZWMgIT09IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICBob3N0X25hbWUgPT09IGZvY3VzZWRTb3VyY2VMaW5lU3BlYy5ob3N0X25hbWUgJiYKICAgICAgICAgICAgICAgICAgICBmaWxlX3BhdGggPT09IGZvY3VzZWRTb3VyY2VMaW5lU3BlYy5maWxlX3BhdGg7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkID0gYmVsb25nc1RvRm9jdXNlZEZpbGUgJiYgbGluZW5vID09PSAoLyoqIEB0eXBlIHs/fSAqLyAoZm9jdXNlZFNvdXJjZUxpbmVTcGVjKSkubGluZW5vOwogICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goewogICAgICAgICAgICAgICAgICAgIGhvc3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICBmaWxlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgY29uY2lzZV9maWxlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgbGluZW5vLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsCiAgICAgICAgICAgICAgICAgICAgYmVsb25nc1RvRm9jdXNlZEZpbGUsCiAgICAgICAgICAgICAgICAgICAgZm9jdXNlZCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgfSkpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Tb3VyY2VMaW5lQ2xpY2tlZChhcmdzKSB7CiAgICAgICAgY29uc3QgeyBob3N0X25hbWUsIGZpbGVfcGF0aCwgbGluZW5vLCBmdW5jdGlvbl9uYW1lIH0gPSBhcmdzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFja0ZyYW1lID0geyBob3N0X25hbWUsIGZpbGVfcGF0aCwgbGluZW5vLCBmdW5jdGlvbl9uYW1lIH07CiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzb3VyY2VMaW5lRm9jdXNlZCh7IHN0YWNrRnJhbWUgfSkpOwogICAgfQp9ClN0YWNrVHJhY2VDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZScsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHN0YWNrLXRyYWNlLWNvbXBvbmVudAogICAgICBbY29kZUxvY2F0aW9uVHlwZV09ImNvZGVMb2NhdGlvblR5cGUkIHwgYXN5bmMiCiAgICAgIFtvcFR5cGVdPSJvcFR5cGUkIHwgYXN5bmMiCiAgICAgIFtvcE5hbWVdPSJvcE5hbWUkIHwgYXN5bmMiCiAgICAgIFtleGVjdXRpb25JbmRleF09ImV4ZWN1dGlvbkluZGV4JCB8IGFzeW5jIgogICAgICBbc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGVdPSIKICAgICAgICBzdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSQgfCBhc3luYwogICAgICAiCiAgICAgIFtzdGFja0ZyYW1lc0ZvckRpc3BsYXldPSJzdGFja0ZyYW1lc0ZvckRpc3BsYXkkIHwgYXN5bmMiCiAgICAgIChvblNvdXJjZUxpbmVDbGlja2VkKT0ib25Tb3VyY2VMaW5lQ2xpY2tlZCgkZXZlbnQpIgogICAgPjwvc3RhY2stdHJhY2UtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8KU3RhY2tUcmFjZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gU3RhY2tUcmFjZUNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFN0YWNrVHJhY2VDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RhY2tUcmFjZUNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gU3RhY2tUcmFjZUNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTdGFja1RyYWNlQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRmLWRlYnVnZ2VyLXYyLXN0YWNrLXRyYWNlIl1dLCBkZWNsczogNywgdmFyczogMTgsIGNvbnN0czogW1szLCAiY29kZUxvY2F0aW9uVHlwZSIsICJvcFR5cGUiLCAib3BOYW1lIiwgImV4ZWN1dGlvbkluZGV4IiwgInN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlIiwgInN0YWNrRnJhbWVzRm9yRGlzcGxheSIsICJvblNvdXJjZUxpbmVDbGlja2VkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU3RhY2tUcmFjZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzdGFjay10cmFjZS1jb21wb25lbnQiLCAwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uU291cmNlTGluZUNsaWNrZWQiLCBmdW5jdGlvbiBTdGFja1RyYWNlQ29udGFpbmVyX1RlbXBsYXRlX3N0YWNrX3RyYWNlX2NvbXBvbmVudF9vblNvdXJjZUxpbmVDbGlja2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25Tb3VyY2VMaW5lQ2xpY2tlZCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICDJtcm1cGlwZSg2LCAiYXN5bmMiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJjb2RlTG9jYXRpb25UeXBlIiwgybXJtXBpcGVCaW5kMSgxLCA2LCBjdHguY29kZUxvY2F0aW9uVHlwZSQpKSgib3BUeXBlIiwgybXJtXBpcGVCaW5kMSgyLCA4LCBjdHgub3BUeXBlJCkpKCJvcE5hbWUiLCDJtcm1cGlwZUJpbmQxKDMsIDEwLCBjdHgub3BOYW1lJCkpKCJleGVjdXRpb25JbmRleCIsIMm1ybVwaXBlQmluZDEoNCwgMTIsIGN0eC5leGVjdXRpb25JbmRleCQpKSgic3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUiLCDJtcm1cGlwZUJpbmQxKDUsIDE0LCBjdHguc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkKSkoInN0YWNrRnJhbWVzRm9yRGlzcGxheSIsIMm1ybVwaXBlQmluZDEoNiwgMTYsIGN0eC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkkKSk7CiAgICB9IH0sIGRpcmVjdGl2ZXM6IFtTdGFja1RyYWNlQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vZGVidWdnZXJfY29tcG9uZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmZ1bmN0aW9uIERlYnVnZ2VyQ29tcG9uZW50X3RmX2RlYnVnZ2VyX3YyX2luYWN0aXZlXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudCgwLCAidGYtZGVidWdnZXItdjItaW5hY3RpdmUiKTsKfSB9CmZ1bmN0aW9uIERlYnVnZ2VyQ29tcG9uZW50X25nX3RlbXBsYXRlXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAzKTsKICAgIMm1ybVlbGVtZW50KDEsICJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDQpOwogICAgybXJtWVsZW1lbnQoMywgInRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lIik7CiAgICDJtcm1ZWxlbWVudCg0LCAidGYtZGVidWdnZXItdjItZ3JhcGgiKTsKICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICDJtcm1ZWxlbWVudCg1LCAidGYtZGVidWdnZXItdjItZ3JhcGgtZXhlY3V0aW9ucyIpOwogICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImRpdiIsIDUpOwogICAgybXJtWVsZW1lbnQoNywgInRmLWRlYnVnZ2VyLXYyLXNvdXJjZS1maWxlcyIpOwogICAgybXJtWVsZW1lbnQoOCwgInRmLWRlYnVnZ2VyLXYyLXN0YWNrLXRyYWNlIik7CiAgICDJtcm1ZWxlbWVudEVuZCgpOwp9IH0KY2xhc3MgRGVidWdnZXJDb21wb25lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5ydW5zID0ge307CiAgICAgICAgdGhpcy5ydW5JZHMgPSBbXTsKICAgICAgICB0aGlzLmFjdGl2ZVJ1bklkID0gbnVsbDsKICAgIH0KfQpEZWJ1Z2dlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnZ2VyLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vZGVidWdnZXJfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vZGVidWdnZXJfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgIH0sXSB9LApdOwpEZWJ1Z2dlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIHJ1bnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgcnVuSWRzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIGFjdGl2ZVJ1bklkOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdnZXJDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBEZWJ1Z2dlckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z2dlckNvbXBvbmVudCkoKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnZ2VyQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnZ2VyLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IHJ1bnM6ICJydW5zIiwgcnVuSWRzOiAicnVuSWRzIiwgYWN0aXZlUnVuSWQ6ICJhY3RpdmVSdW5JZCIgfSwgZGVjbHM6IDQsIHZhcnM6IDIsIGNvbnN0czogW1sxLCAiZGVidWdnZXItY29udGFpbmVyIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImRhdGFBdmFpbGFibGUiLCAiIl0sIFsxLCAidG9wLXNlY3Rpb24iXSwgWzEsICJ0b3AtY2VudGVyLXNlY3Rpb24iXSwgWzEsICJib3R0b20tc2VjdGlvbiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIERlYnVnZ2VyQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBEZWJ1Z2dlckNvbXBvbmVudF90Zl9kZWJ1Z2dlcl92Ml9pbmFjdGl2ZV8xX1RlbXBsYXRlLCAxLCAwLCAidGYtZGVidWdnZXItdjItaW5hY3RpdmUiLCAxKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgRGVidWdnZXJDb21wb25lbnRfbmdfdGVtcGxhdGVfMl9UZW1wbGF0ZSwgOSwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgMiwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgX3IxID0gybXJtXJlZmVyZW5jZSgzKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucnVuSWRzLmxlbmd0aCA9PT0gMCkoIm5nSWZFbHNlIiwgX3IxKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIEluYWN0aXZlQ29udGFpbmVyLCBBbGVydHNDb250YWluZXIsIFRpbWVsaW5lQ29udGFpbmVyLCBHcmFwaENvbnRhaW5lciwgR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyLCBTb3VyY2VGaWxlc0NvbnRhaW5lciwgU3RhY2tUcmFjZUNvbnRhaW5lcl0sIHN0eWxlczogWyIuYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZ3JvdzogMTtcbiAgaGVpZ2h0OiAzNCU7XG4gIHBhZGRpbmctdG9wOiA2cHg7XG59XG5cbi5kZWJ1Z2dlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udG9wLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1ncm93OiAxO1xuICBoZWlnaHQ6IDY2JTtcbiAgcGFkZGluZzogNnB4IDA7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogMTBweDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgd2lkdGg6IGNhbGMoMTUlIC0gMTFweCk7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmbGV4LWdyb3c6IDE7XG4gIG1pbi13aWR0aDogNTQwcHg7XG4gIHdpZHRoOiA1NDBweDtcbn1cblxudGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogNzAlO1xufVxuXG50Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZsZXgtZ3JvdzogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4td2lkdGg6IDU0MHB4O1xuICB3aWR0aDogNTQwcHg7XG59XG5cbi50b3AtY2VudGVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBvdmVyZmxvdzogYXV0bztcbiAgd2lkdGg6IDU1JTtcbn1cblxudGYtZGVidWdnZXItdjItdGltZWxpbmVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLWdyYXBoW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogNXB4O1xufSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9kZWJ1Z2dlcl9jb250YWluZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgRGVidWdnZXJDb250YWluZXIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgIHRoaXMucnVucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldERlYnVnZ2VyUnVuTGlzdGluZykpOwogICAgICAgIHRoaXMucnVuc0lkcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldERlYnVnZ2VyUnVuTGlzdGluZywgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcnVucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJ1bnMpID0+IE9iamVjdC5rZXlzKHJ1bnMpKSkpKTsKICAgICAgICB0aGlzLmFjdGl2ZVJ1bklkJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0QWN0aXZlUnVuSWQpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkluaXQoKSB7CiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChkZWJ1Z2dlckxvYWRlZCgpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChkZWJ1Z2dlclVubG9hZGVkKCkpOwogICAgfQp9CkRlYnVnZ2VyQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGYtZGVidWdnZXItdjInLAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxkZWJ1Z2dlci1jb21wb25lbnQKICAgICAgW3J1bnNdPSJydW5zJCB8IGFzeW5jIgogICAgICBbcnVuSWRzXT0icnVuc0lkcyQgfCBhc3luYyIKICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiCiAgICA+PC9kZWJ1Z2dlci1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpEZWJ1Z2dlckNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RvcmUgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdnZXJDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBEZWJ1Z2dlckNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z2dlckNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdnZXJDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogRGVidWdnZXJDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjIiXV0sIGRlY2xzOiA0LCB2YXJzOiA5LCBjb25zdHM6IFtbMywgInJ1bnMiLCAicnVuSWRzIiwgImFjdGl2ZVJ1bklkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdnZXJDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgImRlYnVnZ2VyLWNvbXBvbmVudCIsIDApOwogICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtXByb3BlcnR5KCJydW5zIiwgybXJtXBpcGVCaW5kMSgxLCAzLCBjdHgucnVucyQpKSgicnVuSWRzIiwgybXJtXBpcGVCaW5kMSgyLCA1LCBjdHgucnVuc0lkcyQpKSgiYWN0aXZlUnVuSWQiLCDJtcm1cGlwZUJpbmQxKDMsIDcsIGN0eC5hY3RpdmVSdW5JZCQpKTsKICAgIH0gfSwgZGlyZWN0aXZlczogW0RlYnVnZ2VyQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vZWZmZWN0cy9kZWJ1Z2dlcl9lZmZlY3RzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIE1pbmltdW0gcG9sbGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTUlOX1BPTExJTkdfSU5URVJWQUxfTVMgPSAyZTM7Ci8vIE1heGltdW0gcG9sbGluZyBpbnRlcnZhbCBpbiBtaWxpc2Vjb25kcy4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBNQVhfUE9MTElOR19JTlRFUlZBTF9NUyA9IDYwZTM7Ci8vIEJhY2tvZmYgYmVoYXZpb3IgdGFrZXMgZWZmZWN0IHdoZW4gdGltZSBzaW5jZSB0aGUgZWxhcHNlZCB0aW1lIGJldHdlZW4gdGhlCi8vIG1vc3QgcmVjZW50IGFycml2YWwgb2YgbmV3IHBvbGxpbmcgcmVzdWx0IGFuZCB0aGUgbW9zdCByZWNlbnQgcG9sbGluZyBldmVudAovLyBleGNlZWRzIGBwb2xsaW5nQmFja29mZkZhY3RvciAqIG1pbmltdW1Qb2xsaW5nSW50ZXJ2YWxgLgovKiogQHR5cGUgez99ICovCmNvbnN0IFBPTExJTkdfQkFDS09GRl9GQUNUT1IgPSAyOwovKioKICogQ29tcHV0ZXMgdGhlIGN1cnJlbnQgcG9sbGluZyBpbnRlcnZhbCBiYXNlZCBvbiB0aGUgdGltZSBsYXBzZWQgc2luY2UKICogbGFzdCBuZXcgcG9sbGluZyBkYXRhIGFuZCB0aGUgbGFzdCBwb2xsaW5nIGV2ZW50LgogKgogKiBUaGlzIHNwZWNpZmllcyBhIGJhY2tvZmYgYmVoYXZpb3Igd2hlcmUgYSBsb25nZXIgcGVyaW9kIG9mIG5vIG5ldyBkYXRhCiAqIGxlYWRzIHRvIGEgbG9uZ2VyIHBvbGxpbmcgaW50ZXJ2YWwsIHdpdGggYSBjZWlsaW5nIGFzIHRoZSBsaW1pdC4KICoKICogQHBhcmFtIHs/fSBwb2xsU2lsZW5jZVRpbWUgVGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gdGhlIG1vc3QKICogICByZWNlbnQgYXJyaXZhbCBvZiBuZXcgcG9sbGluZyByZXN1bHQgYW5kIHRoZSBsYXN0IHBvbGxpbmcgZXZlbnQuCiAqIEByZXR1cm4gez99IFRoZSBjdXJyZW50IHBvbGxpbmcgaW50ZXJ2YWwsIGkuZS4sIGxvdyBib3VuZCBmb3IgdGhlIHRpbWUgYmV0d2VlbgogKiAgIHRoZSBsYXN0IHBvbGxpbmcgZXZlbnQgYW5kIHRoZSBuZXh0IG9uZS4KICovCmZ1bmN0aW9uIGdldEN1cnJlbnRQb2xsaW5nSW50ZXJ2YWwocG9sbFNpbGVuY2VUaW1lKSB7CiAgICBpZiAocG9sbFNpbGVuY2VUaW1lID4gTUFYX1BPTExJTkdfSU5URVJWQUxfTVMpIHsKICAgICAgICByZXR1cm4gTUFYX1BPTExJTkdfSU5URVJWQUxfTVM7CiAgICB9CiAgICBlbHNlIGlmIChwb2xsU2lsZW5jZVRpbWUgPgogICAgICAgIE1JTl9QT0xMSU5HX0lOVEVSVkFMX01TICogUE9MTElOR19CQUNLT0ZGX0ZBQ1RPUikgewogICAgICAgIHJldHVybiBwb2xsU2lsZW5jZVRpbWU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gTUlOX1BPTExJTkdfSU5URVJWQUxfTVM7CiAgICB9Cn0KLyoqCiAqIEdldHRpbmcgcGFnZSBpbmRpY2VzIHRoYXQgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZGF0YSBhbmQgaGVuY2UgbmVlZCB0byBiZQogKiByZXF1ZXN0ZWQuCiAqCiAqIEBwYXJhbSB7P30gYmVnaW4gQmVnaW5uaW5nIGl0ZW0gaW5kZXggKGluY2x1c2l2ZSkuCiAqIEBwYXJhbSB7P30gZW5kIEVuZGluZyBpdGVtIGluZGV4IChleGNsdXNpdmUpLgogKiBAcGFyYW0gez99IHBhZ2VTaXplIFNpemUgb2YgZWFjaCBwYWdlLCBpLmUuLCBob3cgbWFueSBpdGVtcyB0aGVyZSBhcmUgaW4gZWFjaAogKiAgIGNvbXBsZXRlIHBhZ2UuIFRoaXMgbXVzdCBiZSBgPj0gZW5kIC0gYmVnaW5gLCBvciBhbiBFcnJvciB3aWxsIGJlCiAqICAgdGhyb3duLgogKiBAcGFyYW0gez99IG51bUl0ZW1zCiAqIEBwYXJhbSB7P30gcGFnZUxvYWRlZFNpemVzIEEgbWFwIGZyb20gcGFnZSBpbmRleCB0byBob3cgbWFueSBpdGVtcyBoYXZlIGJlZW4KICogICBsb2FkZWQgZm9yIHRoYXQgcGFnZSBzbyBmYXIuCiAqIEByZXR1cm4gez99IEFuIGFycmF5IG9mIHRoZSBwYWdlIGluZGljZXMgdGhhdCBhcmUgY3VycmVudGx5IG1pc3NpbmcgYW5kIGhlbmNlCiAqICAgc2hvdWxkIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHNvdXJjZS4KICovCmZ1bmN0aW9uIGdldE1pc3NpbmdQYWdlcyhiZWdpbiwgZW5kLCBwYWdlU2l6ZSwgbnVtSXRlbXMsIHBhZ2VMb2FkZWRTaXplcykgewogICAgaWYgKHBhZ2VTaXplIDw9IDAgfHwgIU51bWJlci5pc0ludGVnZXIocGFnZVNpemUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhZ2VTaXplOiAke3BhZ2VTaXplfWApOwogICAgfQogICAgaWYgKGVuZCA+IG51bUl0ZW1zKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbmQgaW5kZXggKCR7ZW5kfSkgZXhjZWVkcyB0b3RhbCBudW1iZXIgb2YgaXRlbXMgKCR7bnVtSXRlbXN9KWApOwogICAgfQogICAgaWYgKGVuZCAtIGJlZ2luID4gcGFnZVNpemUpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JlZ2luLWVuZCBzcGFuIGV4Y2VlZHMgcGFnZSBzaXplLCB3aGljaCBpcyBub3QgYWxsb3dlZCcpOwogICAgfQogICAgLy8gVGhlIGNvbnN0cmFpbnQgdGhhdCBgZW5kIC0gYmVnaW4gPD0gcGFnZWAgZ3VhcmFudGVlcyB0aGF0IGF0IG1vc3Qgb25seSB0d28KICAgIC8vIHBhZ2VzIG5lZWQgdG8gYmUgcmVxdWVzdGVkLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWlzc2luZ1BhZ2VzID0gW107CiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBmaXJzdCBvZiB0aGUgdHdvIHBvc3NpYmxlIHBhZ2VzIG5lZWRzIHRvIGJlIHJlcXVlc3RlZC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpcnN0UGFnZUluZGV4ID0gTWF0aC5mbG9vcihiZWdpbiAvIHBhZ2VTaXplKTsKICAgIGlmICghKGZpcnN0UGFnZUluZGV4IGluIHBhZ2VMb2FkZWRTaXplcykgfHwKICAgICAgICAocGFnZUxvYWRlZFNpemVzW2ZpcnN0UGFnZUluZGV4XSA8IHBhZ2VTaXplICYmCiAgICAgICAgICAgIGZpcnN0UGFnZUluZGV4ICogcGFnZVNpemUgKyBwYWdlTG9hZGVkU2l6ZXNbZmlyc3RQYWdlSW5kZXhdIDwgbnVtSXRlbXMpKSB7CiAgICAgICAgbWlzc2luZ1BhZ2VzLnB1c2goZmlyc3RQYWdlSW5kZXgpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2Vjb25kUGFnZUluZGV4ID0gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyBwYWdlU2l6ZSk7CiAgICBpZiAoc2Vjb25kUGFnZUluZGV4ICE9PSBmaXJzdFBhZ2VJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbnlEaWdlc3RNaXNzaW5nMSA9ICEoc2Vjb25kUGFnZUluZGV4IGluIHBhZ2VMb2FkZWRTaXplcykgfHwKICAgICAgICAgICAgKHNlY29uZFBhZ2VJbmRleCAqIHBhZ2VTaXplICsgcGFnZUxvYWRlZFNpemVzW3NlY29uZFBhZ2VJbmRleF0gPCBlbmQgJiYKICAgICAgICAgICAgICAgIGVuZCA8IG51bUl0ZW1zKTsKICAgICAgICBpZiAoYW55RGlnZXN0TWlzc2luZzEpIHsKICAgICAgICAgICAgbWlzc2luZ1BhZ2VzLnB1c2goc2Vjb25kUGFnZUluZGV4KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWlzc2luZ1BhZ2VzOwp9Ci8qKgogKiBSZXBlYXQgYW4gaW5wdXQgc3RyZWFtIGF0IGdpdmVuIGludGVydmFscy4KICogQHBhcmFtIHs/fSBzdHJlYW0kIFRoZSBzdHJlYW0gdG8gcmVwZWF0LgogKiBAcGFyYW0gez99IHBvbGxpbmdJbnRlcnZhbFN0cmVhbSQgVGhlIHN0cmVhbSBvZiBwb2xsaW5nIGludGVydmFscy4KICogICBUaGUgbGF0ZXN0IHZhbHVlIG9mIHRoaXMgc3RyZWFtIHdpbGwgYmUgdXNlZCBhcyB0aGUgaW50ZXJ2YWwgYmV0d2VlbgogKiAgIHRoZSBwcmV2aW91cyByZXBlYXQgYW5kIHRoZSBuZXh0IG9uZS4KICogQHBhcmFtIHs/fSB0ZXJtaW5hdGlvblN0cmVhbSQgVGVybWluYXRlIHRoZSByZXBlYXQgb24gdmFsdWVzIGZyb20gdGhpcyBzdHJlYW0uCiAqIEByZXR1cm4gez99IFN0cmVhbSB3aXRoIHRoZSB0aW1lZCByZXBlYXRzLgogKi8KZnVuY3Rpb24gY3JlYXRlVGltZWRSZXBlYXRlcihzdHJlYW0kLCBwb2xsaW5nSW50ZXJ2YWxTdHJlYW0kLCB0ZXJtaW5hdGlvblN0cmVhbSQpIHsKICAgIHJldHVybiBzdHJlYW0kLnBpcGUocmVwZWF0V2hlbigoLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBsZXRlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGNvbXBsZXRlZCkgPT4gY29tcGxldGVkLnBpcGUod2l0aExhdGVzdEZyb20ocG9sbGluZ0ludGVydmFsU3RyZWFtJCksIGRlbGF5V2hlbigoLyoqCiAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKFssIHBvbGxpbmdJbnRlcnZhbF0pID0+IHsKICAgICAgICByZXR1cm4gdGltZXIocG9sbGluZ0ludGVydmFsKTsKICAgIH0pKSkpKSwgdGFrZVVudGlsKHRlcm1pbmF0aW9uU3RyZWFtJCksIG1hcCgoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB2b2lkIG51bGwpKSk7Cn0KY2xhc3MgRGVidWdnZXJFZmZlY3RzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhY3Rpb25zJAogICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICogQHBhcmFtIHs/fSBkYXRhU291cmNlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGFjdGlvbnMkLCBzdG9yZSwgZGF0YVNvdXJjZSkgewogICAgICAgIHRoaXMuYWN0aW9ucyQgPSBhY3Rpb25zJDsKICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTsKICAgICAgICAvKioKICAgICAgICAgKiB2aWV3IGxvYWQgYW5kIHN1YnNlcXVlbnQKICAgICAgICAgKiBiYWNrb2ZmIHBvbGxzLCBhdXRvIGFuZAogICAgICAgICAqIG1hbnVhbCByZWxvYWQgZXZlbnRzCiAgICAgICAgICogIHwKICAgICAgICAgKiAgKz4gZmV0Y2ggcnVuLSs+IGZldGNoIHNvdXJjZS1maWxlIGxpc3QKICAgICAgICAgKiAgfCAgICAgICAgICAgICs+IGZldGNoIG51bSBvZiB0b3AtbGV2ZWwgKGVhZ2VyKSBleGVjdXRpb25zCiAgICAgICAgICogIHwgICAgICAgICAgICArPiBmZXRjaCBudW0gb2YgaW50cmEtZ3JhcGggZXhlY3V0aW9ucwogICAgICAgICAqICB8ICAgICAgICAgICAgKz4gZmV0Y2ggbnVtIGFsZXJ0cwogICAgICAgICAqICB8ICAgICAgICAgICAgICAgICsKICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICArPiBpZiBpbml0IGxvYWQgYW5kIG5vbi16ZXJvIG51bWJlciBvZiBleGVjcwogICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICArCiAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICs+Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAqICB8ICBvbiB0b3AtbGV2ZWwgICAgICB8IHwgZmV0Y2ggdG9wLWxldmVsIGV4ZWMgZGlnZXN0IHwKICAgICAgICAgKiAgfCAgc2Nyb2xsIC0tLS0tLS0tLS0tKz4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rPC0tLS0tLS0tKwogICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICs+Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgIHwKICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICB8IGZldGNoIGV4ZWMgZGF0YSBhbmQgc3RhY2sgZnJhbWVzIHwgICAgfAogICAgICAgICAqICB8ICBvbiBmb2N1cyAgKy0tLS0tLS0tPistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICB8CiAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICogICstLS0tLS0+KyBmZXRjaCBhbGVydCBudW1iZXIgYW5kIGJyZWFrZG93biAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAqIG9uIGFsZXJ0IHR5cGUgZm9jdXMgLS0tLS0tLS0+IGZldGNoIGFsZXJ0cyBvZiBhIHR5cGUgLS0tLS0tLS0tLS0rCiAgICAgICAgICoKICAgICAgICAgKiBvbiBzb3VyY2UgZmlsZSByZXF1ZXN0ZWQgLS0tPiBmZXRjaCBzb3VyY2UgZmlsZQogICAgICAgICAqCiAgICAgICAgICogb24gZ3JhcGgtZXhlY3V0aW9uIHNjcm9sbCAtLT4gZmV0Y2ggZ3JhcGgtZXhlY3V0aW9uIGRhdGEKICAgICAgICAgKgogICAgICAgICAqIG9uIGdyYXBoLW9wIGZvY3VzICYgZ3JhcGgtZXhlY3V0aW9uIGZvY3VzIC0tPiBmZXRjaCBncmFwaC1vcCBpbmZvIC0tLSsKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoIHN0YWNrIGZyYW1lcyA8LS0tLS0tKwogICAgICAgICAqKi8KICAgICAgICB0aGlzLmxvYWREYXRhJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIFRoaXMgZXZlbnQgY2FuIHRyaWdnZXIgdGhlIGxvYWRpbmcgb2YKICAgICAgICAgICAgLy8gICAtIGxpc3Qgb2Ygc291cmNlIGZpbGVzLgogICAgICAgICAgICAvLyAgIC0gbnVtYmVyIG9mIGV4ZWN1dGlvbnMKICAgICAgICAgICAgLy8gICAtIG51bWJlciBhbmQgYnJlYWtkb3duIG9mIGFsZXJ0cy4KICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGl0IG5lZWRzIHRvIGJlIGEgc2hhcmVkIG9ic2VydmFibGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG9hZFJ1bkRhdGEkID0gdGhpcy5sb2FkRGVidWdnZXJSdW5zKG1lcmdlKHRoaXMub25EZWJ1Z2dlckRhdGFQb2xsKCksIHRoaXMub25Db3JlUmVsb2FkKCkpKS5waXBlKHNoYXJlKCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxvYWRTb3VyY2VGaWxlTGlzdCQgPSB0aGlzLmxvYWRTb3VyY2VGaWxlTGlzdChsb2FkUnVuRGF0YSQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9uTnVtRXhlY3V0aW9uTG9hZGVkJCA9IHRoaXMuY3JlYXRlTnVtRXhlY3V0aW9uTG9hZGVyKGxvYWRSdW5EYXRhJCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb25OdW1BbGVydHNMb2FkZWQkID0gdGhpcy5jcmVhdGVOdW1BbGVydHNBbmRCcmVha2Rvd25Mb2FkZXIobG9hZFJ1bkRhdGEkKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvbkFsZXJ0VHlwZUZvY3VzZWQkID0gdGhpcy5vbkFsZXJ0VHlwZUZvY3VzZWQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHNGb3JBbGVydFR5cGVGb2N1cyQgPSB0aGlzLmZldGNoRXhlY3V0aW9uRGlnZXN0c0ZvckFsZXJ0VHlwZUZvY3VzKG9uQWxlcnRUeXBlRm9jdXNlZCQpOwogICAgICAgICAgICAvLyBUaGlzIGV2ZW50IGNhbiB0cmlnZ2VyIHRoZSBsb2FkaW5nIG9mCiAgICAgICAgICAgIC8vICAgLSBleGVjdXRpb24tZGlnZXN0CiAgICAgICAgICAgIC8vICAgLSBmaXJzdCBleGVjdXRpb24gZGF0YS4KICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGl0IG5lZWRzIHRvIGJlIGEgc2hhcmVkIG9ic2VydmFibGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb25Jbml0aWFsRXhlY3V0aW9uJCA9IHRoaXMuY3JlYXRlSW5pdGlhbEV4ZWN1dGlvbkRldGVjdG9yKG9uTnVtRXhlY3V0aW9uTG9hZGVkJCkucGlwZShzaGFyZSgpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvbkV4Y3V0aW9uRGlnZXN0TG9hZGVkJCA9IHRoaXMuY3JlYXRlRXhlY3V0aW9uRGlnZXN0TG9hZGVyKG1lcmdlKHRoaXMub25FeGVjdXRpb25TY3JvbGwoKSwgdGhpcy5jcmVhdGVJbml0aWFsRXhlY3V0aW9uRGlnZXN0KG9uSW5pdGlhbEV4ZWN1dGlvbiQpLCBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHNGb3JBbGVydFR5cGVGb2N1cyQpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvbkV4ZWN1dGlvbkRhdGFMb2FkZWQkID0gdGhpcy5jcmVhdGVFeGVjdXRpb25EYXRhQW5kU3RhY2tGcmFtZXNMb2FkZXIobWVyZ2UodGhpcy5vbkV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQoKSwgb25Jbml0aWFsRXhlY3V0aW9uJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TG9hZGVkRXhlY3V0aW9uRGF0YSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIGFjdGl2ZVJ1bklkLCBsb2FkZWRFeGVjdXRpb25EYXRhXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBhY3RpdmVSdW5JZDogKC8qKiBAdHlwZSB7P30gKi8gKGFjdGl2ZVJ1bklkKSksCiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRXhlY3V0aW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICBmb2N1c0luZGV4OiAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9uTnVtR3JhcGhFeGVjdXRpb25Mb2FkZWQkID0gdGhpcy5jcmVhdGVOdW1HcmFwaEV4ZWN1dGlvbkxvYWRlcihsb2FkUnVuRGF0YSQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9uU291cmNlRmlsZUZvY3VzZWQkID0gdGhpcy5vblNvdXJjZUZpbGVGb2N1c2VkKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb25HcmFwaEV4ZWN1dGlvblNjcm9sbCQgPSB0aGlzLmxvYWRHcmFwaEV4ZWN1dGlvblBhZ2VzKHRoaXMub25HcmFwaEV4ZWN1dGlvblNjcm9sbCgpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsb2FkR3JhcGhPcEluZm9BbmRTdGFja1RyYWNlJCA9IHRoaXMubG9hZEdyYXBoT3BTdGFja0ZyYW1lcyh0aGlzLmxvYWRHcmFwaE9wSW5mbygpKTsKICAgICAgICAgICAgLy8gRXhlY3V0aW9uRGlnZXN0IGFuZCBFeGVjdXRpb25EYXRhIGNhbiBiZSBsb2FkZWQgaW4gcGFyYWxsZWwuCiAgICAgICAgICAgIHJldHVybiBtZXJnZShvbk51bUFsZXJ0c0xvYWRlZCQsIG9uRXhjdXRpb25EaWdlc3RMb2FkZWQkLCBvbkV4ZWN1dGlvbkRhdGFMb2FkZWQkLCBvbk51bUdyYXBoRXhlY3V0aW9uTG9hZGVkJCwgbG9hZFNvdXJjZUZpbGVMaXN0JCwgb25Tb3VyY2VGaWxlRm9jdXNlZCQsIG9uR3JhcGhFeGVjdXRpb25TY3JvbGwkLCBsb2FkR3JhcGhPcEluZm9BbmRTdGFja1RyYWNlJCkucGlwZSgKICAgICAgICAgICAgLy8gY3JlYXRlRWZmZWN0IGV4cGVjdHMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHt9LgogICAgICAgICAgICBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gKHt9KSkpKTsKICAgICAgICB9KSwgeyBkaXNwYXRjaDogZmFsc2UgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlYnVnZ2VyRGF0YVBvbGwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoZGVidWdnZXJMb2FkZWQpLCBzd2l0Y2hNYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVUaW1lZFJlcGVhdGVyKG9mKGFjdGlvbiksIHRoaXMuc3RvcmUuc2VsZWN0KGdldFBvbGxTaWxlbmNlVGltZU1zKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcG9sbFNpbGVuY2VUaW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocG9sbFNpbGVuY2VUaW1lKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFBvbGxpbmdJbnRlcnZhbChwb2xsU2lsZW5jZVRpbWUpOwogICAgICAgICAgICB9KSkpLCB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGRlYnVnZ2VyVW5sb2FkZWQpKSk7CiAgICAgICAgfSkpLCB0YXAoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChkZWJ1Z2dlckRhdGFQb2xsT25zZXQoKSkpKSwgbWFwKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHZvaWQgbnVsbCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uQ29yZVJlbG9hZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShtYW51YWxSZWxvYWQsIHJlbG9hZCksIHRhcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKGRlYnVnZ2VyRGF0YVBvbGxPbnNldCgpKSkpLCBtYXAoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXF1ZXN0IGxpc3Qgb2YgZGVidWdnZXIgcnVucy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsb2FkRGVidWdnZXJSdW5zKHByZXZTdHJlYW0kKSB7CiAgICAgICAgcmV0dXJuIHByZXZTdHJlYW0kLnBpcGUod2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0RGVidWdnZXJSdW5zTG9hZGVkKSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKSksIHRhcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKGRlYnVnZ2VyUnVuc1JlcXVlc3RlZCgpKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hSdW5zKCkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChydW5zKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGRlYnVnZ2VyUnVuc0xvYWRlZCh7IHJ1bnM6ICgvKiogQHR5cGUgez99ICovIChydW5zKSkgfSkpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKQogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgICAgICk7CiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiBhIGRlYnVnZ2VyIHJ1biBleGlzdHMsIGxvYWQgbnVtYmVyIG9mIHRvcC1sZXZlbCBleGVjdXRpb25zLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZU51bUV4ZWN1dGlvbkxvYWRlcihwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldERlYnVnZ2VyUnVuTGlzdGluZyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUV4ZWN1dGlvbnNMb2FkZWQpKSwgZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssIHJ1bnMsIGxvYWRlZF0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIChPYmplY3Qua2V5cyhydW5zKS5sZW5ndGggPiAwICYmIGxvYWRlZC5zdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKTsKICAgICAgICB9KSksIHRhcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKG51bUV4ZWN1dGlvbnNSZXF1ZXN0ZWQoKSkpKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoWywgcnVuc10pID0+IHsKICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogSGFuZGxlIG11bHRpcGxlIHJ1bnMuIEN1cnJlbnRseSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUKICAgICAgICAgICAgLy8gaXMgYXQgbW9zdCBvbmx5IG9uZSBkZWJ1Z2dlciBydW4gYXZhaWxhYmxlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJ1bklkID0gT2JqZWN0LmtleXMocnVucylbMF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVnaW4gPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZCA9IDA7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hFeGVjdXRpb25EaWdlc3RzKHJ1bklkLCBiZWdpbiwgZW5kKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlnZXN0cwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRpZ2VzdHMpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtRXhlY3V0aW9uc0xvYWRlZCh7IG51bUV4ZWN1dGlvbnM6IGRpZ2VzdHMubnVtX2RpZ2VzdHMgfSkpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBXaGVuIGEgZGVidWdnZXIgcnVuIGV4aXN0cywgbG9hZCBudW1iZXIgb2YgaW50cmEtZ3JhcGggZXhlY3V0aW9ucy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVOdW1HcmFwaEV4ZWN1dGlvbkxvYWRlcihwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldERlYnVnZ2VyUnVuTGlzdGluZyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUdyYXBoRXhlY3V0aW9uc0xvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoWywgcnVucywgbG9hZGVkXSkgPT4gewogICAgICAgICAgICByZXR1cm4gKE9iamVjdC5rZXlzKHJ1bnMpLmxlbmd0aCA+IDAgJiYgbG9hZGVkLnN0YXRlICE9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtR3JhcGhFeGVjdXRpb25zUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssIHJ1bnNdKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVuSWQgPSBPYmplY3Qua2V5cyhydW5zKVswXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiZWdpbiA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZW5kID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZQogICAgICAgICAgICAgICAgLmZldGNoR3JhcGhFeGVjdXRpb25EaWdlc3RzKHJ1bklkLCBiZWdpbiwgZW5kKQogICAgICAgICAgICAgICAgLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaWdlc3RzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGlnZXN0cykgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChudW1HcmFwaEV4ZWN1dGlvbnNMb2FkZWQoewogICAgICAgICAgICAgICAgICAgIG51bUdyYXBoRXhlY3V0aW9uczogZGlnZXN0cy5udW1fZGlnZXN0cywKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiBhIGRlYnVnZ2VyIHJ1biBleGlzdHMsIGxvYWQgbnVtYmVyIG9mIGFsZXJ0cyBhbmQgdGhlaXIgYnJlYWtkb3duLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZU51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlcihwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldERlYnVnZ2VyUnVuTGlzdGluZyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFsZXJ0c0xvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoWywgcnVucywgbG9hZGVkXSkgPT4gewogICAgICAgICAgICByZXR1cm4gKE9iamVjdC5rZXlzKHJ1bnMpLmxlbmd0aCA+IDAgJiYgbG9hZGVkLnN0YXRlICE9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtQWxlcnRzQW5kQnJlYWtkb3duUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssIHJ1bnNdKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVuSWQgPSBPYmplY3Qua2V5cyhydW5zKVswXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiZWdpbiA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZW5kID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEFsZXJ0cyhydW5JZCwgYmVnaW4sIGVuZCkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGFsZXJ0cwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGFsZXJ0cykgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChudW1BbGVydHNBbmRCcmVha2Rvd25Mb2FkZWQoewogICAgICAgICAgICAgICAgICAgIG51bUFsZXJ0czogYWxlcnRzLm51bV9hbGVydHMsCiAgICAgICAgICAgICAgICAgICAgYWxlcnRzQnJlYWtkb3duOiBhbGVydHMuYWxlcnRzX2JyZWFrZG93biwKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIHdoZW4gaW5pdGlhbCBleGVjdXRpb24gZGlnZXN0cyBhbmQgZGF0YSBhcmUgcmVxdWlyZWQuCiAgICAgKgogICAgICogVGhlc2UgaW5pdGlhbCBkYXRhIGxvYWRpbmcgYWN0aW9ucyBhcmUgcmVxdWlyZWQgd2hlbiB0aGUgbnVtYmVyIG9mCiAgICAgKiBleGVjdXRpb25zIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUluaXRpYWxFeGVjdXRpb25EZXRlY3RvcihwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUV4ZWN1dGlvbnMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25EaWdlc3RzTG9hZGVkKSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCBudW1FeGVjdXRpb25zLCBleGVjdXRpb25EaWdlc3RzTG9hZGVkXSkgPT4gewogICAgICAgICAgICByZXR1cm4gKG51bUV4ZWN1dGlvbnMgPiAwICYmCiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhleGVjdXRpb25EaWdlc3RzTG9hZGVkLnBhZ2VMb2FkZWRTaXplcykubGVuZ3RoID09PSAwKTsKICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIHdoZW4gdGhlIGZpcnN0IHBhZ2UgaWYgZXhlY3V0aW9uIGRpZ2VzdHMgYXJlIHJlcXVpcmVkIHRvIGJlIGxvYWRlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVJbml0aWFsRXhlY3V0aW9uRGlnZXN0KHByZXZTdHJlYW0kKSB7CiAgICAgICAgcmV0dXJuIHByZXZTdHJlYW0kLnBpcGUod2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0TnVtRXhlY3V0aW9ucyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RXhlY3V0aW9uUGFnZVNpemUpKSwgZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssICwgcnVuSWRdKSA9PiBydW5JZCAhPT0gbnVsbCkpLCBtYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoWywgbnVtRXhlY3V0aW9ucywgcnVuSWQsIHBhZ2VTaXplXSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJlZ2luID0gMDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihudW1FeGVjdXRpb25zLCBwYWdlU2l6ZSk7CiAgICAgICAgICAgIHJldHVybiB7IGJlZ2luLCBlbmQsIHJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSB9OwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIHdoZW4gc2Nyb2xsaW5nIGV2ZW50IGxlYWRzIHRvIG5lZWQgdG8gbG9hZCBuZXcgZXhlY3V0aW9uIGRpZ2VzdHMuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25FeGVjdXRpb25TY3JvbGwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoZXhlY3V0aW9uU2Nyb2xsTGVmdCwgZXhlY3V0aW9uU2Nyb2xsUmlnaHQsIGV4ZWN1dGlvblNjcm9sbFRvSW5kZXgpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4ZWN1dGlvblNjcm9sbEJlZ2luSW5kZXgpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXROdW1FeGVjdXRpb25zKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RGlzcGxheUNvdW50KSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RXhlY3V0aW9uUGFnZVNpemUpKSwgZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFtydW5JZF0pID0+IHJ1bklkICE9PSBudWxsKSksIG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCBydW5JZCwgc2Nyb2xsQmVnaW5JbmRleCwgbnVtRXhlY3V0aW9ucywgZGlzcGxheUNvdW50LCBwYWdlU2l6ZSxdKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVnaW4gPSBzY3JvbGxCZWdpbkluZGV4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKG51bUV4ZWN1dGlvbnMsIGJlZ2luICsgZGlzcGxheUNvdW50KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwKICAgICAgICAgICAgICAgIGJlZ2luLAogICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgcGFnZVNpemUsCiAgICAgICAgICAgIH07CiAgICAgICAgfSkpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25EaWdlc3RzTG9hZGVkKSksIG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbcHJvcHMsIGxvYWRlZF0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHByb3BzLAogICAgICAgICAgICAgICAgbG9hZGVkLAogICAgICAgICAgICAgICAgbWlzc2luZ1BhZ2VzOiBnZXRNaXNzaW5nUGFnZXMocHJvcHMuYmVnaW4sIHByb3BzLmVuZCwgcHJvcHMucGFnZVNpemUsIGxvYWRlZC5udW1FeGVjdXRpb25zLCBsb2FkZWQucGFnZUxvYWRlZFNpemVzKSwKICAgICAgICAgICAgfTsKICAgICAgICB9KSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IG1pc3NpbmdQYWdlcyB9KSA9PiBtaXNzaW5nUGFnZXMubGVuZ3RoID4gMCkpLCBtYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoeyBwcm9wcywgbG9hZGVkLCBtaXNzaW5nUGFnZXMgfSkgPT4gewogICAgICAgICAgICBjb25zdCB7IHJ1bklkLCBwYWdlU2l6ZSB9ID0gcHJvcHM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVnaW4gPSBtaXNzaW5nUGFnZXNbMF0gKiBwYWdlU2l6ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihsb2FkZWQubnVtRXhlY3V0aW9ucywgKG1pc3NpbmdQYWdlc1ttaXNzaW5nUGFnZXMubGVuZ3RoIC0gMV0gKyAxKSAqIHBhZ2VTaXplKTsKICAgICAgICAgICAgcmV0dXJuIHsgYmVnaW4sIGVuZCwgcnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChydW5JZCkpIH07CiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogTG9hZCBleGVjdXRpb24gZGlnZXN0cy4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVFeGVjdXRpb25EaWdlc3RMb2FkZXIocHJldlN0cmVhbSQpIHsKICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25EaWdlc3RzTG9hZGVkKSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbeyBiZWdpbiwgZW5kIH0sIGxvYWRlZF0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIChlbmQgPiBiZWdpbiAmJgogICAgICAgICAgICAgICAgIWJlZ2luRW5kUmFuZ2VzSW5jbHVkZShsb2FkZWQubG9hZGluZ1JhbmdlcywgYmVnaW4sIGVuZCkpOwogICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFt7IGJlZ2luLCBlbmQgfV0pID0+IHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChleGVjdXRpb25EaWdlc3RzUmVxdWVzdGVkKHsgYmVnaW4sIGVuZCB9KSk7CiAgICAgICAgfSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbeyBydW5JZCwgYmVnaW4sIGVuZCB9XSkgPT4gewogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoRXhlY3V0aW9uRGlnZXN0cyhydW5JZCwgYmVnaW4sIGVuZCkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRpZ2VzdHMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkaWdlc3RzKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQoZGlnZXN0cykpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBFbWl0cyB3aGVuIHVzZXIgZm9jc2VzIG9uIGFuIGV4ZWN1dGlvbiBkaWdlc3QuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25FeGVjdXRpb25EaWdlc3RGb2N1c2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldExvYWRlZEV4ZWN1dGlvbkRhdGEpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25TY3JvbGxCZWdpbkluZGV4KSksIG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbcHJvcHMsIGFjdGl2ZVJ1bklkLCBsb2FkZWRFeGVjdXRpb25EYXRhLCBzY3JvbGxCZWdpbkluZGV4XSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZvY3VzSW5kZXggPSBzY3JvbGxCZWdpbkluZGV4ICsgcHJvcHMuZGlzcGxheUluZGV4OwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYWN0aXZlUnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChhY3RpdmVSdW5JZCkpLAogICAgICAgICAgICAgICAgbG9hZGVkRXhlY3V0aW9uRGF0YSwKICAgICAgICAgICAgICAgIGZvY3VzSW5kZXgsCiAgICAgICAgICAgIH07CiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogTG9hZCBkZXRhaWxlZCBkYXRhIGFib3V0IGV4ZWN1dGlvbiBhbmQgdGhlIGFzc29jaWF0ZWQgc3RhY2sgZnJhbWVzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUV4ZWN1dGlvbkRhdGFBbmRTdGFja0ZyYW1lc0xvYWRlcihwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IGFjdGl2ZVJ1bklkLCBsb2FkZWRFeGVjdXRpb25EYXRhLCBmb2N1c0luZGV4IH0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIChhY3RpdmVSdW5JZCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgZm9jdXNJbmRleCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgbG9hZGVkRXhlY3V0aW9uRGF0YVsoLyoqIEB0eXBlIHs/fSAqLyAoZm9jdXNJbmRleCkpXSA9PT0gdW5kZWZpbmVkKTsKICAgICAgICB9KSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgYWN0aXZlUnVuSWQsIGZvY3VzSW5kZXggfSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJlZ2luID0gKC8qKiBAdHlwZSB7P30gKi8gKGZvY3VzSW5kZXgpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmQgPSBiZWdpbiArIDE7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UKICAgICAgICAgICAgICAgIC5mZXRjaEV4ZWN1dGlvbkRhdGEoKC8qKiBAdHlwZSB7P30gKi8gKGFjdGl2ZVJ1bklkKSksIGJlZ2luLCBlbmQpCiAgICAgICAgICAgICAgICAucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbkRhdGFSZXNwb25zZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV4ZWN1dGlvbkRhdGFSZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChleGVjdXRpb25EYXRhTG9hZGVkKGV4ZWN1dGlvbkRhdGFSZXNwb25zZSkpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9uRGF0YVJlc3BvbnNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXhlY3V0aW9uRGF0YVJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBleGVjdXRpb25EYXRhOiBleGVjdXRpb25EYXRhUmVzcG9uc2UsIGJlZ2luLCBlbmQgfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGNhdGNoRXJyb3IoKSB0byBwaXBlLgogICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgZXhlY3V0aW9uRGF0YSB9KSA9PiB7CiAgICAgICAgICAgIHJldHVybiBleGVjdXRpb25EYXRhLmV4ZWN1dGlvbnNbMF07CiAgICAgICAgfSkpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldExvYWRlZFN0YWNrRnJhbWVzKSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbZXhlY3V0aW9uLCBydW5JZCwgbG9hZGVkU3RhY2tGcmFtZXNdKSA9PiB7CiAgICAgICAgICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RhY2tGcmFtZUlkIG9mIGV4ZWN1dGlvbi5zdGFja19mcmFtZV9pZHMpIHsKICAgICAgICAgICAgICAgIGlmIChsb2FkZWRTdGFja0ZyYW1lc1tzdGFja0ZyYW1lSWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbZXhlY3V0aW9uLCBydW5JZF0pID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFja0ZyYW1lSWRzID0gZXhlY3V0aW9uLnN0YWNrX2ZyYW1lX2lkczsKICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogTWF5YmUgb21pdCBhbHJlYWR5LWxvYWRlZCBzdGFjayBmcmFtZXMgZnJvbSByZXF1ZXN0LAogICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGxvYWRpbmcgYWxsIGZyYW1lcyBpZiBhbnkgb2YgdGhlbSBpcyBtaXNzaW5nLgogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoU3RhY2tGcmFtZXMoKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIHN0YWNrRnJhbWVJZHMpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lc1Jlc3BvbnNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc3RhY2tGcmFtZXNSZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tGcmFtZXNCeUlkID0ge307CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrRnJhbWVJZHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lc0J5SWRbc3RhY2tGcmFtZUlkc1tpXV0gPQogICAgICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lc1Jlc3BvbnNlLnN0YWNrX2ZyYW1lc1tpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc3RhY2tGcmFtZXNMb2FkZWQoeyBzdGFja0ZyYW1lczogc3RhY2tGcmFtZXNCeUlkIH0pKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogRW1pdHMgd2hlbiBzY3JvbGxpbmcgZXZlbnQgbGVhZHMgdG8gbmVlZCB0byBsb2FkIG5ldyBpbnRyYS1ncmFwaCBleGVjdXRpb24KICAgICAqIGRhdGEuCiAgICAgKgogICAgICogVGhlIHJldHVybmVkIG9ic2VydmFibGUgY29udGFpbnMgdGhlCiAgICAgKiAgIC0gcnVuSWQ6IGFjdGl2ZSBydW5JZCwKICAgICAqICAgLSBtaXNzaW5nUGFnZTogaW5kaWNlcyBvZiBtaXNzaW5nIGBHcmFwaEV4ZWN1dGlvbmAgcGFnZXMgdGhhdCBuZWVkIHRvIGJlCiAgICAgKiAgICAgbG9hZGVkIGJ5IGEgZG93bnN0cmVhbSBwaXBlLgogICAgICogICAtIHBhZ2VTaXplOiBHcmFwaEV4ZWN1dGlvbiBkYXRhIHBhZ2Ugc2l6ZS4KICAgICAqICAgLSBudW1HcmFwaEV4ZWN1dGlvbnM6IEN1cnJlbnQgdG90YWwgbnVtYmVyIG9mIGBHcmFwaEV4ZWN1dGlvbmBzLgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uR3JhcGhFeGVjdXRpb25TY3JvbGwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoZ3JhcGhFeGVjdXRpb25TY3JvbGxUb0luZGV4KSwgZGVib3VuY2VUaW1lKDEwMCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TnVtR3JhcGhFeGVjdXRpb25zKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0R3JhcGhFeGVjdXRpb25TY3JvbGxCZWdpbkluZGV4KSksIGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCBydW5JZCwgbnVtR3JhcGhFeGVjdXRpb25zXSkgPT4gewogICAgICAgICAgICByZXR1cm4gcnVuSWQgIT09IG51bGwgJiYgbnVtR3JhcGhFeGVjdXRpb25zID4gMDsKICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCBydW5JZCwgbnVtR3JhcGhFeGVjdXRpb25zLCBzY3JvbGxCZWdpbkluZGV4XSkgPT4gKHsKICAgICAgICAgICAgcnVuSWQsCiAgICAgICAgICAgIG51bUdyYXBoRXhlY3V0aW9ucywKICAgICAgICAgICAgc2Nyb2xsQmVnaW5JbmRleCwKICAgICAgICB9KSkpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvblBhZ2VTaXplKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0R3JhcGhFeGVjdXRpb25EaXNwbGF5Q291bnQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXMpKSwgbWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFt7IHJ1bklkLCBudW1HcmFwaEV4ZWN1dGlvbnMsIHNjcm9sbEJlZ2luSW5kZXggfSwgcGFnZVNpemUsIGRpc3BsYXlDb3VudCwgbG9hZGluZ1BhZ2VzLCBwYWdlTG9hZGVkU2l6ZXMsXSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBtaXNzaW5nUGFnZXMgPSBnZXRNaXNzaW5nUGFnZXMoc2Nyb2xsQmVnaW5JbmRleCwgTWF0aC5taW4oc2Nyb2xsQmVnaW5JbmRleCArIGRpc3BsYXlDb3VudCwgbnVtR3JhcGhFeGVjdXRpb25zKSwgcGFnZVNpemUsIG51bUdyYXBoRXhlY3V0aW9ucywgcGFnZUxvYWRlZFNpemVzKTsKICAgICAgICAgICAgLy8gT21pdCBwYWdlcyB0aGF0IGFyZSBhbHJlYWR5IGxvYWRpbmcuCiAgICAgICAgICAgIG1pc3NpbmdQYWdlcyA9IG1pc3NpbmdQYWdlcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhZ2UKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYWdlKSA9PiBsb2FkaW5nUGFnZXMuaW5kZXhPZihwYWdlKSA9PT0gLTEpKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwKICAgICAgICAgICAgICAgIG1pc3NpbmdQYWdlcywKICAgICAgICAgICAgICAgIHBhZ2VTaXplLAogICAgICAgICAgICAgICAgbnVtR3JhcGhFeGVjdXRpb25zLAogICAgICAgICAgICB9OwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsb2FkR3JhcGhFeGVjdXRpb25QYWdlcyhwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IG1pc3NpbmdQYWdlcyB9KSA9PiBtaXNzaW5nUGFnZXMubGVuZ3RoID4gMCkpLCB0YXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoeyBtaXNzaW5nUGFnZXMgfSkgPT4gewogICAgICAgICAgICBtaXNzaW5nUGFnZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGFnZUluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocGFnZUluZGV4KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoRXhlY3V0aW9uRGF0YVJlcXVlc3RlZCh7IHBhZ2VJbmRleCB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgcnVuSWQsIG1pc3NpbmdQYWdlcywgcGFnZVNpemUsIG51bUdyYXBoRXhlY3V0aW9ucyB9KSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVnaW4gPSBtaXNzaW5nUGFnZXNbMF0gKiBwYWdlU2l6ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbigobWlzc2luZ1BhZ2VzW21pc3NpbmdQYWdlcy5sZW5ndGggLSAxXSArIDEpICogcGFnZVNpemUsIG51bUdyYXBoRXhlY3V0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hHcmFwaEV4ZWN1dGlvbkRhdGEoKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIGJlZ2luLCBlbmQpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBncmFwaEV4ZWN1dGlvbkRhdGFSZXNwb25zZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGdyYXBoRXhlY3V0aW9uRGF0YVJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoRXhlY3V0aW9uRGF0YUxvYWRlZChncmFwaEV4ZWN1dGlvbkRhdGFSZXNwb25zZSkpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBMaXN0ZW5zIHRvIGdyYXBoLW9wIGZvY3VzIGV2ZW50cy4KICAgICAqCiAgICAgKiBMb2FkIGdyYXBoIG9wIGluZm8gZnJvbSB0aGUgL2dyYXBocy9vcF9pbmZvIHJvdXRlIHdoZW4gbmVjZXNzYXJ5LgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYmplY3Qgd2l0aCB0d28ga2V5cyBmb3IgZG93bnN0cmVhbSBjb25zdW1wdGlvbjoKICAgICAqICAgLSBydW5JZDogdGhlIGN1cnJlbnQgYWN0aXZlIHJ1biBJRC4KICAgICAqICAgLSBzdGFja0ZyYW1lSWRzOiB0aGUgSURzIG9mIHRoZSBzdGFjayBmcmFtZXMgb2YgdGhlIG9wJ3MgY3JlYXRpb24uCiAgICAgKi8KICAgIGxvYWRHcmFwaE9wSW5mbygpIHsKICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShncmFwaE9wRm9jdXNlZCwgZ3JhcGhFeGVjdXRpb25Gb2N1c2VkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0QWN0aXZlUnVuSWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRMb2FkaW5nR3JhcGhPcHMpKSwgZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFthY3Rpb25EYXRhLCBydW5JZCwgbG9hZGluZ09wc10pID0+IHsKICAgICAgICAgICAgY29uc3QgeyBncmFwaF9pZCwgb3BfbmFtZSB9ID0gYWN0aW9uRGF0YTsKICAgICAgICAgICAgcmV0dXJuIChydW5JZCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgKGxvYWRpbmdPcHNbZ3JhcGhfaWRdID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgICAgICAgICAhbG9hZGluZ09wc1tncmFwaF9pZF0uaGFzKG9wX25hbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgIShsb2FkaW5nT3BzW2dyYXBoX2lkXS5nZXQob3BfbmFtZSkgPT09IERhdGFMb2FkU3RhdGUuTE9BRElORyB8fAogICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nT3BzW2dyYXBoX2lkXS5nZXQob3BfbmFtZSkgPT09IERhdGFMb2FkU3RhdGUuTE9BREVEKSkpOwogICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFt7IGdyYXBoX2lkLCBvcF9uYW1lIH1dKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoT3BJbmZvUmVxdWVzdGVkKHsKICAgICAgICAgICAgZ3JhcGhfaWQsCiAgICAgICAgICAgIG9wX25hbWUsCiAgICAgICAgfSkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFthY3Rpb25EYXRhLCBydW5JZF0pID0+IHsKICAgICAgICAgICAgY29uc3QgeyBncmFwaF9pZCwgb3BfbmFtZSB9ID0gYWN0aW9uRGF0YTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEdyYXBoT3BJbmZvKCgvKiogQHR5cGUgez99ICovIChydW5JZCkpLCBncmFwaF9pZCwgb3BfbmFtZSkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGdyYXBoT3BJbmZvUmVzcG9uc2UKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChncmFwaE9wSW5mb1Jlc3BvbnNlKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoT3BJbmZvTG9hZGVkKHsgZ3JhcGhPcEluZm9SZXNwb25zZSB9KSkpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBncmFwaE9wSW5mb1Jlc3BvbnNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZ3JhcGhPcEluZm9SZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBydW5JZDogKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksCiAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZUlkczogZ3JhcGhPcEluZm9SZXNwb25zZS5zdGFja19mcmFtZV9pZHMsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvYWRHcmFwaE9wU3RhY2tGcmFtZXMocHJldlN0cmVhbSQpIHsKICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRMb2FkZWRTdGFja0ZyYW1lcykpLCBtYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoW3sgcnVuSWQsIHN0YWNrRnJhbWVJZHMgfSwgbG9hZGVkU3RhY2tGcmFtZXNdKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWlzc2luZ1N0YWNrRnJhbWVJZHMgPSBzdGFja0ZyYW1lSWRzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhY2tGcmFtZUlkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc3RhY2tGcmFtZUlkKSA9PiBsb2FkZWRTdGFja0ZyYW1lc1tzdGFja0ZyYW1lSWRdID09PSB1bmRlZmluZWQpKTsKICAgICAgICAgICAgcmV0dXJuIHsgcnVuSWQsIG1pc3NpbmdTdGFja0ZyYW1lSWRzIH07CiAgICAgICAgfSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoeyBydW5JZCwgbWlzc2luZ1N0YWNrRnJhbWVJZHMgfSkgPT4gewogICAgICAgICAgICByZXR1cm4gcnVuSWQgIT09IG51bGwgJiYgbWlzc2luZ1N0YWNrRnJhbWVJZHMubGVuZ3RoID4gMDsKICAgICAgICB9KSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgcnVuSWQsIG1pc3NpbmdTdGFja0ZyYW1lSWRzIH0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZQogICAgICAgICAgICAgICAgLmZldGNoU3RhY2tGcmFtZXMoKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIG1pc3NpbmdTdGFja0ZyYW1lSWRzKQogICAgICAgICAgICAgICAgLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lc1Jlc3BvbnNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc3RhY2tGcmFtZXNSZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tGcmFtZXNCeUlkID0ge307CiAgICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBEbyB0aGlzIHJlc2hhcGluZyBpbiB0aGUgYmFja2VuZCBhbmQgc2ltcGxpZnkKICAgICAgICAgICAgICAgIC8vIHRoZSBmcm9udGVuZCBjb2RlIGhlcmUuCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pc3NpbmdTdGFja0ZyYW1lSWRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZXNCeUlkW21pc3NpbmdTdGFja0ZyYW1lSWRzW2ldXSA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrRnJhbWVzUmVzcG9uc2Uuc3RhY2tfZnJhbWVzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzdGFja0ZyYW1lc0xvYWRlZCh7IHN0YWNrRnJhbWVzOiBzdGFja0ZyYW1lc0J5SWQgfSkpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICB9KSkpOwogICAgfQogICAgLyoqCiAgICAgKiBFbWl0cyB3aGVuIHVzZXIgZm9jdXNlcyBvbiBhbiBhbGVydCB0eXBlLgogICAgICoKICAgICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSBmb3Igd2hhdCBhZGRpdGlvbmFsIGV4ZWN1dGlvbiBkaWdlc3RzIG5lZWQgdG8gYmUgZmV0Y2hlZC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkFsZXJ0VHlwZUZvY3VzZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoYWxlcnRUeXBlRm9jdXNUb2dnbGVkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0QWN0aXZlUnVuSWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRBbGVydHNGb2N1c1R5cGUpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXROdW1BbGVydHNPZkZvY3VzZWRUeXBlKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TG9hZGVkQWxlcnRzT2ZGb2N1c2VkVHlwZSksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFsZXJ0c0xvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoWywgcnVuSWQsIGZvY3VzVHlwZSwgbnVtQWxlcnRzT2ZGb2N1c2VkVHlwZSwgbG9hZGVkQWxlcnRzT2ZGb2N1c2VkVHlwZSwgYWxlcnRzTG9hZGVkLF0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIChydW5JZCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgZm9jdXNUeXBlICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICBudW1BbGVydHNPZkZvY3VzZWRUeXBlID4gMCAmJgogICAgICAgICAgICAgICAgKGxvYWRlZEFsZXJ0c09mRm9jdXNlZFR5cGUgPT09IG51bGwgfHwKICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhsb2FkZWRBbGVydHNPZkZvY3VzZWRUeXBlKS5sZW5ndGggPAogICAgICAgICAgICAgICAgICAgICAgICBudW1BbGVydHNPZkZvY3VzZWRUeXBlKSAmJgogICAgICAgICAgICAgICAgYWxlcnRzTG9hZGVkLnN0YXRlICE9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtQWxlcnRzQW5kQnJlYWtkb3duUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssIHJ1bklkLCBmb2N1c1R5cGVdKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVnaW4gPSAwOwogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2Ugc21hcnRlciBgZW5kYCB2YWx1ZSB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhCiAgICAgICAgICAgIC8vIGZldGNoIGVhY2ggdGltZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmQgPSAtMTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEFsZXJ0cygoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwgYmVnaW4sIGVuZCwgKC8qKiBAdHlwZSB7P30gKi8gKGZvY3VzVHlwZSkpKTsKICAgICAgICB9KSksIHRhcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IG51bV9hbGVydHMsIGFsZXJ0c19icmVha2Rvd24sIGFsZXJ0X3R5cGUsIGJlZ2luLCBlbmQsIGFsZXJ0cyB9KSA9PiB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWxlcnRzT2ZUeXBlTG9hZGVkKHsKICAgICAgICAgICAgICAgIG51bUFsZXJ0czogbnVtX2FsZXJ0cywKICAgICAgICAgICAgICAgIGFsZXJ0c0JyZWFrZG93bjogYWxlcnRzX2JyZWFrZG93biwKICAgICAgICAgICAgICAgIGFsZXJ0VHlwZTogKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0X3R5cGUpKSwKICAgICAgICAgICAgICAgIGJlZ2luLAogICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgYWxlcnRzLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgZXhlY3V0aW9uIGRpZ2VzdHMgdG8gZmV0Y2ggb24gZm9jdXNpbmcgb2YgYW4gYWxlcnQgdHlwZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHNGb3JBbGVydFR5cGVGb2N1cyhwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4ZWN1dGlvblBhZ2VTaXplKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RGlzcGxheUNvdW50KSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TnVtRXhlY3V0aW9ucyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCkpLCBtYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoW2FsZXJ0c1Jlc3BvbnNlLCBwYWdlU2l6ZSwgZGlzcGxheUNvdW50LCBudW1FeGVjdXRpb25zLCBleGVjdXRpb25EaWdlc3RzTG9hZGVkLCBydW5JZCxdKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWxlcnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYWxlcnRzUmVzcG9uc2UuYWxlcnRzWzBdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uSW5kZXggPSBhbGVydC5leGVjdXRpb25faW5kZXg7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWlzc2luZ1BhZ2VzID0gZ2V0TWlzc2luZ1BhZ2VzKE1hdGgubWF4KDAsIGV4ZWN1dGlvbkluZGV4IC0gTWF0aC5mbG9vcihkaXNwbGF5Q291bnQgLyAyKSksIE1hdGgubWluKGV4ZWN1dGlvbkluZGV4ICsgTWF0aC5mbG9vcihkaXNwbGF5Q291bnQgLyAyKSwgbnVtRXhlY3V0aW9ucyksIHBhZ2VTaXplLCBudW1FeGVjdXRpb25zLCBleGVjdXRpb25EaWdlc3RzTG9hZGVkLnBhZ2VMb2FkZWRTaXplcyk7CiAgICAgICAgICAgIGlmIChtaXNzaW5nUGFnZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBydW5JZDogKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIGJlZ2luOiAwLCBlbmQ6IDAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJlZ2luID0gbWlzc2luZ1BhZ2VzWzBdICogcGFnZVNpemU7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihleGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnMsIChtaXNzaW5nUGFnZXNbbWlzc2luZ1BhZ2VzLmxlbmd0aCAtIDFdICsgMSkgKiBwYWdlU2l6ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBydW5JZDogKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIGJlZ2luLCBlbmQgfTsKICAgICAgICAgICAgfQogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIExvYWQgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2hlbiBkZWJ1Z2dlciBwbHVnaW4gaXMgbG9hZGVkLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvYWRTb3VyY2VGaWxlTGlzdChwcmV2U3RyZWFtJCkgewogICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0U291cmNlRmlsZUxpc3RMb2FkZWQpKSwgZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKFssIHJ1bklkLCBzb3VyY2VGaWxlTGlzdExvYWRTdGF0ZV0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIChydW5JZCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgc291cmNlRmlsZUxpc3RMb2FkU3RhdGUuc3RhdGUgIT09IERhdGFMb2FkU3RhdGUuTE9BRElORyk7CiAgICAgICAgfSkpLCB0YXAoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChzb3VyY2VGaWxlTGlzdFJlcXVlc3RlZCgpKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCBydW5JZF0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaFNvdXJjZUZpbGVMaXN0KCgvKiogQHR5cGUgez99ICovIChydW5JZCkpKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlRmlsZUxpc3RSZXNwb25zZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHNvdXJjZUZpbGVMaXN0UmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gW107CiAgICAgICAgICAgICAgICBzb3VyY2VGaWxlTGlzdFJlc3BvbnNlLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChbaG9zdF9uYW1lLCBmaWxlX3BhdGhdKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZXMucHVzaCh7IGhvc3RfbmFtZSwgZmlsZV9wYXRoIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzb3VyY2VGaWxlTGlzdExvYWRlZCh7IHNvdXJjZUZpbGVzIH0pKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkKICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGNhdGNoRXJyb3IoKSB0byBwaXBlLgogICAgICAgICAgICApOwogICAgICAgIH0pKSk7CiAgICB9CiAgICAvKioKICAgICAqIFdoZW4gdGhlIGEgc291cmNlIGZpbGUgaXMgZm9jdXNlZCBvbiwgbG9hZCBpdHMgY29udGVudCBmcm9tIHRoZSBkYXRhIHNvdXJjZS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblNvdXJjZUZpbGVGb2N1c2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKHNvdXJjZUxpbmVGb2N1c2VkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0QWN0aXZlUnVuSWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRGb2N1c2VkU291cmNlRmlsZUluZGV4KSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0Rm9jdXNlZFNvdXJjZUZpbGVDb250ZW50KSksIG1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbZm9jdXMsIHJ1bklkLCBmaWxlSW5kZXgsIGZpbGVDb250ZW50XSkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcnVuSWQsCiAgICAgICAgICAgICAgICBzdGFja0ZyYW1lOiBmb2N1cy5zdGFja0ZyYW1lLAogICAgICAgICAgICAgICAgZmlsZUluZGV4LAogICAgICAgICAgICAgICAgZmlsZUNvbnRlbnQsCiAgICAgICAgICAgIH07CiAgICAgICAgfSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoeyBydW5JZCwgZmlsZUNvbnRlbnQgfSkgPT4gewogICAgICAgICAgICByZXR1cm4gKHJ1bklkICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICBmaWxlQ29udGVudCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgZmlsZUNvbnRlbnQubG9hZFN0YXRlID09PSBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQpOwogICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgc3RhY2tGcmFtZSB9KSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKHNvdXJjZUZpbGVSZXF1ZXN0ZWQoewogICAgICAgICAgICBob3N0X25hbWU6IHN0YWNrRnJhbWUuaG9zdF9uYW1lLAogICAgICAgICAgICBmaWxlX3BhdGg6IHN0YWNrRnJhbWUuZmlsZV9wYXRoLAogICAgICAgIH0pKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IGZpbGVJbmRleCwgcnVuSWQgfSkgPT4gewogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoU291cmNlRmlsZSgoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwgZmlsZUluZGV4KS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlRmlsZVJlc3BvbnNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc291cmNlRmlsZVJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNvdXJjZUZpbGVMb2FkZWQoc291cmNlRmlsZVJlc3BvbnNlKSk7CiAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHZvaWQgbnVsbCkpCiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICAgICAgKTsKICAgICAgICB9KSkpOwogICAgfQp9CkRlYnVnZ2VyRWZmZWN0cy5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLwpEZWJ1Z2dlckVmZmVjdHMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEFjdGlvbnMgfSwKICAgIHsgdHlwZTogU3RvcmUgfSwKICAgIHsgdHlwZTogVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2UgfQpdOwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdnZXJFZmZlY3RzLsm1ZmFjID0gZnVuY3Rpb24gRGVidWdnZXJFZmZlY3RzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnZ2VyRWZmZWN0cykoybXJtWluamVjdChBY3Rpb25zKSwgybXJtWluamVjdChTdG9yZSksIMm1ybVpbmplY3QoVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2UpKTsgfTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyRWZmZWN0cy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEZWJ1Z2dlckVmZmVjdHMsIGZhY3Rvcnk6IERlYnVnZ2VyRWZmZWN0cy7JtWZhYyB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2FsZXJ0cy9hbGVydHNfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIEFsZXJ0c01vZHVsZSB7Cn0KQWxlcnRzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbQWxlcnRzQ29tcG9uZW50LCBBbGVydHNDb250YWluZXJdLAogICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sCiAgICAgICAgICAgICAgICBleHBvcnRzOiBbQWxlcnRzQ29udGFpbmVyXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydHNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBBbGVydHNNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydHNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBbGVydHNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQWxlcnRzTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZV1dIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShBbGVydHNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbQWxlcnRzQ29tcG9uZW50LCBBbGVydHNDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZXhwb3J0czogW0FsZXJ0c0NvbnRhaW5lcl0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9kZWJ1Z190ZW5zb3JfdmFsdWUvZGVidWdfdGVuc29yX3ZhbHVlX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpjbGFzcyBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlIHsKfQpEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICBEZWJ1Z1RlbnNvckhhc0luZk9yTmFOQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICBEZWJ1Z1RlbnNvclJhbmtDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLAogICAgICAgICAgICAgICAgZXhwb3J0czogW0RlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yVmFsdWVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JWYWx1ZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIERlYnVnVGVuc29yVmFsdWVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVidWdUZW5zb3JWYWx1ZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoRGVidWdUZW5zb3JWYWx1ZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50LAogICAgICAgIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQsCiAgICAgICAgRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50LAogICAgICAgIERlYnVnVGVuc29yUmFua0NvbXBvbmVudCwKICAgICAgICBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LAogICAgICAgIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZXhwb3J0czogW0RlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGhfZXhlY3V0aW9ucy9ncmFwaF9leGVjdXRpb25zX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpjbGFzcyBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUgewp9CkdyYXBoRXhlY3V0aW9uc01vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0dyYXBoRXhlY3V0aW9uc0NvbXBvbmVudCwgR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIERlYnVnVGVuc29yVmFsdWVNb2R1bGUsIFNjcm9sbGluZ01vZHVsZV0sCiAgICAgICAgICAgICAgICBleHBvcnRzOiBbR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR3JhcGhFeGVjdXRpb25zTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgRGVidWdUZW5zb3JWYWx1ZU1vZHVsZSwgU2Nyb2xsaW5nTW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEdyYXBoRXhlY3V0aW9uc01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQsIEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIERlYnVnVGVuc29yVmFsdWVNb2R1bGUsIFNjcm9sbGluZ01vZHVsZV0sIGV4cG9ydHM6IFtHcmFwaEV4ZWN1dGlvbnNDb250YWluZXJdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGgvZ3JhcGhfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIEdyYXBoTW9kdWxlIHsKfQpHcmFwaE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0dyYXBoQ29tcG9uZW50LCBHcmFwaE9wQ29tcG9uZW50LCBHcmFwaENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtHcmFwaENvbnRhaW5lcl0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gR3JhcGhNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBHcmFwaE1vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIEdyYXBoTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gR3JhcGhNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR3JhcGhNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEdyYXBoTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0dyYXBoQ29tcG9uZW50LCBHcmFwaE9wQ29tcG9uZW50LCBHcmFwaENvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLCBleHBvcnRzOiBbR3JhcGhDb250YWluZXJdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvaW5hY3RpdmUvaW5hY3RpdmVfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIEluYWN0aXZlTW9kdWxlIHsKfQpJbmFjdGl2ZU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0luYWN0aXZlQ29tcG9uZW50LCBJbmFjdGl2ZUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBleHBvcnRzOiBbSW5hY3RpdmVDb250YWluZXJdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIEluYWN0aXZlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogSW5hY3RpdmVNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEluYWN0aXZlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlTW9kdWxlKSgpOyB9IH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShJbmFjdGl2ZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtJbmFjdGl2ZUNvbXBvbmVudCwgSW5hY3RpdmVDb250YWluZXJdLCBleHBvcnRzOiBbSW5hY3RpdmVDb250YWluZXJdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc291cmNlX2NvZGUvc291cmNlX2NvZGVfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIFNvdXJjZUNvZGVNb2R1bGUgewp9ClNvdXJjZUNvZGVNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtTb3VyY2VDb2RlQ29tcG9uZW50LCBTb3VyY2VDb2RlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLAogICAgICAgICAgICAgICAgZXhwb3J0czogW1NvdXJjZUNvZGVDb250YWluZXJdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUNvZGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTb3VyY2VDb2RlTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gU291cmNlQ29kZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNvdXJjZUNvZGVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU291cmNlQ29kZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU291cmNlQ29kZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtTb3VyY2VDb2RlQ29tcG9uZW50LCBTb3VyY2VDb2RlQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGV4cG9ydHM6IFtTb3VyY2VDb2RlQ29udGFpbmVyXSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL3NvdXJjZV9maWxlcy9zb3VyY2VfZmlsZXNfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIFNvdXJjZUZpbGVzTW9kdWxlIHsKfQpTb3VyY2VGaWxlc01vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1NvdXJjZUZpbGVzQ29tcG9uZW50LCBTb3VyY2VGaWxlc0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTb3VyY2VDb2RlTW9kdWxlXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtTb3VyY2VGaWxlc0NvbnRhaW5lcl0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gU291cmNlRmlsZXNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTb3VyY2VGaWxlc01vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUZpbGVzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gU291cmNlRmlsZXNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU291cmNlRmlsZXNNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBTb3VyY2VDb2RlTW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFNvdXJjZUZpbGVzTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1NvdXJjZUZpbGVzQ29tcG9uZW50LCBTb3VyY2VGaWxlc0NvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNvdXJjZUNvZGVNb2R1bGVdLCBleHBvcnRzOiBbU291cmNlRmlsZXNDb250YWluZXJdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc3RhY2tfdHJhY2Uvc3RhY2tfdHJhY2VfbW9kdWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmNsYXNzIFN0YWNrVHJhY2VNb2R1bGUgewp9ClN0YWNrVHJhY2VNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtTdGFja1RyYWNlQ29tcG9uZW50LCBTdGFja1RyYWNlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNvdXJjZUNvZGVNb2R1bGVdLAogICAgICAgICAgICAgICAgZXhwb3J0czogW1N0YWNrVHJhY2VDb250YWluZXJdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIFN0YWNrVHJhY2VNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTdGFja1RyYWNlTW9kdWxlIH0pOwovKiogQG5vY29sbGFwc2UgKi8gU3RhY2tUcmFjZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFN0YWNrVHJhY2VNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RhY2tUcmFjZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIFNvdXJjZUNvZGVNb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU3RhY2tUcmFjZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtTdGFja1RyYWNlQ29tcG9uZW50LCBTdGFja1RyYWNlQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgU291cmNlQ29kZU1vZHVsZV0sIGV4cG9ydHM6IFtTdGFja1RyYWNlQ29udGFpbmVyXSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2V4ZWN1dGlvbl9kYXRhL2V4ZWN1dGlvbl9kYXRhX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpjbGFzcyBFeGVjdXRpb25EYXRhTW9kdWxlIHsKfQpFeGVjdXRpb25EYXRhTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbRXhlY3V0aW9uRGF0YUNvbXBvbmVudCwgRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtFeGVjdXRpb25EYXRhQ29udGFpbmVyXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBFeGVjdXRpb25EYXRhTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRXhlY3V0aW9uRGF0YU1vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIEV4ZWN1dGlvbkRhdGFNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBFeGVjdXRpb25EYXRhTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEV4ZWN1dGlvbkRhdGFNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlXV0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEV4ZWN1dGlvbkRhdGFNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbRXhlY3V0aW9uRGF0YUNvbXBvbmVudCwgRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIERlYnVnVGVuc29yVmFsdWVNb2R1bGVdLCBleHBvcnRzOiBbRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy90aW1lbGluZS90aW1lbGluZV9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KY2xhc3MgVGltZWxpbmVNb2R1bGUgewp9ClRpbWVsaW5lTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbVGltZWxpbmVDb21wb25lbnQsIFRpbWVsaW5lQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uRGF0YU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgTWF0U2xpZGVyTW9kdWxlLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFRoZSBmb2xsb3dpbmcgdHdvIHByb3ZpZGVycyBhcmUgbWVhbnQgdG8gbWFrZSB0aGUgbWF0LXNsaWRlcgogICAgICAgICAgICAgICAgLy8gZHJhZ2dpbmcgdG8gd29yay4gQnV0IHRoZSBkcmFnZ2luZyBpcyBzdGlsbCBub3Qgd29ya2luZywgbmVlZHMgbW9yZQogICAgICAgICAgICAgICAgLy8gaW52ZXN0aWdhdGlvbi4gTWF5IGJlIHJlbGF0ZWQgdG86CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy83OTA1CiAgICAgICAgICAgICAgICBleHBvcnRzOiBbVGltZWxpbmVDb250YWluZXJdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIFRpbWVsaW5lTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGltZWxpbmVNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBUaW1lbGluZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRpbWVsaW5lTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRpbWVsaW5lTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIEV4ZWN1dGlvbkRhdGFNb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgTWF0U2xpZGVyTW9kdWxlLAogICAgICAgIF1dIH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShUaW1lbGluZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtUaW1lbGluZUNvbXBvbmVudCwgVGltZWxpbmVDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLAogICAgICAgIEV4ZWN1dGlvbkRhdGFNb2R1bGUsCiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgIE1hdFNsaWRlck1vZHVsZV0sIGV4cG9ydHM6IFtUaW1lbGluZUNvbnRhaW5lcl0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9kZWJ1Z2dlcl9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KY2xhc3MgRGVidWdnZXJNb2R1bGUgewp9CkRlYnVnZ2VyTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbRGVidWdnZXJDb21wb25lbnQsIERlYnVnZ2VyQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICBBbGVydHNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIEdyYXBoRXhlY3V0aW9uc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBHcmFwaE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBJbmFjdGl2ZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBTb3VyY2VGaWxlc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgVGltZWxpbmVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShERUJVR0dFUl9GRUFUVVJFX0tFWSwgcmVkdWNlcnMkMiksCiAgICAgICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtEZWJ1Z2dlckVmZmVjdHNdKSwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5SZWdpc3RyeU1vZHVsZS5mb3JQbHVnaW4oJ2RlYnVnZ2VyLXYyJywgRGVidWdnZXJDb250YWluZXIpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtEZWJ1Z2dlckNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IFtEZWJ1Z2dlckNvbnRhaW5lcl0sCiAgICAgICAgICAgIH0sXSB9LApdOwovKiogQG5vY29sbGFwc2UgKi8gRGVidWdnZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBEZWJ1Z2dlck1vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRGVidWdnZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVidWdnZXJNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgIEFsZXJ0c01vZHVsZSwKICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUsCiAgICAgICAgICAgIEdyYXBoTW9kdWxlLAogICAgICAgICAgICBJbmFjdGl2ZU1vZHVsZSwKICAgICAgICAgICAgU291cmNlRmlsZXNNb2R1bGUsCiAgICAgICAgICAgIFN0YWNrVHJhY2VNb2R1bGUsCiAgICAgICAgICAgIFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUsCiAgICAgICAgICAgIFRpbWVsaW5lTW9kdWxlLAogICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JGZWF0dXJlKERFQlVHR0VSX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQyKSwKICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtEZWJ1Z2dlckVmZmVjdHNdKSwKICAgICAgICAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKCdkZWJ1Z2dlci12MicsIERlYnVnZ2VyQ29udGFpbmVyKSwKICAgICAgICBdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoRGVidWdnZXJNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbRGVidWdnZXJDb21wb25lbnQsIERlYnVnZ2VyQ29udGFpbmVyXSwgaW1wb3J0czogW0FsZXJ0c01vZHVsZSwKICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgR3JhcGhFeGVjdXRpb25zTW9kdWxlLAogICAgICAgIEdyYXBoTW9kdWxlLAogICAgICAgIEluYWN0aXZlTW9kdWxlLAogICAgICAgIFNvdXJjZUZpbGVzTW9kdWxlLAogICAgICAgIFN0YWNrVHJhY2VNb2R1bGUsCiAgICAgICAgVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICBUaW1lbGluZU1vZHVsZSwgU3RvcmVGZWF0dXJlTW9kdWxlLCBFZmZlY3RzRmVhdHVyZU1vZHVsZSwgUGx1Z2luUmVnaXN0cnlNb2R1bGVdLCBleHBvcnRzOiBbRGVidWdnZXJDb250YWluZXJdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvcGx1Z2luc19tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgUGx1Z2luc01vZHVsZSB7Cn0KUGx1Z2luc01vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1BsdWdpbnNDb250YWluZXIsIFBsdWdpbnNDb21wb25lbnRdLAogICAgICAgICAgICAgICAgZXhwb3J0czogW1BsdWdpbnNDb250YWluZXJdLAogICAgICAgICAgICAgICAgaW1wb3J0czogW0NvcmVNb2R1bGUsIENvbW1vbk1vZHVsZSwgUGx1Z2luUmVnaXN0cnlNb2R1bGUsIERlYnVnZ2VyTW9kdWxlXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5zTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogUGx1Z2luc01vZHVsZSB9KTsKLyoqIEBub2NvbGxhcHNlICovIFBsdWdpbnNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBQbHVnaW5zTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsdWdpbnNNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29yZU1vZHVsZSwgQ29tbW9uTW9kdWxlLCBQbHVnaW5SZWdpc3RyeU1vZHVsZSwgRGVidWdnZXJNb2R1bGVdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoUGx1Z2luc01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtQbHVnaW5zQ29udGFpbmVyLCBQbHVnaW5zQ29tcG9uZW50XSwgaW1wb3J0czogW0NvcmVNb2R1bGUsIENvbW1vbk1vZHVsZSwgUGx1Z2luUmVnaXN0cnlNb2R1bGUsIERlYnVnZ2VyTW9kdWxlXSwgZXhwb3J0czogW1BsdWdpbnNDb250YWluZXJdIH0pOyB9KSgpOwrJtcm1c2V0Q29tcG9uZW50U2NvcGUoUGx1Z2luc0NvbnRhaW5lciwgW05nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ0Zvck9mLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ1N0eWxlLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBOZ1N3aXRjaERlZmF1bHQsIE5nUGx1cmFsLCBOZ1BsdXJhbENhc2UsIERlYnVnZ2VyQ29udGFpbmVyLCBQbHVnaW5zQ29udGFpbmVyLCBQbHVnaW5zQ29tcG9uZW50XSwgW0FzeW5jUGlwZSwgVXBwZXJDYXNlUGlwZSwgTG93ZXJDYXNlUGlwZSwgSnNvblBpcGUsIFNsaWNlUGlwZSwgRGVjaW1hbFBpcGUsIFBlcmNlbnRQaXBlLCBUaXRsZUNhc2VQaXBlLCBDdXJyZW5jeVBpcGUsIERhdGVQaXBlLCBJMThuUGx1cmFsUGlwZSwgSTE4blNlbGVjdFBpcGUsIEtleVZhbHVlUGlwZV0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3JlZHVjZXJfY29uZmlnLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIGNvbnNvbGUubG9nIGFsbCBhY3Rpb25zCi8qKgogKiBAcGFyYW0gez99IHJlZHVjZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGxvZ2dlcihyZWR1Y2VyKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChhY3Rpb24udHlwZSk7CiAgICAgICAgY29uc29sZS5sb2coJ3ByZXYgc3RhdGUnLCBzdGF0ZSk7CiAgICAgICAgY29uc29sZS5sb2coJ2FjdGlvbicsIGFjdGlvbik7CiAgICAgICAgY29uc29sZS5sb2coJ25leHQgc3RhdGUnLCByZXN1bHQpOwogICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSk7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBsb2dnZXJNZXRhUmVkdWNlckZhY3RvcnkoKSB7CiAgICByZXR1cm4gIWlzRGV2TW9kZSgpCiAgICAgICAgPyAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVkdWNlcikgPT4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICAgICAgfSkpCiAgICAgICAgOiBsb2dnZXI7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBST09UX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdSb290IHJlZHVjZXJzIHRva2VuJywgewogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gKHt9KSksCn0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3JlbG9hZGVyL3JlbG9hZGVyX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBSZWxvYWRlck1vZHVsZSB7Cn0KUmVsb2FkZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtSZWxvYWRlckNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICBleHBvcnRzOiBbUmVsb2FkZXJDb21wb25lbnRdLAogICAgICAgICAgICB9LF0gfSwKXTsKLyoqIEBub2NvbGxhcHNlICovIFJlbG9hZGVyTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogUmVsb2FkZXJNb2R1bGUgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBSZWxvYWRlck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFJlbG9hZGVyTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlbG9hZGVyTW9kdWxlKSgpOyB9IH0pOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShSZWxvYWRlck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtSZWxvYWRlckNvbXBvbmVudF0sIGV4cG9ydHM6IFtSZWxvYWRlckNvbXBvbmVudF0gfSk7IH0pKCk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYXBwX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBBcHBNb2R1bGUgewp9CkFwcE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0FwcENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgQnJvd3Nlck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBDb3JlTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIEhhc2hTdG9yYWdlTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIEhlYWRlck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlJDEsCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBSZWxvYWRlck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JSb290KFJPT1RfUkVEVUNFUlMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNoZWNrczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0U3RhdGVTZXJpYWxpemFiaWxpdHk6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yUm9vdChbXSksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBNRVRBX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBsb2dnZXJNZXRhUmVkdWNlckZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgYm9vdHN0cmFwOiBbQXBwQ29udGFpbmVyXSwKICAgICAgICAgICAgfSxdIH0sCl07Ci8qKiBAbm9jb2xsYXBzZSAqLyBBcHBNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBBcHBNb2R1bGUsIGJvb3RzdHJhcDogW0FwcENvbnRhaW5lcl0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLyBBcHBNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBcHBNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICB7CiAgICAgICAgICAgIHByb3ZpZGU6IE1FVEFfUkVEVUNFUlMsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGxvZ2dlck1ldGFSZWR1Y2VyRmFjdG9yeSwKICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgfSwKICAgIF0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgIEJyb3dzZXJNb2R1bGUsCiAgICAgICAgICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLAogICAgICAgICAgICBDb3JlTW9kdWxlLAogICAgICAgICAgICBGZWF0dXJlRmxhZ01vZHVsZSwKICAgICAgICAgICAgSGFzaFN0b3JhZ2VNb2R1bGUsCiAgICAgICAgICAgIEhlYWRlck1vZHVsZSwKICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSQxLAogICAgICAgICAgICBQbHVnaW5zTW9kdWxlLAogICAgICAgICAgICBSZWxvYWRlck1vZHVsZSwKICAgICAgICAgICAgU2V0dGluZ3NNb2R1bGUsCiAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvclJvb3QoUk9PVF9SRURVQ0VSUywgewogICAgICAgICAgICAgICAgcnVudGltZUNoZWNrczogewogICAgICAgICAgICAgICAgICAgIHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHk6IHRydWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KSwKICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JSb290KFtdKSwKICAgICAgICBdXSB9KTsKKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQXBwTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0FwcENvbnRhaW5lcl0sIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlLAogICAgICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLAogICAgICAgIENvcmVNb2R1bGUsCiAgICAgICAgRmVhdHVyZUZsYWdNb2R1bGUsCiAgICAgICAgSGFzaFN0b3JhZ2VNb2R1bGUsCiAgICAgICAgSGVhZGVyTW9kdWxlLAogICAgICAgIE1hdEljb25Nb2R1bGUkMSwKICAgICAgICBQbHVnaW5zTW9kdWxlLAogICAgICAgIFJlbG9hZGVyTW9kdWxlLAogICAgICAgIFNldHRpbmdzTW9kdWxlLCBTdG9yZVJvb3RNb2R1bGUsIEVmZmVjdHNSb290TW9kdWxlXSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9ib290c3RyYXAudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gQm9vdHN0cmFwIG5lZWRzIHRvIGhhcHBlbiBhZnRlciBib2R5IGlzIHJlYWR5IGJ1dCB3ZSBjYW5ub3QgcmVsaWFibHkKLy8gY29udHJvbHMgdGhlIG9yZGVyIGluIHdoaWNoIHNjcmlwdCBnZXRzIGxvYWRlZCAoVnVsY2FuaXphdGlvbiBpbmxpbmVzCi8vIHRoZSBzY3JpcHQgaW4gPGhlYWQ+KS4Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoLyoqCiAqIEByZXR1cm4gez99CiAqLwooKSA9PiB7CiAgICBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTsKfSkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21haW5fcHJvZC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwplbmFibGVQcm9kTW9kZSgpOwoKCg==", "ok": true, "headers": [ [ "content-type", "application/javascript; charset=utf-8" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/environment": { "data": "eyJkYXRhX2xvY2F0aW9uIjogImxvZ3MiLCAid2luZG93X3RpdGxlIjogIiJ9", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugins_listing": { "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyLXYyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiRGVidWdnZXIgVjIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAiZ3JhcGhzIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJkaXN0cmlidXRpb25zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIn19LCAiaGlzdG9ncmFtcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImhpc3RvZ3JhbXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQifX0sICJ0ZXh0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJ0ZXh0IiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi10ZXh0LWRhc2hib2FyZCJ9fSwgInByX2N1cnZlcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIlBSIEN1cnZlcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHItY3VydmUtZGFzaGJvYXJkIn19LCAicHJvZmlsZV9yZWRpcmVjdCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIlByb2ZpbGUiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIn19LCAiYmVob2xkZXIiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogdHJ1ZSwgInRhYl9uYW1lIjogImJlaG9sZGVyIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQifX0sICJocGFyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19fQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/runs": { "data": "WyIuIiwgIjE2MDM3MDA5NjQuMTczOTIxMyJd", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { "data": "d09GMgABAAAAACokAA4AAAAAUkQAACnNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmXocg0oGYACGTBEMCu1A1wwLg14AATYCJAOHNgQgBYMAByAbO0QF3Bhn2DiAgX12b1EEGwcBhTGLomxQFmT/lwnmGE77wayn0NBAJAPXITeLlQAVKYYKjM1mpr7CgS0HNgpkY1bqRLvLsXy3dA8XPXqvM/yN+w2v2FOlAb85QmOf5P7Az633/wJaSkUwMImTqgk4GDAic6S4MSrGqFakDCocigoYRBqEHnCIYBIGGExRT1Qeqv3690x3z90AwCasSP6ngswqFUVYHrB8VBQAKcYder52r1wzByMHJRZ//0+nNV9g+H/GsveOK0AqSpwZGZI47CReYMFvJOfQ2hTNUVES1lvdXXeyFKh29/XX4ACRY/9vTgMuqbMdO2B5UFAD4VG4vRkzpRE/HAS4Jss5uTZKgIn5b///mp923r+ZD/x22f0pcYRbsj0ne84XpsZN7mQyee9lwgszWcwvZJLFD4WkECjkFyHriuAA87NMWVUCV9VTC6S6tsdX+ApZK4nU+gqn6ipcefja71ffCTv/vpktBbH4Q8OmUzIhiS6SSKLxDYn4I3iKlCraxSKRmLCxMhnQLaUZLPeL70z9PLvdGe4aJpgghNJhdNDfIYfbP4Zrr4IRvQYW1AHHsRm/MoBA8QMAALCA4nacDoQBD4hYsRCpUiHSpUMwMSGyZUPkyoe4rB6qxyYEAgXAC0AAAgCBiIUA4KZAB3a3PfY7jNipySXnETvz4unnEjtv7bILiMECgG+hS5x7+iUX4AR8gRVUUNx1liijpQ3akVwcN9akGiFf5sfC53+NGKbR5WqKVWK9kAti+AS1eOOOyCvDaIwf8afMcFGbPJk65ZRuuRKVi5n34MXC5+eY8DF3ego/YaXaA/kGJCdNqR9aLDwevIQdJ0mKNBnyFChToUqNBoJTtOk4zZgJM5as2bDlwIkLV+48lSpzznk9evW57Y677uk3YNCQYfc98NAjk55Y9MySZa+9sWLVmnUbNiE0xggsAhGnnKBtjyf2QAgPTgoEFh8Jtbt2fBCTGwppEGEglZ5H9iEjajJmypb9zQ7WcvY+F29zpybfh8pFRalEVy+iPrfdcde9rn89b9acef9Z6HrqQ4ueWbLsjRWr1qx3vfW+d9770LXhbZuHCFeD868+CuUUv9RhOBpeRLDSKRtpW+4JClYxVTYdM1P8F5yw4yEH/bl6XJhQCcKlImFqL9vlsPiIpJtgDl7nnTDswuvDCv+DO1fDk/MxTTZl2ozHg0XCE4hnXuaoUGRvMwJjpuxnZEv+3pQmUBk753x56pZFeGbJ8s2IMhXxINvIiBgzZS/fU4ueWbJ8N5ZJIjmllGuC4g0HW6/PDdHeZGVFrFqzPhRHACMh5SpUzmRow4YNGzamMFQ4soqMGDNtbEWyl05HornGI/8uT9miZ5Ysd70RacWqNeumCoS86xhHXc3Jp1y9CINvDOn62prjoEx81Jz3IVIDWX7co1E3yT++FWYmuuNgIacdlV09TGcJJhPrX4ppsGwDXfCvkmLgAFmk6LCYxAftHyxYL1O0P9FCx9PR3lipv92N96FztJm7THzvXYCZF1CGmPHV7zjxlE+yUMyjYlkzeXrN1+XDXy7mZ4SaH3nFQ7Ww4uDmIe7T/PFaC3qFyJcS82v/iTr6GwvR3ze+XD27dfVbnYZQeRFxzohzSVz399nlr3kVWPXOwUJ5dHBrvN8bC/o9RRmDNlxKMCFjXvucAiWWoH0uC9Id0GRlZgrJ2SxOo/NX1BHQbaQBUf96uxZTd36ybZDQD2eu0GhiDfZmfDlc0VzFOlV8wKy9uuc9zoT+etNtsqFheWuKpVn11wnNyFUttlZgbJzVYnwrmDBpqX3O62J0xc3aVeaABaXbnkaGt5Tna0TncyyvCyiVfDTfNg2Tskx1qffMM0NtN69smvOiem3QnIGRMuk1rbqfMN9WYlYX54kVN9Zr843PpJvb6ivMNl+RmEB/BdWcgMMDITBSlFAjGMdJwzpJBRcNOoQYINvHmOh+Zu4HWLNzkAM9wsX9KDcejslxl1SqgpTK+nJ6LJP32jr7AVDWFUr1sbAX9oI4EVeZok7QfSSpICmKkKY4cpSbPOWhQPdQpggVKkKD8tGk3AhUzCkqSosK0Ka8dOguBhTPkHIg8915deAkWMcGli0ohh3l4ECFuVAublSIO+XiQfnlCI7BobVXOYT4INHaqwJUXCUV1+OO6HUPqn/XBA0YhnPfJMSUx7g9IXde/1qA99R9t0XLOL0eivXGOox6LVwgCIKWCEHQPYSoiOMCDwv1DyhKju6lTFGqFKXO+RXrwA1csBuEYRfwgABq5RhDmLJAVAIMYC0Me1CEI+XlzHGKeeAEnBafdFBUHkXlD0UUK7FHQxAEERAEEUvELYg9ALxA1QMUuICHcCSXIboBRsXRb32AMzlHPf3L87pFpik149XgSKLrYiABJiQbu7XX0EZ3qpa5pRm10HWgNpbmvXY2psKEBVBRiYumxxD0yfF+4RFhcOKf8uTBydDgQG9QA2iNNAqnhUWBFCuRLAAGylcAEIhW6rsQekPBdeKnxE2kSncIhFMQTwLtqlUHw4S5y9CmoHva/VBPrVxRoSAQJgJKgoic9kRheIYBERIBcwcACx1JTRqgQScM5u6itHBr0qhBsxat2rTrgDEjYrt2VZyzqFi6XHNdtxtQ2CIOaKHU/e2ri+Ee7MoA2fSUxbwhIBp/6EsBkrpI3jbygQfuiQiOrDHBHxAwqwyQgDwGALBLnUWCBAxYjpb9+Roy/wk3QM6CbfsB0CABSxQAnySXXv93+42ZtuaTv23HZhtjsRhL87XmG8w3mW8+33q+NN/tvsvue+KI0PgLi4TLN3UaMG7Gus+UbHrWnK8332j4spfb2B4r9owh3GMQ/P1r9sv3jkH4J/6/8X/35zeIF4eOyoczmc/Yz+9yx8tGBoAK8xg3HB/3Xk/VY2LM+/9p0k2ZNuOxJxgy/GvWnHn/WcCUORZ+dZZsb73z3gcbcmziBQDI4H0igCRkjW8HQ0ISbLrkpsva+aYOt3TqF2HAqN40JtW4af1pRo/H5k34z4I0Ty2b8twLDC+t+jetYVr3ydP0WaYvtr323Q9ZfvrtbfojJ/2tNjOyY0BujRxSHRqQl9GXAgoy+mFAYUY/DiiqJdZsXwtAMZBYr30DAKVAYqNqk4BzWWLzgAtZYuuAylpiWbUUUJUldguoyRKXBdRmiScCLuYjazwIlyBQnNDxd6jn4zYgH2sRfLeGyBuBeX8dvQgt3Aq6mTwCBwO5ip6gBxjoGBZbM34NE52ChI4XgbqSgsMohHqFmIhSL8HR1+qELePMETQQxH8ATAWSCRJ80KkVSFyshn4rVqc4xO4K9/sBbZUfGmjTrPCOlAJr8aYOsysMEbR4GDZjo5nqxAmguf2d+5ll4+q6dZTUZq1hMoksN66UXJTBBGyt+DrbhMcLq9Bk+7CpxVTXjuuYlC46w3z6kfH9bpWmwC9ElhFLbSMmAlXH7IyhWaYUCy19n4kkfj+MNwH1CXMxzHzrLGoTEVEJIpwww/SO24xCz4blyGgkPPISNVwJHMS8s9eaLgV7MO1MMFVxzgWKDObEffRpbR65hHZghKBm46hPHQIbxBUaIedU2SrMOQQSCxSYE85BZDigzEa1QKgIKEMqmHOWKIr7/orgvAATAUj2mnDy/ahrDOXUW7VsRjmHFUELlLgbeqsOaSaMtOVts1bo7cfGG5ZmMnzyvz7a9D8A49yfhKY0fT2zRlfuOMrMoba1d2Hf2SfChT0yvB6uDam/YVYHeti3rIR00JWgXBrYWqccXULUgWBDLc56ozkbZOKZwbkbwr43STuwCuPa2d9GGGB7Fc7RbV2Y1ryEAPZ+fo+bAVMVWitQuWZzibW7iEwCHXQ7lilW/mPjcU90+t1SKzITRy0tdDnD32eBJegGqTt8gwv7C7U0By0yLHifOEbuQI/HKbSqiN2A7cIrLxEuI4jzhl62d8SsW0WgmoflnBB4zekZkQIL7kLPmy8SnYVExDCJn/vsvX46iwidi74aH8QGlQbnqrSnHdb+O9sslbarcTLIeXWoS3vjlXrP/Atapqv5ib+Vp+qjuFwuDUd/fyHu9CVTIq+qFWJV1Ca09xxlk3lq/Sq37HDeHFvIRQz0Bit3uYQ2MH0kRGaKWNr6gj0uyh0nEF3uif0c7nh4lCgrKdH9hQwYPB6dSzZHuxICRr/dIPICn1SQxKhh5hC5lEbayfHCibqcyA3ZtYkTVgm64xjTZc9SxrTlX5q0if+LMeMTHtRHRueOGGKjMO15oLHaiPWlWmRl/IO10evXz7Uh09LcSPILgN4V8uqJuvCbsexNLzoP3QgU4zJftrAt4TZuhNhSaFJDq30QNy+xijFVzLR5y1ZKXp6namdX7u3I6Z6K8vco9tBP1UZPnALuwG2CMSEhWTElyCqRQIzcxyntYtKFHuO26n2pAIJzuhqKmVWMk0lxlhMvhrOMcQYnpoV7MSCclFSNxvg5F/MSasrgQr4o9P/8ce7LjPQpQTUxFy4xpt29wJlYCQSLskVnUbXUlJD+kq+gImoiUOysTerfknkgSGBDUDKkls/jNmRXBzLzuE4Pph76s3u6BjIpbNN2/uUtpLEO4NfUee3hd2ICHNJIbu7KwOJmXM0OKEjTZcEy+gJZO1A8QqI9juOkuT8zAuZZP3b47Ea8GRr/Yqom6GrAfgurEO3uc8eXUoGKktCRgBAsVnVIoJf9NmMuK5NrsY9ALjf2gU9eNkQ3qYUTAKnCxlt0ZamUlmPRKIzah/3WyZgfmmfwywWHYariaOMQdaAnLtycQZ5AEUKtcuPbwWIRiIXc0guTOqWrEHyCxSaVinmQAkGenh5YyHy4OjCmRFbrOukQ0opaxEEb9LTnu4pMNA5oajIR6FNAvzNYBLI5H1jCNkosMq20DStOahu6Tl25xsb5RqciLQK1kSpeRs15JKSgo+2DBNpTgyY1mugTZwLBQyFZ2LYikcEqfUfXzD5bqRfbmJc7cYYTstDGs2DiLeG4oBCqhtfubuK8OpzZGwftSZqHgjNcMqO0bGJkQTvYWwXWjfQkKZ/6Gt0O9Ma9RrPA7FkHm4ogchaY4T0BfhuQpl0SlqxIwD6dfNlAQepRTVGp5sm+1YGJbv55UKec+VpxVrICAWlg8rr/IVfIahPZWyD4cFFDlIMc+CTZ15JKxmYxJL5x33PQTi4/jNDXsEHs6OL1DQlR6YioBK1LayaotNggHdb6wZHpOYgdxN2h7EuKiQ2Cu82lamU02Q63JmZzS29vUgECR0IeX+G5RNlpnEnO7QNnchXLXsAOlQQHHeTBg7EsUtguvOiQEKbkgjf0n6GjHfqwIC4SWja8GiY+QtaysAIH+Xtc/S34rotjyJiIgZU5ikRm+iLHHqKCu1qwRWEv3fudKN0MuGkIb7vVjGeHHxCp9OWJ6ErT2plncvoXMmdytfNnJjFy1gw9xNMkd0saBFfI4o1358aFbq/Y7HG+0KmQY85AZYiQxA0RN7R7GoFWI0woIEO6jdfg5/lv1W9L8MdgGrzibDAjUzPbmi3IYPDcUi4SpawuXitn7HSA2yOtc0ts4mgYWjYsiSiVXBuGBQjXZXxxpS2Jq6yBdvXRk6hLpa/aV6B4YBjv08cEdkBW/TjBgnZNauhzxqZs3IZtaqmJYIwCdm2CuAwGScMv6WjknojNJSYEDVznSdIe4CUSKBCkndAmwd2jkRJS/wOiqKUozXfWEQvrk2GMFeh/k3cHmd+e5nwHpxKCSAEShab0a9gp/nOaf2S/o/xG9ll8TwiBm+JxaYSCbbEJObCxpFX4W0prjI5tAu+5849d5//w4G4tCb/Zm21f/T+Nbt3FsPz5tFFX9NlIbH+MUDEgQNPWNDZJoT5NdbIxox4IqtKPpOXydp7MulwVpi68NL3QjJdbr8VparAvCppfbCLx6mT+zMWP3/nLtb88S5po6i/tPz5fgrJign1I+C8ng+NvE7413p9rF168tNQhevfryFZSZJG3V0igtyMl6O9ysaVvgGqGS8vU4x6h4YtDo7tnP42xk5KyqVHRYYBXqWC0NOfkNTdnG6U3N+VkdtbnteAMzOxO65jaGRsbmNknmTiQDx9VYHY0ZGa1N+ST0xqbRVsbs1uw+hYOOkQjG1NTQ3NbbR0zW5Pf7ATySWpUAhnss/zDmi+ftaPolRu2TY+xLj7oy3F1rQgy9SGLmmrRS//lS2yb2xGz9qqistCVV0fiKdba0at0F5p/aiJS2moXkBRu+nbeQdPeSo9s6wkCN9L3MS9ieyHZcj2+9pNhhq58fh6l8yaHGNjLty5eiJdnZuh+NoqrBqvTz2Orv9swifLM8rOdS0p795yfyM/+IJ+ZrP3pVDKTYxpEhh8pOKo1y1L5Ha/zu0tFqbapOo5zFQVfP9S1p9gfZN4cTnie0LXRlfQ8qXwDaslp5pouMkwwuPsMOiE4aBZsOflG+ED4727GZgRNYxN9XVNjqrEZDCT0H52X7Qe9I/6E9zqfNz6qoQo7hPeaXz69V0QVtoQnI+7F0SO60X6TR2fG42gRPegI/N26X+yk+swhIP7btCIQRHWqtgyiJvtGpxYmsjNiZl/SSme/zt4Ji/uYe943oR5EfcllEZB2JjQoNCrSJzHSlR0ZfWs2gLH4Y3HYJ6Hd5x+6VMLVuBHe9WdPeF70sb1S6GFnUulRZzPjmYVAUOK4MXxDn61Pw5dKkhZ+SWJaEr0OQcdji2X+J/qSrn6ayTNrXK+e/51eTOBfc/d+4AuOj/SLTLiYk5FdGavnesQG1Hbfun/wIcp+umecGndz8Pmu/55jhWYX+XVxtsnULo8PN60YzgdNTK5k3ltIvMyZ3AAkf+lj/tJ/txSbX4a/APGYQkhYo4f8GZW4W9QBzMuFp9hX/bT43ghFd/nQxpC+T08fTX56yqdsHZrCmE1KDwtJSF6Kiz+44xkW1xdC9fcLpfWF0kDxtXdsSt3AG95nRWffzaXmLyFkYf0c3xov9MD9o/Po6sQzfuNk2yPGnpfTh58ktDOyE5tANdr8BVvFmjaoYk1lgw6b1+OBR5THfQ94Fx/8+pMaQh1UQ6ifwL0tQ7dm6M75BLKHm4+LQ5CXLRthbUwO33/58Fbd+Zq4GF0TpJCtdsrY6DQxgiXDv0ihT/A8P5cl7t3QuqBkyjQ1KTn3SXBi15Uk3FBBuF2KtIOuspLQaEZA2iKuQyBSJ5M4IjfcFcW5wfM5x+3gjWm7m5JfjmeNTykE/wmZd3no/oT7OI/gcnfKl+2fAYtdlacfU3kzjfOs1Tw9Dtic3BCSj8idAS1FWxWaDccRf9abIzQWp+/BxieuUAY4Fvs7MjriF3Ix8B/aoRRWwiT+2bfdReP76Bm04DfrWNneH9EMik9onGfaNlh0Le5++w/2ZydnfaE8OpE1Vawp0HL9y3Hc3o87gtUlOQUNrM/I29SN5u915eUZwlWyP5KdgzJtdaceGU/Xayq0jHL7rYg1jM/+QN5ab07+HAGdqByHgdsPegDH6nrUXeIA2teCTYJ/A45V8+hSlwlYwl2LgL3B127ta6hQQSejTE5FibMPfNr/6oc0nqOV9RXdiNwYw3YNWTseODkgBdYpsPNZbubQi/z2yPXYgYs7lzpH5DLsHv9+jP02v/J9dXKHGkUNC4hh0kGVWt851nI32nLbW34r7WccHf7nJBTdL39QUjEWHBhliem7iam4kUWM/VI0VWzF54bYrLdoykuh+WAdCb8fK+PiuvyukOrm4/sF1q+vzZfqCbVf7xJpP3caZmzmzhkItfsJtZYTYXYHu3UTaa7vAeS93ec+XGNz99/tivYf+A04luzXg78fz4tu/j75QCEzPykmujAvEVEH65Jr02lyNKefQ3Wlql8fGbLOE13d/MS/sdu3fjfXnfSd/UYPV1NLqlVBTPHgBw12eq/mS/JGElUMPfh2af/CphSmRNIYyekID2g8pnsxAz2DA4ljCfdZB9+sVmxGZE4l7UQVpGQkZAV7WpVSbP0mUzwbI2/umf9Uy0ktmcz+nVCXeYHBoIApdmVs5dfK0KN0MJ1jTb6V4v/+/3HuzUc7UyWlF4qOqYxBmdbeY2f3SIyyvkk0sHaD1eUgfqzRr9041pagnaRgtyT7OrL5i/+YoaCf4SxIlV5R5Dt26/HgsqTGbs3dJ4aWex4fg/DfFl2iB9MrRP+IHiyt2Aep97kfaNXLixA3Hh26BIdHZxoA79hwtwI4nlQAYsD6fAIv+xngqaASOJ5U3m0CvGMTiNs1dj2akplvk56fBM2U/vL+cpAoe/yAT243YP7wGJyNaa6b7M3ugJ5P5WQ7dz8v22AbItuZVvnAMfHeq3to+9sSKQdBtNMoyeD/R+mZme4Ohm42QDoitPNSevRecBYPdQnwwH4mKP7a2KvjnFt4VvzV6NrT2feIeRej4luQNtDocKUHY8xXMX60zvv+tDdcxzH7vnNIrQxuvcTdXMW4RdPdopNboUOSldQOFsf+X5cbbg+my7ABD0s8EaHpN++9V9z60pDUQyvXZ0zppZZHJ/eBk/D6wSNbB68k/HmVn7v8eR/qM8ydUV1FbwpipiUQvRYo3KSLfnG5AgnTQhyxZxLgCbOhu8G3e3y4m0gWxN2lq3Ze91rqXmKC9bGdjZMjvcEp3KHP9s1xfntFf+1DsIwqjmDUx+amJRsHUa/e+yz75Vsdoy+61DBxST+uNIZxF/YMj0Rn33TB5gyz+yK93DxKyKk4NuCBLZLZBDYiqmG4XvkGaaiTjRiGRrC3nlDZWN95kTQz4KQQi6bXidRmn02HhHsPXftVUw8Zq2PFQ3ei90GytP9z2iNCwEeeYYw9tWygNcxf7xxFBsbZA4HOnkG2QU4iZFhlT2Dv3SvRihZgE2D3CgGfQC8atsGlPWTfDXTy8S8lM1A2ASxOXEz88yar7JnAPu63nJfifq1kn1sVUvizxdmUfWc7q7+3Pq8/lp57B0io0K83MgPXKFSEDbjFl1xhlNSesZcn8F9wV1LuxpQT417qJp6jpvWBxfE/69JjN4KT+CgLgFtk7wRHtA69k9v61ph2h1pkELdhQCugMnrhH2W378pNmskrbMJbXIxjXrXKAVg8rkshfVe2kbzh2JT34fbNoY/9F9iGgW4OVn7GOhru2gd0rjhYxDqWfOkeyZj2PNvkvYG1p7v5evkagdicLkd/d7+bDv60TMsdmz3moqr+17qvcYDCAIWSOMrqnhy+y+6bauvSTuJiE1bh54v8tvhfe6mEf/fWE3aApGjZ9n5TiEqYWF97szYhxCBsdr5efn0LACd9+U1E7I/x/ndm/gy//TFjEV7YHj1bxoitPPcR2FT9cueJm5uemMURt70jqnhIHiQOhV88Ni8+YlkJXoFePnjPuVeD1wZfz6LXu5evKsrntqvjfi68andpd30zh/vZrg52fE2Av9cEYotXNTB/ZtZv2N+wfz+N+XNVQz73hlLXSu/Eq6FrQ69Gb19b6VYC82Eh1t3nBSYJ6hey9CROkMwC7QbbbiyWmTAIRel6hyVJthF20FL+GGGgiABNXYNsoqtHNtFQJ5vo6ZJNwKLDmR6Is1zBZI48KhZ/P/H+5uGHB5f2zz08dPPwq4mXNeI9/2GqVvCeNKrr2i51ILOS2mHH4K9mnrbrgfv7HtgEyYS74nsuj1dxfHnw89259ac93zyDgjycA1KDOL+ojwNpJqQ26eGDmsSU9LxCZpZv1ehEaH1hSV5hflFl1MBQJbWoNL+o9Byl9sGgd1VOXn6RRlp8TNjkXerSXVro5MfQh3eoz+9SQx/CEWFLnBef3f33FfI58uflZXdkVc6r5KhU/HC4LwiZfOKr4hOr26tgNDje0+rE9O3t4Bt9v31oYfoLhFfRs2LzPCzNM1z61G4r3Q1zuxDW0+xMVCRl+rUKPVz7zPPyEZtSlBwTn+NhY0d3SAscjHSuUAqzEjEVD5FMsPaxL5O7pvIiSo5mnekFuDkHJT1SNInkRyJF65EmFD78Ow0Gr+0qOi8T78x2n+m8N1tb115fXu3lauPkFpAZTYsOzHB1drbyaWA0lu8XbK27KFBXdciu8pBAI1Go5fwha4GmB33OJmMpxmN9zmV9zuSJoUGj8dvO4DkgQDKzTohOiwsOb4rpCFBOpuoaKSm08wV1pmRlXyhiaHnvs/JMlbI92pxNMQX7U4pOoHU4egIb30YCh4WrNVsLPJzAEY9FF+vzNvsutDETaXQd4n7l8Do86ZxA1eAlM10985qMQgM3bTVDQ4Ib5INKA+/V2qsgShuhXKhZOl8ZGlZZuVRdQ8lU1TdUVdE3pZBNg4zIID2c7jjuyFhg+I/7xy4IH/tlPWINXZV+ifuxkQEkGTsVgq6uWh+1uSKzsCr5bEiwv7dDbuRZEBgJs2Z4H7XTUSCeONrnWx+fVnglJpjOVCqTKqCwEgszW5PO9J3QV9E6PSbjnwFuIKwGu0XkhkFUn5CA5DmlUpoJMUJswgu8vSulNNZMbWgLcIvA4LRa4/w9P8f1Z+0w4FiQf59gbM40MSecMjcm6poagzbaUC5WEtxGq8Jn6RnKycgaHrHEHsoBpLKXMCFfEh4tDBxU70v3htT6BxuNLt4eqqm9O1zXifVxC7OycAkBLytvtzBLC7fQAKCVIfEqRUYWAcHOXhQPbzdnp2Df1e/efpwemno10dNQecXVzZzMFSWyraZhaMKISRWvjAnQIiGN33b7lu0RFVXWy1GmwPljo/uF75+3VgyMFcsEs5BTumOytJzw4Do1jEgggs2RjdXr2V2fbuJS3lK0OTQUSJorJwl3Xhst8HMoaCrZqh4ArVMDptOGyYd8CQ52mRutevc4Gv85c7D0mLlq8Lbo96oojSX65avg5sS44Ef21kk24Fhbi2vbiUWpz3PTYxGI27KeX9mcuj3f16Ij5q0fuZsoeZJo21VqlWXattAzZtV6wklh6GHSMTVvZ3uSooFLR6ZVppVT4oS5tauXVQ9mGyy8RH7nXiKazdkyWeNXq2s32971k109Apxco5z0vgiV7PSMvghnpDHHkdlN9EP2Lc6c8zXMbIrmoFGDgfrMabWUHkIm4cHjkUCE7mGo62ahdG3dNyl7V9LIwTOhsaByfO9vzmKbxkT8SnFezqvExFdZ5ZFrkwmMkkgXhebE2IdM89C2M4nWl6VNhjYVWczrdPPQgjXkb6pukZTTVJ6U1xQekTXeAaQow6+zX7e79I1No4xN9EmzWqZNsXU3CYaR3KUETWNjGzamzLVRHA8bFhT7Tw9XEMtm2t35ALnkU3NqsnxLtfq0t4zXqma7V5yNZZpukk6XlOOz+oEUJfT9tdxQEf3iHJfY0sHRrNHXx/Fb2Ma03mh2iGlsAhuiZsC3UTi2ibOklBdpIbQXCXKXN8c3Crv9Mvg7PeEwcNtIYb9vIK/GGT7Xy51TcFttsGsGXE784Jd7+TODRbS96R4K85voRlYrd05RDc25QNpQ0aLGUOcRMeZ7bkdGx/YbvpPoF87WjN5YekbPQCPzbgwts1dHoM+eniUcc2NfRGQsqKh84BkuryqrGuTjFy6E3QEy7slxrQl0L+8EemtSnMC0vC5RTp54WkFOR89HRw9Uae/Ck4q9JFOCTrWJnTCSK+MITyr31LzkrHLCSR4EG8XizVwYaGHFXA54BswA91eIN3NOQ4tr53ICg2agXTrO3C4JLS1dzAA3/2lgaSeZ22Wh1fcX+yBE7YyC73dikrljPqb84eJNX/8l4EzHeMbE+AXSY3yOe0RHB/rGRCFucEp0u6DpUIbwoYwm2HW95UX9rtguhJbQ/1cOQu3KLj9cx5W2inAPCfGH9P0pcPwQB9Ke354yH1IH759/xH5TGAfFH/kf9j9/uY2zzjffL8UPdLbCchm/u208JBNICr4x6JplVXLYYt+xiWz5qAhfL2/9ue45ZqDncpXLT/vzmYz0uG4oObvzx+8NN+eHRuJI8oBbZa8+R1MFHn98IlP+bIbNpDKnhJbvVeKqEqcWh9wmuIa+YTTXfRvYon2xpqWopLaltqKmpqO46GJ7bR9PCy0Kre1poUdgLgDPY5z+j4KHpud5z7rbdQGcMaE/7lIX+7bmwDtJuXzjnJ1w6SI5PTcjLuZKRV5qezri04u1jqIlauiR9EhkOHr0yIXiLA9eb0P9EBozP47eVMEsbW2sUnzyaf15ebOs7tG1Y8XJqiQDNSp0tNm0jdgkdZ+LgXNEaqRaulYK5VJsQV5dTEhKulakGjW4kpaaVkkTP6S65UKUp/wdbp1rdRhxkJT32gVrqroaLknM7MSYljpG7uUG5Nyp/54tvADh0sIYa582i6MGRrpEFWWiuab6KRJcy7vdejvud/wYOrmrQ3UPZzdAdj4bsl16trMHJwj9C8BBaPxKa5K4nayl8ATWSLdXfZuqajai9urlaXVLWl1S43gaFezUNHGc2viWGFVqfMapNI6ZqJrQkGIdrVlpSR2gMlMI5Rq69DmzV4hdMrcHAWfs9BAoTZU2Z769bOXxZc3VFkp4xWibBOFYwgTorrQA9CHSRO6XW+RWuU1ulzugk+IJJrd2XG6lfjva1JwnrQ15Fhg+vshoU78zxce0UticGgUkldh2f/wL0iv1vW3a8KS1TM8CWeMproOsp/4470mj6lkw1MdTho+p9Irw0VTODQiyMjyVlWFRVoYll3JHw5maAiAoawJL1qzs8owCRFg7UwQYHKuvA6APmyGAR8X+5eSiA+FGlKvISqHXVEyywqAtG9PLQDYOESOUrdi5bKecB7mT9W/92UnbzKds/CivQ1ggaPNaTYebto+Dm7It2LtszSNuSJ/mqPEUqaYzG67KzmDhcq440LVTrjHdCbAH3C3KLoZujDGxdgHfzSH/3ziKTf8HIG18azVlTW7R07J2d0c5mZEt3MkFd2eAu7W3sVJe7p0CX/6/fltthFVFKkqjtj7zaoWWRHyaxBAL0BcngJzxrUs1ANWoinudxTTyo7X3vEkF7WDJOkHMB/f2PmpRAYPiGEZh1PFXRQ6uOCwmCQHcLjO1QlaXT8roV1cmYLFRH/qIMoDdb6ZdyDqrc40JgDyupesAej3axsPANaHW0d+K3v6VKQO4dWcnBYyNfnCmBlndj15UYmvdLQVZXYXCAbDvSi53l78mgAvp6tvmI7ycB8vFRn4rC7Z0d8UzgaupqRsZLwDkzv5TIUDPRtu4pZzR/x9ttS/uo2IB5q++zRLVtCeAC/F3TemP0Fvzeym4EC8U3sW+Oa/B+37nEQDoFmu8ZrzdTlxV63fOfcsBAMDIT4LbAYC5ZvPd/8f+n1vebbmzALigAAAQwHHeYgTAdW6gdaFbBSKcajPz+Ekgi2VtdCuFUcG/XvOq0KvaX/LtBzg0FzbxQEo8IZXZxItGvw3ZH5eQQ0tmykBTWTCTZmJNLIkKSSU0YkCCXm33OCStrZMrQacrTnHJSMkVWjMprt2WUOdV1jUFdIKyYhLzf/dFofSrNUJPXZ0h23k0yS4yQ7itdzJmqjhwsrzqj+7MMqlnKY2qS+yyhGbcFLoA6XqJo95gFYoY6USEG+HNc6lmNUzcTbHsuFSqhFJgWYx5103ZxjzZymZTZ8QGj8RAxo2ShcMjb9pOU86KrQLkSLnRmOFGDjONFpx1CXp+s6dvOVx4h3IVL7nbxFUagep8f8S7NVocxKxEfnWDR6/hXkQ87T9Z9YNLZnCf9Dlmsfx8zbHCJMebeqYquSWXCc/YpjXvmnpUiazbSnKTQegpCAFh2s9hSjah52vufYbz9A+ryVFgrtCbZYzt0mfeGYLrgbJalzUNMqomgVWMVFks67y0EFM46+Y3I3DNNWVxTUwuiOvSaiYFqW2Ab7tDuU1RShGhKY6YnJTioazeKCeihEYwu6wmG9tUK49HpautZqJ1h+zsKPQcWAqIKVEnqsSSmJtqnhheK9M0WhgtmepO47uVyu7QWpqtDIeIjQmvctt4GOq3VGnMpi5Rs9OaD+OCoIJ9ijAlxEZ3q8K2cSvUZp3SmC0KHW3jbeojAD4qtIcFXFQPgB+g0B3g59viFAADqeUBeIDyWIQYj2NR/GIqMalKLI7FOYHJ8JDbG+VnZwxJhEixogQLFIRKghIFiqMigSxCBQ3lf2Jj4XzJMV2HhIZtGOJsxPx3x1+U6Iz5JTk2Ivg0hJqUYJ7IBqMJo7HA0wrlnUoclChnBYvwhxO5lcrUnXqV0epC08uiW50qEoH8CHRHjrfInPkG3P3JiRAlkIUK83VE+Guys6hlxhiJAQu2q5B9cEhhYPBIf8/JTwAA", "ok": true, "headers": [ [ "content-type", "font/woff2" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/icon_bundle.svg": { "data": "PHN2Zz48ZGVmcz4KPHN2ZyBpZD0iY29udGVudF9jb3B5XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiLz48L3N2Zz48c3ZnIGlkPSJoZWxwX291dGxpbmVfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTExIDE4aDJ2LTJoLTJ2MnptMS0xNkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6bTAtMTRjLTIuMjEgMC00IDEuNzktNCA0aDJjMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIDItMyAxLjc1LTMgNWgyYzAtMi4yNSAzLTIuNSAzLTUgMC0yLjIxLTEuNzktNC00LTR6Ii8+PC9zdmc+PHN2ZyBpZD0iaW5mb19vdXRsaW5lXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIvPjwvc3ZnPjxzdmcgaWQ9InJlZnJlc2hfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1eiIvPjwvc3ZnPjxzdmcgaWQ9InNldHRpbmdzXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOS40MyAxMi45OGMuMDQtLjMyLjA3LS42NC4wNy0uOThzLS4wMy0uNjYtLjA3LS45OGwyLjExLTEuNjVjLjE5LS4xNS4yNC0uNDIuMTItLjY0bC0yLTMuNDZjLS4xMi0uMjItLjM5LS4zLS42MS0uMjJsLTIuNDkgMWMtLjUyLS40LTEuMDgtLjczLTEuNjktLjk4bC0uMzgtMi42NUMxNC40NiAyLjE4IDE0LjI1IDIgMTQgMmgtNGMtLjI1IDAtLjQ2LjE4LS40OS40MmwtLjM4IDIuNjVjLS42MS4yNS0xLjE3LjU5LTEuNjkuOThsLTIuNDktMWMtLjIzLS4wOS0uNDkgMC0uNjEuMjJsLTIgMy40NmMtLjEzLjIyLS4wNy40OS4xMi42NGwyLjExIDEuNjVjLS4wNC4zMi0uMDcuNjUtLjA3Ljk4cy4wMy42Ni4wNy45OGwtMi4xMSAxLjY1Yy0uMTkuMTUtLjI0LjQyLS4xMi42NGwyIDMuNDZjLjEyLjIyLjM5LjMuNjEuMjJsMi40OS0xYy41Mi40IDEuMDguNzMgMS42OS45OGwuMzggMi42NWMuMDMuMjQuMjQuNDIuNDkuNDJoNGMuMjUgMCAuNDYtLjE4LjQ5LS40MmwuMzgtMi42NWMuNjEtLjI1IDEuMTctLjU5IDEuNjktLjk4bDIuNDkgMWMuMjMuMDkuNDkgMCAuNjEtLjIybDItMy40NmMuMTItLjIyLjA3LS40OS0uMTItLjY0bC0yLjExLTEuNjV6TTEyIDE1LjVjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41czEuNTctMy41IDMuNS0zLjUgMy41IDEuNTcgMy41IDMuNS0xLjU3IDMuNS0zLjUgMy41eiIvPjwvc3ZnPjwvZGVmcz48L3N2Zz4K", "ok": true, "headers": [ [ "content-type", "image/svg+xml; charset=utf-8" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { "data": "d09GMgABAAAAACn8AA4AAAAAUjgAACmjAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmUAcg0oGYACGTBEMCu1810YLg14AATYCJAOHNgQgBYJ0ByAbL0RFB2LYOGCA7DduwB2DjQOQz3hJ9n+ZwI0hWB/YxYSYMBRSFENBsWqrAkWbJBHpUKamYBECLd7YUy2OVYvlKX1dMf05+T/7LtU4wMKUW3v6cz1MLF0FGyHJLEG01r/VMHufgpZJIoGKBHQMKsYkFpgU4tsDmtv9xsaIGoiNiIJRtJKSElLSIdGjQuiRIypl0JtBlKISJSqZZnH/Oq0ZWaYZyYoPCFpukb7+N+xuwk6iBRZMI8WdlLQH1F3R7l157zoCyXjA9AD36nWBrP07PZhwgBLSeMnLEQ4VqJsqlv8siGuabsED3LeKFnxrugO3hMah9NJJ/ipRkvNo0bWSH6xvN8TX2qedvrqte1s1/yDEW6dCUB4tkIxQEeoDTSYMiiaAuBEGJLK/dSEgoaIi0Ua4CGXj/7vX2aa3YewLW7L1Fw6EC+fgxB/7NWWpMKZaUyFMhaxEyArLmA7J/62Zdje5MjlgYyvcOTf7ZycwswkX9oD2CklKoSNIzN4VWFXVET5/gKgKaO9USZgKCaxcreurQxDS1KS6SqUxAJqz+B+OtbQOoul9mcsgjITAKKN32318dn4Bhdn5t38EFHq8pCEUmUMECIAIFw4RKRIiRgxEnDiIBEkQpSqgdDmAQKCAVcCaECAgAiDACvyk0ex3gJounDg3gOACJy4k2DnDicusvN3gBBrAILTCpecT3AAH9C0NYpDo+7rNUJuyf/BUQ/cM42KIV0v11FyNhkyiUDj0XDKjjuX1lEnr9K7FjMnEPpZVifqZhCWKr4SbqzTQwLYaKjSBrueqpWpPjRbN9WixjymuFFH/CwqFBhYDRux4XXDRJZfdwE+IMBGibhEnQYq021SoUqPpHm069BkyZsKMhXQZsmTrQkH1yGNPPNWtR68+/Z4b8cJLr0x66515C1atWbdh05Z9BxC3mkNDHAcJeFI4TeKEYI8bP9Y44ePEm77r41+ewEGxRUrtUWZUuIsOetH6bTJql3HbzKjlpPZkximHvICSPiqPeMwTngZTLZpmhlleMxe8ac9b3jHPAmuss8EmW8F2u3bYZS/Yb9vBNIRJvask5+7FELPwimHcaoZ46yTaJ9WCSTY0DsjmwGD82Y7DoWmOfu1MGuY6fi64i8JTF1OyuErRYMJBFtuDaaussAMsMLJnmS0vuQHreu+JDYwyxjgTDXPAYsWQxpkTT6ltykCFu+glcU3S4tKxymCyyA7etO0t75hnoWEGSu1TRoW76JHEG97yjnkWzo2mioUhQSbYYOmYZg2ss8EmWw1jsBYFTyY55CV9Yp999tlnP46GGajhpolWtE5hDEphgsHaYdbBBptsWWTntaOdq59hH5i0BI2pTbJ9tW44FNXel24XIjwwjRl9q3SNYW6MMqPqdvrNMVySVP2Trj0U3CvhlYipV1w9cpuCyIgMoYoJ6uAoNADzvug45Zj7yoBXfrjWup4FNpUP90w83Gjmo+puO/m8JAbcN3D4dUpCw6N96EFl/RgLIB76ETisxR/w6aPfR7D+NjfOfbeHOYYeHrwM6cPqaG0C4EDa+qeN8E9UN/umlSM27Cex9S8bW/9cmENaN4plychcK2z/rnfLbrbSThvtiLBzSrZHuO7Wmpvu9U1ldbZfCTb4hlrtIxcAHO5g65ppXrrnhMPC1kvnK5fWHKkuAKxYS2ygcV0rlvjEtGOxglUm6USA2od7bZ7ZA0zgcMNXu6Vq96DjVnaFuUnt8GvYm+2/bLjrmx9odH8OHtYJcBgN/b8kxzn07RsPkp7oNsv+PxY7vLXhbI0B2O6kbBr78YIaGQ9mNpD/ZDn01If3Bh8OOu7XP4HYqD7kLYGVOfcyTk47aKYl0X7mMjiMDjPg7M42er6j3/abnabFTbZeexnmm/4ZPQMO37lXsuKw1GmniQNWEawkgpUo+P+g8bqExlXC6NwiDU+RkuNUiKeoeU+7RxcXffIw9p5jytx58d4L0uW4KO/t67osuGHVFr1lzLkJFBG7OIqjOKlO+kwUPh53gWwuEnGJGNdJ7wYZ8JOTEBHC5HCLTMRIT5wnSPAYSbKSIiNpslAk1h3SUiqP+NULp2hOtdHQAdF0S1ofe7ErOh/EMyMdczKLF9olnjsqE3JyqeeOygFPyuNJXV4ExVMo3X9j06MfxnOvIEZNoDdJXkZT5mC98R7x1gKc1fs01mxBk9dJBzawOQ5sKDkp7MUhWOFQrjBRrvMoIaKIEOVmyUxYL3rQ4QjYwQIGsIZUnapA3GVBSAIaNA5ND0QYkJFRiSHMgAOcYxIJoiQSJek+IlUaTgrBBg6wgcNx6IRwArCCIg8o0IFB0e4sQGgD2sfstj0Yi/vtsrpEq52XqxUx7wXavU9R5AbVfbV1p6EDtGWnJA/XVOMRsvo8RlPdHad9NxBpoVtpYHLL0QrVHnveFe6uwPf/7jyBq5c52luBaALJx8pX+LgSQAvlHBSU/jQISHSdPDXyK0T8EDNBpjzkeaygcCLzJqgiKV9QtldXCkW9eOkpVFBLmWjZoyokvMYGYuM3q7LDGjTAj7sPXGsYBaVQYdkTHmY1/zyKJHrVqlSqUatOvQaNHgpOvOwmgbx4I2vWolWbdigIDqeB6phIgQHjoSEEYoO3GfWG+xmO9H2b14EtgH09CwceqakEMmDjtbHwH1ywyEvghjwO6F0GGbeagAYru65f6TdFf8NxEZpQA3bCjcYxgDMmoUrc/1DdhozZ9MEhMsFlbnKRv254PFwOt8PD8DLMhvlhdVifRh0CAEy4lSj1fMkew8Zt+fiWtyg/Gs6H67an546+N+CsD3294PDnwOcHM058+/z/7Vt/15TJ8MUb+x/6/XXxtmRzAC4jjHlHw5q/XvcP1+XZL9e/HyHSqDHjJkyKEm3KtBmzXpsTI/YX7U0Txdm2Y9eeffEOMAIAZPHeNcAFkH5MT6DhJhQar4QOSmnAxmukk4d0404Pg1C8IcIZ7jem0m8c6GKCWZ7xmjkieMMCoyyyRBTLbDDlbRLDFh94430klk98Z5Uf/ITIL/6x7f0n3jtUBxqZCCT4yEItBRI1aiOQrFEfAiSN+hJI8bmP1LFAqs99ri4F0n3ua3UrkKW5HwRyNfeLQJ7PPVUzgXzNPRco1NwrgSLNvRYo1jyHQ6BkqJuBg+pwqVfwfijyRYUwvQnHv6TWp0PyKigaNh96H4GBhmyOegPVB40f59xGEvqhc+sAD9WxCKjVXrZAVDdIs68AhHKCotyajCaMMM33GHhE96JFqxBPQEEEoqpC8iJOGGL05OS/t6P7dswwoetDgYYOgzlyg98MT+zFf0ajcoEikxZ3w24atFBdBAG0lP/g72LZuroeHO2D0lGazKLkzmMauyiDCdhr2a5txrOVjSChgd2ova0t77MhhbcusVxATqdNzYG/FtlUbXRQPRO4OeZ3jE2LIpfa374QSXm/jXcJ1RlLGxZ+dBY1t4Brn0S4YIb5A885pd4Nm4nTxHTsncPU/uJFsrvfCo55+xh0RpRwlNVFmRZ5JT0a8vqz7YKjXITu0NETuTeLgWx0wlG1ZKwnE8zEIEPVAl29KW8grf5KvdJSAaHPwFwMFyKZcNGCzUM5o39uRYwWpCG2syOpPpQYJcOaFn+YiakAyoJBWW1PdQ3gky5Lyrv1Qu08YS8gSdFMp6Xw8V//1cwtjV/OeuogqHw10Ysw1TOlp8shZnahTTWfy4ZZH3Bv01/rq0FPiwuORTUH3Rr39SnJaRmeqQkMhbRqn4TlQFNuBzh2XJgnuDqHspyu0HjUXsMzfPUKBo4oQFl/59ra8oQdbCz13uBAOQ+7IIF6czUJA1lU66Bw5NYfWV31oNN7ypngGeWsuTqsEsrhFQEqG1WQZkIcz5vH8rsZjFklUsoKdqUiEv68IaVRHWA1ltQdWoR4IBbvBaMNWXDw7xohT2WjEINN7BucggQF7qiNneY8xhDhaJpbjN+TprJdqRJ68eUpZ5QTOoqiy71R/rGSuGKW/zv5f6bK+V+XqNf9bxu3tMVwufyHCz+PSnKjrh9+fWXoqLsUjumye4LFDWIi7dtumjw+brjklOBI+ScdTjXMTJQ4+jRhyjVAOkeCkt30cx/S2Z8qaXHhEDOrpWN7sCJd6FjeIVEmfARcWahxPLsI1sVRRvQyvF1z0BOqq/mw7dXZ5YiDWzSTRl1gQmV52yFfjGnz20KQxu571VcjSo6/lSSUtDza2mZJtR3ssJefgx5bpVWyM8HDYK/wkP5JPnL6UqVarauNUmfRkTOho3FTlGoP6PIFDRtZeBq6BcMRkGuIiNY4MYmDV0ujHNQz+aSb3NheHTbPCEeU8Mg3wvEIObtW60VLwLt7tL9LwT6HZUmRTfWEN7twFXImIwjFDI64QVhZ3NhBFt8eBbxHMZ8CaIe7H1C8xvXMdyxLPb6VIsSjjQ5Tu6SCqgAr05exOiWSIOmZeqYl2yAKsJ4IfFNStZo5LrDOMVUi2QHIrmqZ8dR/Sd8CWKfN1Wr8Mskb5eGEuUnILSj6pq4YSmagxspkGt6pTX8GqCojM8mUjwKb6kdQiWqQsEttHrQP39bBMb/jp+WMbYfEKRvFj3/DjHhrj/gV5E+5wKkhbQbvSCZBg9oF+S042qt+KCNAGgjS24pSDB1vg0HdlcYmpwORmpccTd0pV+zgEtazSNPfQ0pIHnElz5rKRywGsg04LtCsfnVCrglVCXW2UwSoJrdok1FMXuGCi+3BkEsTB73xIylxRo9pfLYQYxLuUC1A6WAXzk0miNkeiw1OG6sUC1JVAcxx+9QSh5gpb4ljMlXlQ8qQQ3dgkoicYMp93+rZewvB1cgE6qFuCI/w2OaxiJkb+/Jx6REGfgqeugr5MzGoCXlAhbvvgpRRatUGSqa0aT40UTVEIniStK2KkQNSWnadTS44MC0ZcShqn/tNbjSpzhJPWqmVtdIahqMy4JIurfISwFqdDknlN/ZkJWaJOfPmu0hCIViLEiCXeDo1fx31S8zs39RXB2funyM/h/4qJvzk1FE1AlLSBoRckNzDUC2Vie0A3dVydpP2+nlQlXWLmsM6kpxf2qNAnzxXE9I8zbaSdNBbUmBp9qN4v7SdxKEPSQw7OPKYqmGDHU1G25UrXOzQT8UESQ8gg7ZI7KplJNU1l8Ei8eqUd9TGu/Hq7MDh3qFLtVYpmTYB1RVu8jGGn+HIKixbp7pl08klbTB60qEpikY9sjLo9EaglvU96Bz3EvfEcLRjtkf+1rba2RopIJY4orU7uObY3Y9SlGnOR8UZRdWYYRWrEpkS6FgkfdvN4lxqew4RQe5mP6W+wnEkhvXYbXxIZd2qOGV+DxkBE9TT6D3p7Zq2VzJUAseOmluQLiocOOkAKDVWaXR015dYYhhgYrCcD6ml8QGDF/GOWXf4pN3DFIOvh2olo92vyup7stXa0MvaZcUB90LXMpfiqT0HdGwvKlR7KYetkJMa2zJ/eArTc+pPLwuQVoRD7jxII8nWDhElbFkfTa6MUhEyZ1g5yvyhBBlM5pzxUDZLT/37WD/EMrpTwTbt4IhlG7ZotGO0+OI4aZ8Go5MwWJcz21FJpnoSIFY/ccFOPVCPGOEsSkbF/PQIj5jGOrVbVnfwRTqNq6nNasQEQSYH7oLXLiW31UgXpk8J44vqKc0GKe+BUadt3wUGAkJHB7zFtQeGQxccdSieReslSPWf21E+PxPTi3gAyczhLgUOemFaBT28Nb0szb2eFfH0QV74/FTUWTUSxGVUnmvtGSxEF+eUJztVfeYpr5KlNEbYbqQ/w8UBwJAH0HamgKFli1D0/cDgt1aKRsyIiBkajPOqYfpIH2OmzjUXl2DjQBcnYNPzP23nDgeJTLHZjvA3F6eZS+qL+hBHp2CFSjh9r5hEHI5LWf8yYeu+fiXuj2dEpxTy4BSscCAS7mcaFpIjOC3TN15a8XSiiv1d5nw1J3XvVVdSdCXBLyTQ7X6UP791na9WoVPtyKsOfHdGN4V1cnOIkpCaGROZGQLYjJzIqtrI6Io6olJUVVV4RG1VQhxWw8BWVUnfSk9FQ88uQ89O+1zrjciqGmx1dYKSoDTFEzCaH0DKetZ6qpr6NipKhta6Pz/vyl71JjjIgm2Mo3dThbeljyxJqar/UU1W/8NoQ8MMt3tOGvIR8uHF1YdJ9djPRUuCiuyQgv0MsjKrmh7gbl1DWxUY4ZuThDq3YelD8tGWvyGgLy1vY6imbeEGLDOpHO7hsJgJURqr/sUfdMIUeQNS3akvcKdANyLxpG6ttwWvR5SKf+OeDogqLHnnfDSKVObzyPWhfkSuc08aOBScttLk84hUfq/nmw8c5a+vGV3LuuaOM8ilM73oei1b0HiQOciMcqb1WLAxXFpjymrKekl9Wf4AqqVC9FkHJbMIdHx1e6qd9XNg5NrO3gaSJT+J0MR/vZGQBOTgYj7stSKQKXNVXJDY31kSRgv+kF24ebC3cBUl1sW4FzlLSg6fQRYu7hOXE+KiplBr8IY64U2sYRs6DULU6B833EN1i/QIcale8TkFiZTnqB9vXuxNN79muxhd9Q6O2QgmRCCZ0QQ4jJKJnpTGv+v9oztv+iwCmx2v+PFGND0YOBw/gIUOqldmXGhMUkLkg/zYNCQBblntjGSPaFO1s10v9n8avPBleHDEAF69UZnZrVe/kugkTRzewS6vfEa97f0yw/q4iTWYFOobntaUn1ZEjgpQEKYF4W/NhTyv0Yd/jpcJkcNPVxmmV74yjU6gZf4ppenXaNNMkCyKPbn0FNpK3wWEJHdmZqV0gZyeMm+7ch9v5jGOnDmQHhB2JdRa3fDkj3rk9+T/0vjk3+XHvmFPPPktb7jXunTtve7t2X9N52URmJf7Oyv7Z1pSZER6MpvtCdeYGG/3KOJiemfEJYDQapiYQomOZSg1yG6ZmOa28yKIOPdT7qhorWaMNs35ggvr6G+bbL/MCjzP6ah2FK4FBKZTczOTe4A20vPvgNDZoDTV5MABkCq/LlcqJyNXIgcCLfEZqKciVoFpdFmDesA2F/EViFPTiYjRMXd1dPV1vB/kbEJBSleHOp5MjjQ3lda6OCtr5fRIdt1PHpfS7wyfXh9tfyRcLaIbr62anLqFf8lc4Y96mu5478FlTWmhS/jNdM+EJUwrPupOtsbzm0OtfvTfGH6QXPh6JozbrrScJ8y+FHD8bb/cUsVwggG/0BH0/sMvm6XGSpkVD6YkrWxDSTe7c+a4a9+DZXxyDkByItiaGDTEM0iu4ZkhD7Yc//CjBmoBQ54/eN/fc9+rwOayDzexK2zg39L2rRpGqZi8+EBartu5PKFZIS7+CS6kU6AePnpik+v3e5Sop2jiixQhuoqm7aMozvXeY41V+Vld4yx/kg4Gj7aU1KWcbDU7WvOfnqsuEoFnZqNFInyV/QiTCN5nZPE7+yH+3MbPICCNKvWjWSgsBAw5vWhq2g8k+yJtInsAQ44pGvpsA+o93SqOOAdyC3tVlhAy8kBF0JFz/cg210yPCDdP7xAzQPhtibvbpfSGstK9AlbQCoPe0sXS0v49hEVCL/h99hL428m9tBO/9ybefFp41hNCTIjwS8uEGDhR0dy1v7/a8ZixbckIvvJrm+BY0FLoZabrhRNHyKcHKnr6S5R8k83m9Hp++unpHLzlzRK4Kve1aWvrXsVreu2rvX03aKXVzpKkaavJDXQ1abeQV46TqbL0dQ1N9DUkmZmnCHqM41HHOAfqm/OfSS4K9QUz6i84iIkjPTGOf2D+8nwat/5Dv8AorzwlLqI8PxllC1r42qlofn899IsIf8EvSmxaRteT6WtFppluQF5yPm0H5ff4GW+Z9FRNX92p9/Tqd9zSLDHteYSAniPjaOrOBVJNenBsCSkb+ECP+P3O8mhOA355PmvXK+xFQG9UdVZuclGwu1FWoJPdy0Drcvdm9umtLDQhcfhBb1RfTnlOadBspjeo+OCnAYPvBgx+qug+qFaSF+EVYN6xnP1wEkFWlp++LWp8WFre0Fj0DuL/n6Bpnjw7SK47206egNWRk90XG/Don2Vs6T8vNHH1M59b7+U8Qm7CD/ByunG6sXvzNnHWWfcvykeYXlt9MTG7sG530/7m2uuFlxMrYDsd9PbtGZvUMz1npmGdh1sFsoXnUwTWI9iKfiQBd/t2N2CJ3TkBQNsVAKhoMpkPe40M8E5YoCEH5vQGfmL1womKR09WGi7PPrg0Ww9iYdkZ2RlwuuJtMcK7BBcPd0eHRbeWvGxLqAXqTpuelRfB0ybaRol6j5A1YOD7aIqKLv+cyWvA+jXRIN+IR2kxVXfYwMsK5FBsP9eu9rxyT8EF1wEWKFLu8fHLl9BdNE9SX8V1atZO69a2Rae/AqkIm3Q/WqMmGlOf6gEbtwUaPjhT5PVtLjaj4+Mb2sYmWofkGMekvJGec49yn4M576+9691P3cKFKYCFOpyXW+zQ432hn13YruyxGLJW4SftnAZi9gSosc+zc3/mKQ38O58cPrVzBK2+gC5uGYi3jtUUlPUwiB3He414ZJexpXEx0ybG5sFWfT2p3v0h5UmdzDJd5raIsZWDNWGLtFUPFrz/di73Drkl4PxquSd/fvrZZ8lGXN/CzTetITYrO97M7UHP010ByufOzPHYpntF73Xz6mKzJ4BDpzMwa9AAFfGC8hK8HdzdjWMteNXRFMACBfQo4pRhrmuuLiHGQS7OwNEm3nnrpJRAxg9haRk5nUd4rqtuIqKZvwlQvnr5B2uUXmrtq2WzUtE/4/MG9JI3MrBXiNP4+SaMrN1rFFFvsPC1xfjPUEa8HQkh9rGB9Paj1MH9rQ65PE6KOLC3iWNig/KfOSOIf67GfMXB/xbjSAusAv+Zivx/LyekzbMK/KXg2qreJCZVzg+31MwnxlW/AdlVth8r13oHPYLpKIB5W4vz80h43r/Ki+1Cd+ZPEWt0MjDa6fXRBZNgznu4PjDY4xZG61IHmLcUGnc/6sA2/98uWmrBVHSlfireILkspnAaLnllZAl0yOQBRbwNFWycUi36BPjPnrnroX1MokJHw0srermzqWv9SQZVLczV2s7TQEneUZ5Dql5P298gdeshJWLYxKPCkkJjGu9CcAzVhWM+MtgR0kixrIiMLHdQljK7YnBIZnzxIGkQC4Jhzs6hE41tz2Cgh/Lo+7NpxUJ2ijgZPv5e6b/95JiCeNKxKPEnoFBy6JYEhb1NPIvVS5gVLZzFXiHexaRzmaX/ciZ8f/ghfs6K04Vn9lfGr4zXLjxWnLNwwMzSf2XopPCKLdM8jwJjFru5w92zthddj52/PgJiWQHZJkReneNqucKR4OdKFmhZfzz8ZTp1+vM40vFwuUWQlzAud2JkrcqwymhjFIV/JQvyTJmAfZoJ+N8jMli6+a02nbZ7Oy9OjMvxEsgCzcvQNflhOnX6y8jjtpWHAqDxha6IOhen/EC4Jl3l3GUNHSfzEqSk81WCWsLtppJfvWrmXhZQW18D0xx9jJlqUfd4qETYpvvTGjZhQgafkY7vUHZbzg6fnD83/fwUmXuVspTJ2T2FyWx/XN5I63GlfZcnZbwABbhCdX+BCMQCRztfWViCQw9/PXj2dGGquds5NMjdMTw3BIe+XQgKHz2KIifGisKjY8Nj4hPt80dG3cvSssJj0zIL/foHivwzsiOJWbmuZS8G7IqSSZGx4qigIMJUf8Bqf6DHZNCww4C/h2e/370LcLb1uFDWjNsYJkShUiFYQa5XTjpYulI6hJZG+RykMR2lHn1G/U4FpdSmJxRdBX6lWNsa9NC6x7ObirfiPV5RkIjWrAJipbelUZLDuFT7jW430zx3aruBLP+dWNsq+uHFbfTKK0pIdV5CcgnBWvGmZowMl2aNkoelWBhXndFR1ROaeFVbxTsimlGyJ++R1dl1bBUN410Aq2cyj4Fgrmu8HNb/FBQ/6+U2lBQVPp7scCM/ncwvqS/PTLMx1zUxd44L8vR3jjM3NdWx+x/ZUHweXynDVll8vqGu8Cy+qrSEvaLoHKF2hGqkOhSmMkQ1GhlsNVAdHxpUHW03AMeeZr27emF+4UH27lV+DS7CscGKGiJCJQz29eFx0bnJMZJWx7VMAq8YXKAme2iDobSQOUis+FFx0aW3wWgO0UEYcqC8klL2moKzDfUF3Ozpp1v3V+2kexy5NREhQQ9kAgQgV0ofw5o6ReFmsSCgmx4UKCEGsqIq6pK28SC4wVlCKgHc+R6HjHwnh7Q8R6e0TAfHzMz/R0RV7oiJq6iK3lTVcFFVgYvp+i7ZLkXVReHZ4YXVHBxf5HPkoS7PwOXKcRc7RYG/knfv3BUrJFSl43JD3RycnHQ0mlJIwJpxX1dVSZL/2s4dMVXBS4XWZYHBcfn+DjcVjWWPZVwkOdUGE6MqQ5yLrmlIyN9RlhDyzEcMgX0Ilhl4M+GIsHgAlN3P9x6WyuamilfjCKYxdelayjMUwLyFGJzuJu7f7Azd/00mwJAhbe73yGi98ZCQDKdbc06kWRV7kLBOmvpCN67+ssKdiYb3eYVGr2+FWXvjgbbCpuhRX17+o54q1WJqr/CT3soyjK2lp66OOcFOw8bSU+eehStiCXerwfFiqIVPZw+9NYerF8HVNtjDhIKULL/oHJh51tpY/NDFQ1Y9rUcyfuzXrqbD6OMBXsyWwi8tV29iyJ05reyzGtnKR/C9emz+z7jmwVBZRVNJwzdQWUN5mq+koaJpVdXq8iy6yqyPuGeZl0zafNLtoDNDavVsevD9iqSi/0QqwislY/PVKvGcPNHOrWoRVqaAFlPHzQgeHU/j2wGzsc9NTgyZ92j6Owff3tA+2s01vBgVMGTKY54jycVZ/kHFWbEAz1AMxkd3qW0DLcUhD0YUhVTNH5H0YtWKR5o77rVdMbmcxxJzRcTZw0xbWMXicZp+3D2j+FFdc3snw7e8oLHMgYltldFbMUuqftSQXbjauLCk5+wa6OCY4HqvE0/61PbIq0lbQFtao1HfcXILdrzmsE2NTzMz/O++vx1b6H/bI0u5UOXIwbo3kuCqo+5oKoIW9sqoY40/cSYqOg2EFI/8pM01K/L++5oUE/suzH8pJt19ezQ8vNzf80ZfYuKbdGXr7ohI4w7+W0XvRR7GPw5TtsFGMh1ljFc2TS19Wp1Y1R8WkrPSBXKThptdmxZiMZHcSEhC/WAVfhwwcr7SgX+X40luZpeU04PtXvblyhQF/Vsipjjo8ahkBNuMvMzoEu2zdNNvX1KOr35j19ah76bT5CCXUPWWAnKE0fTiaUsooh6RfbKHelRxKnikgFYzB6HsX2YCM9SJNMSz/ssqC65lv/Nj4Uuu0I9mQUnmpKcdU7ILs0tj7zoyKjbVtwuWfCX+/94Sk+OeeUvayNj1EzzGdv7teY9ia8sHYh77OauEECO/xb50l7aRsh7yiJmnvfG/C9dZ/Dohrnh2tKNkLj62dEZufNYms+xIHPOJEGIm8Nu+p8/NrM2ozWX8xuIBPD5hBkHeJqaBPg2BAV2BAap6N+TkBfjlZa3lFAQEZRVBaGPeJTDa9FKrpVTDqUtFAkFYZ/8Es3NeFmJnz1y5JX8NWDfZHZVMQ1FpxC7v+5bDQJfB6aBkGo4ipXRGgI3lECSecFA2DkWl+lJs7ayfQ+JVByVjIiqHQqlwsZ6cv50bQmqFs+U44MppDNzcTU08Xcx4DVxdzc3c3AzhNC+SmMQXyc4XlQTMXu2zkGVMRpKQZChztf9XC2d/bUXwp8PQfa0Tld52Z9mL/U77/zx1HsPQEtwS1xLSQoc5xfXFKYaLvdSFx62CPIJ59CAkLC4MpFsS5LPlYWTu2FLT9tHnTzzqJLnygwU8/RycnM0XSAv1Ko2WUQhjE8Su9mzSeT5JKQc+HL7Q0N3ZbHdZEjBzlLlngRRjHMHL0cV8kbT46iml1KdRxEuEMJrPJpQ6HKgfYi0ferUX0wUKZdmNSQn59VCcXJ7XmJCUXY8UFGB74qPRra19CVHoNsCNDMfvAs3LzhHOtYW1fhg7f0xp0M7SWQZwjxBIXYwyO7JVVStzSjUsmRgQXJwSE1AVgrF9mM76elklVQVpdTVVlTrguZFrzMYI54dKhxF8Y1L8vItyoxKqKrOFflz46uUOuVPolSssPMdp696WUtcIvnMXKp40pVaZpg1GBBC/j6+vaLz42KnYn7Uv2klOxfL31Tv42mf5hISqKoiDwupi0rdVxYRF7oqF4k2b8OHmOv/1LY/vTvvDtz33k7HzTYwLDSgrDo/Lr0Cl7/5RIvvag6xIq8BC80t3JHU0NCUl7urIy6qow/BDX2R/8eCH/sKLD/7dvqB0/Tw9bdbyF/8BbA7/B8ACfv5RXi4s/FISFuuq3TPy/xld+aEw/7/MKFgNXAXhBB65quZ3mSNchXEMzjWjNmffEVy77YdFatbn0cri6o3s6doSBL/VEMh8d5R8AGqv7OXj7Ca4f4GMTaYvg+n0kAfMWAUnGXGbq5WubLETFC6/WIYgF1AL8uFFVasHdK2u0/W6QTfiIbHA5gvygmuF4A/RnOkT3Way54spBkO81cmv3dOk0ApZXJgOiMn5By5dK/gTcmD6RLyZLGPEyQCumQpztelDxEyeZUacZg8r6CL+WCHfqB23tFDzijCT7c2n2ArJAFtxcrcVQzi4EqKJ6RNUM9nAiJOvVkoJxLqiODYDRAJrtvBsknxFNpJyCU2M1VykPk3yDYNVohi3tQoHgVZp6OZCZDnjOkFDskq4nijcegh9PuvE5JKvQ50g+jd1bdeqZ1sdixjTOjCv6diLvkJ1nJdYR4410sawNoJ+zUjOShINpFgzFZyEmXM6HtqB8mpjAeduDMj/r/PZkuf+D7hl/haureDS0u+otzR8X3bZVuu5csq/2umBcedopEW8gHvF349HyjOhk4pHKvnj+bNyaIF8NLGTbM6MmQDumb/1qAmimZ+PBplWJmXh6LqSU9bIxFQDfVc/Ooi7qETTFD9xKpmamfyj8OaZZEJ1OAXGegvRs0KesdMf8OOk8lvar+fGgFrQByzkYE7awz8Q118VeWAeDX/e4QBmRp+xoE2+m7GMlofvvD/oaG9B4fka2H8Se6HrFqJLTH+wgH5KKNfdqN0JIDb2+w0mUSZMl/ar/dZgRnxZN8SfnmUeAnHhOHQfyB3h9xrb8lTF+40BiaA+G/tMsBstPAFki2qMQUS/5tcNCQScSy8XOQVfxRiEALnJ2ldCUowtWCR/bx1fBoCnf+puD8A7of3bP+v8X7X5l3kBy6EAAiwuW1oFsPzgUpZe2gHEfVPfVyJbQ+Pfi3eaa0BJkhD7gF+HchvzHPsXu7Bjn49F5zN8RXCq42hEmtMpgjdPSik1+KfGC9Rhhjki5BGFOh7P2jY+iolml5qNctvK6etiatjdxQ1O45ZT/UftEOE3bqvtRDIu1wZeAkdbRF7T2U5EBo1LadSY/qpN8LQwvoPx7dm69oGa7qbVQwQGv8Rx1KnFcVKDBsR6FEuP0M8z0krZRXo2dGVIpgrQZACxNubaIRKbn2lHsmgpZjlM0jyXZTtIjE+SYmfuBjMu9EnBAg0J7SSxU5jouEQW2Q64r7UQXTsi1rKzExqu1A+X6jlOatkw28nEF02OfXiKPKIS2pJjVzEZbbh3ISyxJ723GZchu0mFSaVLr173282DSdX1rOok5z8RfYdVfiCXH0hnhKAmyqsd8skpPf7wplGBVT7cT4/7Y57eJEJrEuNezyksAufPrcCIunfeVFXdJ2HqpdFkoZ1KqYlMukBm/Ja/KOWwUGBVA2qzUUANCRoyyqbbUiKXJc7FH9nO5zSHfEcye4+oFvHDWEbe54KHMapyEvmBaIey6DQ17eZMJ5Ccps8yPphAoIU0opigjziaqITS2h0IHAZOJg0ztFwK+wTcwrzSCwDrvIzxyBPmHfMMp0JDJH6JwCfgTFgBHAL+5BPz43dD42VNaMz8iDuhIZIjIvBGKEtHgB+QcNKFyZXG6iChNoVd1bfMfWhI0wE4A1wvQzAyX4bCzEmN3qWmgWUYfPyXYZ1S1F1muqjkufMQgMCRPQfeuAniJ9At5KbEXeAZLuxWVeHGxnWjrMG7WLQ1mFfOaLe47BD4atnWdUN2Z13y3lDgbc+HC6sgr7+IwIsjc7PHX98u5CYJ6wVv6hZ2bQUWvb15EHej0/q5rrPikXjbcGDnOhsJmr8hO7LRvBu4V/sNalTIU6RBh6Jrts38i4GTzfts3QMAAAA=", "ok": true, "headers": [ [ "content-type", "font/woff2" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/tags": { "data": "eyIuIjogeyJsb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJsb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAibGVhcm5pbmdfcmF0ZSI6IHsiZGlzcGxheU5hbWUiOiAibGVhcm5pbmdfcmF0ZSIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaCIsICJkZXNjcmlwdGlvbiI6ICIifSwgInRvdGFsX2Zsb3MiOiB7ImRpc3BsYXlOYW1lIjogInRvdGFsX2Zsb3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJldmFsX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogImV2YWxfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImV2YWxfYWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogImV2YWxfYWNjdXJhY3kiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJldmFsX2YxIjogeyJkaXNwbGF5TmFtZSI6ICJldmFsX2YxIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiZXZhbF9wcmVjaXNpb24iOiB7ImRpc3BsYXlOYW1lIjogImV2YWxfcHJlY2lzaW9uIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiZXZhbF9yZWNhbGwiOiB7ImRpc3BsYXlOYW1lIjogImV2YWxfcmVjYWxsIiwgImRlc2NyaXB0aW9uIjogIiJ9fX0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch&run=.": { "data": "W1sxNjAzNzAwOTc3LjQ5MDgwNzUsIDIwLCAwLjE1ODczMDE2NDE3MDI2NTJdLCBbMTYwMzcwMDk4Mi4zNDU2MDYsIDIwLCAwLjE1ODczMDE2NDE3MDI2NTJdLCBbMTYwMzcwMDk5NS4zMzU0OTYyLCA0MCwgMC4zMTc0NjAzMjgzNDA1MzA0XSwgWzE2MDM3MDEwMDAuMTg4Mzk5NiwgNDAsIDAuMzE3NDYwMzI4MzQwNTMwNF0sIFsxNjAzNzAxMDEzLjE3ODc2NTUsIDYwLCAwLjQ3NjE5MDQ3NzYwOTYzNDRdLCBbMTYwMzcwMTAxOC4wMjk0NjU3LCA2MCwgMC40NzYxOTA0Nzc2MDk2MzQ0XSwgWzE2MDM3MDEwMzEuMDI5Mjg2OSwgODAsIDAuNjM0OTIwNjU2NjgxMDYwOF0sIFsxNjAzNzAxMDM1Ljg3NDY1NiwgODAsIDAuNjM0OTIwNjU2NjgxMDYwOF0sIFsxNjAzNzAxMDQ4Ljg1NzEwNzksIDEwMCwgMC43OTM2NTA4MDU5NTAxNjQ4XSwgWzE2MDM3MDEwNTMuNzA2MjU0NSwgMTAwLCAwLjc5MzY1MDgwNTk1MDE2NDhdLCBbMTYwMzcwMTA2Ni42OTExODkzLCAxMjAsIDAuOTUyMzgwOTU1MjE5MjY4OF0sIFsxNjAzNzAxMDcxLjUzOTMyMDUsIDEyMCwgMC45NTIzODA5NTUyMTkyNjg4XSwgWzE2MDM3MDEwODQuMjc3MzUwNywgMTQwLCAxLjExMTExMTE2NDA5MzAxNzZdLCBbMTYwMzcwMTA4OS4xMjUyNjgsIDE0MCwgMS4xMTExMTExNjQwOTMwMTc2XSwgWzE2MDM3MDExMDIuMTA4NTMyLCAxNjAsIDEuMjY5ODQxMzEzMzYyMTIxNl0sIFsxNjAzNzAxMTA3LjAwNjE0MDUsIDE2MCwgMS4yNjk4NDEzMTMzNjIxMjE2XSwgWzE2MDM3MDExMTkuOTk5ODA3MSwgMTgwLCAxLjQyODU3MTQ2MjYzMTIyNTZdLCBbMTYwMzcwMTEyNC44NDc2MzUsIDE4MCwgMS40Mjg1NzE0NjI2MzEyMjU2XSwgWzE2MDM3MDExMzcuODYwMzIyMiwgMjAwLCAxLjU4NzMwMTYxMTkwMDMyOTZdLCBbMTYwMzcwMTE0Mi43MDc2NzA3LCAyMDAsIDEuNTg3MzAxNjExOTAwMzI5Nl0sIFsxNjAzNzAxMTU1LjgwNDg0MjUsIDIyMCwgMS43NDYwMzE3NjExNjk0MzM2XSwgWzE2MDM3MDExNjAuNjU0NTYyNSwgMjIwLCAxLjc0NjAzMTc2MTE2OTQzMzZdLCBbMTYwMzcwMTE3My43MjA4NjM4LCAyNDAsIDEuOTA0NzYxOTEwNDM4NTM3Nl0sIFsxNjAzNzAxMTc4LjU2OTQ5MTYsIDI0MCwgMS45MDQ3NjE5MTA0Mzg1Mzc2XSwgWzE2MDM3MDExOTEuMjY1MTI4MSwgMjYwLCAyLjA2MzQ5MjA1OTcwNzY0MTZdLCBbMTYwMzcwMTE5Ni4xMTE4Mjg4LCAyNjAsIDIuMDYzNDkyMDU5NzA3NjQxNl0sIFsxNjAzNzAxMjA5LjE2MDczOCwgMjgwLCAyLjIyMjIyMjMyODE4NjAzNV0sIFsxNjAzNzAxMjE0LjAwODI1MSwgMjgwLCAyLjIyMjIyMjMyODE4NjAzNV0sIFsxNjAzNzAxMjI3LjAxMTYzMDgsIDMwMCwgMi4zODA5NTIzNTgyNDU4NDk2XSwgWzE2MDM3MDEyMzEuODYxMTQ3LCAzMDAsIDIuMzgwOTUyMzU4MjQ1ODQ5Nl0sIFsxNjAzNzAxMjQ0LjkyNjI5MiwgMzIwLCAyLjUzOTY4MjYyNjcyNDI0M10sIFsxNjAzNzAxMjQ5Ljc3NTI3LCAzMjAsIDIuNTM5NjgyNjI2NzI0MjQzXSwgWzE2MDM3MDEyNjIuNzkxMzA4OSwgMzQwLCAyLjY5ODQxMjY1Njc4NDA1NzZdLCBbMTYwMzcwMTI2Ny42Mzg2ODcsIDM0MCwgMi42OTg0MTI2NTY3ODQwNTc2XSwgWzE2MDM3MDEyODAuNjU1ODEyNSwgMzYwLCAyLjg1NzE0MjkyNTI2MjQ1MV0sIFsxNjAzNzAxMjg1LjUwNDc0NCwgMzYwLCAyLjg1NzE0MjkyNTI2MjQ1MV0sIFsxNjAzNzAxMzAxLjgyNTQ0NjYsIDM3OCwgMy4wXV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=eval_accuracy&run=.": { "data": "W1sxNjAzNzAwOTgyLjM0NTUxNjIsIDIwLCAwLjkwNzg2ODUwNDUyNDIzMV0sIFsxNjAzNzAxMDAwLjE4ODI5NzUsIDQwLCAwLjkwODM2NjU2MDkzNTk3NDFdLCBbMTYwMzcwMTAxOC4wMjkzODg0LCA2MCwgMC45MTQ4NDA2Mzg2Mzc1NDI3XSwgWzE2MDM3MDEwMzUuODc0NTgxLCA4MCwgMC45MTM4NDQ2NDUwMjMzNDZdLCBbMTYwMzcwMTA1My43MDYxNzU4LCAxMDAsIDAuOTI2NzkyODAwNDI2NDgzMl0sIFsxNjAzNzAxMDcxLjUzOTI0MzcsIDEyMCwgMC45MzEyNzQ4OTA4OTk2NTgyXSwgWzE2MDM3MDEwODkuMTI1MTc1MiwgMTQwLCAwLjkyOTI4Mjg0NDA2NjYxOTldLCBbMTYwMzcwMTEwNy4wMDYwMzU4LCAxNjAsIDAuOTMwMjc4ODk3Mjg1NDYxNF0sIFsxNjAzNzAxMTI0Ljg0NzU0MSwgMTgwLCAwLjkyNzI5MDg1NjgzODIyNjNdLCBbMTYwMzcwMTE0Mi43MDc1ODY1LCAyMDAsIDAuOTMwNzc2ODk0MDkyNTU5OF0sIFsxNjAzNzAxMTYwLjY1NDQ4MjgsIDIyMCwgMC45Mjk3ODA5MDA0NzgzNjNdLCBbMTYwMzcwMTE3OC41Njk0MTQ2LCAyNDAsIDAuOTI3MjkwODU2ODM4MjI2M10sIFsxNjAzNzAxMTk2LjExMTc1MDgsIDI2MCwgMC45MzI3Njg5NDA5MjU1OTgxXSwgWzE2MDM3MDEyMTQuMDA4MTc0LCAyODAsIDAuOTMxMjc0ODkwODk5NjU4Ml0sIFsxNjAzNzAxMjMxLjg2MTAxNjUsIDMwMCwgMC45MzAyNzg4OTcyODU0NjE0XSwgWzE2MDM3MDEyNDkuNzc1MTg5NCwgMzIwLCAwLjkzMDc3Njg5NDA5MjU1OThdLCBbMTYwMzcwMTI2Ny42Mzg2MDY4LCAzNDAsIDAuOTMyNzY4OTQwOTI1NTk4MV0sIFsxNjAzNzAxMjg1LjUwNDY2OCwgMzYwLCAwLjkzMTI3NDg5MDg5OTY1ODJdLCBbMTYwMzcwMTMwMS44MjUzNzA4LCAzNzgsIDAuOTMyNzY4OTQwOTI1NTk4MV1d", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { "data": "d09GMgABAAAAACoMAA4AAAAAUsQAACm2AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmXocg0oGYACGTBEMCu5A1nULg14AATYCJAOHNgQgBYJ+ByAbIkSzoqzwsjiKkj2aj6JicZf9lwnmGDrzUL5ooaWgICnvqxcvLU1UUm052dq0PPEbkDL7t7A4c3dKponrEu8IjX2Sy0PoX9DLJNk9AHsAO6uC0MkqVZH48wM/t95fEVEDtBGpESMixmDAqNgYMLpGpmSIhFWEFSiIoIiFRIli3p2nHuksZyTDeXbXshPuAKlMlW53Zbg7HZue7/8N06wSlnxFE+rSAhYVkmR44D5FCo4yXQlcOX/hZsHaQuZYMcQ8fkufGldr+uACwqKNzkSGPbR7G1BVUZ3KOl0lGRYOQuDT2zTbfVpvBF5fojuuchvk6YE73cxV6dJS//W/1qu/X2vQGiTZDshHKx3JCpgmIwjIGl8FXKUCLIGkY12AuaMOqUzRXNWnLQmqS1HWqdIFnu/vG79/2raDcUAPMPAMtn38TkB/ouZjIAEmGGgThZmsWZkYwdIwtsYh6+N7ZqYra0NPaN1poDFKzhjB6Ep9/G4ZTnWidqQaNBB6+Y1RoPACsDkUTvsZQJjzgUiWDJEtGyJXLgQLC6JIEUSJMohOPVAu+QiBQAHTADNAgAKRDAGmosIAZt317VxBcvfkGAZI7h0THA6SB/jHRYIkDOBDaNj+e8ZEAjtwbBhGLXC2MFFLe6nWKwp1sS6WQ4VY39XdhkP/X4wChWLH4FC8KPFQDqMIiLjGjWJFabOIvvgn/jQ7N9ClKlWDRqlUq8XUxVp68cWGQ7/D+N36//YNN54bY0H9DUgUJtSPLQYOF25C9jvokMOOOE6FOg0EmrQR6dJnwJA1G3YcOXNB4obCkxdvvmrUqtfgksuuuOqa68ZNmDTlhpvue+ChRx6bteiVJa8t+2DFqjXrdnyE0M5bMIiE6TpAn6hZohBCyQ4q+IddgvVd259GlFOFNmHm+YZlbrMiWMMWJJCru+Uaj9zimRu8ySnLbXUJGnkTtMtp5Aqu4hquY1x71htzeI55LOCF9rJti3iFJbzGB6xgFWtY1zbasoktbGs7bfiYRnjlVP+hPoJCwSt7WIClnW8Rc4Vu7tDP12bBMR5M8483PCX8SrDD5C1uOcErZ0QkQ1pGyk5TrDylKDth8BBmTIBbLvMnBPCBG9uCt+WBq3CUc5cOYxpP8BQzexSGw49L58kUZJkbrABr2IJMeXnZ7NTgV8uoR4P2sg2LeIUlvK6OqM1GXCxzhxXBGrYgowwvsYhXWMLrdWPYEEahxosAu8OGlMtrXNyHhK8kWMUa1veMxZ95BFGHRjTRCLGDHexgBzsEexZimY2sYA1bh5RM5GSge4rzwqVs5y8Zi3iFJbzWPsS0glWsYV0g5P5oijmKkp9O3nw7kCfXGOc3/jcHxSZ3fc4WRHYgzYszl8Xt4s0nAnMbv+OWL1BmKuw9jcgRaflYdnZg5ZSinHQinwkpJtdyISq/Exs8UN0JBvTnxrwgTdysfiY754dWTK8Zted21jPU8/6ErTbDLJtDyepp3/I79jzdpwqjW9NkvFDxcrFn8ct7uyI/Nw20ef7NquSYG/mY2X3qX1lrwCxM5fcKo/9ELfnuZQg72j1T/muh/JezBlNxFtf0x58eYNG3oste6z3I1ae4pvIFyU8FzkQfejHes5fRm2qnDgIE807LfcaTOpsEUuLOw/wOZH8rylWi04VRGvkSdfjzXLcqGTZ0Ft8w4B8+d+iZ6+vzC6o0sWYSH/HEcH5jFetUsY0j935Npssg79F/4F6kHQmLa1Ms9Va9TLCHGVYlSVrgX3FCh77jG/+4Jd/AaEir86/WBqxJDUpC15D5baQ+bKJ1eAepuz3VUvN2vN56JxY2PSZ7AvMVJjZbZ/Wx571F+emsX0bLt4pUr261+xXWRibmZHFmW+n8uPjvZqdsHgYZaJrhAxFfgsQCHC4IflcVRfA32n6HYSjRwEGbwf3enCUJ1lCaXS7DmStZbirwzBVR+dinOD+oRqNDmr4ru+S145atI/8AunlBIbSLGGJIJak5i3JACQcVcEjEYbGU5XRcLiqKUhehoTBteejIiagkXcXpyU9fbgbyMRfHQjaWR5G4utgTpnSBQYJorrJxU4inHKgK8paDj7yKT2w/DkNMHU5SPxJDTCOU0qSUSznisnEoE/8JmHQT1n2PIabN4DRLObdnXsB5mYtY9Bq75SrGB+vQ4jU5EEAghAngKCphl/AJZwLlKIuirBh1UQiiaB15BevihAMRhOCDC/6lVKU1hC2fEJFAgwk0MkS4y81DLM9ndsFgDx65EKVUlLIqoko1UQkRQBgBhEPYRZxEAe6EEg8UHHAltutriGyg55hs2Ia9sP/pma3UcvNIgV4p7wPbWtuZ49ms4+I6jtZ3MR7rbeZo5+bGbm7taB/butgGVl5gXjGwzjQ6od7j9jgoKgIO/FOeB1A6gBbqD5oWvarVQfERMeBEXNJTXfov3YSsODZL10PI5bawcHipoWJqco0AdmG0Fahzlbqh2bDXCVXlnj+0tNzjd9JFoCEQNgJSIKK4OEEIjqMBwZ4QEBpHObSmwc1GiBZw3z09nPr16TVg0ElDThk+b/Qg+WyPShErzpjTzjjrnPNQEMJkgNr64xos6Fd0dVDm386rLwuJ+xGaHfI4sBiwjhfOBls4WgIeLDgTDv4A7DVuCsBDrgW0NfsYPDw0GIp54gptJc57XPaBKXbA6vAwxIFpZegI/5mdcMcTaz75i6gWUtyJxViaCOMl8bJ4BfwBPBFvhj8Cf9eCM/39C7yAR2e1EZPuemrdZ1JcdhbCi+OlD61TG8kfuUI0b+DMKZD/KL48Ms+I/9/7//zvc+8ypk6ZOG5Aj0fefn1zjikFLImVsdORlv+39+LZLrn3l/f7z5Fr2hNPzZiVJ98zc56bt+AFloK/wve6UJENm7Zs21HsI25A+fEeyGIo1rRLVExwDJpyHe7F9bgLuyt34z7cgwdxMB7C43hAeQLH40m8iAeVl3A/XsYbeApv4i2cgLfxPl7AB/gQJ+EjfI5XlS9wCr7Ej3hb+Qmn4mf8gU/wJ/7Cafgb/+MrZcAZSkrfq2UFjzO9ZWtpG4+z1HjC4xw13vE4V433PM7zTmY+8CwAzgeTOQ48F4ALwWQeaT6PS9TJgh6Xq5NFPa7wTtaQ1vS4Up2s63G1OjnC4xp1cpfHteqCM9mu+6jLZofKv/gMfuhW3pPiAU17HJjlQVDfAHEIQIeI+YlHYKEhpagtUCaan7BRoLDQThEoqCOLAJWzHoFQz5cnRaEgTFRYKkwRY+WMAUjjWkaXIJEwAoNOLUHcfDGMY644+bMo8P1hJLwSUN+asKZZ45uRjo1YMxyWKxyRtHwY9rOgmds0CKCF/jl3i3nj6npwDKJXOkiXSZbceUDhogx++TB31vdN6ZQnaxvAQgPbYXpfy/I6Gby5BrrAfAo57tf9GfB1tVXWWnuVU4GpY37ByDQpciH9rs9Fkp9P443DfcLcV8x96yyufmrJu5efcMIUsxvuc0q7GNZjpZHyRPs5yF+Nft3+yuA/6LcH2dFJjHAgZXAZJRIrN6goNldD9qlBbULVGSsaoh5oEK2LNnEsNozxNUMUkOcgY6GEwOWgXGdoIAytWzkWqXKsImVogtwlQ6QN8eIy43KaUgRlyCHLph1r2AI9X9Vp3ZzH4o1zI21kn+12int3NZc1cRD+pVws+BcrisPZ0GTWgzeWRs/8GTt0dqHtPLTxTW/D3C0Nb4WbLdHYNhtN3WpYVp50ki+pRNOGEQ3TGe1XMQgbZqEtbIgFv2GLob7lvxkOXHOrQVt7Ed5GWJeVDTwqrq9hZ66xSVL3jemdwJRJq1wbKtXMS5RsB3cd4wyxAPKkX7WsRqr4UBTVodqIhaMvIjaz6kPjla6hfx8DZaTPbfjoYxyuhqsJPQaOci4eSa7i9dxYeCq5d1aMAgpd2LR+JNLCmbR5fPmVlgbeuLah8bWrk7zjSbyg6uCwN0H2uIb1gvYbHvHHMPI78fT26Z1plmlY57237cR6slAinFkaTXsr8XAewr3w+momYZWzR5msF3pxUIdK5nei6fZM+2y4iu7NclQfbX/3oD9FtSFZjeVptS5YHdzJpO576objZkvUXNJktpdTQegVeg9Gzh5ZHQS/LZxulgBukUUnpQKlD+SqF0CN6zCTvb0ge2b2lOwzluW4B5tBiBIDlsULM1QhKCo1EytKj8N4somh9ur6hh11ciy3r59QPI4gw49GNFn7I8lyUorpYmXFzjZFpH0JWquDrEFBcpBGa8utTlysjL+82uit732iQ1pvhaCa2QM5MSLq0N1X7EzVecMmY510zPNyN+SKrEi8nktuL5OjLasS13VMy/usRnKieE17mxmz4I7q9uTejhz0H6VBrCCLktoO4Do0xSxgGguASIz1eDdRMHGDBqJH4xrWmfZU8FnFQKiplhMeNcfLAY7wkEeRkvNbHPtl1GhoqSMIr8zRc08vrfOrukNlnsFPH3XFAWJRHPJeKKpxULH9tiq5HwhfRkoogqAEVPNr/U1Gk4S0wo9pUSYUzhMD/Z2cKSKASmK6Q7XiprYN2yaK7MTN1lDiefZgXJDF/FFdp5SsqD0xumuYK3gTM/jD5bS40vIY0TEdlLp2etK4TCObfadRkLW26S3ICt+EabwQUb0NORjj9tOjnxs9HEXZAQfv8IxenpliLP26MSoQ+VEge76lti+2vQJFXjSImMBJx3JeyRNABXcr0jrwoOmkSCj8ow+n2qIquDBOM1bkfmRHQZxO66uEndYiMWz7Wg36SDwGTvrpVJ8M7WmLNRxIrMPxKynGGUzRXKIms/m16TyC3OwSC+PaSZzFqBVyXQfkAhKw2ODi0Q8bbOFZraQiMZYMOa193XxYXDO9SYRoLxcBkkPjzs36WsU8toTC1kPSKODcxrQN0RLjyLRGYOq4RmBPnDyqCNoi6dBIdQVIUEBK9wQVShR91SyrUlkWFbtzj5w13eK2As0rWE45U5zMAT982YojPiwMPrBKstKUGlMj0jMV1NsIworbxO3YX6FkvXjDXT7YnZ3giY5LPcMPCo4JoQPHhjEHWyI9+H5kBI7Jr2I9+t5IFpk+4lFZEfygX9jxrUCfWGTElirbElcxYKGs4GLzWiohxwyNi6K+CBbpYRU7/8WdHX+A4hbFFXkIf6XuFwodK7Yp3qX/QYZY7RAXjpn9tdnMGVqD4r83BTShxhFk7Dv29m2sUZsWbUA4pKLGbZGPPGjI6EQSrONDR103OGFBrMZiGP51aOrYVpprLdmIMnevqUA2g4lab3f2wt2O2dnVeztEQE1HIkZidCiJdDJyMNBV7+HYdDObwZ7Io2AGeZJ3vZI0s6ySFSg6wXlk+wuh4bCgL9DfL3KcmAxvo1uxtLlzSB2goNAWmSKvqtfOGRGdWHg5LkLOzkKGmFn7ZBPmULKaYlwt8nV4/YmGVWnhwAKUXjXS6hV2Zg4G3yG1GZvVT1HEQKvDK9Aw2sW1jP4ifj2x2E0Xs0YplhtsVEaRClGNl8uQ0ajYNQNZTdgRXNBE6H5tp+sv+fGrxNvsO8tz2cRj/q1d2Wwww4mV7VyCv4jm9lg6286I6NMyFpQcNGkvq4V2YYfaLZ7JhmUUSmamR0s+GYRiflL54FlmOlIgQaViIWKS5x0zaZlBvRgnzfLxqi/GMpaVV4zXW5ZliWVFPcc4jOTBaAJPjASuIvbLZ1nM4fZNaLjU2PHUB7gvgIBQ2o7YEXhLu61A6t80krAiF4C/rBsYkkz3cjJLN5ImOOVew3WXBhKDoQQaQKkbtzRiE4uO+8PY360dkcjskaGdYYSpzm3aQL6oE0RWUkwm4xF5qQuD65N63/eKXzz4u6tQLNff6J3+Pzu8epPi2nvxmg/2jtrxzyjFPQ2OngprCtnURD3WVrXyKG7A35twsKlr/wOzogN5v/vQdGLK8sTFvtKHU4iq1MYIm1X7BZJuSBdjr0b+u8bfnfoTinmaT5k/1TdA1T/TxdPvpXOrEzPMoCxgcGHhjMB8x8sx8bvfbsonBSSQXDyoLnbuXru+J1xpdK1Cr5PPnl0WvNt+55HIux+P5ROZGXRKMBWw3xpZw31lFcM9ZVYFw91l5SM9pRNYPTMrprG1gY2esTVRy9TKWC73eMFoT2n5SFeFFWuop6JyuLdoAq1laa+ZUmCnZ2rFNLUyRL6V2irFxZTagkVBMHOoPszIzbqRdHJ+7kL306mqkdG8KKf/FImxpT+kc0Zf/m9lQ+6gzbxAL29iwqg6srYOFNtQ90gGIhRv6x5tp9arZBlkbU00sHEEAUKEdM3Fg3OQ6ria3PrRoFhfq7kqvPumstzxzts1UVqNBXpbGqk16Ffgp72c3fnVsFhXq7GM3n0dJU842nW3Krre5kz8TMhrRi2BCOmGDoV4TjNNiHpLKFA5hXjBkDLD0cY8r3hWoi0cjgYep2FpjUKNdCy9QAguM+odFI1MkpGkd9/gLkRGvIeO/9Q31SG9zJxKtrCkks3NvFytLL1c4X7agjzr2AKYxngq/2u4t/tLB7WPW/V/3aVf2qh9eInzAT20EL8WVF/AGb9T4XTvXuQkyMt7UujbngtyYL12Z/67H43aaunvH+kVwGRFKuRnvFpPq3n/z8JtRtTbglobagyI11CaImkRXpQwfyopytNaPibl3FJw/jp26UZQcn+AUsrRpNGkG5Kbm4vCq9flXVJCPUPjGJ6Ln0+Abte+3s1eXXldMvf5/V8n9h1QLzVB4aHsIemDyp6ponaIZtzTbWSjLOHN65SGvPf0nCl0qiy7JyOIEkArzU5LzmWGfr8MWoSJXembqN3bYqOx8afH3/K9KU9ZfZdZviZpyBX28Qzd4c4SbL6wiLYaolRFd4V6x1THJ8ZWgZkIryKBV1XR7M7cFgaM847Rad1UFZpa6pnkG2zv7nC8n0pOPRumSlUJ66Zf+bn0fO6fRX51c9+IaG9qBNPPOzzaz4ceIfOK7BHi4uwRSHH3oPVQaKASY8GMbJhaZ39fkbb7Nq+08m1FKg8MhzNo7bY8FrD3ecTfOW4RZFmdWBPV6eMe1ZaUyGgECk3nnjhhJmJHDywORgFbGTsZrRXgGsPsgahmdMQ2vQyRYuA5Xmrae65DN0h7sMWG4ok4KiDjXxZm5zYfXSXb1vt4OdnZWnH660mrmXq6lXu6uXO4Wv4GQYSLOOffo9JNtzRrObPAks7q9u9C9wV6cuBuUVxFkPGWmjGHgyZJj5o6jx3mpxITCFPHbg6HcW7w+evm6JLO7zOW3X/i7rQKjT127kIblxyX0Ifzhbs/f/Xmz1YYZsdy5poW2qm6k6WdDr9gHI7NuAm62Uq8gUcN5VfHRBVExgzlZRkX8JAD2LE/HAIPboVHdPnvj5LKGkyd5Vr4iXAkFyH0hCCPe9MowWdvltGnA2Pc0mbBsWqVf0ubB8SNkqw9ZmsMBU9e+F+dR+yrEmcpK6O4vnYeeR+5U/6yqaQwgyOP81M9Oal8atDgoenDPt3jw+PAEXf9UdXY5VXkuf2biyunwWA50YjVs/cUsGPTX7u8jC5nkIxISmbyua+FSS+jE/6Sk99B+rnr0j1NOsizwMVqA+GBK2jFH5Lb+4TSCmOTTrSvwrL36vDmwKCl5S+B1/rgogJKTGsme7aSg7WDEkztY6D0fHgEn0tS5t7Glq0jWwvK4R7B/m7B8RFgbdnc3/H4HtTmnot5E41hyZseDobhz+l7g0xV8L1jYkF4MTN8cbmFY+UyI+K1+tPieXoyw+XjoeCCB6V9uePj7A9uX83k5FFwWb640GAqOXrxvNRwswnMWC00WUiOMHoyPYz547Da/bGxoXsLli3fdn9vaujcgWUYBoR16412zz+J+Utl8/t+oHFfuBPTosLC03MjESFwuXHxUa5SnOfe9fEBwj9WOlyTLcKfRFo/YjIosdXZuqw7OUSiC68JHs3+JTo1Jjg0Lj55D7ScM8iJnlpBnio/8z8k5F36J7S55SuT9ThXKSg9MiYymWpnWe5bfPiv3eaHk9dl5r8MCKVUPi87tocPT3QDu57r49eVrl/62gX22LGJT0dE0H+rCrX9QGmqojAn+Tea4z40hwn3WDrInR/TkasbswdHpIfbjPuoMGFMmffZdM+Vtzt5lNuVkw/D+QcOnb3C/92jf+bMa2+x3y7sPZO9hgcczMUrV1jJfOjgV+WvnklrmPj8Zo88dgzD8+Sr2SlQyJ8oB5x6+dsxYNsbA+hjBw/gjh0CeKPtovVtRYBof2lM1/C9tSPzs7LQKujAcoX8MwSKrg8+ChF0YVmzKCxuoP3pxdJTfy5+hnwDWzsPkrWLub68T2z7M8+8e1v3LjyHE4cdBATvGYVrt19hvOSpA01bczBdFsK8Vrg7FsbijsEADuQPBsZ133mnwI7H9ITWhxarM4c0oktKjxYJG4PKnFOgO2LFBxHxFx4FpW1wHcAI/cdxeOPhtzVkgg8hBYa5BIdU98r2B1eB8b7fy0dvt4XEH1IAHGB5YsJZJyfWlPA/GmmdwSxN5hCBmT8DfkK7RxS/Snenw1px7Zs/YkjCaR5aaSaj3zuprM3I63UIZ26SGz2WN7xaDPENDIPxkM65TuqFp/eu6bkJod5qa3SfcF+YWwgBs33/7hy/fyYgmSsYJ1qeNbMZ0Zr43kfHJnM0PKkpNjMlmhjI7L75WeV/PHtNfF9onnbAXZ2A7LCEQRCvuRVTNOKHaTwvP+ztSPHO1PZH5AEH8tChQFRQEzN2I9nauJOMTSikagoJJIWJ8Wev3zlra8q/qn0wtyRR9GFnvdtX+ufp0FCbb2+zIGlZCpt5sW4MJNhBhwLgQAHEVojsSTGlt2bse6J7no0NPZo+q3CGaunqlaOaCmvyp32sSR6pmsG/5YkgVktkT4utvHmq/z5y76r8Oaqji3eKXugveSIYH+hM/bVR1PRKmItvFbH+V0RpTvQoCs/WFNvFoMV3nG6I7w2nx/aA6azQf8tKUz1B0X/kAbvIzUELSx+89/ogBo9toHeHFKqFXtWgFz4B4wN/lw/eGQnJE2T+Aeyiwu9AZtfU6lH8v82MzsB8TdoEITgvKKITlL4e7T/WoxZ5S54owJblVtuk0gKXjhDC9GLFsp1+Vu5OTk3/mGqWN3B0Ils7GqureBIXjlhLrpCe1P6+cL9w1i9xIEAQbUdz9iC5GoB0nRnn5bnL0nrPjFUsXrlKeKpg1Szb5to44UcEPfv6yIW7yORt+auDTTWawX8UiPyA9rv3Qll0jiism1EG46misjExATPil0cDhu8td1KsdPT26Axw/jhvQlAXMDqoOUmaIGnJL7SagCagGu92aEppLCf5PXtraCT4aszFSZUmTxE7p68FVzYENnPG/m/f3QocAuvQ0CDG3Wdnnoyg78xdPvvhrJpWh62UfTGSMrt8xvOM14c5zGa9OnjxjAJufBTkbzcQ0NtzyxfcL7ivz6A3GrS1Os6onl2GiwvoOyNPzsy8ZPP2DQA7ksSVy+s1NhnavW0WRMtAh3nkyrn39Q6Zul1Npro2NDsYzNhDCX1WFzq/39SLXOpFZpFsxNnb3n78SOXkbJP01r3NKzLP5JZFF2fkr8m9u/e+S/rSa6SLHyEHhjiHBNdCu/xASCWoG2KLU/WtyvYU96iWAp2Y5q6dJtzygx+bT+b23k3Kkd08nE3c/P3Ylwk7YMof3pbx4GFrelZuaQWrMLD59iNGR0X1XqGssilm6kZTXEWNqVBTT297MOXfXFyKCtoxqQnhD8bjoiKVzP0SEsPvXY+NYoLg5w0UAtPequsY318cxcfiR/CiSqJqI2qxaqPfTO7rQiaPFEbqHuYHBqyn3l/opLCCr4wK3vmCyD5/iAePTJ9MZqyNoXGWMyPoUoRnHf1cJ7Ug5PKQ+Mynn3zv78u7p9DDIxPtzawjraP9b0R4N87E2BwONHexST342sRZ2dvA0yH+IIgRyAR7K30DW+swW5s0O5sZdU0nK6KugzVB4/TfCmA+69o40ml0be5c9Mj4XFv3qZ66Fj8vFwo1iAXM1PhgFtXDwymgN6+vTlrgZHc7f3eznGuTHH+fkeBgg5wzf/+DKx42d7Js7lzxePDouqfV7Ykpq7tXPcBrsinMzjktISeFFtmfNByinhlnbKWmcoonbCSrsKC5Il/PX8LJN/sQad9AId0WyLqqFNATSLiHSR0yBfILgat35n+Yh/9bLno6N7hINAwXZjCZ+tMqkT0403r+5qkOO2MT+9b8QhsfQw0LCyIVyoDQy3am/wywrYzFdHZGRrR1rLW1RDC6W/jYCWYWBA0zW7qlbZiVJRwhjVjtWTF+Mxz3HN1/C97G+G37wbkmRrEsMFVIYq6+asPHp+NOthbUdmQlWljGhrvVxPiCgHC0SyJFsUj1yIjM45CBlNyqkwnhiSzVukMVtAsZteVDeTHTCqYqGnpmitRkoIJgH+gKE7ZB8hYxKsMpIbBOK+yXPJEHa0qhFIZYKl2SB+wiFLM7rbH/nn/O8WftCGDHoOSSuRe5nEou9na1sPJ0AwpusE6yOvJCZh+uj+l8xETWBiNbDnxNj/ZdO9QWnyQEbEH+HeM3NCem+qzar95obbt+s3sEE0CNcHLwDAc/J39qhKMDlRECJ3Ly9bvbarQtpa2VWpvsPT0QJ3lkYm9+9vn2g2vtjY1+VOkD/ghFUdUVn4y4SsjmsRvvsyOp7h/7Z8eNN+DHzg5fEd0e8dAS0wGjODVtt9Bg/3FNFc0xdDirCuE4AUguzal19uSYu1ZeK9+7dSNMJ/W5pxdGi52tU6/mL5+5TSJm6Z5SYY5/s9ILbwT9ty4J07A/7OK6ubJ3Q9cOLINk8BjXWifsRmY+Yj0Q/voJ80VOHrBj+K/n3sZnx9/KSIxCYEDefunnx+WJtTtDDPqw/X49B3f7+vza06u3Fpxb5RIJK/7qyY4kK0NlMzdn47rEer+Ic44WFBezdswc2L8T/llcbWj2yD79yvPTna0/h77AgI6dE9nexcdCAy9Yh7n29FlsRHrUXWRuD7fR2sIZW5wcb58j56Zkd81Ka95QgzmnGqsUcL3HByJJ+tpOJqpqPZ6MGG5GhrSPWzAQRCT+YKHA5lSewMf6msrVjKx3hevfOacLw21VGuKY48n20Q1+sZY1Bzzffjx+Ovckwy56aNHUpSY6pjabmVgeEJp8rg3M1HQxa5huOTNPkpUl1cXc1MPFxtadtHVq0OOrEuwqbV7eGTJ7t9biXxGlLV8nCcuazpBn01V4nZxD9mgh/aP02J7xhph9zn/t5SFafAeYfiHM/oHM3wrA1qGguPTtuvN2Pxse199jHiF4ghDG+tPUL0+Uh3gjSOgTSh4Rqm7kRA3oD9fzC9eNpfYJxX3t9DLcNmR1W/vJ+IRy70TxUOq7L8EpwljfVXA50Jn833px03pJbX79PDL/HdlpK+dj5qSFkvPxzkoOV6x0XholbpbUFtXOCh9B49mamV0MenTHmROx3XRadDdxrMfeP5qPHiXpT/UHrbgN7rUTlScql/kPCg0AW/wxt+wEb2pOHIWcGevrnx4f46LUFtSmpDwSMAKawd+icxt9D3SEai1JKSLK/RxROc2+sg6JOq8kFPHKILCmUOBALkCV9K/W+4TNAbfi3rkiC1UxuNbsGTgD91Vks/bpqJrzu9ALlIDH8NSs3E7OR7W9WPgO+Hkv/rXiqeQaVNXCk/EA8Q16CazfYbnpYYysVCToaGhOGp2WlxoO9lyfyq+I5Qv16SvAf7Z5F756nf+pAk4y/ld5ObWWMY6Y6uqaZpqrrOJeqnQem5ok26/BxsG0wcYh/l96ojhajqziF285LylJvH2jY5ojGCq4+u74wvkE8elRQx7+WHpfMEk8vOsvHc5v8OCs0vO55yEFCkQF0DDHkzlsbvVbp42mwosfvCtydf3BXIOLHGC/KzQwI0Hc6lk33AzyayooxOkp8Cz+nWHOML714Fmlx2QeFk/msJVKmZYGzgfYZv6gtpXuNKGpo6+mrr0XqR5u7h6squ4eOvGQvZ4eiGbddtU0UgtGFQH/czz+71GoOaWf0v643ZOLFbQ7HTndNfcc3NIIDT+7nIRZW+Z5RbkpqYONJdln85CgabR5cFi0+il9tSP3QbF7/0B1FpnXw8woPCGvPDnuVEvhiaEuVK3+069bG82XHVUOpMYdM9ZXDYTTnTadL2wjB/oyod0wJlIrSzeL0ZVUVdmXxMjOITJ1mGGtiZxt8ZevOtNDnQ+VqhwvFQy3didb27uTYUnZRN0ptSQnN+l0X25lTx806r5YerEp0E33liEYkVoMsfbxNCWiuVY4dOScu3gu8ef6WkyzX1VVnbm8tWj21b827xXAoiD4lz9i7Pyt6nDQYjeJA37Ral/z+2QzEgCOrwXrb0HKMxeDvr9vUI3stCJywO4bN4ga0VrhO7BrfX8fo9rG96L565FJbRBtB7ClAVBGNYMFdGyA3WMjyFI5EBJi1Iqvhj1Zg/iC46vlHVeL0BKCbBBiF/IOQrbRY1ttECCa0Y9GZVA5qQwp6XBKGXaNTAkcCHQtaj/PArPCh2g6gfHlVmC567tXujMaK9K9qNYqim+pkw9qyeVW/pUPLzAzPzoIjC8lgeXyxtG1y8cCzZIVGI8YWJ4a4+jpaKmFKG9Y6rHJMoq6PKuoyw8VdXlOUZfXLJ3wrX9tCKUjCCzXP47uhqVPkksscwZ/DlDMm7VMeISS5dNJlWvkePomQAWebJZvA0vZGNbSyD4SEEptFVmItWQJ66Ova5VI2xPXng2PYC1uWWopVIYg9J2IS1iurSxSLHKzQpKd6kjYSEXC1iqSaw/Lw1duUDxkuzqPkvWOPvouljdBFpe94/SldWOqtTZ8YPcFIf8fW1L7P+Do/F5uNSqdoQY5O7809tJrR21BllZP12bBoB/UT3IF/fE+xgeMpsFe1RiuracaiQjXPktPJbOJVyxOgVXdi+URwMn5vceXwwjRHJN9jGWUxZl+CSEaz/5h5vw0YOHc7Nep+3CmkeKYRmmM8JclsvyKzljBBvoOY81EUVc4vzwV3AbV9qvfkgPa1mOdJJPn7xVQHmapzhPXtuYocCeGE7ePeeyHpi84VueWO095rAlFfQdOiGu9pyiOYEhDgfYjzNYAhwM0YP9Yc6jmwWRQrT+aAytaA9kRYLN9LgdAub3vYYE4m7zZisvRXP3SfhsNtOmxf5jEroHpCEAtg39O2HTw4SAIDT1scgjDmwI7BwFioZlex7GL+PR+Z5eYAgCPfYFlAXh9XN74T+X/51MWTBELwQEFUMD4gIEbYMozKs9AWAXEbF/fb6kgbWUYVollpEUVo3aLajeg9g2+3YhlsWUYT/wPZdah2kGq+dAp3yhWSZFBkhG/82ss92X0wwJG0AINQdCH71PtFibSQ4JOE6TZahU2BUn1l2Pjw2x7ALYuJafrcevqcloW8YDz1Fg+vb9KkNW1JIe6cCKRvWMU72POihWHt6arb0bbZt6+xryXzMR1XWyjv6DYRYi2L1DtJevQkVT9QKyBp2ZSqtWQ6KXRbJi1bFFNiUnLYdJIrOINmVbFvKUICzkRIZydZyEq5GSMPopqqWiNxcRHym+Nbe4rQzvO4aTXbFzA09+TboJEGgbQ84FtoodK4GD45VHoKuhhIqs1CWxTAnsx52aDMzCQ1dmAWq/xGVlwq2WK6l+wbzQZbs2GgoEqJaPZ8YhftPSXXCX6BbePSuo226ApjX0C4peCOiCh/gVyHxc8EuM6SuRTfzEf50M1I8Y9l3d7I79zQ8Foiklr4toqGbY8Jq1YdKhijSf4jbWQ6k+pcVJifSm+80LjSEpEeSuszCOW/5lUQ8xqzqrqMIl3Cvq2/MjACDqnWkU2fiG0Bh4tRk17Q7itkxlHJFPiP1oogCVUQIA5LKAOS800frEEAeawsNSLpqmGqSaT3Tl3tFR0SbXFdGUYimhesYS9Odo0rKnCmMZMHNUT1UxxE1HSTx4mh2oOeLC82drUrJ3CmDZF2GuFATQ0BPhBBVEOsBCA6UBArQgHAaYQAg1pHAB2AsddEdx8dkVhR98VTVTMoTG7Yh1QyHE+ZeSh8nJ1i6koTMli0IQKEwdPjQpVp+FZiiLwMwTv2VqkQMrc+AZGs4uHiHXiwWI1HiPBxoMo3+JRAhhxMFmZIShrxveFm088Fg0isn0oL1CnRTeYkVp+7mO07cw4TETHnZxYTZk/Jn+BwhKuzE6MUMdtNk2gYJFB3pNYx9mxZsqcAxJzx1ptUvlZcFlJF2QG", "ok": true, "headers": [ [ "content-type", "font/woff2" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=eval_f1&run=.": { "data": "W1sxNjAzNzAwOTgyLjM0NTU0MjcsIDIwLCAwLjBdLCBbMTYwMzcwMTAwMC4xODgzMjg1LCA0MCwgMC4wMTA3NTI2ODgxNjIwMjg3OV0sIFsxNjAzNzAxMDE4LjAyOTQxMTYsIDYwLCAwLjE0OTI1MzcyNjAwNTU1NDJdLCBbMTYwMzcwMTAzNS44NzQ2MDM3LCA4MCwgMC4xMjE4Mjc0MDg2NzEzNzkwOV0sIFsxNjAzNzAxMDUzLjcwNjIwMDEsIDEwMCwgMC4zNzQ0NjgwODgxNTAwMjQ0XSwgWzE2MDM3MDEwNzEuNTM5MjY3MywgMTIwLCAwLjU4OTI4NTczMTMxNTYxMjhdLCBbMTYwMzcwMTA4OS4xMjUyMTM2LCAxNDAsIDAuNTY0NDE3MTgzMzk5MjAwNF0sIFsxNjAzNzAxMTA3LjAwNjA2MSwgMTYwLCAwLjU1NDE0MDE1MDU0NzAyNzZdLCBbMTYwMzcwMTEyNC44NDc1NzMzLCAxODAsIDAuNTIyODc1ODQ1NDMyMjgxNV0sIFsxNjAzNzAxMTQyLjcwNzYxNjYsIDIwMCwgMC41MzUxMTcwMzAxNDM3Mzc4XSwgWzE2MDM3MDExNjAuNjU0NTA3OSwgMjIwLCAwLjU2ODgwNzM2MzUxMDEzMThdLCBbMTYwMzcwMTE3OC41Njk0MzgsIDI0MCwgMC41MzUwMzE4NTUxMDYzNTM4XSwgWzE2MDM3MDExOTYuMTExNzc0NCwgMjYwLCAwLjU3MTQyODU5Njk3MzQxOTJdLCBbMTYwMzcwMTIxNC4wMDgxOTc1LCAyODAsIDAuNTc0MDc0MDg5NTI3MTMwMV0sIFsxNjAzNzAxMjMxLjg2MTA0NTQsIDMwMCwgMC41NDU0NTQ1NjE3MTAzNTc3XSwgWzE2MDM3MDEyNDkuNzc1MjEzNSwgMzIwLCAwLjU4MjU4MjU5Mjk2NDE3MjRdLCBbMTYwMzcwMTI2Ny42Mzg2MzIzLCAzNDAsIDAuNTYzMTA2Nzc1MjgzODEzNV0sIFsxNjAzNzAxMjg1LjUwNDY5MSwgMzYwLCAwLjU4NDMzNzM1MzcwNjM1OTldLCBbMTYwMzcwMTMwMS44MjUzOTM0LCAzNzgsIDAuNTk3MDE0OTA0MDIyMjE2OF1d", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=eval_loss&run=.": { "data": "W1sxNjAzNzAwOTgyLjM0NTQ0NDIsIDIwLCAwLjMyMDMxODM3MTA1NzUxMDRdLCBbMTYwMzcwMTAwMC4xODgyMDc2LCA0MCwgMC4yNDU0ODg5ODYzNzI5NDc3XSwgWzE2MDM3MDEwMTguMDI5Mjk3NiwgNjAsIDAuMjI5ODY5ODg3MjMyNzgwNDZdLCBbMTYwMzcwMTAzNS44NzQ1MTI0LCA4MCwgMC4yNTU0MTU2NDgyMjE5Njk2XSwgWzE2MDM3MDEwNTMuNzA2MDg2LCAxMDAsIDAuMTc4NDk2NjQzOTAwODcxMjhdLCBbMTYwMzcwMTA3MS41MzkxMzcxLCAxMjAsIDAuMTY5MTU5OTkzNTI5MzE5NzZdLCBbMTYwMzcwMTA4OS4xMjUwOSwgMTQwLCAwLjE3MDY1NzAwODg4NjMzNzI4XSwgWzE2MDM3MDExMDcuMDA1OTUzNiwgMTYwLCAwLjE3MzE2ODc3ODQxOTQ5NDYzXSwgWzE2MDM3MDExMjQuODQ3NDU5OCwgMTgwLCAwLjE3NDQ0MzAwNjUxNTUwMjkzXSwgWzE2MDM3MDExNDIuNzA3NTE2LCAyMDAsIDAuMTY5NzM1MTQ4NTQ5MDc5OV0sIFsxNjAzNzAxMTYwLjY1NDQwNDksIDIyMCwgMC4xNjc3MzUyMTkwMDE3NzAwMl0sIFsxNjAzNzAxMTc4LjU2OTM0OCwgMjQwLCAwLjE2ODQzNzMwMjExMjU3OTM1XSwgWzE2MDM3MDExOTYuMTExNjc4OCwgMjYwLCAwLjE2OTczODk3ODE0NzUwNjddLCBbMTYwMzcwMTIxNC4wMDgwOTAzLCAyODAsIDAuMTgzODM1NDc2NjM2ODg2Nl0sIFsxNjAzNzAxMjMxLjg2MDkyNzYsIDMwMCwgMC4yMDM1Nzg0NDIzMzUxMjg3OF0sIFsxNjAzNzAxMjQ5Ljc3NTEwNDUsIDMyMCwgMC4xOTUzMDYxMjIzMDMwMDkwM10sIFsxNjAzNzAxMjY3LjYzODUyMTQsIDM0MCwgMC4yMDIxMzA5NzMzMzkwODA4XSwgWzE2MDM3MDEyODUuNTA0NjAwMywgMzYwLCAwLjE5Mzk3Njk1MzYyNTY3OTAyXSwgWzE2MDM3MDEzMDEuODI1MzA0NSwgMzc4LCAwLjE5MjI3ODM3MDI2MTE5MjMyXV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=eval_precision&run=.": { "data": "W1sxNjAzNzAwOTgyLjM0NTU2NDQsIDIwLCAwLjBdLCBbMTYwMzcwMTAwMC4xODgzNDczLCA0MCwgMS4wXSwgWzE2MDM3MDEwMTguMDI5NDMwOSwgNjAsIDAuOTM3NV0sIFsxNjAzNzAxMDM1Ljg3NDYyMiwgODAsIDEuMF0sIFsxNjAzNzAxMDUzLjcwNjIxOSwgMTAwLCAwLjg3OTk5OTk5NTIzMTYyODRdLCBbMTYwMzcwMTA3MS41MzkyODYsIDEyMCwgMC42NTU2MjkxNTgwMjAwMTk1XSwgWzE2MDM3MDEwODkuMTI1MjMzLCAxNDAsIDAuNjUyNDgyMjcxMTk0NDU4XSwgWzE2MDM3MDExMDcuMDA2MDgyOCwgMTYwLCAwLjY3NDQxODYyODIxNTc4OThdLCBbMTYwMzcwMTEyNC44NDc1OTk1LCAxODAsIDAuNjYxMTU3MDExOTg1Nzc4OF0sIFsxNjAzNzAxMTQyLjcwNzYzNTQsIDIwMCwgMC43MDE3NTQzOTExOTMzODk5XSwgWzE2MDM3MDExNjAuNjU0NTI3LCAyMjAsIDAuNjU0OTI5NTc4MzA0MjkwOF0sIFsxNjAzNzAxMTc4LjU2OTQ1NjYsIDI0MCwgMC42NTExNjI4MDMxNzMwNjUyXSwgWzE2MDM3MDExOTYuMTExNzkzOCwgMjYwLCAwLjY5MjMwNzcxMDY0NzU4M10sIFsxNjAzNzAxMjE0LjAwODIxNjYsIDI4MCwgMC42NjkwNjQ3NjAyMDgxMjk5XSwgWzE2MDM3MDEyMzEuODYxMDczMywgMzAwLCAwLjY4MjkyNjgzMzYyOTYwODJdLCBbMTYwMzcwMTI0OS43NzUyMzMzLCAzMjAsIDAuNjU1NDA1NDAyMTgzNTMyN10sIFsxNjAzNzAxMjY3LjYzODY1MTQsIDM0MCwgMC43MDE2MTI4ODk3NjY2OTMxXSwgWzE2MDM3MDEyODUuNTA0NzA5NywgMzYwLCAwLjY1OTg2Mzk0ODgyMjAyMTVdLCBbMTYwMzcwMTMwMS44MjU0MTIsIDM3OCwgMC42NjY2NjY2ODY1MzQ4ODE2XV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=eval_recall&run=.": { "data": "W1sxNjAzNzAwOTgyLjM0NTU4NTMsIDIwLCAwLjBdLCBbMTYwMzcwMTAwMC4xODgzNjQ3LCA0MCwgMC4wMDU0MDU0MDU1MzYyOTM5ODM1XSwgWzE2MDM3MDEwMTguMDI5NDQ4LCA2MCwgMC4wODEwODEwNzc0NTY0NzQzXSwgWzE2MDM3MDEwMzUuODc0NjM5LCA4MCwgMC4wNjQ4NjQ4NjY0MzU1Mjc4XSwgWzE2MDM3MDEwNTMuNzA2MjM2NiwgMTAwLCAwLjIzNzgzNzgzNjE0NjM1NDY4XSwgWzE2MDM3MDEwNzEuNTM5MzAzLCAxMjAsIDAuNTM1MTM1MTQ5OTU1NzQ5NV0sIFsxNjAzNzAxMDg5LjEyNTI1MDYsIDE0MCwgMC40OTcyOTcyODY5ODczMDQ3XSwgWzE2MDM3MDExMDcuMDA2MTAzOCwgMTYwLCAwLjQ3MDI3MDI3NjA2OTY0MTFdLCBbMTYwMzcwMTEyNC44NDc2MTc0LCAxODAsIDAuNDMyNDMyNDQyOTAzNTE4N10sIFsxNjAzNzAxMTQyLjcwNzY1MjgsIDIwMCwgMC40MzI0MzI0NDI5MDM1MTg3XSwgWzE2MDM3MDExNjAuNjU0NTQ0NiwgMjIwLCAwLjUwMjcwMjcxMzAxMjY5NTNdLCBbMTYwMzcwMTE3OC41Njk0NzQsIDI0MCwgMC40NTQwNTQwNTc1OTgxMTRdLCBbMTYwMzcwMTE5Ni4xMTE4MTEyLCAyNjAsIDAuNDg2NDg2NDk0NTQxMTY4Ml0sIFsxNjAzNzAxMjE0LjAwODIzMzUsIDI4MCwgMC41MDI3MDI3MTMwMTI2OTUzXSwgWzE2MDM3MDEyMzEuODYxMDk5NSwgMzAwLCAwLjQ1NDA1NDA1NzU5ODExNF0sIFsxNjAzNzAxMjQ5Ljc3NTI1MTIsIDMyMCwgMC41MjQzMjQyOTc5MDQ5NjgzXSwgWzE2MDM3MDEyNjcuNjM4NjY4OCwgMzQwLCAwLjQ3MDI3MDI3NjA2OTY0MTFdLCBbMTYwMzcwMTI4NS41MDQ3MjY0LCAzNjAsIDAuNTI0MzI0Mjk3OTA0OTY4M10sIFsxNjAzNzAxMzAxLjgyNTQyOTIsIDM3OCwgMC41NDA1NDA1MTYzNzY0OTU0XV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=learning_rate&run=.": { "data": "W1sxNjAzNzAwOTc3LjQ5MDc2MTgsIDIwLCAxLjMzMzMzMzMyOTk2Njk5MDNlLTA1XSwgWzE2MDM3MDA5OTUuMzM1NDYwMiwgNDAsIDEuOTQyNTI4Nzk3MzcxNzc4NmUtMDVdLCBbMTYwMzcwMTAxMy4xNzg3Mjk1LCA2MCwgMS44Mjc1ODYxMjkzNjU5NTQ1ZS0wNV0sIFsxNjAzNzAxMDMxLjAyOTI0MDgsIDgwLCAxLjcxMjY0MzY0MzI1OTA3MDhlLTA1XSwgWzE2MDM3MDEwNDguODU3MDYzLCAxMDAsIDEuNTk3NzAxMTU3MTUyMTg3ZS0wNV0sIFsxNjAzNzAxMDY2LjY5MTE1MywgMTIwLCAxLjQ4Mjc1ODU4MDA5NTgzMzJlLTA1XSwgWzE2MDM3MDEwODQuMjc3MzI0NCwgMTQwLCAxLjM2NzgxNjA5Mzk4ODk0OTRlLTA1XSwgWzE2MDM3MDExMDIuMTA4NDkyMSwgMTYwLCAxLjI1Mjg3MzYwNzg4MjA2NTdlLTA1XSwgWzE2MDM3MDExMTkuOTk5NzY3OCwgMTgwLCAxLjEzNzkzMTAzMDgyNTcxMThlLTA1XSwgWzE2MDM3MDExMzcuODYwMjc5LCAyMDAsIDEuMDIyOTg4NTQ0NzE4ODI4ZS0wNV0sIFsxNjAzNzAxMTU1LjgwNDc5OTYsIDIyMCwgOS4wODA0NTk2NzY2MjQ3NDFlLTA2XSwgWzE2MDM3MDExNzMuNzIwODQsIDI0MCwgNy45MzEwMzQ4MTU1NTU5MDRlLTA2XSwgWzE2MDM3MDExOTEuMjY1MDY2LCAyNjAsIDYuNzgxNjA5MDQ0OTkyMzY1ZS0wNl0sIFsxNjAzNzAxMjA5LjE2MDcwNjMsIDI4MCwgNS42MzIxODM3MjkxNzYxNzdlLTA2XSwgWzE2MDM3MDEyMjcuMDExNTkxLCAzMDAsIDQuNDgyNzU4NDEzMzU5OTg4NWUtMDZdLCBbMTYwMzcwMTI0NC45MjYyNDQ1LCAzMjAsIDMuMzMzMzMzMzI0OTE3NDc1N2UtMDZdLCBbMTYwMzcwMTI2Mi43OTEyNTgzLCAzNDAsIDIuMTgzOTA4MDA5MTAxMjg3NWUtMDZdLCBbMTYwMzcwMTI4MC42NTU3ODk0LCAzNjAsIDEuMDM0NDgyODA2OTcxOTM3ZS0wNl1d", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=loss&run=.": { "data": "W1sxNjAzNzAwOTc3LjQ5MDY0NjYsIDIwLCAwLjU4MTM4ODg5MDc0MzI1NTZdLCBbMTYwMzcwMDk5NS4zMzUzNzgyLCA0MCwgMC4yNjg2MjkwMTQ0OTIwMzQ5XSwgWzE2MDM3MDEwMTMuMTc4NjQ2NiwgNjAsIDAuMjE2MzY4NDgxNTE2ODM4MDddLCBbMTYwMzcwMTAzMS4wMjkxMDQyLCA4MCwgMC4yMDc3MDk4Nzg2ODMwOTAyXSwgWzE2MDM3MDEwNDguODU2OTUxNSwgMTAwLCAwLjE4NzYxODgyMTg1OTM1OTc0XSwgWzE2MDM3MDEwNjYuNjkxMDUxLCAxMjAsIDAuMjA3MzE1NDQ0OTQ2Mjg5MDZdLCBbMTYwMzcwMTA4NC4yNzcyNTI3LCAxNDAsIDAuMTU1ODY1ODYyOTY1NTgzOF0sIFsxNjAzNzAxMTAyLjEwODM5NzcsIDE2MCwgMC4xNzM4NDE4NjM4NzA2MjA3M10sIFsxNjAzNzAxMTE5Ljk5OTY3ODQsIDE4MCwgMC4xMjg4Mjg0MzYxMzYyNDU3M10sIFsxNjAzNzAxMTM3Ljg2MDE2NzcsIDIwMCwgMC4xNDQ2MjE0NjE2Mjk4Njc1NV0sIFsxNjAzNzAxMTU1LjgwNDY4NjMsIDIyMCwgMC4xMjI4ODQzNzAzODY2MDA1XSwgWzE2MDM3MDExNzMuNzIwNzYzNywgMjQwLCAwLjEzNDE3ODE2MTYyMTA5Mzc1XSwgWzE2MDM3MDExOTEuMjY0OTAxNiwgMjYwLCAwLjA5NDEyNjMyMTM3NTM3MDAzXSwgWzE2MDM3MDEyMDkuMTYwNjIzLCAyODAsIDAuMDc5ODc1NTY2MDY1MzExNDNdLCBbMTYwMzcwMTIyNy4wMTE0Nzc3LCAzMDAsIDAuMDkxNDYxNTYxNjIwMjM1NDRdLCBbMTYwMzcwMTI0NC45MjYxMzcsIDMyMCwgMC4wNzQzMzUyOTE5ODE2OTcwOF0sIFsxNjAzNzAxMjYyLjc5MTE1MywgMzQwLCAwLjA3OTI4NDQ3NDI1MzY1NDQ4XSwgWzE2MDM3MDEyODAuNjU1NzI1LCAzNjAsIDAuMDgyMzk1MzU5ODczNzcxNjddXQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=total_flos&run=.": { "data": "W1sxNjAzNzAwOTc3LjQ5MDg0MTksIDIwLCA5MjMzODAzODc2NzYxNi4wXSwgWzE2MDM3MDA5ODIuMzQ1NjI4LCAyMCwgOTIzMzgwMzg3Njc2MTYuMF0sIFsxNjAzNzAwOTk1LjMzNTUyMTcsIDQwLCAxODQ2NzYwNzc1MzUyMzIuMF0sIFsxNjAzNzAxMDAwLjE4ODQxODksIDQwLCAxODQ2NzYwNzc1MzUyMzIuMF0sIFsxNjAzNzAxMDEzLjE3ODc5MDMsIDYwLCAyNzcwMTQxMTYzMDI4NDguMF0sIFsxNjAzNzAxMDE4LjAyOTQ4MzYsIDYwLCAyNzcwMTQxMTYzMDI4NDguMF0sIFsxNjAzNzAxMDMxLjAyOTMyMjksIDgwLCAzNjkzNTIxNTUwNzA0NjQuMF0sIFsxNjAzNzAxMDM1Ljg3NDY3MzYsIDgwLCAzNjkzNTIxNTUwNzA0NjQuMF0sIFsxNjAzNzAxMDQ4Ljg1NzE2OTksIDEwMCwgNDYxNjkwMTkzODM4MDgwLjBdLCBbMTYwMzcwMTA1My43MDYyNzI0LCAxMDAsIDQ2MTY5MDE5MzgzODA4MC4wXSwgWzE2MDM3MDEwNjYuNjkxMjExLCAxMjAsIDU1NDAyODIzMjYwNTY5Ni4wXSwgWzE2MDM3MDEwNzEuNTM5MzM4NiwgMTIwLCA1NTQwMjgyMzI2MDU2OTYuMF0sIFsxNjAzNzAxMDg0LjI3NzM3NSwgMTQwLCA2NDQxMjk5MzU1ODkzNzYuMF0sIFsxNjAzNzAxMDg5LjEyNTI4NTksIDE0MCwgNjQ0MTI5OTM1NTg5Mzc2LjBdLCBbMTYwMzcwMTEwMi4xMDg1NjI1LCAxNjAsIDczNjQ2Nzk3NDM1Njk5Mi4wXSwgWzE2MDM3MDExMDcuMDA2MTYyNiwgMTYwLCA3MzY0Njc5NzQzNTY5OTIuMF0sIFsxNjAzNzAxMTE5Ljk5OTg0MTUsIDE4MCwgODI4ODA2MDEzMTI0NjA4LjBdLCBbMTYwMzcwMTEyNC44NDc2NTM0LCAxODAsIDgyODgwNjAxMzEyNDYwOC4wXSwgWzE2MDM3MDExMzcuODYwMzU3LCAyMDAsIDkyMTE0NDExOTAwMTA4OC4wXSwgWzE2MDM3MDExNDIuNzA3Njg4OCwgMjAwLCA5MjExNDQxMTkwMDEwODguMF0sIFsxNjAzNzAxMTU1LjgwNDg3NjYsIDIyMCwgMTAxMzQ4MjE1Nzc2ODcwNC4wXSwgWzE2MDM3MDExNjAuNjU0NTgwOCwgMjIwLCAxMDEzNDgyMTU3NzY4NzA0LjBdLCBbMTYwMzcwMTE3My43MjA4ODQ2LCAyNDAsIDExMDU4MjAxOTY1MzYzMjAuMF0sIFsxNjAzNzAxMTc4LjU2OTUxLCAyNDAsIDExMDU4MjAxOTY1MzYzMjAuMF0sIFsxNjAzNzAxMTkxLjI2NTE2MzcsIDI2MCwgMTE5NTkyMTgzMjQxMTEzNi4wXSwgWzE2MDM3MDExOTYuMTExODQ3LCAyNjAsIDExOTU5MjE4MzI0MTExMzYuMF0sIFsxNjAzNzAxMjA5LjE2MDc2MiwgMjgwLCAxMjg4MjU5ODcxMTc4NzUyLjBdLCBbMTYwMzcwMTIxNC4wMDgyNjksIDI4MCwgMTI4ODI1OTg3MTE3ODc1Mi4wXSwgWzE2MDM3MDEyMjcuMDExNjY0LCAzMDAsIDEzODA1OTc5MDk5NDYzNjguMF0sIFsxNjAzNzAxMjMxLjg2MTE3OCwgMzAwLCAxMzgwNTk3OTA5OTQ2MzY4LjBdLCBbMTYwMzcwMTI0NC45MjYzMzEzLCAzMjAsIDE0NzI5MzU5NDg3MTM5ODQuMF0sIFsxNjAzNzAxMjQ5Ljc3NTI4ODMsIDMyMCwgMTQ3MjkzNTk0ODcxMzk4NC4wXSwgWzE2MDM3MDEyNjIuNzkxMzQyMywgMzQwLCAxNTY1MjczOTg3NDgxNjAwLjBdLCBbMTYwMzcwMTI2Ny42Mzg3MDUzLCAzNDAsIDE1NjUyNzM5ODc0ODE2MDAuMF0sIFsxNjAzNzAxMjgwLjY1NTgzMzIsIDM2MCwgMTY1NzYxMjAyNjI0OTIxNi4wXSwgWzE2MDM3MDEyODUuNTA0NzYxNSwgMzYwLCAxNjU3NjEyMDI2MjQ5MjE2LjBdLCBbMTYwMzcwMTMwMS44MjU0NjQ1LCAzNzgsIDE3Mzg0Nzk5NTIxOTk2ODAuMF1d", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 820 } }, "source": [ "%load_ext tensorboard\n", "%tensorboard --logdir logs" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/javascript": [ "\n", " (async () => {\n", " const url = await google.colab.kernel.proxyPort(6006, {\"cache\": true});\n", " const iframe = document.createElement('iframe');\n", " iframe.src = url;\n", " iframe.setAttribute('width', '100%');\n", " iframe.setAttribute('height', '800');\n", " iframe.setAttribute('frameborder', 0);\n", " document.body.appendChild(iframe);\n", " })();\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "nsCUOqq3APO9" }, "source": [ "# Result Evaluation" ] }, { "cell_type": "markdown", "metadata": { "id": "hxC697r2ARDk" }, "source": [ "Given that this is a completed competition, we have access to the test set. We shouldn't be using it for validation, to avoid presenting overfitted results, but we can use it to see how our solution ranks against the benchmarks. Let's download that data and evaluate the model on it. We will need to repeat some of the steps we applied on the training set." ] }, { "cell_type": "code", "metadata": { "id": "IeWXq7IQ--lw", "outputId": "700606fc-d3dc-4b46-b02a-596c1f274e1b", "colab": { "base_uri": "https://localhost:8080/", "height": 66, "referenced_widgets": [ "7c8ac18e29d749949352e9f994c2d54c", "2c103c3e73da47d8b3fbf43f3ac5b05a", "7eeb1989fab84e1ca2a1c0f169400530", "6db794d4f1ec4ff8992c715ca1776147", "85b20f8f885f45eeadcbd02b3748c34c", "2a050a4e56074143a69af25360caa05c", "8b5eb4fb4dc64dc69cdb2b14c4c9b4e2", "9f80d961ebb04d90916a0c320634fbfb" ] } }, "source": [ "test_df = pd.read_csv('test_features.tsv', delimiter='\\t')\n", "test_df.columns = ['text']\n", "final_test_dataset = Dataset.from_pandas(test_df)\n", "final_test_dataset = final_test_dataset.map(tokenize, batched=True, batch_size=len(final_test_dataset))\n", "final_test_dataset.set_format('torch', columns=['input_ids', 'attention_mask'])" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7c8ac18e29d749949352e9f994c2d54c", "version_minor": 0, "version_major": 2 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='')))" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "If8jbFDgI6jo", "outputId": "478d3ad7-d8f7-4d50-bcfc-a3ee71a80091", "colab": { "base_uri": "https://localhost:8080/", "height": 212 } }, "source": [ "!wget https://raw.githubusercontent.com/ptaszynski/cyberbullying-Polish/master/task%2001/test_set_clean_only_tags.txt\n", "df_lbls = pd.read_csv('test_set_clean_only_tags.txt',names=['label'])\n", "labels = df_lbls.label.values" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "--2020-10-26 08:35:05-- https://raw.githubusercontent.com/ptaszynski/cyberbullying-Polish/master/task%2001/test_set_clean_only_tags.txt\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 3000 (2.9K) [text/plain]\n", "Saving to: ‘test_set_clean_only_tags.txt’\n", "\n", "test_set_clean_only 100%[===================>] 2.93K --.-KB/s in 0s \n", "\n", "2020-10-26 08:35:05 (87.7 MB/s) - ‘test_set_clean_only_tags.txt’ saved [3000/3000]\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "aHge6bwQASEi", "outputId": "5822aee5-b75f-4872-e917-85e0cd883f48", "colab": { "base_uri": "https://localhost:8080/", "height": 36 } }, "source": [ "preds = trainer.predict(final_test_dataset)\n", "outputs = preds.predictions.argmax(axis=1)" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", "
\n", " \n", " \n", " \n", " [32/32 00:10]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "code", "metadata": { "id": "-c7-VRTrLoi-", "outputId": "79eed21f-49e4-4392-ffd8-f416bb1ddeaf", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "precision, recall, f1, _ = precision_recall_fscore_support(labels, outputs, average='binary')\n", "acc = accuracy_score(labels, outputs)\n", "print( {\n", " 'accuracy': acc,\n", " 'f1': f1,\n", " 'precision': precision,\n", " 'recall': recall\n", "})" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "{'accuracy': 0.913, 'f1': 0.5671641791044776, 'precision': 0.8507462686567164, 'recall': 0.4253731343283582}\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "xqK6A1WtHagU" }, "source": [ "The F1 score on the test set is around 0.56 - 0.59, which is in the range of state-of-the-art result last year during the PolEval 2019 competition. It is also pretty competitive on the KLEJ benchmark, although the models based on Roberta-large architecture perform better, and Polish Roberta base is also significantly better. In a separate post, we will try to reach those scores. " ] }, { "cell_type": "code", "metadata": { "id": "CKihZmezH9jl" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] }